]> granicus.if.org Git - llvm/commitdiff
[ARM] Use aapcs_vfp for ___truncdfhf2 on v7k.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 24 Jun 2016 00:08:01 +0000 (00:08 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Fri, 24 Jun 2016 00:08:01 +0000 (00:08 +0000)
r215348 overrode the f16 libcalls to be soft-float, but
v7k uses the default (hard-float) calling convention.

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

lib/Target/ARM/ARMISelLowering.cpp
test/CodeGen/ARM/v7k-libcalls.ll

index d55a1dda27e63079491ed81a06fe4f8139b20273..b0dc59aaf3e1d174cab61ba5730417e3efdfd78a 100644 (file)
@@ -407,17 +407,19 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
     setLibcallName(RTLIB::UDIVREM_I32, "__udivmodsi4");
   }
 
-  // The half <-> float conversion functions are always soft-float, but are
-  // needed for some targets which use a hard-float calling convention by
-  // default.
-  if (Subtarget->isAAPCS_ABI()) {
-    setLibcallCallingConv(RTLIB::FPROUND_F32_F16, CallingConv::ARM_AAPCS);
-    setLibcallCallingConv(RTLIB::FPROUND_F64_F16, CallingConv::ARM_AAPCS);
-    setLibcallCallingConv(RTLIB::FPEXT_F16_F32, CallingConv::ARM_AAPCS);
-  } else {
-    setLibcallCallingConv(RTLIB::FPROUND_F32_F16, CallingConv::ARM_APCS);
-    setLibcallCallingConv(RTLIB::FPROUND_F64_F16, CallingConv::ARM_APCS);
-    setLibcallCallingConv(RTLIB::FPEXT_F16_F32, CallingConv::ARM_APCS);
+  // The half <-> float conversion functions are always soft-float on
+  // non-watchos platforms, but are needed for some targets which use a
+  // hard-float calling convention by default.
+  if (!Subtarget->isTargetWatchABI()) {
+    if (Subtarget->isAAPCS_ABI()) {
+      setLibcallCallingConv(RTLIB::FPROUND_F32_F16, CallingConv::ARM_AAPCS);
+      setLibcallCallingConv(RTLIB::FPROUND_F64_F16, CallingConv::ARM_AAPCS);
+      setLibcallCallingConv(RTLIB::FPEXT_F16_F32, CallingConv::ARM_AAPCS);
+    } else {
+      setLibcallCallingConv(RTLIB::FPROUND_F32_F16, CallingConv::ARM_APCS);
+      setLibcallCallingConv(RTLIB::FPROUND_F64_F16, CallingConv::ARM_APCS);
+      setLibcallCallingConv(RTLIB::FPEXT_F16_F32, CallingConv::ARM_APCS);
+    }
   }
 
   // In EABI, these functions have an __aeabi_ prefix, but in GNUEABI they have
index a1dfb07ca6144d203bda2d50d309c5e5f5d8ed6a..8ca31ef4e6520f979f76f2742708dbfd507c1bd8 100644 (file)
@@ -145,6 +145,15 @@ define arm_aapcs_vfpcc double @t14(double %x) {
   ret double %__exp10
 }
 
+define i16 @t15(double %x) {
+; CHECK-LABEL: t15:
+; CHECK-NOT: vmov
+; CHECK: bl ___truncdfhf2
+  %tmp0 = fptrunc double %x to half
+  %tmp1 = bitcast half %tmp0 to i16
+  ret i16 %tmp1
+}
+
 declare arm_aapcs_vfpcc double @x(double, double, double, double, double, double, double, float, double)
 declare arm_aapcs_vfpcc double @cos(double) #0
 declare arm_aapcs_vfpcc double @sin(double) #0