[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Aug 25 16:20:09 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelPattern.cpp updated: 1.165 -> 1.166
---
Log message:

simplify the add/sub_parts code


---
Diffs of the changes:  (+24 -16)

 PPC32ISelPattern.cpp |   40 ++++++++++++++++++++++++----------------
 1 files changed, 24 insertions(+), 16 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.165 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.166
--- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.165	Thu Aug 25 17:03:50 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp	Thu Aug 25 18:19:58 2005
@@ -1384,7 +1384,7 @@
   case ISD::UDIV:
     // If this is a divide by constant, we can emit code using some magic
     // constants to implement it as a multiply instead.
-    if (isIntImmediate(N.getOperand(1), Tmp3) && (signed)Tmp3 > 1) {
+    if (isIntImmediate(N.getOperand(1), Tmp3) && Tmp3) {
       ExprMap.erase(N);
       return SelectExpr(BuildUDIVSequence(N));
     }
@@ -1404,33 +1404,41 @@
     assert(N.getNumOperands() == 4 && N.getValueType() == MVT::i32 &&
            "Not an i64 add/sub!");
     unsigned Tmp4 = 0;
-    bool ME = isIntImmediate(N.getOperand(3),Tmp3) && ((signed)Tmp3 == -1);
-    bool ZE = isIntImmediate(N.getOperand(3),Tmp3) && (Tmp3 == 0);
-    bool IM = isIntImmediate(N.getOperand(2),Tmp3) && ((signed)Tmp3 >= -32768 ||
-                                                       (signed)Tmp3 <   32768);
     Tmp1 = SelectExpr(N.getOperand(0));
     Tmp2 = SelectExpr(N.getOperand(1));
-    if (!IM || N.getOpcode() == ISD::SUB_PARTS)
-      Tmp3 = SelectExpr(N.getOperand(2));
-    if ((!ME && !ZE) || N.getOpcode() == ISD::SUB_PARTS)
-      Tmp4 = SelectExpr(N.getOperand(3));
     
     if (N.getOpcode() == ISD::ADD_PARTS) {
-      // Codegen the low 32 bits of the add.  Interestingly, there is no shifted
-      // form of add immediate carrying.
-      if (IM)
+      bool ME, ZE;
+      if (isIntImmediate(N.getOperand(3), Tmp3)) {
+        ME = (signed)Tmp3 == -1;
+        ZE = Tmp3 == 0;
+      }
+      
+      if (!ZE && !ME)
+        Tmp4 = SelectExpr(N.getOperand(3));
+
+      if (isIntImmediate(N.getOperand(2), Tmp3) &&
+          ((signed)Tmp3 >= -32768 || (signed)Tmp3 < 32768)) {
+        // Codegen the low 32 bits of the add.  Interestingly, there is no
+        // shifted form of add immediate carrying.
         BuildMI(BB, PPC::ADDIC, 2, Result).addReg(Tmp1).addSImm(Tmp3);
-      else
+      } else {
+        Tmp3 = SelectExpr(N.getOperand(2));
         BuildMI(BB, PPC::ADDC, 2, Result).addReg(Tmp1).addReg(Tmp3);
+      }
+      
       // Codegen the high 32 bits, adding zero, minus one, or the full value
       // along with the carry flag produced by addc/addic to tmp2.
-      if (ZE)
+      if (ZE) {
         BuildMI(BB, PPC::ADDZE, 1, Result+1).addReg(Tmp2);
-      else if (ME)
+      } else if (ME) {
         BuildMI(BB, PPC::ADDME, 1, Result+1).addReg(Tmp2);
-      else
+      } else {
         BuildMI(BB, PPC::ADDE, 2, Result+1).addReg(Tmp2).addReg(Tmp4);
+      }
     } else {
+      Tmp3 = SelectExpr(N.getOperand(2));
+      Tmp4 = SelectExpr(N.getOperand(3));
       BuildMI(BB, PPC::SUBFC, 2, Result).addReg(Tmp3).addReg(Tmp1);
       BuildMI(BB, PPC::SUBFE, 2, Result+1).addReg(Tmp4).addReg(Tmp2);
     }






More information about the llvm-commits mailing list