diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2014-03-25 10:31:04 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2014-03-25 10:31:52 -0700 |
commit | 7d180cb41d3104af7c85a5b808bb9f57c264c2a6 (patch) | |
tree | 5834b83ef7395a9ee9c5ceb8f1c4b4f2ae052c91 /disassembler/disassembler_arm.cc | |
parent | 027f7fa539514d2a50b448de1de39ac307087483 (diff) | |
download | android_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.cc | 6 |
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); } } |