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

Nate Begeman natebegeman at mac.com
Tue Apr 5 23:45:08 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelPattern.cpp updated: 1.48 -> 1.49
---
Log message:

Fixed version of optimized integer divide is now fixed.  Calculate the
quotient, not the remainder.  Also, make sure to remove the old div operand
from the ExprMap and let SelectExpr insert the new one.


---
Diffs of the changes:  (+9 -13)

 PPC32ISelPattern.cpp |   22 +++++++++-------------
 1 files changed, 9 insertions(+), 13 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.48 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.49
--- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.48	Tue Apr  5 22:36:33 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp	Wed Apr  6 01:44:57 2005
@@ -551,7 +551,7 @@
     if (v <= -2 || v >= 2) { return 4; }
     break;
   case ISD::UDIV:
-    if (v != 0) { return 4; }
+    if (v > 1) { return 4; }
     break;
   }
   return 0;
@@ -711,10 +711,7 @@
   // Extract the sign bit and add it to the quotient
   SDOperand T = 
     ISelDAG->getNode(ISD::SRL, MVT::i32, Q, ISelDAG->getConstant(31, MVT::i32));
-  Q = ISelDAG->getNode(ISD::ADD, MVT::i32, Q, T);
-  // Compute the remainder
-  T = ISelDAG->getNode(ISD::MUL, MVT::i32, Q, N.getOperand(1));
-  return ISelDAG->getNode(ISD::SUB, MVT::i32, N.getOperand(0), T);
+  return ISelDAG->getNode(ISD::ADD, MVT::i32, Q, T);
 }
 
 /// BuildUDIVSequence - Given an ISD::UDIV node expressing a divide by constant,
@@ -739,9 +736,7 @@
     Q = ISelDAG->getNode(ISD::SRL, MVT::i32, NPQ, 
                            ISelDAG->getConstant(magics.s-1, MVT::i32));
   }
-  // Compute the remainder
-  SDOperand T = ISelDAG->getNode(ISD::MUL, MVT::i32, Q, N.getOperand(1));
-  return ISelDAG->getNode(ISD::SUB, MVT::i32, N.getOperand(0), T);
+  return Q;
 }
 
 /// getGlobalBaseReg - Output the instructions required to put the
@@ -1601,11 +1596,12 @@
       return Result;
     // If this is a divide by constant, we can emit code using some magic
     // constants to implement it as a multiply instead.
-    //case 4:
-    //  if (opcode == ISD::SDIV)
-    //    return SelectExpr(BuildSDIVSequence(N));
-    //  else
-    //    return SelectExpr(BuildUDIVSequence(N));
+    case 4:
+      ExprMap.erase(N);
+      if (opcode == ISD::SDIV) 
+        return SelectExpr(BuildSDIVSequence(N));
+      else
+        return SelectExpr(BuildUDIVSequence(N));
     }
     Tmp1 = SelectExpr(N.getOperand(0));
     Tmp2 = SelectExpr(N.getOperand(1));






More information about the llvm-commits mailing list