VirtualBox

Changeset 105779 in vbox for trunk/src/VBox/Disassembler


Ignore:
Timestamp:
Aug 21, 2024 4:39:51 PM (6 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164491
Message:

Disassembler/ARMv8: Updates, decode more instructions, add them to the testcase, bugref:10394

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

Legend:

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

    r105738 r105779  
    3333#include <VBox/dis.h>
    3434#include <VBox/log.h>
     35#include <iprt/asm.h> /* Required to get Armv8A64ConvertImmRImmS2Mask64() from armv8.h. */
    3536#include <iprt/armv8.h>
    3637#include <iprt/assert.h>
     
    8384static FNDISPARSEARMV8 disArmV8ParsePState;
    8485static FNDISPARSEARMV8 disArmV8ParseSysReg;
     86static FNDISPARSEARMV8 disArmV8ParseSh12;
     87static FNDISPARSEARMV8 disArmV8ParseImmTbz;
     88static FNDISPARSEARMV8 disArmV8ParseShift;
     89static FNDISPARSEARMV8 disArmV8ParseShiftAmount;
    8590/** @}  */
    8691
     
    110115    disArmV8ParsePState,
    111116    NULL,
    112     disArmV8ParseSysReg
     117    disArmV8ParseSysReg,
     118    disArmV8ParseSh12,
     119    disArmV8ParseImmTbz,
     120    disArmV8ParseShift,
     121    disArmV8ParseShiftAmount
    113122};
    114123
     
    254263        return VERR_DIS_INVALID_OPCODE;
    255264
    256     /** @todo Decode according to spec. */
    257     pParam->uValue        = u32ImmRaw;
    258     pParam->armv8.cb = sizeof(uint32_t);
    259     pParam->fUse         |= DISUSE_IMMEDIATE32;
     265    uint32_t uImm7SizeLen   = ((u32ImmRaw & RT_BIT_32(12)) >> 6) | (u32ImmRaw & 0x3f);
     266    uint32_t uImm6Rotations = (u32ImmRaw >> 6) & 0x3f;
     267    pParam->uValue        =   *pf64Bit
     268                            ? Armv8A64ConvertImmRImmS2Mask64(uImm7SizeLen, uImm6Rotations)
     269                            : Armv8A64ConvertImmRImmS2Mask32(uImm7SizeLen, uImm6Rotations);
     270    pParam->armv8.cb      = pParam->uValue > UINT32_MAX ? sizeof(uint64_t) : sizeof(uint32_t);
     271    pParam->fUse         |= pParam->uValue > UINT32_MAX ? DISUSE_IMMEDIATE64 : DISUSE_IMMEDIATE32;
    260272    return VINF_SUCCESS;
    261273}
     
    264276static int disArmV8ParseHw(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
    265277{
    266     RT_NOREF(pDis, u32Insn, pInsnClass, pParam, pInsnParm, pf64Bit);
    267     AssertFailed();
    268     /** @todo */
     278    RT_NOREF(pDis, pInsnClass, pParam);
     279    Assert(pInsnParm->cBits == 2);
     280
     281    uint32_t u32 = disArmV8ExtractBitVecFromInsn(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits);
     282    /* hw<1> must be 0 if this is the 32-bit variant. */
     283    if (   !*pf64Bit
     284        && (u32 & RT_BIT_32(1)))
     285        return VERR_DIS_INVALID_OPCODE;
     286
     287    Assert(pParam->armv8.enmType == kDisArmv8OpParmImm);
     288    Assert(pParam->fUse & (DISUSE_IMMEDIATE8 | DISUSE_IMMEDIATE16 | DISUSE_IMMEDIATE32));
     289    if (u32)
     290    {
     291        pParam->armv8.enmShift = kDisArmv8OpParmShiftLeft;
     292        pParam->armv8.cShift   = ((uint8_t)u32 & 0x3) << 4;
     293    }
    269294    return VINF_SUCCESS;
    270295}
     
    306331
    307332
     333static int disArmV8ParseSh12(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     334{
     335    RT_NOREF(pDis, pInsnClass, pf64Bit);
     336    Assert(pInsnParm->cBits == 1);
     337    if (u32Insn & RT_BIT_32(pInsnParm->idxBitStart))
     338    {
     339        /* Shift the immediate pointed to. */
     340        pParam->uValue <<= 12;
     341
     342        /* Re-evaluate the immediate data size. */
     343        pParam->fUse &= ~(DISUSE_IMMEDIATE8 | DISUSE_IMMEDIATE16 | DISUSE_IMMEDIATE32);
     344        if (pParam->uValue <= UINT8_MAX)
     345        {
     346            pParam->armv8.cb = sizeof(uint8_t);
     347            pParam->fUse |= DISUSE_IMMEDIATE8;
     348        }
     349        else if (pParam->uValue <= UINT16_MAX)
     350        {
     351            pParam->armv8.cb = sizeof(uint16_t);
     352            pParam->fUse |= DISUSE_IMMEDIATE16;
     353        }
     354        else if (pParam->uValue <= UINT32_MAX)
     355        {
     356            pParam->armv8.cb = sizeof(uint32_t);
     357            pParam->fUse |= DISUSE_IMMEDIATE32;
     358        }
     359        else
     360            AssertReleaseFailed();
     361
     362    }
     363    return VINF_SUCCESS;
     364}
     365
     366
     367static int disArmV8ParseImmTbz(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     368{
     369    RT_NOREF(pDis, pInsnClass, pf64Bit);
     370
     371    AssertReturn(!pInsnParm->idxBitStart && !pInsnParm->cBits, VERR_INTERNAL_ERROR_2);
     372
     373    pParam->uValue = disArmV8ExtractBitVecFromInsn(u32Insn, 19, 5);
     374    pParam->uValue |= (u32Insn & RT_BIT_32(31)) >> 26;
     375
     376    pParam->armv8.cb = sizeof(uint8_t);
     377    pParam->fUse |= DISUSE_IMMEDIATE8;
     378    return VINF_SUCCESS;
     379}
     380
     381
     382static int disArmV8ParseShift(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     383{
     384    RT_NOREF(pDis, pInsnClass, pf64Bit);
     385
     386    AssertReturn(pInsnParm->cBits == 2, VERR_INTERNAL_ERROR_2);
     387
     388    uint32_t u32Shift = disArmV8ExtractBitVecFromInsn(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits);
     389    switch (u32Shift)
     390    {
     391        case 0: pParam->armv8.enmShift = kDisArmv8OpParmShiftLeft;       break;
     392        case 1: pParam->armv8.enmShift = kDisArmv8OpParmShiftRight;      break;
     393        case 2: pParam->armv8.enmShift = kDisArmv8OpParmShiftArithRight; break;
     394        case 3: pParam->armv8.enmShift = kDisArmv8OpParmShiftRotate;     break;
     395        default:
     396            AssertReleaseFailed();
     397    }
     398    return VINF_SUCCESS;
     399}
     400
     401
     402static int disArmV8ParseShiftAmount(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass, PDISOPPARAM pParam, PCDISARMV8INSNPARAM pInsnParm, bool *pf64Bit)
     403{
     404    RT_NOREF(pDis, pInsnClass, pf64Bit);
     405
     406    uint32_t u32Amount = disArmV8ExtractBitVecFromInsn(u32Insn, pInsnParm->idxBitStart, pInsnParm->cBits);
     407    /* For a 32-bit operand it is impossible to shift/rotate more than 31 bits. */
     408    if (   !*pf64Bit
     409        && u32Amount > 31)
     410        return VERR_DIS_INVALID_OPCODE;
     411
     412    Assert(pParam->armv8.enmShift != kDisArmv8OpParmShiftNone);
     413    Assert(u32Amount < 64);
     414    pParam->armv8.cShift = (uint8_t)u32Amount;
     415    /* Any shift operation with a 0 is essentially no shift being applied. */
     416    if (pParam->armv8.cShift == 0)
     417        pParam->armv8.enmShift = kDisArmv8OpParmShiftNone;
     418    return VINF_SUCCESS;
     419}
     420
     421
    308422static uint32_t disArmV8DecodeIllegal(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8INSNCLASS pInsnClass)
    309423{
     
    336450
    337451    /* Should contain the parameter type on input. */
    338     pDis->aParams[0].armv8.fParam = pOp->Opc.fParam1;
    339     pDis->aParams[1].armv8.fParam = pOp->Opc.fParam2;
    340     pDis->aParams[2].armv8.fParam = pOp->Opc.fParam3;
    341     pDis->aParams[3].armv8.fParam = pOp->Opc.fParam4;
    342     pDis->armv8.pInsnClass        = pInsnClass;
    343     pDis->armv8.enmCond           = kDisArmv8InstrCond_Al;
     452    pDis->aParams[0].armv8.enmType  = pInsnClass->aenmParamTypes[0];
     453    pDis->aParams[1].armv8.enmType  = pInsnClass->aenmParamTypes[1];
     454    pDis->aParams[2].armv8.enmType  = pInsnClass->aenmParamTypes[2];
     455    pDis->aParams[3].armv8.enmType  = pInsnClass->aenmParamTypes[3];
     456    pDis->aParams[0].armv8.enmShift = kDisArmv8OpParmShiftNone;
     457    pDis->aParams[1].armv8.enmShift = kDisArmv8OpParmShiftNone;
     458    pDis->aParams[2].armv8.enmShift = kDisArmv8OpParmShiftNone;
     459    pDis->aParams[3].armv8.enmShift = kDisArmv8OpParmShiftNone;
     460    pDis->armv8.enmCond             = kDisArmv8InstrCond_Al;
    344461
    345462    pDis->pCurInstr = &pOp->Opc;
     
    372489        pDis->pCurInstr = &g_ArmV8A64InvalidOpcode[0];
    373490
    374         pDis->aParams[0].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam1;
    375         pDis->aParams[1].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam2;
    376         pDis->aParams[2].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam3;
    377         pDis->aParams[3].armv8.fParam = g_ArmV8A64InvalidOpcode[0].fParam4;
     491        pDis->aParams[0].armv8.enmType = kDisArmv8OpParmNone;
     492        pDis->aParams[1].armv8.enmType = kDisArmv8OpParmNone;
     493        pDis->aParams[2].armv8.enmType = kDisArmv8OpParmNone;
     494        pDis->aParams[3].armv8.enmType = kDisArmv8OpParmNone;
    378495    }
    379496    pDis->rc = rc;
  • trunk/src/VBox/Disassembler/DisasmFormatArmV8.cpp

    r105747 r105779  
    4848{
    4949    "w0\0",  "w1\0",  "w2\0",  "w3\0",  "w4\0",  "w5\0",  "w6\0",  "w7\0",  "w8\0",  "w9\0",  "w10",  "w11",  "w12",  "w13",  "w14",  "w15",
    50     "w16",   "w17",   "w18",   "w19",   "w20",   "w21",   "w22",   "w23",   "w24",   "w25",   "w26",  "w27",  "w28",  "w29", "w30",   "zr"
     50    "w16",   "w17",   "w18",   "w19",   "w20",   "w21",   "w22",   "w23",   "w24",   "w25",   "w26",  "w27",  "w28",  "w29", "w30",   "wzr"
    5151};
    5252static const char g_aszArmV8RegGen64[32][4] =
     
    427427        fFlags = (fFlags & ~DIS_FMT_FLAGS_BYTES_LEFT) | DIS_FMT_FLAGS_BYTES_RIGHT;
    428428
    429     PCDISOPCODE         const pOp        = pDis->pCurInstr;
    430     PCDISARMV8INSNCLASS const pInsnClass = pDis->armv8.pInsnClass;
     429    PCDISOPCODE const pOp = pDis->pCurInstr;
    431430
    432431    /*
     
    601600        RTINTPTR off;
    602601        char szSymbol[128];
    603         for (uint32_t i = 0; i < RT_ELEMENTS(pInsnClass->aParms); i++)
     602        for (uint32_t i = 0; i < RT_ELEMENTS(pDis->aParams); i++)
    604603        {
    605             PCDISARMV8INSNPARAM pInsnParam = &pInsnClass->aParms[i];
    606 
    607             /* First NOP parameter marks end of parameters. */
    608             if (pInsnParam->idxParse == kDisParmParseNop)
     604            PCDISOPPARAM pParam = &pDis->aParams[i];
     605
     606            /* First None parameter marks end of parameters. */
     607            if (pParam->armv8.enmType == kDisArmv8OpParmNone)
    609608                break;
    610609
    611             /* Step over decoding steps which don't produce any parameters. */
    612             if (pInsnParam->idxParse == kDisParmParseIs32Bit)
    613                 continue;
    614 
    615             PCDISOPPARAM pParam =   pInsnParam->idxParam != DIS_ARMV8_INSN_PARAM_UNSET
    616                                   ? &pDis->aParams[pInsnParam->idxParam]
    617                                   : NULL;
    618             if (   pParam
    619                 && pInsnParam->idxParam > 0)
     610            if (i > 0)
    620611                PUT_C(',');
    621612            PUT_C(' '); /** @todo Make the indenting configurable. */
    622613
    623             if (pInsnParam->fFlags & DIS_ARMV8_INSN_PARAM_F_ADDR_BEGIN)
    624                 PUT_C('[');
    625 
    626             switch (pInsnParam->idxParse)
     614            switch (pParam->armv8.enmType)
    627615            {
    628                 case kDisParmParseImm:
     616                case kDisArmv8OpParmImm:
    629617                {
    630618                    PUT_C('#');
     
    661649                    break;
    662650                }
    663                 case kDisParmParseImmRel:
    664                 case kDisParmParseImmAdr:
     651                case kDisArmv8OpParmImmRel:
     652                /*case kDisParmParseImmAdr:*/
    665653                {
    666654                    int32_t offDisplacement;
     
    706694                    break;
    707695                }
    708                 case kDisParmParseReg:
     696                case kDisArmv8OpParmGpr:
    709697                {
    710698                    Assert(!(pParam->fUse & (DISUSE_DISPLACEMENT8 | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT32 | DISUSE_DISPLACEMENT64 | DISUSE_RIPDISPLACEMENT32)));
     
    715703                    break;
    716704                }
    717                 case kDisParmParseSysReg:
     705                case kDisArmv8OpParmSysReg:
    718706                {
    719707                    Assert(pParam->fUse == DISUSE_REG_SYSTEM);
     
    725713                    break;
    726714                }
    727                 case kDisParmParseImmsImmrN:
    728                 case kDisParmParseHw:
    729                 case kDisParmParseCond:
    730                 case kDisParmParsePState:
    731                 case kDisParmParseCRnCRm:
    732                     break;
    733                 case kDisParmParseIs32Bit:
    734                 case kDisParmParseNop:
    735                 case kDisParmParseMax:
    736715                default:
    737716                    AssertFailed();
    738717            }
    739718
    740             if (pInsnParam->fFlags & DIS_ARMV8_INSN_PARAM_F_ADDR_END)
    741                 PUT_C(']');
     719            if (pParam->armv8.enmShift != kDisArmv8OpParmShiftNone)
     720            {
     721                Assert(   pParam->armv8.enmType == kDisArmv8OpParmImm
     722                       || pParam->armv8.enmType == kDisArmv8OpParmGpr);
     723                PUT_SZ(", ");
     724                switch (pParam->armv8.enmShift)
     725                {
     726                    case kDisArmv8OpParmShiftLeft:
     727                        PUT_SZ("LSL #");
     728                        break;
     729                    case kDisArmv8OpParmShiftRight:
     730                        PUT_SZ("LSR #");
     731                        break;
     732                    case kDisArmv8OpParmShiftArithRight:
     733                        PUT_SZ("ASR #");
     734                        break;
     735                    case kDisArmv8OpParmShiftRotate:
     736                        PUT_SZ("ROR #");
     737                        break;
     738                    default:
     739                        AssertFailed();
     740                }
     741                PUT_NUM_8(pParam->armv8.cShift);
     742            }
    742743        }
    743744    }
  • trunk/src/VBox/Disassembler/DisasmInternal-armv8.h

    r105731 r105779  
    6262    kDisParmParseCRnCRm,
    6363    kDisParmParseSysReg,
     64    kDisParmParseSh12,
     65    kDisParmParseImmTbz,
     66    kDisParmParseShift,
     67    kDisParmParseShiftAmount,
    6468    kDisParmParseMax
    6569} DISPARMPARSEIDX;
     
    169173    /** Number of bits to shift to get an index. */
    170174    uint32_t                cShift;
    171     /** The parameters. */
    172     DISARMV8INSNPARAM       aParms[4];
     175    /** Parameter types. */
     176    DISARMV8OPPARM          aenmParamTypes[4];
     177    /** The decoding steps. */
     178    DISARMV8INSNPARAM       aParms[5];
    173179} DISARMV8INSNCLASS;
    174180/** Pointer to a constant instruction class descriptor. */
     
    185191#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(a_Name) \
    186192    static const DISARMV8OPCODE a_Name ## Opcodes[] = {
    187 #define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift) \
     193#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     194                                                    a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4) \
    188195    }; \
    189196    static const DISARMV8INSNCLASS a_Name = { { kDisArmV8DecodeType_InsnClass, RT_ELEMENTS(a_Name ## Opcodes) }, &a_Name ## Opcodes[0],\
    190                                               a_fClass, a_enmOpcDecode, a_fMask, a_cShift, {
     197                                              a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     198                                              { a_enmParamType1, a_enmParamType2, a_enmParamType3, a_enmParamType4 }, {
     199#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     200                                                    a_enmParamType1, a_enmParamType2, a_enmParamType3) \
     201    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     202                                                a_enmParamType1, a_enmParamType2, a_enmParamType3, kDisArmv8OpParmNone)
     203#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     204                                                    a_enmParamType1, a_enmParamType2) \
     205    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     206                                                a_enmParamType1, a_enmParamType2, kDisArmv8OpParmNone)
     207#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     208                                                    a_enmParamType1) \
     209    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     210                                                a_enmParamType1, kDisArmv8OpParmNone)
     211#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift) \
     212    DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(a_Name, a_fClass, a_enmOpcDecode, a_fMask, a_cShift, \
     213                                                kDisArmv8OpParmNone)
     214
    191215#define DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END } }
    192216
  • trunk/src/VBox/Disassembler/DisasmTables-armv8-a64.cpp

    r105737 r105779  
    4040
    4141#define DIS_ARMV8_OP(a_fMask, a_fValue, a_szOpcode, a_uOpcode, a_fOpType) \
    42     { a_fMask, a_fValue, OP(a_szOpcode, 0, 0, 0, a_uOpcode, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, a_fOpType) }
     42    { a_fMask, a_fValue, OP(a_szOpcode, 0, 0, 0, a_uOpcode, 0, 0, 0, a_fOpType) }
    4343
    4444#ifndef DIS_CORE_ONLY
     
    5353DECL_HIDDEN_CONST(DISOPCODE) g_ArmV8A64InvalidOpcode[1] =
    5454{
    55     OP(g_szInvalidOpcode, 0, 0, 0, OP_ARMV8_INVALID, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, OP_ARMV8_PARM_NONE, DISOPTYPE_INVALID)
     55    OP(g_szInvalidOpcode, 0, 0, 0, 0, 0, 0, 0, DISOPTYPE_INVALID)
    5656};
    5757
     
    6060DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnRsvd)
    6161    DIS_ARMV8_OP(0xffff0000, 0x00000000, "udf" ,            OP_ARMV8_A64_UDF,       DISOPTYPE_INVALID)
    62 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_aArmV8A64InsnRsvd, 0 /*fClass*/,
    63                                           kDisArmV8OpcDecodeNop, 0xffff0000, 16)
     62DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_aArmV8A64InsnRsvd, 0 /*fClass*/,
     63                                            kDisArmV8OpcDecodeNop, 0xffff0000, 16,
     64                                            kDisArmv8OpParmImm)
    6465    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,    0, 16, 0 /*idxParam*/),
     66    DIS_ARMV8_INSN_PARAM_NONE,
    6567    DIS_ARMV8_INSN_PARAM_NONE,
    6668    DIS_ARMV8_INSN_PARAM_NONE,
     
    7375    DIS_ARMV8_OP(0x9f000000, 0x10000000, "adr" ,            OP_ARMV8_A64_ADR,       DISOPTYPE_HARMLESS),
    7476    DIS_ARMV8_OP(0x9f000000, 0x90000000, "adrp" ,           OP_ARMV8_A64_ADRP,      DISOPTYPE_HARMLESS)
    75 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Adr, DISARMV8INSNCLASS_F_FORCED_64BIT,
    76                                           kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31)
     77DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Adr, DISARMV8INSNCLASS_F_FORCED_64BIT,
     78                                            kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
     79                                            kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel)
    7780    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5, 0 /*idxParam*/),
    7881    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmAdr, 0, 0, 1 /*idxParam*/),
     82    DIS_ARMV8_INSN_PARAM_NONE,
    7983    DIS_ARMV8_INSN_PARAM_NONE,
    8084    DIS_ARMV8_INSN_PARAM_NONE
     
    8892    DIS_ARMV8_OP(0x7f800000, 0x51000000, "sub" ,            OP_ARMV8_A64_SUB,       DISOPTYPE_HARMLESS),
    8993    DIS_ARMV8_OP(0x7f800000, 0x71000000, "subs" ,           OP_ARMV8_A64_SUBS,      DISOPTYPE_HARMLESS),
    90 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64AddSubImm, DISARMV8INSNCLASS_F_SF,
    91                                           kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     94DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64AddSubImm, DISARMV8INSNCLASS_F_SF,
     95                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     96                                            kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
    9297    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    0, 5, 0 /*idxParam*/),
    9398    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,    5, 5, 1 /*idxParam*/),
    9499    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,  10, 12, 2 /*idxParam*/),
     100    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSh12, 22,  1, 2 /*idxParam*/),
    95101    DIS_ARMV8_INSN_PARAM_NONE
    96102DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     
    103109    DIS_ARMV8_OP(0x7f800000, 0x52000000, "eor" ,            OP_ARMV8_A64_EOR,       DISOPTYPE_HARMLESS),
    104110    DIS_ARMV8_OP(0x7f800000, 0x72000000, "ands" ,           OP_ARMV8_A64_ANDS,      DISOPTYPE_HARMLESS),
    105 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64LogicalImm, DISARMV8INSNCLASS_F_SF,
    106                                           kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
    107     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    108     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  6, 1 /*idxParam*/),
     111DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64LogicalImm, DISARMV8INSNCLASS_F_SF,
     112                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     113                                            kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
     114    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     115    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    109116    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmsImmrN,     10, 13, 2 /*idxParam*/),
     117    DIS_ARMV8_INSN_PARAM_NONE,
    110118    DIS_ARMV8_INSN_PARAM_NONE
    111119DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     
    118126    DIS_ARMV8_OP(0x7f800000, 0x52800000, "movz" ,           OP_ARMV8_A64_MOVZ,      DISOPTYPE_HARMLESS),
    119127    DIS_ARMV8_OP(0x7f800000, 0x72800000, "movk" ,           OP_ARMV8_A64_MOVK,      DISOPTYPE_HARMLESS),
    120 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64MoveWide, DISARMV8INSNCLASS_F_SF,
    121                                           kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     128DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64MoveWide, DISARMV8INSNCLASS_F_SF,
     129                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     130                                            kDisArmv8OpParmGpr, kDisArmv8OpParmImm)
    122131    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    123132    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16, 1 /*idxParam*/),
    124     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseHw,            21,  2, 2 /*idxParam*/),
     133    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseHw,            21,  2, 1 /*idxParam*/),
     134    DIS_ARMV8_INSN_PARAM_NONE,
    125135    DIS_ARMV8_INSN_PARAM_NONE
    126136DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     
    131141    DIS_ARMV8_OP(0x7f800000, 0x13000000, "sbfm",            OP_ARMV8_A64_SBFM,      DISOPTYPE_HARMLESS),
    132142    DIS_ARMV8_OP(0x7f800000, 0x33000000, "bfm",             OP_ARMV8_A64_BFM,       DISOPTYPE_HARMLESS),
    133     DIS_ARMV8_OP(0x7f800000, 0x23000000, "ubfm",            OP_ARMV8_A64_UBFM,      DISOPTYPE_HARMLESS),
     143    DIS_ARMV8_OP(0x7f800000, 0x53000000, "ubfm",            OP_ARMV8_A64_UBFM,      DISOPTYPE_HARMLESS),
    134144    INVALID_OPCODE,
    135 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Bitfield, DISARMV8INSNCLASS_F_SF | DISARMV8INSNCLASS_F_N_FORCED_1_ON_64BIT,
    136                                           kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29)
     145DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_4(g_ArmV8A64Bitfield, DISARMV8INSNCLASS_F_SF | DISARMV8INSNCLASS_F_N_FORCED_1_ON_64BIT,
     146                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     147                                            kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImm)
    137148    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    138149    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
    139     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmsImmrN,     10, 13, 2 /*idxParam*/),
     150    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  6, 2 /*idxParam*/),
     151    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           10,  6, 3 /*idxParam*/),
    140152    DIS_ARMV8_INSN_PARAM_NONE
    141153DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     
    172184    DIS_ARMV8_OP(0xff000010, 0x54000000, "b",               OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    173185    DIS_ARMV8_OP(0xff000010, 0x54000010, "bc" ,             OP_ARMV8_A64_BC,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW | DISOPTYPE_RELATIVE_CONTROLFLOW | DISOPTYPE_COND_CONTROLFLOW),
    174 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64CondBr, 0 /*fClass*/,
    175                                           kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4)
     186DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64CondBr, 0 /*fClass*/,
     187                                            kDisArmV8OpcDecodeNop, RT_BIT_32(4), 4,
     188                                            kDisArmv8OpParmImmRel)
    176189    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCond,           0,  4, DIS_ARMV8_INSN_PARAM_UNSET),
    177190    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 19, 0 /*idxParam*/),
     191    DIS_ARMV8_INSN_PARAM_NONE,
    178192    DIS_ARMV8_INSN_PARAM_NONE,
    179193    DIS_ARMV8_INSN_PARAM_NONE
     
    192206    DIS_ARMV8_OP(0xffe0001f, 0xd4a00002, "dcps2",           OP_ARMV8_A64_DCPS2,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
    193207    DIS_ARMV8_OP(0xffe0001f, 0xd4a00003, "dcps3",           OP_ARMV8_A64_DCPS3,     DISOPTYPE_CONTROLFLOW | DISOPTYPE_INTERRUPT),
    194 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Excp, 0 /*fClass*/,
    195                                           kDisArmV8OpcDecodeLookup, 0xffe0001f, 0)
     208DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64Excp, 0 /*fClass*/,
     209                                            kDisArmV8OpcDecodeLookup, 0xffe0001f, 0,
     210                                            kDisArmv8OpParmImm)
    196211    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5, 16, 0 /*idxParam*/),
     212    DIS_ARMV8_INSN_PARAM_NONE,
    197213    DIS_ARMV8_INSN_PARAM_NONE,
    198214    DIS_ARMV8_INSN_PARAM_NONE,
     
    205221    DIS_ARMV8_OP(0xffffffe0, 0xd5031000, "wfet",            OP_ARMV8_A64_WFET,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
    206222    DIS_ARMV8_OP(0xffffffe0, 0x54000010, "wfit" ,           OP_ARMV8_A64_WFIT,      DISOPTYPE_HARMLESS), /* FEAT_WFxT */
    207 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64SysReg, DISARMV8INSNCLASS_F_FORCED_64BIT,
    208                                           kDisArmV8OpcDecodeNop, 0xfe0, 5)
    209     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     223DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64SysReg, DISARMV8INSNCLASS_F_FORCED_64BIT,
     224                                            kDisArmV8OpcDecodeNop, 0xfe0, 5,
     225                                            kDisArmv8OpParmGpr)
     226    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     227    DIS_ARMV8_INSN_PARAM_NONE,
    210228    DIS_ARMV8_INSN_PARAM_NONE,
    211229    DIS_ARMV8_INSN_PARAM_NONE,
     
    225243    DIS_ARMV8_OP(0xffffffff, 0xd50320ff, "xpaclri",         OP_ARMV8_A64_XPACLRI,   DISOPTYPE_HARMLESS), /* FEAT_PAuth */
    226244    /** @todo */
    227 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Hints, 0 /*fClass*/,
    228                                           kDisArmV8OpcDecodeNop, 0xfe0, 5)
     245DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64Hints, 0 /*fClass*/,
     246                                            kDisArmV8OpcDecodeNop, 0xfe0, 5)
     247    DIS_ARMV8_INSN_PARAM_NONE,
    229248    DIS_ARMV8_INSN_PARAM_NONE,
    230249    DIS_ARMV8_INSN_PARAM_NONE,
     
    238257    DIS_ARMV8_OP(0xfffff0ff, 0xd503304f, "clrex",           OP_ARMV8_A64_CLREX,     DISOPTYPE_HARMLESS),
    239258    DIS_ARMV8_OP(0xfffff0ff, 0xd50330bf, "dmb",             OP_ARMV8_A64_DMB,       DISOPTYPE_HARMLESS),
    240 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64DecBarriers, 0 /*fClass*/,
    241                                           kDisArmV8OpcDecodeNop, RT_BIT_32(5), 5)
     259DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64DecBarriers, 0 /*fClass*/,
     260                                            kDisArmV8OpcDecodeNop, RT_BIT_32(5), 5,
     261                                            kDisArmv8OpParmImm)
    242262    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4, 0 /*idxParam*/),
     263    DIS_ARMV8_INSN_PARAM_NONE,
    243264    DIS_ARMV8_INSN_PARAM_NONE,
    244265    DIS_ARMV8_INSN_PARAM_NONE,
     
    263284DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64PState)
    264285    DIS_ARMV8_OP(0xfffff0ff, 0xd503305f, "msr",             OP_ARMV8_A64_MSR,       DISOPTYPE_PRIVILEGED),
    265 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64PState, 0 /*fClass*/,
    266                                           kDisArmV8OpcDecodeNop, 0, 0)
     286DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64PState, 0 /*fClass*/,
     287                                            kDisArmV8OpcDecodeNop, 0, 0,
     288                                            kDisArmv8OpParmImm, kDisArmv8OpParmNone) /** @todo */
    267289    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParsePState,         0,  0, 0 /*idxParam*/), /* This is special for the MSR instruction. */
    268290    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            8,  4, 1 /*idxParam*/), /* CRm field encodes the immediate value */
     291    DIS_ARMV8_INSN_PARAM_NONE,
    269292    DIS_ARMV8_INSN_PARAM_NONE,
    270293    DIS_ARMV8_INSN_PARAM_NONE
     
    276299    DIS_ARMV8_OP(0xfffffffe, 0xd5233060, "tstart",          OP_ARMV8_A64_TSTART,    DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),  /* FEAT_TME */
    277300    DIS_ARMV8_OP(0xfffffffe, 0xd5233160, "ttest",           OP_ARMV8_A64_TTEST,     DISOPTYPE_HARMLESS),                         /* FEAT_TME */
    278 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64SysResult, DISARMV8INSNCLASS_F_FORCED_64BIT,
    279                                           kDisArmV8OpcDecodeNop, RT_BIT_32(8) | RT_BIT_32(9) | RT_BIT_32(10) | RT_BIT_32(11), 8)
    280     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     301DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64SysResult, DISARMV8INSNCLASS_F_FORCED_64BIT,
     302                                            kDisArmV8OpcDecodeNop, RT_BIT_32(8) | RT_BIT_32(9) | RT_BIT_32(10) | RT_BIT_32(11), 8,
     303                                            kDisArmv8OpParmGpr)
     304    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     305    DIS_ARMV8_INSN_PARAM_NONE,
    281306    DIS_ARMV8_INSN_PARAM_NONE,
    282307    DIS_ARMV8_INSN_PARAM_NONE,
     
    288313DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Sys)
    289314    DIS_ARMV8_OP(0xfff80000, 0xd5080000, "sys",             OP_ARMV8_A64_SYS,       DISOPTYPE_HARMLESS),
    290 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Sys, DISARMV8INSNCLASS_F_FORCED_64BIT,
    291                                           kDisArmV8OpcDecodeNop, 0, 0)
     315DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64Sys, DISARMV8INSNCLASS_F_FORCED_64BIT,
     316                                            kDisArmV8OpcDecodeNop, 0, 0) /** @todo */
    292317    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  3, 0 /*idxParam*/),
    293318    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCRnCRm,         8,  8, 1 /*idxParam*/),
    294319    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5,  3, 2 /*idxParam*/),
    295     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 3 /*idxParam*/)
     320    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 3 /*idxParam*/),
     321    DIS_ARMV8_INSN_PARAM_NONE
    296322DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    297323
     
    300326DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64SysL)
    301327    DIS_ARMV8_OP(0xfff80000, 0xd5280000, "sysl",            OP_ARMV8_A64_SYSL,      DISOPTYPE_HARMLESS),
    302 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64SysL, DISARMV8INSNCLASS_F_FORCED_64BIT,
    303                                           kDisArmV8OpcDecodeNop, 0, 0)
     328DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_0(g_ArmV8A64SysL, DISARMV8INSNCLASS_F_FORCED_64BIT,
     329                                            kDisArmV8OpcDecodeNop, 0, 0) /** @todo */
    304330    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    305331    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           16,  3, 1 /*idxParam*/),
    306332    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseCRnCRm,         8,  8, 2 /*idxParam*/),
    307     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5,  3, 3 /*idxParam*/)
     333    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,            5,  3, 3 /*idxParam*/),
     334    DIS_ARMV8_INSN_PARAM_NONE
    308335DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    309336
     
    312339DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Msr)
    313340    DIS_ARMV8_OP(0xfff00000, 0xd5100000, "msr",             OP_ARMV8_A64_MSR,       DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),
    314 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Msr, DISARMV8INSNCLASS_F_FORCED_64BIT,
    315                                           kDisArmV8OpcDecodeNop, 0, 0)
     341DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Msr, DISARMV8INSNCLASS_F_FORCED_64BIT,
     342                                            kDisArmV8OpcDecodeNop, 0, 0,
     343                                            kDisArmv8OpParmSysReg, kDisArmv8OpParmGpr)
    316344    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSysReg,         5, 15, 0 /*idxParam*/),
    317345    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 1 /*idxParam*/),
     346    DIS_ARMV8_INSN_PARAM_NONE,
    318347    DIS_ARMV8_INSN_PARAM_NONE,
    319348    DIS_ARMV8_INSN_PARAM_NONE
     
    324353DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_ArmV8A64Mrs)
    325354    DIS_ARMV8_OP(0xfff00000, 0xd5300000, "mrs",             OP_ARMV8_A64_MRS,       DISOPTYPE_HARMLESS | DISOPTYPE_PRIVILEGED),
    326 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Mrs, DISARMV8INSNCLASS_F_FORCED_64BIT,
    327                                           kDisArmV8OpcDecodeNop, 0, 0)
     355DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64Mrs, DISARMV8INSNCLASS_F_FORCED_64BIT,
     356                                            kDisArmV8OpcDecodeNop, 0, 0,
     357                                            kDisArmv8OpParmGpr, kDisArmv8OpParmSysReg)
    328358    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    329359    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseSysReg,         5, 15, 1 /*idxParam*/),
     360    DIS_ARMV8_INSN_PARAM_NONE,
    330361    DIS_ARMV8_INSN_PARAM_NONE,
    331362    DIS_ARMV8_INSN_PARAM_NONE
     
    338369    DIS_ARMV8_OP(0xfffffc1f, 0xd65f0800, "retaa",          OP_ARMV8_A64_RETAA,      DISOPTYPE_HARMLESS),
    339370    DIS_ARMV8_OP(0xfffffc1f, 0xd65f0c00, "retab",          OP_ARMV8_A64_RETAB,      DISOPTYPE_HARMLESS),
    340 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64Ret, DISARMV8INSNCLASS_F_FORCED_64BIT,
    341                                           kDisArmV8OpcDecodeLookup, 0xfffffc1f, 0)
     371DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64Ret, DISARMV8INSNCLASS_F_FORCED_64BIT,
     372                                            kDisArmV8OpcDecodeLookup, 0xfffffc1f, 0,
     373                                            kDisArmv8OpParmGpr)
    342374    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 0 /*idxParam*/),
     375    DIS_ARMV8_INSN_PARAM_NONE,
    343376    DIS_ARMV8_INSN_PARAM_NONE,
    344377    DIS_ARMV8_INSN_PARAM_NONE,
     
    372405    DIS_ARMV8_OP(0xfc000000, 0x14000000, "b",              OP_ARMV8_A64_B,         DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    373406    DIS_ARMV8_OP(0xfc000000, 0x94000000, "bl",             OP_ARMV8_A64_BL,        DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    374 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64UncondBrImm, 0 /*fClass*/,
    375                                           kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31)
     407DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_1(g_ArmV8A64UncondBrImm, 0 /*fClass*/,
     408                                            kDisArmV8OpcDecodeNop, RT_BIT_32(31), 31,
     409                                            kDisArmv8OpParmImmRel)
    376410    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         0,  26, 0 /*idxParam*/),
     411    DIS_ARMV8_INSN_PARAM_NONE,
    377412    DIS_ARMV8_INSN_PARAM_NONE,
    378413    DIS_ARMV8_INSN_PARAM_NONE,
     
    385420    DIS_ARMV8_OP(0x7f000000, 0x34000000, "cbz",             OP_ARMV8_A64_CBZ,       DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    386421    DIS_ARMV8_OP(0x7f000000, 0x35000000, "cbnz",            OP_ARMV8_A64_CBNZ,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    387 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64CmpBrImm, DISARMV8INSNCLASS_F_SF,
    388                                           kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24)
     422DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64CmpBrImm, DISARMV8INSNCLASS_F_SF,
     423                                            kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
     424                                            kDisArmv8OpParmGpr, kDisArmv8OpParmImmRel)
    389425    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    390426    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 19, 1 /*idxParam*/),
     427    DIS_ARMV8_INSN_PARAM_NONE,
    391428    DIS_ARMV8_INSN_PARAM_NONE,
    392429    DIS_ARMV8_INSN_PARAM_NONE
     
    398435    DIS_ARMV8_OP(0x7f000000, 0x36000000, "tbz",             OP_ARMV8_A64_TBZ,       DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    399436    DIS_ARMV8_OP(0x7f000000, 0x37000000, "tbnz",            OP_ARMV8_A64_TBNZ,      DISOPTYPE_HARMLESS | DISOPTYPE_CONTROLFLOW),
    400 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64TestBrImm, DISARMV8INSNCLASS_F_SF,
    401                                           kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24)
    402     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    403     DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImm,           19,  5, 1 /*idxParam*/),
     437DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_ArmV8A64TestBrImm, DISARMV8INSNCLASS_F_SF, /* Not an SF bit but has the same meaning. */
     438                                            kDisArmV8OpcDecodeNop, RT_BIT_32(24), 24,
     439                                            kDisArmv8OpParmGpr, kDisArmv8OpParmImm, kDisArmv8OpParmImmRel)
     440    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     441    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmTbz,         0,  0, 1 /*idxParam*/), /* Hardcoded bit offsets in parser. */
    404442    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseImmRel,         5, 14, 2 /*idxParam*/),
     443    DIS_ARMV8_INSN_PARAM_NONE,
    405444    DIS_ARMV8_INSN_PARAM_NONE
    406445DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     
    426465
    427466
     467/* AND/ORR/EOR/ANDS */
     468DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN0)
     469    DIS_ARMV8_OP(0x7f200000, 0x0a000000, "and",             OP_ARMV8_A64_AND,       DISOPTYPE_HARMLESS),
     470    DIS_ARMV8_OP(0x7f200000, 0x2a000000, "orr",             OP_ARMV8_A64_ORR,       DISOPTYPE_HARMLESS),
     471    DIS_ARMV8_OP(0x7f200000, 0x4a000000, "eor",             OP_ARMV8_A64_EOR,       DISOPTYPE_HARMLESS),
     472    DIS_ARMV8_OP(0x7f200000, 0x6a000000, "ands",            OP_ARMV8_A64_ANDS,      DISOPTYPE_HARMLESS)
     473DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_aArmV8A64InsnLogShiftRegN0, DISARMV8INSNCLASS_F_SF,
     474                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     475                                            kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr)
     476    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     477    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
     478    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,           16,  5, 2 /*idxParam*/),
     479    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShift,         22,  2, 2 /*idxParam*/),
     480    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/),
     481DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     482
     483
     484/* AND/ORR/EOR/ANDS */
     485DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN1)
     486    DIS_ARMV8_OP(0x7f200000, 0x0a200000, "bic",             OP_ARMV8_A64_BIC,       DISOPTYPE_HARMLESS),
     487    DIS_ARMV8_OP(0x7f200000, 0x2a200000, "orn",             OP_ARMV8_A64_ORN,       DISOPTYPE_HARMLESS),
     488    DIS_ARMV8_OP(0x7f200000, 0x4a200000, "eon",             OP_ARMV8_A64_EON,       DISOPTYPE_HARMLESS),
     489    DIS_ARMV8_OP(0x7f200000, 0x6a200000, "bics",            OP_ARMV8_A64_BICS,      DISOPTYPE_HARMLESS)
     490DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_3(g_aArmV8A64InsnLogShiftRegN1, DISARMV8INSNCLASS_F_SF,
     491                                            kDisArmV8OpcDecodeNop, RT_BIT_32(29) | RT_BIT_32(30), 29,
     492                                            kDisArmv8OpParmGpr, kDisArmv8OpParmGpr, kDisArmv8OpParmGpr)
     493    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            0,  5, 0 /*idxParam*/),
     494    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,            5,  5, 1 /*idxParam*/),
     495    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseReg,           16,  5, 2 /*idxParam*/),
     496    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShift,         22,  2, 2 /*idxParam*/),
     497    DIS_ARMV8_INSN_PARAM_CREATE(kDisParmParseShiftAmount,   10,  6, 2 /*idxParam*/),
     498DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
     499
     500
     501DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_aArmV8A64InsnLogShiftRegN)
     502    DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN0),       /* Logical (shifted register) - N = 0 */
     503    DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN1),       /* Logical (shifted register) - N = 1 */
     504DIS_ARMV8_DECODE_MAP_DEFINE_END(g_aArmV8A64InsnLogShiftRegN, RT_BIT_32(21), 21);
     505
     506
    428507DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(g_ArmV8A64LogicalAddSubReg)
    429     DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Logical (shifted register) */
     508    DIS_ARMV8_DECODE_MAP_ENTRY(g_aArmV8A64InsnLogShiftRegN),        /* Logical (shifted register) */
    430509    DIS_ARMV8_DECODE_MAP_INVALID_ENTRY,                             /* Add/subtract (shifted/extended register) */
    431510DIS_ARMV8_DECODE_MAP_DEFINE_END(g_ArmV8A64LogicalAddSubReg, RT_BIT_32(24), 24);
     
    440519    DIS_ARMV8_OP(0xbfc00000, 0xb9400000, "ldr",             OP_ARMV8_A64_LDR,       DISOPTYPE_HARMLESS),
    441520    DIS_ARMV8_OP(0xbfc00000, 0xb9000000, "str",             OP_ARMV8_A64_STR,       DISOPTYPE_HARMLESS),
    442 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS(g_ArmV8A64LdSt, 0 /*fClass*/,
    443                                           kDisArmV8OpcDecodeLookup, 0xbfc00000, 0)
     521DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_PARAMS_2(g_ArmV8A64LdSt, 0 /*fClass*/,
     522                                            kDisArmV8OpcDecodeLookup, 0xbfc00000, 0,
     523                                            kDisArmv8OpParmGpr, kDisArmv8OpParmAddrInGpr)
    444524    DIS_ARMV8_INSN_PARAM_CREATE(   kDisParmParseIs32Bit,       30,  1, DIS_ARMV8_INSN_PARAM_UNSET),
    445525    DIS_ARMV8_INSN_PARAM_CREATE(   kDisParmParseReg,            0,  5, 0 /*idxParam*/),
    446526    DIS_ARMV8_INSN_PARAM_CREATE_EX(kDisParmParseReg,            5,  5, 1 /*idxParam*/, DIS_ARMV8_INSN_PARAM_F_ADDR_BEGIN),
    447527    DIS_ARMV8_INSN_PARAM_CREATE_EX(kDisParmParseImm,           10, 12, 2 /*idxParam*/, DIS_ARMV8_INSN_PARAM_F_ADDR_END),
     528    DIS_ARMV8_INSN_PARAM_NONE
    448529DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END;
    449530
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r105759 r105779  
    2828.private_extern _TestProcA64
    2929_TestProcA64:
     30        ; Miscellaneous instructions without a parameter
    3031        nop
    3132        yield
     
    3637        dgh
    3738        xpaclri
     39
     40        ; Control flow instructions
     41        svc #0xfefe
     42        hvc #0xdead
     43        smc #0xcafe
     44        brk #0xd0d0
     45        hlt #0xc0de
     46;        tcancel #0xd00f Requires FEAT_TME
     47        dcps1   #0xdeca
     48        dcps2   #0xdec0
     49        dcps3   #0xfeed
     50        b #0x100
     51        b #-0x100
     52        bl #0x100
     53        bl #-0x100
     54        b.ne #+0x1000
     55        b.eq #-0x1000
     56;        bc.ne #+0x1000 Requires FEAT_HBC
     57;        bc.eq #-0x1000 Requires FEAT_HBC
     58        cbz x0, #+0x100
     59        cbz x0, #-0x100
     60        cbz w0, #+0x100
     61        cbnz x0, #+0x100
     62        cbnz x0, #-0x100
     63        cbnz w0, #+0x100
     64        tbz w0, #13, #+0x100
     65        tbz x0, #63, #-0x100
     66        tbz w0, #8,  #+0x100
    3867        ret x30
    3968        ret x1
     
    4170        ret x15
    4271
     72        ; System register access instructions
    4373        msr ttbr0_el1, x0
    4474        mrs x0, ttbr0_el1
    4575
    46         b #0x100
    47         b #-0x100
    48         b.ne #+0x1000
    49         b.eq #-0x1000
    50 ;        bc.ne #+0x1000 Requires FEAT_HBC
    51 ;        bc.eq #-0x1000 Requires FEAT_HBC
    52 
     76        ; Arithmetic instructions
    5377        add x0, x0, #0x0
    5478        add w0, w1, #0x10000
     
    7094;       mov w0, w1
    7195
    72         and x0, x0, #0xffff
    73 
    74         ret x30
     96        ; Logical instructions
     97        and  x0,  x0,  #0xffff
     98        and  w0,  wzr, #0xffff
     99
     100        ands x0,  x0,  #0x00ffff00
     101        ands w10, w23, #0x55555555
     102
     103        orr  x0,  x0,  #0xffff
     104        orr  w0,  wzr, #0xffff
     105
     106        eor  x0,  x0,  #0x00ffff00
     107        eor w10, w23,  #0x55555555
     108
     109        sbfm x0, x0, #0x1, #0x2
     110        sbfm w0, w0, #0xf, #0x9
     111        bfm  x0, x0, #0x1, #0x2
     112        bfm  w0, w0, #0xf, #0x9
     113        ubfm x0, x0, #0x1, #0x2
     114        ubfm w0, w0, #0xf, #0x9
     115
     116        movn x0, #0xffff
     117        movn x0, #0xffff, LSL #16
     118        movn w0, #0xffff
     119        movn w0, #0xffff, LSL #16
     120
     121        movz x0, #0xffff
     122        movz x0, #0xffff, LSL #48
     123        movz w0, #0xffff
     124        movz w0, #0xffff, LSL #16
     125
     126        movk x0, #0xffff
     127        movk x0, #0xffff, LSL #32
     128        movk w0, #0xffff
     129        movk w0, #0xffff, LSL #16
     130
     131        ; Logical instructions with a shifted register
     132        and  w0, w0, w27
     133        and  w0, w1, w28, LSL #1
     134        and  w0, w1, w28, LSL #31
     135        and  w0, w1, w28, LSR #1
     136        and  w0, w1, w28, LSR #31
     137        and  w0, w1, w28, ASR #1
     138        and  w0, w1, w28, ASR #31
     139        and  w0, w1, w28, ROR #1
     140        and  w0, w1, w28, ROR #31
     141
     142        and  x0, x0, x27
     143        and  x0, x1, x28, LSL #1
     144        and  x0, x1, x28, LSL #63
     145        and  x0, x1, x28, LSR #1
     146        and  x0, x1, x28, LSR #63
     147        and  x0, x1, x28, ASR #1
     148        and  x0, x1, x28, ASR #63
     149        and  x0, x1, x28, ROR #1
     150        and  x0, x1, x28, ROR #63
     151
     152        orr  w0, w0, w27
     153        orr  w0, w1, w28, LSL #1
     154        orr  w0, w1, w28, LSL #31
     155        orr  w0, w1, w28, LSR #1
     156        orr  w0, w1, w28, LSR #31
     157        orr  w0, w1, w28, ASR #1
     158        orr  w0, w1, w28, ASR #31
     159        orr  w0, w1, w28, ROR #1
     160        orr  w0, w1, w28, ROR #31
     161
     162        orr  x0, x0, x27
     163        orr  x0, x1, x28, LSL #1
     164        orr  x0, x1, x28, LSL #63
     165        orr  x0, x1, x28, LSR #1
     166        orr  x0, x1, x28, LSR #63
     167        orr  x0, x1, x28, ASR #1
     168        orr  x0, x1, x28, ASR #63
     169        orr  x0, x1, x28, ROR #1
     170        orr  x0, x1, x28, ROR #63
     171
     172        eor  w0, w0, w27
     173        eor  w0, w1, w28, LSL #1
     174        eor  w0, w1, w28, LSL #31
     175        eor  w0, w1, w28, LSR #1
     176        eor  w0, w1, w28, LSR #31
     177        eor  w0, w1, w28, ASR #1
     178        eor  w0, w1, w28, ASR #31
     179        eor  w0, w1, w28, ROR #1
     180        eor  w0, w1, w28, ROR #31
     181
     182        eor  x0, x0, x27
     183        eor  x0, x1, x28, LSL #1
     184        eor  x0, x1, x28, LSL #63
     185        eor  x0, x1, x28, LSR #1
     186        eor  x0, x1, x28, LSR #63
     187        eor  x0, x1, x28, ASR #1
     188        eor  x0, x1, x28, ASR #63
     189        eor  x0, x1, x28, ROR #1
     190        eor  x0, x1, x28, ROR #63
     191
     192        ands x0, x0, x27
     193        ands x0, x1, x28, LSL #1
     194        ands x0, x1, x28, LSL #63
     195        ands x0, x1, x28, LSR #1
     196        ands x0, x1, x28, LSR #63
     197        ands x0, x1, x28, ASR #1
     198        ands x0, x1, x28, ASR #63
     199        ands x0, x1, x28, ROR #1
     200        ands x0, x1, x28, ROR #63
     201
     202        bic  w0, w0, w27
     203        bic  w0, w1, w28, LSL #1
     204        bic  w0, w1, w28, LSL #31
     205        bic  w0, w1, w28, LSR #1
     206        bic  w0, w1, w28, LSR #31
     207        bic  w0, w1, w28, ASR #1
     208        bic  w0, w1, w28, ASR #31
     209        bic  w0, w1, w28, ROR #1
     210        bic  w0, w1, w28, ROR #31
     211
     212        bic  x0, x0, x27
     213        bic  x0, x1, x28, LSL #1
     214        bic  x0, x1, x28, LSL #63
     215        bic  x0, x1, x28, LSR #1
     216        bic  x0, x1, x28, LSR #63
     217        bic  x0, x1, x28, ASR #1
     218        bic  x0, x1, x28, ASR #63
     219        bic  x0, x1, x28, ROR #1
     220        bic  x0, x1, x28, ROR #63
     221
     222        orn  w0, w0, w27
     223        orn  w0, w1, w28, LSL #1
     224        orn  w0, w1, w28, LSL #31
     225        orn  w0, w1, w28, LSR #1
     226        orn  w0, w1, w28, LSR #31
     227        orn  w0, w1, w28, ASR #1
     228        orn  w0, w1, w28, ASR #31
     229        orn  w0, w1, w28, ROR #1
     230        orn  w0, w1, w28, ROR #31
     231
     232        orn  x0, x0, x27
     233        orn  x0, x1, x28, LSL #1
     234        orn  x0, x1, x28, LSL #63
     235        orn  x0, x1, x28, LSR #1
     236        orn  x0, x1, x28, LSR #63
     237        orn  x0, x1, x28, ASR #1
     238        orn  x0, x1, x28, ASR #63
     239        orn  x0, x1, x28, ROR #1
     240        orn  x0, x1, x28, ROR #63
     241
     242        eon  w0, w0, w27
     243        eon  w0, w1, w28, LSL #1
     244        eon  w0, w1, w28, LSL #31
     245        eon  w0, w1, w28, LSR #1
     246        eon  w0, w1, w28, LSR #31
     247        eon  w0, w1, w28, ASR #1
     248        eon  w0, w1, w28, ASR #31
     249        eon  w0, w1, w28, ROR #1
     250        eon  w0, w1, w28, ROR #31
     251
     252        eon  x0, x0, x27
     253        eon  x0, x1, x28, LSL #1
     254        eon  x0, x1, x28, LSL #63
     255        eon  x0, x1, x28, LSR #1
     256        eon  x0, x1, x28, LSR #63
     257        eon  x0, x1, x28, ASR #1
     258        eon  x0, x1, x28, ASR #63
     259        eon  x0, x1, x28, ROR #1
     260        eon  x0, x1, x28, ROR #63
     261
     262        bics w0, w0, w27
     263        bics w0, w1, w28, LSL #1
     264        bics w0, w1, w28, LSL #31
     265        bics w0, w1, w28, LSR #1
     266        bics w0, w1, w28, LSR #31
     267        bics w0, w1, w28, ASR #1
     268        bics w0, w1, w28, ASR #31
     269        bics w0, w1, w28, ROR #1
     270        bics w0, w1, w28, ROR #31
     271
     272        bics x0, x0, x27
     273        bics x0, x1, x28, LSL #1
     274        bics x0, x1, x28, LSL #63
     275        bics x0, x1, x28, LSR #1
     276        bics x0, x1, x28, LSR #63
     277        bics x0, x1, x28, ASR #1
     278        bics x0, x1, x28, ASR #63
     279        bics x0, x1, x28, ROR #1
     280        bics x0, x1, x28, ROR #63
     281
     282        ;
     283        ; Keep last so the testcase can catch errors in
     284        ; the disassembly of the last instruction.
     285        ;
     286        nop
    75287
    76288.private_extern _TestProcA64_EndProc
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