From 379e6dc9b417c60add168532fe9df68bb4ca76e8 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Fri, 24 Jun 2016 00:08:01 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273631 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/ARMISelLowering.cpp | 24 +++++++++++++----------- test/CodeGen/ARM/v7k-libcalls.ll | 9 +++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index d55a1dda27e..b0dc59aaf3e 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -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 diff --git a/test/CodeGen/ARM/v7k-libcalls.ll b/test/CodeGen/ARM/v7k-libcalls.ll index a1dfb07ca61..8ca31ef4e65 100644 --- a/test/CodeGen/ARM/v7k-libcalls.ll +++ b/test/CodeGen/ARM/v7k-libcalls.ll @@ -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 -- 2.50.1