blob: c02ef4a1c399b85c04e39b5b0d62d67eb76ced5d [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,
Derek Schuffe2688c42017-03-14 20:23:22 +0000974 RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
975 SmallVectorImpl<wasm::ValType> &Params) {
Dan Gohman38b42b42017-02-22 18:34:16 +0000976 assert(Rets.empty());
977 assert(Params.empty());
978
979 WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ?
980 WebAssembly::ExprType::I64 :
981 WebAssembly::ExprType::I32;
982
983 switch (RuntimeLibcallSignatures[LC]) {
984 case func:
985 break;
986 case f32_func_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +0000987 Rets.push_back(wasm::ValType::F32);
988 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +0000989 break;
990 case f32_func_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +0000991 Rets.push_back(wasm::ValType::F32);
992 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +0000993 break;
994 case f32_func_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +0000995 Rets.push_back(wasm::ValType::F32);
996 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +0000997 break;
998 case f32_func_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +0000999 Rets.push_back(wasm::ValType::F32);
1000 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001001 break;
1002 case f32_func_i16:
Derek Schuffe2688c42017-03-14 20:23:22 +00001003 Rets.push_back(wasm::ValType::F32);
1004 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001005 break;
1006 case f64_func_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001007 Rets.push_back(wasm::ValType::F64);
1008 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001009 break;
1010 case f64_func_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001011 Rets.push_back(wasm::ValType::F64);
1012 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001013 break;
1014 case f64_func_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001015 Rets.push_back(wasm::ValType::F64);
1016 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001017 break;
1018 case f64_func_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001019 Rets.push_back(wasm::ValType::F64);
1020 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001021 break;
1022 case i32_func_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001023 Rets.push_back(wasm::ValType::I32);
1024 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001025 break;
1026 case i32_func_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001027 Rets.push_back(wasm::ValType::I32);
1028 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001029 break;
1030 case i32_func_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001031 Rets.push_back(wasm::ValType::I32);
1032 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001033 break;
1034 case i64_func_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001035 Rets.push_back(wasm::ValType::I64);
1036 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001037 break;
1038 case i64_func_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001039 Rets.push_back(wasm::ValType::I64);
1040 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001041 break;
1042 case i64_func_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001043 Rets.push_back(wasm::ValType::I64);
1044 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001045 break;
1046 case f32_func_f32_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001047 Rets.push_back(wasm::ValType::F32);
1048 Params.push_back(wasm::ValType::F32);
1049 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001050 break;
1051 case f32_func_f32_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001052 Rets.push_back(wasm::ValType::F32);
1053 Params.push_back(wasm::ValType::F32);
1054 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001055 break;
1056 case f32_func_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001057 Rets.push_back(wasm::ValType::F32);
1058 Params.push_back(wasm::ValType::I64);
1059 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001060 break;
1061 case f64_func_f64_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001062 Rets.push_back(wasm::ValType::F64);
1063 Params.push_back(wasm::ValType::F64);
1064 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001065 break;
1066 case f64_func_f64_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001067 Rets.push_back(wasm::ValType::F64);
1068 Params.push_back(wasm::ValType::F64);
1069 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001070 break;
1071 case f64_func_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001072 Rets.push_back(wasm::ValType::F64);
1073 Params.push_back(wasm::ValType::I64);
1074 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001075 break;
1076 case i16_func_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001077 Rets.push_back(wasm::ValType::I32);
1078 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001079 break;
1080 case i8_func_i8_i8:
Derek Schuffe2688c42017-03-14 20:23:22 +00001081 Rets.push_back(wasm::ValType::I32);
1082 Params.push_back(wasm::ValType::I32);
1083 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001084 break;
1085 case func_f32_iPTR_iPTR:
Derek Schuffe2688c42017-03-14 20:23:22 +00001086 Params.push_back(wasm::ValType::F32);
1087 Params.push_back(wasm::ValType(iPTR));
1088 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001089 break;
1090 case func_f64_iPTR_iPTR:
Derek Schuffe2688c42017-03-14 20:23:22 +00001091 Params.push_back(wasm::ValType::F64);
1092 Params.push_back(wasm::ValType(iPTR));
1093 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001094 break;
1095 case i16_func_i16_i16:
Derek Schuffe2688c42017-03-14 20:23:22 +00001096 Rets.push_back(wasm::ValType::I32);
1097 Params.push_back(wasm::ValType::I32);
1098 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001099 break;
1100 case i32_func_f32_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001101 Rets.push_back(wasm::ValType::I32);
1102 Params.push_back(wasm::ValType::F32);
1103 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001104 break;
1105 case i32_func_f64_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001106 Rets.push_back(wasm::ValType::I32);
1107 Params.push_back(wasm::ValType::F64);
1108 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001109 break;
1110 case i32_func_i32_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001111 Rets.push_back(wasm::ValType::I32);
1112 Params.push_back(wasm::ValType::I32);
1113 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001114 break;
1115 case i64_func_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001116 Rets.push_back(wasm::ValType::I64);
1117 Params.push_back(wasm::ValType::I64);
1118 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001119 break;
1120 case i64_i64_func_f32:
1121#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001122 Rets.push_back(wasm::ValType::I64);
1123 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001124#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001125 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001126#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001127 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001128 break;
1129 case i64_i64_func_f64:
1130#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001131 Rets.push_back(wasm::ValType::I64);
1132 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001133#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001134 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001135#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001136 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001137 break;
1138 case i16_i16_func_i16_i16:
1139#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001140 Rets.push_back(wasm::ValType::I32);
1141 Rets.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001142#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001143 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001144#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001145 Params.push_back(wasm::ValType::I32);
1146 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001147 break;
1148 case i32_i32_func_i32_i32:
1149#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001150 Rets.push_back(wasm::ValType::I32);
1151 Rets.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001152#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001153 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001154#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001155 Params.push_back(wasm::ValType::I32);
1156 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001157 break;
1158 case i64_i64_func_i64_i64:
1159#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001160 Rets.push_back(wasm::ValType::I64);
1161 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001162#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001163 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001164#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001165 Params.push_back(wasm::ValType::I64);
1166 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001167 break;
1168 case i64_i64_func_i64_i64_i64_i64:
1169#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001170 Rets.push_back(wasm::ValType::I64);
1171 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001172#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001173 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001174#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001175 Params.push_back(wasm::ValType::I64);
1176 Params.push_back(wasm::ValType::I64);
1177 Params.push_back(wasm::ValType::I64);
1178 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001179 break;
1180 case i64_i64_i64_i64_func_i64_i64_i64_i64:
1181#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001182 Rets.push_back(wasm::ValType::I64);
1183 Rets.push_back(wasm::ValType::I64);
1184 Rets.push_back(wasm::ValType::I64);
1185 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001186#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001187 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001188#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001189 Params.push_back(wasm::ValType::I64);
1190 Params.push_back(wasm::ValType::I64);
1191 Params.push_back(wasm::ValType::I64);
1192 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001193 break;
1194 case i64_i64_func_i64_i64_i32:
1195#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
Derek Schuffe2688c42017-03-14 20:23:22 +00001196 Rets.push_back(wasm::ValType::I64);
1197 Rets.push_back(wasm::ValType::I64);
1198 Rets.push_back(wasm::ValType::I64);
1199 Rets.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001200#else
Derek Schuffe2688c42017-03-14 20:23:22 +00001201 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001202#endif
Derek Schuffe2688c42017-03-14 20:23:22 +00001203 Params.push_back(wasm::ValType::I64);
1204 Params.push_back(wasm::ValType::I64);
1205 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001206 break;
1207 case iPTR_func_iPTR_i32_iPTR:
Derek Schuffe2688c42017-03-14 20:23:22 +00001208 Rets.push_back(wasm::ValType(iPTR));
1209 Params.push_back(wasm::ValType(iPTR));
1210 Params.push_back(wasm::ValType::I32);
1211 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001212 break;
1213 case iPTR_func_iPTR_iPTR_iPTR:
Derek Schuffe2688c42017-03-14 20:23:22 +00001214 Rets.push_back(wasm::ValType(iPTR));
1215 Params.push_back(wasm::ValType(iPTR));
1216 Params.push_back(wasm::ValType(iPTR));
1217 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001218 break;
1219 case f32_func_f32_f32_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001220 Rets.push_back(wasm::ValType::F32);
1221 Params.push_back(wasm::ValType::F32);
1222 Params.push_back(wasm::ValType::F32);
1223 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001224 break;
1225 case f64_func_f64_f64_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001226 Rets.push_back(wasm::ValType::F64);
1227 Params.push_back(wasm::ValType::F64);
1228 Params.push_back(wasm::ValType::F64);
1229 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001230 break;
1231 case func_i64_i64_iPTR_iPTR:
Derek Schuffe2688c42017-03-14 20:23:22 +00001232 Params.push_back(wasm::ValType::I64);
1233 Params.push_back(wasm::ValType::I64);
1234 Params.push_back(wasm::ValType(iPTR));
1235 Params.push_back(wasm::ValType(iPTR));
Dan Gohman38b42b42017-02-22 18:34:16 +00001236 break;
1237 case func_iPTR_f32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001238 Params.push_back(wasm::ValType(iPTR));
1239 Params.push_back(wasm::ValType::F32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001240 break;
1241 case func_iPTR_f64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001242 Params.push_back(wasm::ValType(iPTR));
1243 Params.push_back(wasm::ValType::F64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001244 break;
1245 case func_iPTR_i32:
Derek Schuffe2688c42017-03-14 20:23:22 +00001246 Params.push_back(wasm::ValType(iPTR));
1247 Params.push_back(wasm::ValType::I32);
Dan Gohman38b42b42017-02-22 18:34:16 +00001248 break;
1249 case func_iPTR_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001250 Params.push_back(wasm::ValType(iPTR));
1251 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001252 break;
1253 case func_iPTR_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001254 Params.push_back(wasm::ValType(iPTR));
1255 Params.push_back(wasm::ValType::I64);
1256 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001257 break;
1258 case func_iPTR_i64_i64_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001259 Params.push_back(wasm::ValType(iPTR));
1260 Params.push_back(wasm::ValType::I64);
1261 Params.push_back(wasm::ValType::I64);
1262 Params.push_back(wasm::ValType::I64);
1263 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001264 break;
1265 case func_iPTR_i64_i64_i64_i64_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001266 Params.push_back(wasm::ValType(iPTR));
1267 Params.push_back(wasm::ValType::I64);
1268 Params.push_back(wasm::ValType::I64);
1269 Params.push_back(wasm::ValType::I64);
1270 Params.push_back(wasm::ValType::I64);
1271 Params.push_back(wasm::ValType::I64);
1272 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001273 break;
1274 case i32_func_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001275 Rets.push_back(wasm::ValType::I32);
1276 Params.push_back(wasm::ValType::I64);
1277 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001278 break;
1279 case i32_func_i64_i64_i64_i64:
Derek Schuffe2688c42017-03-14 20:23:22 +00001280 Rets.push_back(wasm::ValType::I32);
1281 Params.push_back(wasm::ValType::I64);
1282 Params.push_back(wasm::ValType::I64);
1283 Params.push_back(wasm::ValType::I64);
1284 Params.push_back(wasm::ValType::I64);
Dan Gohman38b42b42017-02-22 18:34:16 +00001285 break;
1286 case unsupported:
1287 llvm_unreachable("unsupported runtime library signature");
1288 }
1289}
1290
Derek Schuffe2688c42017-03-14 20:23:22 +00001291void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
1292 SmallVectorImpl<wasm::ValType> &Rets,
1293 SmallVectorImpl<wasm::ValType> &Params) {
Dan Gohman38b42b42017-02-22 18:34:16 +00001294 assert(strcmp(RuntimeLibcallNames[RTLIB::DEOPTIMIZE], "__llvm_deoptimize") ==
1295 0);
1296
1297 for (size_t i = 0, e = RTLIB::UNKNOWN_LIBCALL; i < e; ++i)
1298 if (RuntimeLibcallNames[i] && strcmp(RuntimeLibcallNames[i], Name) == 0)
1299 return GetSignature(Subtarget, RTLIB::Libcall(i), Rets, Params);
1300
1301 llvm_unreachable("unexpected runtime library name");
1302}