summaryrefslogtreecommitdiff
path: root/lib/util.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/util.h')
-rw-r--r--lib/util.h52
1 files changed, 1 insertions, 51 deletions
diff --git a/lib/util.h b/lib/util.h
index 7ad8758fe..2734d26c5 100644
--- a/lib/util.h
+++ b/lib/util.h
@@ -357,57 +357,7 @@ log_2_ceil(uint64_t n)
return log_2_floor(n) + !is_pow2(n);
}
-/* unsigned int count_1bits(uint64_t x):
- *
- * Returns the number of 1-bits in 'x', between 0 and 64 inclusive. */
-#if UINTPTR_MAX == UINT64_MAX
-static inline unsigned int
-count_1bits(uint64_t x)
-{
-#if (__GNUC__ >= 4 && __POPCNT__) || (defined(__aarch64__) && __GNUC__ >= 7)
- return __builtin_popcountll(x);
-#elif defined(__aarch64__) && __GNUC__ >= 6
- return vaddv_u8(vcnt_u8(vcreate_u8(x)));
-#else
- /* This portable implementation is the fastest one we know of for 64
- * bits, and about 3x faster than GCC 4.7 __builtin_popcountll(). */
- const uint64_t h55 = UINT64_C(0x5555555555555555);
- const uint64_t h33 = UINT64_C(0x3333333333333333);
- const uint64_t h0F = UINT64_C(0x0F0F0F0F0F0F0F0F);
- const uint64_t h01 = UINT64_C(0x0101010101010101);
- x -= (x >> 1) & h55; /* Count of each 2 bits in-place. */
- x = (x & h33) + ((x >> 2) & h33); /* Count of each 4 bits in-place. */
- x = (x + (x >> 4)) & h0F; /* Count of each 8 bits in-place. */
- return (x * h01) >> 56; /* Sum of all bytes. */
-#endif
-}
-#else /* Not 64-bit. */
-#if __GNUC__ >= 4 && __POPCNT__
-static inline unsigned int
-count_1bits_32__(uint32_t x)
-{
- return __builtin_popcount(x);
-}
-#else
-#define NEED_COUNT_1BITS_8 1
-extern const uint8_t count_1bits_8[256];
-static inline unsigned int
-count_1bits_32__(uint32_t x)
-{
- /* This portable implementation is the fastest one we know of for 32 bits,
- * and faster than GCC __builtin_popcount(). */
- return (count_1bits_8[x & 0xff] +
- count_1bits_8[(x >> 8) & 0xff] +
- count_1bits_8[(x >> 16) & 0xff] +
- count_1bits_8[x >> 24]);
-}
-#endif
-static inline unsigned int
-count_1bits(uint64_t x)
-{
- return count_1bits_32__(x) + count_1bits_32__(x >> 32);
-}
-#endif
+unsigned int count_1bits(uint64_t x);
/* Returns the rightmost 1-bit in 'x' (e.g. 01011000 => 00001000), or 0 if 'x'
* is 0. */