Skip to content

Commit 40787c6

Browse files
committed
MSP430: Partially move runtime libcall config out of TargetLowering
RuntimeLibcalls needs to be correct outside of codegen contexts.
1 parent e4b22e5 commit 40787c6

File tree

2 files changed

+120
-114
lines changed

2 files changed

+120
-114
lines changed

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,123 @@
1111
using namespace llvm;
1212
using namespace RTLIB;
1313

14+
static void setMSP430Libcalls(RuntimeLibcallsInfo &Info, const Triple &TT) {
15+
// EABI Libcalls - EABI Section 6.2
16+
const struct {
17+
const RTLIB::Libcall Op;
18+
const char *const Name;
19+
} LibraryCalls[] = {
20+
// Floating point conversions - EABI Table 6
21+
{RTLIB::FPROUND_F64_F32, "__mspabi_cvtdf"},
22+
{RTLIB::FPEXT_F32_F64, "__mspabi_cvtfd"},
23+
// The following is NOT implemented in libgcc
24+
//{ RTLIB::FPTOSINT_F64_I16, "__mspabi_fixdi" },
25+
{RTLIB::FPTOSINT_F64_I32, "__mspabi_fixdli"},
26+
{RTLIB::FPTOSINT_F64_I64, "__mspabi_fixdlli"},
27+
// The following is NOT implemented in libgcc
28+
//{ RTLIB::FPTOUINT_F64_I16, "__mspabi_fixdu" },
29+
{RTLIB::FPTOUINT_F64_I32, "__mspabi_fixdul"},
30+
{RTLIB::FPTOUINT_F64_I64, "__mspabi_fixdull"},
31+
// The following is NOT implemented in libgcc
32+
//{ RTLIB::FPTOSINT_F32_I16, "__mspabi_fixfi" },
33+
{RTLIB::FPTOSINT_F32_I32, "__mspabi_fixfli"},
34+
{RTLIB::FPTOSINT_F32_I64, "__mspabi_fixflli"},
35+
// The following is NOT implemented in libgcc
36+
//{ RTLIB::FPTOUINT_F32_I16, "__mspabi_fixfu" },
37+
{RTLIB::FPTOUINT_F32_I32, "__mspabi_fixful"},
38+
{RTLIB::FPTOUINT_F32_I64, "__mspabi_fixfull"},
39+
// TODO The following IS implemented in libgcc
40+
//{ RTLIB::SINTTOFP_I16_F64, "__mspabi_fltid" },
41+
{RTLIB::SINTTOFP_I32_F64, "__mspabi_fltlid"},
42+
// TODO The following IS implemented in libgcc but is not in the EABI
43+
{RTLIB::SINTTOFP_I64_F64, "__mspabi_fltllid"},
44+
// TODO The following IS implemented in libgcc
45+
//{ RTLIB::UINTTOFP_I16_F64, "__mspabi_fltud" },
46+
{RTLIB::UINTTOFP_I32_F64, "__mspabi_fltuld"},
47+
// The following IS implemented in libgcc but is not in the EABI
48+
{RTLIB::UINTTOFP_I64_F64, "__mspabi_fltulld"},
49+
// TODO The following IS implemented in libgcc
50+
//{ RTLIB::SINTTOFP_I16_F32, "__mspabi_fltif" },
51+
{RTLIB::SINTTOFP_I32_F32, "__mspabi_fltlif"},
52+
// TODO The following IS implemented in libgcc but is not in the EABI
53+
{RTLIB::SINTTOFP_I64_F32, "__mspabi_fltllif"},
54+
// TODO The following IS implemented in libgcc
55+
//{ RTLIB::UINTTOFP_I16_F32, "__mspabi_fltuf" },
56+
{RTLIB::UINTTOFP_I32_F32, "__mspabi_fltulf"},
57+
// The following IS implemented in libgcc but is not in the EABI
58+
{RTLIB::UINTTOFP_I64_F32, "__mspabi_fltullf"},
59+
60+
// Floating point comparisons - EABI Table 7
61+
{RTLIB::OEQ_F64, "__mspabi_cmpd"},
62+
{RTLIB::UNE_F64, "__mspabi_cmpd"},
63+
{RTLIB::OGE_F64, "__mspabi_cmpd"},
64+
{RTLIB::OLT_F64, "__mspabi_cmpd"},
65+
{RTLIB::OLE_F64, "__mspabi_cmpd"},
66+
{RTLIB::OGT_F64, "__mspabi_cmpd"},
67+
{RTLIB::OEQ_F32, "__mspabi_cmpf"},
68+
{RTLIB::UNE_F32, "__mspabi_cmpf"},
69+
{RTLIB::OGE_F32, "__mspabi_cmpf"},
70+
{RTLIB::OLT_F32, "__mspabi_cmpf"},
71+
{RTLIB::OLE_F32, "__mspabi_cmpf"},
72+
{RTLIB::OGT_F32, "__mspabi_cmpf"},
73+
74+
// Floating point arithmetic - EABI Table 8
75+
{RTLIB::ADD_F64, "__mspabi_addd"},
76+
{RTLIB::ADD_F32, "__mspabi_addf"},
77+
{RTLIB::DIV_F64, "__mspabi_divd"},
78+
{RTLIB::DIV_F32, "__mspabi_divf"},
79+
{RTLIB::MUL_F64, "__mspabi_mpyd"},
80+
{RTLIB::MUL_F32, "__mspabi_mpyf"},
81+
{RTLIB::SUB_F64, "__mspabi_subd"},
82+
{RTLIB::SUB_F32, "__mspabi_subf"},
83+
// The following are NOT implemented in libgcc
84+
// { RTLIB::NEG_F64, "__mspabi_negd" },
85+
// { RTLIB::NEG_F32, "__mspabi_negf" },
86+
87+
// Universal Integer Operations - EABI Table 9
88+
{RTLIB::SDIV_I16, "__mspabi_divi"},
89+
{RTLIB::SDIV_I32, "__mspabi_divli"},
90+
{RTLIB::SDIV_I64, "__mspabi_divlli"},
91+
{RTLIB::UDIV_I16, "__mspabi_divu"},
92+
{RTLIB::UDIV_I32, "__mspabi_divul"},
93+
{RTLIB::UDIV_I64, "__mspabi_divull"},
94+
{RTLIB::SREM_I16, "__mspabi_remi"},
95+
{RTLIB::SREM_I32, "__mspabi_remli"},
96+
{RTLIB::SREM_I64, "__mspabi_remlli"},
97+
{RTLIB::UREM_I16, "__mspabi_remu"},
98+
{RTLIB::UREM_I32, "__mspabi_remul"},
99+
{RTLIB::UREM_I64, "__mspabi_remull"},
100+
101+
// Bitwise Operations - EABI Table 10
102+
// TODO: __mspabi_[srli/srai/slli] ARE implemented in libgcc
103+
{RTLIB::SRL_I32, "__mspabi_srll"},
104+
{RTLIB::SRA_I32, "__mspabi_sral"},
105+
{RTLIB::SHL_I32, "__mspabi_slll"},
106+
// __mspabi_[srlll/srall/sllll/rlli/rlll] are NOT implemented in libgcc
107+
};
108+
109+
for (const auto &LC : LibraryCalls)
110+
Info.setLibcallName(LC.Op, LC.Name);
111+
112+
// Several of the runtime library functions use a special calling conv
113+
Info.setLibcallCallingConv(RTLIB::UDIV_I64, CallingConv::MSP430_BUILTIN);
114+
Info.setLibcallCallingConv(RTLIB::UREM_I64, CallingConv::MSP430_BUILTIN);
115+
Info.setLibcallCallingConv(RTLIB::SDIV_I64, CallingConv::MSP430_BUILTIN);
116+
Info.setLibcallCallingConv(RTLIB::SREM_I64, CallingConv::MSP430_BUILTIN);
117+
Info.setLibcallCallingConv(RTLIB::ADD_F64, CallingConv::MSP430_BUILTIN);
118+
Info.setLibcallCallingConv(RTLIB::SUB_F64, CallingConv::MSP430_BUILTIN);
119+
Info.setLibcallCallingConv(RTLIB::MUL_F64, CallingConv::MSP430_BUILTIN);
120+
Info.setLibcallCallingConv(RTLIB::DIV_F64, CallingConv::MSP430_BUILTIN);
121+
Info.setLibcallCallingConv(RTLIB::OEQ_F64, CallingConv::MSP430_BUILTIN);
122+
Info.setLibcallCallingConv(RTLIB::UNE_F64, CallingConv::MSP430_BUILTIN);
123+
Info.setLibcallCallingConv(RTLIB::OGE_F64, CallingConv::MSP430_BUILTIN);
124+
Info.setLibcallCallingConv(RTLIB::OLT_F64, CallingConv::MSP430_BUILTIN);
125+
Info.setLibcallCallingConv(RTLIB::OLE_F64, CallingConv::MSP430_BUILTIN);
126+
Info.setLibcallCallingConv(RTLIB::OGT_F64, CallingConv::MSP430_BUILTIN);
127+
128+
// TODO: __mspabi_srall, __mspabi_srlll, __mspabi_sllll
129+
}
130+
14131
/// Set default libcall names. If a target wants to opt-out of a libcall it
15132
/// should be placed here.
16133
void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
@@ -291,4 +408,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
291408
for (auto &E : RTLibCallCommon)
292409
setLibcallName(E.Code, E.Name);
293410
}
411+
412+
if (TT.getArch() == Triple::ArchType::msp430)
413+
setMSP430Libcalls(*this, TT);
294414
}

llvm/lib/Target/MSP430/MSP430ISelLowering.cpp

Lines changed: 0 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -148,103 +148,6 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
148148
setOperationAction(ISD::VACOPY, MVT::Other, Expand);
149149
setOperationAction(ISD::JumpTable, MVT::i16, Custom);
150150

151-
// EABI Libcalls - EABI Section 6.2
152-
const struct {
153-
const RTLIB::Libcall Op;
154-
const char *const Name;
155-
} LibraryCalls[] = {
156-
// Floating point conversions - EABI Table 6
157-
{RTLIB::FPROUND_F64_F32, "__mspabi_cvtdf"},
158-
{RTLIB::FPEXT_F32_F64, "__mspabi_cvtfd"},
159-
// The following is NOT implemented in libgcc
160-
//{ RTLIB::FPTOSINT_F64_I16, "__mspabi_fixdi" },
161-
{RTLIB::FPTOSINT_F64_I32, "__mspabi_fixdli"},
162-
{RTLIB::FPTOSINT_F64_I64, "__mspabi_fixdlli"},
163-
// The following is NOT implemented in libgcc
164-
//{ RTLIB::FPTOUINT_F64_I16, "__mspabi_fixdu" },
165-
{RTLIB::FPTOUINT_F64_I32, "__mspabi_fixdul"},
166-
{RTLIB::FPTOUINT_F64_I64, "__mspabi_fixdull"},
167-
// The following is NOT implemented in libgcc
168-
//{ RTLIB::FPTOSINT_F32_I16, "__mspabi_fixfi" },
169-
{RTLIB::FPTOSINT_F32_I32, "__mspabi_fixfli"},
170-
{RTLIB::FPTOSINT_F32_I64, "__mspabi_fixflli"},
171-
// The following is NOT implemented in libgcc
172-
//{ RTLIB::FPTOUINT_F32_I16, "__mspabi_fixfu" },
173-
{RTLIB::FPTOUINT_F32_I32, "__mspabi_fixful"},
174-
{RTLIB::FPTOUINT_F32_I64, "__mspabi_fixfull"},
175-
// TODO The following IS implemented in libgcc
176-
//{ RTLIB::SINTTOFP_I16_F64, "__mspabi_fltid" },
177-
{RTLIB::SINTTOFP_I32_F64, "__mspabi_fltlid"},
178-
// TODO The following IS implemented in libgcc but is not in the EABI
179-
{RTLIB::SINTTOFP_I64_F64, "__mspabi_fltllid"},
180-
// TODO The following IS implemented in libgcc
181-
//{ RTLIB::UINTTOFP_I16_F64, "__mspabi_fltud" },
182-
{RTLIB::UINTTOFP_I32_F64, "__mspabi_fltuld"},
183-
// The following IS implemented in libgcc but is not in the EABI
184-
{RTLIB::UINTTOFP_I64_F64, "__mspabi_fltulld"},
185-
// TODO The following IS implemented in libgcc
186-
//{ RTLIB::SINTTOFP_I16_F32, "__mspabi_fltif" },
187-
{RTLIB::SINTTOFP_I32_F32, "__mspabi_fltlif"},
188-
// TODO The following IS implemented in libgcc but is not in the EABI
189-
{RTLIB::SINTTOFP_I64_F32, "__mspabi_fltllif"},
190-
// TODO The following IS implemented in libgcc
191-
//{ RTLIB::UINTTOFP_I16_F32, "__mspabi_fltuf" },
192-
{RTLIB::UINTTOFP_I32_F32, "__mspabi_fltulf"},
193-
// The following IS implemented in libgcc but is not in the EABI
194-
{RTLIB::UINTTOFP_I64_F32, "__mspabi_fltullf"},
195-
196-
// Floating point comparisons - EABI Table 7
197-
{RTLIB::OEQ_F64, "__mspabi_cmpd"},
198-
{RTLIB::UNE_F64, "__mspabi_cmpd"},
199-
{RTLIB::OGE_F64, "__mspabi_cmpd"},
200-
{RTLIB::OLT_F64, "__mspabi_cmpd"},
201-
{RTLIB::OLE_F64, "__mspabi_cmpd"},
202-
{RTLIB::OGT_F64, "__mspabi_cmpd"},
203-
{RTLIB::OEQ_F32, "__mspabi_cmpf"},
204-
{RTLIB::UNE_F32, "__mspabi_cmpf"},
205-
{RTLIB::OGE_F32, "__mspabi_cmpf"},
206-
{RTLIB::OLT_F32, "__mspabi_cmpf"},
207-
{RTLIB::OLE_F32, "__mspabi_cmpf"},
208-
{RTLIB::OGT_F32, "__mspabi_cmpf"},
209-
210-
// Floating point arithmetic - EABI Table 8
211-
{RTLIB::ADD_F64, "__mspabi_addd"},
212-
{RTLIB::ADD_F32, "__mspabi_addf"},
213-
{RTLIB::DIV_F64, "__mspabi_divd"},
214-
{RTLIB::DIV_F32, "__mspabi_divf"},
215-
{RTLIB::MUL_F64, "__mspabi_mpyd"},
216-
{RTLIB::MUL_F32, "__mspabi_mpyf"},
217-
{RTLIB::SUB_F64, "__mspabi_subd"},
218-
{RTLIB::SUB_F32, "__mspabi_subf"},
219-
// The following are NOT implemented in libgcc
220-
// { RTLIB::NEG_F64, "__mspabi_negd" },
221-
// { RTLIB::NEG_F32, "__mspabi_negf" },
222-
223-
// Universal Integer Operations - EABI Table 9
224-
{RTLIB::SDIV_I16, "__mspabi_divi"},
225-
{RTLIB::SDIV_I32, "__mspabi_divli"},
226-
{RTLIB::SDIV_I64, "__mspabi_divlli"},
227-
{RTLIB::UDIV_I16, "__mspabi_divu"},
228-
{RTLIB::UDIV_I32, "__mspabi_divul"},
229-
{RTLIB::UDIV_I64, "__mspabi_divull"},
230-
{RTLIB::SREM_I16, "__mspabi_remi"},
231-
{RTLIB::SREM_I32, "__mspabi_remli"},
232-
{RTLIB::SREM_I64, "__mspabi_remlli"},
233-
{RTLIB::UREM_I16, "__mspabi_remu"},
234-
{RTLIB::UREM_I32, "__mspabi_remul"},
235-
{RTLIB::UREM_I64, "__mspabi_remull"},
236-
237-
// Bitwise Operations - EABI Table 10
238-
// TODO: __mspabi_[srli/srai/slli] ARE implemented in libgcc
239-
{RTLIB::SRL_I32, "__mspabi_srll"},
240-
{RTLIB::SRA_I32, "__mspabi_sral"},
241-
{RTLIB::SHL_I32, "__mspabi_slll"},
242-
// __mspabi_[srlll/srall/sllll/rlli/rlll] are NOT implemented in libgcc
243-
};
244-
245-
for (const auto &LC : LibraryCalls)
246-
setLibcallName(LC.Op, LC.Name);
247-
248151
if (STI.hasHWMult16()) {
249152
const struct {
250153
const RTLIB::Libcall Op;
@@ -308,23 +211,6 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM,
308211
setLibcallCallingConv(RTLIB::MUL_I64, CallingConv::MSP430_BUILTIN);
309212
}
310213

311-
// Several of the runtime library functions use a special calling conv
312-
setLibcallCallingConv(RTLIB::UDIV_I64, CallingConv::MSP430_BUILTIN);
313-
setLibcallCallingConv(RTLIB::UREM_I64, CallingConv::MSP430_BUILTIN);
314-
setLibcallCallingConv(RTLIB::SDIV_I64, CallingConv::MSP430_BUILTIN);
315-
setLibcallCallingConv(RTLIB::SREM_I64, CallingConv::MSP430_BUILTIN);
316-
setLibcallCallingConv(RTLIB::ADD_F64, CallingConv::MSP430_BUILTIN);
317-
setLibcallCallingConv(RTLIB::SUB_F64, CallingConv::MSP430_BUILTIN);
318-
setLibcallCallingConv(RTLIB::MUL_F64, CallingConv::MSP430_BUILTIN);
319-
setLibcallCallingConv(RTLIB::DIV_F64, CallingConv::MSP430_BUILTIN);
320-
setLibcallCallingConv(RTLIB::OEQ_F64, CallingConv::MSP430_BUILTIN);
321-
setLibcallCallingConv(RTLIB::UNE_F64, CallingConv::MSP430_BUILTIN);
322-
setLibcallCallingConv(RTLIB::OGE_F64, CallingConv::MSP430_BUILTIN);
323-
setLibcallCallingConv(RTLIB::OLT_F64, CallingConv::MSP430_BUILTIN);
324-
setLibcallCallingConv(RTLIB::OLE_F64, CallingConv::MSP430_BUILTIN);
325-
setLibcallCallingConv(RTLIB::OGT_F64, CallingConv::MSP430_BUILTIN);
326-
// TODO: __mspabi_srall, __mspabi_srlll, __mspabi_sllll
327-
328214
setMinFunctionAlignment(Align(2));
329215
setPrefFunctionAlignment(Align(2));
330216
setMaxAtomicSizeInBitsSupported(0);

0 commit comments

Comments
 (0)