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.cpp92
1 files changed, 56 insertions, 36 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index d9c430c67..19f1a4030 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -15,8 +15,8 @@ namespace Common {
15#ifndef _MSC_VER 15#ifndef _MSC_VER
16 16
17#ifdef __FreeBSD__ 17#ifdef __FreeBSD__
18#include <sys/types.h>
19#include <machine/cpufunc.h> 18#include <machine/cpufunc.h>
19#include <sys/types.h>
20#endif 20#endif
21 21
22static inline void __cpuidex(int info[4], int function_id, int subfunction_id) { 22static inline void __cpuidex(int info[4], int function_id, int subfunction_id) {
@@ -26,15 +26,9 @@ static inline void __cpuidex(int info[4], int function_id, int subfunction_id) {
26#else 26#else
27 info[0] = function_id; // eax 27 info[0] = function_id; // eax
28 info[2] = subfunction_id; // ecx 28 info[2] = subfunction_id; // ecx
29 __asm__( 29 __asm__("cpuid"
30 "cpuid" 30 : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3])
31 : "=a" (info[0]), 31 : "a"(function_id), "c"(subfunction_id));
32 "=b" (info[1]),
33 "=c" (info[2]),
34 "=d" (info[3])
35 : "a" (function_id),
36 "c" (subfunction_id)
37 );
38#endif 32#endif
39} 33}
40 34
@@ -88,14 +82,22 @@ static CPUCaps Detect() {
88 if (max_std_fn >= 1) { 82 if (max_std_fn >= 1) {
89 __cpuid(cpu_id, 0x00000001); 83 __cpuid(cpu_id, 0x00000001);
90 84
91 if ((cpu_id[3] >> 25) & 1) caps.sse = true; 85 if ((cpu_id[3] >> 25) & 1)
92 if ((cpu_id[3] >> 26) & 1) caps.sse2 = true; 86 caps.sse = true;
93 if ((cpu_id[2]) & 1) caps.sse3 = true; 87 if ((cpu_id[3] >> 26) & 1)
94 if ((cpu_id[2] >> 9) & 1) caps.ssse3 = true; 88 caps.sse2 = true;
95 if ((cpu_id[2] >> 19) & 1) caps.sse4_1 = true; 89 if ((cpu_id[2]) & 1)
96 if ((cpu_id[2] >> 20) & 1) caps.sse4_2 = true; 90 caps.sse3 = true;
97 if ((cpu_id[2] >> 22) & 1) caps.movbe = true; 91 if ((cpu_id[2] >> 9) & 1)
98 if ((cpu_id[2] >> 25) & 1) caps.aes = true; 92 caps.ssse3 = true;
93 if ((cpu_id[2] >> 19) & 1)
94 caps.sse4_1 = true;
95 if ((cpu_id[2] >> 20) & 1)
96 caps.sse4_2 = true;
97 if ((cpu_id[2] >> 22) & 1)
98 caps.movbe = true;
99 if ((cpu_id[2] >> 25) & 1)
100 caps.aes = true;
99 101
100 if ((cpu_id[3] >> 24) & 1) { 102 if ((cpu_id[3] >> 24) & 1) {
101 caps.fxsave_fxrstor = true; 103 caps.fxsave_fxrstor = true;
@@ -140,10 +142,14 @@ static CPUCaps Detect() {
140 if (max_ex_fn >= 0x80000001) { 142 if (max_ex_fn >= 0x80000001) {
141 // Check for more features 143 // Check for more features
142 __cpuid(cpu_id, 0x80000001); 144 __cpuid(cpu_id, 0x80000001);
143 if (cpu_id[2] & 1) caps.lahf_sahf_64 = true; 145 if (cpu_id[2] & 1)
144 if ((cpu_id[2] >> 5) & 1) caps.lzcnt = true; 146 caps.lahf_sahf_64 = true;
145 if ((cpu_id[2] >> 16) & 1) caps.fma4 = true; 147 if ((cpu_id[2] >> 5) & 1)
146 if ((cpu_id[3] >> 29) & 1) caps.long_mode = true; 148 caps.lzcnt = true;
149 if ((cpu_id[2] >> 16) & 1)
150 caps.fma4 = true;
151 if ((cpu_id[3] >> 29) & 1)
152 caps.long_mode = true;
147 } 153 }
148 154
149 return caps; 155 return caps;
@@ -162,24 +168,38 @@ std::string GetCPUCapsString() {
162 sum += caps.brand_string; 168 sum += caps.brand_string;
163 sum += ")"; 169 sum += ")";
164 170
165 if (caps.sse) sum += ", SSE"; 171 if (caps.sse)
172 sum += ", SSE";
166 if (caps.sse2) { 173 if (caps.sse2) {
167 sum += ", SSE2"; 174 sum += ", SSE2";
168 if (!caps.flush_to_zero) sum += " (without DAZ)"; 175 if (!caps.flush_to_zero)
176 sum += " (without DAZ)";
169 } 177 }
170 178
171 if (caps.sse3) sum += ", SSE3"; 179 if (caps.sse3)
172 if (caps.ssse3) sum += ", SSSE3"; 180 sum += ", SSE3";
173 if (caps.sse4_1) sum += ", SSE4.1"; 181 if (caps.ssse3)
174 if (caps.sse4_2) sum += ", SSE4.2"; 182 sum += ", SSSE3";
175 if (caps.avx) sum += ", AVX"; 183 if (caps.sse4_1)
176 if (caps.avx2) sum += ", AVX2"; 184 sum += ", SSE4.1";
177 if (caps.bmi1) sum += ", BMI1"; 185 if (caps.sse4_2)
178 if (caps.bmi2) sum += ", BMI2"; 186 sum += ", SSE4.2";
179 if (caps.fma) sum += ", FMA"; 187 if (caps.avx)
180 if (caps.aes) sum += ", AES"; 188 sum += ", AVX";
181 if (caps.movbe) sum += ", MOVBE"; 189 if (caps.avx2)
182 if (caps.long_mode) sum += ", 64-bit support"; 190 sum += ", AVX2";
191 if (caps.bmi1)
192 sum += ", BMI1";
193 if (caps.bmi2)
194 sum += ", BMI2";
195 if (caps.fma)
196 sum += ", FMA";
197 if (caps.aes)
198 sum += ", AES";
199 if (caps.movbe)
200 sum += ", MOVBE";
201 if (caps.long_mode)
202 sum += ", 64-bit support";
183 203
184 return sum; 204 return sum;
185} 205}