@@ -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.
86203void 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}
0 commit comments