]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
utils: add fls()
authorPatrick McHardy <kaber@trash.net>
Sat, 13 Dec 2014 07:50:35 +0000 (07:50 +0000)
committerPatrick McHardy <kaber@trash.net>
Tue, 16 Dec 2014 17:20:54 +0000 (18:20 +0100)
Signed-off-by: Patrick McHardy <kaber@trash.net>
include/utils.h

index 15b2e3933080c025ab3cf4e38a1adb382183870c..45cb5a700666abc59c1d2f3bb23ee53704139d7c 100644 (file)
        (void) (&_max1 == &_max2);              \
        _max1 > _max2 ? _max1 : _max2; })
 
+
+/**
+ * fls - find last (most-significant) bit set
+ * @x: the word to search
+ *
+ * This is defined the same way as ffs.
+ * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ */
+static inline int fls(int x)
+{
+       int r = 32;
+
+       if (!x)
+               return 0;
+       if (!(x & 0xffff0000u)) {
+               x <<= 16;
+               r -= 16;
+       }
+       if (!(x & 0xff000000u)) {
+               x <<= 8;
+               r -= 8;
+       }
+       if (!(x & 0xf0000000u)) {
+               x <<= 4;
+               r -= 4;
+       }
+       if (!(x & 0xc0000000u)) {
+               x <<= 2;
+               r -= 2;
+       }
+       if (!(x & 0x80000000u)) {
+               x <<= 1;
+               r -= 1;
+       }
+       return r;
+}
+
 extern void __memory_allocation_error(const char *filename, uint32_t line) __noreturn;
 
 #define memory_allocation_error()              \