VirtualBox

Changeset 105806 in vbox


Ignore:
Timestamp:
Aug 22, 2024 7:36:59 AM (5 weeks ago)
Author:
vboxsync
Message:

Disassembler/ARMv8: Rework the disassembler tables to allow for an arbitrary number of decode steps and make the tables a bit more compact, bugref:10394

Location:
trunk/src/VBox/Disassembler
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmCore-armv8.cpp

    r105796 r105806  
    537537
    538538    int rc = VINF_SUCCESS;
    539     for (uint32_t i = 0; i < RT_ELEMENTS(pInsnClass->aParms) && RT_SUCCESS(rc); i++)
    540     {
    541         PCDISARMV8INSNPARAM pInsnParm = &pInsnClass->aParms[i];
    542         if (pInsnParm->idxParse != kDisParmParseNop)
    543             rc = g_apfnDisasm[pInsnClass->aParms[i].idxParse](pDis, u32Insn, pInsnClass,
    544                                                                 pInsnParm->idxParam != DIS_ARMV8_INSN_PARAM_UNSET
    545                                                               ? &pDis->aParams[pInsnParm->idxParam]
    546                                                               : NULL,
    547                                                               pInsnParm, &f64Bit);
    548         else
    549             break;
     539    PCDISARMV8INSNPARAM pDecode = &pInsnClass->paParms[0];
     540    while (   (pDecode->idxParse != kDisParmParseNop)
     541           && RT_SUCCESS(rc))
     542    {
     543        rc = g_apfnDisasm[pDecode->idxParse](pDis, u32Insn, pInsnClass,
     544                                               pDecode->idxParam != DIS_ARMV8_INSN_PARAM_UNSET
     545                                             ? &pDis->aParams[pDecode->idxParam]
     546                                             : NULL,
     547                                             pDecode, &f64Bit);
     548        pDecode++;
    550549    }
    551550
     
    662661        pDis->cbInstr   = sizeof(u32Insn);
    663662
    664         return disInstrArmV8DecodeWorker(pDis, u32Insn, &g_ArmV8A64DecodeL0.Hdr);
     663        return disInstrArmV8DecodeWorker(pDis, u32Insn, &g_aArmV8A64InsnDecodeL0.Hdr);
    665664    }
    666665
  • trunk/src/VBox/Disassembler/DisasmInternal-armv8.h

    r105789 r105806  
    8888typedef struct DISARMV8INSNPARAM
    8989{
    90     /** The parser to use for the parameter. */
     90    /** The parser to use for the decode step. */
    9191    DISPARMPARSEIDX     idxParse;
    9292    /** Bit index at which the field starts. */
     
    169169    /** Parameter types. */
    170170    DISARMV8OPPARM          aenmParamTypes[4];
    171     /** The decoding steps. */
    172     DISARMV8INSNPARAM       aParms[5];
     171    /** The array of decoding steps. */
     172    PCDISARMV8INSNPARAM     paParms;
    173173} DISARMV8INSNCLASS;
    174174/** Pointer to a constant instruction class descriptor. */
     
    184184
    185185#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(a_Name) \
    186     static const DISARMV8OPCODE a_Name ## Opcodes[] = {
    187 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    188                                                     a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4) \
    189     }; \
    190     static const DISARMV8INSNCLASS a_Name = { { kDisArmV8DecodeType_InsnClass, RT_ELEMENTS(a_Name ## Opcodes) }, &a_Name ## Opcodes[0],\
    191                                               a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    192                                               { a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4 }, {
    193 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    194                                                     a_enmParamType1, a_enmParamType2, a_enmParamType3) \
    195     DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    196                                                 a_enmParamType1, a_enmParamType2, a_enmParamType3, kDisArmv8OpParmNone)
    197 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    198                                                     a_enmParamType1, a_enmParamType2) \
    199     DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    200                                                 a_enmParamType1, a_enmParamType2, kDisArmv8OpParmNone)
    201 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    202                                                     a_enmParamType1) \
    203     DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    204                                                 a_enmParamType1, kDisArmv8OpParmNone)
    205 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift) \
    206     DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
    207                                                 kDisArmv8OpParmNone)
    208 
    209 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END } }
     186    static const DISARMV8OPCODE g_aArmV8A64Insn ## a_Name ## Opcodes[] = {
     187#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(a_Name) \
     188    }; \
     189    static const DISARMV8INSNPARAM g_aArmV8A64Insn ## a_Name ## Decode[] = {
     190#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_4(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     191                                                        a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4) \
     192    DIS_ARMV8_INSN_PARAM_NONE \
     193    }; \
     194    static const DISARMV8INSNCLASS g_aArmV8A64Insn ## a_Name = { { kDisArmV8DecodeType_InsnClass, \
     195                                                                   RT_ELEMENTS(g_aArmV8A64Insn ## a_Name ## Opcodes) }, \
     196                                                                 & g_aArmV8A64Insn ## a_Name ## Opcodes[0], \
     197                                                                 a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     198                                                                 { a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4 }, \
     199                                                                 & g_aArmV8A64Insn ## a_Name ## Decode[0] };
     200#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     201                                                        a_enmParamType1, a_enmParamType2, a_enmParamType3) \
     202    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_4(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     203                                                    a_enmParamType1, a_enmParamType2, a_enmParamType3, kDisArmv8OpParmNone)
     204#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     205                                                        a_enmParamType1, a_enmParamType2) \
     206    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     207                                                    a_enmParamType1, a_enmParamType2, kDisArmv8OpParmNone)
     208#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     209                                                        a_enmParamType1) \
     210    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     211                                                    a_enmParamType1, kDisArmv8OpParmNone)
     212#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_0(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift) \
     213    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(a_Name, a_fFixedInsn, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     214                                                    kDisArmv8OpParmNone)
     215
     216#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END \
     217    DIS_ARMV8_INSN_PARAM_NONE }
    210218
    211219/**
     
    226234
    227235#define DIS_ARMV8_DECODE_TBL_ENTRY_INIT(a_fMask, a_fValue, a_pNext) \
    228     { a_fMask, a_fValue, &a_pNext.Hdr }
     236    { a_fMask, a_fValue, & g_aArmV8A64Insn ## a_pNext.Hdr }
    229237
    230238
     
    244252
    245253#define DIS_ARMV8_DECODE_TBL_DEFINE_BEGIN(a_Name) \
    246     static const DISARMV8DECODETBLENTRY a_Name ## TblEnt[] = {
     254    static const DISARMV8DECODETBLENTRY g_aArmV8A64Insn ## a_Name ## TblEnt[] = {
    247255
    248256#define DIS_ARMV8_DECODE_TBL_DEFINE_END(a_Name) \
    249257    }; \
    250     static const DISARMV8DECODETBL a_Name = { { kDisArmV8DecodeType_Table, RT_ELEMENTS(a_Name ## TblEnt) }, &a_Name ## TblEnt[0] }
     258    static const DISARMV8DECODETBL g_aArmV8A64Insn ## a_Name = { { kDisArmV8DecodeType_Table, RT_ELEMENTS(g_aArmV8A64Insn ## a_Name ## TblEnt) }, \
     259                                                                 & g_aArmV8A64Insn ## a_Name ## TblEnt[0] }
    251260
    252261
     
    269278
    270279#define DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(a_Name) \
    271     static const PCDISARMV8DECODEHDR a_Name ## MapHdrs[] = {
     280    static const PCDISARMV8DECODEHDR g_aArmV8A64Insn ## a_Name ## MapHdrs[] = {
    272281
    273282#define DIS_ARMV8_DECODE_MAP_DEFINE_END(a_Name, a_fMask, a_cShift) \
    274283    }; \
    275     static const DISARMV8DECODEMAP a_Name = { { kDisArmV8DecodeType_Map, RT_ELEMENTS(a_Name ## MapHdrs) }, a_fMask, a_cShift, &a_Name ## MapHdrs[0] }
     284    static const DISARMV8DECODEMAP g_aArmV8A64Insn ## a_Name = { { kDisArmV8DecodeType_Map, RT_ELEMENTS(g_aArmV8A64Insn ## a_Name ## MapHdrs) }, \
     285                                                                 a_fMask, a_cShift, & g_aArmV8A64Insn ## a_Name ## MapHdrs[0] }
    276286
    277287#define DIS_ARMV8_DECODE_MAP_DEFINE_END_NON_STATIC(a_Name, a_fMask, a_cShift) \
    278288    }; \
    279     DECL_HIDDEN_CONST(DISARMV8DECODEMAP) a_Name = { { kDisArmV8DecodeType_Map, RT_ELEMENTS(a_Name ## MapHdrs) }, a_fMask, a_cShift, &a_Name ## MapHdrs[0] }
     289    DECL_HIDDEN_CONST(DISARMV8DECODEMAP) g_aArmV8A64Insn ## a_Name = { { kDisArmV8DecodeType_Map, RT_ELEMENTS(g_aArmV8A64Insn ## a_Name ## MapHdrs) }, \
     290                                                                       a_fMask, a_cShift, & g_aArmV8A64Insn ## a_Name ## MapHdrs[0] }
    280291
    281292#define DIS_ARMV8_DECODE_MAP_INVALID_ENTRY NULL
    282 #define DIS_ARMV8_DECODE_MAP_ENTRY(a_Next) &a_Next.Hdr
     293#define DIS_ARMV8_DECODE_MAP_ENTRY(a_Next) & g_aArmV8A64Insn ## a_Next.Hdr
    283294
    284295
     
    287298extern DECL_HIDDEN_DATA(DISOPCODE) g_ArmV8A64InvalidOpcode[1];
    288299
    289 extern DECL_HIDDEN_DATA(DISARMV8DECODEMAP) g_ArmV8A64DecodeL0;
     300extern DECL_HIDDEN_DATA(DISARMV8DECODEMAP) g_aArmV8A64InsnDecodeL0;
    290301/** @} */
    291302
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64.cpp

    r105793 r105806  
    5858
    5959/* UDF */
    60 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnRsvd)
     60DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Rsvd)
    6161    DIS_ARMV8_OP(0x00000000, "udf" ,            OP_ARMV8_A64_UDF,       DISOPTYPE_INVALID)
    62 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_aArmV8A64InsnRsvd, 0xffff0000 /*fFixedInsn*/, 0 /*fClass*/,
     62DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Rsvd)
     63    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,    0, 16, 0 /*idxParam*/),
     64DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(Rsvd, 0xffff0000 /*fFixedInsn*/, 0 /*fClass*/,
    6365                                            kDisArmV8OpcDecodeNop, 0xffff0000, 16,
    64                                             kDisArmv8OpParmImm)
    65     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,    0, 16, 0 /*idxParam*/),
    66     DIS_ARMV8_INSN_PARAM_NONE,
    67     DIS_ARMV8_INSN_PARAM_NONE,
    68     DIS_ARMV8_INSN_PARAM_NONE,
    69     DIS_ARMV8_INSN_PARAM_NONE
    70 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    71 
     66                                            kDisArmv8OpParmImm);
    7267
    7368/* ADR/ADRP */
    74 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Adr)
     69DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Adr)
    7570    DIS_ARMV8_OP(0x10000000, "adr" ,            OP_ARMV8_A64_ADR,       DISOPTYPE_HARMLESS),
    7671    DIS_ARMV8_OP(0x90000000, "adrp" ,           OP_ARMV8_A64_ADRP,      DISOPTYPE_HARMLESS)
    77 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Adr, 0x9f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    78                                             kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
    79                                             kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel)
     72DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Adr)
    8073    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5, 0 /*idxParam*/),
    8174    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmAdr, 0, 0, 1 /*idxParam*/),
    82     DIS_ARMV8_INSN_PARAM_NONE,
    83     DIS_ARMV8_INSN_PARAM_NONE,
    84     DIS_ARMV8_INSN_PARAM_NONE
    85 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     75DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(Adr, 0x9f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     76                                                kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
     77                                                kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel);
    8678
    8779
    8880/* ADD/ADDS/SUB/SUBS - shifted immediate variant */
    89 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64AddSubImm)
     81DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(AddSubImm)
    9082    DIS_ARMV8_OP(0x11000000, "add" ,            OP_ARMV8_A64_ADD,       DISOPTYPE_HARMLESS),
    9183    DIS_ARMV8_OP(0x31000000, "adds" ,           OP_ARMV8_A64_ADDS,      DISOPTYPE_HARMLESS),
    9284    DIS_ARMV8_OP(0x51000000, "sub" ,            OP_ARMV8_A64_SUB,       DISOPTYPE_HARMLESS),
    9385    DIS_ARMV8_OP(0x71000000, "subs" ,           OP_ARMV8_A64_SUBS,      DISOPTYPE_HARMLESS),
    94 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64AddSubImm, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    95                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    96                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
     86DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(AddSubImm)
    9787    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5, 0 /*idxParam*/),
    9888    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    5, 5, 1 /*idxParam*/),
    9989    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,  10, 12, 2 /*idxParam*/),
    10090    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSh12, 22,  1, 2 /*idxParam*/),
    101     DIS_ARMV8_INSN_PARAM_NONE
    102 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     91DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(AddSubImm, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     92                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     93                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm);
    10394
    10495
    10596/* ADD/ADDS/SUB/SUBS - shifted register variant */
    106 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnAddSubShiftReg)
     97DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(AddSubShiftReg)
    10798    DIS_ARMV8_OP(0x0b000000, "add" ,            OP_ARMV8_A64_ADD,       DISOPTYPE_HARMLESS),
    10899    DIS_ARMV8_OP(0x2b000000, "adds" ,           OP_ARMV8_A64_ADDS,      DISOPTYPE_HARMLESS),
    109100    DIS_ARMV8_OP(0x4b000000, "sub" ,            OP_ARMV8_A64_SUB,       DISOPTYPE_HARMLESS),
    110101    DIS_ARMV8_OP(0x6b000000, "subs" ,           OP_ARMV8_A64_SUBS,      DISOPTYPE_HARMLESS),
    111 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_aArmV8A64InsnAddSubShiftReg, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    112                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    113                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr)
     102DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(AddSubShiftReg)
    114103    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    115104    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    116105    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,           16,  5, 2 /*idxParam*/),
    117106    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShift,         22,  2, 2 /*idxParam*/),
    118     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/)
    119 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     107    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/),
     108DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(AddSubShiftReg, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     109                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     110                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr);
    120111
    121112
    122113/* AND/ORR/EOR/ANDS */
    123 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64LogicalImm)
     114DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LogicalImm)
    124115    DIS_ARMV8_OP(0x12000000, "and" ,            OP_ARMV8_A64_AND,       DISOPTYPE_HARMLESS),
    125116    DIS_ARMV8_OP(0x32000000, "orr" ,            OP_ARMV8_A64_ORR,       DISOPTYPE_HARMLESS),
    126117    DIS_ARMV8_OP(0x52000000, "eor" ,            OP_ARMV8_A64_EOR,       DISOPTYPE_HARMLESS),
    127118    DIS_ARMV8_OP(0x72000000, "ands" ,           OP_ARMV8_A64_ANDS,      DISOPTYPE_HARMLESS),
    128 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64LogicalImm, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    129                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    130                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
     119DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LogicalImm)
    131120    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    132121    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    133122    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmsImmrN,     10, 13, 2 /*idxParam*/),
    134     DIS_ARMV8_INSN_PARAM_NONE,
    135     DIS_ARMV8_INSN_PARAM_NONE
    136 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     123DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(LogicalImm, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     124                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     125                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm);
    137126
    138127
    139128/* MOVN/MOVZ/MOVK */
    140 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64MoveWide)
     129DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(MoveWide)
    141130    DIS_ARMV8_OP(0x12800000, "movn",            OP_ARMV8_A64_MOVN,      DISOPTYPE_HARMLESS),
    142131    INVALID_OPCODE,
    143132    DIS_ARMV8_OP(0x52800000, "movz" ,           OP_ARMV8_A64_MOVZ,      DISOPTYPE_HARMLESS),
    144133    DIS_ARMV8_OP(0x72800000, "movk" ,           OP_ARMV8_A64_MOVK,      DISOPTYPE_HARMLESS),
    145 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64MoveWide, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    146                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    147                                             kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
     134DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(MoveWide)
    148135    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    149136    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16, 1 /*idxParam*/),
    150137    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseHw,            21,  2, 1 /*idxParam*/),
    151     DIS_ARMV8_INSN_PARAM_NONE,
    152     DIS_ARMV8_INSN_PARAM_NONE
    153 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     138DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(MoveWide, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     139                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     140                                                kDisArmv8OpParmGpr, kDisArmv8OpParmImm);
    154141
    155142
    156143/* SBFM/BFM/UBFM */
    157 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Bitfield)
     144DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Bitfield)
    158145    DIS_ARMV8_OP(0x13000000, "sbfm",            OP_ARMV8_A64_SBFM,      DISOPTYPE_HARMLESS),
    159146    DIS_ARMV8_OP(0x33000000, "bfm",             OP_ARMV8_A64_BFM,       DISOPTYPE_HARMLESS),
    160147    DIS_ARMV8_OP(0x53000000, "ubfm",            OP_ARMV8_A64_UBFM,      DISOPTYPE_HARMLESS),
    161148    INVALID_OPCODE,
    162 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(g_ArmV8A64Bitfield, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF | DISARMV8INSNCLASS_F_N_FORCED_1_ON_64BIT,
    163                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    164                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImm)
     149DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Bitfield)
    165150    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    166151    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    167152    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  6, 2 /*idxParam*/),
    168153    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           10,  6, 3 /*idxParam*/),
    169     DIS_ARMV8_INSN_PARAM_NONE
    170 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     154DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_4(Bitfield, 0x7f800000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF | DISARMV8INSNCLASS_F_N_FORCED_1_ON_64BIT,
     155                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     156                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImm);
    171157
    172158
     
    185171 *           1  1  1 Extract
    186172 */
    187 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_aArmV8A64InsnDataProcessingImm)
    188     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64Adr),
    189     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64Adr),
    190     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64AddSubImm),
     173DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(DataProcessingImm)
     174    DIS_ARMV8_DECODE_MAP_ENTRY(Adr),
     175    DIS_ARMV8_DECODE_MAP_ENTRY(Adr),
     176    DIS_ARMV8_DECODE_MAP_ENTRY(AddSubImm),
    191177    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                 /** @todo Add/subtract immediate with tags. */
    192     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64LogicalImm),
    193     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64MoveWide),
    194     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64Bitfield),
     178    DIS_ARMV8_DECODE_MAP_ENTRY(LogicalImm),
     179    DIS_ARMV8_DECODE_MAP_ENTRY(MoveWide),
     180    DIS_ARMV8_DECODE_MAP_ENTRY(Bitfield),
    195181    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY                  /** @todo Extract */
    196 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_aArmV8A64InsnDataProcessingImm, RT_BIT_32(23) | RT_BIT_32(24) | RT_BIT_32(25),  23);
     182DIS_ARMV8_DECODE_MAP_DEFINE_END(DataProcessingImm, RT_BIT_32(23) | RT_BIT_32(24) | RT_BIT_32(25),  23);
    197183
    198184
    199185/* B.cond/BC.cond */
    200 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64CondBr)
     186DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(CondBr)
    201187    DIS_ARMV8_OP(0x54000000, "b",               OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    202188    DIS_ARMV8_OP(0x54000010, "bc" ,             OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    203 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64CondBr, 0xff000010 /*fFixedInsn*/, 0 /*fClass*/,
    204                                             kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4,
    205                                             kDisArmv8OpParmImmRel)
     189DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(CondBr)
    206190    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCond,           0,  4, DIS_ARMV8_INSN_PARAM_UNSET),
    207191    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 19, 0 /*idxParam*/),
    208     DIS_ARMV8_INSN_PARAM_NONE,
    209     DIS_ARMV8_INSN_PARAM_NONE,
    210     DIS_ARMV8_INSN_PARAM_NONE
    211 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     192DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(CondBr, 0xff000010 /*fFixedInsn*/, 0 /*fClass*/,
     193                                                kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4,
     194                                                kDisArmv8OpParmImmRel);
    212195
    213196
    214197/* SVC/HVC/SMC/BRK/HLT/TCANCEL/DCPS1/DCPS2/DCPS3 */
    215 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Excp)
     198DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Excp)
    216199    DIS_ARMV8_OP(0xd4000001, "svc",             OP_ARMV8_A64_SVC,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
    217200    DIS_ARMV8_OP(0xd4000002, "hvc",             OP_ARMV8_A64_HVC,       DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT | DISOPTYPE_PRIVILEGED),
     
    223206    DIS_ARMV8_OP(0xd4a00002, "dcps2",           OP_ARMV8_A64_DCPS2,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
    224207    DIS_ARMV8_OP(0xd4a00003, "dcps3",           OP_ARMV8_A64_DCPS3,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
    225 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64Excp, 0xffe0001f /*fFixedInsn*/, 0 /*fClass*/,
    226                                             kDisArmV8OpcDecodeLookup, 0xffe0001f, 0,
    227                                             kDisArmv8OpParmImm)
     208DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Excp)
    228209    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16, 0 /*idxParam*/),
    229     DIS_ARMV8_INSN_PARAM_NONE,
    230     DIS_ARMV8_INSN_PARAM_NONE,
    231     DIS_ARMV8_INSN_PARAM_NONE,
    232     DIS_ARMV8_INSN_PARAM_NONE
    233 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     210DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(Excp, 0xffe0001f /*fFixedInsn*/, 0 /*fClass*/,
     211                                                kDisArmV8OpcDecodeLookup, 0xffe0001f, 0,
     212                                                kDisArmv8OpParmImm);
    234213
    235214
    236215/* WFET/WFIT */
    237 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysReg)
     216DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(SysReg)
    238217    DIS_ARMV8_OP(0xd5031000, "wfet",            OP_ARMV8_A64_WFET,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
    239218    DIS_ARMV8_OP(0x54000010, "wfit" ,           OP_ARMV8_A64_WFIT,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
    240 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64SysReg, 0xffffffe0 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    241                                             kDisArmV8OpcDecodeNop, 0xfe0, 5,
    242                                             kDisArmv8OpParmGpr)
    243     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    244     DIS_ARMV8_INSN_PARAM_NONE,
    245     DIS_ARMV8_INSN_PARAM_NONE,
    246     DIS_ARMV8_INSN_PARAM_NONE,
    247     DIS_ARMV8_INSN_PARAM_NONE
    248 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     219DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(SysReg)
     220    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     221DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(SysReg, 0xffffffe0 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     222                                                kDisArmV8OpcDecodeNop, 0xfe0, 5,
     223                                                kDisArmv8OpParmGpr);
    249224
    250225
    251226/* Various hint instructions */
    252 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Hints)
     227DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Hints)
    253228    DIS_ARMV8_OP(0xd503201f, "nop",             OP_ARMV8_A64_NOP,       DISOPTYPE_HARMLESS),
    254229    DIS_ARMV8_OP(0xd503203f, "yield",           OP_ARMV8_A64_YIELD,     DISOPTYPE_HARMLESS),
     
    260235    DIS_ARMV8_OP(0xd50320ff, "xpaclri",         OP_ARMV8_A64_XPACLRI,   DISOPTYPE_HARMLESS), /* FEAT_PAuth */
    261236    /** @todo */
    262 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64Hints, 0xffffffff /*fFixedInsn*/, 0 /*fClass*/,
    263                                             kDisArmV8OpcDecodeNop, 0xfe0, 5)
    264     DIS_ARMV8_INSN_PARAM_NONE,
    265     DIS_ARMV8_INSN_PARAM_NONE,
    266     DIS_ARMV8_INSN_PARAM_NONE,
    267     DIS_ARMV8_INSN_PARAM_NONE,
    268     DIS_ARMV8_INSN_PARAM_NONE
    269 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     237DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Hints)
     238DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_0(Hints, 0xffffffff /*fFixedInsn*/, 0 /*fClass*/,
     239                                                kDisArmV8OpcDecodeNop, 0xfe0, 5);
    270240
    271241
    272242/* CLREX */
    273 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64DecBarriers)
     243DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(DecBarriers)
    274244    DIS_ARMV8_OP(0xd503304f, "clrex",           OP_ARMV8_A64_CLREX,     DISOPTYPE_HARMLESS),
    275245    DIS_ARMV8_OP(0xd50330bf, "dmb",             OP_ARMV8_A64_DMB,       DISOPTYPE_HARMLESS),
    276 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64DecBarriers, 0xfffff0ff /*fFixedInsn*/, 0 /*fClass*/,
    277                                             kDisArmV8OpcDecodeNop, RT_BIT_32(5), 5,
    278                                             kDisArmv8OpParmImm)
     246DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(DecBarriers)
    279247    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4, 0 /*idxParam*/),
    280     DIS_ARMV8_INSN_PARAM_NONE,
    281     DIS_ARMV8_INSN_PARAM_NONE,
    282     DIS_ARMV8_INSN_PARAM_NONE,
    283     DIS_ARMV8_INSN_PARAM_NONE
    284 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     248DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(DecBarriers, 0xfffff0ff /*fFixedInsn*/, 0 /*fClass*/,
     249                                                kDisArmV8OpcDecodeNop, RT_BIT_32(5), 5,
     250                                                kDisArmv8OpParmImm);
    285251
    286252
    287253/* Barrier instructions, we divide these instructions further based on the op2 field. */
    288 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64DecodeBarriers)
     254DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(DecodeBarriers)
    289255    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
    290256    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                     /** @todo DSB - Encoding */
    291     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64DecBarriers),      /* CLREX */
     257    DIS_ARMV8_DECODE_MAP_ENTRY(DecBarriers),                /* CLREX */
    292258    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                     /** @todo TCOMMIT */
    293259    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                     /** @todo DSB - Encoding */
    294     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64DecBarriers),      /* DMB */
     260    DIS_ARMV8_DECODE_MAP_ENTRY(DecBarriers),                /* DMB */
    295261    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                     /** @todo ISB */
    296262    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY                      /** @todo SB */
    297 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64DecodeBarriers, RT_BIT_32(5) | RT_BIT_32(6) | RT_BIT_32(7), 5);
     263DIS_ARMV8_DECODE_MAP_DEFINE_END(DecodeBarriers, RT_BIT_32(5) | RT_BIT_32(6) | RT_BIT_32(7), 5);
    298264
    299265
    300266/* MSR (and potentially CFINV,XAFLAG,AXFLAG) */
    301 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64PState)
    302     DIS_ARMV8_OP(0xd503305f, "msr",             OP_ARMV8_A64_MSR,       DISOPTYPE_PRIVILEGED),
    303 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64PState, 0xfffff0ff /*fFixedInsn*/, 0 /*fClass*/,
    304                                             kDisArmV8OpcDecodeNop, 0, 0,
    305                                             kDisArmv8OpParmImm, kDisArmv8OpParmNone) /** @todo */
     267DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(PState)
     268    DIS_ARMV8_OP(0xd503305f, "msr",             OP_ARMV8_A64_MSR,       DISOPTYPE_HARMLESS),
     269DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(PState)
    306270    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParsePState,         0,  0, 0 /*idxParam*/), /* This is special for the MSR instruction. */
    307271    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4, 1 /*idxParam*/), /* CRm field encodes the immediate value */
    308     DIS_ARMV8_INSN_PARAM_NONE,
    309     DIS_ARMV8_INSN_PARAM_NONE,
    310     DIS_ARMV8_INSN_PARAM_NONE
    311 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     272DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(PState, 0xfffff0ff /*fFixedInsn*/, 0 /*fClass*/,
     273                                                kDisArmV8OpcDecodeNop, 0, 0,
     274                                                kDisArmv8OpParmImm, kDisArmv8OpParmNone); /** @todo */
    312275
    313276
    314277/* TSTART/TTEST */
    315 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysResult)
     278DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(SysResult)
    316279    DIS_ARMV8_OP(0xd5233060, "tstart",          OP_ARMV8_A64_TSTART,    DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),  /* FEAT_TME */
    317280    DIS_ARMV8_OP(0xd5233160, "ttest",           OP_ARMV8_A64_TTEST,     DISOPTYPE_HARMLESS),                         /* FEAT_TME */
    318 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64SysResult, 0xfffffffe /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    319                                             kDisArmV8OpcDecodeNop, RT_BIT_32(8) | RT_BIT_32(9) | RT_BIT_32(10) | RT_BIT_32(11), 8,
    320                                             kDisArmv8OpParmGpr)
    321     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    322     DIS_ARMV8_INSN_PARAM_NONE,
    323     DIS_ARMV8_INSN_PARAM_NONE,
    324     DIS_ARMV8_INSN_PARAM_NONE,
    325     DIS_ARMV8_INSN_PARAM_NONE
    326 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     281DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(SysResult)
     282    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     283DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(SysResult, 0xfffffffe /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     284                                                kDisArmV8OpcDecodeNop, RT_BIT_32(8) | RT_BIT_32(9) | RT_BIT_32(10) | RT_BIT_32(11), 8,
     285                                                kDisArmv8OpParmGpr);
    327286
    328287
    329288/* SYS */
    330 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Sys)
     289DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Sys)
    331290    DIS_ARMV8_OP(0xd5080000, "sys",             OP_ARMV8_A64_SYS,       DISOPTYPE_HARMLESS),
    332 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64Sys, 0xfff80000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    333                                             kDisArmV8OpcDecodeNop, 0, 0) /** @todo */
     291DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Sys)
    334292    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  3, 0 /*idxParam*/),
    335293    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCRnCRm,         8,  8, 1 /*idxParam*/),
    336294    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5,  3, 2 /*idxParam*/),
    337295    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 3 /*idxParam*/),
    338     DIS_ARMV8_INSN_PARAM_NONE
    339 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     296DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_0(Sys, 0xfff80000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     297                                                kDisArmV8OpcDecodeNop, 0, 0); /** @todo */
    340298
    341299
    342300/* SYSL */
    343 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysL)
     301DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(SysL)
    344302    DIS_ARMV8_OP(0xd5280000, "sysl",            OP_ARMV8_A64_SYSL,      DISOPTYPE_HARMLESS),
    345 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64SysL, 0xfff80000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    346                                             kDisArmV8OpcDecodeNop, 0, 0) /** @todo */
     303DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(SysL)
    347304    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    348305    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  3, 1 /*idxParam*/),
    349306    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCRnCRm,         8,  8, 2 /*idxParam*/),
    350307    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5,  3, 3 /*idxParam*/),
    351     DIS_ARMV8_INSN_PARAM_NONE
    352 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     308DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_0(SysL, 0xfff80000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     309                                                kDisArmV8OpcDecodeNop, 0, 0); /** @todo */
    353310
    354311
    355312/* MSR */
    356 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Msr)
     313DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Msr)
    357314    DIS_ARMV8_OP(0xd5100000, "msr",             OP_ARMV8_A64_MSR,       DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),
    358 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Msr, 0xfff00000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    359                                             kDisArmV8OpcDecodeNop, 0, 0,
    360                                             kDisArmv8OpParmSysReg, kDisArmv8OpParmGpr)
     315DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Msr)
    361316    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSysReg,         5, 15, 0 /*idxParam*/),
    362317    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 1 /*idxParam*/),
    363     DIS_ARMV8_INSN_PARAM_NONE,
    364     DIS_ARMV8_INSN_PARAM_NONE,
    365     DIS_ARMV8_INSN_PARAM_NONE
    366 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     318DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(Msr, 0xfff00000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     319                                                kDisArmV8OpcDecodeNop, 0, 0,
     320                                                kDisArmv8OpParmSysReg, kDisArmv8OpParmGpr);
    367321
    368322
    369323/* MRS */
    370 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Mrs)
     324DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(Mrs)
    371325    DIS_ARMV8_OP(0xd5300000, "mrs",             OP_ARMV8_A64_MRS,       DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),
    372 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Mrs, 0xfff00000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    373                                             kDisArmV8OpcDecodeNop, 0, 0,
    374                                             kDisArmv8OpParmGpr, kDisArmv8OpParmSysReg)
     326DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(Mrs)
    375327    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    376328    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSysReg,         5, 15, 1 /*idxParam*/),
    377     DIS_ARMV8_INSN_PARAM_NONE,
    378     DIS_ARMV8_INSN_PARAM_NONE,
    379     DIS_ARMV8_INSN_PARAM_NONE
    380 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     329DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(Mrs, 0xfff00000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     330                                                kDisArmV8OpcDecodeNop, 0, 0,
     331                                                kDisArmv8OpParmGpr, kDisArmv8OpParmSysReg);
    381332
    382333
    383334/* BR/BRAA/BRAAZ/BRAB/BRABZ/BLR/BLRAA/BLRAAZ/BLRAB/BLRABZ/RET/RETAA/RETAB */
    384 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64BrBlrRet)
     335DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(BrBlrRet)
    385336    DIS_ARMV8_OP(0xd61f0000, "br",             OP_ARMV8_A64_BR,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    386337    DIS_ARMV8_OP(0xd63f0000, "blr",            OP_ARMV8_A64_BLR,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
     
    389340    DIS_ARMV8_OP(0xd65f0800, "retaa",          OP_ARMV8_A64_RETAA,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    390341    DIS_ARMV8_OP(0xd65f0c00, "retab",          OP_ARMV8_A64_RETAB,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    391 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64BrBlrRet, 0xfffffc1f /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
    392                                             kDisArmV8OpcDecodeLookup, 0xfffffc1f, 0,
    393                                             kDisArmv8OpParmGpr)
     342DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(BrBlrRet)
    394343    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 0 /*idxParam*/),
    395     DIS_ARMV8_INSN_PARAM_NONE,
    396     DIS_ARMV8_INSN_PARAM_NONE,
    397     DIS_ARMV8_INSN_PARAM_NONE,
    398     DIS_ARMV8_INSN_PARAM_NONE
    399 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     344DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(BrBlrRet, 0xfffffc1f /*fFixedInsn*/, DISARMV8INSNCLASS_F_FORCED_64BIT,
     345                                                kDisArmV8OpcDecodeLookup, 0xfffffc1f, 0,
     346                                                kDisArmv8OpParmGpr);
    400347
    401348
    402349/* Unconditional branch (register) instructions, we divide these instructions further based on the opc field. */
    403 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64UncondBrReg)
    404     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64BrBlrRet),    /* BR/BRAA/BRAAZ/BRAB/BRABZ */
    405     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64BrBlrRet),    /* BLR/BLRAA/BLRAAZ/BLRAB/BLRABZ */
    406     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64BrBlrRet),    /* RET/RETAA/RETAB */
     350DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(UncondBrReg)
     351    DIS_ARMV8_DECODE_MAP_ENTRY(BrBlrRet),    /* BR/BRAA/BRAAZ/BRAB/BRABZ */
     352    DIS_ARMV8_DECODE_MAP_ENTRY(BrBlrRet),    /* BLR/BLRAA/BLRAAZ/BLRAB/BLRABZ */
     353    DIS_ARMV8_DECODE_MAP_ENTRY(BrBlrRet),    /* RET/RETAA/RETAB */
    407354    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
    408355    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
     
    418365    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
    419366    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY
    420 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64UncondBrReg, RT_BIT_32(21) | RT_BIT_32(22) | RT_BIT_32(23) | RT_BIT_32(24), 21);
     367DIS_ARMV8_DECODE_MAP_DEFINE_END(UncondBrReg, RT_BIT_32(21) | RT_BIT_32(22) | RT_BIT_32(23) | RT_BIT_32(24), 21);
    421368
    422369
    423370/* B/BL */
    424 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64UncondBrImm)
     371DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(UncondBrImm)
    425372    DIS_ARMV8_OP(0x14000000, "b",              OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    426373    DIS_ARMV8_OP(0x94000000, "bl",             OP_ARMV8_A64_BL,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    427 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64UncondBrImm, 0xfc000000 /*fFixedInsn*/, 0 /*fClass*/,
    428                                             kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
    429                                             kDisArmv8OpParmImmRel)
     374DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(UncondBrImm)
    430375    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         0,  26, 0 /*idxParam*/),
    431     DIS_ARMV8_INSN_PARAM_NONE,
    432     DIS_ARMV8_INSN_PARAM_NONE,
    433     DIS_ARMV8_INSN_PARAM_NONE,
    434     DIS_ARMV8_INSN_PARAM_NONE
    435 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     376DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_1(UncondBrImm, 0xfc000000 /*fFixedInsn*/, 0 /*fClass*/,
     377                                                kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
     378                                                kDisArmv8OpParmImmRel);
    436379
    437380
    438381/* CBZ/CBNZ */
    439 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64CmpBrImm)
     382DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(CmpBrImm)
    440383    DIS_ARMV8_OP(0x34000000, "cbz",             OP_ARMV8_A64_CBZ,       DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    441384    DIS_ARMV8_OP(0x35000000, "cbnz",            OP_ARMV8_A64_CBNZ,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    442 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64CmpBrImm, 0x7f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    443                                             kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
    444                                             kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel)
     385DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(CmpBrImm)
    445386    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    446387    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 19, 1 /*idxParam*/),
    447     DIS_ARMV8_INSN_PARAM_NONE,
    448     DIS_ARMV8_INSN_PARAM_NONE,
    449     DIS_ARMV8_INSN_PARAM_NONE
    450 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     388DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(CmpBrImm, 0x7f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     389                                                kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
     390                                                kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel);
    451391
    452392
    453393/* TBZ/TBNZ */
    454 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64TestBrImm)
     394DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(TestBrImm)
    455395    DIS_ARMV8_OP(0x36000000, "tbz",             OP_ARMV8_A64_TBZ,       DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    456396    DIS_ARMV8_OP(0x37000000, "tbnz",            OP_ARMV8_A64_TBNZ,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    457 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64TestBrImm, 0x7f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF, /* Not an SF bit but has the same meaning. */
    458                                             kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
    459                                             kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImmRel)
     397DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(TestBrImm)
    460398    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    461399    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmTbz,         0,  0, 1 /*idxParam*/), /* Hardcoded bit offsets in parser. */
    462400    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 14, 2 /*idxParam*/),
    463     DIS_ARMV8_INSN_PARAM_NONE,
    464     DIS_ARMV8_INSN_PARAM_NONE
    465 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    466 
    467 
    468 DIS_ARMV8_DECODE_TBL_DEFINE_BEGIN(g_ArmV8A64BrExcpSys)
    469     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfe000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30),                  g_ArmV8A64CondBr),          /* op0: 010, op1: 0xxxxxxxxxxxxx, op2: - (including o1 from the conditional branch (immediate) class to save us one layer). */
    470     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xff000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30) | RT_BIT_32(31),  g_ArmV8A64Excp),            /* op0: 110, op1: 00xxxxxxxxxxxx, op2: -. */
    471     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff000, 0xd5031000,                                                     g_ArmV8A64SysReg),          /* op0: 110, op1: 01000000110001, op2: -. */
    472     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503201f,                                                     g_ArmV8A64Hints),           /* op0: 110, op1: 01000000110010, op2: 11111. */
    473     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503301f,                                                     g_ArmV8A64DecodeBarriers),  /* op0: 110, op1: 01000000110011, op2: - (we include Rt:  11111 from the next stage here). */
    474     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff8f01f, 0xd500401f,                                                     g_ArmV8A64PState),          /* op0: 110, op1: 0100000xxx0100, op2: - (we include Rt:  11111 from the next stage here). */
    475     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff0e0, 0xd5233060,                                                     g_ArmV8A64SysResult),       /* op0: 110, op1: 0100100xxxxxxx, op2: - (we include op1, CRn and op2 from the next stage here). */
    476     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff80000, 0xd5080000,                                                     g_ArmV8A64Sys),             /* op0: 110, op1: 0100x01xxxxxxx, op2: - (we include the L field of the next stage here to differentiate between SYS/SYSL as they have a different string representation). */
    477     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff80000, 0xd5280000,                                                     g_ArmV8A64SysL),            /* op0: 110, op1: 0100x01xxxxxxx, op2: - (we include the L field of the next stage here to differentiate between SYS/SYSL as they have a different string representation). */
    478     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff00000, 0xd5100000,                                                     g_ArmV8A64Msr),             /* op0: 110, op1: 0100x1xxxxxxxx, op2: - (we include the L field of the next stage here to differentiate between MSR/MRS as they have a different string representation). */
    479     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff00000, 0xd5300000,                                                     g_ArmV8A64Mrs),             /* op0: 110, op1: 0100x1xxxxxxxx, op2: - (we include the L field of the next stage here to differentiate between MSR/MRS as they have a different string representation). */
    480     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfe1f0000, 0xd61f0000,                                                     g_ArmV8A64UncondBrReg),     /* op0: 110, op1: 1xxxxxxxxxxxxx, op2: - (we include the op2 field from the next stage here as it should be always 11111). */
    481     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7c000000, 0x14000000,                                                     g_ArmV8A64UncondBrImm),     /* op0: x00, op1: xxxxxxxxxxxxxx, op2: -. */
    482     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7e000000, 0x34000000,                                                     g_ArmV8A64CmpBrImm),        /* op0: x01, op1: 0xxxxxxxxxxxxx, op2: -. */
    483     DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7e000000, 0x36000000,                                                     g_ArmV8A64TestBrImm),       /* op0: x01, op1: 1xxxxxxxxxxxxx, op2: -. */
    484 DIS_ARMV8_DECODE_TBL_DEFINE_END(g_ArmV8A64BrExcpSys);
     401DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(TestBrImm, 0x7f000000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF, /* Not an SF bit but has the same meaning. */
     402                                                kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
     403                                                kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImmRel);
     404
     405
     406DIS_ARMV8_DECODE_TBL_DEFINE_BEGIN(BrExcpSys)
     407    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfe000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30),                  CondBr),          /* op0: 010, op1: 0xxxxxxxxxxxxx, op2: - (including o1 from the conditional branch (immediate) class to save us one layer). */
     408    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xff000000, RT_BIT_32(26) | RT_BIT_32(28) | RT_BIT_32(30) | RT_BIT_32(31),  Excp),            /* op0: 110, op1: 00xxxxxxxxxxxx, op2: -. */
     409    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff000, 0xd5031000,                                                     SysReg),          /* op0: 110, op1: 01000000110001, op2: -. */
     410    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503201f,                                                     Hints),           /* op0: 110, op1: 01000000110010, op2: 11111. */
     411    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff01f, 0xd503301f,                                                     DecodeBarriers),  /* op0: 110, op1: 01000000110011, op2: - (we include Rt:  11111 from the next stage here). */
     412    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff8f01f, 0xd500401f,                                                     PState),          /* op0: 110, op1: 0100000xxx0100, op2: - (we include Rt:  11111 from the next stage here). */
     413    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfffff0e0, 0xd5233060,                                                     SysResult),       /* op0: 110, op1: 0100100xxxxxxx, op2: - (we include op1, CRn and op2 from the next stage here). */
     414    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff80000, 0xd5080000,                                                     Sys),             /* op0: 110, op1: 0100x01xxxxxxx, op2: - (we include the L field of the next stage here to differentiate between SYS/SYSL as they have a different string representation). */
     415    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff80000, 0xd5280000,                                                     SysL),            /* op0: 110, op1: 0100x01xxxxxxx, op2: - (we include the L field of the next stage here to differentiate between SYS/SYSL as they have a different string representation). */
     416    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff00000, 0xd5100000,                                                     Msr),             /* op0: 110, op1: 0100x1xxxxxxxx, op2: - (we include the L field of the next stage here to differentiate between MSR/MRS as they have a different string representation). */
     417    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfff00000, 0xd5300000,                                                     Mrs),             /* op0: 110, op1: 0100x1xxxxxxxx, op2: - (we include the L field of the next stage here to differentiate between MSR/MRS as they have a different string representation). */
     418    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0xfe1f0000, 0xd61f0000,                                                     UncondBrReg),     /* op0: 110, op1: 1xxxxxxxxxxxxx, op2: - (we include the op2 field from the next stage here as it should be always 11111). */
     419    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7c000000, 0x14000000,                                                     UncondBrImm),     /* op0: x00, op1: xxxxxxxxxxxxxx, op2: -. */
     420    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7e000000, 0x34000000,                                                     CmpBrImm),        /* op0: x01, op1: 0xxxxxxxxxxxxx, op2: -. */
     421    DIS_ARMV8_DECODE_TBL_ENTRY_INIT(0x7e000000, 0x36000000,                                                     TestBrImm),       /* op0: x01, op1: 1xxxxxxxxxxxxx, op2: -. */
     422DIS_ARMV8_DECODE_TBL_DEFINE_END(BrExcpSys);
    485423
    486424
    487425/* AND/ORR/EOR/ANDS */
    488 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN0)
     426DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LogShiftRegN0)
    489427    DIS_ARMV8_OP(0x0a000000, "and",             OP_ARMV8_A64_AND,       DISOPTYPE_HARMLESS),
    490428    DIS_ARMV8_OP(0x2a000000, "orr",             OP_ARMV8_A64_ORR,       DISOPTYPE_HARMLESS),
    491429    DIS_ARMV8_OP(0x4a000000, "eor",             OP_ARMV8_A64_EOR,       DISOPTYPE_HARMLESS),
    492430    DIS_ARMV8_OP(0x6a000000, "ands",            OP_ARMV8_A64_ANDS,      DISOPTYPE_HARMLESS)
    493 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_aArmV8A64InsnLogShiftRegN0, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    494                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    495                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr)
     431DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LogShiftRegN0)
    496432    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    497433    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
     
    499435    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShift,         22,  2, 2 /*idxParam*/),
    500436    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/),
    501 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     437DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(LogShiftRegN0, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     438                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     439                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr);
    502440
    503441
    504442/* AND/ORR/EOR/ANDS */
    505 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN1)
     443DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LogShiftRegN1)
    506444    DIS_ARMV8_OP(0x0a200000, "bic",             OP_ARMV8_A64_BIC,       DISOPTYPE_HARMLESS),
    507445    DIS_ARMV8_OP(0x2a200000, "orn",             OP_ARMV8_A64_ORN,       DISOPTYPE_HARMLESS),
    508446    DIS_ARMV8_OP(0x4a200000, "eon",             OP_ARMV8_A64_EON,       DISOPTYPE_HARMLESS),
    509447    DIS_ARMV8_OP(0x6a200000, "bics",            OP_ARMV8_A64_BICS,      DISOPTYPE_HARMLESS)
    510 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_aArmV8A64InsnLogShiftRegN1, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
    511                                             kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
    512                                             kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr)
     448DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LogShiftRegN1)
    513449    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    514450    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
     
    516452    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShift,         22,  2, 2 /*idxParam*/),
    517453    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/),
    518 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    519 
    520 
    521 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN)
    522     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN0),       /* Logical (shifted register) - N = 0 */
    523     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN1),       /* Logical (shifted register) - N = 1 */
    524 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_aArmV8A64InsnLogShiftRegN, RT_BIT_32(21), 21);
    525 
    526 
    527 
    528 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_aArmV8A64InsnAddSubExtReg)
    529     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
    530 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_aArmV8A64InsnAddSubExtReg, RT_BIT_32(24), 24);
    531 
    532 
    533 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_aArmV8A64InsnAddSubShiftExtReg)
    534     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnAddSubShiftReg),      /* Add/Subtract (shifted register) */
    535     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnAddSubExtReg),        /* Add/Subtract (extended register) */
    536 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_aArmV8A64InsnAddSubShiftExtReg, RT_BIT_32(21), 21);
    537 
    538 
    539 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64LogicalAddSubReg)
    540     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN),        /* Logical (shifted register) */
    541     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnAddSubShiftExtReg),   /* Add/subtract (shifted/extended register) */
    542 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64LogicalAddSubReg, RT_BIT_32(24), 24);
    543 
    544 
    545 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64DataProcReg)
    546     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
    547 DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64DataProcReg, RT_BIT_32(24), 24);
    548 
    549 
    550 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64LdSt)
     454DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_3(LogShiftRegN1, 0x7f200000 /*fFixedInsn*/, DISARMV8INSNCLASS_F_SF,
     455                                                kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     456                                                kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr);
     457
     458
     459DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LogShiftRegN)
     460    DIS_ARMV8_DECODE_MAP_ENTRY(LogShiftRegN0),       /* Logical (shifted register) - N = 0 */
     461    DIS_ARMV8_DECODE_MAP_ENTRY(LogShiftRegN1),       /* Logical (shifted register) - N = 1 */
     462DIS_ARMV8_DECODE_MAP_DEFINE_END(LogShiftRegN, RT_BIT_32(21), 21);
     463
     464
     465
     466DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(AddSubExtReg)
     467    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo */
     468DIS_ARMV8_DECODE_MAP_DEFINE_END(AddSubExtReg, RT_BIT_32(24), 24);
     469
     470
     471DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(AddSubShiftExtReg)
     472    DIS_ARMV8_DECODE_MAP_ENTRY(AddSubShiftReg),      /* Add/Subtract (shifted register) */
     473    DIS_ARMV8_DECODE_MAP_ENTRY(AddSubExtReg),        /* Add/Subtract (extended register) */
     474DIS_ARMV8_DECODE_MAP_DEFINE_END(AddSubShiftExtReg, RT_BIT_32(21), 21);
     475
     476
     477DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LogicalAddSubReg)
     478    DIS_ARMV8_DECODE_MAP_ENTRY(LogShiftRegN),        /* Logical (shifted register) */
     479    DIS_ARMV8_DECODE_MAP_ENTRY(AddSubShiftExtReg),   /* Add/subtract (shifted/extended register) */
     480DIS_ARMV8_DECODE_MAP_DEFINE_END(LogicalAddSubReg, RT_BIT_32(24), 24);
     481
     482
     483DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(DataProcReg)
     484    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,
     485DIS_ARMV8_DECODE_MAP_DEFINE_END(DataProcReg, RT_BIT_32(24), 24);
     486
     487
     488DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdSt)
    551489    DIS_ARMV8_OP(0xb9400000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
    552490    DIS_ARMV8_OP(0xb9000000, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS),
    553 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64LdSt, 0xbfc00000 /*fFixedInsn*/, 0 /*fClass*/,
    554                                             kDisArmV8OpcDecodeLookup, 0xbfc00000, 0,
    555                                             kDisArmv8OpParmGpr, kDisArmv8OpParmAddrInGpr)
     491DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdSt)
    556492    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseIs32Bit,       30,  1, DIS_ARMV8_INSN_PARAM_UNSET),
    557493    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    558494    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    559495    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmMemOff,     10, 12, 1 /*idxParam*/),
    560     DIS_ARMV8_INSN_PARAM_NONE
    561 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    562 
     496DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END_PARAMS_2(LdSt, 0xbfc00000 /*fFixedInsn*/, 0 /*fClass*/,
     497                                                kDisArmV8OpcDecodeLookup, 0xbfc00000, 0,
     498                                                kDisArmv8OpParmGpr, kDisArmv8OpParmAddrInGpr);
    563499
    564500/*
     
    600536 *     15    1  1  1  1 Data processing - SIMD and floating point
    601537 */
    602 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64DecodeL0)
    603     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnRsvd),                /* Reserved class or SME encoding (@todo). */
     538DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(DecodeL0)
     539    DIS_ARMV8_DECODE_MAP_ENTRY(Rsvd),                               /* Reserved class or SME encoding (@todo). */
    604540    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Unallocated */
    605541    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /** @todo SVE */
    606542    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Unallocated */
    607543    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Load/Stores */
    608     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64LogicalAddSubReg),         /* Data processing (register) (see op1 in C4.1.68). */
     544    DIS_ARMV8_DECODE_MAP_ENTRY(LogicalAddSubReg),                   /* Data processing (register) (see op1 in C4.1.68). */
    609545    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Load/Stores */
    610546    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Data processing (SIMD & FP) */
    611     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnDataProcessingImm),   /* Data processing (immediate). */
    612     DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnDataProcessingImm),   /* Data processing (immediate). */
    613     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64BrExcpSys),                /* Branches / Exception generation and system instructions. */
    614     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64BrExcpSys),                /* Branches / Exception generation and system instructions. */
    615     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64LdSt),                     /* Load/Stores. */
    616     DIS_ARMV8_DECODE_MAP_ENTRY(g_ArmV8A64DataProcReg),              /* Data processing (register) (see op1 in C4.1.68). */
     547    DIS_ARMV8_DECODE_MAP_ENTRY(DataProcessingImm),                  /* Data processing (immediate). */
     548    DIS_ARMV8_DECODE_MAP_ENTRY(DataProcessingImm),                  /* Data processing (immediate). */
     549    DIS_ARMV8_DECODE_MAP_ENTRY(BrExcpSys),                          /* Branches / Exception generation and system instructions. */
     550    DIS_ARMV8_DECODE_MAP_ENTRY(BrExcpSys),                          /* Branches / Exception generation and system instructions. */
     551    DIS_ARMV8_DECODE_MAP_ENTRY(LdSt),                               /* Load/Stores. */
     552    DIS_ARMV8_DECODE_MAP_ENTRY(DataProcReg),                        /* Data processing (register) (see op1 in C4.1.68). */
    617553    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Load/Stores. */
    618554    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY                              /* Data processing (SIMD & FP). */
    619 DIS_ARMV8_DECODE_MAP_DEFINE_END_NON_STATIC(g_ArmV8A64DecodeL0, RT_BIT_32(25) | RT_BIT_32(26) | RT_BIT_32(27) | RT_BIT_32(28), 25);
     555DIS_ARMV8_DECODE_MAP_DEFINE_END_NON_STATIC(DecodeL0, RT_BIT_32(25) | RT_BIT_32(26) | RT_BIT_32(27) | RT_BIT_32(28), 25);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette