1*eca53ba6SRoland Levillain // Copyright 2017 Google LLC
2*eca53ba6SRoland Levillain //
3*eca53ba6SRoland Levillain // Licensed under the Apache License, Version 2.0 (the "License");
4*eca53ba6SRoland Levillain // you may not use this file except in compliance with the License.
5*eca53ba6SRoland Levillain // You may obtain a copy of the License at
6*eca53ba6SRoland Levillain //
7*eca53ba6SRoland Levillain // http://www.apache.org/licenses/LICENSE-2.0
8*eca53ba6SRoland Levillain //
9*eca53ba6SRoland Levillain // Unless required by applicable law or agreed to in writing, software
10*eca53ba6SRoland Levillain // distributed under the License is distributed on an "AS IS" BASIS,
11*eca53ba6SRoland Levillain // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*eca53ba6SRoland Levillain // See the License for the specific language governing permissions and
13*eca53ba6SRoland Levillain // limitations under the License.
14*eca53ba6SRoland Levillain
15*eca53ba6SRoland Levillain #include "cpuinfo_x86.h"
16*eca53ba6SRoland Levillain
17*eca53ba6SRoland Levillain #include <cassert>
18*eca53ba6SRoland Levillain #include <cstdio>
19*eca53ba6SRoland Levillain #include <map>
20*eca53ba6SRoland Levillain #include <set>
21*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
22*eca53ba6SRoland Levillain #include "internal/windows_utils.h"
23*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_WINDOWS
24*eca53ba6SRoland Levillain
25*eca53ba6SRoland Levillain #include "filesystem_for_testing.h"
26*eca53ba6SRoland Levillain #include "gtest/gtest.h"
27*eca53ba6SRoland Levillain #include "internal/cpuid_x86.h"
28*eca53ba6SRoland Levillain
29*eca53ba6SRoland Levillain namespace cpu_features {
30*eca53ba6SRoland Levillain
31*eca53ba6SRoland Levillain class FakeCpu {
32*eca53ba6SRoland Levillain public:
GetCpuidLeaf(uint32_t leaf_id,int ecx) const33*eca53ba6SRoland Levillain Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) const {
34*eca53ba6SRoland Levillain const auto itr = cpuid_leaves_.find(std::make_pair(leaf_id, ecx));
35*eca53ba6SRoland Levillain if (itr != cpuid_leaves_.end()) {
36*eca53ba6SRoland Levillain return itr->second;
37*eca53ba6SRoland Levillain }
38*eca53ba6SRoland Levillain return {0, 0, 0, 0};
39*eca53ba6SRoland Levillain }
40*eca53ba6SRoland Levillain
GetXCR0Eax() const41*eca53ba6SRoland Levillain uint32_t GetXCR0Eax() const { return xcr0_eax_; }
42*eca53ba6SRoland Levillain
SetLeaves(std::map<std::pair<uint32_t,int>,Leaf> configuration)43*eca53ba6SRoland Levillain void SetLeaves(std::map<std::pair<uint32_t, int>, Leaf> configuration) {
44*eca53ba6SRoland Levillain cpuid_leaves_ = std::move(configuration);
45*eca53ba6SRoland Levillain }
46*eca53ba6SRoland Levillain
SetOsBackupsExtendedRegisters(bool os_backups_extended_registers)47*eca53ba6SRoland Levillain void SetOsBackupsExtendedRegisters(bool os_backups_extended_registers) {
48*eca53ba6SRoland Levillain xcr0_eax_ = os_backups_extended_registers ? -1 : 0;
49*eca53ba6SRoland Levillain }
50*eca53ba6SRoland Levillain
51*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_MACOS)
GetDarwinSysCtlByName(std::string name) const52*eca53ba6SRoland Levillain bool GetDarwinSysCtlByName(std::string name) const {
53*eca53ba6SRoland Levillain return darwin_sysctlbyname_.count(name);
54*eca53ba6SRoland Levillain }
55*eca53ba6SRoland Levillain
SetDarwinSysCtlByName(std::string name)56*eca53ba6SRoland Levillain void SetDarwinSysCtlByName(std::string name) {
57*eca53ba6SRoland Levillain darwin_sysctlbyname_.insert(name);
58*eca53ba6SRoland Levillain }
59*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_MACOS
60*eca53ba6SRoland Levillain
61*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature)62*eca53ba6SRoland Levillain bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) {
63*eca53ba6SRoland Levillain return windows_isprocessorfeaturepresent_.count(ProcessorFeature);
64*eca53ba6SRoland Levillain }
65*eca53ba6SRoland Levillain
SetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature)66*eca53ba6SRoland Levillain void SetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) {
67*eca53ba6SRoland Levillain windows_isprocessorfeaturepresent_.insert(ProcessorFeature);
68*eca53ba6SRoland Levillain }
69*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_WINDOWS
70*eca53ba6SRoland Levillain
71*eca53ba6SRoland Levillain private:
72*eca53ba6SRoland Levillain std::map<std::pair<uint32_t, int>, Leaf> cpuid_leaves_;
73*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_MACOS)
74*eca53ba6SRoland Levillain std::set<std::string> darwin_sysctlbyname_;
75*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_MACOS
76*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
77*eca53ba6SRoland Levillain std::set<DWORD> windows_isprocessorfeaturepresent_;
78*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_WINDOWS
79*eca53ba6SRoland Levillain uint32_t xcr0_eax_;
80*eca53ba6SRoland Levillain };
81*eca53ba6SRoland Levillain
82*eca53ba6SRoland Levillain static FakeCpu* g_fake_cpu_instance = nullptr;
83*eca53ba6SRoland Levillain
cpu()84*eca53ba6SRoland Levillain static FakeCpu& cpu() {
85*eca53ba6SRoland Levillain assert(g_fake_cpu_instance != nullptr);
86*eca53ba6SRoland Levillain return *g_fake_cpu_instance;
87*eca53ba6SRoland Levillain }
88*eca53ba6SRoland Levillain
GetCpuidLeaf(uint32_t leaf_id,int ecx)89*eca53ba6SRoland Levillain extern "C" Leaf GetCpuidLeaf(uint32_t leaf_id, int ecx) {
90*eca53ba6SRoland Levillain return cpu().GetCpuidLeaf(leaf_id, ecx);
91*eca53ba6SRoland Levillain }
92*eca53ba6SRoland Levillain
GetXCR0Eax(void)93*eca53ba6SRoland Levillain extern "C" uint32_t GetXCR0Eax(void) { return cpu().GetXCR0Eax(); }
94*eca53ba6SRoland Levillain
95*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_MACOS)
GetDarwinSysCtlByName(const char * name)96*eca53ba6SRoland Levillain extern "C" bool GetDarwinSysCtlByName(const char* name) {
97*eca53ba6SRoland Levillain return cpu().GetDarwinSysCtlByName(name);
98*eca53ba6SRoland Levillain }
99*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_MACOS
100*eca53ba6SRoland Levillain
101*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature)102*eca53ba6SRoland Levillain extern "C" bool GetWindowsIsProcessorFeaturePresent(DWORD ProcessorFeature) {
103*eca53ba6SRoland Levillain return cpu().GetWindowsIsProcessorFeaturePresent(ProcessorFeature);
104*eca53ba6SRoland Levillain }
105*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_WINDOWS
106*eca53ba6SRoland Levillain
107*eca53ba6SRoland Levillain namespace {
108*eca53ba6SRoland Levillain
109*eca53ba6SRoland Levillain class CpuidX86Test : public ::testing::Test {
110*eca53ba6SRoland Levillain protected:
SetUp()111*eca53ba6SRoland Levillain void SetUp() override {
112*eca53ba6SRoland Levillain assert(g_fake_cpu_instance == nullptr);
113*eca53ba6SRoland Levillain g_fake_cpu_instance = new FakeCpu();
114*eca53ba6SRoland Levillain }
TearDown()115*eca53ba6SRoland Levillain void TearDown() override {
116*eca53ba6SRoland Levillain delete g_fake_cpu_instance;
117*eca53ba6SRoland Levillain g_fake_cpu_instance = nullptr;
118*eca53ba6SRoland Levillain }
119*eca53ba6SRoland Levillain };
120*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,X86MicroarchitectureEnum)121*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, X86MicroarchitectureEnum) {
122*eca53ba6SRoland Levillain const char *last_name = GetX86MicroarchitectureName(X86_MICROARCHITECTURE_LAST_);
123*eca53ba6SRoland Levillain EXPECT_STREQ(last_name, "unknown microarchitecture");
124*eca53ba6SRoland Levillain for (int i = static_cast<int>(X86_UNKNOWN); i != static_cast<int>(X86_MICROARCHITECTURE_LAST_); ++i) {
125*eca53ba6SRoland Levillain const auto micro = static_cast<X86Microarchitecture>(i);
126*eca53ba6SRoland Levillain const char *name = GetX86MicroarchitectureName(micro);
127*eca53ba6SRoland Levillain ASSERT_FALSE(name == nullptr);
128*eca53ba6SRoland Levillain EXPECT_STRNE(name, "");
129*eca53ba6SRoland Levillain EXPECT_STRNE(name, last_name);
130*eca53ba6SRoland Levillain }
131*eca53ba6SRoland Levillain }
132*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,X86FeaturesEnum)133*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, X86FeaturesEnum) {
134*eca53ba6SRoland Levillain const char *last_name = GetX86FeaturesEnumName(X86_LAST_);
135*eca53ba6SRoland Levillain EXPECT_STREQ(last_name, "unknown_feature");
136*eca53ba6SRoland Levillain for (int i = static_cast<int>(X86_FPU); i != static_cast<int>(X86_LAST_); ++i) {
137*eca53ba6SRoland Levillain const auto feature = static_cast<X86FeaturesEnum>(i);
138*eca53ba6SRoland Levillain const char *name = GetX86FeaturesEnumName(feature);
139*eca53ba6SRoland Levillain ASSERT_FALSE(name == nullptr);
140*eca53ba6SRoland Levillain EXPECT_STRNE(name, "");
141*eca53ba6SRoland Levillain EXPECT_STRNE(name, last_name);
142*eca53ba6SRoland Levillain }
143*eca53ba6SRoland Levillain }
144*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,SandyBridge)145*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, SandyBridge) {
146*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
147*eca53ba6SRoland Levillain cpu().SetLeaves({
148*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}},
149*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}},
150*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
151*eca53ba6SRoland Levillain });
152*eca53ba6SRoland Levillain const auto info = GetX86Info();
153*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
154*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
155*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x02A);
156*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x06);
157*eca53ba6SRoland Levillain // Leaf 7 is zeroed out so none of the Leaf 7 flags are set.
158*eca53ba6SRoland Levillain const auto features = info.features;
159*eca53ba6SRoland Levillain EXPECT_FALSE(features.erms);
160*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx2);
161*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512f);
162*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512cd);
163*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512er);
164*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512pf);
165*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512bw);
166*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512dq);
167*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512vl);
168*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512ifma);
169*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512vbmi);
170*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512vbmi2);
171*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512vnni);
172*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512bitalg);
173*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512vpopcntdq);
174*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512_4vnniw);
175*eca53ba6SRoland Levillain EXPECT_FALSE(features.avx512_4fmaps);
176*eca53ba6SRoland Levillain // All old cpu features should be set.
177*eca53ba6SRoland Levillain EXPECT_TRUE(features.aes);
178*eca53ba6SRoland Levillain EXPECT_TRUE(features.ssse3);
179*eca53ba6SRoland Levillain EXPECT_TRUE(features.sse4_1);
180*eca53ba6SRoland Levillain EXPECT_TRUE(features.sse4_2);
181*eca53ba6SRoland Levillain EXPECT_TRUE(features.avx);
182*eca53ba6SRoland Levillain EXPECT_FALSE(features.sha);
183*eca53ba6SRoland Levillain EXPECT_TRUE(features.popcnt);
184*eca53ba6SRoland Levillain EXPECT_FALSE(features.movbe);
185*eca53ba6SRoland Levillain EXPECT_FALSE(features.rdrnd);
186*eca53ba6SRoland Levillain EXPECT_FALSE(features.adx);
187*eca53ba6SRoland Levillain EXPECT_FALSE(features.lam);
188*eca53ba6SRoland Levillain EXPECT_FALSE(features.uai);
189*eca53ba6SRoland Levillain }
190*eca53ba6SRoland Levillain
191*eca53ba6SRoland Levillain const int UNDEF = -1;
192*eca53ba6SRoland Levillain const int KiB = 1024;
193*eca53ba6SRoland Levillain const int MiB = 1024 * KiB;
194*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,SandyBridgeTestOsSupport)195*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, SandyBridgeTestOsSupport) {
196*eca53ba6SRoland Levillain cpu().SetLeaves({
197*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}},
198*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000206A6, 0x00100800, 0x1F9AE3BF, 0xBFEBFBFF}},
199*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
200*eca53ba6SRoland Levillain });
201*eca53ba6SRoland Levillain // avx is disabled if os does not support backing up ymm registers.
202*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(false);
203*eca53ba6SRoland Levillain EXPECT_FALSE(GetX86Info().features.avx);
204*eca53ba6SRoland Levillain // avx is disabled if os does not support backing up ymm registers.
205*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
206*eca53ba6SRoland Levillain EXPECT_TRUE(GetX86Info().features.avx);
207*eca53ba6SRoland Levillain }
208*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,SkyLake)209*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, SkyLake) {
210*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
211*eca53ba6SRoland Levillain cpu().SetLeaves({
212*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
213*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
214*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}},
215*eca53ba6SRoland Levillain });
216*eca53ba6SRoland Levillain const auto info = GetX86Info();
217*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
218*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
219*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x04E);
220*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x03);
221*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_SKL);
222*eca53ba6SRoland Levillain }
223*eca53ba6SRoland Levillain
224*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0050654_SkylakeXeon_CPUID8.txt
TEST_F(CpuidX86Test,SkyLakeXeon)225*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, SkyLakeXeon) {
226*eca53ba6SRoland Levillain cpu().SetLeaves({
227*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
228*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00050654, 0x00100800, 0x7FFEFBFF, 0xBFEBFBFF}}
229*eca53ba6SRoland Levillain });
230*eca53ba6SRoland Levillain const auto info = GetX86Info();
231*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
232*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
233*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x055);
234*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x04);
235*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_SKL);
236*eca53ba6SRoland Levillain }
237*eca53ba6SRoland Levillain
238*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0050657_CascadeLakeXeon_CPUID.txt
TEST_F(CpuidX86Test,CascadeLake)239*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, CascadeLake) {
240*eca53ba6SRoland Levillain cpu().SetLeaves({
241*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
242*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00050657, 0x00400800, 0x7FFEFBFF, 0xBFEBFBFF}}
243*eca53ba6SRoland Levillain });
244*eca53ba6SRoland Levillain const auto info = GetX86Info();
245*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
246*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
247*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x055);
248*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x07);
249*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CCL);
250*eca53ba6SRoland Levillain }
251*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,Branding)252*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, Branding) {
253*eca53ba6SRoland Levillain cpu().SetLeaves({
254*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
255*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
256*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}},
257*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
258*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}},
259*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}},
260*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}},
261*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x352E3220, 0x7A484730, 0x00000000, 0x00000000}},
262*eca53ba6SRoland Levillain });
263*eca53ba6SRoland Levillain const auto info = GetX86Info();
264*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string, "Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz");
265*eca53ba6SRoland Levillain }
266*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,KabyLakeCache)267*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, KabyLakeCache) {
268*eca53ba6SRoland Levillain cpu().SetLeaves({
269*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
270*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
271*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}},
272*eca53ba6SRoland Levillain {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}},
273*eca53ba6SRoland Levillain {{0x00000004, 2}, Leaf{0x1C004143, 0x00C0003F, 0x000003FF, 0x00000000}},
274*eca53ba6SRoland Levillain {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000002}},
275*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}},
276*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
277*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}},
278*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}},
279*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}},
280*eca53ba6SRoland Levillain });
281*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
282*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
283*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
284*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
285*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 32 * KiB);
286*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 8);
287*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
288*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].tlb_entries, 64);
289*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].partitioning, 1);
290*eca53ba6SRoland Levillain
291*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
292*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
293*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
294*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 32 * KiB);
295*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 8);
296*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
297*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].tlb_entries, 64);
298*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].partitioning, 1);
299*eca53ba6SRoland Levillain
300*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
301*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
302*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 256 * KiB);
303*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 4);
304*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
305*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].tlb_entries, 1024);
306*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].partitioning, 1);
307*eca53ba6SRoland Levillain
308*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
309*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
310*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 6 * MiB);
311*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 12);
312*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
313*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].tlb_entries, 8192);
314*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].partitioning, 1);
315*eca53ba6SRoland Levillain }
316*eca53ba6SRoland Levillain
TEST_F(CpuidX86Test,HSWCache)317*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, HSWCache) {
318*eca53ba6SRoland Levillain cpu().SetLeaves({
319*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
320*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000406E3, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
321*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}},
322*eca53ba6SRoland Levillain {{0x00000004, 1}, Leaf{0x1C004122, 0x01C0003F, 0x0000003F, 0x00000000}},
323*eca53ba6SRoland Levillain {{0x00000004, 2}, Leaf{0x1C004143, 0x01C0003F, 0x000001FF, 0x00000000}},
324*eca53ba6SRoland Levillain {{0x00000004, 3}, Leaf{0x1C03C163, 0x02C0003F, 0x00001FFF, 0x00000006}},
325*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x029C67AF, 0x00000000, 0x00000000}},
326*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
327*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}},
328*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x65746E49, 0x2952286C, 0x726F4320, 0x4D542865}},
329*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x37692029, 0x3035362D, 0x43205530, 0x40205550}},
330*eca53ba6SRoland Levillain });
331*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
332*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
333*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
334*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
335*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 32 * KiB);
336*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 8);
337*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
338*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].tlb_entries, 64);
339*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].partitioning, 1);
340*eca53ba6SRoland Levillain
341*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
342*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
343*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
344*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 32 * KiB);
345*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 8);
346*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
347*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].tlb_entries, 64);
348*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].partitioning, 1);
349*eca53ba6SRoland Levillain
350*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
351*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
352*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 256 * KiB);
353*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 8);
354*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
355*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].tlb_entries, 512);
356*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].partitioning, 1);
357*eca53ba6SRoland Levillain
358*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
359*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
360*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 6 * MiB);
361*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 12);
362*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
363*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].tlb_entries, 8192);
364*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].partitioning, 1);
365*eca53ba6SRoland Levillain }
366*eca53ba6SRoland Levillain
367*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0200F30_K11_Griffin_CPUID.txt
TEST_F(CpuidX86Test,AMD_K11_GRIFFIN)368*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K11_GRIFFIN) {
369*eca53ba6SRoland Levillain cpu().SetLeaves({
370*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000001, 0x68747541, 0x444D4163, 0x69746E65}},
371*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00200F30, 0x00020800, 0x00002001, 0x178BFBFF}},
372*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001A, 0x68747541, 0x444D4163, 0x69746E65}},
373*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00200F30, 0x20000000, 0x0000131F, 0xEBD3FBFF}},
374*eca53ba6SRoland Levillain });
375*eca53ba6SRoland Levillain const auto info = GetX86Info();
376*eca53ba6SRoland Levillain
377*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
378*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x11);
379*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x03);
380*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_K11);
381*eca53ba6SRoland Levillain }
382*eca53ba6SRoland Levillain
383*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0300F10_K12_Llano_CPUID.txt
TEST_F(CpuidX86Test,AMD_K12_LLANO)384*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K12_LLANO) {
385*eca53ba6SRoland Levillain cpu().SetLeaves({
386*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}},
387*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00300F10, 0x00040800, 0x00802009, 0x178BFBFF}},
388*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}},
389*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00300F10, 0x20002B31, 0x000037FF, 0xEFD3FBFF}},
390*eca53ba6SRoland Levillain });
391*eca53ba6SRoland Levillain const auto info = GetX86Info();
392*eca53ba6SRoland Levillain
393*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
394*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x12);
395*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x01);
396*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_K12);
397*eca53ba6SRoland Levillain }
398*eca53ba6SRoland Levillain
399*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F01_K14_Bobcat_CPUID.txt
TEST_F(CpuidX86Test,AMD_K14_BOBCAT_AMD0500F01)400*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F01) {
401*eca53ba6SRoland Levillain cpu().SetLeaves({
402*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}},
403*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00500F01, 0x00020800, 0x00802209, 0x178BFBFF}},
404*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}},
405*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00500F01, 0x00000000, 0x000035FF, 0x2FD3FBFF}},
406*eca53ba6SRoland Levillain });
407*eca53ba6SRoland Levillain const auto info = GetX86Info();
408*eca53ba6SRoland Levillain
409*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
410*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x14);
411*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x00);
412*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT);
413*eca53ba6SRoland Levillain }
414*eca53ba6SRoland Levillain
415*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F10_K14_Bobcat_CPUID.txt
TEST_F(CpuidX86Test,AMD_K14_BOBCAT_AMD0500F10)416*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F10) {
417*eca53ba6SRoland Levillain cpu().SetLeaves({
418*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}},
419*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00500F10, 0x00020800, 0x00802209, 0x178BFBFF}},
420*eca53ba6SRoland Levillain {{0x00000002, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
421*eca53ba6SRoland Levillain {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
422*eca53ba6SRoland Levillain {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x00000000}},
423*eca53ba6SRoland Levillain {{0x00000006, 0}, Leaf{0x00000000, 0x00000000, 0x00000001, 0x00000000}},
424*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}},
425*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00500F10, 0x00001242, 0x000035FF, 0x2FD3FBFF}},
426*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x35332D45, 0x72502030, 0x7365636F}},
427*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x00726F73, 0x00000000, 0x00000000, 0x00000000}},
428*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
429*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0xFF08FF08, 0xFF280000, 0x20080140, 0x20020140}},
430*eca53ba6SRoland Levillain });
431*eca53ba6SRoland Levillain const auto info = GetX86Info();
432*eca53ba6SRoland Levillain
433*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
434*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x14);
435*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x01);
436*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT);
437*eca53ba6SRoland Levillain }
438*eca53ba6SRoland Levillain
439*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0500F20_K14_Bobcat_CPUID.txt
TEST_F(CpuidX86Test,AMD_K14_BOBCAT_AMD0500F20)440*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K14_BOBCAT_AMD0500F20) {
441*eca53ba6SRoland Levillain cpu().SetLeaves({
442*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}},
443*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00500F20, 0x00020800, 0x00802209, 0x178BFBFF}},
444*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}},
445*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00500F20, 0x000012E9, 0x000035FF, 0x2FD3FBFF}},
446*eca53ba6SRoland Levillain });
447*eca53ba6SRoland Levillain const auto info = GetX86Info();
448*eca53ba6SRoland Levillain
449*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
450*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x14);
451*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x02);
452*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_BOBCAT);
453*eca53ba6SRoland Levillain }
454*eca53ba6SRoland Levillain
455*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0670F00_K15_StoneyRidge_CPUID.txt
TEST_F(CpuidX86Test,AMD_K15_EXCAVATOR_STONEY_RIDGE)456*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_EXCAVATOR_STONEY_RIDGE) {
457*eca53ba6SRoland Levillain cpu().SetLeaves({
458*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
459*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00670F00, 0x00020800, 0x7ED8320B, 0x178BFBFF}},
460*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x000001A9, 0x00000000, 0x00000000}},
461*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
462*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00670F00, 0x00000000, 0x2FABBFFF, 0x2FD3FBFF}},
463*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x392D3941, 0x20303134, 0x45444152}},
464*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x52204E4F, 0x35202C35, 0x4D4F4320, 0x45545550}},
465*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x524F4320, 0x32205345, 0x47332B43, 0x00202020}},
466*eca53ba6SRoland Levillain });
467*eca53ba6SRoland Levillain const auto info = GetX86Info();
468*eca53ba6SRoland Levillain
469*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
470*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
471*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x70);
472*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
473*eca53ba6SRoland Levillain "AMD A9-9410 RADEON R5, 5 COMPUTE CORES 2C+3G ");
474*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
475*eca53ba6SRoland Levillain X86Microarchitecture::AMD_EXCAVATOR);
476*eca53ba6SRoland Levillain }
477*eca53ba6SRoland Levillain
478*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F20_K15_AbuDhabi_CPUID0.txt
TEST_F(CpuidX86Test,AMD_K15_PILEDRIVER_ABU_DHABI)479*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_ABU_DHABI) {
480*eca53ba6SRoland Levillain cpu().SetLeaves({
481*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
482*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00600F20, 0x00100800, 0x3E98320B, 0x178BFBFF}},
483*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}},
484*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
485*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00600F20, 0x30000000, 0x01EBBFFF, 0x2FD3FBFF}},
486*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x6574704F, 0x286E6F72, 0x20296D74}},
487*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x636F7250, 0x6F737365, 0x33362072, 0x20203637}},
488*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}},
489*eca53ba6SRoland Levillain });
490*eca53ba6SRoland Levillain const auto info = GetX86Info();
491*eca53ba6SRoland Levillain
492*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
493*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
494*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x02);
495*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
496*eca53ba6SRoland Levillain "AMD Opteron(tm) Processor 6376 ");
497*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
498*eca53ba6SRoland Levillain X86Microarchitecture::AMD_PILEDRIVER);
499*eca53ba6SRoland Levillain
500*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string, "AMD Opteron(tm) Processor 6376 ");
501*eca53ba6SRoland Levillain }
502*eca53ba6SRoland Levillain
503*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F20_K15_AbuDhabi_CPUID0.txt
TEST_F(CpuidX86Test,AMD_K15_PILEDRIVER_ABU_DHABI_CACHE_INFO)504*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_ABU_DHABI_CACHE_INFO) {
505*eca53ba6SRoland Levillain cpu().SetLeaves({
506*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
507*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00600F20, 0x00100800, 0x3E98320B, 0x178BFBFF}},
508*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
509*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00600F20, 0x30000000, 0x01EBBFFF, 0x2FD3FBFF}},
510*eca53ba6SRoland Levillain {{0x8000001D, 0}, Leaf{0x00000121, 0x00C0003F, 0x0000003F, 0x00000000}},
511*eca53ba6SRoland Levillain {{0x8000001D, 1}, Leaf{0x00004122, 0x0040003F, 0x000001FF, 0x00000000}},
512*eca53ba6SRoland Levillain {{0x8000001D, 2}, Leaf{0x00004143, 0x03C0003F, 0x000007FF, 0x00000001}},
513*eca53ba6SRoland Levillain {{0x8000001D, 3}, Leaf{0x0001C163, 0x0BC0003F, 0x000007FF, 0x00000001}},
514*eca53ba6SRoland Levillain });
515*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
516*eca53ba6SRoland Levillain
517*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
518*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
519*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
520*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 16 * KiB);
521*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 4);
522*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
523*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].tlb_entries, 64);
524*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].partitioning, 1);
525*eca53ba6SRoland Levillain
526*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
527*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
528*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
529*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 64 * KiB);
530*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 2);
531*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
532*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].tlb_entries, 512);
533*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].partitioning, 1);
534*eca53ba6SRoland Levillain
535*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
536*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
537*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 2 * MiB);
538*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 16);
539*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
540*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].tlb_entries, 2048);
541*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].partitioning, 1);
542*eca53ba6SRoland Levillain
543*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
544*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
545*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 6 * MiB);
546*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 48);
547*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
548*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].tlb_entries, 2048);
549*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].partitioning, 1);
550*eca53ba6SRoland Levillain }
551*eca53ba6SRoland Levillain
552*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/AuthenticAMD/AuthenticAMD0610F01_K15_Piledriver_CPUID.txt
TEST_F(CpuidX86Test,AMD_K15_PILEDRIVER_A10)553*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_PILEDRIVER_A10) {
554*eca53ba6SRoland Levillain cpu().SetLeaves({
555*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
556*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00610F01, 0x00040800, 0x3E98320B, 0x178BFBFF}},
557*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}},
558*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
559*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00610F01, 0x20000000, 0x01EBBFFF, 0x2FD3FBFF}},
560*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x2D303141, 0x30303835, 0x5041204B}},
561*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x69772055, 0x52206874, 0x6F656461, 0x6D74286E}},
562*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x44482029, 0x61724720, 0x63696870, 0x00202073}},
563*eca53ba6SRoland Levillain });
564*eca53ba6SRoland Levillain const auto info = GetX86Info();
565*eca53ba6SRoland Levillain
566*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
567*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
568*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x10);
569*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
570*eca53ba6SRoland Levillain "AMD A10-5800K APU with Radeon(tm) HD Graphics ");
571*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
572*eca53ba6SRoland Levillain X86Microarchitecture::AMD_PILEDRIVER);
573*eca53ba6SRoland Levillain }
574*eca53ba6SRoland Levillain
575*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F12_K15_Interlagos_CPUID3.txt
TEST_F(CpuidX86Test,AMD_K15_BULLDOZER_INTERLAGOS)576*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_BULLDOZER_INTERLAGOS) {
577*eca53ba6SRoland Levillain cpu().SetLeaves({
578*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
579*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00600F12, 0x000C0800, 0x1E98220B, 0x178BFBFF}},
580*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
581*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
582*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00600F12, 0x30000000, 0x01C9BFFF, 0x2FD3FBFF}},
583*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x6574704F, 0x286E6F72, 0x20294D54}},
584*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x636F7250, 0x6F737365, 0x32362072, 0x20203833}},
585*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}},
586*eca53ba6SRoland Levillain });
587*eca53ba6SRoland Levillain const auto info = GetX86Info();
588*eca53ba6SRoland Levillain
589*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
590*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
591*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x01);
592*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
593*eca53ba6SRoland Levillain "AMD Opteron(TM) Processor 6238 ");
594*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
595*eca53ba6SRoland Levillain X86Microarchitecture::AMD_BULLDOZER);
596*eca53ba6SRoland Levillain }
597*eca53ba6SRoland Levillain
598*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD0630F81_K15_Godavari_CPUID.txt
TEST_F(CpuidX86Test,AMD_K15_STREAMROLLER_GODAVARI)599*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_STREAMROLLER_GODAVARI) {
600*eca53ba6SRoland Levillain cpu().SetLeaves({
601*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
602*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00630F81, 0x00040800, 0x3E98320B, 0x178BFBFF}},
603*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
604*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
605*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00630F81, 0x10000000, 0x0FEBBFFF, 0x2FD3FBFF}},
606*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x372D3841, 0x4B303736, 0x64615220}},
607*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x206E6F65, 0x202C3752, 0x43203031, 0x75706D6F}},
608*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x43206574, 0x7365726F, 0x2B433420, 0x00204736}},
609*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0xFF40FF18, 0xFF40FF30, 0x10040140, 0x60030140}},
610*eca53ba6SRoland Levillain });
611*eca53ba6SRoland Levillain const auto info = GetX86Info();
612*eca53ba6SRoland Levillain
613*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
614*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
615*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x38);
616*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x01);
617*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
618*eca53ba6SRoland Levillain "AMD A8-7670K Radeon R7, 10 Compute Cores 4C+6G ");
619*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
620*eca53ba6SRoland Levillain X86Microarchitecture::AMD_STREAMROLLER);
621*eca53ba6SRoland Levillain }
622*eca53ba6SRoland Levillain
623*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0600F12_K15_Zambezi8C_CPUID.txt
TEST_F(CpuidX86Test,AMD_K15_BULLDOZER_ZAMBEZI_ABM)624*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K15_BULLDOZER_ZAMBEZI_ABM) {
625*eca53ba6SRoland Levillain cpu().SetLeaves({
626*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
627*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00600F12, 0x00080800, 0x1E98220B, 0x178BFBFF}},
628*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
629*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
630*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00600F12, 0x10000000, 0x01C9BFFF, 0x2FD3FBFF}},
631*eca53ba6SRoland Levillain });
632*eca53ba6SRoland Levillain const auto info = GetX86Info();
633*eca53ba6SRoland Levillain
634*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
635*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x15);
636*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x01);
637*eca53ba6SRoland Levillain
638*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
639*eca53ba6SRoland Levillain X86Microarchitecture::AMD_BULLDOZER);
640*eca53ba6SRoland Levillain
641*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.lzcnt);
642*eca53ba6SRoland Levillain }
643*eca53ba6SRoland Levillain
644*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0700F01_K16_Kabini_CPUID.txt
TEST_F(CpuidX86Test,AMD_K16_JAGUAR_KABINI)645*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K16_JAGUAR_KABINI) {
646*eca53ba6SRoland Levillain cpu().SetLeaves({
647*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
648*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00700F01, 0x00040800, 0x3ED8220B, 0x178BFBFF}},
649*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}},
650*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
651*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00700F01, 0x00000000, 0x154037FF, 0x2FD3FBFF}},
652*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x352D3441, 0x20303030, 0x20555041}},
653*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x68746977, 0x64615220, 0x286E6F65, 0x20294D54}},
654*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x47204448, 0x68706172, 0x20736369, 0x00202020}},
655*eca53ba6SRoland Levillain });
656*eca53ba6SRoland Levillain const auto info = GetX86Info();
657*eca53ba6SRoland Levillain
658*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
659*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x16);
660*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x00);
661*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
662*eca53ba6SRoland Levillain "AMD A4-5000 APU with Radeon(TM) HD Graphics ");
663*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_JAGUAR);
664*eca53ba6SRoland Levillain }
665*eca53ba6SRoland Levillain
666*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0730F01_K16_Beema_CPUID2.txt
TEST_F(CpuidX86Test,AMD_K16_PUMA_BEEMA)667*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K16_PUMA_BEEMA) {
668*eca53ba6SRoland Levillain cpu().SetLeaves({
669*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
670*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00730F01, 0x00040800, 0x7ED8220B, 0x178BFBFF}},
671*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}},
672*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
673*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00730F01, 0x00000000, 0x1D4037FF, 0x2FD3FBFF}},
674*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x362D3641, 0x20303133, 0x20555041}},
675*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x68746977, 0x444D4120, 0x64615220, 0x206E6F65}},
676*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x47203452, 0x68706172, 0x20736369, 0x00202020}},
677*eca53ba6SRoland Levillain });
678*eca53ba6SRoland Levillain const auto info = GetX86Info();
679*eca53ba6SRoland Levillain
680*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
681*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x16);
682*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x30);
683*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
684*eca53ba6SRoland Levillain "AMD A6-6310 APU with AMD Radeon R4 Graphics ");
685*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_PUMA);
686*eca53ba6SRoland Levillain }
687*eca53ba6SRoland Levillain
688*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/AuthenticAMD/AuthenticAMD0720F61_K16_Cato_CPUID.txt
TEST_F(CpuidX86Test,AMD_K16_CATO)689*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K16_CATO) {
690*eca53ba6SRoland Levillain cpu().SetLeaves({
691*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
692*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00720F61, 0x00080800, 0x3ED8220B, 0x178BFBFF}},
693*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000008, 0x00000000, 0x00000000}},
694*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001E, 0x68747541, 0x444D4163, 0x69746E65}},
695*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00720F61, 0x00000000, 0x154837FF, 0x2FD3FBFF}},
696*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x392D3941, 0x20303238, 0x636F7250}},
697*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x6F737365, 0x00000072, 0x00000000, 0x00000000}},
698*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
699*eca53ba6SRoland Levillain });
700*eca53ba6SRoland Levillain const auto info = GetX86Info();
701*eca53ba6SRoland Levillain
702*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
703*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x16);
704*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x26);
705*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
706*eca53ba6SRoland Levillain "AMD A9-9820 Processor");
707*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_JAGUAR);
708*eca53ba6SRoland Levillain }
709*eca53ba6SRoland Levillain
710*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0820F01_K17_Dali_CPUID.txt
TEST_F(CpuidX86Test,AMD_K17_ZEN_DALI)711*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K17_ZEN_DALI) {
712*eca53ba6SRoland Levillain cpu().SetLeaves({
713*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
714*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00820F01, 0x00020800, 0x7ED8320B, 0x178BFBFF}},
715*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x209C01A9, 0x00000000, 0x00000000}},
716*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001F, 0x68747541, 0x444D4163, 0x69746E65}},
717*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00820F01, 0x00000000, 0x35C233FF, 0x2FD3FBFF}},
718*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x30323033, 0x69772065, 0x52206874}},
719*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x6F656461, 0x7247206E, 0x69687061, 0x20207363}},
720*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}},
721*eca53ba6SRoland Levillain });
722*eca53ba6SRoland Levillain const auto info = GetX86Info();
723*eca53ba6SRoland Levillain
724*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
725*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x17);
726*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x20);
727*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
728*eca53ba6SRoland Levillain "AMD 3020e with Radeon Graphics ");
729*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN);
730*eca53ba6SRoland Levillain }
731*eca53ba6SRoland Levillain
732*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0800F82_K17_ZenP_CPUID.txt
TEST_F(CpuidX86Test,AMD_K17_ZEN_PLUS_PINNACLE_RIDGE)733*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K17_ZEN_PLUS_PINNACLE_RIDGE) {
734*eca53ba6SRoland Levillain cpu().SetLeaves({
735*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x68747541, 0x444D4163, 0x69746E65}},
736*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00800F82, 0x00100800, 0x7ED8320B, 0x178BFBFF}},
737*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x209C01A9, 0x00000000, 0x00000000}},
738*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001F, 0x68747541, 0x444D4163, 0x69746E65}},
739*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00800F82, 0x20000000, 0x35C233FF, 0x2FD3FBFF}},
740*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2037206E, 0x30303732}},
741*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x69452058, 0x2D746867, 0x65726F43, 0x6F725020}},
742*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x73736563, 0x2020726F, 0x20202020, 0x00202020}},
743*eca53ba6SRoland Levillain });
744*eca53ba6SRoland Levillain const auto info = GetX86Info();
745*eca53ba6SRoland Levillain
746*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
747*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x17);
748*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x08);
749*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
750*eca53ba6SRoland Levillain "AMD Ryzen 7 2700X Eight-Core Processor ");
751*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN_PLUS);
752*eca53ba6SRoland Levillain }
753*eca53ba6SRoland Levillain
754*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0840F70_K17_CPUID.txt
TEST_F(CpuidX86Test,AMD_K17_ZEN2_XBOX_SERIES_X)755*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K17_ZEN2_XBOX_SERIES_X) {
756*eca53ba6SRoland Levillain cpu().SetLeaves({
757*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
758*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00840F70, 0x00100800, 0x7ED8320B, 0x178BFBFF}},
759*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x219C91A9, 0x00400004, 0x00000000}},
760*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000020, 0x68747541, 0x444D4163, 0x69746E65}},
761*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00840F70, 0x00000000, 0xF5C2B7FF, 0x2FD3FBFF}},
762*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x30303734, 0x2D382053, 0x65726F43}},
763*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x6F725020, 0x73736563, 0x4420726F, 0x746B7365}},
764*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x4B20706F, 0x00007469, 0x00000000, 0x00000000}},
765*eca53ba6SRoland Levillain });
766*eca53ba6SRoland Levillain const auto info = GetX86Info();
767*eca53ba6SRoland Levillain
768*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
769*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x17);
770*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x47);
771*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string, "AMD 4700S 8-Core Processor Desktop Kit");
772*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN2);
773*eca53ba6SRoland Levillain }
774*eca53ba6SRoland Levillain
775*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0880F40_K17_CPUID.txt
TEST_F(CpuidX86Test,AMD_K17_ZEN2_4800S)776*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K17_ZEN2_4800S) {
777*eca53ba6SRoland Levillain cpu().SetLeaves({
778*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
779*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00880F40, 0x00100800, 0x7ED8320B, 0x178BFBFF}},
780*eca53ba6SRoland Levillain });
781*eca53ba6SRoland Levillain const auto info = GetX86Info();
782*eca53ba6SRoland Levillain
783*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
784*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x17);
785*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x84);
786*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN2);
787*eca53ba6SRoland Levillain }
788*eca53ba6SRoland Levillain
789*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F02_Hygon_CPUID3.txt
TEST_F(CpuidX86Test,AMD_K18_ZEN_DHYANA)790*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA) {
791*eca53ba6SRoland Levillain cpu().SetLeaves({
792*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}},
793*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00900F02, 0x00100800, 0x74D83209, 0x178BFBFF}},
794*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x009C01A9, 0x0040068C, 0x00000000}},
795*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}},
796*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00900F02, 0x60000000, 0x35C233FF, 0x2FD3FBFF}},
797*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x6F677948, 0x3843206E, 0x31332036, 0x20203538}},
798*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x6F632D38, 0x50206572, 0x65636F72, 0x726F7373}},
799*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}},
800*eca53ba6SRoland Levillain });
801*eca53ba6SRoland Levillain const auto info = GetX86Info();
802*eca53ba6SRoland Levillain
803*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_HYGON_GENUINE);
804*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x18);
805*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x00);
806*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
807*eca53ba6SRoland Levillain "Hygon C86 3185 8-core Processor ");
808*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN);
809*eca53ba6SRoland Levillain }
810*eca53ba6SRoland Levillain
811*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F02_Hygon_CPUID.txt
TEST_F(CpuidX86Test,AMD_K18_ZEN_DHYANA_CACHE_INFO)812*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA_CACHE_INFO) {
813*eca53ba6SRoland Levillain cpu().SetLeaves({
814*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}},
815*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00900F02, 0x00100800, 0x74D83209, 0x178BFBFF}},
816*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}},
817*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00900F02, 0x60000000, 0x35C233FF, 0x2FD3FBFF}},
818*eca53ba6SRoland Levillain {{0x8000001D, 0}, Leaf{0x00004121, 0x01C0003F, 0x0000003F, 0x00000000}},
819*eca53ba6SRoland Levillain {{0x8000001D, 1}, Leaf{0x00004122, 0x00C0003F, 0x000000FF, 0x00000000}},
820*eca53ba6SRoland Levillain {{0x8000001D, 2}, Leaf{0x00004143, 0x01C0003F, 0x000003FF, 0x00000002}},
821*eca53ba6SRoland Levillain {{0x8000001D, 3}, Leaf{0x0001C163, 0x03C0003F, 0x00001FFF, 0x00000001}},
822*eca53ba6SRoland Levillain });
823*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
824*eca53ba6SRoland Levillain
825*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
826*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
827*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
828*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 32 * KiB);
829*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 8);
830*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
831*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].tlb_entries, 64);
832*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].partitioning, 1);
833*eca53ba6SRoland Levillain
834*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
835*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
836*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
837*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 64 * KiB);
838*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 4);
839*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
840*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].tlb_entries, 256);
841*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].partitioning, 1);
842*eca53ba6SRoland Levillain
843*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
844*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
845*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 512 * KiB);
846*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 8);
847*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
848*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].tlb_entries, 1024);
849*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].partitioning, 1);
850*eca53ba6SRoland Levillain
851*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
852*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
853*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 8 * MiB);
854*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 16);
855*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
856*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].tlb_entries, 8192);
857*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].partitioning, 1);
858*eca53ba6SRoland Levillain }
859*eca53ba6SRoland Levillain
860*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A20F10_K19_Vermeer2_CPUID.txt
TEST_F(CpuidX86Test,AMD_K19_ZEN3_VERMEER)861*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K19_ZEN3_VERMEER) {
862*eca53ba6SRoland Levillain cpu().SetLeaves({
863*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
864*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00A20F10, 0x01180800, 0x7ED8320B, 0x178BFBFF}},
865*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x219C97A9, 0x0040068C, 0x00000000}},
866*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000023, 0x68747541, 0x444D4163, 0x69746E65}},
867*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00A20F10, 0x20000000, 0x75C237FF, 0x2FD3FBFF}},
868*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2039206E, 0x30303935}},
869*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x32312058, 0x726F432D, 0x72502065, 0x7365636F}},
870*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20726F73, 0x20202020, 0x20202020, 0x00202020}},
871*eca53ba6SRoland Levillain });
872*eca53ba6SRoland Levillain const auto info = GetX86Info();
873*eca53ba6SRoland Levillain
874*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
875*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x19);
876*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x21);
877*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
878*eca53ba6SRoland Levillain "AMD Ryzen 9 5900X 12-Core Processor ");
879*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN3);
880*eca53ba6SRoland Levillain }
881*eca53ba6SRoland Levillain
882*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A40F41_K19_Rembrandt_03_CPUID.txt
TEST_F(CpuidX86Test,AMD_K19_ZEN3)883*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K19_ZEN3) {
884*eca53ba6SRoland Levillain cpu().SetLeaves({
885*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
886*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00A40F41, 0x00100800, 0x7EF8320B, 0x178BFBFF}},
887*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000023, 0x68747541, 0x444D4163, 0x69746E65}},
888*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00A40F41, 0x50000000, 0x75C237FF, 0x2FD3FBFF}},
889*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2039206E, 0x30303936}},
890*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x77205848, 0x20687469, 0x65646152, 0x47206E6F}},
891*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x68706172, 0x20736369, 0x20202020, 0x00202020}},
892*eca53ba6SRoland Levillain });
893*eca53ba6SRoland Levillain const auto info = GetX86Info();
894*eca53ba6SRoland Levillain
895*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
896*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x19);
897*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x44);
898*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
899*eca53ba6SRoland Levillain "AMD Ryzen 9 6900HX with Radeon Graphics ");
900*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN3);
901*eca53ba6SRoland Levillain }
902*eca53ba6SRoland Levillain
903*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A60F12_K19_Raphael_01_CPUID.txt
TEST_F(CpuidX86Test,AMD_K19_ZEN4_RAPHAEL)904*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K19_ZEN4_RAPHAEL) {
905*eca53ba6SRoland Levillain cpu().SetLeaves({
906*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
907*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00A60F12, 0x000C0800, 0x7EF8320B, 0x178BFBFF}},
908*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000028, 0x68747541, 0x444D4163, 0x69746E65}},
909*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00A60F12, 0x00000000, 0x75C237FF, 0x2FD3FBFF}},
910*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20444D41, 0x657A7952, 0x2035206E, 0x30303637}},
911*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x2D362058, 0x65726F43, 0x6F725020, 0x73736563}},
912*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x2020726F, 0x20202020, 0x20202020, 0x00202020}},
913*eca53ba6SRoland Levillain {{0x80000021, 0}, Leaf{0x00062FCF, 0x0000015C, 0x00000000, 0x00000000}},
914*eca53ba6SRoland Levillain });
915*eca53ba6SRoland Levillain const auto info = GetX86Info();
916*eca53ba6SRoland Levillain
917*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
918*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x19);
919*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x61);
920*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
921*eca53ba6SRoland Levillain "AMD Ryzen 5 7600X 6-Core Processor ");
922*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.uai);
923*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN4);
924*eca53ba6SRoland Levillain }
925*eca53ba6SRoland Levillain
926*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A70F41_K19_Phoenix_03_CPUID.txt
TEST_F(CpuidX86Test,AMD_K19_ZEN4_PHOENIX)927*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K19_ZEN4_PHOENIX) {
928*eca53ba6SRoland Levillain cpu().SetLeaves({
929*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
930*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00A70F41, 0x00100800, 0x7EF8320B, 0x178BFBFF}},
931*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000028, 0x68747541, 0x444D4163, 0x69746E65}},
932*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00A70F41, 0x50000000, 0x75C237FF, 0x2FD3FBFF}},
933*eca53ba6SRoland Levillain });
934*eca53ba6SRoland Levillain const auto info = GetX86Info();
935*eca53ba6SRoland Levillain
936*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
937*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x19);
938*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x74);
939*eca53ba6SRoland Levillain }
940*eca53ba6SRoland Levillain
941*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/HygonGenuine/HygonGenuine0900F11_Hygon_01_CPUID.txt
TEST_F(CpuidX86Test,AMD_K18_ZEN_DHYANA_OCTAL_CORE_C86_3250)942*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K18_ZEN_DHYANA_OCTAL_CORE_C86_3250) {
943*eca53ba6SRoland Levillain cpu().SetLeaves({
944*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x6F677948, 0x656E6975, 0x6E65476E}},
945*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00900F11, 0x00100800, 0x76D8320B, 0x178BFBFF}},
946*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001F, 0x6F677948, 0x656E6975, 0x6E65476E}},
947*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00900F11, 0x60000000, 0x35C233FF, 0x2FD3FBFF}},
948*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x6F677948, 0x3843206E, 0x32332036, 0x20203035}},
949*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x6F632D38, 0x50206572, 0x65636F72, 0x726F7373}},
950*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x20202020, 0x20202020, 0x20202020, 0x00202020}},
951*eca53ba6SRoland Levillain });
952*eca53ba6SRoland Levillain const auto info = GetX86Info();
953*eca53ba6SRoland Levillain
954*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x01);
955*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x18);
956*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_HYGON_GENUINE);
957*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
958*eca53ba6SRoland Levillain "Hygon C86 3250 8-core Processor ");
959*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN);
960*eca53ba6SRoland Levillain }
961*eca53ba6SRoland Levillain
962*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD08A0F00_K17_Mendocino_01_CPUID.txt
TEST_F(CpuidX86Test,AMD_ZEN2_MENDOCINO)963*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_ZEN2_MENDOCINO) {
964*eca53ba6SRoland Levillain cpu().SetLeaves({
965*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
966*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x008A0F00, 0x00080800, 0x7EF8320B, 0x178BFBFF}},
967*eca53ba6SRoland Levillain });
968*eca53ba6SRoland Levillain const auto info = GetX86Info();
969*eca53ba6SRoland Levillain
970*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xA0);
971*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x17);
972*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
973*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN2);
974*eca53ba6SRoland Levillain }
975*eca53ba6SRoland Levillain
976*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0A10F11_K19_Genoa_02_CPUID.txt
TEST_F(CpuidX86Test,AMD_K19_ZEN4_GENOA)977*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_K19_ZEN4_GENOA) {
978*eca53ba6SRoland Levillain cpu().SetLeaves({
979*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000010, 0x68747541, 0x444D4163, 0x69746E65}},
980*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00A10F11, 0x00200800, 0x7EFA320B, 0x178BFBFF}},
981*eca53ba6SRoland Levillain });
982*eca53ba6SRoland Levillain const auto info = GetX86Info();
983*eca53ba6SRoland Levillain
984*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x11);
985*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x19);
986*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_AUTHENTIC_AMD);
987*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::AMD_ZEN4);
988*eca53ba6SRoland Levillain }
989*eca53ba6SRoland Levillain
990*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00906A4_AlderLakeP_00_CPUID.txt
TEST_F(CpuidX86Test,INTEL_ALDER_LAKE_AVX_VNNI)991*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_AVX_VNNI) {
992*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
993*eca53ba6SRoland Levillain cpu().SetLeaves({
994*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
995*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000906A4, 0x00400800, 0x7FFAFBBF, 0xBFEBFBFF}},
996*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000001, 0x239CA7EB, 0x984007AC, 0xFC18C410}},
997*eca53ba6SRoland Levillain {{0x00000007, 1}, Leaf{0x00400810, 0x00000000, 0x00000000, 0x00000000}},
998*eca53ba6SRoland Levillain });
999*eca53ba6SRoland Levillain const auto info = GetX86Info();
1000*eca53ba6SRoland Levillain
1001*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1002*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1003*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x9A);
1004*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx_vnni);
1005*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL);
1006*eca53ba6SRoland Levillain }
1007*eca53ba6SRoland Levillain
1008*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0090672_AlderLake_BC_AVX512_CPUID01.txt
TEST_F(CpuidX86Test,INTEL_ALDER_LAKE_AVX512)1009*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_AVX512) {
1010*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
1011*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_MACOS)
1012*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.avx512f");
1013*eca53ba6SRoland Levillain #endif
1014*eca53ba6SRoland Levillain cpu().SetLeaves({
1015*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1016*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000906A4, 0x00400800, 0x7FFAFBBF, 0xBFEBFBFF}},
1017*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000001, 0xF3BFA7EB, 0x98C07FEE, 0xFC9CC510}},
1018*eca53ba6SRoland Levillain {{0x00000007, 1}, Leaf{0x00401C30, 0x00000000, 0x00000000, 0x00000000}},
1019*eca53ba6SRoland Levillain });
1020*eca53ba6SRoland Levillain
1021*eca53ba6SRoland Levillain const auto info = GetX86Info();
1022*eca53ba6SRoland Levillain
1023*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1024*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1025*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x9A);
1026*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512f);
1027*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512bw);
1028*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512dq);
1029*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512cd);
1030*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vl);
1031*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512_vp2intersect);
1032*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vbmi);
1033*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vbmi2);
1034*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512bitalg);
1035*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vpopcntdq);
1036*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512ifma);
1037*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512_bf16);
1038*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512_fp16);
1039*eca53ba6SRoland Levillain
1040*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL);
1041*eca53ba6SRoland Levillain }
1042*eca53ba6SRoland Levillain
1043*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00806C1_TigerLake_CPUID3.txt
TEST_F(CpuidX86Test,INTEL_TIGER_LAKE_AVX512)1044*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_TIGER_LAKE_AVX512) {
1045*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(true);
1046*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_MACOS)
1047*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.avx512f");
1048*eca53ba6SRoland Levillain #endif
1049*eca53ba6SRoland Levillain cpu().SetLeaves({
1050*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1051*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000806C1, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
1052*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0xF3BFA7EB, 0x18C05FCE, 0xFC100510}},
1053*eca53ba6SRoland Levillain });
1054*eca53ba6SRoland Levillain
1055*eca53ba6SRoland Levillain const auto info = GetX86Info();
1056*eca53ba6SRoland Levillain
1057*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1058*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1059*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x8C);
1060*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512f);
1061*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512bw);
1062*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512dq);
1063*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512cd);
1064*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vl);
1065*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512_vp2intersect);
1066*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vbmi);
1067*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vbmi2);
1068*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512bitalg);
1069*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512vpopcntdq);
1070*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.avx512ifma);
1071*eca53ba6SRoland Levillain
1072*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_TGL);
1073*eca53ba6SRoland Levillain }
1074*eca53ba6SRoland Levillain
1075*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00706E5_IceLakeY_CPUID.txt
TEST_F(CpuidX86Test,INTEL_ICE_LAKE_GFNI)1076*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ICE_LAKE_GFNI) {
1077*eca53ba6SRoland Levillain cpu().SetLeaves({
1078*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1079*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000706E5, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
1080*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0xF2BF27EF, 0x40405F4E, 0xBC000410}},
1081*eca53ba6SRoland Levillain });
1082*eca53ba6SRoland Levillain
1083*eca53ba6SRoland Levillain const auto info = GetX86Info();
1084*eca53ba6SRoland Levillain
1085*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1086*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1087*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x7E);
1088*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.gfni);
1089*eca53ba6SRoland Levillain
1090*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ICL);
1091*eca53ba6SRoland Levillain }
1092*eca53ba6SRoland Levillain
1093*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00906C0_JasperLake_CPUID01.txt
TEST_F(CpuidX86Test,INTEL_TREMONT_JASPER_LAKE_MOVDR)1094*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_TREMONT_JASPER_LAKE_MOVDR) {
1095*eca53ba6SRoland Levillain cpu().SetLeaves({
1096*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1097*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00090661, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}},
1098*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x2394A2C3, 0x18400124, 0xFC000400}},
1099*eca53ba6SRoland Levillain });
1100*eca53ba6SRoland Levillain
1101*eca53ba6SRoland Levillain const auto info = GetX86Info();
1102*eca53ba6SRoland Levillain
1103*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1104*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1105*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x96);
1106*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.movdiri);
1107*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.movdir64b);
1108*eca53ba6SRoland Levillain
1109*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT);
1110*eca53ba6SRoland Levillain }
1111*eca53ba6SRoland Levillain
1112*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel0090672_AlderLake_LC_BC_CPUID01.txt
TEST_F(CpuidX86Test,INTEL_ALDER_LAKE_REP)1113*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_REP) {
1114*eca53ba6SRoland Levillain cpu().SetLeaves({
1115*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1116*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00090672, 0x00800800, 0x7FFAFBFF, 0xBFEBFBFF}},
1117*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000001, 0x239CA7EB, 0x98C027AC, 0xFC1CC410}},
1118*eca53ba6SRoland Levillain {{0x00000007, 1}, Leaf{0x00400810, 0x00000000, 0x00000000, 0x00000000}},
1119*eca53ba6SRoland Levillain });
1120*eca53ba6SRoland Levillain
1121*eca53ba6SRoland Levillain const auto info = GetX86Info();
1122*eca53ba6SRoland Levillain
1123*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1124*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1125*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x97);
1126*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.erms);
1127*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.fs_rep_mov);
1128*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.fz_rep_movsb);
1129*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.fs_rep_stosb);
1130*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.fs_rep_cmpsb_scasb);
1131*eca53ba6SRoland Levillain
1132*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL);
1133*eca53ba6SRoland Levillain }
1134*eca53ba6SRoland Levillain
1135*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0100FA0_K10_Thuban_CPUID.txt
TEST_F(CpuidX86Test,AMD_THUBAN_CACHE_INFO)1136*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_THUBAN_CACHE_INFO) {
1137*eca53ba6SRoland Levillain cpu().SetLeaves({
1138*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000006, 0x68747541, 0x444D4163, 0x69746E65}},
1139*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001B, 0x68747541, 0x444D4163, 0x69746E65}},
1140*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00100FA0, 0x10000050, 0x000037FF, 0xEFD3FBFF}},
1141*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0xFF30FF10, 0xFF30FF20, 0x40020140, 0x40020140}},
1142*eca53ba6SRoland Levillain {{0x80000006, 0}, Leaf{0x20800000, 0x42004200, 0x02008140, 0x0030B140}},
1143*eca53ba6SRoland Levillain });
1144*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
1145*eca53ba6SRoland Levillain
1146*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
1147*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
1148*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
1149*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 64 * KiB);
1150*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 2);
1151*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
1152*eca53ba6SRoland Levillain
1153*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
1154*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
1155*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
1156*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 64 * KiB);
1157*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 2);
1158*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
1159*eca53ba6SRoland Levillain
1160*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
1161*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
1162*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 512 * KiB);
1163*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 16);
1164*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
1165*eca53ba6SRoland Levillain
1166*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
1167*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
1168*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 6 * MiB);
1169*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 48);
1170*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
1171*eca53ba6SRoland Levillain }
1172*eca53ba6SRoland Levillain
1173*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0020FB1_K8_Manchester_CPUID.txt
TEST_F(CpuidX86Test,AMD_MANCHESTER_CACHE_INFO)1174*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_MANCHESTER_CACHE_INFO) {
1175*eca53ba6SRoland Levillain cpu().SetLeaves({
1176*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000001, 0x68747541, 0x444D4163, 0x69746E65}},
1177*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000018, 0x68747541, 0x444D4163, 0x69746E65}},
1178*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00020FB1, 0x00000150, 0x00000003, 0xE3D3FBFF}},
1179*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0xFF08FF08, 0xFF20FF20, 0x40020140, 0x40020140}},
1180*eca53ba6SRoland Levillain {{0x80000006, 0}, Leaf{0x00000000, 0x42004200, 0x02008140, 0x00000000}},
1181*eca53ba6SRoland Levillain });
1182*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
1183*eca53ba6SRoland Levillain
1184*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 3);
1185*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
1186*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
1187*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 64 * KiB);
1188*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 2);
1189*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
1190*eca53ba6SRoland Levillain
1191*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
1192*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
1193*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
1194*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 64 * KiB);
1195*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 2);
1196*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
1197*eca53ba6SRoland Levillain
1198*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
1199*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
1200*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 512 * KiB);
1201*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 16);
1202*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
1203*eca53ba6SRoland Levillain }
1204*eca53ba6SRoland Levillain
1205*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/AuthenticAMD/AuthenticAMD0100F22_K10_Agena_CPUID.txt
TEST_F(CpuidX86Test,AMD_AGENA_CACHE_INFO)1206*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, AMD_AGENA_CACHE_INFO) {
1207*eca53ba6SRoland Levillain cpu().SetLeaves({
1208*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000005, 0x68747541, 0x444D4163, 0x69746E65}},
1209*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x8000001A, 0x68747541, 0x444D4163, 0x69746E65}},
1210*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00100F22, 0x10000000, 0x000007FF, 0xEFD3FBFF}},
1211*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0xFF30FF10, 0xFF30FF20, 0x40020140, 0x40020140}},
1212*eca53ba6SRoland Levillain {{0x80000006, 0}, Leaf{0x20800000, 0x42004200, 0x02008140, 0x0010A140}},
1213*eca53ba6SRoland Levillain });
1214*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
1215*eca53ba6SRoland Levillain
1216*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 4);
1217*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, 1);
1218*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
1219*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 64 * KiB);
1220*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, 2);
1221*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, 64);
1222*eca53ba6SRoland Levillain
1223*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, 1);
1224*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type,
1225*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
1226*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 64 * KiB);
1227*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, 2);
1228*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, 64);
1229*eca53ba6SRoland Levillain
1230*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 2);
1231*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
1232*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 512 * KiB);
1233*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 16);
1234*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
1235*eca53ba6SRoland Levillain
1236*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 3);
1237*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type, CacheType::CPU_FEATURE_CACHE_UNIFIED);
1238*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 2 * MiB);
1239*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 32);
1240*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, 64);
1241*eca53ba6SRoland Levillain }
1242*eca53ba6SRoland Levillain
1243*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00106A1_Nehalem_CPUID.txt
TEST_F(CpuidX86Test,Nehalem)1244*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, Nehalem) {
1245*eca53ba6SRoland Levillain // Pre AVX cpus don't have xsave
1246*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(false);
1247*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
1248*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE);
1249*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE);
1250*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE);
1251*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE);
1252*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE);
1253*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE);
1254*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_MACOS)
1255*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse");
1256*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse2");
1257*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse3");
1258*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.supplementalsse3");
1259*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse4_1");
1260*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse4_2");
1261*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_FREEBSD)
1262*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1263*eca53ba6SRoland Levillain fs.CreateFile("/var/run/dmesg.boot", R"(
1264*eca53ba6SRoland Levillain ---<<BOOT>>---
1265*eca53ba6SRoland Levillain Copyright (c) 1992-2020 The FreeBSD Project.
1266*eca53ba6SRoland Levillain FreeBSD is a registered trademark of The FreeBSD Foundation.
1267*eca53ba6SRoland Levillain Features=0x1783fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE,SSE2,HTT>
1268*eca53ba6SRoland Levillain Features2=0x5eda2203<SSE3,PCLMULQDQ,SSSE3,CX16,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,AESNI,XSAVE,OSXSAVE,RDRAND>
1269*eca53ba6SRoland Levillain real memory = 2147418112 (2047 MB)
1270*eca53ba6SRoland Levillain )");
1271*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID)
1272*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1273*eca53ba6SRoland Levillain fs.CreateFile("/proc/cpuinfo", R"(processor :
1274*eca53ba6SRoland Levillain flags : fpu mmx sse sse2 pni ssse3 sse4_1 sse4_2
1275*eca53ba6SRoland Levillain )");
1276*eca53ba6SRoland Levillain #endif
1277*eca53ba6SRoland Levillain cpu().SetLeaves({
1278*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1279*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000106A2, 0x00100800, 0x00BCE3BD, 0xBFEBFBFF}},
1280*eca53ba6SRoland Levillain {{0x00000002, 0}, Leaf{0x55035A01, 0x00F0B0E3, 0x00000000, 0x09CA212C}},
1281*eca53ba6SRoland Levillain {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1282*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C004121, 0x01C0003F, 0x0000003F, 0x00000000}},
1283*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C004122, 0x00C0003F, 0x0000007F, 0x00000000}},
1284*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C004143, 0x01C0003F, 0x000001FF, 0x00000000}},
1285*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C03C163, 0x03C0003F, 0x00000FFF, 0x00000002}},
1286*eca53ba6SRoland Levillain {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x00021120}},
1287*eca53ba6SRoland Levillain {{0x00000006, 0}, Leaf{0x00000001, 0x00000002, 0x00000001, 0x00000000}},
1288*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1289*eca53ba6SRoland Levillain {{0x00000008, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1290*eca53ba6SRoland Levillain {{0x00000009, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1291*eca53ba6SRoland Levillain {{0x0000000A, 0}, Leaf{0x07300403, 0x00000000, 0x00000000, 0x00000603}},
1292*eca53ba6SRoland Levillain {{0x0000000B, 0}, Leaf{0x00000001, 0x00000001, 0x00000100, 0x00000000}},
1293*eca53ba6SRoland Levillain {{0x0000000B, 0}, Leaf{0x00000004, 0x00000002, 0x00000201, 0x00000000}},
1294*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
1295*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000001, 0x28100000}},
1296*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x756E6547, 0x20656E69, 0x65746E49, 0x2952286C}},
1297*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x55504320, 0x20202020, 0x20202020, 0x40202020}},
1298*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x30303020, 0x20402030, 0x37382E31, 0x007A4847}},
1299*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1300*eca53ba6SRoland Levillain {{0x80000006, 0}, Leaf{0x00000000, 0x00000000, 0x01006040, 0x00000000}},
1301*eca53ba6SRoland Levillain {{0x80000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000100}},
1302*eca53ba6SRoland Levillain {{0x80000008, 0}, Leaf{0x00003028, 0x00000000, 0x00000000, 0x00000000}},
1303*eca53ba6SRoland Levillain });
1304*eca53ba6SRoland Levillain const auto info = GetX86Info();
1305*eca53ba6SRoland Levillain
1306*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1307*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1308*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x1A);
1309*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x02);
1310*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
1311*eca53ba6SRoland Levillain "Genuine Intel(R) CPU @ 0000 @ 1.87GHz");
1312*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_NHM);
1313*eca53ba6SRoland Levillain
1314*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse);
1315*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse2);
1316*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse3);
1317*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.ssse3);
1318*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_1);
1319*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_2);
1320*eca53ba6SRoland Levillain }
1321*eca53ba6SRoland Levillain
1322*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0030673_Silvermont3_CPUID.txt
TEST_F(CpuidX86Test,Atom)1323*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, Atom) {
1324*eca53ba6SRoland Levillain // Pre AVX cpus don't have xsave
1325*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(false);
1326*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
1327*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE);
1328*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE);
1329*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE);
1330*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE);
1331*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE);
1332*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE);
1333*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_MACOS)
1334*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse");
1335*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse2");
1336*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse3");
1337*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.supplementalsse3");
1338*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse4_1");
1339*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse4_2");
1340*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_FREEBSD)
1341*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1342*eca53ba6SRoland Levillain fs.CreateFile("/var/run/dmesg.boot", R"(
1343*eca53ba6SRoland Levillain ---<<BOOT>>---
1344*eca53ba6SRoland Levillain Copyright (c) 1992-2020 The FreeBSD Project.
1345*eca53ba6SRoland Levillain FreeBSD is a registered trademark of The FreeBSD Foundation.
1346*eca53ba6SRoland Levillain Features=0x1783fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE,SSE2,HTT>
1347*eca53ba6SRoland Levillain Features2=0x5eda2203<SSE3,PCLMULQDQ,SSSE3,CX16,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,AESNI,XSAVE,OSXSAVE,RDRAND>
1348*eca53ba6SRoland Levillain real memory = 2147418112 (2047 MB)
1349*eca53ba6SRoland Levillain )");
1350*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID)
1351*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1352*eca53ba6SRoland Levillain fs.CreateFile("/proc/cpuinfo", R"(
1353*eca53ba6SRoland Levillain flags : fpu mmx sse sse2 pni ssse3 sse4_1 sse4_2
1354*eca53ba6SRoland Levillain )");
1355*eca53ba6SRoland Levillain #endif
1356*eca53ba6SRoland Levillain cpu().SetLeaves({
1357*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1358*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00030673, 0x00100800, 0x41D8E3BF, 0xBFEBFBFF}},
1359*eca53ba6SRoland Levillain {{0x00000002, 0}, Leaf{0x61B3A001, 0x0000FFC2, 0x00000000, 0x00000000}},
1360*eca53ba6SRoland Levillain {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1361*eca53ba6SRoland Levillain {{0x00000004, 0}, Leaf{0x1C000121, 0x0140003F, 0x0000003F, 0x00000001}},
1362*eca53ba6SRoland Levillain {{0x00000004, 1}, Leaf{0x1C000122, 0x01C0003F, 0x0000003F, 0x00000001}},
1363*eca53ba6SRoland Levillain {{0x00000004, 2}, Leaf{0x1C00C143, 0x03C0003F, 0x000003FF, 0x00000001}},
1364*eca53ba6SRoland Levillain {{0x00000005, 0}, Leaf{0x00000040, 0x00000040, 0x00000003, 0x33000020}},
1365*eca53ba6SRoland Levillain {{0x00000006, 0}, Leaf{0x00000005, 0x00000002, 0x00000009, 0x00000000}},
1366*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x00002282, 0x00000000, 0x00000000}},
1367*eca53ba6SRoland Levillain {{0x00000008, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1368*eca53ba6SRoland Levillain {{0x00000009, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1369*eca53ba6SRoland Levillain {{0x0000000A, 0}, Leaf{0x07280203, 0x00000000, 0x00000000, 0x00004503}},
1370*eca53ba6SRoland Levillain {{0x0000000B, 0}, Leaf{0x00000001, 0x00000001, 0x00000100, 0x00000000}},
1371*eca53ba6SRoland Levillain {{0x0000000B, 1}, Leaf{0x00000004, 0x00000004, 0x00000201, 0x00000000}},
1372*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
1373*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000101, 0x28100000}},
1374*eca53ba6SRoland Levillain {{0x80000002, 0}, Leaf{0x20202020, 0x6E492020, 0x286C6574, 0x43202952}},
1375*eca53ba6SRoland Levillain {{0x80000003, 0}, Leaf{0x72656C65, 0x52286E6F, 0x50432029, 0x4A202055}},
1376*eca53ba6SRoland Levillain {{0x80000004, 0}, Leaf{0x30303931, 0x20402020, 0x39392E31, 0x007A4847}},
1377*eca53ba6SRoland Levillain {{0x80000005, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000000}},
1378*eca53ba6SRoland Levillain {{0x80000006, 0}, Leaf{0x00000000, 0x00000000, 0x04008040, 0x00000000}},
1379*eca53ba6SRoland Levillain {{0x80000007, 0}, Leaf{0x00000000, 0x00000000, 0x00000000, 0x00000100}},
1380*eca53ba6SRoland Levillain {{0x80000008, 0}, Leaf{0x00003024, 0x00000000, 0x00000000, 0x00000000}},
1381*eca53ba6SRoland Levillain });
1382*eca53ba6SRoland Levillain const auto info = GetX86Info();
1383*eca53ba6SRoland Levillain
1384*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1385*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1386*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x37);
1387*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x03);
1388*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string,
1389*eca53ba6SRoland Levillain " Intel(R) Celeron(R) CPU J1900 @ 1.99GHz");
1390*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
1391*eca53ba6SRoland Levillain X86Microarchitecture::INTEL_ATOM_SMT);
1392*eca53ba6SRoland Levillain
1393*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse);
1394*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse2);
1395*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse3);
1396*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.ssse3);
1397*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_1);
1398*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_2);
1399*eca53ba6SRoland Levillain }
1400*eca53ba6SRoland Levillain
1401*eca53ba6SRoland Levillain // https://www.felixcloutier.com/x86/cpuid#example-3-1--example-of-cache-and-tlb-interpretation
TEST_F(CpuidX86Test,P4_CacheInfo)1402*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, P4_CacheInfo) {
1403*eca53ba6SRoland Levillain cpu().SetLeaves({
1404*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000002, 0x756E6547, 0x6C65746E, 0x49656E69}},
1405*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00000F0A, 0x00010808, 0x00000000, 0x3FEBFBFF}},
1406*eca53ba6SRoland Levillain {{0x00000002, 0}, Leaf{0x665B5001, 0x00000000, 0x00000000, 0x007A7000}},
1407*eca53ba6SRoland Levillain });
1408*eca53ba6SRoland Levillain
1409*eca53ba6SRoland Levillain const auto info = GetX86CacheInfo();
1410*eca53ba6SRoland Levillain EXPECT_EQ(info.size, 5);
1411*eca53ba6SRoland Levillain
1412*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].level, UNDEF);
1413*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_type, CacheType::CPU_FEATURE_CACHE_TLB);
1414*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].cache_size, 4 * KiB);
1415*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].ways, UNDEF);
1416*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].line_size, UNDEF);
1417*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].tlb_entries, 64);
1418*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[0].partitioning, 0);
1419*eca53ba6SRoland Levillain
1420*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].level, UNDEF);
1421*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_type, CacheType::CPU_FEATURE_CACHE_TLB);
1422*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].cache_size, 4 * KiB);
1423*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].ways, UNDEF);
1424*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].line_size, UNDEF);
1425*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].tlb_entries, 64);
1426*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[1].partitioning, 0);
1427*eca53ba6SRoland Levillain
1428*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].level, 1);
1429*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
1430*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].cache_size, 8 * KiB);
1431*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].ways, 4);
1432*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].line_size, 64);
1433*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].tlb_entries, UNDEF);
1434*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[2].partitioning, 0);
1435*eca53ba6SRoland Levillain
1436*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].level, 1);
1437*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_type,
1438*eca53ba6SRoland Levillain CacheType::CPU_FEATURE_CACHE_INSTRUCTION);
1439*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].cache_size, 12 * KiB);
1440*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].ways, 8);
1441*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].line_size, UNDEF);
1442*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].tlb_entries, UNDEF);
1443*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[3].partitioning, 0);
1444*eca53ba6SRoland Levillain
1445*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].level, 2);
1446*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].cache_type, CacheType::CPU_FEATURE_CACHE_DATA);
1447*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].cache_size, 256 * KiB);
1448*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].ways, 8);
1449*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].line_size, 64);
1450*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].tlb_entries, UNDEF);
1451*eca53ba6SRoland Levillain EXPECT_EQ(info.levels[4].partitioning, 2);
1452*eca53ba6SRoland Levillain }
1453*eca53ba6SRoland Levillain
1454*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000673_P3_KatmaiDP_CPUID.txt
TEST_F(CpuidX86Test,P3)1455*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, P3) {
1456*eca53ba6SRoland Levillain // Pre AVX cpus don't have xsave
1457*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(false);
1458*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
1459*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE);
1460*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_MACOS)
1461*eca53ba6SRoland Levillain cpu().SetDarwinSysCtlByName("hw.optional.sse");
1462*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_FREEBSD)
1463*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1464*eca53ba6SRoland Levillain fs.CreateFile("/var/run/dmesg.boot", R"(
1465*eca53ba6SRoland Levillain ---<<BOOT>>---
1466*eca53ba6SRoland Levillain Copyright (c) 1992-2020 The FreeBSD Project.
1467*eca53ba6SRoland Levillain FreeBSD is a registered trademark of The FreeBSD Foundation.
1468*eca53ba6SRoland Levillain Features=0x1783fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,MMX,FXSR,SSE>
1469*eca53ba6SRoland Levillain real memory = 2147418112 (2047 MB)
1470*eca53ba6SRoland Levillain )");
1471*eca53ba6SRoland Levillain #elif defined(CPU_FEATURES_OS_LINUX) || defined(CPU_FEATURES_OS_ANDROID)
1472*eca53ba6SRoland Levillain auto& fs = GetEmptyFilesystem();
1473*eca53ba6SRoland Levillain fs.CreateFile("/proc/cpuinfo", R"(
1474*eca53ba6SRoland Levillain flags : fpu mmx sse
1475*eca53ba6SRoland Levillain )");
1476*eca53ba6SRoland Levillain #endif
1477*eca53ba6SRoland Levillain cpu().SetLeaves({
1478*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000003, 0x756E6547, 0x6C65746E, 0x49656E69}},
1479*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00000673, 0x00000000, 0x00000000, 0x0387FBFF}},
1480*eca53ba6SRoland Levillain {{0x00000002, 0}, Leaf{0x03020101, 0x00000000, 0x00000000, 0x0C040843}},
1481*eca53ba6SRoland Levillain {{0x00000003, 0}, Leaf{0x00000000, 0x00000000, 0x4CECC782, 0x00006778}},
1482*eca53ba6SRoland Levillain });
1483*eca53ba6SRoland Levillain const auto info = GetX86Info();
1484*eca53ba6SRoland Levillain
1485*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1486*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1487*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x07);
1488*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x03);
1489*eca53ba6SRoland Levillain EXPECT_STREQ(info.brand_string, "");
1490*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::X86_UNKNOWN);
1491*eca53ba6SRoland Levillain
1492*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.mmx);
1493*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse);
1494*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.sse2);
1495*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.sse3);
1496*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.ssse3);
1497*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.sse4_1);
1498*eca53ba6SRoland Levillain EXPECT_FALSE(info.features.sse4_2);
1499*eca53ba6SRoland Levillain }
1500*eca53ba6SRoland Levillain
1501*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000480_486_CPUID.txt
TEST_F(CpuidX86Test,INTEL_80486)1502*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_80486) {
1503*eca53ba6SRoland Levillain cpu().SetLeaves({
1504*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000001, 0x756E6547, 0x6C65746E, 0x49656E69}},
1505*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00000480, 0x00000000, 0x00000000, 0x00000003}},
1506*eca53ba6SRoland Levillain });
1507*eca53ba6SRoland Levillain const auto info = GetX86Info();
1508*eca53ba6SRoland Levillain
1509*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1510*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x04);
1511*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x08);
1512*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_80486);
1513*eca53ba6SRoland Levillain }
1514*eca53ba6SRoland Levillain
1515*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000526_P54C_CPUID.txt
TEST_F(CpuidX86Test,INTEL_P54C)1516*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_P54C) {
1517*eca53ba6SRoland Levillain cpu().SetLeaves({
1518*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000001, 0x756E6547, 0x6C65746E, 0x49656E69}},
1519*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00000525, 0x00000000, 0x00000000, 0x000001BF}},
1520*eca53ba6SRoland Levillain });
1521*eca53ba6SRoland Levillain const auto info = GetX86Info();
1522*eca53ba6SRoland Levillain
1523*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1524*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x05);
1525*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x02);
1526*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_P5);
1527*eca53ba6SRoland Levillain }
1528*eca53ba6SRoland Levillain
1529*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0000590_Lakemont_CPUID2.txt
TEST_F(CpuidX86Test,INTEL_LAKEMONT)1530*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_LAKEMONT) {
1531*eca53ba6SRoland Levillain cpu().SetLeaves({
1532*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000002, 0x756E6547, 0x6c65746E, 0x49656E69}},
1533*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00000590, 0x00000000, 0x00010200, 0x8000237B}},
1534*eca53ba6SRoland Levillain });
1535*eca53ba6SRoland Levillain const auto info = GetX86Info();
1536*eca53ba6SRoland Levillain
1537*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1538*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x05);
1539*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x09);
1540*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
1541*eca53ba6SRoland Levillain X86Microarchitecture::INTEL_LAKEMONT);
1542*eca53ba6SRoland Levillain }
1543*eca53ba6SRoland Levillain
1544*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00006E8_PM_Yonah_CPUID.txt
TEST_F(CpuidX86Test,INTEL_CORE_YONAH)1545*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_CORE_YONAH) {
1546*eca53ba6SRoland Levillain cpu().SetLeaves({
1547*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000A, 0x756E6547, 0x6C65746E, 0x49656E69}},
1548*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000006E8, 0x00010800, 0x0000C109, 0xAFE9FBFF}},
1549*eca53ba6SRoland Levillain });
1550*eca53ba6SRoland Levillain const auto info = GetX86Info();
1551*eca53ba6SRoland Levillain
1552*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1553*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1554*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x0E);
1555*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CORE);
1556*eca53ba6SRoland Levillain }
1557*eca53ba6SRoland Levillain
1558*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00706A8_GoldmontPlus_CPUID.txt
TEST_F(CpuidX86Test,INTEL_GOLDMONT_PLUS)1559*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_GOLDMONT_PLUS) {
1560*eca53ba6SRoland Levillain cpu().SetLeaves({
1561*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000018, 0x756E6547, 0x6c65746E, 0x49656E69}},
1562*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000706A8, 0x00400800, 0x4FF8EBBF, 0xBFEBFBFF}},
1563*eca53ba6SRoland Levillain });
1564*eca53ba6SRoland Levillain const auto info = GetX86Info();
1565*eca53ba6SRoland Levillain
1566*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1567*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1568*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x7A);
1569*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
1570*eca53ba6SRoland Levillain X86Microarchitecture::INTEL_ATOM_GMT_PLUS);
1571*eca53ba6SRoland Levillain }
1572*eca53ba6SRoland Levillain
1573*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0050670_KnightsLanding_CPUID.txt
TEST_F(CpuidX86Test,INTEL_KNIGHTS_LANDING)1574*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_KNIGHTS_LANDING) {
1575*eca53ba6SRoland Levillain cpu().SetLeaves({
1576*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000D, 0x756E6547, 0x6C65746E, 0x49656E69}},
1577*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00050670, 0x02FF0800, 0x7FF8F3BF, 0xBFEBFBFF}},
1578*eca53ba6SRoland Levillain });
1579*eca53ba6SRoland Levillain const auto info = GetX86Info();
1580*eca53ba6SRoland Levillain
1581*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1582*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1583*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x57);
1584*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info),
1585*eca53ba6SRoland Levillain X86Microarchitecture::INTEL_KNIGHTS_L);
1586*eca53ba6SRoland Levillain }
1587*eca53ba6SRoland Levillain
1588*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00806EC_CometLake_CPUID2.txt
TEST_F(CpuidX86Test,INTEL_CML_U)1589*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_CML_U) {
1590*eca53ba6SRoland Levillain cpu().SetLeaves({
1591*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
1592*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000806EC, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
1593*eca53ba6SRoland Levillain });
1594*eca53ba6SRoland Levillain const auto info = GetX86Info();
1595*eca53ba6SRoland Levillain
1596*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1597*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1598*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x8E);
1599*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x0C);
1600*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML);
1601*eca53ba6SRoland Levillain }
1602*eca53ba6SRoland Levillain
1603*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00A0652_CometLake_CPUID1.txt
TEST_F(CpuidX86Test,INTEL_CML_H)1604*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_CML_H) {
1605*eca53ba6SRoland Levillain cpu().SetLeaves({
1606*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
1607*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000A0652, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
1608*eca53ba6SRoland Levillain });
1609*eca53ba6SRoland Levillain const auto info = GetX86Info();
1610*eca53ba6SRoland Levillain
1611*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1612*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1613*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xA5);
1614*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML);
1615*eca53ba6SRoland Levillain }
1616*eca53ba6SRoland Levillain
1617*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00A0660_CometLake_CPUID1.txt
TEST_F(CpuidX86Test,INTEL_CML_U2)1618*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_CML_U2) {
1619*eca53ba6SRoland Levillain cpu().SetLeaves({
1620*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000016, 0x756E6547, 0x6C65746E, 0x49656E69}},
1621*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000A0660, 0x00100800, 0x7FFAFBBF, 0xBFEBFBFF}},
1622*eca53ba6SRoland Levillain });
1623*eca53ba6SRoland Levillain const auto info = GetX86Info();
1624*eca53ba6SRoland Levillain
1625*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1626*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1627*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xA6);
1628*eca53ba6SRoland Levillain EXPECT_EQ(info.stepping, 0x00);
1629*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_CML);
1630*eca53ba6SRoland Levillain }
1631*eca53ba6SRoland Levillain
1632*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00806A1_Lakefield_CPUID.txt
TEST_F(CpuidX86Test,INTEL_ATOM_TMT_LAKEFIELD)1633*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ATOM_TMT_LAKEFIELD) {
1634*eca53ba6SRoland Levillain cpu().SetLeaves({
1635*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1636*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000806A1, 0x00100800, 0x4FD8EBBF, 0xBFEBFBFF}},
1637*eca53ba6SRoland Levillain });
1638*eca53ba6SRoland Levillain const auto info = GetX86Info();
1639*eca53ba6SRoland Levillain
1640*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1641*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1642*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x8A);
1643*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT);
1644*eca53ba6SRoland Levillain }
1645*eca53ba6SRoland Levillain
1646*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel0090661_ElkhartLake_CPUID01.txt
TEST_F(CpuidX86Test,INTEL_ATOM_TMT_ELKHART_LAKE)1647*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ATOM_TMT_ELKHART_LAKE) {
1648*eca53ba6SRoland Levillain cpu().SetLeaves({
1649*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1650*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x00090661, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}},
1651*eca53ba6SRoland Levillain });
1652*eca53ba6SRoland Levillain const auto info = GetX86Info();
1653*eca53ba6SRoland Levillain
1654*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1655*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1656*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x96);
1657*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT);
1658*eca53ba6SRoland Levillain }
1659*eca53ba6SRoland Levillain
1660*eca53ba6SRoland Levillain // https://github.com/InstLatx64/InstLatx64/blob/master/GenuineIntel/GenuineIntel00906C0_JasperLake_01_CPUID.txt
TEST_F(CpuidX86Test,INTEL_ATOM_TMT_JASPER_LAKE)1661*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ATOM_TMT_JASPER_LAKE) {
1662*eca53ba6SRoland Levillain cpu().SetLeaves({
1663*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000001B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1664*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000906C0, 0x00800800, 0x4FF8EBBF, 0xBFEBFBFF}},
1665*eca53ba6SRoland Levillain });
1666*eca53ba6SRoland Levillain const auto info = GetX86Info();
1667*eca53ba6SRoland Levillain
1668*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1669*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1670*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x9C);
1671*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ATOM_TMT);
1672*eca53ba6SRoland Levillain }
1673*eca53ba6SRoland Levillain
1674*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B0671_RaptorLake_02_CPUID.txt
TEST_F(CpuidX86Test,INTEL_RAPTOR_LAKE)1675*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE) {
1676*eca53ba6SRoland Levillain cpu().SetLeaves({
1677*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1678*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000B0671, 0x00800800, 0x7FFAFBBF, 0xBFEBFBFF}},
1679*eca53ba6SRoland Levillain });
1680*eca53ba6SRoland Levillain const auto info = GetX86Info();
1681*eca53ba6SRoland Levillain
1682*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1683*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1684*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xB7);
1685*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL);
1686*eca53ba6SRoland Levillain }
1687*eca53ba6SRoland Levillain
1688*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00306F2_HaswellEP2_CPUID.txt
TEST_F(CpuidX86Test,INTEL_HASWELL_LZCNT)1689*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_HASWELL_LZCNT) {
1690*eca53ba6SRoland Levillain cpu().SetLeaves({
1691*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000F, 0x756E6547, 0x6C65746E, 0x49656E69}},
1692*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000306F2, 0x00200800, 0x7FFEFBFF, 0xBFEBFBFF}},
1693*eca53ba6SRoland Levillain {{0x00000007, 0}, Leaf{0x00000000, 0x000037AB, 0x00000000, 0x00000000}},
1694*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
1695*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000021, 0x2C100000}},
1696*eca53ba6SRoland Levillain });
1697*eca53ba6SRoland Levillain const auto info = GetX86Info();
1698*eca53ba6SRoland Levillain
1699*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1700*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1701*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x3F);
1702*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_HSW);
1703*eca53ba6SRoland Levillain
1704*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.lzcnt);
1705*eca53ba6SRoland Levillain }
1706*eca53ba6SRoland Levillain
1707*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B06A2_RaptorLakeP_03_CPUID.txt
TEST_F(CpuidX86Test,INTEL_RAPTOR_LAKE_P)1708*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE_P) {
1709*eca53ba6SRoland Levillain cpu().SetLeaves({
1710*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1711*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000B06A3, 0x00400800, 0x7FFAFBFF, 0xBFEBFBFF}},
1712*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
1713*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}},
1714*eca53ba6SRoland Levillain });
1715*eca53ba6SRoland Levillain const auto info = GetX86Info();
1716*eca53ba6SRoland Levillain
1717*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1718*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1719*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xBA);
1720*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL);
1721*eca53ba6SRoland Levillain }
1722*eca53ba6SRoland Levillain
1723*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B06F2_RaptorLakeS_02_CPUID.txt
TEST_F(CpuidX86Test,INTEL_RAPTOR_LAKE_S)1724*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_RAPTOR_LAKE_S) {
1725*eca53ba6SRoland Levillain cpu().SetLeaves({
1726*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1727*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000B06F2, 0x00800800, 0x7FFAFBFF, 0xBFEBFBFF}},
1728*eca53ba6SRoland Levillain {{0x80000000, 0}, Leaf{0x80000008, 0x00000000, 0x00000000, 0x00000000}},
1729*eca53ba6SRoland Levillain {{0x80000001, 0}, Leaf{0x00000000, 0x00000000, 0x00000121, 0x2C100000}},
1730*eca53ba6SRoland Levillain });
1731*eca53ba6SRoland Levillain const auto info = GetX86Info();
1732*eca53ba6SRoland Levillain
1733*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1734*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1735*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xBF);
1736*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_RPL);
1737*eca53ba6SRoland Levillain }
1738*eca53ba6SRoland Levillain
1739*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00B06E0_AlderLakeN_03_CPUID.txt
TEST_F(CpuidX86Test,INTEL_ALDER_LAKE_N)1740*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, INTEL_ALDER_LAKE_N) {
1741*eca53ba6SRoland Levillain cpu().SetLeaves({
1742*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x00000020, 0x756E6547, 0x6C65746E, 0x49656E69}},
1743*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000B06E0, 0x00800800, 0x7FFAFBBF, 0xBFEBFBFF}},
1744*eca53ba6SRoland Levillain });
1745*eca53ba6SRoland Levillain const auto info = GetX86Info();
1746*eca53ba6SRoland Levillain
1747*eca53ba6SRoland Levillain EXPECT_STREQ(info.vendor, CPU_FEATURES_VENDOR_GENUINE_INTEL);
1748*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1749*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0xBE);
1750*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_ADL);
1751*eca53ba6SRoland Levillain }
1752*eca53ba6SRoland Levillain
1753*eca53ba6SRoland Levillain // https://github.com/google/cpu_features/issues/200
1754*eca53ba6SRoland Levillain // http://users.atw.hu/instlatx64/GenuineIntel/GenuineIntel00206F2_Eagleton_CPUID.txt
1755*eca53ba6SRoland Levillain #if defined(CPU_FEATURES_OS_WINDOWS)
TEST_F(CpuidX86Test,WIN_INTEL_WESTMERE_EX)1756*eca53ba6SRoland Levillain TEST_F(CpuidX86Test, WIN_INTEL_WESTMERE_EX) {
1757*eca53ba6SRoland Levillain // Pre AVX cpus don't have xsave
1758*eca53ba6SRoland Levillain cpu().SetOsBackupsExtendedRegisters(false);
1759*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI_INSTRUCTIONS_AVAILABLE);
1760*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE);
1761*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE3_INSTRUCTIONS_AVAILABLE);
1762*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSSE3_INSTRUCTIONS_AVAILABLE);
1763*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_1_INSTRUCTIONS_AVAILABLE);
1764*eca53ba6SRoland Levillain cpu().SetWindowsIsProcessorFeaturePresent(PF_SSE4_2_INSTRUCTIONS_AVAILABLE);
1765*eca53ba6SRoland Levillain
1766*eca53ba6SRoland Levillain cpu().SetLeaves({
1767*eca53ba6SRoland Levillain {{0x00000000, 0}, Leaf{0x0000000B, 0x756E6547, 0x6C65746E, 0x49656E69}},
1768*eca53ba6SRoland Levillain {{0x00000001, 0}, Leaf{0x000206F2, 0x00400800, 0x02BEE3FF, 0xBFEBFBFF}},
1769*eca53ba6SRoland Levillain });
1770*eca53ba6SRoland Levillain const auto info = GetX86Info();
1771*eca53ba6SRoland Levillain
1772*eca53ba6SRoland Levillain EXPECT_EQ(info.family, 0x06);
1773*eca53ba6SRoland Levillain EXPECT_EQ(info.model, 0x2F);
1774*eca53ba6SRoland Levillain EXPECT_EQ(GetX86Microarchitecture(&info), X86Microarchitecture::INTEL_WSM);
1775*eca53ba6SRoland Levillain
1776*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse);
1777*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse2);
1778*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse3);
1779*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.ssse3);
1780*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_1);
1781*eca53ba6SRoland Levillain EXPECT_TRUE(info.features.sse4_2);
1782*eca53ba6SRoland Levillain }
1783*eca53ba6SRoland Levillain #endif // CPU_FEATURES_OS_WINDOWS
1784*eca53ba6SRoland Levillain
1785*eca53ba6SRoland Levillain // TODO(user): test what happens when xsave/osxsave are not present.
1786*eca53ba6SRoland Levillain // TODO(user): test what happens when xmm/ymm/zmm os support are not
1787*eca53ba6SRoland Levillain // present.
1788*eca53ba6SRoland Levillain
1789*eca53ba6SRoland Levillain } // namespace
1790*eca53ba6SRoland Levillain } // namespace cpu_features
1791