diff options
Diffstat (limited to 'src/common/x64')
| -rw-r--r-- | src/common/x64/cpu_detect.cpp | 30 | ||||
| -rw-r--r-- | src/common/x64/cpu_detect.h | 21 |
2 files changed, 40 insertions, 11 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 | ||
diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h index 3e6d808f3..40c48b132 100644 --- a/src/common/x64/cpu_detect.h +++ b/src/common/x64/cpu_detect.h | |||
| @@ -35,16 +35,31 @@ struct CPUCaps { | |||
| 35 | bool ssse3 : 1; | 35 | bool ssse3 : 1; |
| 36 | bool sse4_1 : 1; | 36 | bool sse4_1 : 1; |
| 37 | bool sse4_2 : 1; | 37 | bool sse4_2 : 1; |
| 38 | bool lzcnt : 1; | 38 | |
| 39 | bool avx : 1; | 39 | bool avx : 1; |
| 40 | bool avx_vnni : 1; | ||
| 40 | bool avx2 : 1; | 41 | bool avx2 : 1; |
| 41 | bool avx512 : 1; | 42 | bool avx512f : 1; |
| 43 | bool avx512dq : 1; | ||
| 44 | bool avx512cd : 1; | ||
| 45 | bool avx512bw : 1; | ||
| 46 | bool avx512vl : 1; | ||
| 47 | bool avx512vbmi : 1; | ||
| 48 | bool avx512bitalg : 1; | ||
| 49 | |||
| 50 | bool aes : 1; | ||
| 42 | bool bmi1 : 1; | 51 | bool bmi1 : 1; |
| 43 | bool bmi2 : 1; | 52 | bool bmi2 : 1; |
| 53 | bool f16c : 1; | ||
| 44 | bool fma : 1; | 54 | bool fma : 1; |
| 45 | bool fma4 : 1; | 55 | bool fma4 : 1; |
| 46 | bool aes : 1; | 56 | bool gfni : 1; |
| 47 | bool invariant_tsc : 1; | 57 | bool invariant_tsc : 1; |
| 58 | bool lzcnt : 1; | ||
| 59 | bool movbe : 1; | ||
| 60 | bool pclmulqdq : 1; | ||
| 61 | bool popcnt : 1; | ||
| 62 | bool sha : 1; | ||
| 48 | }; | 63 | }; |
| 49 | 64 | ||
| 50 | /** | 65 | /** |