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