-inline bool cpu_has_popcnt() {
-
- int CPUInfo[4] = {-1};
- __cpuid(CPUInfo, 0x00000001);
- return (CPUInfo[2] >> 23) & 1;
-}
-
-#define POPCNT_INTRINSIC(x) (int)__popcnt64(x)
-
-#elif defined(__GNUC__) && defined(USE_POPCNT) // Gcc compiler
-
-inline bool cpu_has_popcnt() {
-
- unsigned int eax, ebx, ecx, edx;
- __cpuid(1, &eax, &ebx, &ecx, &edx);
- return (ecx >> 23) & 1;
-}
+/// Determine at compile time the best popcount<> specialization according if
+/// platform is 32 or 64 bits, to the maximum number of nonzero bits to count or
+/// use hardware popcnt instruction when available.
+const BitCountType Full = HasPopCnt ? CNT_HW_POPCNT : Is64Bit ? CNT_64 : CNT_32;
+const BitCountType Max15 = HasPopCnt ? CNT_HW_POPCNT : Is64Bit ? CNT_64_MAX15 : CNT_32_MAX15;