]> git.ozlabs.org Git - ccan/blobdiff - ccan/alloc/bitops.c
Merge branch 'ronnie'
[ccan] / ccan / alloc / bitops.c
index ad4465f93b746555d543c5d83b4e32684d242b62..b408a20f0e579d8ce83228f1fc60a79a6f7e844f 100644 (file)
@@ -1,40 +1,17 @@
 #include "bitops.h"
 #include "config.h"
 #include "bitops.h"
 #include "config.h"
+#include <ccan/build_assert/build_assert.h>
 #include <ccan/short_types/short_types.h>
 #include <ccan/short_types/short_types.h>
+#include <ccan/ilog/ilog.h>
 #include <limits.h>
 
 unsigned int fls(unsigned long val)
 {
 #include <limits.h>
 
 unsigned int fls(unsigned long val)
 {
-#if HAVE_BUILTIN_CLZL
-       /* This is significantly faster! */
-       return val ? sizeof(long) * CHAR_BIT - __builtin_clzl(val) : 0;
-#else
-       unsigned int r = 32;
-
-       if (!val)
-               return 0;
-       if (!(val & 0xffff0000u)) {
-               val <<= 16;
-               r -= 16;
-       }
-       if (!(val & 0xff000000u)) {
-               val <<= 8;
-               r -= 8;
-       }
-       if (!(val & 0xf0000000u)) {
-               val <<= 4;
-               r -= 4;
-       }
-       if (!(val & 0xc0000000u)) {
-               val <<= 2;
-               r -= 2;
-       }
-       if (!(val & 0x80000000u)) {
-               val <<= 1;
-               r -= 1;
-       }
-       return r;
-#endif
+       BUILD_ASSERT(sizeof(val) == sizeof(u32) || sizeof(val) == sizeof(u64));
+       if (sizeof(val) == sizeof(u32))
+               return ilog32(val);
+       else
+               return ilog64(val);
 }
 
 /* FIXME: Move to bitops. */
 }
 
 /* FIXME: Move to bitops. */