Expand fsqrt, fsin, and fcos to libcalls.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 13 Dec 2006 02:38:13 +0000 (02:38 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 13 Dec 2006 02:38:13 +0000 (02:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32526 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 695e1970ff99672b876bf5cc59529fdcbc5d9db1..246bbdc6a0f8d14a2e518c719cfdd7c2966b4a02 100644 (file)
@@ -4951,23 +4951,38 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
   case ISD::FP_ROUND:
     Lo = ExpandLibCall("__truncdfsf2", Node, Hi);
     break;
-  case ISD::SINT_TO_FP:
+  case ISD::SINT_TO_FP: {
+    const char *FnName = 0;
     if (Node->getOperand(0).getValueType() == MVT::i64)
-      Lo = ExpandLibCall(((VT == MVT::f32) ? "__floatdisf" : "__floatdidf"),
-                         Node, Hi);
+      FnName = (VT == MVT::f32) ? "__floatdisf" : "__floatdidf";
     else
-      Lo = ExpandLibCall(((VT == MVT::f32) ? "__floatsisf" : "__floatsidf"),
-                         Node, Hi);
+      FnName = (VT == MVT::f32) ? "__floatsisf" : "__floatsidf";
+    Lo = ExpandLibCall(FnName, Node, Hi);
     break;
-  case ISD::UINT_TO_FP:
+  }
+  case ISD::UINT_TO_FP: {
+    const char *FnName = 0;
     if (Node->getOperand(0).getValueType() == MVT::i64)
-      Lo = ExpandLibCall(((VT == MVT::f32) ? "__floatundisf" : "__floatundidf"),
-                         Node, Hi);
+      FnName = (VT == MVT::f32) ? "__floatundisf" : "__floatundidf";
     else
-      Lo = ExpandLibCall(((VT == MVT::f32) ? "__floatunsisf" : "__floatunsidf"),
-                         Node, Hi);
+      FnName = (VT == MVT::f32) ? "__floatunsisf" : "__floatunsidf";
+    Lo = ExpandLibCall(FnName, Node, Hi);
     break;
   }
+  case ISD::FSQRT:
+  case ISD::FSIN:
+  case ISD::FCOS: {
+    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!");
+    }
+    Lo = ExpandLibCall(FnName, Node, Hi);
+    break;
+  }
+  }
 
   // Make sure the resultant values have been legalized themselves, unless this
   // is a type that requires multi-step expansion.