799 static bool supports_sse4_1() { return (_features & CPU_SSE4_1) != 0; }
800 static bool supports_sse4_2() { return (_features & CPU_SSE4_2) != 0; }
801 static bool supports_popcnt() { return (_features & CPU_POPCNT) != 0; }
802 static bool supports_avx() { return (_features & CPU_AVX) != 0; }
803 static bool supports_avx2() { return (_features & CPU_AVX2) != 0; }
804 static bool supports_tsc() { return (_features & CPU_TSC) != 0; }
805 static bool supports_aes() { return (_features & CPU_AES) != 0; }
806 static bool supports_erms() { return (_features & CPU_ERMS) != 0; }
807 static bool supports_clmul() { return (_features & CPU_CLMUL) != 0; }
808 static bool supports_rtm() { return (_features & CPU_RTM) != 0; }
809 static bool supports_bmi1() { return (_features & CPU_BMI1) != 0; }
810 static bool supports_bmi2() { return (_features & CPU_BMI2) != 0; }
811 static bool supports_adx() { return (_features & CPU_ADX) != 0; }
812 static bool supports_evex() { return (_features & CPU_AVX512F) != 0; }
813 static bool supports_avx512dq() { return (_features & CPU_AVX512DQ) != 0; }
814 static bool supports_avx512pf() { return (_features & CPU_AVX512PF) != 0; }
815 static bool supports_avx512er() { return (_features & CPU_AVX512ER) != 0; }
816 static bool supports_avx512cd() { return (_features & CPU_AVX512CD) != 0; }
817 static bool supports_avx512bw() { return (_features & CPU_AVX512BW) != 0; }
818 static bool supports_avx512vl() { return (_features & CPU_AVX512VL) != 0; }
819 static bool supports_avx512vlbw() { return (supports_avx512bw() && supports_avx512vl()); }
820 static bool supports_avx512novl() { return (supports_evex() && !supports_avx512vl()); }
821 static bool supports_avx512nobw() { return (supports_evex() && !supports_avx512bw()); }
822 static bool supports_avx256only() { return (supports_avx2() && !supports_evex()); }
823 static bool supports_avxonly() { return ((supports_avx2() || supports_avx()) && !supports_evex()); }
824 static bool supports_sha() { return (_features & CPU_SHA) != 0; }
825 static bool supports_fma() { return (_features & CPU_FMA) != 0 && supports_avx(); }
826 static bool supports_vzeroupper() { return (_features & CPU_VZEROUPPER) != 0; }
827 static bool supports_vpopcntdq() { return (_features & CPU_AVX512_VPOPCNTDQ) != 0; }
828 static bool supports_vpclmulqdq() { return (_features & CPU_VPCLMULQDQ) != 0; }
829 static bool supports_vaes() { return (_features & CPU_VAES) != 0; }
830
831 // Intel features
832 static bool is_intel_family_core() { return is_intel() &&
833 extended_cpu_family() == CPU_FAMILY_INTEL_CORE; }
834
835 static bool is_intel_tsc_synched_at_init() {
836 if (is_intel_family_core()) {
837 uint32_t ext_model = extended_cpu_model();
838 if (ext_model == CPU_MODEL_NEHALEM_EP ||
839 ext_model == CPU_MODEL_WESTMERE_EP ||
|
799 static bool supports_sse4_1() { return (_features & CPU_SSE4_1) != 0; }
800 static bool supports_sse4_2() { return (_features & CPU_SSE4_2) != 0; }
801 static bool supports_popcnt() { return (_features & CPU_POPCNT) != 0; }
802 static bool supports_avx() { return (_features & CPU_AVX) != 0; }
803 static bool supports_avx2() { return (_features & CPU_AVX2) != 0; }
804 static bool supports_tsc() { return (_features & CPU_TSC) != 0; }
805 static bool supports_aes() { return (_features & CPU_AES) != 0; }
806 static bool supports_erms() { return (_features & CPU_ERMS) != 0; }
807 static bool supports_clmul() { return (_features & CPU_CLMUL) != 0; }
808 static bool supports_rtm() { return (_features & CPU_RTM) != 0; }
809 static bool supports_bmi1() { return (_features & CPU_BMI1) != 0; }
810 static bool supports_bmi2() { return (_features & CPU_BMI2) != 0; }
811 static bool supports_adx() { return (_features & CPU_ADX) != 0; }
812 static bool supports_evex() { return (_features & CPU_AVX512F) != 0; }
813 static bool supports_avx512dq() { return (_features & CPU_AVX512DQ) != 0; }
814 static bool supports_avx512pf() { return (_features & CPU_AVX512PF) != 0; }
815 static bool supports_avx512er() { return (_features & CPU_AVX512ER) != 0; }
816 static bool supports_avx512cd() { return (_features & CPU_AVX512CD) != 0; }
817 static bool supports_avx512bw() { return (_features & CPU_AVX512BW) != 0; }
818 static bool supports_avx512vl() { return (_features & CPU_AVX512VL) != 0; }
819 static bool supports_avx512vlbw() { return (supports_evex() && supports_avx512bw() && supports_avx512vl()); }
820 static bool supports_avx512vldq() { return (supports_evex() && supports_avx512dq() && supports_avx512vl()); }
821 static bool supports_avx512vlbwdq() { return (supports_evex() && supports_avx512vl() &&
822 supports_avx512bw() && supports_avx512dq()); }
823 static bool supports_avx512novl() { return (supports_evex() && !supports_avx512vl()); }
824 static bool supports_avx512nobw() { return (supports_evex() && !supports_avx512bw()); }
825 static bool supports_avx256only() { return (supports_avx2() && !supports_evex()); }
826 static bool supports_avxonly() { return ((supports_avx2() || supports_avx()) && !supports_evex()); }
827 static bool supports_sha() { return (_features & CPU_SHA) != 0; }
828 static bool supports_fma() { return (_features & CPU_FMA) != 0 && supports_avx(); }
829 static bool supports_vzeroupper() { return (_features & CPU_VZEROUPPER) != 0; }
830 static bool supports_vpopcntdq() { return (_features & CPU_AVX512_VPOPCNTDQ) != 0; }
831 static bool supports_vpclmulqdq() { return (_features & CPU_VPCLMULQDQ) != 0; }
832 static bool supports_vaes() { return (_features & CPU_VAES) != 0; }
833
834 // Intel features
835 static bool is_intel_family_core() { return is_intel() &&
836 extended_cpu_family() == CPU_FAMILY_INTEL_CORE; }
837
838 static bool is_intel_tsc_synched_at_init() {
839 if (is_intel_family_core()) {
840 uint32_t ext_model = extended_cpu_model();
841 if (ext_model == CPU_MODEL_NEHALEM_EP ||
842 ext_model == CPU_MODEL_WESTMERE_EP ||
|