From 369da2211be326ed8d2588866c2928319ba3a807 Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Thu, 21 Apr 2016 14:52:03 +0100 Subject: [PATCH] Thumb2: Fix disassembly of the b.w offset. Bug: 28311085 (cherry picked from commit cb55b29e466939d222b83f0593a1141221f2425c) Change-Id: I36ec3ef951ef9d2e5a9e60c0709cfeaf1210ddd0 --- 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 77efb6be2..bcb043883 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); -- 2.11.0