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