Moved some hardcoded positions in tabled into template-based approach

This commit is contained in:
kobalicek
2017-02-03 17:44:58 +01:00
parent ff2bf109fc
commit 13a5105fe0

View File

@@ -32,6 +32,7 @@
// [Dependencies]
#include "../base/utils.h"
#include "../base/misc_p.h"
#include "../x86/x86inst.h"
#include "../x86/x86operand.h"
@@ -167,7 +168,7 @@ enum ODATA_ {
}
const X86Inst X86InstDB::instData[] = {
// <-----------------+------------------------+------------------+--------+------------------+--------+---------------------------------------+-------------+-------+-----------------+-----+----+
// <-----------------+--------------------+------------------+--------+------------------+--------+---------------------------------------+-------------+-------+-----------------+-----+----+
// | | Main OpCode |#0 EVEX |Alternative OpCode|#1 EVEX | | E-FLAGS | Write | | | |
// Instruction | Inst. Encoding | +--------+ +--------+ Instruction Flags +-------------+---+---+ Family Type/Idx.+NameX|ComX|
// | |#0:PP-MMM OP/O L|W|W|N|TT. |#1:PP-MMM OP/O L|W|W|N|TT. | | EF:OSZAPCDX |Idx|Cnt| | | |
@@ -3598,99 +3599,92 @@ static const X86Inst::OSignature _x86InstOSignatureData[] = {
// ----------------------------------------------------------------------------
// ${signatureData:End}
static const uint32_t _x86OpFlagFromRegType[X86Reg::kRegCount] = {
X86Inst::kOpNone, // #00 None.
X86Inst::kOpNone, // #01 Reserved (LabelTag).
X86Inst::kOpGpbLo, // #02 GPB-LO.
X86Inst::kOpGpbHi, // #03 GPB-HI.
X86Inst::kOpGpw, // #04 GPW.
X86Inst::kOpGpd, // #05 GPD.
X86Inst::kOpGpq, // #06 GPQ.
X86Inst::kOpNone, // #07 Reserved (VEC32).
X86Inst::kOpNone, // #08 Reserved (VEC64).
X86Inst::kOpXmm, // #09 XMM.
X86Inst::kOpYmm, // #10 YMM.
X86Inst::kOpZmm, // #11 ZMM.
X86Inst::kOpNone, // #12 Reserved (VEC1024).
X86Inst::kOpNone, // #13 Reserved (VEC2048).
X86Inst::kOpNone, // #14 RIP.
X86Inst::kOpSeg, // #15 SEG.
X86Inst::kOpFp, // #16 FP.
X86Inst::kOpMm, // #17 MM.
X86Inst::kOpK, // #18 K.
X86Inst::kOpBnd, // #20 BND.
X86Inst::kOpCr, // #21 CR.
X86Inst::kOpDr // #22 DR.
template<uint32_t RegType>
struct X86OpTypeFromRegTypeT {
enum {
kValue = (RegType == X86Reg::kRegGpbLo) ? X86Inst::kOpGpbLo :
(RegType == X86Reg::kRegGpbHi) ? X86Inst::kOpGpbHi :
(RegType == X86Reg::kRegGpw ) ? X86Inst::kOpGpw :
(RegType == X86Reg::kRegGpd ) ? X86Inst::kOpGpd :
(RegType == X86Reg::kRegGpq ) ? X86Inst::kOpGpq :
(RegType == X86Reg::kRegXmm ) ? X86Inst::kOpXmm :
(RegType == X86Reg::kRegYmm ) ? X86Inst::kOpYmm :
(RegType == X86Reg::kRegZmm ) ? X86Inst::kOpZmm :
(RegType == X86Reg::kRegRip ) ? X86Inst::kOpNone :
(RegType == X86Reg::kRegSeg ) ? X86Inst::kOpSeg :
(RegType == X86Reg::kRegFp ) ? X86Inst::kOpFp :
(RegType == X86Reg::kRegMm ) ? X86Inst::kOpMm :
(RegType == X86Reg::kRegK ) ? X86Inst::kOpK :
(RegType == X86Reg::kRegBnd ) ? X86Inst::kOpBnd :
(RegType == X86Reg::kRegCr ) ? X86Inst::kOpCr :
(RegType == X86Reg::kRegDr ) ? X86Inst::kOpDr : X86Inst::kOpNone
};
};
template<uint32_t RegType>
struct X86RegMaskFromRegTypeT {
enum {
kMask = (RegType == X86Reg::kRegGpbLo) ? 0x0000000FU :
(RegType == X86Reg::kRegGpbHi) ? 0x0000000FU :
(RegType == X86Reg::kRegGpw ) ? 0x000000FFU :
(RegType == X86Reg::kRegGpd ) ? 0x000000FFU :
(RegType == X86Reg::kRegGpq ) ? 0x000000FFU :
(RegType == X86Reg::kRegXmm ) ? 0x000000FFU :
(RegType == X86Reg::kRegYmm ) ? 0x000000FFU :
(RegType == X86Reg::kRegZmm ) ? 0x000000FFU :
(RegType == X86Reg::kRegRip ) ? 0x00000001U :
(RegType == X86Reg::kRegSeg ) ? 0x0000007EU : // [ES|CS|SS|DS|FS|GS]
(RegType == X86Reg::kRegFp ) ? 0x000000FFU :
(RegType == X86Reg::kRegMm ) ? 0x000000FFU :
(RegType == X86Reg::kRegK ) ? 0x000000FFU :
(RegType == X86Reg::kRegBnd ) ? 0x0000000FU :
(RegType == X86Reg::kRegCr ) ? 0x000000FFU :
(RegType == X86Reg::kRegDr ) ? 0x000000FFU : X86Inst::kOpNone
};
};
template<uint32_t RegType>
struct X64RegMaskFromRegTypeT {
enum {
kMask = (RegType == X86Reg::kRegGpbLo) ? 0x0000FFFFU :
(RegType == X86Reg::kRegGpbHi) ? 0x0000000FU :
(RegType == X86Reg::kRegGpw ) ? 0x0000FFFFU :
(RegType == X86Reg::kRegGpd ) ? 0x0000FFFFU :
(RegType == X86Reg::kRegGpq ) ? 0x0000FFFFU :
(RegType == X86Reg::kRegXmm ) ? 0xFFFFFFFFU :
(RegType == X86Reg::kRegYmm ) ? 0xFFFFFFFFU :
(RegType == X86Reg::kRegZmm ) ? 0xFFFFFFFFU :
(RegType == X86Reg::kRegRip ) ? 0x00000001U :
(RegType == X86Reg::kRegSeg ) ? 0x0000007EU : // [ES|CS|SS|DS|FS|GS]
(RegType == X86Reg::kRegFp ) ? 0x000000FFU :
(RegType == X86Reg::kRegMm ) ? 0x000000FFU :
(RegType == X86Reg::kRegK ) ? 0x000000FFU :
(RegType == X86Reg::kRegBnd ) ? 0x0000000FU :
(RegType == X86Reg::kRegCr ) ? 0x0000FFFFU :
(RegType == X86Reg::kRegDr ) ? 0x0000FFFFU : X86Inst::kOpNone
};
};
struct X86ValidationData {
//! Allowed registers by reg-type (X86::kReg...).
uint32_t allowedRegMask[X86Reg::kRegCount];
uint32_t allowedRegMask[X86Reg::kRegMax + 1];
uint32_t allowedMemBaseRegs;
uint32_t allowedMemIndexRegs;
};
static const X86ValidationData _x86ValidationData = {
{
0x00000000U, // #00 None.
0x00000000U, // #01 Reserved (LabelTag).
0x0000000FU, // #02 GPB-LO.
0x0000000FU, // #03 GPB-HI.
0x000000FFU, // #04 GPW.
0x000000FFU, // #05 GPD.
0x000000FFU, // #06 GPQ.
0x00000000U, // #07 Reserved (VEC32).
0x00000000U, // #08 Reserved (VEC64).
0x000000FFU, // #09 XMM.
0x000000FFU, // #10 YMM.
0x000000FFU, // #11 ZMM.
0x00000000U, // #12 Reserved (VEC1024).
0x00000000U, // #13 Reserved (VEC2048).
0x00000001U, // #14 RIP.
0x0000007EU, // #15 SEG (ES|CS|SS|DS|FS|GS).
0x000000FFU, // #16 FP.
0x000000FFU, // #17 MM.
0x000000FFU, // #18 K.
0x0000000FU, // #19 BND
0x000000FFU, // #20 CR.
0x000000FFU // #21 DR.
},
static const uint32_t _x86OpFlagFromRegType[X86Reg::kRegMax + 1] = {
ASMJIT_TABLE_T_32(X86OpTypeFromRegTypeT, kValue, 0)
};
// AllowedMemBaseRegs:
static const X86ValidationData _x86ValidationData = {
{ ASMJIT_TABLE_T_32(X86RegMaskFromRegTypeT, kMask, 0) },
(1U << X86Reg::kRegGpw) | (1U << X86Reg::kRegGpd) | (1U << X86Reg::kRegRip) | (1U << Label::kLabelTag),
// AllowedMemIndexRegs:
(1U << X86Reg::kRegGpw) | (1U << X86Reg::kRegGpd) | (1U << X86Reg::kRegXmm) | (1U << X86Reg::kRegYmm) | (1U << X86Reg::kRegZmm)
};
static const X86ValidationData _x64ValidationData = {
{
0x00000000U, // #00 None.
0x00000000U, // #01 Reserved (LabelTag).
0x0000FFFFU, // #02 GPB-LO.
0x0000000FU, // #03 GPB-HI.
0x0000FFFFU, // #04 GPW.
0x0000FFFFU, // #05 GPD.
0x0000FFFFU, // #06 GPQ.
0x00000000U, // #07 Reserved (VEC32).
0x00000000U, // #08 Reserved (VEC64).
0xFFFFFFFFU, // #09 XMM (16 base regs, 32 regs only with EVEX encoding).
0xFFFFFFFFU, // #10 YMM (16 base regs, 32 regs only with EVEX encoding).
0xFFFFFFFFU, // #11 ZMM (16 base regs, 32 regs only with EVEX encoding).
0x00000000U, // #12 Reserved (VEC1024).
0x00000000U, // #13 Reserved (VEC2048).
0x00000001U, // #14 RIP.
0x0000007EU, // #15 SEG (FS|GS) (ES|CS|SS|DS defined, but ignored).
0x000000FFU, // #16 FP.
0x000000FFU, // #17 MM.
0x000000FFU, // #18 K.
0x0000000FU, // #19 BND.
0x0000FFFFU, // #20 CR.
0x0000FFFFU // #21 DR.
},
// AllowedMemBaseRegs:
{ ASMJIT_TABLE_T_32(X64RegMaskFromRegTypeT, kMask, 0) },
(1U << X86Reg::kRegGpd) | (1U << X86Reg::kRegGpq) | (1U << X86Reg::kRegRip) | (1U << Label::kLabelTag),
// AllowedMemIndexRegs:
(1U << X86Reg::kRegGpd) | (1U << X86Reg::kRegGpq) | (1U << X86Reg::kRegXmm) | (1U << X86Reg::kRegYmm) | (1U << X86Reg::kRegZmm)
};