X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Falloc%2Fbitops.c;h=978710eb1be13e74f1275bb9db198e4d87c8b698;hp=ad4465f93b746555d543c5d83b4e32684d242b62;hb=74257cee33ae3033f961d5f22a0313b8cb1b18d4;hpb=7f9d956574d30f70d2260f4b7694f481e3765173 diff --git a/ccan/alloc/bitops.c b/ccan/alloc/bitops.c index ad4465f9..978710eb 100644 --- a/ccan/alloc/bitops.c +++ b/ccan/alloc/bitops.c @@ -1,44 +1,22 @@ +/* Licensed under LGPLv2.1+ - see LICENSE file for details */ #include "bitops.h" #include "config.h" +#include #include +#include #include -unsigned int fls(unsigned long val) +unsigned int afls(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. */ -unsigned int ffsl(unsigned long val) +unsigned int affsl(unsigned long val) { #if HAVE_BUILTIN_FFSL /* This is significantly faster! */