Added Thumb IT instruction.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 9 Jul 2009 23:43:36 +0000 (23:43 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 9 Jul 2009 23:43:36 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75198 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMInstrThumb.td
lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp

index fb7453a912b30cb4a4fa2cca3ffb5070c96def73..5642710b5caab9a03ed226379cd3d66d62274ddf 100644 (file)
@@ -66,6 +66,11 @@ def thumb_immshifted_shamt : SDNodeXForm<imm, [{
   return CurDAG->getTargetConstant(V, MVT::i32);
 }]>;
 
+// IT block condition mask
+def it_mask : Operand<i32> {
+  let PrintMethod = "printThumbITMask";
+}
+
 // Define Thumb specific addressing modes.
 
 // t_addrmode_rr := reg + reg
@@ -207,6 +212,10 @@ let isBranch = 1, isTerminator = 1 in
   def tBcc : T1I<(outs), (ins brtarget:$target, pred:$cc), "b$cc $target",
                  [/*(ARMbrcond bb:$target, imm:$cc)*/]>;
 
+// IT block
+def tIT : TI<(outs), (ins pred:$cc, it_mask:$mask),
+             "it$mask $cc", []>;
+
 //===----------------------------------------------------------------------===//
 //  Load Store Instructions.
 //
index 6844c6dd272f6610890b3f659253edfc3d228e94..5559a5ef8d644d8989defb9089dab53273bd9fd5 100644 (file)
@@ -111,6 +111,7 @@ namespace {
                                 const char *Modifier = 0);
     void printBitfieldInvMaskImmOperand (const MachineInstr *MI, int OpNum);
 
+    void printThumbITMask(const MachineInstr *MI, int OpNum);
     void printThumbAddrModeRROperand(const MachineInstr *MI, int OpNum);
     void printThumbAddrModeRI5Operand(const MachineInstr *MI, int OpNum,
                                       unsigned Scale);
@@ -635,6 +636,21 @@ ARMAsmPrinter::printBitfieldInvMaskImmOperand(const MachineInstr *MI, int Op) {
 
 //===--------------------------------------------------------------------===//
 
+void
+ARMAsmPrinter::printThumbITMask(const MachineInstr *MI, int Op) {
+  // (3 - the number of trailing zeros) is the number of then / else.
+  unsigned Mask = MI->getOperand(Op).getImm();
+  unsigned NumTZ = CountTrailingZeros_32(Mask);
+  assert(NumTZ <= 3 && "Invalid IT mask!");
+  for (unsigned Pos = 3, e = NumTZ; Pos >= e; --Pos) {
+    bool T = (Mask & (1 << Pos)) != 0;
+    if (T)
+      O << 't';
+    else
+      O << 'e';
+  }
+}
+
 void
 ARMAsmPrinter::printThumbAddrModeRROperand(const MachineInstr *MI, int Op) {
   const MachineOperand &MO1 = MI->getOperand(Op);