summaryrefslogtreecommitdiff
path: root/disassembler
diff options
context:
space:
mode:
authorVladimir Marko <vmarko@google.com>2016-04-21 14:52:03 +0100
committerVladimir Marko <vmarko@google.com>2016-04-21 15:17:34 +0100
commitcb55b29e466939d222b83f0593a1141221f2425c (patch)
tree0f9aef9da0889961b1ce00c324e1c56487b9ef53 /disassembler
parent0d399c71cb176b0a31d6d51f950c7c32a43668ef (diff)
Thumb2: Fix disassembly of the b.w offset.
Bug: 28311085 Change-Id: If729af888be65e1f24362b9c4ed79f124446024d
Diffstat (limited to 'disassembler')
-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 77efb6be29..bcb043883b 100644
--- a/disassembler/disassembler_arm.cc
+++ b/disassembler/disassembler_arm.cc
@@ -1262,10 +1262,10 @@ size_t DisassemblerArm::DumpThumb32(std::ostream& os, const uint8_t* instr_ptr)
imm32 = (S << 20) | (J2 << 19) | (J1 << 18) | (imm6 << 12) | (imm11 << 1);
imm32 = (imm32 << 11) >> 11; // sign extend 21 bit immediate.
} else {
- uint32_t I1 = ~(J1 ^ S);
- uint32_t I2 = ~(J2 ^ S);
+ uint32_t I1 = (J1 ^ S) ^ 1;
+ uint32_t I2 = (J2 ^ S) ^ 1;
imm32 = (S << 24) | (I1 << 23) | (I2 << 22) | (imm10 << 12) | (imm11 << 1);
- imm32 = (imm32 << 8) >> 8; // sign extend 24 bit immediate.
+ imm32 = (imm32 << 7) >> 7; // sign extend 25 bit immediate.
}
opcode << ".w";
DumpBranchTarget(args, instr_ptr + 4, imm32);