Changeset 105796 in vbox for trunk/src/VBox/Disassembler
- Timestamp:
- Aug 21, 2024 8:06:23 PM (8 months ago)
- svn:sync-xref-src-repo-rev:
- 164508
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore-armv8.cpp
r105794 r105796 458 458 459 459 460 /** 461 * Looks for possible alias conversions for the given disassembler state. 462 * 463 * @param pDis The disassembler state to process. 464 */ 465 static 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 460 511 static int disArmV8A64ParseInstruction(PDISSTATE pDis, uint32_t u32Insn, PCDISARMV8OPCODE pOp, PCDISARMV8INSNCLASS pInsnClass) 461 512 { … … 500 551 501 552 /* 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) 503 556 { 504 557 pDis->pCurInstr = &g_ArmV8A64InvalidOpcode[0]; -
trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S
r105793 r105796 177 177 ; ROR is reserved 178 178 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 181 184 182 185 ; Logical instructions … … 189 192 orr x0, x0, #0xffff 190 193 orr w0, wzr, #0xffff 194 195 mov x0, x1 ; Alias of orr 196 mov w0, w1 ; Alias of orr 191 197 192 198 eor x0, x0, #0x00ffff00
Note:
See TracChangeset
for help on using the changeset viewer.