[llvm] r273631 - [ARM] Use aapcs_vfp for ___truncdfhf2 on v7k.

Ahmed Bougacha via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 23 17:08:01 PDT 2016


Author: ab
Date: Thu Jun 23 19:08:01 2016
New Revision: 273631

URL: http://llvm.org/viewvc/llvm-project?rev=273631&view=rev
Log:
[ARM] Use aapcs_vfp for ___truncdfhf2 on v7k.

r215348 overrode the f16 libcalls to be soft-float, but
v7k uses the default (hard-float) calling convention.

Modified:
    llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
    llvm/trunk/test/CodeGen/ARM/v7k-libcalls.ll

Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=273631&r1=273630&r2=273631&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Thu Jun 23 19:08:01 2016
@@ -407,17 +407,19 @@ ARMTargetLowering::ARMTargetLowering(con
     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

Modified: llvm/trunk/test/CodeGen/ARM/v7k-libcalls.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/v7k-libcalls.ll?rev=273631&r1=273630&r2=273631&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/v7k-libcalls.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/v7k-libcalls.ll Thu Jun 23 19:08:01 2016
@@ -145,6 +145,15 @@ define arm_aapcs_vfpcc double @t14(doubl
   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




More information about the llvm-commits mailing list