summaryrefslogtreecommitdiffstats
path: root/disassembler/disassembler_arm.cc
diff options
context:
space:
mode:
authorDmitriy Ivanov <dimitry@google.com>2014-03-25 10:31:04 -0700
committerDmitriy Ivanov <dimitry@google.com>2014-03-25 10:31:52 -0700
commit7d180cb41d3104af7c85a5b808bb9f57c264c2a6 (patch)
tree5834b83ef7395a9ee9c5ceb8f1c4b4f2ae052c91 /disassembler/disassembler_arm.cc
parent027f7fa539514d2a50b448de1de39ac307087483 (diff)
downloadandroid_art-7d180cb41d3104af7c85a5b808bb9f57c264c2a6.tar.gz
android_art-7d180cb41d3104af7c85a5b808bb9f57c264c2a6.tar.bz2
android_art-7d180cb41d3104af7c85a5b808bb9f57c264c2a6.zip
Fix imm5 and shift_type detection
Bug: 13628315 Change-Id: I8ff044cc18721b7ea50c75c796a2fb63a1e189f9
Diffstat (limited to 'disassembler/disassembler_arm.cc')
-rw-r--r--disassembler/disassembler_arm.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/disassembler/disassembler_arm.cc b/disassembler/disassembler_arm.cc
index 161a7265ac..55fd52f080 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);
}
}