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