Skip to content

Commit bbd359e

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 2f195de commit bbd359e

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>;
@@ -1087,6 +1100,29 @@ defvar LibmHasSinCosF80 = LibcallImpls<(add sincos_f80), hasSinCos>;
10871100
defvar LibmHasSinCosF128 = LibcallImpls<(add sincos_f128), hasSinCos>;
10881101
defvar LibmHasSinCosPPCF128 = LibcallImpls<(add sincos_ppcf128), hasSinCos>;
10891102

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

11551191
def AArch64SystemLibrary : SystemRuntimeLibrary<
11561192
isAArch64_ExceptArm64EC,
1157-
(add DefaultRuntimeLibcallImpls,
1193+
(add Win64DefaultLibcallImpls,
1194+
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
1195+
LibmHasFrexpF32, LibmHasLdexpF32,
1196+
LibmHasFrexpF128, LibmHasLdexpF128,
11581197
AArch64LibcallImpls,
11591198
LibcallImpls<(add Int128RTLibcalls), isAArch64_ILP64>,
11601199
LibcallImpls<(add bzero), isOSDarwin>,
@@ -1164,7 +1203,7 @@ def AArch64SystemLibrary : SystemRuntimeLibrary<
11641203

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

@@ -1421,11 +1460,15 @@ def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
14211460

14221461
def ARMSystemLibrary
14231462
: SystemRuntimeLibrary<isARMOrThumb,
1424-
(add DefaultLibcallImpls32,
1463+
(add Win32DefaultLibcallImpls,
1464+
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
1465+
LibmHasFrexpF32, LibmHasLdexpF32,
1466+
LibmHasFrexpF128, LibmHasLdexpF128,
14251467
WindowARMDivRemCalls,
14261468
WindowARMFPIntCasts,
14271469
AEABIDivRemCalls,
14281470
DarwinSinCosStret, DarwinExp10,
1471+
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
14291472

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

@@ -1989,28 +2034,59 @@ def _Q_ulltoq : RuntimeLibcallImpl<UINTTOFP_I64_F128>;
19892034
// Windows Runtime Libcalls
19902035
//===----------------------------------------------------------------------===//
19912036

1992-
// TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()
1993-
2037+
defset list<RuntimeLibcallImpl> WindowsDivRemMulLibcalls = {
19942038
def _alldiv : RuntimeLibcallImpl<SDIV_I64>;
19952039
def _aulldiv : RuntimeLibcallImpl<UDIV_I64>;
19962040
def _allrem : RuntimeLibcallImpl<SREM_I64>;
19972041
def _aullrem : RuntimeLibcallImpl<UREM_I64>;
19982042
def _allmul : RuntimeLibcallImpl<MUL_I64>;
2043+
}
19992044

20002045
//===----------------------------------------------------------------------===//
20012046
// X86 Runtime Libcalls
20022047
//===----------------------------------------------------------------------===//
20032048

20042049
def isX86_32 : RuntimeLibcallPredicate<"TT.getArch() == Triple::x86">;
20052050
def isX86_64 : RuntimeLibcallPredicate<"TT.getArch() == Triple::x86_64">;
2051+
def isX86 : RuntimeLibcallPredicate<"TT.isX86()">;
2052+
2053+
// Some darwins have an optimized __bzero/bzero function.
2054+
def darwinHas__bzero : RuntimeLibcallPredicate<"TT.isMacOSX() && !TT.isMacOSXVersionLT(10, 6)">;
2055+
2056+
// Use the f128 variants of math functions on x86
2057+
defvar X86_F128_Libcalls = LibcallImpls<(add LibmF128Libcalls, LibmF128FiniteLibcalls), isGNUEnvironment>;
2058+
2059+
defvar SinCosF32F64Libcalls = LibcallImpls<(add sincosf, sincos), hasSinCos_f32_f64>;
2060+
2061+
defvar X86CommonLibcalls =
2062+
(add DarwinSinCosStret, DarwinExp10,
2063+
X86_F128_Libcalls,
2064+
sincos_f80,
2065+
LibmHasSinCosF80, // FIXME: Depends on long double
2066+
SinCosF32F64Libcalls,
2067+
LibcallImpls<(add __bzero), darwinHas__bzero>,
2068+
LibmHasFrexpF32, LibmHasLdexpF32,
2069+
LibmHasFrexpF80, LibmHasLdexpF80,
2070+
DefaultRuntimeLibcallImpls_f80,
2071+
// MSVCRT doesn't have powi
2072+
// FIXME: It's almost certainly correct that MSVCRT has
2073+
// __powitf2_f128, but at least one test is relying on it.
2074+
__powitf2_f128,
2075+
LibcallImpls<(add MostPowI), isNotOSMSVCRT>
2076+
);
2077+
2078+
defvar Windows32DivRemMulCalls =
2079+
LibcallImpls<(add WindowsDivRemMulLibcalls),
2080+
RuntimeLibcallPredicate<"TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment()">>;
20062081

20072082
def X86_32SystemLibrary
20082083
: SystemRuntimeLibrary<isX86_32,
2009-
(add DefaultLibcallImpls32, DefaultRuntimeLibcallImpls_f80)>;
2084+
(add X86CommonLibcalls,
2085+
Windows32DivRemMulCalls, Win32DefaultLibcallImpls)>;
20102086

20112087
def X86_64SystemLibrary
20122088
: SystemRuntimeLibrary<isX86_64,
2013-
(add DefaultLibcallImpls64, DefaultRuntimeLibcallImpls_f80)>;
2089+
(add X86CommonLibcalls, Win64DefaultLibcallImpls, Int128RTLibcalls)>;
20142090

20152091
//===----------------------------------------------------------------------===//
20162092
// 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)