OSDN Git Service

Thumb2: Fix disassembly of the b.w offset.
authorVladimir Marko <vmarko@google.com>
Thu, 21 Apr 2016 13:52:03 +0000 (14:52 +0100)
committerVladimir Marko <vmarko@google.com>
Thu, 21 Apr 2016 14:41:09 +0000 (15:41 +0100)
Bug: 28311085

(cherry picked from commit cb55b29e466939d222b83f0593a1141221f2425c)

Change-Id: I36ec3ef951ef9d2e5a9e60c0709cfeaf1210ddd0

disassembler/disassembler_arm.cc

index 77efb6b..bcb0438 100644 (file)
@@ -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);