commit 306a7dd0d24815a5b329543372d89c0715fb0f03 Author: Mateusz Guzik Date: Wed Jan 13 06:10:11 2021 +0000 Use compiler builtins for __bitcount primitives. The previous code would only do it if __POPCNT__ was defined, which was never true at least for the kernel build. diff --git a/sys/sys/types.h b/sys/sys/types.h index c026fa023bd0..a90d518889d4 100644 --- a/sys/sys/types.h +++ b/sys/sys/types.h @@ -309,67 +309,11 @@ typedef _Bool bool; * since its purpose is to provide typedefs, not miscellaneous doodads. */ -#ifdef __POPCNT__ #define __bitcount64(x) __builtin_popcountll((__uint64_t)(x)) #define __bitcount32(x) __builtin_popcount((__uint32_t)(x)) #define __bitcount16(x) __builtin_popcount((__uint16_t)(x)) #define __bitcountl(x) __builtin_popcountl((unsigned long)(x)) #define __bitcount(x) __builtin_popcount((unsigned int)(x)) -#else -/* - * Population count algorithm using SWAR approach - * - "SIMD Within A Register". - */ -static __inline __uint16_t -__bitcount16(__uint16_t _x) -{ - - _x = (_x & 0x5555) + ((_x & 0xaaaa) >> 1); - _x = (_x & 0x3333) + ((_x & 0xcccc) >> 2); - _x = (_x + (_x >> 4)) & 0x0f0f; - _x = (_x + (_x >> 8)) & 0x00ff; - return (_x); -} - -static __inline __uint32_t -__bitcount32(__uint32_t _x) -{ - - _x = (_x & 0x55555555) + ((_x & 0xaaaaaaaa) >> 1); - _x = (_x & 0x33333333) + ((_x & 0xcccccccc) >> 2); - _x = (_x + (_x >> 4)) & 0x0f0f0f0f; - _x = (_x + (_x >> 8)); - _x = (_x + (_x >> 16)) & 0x000000ff; - return (_x); -} - -#ifdef __LP64__ -static __inline __uint64_t -__bitcount64(__uint64_t _x) -{ - - _x = (_x & 0x5555555555555555) + ((_x & 0xaaaaaaaaaaaaaaaa) >> 1); - _x = (_x & 0x3333333333333333) + ((_x & 0xcccccccccccccccc) >> 2); - _x = (_x + (_x >> 4)) & 0x0f0f0f0f0f0f0f0f; - _x = (_x + (_x >> 8)); - _x = (_x + (_x >> 16)); - _x = (_x + (_x >> 32)) & 0x000000ff; - return (_x); -} - -#define __bitcountl(x) __bitcount64((unsigned long)(x)) -#else -static __inline __uint64_t -__bitcount64(__uint64_t _x) -{ - - return (__bitcount32(_x >> 32) + __bitcount32(_x)); -} - -#define __bitcountl(x) __bitcount32((unsigned long)(x)) -#endif -#define __bitcount(x) __bitcount32((unsigned int)(x)) -#endif #if __BSD_VISIBLE