2#include "TTauri/Foundation/cpu_id.hpp"
3#include "TTauri/Foundation/os_detect.hpp"
6#if TT_COMPILER == TT_CC_MSVC
8#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
11#error "Unsuported compiler for x64 cpu_id"
16#if TT_COMPILER == TT_CC_MSVC
20 __cpuid(info.
data(),
static_cast<int>(cpu_id_leaf));
23 r[0] =
static_cast<uint32_t
>info[0];
24 r[1] =
static_cast<uint32_t
>info[1];
25 r[2] =
static_cast<uint32_t
>info[2];
26 r[3] =
static_cast<uint32_t
>info[3];
30#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
34 __cpuid(cpu_id_leaf, r[0], r[1], r[2], r[3]);
39#error "Unsuported compiler for x64 cpu_id"
46tt_force_inline
bool cpu_id_leaf1_ecx() {
47 constexpr uint32_t mask = 1 << Bit;
48 return (cpu_id_leaf1[2] & mask) != 0;
52tt_force_inline
bool cpu_id_leaf1_edx() {
53 constexpr uint32_t mask = 1 << Bit;
54 return (cpu_id_leaf1[3] & mask) != 0;
58tt_force_inline
bool cpu_id_leaf7_ebx() {
59 constexpr uint32_t mask = 1 << Bit;
60 return (cpu_id_leaf7[1] & mask) != 0;
64tt_force_inline
bool cpu_id_leaf7_ecx() {
65 constexpr uint32_t mask = 1 << Bit;
66 return (cpu_id_leaf7[2] & mask) != 0;
70tt_force_inline
bool cpu_id_leaf7_edx() {
71 constexpr uint32_t mask = 1 << Bit;
72 return (cpu_id_leaf7[3] & mask) != 0;
76tt_force_inline
bool cpu_has_fpu() {
return cpu_id_leaf1_edx<0>(); }
77tt_force_inline
bool cpu_has_vme() {
return cpu_id_leaf1_edx<1>(); }
78tt_force_inline
bool cpu_has_de() {
return cpu_id_leaf1_edx<2>(); }
79tt_force_inline
bool cpu_has_pse() {
return cpu_id_leaf1_edx<3>(); }
80tt_force_inline
bool cpu_has_tsc() {
return cpu_id_leaf1_edx<4>(); }
81tt_force_inline
bool cpu_has_msr() {
return cpu_id_leaf1_edx<5>(); }
82tt_force_inline
bool cpu_has_pae() {
return cpu_id_leaf1_edx<6>(); }
83tt_force_inline
bool cpu_has_mce() {
return cpu_id_leaf1_edx<7>(); }
84tt_force_inline
bool cpu_has_cx8() {
return cpu_id_leaf1_edx<8>(); }
85tt_force_inline
bool cpu_has_apic() {
return cpu_id_leaf1_edx<9>(); }
87tt_force_inline
bool cpu_has_sep() {
return cpu_id_leaf1_edx<11>(); }
88tt_force_inline
bool cpu_has_mtrr() {
return cpu_id_leaf1_edx<12>(); }
89tt_force_inline
bool cpu_has_pge() {
return cpu_id_leaf1_edx<13>(); }
90tt_force_inline
bool cpu_has_mca() {
return cpu_id_leaf1_edx<14>(); }
91tt_force_inline
bool cpu_has_cmov() {
return cpu_id_leaf1_edx<15>(); }
92tt_force_inline
bool cpu_has_pat() {
return cpu_id_leaf1_edx<16>(); }
93tt_force_inline
bool cpu_has_pse_36() {
return cpu_id_leaf1_edx<17>(); }
94tt_force_inline
bool cpu_has_psn() {
return cpu_id_leaf1_edx<18>(); }
95tt_force_inline
bool cpu_has_clfsh() {
return cpu_id_leaf1_edx<19>(); }
97tt_force_inline
bool cpu_has_ds() {
return cpu_id_leaf1_edx<21>(); }
98tt_force_inline
bool cpu_has_acpi() {
return cpu_id_leaf1_edx<22>(); }
99tt_force_inline
bool cpu_has_mmx() {
return cpu_id_leaf1_edx<23>(); }
100tt_force_inline
bool cpu_has_fxsr() {
return cpu_id_leaf1_edx<24>(); }
101tt_force_inline
bool cpu_has_sse() {
return cpu_id_leaf1_edx<25>(); }
102tt_force_inline
bool cpu_has_sse2() {
return cpu_id_leaf1_edx<26>(); }
103tt_force_inline
bool cpu_has_ss() {
return cpu_id_leaf1_edx<27>(); }
104tt_force_inline
bool cpu_has_htt() {
return cpu_id_leaf1_edx<28>(); }
105tt_force_inline
bool cpu_has_tm() {
return cpu_id_leaf1_edx<29>(); }
106tt_force_inline
bool cpu_has_ia64() {
return cpu_id_leaf1_edx<30>(); }
107tt_force_inline
bool cpu_has_pbe() {
return cpu_id_leaf1_edx<31>(); }
110tt_force_inline
bool cpu_has_sse3() {
return cpu_id_leaf1_ecx<0>(); }
111tt_force_inline
bool cpu_has_pclmulqdq() {
return cpu_id_leaf1_ecx<1>(); }
112tt_force_inline
bool cpu_has_dtes64() {
return cpu_id_leaf1_ecx<2>(); }
113tt_force_inline
bool cpu_has_monitor() {
return cpu_id_leaf1_ecx<3>(); }
114tt_force_inline
bool cpu_has_ds_cpl() {
return cpu_id_leaf1_ecx<4>(); }
115tt_force_inline
bool cpu_has_vmx() {
return cpu_id_leaf1_ecx<5>(); }
116tt_force_inline
bool cpu_has_smx() {
return cpu_id_leaf1_ecx<6>(); }
117tt_force_inline
bool cpu_has_est() {
return cpu_id_leaf1_ecx<7>(); }
118tt_force_inline
bool cpu_has_tm2() {
return cpu_id_leaf1_ecx<8>(); }
119tt_force_inline
bool cpu_has_ssse3() {
return cpu_id_leaf1_ecx<9>(); }
120tt_force_inline
bool cpu_has_cnxt_id() {
return cpu_id_leaf1_ecx<10>(); }
121tt_force_inline
bool cpu_has_sdbg() {
return cpu_id_leaf1_ecx<11>(); }
122tt_force_inline
bool cpu_has_fma() {
return cpu_id_leaf1_ecx<12>(); }
123tt_force_inline
bool cpu_has_cx16() {
return cpu_id_leaf1_ecx<13>(); }
124tt_force_inline
bool cpu_has_xtpr() {
return cpu_id_leaf1_ecx<14>(); }
125tt_force_inline
bool cpu_has_pdcm() {
return cpu_id_leaf1_ecx<15>(); }
127tt_force_inline
bool cpu_has_pcid() {
return cpu_id_leaf1_ecx<17>(); }
128tt_force_inline
bool cpu_has_dca() {
return cpu_id_leaf1_ecx<18>(); }
129tt_force_inline
bool cpu_has_sse4_1() {
return cpu_id_leaf1_ecx<19>(); }
130tt_force_inline
bool cpu_has_sse4_2() {
return cpu_id_leaf1_ecx<20>(); }
131tt_force_inline
bool cpu_has_x2apic() {
return cpu_id_leaf1_ecx<21>(); }
132tt_force_inline
bool cpu_has_movbe() {
return cpu_id_leaf1_ecx<22>(); }
133tt_force_inline
bool cpu_has_popcnt() {
return cpu_id_leaf1_ecx<23>(); }
134tt_force_inline
bool cpu_has_tsc_deadline() {
return cpu_id_leaf1_ecx<24>(); }
135tt_force_inline
bool cpu_has_aes() {
return cpu_id_leaf1_ecx<25>(); }
136tt_force_inline
bool cpu_has_xsave() {
return cpu_id_leaf1_ecx<26>(); }
137tt_force_inline
bool cpu_has_osxsave() {
return cpu_id_leaf1_ecx<27>(); }
138tt_force_inline
bool cpu_has_avx() {
return cpu_id_leaf1_ecx<28>(); }
139tt_force_inline
bool cpu_has_f16c() {
return cpu_id_leaf1_ecx<29>(); }
140tt_force_inline
bool cpu_has_rdrnd() {
return cpu_id_leaf1_ecx<30>(); }
141tt_force_inline
bool cpu_has_hypervisor() {
return cpu_id_leaf1_ecx<31>(); }
147tt_force_inline
bool cpu_stepping() {
return cpu_id_leaf1[0] & 0xf; }
148tt_force_inline
bool cpu_model_id() {
149 uint32_t family_id = (cpu_id_leaf1[0] >> 8) & 0xf;
150 uint32_t model_id = (cpu_id_leaf1[0] >> 4) & 0xf;
151 if (family_id == 6 || family_id == 15) {
152 uint32_t extended_model_id = (cpu_id_leaf1[0] >> 16) & 0xf;
153 return (extended_model_id << 4) | model_id;
158tt_force_inline
bool cpu_family_id() {
159 uint32_t family_id = (cpu_id_leaf1[0] >> 8) & 0xf;
160 if (family_id == 15) {
161 uint32_t extended_family_id = (cpu_id_leaf1[0] >> 20) & 0xff;
162 return family_id + extended_family_id;
164 return extended_family_id;
169tt_force_inline
bool cpu_has_fsgsbase() {
return cpu_id_leaf7_ebx<0>(); }
170tt_force_inline
bool cpu_has_tsc_adjust() {
return cpu_id_leaf7_ebx<1>(); }
171tt_force_inline
bool cpu_has_sgx() {
return cpu_id_leaf7_ebx<2>(); }
172tt_force_inline
bool cpu_has_bmi1() {
return cpu_id_leaf7_ebx<3>(); }
173tt_force_inline
bool cpu_has_hle() {
return cpu_id_leaf7_ebx<4>(); }
174tt_force_inline
bool cpu_has_avx2() {
return cpu_id_leaf7_ebx<5>(); }
176tt_force_inline
bool cpu_has_smep() {
return cpu_id_leaf7_ebx<7>(); }
177tt_force_inline
bool cpu_has_bmi2() {
return cpu_id_leaf7_ebx<8>(); }
178tt_force_inline
bool cpu_has_erms() {
return cpu_id_leaf7_ebx<9>(); }
179tt_force_inline
bool cpu_has_invpcid() {
return cpu_id_leaf7_ebx<10>(); }
180tt_force_inline
bool cpu_has_rtm() {
return cpu_id_leaf7_ebx<11>(); }
181tt_force_inline
bool cpu_has_pqm() {
return cpu_id_leaf7_ebx<12>(); }
182tt_force_inline
bool cpu_has_deprecated_fpu_cs_ds() {
return cpu_id_leaf7_ebx<13>(); }
183tt_force_inline
bool cpu_has_mpx() {
return cpu_id_leaf7_ebx<14>(); }
184tt_force_inline
bool cpu_has_pqe() {
return cpu_id_leaf7_ebx<15>(); }
185tt_force_inline
bool cpu_has_avx512_f() {
return cpu_id_leaf7_ebx<16>(); }
186tt_force_inline
bool cpu_has_avx512_dq() {
return cpu_id_leaf7_ebx<17>(); }
187tt_force_inline
bool cpu_has_rdseed() {
return cpu_id_leaf7_ebx<18>(); }
188tt_force_inline
bool cpu_has_adx() {
return cpu_id_leaf7_ebx<19>(); }
189tt_force_inline
bool cpu_has_smap() {
return cpu_id_leaf7_ebx<20>(); }
190tt_force_inline
bool cpu_has_avx512_ifma() {
return cpu_id_leaf7_ebx<21>(); }
191tt_force_inline
bool cpu_has_pcommit() {
return cpu_id_leaf7_ebx<22>(); }
192tt_force_inline
bool cpu_has_clflushopt() {
return cpu_id_leaf7_ebx<23>(); }
193tt_force_inline
bool cpu_has_clwb() {
return cpu_id_leaf7_ebx<24>(); }
194tt_force_inline
bool cpu_has_intelpt() {
return cpu_id_leaf7_ebx<25>(); }
195tt_force_inline
bool cpu_has_avx512_pf() {
return cpu_id_leaf7_ebx<26>(); }
196tt_force_inline
bool cpu_has_avx512_er() {
return cpu_id_leaf7_ebx<27>(); }
197tt_force_inline
bool cpu_has_avx512_cd() {
return cpu_id_leaf7_ebx<28>(); }
198tt_force_inline
bool cpu_has_sha() {
return cpu_id_leaf7_ebx<29>(); }
199tt_force_inline
bool cpu_has_avx512_bw() {
return cpu_id_leaf7_ebx<30>(); }
200tt_force_inline
bool cpu_has_avx512_vl() {
return cpu_id_leaf7_ebx<31>(); }
206tt_force_inline
bool cpu_has_prefetchwt1() {
return cpu_id_leaf7_ecx<0>(); }
207tt_force_inline
bool cpu_has_avx512_vbmi() {
return cpu_id_leaf7_ecx<1>(); }
208tt_force_inline
bool cpu_has_umip() {
return cpu_id_leaf7_ecx<2>(); }
209tt_force_inline
bool cpu_has_pku() {
return cpu_id_leaf7_ecx<3>(); }
210tt_force_inline
bool cpu_has_ospke() {
return cpu_id_leaf7_ecx<4>(); }
211tt_force_inline
bool cpu_has_waitpkg() {
return cpu_id_leaf7_ecx<5>(); }
212tt_force_inline
bool cpu_has_avx512_vmbi2() {
return cpu_id_leaf7_ecx<6>(); }
213tt_force_inline
bool cpu_has_shstk() {
return cpu_id_leaf7_ecx<7>(); }
214tt_force_inline
bool cpu_has_gfni() {
return cpu_id_leaf7_ecx<8>(); }
215tt_force_inline
bool cpu_has_vaes() {
return cpu_id_leaf7_ecx<9>(); }
216tt_force_inline
bool cpu_has_vpclmulqdq() {
return cpu_id_leaf7_ecx<10>(); }
217tt_force_inline
bool cpu_has_avx512_vnni() {
return cpu_id_leaf7_ecx<11>(); }
218tt_force_inline
bool cpu_has_avx512_bitalg() {
return cpu_id_leaf7_ecx<12>(); }
220tt_force_inline
bool cpu_has_avx512_vpopcntdq() {
return cpu_id_leaf7_ecx<14>(); }
222tt_force_inline
bool cpu_has_5level_paging() {
return cpu_id_leaf7_ecx<16>(); }
223tt_force_inline
int cpu_has_mawau() { }
224tt_force_inline
bool cpu_has_rdpid() {
return cpu_id_leaf7_ecx<22>(); }
227tt_force_inline
bool cpu_has_cldemote() {
return cpu_id_leaf7_ecx<25>(); }
229tt_force_inline
bool cpu_has_movdir() {
return cpu_id_leaf7_ecx<27>(); }
230tt_force_inline
bool cpu_has_movdir64b() {
return cpu_id_leaf7_ecx<28>(); }
232tt_force_inline
bool cpu_has_sgx_lc() {
return cpu_id_leaf7_ecx<30>(); }
238tt_force_inline
bool cpu_has_avx512_4vnniw() {
return cpu_id_leaf7_edx<2>(); }
239tt_force_inline
bool cpu_has_avx512_4fmaps() {
return cpu_id_leaf7_edx<3>(); }
240tt_force_inline
bool cpu_has_fsrm() {
return cpu_id_leaf7_edx<4>(); }
241tt_force_inline
bool cpu_has_pconfig() {
return cpu_id_leaf7_edx<18>(); }
243tt_force_inline
bool cpu_has_ibt() {
return cpu_id_leaf7_edx<20>(); }
245tt_force_inline
bool cpu_has_spec_ctrl() {
return cpu_id_leaf7_edx<26>(); }
246tt_force_inline
bool cpu_has_stibp() {
return cpu_id_leaf7_edx<27>(); }
248tt_force_inline
bool cpu_has_capabilities() {
return cpu_id_leaf7_edx<29>(); }
250tt_force_inline
bool cpu_has_ssbd() {
return cpu_id_leaf7_edx<31>(); }