Changeset 106768 in vbox
- Timestamp:
- Oct 29, 2024 11:16:24 AM (5 months ago)
- svn:sync-xref-src-repo-rev:
- 165656
- Location:
- trunk/src/VBox/Disassembler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmCore-armv8.cpp
r106760 r106768 198 198 DECLINLINE(int32_t) disArmV8ExtractBitVecFromInsnSignExtend(uint32_t u32Insn, uint8_t idxBitStart, uint8_t cBits) 199 199 { 200 uint32_t fMask = RT_BIT_32(idxBitStart + cBits) - 1; 201 uint32_t fSign = ~(UINT32_MAX & (RT_BIT_32(cBits - 1) - 1)); 202 uint32_t fValue = (u32Insn & fMask) >> idxBitStart; 203 if (fValue & fSign) 204 return (int32_t)(fValue | fSign); 205 206 return (int32_t)fValue; 200 uint32_t const fMask = RT_BIT_32(cBits) - 1; 201 uint32_t const fSignBit = RT_BIT_32(cBits - 1); 202 uint32_t const u32 = (u32Insn >> idxBitStart) & fMask; 203 return (int32_t)((u32 ^ fSignBit) - fSignBit); 207 204 } 208 205 -
trunk/src/VBox/Disassembler/DisasmTables-armv8-a64-ld-st.cpp.h
r106767 r106768 997 997 998 998 999 /* LDR/LDRSW/PRFM - literal variant. */ 1000 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdRegLiteralGpr) 1001 DIS_ARMV8_INSN_DECODE(kDisParmParseGprZr, 0, 5, 0 /*idxParam*/), 1002 DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel, 5, 19, 1 /*idxParam*/), 1003 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdRegLiteralGpr) 1004 DIS_ARMV8_OP_EX(0x18000000, "ldr", OP_ARMV8_A64_LDR, DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_32BIT), 1005 DIS_ARMV8_OP_EX(0x58000000, "ldr", OP_ARMV8_A64_LDR, DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT), 1006 DIS_ARMV8_OP_EX(0x98000000, "ldrsw", OP_ARMV8_A64_LDRSW, DISOPTYPE_HARMLESS, DISARMV8INSNCLASS_F_FORCED_64BIT), 1007 INVALID_OPCODE, /** @todo PRFM */ 1008 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdRegLiteralGpr, 0xff000000 /*fFixedInsn*/, 1009 kDisArmV8OpcDecodeNop, 1010 RT_BIT_32(30) | RT_BIT_32(31), 30); 1011 1012 1013 /* SIMD LDR - literal variant. */ 1014 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER(LdRegLiteralSimd) 1015 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize32, 0, 0, DIS_ARMV8_INSN_PARAM_UNSET), 1016 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar, 0, 5, 0 /*idxParam*/), 1017 DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel, 5, 19, 1 /*idxParam*/), 1018 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdRegLiteralSimd64) 1019 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize64, 0, 0, DIS_ARMV8_INSN_PARAM_UNSET), 1020 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar, 0, 5, 0 /*idxParam*/), 1021 DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel, 5, 19, 1 /*idxParam*/), 1022 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_DECODER_ALTERNATIVE(LdRegLiteralSimd128) 1023 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegSize128, 0, 0, DIS_ARMV8_INSN_PARAM_UNSET), 1024 DIS_ARMV8_INSN_DECODE(kDisParmParseSimdRegScalar, 0, 5, 0 /*idxParam*/), 1025 DIS_ARMV8_INSN_DECODE(kDisParmParseImmRel, 5, 19, 1 /*idxParam*/), 1026 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_BEGIN(LdRegLiteralSimd) 1027 DIS_ARMV8_OP( 0x1c000000, "ldr", OP_ARMV8_A64_LDR, DISOPTYPE_HARMLESS), 1028 DIS_ARMV8_OP_ALT_DECODE(0x5c000000, "ldr", OP_ARMV8_A64_LDR, DISOPTYPE_HARMLESS, LdRegLiteralSimd64), 1029 DIS_ARMV8_OP_ALT_DECODE(0x9c000000, "ldr", OP_ARMV8_A64_LDR, DISOPTYPE_HARMLESS, LdRegLiteralSimd128), 1030 DIS_ARMV8_DECODE_INSN_CLASS_DEFINE_END(LdRegLiteralSimd, 0xff000000 /*fFixedInsn*/, 1031 kDisArmV8OpcDecodeNop, 1032 RT_BIT_32(30) | RT_BIT_32(31), 30); 1033 1034 1035 /* 1036 * C4.1.94.19 - Loads and Stores - Load register (literal) variants 1037 * 1038 * Differentiate further based on the VR field. 1039 * 1040 * Bit 26 1041 * +------------------------------------------- 1042 * 0 GPR variants. 1043 * 1 SIMD/FP variants 1044 */ 1045 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdRegLiteral) 1046 DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteralGpr), 1047 DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteralSimd), 1048 DIS_ARMV8_DECODE_MAP_DEFINE_END(LdRegLiteral, RT_BIT_32(26), 26); 1049 1050 1051 /** 1052 * C4.1.94 - Loads and Stores 1053 * 1054 * Differentiate between Load register (literal) and the other classes based on op2<14> (bit 24). 1055 */ 1056 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStBit28_1_Bit29_0) 1057 DIS_ARMV8_DECODE_MAP_ENTRY(LdRegLiteral), 1058 DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo RCW compare and swap / 128-bit atomic memory instructions / GCS load/store / Load/store memory tags / LDIAPP/STILP / LDAPR/STLR / Memory Copy and Set */ 1059 DIS_ARMV8_DECODE_MAP_DEFINE_END_SINGLE_BIT(LdStBit28_1_Bit29_0, 24); 1060 1061 999 1062 /* 1000 1063 * C4.1.94 - Loads and Stores … … 1014 1077 DIS_ARMV8_DECODE_MAP_DEFINE_BEGIN(LdStOp0Lo) 1015 1078 DIS_ARMV8_DECODE_MAP_INVALID_ENTRY, /** @todo */ 1016 DIS_ARMV8_DECODE_MAP_ INVALID_ENTRY, /** @todo */1079 DIS_ARMV8_DECODE_MAP_ENTRY(LdStBit28_1_Bit29_0), 1017 1080 DIS_ARMV8_DECODE_MAP_ENTRY(LdStRegPair), 1018 1081 DIS_ARMV8_DECODE_MAP_ENTRY(LdStReg), -
trunk/src/VBox/Disassembler/testcase/tstDisasmArmv8-1-asm.S
r106767 r106768 3573 3573 3574 3574 ; 3575 ; LDR literal variants 3576 ; 3577 3578 ldr w0, #0 3579 ldr wzr, #0xffffc 3580 ldr wzr, #-0xffffc 3581 3582 ldr x0, #0 3583 ldr xzr, #0xffffc 3584 ldr xzr, #-0xffffc 3585 3586 ldrsw x0, #0 3587 ldrsw xzr, #0xffffc 3588 ldrsw xzr, #-0xffffc 3589 3590 ldr s0, #0 3591 ldr s31, #0xffffc 3592 ldr s31, #-0xffffc 3593 3594 ldr d0, #0 3595 ldr d31, #0xffffc 3596 ldr d31, #-0xffffc 3597 3598 ldr q0, #0 3599 ldr q31, #0xffffc 3600 ldr q31, #-0xffffc 3601 3602 ; 3575 3603 ; Keep last so the testcase can catch errors in 3576 3604 ; the disassembly of the last instruction.
Note:
See TracChangeset
for help on using the changeset viewer.