summaryrefslogtreecommitdiffstats
path: root/src/disassembler_arm.cc
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-04-11 11:23:23 -0700
committerElliott Hughes <enh@google.com>2012-04-11 11:23:23 -0700
commitd86261ed72e4fb294f602e1831306612291b0f24 (patch)
tree822900e7da746a64747e0d829ee938eccc516814 /src/disassembler_arm.cc
parent61a9c617f9690b0132580efa2062de88845450dd (diff)
downloadart-d86261ed72e4fb294f602e1831306612291b0f24.zip
art-d86261ed72e4fb294f602e1831306612291b0f24.tar.gz
art-d86261ed72e4fb294f602e1831306612291b0f24.tar.bz2
Sign-extend ARM B targets.
Examples: 0x60cdd7c4: 1a00000b bne 44 (0x60cdd7f8) 0x60cdd804: eaffffef b -68 (0x60cdd7c8) Change-Id: Id8c895dcd6153654975e652fa28638a15e00b538
Diffstat (limited to 'src/disassembler_arm.cc')
-rw-r--r--src/disassembler_arm.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/disassembler_arm.cc b/src/disassembler_arm.cc
index 2baf02c..4726c63 100644
--- a/src/disassembler_arm.cc
+++ b/src/disassembler_arm.cc
@@ -251,7 +251,8 @@ void DisassemblerArm::DumpArm(std::ostream& os, const uint8_t* instr_ptr) {
{
bool bl = (instruction & (1 << 24)) != 0;
opcode = (bl ? "bl" : "b");
- uint32_t imm32 = (instruction & 0xffffff) << 2;
+ int32_t imm26 = (instruction & 0xffffff) << 2;
+ int32_t imm32 = (imm26 << 6) >> 6; // Sign extend.
DumpBranchTarget(args, instr_ptr + 8, imm32);
}
break;