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