You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
15 KiB
319 lines
15 KiB
4 years ago
|
// AsmJit - Machine code generation for C++
|
||
|
//
|
||
|
// * Official AsmJit Home Page: https://asmjit.com
|
||
|
// * Official Github Repository: https://github.com/asmjit/asmjit
|
||
|
//
|
||
|
// Copyright (c) 2008-2020 The AsmJit Authors
|
||
|
//
|
||
|
// This software is provided 'as-is', without any express or implied
|
||
|
// warranty. In no event will the authors be held liable for any damages
|
||
|
// arising from the use of this software.
|
||
|
//
|
||
|
// Permission is granted to anyone to use this software for any purpose,
|
||
|
// including commercial applications, and to alter it and redistribute it
|
||
|
// freely, subject to the following restrictions:
|
||
|
//
|
||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||
|
// claim that you wrote the original software. If you use this software
|
||
|
// in a product, an acknowledgment in the product documentation would be
|
||
|
// appreciated but is not required.
|
||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||
|
// misrepresented as being the original software.
|
||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||
|
|
||
|
#ifndef ASMJIT_X86_X86FEATURES_H_INCLUDED
|
||
|
#define ASMJIT_X86_X86FEATURES_H_INCLUDED
|
||
|
|
||
|
#include "../core/features.h"
|
||
|
|
||
|
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
|
||
|
|
||
|
//! \addtogroup asmjit_x86
|
||
|
//! \{
|
||
|
|
||
|
// ============================================================================
|
||
|
// [asmjit::x86::Features]
|
||
|
// ============================================================================
|
||
|
|
||
|
//! CPU features (X86).
|
||
|
class Features : public BaseFeatures {
|
||
|
public:
|
||
|
//! CPU feature ID.
|
||
|
enum Id : uint32_t {
|
||
|
// @EnumValuesBegin{"enum": "x86::Features::Id"}@
|
||
|
|
||
|
kNone = 0, //!< No feature (never set, used internally).
|
||
|
|
||
|
kMT, //!< CPU has multi-threading capabilities.
|
||
|
kNX, //!< CPU has Not-Execute-Bit aka DEP (data-execution prevention).
|
||
|
|
||
|
k3DNOW, //!< CPU has 3DNOW (3DNOW base instructions) [AMD].
|
||
|
k3DNOW2, //!< CPU has 3DNOW2 (enhanced 3DNOW) [AMD].
|
||
|
kADX, //!< CPU has ADX (multi-precision add-carry instruction extensions).
|
||
|
kAESNI, //!< CPU has AESNI (AES encode/decode instructions).
|
||
|
kALTMOVCR8, //!< CPU has LOCK MOV R<->CR0 (supports `MOV R<->CR8` via `LOCK MOV R<->CR0` in 32-bit mode) [AMD].
|
||
|
kAMX_BF16, //!< CPU has AMX_BF16 (advanced matrix extensions - BF16 instructions).
|
||
|
kAMX_INT8, //!< CPU has AMX_INT8 (advanced matrix extensions - INT8 instructions).
|
||
|
kAMX_TILE, //!< CPU has AMX_TILE (advanced matrix extensions).
|
||
|
kAVX, //!< CPU has AVX (advanced vector extensions).
|
||
|
kAVX2, //!< CPU has AVX2 (advanced vector extensions 2).
|
||
|
kAVX512_4FMAPS, //!< CPU has AVX512_FMAPS (FMA packed single).
|
||
|
kAVX512_4VNNIW, //!< CPU has AVX512_VNNIW (vector NN instructions word variable precision).
|
||
|
kAVX512_BF16, //!< CPU has AVX512_BF16 (BFLOAT16 support instruction).
|
||
|
kAVX512_BITALG, //!< CPU has AVX512_BITALG (VPOPCNT[B|W], VPSHUFBITQMB).
|
||
|
kAVX512_BW, //!< CPU has AVX512_BW (packed BYTE|WORD).
|
||
|
kAVX512_CDI, //!< CPU has AVX512_CDI (conflict detection).
|
||
|
kAVX512_DQ, //!< CPU has AVX512_DQ (packed DWORD|QWORD).
|
||
|
kAVX512_ERI, //!< CPU has AVX512_ERI (exponential and reciprocal).
|
||
|
kAVX512_F, //!< CPU has AVX512_F (AVX512 foundation).
|
||
|
kAVX512_IFMA, //!< CPU has AVX512_IFMA (integer fused-multiply-add using 52-bit precision).
|
||
|
kAVX512_PFI, //!< CPU has AVX512_PFI (prefetch instructions).
|
||
|
kAVX512_VBMI, //!< CPU has AVX512_VBMI (vector byte manipulation).
|
||
|
kAVX512_VBMI2, //!< CPU has AVX512_VBMI2 (vector byte manipulation 2).
|
||
|
kAVX512_VL, //!< CPU has AVX512_VL (vector length extensions).
|
||
|
kAVX512_VNNI, //!< CPU has AVX512_VNNI (vector neural network instructions).
|
||
|
kAVX512_VP2INTERSECT, //!< CPU has AVX512_VP2INTERSECT
|
||
|
kAVX512_VPOPCNTDQ, //!< CPU has AVX512_VPOPCNTDQ (VPOPCNT[D|Q] instructions).
|
||
|
kAVX_VNNI, //!< CPU has AVX_VNNI (VEX encoding of vpdpbusd/vpdpbusds/vpdpwssd/vpdpwssds).
|
||
|
kBMI, //!< CPU has BMI (bit manipulation instructions #1).
|
||
|
kBMI2, //!< CPU has BMI2 (bit manipulation instructions #2).
|
||
|
kCET_IBT, //!< CPU has CET-IBT (indirect branch tracking).
|
||
|
kCET_SS, //!< CPU has CET-SS.
|
||
|
kCLDEMOTE, //!< CPU has CLDEMOTE (cache line demote).
|
||
|
kCLFLUSH, //!< CPU has CLFUSH (Cache Line flush).
|
||
|
kCLFLUSHOPT, //!< CPU has CLFUSHOPT (Cache Line flush - optimized).
|
||
|
kCLWB, //!< CPU has CLWB.
|
||
|
kCLZERO, //!< CPU has CLZERO.
|
||
|
kCMOV, //!< CPU has CMOV (CMOV and FCMOV instructions).
|
||
|
kCMPXCHG16B, //!< CPU has CMPXCHG16B (compare-exchange 16 bytes) [X86_64].
|
||
|
kCMPXCHG8B, //!< CPU has CMPXCHG8B (compare-exchange 8 bytes).
|
||
|
kENCLV, //!< CPU has ENCLV.
|
||
|
kENQCMD, //!< CPU has ENQCMD (enqueue stores).
|
||
|
kERMS, //!< CPU has ERMS (enhanced REP MOVSB/STOSB).
|
||
|
kF16C, //!< CPU has F16C.
|
||
|
kFMA, //!< CPU has FMA (fused-multiply-add 3 operand form).
|
||
|
kFMA4, //!< CPU has FMA4 (fused-multiply-add 4 operand form).
|
||
|
kFPU, //!< CPU has FPU (FPU support).
|
||
|
kFSGSBASE, //!< CPU has FSGSBASE.
|
||
|
kFXSR, //!< CPU has FXSR (FXSAVE/FXRSTOR instructions).
|
||
|
kFXSROPT, //!< CPU has FXSROTP (FXSAVE/FXRSTOR is optimized).
|
||
|
kGEODE, //!< CPU has GEODE extensions (3DNOW additions).
|
||
|
kGFNI, //!< CPU has GFNI (Galois field instructions).
|
||
|
kHLE, //!< CPU has HLE.
|
||
|
kHRESET, //!< CPU has HRESET.
|
||
|
kI486, //!< CPU has I486 features (I486+ support).
|
||
|
kLAHFSAHF, //!< CPU has LAHF/SAHF (LAHF/SAHF in 64-bit mode) [X86_64].
|
||
|
kLWP, //!< CPU has LWP (lightweight profiling) [AMD].
|
||
|
kLZCNT, //!< CPU has LZCNT (LZCNT instruction).
|
||
|
kMCOMMIT, //!< CPU has MCOMMIT (MCOMMIT instruction).
|
||
|
kMMX, //!< CPU has MMX (MMX base instructions).
|
||
|
kMMX2, //!< CPU has MMX2 (MMX extensions or MMX2).
|
||
|
kMONITOR, //!< CPU has MONITOR (MONITOR/MWAIT instructions).
|
||
|
kMONITORX, //!< CPU has MONITORX (MONITORX/MWAITX instructions).
|
||
|
kMOVBE, //!< CPU has MOVBE (move with byte-order swap).
|
||
|
kMOVDIR64B, //!< CPU has MOVDIR64B (move 64 bytes as direct store).
|
||
|
kMOVDIRI, //!< CPU has MOVDIRI (move dword/qword as direct store).
|
||
|
kMPX, //!< CPU has MPX (memory protection extensions).
|
||
|
kMSR, //!< CPU has MSR (RDMSR/WRMSR instructions).
|
||
|
kMSSE, //!< CPU has MSSE (misaligned SSE support).
|
||
|
kOSXSAVE, //!< CPU has OSXSAVE (XSAVE enabled by OS).
|
||
|
kOSPKE, //!< CPU has OSPKE (PKE enabled by OS).
|
||
|
kPCLMULQDQ, //!< CPU has PCLMULQDQ (packed carry-less multiplication).
|
||
|
kPCONFIG, //!< CPU has PCONFIG (PCONFIG instruction).
|
||
|
kPOPCNT, //!< CPU has POPCNT (POPCNT instruction).
|
||
|
kPREFETCHW, //!< CPU has PREFETCHW.
|
||
|
kPREFETCHWT1, //!< CPU has PREFETCHWT1.
|
||
|
kPTWRITE, //!< CPU has PTWRITE.
|
||
|
kRDPID, //!< CPU has RDPID.
|
||
|
kRDPRU, //!< CPU has RDPRU.
|
||
|
kRDRAND, //!< CPU has RDRAND.
|
||
|
kRDSEED, //!< CPU has RDSEED.
|
||
|
kRDTSC, //!< CPU has RDTSC.
|
||
|
kRDTSCP, //!< CPU has RDTSCP.
|
||
|
kRTM, //!< CPU has RTM.
|
||
|
kSERIALIZE, //!< CPU has SERIALIZE.
|
||
|
kSHA, //!< CPU has SHA (SHA-1 and SHA-256 instructions).
|
||
|
kSKINIT, //!< CPU has SKINIT (SKINIT/STGI instructions) [AMD].
|
||
|
kSMAP, //!< CPU has SMAP (supervisor-mode access prevention).
|
||
|
kSMEP, //!< CPU has SMEP (supervisor-mode execution prevention).
|
||
|
kSMX, //!< CPU has SMX (safer mode extensions).
|
||
|
kSNP, //!< CPU has SNP.
|
||
|
kSSE, //!< CPU has SSE.
|
||
|
kSSE2, //!< CPU has SSE2.
|
||
|
kSSE3, //!< CPU has SSE3.
|
||
|
kSSE4_1, //!< CPU has SSE4.1.
|
||
|
kSSE4_2, //!< CPU has SSE4.2.
|
||
|
kSSE4A, //!< CPU has SSE4A [AMD].
|
||
|
kSSSE3, //!< CPU has SSSE3.
|
||
|
kSVM, //!< CPU has SVM (virtualization) [AMD].
|
||
|
kTBM, //!< CPU has TBM (trailing bit manipulation) [AMD].
|
||
|
kTSX, //!< CPU has TSX.
|
||
|
kTSXLDTRK, //!< CPU has TSXLDTRK.
|
||
|
kUINTR, //!< CPU has UINTR (user interrupts).
|
||
|
kVAES, //!< CPU has VAES (vector AES 256|512 bit support).
|
||
|
kVMX, //!< CPU has VMX (virtualization) [INTEL].
|
||
|
kVPCLMULQDQ, //!< CPU has VPCLMULQDQ (vector PCLMULQDQ 256|512-bit support).
|
||
|
kWAITPKG, //!< CPU has WAITPKG (UMONITOR, UMWAIT, TPAUSE).
|
||
|
kWBNOINVD, //!< CPU has WBNOINVD.
|
||
|
kXOP, //!< CPU has XOP (XOP instructions) [AMD].
|
||
|
kXSAVE, //!< CPU has XSAVE.
|
||
|
kXSAVEC, //!< CPU has XSAVEC.
|
||
|
kXSAVEOPT, //!< CPU has XSAVEOPT.
|
||
|
kXSAVES, //!< CPU has XSAVES.
|
||
|
|
||
|
// @EnumValuesEnd@
|
||
|
|
||
|
kCount //!< Count of X86 CPU features.
|
||
|
};
|
||
|
|
||
|
//! \name Construction / Destruction
|
||
|
//! \{
|
||
|
|
||
|
inline Features() noexcept
|
||
|
: BaseFeatures() {}
|
||
|
|
||
|
inline Features(const Features& other) noexcept
|
||
|
: BaseFeatures(other) {}
|
||
|
|
||
|
//! \}
|
||
|
|
||
|
//! \name Overloaded Operators
|
||
|
//! \{
|
||
|
|
||
|
inline Features& operator=(const Features& other) noexcept = default;
|
||
|
|
||
|
//! \}
|
||
|
|
||
|
//! \name Accessors
|
||
|
//! \{
|
||
|
|
||
|
#define ASMJIT_X86_FEATURE(FEATURE) \
|
||
|
inline bool has##FEATURE() const noexcept { return has(k##FEATURE); }
|
||
|
|
||
|
ASMJIT_X86_FEATURE(MT)
|
||
|
ASMJIT_X86_FEATURE(NX)
|
||
|
|
||
|
ASMJIT_X86_FEATURE(3DNOW)
|
||
|
ASMJIT_X86_FEATURE(3DNOW2)
|
||
|
ASMJIT_X86_FEATURE(ADX)
|
||
|
ASMJIT_X86_FEATURE(AESNI)
|
||
|
ASMJIT_X86_FEATURE(ALTMOVCR8)
|
||
|
ASMJIT_X86_FEATURE(AMX_BF16)
|
||
|
ASMJIT_X86_FEATURE(AMX_INT8)
|
||
|
ASMJIT_X86_FEATURE(AMX_TILE)
|
||
|
ASMJIT_X86_FEATURE(AVX)
|
||
|
ASMJIT_X86_FEATURE(AVX2)
|
||
|
ASMJIT_X86_FEATURE(AVX512_4FMAPS)
|
||
|
ASMJIT_X86_FEATURE(AVX512_4VNNIW)
|
||
|
ASMJIT_X86_FEATURE(AVX512_BF16)
|
||
|
ASMJIT_X86_FEATURE(AVX512_BITALG)
|
||
|
ASMJIT_X86_FEATURE(AVX512_BW)
|
||
|
ASMJIT_X86_FEATURE(AVX512_CDI)
|
||
|
ASMJIT_X86_FEATURE(AVX512_DQ)
|
||
|
ASMJIT_X86_FEATURE(AVX512_ERI)
|
||
|
ASMJIT_X86_FEATURE(AVX512_F)
|
||
|
ASMJIT_X86_FEATURE(AVX512_IFMA)
|
||
|
ASMJIT_X86_FEATURE(AVX512_PFI)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VBMI)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VBMI2)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VL)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VNNI)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VP2INTERSECT)
|
||
|
ASMJIT_X86_FEATURE(AVX512_VPOPCNTDQ)
|
||
|
ASMJIT_X86_FEATURE(AVX_VNNI)
|
||
|
ASMJIT_X86_FEATURE(BMI)
|
||
|
ASMJIT_X86_FEATURE(BMI2)
|
||
|
ASMJIT_X86_FEATURE(CET_IBT)
|
||
|
ASMJIT_X86_FEATURE(CET_SS)
|
||
|
ASMJIT_X86_FEATURE(CLDEMOTE)
|
||
|
ASMJIT_X86_FEATURE(CLFLUSH)
|
||
|
ASMJIT_X86_FEATURE(CLFLUSHOPT)
|
||
|
ASMJIT_X86_FEATURE(CLWB)
|
||
|
ASMJIT_X86_FEATURE(CLZERO)
|
||
|
ASMJIT_X86_FEATURE(CMOV)
|
||
|
ASMJIT_X86_FEATURE(CMPXCHG16B)
|
||
|
ASMJIT_X86_FEATURE(CMPXCHG8B)
|
||
|
ASMJIT_X86_FEATURE(ENCLV)
|
||
|
ASMJIT_X86_FEATURE(ENQCMD)
|
||
|
ASMJIT_X86_FEATURE(ERMS)
|
||
|
ASMJIT_X86_FEATURE(F16C)
|
||
|
ASMJIT_X86_FEATURE(FMA)
|
||
|
ASMJIT_X86_FEATURE(FMA4)
|
||
|
ASMJIT_X86_FEATURE(FPU)
|
||
|
ASMJIT_X86_FEATURE(FSGSBASE)
|
||
|
ASMJIT_X86_FEATURE(FXSR)
|
||
|
ASMJIT_X86_FEATURE(FXSROPT)
|
||
|
ASMJIT_X86_FEATURE(GEODE)
|
||
|
ASMJIT_X86_FEATURE(GFNI)
|
||
|
ASMJIT_X86_FEATURE(HLE)
|
||
|
ASMJIT_X86_FEATURE(HRESET)
|
||
|
ASMJIT_X86_FEATURE(I486)
|
||
|
ASMJIT_X86_FEATURE(LAHFSAHF)
|
||
|
ASMJIT_X86_FEATURE(LWP)
|
||
|
ASMJIT_X86_FEATURE(LZCNT)
|
||
|
ASMJIT_X86_FEATURE(MCOMMIT)
|
||
|
ASMJIT_X86_FEATURE(MMX)
|
||
|
ASMJIT_X86_FEATURE(MMX2)
|
||
|
ASMJIT_X86_FEATURE(MONITOR)
|
||
|
ASMJIT_X86_FEATURE(MONITORX)
|
||
|
ASMJIT_X86_FEATURE(MOVBE)
|
||
|
ASMJIT_X86_FEATURE(MOVDIR64B)
|
||
|
ASMJIT_X86_FEATURE(MOVDIRI)
|
||
|
ASMJIT_X86_FEATURE(MPX)
|
||
|
ASMJIT_X86_FEATURE(MSR)
|
||
|
ASMJIT_X86_FEATURE(MSSE)
|
||
|
ASMJIT_X86_FEATURE(OSXSAVE)
|
||
|
ASMJIT_X86_FEATURE(PCLMULQDQ)
|
||
|
ASMJIT_X86_FEATURE(PCONFIG)
|
||
|
ASMJIT_X86_FEATURE(POPCNT)
|
||
|
ASMJIT_X86_FEATURE(PREFETCHW)
|
||
|
ASMJIT_X86_FEATURE(PREFETCHWT1)
|
||
|
ASMJIT_X86_FEATURE(PTWRITE)
|
||
|
ASMJIT_X86_FEATURE(RDPID)
|
||
|
ASMJIT_X86_FEATURE(RDPRU)
|
||
|
ASMJIT_X86_FEATURE(RDRAND)
|
||
|
ASMJIT_X86_FEATURE(RDSEED)
|
||
|
ASMJIT_X86_FEATURE(RDTSC)
|
||
|
ASMJIT_X86_FEATURE(RDTSCP)
|
||
|
ASMJIT_X86_FEATURE(RTM)
|
||
|
ASMJIT_X86_FEATURE(SERIALIZE)
|
||
|
ASMJIT_X86_FEATURE(SHA)
|
||
|
ASMJIT_X86_FEATURE(SKINIT)
|
||
|
ASMJIT_X86_FEATURE(SMAP)
|
||
|
ASMJIT_X86_FEATURE(SMEP)
|
||
|
ASMJIT_X86_FEATURE(SMX)
|
||
|
ASMJIT_X86_FEATURE(SNP)
|
||
|
ASMJIT_X86_FEATURE(SSE)
|
||
|
ASMJIT_X86_FEATURE(SSE2)
|
||
|
ASMJIT_X86_FEATURE(SSE3)
|
||
|
ASMJIT_X86_FEATURE(SSSE3)
|
||
|
ASMJIT_X86_FEATURE(SSE4A)
|
||
|
ASMJIT_X86_FEATURE(SSE4_1)
|
||
|
ASMJIT_X86_FEATURE(SSE4_2)
|
||
|
ASMJIT_X86_FEATURE(SVM)
|
||
|
ASMJIT_X86_FEATURE(TBM)
|
||
|
ASMJIT_X86_FEATURE(TSX)
|
||
|
ASMJIT_X86_FEATURE(TSXLDTRK)
|
||
|
ASMJIT_X86_FEATURE(UINTR)
|
||
|
ASMJIT_X86_FEATURE(XSAVE)
|
||
|
ASMJIT_X86_FEATURE(XSAVEC)
|
||
|
ASMJIT_X86_FEATURE(XSAVEOPT)
|
||
|
ASMJIT_X86_FEATURE(XSAVES)
|
||
|
ASMJIT_X86_FEATURE(VAES)
|
||
|
ASMJIT_X86_FEATURE(VMX)
|
||
|
ASMJIT_X86_FEATURE(VPCLMULQDQ)
|
||
|
ASMJIT_X86_FEATURE(WAITPKG)
|
||
|
ASMJIT_X86_FEATURE(WBNOINVD)
|
||
|
ASMJIT_X86_FEATURE(XOP)
|
||
|
|
||
|
#undef ASMJIT_X86_FEATURE
|
||
|
|
||
|
//! \}
|
||
|
};
|
||
|
|
||
|
//! \}
|
||
|
|
||
|
ASMJIT_END_SUB_NAMESPACE
|
||
|
|
||
|
#endif // ASMJIT_X86_X86FEATURES_H_INCLUDED
|