15 #if defined(HAVE__GET_CPUID) || defined(HAVE__GET_CPUID_COUNT)
19 #ifdef HAVE_XSAVE_INTRINSICS
20 #include <immintrin.h>
23 #if defined(HAVE__CPUID) || defined(HAVE__CPUIDEX)
34 #ifdef TRY_POPCNT_FAST
42 unsigned int exx[4] = {0, 0, 0, 0};
44 #if defined(HAVE__GET_CPUID)
45 __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]);
46 #elif defined(HAVE__CPUID)
49 #error cpuid instruction not available
51 return (exx[2] & (1 << 27)) != 0;
61 zmm_regs_available(
void)
63 #ifdef HAVE_XSAVE_INTRINSICS
64 return (_xgetbv(0) & 0xe6) == 0xe6;
75 avx512_popcnt_available(
void)
77 unsigned int exx[4] = {0, 0, 0, 0};
79 #if defined(HAVE__GET_CPUID_COUNT)
80 __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]);
81 #elif defined(HAVE__CPUIDEX)
84 #error cpuid instruction not available
86 return (exx[2] & (1 << 14)) != 0 &&
87 (exx[1] & (1 << 30)) != 0;
95 pg_popcount_avx512_available(
void)
97 return xsave_available() &&
98 zmm_regs_available() &&
99 avx512_popcnt_available();