VirtualBox

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


Ignore:
Timestamp:
Aug 21, 2024 8:06:23 PM (8 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164508
Message:

Disassembler/ARMv8: Start some very simple alias conversion for orr -> mov and subs -> cmp which are the most common, bugref:10394

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

Legend:

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

    r105794 r105796  
    458458
    459459
     460/**
     461 * Looks for possible alias conversions for the given disassembler state.
     462 *
     463 * @param   pDis        The disassembler state to process.
     464 */
     465static void disArmV8A64InsnAliasesProcess(PDISSTATE pDis)
     466{
     467#define DIS_ARMV8_ALIAS(a_Name) s_DisArmv8Alias ## a_Name
     468#define DIS_ARMV8_ALIAS_CREATE(a_Name, a_szOpcode, a_uOpcode, a_fOpType) static const DISOPCODE DIS_ARMV8_ALIAS(a_Name) = OP(a_szOpcode, 0, 0, 0, a_uOpcode, 0, 0, 0, a_fOpType)
     469#define DIS_ARMV8_ALIAS_REF(a_Name) &DIS_ARMV8_ALIAS(a_Name)
     470    switch (pDis->pCurInstr->uOpcode)
     471    {
     472        case OP_ARMV8_A64_ORR:
     473        {
     474            /* Check for possible MOV conversion for the register variant when: shift is None and the first source is the zero register. */
     475            Assert(pDis->aParams[1].armv8.enmType == kDisArmv8OpParmGpr);
     476
     477            if (   pDis->aParams[2].armv8.enmType == kDisArmv8OpParmGpr
     478                && pDis->aParams[2].armv8.enmShift == kDisArmv8OpParmShiftNone
     479                && pDis->aParams[1].armv8.Reg.idxGenReg == ARMV8_A64_REG_XZR)
     480            {
     481                DIS_ARMV8_ALIAS_CREATE(Mov, "mov", OP_ARMV8_A64_MOV, DISOPTYPE_HARMLESS);
     482                pDis->pCurInstr  = DIS_ARMV8_ALIAS_REF(Mov);
     483                pDis->aParams[1] = pDis->aParams[2];
     484                pDis->aParams[2].armv8.enmType = kDisArmv8OpParmNone;
     485            }
     486            /** @todo Immediate variant. */
     487            break;
     488        }
     489        case OP_ARMV8_A64_SUBS:
     490        {
     491            Assert(pDis->aParams[0].armv8.enmType == kDisArmv8OpParmGpr);
     492            if (pDis->aParams[0].armv8.Reg.idxGenReg == ARMV8_A64_REG_XZR)
     493            {
     494                DIS_ARMV8_ALIAS_CREATE(Cmp, "cmp", OP_ARMV8_A64_CMP, DISOPTYPE_HARMLESS);
     495                pDis->pCurInstr  = DIS_ARMV8_ALIAS_REF(Cmp);
     496                pDis->aParams[0] = pDis->aParams[1];
     497                pDis->aParams[1] = pDis->aParams[2];
     498                pDis->aParams[2].armv8.enmType = kDisArmv8OpParmNone;
     499            }
     500            break;
     501        }
     502        default:
     503            break; /* No conversion */
     504    }
     505#undef DIS_ARMV8_ALIAS_REF
     506#undef DIS_ARMV8_ALIAS_CREATE
     507#undef DIS_ARMV8_ALIAS
     508}
     509
     510
    460511static int disArmV8A64ParseInstruction(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass)
    461512{
     
    500551
    501552    /* If parameter parsing returned an invalid opcode error the encoding is invalid. */
    502     if (rc == VERR_DIS_INVALID_OPCODE)
     553    if (RT_SUCCESS(rc)) /** @todo Introduce flag to switch alias conversion on/off. */
     554        disArmV8A64InsnAliasesProcess(pDis);
     555    else if (rc == VERR_DIS_INVALID_OPCODE)
    503556    {
    504557        pDis->pCurInstr = &g_ArmV8A64InvalidOpcode[0];
  • trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S

    r105793 r105796  
    177177        ; ROR is reserved
    178178
    179 ;       mov x0, x1 @todo Aliases are not supported right now.
    180 ;       mov w0, w1
     179        ; Aliases of subs -> cmp
     180        cmp x0, x1
     181        cmp w0, w1
     182        cmp x0, x1, LSL #1
     183        cmp w0, w1, LSL #1
    181184
    182185        ; Logical instructions
     
    189192        orr  x0,  x0,  #0xffff
    190193        orr  w0,  wzr, #0xffff
     194
     195        mov x0, x1 ; Alias of orr
     196        mov w0, w1 ; Alias of orr
    191197
    192198        eor  x0,  x0,  #0x00ffff00
Note: See TracChangeset for help on using the changeset viewer.

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