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