1 // [AsmJit]
2 // Machine Code Generation for C++.
3 //
4 // [License]
5 // Zlib - See LICENSE.md file in the package.
6
7 #ifndef _ASMJIT_X86_X86FEATURES_H
8 #define _ASMJIT_X86_X86FEATURES_H
9
10 #include "../core/features.h"
11
ASMJIT_BEGIN_SUB_NAMESPACE(x86)12 ASMJIT_BEGIN_SUB_NAMESPACE(x86)
13
14 //! \addtogroup asmjit_x86
15 //! \{
16
17 // ============================================================================
18 // [asmjit::x86::Features]
19 // ============================================================================
20
21 //! CPU features (X86).
22 class Features : public BaseFeatures {
23 public:
24 //! CPU feature ID.
25 enum Id : uint32_t {
26 kNone = 0, //!< No feature (never set, used internally).
27
28 kMT, //!< CPU has multi-threading capabilities.
29 kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
30
31 k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD].
32 k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD].
33 kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
34 kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
35 kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD].
36 kAVX, //!< CPU has AVX (advanced vector extensions).
37 kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
38 kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
39 kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
40 kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction).
41 kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB).
42 kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD).
43 kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection).
44 kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD).
45 kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal).
46 kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
47 kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision).
48 kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions).
49 kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation).
50 kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2).
51 kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions).
52 kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions).
53 kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
54 kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions).
55 kBMI, //!< CPU has BMI (bit manipulation instructions #1).
56 kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
57 kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
58 kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush).
59 kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized).
60 kCLWB, //!< CPU has CLWB.
61 kCLZERO, //!< CPU has CLZERO.
62 kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
63 kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64].
64 kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
65 kENCLV, //!< CPU has ENCLV.
66 kENQCMD, //!< CPU has ENQCMD (enqueue stores).
67 kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
68 kF16C, //!< CPU has F16C.
69 kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form).
70 kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form).
71 kFPU, //!< CPU has FPU (FPU support).
72 kFSGSBASE, //!< CPU has FSGSBASE.
73 kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
74 kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
75 kGEODE, //!< CPU has GEODE extensions (3DNOW additions).
76 kGFNI, //!< CPU has GFNI (Galois field instructions).
77 kHLE, //!< CPU has HLE.
78 kI486, //!< CPU has I486 features (I486+ support).
79 kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64].
80 kLWP, //!< CPU has LWP (lightweight profiling) [AMD].
81 kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
82 kMMX, //!< CPU has MMX (MMX base instructions).
83 kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2).
84 kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
85 kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
86 kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
87 kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
88 kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
89 kMPX, //!< CPU has MPX (memory protection extensions).
90 kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
91 kMSSE, //!< CPU has MSSE (misaligned SSE support).
92 kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
93 kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
94 kPCOMMIT, //!< CPU has PCOMMIT (PCOMMIT instruction).
95 kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
96 kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
97 kPREFETCHW, //!< CPU has PREFETCHW.
98 kPREFETCHWT1, //!< CPU has PREFETCHWT1.
99 kRDPID, //!< CPU has RDPID.
100 kRDRAND, //!< CPU has RDRAND.
101 kRDSEED, //!< CPU has RDSEED.
102 kRDTSC, //!< CPU has RDTSC.
103 kRDTSCP, //!< CPU has RDTSCP.
104 kRTM, //!< CPU has RTM.
105 kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
106 kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD].
107 kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
108 kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
109 kSMX, //!< CPU has SMX (safer mode extensions).
110 kSSE, //!< CPU has SSE.
111 kSSE2, //!< CPU has SSE2.
112 kSSE3, //!< CPU has SSE3.
113 kSSE4_1, //!< CPU has SSE4.1.
114 kSSE4_2, //!< CPU has SSE4.2.
115 kSSE4A, //!< CPU has SSE4A [AMD].
116 kSSSE3, //!< CPU has SSSE3.
117 kSVM, //!< CPU has SVM (virtualization) [AMD].
118 kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD].
119 kTSX, //!< CPU has TSX.
120 kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
121 kVMX, //!< CPU has VMX (virtualization) [INTEL].
122 kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
123 kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
124 kWBNOINVD, //!< CPU has WBNOINVD.
125 kXOP, //!< CPU has XOP (XOP instructions) [AMD].
126 kXSAVE, //!< CPU has XSAVE.
127 kXSAVEC, //!< CPU has XSAVEC.
128 kXSAVEOPT, //!< CPU has XSAVEOPT.
129 kXSAVES, //!< CPU has XSAVES.
130
131 kCount //!< Count of X86 CPU features.
132 };
133
134 //! \name Construction / Destruction
135 //! \{
136
137 inline Features() noexcept
138 : BaseFeatures() {}
139 inline Features(const Features& other) noexcept
140 : BaseFeatures(other) {}
141
142 //! \}
143
144 //! \name Overloaded Operators
145 //! \{
146
147 inline Features& operator=(const Features& other) noexcept = default;
148
149 //! \}
150
151 //! \name Accessors
152 //! \{
153
154 #define ASMJIT_X86_FEATURE(FEATURE) \
155 inline bool has##FEATURE() const noexcept { return has(k##FEATURE); }
156
157 ASMJIT_X86_FEATURE(MT)
158 ASMJIT_X86_FEATURE(NX)
159
160 ASMJIT_X86_FEATURE(3DNOW)
161 ASMJIT_X86_FEATURE(3DNOW2)
162 ASMJIT_X86_FEATURE(ADX)
163 ASMJIT_X86_FEATURE(AESNI)
164 ASMJIT_X86_FEATURE(ALTMOVCR8)
165 ASMJIT_X86_FEATURE(AVX)
166 ASMJIT_X86_FEATURE(AVX2)
167 ASMJIT_X86_FEATURE(AVX512_4FMAPS)
168 ASMJIT_X86_FEATURE(AVX512_4VNNIW)
169 ASMJIT_X86_FEATURE(AVX512_BF16)
170 ASMJIT_X86_FEATURE(AVX512_BITALG)
171 ASMJIT_X86_FEATURE(AVX512_BW)
172 ASMJIT_X86_FEATURE(AVX512_CDI)
173 ASMJIT_X86_FEATURE(AVX512_DQ)
174 ASMJIT_X86_FEATURE(AVX512_ERI)
175 ASMJIT_X86_FEATURE(AVX512_F)
176 ASMJIT_X86_FEATURE(AVX512_IFMA)
177 ASMJIT_X86_FEATURE(AVX512_PFI)
178 ASMJIT_X86_FEATURE(AVX512_VBMI)
179 ASMJIT_X86_FEATURE(AVX512_VBMI2)
180 ASMJIT_X86_FEATURE(AVX512_VL)
181 ASMJIT_X86_FEATURE(AVX512_VNNI)
182 ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
183 ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
184 ASMJIT_X86_FEATURE(BMI)
185 ASMJIT_X86_FEATURE(BMI2)
186 ASMJIT_X86_FEATURE(CLDEMOTE)
187 ASMJIT_X86_FEATURE(CLFLUSH)
188 ASMJIT_X86_FEATURE(CLFLUSHOPT)
189 ASMJIT_X86_FEATURE(CLWB)
190 ASMJIT_X86_FEATURE(CLZERO)
191 ASMJIT_X86_FEATURE(CMOV)
192 ASMJIT_X86_FEATURE(CMPXCHG16B)
193 ASMJIT_X86_FEATURE(CMPXCHG8B)
194 ASMJIT_X86_FEATURE(ENCLV)
195 ASMJIT_X86_FEATURE(ENQCMD)
196 ASMJIT_X86_FEATURE(ERMS)
197 ASMJIT_X86_FEATURE(F16C)
198 ASMJIT_X86_FEATURE(FMA)
199 ASMJIT_X86_FEATURE(FMA4)
200 ASMJIT_X86_FEATURE(FPU)
201 ASMJIT_X86_FEATURE(FSGSBASE)
202 ASMJIT_X86_FEATURE(FXSR)
203 ASMJIT_X86_FEATURE(FXSROPT)
204 ASMJIT_X86_FEATURE(GEODE)
205 ASMJIT_X86_FEATURE(GFNI)
206 ASMJIT_X86_FEATURE(HLE)
207 ASMJIT_X86_FEATURE(I486)
208 ASMJIT_X86_FEATURE(LAHFSAHF)
209 ASMJIT_X86_FEATURE(LWP)
210 ASMJIT_X86_FEATURE(LZCNT)
211 ASMJIT_X86_FEATURE(MMX)
212 ASMJIT_X86_FEATURE(MMX2)
213 ASMJIT_X86_FEATURE(MONITOR)
214 ASMJIT_X86_FEATURE(MONITORX)
215 ASMJIT_X86_FEATURE(MOVBE)
216 ASMJIT_X86_FEATURE(MOVDIR64B)
217 ASMJIT_X86_FEATURE(MOVDIRI)
218 ASMJIT_X86_FEATURE(MPX)
219 ASMJIT_X86_FEATURE(MSR)
220 ASMJIT_X86_FEATURE(MSSE)
221 ASMJIT_X86_FEATURE(OSXSAVE)
222 ASMJIT_X86_FEATURE(PCLMULQDQ)
223 ASMJIT_X86_FEATURE(PCOMMIT)
224 ASMJIT_X86_FEATURE(PCONFIG)
225 ASMJIT_X86_FEATURE(POPCNT)
226 ASMJIT_X86_FEATURE(PREFETCHW)
227 ASMJIT_X86_FEATURE(PREFETCHWT1)
228 ASMJIT_X86_FEATURE(RDPID)
229 ASMJIT_X86_FEATURE(RDRAND)
230 ASMJIT_X86_FEATURE(RDSEED)
231 ASMJIT_X86_FEATURE(RDTSC)
232 ASMJIT_X86_FEATURE(RDTSCP)
233 ASMJIT_X86_FEATURE(RTM)
234 ASMJIT_X86_FEATURE(SHA)
235 ASMJIT_X86_FEATURE(SKINIT)
236 ASMJIT_X86_FEATURE(SMAP)
237 ASMJIT_X86_FEATURE(SMEP)
238 ASMJIT_X86_FEATURE(SMX)
239 ASMJIT_X86_FEATURE(SSE)
240 ASMJIT_X86_FEATURE(SSE2)
241 ASMJIT_X86_FEATURE(SSE3)
242 ASMJIT_X86_FEATURE(SSSE3)
243 ASMJIT_X86_FEATURE(SSE4A)
244 ASMJIT_X86_FEATURE(SSE4_1)
245 ASMJIT_X86_FEATURE(SSE4_2)
246 ASMJIT_X86_FEATURE(SVM)
247 ASMJIT_X86_FEATURE(TBM)
248 ASMJIT_X86_FEATURE(TSX)
249 ASMJIT_X86_FEATURE(XSAVE)
250 ASMJIT_X86_FEATURE(XSAVEC)
251 ASMJIT_X86_FEATURE(XSAVEOPT)
252 ASMJIT_X86_FEATURE(XSAVES)
253 ASMJIT_X86_FEATURE(VAES)
254 ASMJIT_X86_FEATURE(VMX)
255 ASMJIT_X86_FEATURE(VPCLMULQDQ)
256 ASMJIT_X86_FEATURE(WAITPKG)
257 ASMJIT_X86_FEATURE(WBNOINVD)
258 ASMJIT_X86_FEATURE(XOP)
259
260 #undef ASMJIT_X86_FEATURE
261
262 //! \}
263 };
264
265 //! \}
266
267 ASMJIT_END_SUB_NAMESPACE
268
269 #endif // _ASMJIT_X86_X86FEATURES_H
270