@@ -81,6 +81,123 @@ static void setARMLibcallNames(RuntimeLibcallsInfo &Info, const Triple &TT) {
81
81
}
82
82
}
83
83
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
+
84
201
// / Set default libcall names. If a target wants to opt-out of a libcall it
85
202
// / should be placed here.
86
203
void RuntimeLibcallsInfo::initLibcalls (const Triple &TT) {
@@ -448,4 +565,7 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT) {
448
565
else
449
566
setLibcallName (RTLIB::SQRT_F32, " __hexagon_sqrtf" );
450
567
}
568
+
569
+ if (TT.getArch () == Triple::ArchType::msp430)
570
+ setMSP430Libcalls (*this , TT);
451
571
}
0 commit comments