1 // AsmJit - Machine code generation for C++
2 //
3 // * Official AsmJit Home Page: https://asmjit.com
4 // * Official Github Repository: https://github.com/asmjit/asmjit
5 //
6 // Copyright (c) 2008-2020 The AsmJit Authors
7 //
8 // This software is provided 'as-is', without any express or implied
9 // warranty. In no event will the authors be held liable for any damages
10 // arising from the use of this software.
11 //
12 // Permission is granted to anyone to use this software for any purpose,
13 // including commercial applications, and to alter it and redistribute it
14 // freely, subject to the following restrictions:
15 //
16 // 1. The origin of this software must not be misrepresented; you must not
17 // claim that you wrote the original software. If you use this software
18 // in a product, an acknowledgment in the product documentation would be
19 // appreciated but is not required.
20 // 2. Altered source versions must be plainly marked as such, and must not be
21 // misrepresented as being the original software.
22 // 3. This notice may not be removed or altered from any source distribution.
23
24 #ifndef ASMJIT_X86_X86FEATURES_H_INCLUDED
25 #define ASMJIT_X86_X86FEATURES_H_INCLUDED
26
27 #include "../core/features.h"
28
ASMJIT_BEGIN_SUB_NAMESPACE(x86)29 ASMJIT_BEGIN_SUB_NAMESPACE(x86)
30
31 //! \addtogroup asmjit_x86
32 //! \{
33
34 // ============================================================================
35 // [asmjit::x86::Features]
36 // ============================================================================
37
38 //! CPU features (X86).
39 class Features : public BaseFeatures {
40 public:
41 //! CPU feature ID.
42 enum Id : uint32_t {
43 // @EnumValuesBegin{"enum": "x86::Features::Id"}@
44
45 kNone = 0, //!< No feature (never set, used internally).
46
47 kMT, //!< CPU has multi-threading capabilities.
48 kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
49
50 k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD].
51 k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD].
52 kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
53 kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
54 kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD].
55 kAMX_BF16, //!< CPU has AMX_BF16 (advanced matrix extensions - BF16 instructions).
56 kAMX_INT8, //!< CPU has AMX_INT8 (advanced matrix extensions - INT8 instructions).
57 kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions).
58 kAVX, //!< CPU has AVX (advanced vector extensions).
59 kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
60 kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
61 kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
62 kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction).
63 kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB).
64 kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD).
65 kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection).
66 kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD).
67 kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal).
68 kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
69 kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision).
70 kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions).
71 kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation).
72 kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2).
73 kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions).
74 kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions).
75 kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
76 kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions).
77 kAVX_VNNI, //!< CPU has AVX_VNNI (VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds).
78 kBMI, //!< CPU has BMI (bit manipulation instructions #1).
79 kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
80 kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking).
81 kCET_SS, //!< CPU has CET-SS.
82 kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
83 kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush).
84 kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized).
85 kCLWB, //!< CPU has CLWB.
86 kCLZERO, //!< CPU has CLZERO.
87 kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
88 kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64].
89 kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
90 kENCLV, //!< CPU has ENCLV.
91 kENQCMD, //!< CPU has ENQCMD (enqueue stores).
92 kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
93 kF16C, //!< CPU has F16C.
94 kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form).
95 kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form).
96 kFPU, //!< CPU has FPU (FPU support).
97 kFSGSBASE, //!< CPU has FSGSBASE.
98 kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
99 kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
100 kGEODE, //!< CPU has GEODE extensions (3DNOW additions).
101 kGFNI, //!< CPU has GFNI (Galois field instructions).
102 kHLE, //!< CPU has HLE.
103 kHRESET, //!< CPU has HRESET.
104 kI486, //!< CPU has I486 features (I486+ support).
105 kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64].
106 kLWP, //!< CPU has LWP (lightweight profiling) [AMD].
107 kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
108 kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction).
109 kMMX, //!< CPU has MMX (MMX base instructions).
110 kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2).
111 kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
112 kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
113 kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
114 kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
115 kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
116 kMPX, //!< CPU has MPX (memory protection extensions).
117 kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
118 kMSSE, //!< CPU has MSSE (misaligned SSE support).
119 kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
120 kOSPKE, //!< CPU has OSPKE (PKE enabled by OS).
121 kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
122 kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
123 kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
124 kPREFETCHW, //!< CPU has PREFETCHW.
125 kPREFETCHWT1, //!< CPU has PREFETCHWT1.
126 kPTWRITE, //!< CPU has PTWRITE.
127 kRDPID, //!< CPU has RDPID.
128 kRDPRU, //!< CPU has RDPRU.
129 kRDRAND, //!< CPU has RDRAND.
130 kRDSEED, //!< CPU has RDSEED.
131 kRDTSC, //!< CPU has RDTSC.
132 kRDTSCP, //!< CPU has RDTSCP.
133 kRTM, //!< CPU has RTM.
134 kSERIALIZE, //!< CPU has SERIALIZE.
135 kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
136 kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD].
137 kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
138 kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
139 kSMX, //!< CPU has SMX (safer mode extensions).
140 kSNP, //!< CPU has SNP.
141 kSSE, //!< CPU has SSE.
142 kSSE2, //!< CPU has SSE2.
143 kSSE3, //!< CPU has SSE3.
144 kSSE4_1, //!< CPU has SSE4.1.
145 kSSE4_2, //!< CPU has SSE4.2.
146 kSSE4A, //!< CPU has SSE4A [AMD].
147 kSSSE3, //!< CPU has SSSE3.
148 kSVM, //!< CPU has SVM (virtualization) [AMD].
149 kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD].
150 kTSX, //!< CPU has TSX.
151 kTSXLDTRK, //!< CPU has TSXLDTRK.
152 kUINTR, //!< CPU has UINTR (user interrupts).
153 kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
154 kVMX, //!< CPU has VMX (virtualization) [INTEL].
155 kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
156 kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
157 kWBNOINVD, //!< CPU has WBNOINVD.
158 kXOP, //!< CPU has XOP (XOP instructions) [AMD].
159 kXSAVE, //!< CPU has XSAVE.
160 kXSAVEC, //!< CPU has XSAVEC.
161 kXSAVEOPT, //!< CPU has XSAVEOPT.
162 kXSAVES, //!< CPU has XSAVES.
163
164 // @EnumValuesEnd@
165
166 kCount //!< Count of X86 CPU features.
167 };
168
169 //! \name Construction / Destruction
170 //! \{
171
172 inline Features() noexcept
173 : BaseFeatures() {}
174
175 inline Features(const Features& other) noexcept
176 : BaseFeatures(other) {}
177
178 //! \}
179
180 //! \name Overloaded Operators
181 //! \{
182
183 inline Features& operator=(const Features& other) noexcept = default;
184
185 //! \}
186
187 //! \name Accessors
188 //! \{
189
190 #define ASMJIT_X86_FEATURE(FEATURE) \
191 inline bool has##FEATURE() const noexcept { return has(k##FEATURE); }
192
193 ASMJIT_X86_FEATURE(MT)
194 ASMJIT_X86_FEATURE(NX)
195
196 ASMJIT_X86_FEATURE(3DNOW)
197 ASMJIT_X86_FEATURE(3DNOW2)
198 ASMJIT_X86_FEATURE(ADX)
199 ASMJIT_X86_FEATURE(AESNI)
200 ASMJIT_X86_FEATURE(ALTMOVCR8)
201 ASMJIT_X86_FEATURE(AMX_BF16)
202 ASMJIT_X86_FEATURE(AMX_INT8)
203 ASMJIT_X86_FEATURE(AMX_TILE)
204 ASMJIT_X86_FEATURE(AVX)
205 ASMJIT_X86_FEATURE(AVX2)
206 ASMJIT_X86_FEATURE(AVX512_4FMAPS)
207 ASMJIT_X86_FEATURE(AVX512_4VNNIW)
208 ASMJIT_X86_FEATURE(AVX512_BF16)
209 ASMJIT_X86_FEATURE(AVX512_BITALG)
210 ASMJIT_X86_FEATURE(AVX512_BW)
211 ASMJIT_X86_FEATURE(AVX512_CDI)
212 ASMJIT_X86_FEATURE(AVX512_DQ)
213 ASMJIT_X86_FEATURE(AVX512_ERI)
214 ASMJIT_X86_FEATURE(AVX512_F)
215 ASMJIT_X86_FEATURE(AVX512_IFMA)
216 ASMJIT_X86_FEATURE(AVX512_PFI)
217 ASMJIT_X86_FEATURE(AVX512_VBMI)
218 ASMJIT_X86_FEATURE(AVX512_VBMI2)
219 ASMJIT_X86_FEATURE(AVX512_VL)
220 ASMJIT_X86_FEATURE(AVX512_VNNI)
221 ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
222 ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
223 ASMJIT_X86_FEATURE(AVX_VNNI)
224 ASMJIT_X86_FEATURE(BMI)
225 ASMJIT_X86_FEATURE(BMI2)
226 ASMJIT_X86_FEATURE(CET_IBT)
227 ASMJIT_X86_FEATURE(CET_SS)
228 ASMJIT_X86_FEATURE(CLDEMOTE)
229 ASMJIT_X86_FEATURE(CLFLUSH)
230 ASMJIT_X86_FEATURE(CLFLUSHOPT)
231 ASMJIT_X86_FEATURE(CLWB)
232 ASMJIT_X86_FEATURE(CLZERO)
233 ASMJIT_X86_FEATURE(CMOV)
234 ASMJIT_X86_FEATURE(CMPXCHG16B)
235 ASMJIT_X86_FEATURE(CMPXCHG8B)
236 ASMJIT_X86_FEATURE(ENCLV)
237 ASMJIT_X86_FEATURE(ENQCMD)
238 ASMJIT_X86_FEATURE(ERMS)
239 ASMJIT_X86_FEATURE(F16C)
240 ASMJIT_X86_FEATURE(FMA)
241 ASMJIT_X86_FEATURE(FMA4)
242 ASMJIT_X86_FEATURE(FPU)
243 ASMJIT_X86_FEATURE(FSGSBASE)
244 ASMJIT_X86_FEATURE(FXSR)
245 ASMJIT_X86_FEATURE(FXSROPT)
246 ASMJIT_X86_FEATURE(GEODE)
247 ASMJIT_X86_FEATURE(GFNI)
248 ASMJIT_X86_FEATURE(HLE)
249 ASMJIT_X86_FEATURE(HRESET)
250 ASMJIT_X86_FEATURE(I486)
251 ASMJIT_X86_FEATURE(LAHFSAHF)
252 ASMJIT_X86_FEATURE(LWP)
253 ASMJIT_X86_FEATURE(LZCNT)
254 ASMJIT_X86_FEATURE(MCOMMIT)
255 ASMJIT_X86_FEATURE(MMX)
256 ASMJIT_X86_FEATURE(MMX2)
257 ASMJIT_X86_FEATURE(MONITOR)
258 ASMJIT_X86_FEATURE(MONITORX)
259 ASMJIT_X86_FEATURE(MOVBE)
260 ASMJIT_X86_FEATURE(MOVDIR64B)
261 ASMJIT_X86_FEATURE(MOVDIRI)
262 ASMJIT_X86_FEATURE(MPX)
263 ASMJIT_X86_FEATURE(MSR)
264 ASMJIT_X86_FEATURE(MSSE)
265 ASMJIT_X86_FEATURE(OSXSAVE)
266 ASMJIT_X86_FEATURE(PCLMULQDQ)
267 ASMJIT_X86_FEATURE(PCONFIG)
268 ASMJIT_X86_FEATURE(POPCNT)
269 ASMJIT_X86_FEATURE(PREFETCHW)
270 ASMJIT_X86_FEATURE(PREFETCHWT1)
271 ASMJIT_X86_FEATURE(PTWRITE)
272 ASMJIT_X86_FEATURE(RDPID)
273 ASMJIT_X86_FEATURE(RDPRU)
274 ASMJIT_X86_FEATURE(RDRAND)
275 ASMJIT_X86_FEATURE(RDSEED)
276 ASMJIT_X86_FEATURE(RDTSC)
277 ASMJIT_X86_FEATURE(RDTSCP)
278 ASMJIT_X86_FEATURE(RTM)
279 ASMJIT_X86_FEATURE(SERIALIZE)
280 ASMJIT_X86_FEATURE(SHA)
281 ASMJIT_X86_FEATURE(SKINIT)
282 ASMJIT_X86_FEATURE(SMAP)
283 ASMJIT_X86_FEATURE(SMEP)
284 ASMJIT_X86_FEATURE(SMX)
285 ASMJIT_X86_FEATURE(SNP)
286 ASMJIT_X86_FEATURE(SSE)
287 ASMJIT_X86_FEATURE(SSE2)
288 ASMJIT_X86_FEATURE(SSE3)
289 ASMJIT_X86_FEATURE(SSSE3)
290 ASMJIT_X86_FEATURE(SSE4A)
291 ASMJIT_X86_FEATURE(SSE4_1)
292 ASMJIT_X86_FEATURE(SSE4_2)
293 ASMJIT_X86_FEATURE(SVM)
294 ASMJIT_X86_FEATURE(TBM)
295 ASMJIT_X86_FEATURE(TSX)
296 ASMJIT_X86_FEATURE(TSXLDTRK)
297 ASMJIT_X86_FEATURE(UINTR)
298 ASMJIT_X86_FEATURE(XSAVE)
299 ASMJIT_X86_FEATURE(XSAVEC)
300 ASMJIT_X86_FEATURE(XSAVEOPT)
301 ASMJIT_X86_FEATURE(XSAVES)
302 ASMJIT_X86_FEATURE(VAES)
303 ASMJIT_X86_FEATURE(VMX)
304 ASMJIT_X86_FEATURE(VPCLMULQDQ)
305 ASMJIT_X86_FEATURE(WAITPKG)
306 ASMJIT_X86_FEATURE(WBNOINVD)
307 ASMJIT_X86_FEATURE(XOP)
308
309 #undef ASMJIT_X86_FEATURE
310
311 //! \}
312 };
313
314 //! \}
315
316 ASMJIT_END_SUB_NAMESPACE
317
318 #endif // ASMJIT_X86_X86FEATURES_H_INCLUDED
319