[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAGISel.cpp

Chris Lattner lattner at cs.uiuc.edu
Fri Apr 29 21:43:27 PDT 2005



Changes in directory llvm/lib/CodeGen/SelectionDAG:

LegalizeDAG.cpp updated: 1.92 -> 1.93
SelectionDAGISel.cpp updated: 1.44 -> 1.45
---
Log message:

Codegen and legalize sin/cos/llvm.sqrt as FSIN/FCOS/FSQRT calls.  This patch
was contributed by Morten Ofstad, with some minor tweaks and bug fixes added
by me.


---
Diffs of the changes:  (+53 -3)

 LegalizeDAG.cpp      |   31 ++++++++++++++++++++++++++++---
 SelectionDAGISel.cpp |   25 +++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 3 deletions(-)


Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.92 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.93
--- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.92	Thu Apr 28 16:44:33 2005
+++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp	Fri Apr 29 23:43:14 2005
@@ -1003,12 +1003,15 @@
     case TargetLowering::Custom:
       assert(0 && "Cannot promote/custom handle this yet!");
     case TargetLowering::Expand:
-      if (Node->getOpcode() == ISD::FNEG) {
+      switch(Node->getOpcode()) {
+      case ISD::FNEG: {
         // Expand Y = FNEG(X) ->  Y = SUB -0.0, X
         Tmp2 = DAG.getConstantFP(-0.0, Node->getValueType(0));
         Result = LegalizeOp(DAG.getNode(ISD::SUB, Node->getValueType(0),
                                         Tmp2, Tmp1));
-      } else if (Node->getOpcode() == ISD::FABS) {
+        break;
+      }
+      case ISD::FABS: {
         // Expand Y = FABS(X) -> Y = (X >u 0.0) ? X : fneg(X).
         MVT::ValueType VT = Node->getValueType(0);
         Tmp2 = DAG.getConstantFP(0.0, VT);
@@ -1016,7 +1019,29 @@
         Tmp3 = DAG.getNode(ISD::FNEG, VT, Tmp1);
         Result = DAG.getNode(ISD::SELECT, VT, Tmp2, Tmp1, Tmp3);
         Result = LegalizeOp(Result);
-      } else {
+        break;
+      }
+      case ISD::FSQRT:
+      case ISD::FSIN:
+      case ISD::FCOS: {
+        MVT::ValueType VT = Node->getValueType(0);
+        Type *T = VT == MVT::f32 ? Type::FloatTy : Type::DoubleTy;
+        const char *FnName = 0;
+        switch(Node->getOpcode()) {
+        case ISD::FSQRT: FnName = VT == MVT::f32 ? "sqrtf" : "sqrt"; break;
+        case ISD::FSIN:  FnName = VT == MVT::f32 ? "sinf"  : "sin"; break;
+        case ISD::FCOS:  FnName = VT == MVT::f32 ? "cosf"  : "cos"; break;
+        default: assert(0 && "Unreachable!");
+        }
+        std::vector<std::pair<SDOperand, const Type*> > Args;
+        Args.push_back(std::make_pair(Tmp1, T));
+        std::pair<SDOperand,SDOperand> CallResult =
+          TLI.LowerCallTo(DAG.getEntryNode(), T, false,
+                          DAG.getExternalSymbol(FnName, VT), Args, DAG);
+        Result = LegalizeOp(CallResult.first);
+        break;
+      }
+      default:
         assert(0 && "Unreachable!");
       }
       break;


Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.44 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.45
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.44	Wed Apr 27 15:10:01 2005
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Fri Apr 29 23:43:14 2005
@@ -656,6 +656,24 @@
             return;
           }
         }
+        else if (F->getName() == "sin" || F->getName() == "sinf") {
+          if (I.getNumOperands() == 2 &&   // Basic sanity checks.
+              I.getOperand(1)->getType()->isFloatingPoint() &&
+              I.getType() == I.getOperand(1)->getType()) {
+            SDOperand Tmp = getValue(I.getOperand(1));
+            setValue(&I, DAG.getNode(ISD::FSIN, Tmp.getValueType(), Tmp));
+            return;
+          }
+        }
+        else if (F->getName() == "cos" || F->getName() == "cosf") {
+          if (I.getNumOperands() == 2 &&   // Basic sanity checks.
+              I.getOperand(1)->getType()->isFloatingPoint() &&
+              I.getType() == I.getOperand(1)->getType()) {
+            SDOperand Tmp = getValue(I.getOperand(1));
+            setValue(&I, DAG.getNode(ISD::FCOS, Tmp.getValueType(), Tmp));
+            return;
+          }
+        }
         break;
       case Intrinsic::vastart:  visitVAStart(I); return;
       case Intrinsic::vaend:    visitVAEnd(I); return;
@@ -677,6 +695,13 @@
         setValue(&I, DAG.getSetCC(ISD::SETUO, MVT::i1,getValue(I.getOperand(1)),
                                   getValue(I.getOperand(2))));
         return;
+
+      case Intrinsic::sqrt:
+        setValue(&I, DAG.getNode(ISD::FSQRT,
+                                 getValue(I.getOperand(1)).getValueType(),
+                                 getValue(I.getOperand(1))));
+        return;
+
       case Intrinsic::pcmarker: {
         SDOperand Num = getValue(I.getOperand(1));
         DAG.setRoot(DAG.getNode(ISD::PCMARKER, MVT::Other, getRoot(), Num));






More information about the llvm-commits mailing list