1 // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief This file contains signature information for runtime libcalls.
13 /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
14 /// target needs type information for all functions. This file contains a big
15 /// table providing type signatures for all runtime library functions that LLVM
18 /// This is currently a fairly heavy-handed solution.
20 //===----------------------------------------------------------------------===//
22 #include "WebAssemblyRuntimeLibcallSignatures.h"
23 #include "WebAssemblySubtarget.h"
24 #include "llvm/CodeGen/RuntimeLibcalls.h"
30 enum RuntimeLibcallSignature {
67 i64_i64_func_i64_i64_i64_i64,
68 i64_i64_i64_i64_func_i64_i64_i64_i64,
69 i64_i64_func_i64_i64_i32,
70 iPTR_func_iPTR_i32_iPTR,
71 iPTR_func_iPTR_iPTR_iPTR,
74 func_i64_i64_iPTR_iPTR,
80 func_iPTR_i64_i64_i64_i64,
81 func_iPTR_i64_i64_i64_i64_i64_i64,
83 i32_func_i64_i64_i64_i64,
87 } // end anonymous namespace
89 static const RuntimeLibcallSignature
90 RuntimeLibcallSignatures[RTLIB::UNKNOWN_LIBCALL] = {
92 /* SHL_I16 */ i16_func_i16_i16,
93 /* SHL_I32 */ i32_func_i32_i32,
94 /* SHL_I64 */ i64_func_i64_i64,
95 /* SHL_I128 */ i64_i64_func_i64_i64_i32,
96 /* SRL_I16 */ i16_func_i16_i16,
97 /* SRL_I32 */ i32_func_i32_i32,
98 /* SRL_I64 */ i64_func_i64_i64,
99 /* SRL_I128 */ i64_i64_func_i64_i64_i32,
100 /* SRA_I16 */ i16_func_i16_i16,
101 /* SRA_I32 */ i32_func_i32_i32,
102 /* SRA_I64 */ i64_func_i64_i64,
103 /* SRA_I128 */ i64_i64_func_i64_i64_i32,
104 /* MUL_I8 */ i8_func_i8_i8,
105 /* MUL_I16 */ i16_func_i16_i16,
106 /* MUL_I32 */ i32_func_i32_i32,
107 /* MUL_I64 */ i64_func_i64_i64,
108 /* MUL_I128 */ i64_i64_func_i64_i64_i64_i64,
109 /* MULO_I32 */ i32_func_i32_i32,
110 /* MULO_I64 */ i64_func_i64_i64,
111 /* MULO_I128 */ i64_i64_func_i64_i64_i64_i64,
112 /* SDIV_I8 */ i8_func_i8_i8,
113 /* SDIV_I16 */ i16_func_i16_i16,
114 /* SDIV_I32 */ i32_func_i32_i32,
115 /* SDIV_I64 */ i64_func_i64_i64,
116 /* SDIV_I128 */ i64_i64_func_i64_i64_i64_i64,
117 /* UDIV_I8 */ i8_func_i8_i8,
118 /* UDIV_I16 */ i16_func_i16_i16,
119 /* UDIV_I32 */ i32_func_i32_i32,
120 /* UDIV_I64 */ i64_func_i64_i64,
121 /* UDIV_I128 */ i64_i64_func_i64_i64_i64_i64,
122 /* SREM_I8 */ i8_func_i8_i8,
123 /* SREM_I16 */ i16_func_i16_i16,
124 /* SREM_I32 */ i32_func_i32_i32,
125 /* SREM_I64 */ i64_func_i64_i64,
126 /* SREM_I128 */ i64_i64_func_i64_i64_i64_i64,
127 /* UREM_I8 */ i8_func_i8_i8,
128 /* UREM_I16 */ i16_func_i16_i16,
129 /* UREM_I32 */ i32_func_i32_i32,
130 /* UREM_I64 */ i64_func_i64_i64,
131 /* UREM_I128 */ i64_i64_func_i64_i64_i64_i64,
132 /* SDIVREM_I8 */ i8_func_i8_i8,
133 /* SDIVREM_I16 */ i16_i16_func_i16_i16,
134 /* SDIVREM_I32 */ i32_i32_func_i32_i32,
135 /* SDIVREM_I64 */ i64_func_i64_i64,
136 /* SDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64,
137 /* UDIVREM_I8 */ i8_func_i8_i8,
138 /* UDIVREM_I16 */ i16_i16_func_i16_i16,
139 /* UDIVREM_I32 */ i32_i32_func_i32_i32,
140 /* UDIVREM_I64 */ i64_i64_func_i64_i64,
141 /* UDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64,
142 /* NEG_I32 */ i32_func_i32,
143 /* NEG_I64 */ i64_func_i64,
146 /* ADD_F32 */ f32_func_f32_f32,
147 /* ADD_F64 */ f64_func_f64_f64,
148 /* ADD_F80 */ unsupported,
149 /* ADD_F128 */ func_iPTR_i64_i64_i64_i64,
150 /* ADD_PPCF128 */ unsupported,
151 /* SUB_F32 */ f32_func_f32_f32,
152 /* SUB_F64 */ f64_func_f64_f64,
153 /* SUB_F80 */ unsupported,
154 /* SUB_F128 */ func_iPTR_i64_i64_i64_i64,
155 /* SUB_PPCF128 */ unsupported,
156 /* MUL_F32 */ f32_func_f32_f32,
157 /* MUL_F64 */ f64_func_f64_f64,
158 /* MUL_F80 */ unsupported,
159 /* MUL_F128 */ func_iPTR_i64_i64_i64_i64,
160 /* MUL_PPCF128 */ unsupported,
161 /* DIV_F32 */ f32_func_f32_f32,
162 /* DIV_F64 */ f64_func_f64_f64,
163 /* DIV_F80 */ unsupported,
164 /* DIV_F128 */ func_iPTR_i64_i64_i64_i64,
165 /* DIV_PPCF128 */ unsupported,
166 /* REM_F32 */ f32_func_f32_f32,
167 /* REM_F64 */ f64_func_f64_f64,
168 /* REM_F80 */ unsupported,
169 /* REM_F128 */ func_iPTR_i64_i64_i64_i64,
170 /* REM_PPCF128 */ unsupported,
171 /* FMA_F32 */ f32_func_f32_f32_f32,
172 /* FMA_F64 */ f64_func_f64_f64_f64,
173 /* FMA_F80 */ unsupported,
174 /* FMA_F128 */ func_iPTR_i64_i64_i64_i64_i64_i64,
175 /* FMA_PPCF128 */ unsupported,
176 /* POWI_F32 */ f32_func_f32_i32,
177 /* POWI_F64 */ f64_func_f64_i32,
178 /* POWI_F80 */ unsupported,
179 /* POWI_F128 */ func_iPTR_i64_i64_i64_i64,
180 /* POWI_PPCF128 */ unsupported,
181 /* SQRT_F32 */ f32_func_f32,
182 /* SQRT_F64 */ f64_func_f64,
183 /* SQRT_F80 */ unsupported,
184 /* SQRT_F128 */ func_iPTR_i64_i64,
185 /* SQRT_PPCF128 */ unsupported,
186 /* LOG_F32 */ f32_func_f32,
187 /* LOG_F64 */ f64_func_f64,
188 /* LOG_F80 */ unsupported,
189 /* LOG_F128 */ func_iPTR_i64_i64,
190 /* LOG_PPCF128 */ unsupported,
191 /* LOG2_F32 */ f32_func_f32,
192 /* LOG2_F64 */ f64_func_f64,
193 /* LOG2_F80 */ unsupported,
194 /* LOG2_F128 */ func_iPTR_i64_i64,
195 /* LOG2_PPCF128 */ unsupported,
196 /* LOG10_F32 */ f32_func_f32,
197 /* LOG10_F64 */ f64_func_f64,
198 /* LOG10_F80 */ unsupported,
199 /* LOG10_F128 */ func_iPTR_i64_i64,
200 /* LOG10_PPCF128 */ unsupported,
201 /* EXP_F32 */ f32_func_f32,
202 /* EXP_F64 */ f64_func_f64,
203 /* EXP_F80 */ unsupported,
204 /* EXP_F128 */ func_iPTR_i64_i64,
205 /* EXP_PPCF128 */ unsupported,
206 /* EXP2_F32 */ f32_func_f32,
207 /* EXP2_F64 */ f64_func_f64,
208 /* EXP2_F80 */ unsupported,
209 /* EXP2_F128 */ func_iPTR_i64_i64,
210 /* EXP2_PPCF128 */ unsupported,
211 /* SIN_F32 */ f32_func_f32,
212 /* SIN_F64 */ f64_func_f64,
213 /* SIN_F80 */ unsupported,
214 /* SIN_F128 */ func_iPTR_i64_i64,
215 /* SIN_PPCF128 */ unsupported,
216 /* COS_F32 */ f32_func_f32,
217 /* COS_F64 */ f64_func_f64,
218 /* COS_F80 */ unsupported,
219 /* COS_F128 */ func_iPTR_i64_i64,
220 /* COS_PPCF128 */ unsupported,
221 /* SINCOS_F32 */ func_f32_iPTR_iPTR,
222 /* SINCOS_F64 */ func_f64_iPTR_iPTR,
223 /* SINCOS_F80 */ unsupported,
224 /* SINCOS_F128 */ func_i64_i64_iPTR_iPTR,
225 /* SINCOS_PPCF128 */ unsupported,
226 /* SINCOS_STRET_F32 */ unsupported,
227 /* SINCOS_STRET_F64 */ unsupported,
228 /* POW_F32 */ f32_func_f32_f32,
229 /* POW_F64 */ f64_func_f64_f64,
230 /* POW_F80 */ unsupported,
231 /* POW_F128 */ func_iPTR_i64_i64_i64_i64,
232 /* POW_PPCF128 */ unsupported,
233 /* CEIL_F32 */ f32_func_f32,
234 /* CEIL_F64 */ f64_func_f64,
235 /* CEIL_F80 */ unsupported,
236 /* CEIL_F128 */ func_iPTR_i64_i64,
237 /* CEIL_PPCF128 */ unsupported,
238 /* TRUNC_F32 */ f32_func_f32,
239 /* TRUNC_F64 */ f64_func_f64,
240 /* TRUNC_F80 */ unsupported,
241 /* TRUNC_F128 */ func_iPTR_i64_i64,
242 /* TRUNC_PPCF128 */ unsupported,
243 /* RINT_F32 */ f32_func_f32,
244 /* RINT_F64 */ f64_func_f64,
245 /* RINT_F80 */ unsupported,
246 /* RINT_F128 */ func_iPTR_i64_i64,
247 /* RINT_PPCF128 */ unsupported,
248 /* NEARBYINT_F32 */ f32_func_f32,
249 /* NEARBYINT_F64 */ f64_func_f64,
250 /* NEARBYINT_F80 */ unsupported,
251 /* NEARBYINT_F128 */ func_iPTR_i64_i64,
252 /* NEARBYINT_PPCF128 */ unsupported,
253 /* ROUND_F32 */ f32_func_f32,
254 /* ROUND_F64 */ f64_func_f64,
255 /* ROUND_F80 */ unsupported,
256 /* ROUND_F128 */ func_iPTR_i64_i64,
257 /* ROUND_PPCF128 */ unsupported,
258 /* FLOOR_F32 */ f32_func_f32,
259 /* FLOOR_F64 */ f64_func_f64,
260 /* FLOOR_F80 */ unsupported,
261 /* FLOOR_F128 */ func_iPTR_i64_i64,
262 /* FLOOR_PPCF128 */ unsupported,
263 /* COPYSIGN_F32 */ f32_func_f32_f32,
264 /* COPYSIGN_F64 */ f64_func_f64_f64,
265 /* COPYSIGN_F80 */ unsupported,
266 /* COPYSIGN_F128 */ func_iPTR_i64_i64_i64_i64,
267 /* COPYSIGN_PPCF128 */ unsupported,
268 /* FMIN_F32 */ f32_func_f32_f32,
269 /* FMIN_F64 */ f64_func_f64_f64,
270 /* FMIN_F80 */ unsupported,
271 /* FMIN_F128 */ func_iPTR_i64_i64_i64_i64,
272 /* FMIN_PPCF128 */ unsupported,
273 /* FMAX_F32 */ f32_func_f32_f32,
274 /* FMAX_F64 */ f64_func_f64_f64,
275 /* FMAX_F80 */ unsupported,
276 /* FMAX_F128 */ func_iPTR_i64_i64_i64_i64,
277 /* FMAX_PPCF128 */ unsupported,
280 /* FPEXT_F32_PPCF128 */ unsupported,
281 /* FPEXT_F64_PPCF128 */ unsupported,
282 /* FPEXT_F64_F128 */ func_iPTR_f64,
283 /* FPEXT_F32_F128 */ func_iPTR_f32,
284 /* FPEXT_F32_F64 */ f64_func_f32,
285 /* FPEXT_F16_F32 */ f32_func_i16,
286 /* FPROUND_F32_F16 */ i16_func_f32,
287 /* FPROUND_F64_F16 */ unsupported,
288 /* FPROUND_F80_F16 */ unsupported,
289 /* FPROUND_F128_F16 */ unsupported,
290 /* FPROUND_PPCF128_F16 */ unsupported,
291 /* FPROUND_F64_F32 */ f32_func_f64,
292 /* FPROUND_F80_F32 */ unsupported,
293 /* FPROUND_F128_F32 */ f32_func_i64_i64,
294 /* FPROUND_PPCF128_F32 */ unsupported,
295 /* FPROUND_F80_F64 */ unsupported,
296 /* FPROUND_F128_F64 */ f64_func_i64_i64,
297 /* FPROUND_PPCF128_F64 */ unsupported,
298 /* FPTOSINT_F32_I32 */ i32_func_f32,
299 /* FPTOSINT_F32_I64 */ i64_func_f32,
300 /* FPTOSINT_F32_I128 */ i64_i64_func_f32,
301 /* FPTOSINT_F64_I32 */ i32_func_f64,
302 /* FPTOSINT_F64_I64 */ i64_func_f64,
303 /* FPTOSINT_F64_I128 */ i64_i64_func_f64,
304 /* FPTOSINT_F80_I32 */ unsupported,
305 /* FPTOSINT_F80_I64 */ unsupported,
306 /* FPTOSINT_F80_I128 */ unsupported,
307 /* FPTOSINT_F128_I32 */ i32_func_i64_i64,
308 /* FPTOSINT_F128_I64 */ i64_func_i64_i64,
309 /* FPTOSINT_F128_I128 */ i64_i64_func_i64_i64,
310 /* FPTOSINT_PPCF128_I32 */ unsupported,
311 /* FPTOSINT_PPCF128_I64 */ unsupported,
312 /* FPTOSINT_PPCF128_I128 */ unsupported,
313 /* FPTOUINT_F32_I32 */ i32_func_f32,
314 /* FPTOUINT_F32_I64 */ i64_func_f32,
315 /* FPTOUINT_F32_I128 */ i64_i64_func_f32,
316 /* FPTOUINT_F64_I32 */ i32_func_f64,
317 /* FPTOUINT_F64_I64 */ i64_func_f64,
318 /* FPTOUINT_F64_I128 */ i64_i64_func_f64,
319 /* FPTOUINT_F80_I32 */ unsupported,
320 /* FPTOUINT_F80_I64 */ unsupported,
321 /* FPTOUINT_F80_I128 */ unsupported,
322 /* FPTOUINT_F128_I32 */ i32_func_i64_i64,
323 /* FPTOUINT_F128_I64 */ i64_func_i64_i64,
324 /* FPTOUINT_F128_I128 */ i64_i64_func_i64_i64,
325 /* FPTOUINT_PPCF128_I32 */ unsupported,
326 /* FPTOUINT_PPCF128_I64 */ unsupported,
327 /* FPTOUINT_PPCF128_I128 */ unsupported,
328 /* SINTTOFP_I32_F32 */ f32_func_i32,
329 /* SINTTOFP_I32_F64 */ f64_func_i32,
330 /* SINTTOFP_I32_F80 */ unsupported,
331 /* SINTTOFP_I32_F128 */ func_iPTR_i32,
332 /* SINTTOFP_I32_PPCF128 */ unsupported,
333 /* SINTTOFP_I64_F32 */ f32_func_i64,
334 /* SINTTOFP_I64_F64 */ f64_func_i64,
335 /* SINTTOFP_I64_F80 */ unsupported,
336 /* SINTTOFP_I64_F128 */ func_iPTR_i64,
337 /* SINTTOFP_I64_PPCF128 */ unsupported,
338 /* SINTTOFP_I128_F32 */ f32_func_i64_i64,
339 /* SINTTOFP_I128_F64 */ f64_func_i64_i64,
340 /* SINTTOFP_I128_F80 */ unsupported,
341 /* SINTTOFP_I128_F128 */ func_iPTR_i64_i64,
342 /* SINTTOFP_I128_PPCF128 */ unsupported,
343 /* UINTTOFP_I32_F32 */ f32_func_i32,
344 /* UINTTOFP_I32_F64 */ f64_func_i64,
345 /* UINTTOFP_I32_F80 */ unsupported,
346 /* UINTTOFP_I32_F128 */ func_iPTR_i32,
347 /* UINTTOFP_I32_PPCF128 */ unsupported,
348 /* UINTTOFP_I64_F32 */ f32_func_i64,
349 /* UINTTOFP_I64_F64 */ f64_func_i64,
350 /* UINTTOFP_I64_F80 */ unsupported,
351 /* UINTTOFP_I64_F128 */ func_iPTR_i64,
352 /* UINTTOFP_I64_PPCF128 */ unsupported,
353 /* UINTTOFP_I128_F32 */ f32_func_i64_i64,
354 /* UINTTOFP_I128_F64 */ f64_func_i64_i64,
355 /* UINTTOFP_I128_F80 */ unsupported,
356 /* UINTTOFP_I128_F128 */ func_iPTR_i64_i64,
357 /* UINTTOFP_I128_PPCF128 */ unsupported,
360 /* OEQ_F32 */ i32_func_f32_f32,
361 /* OEQ_F64 */ i32_func_f64_f64,
362 /* OEQ_F128 */ i32_func_i64_i64_i64_i64,
363 /* OEQ_PPCF128 */ unsupported,
364 /* UNE_F32 */ i32_func_f32_f32,
365 /* UNE_F64 */ i32_func_f64_f64,
366 /* UNE_F128 */ i32_func_i64_i64_i64_i64,
367 /* UNE_PPCF128 */ unsupported,
368 /* OGE_F32 */ i32_func_f32_f32,
369 /* OGE_F64 */ i32_func_f64_f64,
370 /* OGE_F128 */ i32_func_i64_i64_i64_i64,
371 /* OGE_PPCF128 */ unsupported,
372 /* OLT_F32 */ i32_func_f32_f32,
373 /* OLT_F64 */ i32_func_f64_f64,
374 /* OLT_F128 */ i32_func_i64_i64_i64_i64,
375 /* OLT_PPCF128 */ unsupported,
376 /* OLE_F32 */ i32_func_f32_f32,
377 /* OLE_F64 */ i32_func_f64_f64,
378 /* OLE_F128 */ i32_func_i64_i64_i64_i64,
379 /* OLE_PPCF128 */ unsupported,
380 /* OGT_F32 */ i32_func_f32_f32,
381 /* OGT_F64 */ i32_func_f64_f64,
382 /* OGT_F128 */ i32_func_i64_i64_i64_i64,
383 /* OGT_PPCF128 */ unsupported,
384 /* UO_F32 */ i32_func_f32_f32,
385 /* UO_F64 */ i32_func_f64_f64,
386 /* UO_F128 */ i32_func_i64_i64_i64_i64,
387 /* UO_PPCF128 */ unsupported,
388 /* O_F32 */ i32_func_f32_f32,
389 /* O_F64 */ i32_func_f64_f64,
390 /* O_F128 */ i32_func_i64_i64_i64_i64,
391 /* O_PPCF128 */ unsupported,
394 /* MEMCPY */ iPTR_func_iPTR_iPTR_iPTR,
395 /* MEMMOVE */ iPTR_func_iPTR_iPTR_iPTR,
396 /* MEMSET */ iPTR_func_iPTR_i32_iPTR,
397 /* BZERO */ unsupported,
399 // ELEMENT-WISE ATOMIC MEMORY
400 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported,
401 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported,
402 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported,
403 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported,
404 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported,
405 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported,
406 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported,
407 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported,
408 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported,
409 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported,
411 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported,
412 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported,
413 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported,
414 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported,
415 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported,
417 // EXCEPTION HANDLING
418 /* UNWIND_RESUME */ unsupported,
420 // Note: there's two sets of atomics libcalls; see
421 // <http://llvm.org/docs/Atomics.html> for more info on the
422 // difference between them.
424 // Atomic '__sync_*' libcalls.
425 /* SYNC_VAL_COMPARE_AND_SWAP_1 */ unsupported,
426 /* SYNC_VAL_COMPARE_AND_SWAP_2 */ unsupported,
427 /* SYNC_VAL_COMPARE_AND_SWAP_4 */ unsupported,
428 /* SYNC_VAL_COMPARE_AND_SWAP_8 */ unsupported,
429 /* SYNC_VAL_COMPARE_AND_SWAP_16 */ unsupported,
430 /* SYNC_LOCK_TEST_AND_SET_1 */ unsupported,
431 /* SYNC_LOCK_TEST_AND_SET_2 */ unsupported,
432 /* SYNC_LOCK_TEST_AND_SET_4 */ unsupported,
433 /* SYNC_LOCK_TEST_AND_SET_8 */ unsupported,
434 /* SYNC_LOCK_TEST_AND_SET_16 */ unsupported,
435 /* SYNC_FETCH_AND_ADD_1 */ unsupported,
436 /* SYNC_FETCH_AND_ADD_2 */ unsupported,
437 /* SYNC_FETCH_AND_ADD_4 */ unsupported,
438 /* SYNC_FETCH_AND_ADD_8 */ unsupported,
439 /* SYNC_FETCH_AND_ADD_16 */ unsupported,
440 /* SYNC_FETCH_AND_SUB_1 */ unsupported,
441 /* SYNC_FETCH_AND_SUB_2 */ unsupported,
442 /* SYNC_FETCH_AND_SUB_4 */ unsupported,
443 /* SYNC_FETCH_AND_SUB_8 */ unsupported,
444 /* SYNC_FETCH_AND_SUB_16 */ unsupported,
445 /* SYNC_FETCH_AND_AND_1 */ unsupported,
446 /* SYNC_FETCH_AND_AND_2 */ unsupported,
447 /* SYNC_FETCH_AND_AND_4 */ unsupported,
448 /* SYNC_FETCH_AND_AND_8 */ unsupported,
449 /* SYNC_FETCH_AND_AND_16 */ unsupported,
450 /* SYNC_FETCH_AND_OR_1 */ unsupported,
451 /* SYNC_FETCH_AND_OR_2 */ unsupported,
452 /* SYNC_FETCH_AND_OR_4 */ unsupported,
453 /* SYNC_FETCH_AND_OR_8 */ unsupported,
454 /* SYNC_FETCH_AND_OR_16 */ unsupported,
455 /* SYNC_FETCH_AND_XOR_1 */ unsupported,
456 /* SYNC_FETCH_AND_XOR_2 */ unsupported,
457 /* SYNC_FETCH_AND_XOR_4 */ unsupported,
458 /* SYNC_FETCH_AND_XOR_8 */ unsupported,
459 /* SYNC_FETCH_AND_XOR_16 */ unsupported,
460 /* SYNC_FETCH_AND_NAND_1 */ unsupported,
461 /* SYNC_FETCH_AND_NAND_2 */ unsupported,
462 /* SYNC_FETCH_AND_NAND_4 */ unsupported,
463 /* SYNC_FETCH_AND_NAND_8 */ unsupported,
464 /* SYNC_FETCH_AND_NAND_16 */ unsupported,
465 /* SYNC_FETCH_AND_MAX_1 */ unsupported,
466 /* SYNC_FETCH_AND_MAX_2 */ unsupported,
467 /* SYNC_FETCH_AND_MAX_4 */ unsupported,
468 /* SYNC_FETCH_AND_MAX_8 */ unsupported,
469 /* SYNC_FETCH_AND_MAX_16 */ unsupported,
470 /* SYNC_FETCH_AND_UMAX_1 */ unsupported,
471 /* SYNC_FETCH_AND_UMAX_2 */ unsupported,
472 /* SYNC_FETCH_AND_UMAX_4 */ unsupported,
473 /* SYNC_FETCH_AND_UMAX_8 */ unsupported,
474 /* SYNC_FETCH_AND_UMAX_16 */ unsupported,
475 /* SYNC_FETCH_AND_MIN_1 */ unsupported,
476 /* SYNC_FETCH_AND_MIN_2 */ unsupported,
477 /* SYNC_FETCH_AND_MIN_4 */ unsupported,
478 /* SYNC_FETCH_AND_MIN_8 */ unsupported,
479 /* SYNC_FETCH_AND_MIN_16 */ unsupported,
480 /* SYNC_FETCH_AND_UMIN_1 */ unsupported,
481 /* SYNC_FETCH_AND_UMIN_2 */ unsupported,
482 /* SYNC_FETCH_AND_UMIN_4 */ unsupported,
483 /* SYNC_FETCH_AND_UMIN_8 */ unsupported,
484 /* SYNC_FETCH_AND_UMIN_16 */ unsupported,
486 // Atomic '__atomic_*' libcalls.
487 /* ATOMIC_LOAD */ unsupported,
488 /* ATOMIC_LOAD_1 */ unsupported,
489 /* ATOMIC_LOAD_2 */ unsupported,
490 /* ATOMIC_LOAD_4 */ unsupported,
491 /* ATOMIC_LOAD_8 */ unsupported,
492 /* ATOMIC_LOAD_16 */ unsupported,
494 /* ATOMIC_STORE */ unsupported,
495 /* ATOMIC_STORE_1 */ unsupported,
496 /* ATOMIC_STORE_2 */ unsupported,
497 /* ATOMIC_STORE_4 */ unsupported,
498 /* ATOMIC_STORE_8 */ unsupported,
499 /* ATOMIC_STORE_16 */ unsupported,
501 /* ATOMIC_EXCHANGE */ unsupported,
502 /* ATOMIC_EXCHANGE_1 */ unsupported,
503 /* ATOMIC_EXCHANGE_2 */ unsupported,
504 /* ATOMIC_EXCHANGE_4 */ unsupported,
505 /* ATOMIC_EXCHANGE_8 */ unsupported,
506 /* ATOMIC_EXCHANGE_16 */ unsupported,
508 /* ATOMIC_COMPARE_EXCHANGE */ unsupported,
509 /* ATOMIC_COMPARE_EXCHANGE_1 */ unsupported,
510 /* ATOMIC_COMPARE_EXCHANGE_2 */ unsupported,
511 /* ATOMIC_COMPARE_EXCHANGE_4 */ unsupported,
512 /* ATOMIC_COMPARE_EXCHANGE_8 */ unsupported,
513 /* ATOMIC_COMPARE_EXCHANGE_16 */ unsupported,
515 /* ATOMIC_FETCH_ADD_1 */ unsupported,
516 /* ATOMIC_FETCH_ADD_2 */ unsupported,
517 /* ATOMIC_FETCH_ADD_4 */ unsupported,
518 /* ATOMIC_FETCH_ADD_8 */ unsupported,
519 /* ATOMIC_FETCH_ADD_16 */ unsupported,
521 /* ATOMIC_FETCH_SUB_1 */ unsupported,
522 /* ATOMIC_FETCH_SUB_2 */ unsupported,
523 /* ATOMIC_FETCH_SUB_4 */ unsupported,
524 /* ATOMIC_FETCH_SUB_8 */ unsupported,
525 /* ATOMIC_FETCH_SUB_16 */ unsupported,
527 /* ATOMIC_FETCH_AND_1 */ unsupported,
528 /* ATOMIC_FETCH_AND_2 */ unsupported,
529 /* ATOMIC_FETCH_AND_4 */ unsupported,
530 /* ATOMIC_FETCH_AND_8 */ unsupported,
531 /* ATOMIC_FETCH_AND_16 */ unsupported,
533 /* ATOMIC_FETCH_OR_1 */ unsupported,
534 /* ATOMIC_FETCH_OR_2 */ unsupported,
535 /* ATOMIC_FETCH_OR_4 */ unsupported,
536 /* ATOMIC_FETCH_OR_8 */ unsupported,
537 /* ATOMIC_FETCH_OR_16 */ unsupported,
539 /* ATOMIC_FETCH_XOR_1 */ unsupported,
540 /* ATOMIC_FETCH_XOR_2 */ unsupported,
541 /* ATOMIC_FETCH_XOR_4 */ unsupported,
542 /* ATOMIC_FETCH_XOR_8 */ unsupported,
543 /* ATOMIC_FETCH_XOR_16 */ unsupported,
545 /* ATOMIC_FETCH_NAND_1 */ unsupported,
546 /* ATOMIC_FETCH_NAND_2 */ unsupported,
547 /* ATOMIC_FETCH_NAND_4 */ unsupported,
548 /* ATOMIC_FETCH_NAND_8 */ unsupported,
549 /* ATOMIC_FETCH_NAND_16 */ unsupported,
551 // Stack Protector Fail.
552 /* STACKPROTECTOR_CHECK_FAIL */ func,
555 /* DEOPTIMIZE */ unsupported,
560 RuntimeLibcallNames[RTLIB::UNKNOWN_LIBCALL] = {
561 /* SHL_I16 */ "__ashlhi3",
562 /* SHL_I32 */ "__ashlsi3",
563 /* SHL_I64 */ "__ashldi3",
564 /* SHL_I128 */ "__ashlti3",
565 /* SRL_I16 */ "__lshrhi3",
566 /* SRL_I32 */ "__lshrsi3",
567 /* SRL_I64 */ "__lshrdi3",
568 /* SRL_I128 */ "__lshrti3",
569 /* SRA_I16 */ "__ashrhi3",
570 /* SRA_I32 */ "__ashrsi3",
571 /* SRA_I64 */ "__ashrdi3",
572 /* SRA_I128 */ "__ashrti3",
573 /* MUL_I8 */ "__mulqi3",
574 /* MUL_I16 */ "__mulhi3",
575 /* MUL_I32 */ "__mulsi3",
576 /* MUL_I64 */ "__muldi3",
577 /* MUL_I128 */ "__multi3",
578 /* MULO_I32 */ "__mulosi4",
579 /* MULO_I64 */ "__mulodi4",
580 /* MULO_I128 */ "__muloti4",
581 /* SDIV_I8 */ "__divqi3",
582 /* SDIV_I16 */ "__divhi3",
583 /* SDIV_I32 */ "__divsi3",
584 /* SDIV_I64 */ "__divdi3",
585 /* SDIV_I128 */ "__divti3",
586 /* UDIV_I8 */ "__udivqi3",
587 /* UDIV_I16 */ "__udivhi3",
588 /* UDIV_I32 */ "__udivsi3",
589 /* UDIV_I64 */ "__udivdi3",
590 /* UDIV_I128 */ "__udivti3",
591 /* SREM_I8 */ "__modqi3",
592 /* SREM_I16 */ "__modhi3",
593 /* SREM_I32 */ "__modsi3",
594 /* SREM_I64 */ "__moddi3",
595 /* SREM_I128 */ "__modti3",
596 /* UREM_I8 */ "__umodqi3",
597 /* UREM_I16 */ "__umodhi3",
598 /* UREM_I32 */ "__umodsi3",
599 /* UREM_I64 */ "__umoddi3",
600 /* UREM_I128 */ "__umodti3",
601 /* SDIVREM_I8 */ nullptr,
602 /* SDIVREM_I16 */ nullptr,
603 /* SDIVREM_I32 */ nullptr,
604 /* SDIVREM_I64 */ nullptr,
605 /* SDIVREM_I128 */ nullptr,
606 /* UDIVREM_I8 */ nullptr,
607 /* UDIVREM_I16 */ nullptr,
608 /* UDIVREM_I32 */ nullptr,
609 /* UDIVREM_I64 */ nullptr,
610 /* UDIVREM_I128 */ nullptr,
611 /* NEG_I32 */ "__negsi2",
612 /* NEG_I64 */ "__negdi2",
613 /* ADD_F32 */ "__addsf3",
614 /* ADD_F64 */ "__adddf3",
615 /* ADD_F80 */ nullptr,
616 /* ADD_F128 */ "__addtf3",
617 /* ADD_PPCF128 */ nullptr,
618 /* SUB_F32 */ "__subsf3",
619 /* SUB_F64 */ "__subdf3",
620 /* SUB_F80 */ nullptr,
621 /* SUB_F128 */ "__subtf3",
622 /* SUB_PPCF128 */ nullptr,
623 /* MUL_F32 */ "__mulsf3",
624 /* MUL_F64 */ "__muldf3",
625 /* MUL_F80 */ nullptr,
626 /* MUL_F128 */ "__multf3",
627 /* MUL_PPCF128 */ nullptr,
628 /* DIV_F32 */ "__divsf3",
629 /* DIV_F64 */ "__divdf3",
630 /* DIV_F80 */ nullptr,
631 /* DIV_F128 */ "__divtf3",
632 /* DIV_PPCF128 */ nullptr,
633 /* REM_F32 */ "fmodf",
634 /* REM_F64 */ "fmod",
635 /* REM_F80 */ nullptr,
636 /* REM_F128 */ "fmodl",
637 /* REM_PPCF128 */ nullptr,
638 /* FMA_F32 */ "fmaf",
640 /* FMA_F80 */ nullptr,
641 /* FMA_F128 */ "fmal",
642 /* FMA_PPCF128 */ nullptr,
643 /* POWI_F32 */ "__powisf2",
644 /* POWI_F64 */ "__powidf2",
645 /* POWI_F80 */ nullptr,
646 /* POWI_F128 */ "__powitf2",
647 /* POWI_PPCF128 */ nullptr,
648 /* SQRT_F32 */ "sqrtf",
649 /* SQRT_F64 */ "sqrt",
650 /* SQRT_F80 */ nullptr,
651 /* SQRT_F128 */ "sqrtl",
652 /* SQRT_PPCF128 */ nullptr,
653 /* LOG_F32 */ "logf",
655 /* LOG_F80 */ nullptr,
656 /* LOG_F128 */ "logl",
657 /* LOG_PPCF128 */ nullptr,
658 /* LOG2_F32 */ "log2f",
659 /* LOG2_F64 */ "log2",
660 /* LOG2_F80 */ nullptr,
661 /* LOG2_F128 */ "log2l",
662 /* LOG2_PPCF128 */ nullptr,
663 /* LOG10_F32 */ "log10f",
664 /* LOG10_F64 */ "log10",
665 /* LOG10_F80 */ nullptr,
666 /* LOG10_F128 */ "log10l",
667 /* LOG10_PPCF128 */ nullptr,
668 /* EXP_F32 */ "expf",
670 /* EXP_F80 */ nullptr,
671 /* EXP_F128 */ "expl",
672 /* EXP_PPCF128 */ nullptr,
673 /* EXP2_F32 */ "exp2f",
674 /* EXP2_F64 */ "exp2",
675 /* EXP2_F80 */ nullptr,
676 /* EXP2_F128 */ "exp2l",
677 /* EXP2_PPCF128 */ nullptr,
678 /* SIN_F32 */ "sinf",
680 /* SIN_F80 */ nullptr,
681 /* SIN_F128 */ "sinl",
682 /* SIN_PPCF128 */ nullptr,
683 /* COS_F32 */ "cosf",
685 /* COS_F80 */ nullptr,
686 /* COS_F128 */ "cosl",
687 /* COS_PPCF128 */ nullptr,
688 /* SINCOS_F32 */ "sincosf",
689 /* SINCOS_F64 */ "sincos",
690 /* SINCOS_F80 */ nullptr,
691 /* SINCOS_F128 */ "sincosl",
692 /* SINCOS_PPCF128 */ nullptr,
693 /* SINCOS_STRET_F32 */ nullptr,
694 /* SINCOS_STRET_F64 */ nullptr,
695 /* POW_F32 */ "powf",
697 /* POW_F80 */ nullptr,
698 /* POW_F128 */ "powl",
699 /* POW_PPCF128 */ nullptr,
700 /* CEIL_F32 */ "ceilf",
701 /* CEIL_F64 */ "ceil",
702 /* CEIL_F80 */ nullptr,
703 /* CEIL_F128 */ "ceill",
704 /* CEIL_PPCF128 */ nullptr,
705 /* TRUNC_F32 */ "truncf",
706 /* TRUNC_F64 */ "trunc",
707 /* TRUNC_F80 */ nullptr,
708 /* TRUNC_F128 */ "truncl",
709 /* TRUNC_PPCF128 */ nullptr,
710 /* RINT_F32 */ "rintf",
711 /* RINT_F64 */ "rint",
712 /* RINT_F80 */ nullptr,
713 /* RINT_F128 */ "rintl",
714 /* RINT_PPCF128 */ nullptr,
715 /* NEARBYINT_F32 */ "nearbyintf",
716 /* NEARBYINT_F64 */ "nearbyint",
717 /* NEARBYINT_F80 */ nullptr,
718 /* NEARBYINT_F128 */ "nearbyintl",
719 /* NEARBYINT_PPCF128 */ nullptr,
720 /* ROUND_F32 */ "roundf",
721 /* ROUND_F64 */ "round",
722 /* ROUND_F80 */ nullptr,
723 /* ROUND_F128 */ "roundl",
724 /* ROUND_PPCF128 */ nullptr,
725 /* FLOOR_F32 */ "floorf",
726 /* FLOOR_F64 */ "floor",
727 /* FLOOR_F80 */ nullptr,
728 /* FLOOR_F128 */ "floorl",
729 /* FLOOR_PPCF128 */ nullptr,
730 /* COPYSIGN_F32 */ "copysignf",
731 /* COPYSIGN_F64 */ "copysign",
732 /* COPYSIGN_F80 */ nullptr,
733 /* COPYSIGN_F128 */ "copysignl",
734 /* COPYSIGN_PPCF128 */ nullptr,
735 /* FMIN_F32 */ "fminf",
736 /* FMIN_F64 */ "fmin",
737 /* FMIN_F80 */ nullptr,
738 /* FMIN_F128 */ "fminl",
739 /* FMIN_PPCF128 */ nullptr,
740 /* FMAX_F32 */ "fmaxf",
741 /* FMAX_F64 */ "fmax",
742 /* FMAX_F80 */ nullptr,
743 /* FMAX_F128 */ "fmaxl",
744 /* FMAX_PPCF128 */ nullptr,
745 /* FPEXT_F32_PPCF128 */ nullptr,
746 /* FPEXT_F64_PPCF128 */ nullptr,
747 /* FPEXT_F64_F128 */ "__extenddftf2",
748 /* FPEXT_F32_F128 */ "__extendsftf2",
749 /* FPEXT_F32_F64 */ "__extendsfdf2",
750 /* FPEXT_F16_F32 */ "__gnu_h2f_ieee",
751 /* FPROUND_F32_F16 */ "__gnu_f2h_ieee",
752 /* FPROUND_F64_F16 */ nullptr,
753 /* FPROUND_F80_F16 */ nullptr,
754 /* FPROUND_F128_F16 */ nullptr,
755 /* FPROUND_PPCF128_F16 */ nullptr,
756 /* FPROUND_F64_F32 */ "__truncdfsf2",
757 /* FPROUND_F80_F32 */ "__truncxfsf2",
758 /* FPROUND_F128_F32 */ "__trunctfsf2",
759 /* FPROUND_PPCF128_F32 */ nullptr,
760 /* FPROUND_F80_F64 */ "__truncxfdf2",
761 /* FPROUND_F128_F64 */ "__trunctfdf2",
762 /* FPROUND_PPCF128_F64 */ nullptr,
763 /* FPTOSINT_F32_I32 */ "__fixsfsi",
764 /* FPTOSINT_F32_I64 */ "__fixsfdi",
765 /* FPTOSINT_F32_I128 */ "__fixsfti",
766 /* FPTOSINT_F64_I32 */ "__fixdfsi",
767 /* FPTOSINT_F64_I64 */ "__fixdfdi",
768 /* FPTOSINT_F64_I128 */ "__fixdfti",
769 /* FPTOSINT_F80_I32 */ "__fixxfsi",
770 /* FPTOSINT_F80_I64 */ "__fixxfdi",
771 /* FPTOSINT_F80_I128 */ "__fixxfti",
772 /* FPTOSINT_F128_I32 */ "__fixtfsi",
773 /* FPTOSINT_F128_I64 */ "__fixtfdi",
774 /* FPTOSINT_F128_I128 */ "__fixtfti",
775 /* FPTOSINT_PPCF128_I32 */ nullptr,
776 /* FPTOSINT_PPCF128_I64 */ nullptr,
777 /* FPTOSINT_PPCF128_I128 */ nullptr,
778 /* FPTOUINT_F32_I32 */ "__fixunssfsi",
779 /* FPTOUINT_F32_I64 */ "__fixunssfdi",
780 /* FPTOUINT_F32_I128 */ "__fixunssfti",
781 /* FPTOUINT_F64_I32 */ "__fixunsdfsi",
782 /* FPTOUINT_F64_I64 */ "__fixunsdfdi",
783 /* FPTOUINT_F64_I128 */ "__fixunsdfti",
784 /* FPTOUINT_F80_I32 */ "__fixunsxfsi",
785 /* FPTOUINT_F80_I64 */ "__fixunsxfdi",
786 /* FPTOUINT_F80_I128 */ "__fixunsxfti",
787 /* FPTOUINT_F128_I32 */ "__fixunstfsi",
788 /* FPTOUINT_F128_I64 */ "__fixunstfdi",
789 /* FPTOUINT_F128_I128 */ "__fixunstfti",
790 /* FPTOUINT_PPCF128_I32 */ nullptr,
791 /* FPTOUINT_PPCF128_I64 */ nullptr,
792 /* FPTOUINT_PPCF128_I128 */ nullptr,
793 /* SINTTOFP_I32_F32 */ "__floatsisf",
794 /* SINTTOFP_I32_F64 */ "__floatsidf",
795 /* SINTTOFP_I32_F80 */ nullptr,
796 /* SINTTOFP_I32_F128 */ "__floatsitf",
797 /* SINTTOFP_I32_PPCF128 */ nullptr,
798 /* SINTTOFP_I64_F32 */ "__floatdisf",
799 /* SINTTOFP_I64_F64 */ "__floatdidf",
800 /* SINTTOFP_I64_F80 */ nullptr,
801 /* SINTTOFP_I64_F128 */ "__floatditf",
802 /* SINTTOFP_I64_PPCF128 */ nullptr,
803 /* SINTTOFP_I128_F32 */ "__floattisf",
804 /* SINTTOFP_I128_F64 */ "__floattidf",
805 /* SINTTOFP_I128_F80 */ nullptr,
806 /* SINTTOFP_I128_F128 */ "__floattitf",
807 /* SINTTOFP_I128_PPCF128 */ nullptr,
808 /* UINTTOFP_I32_F32 */ "__floatunsisf",
809 /* UINTTOFP_I32_F64 */ "__floatunsidf",
810 /* UINTTOFP_I32_F80 */ nullptr,
811 /* UINTTOFP_I32_F128 */ "__floatunsitf",
812 /* UINTTOFP_I32_PPCF128 */ nullptr,
813 /* UINTTOFP_I64_F32 */ "__floatundisf",
814 /* UINTTOFP_I64_F64 */ "__floatundidf",
815 /* UINTTOFP_I64_F80 */ nullptr,
816 /* UINTTOFP_I64_F128 */ "__floatunditf",
817 /* UINTTOFP_I64_PPCF128 */ nullptr,
818 /* UINTTOFP_I128_F32 */ "__floatuntisf",
819 /* UINTTOFP_I128_F64 */ "__floatuntidf",
820 /* UINTTOFP_I128_F80 */ nullptr,
821 /* UINTTOFP_I128_F128 */ "__floatuntitf",
822 /* UINTTOFP_I128_PPCF128 */ nullptr,
823 /* OEQ_F32 */ "__eqsf2",
824 /* OEQ_F64 */ "__eqdf2",
825 /* OEQ_F128 */ "__eqtf2",
826 /* OEQ_PPCF128 */ nullptr,
827 /* UNE_F32 */ "__nesf2",
828 /* UNE_F64 */ "__nedf2",
829 /* UNE_F128 */ "__netf2",
830 /* UNE_PPCF128 */ nullptr,
831 /* OGE_F32 */ "__gesf2",
832 /* OGE_F64 */ "__gedf2",
833 /* OGE_F128 */ "__getf2",
834 /* OGE_PPCF128 */ nullptr,
835 /* OLT_F32 */ "__ltsf2",
836 /* OLT_F64 */ "__ltdf2",
837 /* OLT_F128 */ "__lttf2",
838 /* OLT_PPCF128 */ nullptr,
839 /* OLE_F32 */ "__lesf2",
840 /* OLE_F64 */ "__ledf2",
841 /* OLE_F128 */ "__letf2",
842 /* OLE_PPCF128 */ nullptr,
843 /* OGT_F32 */ "__gtsf2",
844 /* OGT_F64 */ "__gtdf2",
845 /* OGT_F128 */ "__gttf2",
846 /* OGT_PPCF128 */ nullptr,
847 /* UO_F32 */ "__unordsf2",
848 /* UO_F64 */ "__unorddf2",
849 /* UO_F128 */ "__unordtf2",
850 /* UO_PPCF128 */ nullptr,
851 /* O_F32 */ "__unordsf2",
852 /* O_F64 */ "__unorddf2",
853 /* O_F128 */ "__unordtf2",
854 /* O_PPCF128 */ nullptr,
855 /* MEMCPY */ "memcpy",
856 /* MEMMOVE */ "memset",
857 /* MEMSET */ "memmove",
859 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr,
860 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr,
861 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr,
862 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr,
863 /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr,
864 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr,
865 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr,
866 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr,
867 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr,
868 /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr,
869 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr,
870 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr,
871 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr,
872 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr,
873 /* MEMSET_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr,
874 /* UNWIND_RESUME */ "_Unwind_Resume",
875 /* SYNC_VAL_COMPARE_AND_SWAP_1 */ "__sync_val_compare_and_swap_1",
876 /* SYNC_VAL_COMPARE_AND_SWAP_2 */ "__sync_val_compare_and_swap_2",
877 /* SYNC_VAL_COMPARE_AND_SWAP_4 */ "__sync_val_compare_and_swap_4",
878 /* SYNC_VAL_COMPARE_AND_SWAP_8 */ "__sync_val_compare_and_swap_8",
879 /* SYNC_VAL_COMPARE_AND_SWAP_16 */ "__sync_val_compare_and_swap_16",
880 /* SYNC_LOCK_TEST_AND_SET_1 */ "__sync_lock_test_and_set_1",
881 /* SYNC_LOCK_TEST_AND_SET_2 */ "__sync_lock_test_and_set_2",
882 /* SYNC_LOCK_TEST_AND_SET_4 */ "__sync_lock_test_and_set_4",
883 /* SYNC_LOCK_TEST_AND_SET_8 */ "__sync_lock_test_and_set_8",
884 /* SYNC_LOCK_TEST_AND_SET_16 */ "__sync_lock_test_and_set_16",
885 /* SYNC_FETCH_AND_ADD_1 */ "__sync_fetch_and_add_1",
886 /* SYNC_FETCH_AND_ADD_2 */ "__sync_fetch_and_add_2",
887 /* SYNC_FETCH_AND_ADD_4 */ "__sync_fetch_and_add_4",
888 /* SYNC_FETCH_AND_ADD_8 */ "__sync_fetch_and_add_8",
889 /* SYNC_FETCH_AND_ADD_16 */ "__sync_fetch_and_add_16",
890 /* SYNC_FETCH_AND_SUB_1 */ "__sync_fetch_and_sub_1",
891 /* SYNC_FETCH_AND_SUB_2 */ "__sync_fetch_and_sub_2",
892 /* SYNC_FETCH_AND_SUB_4 */ "__sync_fetch_and_sub_4",
893 /* SYNC_FETCH_AND_SUB_8 */ "__sync_fetch_and_sub_8",
894 /* SYNC_FETCH_AND_SUB_16 */ "__sync_fetch_and_sub_16",
895 /* SYNC_FETCH_AND_AND_1 */ "__sync_fetch_and_and_1",
896 /* SYNC_FETCH_AND_AND_2 */ "__sync_fetch_and_and_2",
897 /* SYNC_FETCH_AND_AND_4 */ "__sync_fetch_and_and_4",
898 /* SYNC_FETCH_AND_AND_8 */ "__sync_fetch_and_and_8",
899 /* SYNC_FETCH_AND_AND_16 */ "__sync_fetch_and_and_16",
900 /* SYNC_FETCH_AND_OR_1 */ "__sync_fetch_and_or_1",
901 /* SYNC_FETCH_AND_OR_2 */ "__sync_fetch_and_or_2",
902 /* SYNC_FETCH_AND_OR_4 */ "__sync_fetch_and_or_4",
903 /* SYNC_FETCH_AND_OR_8 */ "__sync_fetch_and_or_8",
904 /* SYNC_FETCH_AND_OR_16 */ "__sync_fetch_and_or_16",
905 /* SYNC_FETCH_AND_XOR_1 */ "__sync_fetch_and_xor_1",
906 /* SYNC_FETCH_AND_XOR_2 */ "__sync_fetch_and_xor_2",
907 /* SYNC_FETCH_AND_XOR_4 */ "__sync_fetch_and_xor_4",
908 /* SYNC_FETCH_AND_XOR_8 */ "__sync_fetch_and_xor_8",
909 /* SYNC_FETCH_AND_XOR_16 */ "__sync_fetch_and_xor_16",
910 /* SYNC_FETCH_AND_NAND_1 */ "__sync_fetch_and_nand_1",
911 /* SYNC_FETCH_AND_NAND_2 */ "__sync_fetch_and_nand_2",
912 /* SYNC_FETCH_AND_NAND_4 */ "__sync_fetch_and_nand_4",
913 /* SYNC_FETCH_AND_NAND_8 */ "__sync_fetch_and_nand_8",
914 /* SYNC_FETCH_AND_NAND_16 */ "__sync_fetch_and_nand_16",
915 /* SYNC_FETCH_AND_MAX_1 */ "__sync_fetch_and_max_1",
916 /* SYNC_FETCH_AND_MAX_2 */ "__sync_fetch_and_max_2",
917 /* SYNC_FETCH_AND_MAX_4 */ "__sync_fetch_and_max_4",
918 /* SYNC_FETCH_AND_MAX_8 */ "__sync_fetch_and_max_8",
919 /* SYNC_FETCH_AND_MAX_16 */ "__sync_fetch_and_max_16",
920 /* SYNC_FETCH_AND_UMAX_1 */ "__sync_fetch_and_umax_1",
921 /* SYNC_FETCH_AND_UMAX_2 */ "__sync_fetch_and_umax_2",
922 /* SYNC_FETCH_AND_UMAX_4 */ "__sync_fetch_and_umax_4",
923 /* SYNC_FETCH_AND_UMAX_8 */ "__sync_fetch_and_umax_8",
924 /* SYNC_FETCH_AND_UMAX_16 */ "__sync_fetch_and_umax_16",
925 /* SYNC_FETCH_AND_MIN_1 */ "__sync_fetch_and_min_1",
926 /* SYNC_FETCH_AND_MIN_2 */ "__sync_fetch_and_min_2",
927 /* SYNC_FETCH_AND_MIN_4 */ "__sync_fetch_and_min_4",
928 /* SYNC_FETCH_AND_MIN_8 */ "__sync_fetch_and_min_8",
929 /* SYNC_FETCH_AND_MIN_16 */ "__sync_fetch_and_min_16",
930 /* SYNC_FETCH_AND_UMIN_1 */ "__sync_fetch_and_umin_1",
931 /* SYNC_FETCH_AND_UMIN_2 */ "__sync_fetch_and_umin_2",
932 /* SYNC_FETCH_AND_UMIN_4 */ "__sync_fetch_and_umin_4",
933 /* SYNC_FETCH_AND_UMIN_8 */ "__sync_fetch_and_umin_8",
934 /* SYNC_FETCH_AND_UMIN_16 */ "__sync_fetch_and_umin_16",
936 /* ATOMIC_LOAD */ "__atomic_load",
937 /* ATOMIC_LOAD_1 */ "__atomic_load_1",
938 /* ATOMIC_LOAD_2 */ "__atomic_load_2",
939 /* ATOMIC_LOAD_4 */ "__atomic_load_4",
940 /* ATOMIC_LOAD_8 */ "__atomic_load_8",
941 /* ATOMIC_LOAD_16 */ "__atomic_load_16",
943 /* ATOMIC_STORE */ "__atomic_store",
944 /* ATOMIC_STORE_1 */ "__atomic_store_1",
945 /* ATOMIC_STORE_2 */ "__atomic_store_2",
946 /* ATOMIC_STORE_4 */ "__atomic_store_4",
947 /* ATOMIC_STORE_8 */ "__atomic_store_8",
948 /* ATOMIC_STORE_16 */ "__atomic_store_16",
950 /* ATOMIC_EXCHANGE */ "__atomic_exchange",
951 /* ATOMIC_EXCHANGE_1 */ "__atomic_exchange_1",
952 /* ATOMIC_EXCHANGE_2 */ "__atomic_exchange_2",
953 /* ATOMIC_EXCHANGE_4 */ "__atomic_exchange_4",
954 /* ATOMIC_EXCHANGE_8 */ "__atomic_exchange_8",
955 /* ATOMIC_EXCHANGE_16 */ "__atomic_exchange_16",
957 /* ATOMIC_COMPARE_EXCHANGE */ "__atomic_compare_exchange",
958 /* ATOMIC_COMPARE_EXCHANGE_1 */ "__atomic_compare_exchange_1",
959 /* ATOMIC_COMPARE_EXCHANGE_2 */ "__atomic_compare_exchange_2",
960 /* ATOMIC_COMPARE_EXCHANGE_4 */ "__atomic_compare_exchange_4",
961 /* ATOMIC_COMPARE_EXCHANGE_8 */ "__atomic_compare_exchange_8",
962 /* ATOMIC_COMPARE_EXCHANGE_16 */ "__atomic_compare_exchange_16",
964 /* ATOMIC_FETCH_ADD_1 */ "__atomic_fetch_add_1",
965 /* ATOMIC_FETCH_ADD_2 */ "__atomic_fetch_add_2",
966 /* ATOMIC_FETCH_ADD_4 */ "__atomic_fetch_add_4",
967 /* ATOMIC_FETCH_ADD_8 */ "__atomic_fetch_add_8",
968 /* ATOMIC_FETCH_ADD_16 */ "__atomic_fetch_add_16",
969 /* ATOMIC_FETCH_SUB_1 */ "__atomic_fetch_sub_1",
970 /* ATOMIC_FETCH_SUB_2 */ "__atomic_fetch_sub_2",
971 /* ATOMIC_FETCH_SUB_4 */ "__atomic_fetch_sub_4",
972 /* ATOMIC_FETCH_SUB_8 */ "__atomic_fetch_sub_8",
973 /* ATOMIC_FETCH_SUB_16 */ "__atomic_fetch_sub_16",
974 /* ATOMIC_FETCH_AND_1 */ "__atomic_fetch_and_1",
975 /* ATOMIC_FETCH_AND_2 */ "__atomic_fetch_and_2",
976 /* ATOMIC_FETCH_AND_4 */ "__atomic_fetch_and_4",
977 /* ATOMIC_FETCH_AND_8 */ "__atomic_fetch_and_8",
978 /* ATOMIC_FETCH_AND_16 */ "__atomic_fetch_and_16",
979 /* ATOMIC_FETCH_OR_1 */ "__atomic_fetch_or_1",
980 /* ATOMIC_FETCH_OR_2 */ "__atomic_fetch_or_2",
981 /* ATOMIC_FETCH_OR_4 */ "__atomic_fetch_or_4",
982 /* ATOMIC_FETCH_OR_8 */ "__atomic_fetch_or_8",
983 /* ATOMIC_FETCH_OR_16 */ "__atomic_fetch_or_16",
984 /* ATOMIC_FETCH_XOR_1 */ "__atomic_fetch_xor_1",
985 /* ATOMIC_FETCH_XOR_2 */ "__atomic_fetch_xor_2",
986 /* ATOMIC_FETCH_XOR_4 */ "__atomic_fetch_xor_4",
987 /* ATOMIC_FETCH_XOR_8 */ "__atomic_fetch_xor_8",
988 /* ATOMIC_FETCH_XOR_16 */ "__atomic_fetch_xor_16",
989 /* ATOMIC_FETCH_NAND_1 */ "__atomic_fetch_nand_1",
990 /* ATOMIC_FETCH_NAND_2 */ "__atomic_fetch_nand_2",
991 /* ATOMIC_FETCH_NAND_4 */ "__atomic_fetch_nand_4",
992 /* ATOMIC_FETCH_NAND_8 */ "__atomic_fetch_nand_8",
993 /* ATOMIC_FETCH_NAND_16 */ "__atomic_fetch_nand_16",
995 /* STACKPROTECTOR_CHECK_FAIL */ "__stack_chk_fail",
997 /* DEOPTIMIZE */ "__llvm_deoptimize",
1000 void llvm::GetSignature(const WebAssemblySubtarget &Subtarget,
1001 RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
1002 SmallVectorImpl<wasm::ValType> &Params) {
1003 assert(Rets.empty());
1004 assert(Params.empty());
1006 WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ?
1007 WebAssembly::ExprType::I64 :
1008 WebAssembly::ExprType::I32;
1010 switch (RuntimeLibcallSignatures[LC]) {
1014 Rets.push_back(wasm::ValType::F32);
1015 Params.push_back(wasm::ValType::F32);
1018 Rets.push_back(wasm::ValType::F32);
1019 Params.push_back(wasm::ValType::F64);
1022 Rets.push_back(wasm::ValType::F32);
1023 Params.push_back(wasm::ValType::I32);
1026 Rets.push_back(wasm::ValType::F32);
1027 Params.push_back(wasm::ValType::I64);
1030 Rets.push_back(wasm::ValType::F32);
1031 Params.push_back(wasm::ValType::I32);
1034 Rets.push_back(wasm::ValType::F64);
1035 Params.push_back(wasm::ValType::F32);
1038 Rets.push_back(wasm::ValType::F64);
1039 Params.push_back(wasm::ValType::F64);
1042 Rets.push_back(wasm::ValType::F64);
1043 Params.push_back(wasm::ValType::I32);
1046 Rets.push_back(wasm::ValType::F64);
1047 Params.push_back(wasm::ValType::I64);
1050 Rets.push_back(wasm::ValType::I32);
1051 Params.push_back(wasm::ValType::F32);
1054 Rets.push_back(wasm::ValType::I32);
1055 Params.push_back(wasm::ValType::F64);
1058 Rets.push_back(wasm::ValType::I32);
1059 Params.push_back(wasm::ValType::I32);
1062 Rets.push_back(wasm::ValType::I64);
1063 Params.push_back(wasm::ValType::F32);
1066 Rets.push_back(wasm::ValType::I64);
1067 Params.push_back(wasm::ValType::F64);
1070 Rets.push_back(wasm::ValType::I64);
1071 Params.push_back(wasm::ValType::I64);
1073 case f32_func_f32_f32:
1074 Rets.push_back(wasm::ValType::F32);
1075 Params.push_back(wasm::ValType::F32);
1076 Params.push_back(wasm::ValType::F32);
1078 case f32_func_f32_i32:
1079 Rets.push_back(wasm::ValType::F32);
1080 Params.push_back(wasm::ValType::F32);
1081 Params.push_back(wasm::ValType::I32);
1083 case f32_func_i64_i64:
1084 Rets.push_back(wasm::ValType::F32);
1085 Params.push_back(wasm::ValType::I64);
1086 Params.push_back(wasm::ValType::I64);
1088 case f64_func_f64_f64:
1089 Rets.push_back(wasm::ValType::F64);
1090 Params.push_back(wasm::ValType::F64);
1091 Params.push_back(wasm::ValType::F64);
1093 case f64_func_f64_i32:
1094 Rets.push_back(wasm::ValType::F64);
1095 Params.push_back(wasm::ValType::F64);
1096 Params.push_back(wasm::ValType::I32);
1098 case f64_func_i64_i64:
1099 Rets.push_back(wasm::ValType::F64);
1100 Params.push_back(wasm::ValType::I64);
1101 Params.push_back(wasm::ValType::I64);
1104 Rets.push_back(wasm::ValType::I32);
1105 Params.push_back(wasm::ValType::F32);
1108 Rets.push_back(wasm::ValType::I32);
1109 Params.push_back(wasm::ValType::I32);
1110 Params.push_back(wasm::ValType::I32);
1112 case func_f32_iPTR_iPTR:
1113 Params.push_back(wasm::ValType::F32);
1114 Params.push_back(wasm::ValType(iPTR));
1115 Params.push_back(wasm::ValType(iPTR));
1117 case func_f64_iPTR_iPTR:
1118 Params.push_back(wasm::ValType::F64);
1119 Params.push_back(wasm::ValType(iPTR));
1120 Params.push_back(wasm::ValType(iPTR));
1122 case i16_func_i16_i16:
1123 Rets.push_back(wasm::ValType::I32);
1124 Params.push_back(wasm::ValType::I32);
1125 Params.push_back(wasm::ValType::I32);
1127 case i32_func_f32_f32:
1128 Rets.push_back(wasm::ValType::I32);
1129 Params.push_back(wasm::ValType::F32);
1130 Params.push_back(wasm::ValType::F32);
1132 case i32_func_f64_f64:
1133 Rets.push_back(wasm::ValType::I32);
1134 Params.push_back(wasm::ValType::F64);
1135 Params.push_back(wasm::ValType::F64);
1137 case i32_func_i32_i32:
1138 Rets.push_back(wasm::ValType::I32);
1139 Params.push_back(wasm::ValType::I32);
1140 Params.push_back(wasm::ValType::I32);
1142 case i64_func_i64_i64:
1143 Rets.push_back(wasm::ValType::I64);
1144 Params.push_back(wasm::ValType::I64);
1145 Params.push_back(wasm::ValType::I64);
1147 case i64_i64_func_f32:
1148 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1149 Rets.push_back(wasm::ValType::I64);
1150 Rets.push_back(wasm::ValType::I64);
1152 Params.push_back(wasm::ValType(iPTR));
1154 Params.push_back(wasm::ValType::F32);
1156 case i64_i64_func_f64:
1157 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1158 Rets.push_back(wasm::ValType::I64);
1159 Rets.push_back(wasm::ValType::I64);
1161 Params.push_back(wasm::ValType(iPTR));
1163 Params.push_back(wasm::ValType::F64);
1165 case i16_i16_func_i16_i16:
1166 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1167 Rets.push_back(wasm::ValType::I32);
1168 Rets.push_back(wasm::ValType::I32);
1170 Params.push_back(wasm::ValType(iPTR));
1172 Params.push_back(wasm::ValType::I32);
1173 Params.push_back(wasm::ValType::I32);
1175 case i32_i32_func_i32_i32:
1176 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1177 Rets.push_back(wasm::ValType::I32);
1178 Rets.push_back(wasm::ValType::I32);
1180 Params.push_back(wasm::ValType(iPTR));
1182 Params.push_back(wasm::ValType::I32);
1183 Params.push_back(wasm::ValType::I32);
1185 case i64_i64_func_i64_i64:
1186 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1187 Rets.push_back(wasm::ValType::I64);
1188 Rets.push_back(wasm::ValType::I64);
1190 Params.push_back(wasm::ValType(iPTR));
1192 Params.push_back(wasm::ValType::I64);
1193 Params.push_back(wasm::ValType::I64);
1195 case i64_i64_func_i64_i64_i64_i64:
1196 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1197 Rets.push_back(wasm::ValType::I64);
1198 Rets.push_back(wasm::ValType::I64);
1200 Params.push_back(wasm::ValType(iPTR));
1202 Params.push_back(wasm::ValType::I64);
1203 Params.push_back(wasm::ValType::I64);
1204 Params.push_back(wasm::ValType::I64);
1205 Params.push_back(wasm::ValType::I64);
1207 case i64_i64_i64_i64_func_i64_i64_i64_i64:
1208 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1209 Rets.push_back(wasm::ValType::I64);
1210 Rets.push_back(wasm::ValType::I64);
1211 Rets.push_back(wasm::ValType::I64);
1212 Rets.push_back(wasm::ValType::I64);
1214 Params.push_back(wasm::ValType(iPTR));
1216 Params.push_back(wasm::ValType::I64);
1217 Params.push_back(wasm::ValType::I64);
1218 Params.push_back(wasm::ValType::I64);
1219 Params.push_back(wasm::ValType::I64);
1221 case i64_i64_func_i64_i64_i32:
1222 #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
1223 Rets.push_back(wasm::ValType::I64);
1224 Rets.push_back(wasm::ValType::I64);
1225 Rets.push_back(wasm::ValType::I64);
1226 Rets.push_back(wasm::ValType::I64);
1228 Params.push_back(wasm::ValType(iPTR));
1230 Params.push_back(wasm::ValType::I64);
1231 Params.push_back(wasm::ValType::I64);
1232 Params.push_back(wasm::ValType::I32);
1234 case iPTR_func_iPTR_i32_iPTR:
1235 Rets.push_back(wasm::ValType(iPTR));
1236 Params.push_back(wasm::ValType(iPTR));
1237 Params.push_back(wasm::ValType::I32);
1238 Params.push_back(wasm::ValType(iPTR));
1240 case iPTR_func_iPTR_iPTR_iPTR:
1241 Rets.push_back(wasm::ValType(iPTR));
1242 Params.push_back(wasm::ValType(iPTR));
1243 Params.push_back(wasm::ValType(iPTR));
1244 Params.push_back(wasm::ValType(iPTR));
1246 case f32_func_f32_f32_f32:
1247 Rets.push_back(wasm::ValType::F32);
1248 Params.push_back(wasm::ValType::F32);
1249 Params.push_back(wasm::ValType::F32);
1250 Params.push_back(wasm::ValType::F32);
1252 case f64_func_f64_f64_f64:
1253 Rets.push_back(wasm::ValType::F64);
1254 Params.push_back(wasm::ValType::F64);
1255 Params.push_back(wasm::ValType::F64);
1256 Params.push_back(wasm::ValType::F64);
1258 case func_i64_i64_iPTR_iPTR:
1259 Params.push_back(wasm::ValType::I64);
1260 Params.push_back(wasm::ValType::I64);
1261 Params.push_back(wasm::ValType(iPTR));
1262 Params.push_back(wasm::ValType(iPTR));
1265 Params.push_back(wasm::ValType(iPTR));
1266 Params.push_back(wasm::ValType::F32);
1269 Params.push_back(wasm::ValType(iPTR));
1270 Params.push_back(wasm::ValType::F64);
1273 Params.push_back(wasm::ValType(iPTR));
1274 Params.push_back(wasm::ValType::I32);
1277 Params.push_back(wasm::ValType(iPTR));
1278 Params.push_back(wasm::ValType::I64);
1280 case func_iPTR_i64_i64:
1281 Params.push_back(wasm::ValType(iPTR));
1282 Params.push_back(wasm::ValType::I64);
1283 Params.push_back(wasm::ValType::I64);
1285 case func_iPTR_i64_i64_i64_i64:
1286 Params.push_back(wasm::ValType(iPTR));
1287 Params.push_back(wasm::ValType::I64);
1288 Params.push_back(wasm::ValType::I64);
1289 Params.push_back(wasm::ValType::I64);
1290 Params.push_back(wasm::ValType::I64);
1292 case func_iPTR_i64_i64_i64_i64_i64_i64:
1293 Params.push_back(wasm::ValType(iPTR));
1294 Params.push_back(wasm::ValType::I64);
1295 Params.push_back(wasm::ValType::I64);
1296 Params.push_back(wasm::ValType::I64);
1297 Params.push_back(wasm::ValType::I64);
1298 Params.push_back(wasm::ValType::I64);
1299 Params.push_back(wasm::ValType::I64);
1301 case i32_func_i64_i64:
1302 Rets.push_back(wasm::ValType::I32);
1303 Params.push_back(wasm::ValType::I64);
1304 Params.push_back(wasm::ValType::I64);
1306 case i32_func_i64_i64_i64_i64:
1307 Rets.push_back(wasm::ValType::I32);
1308 Params.push_back(wasm::ValType::I64);
1309 Params.push_back(wasm::ValType::I64);
1310 Params.push_back(wasm::ValType::I64);
1311 Params.push_back(wasm::ValType::I64);
1314 llvm_unreachable("unsupported runtime library signature");
1318 void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
1319 SmallVectorImpl<wasm::ValType> &Rets,
1320 SmallVectorImpl<wasm::ValType> &Params) {
1321 assert(strcmp(RuntimeLibcallNames[RTLIB::DEOPTIMIZE], "__llvm_deoptimize") ==
1324 for (size_t i = 0, e = RTLIB::UNKNOWN_LIBCALL; i < e; ++i)
1325 if (RuntimeLibcallNames[i] && strcmp(RuntimeLibcallNames[i], Name) == 0)
1326 return GetSignature(Subtarget, RTLIB::Libcall(i), Rets, Params);
1328 llvm_unreachable("unexpected runtime library name");