Modify DisassembleThumb2LdStEx() to be more robust/correct in light of recent change to
authorJohnny Chen <johnny.chen@apple.com>
Fri, 25 Mar 2011 18:29:49 +0000 (18:29 +0000)
committerJohnny Chen <johnny.chen@apple.com>
Fri, 25 Mar 2011 18:29:49 +0000 (18:29 +0000)
t2LDREX/t2STREX instructions.  Add two test cases.

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

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

index c2dd6a1e9e7d242edc8d2cbb54276bf41154f2a4..797968840b407472ba7133f803ef88dbe58ec1f7 100644 (file)
@@ -1194,8 +1194,8 @@ static bool DisassembleThumb2LdStEx(MCInst &MI, unsigned Opcode, uint32_t insn,
   OpIdx = 0;
 
   assert(NumOps >= 2
-         && OpInfo[0].RegClass == ARM::GPRRegClassID
-         && OpInfo[1].RegClass == ARM::GPRRegClassID
+         && OpInfo[0].RegClass > 0
+         && OpInfo[1].RegClass > 0
          && "Expect >=2 operands and first two as reg operands");
 
   bool isStore = (ARM::t2STREX <= Opcode && Opcode <= ARM::t2STREXH);
@@ -1205,25 +1205,25 @@ static bool DisassembleThumb2LdStEx(MCInst &MI, unsigned Opcode, uint32_t insn,
   // Add the destination operand for store.
   if (isStore) {
     MI.addOperand(MCOperand::CreateReg(
-                    getRegisterEnum(B, ARM::GPRRegClassID,
+                    getRegisterEnum(B, OpInfo[OpIdx].RegClass,
                                     isSW ? decodeRs(insn) : decodeRm(insn))));
     ++OpIdx;
   }
 
   // Source operand for store and destination operand for load.
-  MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
+  MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
                                                      decodeRd(insn))));
   ++OpIdx;
 
   // Thumb2 doubleword complication: with an extra source/destination operand.
   if (isDW) {
-    MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
+    MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B,OpInfo[OpIdx].RegClass,
                                                        decodeRs(insn))));
     ++OpIdx;
   }
 
   // Finally add the pointer operand.
-  MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, ARM::GPRRegClassID,
+  MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, OpInfo[OpIdx].RegClass,
                                                      decodeRn(insn))));
   ++OpIdx;
 
index 666e9f5f47b6a24056be696911e7e0875ab69609..ce16f750cbd6265b255d11e0b6f3e93bad6e258b 100644 (file)
 
 # CHECK:       ldrd    r3, r8, [r11, #-60]
 0x5b 0xe9 0x0f 0x38
+
+# CHECK:       ldrex   r8, [r2]
+0x52 0xe8 0x00 0x8f
+
+# CHECK:       strexd  r1, r7, r8, [r2]
+0xc2 0xe8 0x71 0x78