HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
cpu_id.hpp
1// Copyright Take Vos 2019-2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "architecture.hpp"
8#include <array>
9
10#if TT_COMPILER == TT_CC_MSVC
11#include <intrin.h>
12#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
13#include <cpuid.h>
14#else
15#error "Unsuported compiler for x64 cpu_id"
16#endif
17
18namespace tt {
19
20#if TT_COMPILER == TT_CC_MSVC
21std::array<uint32_t,4> cpu_id_x64_result cpu_id_x64(uint32_t cpu_id_leaf)
22{
24 __cpuid(info.data(), static_cast<int>(cpu_id_leaf));
25
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];
31 return r;
32}
33
34#elif TT_COMPILER == TT_CC_GCC || TT_COMPILER == TT_CC_CLANG
35std::array<uint32_t,4> cpu_id_x64_result cpu_id_x64(uint32_t cpu_id_leaf)
36{
38 __cpuid(cpu_id_leaf, r[0], r[1], r[2], r[3]);
39 return r;
40}
41
42#else
43#error "Unsuported compiler for x64 cpu_id"
44#endif
45
46inline std::array<uint32_t,4> cpu_id_leaf1 = cpu_id_x64(1);
47inline std::array<uint32_t,4> cpu_id_leaf7 = cpu_id_x64(7);
48
49template<int Bit>
50bool cpu_id_leaf1_ecx() {
51 constexpr uint32_t mask = 1 << Bit;
52 return (cpu_id_leaf1[2] & mask) != 0;
53}
54
55template<int Bit>
56bool cpu_id_leaf1_edx() {
57 constexpr uint32_t mask = 1 << Bit;
58 return (cpu_id_leaf1[3] & mask) != 0;
59}
60
61template<int Bit>
62bool cpu_id_leaf7_ebx() {
63 constexpr uint32_t mask = 1 << Bit;
64 return (cpu_id_leaf7[1] & mask) != 0;
65}
66
67template<int Bit>
68bool cpu_id_leaf7_ecx() {
69 constexpr uint32_t mask = 1 << Bit;
70 return (cpu_id_leaf7[2] & mask) != 0;
71}
72
73template<int Bit>
74bool cpu_id_leaf7_edx() {
75 constexpr uint32_t mask = 1 << Bit;
76 return (cpu_id_leaf7[3] & mask) != 0;
77}
78
79// LEAF1.0: EDX
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>(); }
90// reserved
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>(); }
100// reserved
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>(); }
112
113// LEAF1.0: ECX
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>(); }
130// reserved
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>(); }
146
147// LEAF1.0: EBX
148
149
150// LEAF1.0: EAX
151bool cpu_stepping() { return cpu_id_leaf1[0] & 0xf; }
152bool cpu_model_id() {
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;
158 } else {
159 return model_id;
160 }
161}
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;
167 } else {
168 return extended_family_id;
169 }
170}
171
172// LEAF7.0: EBX
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>(); }
179// reserved
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>(); }
205
206
207
208
209// LEAF7.0: ECX
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>(); }
223// reserved
224bool cpu_has_avx512_vpopcntdq() { return cpu_id_leaf7_ecx<14>(); }
225// reserved
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>(); }
229// reserved
230// reserved
231bool cpu_has_cldemote() { return cpu_id_leaf7_ecx<25>(); }
232// reserved
233bool cpu_has_movdir() { return cpu_id_leaf7_ecx<27>(); }
234bool cpu_has_movdir64b() { return cpu_id_leaf7_ecx<28>(); }
235// reserved
236bool cpu_has_sgx_lc() { return cpu_id_leaf7_ecx<30>(); }
237// reserved
238
239// LEAF7.0: EDX
240// reserved
241// reserved
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>(); }
246// reserved
247bool cpu_has_ibt() { return cpu_id_leaf7_edx<20>(); }
248// reserved 5
249bool cpu_has_spec_ctrl() { return cpu_id_leaf7_edx<26>(); }
250bool cpu_has_stibp() { return cpu_id_leaf7_edx<27>(); }
251// reserved
252bool cpu_has_capabilities() { return cpu_id_leaf7_edx<29>(); }
253// reserved
254bool cpu_has_ssbd() { return cpu_id_leaf7_edx<31>(); }
255}