Skip to content

Commit 1a5ee21

Browse files
committed
RuntimeLibcalls: Mostly move x86 configuration into tablegen
This is getting pretty ugly, but seems to be the worst of the cases. Opting out of the base set of calls for the various windows cases is really ugly. We need to apply that to the arm cases as well. It also may make sense to go back to transposing the architecture and operating system (i.e. make isOSWindows the SystemLibrary and then modify based on architecture).
1 parent e933483 commit 1a5ee21

File tree

3 files changed

+105
-143
lines changed

3 files changed

+105
-143
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,10 @@ struct RuntimeLibcallsInfo {
174174
(TT.isAndroid() && !TT.isAndroidVersionLT(9));
175175
}
176176

177+
static bool hasSinCos_f32_f64(const Triple &TT) {
178+
return hasSinCos(TT) || TT.isPS();
179+
}
180+
177181
LLVM_ABI void initDefaultLibCallImpls();
178182

179183
/// Generated by tablegen.

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,23 @@ class DuplicateLibcallImplWithPrefix<RuntimeLibcallImpl Impl, string prefix>
1717

1818
/// Libcall Predicates
1919
def isOSDarwin : RuntimeLibcallPredicate<"TT.isOSDarwin()">;
20+
def isOSOpenBSD : RuntimeLibcallPredicate<"TT.isOSOpenBSD()">;
2021
def isOSWindows : RuntimeLibcallPredicate<"TT.isOSWindows()">;
22+
def isNotOSWindows : RuntimeLibcallPredicate<"!TT.isOSWindows()">;
23+
def isNotOSMSVCRT : RuntimeLibcallPredicate<"!TT.isOSMSVCRT()">;
24+
def isPS : RuntimeLibcallPredicate<"TT.isPS()">;
25+
def isNotOSWindowsOrIsCygwinMinGW
26+
: RuntimeLibcallPredicate<"!TT.isOSWindows() || TT.isOSCygMing()">;
2127

28+
29+
def isGNUEnvironment : RuntimeLibcallPredicate<"TT.isGNUEnvironment()">;
2230
def darwinHasSinCosStret : RuntimeLibcallPredicate<"darwinHasSinCosStret(TT)">;
2331
def darwinHasExp10 : RuntimeLibcallPredicate<"darwinHasExp10(TT)">;
2432
def hasSinCos : RuntimeLibcallPredicate<"hasSinCos(TT)">;
2533

34+
// FIXME: Way to combine predicates
35+
def hasSinCos_f32_f64 : RuntimeLibcallPredicate<"hasSinCos_f32_f64(TT)">;
36+
2637
//--------------------------------------------------------------------
2738
// Declare all kinds of used libcalls
2839
//--------------------------------------------------------------------
@@ -514,11 +525,13 @@ def __divxf3 : RuntimeLibcallImpl<DIV_F80>;
514525
def __divtf3 : RuntimeLibcallImpl<DIV_F128>;
515526
def __gcc_qdiv : RuntimeLibcallImpl<DIV_PPCF128>;
516527

528+
defset list<RuntimeLibcallImpl> PowiLibcallImpls = {
517529
def __powisf2 : RuntimeLibcallImpl<POWI_F32>;
518530
def __powidf2 : RuntimeLibcallImpl<POWI_F64>;
519531
def __powixf2 : RuntimeLibcallImpl<POWI_F80>;
520532
def __powitf2_f128 : RuntimeLibcallImpl<POWI_F128, "__powitf2">;
521533
def __powitf2_ppc128 : RuntimeLibcallImpl<POWI_PPCF128, "__powitf2">;
534+
}
522535

523536
// Conversion
524537
def __extendbfsf2 : RuntimeLibcallImpl<FPEXT_BF16_F32>;
@@ -1088,6 +1101,29 @@ defvar LibmHasSinCosF80 = LibcallImpls<(add sincos_f80), hasSinCos>;
10881101
defvar LibmHasSinCosF128 = LibcallImpls<(add sincos_f128), hasSinCos>;
10891102
defvar LibmHasSinCosPPCF128 = LibcallImpls<(add sincos_ppcf128), hasSinCos>;
10901103

1104+
defvar WindowsMathRemovals = [
1105+
ldexpf, ldexp_f80, ldexp_f128, ldexp_ppcf128,
1106+
frexpf, frexp_f80, frexp_f128, frexp_ppcf128
1107+
];
1108+
1109+
defvar MostPowI = !listremove(PowiLibcallImpls, [__powitf2_f128]);
1110+
defvar WindowsExclusions = !listconcat(WindowsMathRemovals, MostPowI);
1111+
1112+
// Targets which support windows should start with these as a base and
1113+
// add in calls for other OSes
1114+
defvar Win32DefaultLibcallImpls = !listremove(DefaultLibcallImpls32, WindowsExclusions);
1115+
defvar Win64DefaultLibcallImpls = !listremove(DefaultLibcallImpls64, WindowsExclusions);
1116+
1117+
defvar LibmHasFrexpF32 = LibcallImpls<(add frexpf), isNotOSWindowsOrIsCygwinMinGW>;
1118+
defvar LibmHasLdexpF32 = LibcallImpls<(add ldexpf), isNotOSWindowsOrIsCygwinMinGW>;
1119+
1120+
defvar LibmHasFrexpF80 = LibcallImpls<(add frexp_f80), isNotOSWindowsOrIsCygwinMinGW>;
1121+
defvar LibmHasLdexpF80 = LibcallImpls<(add ldexp_f80), isNotOSWindowsOrIsCygwinMinGW>;
1122+
1123+
defvar LibmHasFrexpF128 = LibcallImpls<(add frexp_f128), isNotOSWindowsOrIsCygwinMinGW>;
1124+
defvar LibmHasLdexpF128 = LibcallImpls<(add ldexp_f128), isNotOSWindowsOrIsCygwinMinGW>;
1125+
1126+
10911127
//===----------------------------------------------------------------------===//
10921128
// Objective-C Runtime Libcalls
10931129
//===----------------------------------------------------------------------===//
@@ -1155,7 +1191,10 @@ def isAArch64_ILP64 : RuntimeLibcallPredicate<"TT.isAArch64(64)">;
11551191

11561192
def AArch64SystemLibrary : SystemRuntimeLibrary<
11571193
isAArch64_ExceptArm64EC,
1158-
(add DefaultRuntimeLibcallImpls,
1194+
(add Win64DefaultLibcallImpls,
1195+
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
1196+
LibmHasFrexpF32, LibmHasLdexpF32,
1197+
LibmHasFrexpF128, LibmHasLdexpF128,
11591198
AArch64LibcallImpls,
11601199
LibcallImpls<(add Int128RTLibcalls), isAArch64_ILP64>,
11611200
LibcallImpls<(add bzero), isOSDarwin>,
@@ -1165,7 +1204,7 @@ def AArch64SystemLibrary : SystemRuntimeLibrary<
11651204

11661205
// Prepend a # to every name
11671206
defset list<RuntimeLibcallImpl> WinArm64ECDefaultRuntimeLibcallImpls = {
1168-
foreach libcall = DefaultLibcallImpls64 in {
1207+
foreach libcall = Win64DefaultLibcallImpls in {
11691208
def arm64ec_#libcall : DuplicateLibcallImplWithPrefix<libcall, "#">;
11701209
}
11711210

@@ -1422,11 +1461,15 @@ def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
14221461

14231462
def ARMSystemLibrary
14241463
: SystemRuntimeLibrary<isARMOrThumb,
1425-
(add DefaultLibcallImpls32,
1464+
(add Win32DefaultLibcallImpls,
1465+
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
1466+
LibmHasFrexpF32, LibmHasLdexpF32,
1467+
LibmHasFrexpF128, LibmHasLdexpF128,
14261468
WindowARMDivRemCalls,
14271469
WindowARMFPIntCasts,
14281470
AEABIDivRemCalls,
14291471
DarwinSinCosStret, DarwinExp10,
1472+
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
14301473

14311474
// Use divmod compiler-rt calls for iOS 5.0 and later.
14321475
LibcallImpls<(add __divmodsi4, __udivmodsi4),
@@ -1920,6 +1963,8 @@ def PPCSystemLibrary
19201963
__extendkftf2, __trunctfkf2,
19211964
DefaultRuntimeLibcallImpls_ppcf128,
19221965
LibmF128Libcalls, AIX32Calls, AIX64Calls,
1966+
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
1967+
LibmHasSinCosPPCF128,
19231968
AvailableIf<memcpy, isNotAIX>,
19241969
LibcallImpls<(add Int128RTLibcalls), isPPC64>)>;
19251970

@@ -2007,28 +2052,59 @@ def SPARCSystemLibrary
20072052
// Windows Runtime Libcalls
20082053
//===----------------------------------------------------------------------===//
20092054

2010-
// TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()
2011-
2055+
defset list<RuntimeLibcallImpl> WindowsDivRemMulLibcalls = {
20122056
def _alldiv : RuntimeLibcallImpl<SDIV_I64>;
20132057
def _aulldiv : RuntimeLibcallImpl<UDIV_I64>;
20142058
def _allrem : RuntimeLibcallImpl<SREM_I64>;
20152059
def _aullrem : RuntimeLibcallImpl<UREM_I64>;
20162060
def _allmul : RuntimeLibcallImpl<MUL_I64>;
2061+
}
20172062

20182063
//===----------------------------------------------------------------------===//
20192064
// X86 Runtime Libcalls
20202065
//===----------------------------------------------------------------------===//
20212066

20222067
def isX86_32 : RuntimeLibcallPredicate<"TT.getArch() == Triple::x86">;
20232068
def isX86_64 : RuntimeLibcallPredicate<"TT.getArch() == Triple::x86_64">;
2069+
def isX86 : RuntimeLibcallPredicate<"TT.isX86()">;
2070+
2071+
// Some darwins have an optimized __bzero/bzero function.
2072+
def darwinHas__bzero : RuntimeLibcallPredicate<"TT.isMacOSX() && !TT.isMacOSXVersionLT(10, 6)">;
2073+
2074+
// Use the f128 variants of math functions on x86
2075+
defvar X86_F128_Libcalls = LibcallImpls<(add LibmF128Libcalls, LibmF128FiniteLibcalls), isGNUEnvironment>;
2076+
2077+
defvar SinCosF32F64Libcalls = LibcallImpls<(add sincosf, sincos), hasSinCos_f32_f64>;
2078+
2079+
defvar X86CommonLibcalls =
2080+
(add DarwinSinCosStret, DarwinExp10,
2081+
X86_F128_Libcalls,
2082+
sincos_f80,
2083+
LibmHasSinCosF80, // FIXME: Depends on long double
2084+
SinCosF32F64Libcalls,
2085+
LibcallImpls<(add __bzero), darwinHas__bzero>,
2086+
LibmHasFrexpF32, LibmHasLdexpF32,
2087+
LibmHasFrexpF80, LibmHasLdexpF80,
2088+
DefaultRuntimeLibcallImpls_f80,
2089+
// MSVCRT doesn't have powi
2090+
// FIXME: It's almost certainly correct that MSVCRT has
2091+
// __powitf2_f128, but at least one test is relying on it.
2092+
__powitf2_f128,
2093+
LibcallImpls<(add MostPowI), isNotOSMSVCRT>
2094+
);
2095+
2096+
defvar Windows32DivRemMulCalls =
2097+
LibcallImpls<(add WindowsDivRemMulLibcalls),
2098+
RuntimeLibcallPredicate<"TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()">>;
20242099

20252100
def X86_32SystemLibrary
20262101
: SystemRuntimeLibrary<isX86_32,
2027-
(add DefaultLibcallImpls32, DefaultRuntimeLibcallImpls_f80)>;
2102+
(add X86CommonLibcalls,
2103+
Windows32DivRemMulCalls, Win32DefaultLibcallImpls)>;
20282104

20292105
def X86_64SystemLibrary
20302106
: SystemRuntimeLibrary<isX86_64,
2031-
(add DefaultLibcallImpls64, DefaultRuntimeLibcallImpls_f80)>;
2107+
(add X86CommonLibcalls, Win64DefaultLibcallImpls, Int128RTLibcalls)>;
20322108

20332109
//===----------------------------------------------------------------------===//
20342110
// XCore Runtime Libcalls

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 18 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -62,69 +62,6 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
6262
Info.setLibcallImplCallingConv(Impl, CallingConv::ARM_AAPCS);
6363
}
6464

65-
static void setLongDoubleIsF128Libm(RuntimeLibcallsInfo &Info,
66-
bool FiniteOnlyFuncs = false) {
67-
Info.setLibcallImpl(RTLIB::REM_F128, RTLIB::fmodf128);
68-
Info.setLibcallImpl(RTLIB::FMA_F128, RTLIB::fmaf128);
69-
Info.setLibcallImpl(RTLIB::SQRT_F128, RTLIB::sqrtf128);
70-
Info.setLibcallImpl(RTLIB::CBRT_F128, RTLIB::cbrtf128);
71-
Info.setLibcallImpl(RTLIB::LOG_F128, RTLIB::logf128);
72-
Info.setLibcallImpl(RTLIB::LOG2_F128, RTLIB::log2f128);
73-
Info.setLibcallImpl(RTLIB::LOG10_F128, RTLIB::log10f128);
74-
Info.setLibcallImpl(RTLIB::EXP_F128, RTLIB::expf128);
75-
Info.setLibcallImpl(RTLIB::EXP2_F128, RTLIB::exp2f128);
76-
Info.setLibcallImpl(RTLIB::EXP10_F128, RTLIB::exp10f128);
77-
Info.setLibcallImpl(RTLIB::SIN_F128, RTLIB::sinf128);
78-
Info.setLibcallImpl(RTLIB::COS_F128, RTLIB::cosf128);
79-
Info.setLibcallImpl(RTLIB::TAN_F128, RTLIB::tanf128);
80-
Info.setLibcallImpl(RTLIB::SINCOS_F128, RTLIB::sincosf128);
81-
Info.setLibcallImpl(RTLIB::ASIN_F128, RTLIB::asinf128);
82-
Info.setLibcallImpl(RTLIB::ACOS_F128, RTLIB::acosf128);
83-
Info.setLibcallImpl(RTLIB::ATAN_F128, RTLIB::atanf128);
84-
Info.setLibcallImpl(RTLIB::ATAN2_F128, RTLIB::atan2f128);
85-
Info.setLibcallImpl(RTLIB::SINH_F128, RTLIB::sinhf128);
86-
Info.setLibcallImpl(RTLIB::COSH_F128, RTLIB::coshf128);
87-
Info.setLibcallImpl(RTLIB::TANH_F128, RTLIB::tanhf128);
88-
Info.setLibcallImpl(RTLIB::POW_F128, RTLIB::powf128);
89-
Info.setLibcallImpl(RTLIB::CEIL_F128, RTLIB::ceilf128);
90-
Info.setLibcallImpl(RTLIB::TRUNC_F128, RTLIB::truncf128);
91-
Info.setLibcallImpl(RTLIB::RINT_F128, RTLIB::rintf128);
92-
Info.setLibcallImpl(RTLIB::NEARBYINT_F128, RTLIB::nearbyintf128);
93-
Info.setLibcallImpl(RTLIB::ROUND_F128, RTLIB::roundf128);
94-
Info.setLibcallImpl(RTLIB::ROUNDEVEN_F128, RTLIB::roundevenf128);
95-
Info.setLibcallImpl(RTLIB::FLOOR_F128, RTLIB::floorf128);
96-
Info.setLibcallImpl(RTLIB::COPYSIGN_F128, RTLIB::copysignf128);
97-
Info.setLibcallImpl(RTLIB::FMIN_F128, RTLIB::fminf128);
98-
Info.setLibcallImpl(RTLIB::FMAX_F128, RTLIB::fmaxf128);
99-
Info.setLibcallImpl(RTLIB::FMINIMUM_F128, RTLIB::fminimumf128);
100-
Info.setLibcallImpl(RTLIB::FMAXIMUM_F128, RTLIB::fmaximumf128);
101-
Info.setLibcallImpl(RTLIB::FMINIMUM_NUM_F128, RTLIB::fminimum_numf128);
102-
Info.setLibcallImpl(RTLIB::FMAXIMUM_NUM_F128, RTLIB::fmaximum_numf128);
103-
Info.setLibcallImpl(RTLIB::LROUND_F128, RTLIB::lroundf128);
104-
Info.setLibcallImpl(RTLIB::LLROUND_F128, RTLIB::llroundf128);
105-
Info.setLibcallImpl(RTLIB::LRINT_F128, RTLIB::lrintf128);
106-
Info.setLibcallImpl(RTLIB::LLRINT_F128, RTLIB::llrintf128);
107-
Info.setLibcallImpl(RTLIB::LDEXP_F128, RTLIB::ldexpf128);
108-
Info.setLibcallImpl(RTLIB::FREXP_F128, RTLIB::frexpf128);
109-
Info.setLibcallImpl(RTLIB::MODF_F128, RTLIB::modff128);
110-
111-
if (FiniteOnlyFuncs) {
112-
Info.setLibcallImpl(RTLIB::LOG_FINITE_F128, RTLIB::__logf128_finite);
113-
Info.setLibcallImpl(RTLIB::LOG2_FINITE_F128, RTLIB::__log2f128_finite);
114-
Info.setLibcallImpl(RTLIB::LOG10_FINITE_F128, RTLIB::__log10f128_finite);
115-
Info.setLibcallImpl(RTLIB::EXP_FINITE_F128, RTLIB::__expf128_finite);
116-
Info.setLibcallImpl(RTLIB::EXP2_FINITE_F128, RTLIB::__exp2f128_finite);
117-
Info.setLibcallImpl(RTLIB::POW_FINITE_F128, RTLIB::__powf128_finite);
118-
} else {
119-
Info.setLibcallImpl(RTLIB::LOG_FINITE_F128, RTLIB::Unsupported);
120-
Info.setLibcallImpl(RTLIB::LOG2_FINITE_F128, RTLIB::Unsupported);
121-
Info.setLibcallImpl(RTLIB::LOG10_FINITE_F128, RTLIB::Unsupported);
122-
Info.setLibcallImpl(RTLIB::EXP_FINITE_F128, RTLIB::Unsupported);
123-
Info.setLibcallImpl(RTLIB::EXP2_FINITE_F128, RTLIB::Unsupported);
124-
Info.setLibcallImpl(RTLIB::POW_FINITE_F128, RTLIB::Unsupported);
125-
}
126-
}
127-
12865
void RTLIB::RuntimeLibcallsInfo::initDefaultLibCallImpls() {
12966
std::memcpy(LibcallImpls, DefaultLibcallImpls, sizeof(LibcallImpls));
13067
static_assert(sizeof(LibcallImpls) == sizeof(DefaultLibcallImpls),
@@ -143,10 +80,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
14380
if (TT.isAMDGPU() || TT.isNVPTX() || TT.isWasm())
14481
return;
14582

146-
// Use the f128 variants of math functions on x86
147-
if (TT.isX86() && TT.isGNUEnvironment())
148-
setLongDoubleIsF128Libm(*this, /*FiniteOnlyFuncs=*/true);
149-
15083
if (TT.isX86() || TT.isVE() || TT.isARM() || TT.isThumb()) {
15184
if (ExceptionModel == ExceptionHandling::SjLj)
15285
setLibcallImpl(RTLIB::UNWIND_RESUME, RTLIB::_Unwind_SjLj_Resume);
@@ -160,91 +93,40 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
16093
setLibcallImpl(RTLIB::FPEXT_F16_F32, RTLIB::__extendhfsf2);
16194
setLibcallImpl(RTLIB::FPROUND_F32_F16, RTLIB::__truncsfhf2);
16295

163-
// Some darwins have an optimized __bzero/bzero function.
164-
if (TT.isX86()) {
165-
if (TT.isMacOSX() && !TT.isMacOSXVersionLT(10, 6))
166-
setLibcallImpl(RTLIB::BZERO, RTLIB::__bzero);
167-
}
168-
169-
if (darwinHasSinCosStret(TT)) {
170-
setLibcallImpl(RTLIB::SINCOS_STRET_F32, RTLIB::__sincosf_stret);
171-
setLibcallImpl(RTLIB::SINCOS_STRET_F64, RTLIB::__sincos_stret);
172-
if (TT.isWatchABI()) {
173-
setLibcallImplCallingConv(RTLIB::__sincosf_stret,
174-
CallingConv::ARM_AAPCS_VFP);
175-
setLibcallImplCallingConv(RTLIB::__sincos_stret,
176-
CallingConv::ARM_AAPCS_VFP);
177-
}
96+
if (TT.isWatchABI()) {
97+
setLibcallImplCallingConv(RTLIB::__sincosf_stret,
98+
CallingConv::ARM_AAPCS_VFP);
99+
setLibcallImplCallingConv(RTLIB::__sincos_stret,
100+
CallingConv::ARM_AAPCS_VFP);
178101
}
179102

180-
if (darwinHasExp10(TT)) {
181-
setLibcallImpl(RTLIB::EXP10_F32, RTLIB::__exp10f);
182-
setLibcallImpl(RTLIB::EXP10_F64, RTLIB::__exp10);
183-
} else {
103+
if (!darwinHasExp10(TT)) {
104+
// FIXME: Remove exp10 from default set
184105
setLibcallImpl(RTLIB::EXP10_F32, RTLIB::Unsupported);
185106
setLibcallImpl(RTLIB::EXP10_F64, RTLIB::Unsupported);
186107
}
187108
}
188109

189-
if (hasSinCos(TT)) {
190-
setLibcallImpl(RTLIB::SINCOS_F32, RTLIB::sincosf);
191-
setLibcallImpl(RTLIB::SINCOS_F64, RTLIB::sincos);
192-
setLibcallImpl(RTLIB::SINCOS_F80, RTLIB::sincos_f80);
193-
setLibcallImpl(RTLIB::SINCOS_F128, RTLIB::sincos_f128);
194-
setLibcallImpl(RTLIB::SINCOS_PPCF128, RTLIB::sincos_ppcf128);
195-
}
196-
197-
if (TT.isPS()) {
198-
setLibcallImpl(RTLIB::SINCOS_F32, RTLIB::sincosf);
199-
setLibcallImpl(RTLIB::SINCOS_F64, RTLIB::sincos);
200-
}
201-
202110
if (TT.isOSOpenBSD()) {
203111
setLibcallImpl(RTLIB::STACKPROTECTOR_CHECK_FAIL, RTLIB::Unsupported);
204112
}
205113

206-
if (TT.isOSWindows() && !TT.isOSCygMing()) {
207-
setLibcallImpl(RTLIB::LDEXP_F32, RTLIB::Unsupported);
208-
setLibcallImpl(RTLIB::LDEXP_F80, RTLIB::Unsupported);
209-
setLibcallImpl(RTLIB::LDEXP_F128, RTLIB::Unsupported);
210-
setLibcallImpl(RTLIB::LDEXP_PPCF128, RTLIB::Unsupported);
211-
212-
setLibcallImpl(RTLIB::FREXP_F32, RTLIB::Unsupported);
213-
setLibcallImpl(RTLIB::FREXP_F80, RTLIB::Unsupported);
214-
setLibcallImpl(RTLIB::FREXP_F128, RTLIB::Unsupported);
215-
setLibcallImpl(RTLIB::FREXP_PPCF128, RTLIB::Unsupported);
216-
}
114+
// Skip default manual processing for targets that have been fully ported to
115+
// tablegen for now. Eventually the rest of this should be deleted.
116+
if (TT.isX86() || TT.isAArch64() || TT.isWasm())
117+
return;
217118

218-
if (TT.isOSMSVCRT()) {
219-
// MSVCRT doesn't have powi; fall back to pow
220-
setLibcallImpl(RTLIB::POWI_F32, RTLIB::Unsupported);
221-
setLibcallImpl(RTLIB::POWI_F64, RTLIB::Unsupported);
119+
if (TT.isARM() || TT.isThumb()) {
120+
setARMLibcallNames(*this, TT, FloatABI, EABIVersion);
121+
return;
222122
}
223123

224-
// Setup Windows compiler runtime calls.
225-
if (TT.getArch() == Triple::x86 &&
226-
(TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment())) {
227-
static const struct {
228-
const RTLIB::Libcall Op;
229-
const RTLIB::LibcallImpl Impl;
230-
const CallingConv::ID CC;
231-
} LibraryCalls[] = {
232-
{RTLIB::SDIV_I64, RTLIB::_alldiv, CallingConv::X86_StdCall},
233-
{RTLIB::UDIV_I64, RTLIB::_aulldiv, CallingConv::X86_StdCall},
234-
{RTLIB::SREM_I64, RTLIB::_allrem, CallingConv::X86_StdCall},
235-
{RTLIB::UREM_I64, RTLIB::_aullrem, CallingConv::X86_StdCall},
236-
{RTLIB::MUL_I64, RTLIB::_allmul, CallingConv::X86_StdCall},
237-
};
238-
239-
for (const auto &LC : LibraryCalls) {
240-
setLibcallImpl(LC.Op, LC.Impl);
241-
setLibcallImplCallingConv(LC.Impl, LC.CC);
242-
}
124+
if (hasSinCos(TT)) {
125+
setLibcallImpl(RTLIB::SINCOS_F32, RTLIB::sincosf);
126+
setLibcallImpl(RTLIB::SINCOS_F64, RTLIB::sincos);
127+
setLibcallImpl(RTLIB::SINCOS_F128, RTLIB::sincos_f128);
243128
}
244129

245-
if (TT.isARM() || TT.isThumb())
246-
setARMLibcallNames(*this, TT, FloatABI, EABIVersion);
247-
248130
// These libcalls are only available in compiler-rt, not libgcc.
249131
if (TT.isArch64Bit()) {
250132
setLibcallImpl(RTLIB::SHL_I128, RTLIB::__ashlti3);

0 commit comments

Comments
 (0)