From e8764c129ff87d1ef690afd83caa72ad04f478bc Mon Sep 17 00:00:00 2001 From: MerryMage Date: Fri, 2 Sep 2016 19:05:49 +0100 Subject: [PATCH] bit_util: Implement BitCount portably --- src/common/bit_util.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/bit_util.h b/src/common/bit_util.h index ed66811e..28430063 100644 --- a/src/common/bit_util.h +++ b/src/common/bit_util.h @@ -72,11 +72,11 @@ inline T SignExtend(const T value) { } inline size_t BitCount(u32 value) { -#ifdef _MSC_VER - return __popcnt(value); -#else - return __builtin_popcount(value); -#endif + // Portable SWAR algorithm for population count + value = value - ((value >> 1) & 0x55555555); // Two-bit count + value = (value & 0x33333333) + ((value >> 2) & 0x33333333); // Nybble count + value = (value + (value >> 4)) & 0x0F0F0F0F; // Byte count + return ((value * 0x01010101) >> 24) & 0xFF; // Summate the byte counts } } // namespace Common