static INLINE unsigned
PopCount32(uint32 value)
{
+#if defined(__GNUC__) && !defined(FEWER_BUILTINS) && defined(__POPCNT__)
+ return __builtin_popcount(value);
+#else
/*
* Attribution:
* This algorithm was copied from:
value += (value >> 8);
value += (value >> 16);
return value & 0x0000003f;
+#endif
}
static INLINE unsigned
PopCount64(uint64 value)
{
+#if defined(__GNUC__) && !defined(FEWER_BUILTINS) && defined(__POPCNT__)
+#if defined(VM_X86_64)
+ return __builtin_popcountll(value);
+#else
+ return PopCount32(value) + PopCount32(value >> 32);
+#endif
+#else
value -= (value >> 1) & 0x5555555555555555ULL;
value = ((value >> 2) & 0x3333333333333333ULL) +
(value & 0x3333333333333333ULL);
value += value >> 16;
value += value >> 32;
return (unsigned) (value & 0xff);
+#endif
}