[llvm-commits] CVS: llvm/lib/Target/ARM/ARMAsmPrinter.cpp ARMInstrInfo.td

Evan Cheng evan.cheng at apple.com
Tue Mar 20 01:11:47 PDT 2007



Changes in directory llvm/lib/Target/ARM:

ARMAsmPrinter.cpp updated: 1.61 -> 1.62
ARMInstrInfo.td updated: 1.91 -> 1.92
---
Log message:

Make two piece constant generation as a single instruction. It's re-materialized as a load from constantpool.

---
Diffs of the changes:  (+55 -30)

 ARMAsmPrinter.cpp |   37 +++++++++++++++++++++++++++++--------
 ARMInstrInfo.td   |   48 ++++++++++++++++++++++++++----------------------
 2 files changed, 55 insertions(+), 30 deletions(-)


Index: llvm/lib/Target/ARM/ARMAsmPrinter.cpp
diff -u llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.61 llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.62
--- llvm/lib/Target/ARM/ARMAsmPrinter.cpp:1.61	Thu Mar  8 16:42:46 2007
+++ llvm/lib/Target/ARM/ARMAsmPrinter.cpp	Tue Mar 20 03:11:30 2007
@@ -82,6 +82,7 @@
     void printOperand(const MachineInstr *MI, int opNum,
                       const char *Modifier = 0);
     void printSOImmOperand(const MachineInstr *MI, int opNum);
+    void printSOImm2PartOperand(const MachineInstr *MI, int opNum);
     void printSORegOperand(const MachineInstr *MI, int opNum);
     void printAddrMode2Operand(const MachineInstr *MI, int OpNo);
     void printAddrMode2OffsetOperand(const MachineInstr *MI, int OpNo);
@@ -309,14 +310,10 @@
   }
 }
 
-/// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
-/// immediate in bits 0-7.
-void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum) {
-  const MachineOperand &MO = MI->getOperand(OpNum);
-  assert(MO.isImmediate() && (MO.getImmedValue() < (1 << 12)) &&
-         "Not a valid so_imm value!");
-  unsigned Imm = ARM_AM::getSOImmValImm(MO.getImmedValue());
-  unsigned Rot = ARM_AM::getSOImmValRot(MO.getImmedValue());
+static void printSOImm(std::ostream &O, int64_t V, const TargetAsmInfo *TAI) {
+  assert(V < (1 << 12) && "Not a valid so_imm value!");
+  unsigned Imm = ARM_AM::getSOImmValImm(V);
+  unsigned Rot = ARM_AM::getSOImmValRot(V);
   
   // Print low-level immediate formation info, per
   // A5.1.3: "Data-processing operands - Immediate".
@@ -329,6 +326,30 @@
   }
 }
 
+/// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
+/// immediate in bits 0-7.
+void ARMAsmPrinter::printSOImmOperand(const MachineInstr *MI, int OpNum) {
+  const MachineOperand &MO = MI->getOperand(OpNum);
+  assert(MO.isImmediate() && "Not a valid so_imm value!");
+  printSOImm(O, MO.getImmedValue(), TAI);
+}
+
+/// printSOImm2PartOperand - SOImm is broken into two pieces using a mov
+/// followed by a or to materialize.
+void ARMAsmPrinter::printSOImm2PartOperand(const MachineInstr *MI, int OpNum) {
+  const MachineOperand &MO = MI->getOperand(OpNum);
+  assert(MO.isImmediate() && "Not a valid so_imm value!");
+  unsigned V1 = ARM_AM::getSOImmTwoPartFirst(MO.getImmedValue());
+  unsigned V2 = ARM_AM::getSOImmTwoPartSecond(MO.getImmedValue());
+  printSOImm(O, ARM_AM::getSOImmVal(V1), TAI);
+  O << "\n\torr ";
+  printOperand(MI, 0); 
+  O << ", ";
+  printOperand(MI, 0); 
+  O << ", ";
+  printSOImm(O, ARM_AM::getSOImmVal(V2), TAI);
+}
+
 // so_reg is a 4-operand unit corresponding to register forms of the A5.1
 // "Addressing Mode 1 - Data-processing operands" forms.  This includes:
 //    REG 0   0    - e.g. R5


Index: llvm/lib/Target/ARM/ARMInstrInfo.td
diff -u llvm/lib/Target/ARM/ARMInstrInfo.td:1.91 llvm/lib/Target/ARM/ARMInstrInfo.td:1.92
--- llvm/lib/Target/ARM/ARMInstrInfo.td:1.91	Mon Mar 19 02:48:02 2007
+++ llvm/lib/Target/ARM/ARMInstrInfo.td	Tue Mar 20 03:11:30 2007
@@ -147,24 +147,6 @@
 }]>;
 
 
-// Break so_imm's up into two pieces.  This handles immediates with up to 16
-// bits set in them.  This uses so_imm2part to match and so_imm2part_[12] to
-// get the first/second pieces.
-def so_imm2part : PatLeaf<(imm), [{
-  return ARM_AM::isSOImmTwoPartVal((unsigned)N->getValue());
-}]>;
-
-def so_imm2part_1 : SDNodeXForm<imm, [{
-  unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getValue());
-  return CurDAG->getTargetConstant(ARM_AM::getSOImmVal(V), MVT::i32);
-}]>;
-
-def so_imm2part_2 : SDNodeXForm<imm, [{
-  unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getValue());
-  return CurDAG->getTargetConstant(ARM_AM::getSOImmVal(V), MVT::i32);
-}]>;
-
-
 
 //===----------------------------------------------------------------------===//
 // Operand Definitions.
@@ -217,6 +199,25 @@
   let PrintMethod = "printSOImmOperand";
 }
 
+// Break so_imm's up into two pieces.  This handles immediates with up to 16
+// bits set in them.  This uses so_imm2part to match and so_imm2part_[12] to
+// get the first/second pieces.
+def so_imm2part : Operand<i32>,
+                  PatLeaf<(imm),
+             [{ return ARM_AM::isSOImmTwoPartVal((unsigned)N->getValue()); }]> {
+  let PrintMethod = "printSOImm2PartOperand";
+}
+
+def so_imm2part_1 : SDNodeXForm<imm, [{
+  unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getValue());
+  return CurDAG->getTargetConstant(ARM_AM::getSOImmVal(V), MVT::i32);
+}]>;
+
+def so_imm2part_2 : SDNodeXForm<imm, [{
+  unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getValue());
+  return CurDAG->getTargetConstant(ARM_AM::getSOImmVal(V), MVT::i32);
+}]>;
+
 
 // Define ARM specific addressing modes.
 
@@ -371,6 +372,8 @@
   : I<ops, AddrMode4, Size4Bytes, IndexModeNone, asm, "", pattern>;
 class AIx2<dag ops, string asm, list<dag> pattern>
   : I<ops, AddrModeNone, Size8Bytes, IndexModeNone, asm, "", pattern>;
+class AI1x2<dag ops, string asm, list<dag> pattern>
+  : I<ops, AddrMode1, Size8Bytes, IndexModeNone, asm, "", pattern>;
 
 // Pre-indexed ops
 class AI2pr<dag ops, string asm, string cstr, list<dag> pattern>
@@ -1064,14 +1067,15 @@
 def : ARMPat<(ARMWrapper  tglobaladdr :$dst), (LEApcrel tglobaladdr :$dst)>;
 def : ARMPat<(ARMWrapper  tconstpool  :$dst), (LEApcrel tconstpool  :$dst)>;
 def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),
-          (LEApcrelJT tjumptable:$dst, imm:$id)>;
+             (LEApcrelJT tjumptable:$dst, imm:$id)>;
 
 // Large immediate handling.
 
 // Two piece so_imms.
-def : ARMPat<(i32 so_imm2part:$src),
-             (ORRri (MOVi (so_imm2part_1 imm:$src)),
-                    (so_imm2part_2 imm:$src))>;
+let isReMaterializable = 1 in
+def MOVi2pieces : AI1x2<(ops GPR:$dst, so_imm2part:$src),
+                         "mov $dst, $src",
+                         [(set GPR:$dst, so_imm2part:$src)]>;
 
 def : ARMPat<(or GPR:$LHS, so_imm2part:$RHS),
               (ORRri (ORRri GPR:$LHS, (so_imm2part_1 imm:$RHS)),






More information about the llvm-commits mailing list