Add libcalls for the new rounding opcodes.
authorDan Gohman <gohman@apple.com>
Thu, 21 Aug 2008 18:38:14 +0000 (18:38 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 21 Aug 2008 18:38:14 +0000 (18:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55133 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/RuntimeLibcalls.h
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
lib/CodeGen/SelectionDAG/TargetLowering.cpp

index d1f28cee9dac8851b821d07b7553cef88a602de9..6039446f27bfbe747ff5d1dcb5e859ddb38da186 100644 (file)
@@ -97,6 +97,26 @@ namespace RTLIB {
     POW_F64,
     POW_F80,
     POW_PPCF128,
+    CEIL_F32,
+    CEIL_F64,
+    CEIL_F80,
+    CEIL_PPCF128,
+    TRUNC_F32,
+    TRUNC_F64,
+    TRUNC_F80,
+    TRUNC_PPCF128,
+    RINT_F32,
+    RINT_F64,
+    RINT_F80,
+    RINT_PPCF128,
+    NEARBYINT_F32,
+    NEARBYINT_F64,
+    NEARBYINT_F80,
+    NEARBYINT_PPCF128,
+    FLOOR_F32,
+    FLOOR_F64,
+    FLOOR_F80,
+    FLOOR_PPCF128,
 
     // CONVERSION
     FPEXT_F32_F64,
index a0e17d59675864f105c3c7cc3887af59d9b8f08b..96eafbe50286fe7c0fad9e4e1bac4de10fe25b18 100644 (file)
@@ -3529,6 +3529,11 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
         Result = DAG.getNode(ISD::SELECT, VT, Tmp2, Tmp1, Tmp3);
         break;
       }
+      case ISD::FTRUNC:
+      case ISD::FFLOOR:
+      case ISD::FCEIL:
+      case ISD::FRINT:
+      case ISD::FNEARBYINT:
       case ISD::FSQRT:
       case ISD::FSIN:
       case ISD::FCOS: {
@@ -3554,6 +3559,26 @@ SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) {
           LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
                             RTLIB::COS_F80, RTLIB::COS_PPCF128);
           break;
+        case ISD::FTRUNC:
+          LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
+                            RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128);
+          break;
+        case ISD::FFLOOR:
+          LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
+                            RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128);
+          break;
+        case ISD::FCEIL:
+          LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
+                            RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128);
+          break;
+        case ISD::FRINT:
+          LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64,
+                            RTLIB::RINT_F80, RTLIB::RINT_PPCF128);
+          break;
+        case ISD::FNEARBYINT:
+          LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64,
+                            RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128);
+          break;
         default: assert(0 && "Unreachable!");
         }
         SDValue Dummy;
@@ -4144,6 +4169,11 @@ SDValue SelectionDAGLegalize::PromoteOp(SDValue Op) {
   case ISD::FSQRT:
   case ISD::FSIN:
   case ISD::FCOS:
+  case ISD::FTRUNC:
+  case ISD::FFLOOR:
+  case ISD::FCEIL:
+  case ISD::FRINT:
+  case ISD::FNEARBYINT:
     Tmp1 = PromoteOp(Node->getOperand(0));
     assert(Tmp1.getValueType() == NVT);
     Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
@@ -6507,6 +6537,11 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
                                         RTLIB::POWI_PPCF128),
                        Node, false, Hi);
     break;
+  case ISD::FTRUNC:
+  case ISD::FFLOOR:
+  case ISD::FCEIL:
+  case ISD::FRINT:
+  case ISD::FNEARBYINT:
   case ISD::FSQRT:
   case ISD::FSIN:
   case ISD::FCOS: {
@@ -6524,6 +6559,26 @@ void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){
       LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64,
                         RTLIB::COS_F80, RTLIB::COS_PPCF128);
       break;
+    case ISD::FTRUNC:
+      LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64,
+                        RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128);
+      break;
+    case ISD::FFLOOR:
+      LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64,
+                        RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128);
+      break;
+    case ISD::FCEIL:
+      LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64,
+                        RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128);
+      break;
+    case ISD::FRINT:
+      LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64,
+                        RTLIB::RINT_F80, RTLIB::RINT_PPCF128);
+      break;
+    case ISD::FNEARBYINT:
+      LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64,
+                        RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128);
+      break;
     default: assert(0 && "Unreachable!");
     }
     Lo = ExpandLibCall(LC, Node, false, Hi);
index 54ecb0aafac7bfb55cdb3a83a90d6b08da317be9..872e0b5c4fcdd8ad99e34e9bf403258ac213e13b 100644 (file)
@@ -95,6 +95,26 @@ static void InitLibcallNames(const char **Names) {
   Names[RTLIB::POW_F64] = "pow";
   Names[RTLIB::POW_F80] = "powl";
   Names[RTLIB::POW_PPCF128] = "powl";
+  Names[RTLIB::CEIL_F32] = "ceilf";
+  Names[RTLIB::CEIL_F64] = "ceil";
+  Names[RTLIB::CEIL_F80] = "ceill";
+  Names[RTLIB::CEIL_PPCF128] = "ceill";
+  Names[RTLIB::TRUNC_F32] = "truncf";
+  Names[RTLIB::TRUNC_F64] = "trunc";
+  Names[RTLIB::TRUNC_F80] = "truncl";
+  Names[RTLIB::TRUNC_PPCF128] = "truncl";
+  Names[RTLIB::RINT_F32] = "rintf";
+  Names[RTLIB::RINT_F64] = "rint";
+  Names[RTLIB::RINT_F80] = "rintl";
+  Names[RTLIB::RINT_PPCF128] = "rintl";
+  Names[RTLIB::NEARBYINT_F32] = "nearbyintf";
+  Names[RTLIB::NEARBYINT_F64] = "nearbyint";
+  Names[RTLIB::NEARBYINT_F80] = "nearbyintl";
+  Names[RTLIB::NEARBYINT_PPCF128] = "nearbyintl";
+  Names[RTLIB::FLOOR_F32] = "floorf";
+  Names[RTLIB::FLOOR_F64] = "floor";
+  Names[RTLIB::FLOOR_F80] = "floorl";
+  Names[RTLIB::FLOOR_PPCF128] = "floorl";
   Names[RTLIB::FPEXT_F32_F64] = "__extendsfdf2";
   Names[RTLIB::FPROUND_F64_F32] = "__truncdfsf2";
   Names[RTLIB::FPROUND_F80_F32] = "__truncxfsf2";