|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef ASMJIT_X86_X86INSTDB_H_INCLUDED
|
|
|
#define ASMJIT_X86_X86INSTDB_H_INCLUDED
|
|
|
|
|
|
#include "../x86/x86globals.h"
|
|
|
|
|
|
ASMJIT_BEGIN_SUB_NAMESPACE(x86)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace InstDB {
|
|
|
|
|
|
|
|
|
enum class Mode : uint8_t {
|
|
|
|
|
|
kNone = 0x00u,
|
|
|
|
|
|
kX86 = 0x01u,
|
|
|
|
|
|
kX64 = 0x02u,
|
|
|
|
|
|
kAny = 0x03u
|
|
|
};
|
|
|
ASMJIT_DEFINE_ENUM_FLAGS(Mode)
|
|
|
|
|
|
|
|
|
static ASMJIT_INLINE_NODEBUG constexpr Mode modeFromArch(Arch arch) noexcept {
|
|
|
return arch == Arch::kX86 ? Mode::kX86 :
|
|
|
arch == Arch::kX64 ? Mode::kX64 : Mode::kNone;
|
|
|
}
|
|
|
|
|
|
|
|
|
enum class OpFlags : uint64_t {
|
|
|
|
|
|
kNone = 0u,
|
|
|
|
|
|
kRegGpbLo = 0x0000000000000001u,
|
|
|
kRegGpbHi = 0x0000000000000002u,
|
|
|
kRegGpw = 0x0000000000000004u,
|
|
|
kRegGpd = 0x0000000000000008u,
|
|
|
kRegGpq = 0x0000000000000010u,
|
|
|
kRegXmm = 0x0000000000000020u,
|
|
|
kRegYmm = 0x0000000000000040u,
|
|
|
kRegZmm = 0x0000000000000080u,
|
|
|
kRegMm = 0x0000000000000100u,
|
|
|
kRegKReg = 0x0000000000000200u,
|
|
|
kRegSReg = 0x0000000000000400u,
|
|
|
kRegCReg = 0x0000000000000800u,
|
|
|
kRegDReg = 0x0000000000001000u,
|
|
|
kRegSt = 0x0000000000002000u,
|
|
|
kRegBnd = 0x0000000000004000u,
|
|
|
kRegTmm = 0x0000000000008000u,
|
|
|
kRegMask = 0x000000000000FFFFu,
|
|
|
|
|
|
kMemUnspecified = 0x0000000000040000u,
|
|
|
kMem8 = 0x0000000000080000u,
|
|
|
kMem16 = 0x0000000000100000u,
|
|
|
kMem32 = 0x0000000000200000u,
|
|
|
kMem48 = 0x0000000000400000u,
|
|
|
kMem64 = 0x0000000000800000u,
|
|
|
kMem80 = 0x0000000001000000u,
|
|
|
kMem128 = 0x0000000002000000u,
|
|
|
kMem256 = 0x0000000004000000u,
|
|
|
kMem512 = 0x0000000008000000u,
|
|
|
kMem1024 = 0x0000000010000000u,
|
|
|
kMemMask = 0x000000001FFC0000u,
|
|
|
|
|
|
kVm32x = 0x0000000040000000u,
|
|
|
kVm32y = 0x0000000080000000u,
|
|
|
kVm32z = 0x0000000100000000u,
|
|
|
kVm64x = 0x0000000200000000u,
|
|
|
kVm64y = 0x0000000400000000u,
|
|
|
kVm64z = 0x0000000800000000u,
|
|
|
kVmMask = 0x0000000FC0000000u,
|
|
|
|
|
|
kImmI4 = 0x0000001000000000u,
|
|
|
kImmU4 = 0x0000002000000000u,
|
|
|
kImmI8 = 0x0000004000000000u,
|
|
|
kImmU8 = 0x0000008000000000u,
|
|
|
kImmI16 = 0x0000010000000000u,
|
|
|
kImmU16 = 0x0000020000000000u,
|
|
|
kImmI32 = 0x0000040000000000u,
|
|
|
kImmU32 = 0x0000080000000000u,
|
|
|
kImmI64 = 0x0000100000000000u,
|
|
|
kImmU64 = 0x0000200000000000u,
|
|
|
kImmMask = 0x00003FF000000000u,
|
|
|
|
|
|
kRel8 = 0x0000400000000000u,
|
|
|
kRel32 = 0x0000800000000000u,
|
|
|
kRelMask = 0x0000C00000000000u,
|
|
|
|
|
|
kFlagMemBase = 0x0001000000000000u,
|
|
|
kFlagMemDs = 0x0002000000000000u,
|
|
|
kFlagMemEs = 0x0004000000000000u,
|
|
|
|
|
|
kFlagMib = 0x0008000000000000u,
|
|
|
kFlagTMem = 0x0010000000000000u,
|
|
|
|
|
|
kFlagImplicit = 0x0080000000000000u,
|
|
|
kFlagMask = 0x009F000000000000u,
|
|
|
|
|
|
|
|
|
kOpMask = kRegMask | kMemMask | kVmMask | kImmMask | kRelMask
|
|
|
};
|
|
|
ASMJIT_DEFINE_ENUM_FLAGS(OpFlags)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct OpSignature {
|
|
|
|
|
|
|
|
|
|
|
|
uint64_t _flags : 56;
|
|
|
uint64_t _regMask : 8;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline OpFlags flags() const noexcept { return (OpFlags)_flags; }
|
|
|
|
|
|
|
|
|
inline bool hasFlag(OpFlags flag) const noexcept { return (_flags & uint64_t(flag)) != 0; }
|
|
|
|
|
|
|
|
|
inline bool hasReg() const noexcept { return hasFlag(OpFlags::kRegMask); }
|
|
|
|
|
|
inline bool hasMem() const noexcept { return hasFlag(OpFlags::kMemMask); }
|
|
|
|
|
|
inline bool hasVm() const noexcept { return hasFlag(OpFlags::kVmMask); }
|
|
|
|
|
|
inline bool hasImm() const noexcept { return hasFlag(OpFlags::kImmMask); }
|
|
|
|
|
|
inline bool hasRel() const noexcept { return hasFlag(OpFlags::kRelMask); }
|
|
|
|
|
|
|
|
|
inline bool isImplicit() const noexcept { return hasFlag(OpFlags::kFlagImplicit); }
|
|
|
|
|
|
|
|
|
inline RegMask regMask() const noexcept { return _regMask; }
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
ASMJIT_VARAPI const OpSignature _opSignatureTable[];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct InstSignature {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t _opCount : 3;
|
|
|
|
|
|
uint8_t _mode : 2;
|
|
|
|
|
|
uint8_t _implicitOpCount : 3;
|
|
|
|
|
|
uint8_t _reserved;
|
|
|
|
|
|
uint8_t _opSignatureIndexes[Globals::kMaxOpCount];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline Mode mode() const noexcept { return (Mode)_mode; }
|
|
|
|
|
|
inline bool supportsMode(Mode mode) const noexcept { return (uint8_t(_mode) & uint8_t(mode)) != 0; }
|
|
|
|
|
|
|
|
|
inline uint32_t opCount() const noexcept { return _opCount; }
|
|
|
|
|
|
inline uint32_t implicitOpCount() const noexcept { return _implicitOpCount; }
|
|
|
|
|
|
inline bool hasImplicitOperands() const noexcept { return _implicitOpCount != 0; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inline const uint8_t* opSignatureIndexes() const noexcept { return _opSignatureIndexes; }
|
|
|
|
|
|
|
|
|
inline uint8_t opSignatureIndex(size_t index) const noexcept {
|
|
|
ASMJIT_ASSERT(index < Globals::kMaxOpCount);
|
|
|
return _opSignatureIndexes[index];
|
|
|
}
|
|
|
|
|
|
|
|
|
inline const OpSignature& opSignature(size_t index) const noexcept {
|
|
|
ASMJIT_ASSERT(index < Globals::kMaxOpCount);
|
|
|
return _opSignatureTable[_opSignatureIndexes[index]];
|
|
|
}
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
ASMJIT_VARAPI const InstSignature _instSignatureTable[];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
enum class InstFlags : uint32_t {
|
|
|
|
|
|
kNone = 0x00000000u,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kFpu = 0x00000100u,
|
|
|
|
|
|
kMmx = 0x00000200u,
|
|
|
|
|
|
kVec = 0x00000400u,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kFpuM16 = 0x00000800u,
|
|
|
|
|
|
kFpuM32 = 0x00001000u,
|
|
|
|
|
|
kFpuM64 = 0x00002000u,
|
|
|
|
|
|
kFpuM80 = 0x00000800u,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kRep = 0x00004000u,
|
|
|
|
|
|
kRepIgnored = 0x00008000u,
|
|
|
|
|
|
kLock = 0x00010000u,
|
|
|
|
|
|
kXAcquire = 0x00020000u,
|
|
|
|
|
|
kXRelease = 0x00040000u,
|
|
|
|
|
|
kMib = 0x00080000u,
|
|
|
|
|
|
kVsib = 0x00100000u,
|
|
|
|
|
|
kTsib = 0x00200000u,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kVex = 0x00400000u,
|
|
|
|
|
|
kEvex = 0x00800000u,
|
|
|
|
|
|
kPreferEvex = 0x01000000u,
|
|
|
|
|
|
kEvexCompat = 0x02000000u,
|
|
|
|
|
|
kEvexKReg = 0x04000000u,
|
|
|
|
|
|
kEvexTwoOp = 0x08000000u,
|
|
|
|
|
|
kEvexTransformable = 0x10000000u,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
kConsecutiveRegs = 0x20000000u
|
|
|
};
|
|
|
ASMJIT_DEFINE_ENUM_FLAGS(InstFlags)
|
|
|
|
|
|
|
|
|
enum class Avx512Flags : uint32_t {
|
|
|
|
|
|
kNone = 0,
|
|
|
|
|
|
|
|
|
k_ = 0x00000000u,
|
|
|
|
|
|
kK = 0x00000001u,
|
|
|
|
|
|
kZ = 0x00000002u,
|
|
|
|
|
|
kER = 0x00000004u,
|
|
|
|
|
|
kSAE = 0x00000008u,
|
|
|
|
|
|
kB16 = 0x00000010u,
|
|
|
|
|
|
kB32 = 0x00000020u,
|
|
|
|
|
|
kB64 = 0x00000040u,
|
|
|
|
|
|
kT4X = 0x00000080u,
|
|
|
|
|
|
|
|
|
kImplicitZ = 0x00000100,
|
|
|
};
|
|
|
ASMJIT_DEFINE_ENUM_FLAGS(Avx512Flags)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct CommonInfo {
|
|
|
|
|
|
uint32_t _flags;
|
|
|
|
|
|
uint32_t _avx512Flags : 11;
|
|
|
|
|
|
uint32_t _iSignatureIndex : 11;
|
|
|
|
|
|
uint32_t _iSignatureCount : 5;
|
|
|
|
|
|
uint32_t _controlFlow : 3;
|
|
|
|
|
|
uint32_t _sameRegHint : 2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return (InstFlags)_flags; }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return Support::test(_flags, flag); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return (Avx512Flags)_avx512Flags; }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return Support::test(_avx512Flags, flag); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return hasFlag(InstFlags::kFpu); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return hasFlag(InstFlags::kMmx); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return hasFlag(InstFlags::kVec); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return (flags() & (InstFlags::kVec | InstFlags::kVex | InstFlags::kEvex)) == InstFlags::kVec; }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return isVec() && isVexOrEvex(); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return hasFlag(InstFlags::kLock); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return hasFlag(InstFlags::kRep); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return hasFlag(InstFlags::kXAcquire); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return hasFlag(InstFlags::kXRelease); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return hasFlag(InstFlags::kRepIgnored); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isTsibOp() const noexcept { return hasFlag(InstFlags::kTsib); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool preferEvex() const noexcept { return hasFlag(InstFlags::kPreferEvex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG uint32_t broadcastSize() const noexcept {
|
|
|
constexpr uint32_t kShift = Support::ConstCTZ<uint32_t(Avx512Flags::kB16)>::value;
|
|
|
return (uint32_t(_avx512Flags) & uint32_t(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64)) >> (kShift - 1);
|
|
|
}
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return _iSignatureIndex; }
|
|
|
ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return _iSignatureCount; }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return _instSignatureTable + _iSignatureIndex; }
|
|
|
ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return _instSignatureTable + _iSignatureIndex + _iSignatureCount; }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return (InstControlFlow)_controlFlow; }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return (InstSameRegHint)_sameRegHint; }
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
ASMJIT_VARAPI const CommonInfo _commonInfoTable[];
|
|
|
|
|
|
|
|
|
struct InstInfo {
|
|
|
|
|
|
uint32_t _reserved : 14;
|
|
|
|
|
|
uint32_t _commonInfoIndex : 10;
|
|
|
|
|
|
uint32_t _additionalInfoIndex : 8;
|
|
|
|
|
|
|
|
|
uint8_t _encoding;
|
|
|
|
|
|
uint8_t _mainOpcodeValue;
|
|
|
|
|
|
uint8_t _mainOpcodeIndex;
|
|
|
|
|
|
uint8_t _altOpcodeIndex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG const CommonInfo& commonInfo() const noexcept { return _commonInfoTable[_commonInfoIndex]; }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstFlags flags() const noexcept { return commonInfo().flags(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasFlag(InstFlags flag) const noexcept { return commonInfo().hasFlag(flag); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG Avx512Flags avx512Flags() const noexcept { return commonInfo().avx512Flags(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512Flag(Avx512Flags flag) const noexcept { return commonInfo().hasAvx512Flag(flag); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isFpu() const noexcept { return commonInfo().isFpu(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isMmx() const noexcept { return commonInfo().isMmx(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVec() const noexcept { return commonInfo().isVec(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isSse() const noexcept { return commonInfo().isSse(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isAvx() const noexcept { return commonInfo().isAvx(); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasLockPrefix() const noexcept { return commonInfo().hasLockPrefix(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasRepPrefix() const noexcept { return commonInfo().hasRepPrefix(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasXAcquirePrefix() const noexcept { return commonInfo().hasXAcquirePrefix(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasXReleasePrefix() const noexcept { return commonInfo().hasXReleasePrefix(); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isRepIgnored() const noexcept { return commonInfo().isRepIgnored(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isMibOp() const noexcept { return hasFlag(InstFlags::kMib); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVsibOp() const noexcept { return hasFlag(InstFlags::kVsib); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVex() const noexcept { return hasFlag(InstFlags::kVex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvex() const noexcept { return hasFlag(InstFlags::kEvex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isVexOrEvex() const noexcept { return hasFlag(InstFlags::kVex | InstFlags::kEvex); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexCompatible() const noexcept { return hasFlag(InstFlags::kEvexCompat); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexKRegOnly() const noexcept { return hasFlag(InstFlags::kEvexKReg); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexTwoOpOnly() const noexcept { return hasFlag(InstFlags::kEvexTwoOp); }
|
|
|
ASMJIT_INLINE_NODEBUG bool isEvexTransformable() const noexcept { return hasFlag(InstFlags::kEvexTransformable); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512K() const noexcept { return hasAvx512Flag(Avx512Flags::kK); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512Z() const noexcept { return hasAvx512Flag(Avx512Flags::kZ); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512ER() const noexcept { return hasAvx512Flag(Avx512Flags::kER); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512SAE() const noexcept { return hasAvx512Flag(Avx512Flags::kSAE); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B() const noexcept { return hasAvx512Flag(Avx512Flags::kB16 | Avx512Flags::kB32 | Avx512Flags::kB64); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B16() const noexcept { return hasAvx512Flag(Avx512Flags::kB16); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B32() const noexcept { return hasAvx512Flag(Avx512Flags::kB32); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG bool hasAvx512B64() const noexcept { return hasAvx512Flag(Avx512Flags::kB64); }
|
|
|
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstControlFlow controlFlow() const noexcept { return commonInfo().controlFlow(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG InstSameRegHint sameRegHint() const noexcept { return commonInfo().sameRegHint(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG uint32_t signatureIndex() const noexcept { return commonInfo().signatureIndex(); }
|
|
|
ASMJIT_INLINE_NODEBUG uint32_t signatureCount() const noexcept { return commonInfo().signatureCount(); }
|
|
|
|
|
|
ASMJIT_INLINE_NODEBUG const InstSignature* signatureData() const noexcept { return commonInfo().signatureData(); }
|
|
|
ASMJIT_INLINE_NODEBUG const InstSignature* signatureEnd() const noexcept { return commonInfo().signatureEnd(); }
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
ASMJIT_VARAPI const InstInfo _instInfoTable[];
|
|
|
|
|
|
static inline const InstInfo& infoById(InstId instId) noexcept {
|
|
|
ASMJIT_ASSERT(Inst::isDefinedId(instId));
|
|
|
return _instInfoTable[instId];
|
|
|
}
|
|
|
|
|
|
|
|
|
static_assert(sizeof(OpSignature) == 8, "InstDB::OpSignature must be 8 bytes long");
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ASMJIT_END_SUB_NAMESPACE
|
|
|
|
|
|
#endif
|
|
|
|