From 73dd26fb7548619e3e6939ece0e19d45af28d967 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 8 Mar 2015 11:26:45 +0100 Subject: [PATCH] More ARM64 disasm, warning fixes --- Common/Arm64Emitter.cpp | 26 ++++++++++++-------------- Common/ArmEmitter.h | 2 +- Core/Util/DisArm64.cpp | 31 +++++++++++++++++++++++++++---- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/Common/Arm64Emitter.cpp b/Common/Arm64Emitter.cpp index 402bdde161..8c4705341b 100644 --- a/Common/Arm64Emitter.cpp +++ b/Common/Arm64Emitter.cpp @@ -315,8 +315,6 @@ void ARM64XEmitter::FlushIcacheSection(u8* start, u8* end) #endif } - - // Exception generation static const u32 ExcEnc[][3] = { {0, 0, 1}, // SVC @@ -2311,7 +2309,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) if (size == 8) { - S = index & 4; + S = (index & 4) != 0; opcode = 0; encoded_size = index & 3; if (index & 8) @@ -2322,7 +2320,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) } else if (size == 16) { - S = index & 2; + S = (index & 2) != 0; opcode = 2; encoded_size = (index & 1) << 1; if (index & 4) @@ -2333,7 +2331,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) } else if (size == 32) { - S = index & 1; + S = (index & 1) != 0; opcode = 4; encoded_size = 0; if (index & 2) @@ -2364,7 +2362,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re if (size == 8) { - S = index & 4; + S = (index & 4) != 0; opcode = 0; encoded_size = index & 3; if (index & 8) @@ -2375,7 +2373,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re } else if (size == 16) { - S = index & 2; + S = (index & 2) != 0; opcode = 2; encoded_size = (index & 1) << 1; if (index & 4) @@ -2386,7 +2384,7 @@ void ARM64FloatEmitter::LD1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re } else if (size == 32) { - S = index & 1; + S = (index & 1) != 0; opcode = 4; encoded_size = 0; if (index & 2) @@ -2422,7 +2420,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) if (size == 8) { - S = index & 4; + S = (index & 4) != 0; opcode = 0; encoded_size = index & 3; if (index & 8) @@ -2433,7 +2431,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) } else if (size == 16) { - S = index & 2; + S = (index & 2) != 0; opcode = 2; encoded_size = (index & 1) << 1; if (index & 4) @@ -2444,7 +2442,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn) } else if (size == 32) { - S = index & 1; + S = (index & 1) != 0; opcode = 4; encoded_size = 0; if (index & 2) @@ -2475,7 +2473,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re if (size == 8) { - S = index & 4; + S = (index & 4) != 0; opcode = 0; encoded_size = index & 3; if (index & 8) @@ -2486,7 +2484,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re } else if (size == 16) { - S = index & 2; + S = (index & 2) != 0; opcode = 2; encoded_size = (index & 1) << 1; if (index & 4) @@ -2497,7 +2495,7 @@ void ARM64FloatEmitter::ST1(u8 size, ARM64Reg Rt, u8 index, ARM64Reg Rn, ARM64Re } else if (size == 32) { - S = index & 1; + S = (index & 1) != 0; opcode = 4; encoded_size = 0; if (index & 2) diff --git a/Common/ArmEmitter.h b/Common/ArmEmitter.h index 747552400d..67f17d8ea8 100644 --- a/Common/ArmEmitter.h +++ b/Common/ArmEmitter.h @@ -854,7 +854,7 @@ public: // Load pointers without casting template void MOVP2R(ARMReg reg, T *val) { - MOVI2R(reg, (uintptr_t)(void *)val); + MOVI2R(reg, (u32)(uintptr_t)(void *)val); } void MOVIU2F(ARMReg dest, u32 val, ARMReg tempReg, bool negate = false) { diff --git a/Core/Util/DisArm64.cpp b/Core/Util/DisArm64.cpp index 4a35148074..b51761a8ed 100644 --- a/Core/Util/DisArm64.cpp +++ b/Core/Util/DisArm64.cpp @@ -36,8 +36,34 @@ int SignExtend26(int x) { return (x & 0x02000000) ? (0xFC000000 | x) : x; } +int SignExtend19(int x) { + return (x & 0x00040000) ? (0xFFF80000 | x) : x; +} + static void DataProcessingImmediate(uint32_t w, uint64_t addr, Instruction *instr) { - snprintf(instr->text, sizeof(instr->text), "(DPI %08x)", w); + int Rd = w & 0x1f; + int Rn = (w >> 5) & 0x1f; + char r = ((w >> 31) & 1) ? 'x' : 'w'; + if (((w >> 23) & 0x3f) == 0x25) { + int imm16 = (w >> 5) & 0xFFFF; + int opc = (w >> 29) & 3; + int shift = ((w >> 22) & 0x3) << 16; + const char *opnames[4] = { "movn", "(undef)", "movz", "movk" }; + snprintf(instr->text, sizeof(instr->text), "%s %c%d, 0x%04x << %d", opnames[opc], r, Rd, imm16, shift); + } else if (((w >> 24) & 0x1F) == 0x10) { + int op = w >> 31; + int imm = SignExtend19((w >> 5) & 0x7FFFF); + if (op & 1) imm <<= 12; + u64 daddr = addr + imm; + snprintf(instr->text, sizeof(instr->text), "%s x%d, 0x%04x%08x", op ? "adrp" : "adr", w, daddr >> 32, daddr & 0xFFFFFFFF); + } else if (((w >> 24) & 0x1F) == 0x11) { + int imm = ((w >> 10) & 0xFFF); + int shift = ((w >> 22) & 0x3) << 16; + imm <<= shift; + snprintf(instr->text, sizeof(instr->text), "add/sub %c%d, %c%d, %d", r, Rd, r, Rn, imm); + } else { + snprintf(instr->text, sizeof(instr->text), "(DPI %08x)", w); + } } static void BranchExceptionAndSystem(uint32_t w, uint64_t addr, Instruction *instr) { @@ -82,9 +108,6 @@ static void DataProcessingRegister(uint32_t w, uint64_t addr, Instruction *instr } else { snprintf(instr->text, sizeof(instr->text), "%s%s %c%d, %c%d, %c%d", sub ? "sub" : "add", S ? "s" : "", r, rd, r, rn, r, rm); } - } else if (((w >> 23) & 0x3f) == 0x25) { - int imm16 = (w >> 5) & 0xFFFF; - snprintf(instr->text, sizeof(instr->text), "%s %c%d, 0x%04x", "movew", r, rd, imm16); } else { snprintf(instr->text, sizeof(instr->text), "(DPR %08x)", w); }