@@ -1614,13 +1614,6 @@ def __aeabi_h2f : RuntimeLibcallImpl<FPEXT_F16_F32>; // CallingConv::ARM_AAPCS
16141614def __gnu_f2h_ieee : RuntimeLibcallImpl<FPROUND_F32_F16>;
16151615def __gnu_h2f_ieee : RuntimeLibcallImpl<FPEXT_F16_F32>;
16161616
1617- // In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
1618- // they have a __gnu_ prefix (which is the default).
1619- def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
1620-                                         isTargetAEABIAndAAPCS_ABI> {
1621-   let CallingConv = ARM_AAPCS;
1622- }
1623- 
16241617// The half <-> float conversion functions are always soft-float on
16251618// non-watchos platforms, but are needed for some targets which use a
16261619// hard-float calling convention by default.
@@ -1629,6 +1622,27 @@ def ARMHalfConvertLibcallCallingConv : LibcallCallingConv<
16291622    (isAAPCS_ABI(TT, ABIName) ? CallingConv::ARM_AAPCS : CallingConv::ARM_APCS)}]
16301623>;
16311624
1625+ def ARMLibgccHalfConvertCalls :
1626+   LibcallImpls<(add __truncsfhf2, __extendhfsf2),
1627+     RuntimeLibcallPredicate<[{!TT.isTargetAEABI() && TT.isOSBinFormatMachO()}]>> {
1628+   let CallingConv = ARMHalfConvertLibcallCallingConv;
1629+ }
1630+ 
1631+ // FIXME: These conditions are probably bugged. We're using the
1632+ // default libgcc call when the other cases are replaced.
1633+ def ARMDoubleToHalfCalls :
1634+   LibcallImpls<(add __truncdfhf2),
1635+     RuntimeLibcallPredicate<[{!TT.isTargetAEABI()}]>> {
1636+   let CallingConv = ARMHalfConvertLibcallCallingConv;
1637+ }
1638+ 
1639+ // In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
1640+ // they have a __gnu_ prefix (which is the default).
1641+ def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
1642+                                         isTargetAEABIAndAAPCS_ABI> {
1643+   let CallingConv = ARM_AAPCS;
1644+ }
1645+ 
16321646def GNUEABIHalfConvertCalls :
16331647  LibcallImpls<(add __gnu_f2h_ieee, __gnu_h2f_ieee),
16341648    RuntimeLibcallPredicate<[{!TT.isOSBinFormatMachO() &&
@@ -1755,7 +1769,9 @@ def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
17551769
17561770def ARMSystemLibrary
17571771    : SystemRuntimeLibrary<isARMOrThumb,
1758-       (add WinDefaultLibcallImpls,
1772+       (add (sub WinDefaultLibcallImpls, ARMLibgccHalfConvertCalls,
1773+                                         GNUEABIHalfConvertCalls,
1774+                                         ARMDoubleToHalfCalls),
17591775           LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
17601776           LibmHasFrexpF32, LibmHasLdexpF32,
17611777           LibmHasFrexpF128, LibmHasLdexpF128,
@@ -1769,8 +1785,10 @@ def ARMSystemLibrary
17691785
17701786           AEABICalls,
17711787           AEABI45MemCalls,
1788+            ARMLibgccHalfConvertCalls,
17721789           EABIHalfConvertCalls,
17731790           GNUEABIHalfConvertCalls,
1791+            ARMDoubleToHalfCalls,
17741792
17751793           // Use divmod compiler-rt calls for iOS 5.0 and later.
17761794           LibcallImpls<(add __divmodsi4, __udivmodsi4),
0 commit comments