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