summaryrefslogtreecommitdiff
path: root/src/common/x64/cpu_detect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/x64/cpu_detect.cpp')
-rw-r--r--src/common/x64/cpu_detect.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index 99d87f586..d81edb140 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -93,10 +93,14 @@ static CPUCaps Detect() {
93 caps.sse = Common::Bit<25>(cpu_id[3]); 93 caps.sse = Common::Bit<25>(cpu_id[3]);
94 caps.sse2 = Common::Bit<26>(cpu_id[3]); 94 caps.sse2 = Common::Bit<26>(cpu_id[3]);
95 caps.sse3 = Common::Bit<0>(cpu_id[2]); 95 caps.sse3 = Common::Bit<0>(cpu_id[2]);
96 caps.pclmulqdq = Common::Bit<1>(cpu_id[2]);
96 caps.ssse3 = Common::Bit<9>(cpu_id[2]); 97 caps.ssse3 = Common::Bit<9>(cpu_id[2]);
97 caps.sse4_1 = Common::Bit<19>(cpu_id[2]); 98 caps.sse4_1 = Common::Bit<19>(cpu_id[2]);
98 caps.sse4_2 = Common::Bit<20>(cpu_id[2]); 99 caps.sse4_2 = Common::Bit<20>(cpu_id[2]);
100 caps.movbe = Common::Bit<22>(cpu_id[2]);
101 caps.popcnt = Common::Bit<23>(cpu_id[2]);
99 caps.aes = Common::Bit<25>(cpu_id[2]); 102 caps.aes = Common::Bit<25>(cpu_id[2]);
103 caps.f16c = Common::Bit<29>(cpu_id[2]);
100 104
101 // AVX support requires 3 separate checks: 105 // AVX support requires 3 separate checks:
102 // - Is the AVX bit set in CPUID? 106 // - Is the AVX bit set in CPUID?
@@ -112,16 +116,26 @@ static CPUCaps Detect() {
112 116
113 if (max_std_fn >= 7) { 117 if (max_std_fn >= 7) {
114 __cpuidex(cpu_id, 0x00000007, 0x00000000); 118 __cpuidex(cpu_id, 0x00000007, 0x00000000);
115 // Can't enable AVX2 unless the XSAVE/XGETBV checks above passed 119 // Can't enable AVX{2,512} unless the XSAVE/XGETBV checks above passed
116 caps.avx2 = caps.avx && Common::Bit<5>(cpu_id[1]); 120 if (caps.avx) {
121 caps.avx2 = Common::Bit<5>(cpu_id[1]);
122 caps.avx512f = Common::Bit<16>(cpu_id[1]);
123 caps.avx512dq = Common::Bit<17>(cpu_id[1]);
124 caps.avx512cd = Common::Bit<28>(cpu_id[1]);
125 caps.avx512bw = Common::Bit<30>(cpu_id[1]);
126 caps.avx512vl = Common::Bit<31>(cpu_id[1]);
127 caps.avx512vbmi = Common::Bit<1>(cpu_id[2]);
128 caps.avx512bitalg = Common::Bit<12>(cpu_id[2]);
129 }
130
117 caps.bmi1 = Common::Bit<3>(cpu_id[1]); 131 caps.bmi1 = Common::Bit<3>(cpu_id[1]);
118 caps.bmi2 = Common::Bit<8>(cpu_id[1]); 132 caps.bmi2 = Common::Bit<8>(cpu_id[1]);
119 // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP) 133 caps.sha = Common::Bit<29>(cpu_id[1]);
120 if (Common::Bit<16>(cpu_id[1]) && Common::Bit<28>(cpu_id[1]) && 134
121 Common::Bit<31>(cpu_id[1]) && Common::Bit<17>(cpu_id[1]) && 135 caps.gfni = Common::Bit<8>(cpu_id[2]);
122 Common::Bit<30>(cpu_id[1])) { 136
123 caps.avx512 = caps.avx2; 137 __cpuidex(cpu_id, 0x00000007, 0x00000001);
124 } 138 caps.avx_vnni = caps.avx && Common::Bit<4>(cpu_id[0]);
125 } 139 }
126 } 140 }
127 141