OSDN Git Service

[Power9] Add __float128 library call for frem
authorStefan Pintilie <stefanp@ca.ibm.com>
Fri, 6 Jul 2018 02:47:02 +0000 (02:47 +0000)
committerStefan Pintilie <stefanp@ca.ibm.com>
Fri, 6 Jul 2018 02:47:02 +0000 (02:47 +0000)
Power 9 does not have a hardware instruction for frem but we can call fmodf128.

Differential Revision: https://reviews.llvm.org/D48552

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@336406 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCISelLowering.cpp
test/CodeGen/PowerPC/f128-arith.ll

index c236bab..ab1f84d 100644 (file)
@@ -820,6 +820,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
         setOperationAction(ISD::FCOS , MVT::f128, Expand);
         setOperationAction(ISD::FPOW, MVT::f128, Expand);
         setOperationAction(ISD::FPOWI, MVT::f128, Expand);
+        setOperationAction(ISD::FREM, MVT::f128, Expand);
       }
 
     }
@@ -1070,6 +1071,7 @@ PPCTargetLowering::PPCTargetLowering(const PPCTargetMachine &TM,
     setLibcallName(RTLIB::FMIN_F128, "fminf128");
     setLibcallName(RTLIB::FMAX_F128, "fmaxf128");
     setLibcallName(RTLIB::POWI_F128, "__powikf2");
+    setLibcallName(RTLIB::REM_F128, "fmodf128");
   }
 
   // With 32 condition bits, we don't need to sink (and duplicate) compares
index 534f8f2..5f1296e 100644 (file)
@@ -293,3 +293,17 @@ entry:
   ret void
 }
 declare fp128 @llvm.powi.f128(fp128 %Val, i32 %power)
+
+@a = common global fp128 0xL00000000000000000000000000000000, align 16
+@b = common global fp128 0xL00000000000000000000000000000000, align 16
+
+define fp128 @qp_frem() #0 {
+entry:
+  %0 = load fp128, fp128* @a, align 16
+  %1 = load fp128, fp128* @b, align 16
+  %rem = frem fp128 %0, %1
+  ret fp128 %rem
+; CHECK-LABEL: qp_frem
+; CHECK: bl fmodf128
+; CHECK: blr
+}