Fix the arm's disassembler for blx that was building an MCInst without the
authorKevin Enderby <enderby@apple.com>
Mon, 28 Feb 2011 18:46:31 +0000 (18:46 +0000)
committerKevin Enderby <enderby@apple.com>
Mon, 28 Feb 2011 18:46:31 +0000 (18:46 +0000)
needed two predicate operands before the imm operand.

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

lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
test/MC/Disassembler/ARM/thumb-tests.txt

index 23372e022414d6f54ee140e8e1a439bbcab83ed2..074561c02d619a2d1aba2835b937502dc4dd11d8 100644 (file)
@@ -1719,6 +1719,17 @@ static bool DisassembleThumb2BrMiscCtrl(MCInst &MI, unsigned Opcode,
     return true;
   }
 
+  // Some instructions have predicate operands first before the immediate.
+  if(Opcode == ARM::tBLXi_r9 || Opcode == ARM::tBLr9) {
+    // Handling the two predicate operands before the imm operand.
+    if (B->DoPredicateOperands(MI, Opcode, insn, NumOps))
+      NumOpsAdded += 2;
+    else {
+      DEBUG(errs() << "Expected predicate operands not found.\n");
+      return false;
+    }
+  }
+
   // Add the imm operand.
   int Offset = 0;
 
@@ -1745,7 +1756,8 @@ static bool DisassembleThumb2BrMiscCtrl(MCInst &MI, unsigned Opcode,
   // to compensate.
   MI.addOperand(MCOperand::CreateImm(Offset + 4));
 
-  NumOpsAdded = 1;
+  // This is an increment as some predicate operands may have been added first.
+  NumOpsAdded += 1;
 
   return true;
 }
index 6dab1237a1185b9ed751b9c830596cc3dcdcc911..36f74381a5e66fe98e2c392ce0460ff9b04cf1cf 100644 (file)
 
 # CHECK: msr cpsr_fc, r0
 0x80 0xf3 0x00 0x89
+
+# CHECK: blx   #0
+0xff 0xf7 0xfe 0xef