[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp PowerPCAsmPrinter.cpp PowerPCInstrFormats.td PowerPCInstrInfo.td

Nate Begeman natebegeman at mac.com
Wed Apr 13 20:20:49 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelSimple.cpp updated: 1.138 -> 1.139
PowerPCAsmPrinter.cpp updated: 1.75 -> 1.76
PowerPCInstrFormats.td updated: 1.33 -> 1.34
PowerPCInstrInfo.td updated: 1.62 -> 1.63
---
Log message:

Add the necessary support to codegen condition register logical ops with
  register allocated condition registers.  Make sure that the printed
  output is gas compatible.


---
Diffs of the changes:  (+72 -17)

 PPC32ISelSimple.cpp    |   16 +++++++++-------
 PowerPCAsmPrinter.cpp  |   20 ++++++++++++++++++++
 PowerPCInstrFormats.td |   18 ++++++++++++++++--
 PowerPCInstrInfo.td    |   35 +++++++++++++++++++++++++++--------
 4 files changed, 72 insertions(+), 17 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.138 llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.139
--- llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp:1.138	Sat Apr  9 20:03:31 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelSimple.cpp	Wed Apr 13 22:20:38 2005
@@ -1115,7 +1115,7 @@
   // Use crand for lt, gt and crandc for le, ge
   unsigned CROpcode = (OpNum == 2 || OpNum == 4) ? PPC::CRAND : PPC::CRANDC;
   // ? cr1[lt] : cr1[gt]
-  unsigned CR1field = (OpNum == 2 || OpNum == 3) ? 4 : 5;
+  unsigned CR1field = (OpNum == 2 || OpNum == 3) ? 0 : 1;
   // ? cr0[lt] : cr0[gt]
   unsigned CR0field = (OpNum == 2 || OpNum == 5) ? 0 : 1;
   unsigned Opcode = CompTy->isSigned() ? PPC::CMPW : PPC::CMPLW;
@@ -1165,9 +1165,10 @@
           .addReg(ConstReg);
         BuildMI(*MBB, IP, Opcode, 2, PPC::CR1).addReg(Op0r+1)
           .addReg(ConstReg+1);
-        BuildMI(*MBB, IP, PPC::CRAND, 3).addImm(2).addImm(2).addImm(CR1field);
-        BuildMI(*MBB, IP, PPC::CROR, 3).addImm(CR0field).addImm(CR0field)
-          .addImm(2);
+        BuildMI(*MBB, IP, PPC::CRAND, 5, PPC::CR0).addImm(2)
+          .addReg(PPC::CR0).addImm(2).addReg(PPC::CR1).addImm(CR1field);
+        BuildMI(*MBB, IP, PPC::CROR, 5, PPC::CR0).addImm(CR0field)
+          .addReg(PPC::CR0).addImm(CR0field).addReg(PPC::CR0).addImm(2);
         return;
       }
     }
@@ -1204,9 +1205,10 @@
       // cr0 = r3 ccOpcode r5 or (r3 == r5 AND r4 ccOpcode r6)
       BuildMI(*MBB, IP, Opcode, 2, PPC::CR0).addReg(Op0r).addReg(Op1r);
       BuildMI(*MBB, IP, Opcode, 2, PPC::CR1).addReg(Op0r+1).addReg(Op1r+1);
-      BuildMI(*MBB, IP, PPC::CRAND, 3).addImm(2).addImm(2).addImm(CR1field);
-      BuildMI(*MBB, IP, PPC::CROR, 3).addImm(CR0field).addImm(CR0field)
-        .addImm(2);
+      BuildMI(*MBB, IP, PPC::CRAND, 5, PPC::CR0).addImm(2)
+        .addReg(PPC::CR0).addImm(2).addReg(PPC::CR1).addImm(CR1field);
+      BuildMI(*MBB, IP, PPC::CROR, 5, PPC::CR0).addImm(CR0field)
+        .addReg(PPC::CR0).addImm(CR0field).addReg(PPC::CR0).addImm(2);
       return;
     }
   }


Index: llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp
diff -u llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.75 llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.76
--- llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp:1.75	Sat Apr  9 20:48:29 2005
+++ llvm/lib/Target/PowerPC/PowerPCAsmPrinter.cpp	Wed Apr 13 22:20:38 2005
@@ -138,6 +138,26 @@
         O << "-\"L0000" << LabelNumber << "$pb\")";
       }
     }
+    void printcrbit(const MachineInstr *MI, unsigned OpNo,
+                       MVT::ValueType VT) {
+      unsigned char value = MI->getOperand(OpNo).getImmedValue();
+      assert(value <= 3 && "Invalid crbit argument!");
+      unsigned RegNo, CCReg = MI->getOperand(OpNo-1).getReg();
+      switch (CCReg) {
+      case PPC::CR0:  RegNo = 0; break;
+      case PPC::CR1:  RegNo = 1; break;
+      case PPC::CR2:  RegNo = 2; break;
+      case PPC::CR3:  RegNo = 3; break;
+      case PPC::CR4:  RegNo = 4; break;
+      case PPC::CR5:  RegNo = 5; break;
+      case PPC::CR6:  RegNo = 6; break;
+      case PPC::CR7:  RegNo = 7; break;
+      default:
+        std::cerr << "Unhandled reg in enumRegToRealReg!\n";
+        abort();
+      }
+      O << 4 * RegNo + value;
+    }
   
     virtual void printConstantPool(MachineConstantPool *MCP) = 0;
     virtual bool runOnMachineFunction(MachineFunction &F) = 0;    


Index: llvm/lib/Target/PowerPC/PowerPCInstrFormats.td
diff -u llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.33 llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.34
--- llvm/lib/Target/PowerPC/PowerPCInstrFormats.td:1.33	Tue Apr 12 02:04:16 2005
+++ llvm/lib/Target/PowerPC/PowerPCInstrFormats.td	Wed Apr 13 22:20:38 2005
@@ -309,8 +309,22 @@
 
 // 1.7.7 XL-Form
 class XLForm_1<bits<6> opcode, bits<10> xo, bit ppc64, bit vmx,
-               dag OL, string asmstr> 
-  : XForm_base_r3xo<opcode, xo, 0, ppc64, vmx, OL, asmstr> {
+               dag OL, string asmstr> : I<opcode, ppc64, vmx, OL, asmstr> {
+  bits<3> CRD;
+  bits<2> CRDb;
+  bits<3> CRA;
+  bits<2> CRAb;
+  bits<3> CRB;
+  bits<2> CRBb;
+  
+  let Inst{6-8}   = CRD;
+  let Inst{9-10}  = CRDb;
+  let Inst{11-13} = CRA;
+  let Inst{14-15} = CRAb;
+  let Inst{16-18} = CRB;
+  let Inst{19-20} = CRBb;
+  let Inst{21-30} = xo;
+  let Inst{31}    = 0;
 }
 
 class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, bit ppc64, bit vmx, 


Index: llvm/lib/Target/PowerPC/PowerPCInstrInfo.td
diff -u llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.62 llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.63
--- llvm/lib/Target/PowerPC/PowerPCInstrInfo.td:1.62	Tue Apr 12 02:04:16 2005
+++ llvm/lib/Target/PowerPC/PowerPCInstrInfo.td	Wed Apr 13 22:20:38 2005
@@ -45,6 +45,9 @@
 def symbolLo: Operand<i32> {
   let PrintMethod = "printSymbolLo";
 }
+def crbit: Operand<i8> {
+  let PrintMethod = "printcrbit";
+}
 
 // Pseudo-instructions:
 def PHI : Pseudo<(ops), "; PHI">;
@@ -332,14 +335,30 @@
 
 // XL-Form instructions.  condition register logical ops.
 //
-def CRAND  : XLForm_1<19, 257, 0, 0, (ops u5imm:$D, u5imm:$A, u5imm:$B),
-                      "crand $D, $A, $B">;
-def CRANDC : XLForm_1<19, 129, 0, 0, (ops u5imm:$D, u5imm:$A, u5imm:$B),
-                      "crandc $D, $A, $B">;
-def CRNOR  : XLForm_1<19,  33, 0, 0, (ops u5imm:$D, u5imm:$A, u5imm:$B),
-                      "crnor $D, $A, $B">;
-def CROR   : XLForm_1<19, 449, 0, 0, (ops u5imm:$D, u5imm:$A, u5imm:$B),
-                      "cror $D, $A, $B">;
+def CRAND  : XLForm_1<19, 257, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crand $Db, $Ab, $Bb">;
+def CRANDC : XLForm_1<19, 129, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crandc $Db, $Ab, $Bb">;
+def CREQV  : XLForm_1<19, 289, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "creqv $Db, $Ab, $Bb">;
+def CRNAND : XLForm_1<19, 225, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crnand $Db, $Ab, $Bb">;
+def CRNOR  : XLForm_1<19, 33, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crnor $Db, $Ab, $Bb">;
+def CROR   : XLForm_1<19, 449, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "cror $Db, $Ab, $Bb">;
+def CRORC  : XLForm_1<19, 417, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crorc $Db, $Ab, $Bb">;
+def CRXOR  : XLForm_1<19, 193, 0, 0, (ops CRRC:$D, crbit:$Db,
+                      CRRC:$A, crbit:$Ab, CRRC:$B, crbit:$Bb),
+                      "crxor $Db, $Ab, $Bb">;
 def MCRF   : XLForm_3<19, 0, 0, 0, (ops CRRC:$BF, CRRC:$BFA),
                       "mfcr $BF, $BFA">;
 






More information about the llvm-commits mailing list