HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
cpu_id.hpp
1
2#include "TTauri/Foundation/cpu_id.hpp"
3#include "TTauri/Foundation/os_detect.hpp"
4#include <array>
5
6#if TT_COMPILER == TT_CC_MSVC
7#include <intrin.h>
8#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
9#include <cpuid.h>
10#else
11#error "Unsuported compiler for x64 cpu_id"
12#endif
13
14namespace tt {
15
16#if TT_COMPILER == TT_CC_MSVC
17std::array<uint32_t,4> cpu_id_x64_result cpu_id_x64(uint32_t cpu_id_leaf)
18{
20 __cpuid(info.data(), static_cast<int>(cpu_id_leaf));
21
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];
27 return r;
28}
29
30#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
31std::array<uint32_t,4> cpu_id_x64_result cpu_id_x64(uint32_t cpu_id_leaf)
32{
34 __cpuid(cpu_id_leaf, r[0], r[1], r[2], r[3]);
35 return r;
36}
37
38#else
39#error "Unsuported compiler for x64 cpu_id"
40#endif
41
42inline std::array<uint32_t,4> cpu_id_leaf1 = cpu_id_x64(1);
43inline std::array<uint32_t,4> cpu_id_leaf7 = cpu_id_x64(7);
44
45template<int Bit>
46tt_force_inline bool cpu_id_leaf1_ecx() {
47 constexpr uint32_t mask = 1 << Bit;
48 return (cpu_id_leaf1[2] & mask) != 0;
49}
50
51template<int Bit>
52tt_force_inline bool cpu_id_leaf1_edx() {
53 constexpr uint32_t mask = 1 << Bit;
54 return (cpu_id_leaf1[3] & mask) != 0;
55}
56
57template<int Bit>
58tt_force_inline bool cpu_id_leaf7_ebx() {
59 constexpr uint32_t mask = 1 << Bit;
60 return (cpu_id_leaf7[1] & mask) != 0;
61}
62
63template<int Bit>
64tt_force_inline bool cpu_id_leaf7_ecx() {
65 constexpr uint32_t mask = 1 << Bit;
66 return (cpu_id_leaf7[2] & mask) != 0;
67}
68
69template<int Bit>
70tt_force_inline bool cpu_id_leaf7_edx() {
71 constexpr uint32_t mask = 1 << Bit;
72 return (cpu_id_leaf7[3] & mask) != 0;
73}
74
75// LEAF1.0: EDX
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>(); }
86// reserved
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>(); }
96// reserved
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>(); }
108
109// LEAF1.0: ECX
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>(); }
126// reserved
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>(); }
142
143// LEAF1.0: EBX
144
145
146// LEAF1.0: EAX
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;
154 } else {
155 return model_id;
156 }
157}
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;
163 } else {
164 return extended_family_id;
165 }
166}
167
168// LEAF7.0: EBX
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>(); }
175// reserved
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>(); }
201
202
203
204
205// LEAF7.0: ECX
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>(); }
219// reserved
220tt_force_inline bool cpu_has_avx512_vpopcntdq() { return cpu_id_leaf7_ecx<14>(); }
221// reserved
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>(); }
225// reserved
226// reserved
227tt_force_inline bool cpu_has_cldemote() { return cpu_id_leaf7_ecx<25>(); }
228// reserved
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>(); }
231// reserved
232tt_force_inline bool cpu_has_sgx_lc() { return cpu_id_leaf7_ecx<30>(); }
233// reserved
234
235// LEAF7.0: EDX
236// reserved
237// reserved
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>(); }
242// reserved
243tt_force_inline bool cpu_has_ibt() { return cpu_id_leaf7_edx<20>(); }
244// reserved 5
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>(); }
247// reserved
248tt_force_inline bool cpu_has_capabilities() { return cpu_id_leaf7_edx<29>(); }
249// reserved
250tt_force_inline bool cpu_has_ssbd() { return cpu_id_leaf7_edx<31>(); }
251}
T data(T... args)