X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Falloc%2Fbitops.c;h=78c2b24f4f14f13287ef77445fdc448e535b7bda;hp=b408a20f0e579d8ce83228f1fc60a79a6f7e844f;hb=c438ec17d7b2efe76e56e5fc5ab88bd4a02735e8;hpb=6855b303efec30507ac046b5c02904538be0e4ea diff --git a/ccan/alloc/bitops.c b/ccan/alloc/bitops.c index b408a20f..78c2b24f 100644 --- a/ccan/alloc/bitops.c +++ b/ccan/alloc/bitops.c @@ -1,3 +1,4 @@ +/* Licensed under LGPLv2.1+ - see LICENSE file for details */ #include "bitops.h" #include "config.h" #include @@ -5,7 +6,7 @@ #include #include -unsigned int fls(unsigned long val) +unsigned int afls(unsigned long val) { BUILD_ASSERT(sizeof(val) == sizeof(u32) || sizeof(val) == sizeof(u64)); if (sizeof(val) == sizeof(u32)) @@ -15,7 +16,7 @@ unsigned int fls(unsigned long 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! */ @@ -69,22 +70,22 @@ unsigned int popcount(unsigned long val) v = (v & 0x5555555555555555ULL) + ((v >> 1) & 0x5555555555555555ULL); v = (v & 0x3333333333333333ULL) - + ((v >> 1) & 0x3333333333333333ULL); + + ((v >> 2) & 0x3333333333333333ULL); v = (v & 0x0F0F0F0F0F0F0F0FULL) - + ((v >> 1) & 0x0F0F0F0F0F0F0F0FULL); + + ((v >> 4) & 0x0F0F0F0F0F0F0F0FULL); v = (v & 0x00FF00FF00FF00FFULL) - + ((v >> 1) & 0x00FF00FF00FF00FFULL); + + ((v >> 8) & 0x00FF00FF00FF00FFULL); v = (v & 0x0000FFFF0000FFFFULL) - + ((v >> 1) & 0x0000FFFF0000FFFFULL); + + ((v >> 16) & 0x0000FFFF0000FFFFULL); v = (v & 0x00000000FFFFFFFFULL) - + ((v >> 1) & 0x00000000FFFFFFFFULL); + + ((v >> 32) & 0x00000000FFFFFFFFULL); return v; } val = (val & 0x55555555ULL) + ((val >> 1) & 0x55555555ULL); - val = (val & 0x33333333ULL) + ((val >> 1) & 0x33333333ULL); - val = (val & 0x0F0F0F0FULL) + ((val >> 1) & 0x0F0F0F0FULL); - val = (val & 0x00FF00FFULL) + ((val >> 1) & 0x00FF00FFULL); - val = (val & 0x0000FFFFULL) + ((val >> 1) & 0x0000FFFFULL); + val = (val & 0x33333333ULL) + ((val >> 2) & 0x33333333ULL); + val = (val & 0x0F0F0F0FULL) + ((val >> 4) & 0x0F0F0F0FULL); + val = (val & 0x00FF00FFULL) + ((val >> 8) & 0x00FF00FFULL); + val = (val & 0x0000FFFFULL) + ((val >> 16) & 0x0000FFFFULL); return val; #endif }