From 7d180cb41d3104af7c85a5b808bb9f57c264c2a6 Mon Sep 17 00:00:00 2001 From: Dmitriy Ivanov Date: Tue, 25 Mar 2014 10:31:04 -0700 Subject: [PATCH] Fix imm5 and shift_type detection Bug: 13628315 Change-Id: I8ff044cc18721b7ea50c75c796a2fb63a1e189f9 --- disassembler/disassembler_arm.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/disassembler/disassembler_arm.cc b/disassembler/disassembler_arm.cc index 161a7265a..55fd52f08 100644 --- a/disassembler/disassembler_arm.cc +++ b/disassembler/disassembler_arm.cc @@ -565,8 +565,8 @@ size_t DisassemblerArm::DumpThumb32(std::ostream& os, const uint8_t* instr_ptr) uint32_t S = (instr >> 20) & 1; uint32_t imm3 = ((instr >> 12) & 0x7); uint32_t imm2 = ((instr >> 6) & 0x3); - uint32_t imm5 = ((imm3 << 3) | imm2) & 0x1F; - uint32_t shift_type = ((instr >> 4) & 0x2); + uint32_t imm5 = ((imm3 << 2) | imm2); + uint32_t shift_type = ((instr >> 4) & 0x3); ArmRegister Rd(instr, 8); ArmRegister Rn(instr, 16); ArmRegister Rm(instr, 0); @@ -672,7 +672,7 @@ size_t DisassemblerArm::DumpThumb32(std::ostream& os, const uint8_t* instr_ptr) break; } if (shift_type != 0x3 /* rrx */) { - args << StringPrintf(" #%d", imm5); + args << StringPrintf(" #%d", (0 != imm5 || 0 == shift_type) ? imm5 : 32); } } -- 2.11.0