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