From ff8131861f364a46030b854d34e67caf54d62569 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 22 Nov 2017 15:00:13 +0100 Subject: [PATCH] MINOR: standard: Add my_ffsl function to get the position of the bit set to one --- include/common/standard.h | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/include/common/standard.h b/include/common/standard.h index b2d67edc5..dd89203ae 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) {