Skip to content

Commit ead50e7

Browse files
committed
ARM: Start moving runtime libcalls into tablegen
We still need to manually set the calling conventions of some libcalls until the lowering is separated out.
1 parent b92d744 commit ead50e7

File tree

6 files changed

+53
-76
lines changed

6 files changed

+53
-76
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ struct RuntimeLibcallsInfo {
170170
void initDefaultLibCallImpls();
171171

172172
/// Generated by tablegen.
173-
void setTargetRuntimeLibcallSets(const Triple &TT);
173+
void setTargetRuntimeLibcallSets(const Triple &TT, FloatABI::ABIType FloatABI);
174174

175175
/// Set default libcall names. If a target wants to opt-out of a libcall it
176176
/// should be placed here.

llvm/include/llvm/IR/RuntimeLibcalls.td

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

1818
/// Libcall Predicates
1919
def isOSDarwin : RuntimeLibcallPredicate<"TT.isOSDarwin()">;
20+
def isOSWindows : RuntimeLibcallPredicate<"TT.isOSWindows()">;
2021

2122
def darwinHasSinCosStret : RuntimeLibcallPredicate<"darwinHasSinCosStret(TT)">;
2223
def darwinHasExp10 : RuntimeLibcallPredicate<"darwinHasExp10(TT)">;
@@ -1266,6 +1267,7 @@ def __aeabi_memclr4 : RuntimeLibcallImpl<AEABI_MEMCLR4>;
12661267
def __aeabi_memclr8 : RuntimeLibcallImpl<AEABI_MEMCLR8>;
12671268

12681269
// isTargetWindows()
1270+
defset list<RuntimeLibcallImpl> WindowsFPIntCastLibcalls = {
12691271
def __stoi64 : RuntimeLibcallImpl<FPTOSINT_F32_I64>; // CallingConv::ARM_AAPCS_VFP
12701272
def __dtoi64 : RuntimeLibcallImpl<FPTOSINT_F64_I64>; // CallingConv::ARM_AAPCS_VFP
12711273
def __stou64 : RuntimeLibcallImpl<FPTOUINT_F32_I64>; // CallingConv::ARM_AAPCS_VFP
@@ -1274,6 +1276,7 @@ def __i64tos : RuntimeLibcallImpl<SINTTOFP_I64_F32>; // CallingConv::ARM_AAPCS_V
12741276
def __i64tod : RuntimeLibcallImpl<SINTTOFP_I64_F64>; // CallingConv::ARM_AAPCS_VFP
12751277
def __u64tos : RuntimeLibcallImpl<UINTTOFP_I64_F32>; // CallingConv::ARM_AAPCS_VFP
12761278
def __u64tod : RuntimeLibcallImpl<UINTTOFP_I64_F64>; // CallingConv::ARM_AAPCS_VFP
1279+
}
12771280

12781281
def __rt_sdiv : RuntimeLibcallImpl<SDIVREM_I32>; // CallingConv::ARM_AAPCS
12791282
def __rt_sdiv64 : RuntimeLibcallImpl<SDIVREM_I64>; // CallingConv::ARM_AAPCS
@@ -1300,6 +1303,51 @@ def __aeabi_h2f : RuntimeLibcallImpl<FPEXT_F16_F32>; // CallingConv::ARM_AAPCS
13001303
def __gnu_f2h_ieee : RuntimeLibcallImpl<FPROUND_F32_F16>;
13011304
def __gnu_h2f_ieee : RuntimeLibcallImpl<FPEXT_F16_F32>;
13021305

1306+
1307+
def WindowARMDivRemCalls : LibcallImpls<
1308+
(add __rt_sdiv, __rt_sdiv64, __rt_udiv, __rt_udiv64),
1309+
isOSWindows> {
1310+
let CallingConv = ARM_AAPCS;
1311+
}
1312+
1313+
def WindowARMFPIntCasts : LibcallImpls<
1314+
(add WindowsFPIntCastLibcalls),
1315+
isOSWindows> {
1316+
let CallingConv = ARM_AAPCS_VFP;
1317+
}
1318+
1319+
1320+
// Register based DivRem for AEABI (RTABI 4.2)
1321+
def AEABIDivRemCalls : LibcallImpls<
1322+
(add __aeabi_idivmod, __aeabi_ldivmod,
1323+
__aeabi_uidivmod, __aeabi_uldivmod),
1324+
RuntimeLibcallPredicate<[{TT.isTargetAEABI() || TT.isAndroid() || TT.isTargetGNUAEABI() ||
1325+
TT.isTargetMuslAEABI()}]>> {
1326+
let CallingConv = ARM_AAPCS;
1327+
}
1328+
1329+
def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
1330+
1331+
def ARMSystemLibrary
1332+
: SystemRuntimeLibrary<isARMOrThumb,
1333+
(add DefaultLibcallImpls32,
1334+
WindowARMDivRemCalls,
1335+
WindowARMFPIntCasts,
1336+
AEABIDivRemCalls,
1337+
DarwinSinCosStret, DarwinExp10,
1338+
1339+
// Use divmod compiler-rt calls for iOS 5.0 and later.
1340+
LibcallImpls<(add __divmodsi4, __udivmodsi4),
1341+
RuntimeLibcallPredicate<[{TT.isOSBinFormatMachO() &&
1342+
(!TT.isiOS() || !TT.isOSVersionLT(5, 0))}]>>)> {
1343+
let DefaultLibcallCallingConv = LibcallCallingConv<[{
1344+
(!TT.isOSDarwin() && !TT.isiOS() && !TT.isWatchOS() && !TT.isDriverKit()) ?
1345+
(FloatABI == FloatABI::Hard ? CallingConv::ARM_AAPCS_VFP
1346+
: CallingConv::ARM_AAPCS) :
1347+
CallingConv::C
1348+
}]>;
1349+
}
1350+
13031351
//===----------------------------------------------------------------------===//
13041352
// AVR Runtime Libcalls
13051353
//===----------------------------------------------------------------------===//

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 1 addition & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -25,77 +25,6 @@ static cl::opt<bool>
2525
static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT,
2626
FloatABI::ABIType FloatABIType,
2727
EABI EABIVersion) {
28-
if (!TT.isOSDarwin() && !TT.isiOS() && !TT.isWatchOS() && !TT.isDriverKit()) {
29-
CallingConv::ID DefaultCC = FloatABIType == FloatABI::Hard
30-
? CallingConv::ARM_AAPCS_VFP
31-
: CallingConv::ARM_AAPCS;
32-
for (RTLIB::LibcallImpl LC : RTLIB::libcall_impls())
33-
Info.setLibcallImplCallingConv(LC, DefaultCC);
34-
}
35-
36-
// Register based DivRem for AEABI (RTABI 4.2)
37-
if (TT.isTargetAEABI() || TT.isAndroid() || TT.isTargetGNUAEABI() ||
38-
TT.isTargetMuslAEABI() || TT.isOSWindows()) {
39-
if (TT.isOSWindows()) {
40-
const struct {
41-
const RTLIB::Libcall Op;
42-
const RTLIB::LibcallImpl Impl;
43-
const CallingConv::ID CC;
44-
} LibraryCalls[] = {
45-
{RTLIB::SDIVREM_I32, RTLIB::__rt_sdiv, CallingConv::ARM_AAPCS},
46-
{RTLIB::SDIVREM_I64, RTLIB::__rt_sdiv64, CallingConv::ARM_AAPCS},
47-
{RTLIB::UDIVREM_I32, RTLIB::__rt_udiv, CallingConv::ARM_AAPCS},
48-
{RTLIB::UDIVREM_I64, RTLIB::__rt_udiv64, CallingConv::ARM_AAPCS},
49-
};
50-
51-
for (const auto &LC : LibraryCalls) {
52-
Info.setLibcallImpl(LC.Op, LC.Impl);
53-
Info.setLibcallImplCallingConv(LC.Impl, LC.CC);
54-
}
55-
} else {
56-
const struct {
57-
const RTLIB::Libcall Op;
58-
const RTLIB::LibcallImpl Impl;
59-
} LibraryCalls[] = {
60-
{RTLIB::SDIVREM_I32, RTLIB::__aeabi_idivmod},
61-
{RTLIB::SDIVREM_I64, RTLIB::__aeabi_ldivmod},
62-
{RTLIB::UDIVREM_I32, RTLIB::__aeabi_uidivmod},
63-
{RTLIB::UDIVREM_I64, RTLIB::__aeabi_uldivmod},
64-
};
65-
66-
for (const auto &LC : LibraryCalls)
67-
Info.setLibcallImpl(LC.Op, LC.Impl);
68-
}
69-
}
70-
71-
if (TT.isOSWindows()) {
72-
static const struct {
73-
const RTLIB::Libcall Op;
74-
const RTLIB::LibcallImpl Impl;
75-
const CallingConv::ID CC;
76-
} LibraryCalls[] = {
77-
{RTLIB::FPTOSINT_F32_I64, RTLIB::__stoi64, CallingConv::ARM_AAPCS_VFP},
78-
{RTLIB::FPTOSINT_F64_I64, RTLIB::__dtoi64, CallingConv::ARM_AAPCS_VFP},
79-
{RTLIB::FPTOUINT_F32_I64, RTLIB::__stou64, CallingConv::ARM_AAPCS_VFP},
80-
{RTLIB::FPTOUINT_F64_I64, RTLIB::__dtou64, CallingConv::ARM_AAPCS_VFP},
81-
{RTLIB::SINTTOFP_I64_F32, RTLIB::__i64tos, CallingConv::ARM_AAPCS_VFP},
82-
{RTLIB::SINTTOFP_I64_F64, RTLIB::__i64tod, CallingConv::ARM_AAPCS_VFP},
83-
{RTLIB::UINTTOFP_I64_F32, RTLIB::__u64tos, CallingConv::ARM_AAPCS_VFP},
84-
{RTLIB::UINTTOFP_I64_F64, RTLIB::__u64tod, CallingConv::ARM_AAPCS_VFP},
85-
};
86-
87-
for (const auto &LC : LibraryCalls) {
88-
Info.setLibcallImpl(LC.Op, LC.Impl);
89-
Info.setLibcallImplCallingConv(LC.Impl, LC.CC);
90-
}
91-
}
92-
93-
// Use divmod compiler-rt calls for iOS 5.0 and later.
94-
if (TT.isOSBinFormatMachO() && (!TT.isiOS() || !TT.isOSVersionLT(5, 0))) {
95-
Info.setLibcallImpl(RTLIB::SDIVREM_I32, RTLIB::__divmodsi4);
96-
Info.setLibcallImpl(RTLIB::UDIVREM_I32, RTLIB::__udivmodsi4);
97-
}
98-
9928
static const RTLIB::LibcallImpl AAPCS_Libcalls[] = {
10029
RTLIB::__aeabi_dadd, RTLIB::__aeabi_ddiv,
10130
RTLIB::__aeabi_dmul, RTLIB::__aeabi_dsub,
@@ -212,7 +141,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
212141
ExceptionHandling ExceptionModel,
213142
FloatABI::ABIType FloatABI,
214143
EABI EABIVersion, StringRef ABIName) {
215-
setTargetRuntimeLibcallSets(TT);
144+
setTargetRuntimeLibcallSets(TT, FloatABI);
216145

217146
// Use the f128 variants of math functions on x86
218147
if (TT.isX86() && TT.isGNUEnvironment())

llvm/test/TableGen/RuntimeLibcallEmitter-calling-conv.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def MSP430LibraryWithCondCC : SystemRuntimeLibrary<isMSP430,
4141
>;
4242

4343

44-
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT) {
44+
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, FloatABI::ABIType FloatABI) {
4545
// CHECK: if (TT.getArch() == Triple::avr && TT.isOSHurd()) {
4646
// CHECK-NEXT: const CallingConv::ID DefaultCC = isFoo() ? CallingConv::Fast : CallingConv::GHC;
4747
// CHECK-NEXT: for (CallingConv::ID &Entry : LibcallImplCallingConvs) {

llvm/test/TableGen/RuntimeLibcallEmitter.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def BlahLibrary : SystemRuntimeLibrary<isBlahArch, (add calloc, LibraryWithCondi
141141
// CHECK-NEXT: };
142142

143143

144-
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT) {
144+
// CHECK: void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets(const llvm::Triple &TT, FloatABI::ABIType FloatABI) {
145145
// CHECK-NEXT: struct LibcallImplPair {
146146
// CHECK-NEXT: RTLIB::Libcall Func;
147147
// CHECK-NEXT: RTLIB::LibcallImpl Impl;

llvm/utils/TableGen/Basic/RuntimeLibcallsEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ void RuntimeLibcallEmitter::emitGetInitRuntimeLibcallNames(
362362
void RuntimeLibcallEmitter::emitSystemRuntimeLibrarySetCalls(
363363
raw_ostream &OS) const {
364364
OS << "void llvm::RTLIB::RuntimeLibcallsInfo::setTargetRuntimeLibcallSets("
365-
"const llvm::Triple &TT) {\n"
365+
"const llvm::Triple &TT, FloatABI::ABIType FloatABI) {\n"
366366
" struct LibcallImplPair {\n"
367367
" RTLIB::Libcall Func;\n"
368368
" RTLIB::LibcallImpl Impl;\n"

0 commit comments

Comments
 (0)