7#include "architecture.hpp"
10#if TT_COMPILER == TT_CC_MSVC
12#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
15#error "Unsuported compiler for x64 cpu_id"
20#if TT_COMPILER == TT_CC_MSVC
24 __cpuid(info.data(),
static_cast<int>(cpu_id_leaf));
27 r[0] =
static_cast<uint32_t
>info[0];
28 r[1] =
static_cast<uint32_t
>info[1];
29 r[2] =
static_cast<uint32_t
>info[2];
30 r[3] =
static_cast<uint32_t
>info[3];
34#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
38 __cpuid(cpu_id_leaf, r[0], r[1], r[2], r[3]);
43#error "Unsuported compiler for x64 cpu_id"
50bool cpu_id_leaf1_ecx() {
51 constexpr uint32_t mask = 1 << Bit;
52 return (cpu_id_leaf1[2] & mask) != 0;
56bool cpu_id_leaf1_edx() {
57 constexpr uint32_t mask = 1 << Bit;
58 return (cpu_id_leaf1[3] & mask) != 0;
62bool cpu_id_leaf7_ebx() {
63 constexpr uint32_t mask = 1 << Bit;
64 return (cpu_id_leaf7[1] & mask) != 0;
68bool cpu_id_leaf7_ecx() {
69 constexpr uint32_t mask = 1 << Bit;
70 return (cpu_id_leaf7[2] & mask) != 0;
74bool cpu_id_leaf7_edx() {
75 constexpr uint32_t mask = 1 << Bit;
76 return (cpu_id_leaf7[3] & mask) != 0;
80bool cpu_has_fpu() {
return cpu_id_leaf1_edx<0>(); }
81bool cpu_has_vme() {
return cpu_id_leaf1_edx<1>(); }
82bool cpu_has_de() {
return cpu_id_leaf1_edx<2>(); }
83bool cpu_has_pse() {
return cpu_id_leaf1_edx<3>(); }
84bool cpu_has_tsc() {
return cpu_id_leaf1_edx<4>(); }
85bool cpu_has_msr() {
return cpu_id_leaf1_edx<5>(); }
86bool cpu_has_pae() {
return cpu_id_leaf1_edx<6>(); }
87bool cpu_has_mce() {
return cpu_id_leaf1_edx<7>(); }
88bool cpu_has_cx8() {
return cpu_id_leaf1_edx<8>(); }
89bool cpu_has_apic() {
return cpu_id_leaf1_edx<9>(); }
91bool cpu_has_sep() {
return cpu_id_leaf1_edx<11>(); }
92bool cpu_has_mtrr() {
return cpu_id_leaf1_edx<12>(); }
93bool cpu_has_pge() {
return cpu_id_leaf1_edx<13>(); }
94bool cpu_has_mca() {
return cpu_id_leaf1_edx<14>(); }
95bool cpu_has_cmov() {
return cpu_id_leaf1_edx<15>(); }
96bool cpu_has_pat() {
return cpu_id_leaf1_edx<16>(); }
97bool cpu_has_pse_36() {
return cpu_id_leaf1_edx<17>(); }
98bool cpu_has_psn() {
return cpu_id_leaf1_edx<18>(); }
99bool cpu_has_clfsh() {
return cpu_id_leaf1_edx<19>(); }
101bool cpu_has_ds() {
return cpu_id_leaf1_edx<21>(); }
102bool cpu_has_acpi() {
return cpu_id_leaf1_edx<22>(); }
103bool cpu_has_mmx() {
return cpu_id_leaf1_edx<23>(); }
104bool cpu_has_fxsr() {
return cpu_id_leaf1_edx<24>(); }
105bool cpu_has_sse() {
return cpu_id_leaf1_edx<25>(); }
106bool cpu_has_sse2() {
return cpu_id_leaf1_edx<26>(); }
107bool cpu_has_ss() {
return cpu_id_leaf1_edx<27>(); }
108bool cpu_has_htt() {
return cpu_id_leaf1_edx<28>(); }
109bool cpu_has_tm() {
return cpu_id_leaf1_edx<29>(); }
110bool cpu_has_ia64() {
return cpu_id_leaf1_edx<30>(); }
111bool cpu_has_pbe() {
return cpu_id_leaf1_edx<31>(); }
114bool cpu_has_sse3() {
return cpu_id_leaf1_ecx<0>(); }
115bool cpu_has_pclmulqdq() {
return cpu_id_leaf1_ecx<1>(); }
116bool cpu_has_dtes64() {
return cpu_id_leaf1_ecx<2>(); }
117bool cpu_has_monitor() {
return cpu_id_leaf1_ecx<3>(); }
118bool cpu_has_ds_cpl() {
return cpu_id_leaf1_ecx<4>(); }
119bool cpu_has_vmx() {
return cpu_id_leaf1_ecx<5>(); }
120bool cpu_has_smx() {
return cpu_id_leaf1_ecx<6>(); }
121bool cpu_has_est() {
return cpu_id_leaf1_ecx<7>(); }
122bool cpu_has_tm2() {
return cpu_id_leaf1_ecx<8>(); }
123bool cpu_has_ssse3() {
return cpu_id_leaf1_ecx<9>(); }
124bool cpu_has_cnxt_id() {
return cpu_id_leaf1_ecx<10>(); }
125bool cpu_has_sdbg() {
return cpu_id_leaf1_ecx<11>(); }
126bool cpu_has_fma() {
return cpu_id_leaf1_ecx<12>(); }
127bool cpu_has_cx16() {
return cpu_id_leaf1_ecx<13>(); }
128bool cpu_has_xtpr() {
return cpu_id_leaf1_ecx<14>(); }
129bool cpu_has_pdcm() {
return cpu_id_leaf1_ecx<15>(); }
131bool cpu_has_pcid() {
return cpu_id_leaf1_ecx<17>(); }
132bool cpu_has_dca() {
return cpu_id_leaf1_ecx<18>(); }
133bool cpu_has_sse4_1() {
return cpu_id_leaf1_ecx<19>(); }
134bool cpu_has_sse4_2() {
return cpu_id_leaf1_ecx<20>(); }
135bool cpu_has_x2apic() {
return cpu_id_leaf1_ecx<21>(); }
136bool cpu_has_movbe() {
return cpu_id_leaf1_ecx<22>(); }
137bool cpu_has_popcnt() {
return cpu_id_leaf1_ecx<23>(); }
138bool cpu_has_tsc_deadline() {
return cpu_id_leaf1_ecx<24>(); }
139bool cpu_has_aes() {
return cpu_id_leaf1_ecx<25>(); }
140bool cpu_has_xsave() {
return cpu_id_leaf1_ecx<26>(); }
141bool cpu_has_osxsave() {
return cpu_id_leaf1_ecx<27>(); }
142bool cpu_has_avx() {
return cpu_id_leaf1_ecx<28>(); }
143bool cpu_has_f16c() {
return cpu_id_leaf1_ecx<29>(); }
144bool cpu_has_rdrnd() {
return cpu_id_leaf1_ecx<30>(); }
145bool cpu_has_hypervisor() {
return cpu_id_leaf1_ecx<31>(); }
151bool cpu_stepping() {
return cpu_id_leaf1[0] & 0xf; }
153 uint32_t family_id = (cpu_id_leaf1[0] >> 8) & 0xf;
154 uint32_t model_id = (cpu_id_leaf1[0] >> 4) & 0xf;
155 if (family_id == 6 || family_id == 15) {
156 uint32_t extended_model_id = (cpu_id_leaf1[0] >> 16) & 0xf;
157 return (extended_model_id << 4) | model_id;
162bool cpu_family_id() {
163 uint32_t family_id = (cpu_id_leaf1[0] >> 8) & 0xf;
164 if (family_id == 15) {
165 uint32_t extended_family_id = (cpu_id_leaf1[0] >> 20) & 0xff;
166 return family_id + extended_family_id;
168 return extended_family_id;
173bool cpu_has_fsgsbase() {
return cpu_id_leaf7_ebx<0>(); }
174bool cpu_has_tsc_adjust() {
return cpu_id_leaf7_ebx<1>(); }
175bool cpu_has_sgx() {
return cpu_id_leaf7_ebx<2>(); }
176bool cpu_has_bmi1() {
return cpu_id_leaf7_ebx<3>(); }
177bool cpu_has_hle() {
return cpu_id_leaf7_ebx<4>(); }
178bool cpu_has_avx2() {
return cpu_id_leaf7_ebx<5>(); }
180bool cpu_has_smep() {
return cpu_id_leaf7_ebx<7>(); }
181bool cpu_has_bmi2() {
return cpu_id_leaf7_ebx<8>(); }
182bool cpu_has_erms() {
return cpu_id_leaf7_ebx<9>(); }
183bool cpu_has_invpcid() {
return cpu_id_leaf7_ebx<10>(); }
184bool cpu_has_rtm() {
return cpu_id_leaf7_ebx<11>(); }
185bool cpu_has_pqm() {
return cpu_id_leaf7_ebx<12>(); }
186bool cpu_has_deprecated_fpu_cs_ds() {
return cpu_id_leaf7_ebx<13>(); }
187bool cpu_has_mpx() {
return cpu_id_leaf7_ebx<14>(); }
188bool cpu_has_pqe() {
return cpu_id_leaf7_ebx<15>(); }
189bool cpu_has_avx512_f() {
return cpu_id_leaf7_ebx<16>(); }
190bool cpu_has_avx512_dq() {
return cpu_id_leaf7_ebx<17>(); }
191bool cpu_has_rdseed() {
return cpu_id_leaf7_ebx<18>(); }
192bool cpu_has_adx() {
return cpu_id_leaf7_ebx<19>(); }
193bool cpu_has_smap() {
return cpu_id_leaf7_ebx<20>(); }
194bool cpu_has_avx512_ifma() {
return cpu_id_leaf7_ebx<21>(); }
195bool cpu_has_pcommit() {
return cpu_id_leaf7_ebx<22>(); }
196bool cpu_has_clflushopt() {
return cpu_id_leaf7_ebx<23>(); }
197bool cpu_has_clwb() {
return cpu_id_leaf7_ebx<24>(); }
198bool cpu_has_intelpt() {
return cpu_id_leaf7_ebx<25>(); }
199bool cpu_has_avx512_pf() {
return cpu_id_leaf7_ebx<26>(); }
200bool cpu_has_avx512_er() {
return cpu_id_leaf7_ebx<27>(); }
201bool cpu_has_avx512_cd() {
return cpu_id_leaf7_ebx<28>(); }
202bool cpu_has_sha() {
return cpu_id_leaf7_ebx<29>(); }
203bool cpu_has_avx512_bw() {
return cpu_id_leaf7_ebx<30>(); }
204bool cpu_has_avx512_vl() {
return cpu_id_leaf7_ebx<31>(); }
210bool cpu_has_prefetchwt1() {
return cpu_id_leaf7_ecx<0>(); }
211bool cpu_has_avx512_vbmi() {
return cpu_id_leaf7_ecx<1>(); }
212bool cpu_has_umip() {
return cpu_id_leaf7_ecx<2>(); }
213bool cpu_has_pku() {
return cpu_id_leaf7_ecx<3>(); }
214bool cpu_has_ospke() {
return cpu_id_leaf7_ecx<4>(); }
215bool cpu_has_waitpkg() {
return cpu_id_leaf7_ecx<5>(); }
216bool cpu_has_avx512_vmbi2() {
return cpu_id_leaf7_ecx<6>(); }
217bool cpu_has_shstk() {
return cpu_id_leaf7_ecx<7>(); }
218bool cpu_has_gfni() {
return cpu_id_leaf7_ecx<8>(); }
219bool cpu_has_vaes() {
return cpu_id_leaf7_ecx<9>(); }
220bool cpu_has_vpclmulqdq() {
return cpu_id_leaf7_ecx<10>(); }
221bool cpu_has_avx512_vnni() {
return cpu_id_leaf7_ecx<11>(); }
222bool cpu_has_avx512_bitalg() {
return cpu_id_leaf7_ecx<12>(); }
224bool cpu_has_avx512_vpopcntdq() {
return cpu_id_leaf7_ecx<14>(); }
226bool cpu_has_5level_paging() {
return cpu_id_leaf7_ecx<16>(); }
227int cpu_has_mawau() { }
228bool cpu_has_rdpid() {
return cpu_id_leaf7_ecx<22>(); }
231bool cpu_has_cldemote() {
return cpu_id_leaf7_ecx<25>(); }
233bool cpu_has_movdir() {
return cpu_id_leaf7_ecx<27>(); }
234bool cpu_has_movdir64b() {
return cpu_id_leaf7_ecx<28>(); }
236bool cpu_has_sgx_lc() {
return cpu_id_leaf7_ecx<30>(); }
242bool cpu_has_avx512_4vnniw() {
return cpu_id_leaf7_edx<2>(); }
243bool cpu_has_avx512_4fmaps() {
return cpu_id_leaf7_edx<3>(); }
244bool cpu_has_fsrm() {
return cpu_id_leaf7_edx<4>(); }
245bool cpu_has_pconfig() {
return cpu_id_leaf7_edx<18>(); }
247bool cpu_has_ibt() {
return cpu_id_leaf7_edx<20>(); }
249bool cpu_has_spec_ctrl() {
return cpu_id_leaf7_edx<26>(); }
250bool cpu_has_stibp() {
return cpu_id_leaf7_edx<27>(); }
252bool cpu_has_capabilities() {
return cpu_id_leaf7_edx<29>(); }
254bool cpu_has_ssbd() {
return cpu_id_leaf7_edx<31>(); }