diff --git a/2020/include/bits.h b/2020/include/bits.h index 54aea62..8635eb2 100644 --- a/2020/include/bits.h +++ b/2020/include/bits.h @@ -75,6 +75,27 @@ static __always_inline int popcount64(u64 n) # endif } +static __always_inline int popcount32(u32 n) +{ +# if __has_builtin(__builtin_popcount) +# ifdef DEBUG_BITS + log_f(1, "builtin.\n"); +# endif + return __builtin_popcount(n); + +# else +# ifdef DEBUG_BITS + log_f(1, "emulated.\n"); +# endif + int count = 0; + while (n) { + count++; + n &= (n - 1); + } + return count; +# endif +} + /* char is a special case, as it can be signed or unsigned */ typedef signed char schar; @@ -244,27 +265,6 @@ static __always_inline uint ffs32(u32 n) # endif } -static __always_inline int popcount32(u32 n) -{ -# if __has_builtin(__builtin_popcount) -# ifdef DEBUG_BITS - log_f(1, "builtin.\n"); -# endif - return __builtin_popcount(n); - -# else -# ifdef DEBUG_BITS - log_f(1, "emulated.\n"); -# endif - int count = 0; - while (n) { - count++; - n &= (n - 1); - } - return count; -# endif -} - /* rolXX are taken from kernel's are are: * SPDX-License-Identifier: GPL-2.0 */