Thumb disassembler was erroneously rejecting "blx sp" instruction.
authorJohnny Chen <johnny.chen@apple.com>
Mon, 11 Apr 2011 23:33:30 +0000 (23:33 +0000)
committerJohnny Chen <johnny.chen@apple.com>
Mon, 11 Apr 2011 23:33:30 +0000 (23:33 +0000)
rdar://problem/9267838

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129320 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrThumb.td
lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
test/MC/Disassembler/ARM/thumb-tests.txt
utils/TableGen/ARMDecoderEmitter.cpp

index 15ab4557dea612ca51089ddfe87fe3d8ae5b9a2d..e3a9742bc76664e5e65d2612db0d45bce966c0a8 100644 (file)
@@ -369,6 +369,15 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
     let Inst{2-0} = 0b000;
   }
 
+  def tBX_Rm : TI<(outs), (ins pred:$p, GPR:$Rm), IIC_Br, "bx${p}\t$Rm",
+                  [/* for disassembly only */]>,
+               T1Special<{1,1,0,?}> {
+    // A6.2.3 & A8.6.25
+    bits<4> Rm;
+    let Inst{6-3} = Rm;
+    let Inst{2-0} = 0b000;
+  }
+
   // Alternative return instruction used by vararg functions.
   def tBX_RET_vararg : TI<(outs), (ins tGPR:$Rm),
                           IIC_Br, "bx\t$Rm",
index 727fc1332ad922b401e33dfdd36d9cd64c038fe4..85816e02fef4789ef25a902799ad1ae0a04f10b7 100644 (file)
@@ -485,10 +485,13 @@ static bool DisassembleThumb1Special(MCInst &MI, unsigned Opcode, uint32_t insn,
     return true;
 
   // BX/BLX has 1 reg operand: Rm.
-  if (NumOps == 1) {
+  if (Opcode == ARM::tBLXr_r9 || Opcode == ARM::tBX_Rm) {
+    // Handling the two predicate operands before the reg operand.
+    if (!B->DoPredicateOperands(MI, Opcode, insn, NumOps))
+      return false;
     MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
                                                        getT1Rm(insn))));
-    NumOpsAdded = 1;
+    NumOpsAdded = 3;
     return true;
   }
 
index 03a1451d1da2b31a42a5024fbd29b372d2f7d8cd..c3a15d012fd9c1b1691052cfce08c20aeb365199 100644 (file)
 
 # CHECK:       lsr.w   r10, r0, #32
 0x4f 0xea 0x10 0x0a
+
+# CHECK:       blx     sp
+0xe8 0x47
+
+# CHECK:       bx      lr
+0x70 0x47
+
+# CHECK:       bx      pc
+0x78 0x47
index e48ac1e67882b930fc363bc93da7c422e4030b96..07ff213bed9248553745106c070a85c39f4503bb 100644 (file)
@@ -1624,6 +1624,10 @@ ARMDEBackend::populateInstruction(const CodeGenInstruction &CGI,
     if (Name == "tBL" || Name == "tBLXi" || Name == "tBLXr")
       return false;
 
+    // A8.6.25 BX.  Use the generic tBX_Rm, ignore tBX_RET and tBX_RET_vararg.
+    if (Name == "tBX_RET" || Name == "tBX_RET_vararg")
+      return false;
+
     // Ignore the TPsoft (TLS) instructions, which conflict with tBLr9.
     if (Name == "tTPsoft" || Name == "t2TPsoft")
       return false;