Skip to content

Commit ac7fa40

Browse files
authored
MSP430: Partially move runtime libcall config out of TargetLowering (#142709)
RuntimeLibcalls needs to be correct outside of codegen contexts.
1 parent 3ef7d03 commit ac7fa40

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
@@ -81,6 +81,123 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT) {
8181
}
8282
}
8383

84+
static void setMSP430Libcalls(RuntimeLibcallsInfo &Info, const Triple &TT) {
85+
// EABI Libcalls - EABI Section 6.2
86+
const struct {
87+
const RTLIB::Libcall Op;
88+
const char *const Name;
89+
} LibraryCalls[] = {
90+
// Floating point conversions - EABI Table 6
91+
{RTLIB::FPROUND_F64_F32, "__mspabi_cvtdf"},
92+
{RTLIB::FPEXT_F32_F64, "__mspabi_cvtfd"},
93+
// The following is NOT implemented in libgcc
94+
//{ RTLIB::FPTOSINT_F64_I16, "__mspabi_fixdi" },
95+
{RTLIB::FPTOSINT_F64_I32, "__mspabi_fixdli"},
96+
{RTLIB::FPTOSINT_F64_I64, "__mspabi_fixdlli"},
97+
// The following is NOT implemented in libgcc
98+
//{ RTLIB::FPTOUINT_F64_I16, "__mspabi_fixdu" },
99+
{RTLIB::FPTOUINT_F64_I32, "__mspabi_fixdul"},
100+
{RTLIB::FPTOUINT_F64_I64, "__mspabi_fixdull"},
101+
// The following is NOT implemented in libgcc
102+
//{ RTLIB::FPTOSINT_F32_I16, "__mspabi_fixfi" },
103+
{RTLIB::FPTOSINT_F32_I32, "__mspabi_fixfli"},
104+
{RTLIB::FPTOSINT_F32_I64, "__mspabi_fixflli"},
105+
// The following is NOT implemented in libgcc
106+
//{ RTLIB::FPTOUINT_F32_I16, "__mspabi_fixfu" },
107+
{RTLIB::FPTOUINT_F32_I32, "__mspabi_fixful"},
108+
{RTLIB::FPTOUINT_F32_I64, "__mspabi_fixfull"},
109+
// TODO The following IS implemented in libgcc
110+
//{ RTLIB::SINTTOFP_I16_F64, "__mspabi_fltid" },
111+
{RTLIB::SINTTOFP_I32_F64, "__mspabi_fltlid"},
112+
// TODO The following IS implemented in libgcc but is not in the EABI
113+
{RTLIB::SINTTOFP_I64_F64, "__mspabi_fltllid"},
114+
// TODO The following IS implemented in libgcc
115+
//{ RTLIB::UINTTOFP_I16_F64, "__mspabi_fltud" },
116+
{RTLIB::UINTTOFP_I32_F64, "__mspabi_fltuld"},
117+
// The following IS implemented in libgcc but is not in the EABI
118+
{RTLIB::UINTTOFP_I64_F64, "__mspabi_fltulld"},
119+
// TODO The following IS implemented in libgcc
120+
//{ RTLIB::SINTTOFP_I16_F32, "__mspabi_fltif" },
121+
{RTLIB::SINTTOFP_I32_F32, "__mspabi_fltlif"},
122+
// TODO The following IS implemented in libgcc but is not in the EABI
123+
{RTLIB::SINTTOFP_I64_F32, "__mspabi_fltllif"},
124+
// TODO The following IS implemented in libgcc
125+
//{ RTLIB::UINTTOFP_I16_F32, "__mspabi_fltuf" },
126+
{RTLIB::UINTTOFP_I32_F32, "__mspabi_fltulf"},
127+
// The following IS implemented in libgcc but is not in the EABI
128+
{RTLIB::UINTTOFP_I64_F32, "__mspabi_fltullf"},
129+
130+
// Floating point comparisons - EABI Table 7
131+
{RTLIB::OEQ_F64, "__mspabi_cmpd"},
132+
{RTLIB::UNE_F64, "__mspabi_cmpd"},
133+
{RTLIB::OGE_F64, "__mspabi_cmpd"},
134+
{RTLIB::OLT_F64, "__mspabi_cmpd"},
135+
{RTLIB::OLE_F64, "__mspabi_cmpd"},
136+
{RTLIB::OGT_F64, "__mspabi_cmpd"},
137+
{RTLIB::OEQ_F32, "__mspabi_cmpf"},
138+
{RTLIB::UNE_F32, "__mspabi_cmpf"},
139+
{RTLIB::OGE_F32, "__mspabi_cmpf"},
140+
{RTLIB::OLT_F32, "__mspabi_cmpf"},
141+
{RTLIB::OLE_F32, "__mspabi_cmpf"},
142+
{RTLIB::OGT_F32, "__mspabi_cmpf"},
143+
144+
// Floating point arithmetic - EABI Table 8
145+
{RTLIB::ADD_F64, "__mspabi_addd"},
146+
{RTLIB::ADD_F32, "__mspabi_addf"},
147+
{RTLIB::DIV_F64, "__mspabi_divd"},
148+
{RTLIB::DIV_F32, "__mspabi_divf"},
149+
{RTLIB::MUL_F64, "__mspabi_mpyd"},
150+
{RTLIB::MUL_F32, "__mspabi_mpyf"},
151+
{RTLIB::SUB_F64, "__mspabi_subd"},
152+
{RTLIB::SUB_F32, "__mspabi_subf"},
153+
// The following are NOT implemented in libgcc
154+
// { RTLIB::NEG_F64, "__mspabi_negd" },
155+
// { RTLIB::NEG_F32, "__mspabi_negf" },
156+
157+
// Universal Integer Operations - EABI Table 9
158+
{RTLIB::SDIV_I16, "__mspabi_divi"},
159+
{RTLIB::SDIV_I32, "__mspabi_divli"},
160+
{RTLIB::SDIV_I64, "__mspabi_divlli"},
161+
{RTLIB::UDIV_I16, "__mspabi_divu"},
162+
{RTLIB::UDIV_I32, "__mspabi_divul"},
163+
{RTLIB::UDIV_I64, "__mspabi_divull"},
164+
{RTLIB::SREM_I16, "__mspabi_remi"},
165+
{RTLIB::SREM_I32, "__mspabi_remli"},
166+
{RTLIB::SREM_I64, "__mspabi_remlli"},
167+
{RTLIB::UREM_I16, "__mspabi_remu"},
168+
{RTLIB::UREM_I32, "__mspabi_remul"},
169+
{RTLIB::UREM_I64, "__mspabi_remull"},
170+
171+
// Bitwise Operations - EABI Table 10
172+
// TODO: __mspabi_[srli/srai/slli] ARE implemented in libgcc
173+
{RTLIB::SRL_I32, "__mspabi_srll"},
174+
{RTLIB::SRA_I32, "__mspabi_sral"},
175+
{RTLIB::SHL_I32, "__mspabi_slll"},
176+
// __mspabi_[srlll/srall/sllll/rlli/rlll] are NOT implemented in libgcc
177+
};
178+
179+
for (const auto &LC : LibraryCalls)
180+
Info.setLibcallName(LC.Op, LC.Name);
181+
182+
// Several of the runtime library functions use a special calling conv
183+
Info.setLibcallCallingConv(RTLIB::UDIV_I64, CallingConv::MSP430_BUILTIN);
184+
Info.setLibcallCallingConv(RTLIB::UREM_I64, CallingConv::MSP430_BUILTIN);
185+
Info.setLibcallCallingConv(RTLIB::SDIV_I64, CallingConv::MSP430_BUILTIN);
186+
Info.setLibcallCallingConv(RTLIB::SREM_I64, CallingConv::MSP430_BUILTIN);
187+
Info.setLibcallCallingConv(RTLIB::ADD_F64, CallingConv::MSP430_BUILTIN);
188+
Info.setLibcallCallingConv(RTLIB::SUB_F64, CallingConv::MSP430_BUILTIN);
189+
Info.setLibcallCallingConv(RTLIB::MUL_F64, CallingConv::MSP430_BUILTIN);
190+
Info.setLibcallCallingConv(RTLIB::DIV_F64, CallingConv::MSP430_BUILTIN);
191+
Info.setLibcallCallingConv(RTLIB::OEQ_F64, CallingConv::MSP430_BUILTIN);
192+
Info.setLibcallCallingConv(RTLIB::UNE_F64, CallingConv::MSP430_BUILTIN);
193+
Info.setLibcallCallingConv(RTLIB::OGE_F64, CallingConv::MSP430_BUILTIN);
194+
Info.setLibcallCallingConv(RTLIB::OLT_F64, CallingConv::MSP430_BUILTIN);
195+
Info.setLibcallCallingConv(RTLIB::OLE_F64, CallingConv::MSP430_BUILTIN);
196+
Info.setLibcallCallingConv(RTLIB::OGT_F64, CallingConv::MSP430_BUILTIN);
197+
198+
// TODO: __mspabi_srall, __mspabi_srlll, __mspabi_sllll
199+
}
200+
84201
/// Set default libcall names. If a target wants to opt-out of a libcall it
85202
/// should be placed here.
86203
void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
@@ -448,4 +565,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
448565
else
449566
setLibcallName(RTLIB::SQRT_F32, "__hexagon_sqrtf");
450567
}
568+
569+
if (TT.getArch() == Triple::ArchType::msp430)
570+
setMSP430Libcalls(*this, TT);
451571
}

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)