summaryrefslogtreecommitdiff
path: root/src/common/x64/cpu_detect.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2016-09-21 11:29:48 -0700
committerGravatar GitHub2016-09-21 11:29:48 -0700
commitd5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a (patch)
tree8a22ca73ff838f3f0090b29a548ae81087fc90ed /src/common/x64/cpu_detect.cpp
parentREADME: Specify master branch for Travis CI badge (diff)
parentFix Travis clang-format check (diff)
downloadyuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.tar.gz
yuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.tar.xz
yuzu-d5d2ca8058a0f1c00ab7ca9fe2c058ba47546c0a.zip
Merge pull request #2086 from linkmauve/clang-format
Add clang-format as part of our {commit,travis}-time checks
Diffstat (limited to 'src/common/x64/cpu_detect.cpp')
-rw-r--r--src/common/x64/cpu_detect.cpp94
1 files changed, 56 insertions, 38 deletions
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index d9c430c67..6ddf9b70c 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -5,9 +5,7 @@
5#include <cstring> 5#include <cstring>
6#include <string> 6#include <string>
7#include <thread> 7#include <thread>
8
9#include "common/common_types.h" 8#include "common/common_types.h"
10
11#include "cpu_detect.h" 9#include "cpu_detect.h"
12 10
13namespace Common { 11namespace Common {
@@ -15,8 +13,8 @@ namespace Common {
15#ifndef _MSC_VER 13#ifndef _MSC_VER
16 14
17#ifdef __FreeBSD__ 15#ifdef __FreeBSD__
18#include <sys/types.h>
19#include <machine/cpufunc.h> 16#include <machine/cpufunc.h>
17#include <sys/types.h>
20#endif 18#endif
21 19
22static inline void __cpuidex(int info[4], int function_id, int subfunction_id) { 20static inline void __cpuidex(int info[4], int function_id, int subfunction_id) {
@@ -26,15 +24,9 @@ static inline void __cpuidex(int info[4], int function_id, int subfunction_id) {
26#else 24#else
27 info[0] = function_id; // eax 25 info[0] = function_id; // eax
28 info[2] = subfunction_id; // ecx 26 info[2] = subfunction_id; // ecx
29 __asm__( 27 __asm__("cpuid"
30 "cpuid" 28 : "=a"(info[0]), "=b"(info[1]), "=c"(info[2]), "=d"(info[3])
31 : "=a" (info[0]), 29 : "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 30#endif
39} 31}
40 32
@@ -88,14 +80,22 @@ static CPUCaps Detect() {
88 if (max_std_fn >= 1) { 80 if (max_std_fn >= 1) {
89 __cpuid(cpu_id, 0x00000001); 81 __cpuid(cpu_id, 0x00000001);
90 82
91 if ((cpu_id[3] >> 25) & 1) caps.sse = true; 83 if ((cpu_id[3] >> 25) & 1)
92 if ((cpu_id[3] >> 26) & 1) caps.sse2 = true; 84 caps.sse = true;
93 if ((cpu_id[2]) & 1) caps.sse3 = true; 85 if ((cpu_id[3] >> 26) & 1)
94 if ((cpu_id[2] >> 9) & 1) caps.ssse3 = true; 86 caps.sse2 = true;
95 if ((cpu_id[2] >> 19) & 1) caps.sse4_1 = true; 87 if ((cpu_id[2]) & 1)
96 if ((cpu_id[2] >> 20) & 1) caps.sse4_2 = true; 88 caps.sse3 = true;
97 if ((cpu_id[2] >> 22) & 1) caps.movbe = true; 89 if ((cpu_id[2] >> 9) & 1)
98 if ((cpu_id[2] >> 25) & 1) caps.aes = true; 90 caps.ssse3 = true;
91 if ((cpu_id[2] >> 19) & 1)
92 caps.sse4_1 = true;
93 if ((cpu_id[2] >> 20) & 1)
94 caps.sse4_2 = true;
95 if ((cpu_id[2] >> 22) & 1)
96 caps.movbe = true;
97 if ((cpu_id[2] >> 25) & 1)
98 caps.aes = true;
99 99
100 if ((cpu_id[3] >> 24) & 1) { 100 if ((cpu_id[3] >> 24) & 1) {
101 caps.fxsave_fxrstor = true; 101 caps.fxsave_fxrstor = true;
@@ -140,10 +140,14 @@ static CPUCaps Detect() {
140 if (max_ex_fn >= 0x80000001) { 140 if (max_ex_fn >= 0x80000001) {
141 // Check for more features 141 // Check for more features
142 __cpuid(cpu_id, 0x80000001); 142 __cpuid(cpu_id, 0x80000001);
143 if (cpu_id[2] & 1) caps.lahf_sahf_64 = true; 143 if (cpu_id[2] & 1)
144 if ((cpu_id[2] >> 5) & 1) caps.lzcnt = true; 144 caps.lahf_sahf_64 = true;
145 if ((cpu_id[2] >> 16) & 1) caps.fma4 = true; 145 if ((cpu_id[2] >> 5) & 1)
146 if ((cpu_id[3] >> 29) & 1) caps.long_mode = true; 146 caps.lzcnt = true;
147 if ((cpu_id[2] >> 16) & 1)
148 caps.fma4 = true;
149 if ((cpu_id[3] >> 29) & 1)
150 caps.long_mode = true;
147 } 151 }
148 152
149 return caps; 153 return caps;
@@ -162,24 +166,38 @@ std::string GetCPUCapsString() {
162 sum += caps.brand_string; 166 sum += caps.brand_string;
163 sum += ")"; 167 sum += ")";
164 168
165 if (caps.sse) sum += ", SSE"; 169 if (caps.sse)
170 sum += ", SSE";
166 if (caps.sse2) { 171 if (caps.sse2) {
167 sum += ", SSE2"; 172 sum += ", SSE2";
168 if (!caps.flush_to_zero) sum += " (without DAZ)"; 173 if (!caps.flush_to_zero)
174 sum += " (without DAZ)";
169 } 175 }
170 176
171 if (caps.sse3) sum += ", SSE3"; 177 if (caps.sse3)
172 if (caps.ssse3) sum += ", SSSE3"; 178 sum += ", SSE3";
173 if (caps.sse4_1) sum += ", SSE4.1"; 179 if (caps.ssse3)
174 if (caps.sse4_2) sum += ", SSE4.2"; 180 sum += ", SSSE3";
175 if (caps.avx) sum += ", AVX"; 181 if (caps.sse4_1)
176 if (caps.avx2) sum += ", AVX2"; 182 sum += ", SSE4.1";
177 if (caps.bmi1) sum += ", BMI1"; 183 if (caps.sse4_2)
178 if (caps.bmi2) sum += ", BMI2"; 184 sum += ", SSE4.2";
179 if (caps.fma) sum += ", FMA"; 185 if (caps.avx)
180 if (caps.aes) sum += ", AES"; 186 sum += ", AVX";
181 if (caps.movbe) sum += ", MOVBE"; 187 if (caps.avx2)
182 if (caps.long_mode) sum += ", 64-bit support"; 188 sum += ", AVX2";
189 if (caps.bmi1)
190 sum += ", BMI1";
191 if (caps.bmi2)
192 sum += ", BMI2";
193 if (caps.fma)
194 sum += ", FMA";
195 if (caps.aes)
196 sum += ", AES";
197 if (caps.movbe)
198 sum += ", MOVBE";
199 if (caps.long_mode)
200 sum += ", 64-bit support";
183 201
184 return sum; 202 return sum;
185} 203}