[llvm-commits] [llvm] r135442 - in /llvm/trunk: lib/Target/ARM/ARMInstrThumb.td lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp utils/TableGen/ARMDecoderEmitter.cpp

Owen Anderson resistor at mac.com
Mon Jul 18 16:25:34 PDT 2011


Author: resistor
Date: Mon Jul 18 18:25:34 2011
New Revision: 135442

URL: http://llvm.org/viewvc/llvm-project?rev=135442&view=rev
Log:
Revamp our handling of tLDMIA[_UPD] and tSTMIA[_UPD] to avoid having multiple instructions with the same encoding.  This resolves another conflict when bringing up the new-style disassembler.

Modified:
    llvm/trunk/lib/Target/ARM/ARMInstrThumb.td
    llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
    llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
    llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp

Modified: llvm/trunk/lib/Target/ARM/ARMInstrThumb.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMInstrThumb.td?rev=135442&r1=135441&r2=135442&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMInstrThumb.td (original)
+++ llvm/trunk/lib/Target/ARM/ARMInstrThumb.td Mon Jul 18 18:25:34 2011
@@ -717,7 +717,7 @@
 
 multiclass thumb_ldst_mult<string asm, InstrItinClass itin,
                            InstrItinClass itin_upd, bits<6> T1Enc,
-                           bit L_bit> {
+                           bit L_bit, string baseOpc> {
   def IA :
     T1I<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
         itin, !strconcat(asm, "ia${p}\t$Rn, $regs"), []>,
@@ -727,14 +727,19 @@
     let Inst{10-8} = Rn;
     let Inst{7-0}  = regs;
   }
+
   def IA_UPD :
-    T1It<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
-         itin_upd, !strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []>,
-        T1Encoding<T1Enc> {
-    bits<3> Rn;
-    bits<8> regs;
-    let Inst{10-8} = Rn;
-    let Inst{7-0}  = regs;
+    InstTemplate<AddrModeNone, 0, IndexModeNone, Pseudo, GenericDomain, 
+                 "$Rn = $wb", itin_upd>,
+    PseudoInstExpansion<(!cast<Instruction>(!strconcat(baseOpc, "IA"))
+                       GPR:$Rn, pred:$p, reglist:$regs)> {
+    let Size = 2;
+    let OutOperandList = (outs GPR:$wb);
+    let InOperandList = (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops);
+    let Pattern = [];
+    let isCodeGenOnly = 1;
+    let isPseudo = 1;
+    list<Predicate> Predicates = [IsThumb];
   }
 }
 
@@ -743,11 +748,11 @@
 
 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in
 defm tLDM : thumb_ldst_mult<"ldm", IIC_iLoad_m, IIC_iLoad_mu,
-                            {1,1,0,0,1,?}, 1>;
+                            {1,1,0,0,1,?}, 1, "tLDM">;
 
 let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
 defm tSTM : thumb_ldst_mult<"stm", IIC_iStore_m, IIC_iStore_mu,
-                            {1,1,0,0,0,?}, 0>;
+                            {1,1,0,0,0,?}, 0, "tSTM">;
 
 } // neverHasSideEffects
 

Modified: llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h?rev=135442&r1=135441&r2=135442&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h (original)
+++ llvm/trunk/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h Mon Jul 18 18:25:34 2011
@@ -891,8 +891,8 @@
 static bool DisassembleThumb1LdStMul(bool Ld, MCInst &MI, unsigned Opcode,
                                      uint32_t insn, unsigned short NumOps,
                                      unsigned &NumOpsAdded, BO B) {
-  assert((Opcode == ARM::tLDMIA || Opcode == ARM::tLDMIA_UPD ||
-          Opcode == ARM::tSTMIA_UPD) && "Unexpected opcode");
+  assert((Opcode == ARM::tLDMIA || Opcode == ARM::tSTMIA) &&
+         "Unexpected opcode");
 
   unsigned tRt = getT1tRt(insn);
   NumOpsAdded = 0;

Modified: llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp?rev=135442&r1=135441&r2=135442&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp Mon Jul 18 18:25:34 2011
@@ -109,6 +109,29 @@
     return;
   }
 
+  if (Opcode == ARM::tLDMIA || Opcode == ARM::tSTMIA) {
+    bool Writeback = true;
+    unsigned BaseReg = MI->getOperand(0).getReg();
+    for (unsigned i = 3; i < MI->getNumOperands(); ++i) {
+      if (MI->getOperand(i).getReg() == BaseReg)
+        Writeback = false;
+    }
+
+    if (Opcode == ARM::tLDMIA)
+      O << "\tldmia";
+    else if (Opcode == ARM::tSTMIA)
+      O << "\tstmia";
+    else
+      llvm_unreachable("Unknown opcode!");
+
+    printPredicateOperand(MI, 1, O);
+    O << '\t' << getRegisterName(BaseReg);
+    if (Writeback) O << "!";
+    O << ", ";
+    printRegisterList(MI, 3, O);
+    return;
+  }
+
   printInstruction(MI, O);
 }
 

Modified: llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp?rev=135442&r1=135441&r2=135442&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/ARMDecoderEmitter.cpp Mon Jul 18 18:25:34 2011
@@ -1614,11 +1614,6 @@
     if (!thumbInstruction(Form))
       return false;
 
-    // A8.6.189 STM / STMIA / STMEA -- Encoding T1
-    // There's only STMIA_UPD for Thumb1.
-    if (Name == "tSTMIA")
-      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;





More information about the llvm-commits mailing list