From: Christopher Faulet Date: Wed, 22 Nov 2017 14:00:13 +0000 (+0100) Subject: MINOR: standard: Add my_ffsl function to get the position of the bit set to one X-Git-Tag: v1.8.0~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ff8131861f364a46030b854d34e67caf54d62569;p=thirdparty%2Fhaproxy.git MINOR: standard: Add my_ffsl function to get the position of the bit set to one --- diff --git a/include/common/standard.h b/include/common/standard.h index b2d67edc51..dd89203ae8 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -793,6 +793,46 @@ static inline unsigned int my_popcountl(unsigned long a) return cnt; } +/* Simple ffs implementation. It returns the position of the lowest bit set to + * one. */ +static inline unsigned int my_ffsl(unsigned long a) +{ + unsigned int cnt; + + if (!a) + return 0; + + cnt = 1; +#if LONG_MAX > 0x7FFFFFFFL /* 64bits */ + if (!(a & 0xFFFFFFFFUL)) { + a >>= 32; + cnt += 32; + } +#endif + if (!(a & 0XFFFFU)) { + a >>= 16; + cnt += 16; + } + if (!(a & 0XFF)) { + a >>= 8; + cnt += 8; + } + if (!(a & 0xf)) { + a >>= 4; + cnt += 4; + } + if (!(a & 0x3)) { + a >>= 2; + cnt += 2; + } + if (!(a & 0x1)) { + a >>= 1; + cnt += 1; + } + + return cnt; +} + /* Build a word with the lower bits set (reverse of my_popcountl) */ static inline unsigned long nbits(int bits) {