WebAssemblyRuntimeLibcallSignatures.cpp revision 341825
1317017Sdim// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
2317017Sdim//
3317017Sdim//                     The LLVM Compiler Infrastructure
4317017Sdim//
5317017Sdim// This file is distributed under the University of Illinois Open Source
6317017Sdim// License. See LICENSE.TXT for details.
7317017Sdim//
8317017Sdim//===----------------------------------------------------------------------===//
9317017Sdim///
10317017Sdim/// \file
11341825Sdim/// This file contains signature information for runtime libcalls.
12317017Sdim///
13317017Sdim/// CodeGen uses external symbols, which it refers to by name. The WebAssembly
14317017Sdim/// target needs type information for all functions. This file contains a big
15317017Sdim/// table providing type signatures for all runtime library functions that LLVM
16317017Sdim/// uses.
17317017Sdim///
18317017Sdim/// This is currently a fairly heavy-handed solution.
19317017Sdim///
20317017Sdim//===----------------------------------------------------------------------===//
21317017Sdim
22317017Sdim#include "WebAssemblyRuntimeLibcallSignatures.h"
23317017Sdim#include "WebAssemblySubtarget.h"
24317017Sdim#include "llvm/CodeGen/RuntimeLibcalls.h"
25341825Sdim#include "llvm/Support/ManagedStatic.h"
26317017Sdim
27317017Sdimusing namespace llvm;
28317017Sdim
29317017Sdimnamespace {
30317017Sdim
31317017Sdimenum RuntimeLibcallSignature {
32317017Sdim  func,
33317017Sdim  f32_func_f32,
34317017Sdim  f32_func_f64,
35317017Sdim  f32_func_i32,
36317017Sdim  f32_func_i64,
37317017Sdim  f32_func_i16,
38317017Sdim  f64_func_f32,
39317017Sdim  f64_func_f64,
40317017Sdim  f64_func_i32,
41317017Sdim  f64_func_i64,
42317017Sdim  i32_func_f32,
43317017Sdim  i32_func_f64,
44317017Sdim  i32_func_i32,
45317017Sdim  i64_func_f32,
46317017Sdim  i64_func_f64,
47317017Sdim  i64_func_i64,
48317017Sdim  f32_func_f32_f32,
49317017Sdim  f32_func_f32_i32,
50317017Sdim  f32_func_i64_i64,
51317017Sdim  f64_func_f64_f64,
52317017Sdim  f64_func_f64_i32,
53317017Sdim  f64_func_i64_i64,
54317017Sdim  i16_func_f32,
55317017Sdim  i8_func_i8_i8,
56317017Sdim  func_f32_iPTR_iPTR,
57317017Sdim  func_f64_iPTR_iPTR,
58317017Sdim  i16_func_i16_i16,
59317017Sdim  i32_func_f32_f32,
60317017Sdim  i32_func_f64_f64,
61317017Sdim  i32_func_i32_i32,
62341825Sdim  i32_func_i32_i32_iPTR,
63317017Sdim  i64_func_i64_i64,
64341825Sdim  i64_func_i64_i64_iPTR,
65317017Sdim  i64_i64_func_f32,
66317017Sdim  i64_i64_func_f64,
67317017Sdim  i16_i16_func_i16_i16,
68317017Sdim  i32_i32_func_i32_i32,
69317017Sdim  i64_i64_func_i64_i64,
70317017Sdim  i64_i64_func_i64_i64_i64_i64,
71341825Sdim  i64_i64_func_i64_i64_i64_i64_iPTR,
72317017Sdim  i64_i64_i64_i64_func_i64_i64_i64_i64,
73317017Sdim  i64_i64_func_i64_i64_i32,
74317017Sdim  iPTR_func_iPTR_i32_iPTR,
75317017Sdim  iPTR_func_iPTR_iPTR_iPTR,
76317017Sdim  f32_func_f32_f32_f32,
77317017Sdim  f64_func_f64_f64_f64,
78317017Sdim  func_i64_i64_iPTR_iPTR,
79317017Sdim  func_iPTR_f32,
80317017Sdim  func_iPTR_f64,
81317017Sdim  func_iPTR_i32,
82317017Sdim  func_iPTR_i64,
83317017Sdim  func_iPTR_i64_i64,
84317017Sdim  func_iPTR_i64_i64_i64_i64,
85317017Sdim  func_iPTR_i64_i64_i64_i64_i64_i64,
86317017Sdim  i32_func_i64_i64,
87317017Sdim  i32_func_i64_i64_i64_i64,
88317017Sdim  unsupported
89317017Sdim};
90317017Sdim
91317017Sdim
92341825Sdimstruct RuntimeLibcallSignatureTable {
93341825Sdim  std::vector<RuntimeLibcallSignature> Table;
94317017Sdim
95341825Sdim  // Any newly-added libcalls will be unsupported by default.
96341825Sdim  RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
97341825Sdim    // Integer
98341825Sdim    Table[RTLIB::SHL_I16] = i16_func_i16_i16;
99341825Sdim    Table[RTLIB::SHL_I32] = i32_func_i32_i32;
100341825Sdim    Table[RTLIB::SHL_I64] = i64_func_i64_i64;
101341825Sdim    Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
102341825Sdim    Table[RTLIB::SRL_I16] = i16_func_i16_i16;
103341825Sdim    Table[RTLIB::SRL_I32] = i32_func_i32_i32;
104341825Sdim    Table[RTLIB::SRL_I64] = i64_func_i64_i64;
105341825Sdim    Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
106341825Sdim    Table[RTLIB::SRA_I16] = i16_func_i16_i16;
107341825Sdim    Table[RTLIB::SRA_I32] = i32_func_i32_i32;
108341825Sdim    Table[RTLIB::SRA_I64] = i64_func_i64_i64;
109341825Sdim    Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
110341825Sdim    Table[RTLIB::MUL_I8] = i8_func_i8_i8;
111341825Sdim    Table[RTLIB::MUL_I16] = i16_func_i16_i16;
112341825Sdim    Table[RTLIB::MUL_I32] = i32_func_i32_i32;
113341825Sdim    Table[RTLIB::MUL_I64] = i64_func_i64_i64;
114341825Sdim    Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
115341825Sdim    Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
116341825Sdim    Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
117341825Sdim    Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
118341825Sdim    Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
119341825Sdim    Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
120341825Sdim    Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
121341825Sdim    Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
122341825Sdim    Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
123341825Sdim    Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
124341825Sdim    Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
125341825Sdim    Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
126341825Sdim    Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
127341825Sdim    Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
128341825Sdim    Table[RTLIB::SREM_I8] = i8_func_i8_i8;
129341825Sdim    Table[RTLIB::SREM_I16] = i16_func_i16_i16;
130341825Sdim    Table[RTLIB::SREM_I32] = i32_func_i32_i32;
131341825Sdim    Table[RTLIB::SREM_I64] = i64_func_i64_i64;
132341825Sdim    Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
133341825Sdim    Table[RTLIB::UREM_I8] = i8_func_i8_i8;
134341825Sdim    Table[RTLIB::UREM_I16] = i16_func_i16_i16;
135341825Sdim    Table[RTLIB::UREM_I32] = i32_func_i32_i32;
136341825Sdim    Table[RTLIB::UREM_I64] = i64_func_i64_i64;
137341825Sdim    Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
138341825Sdim    Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
139341825Sdim    Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
140341825Sdim    Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
141341825Sdim    Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
142341825Sdim    Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
143341825Sdim    Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
144341825Sdim    Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
145341825Sdim    Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
146341825Sdim    Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
147341825Sdim    Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
148341825Sdim    Table[RTLIB::NEG_I32] = i32_func_i32;
149341825Sdim    Table[RTLIB::NEG_I64] = i64_func_i64;
150317017Sdim
151341825Sdim    // Floating-point.
152341825Sdim    // All F80 and PPCF128 routines are unsupported.
153341825Sdim    Table[RTLIB::ADD_F32] = f32_func_f32_f32;
154341825Sdim    Table[RTLIB::ADD_F64] = f64_func_f64_f64;
155341825Sdim    Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
156341825Sdim    Table[RTLIB::SUB_F32] = f32_func_f32_f32;
157341825Sdim    Table[RTLIB::SUB_F64] = f64_func_f64_f64;
158341825Sdim    Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
159341825Sdim    Table[RTLIB::MUL_F32] = f32_func_f32_f32;
160341825Sdim    Table[RTLIB::MUL_F64] = f64_func_f64_f64;
161341825Sdim    Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
162341825Sdim    Table[RTLIB::DIV_F32] = f32_func_f32_f32;
163341825Sdim    Table[RTLIB::DIV_F64] = f64_func_f64_f64;
164341825Sdim    Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
165341825Sdim    Table[RTLIB::REM_F32] = f32_func_f32_f32;
166341825Sdim    Table[RTLIB::REM_F64] = f64_func_f64_f64;
167341825Sdim    Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
168341825Sdim    Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
169341825Sdim    Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
170341825Sdim    Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
171341825Sdim    Table[RTLIB::POWI_F32] = f32_func_f32_i32;
172341825Sdim    Table[RTLIB::POWI_F64] = f64_func_f64_i32;
173341825Sdim    Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64;
174341825Sdim    Table[RTLIB::SQRT_F32] = f32_func_f32;
175341825Sdim    Table[RTLIB::SQRT_F64] = f64_func_f64;
176341825Sdim    Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
177341825Sdim    Table[RTLIB::LOG_F32] = f32_func_f32;
178341825Sdim    Table[RTLIB::LOG_F64] = f64_func_f64;
179341825Sdim    Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
180341825Sdim    Table[RTLIB::LOG2_F32] = f32_func_f32;
181341825Sdim    Table[RTLIB::LOG2_F64] = f64_func_f64;
182341825Sdim    Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
183341825Sdim    Table[RTLIB::LOG10_F32] = f32_func_f32;
184341825Sdim    Table[RTLIB::LOG10_F64] = f64_func_f64;
185341825Sdim    Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
186341825Sdim    Table[RTLIB::EXP_F32] = f32_func_f32;
187341825Sdim    Table[RTLIB::EXP_F64] = f64_func_f64;
188341825Sdim    Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
189341825Sdim    Table[RTLIB::EXP2_F32] = f32_func_f32;
190341825Sdim    Table[RTLIB::EXP2_F64] = f64_func_f64;
191341825Sdim    Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
192341825Sdim    Table[RTLIB::SIN_F32] = f32_func_f32;
193341825Sdim    Table[RTLIB::SIN_F64] = f64_func_f64;
194341825Sdim    Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
195341825Sdim    Table[RTLIB::COS_F32] = f32_func_f32;
196341825Sdim    Table[RTLIB::COS_F64] = f64_func_f64;
197341825Sdim    Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
198341825Sdim    Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
199341825Sdim    Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
200341825Sdim    Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
201341825Sdim    Table[RTLIB::POW_F32] = f32_func_f32_f32;
202341825Sdim    Table[RTLIB::POW_F64] = f64_func_f64_f64;
203341825Sdim    Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
204341825Sdim    Table[RTLIB::CEIL_F32] = f32_func_f32;
205341825Sdim    Table[RTLIB::CEIL_F64] = f64_func_f64;
206341825Sdim    Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
207341825Sdim    Table[RTLIB::TRUNC_F32] = f32_func_f32;
208341825Sdim    Table[RTLIB::TRUNC_F64] = f64_func_f64;
209341825Sdim    Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
210341825Sdim    Table[RTLIB::RINT_F32] = f32_func_f32;
211341825Sdim    Table[RTLIB::RINT_F64] = f64_func_f64;
212341825Sdim    Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
213341825Sdim    Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
214341825Sdim    Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
215341825Sdim    Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
216341825Sdim    Table[RTLIB::ROUND_F32] = f32_func_f32;
217341825Sdim    Table[RTLIB::ROUND_F64] = f64_func_f64;
218341825Sdim    Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
219341825Sdim    Table[RTLIB::FLOOR_F32] = f32_func_f32;
220341825Sdim    Table[RTLIB::FLOOR_F64] = f64_func_f64;
221341825Sdim    Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
222341825Sdim    Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
223341825Sdim    Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
224341825Sdim    Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
225341825Sdim    Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
226341825Sdim    Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
227341825Sdim    Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
228341825Sdim    Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
229341825Sdim    Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
230341825Sdim    Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
231317017Sdim
232341825Sdim    // Conversion
233341825Sdim    // All F80 and PPCF128 routines are unspported.
234341825Sdim    Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
235341825Sdim    Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
236341825Sdim    Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
237341825Sdim    Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
238341825Sdim    Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
239341825Sdim    Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
240341825Sdim    Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
241341825Sdim    Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
242341825Sdim    Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
243341825Sdim    Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
244341825Sdim    Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
245341825Sdim    Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
246341825Sdim    Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
247341825Sdim    Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
248341825Sdim    Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
249341825Sdim    Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
250341825Sdim    Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
251341825Sdim    Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
252341825Sdim    Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
253341825Sdim    Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
254341825Sdim    Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
255341825Sdim    Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
256341825Sdim    Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
257341825Sdim    Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
258341825Sdim    Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
259341825Sdim    Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
260341825Sdim    Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
261341825Sdim    Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
262341825Sdim    Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
263341825Sdim    Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
264341825Sdim    Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
265341825Sdim    Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
266341825Sdim    Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
267341825Sdim    Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
268341825Sdim    Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
269341825Sdim    Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
270341825Sdim    Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
271341825Sdim    Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
272341825Sdim    Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
273341825Sdim    Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
274341825Sdim    Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
275341825Sdim    Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
276341825Sdim    Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
277341825Sdim    Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
278317017Sdim
279341825Sdim    // Comparison
280341825Sdim    // ALl F80 and PPCF128 routines are unsupported.
281341825Sdim    Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
282341825Sdim    Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
283341825Sdim    Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
284341825Sdim    Table[RTLIB::UNE_F32] = i32_func_f32_f32;
285341825Sdim    Table[RTLIB::UNE_F64] = i32_func_f64_f64;
286341825Sdim    Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
287341825Sdim    Table[RTLIB::OGE_F32] = i32_func_f32_f32;
288341825Sdim    Table[RTLIB::OGE_F64] = i32_func_f64_f64;
289341825Sdim    Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
290341825Sdim    Table[RTLIB::OLT_F32] = i32_func_f32_f32;
291341825Sdim    Table[RTLIB::OLT_F64] = i32_func_f64_f64;
292341825Sdim    Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
293341825Sdim    Table[RTLIB::OLE_F32] = i32_func_f32_f32;
294341825Sdim    Table[RTLIB::OLE_F64] = i32_func_f64_f64;
295341825Sdim    Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
296341825Sdim    Table[RTLIB::OGT_F32] = i32_func_f32_f32;
297341825Sdim    Table[RTLIB::OGT_F64] = i32_func_f64_f64;
298341825Sdim    Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
299341825Sdim    Table[RTLIB::UO_F32] = i32_func_f32_f32;
300341825Sdim    Table[RTLIB::UO_F64] = i32_func_f64_f64;
301341825Sdim    Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
302341825Sdim    // O_FXX has the weird property that it uses the same libcall name as UO_FXX
303341825Sdim    // This breaks our name-based lookup. Fortunately only the UO family of
304341825Sdim    // libcalls appears to be actually used.
305341825Sdim    Table[RTLIB::O_F32] = unsupported;
306341825Sdim    Table[RTLIB::O_F64] = unsupported;
307341825Sdim    Table[RTLIB::O_F128] = unsupported;
308317017Sdim
309341825Sdim    // Memory
310341825Sdim    Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
311341825Sdim    Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
312341825Sdim    Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
313317017Sdim
314341825Sdim    // Element-wise Atomic memory
315341825Sdim    // TODO: Fix these when we implement atomic support
316341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
317341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
318341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
319341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
320341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
321341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
322341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
323341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
324341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
325341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
326320970Sdim
327341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
328341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
329341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
330341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
331341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
332317017Sdim
333341825Sdim    // Atomic '__sync_*' libcalls.
334341825Sdim    // TODO: Fix these when we implement atomic support
335341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
336341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
337341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
338341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
339341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
340341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
341341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
342341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
343341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
344341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
345341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
346341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
347341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
348341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
349341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
350341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
351341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
352341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
353341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
354341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
355341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
356341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
357341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
358341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
359341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
360341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
361341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
362341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
363341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
364341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
365341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
366341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
367341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
368341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
369341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
370341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
371341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
372341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
373341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
374341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
375341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
376341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
377341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
378341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
379341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
380341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
381341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
382341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
383341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
384341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
385341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
386341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
387341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
388341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
389341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
390341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
391341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
392341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
393341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
394341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
395317017Sdim
396341825Sdim    // Atomic '__atomic_*' libcalls.
397341825Sdim    // TODO: Fix these when we implement atomic support
398341825Sdim    Table[RTLIB::ATOMIC_LOAD] = unsupported;
399341825Sdim    Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
400341825Sdim    Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
401341825Sdim    Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
402341825Sdim    Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
403341825Sdim    Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
404317017Sdim
405341825Sdim    Table[RTLIB::ATOMIC_STORE] = unsupported;
406341825Sdim    Table[RTLIB::ATOMIC_STORE_1] = unsupported;
407341825Sdim    Table[RTLIB::ATOMIC_STORE_2] = unsupported;
408341825Sdim    Table[RTLIB::ATOMIC_STORE_4] = unsupported;
409341825Sdim    Table[RTLIB::ATOMIC_STORE_8] = unsupported;
410341825Sdim    Table[RTLIB::ATOMIC_STORE_16] = unsupported;
411317017Sdim
412341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
413341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
414341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
415341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
416341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
417341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
418317017Sdim
419341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
420341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
421341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
422341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
423341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
424341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
425317017Sdim
426341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
427341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
428341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
429341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
430341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
431317017Sdim
432341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
433341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
434341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
435341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
436341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
437317017Sdim
438341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
439341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
440341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
441341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
442341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
443317017Sdim
444341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
445341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
446341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
447341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
448341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
449317017Sdim
450341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
451341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
452341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
453341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
454341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
455317017Sdim
456341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
457341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
458341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
459341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
460341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
461341825Sdim  }
462341825Sdim};
463317017Sdim
464341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
465317017Sdim
466341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a
467341825Sdim// constructor for use with ManagedStatic
468341825Sdimstruct StaticLibcallNameMap {
469341825Sdim  StringMap<RTLIB::Libcall> Map;
470341825Sdim  StaticLibcallNameMap() {
471341825Sdim    static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
472341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
473341825Sdim#include "llvm/IR/RuntimeLibcalls.def"
474341825Sdim#undef HANDLE_LIBCALL
475341825Sdim    };
476341825Sdim    for (const auto &NameLibcall : NameLibcalls) {
477341825Sdim      if (NameLibcall.first != nullptr &&
478341825Sdim          RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
479341825Sdim        assert(Map.find(NameLibcall.first) == Map.end() &&
480341825Sdim               "duplicate libcall names in name map");
481341825Sdim        Map[NameLibcall.first] = NameLibcall.second;
482341825Sdim      }
483341825Sdim    }
484341825Sdim  }
485317017Sdim};
486317017Sdim
487341825Sdim} // end anonymous namespace
488317017Sdim
489317017Sdim
490317017Sdim
491317017Sdimvoid llvm::GetSignature(const WebAssemblySubtarget &Subtarget,
492317017Sdim                        RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
493317017Sdim                        SmallVectorImpl<wasm::ValType> &Params) {
494317017Sdim  assert(Rets.empty());
495317017Sdim  assert(Params.empty());
496317017Sdim
497341825Sdim  wasm::ValType iPTR =
498341825Sdim      Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
499317017Sdim
500341825Sdim  auto& Table = RuntimeLibcallSignatures->Table;
501341825Sdim  switch (Table[LC]) {
502317017Sdim  case func:
503317017Sdim    break;
504317017Sdim  case f32_func_f32:
505317017Sdim    Rets.push_back(wasm::ValType::F32);
506317017Sdim    Params.push_back(wasm::ValType::F32);
507317017Sdim    break;
508317017Sdim  case f32_func_f64:
509317017Sdim    Rets.push_back(wasm::ValType::F32);
510317017Sdim    Params.push_back(wasm::ValType::F64);
511317017Sdim    break;
512317017Sdim  case f32_func_i32:
513317017Sdim    Rets.push_back(wasm::ValType::F32);
514317017Sdim    Params.push_back(wasm::ValType::I32);
515317017Sdim    break;
516317017Sdim  case f32_func_i64:
517317017Sdim    Rets.push_back(wasm::ValType::F32);
518317017Sdim    Params.push_back(wasm::ValType::I64);
519317017Sdim    break;
520317017Sdim  case f32_func_i16:
521317017Sdim    Rets.push_back(wasm::ValType::F32);
522317017Sdim    Params.push_back(wasm::ValType::I32);
523317017Sdim    break;
524317017Sdim  case f64_func_f32:
525317017Sdim    Rets.push_back(wasm::ValType::F64);
526317017Sdim    Params.push_back(wasm::ValType::F32);
527317017Sdim    break;
528317017Sdim  case f64_func_f64:
529317017Sdim    Rets.push_back(wasm::ValType::F64);
530317017Sdim    Params.push_back(wasm::ValType::F64);
531317017Sdim    break;
532317017Sdim  case f64_func_i32:
533317017Sdim    Rets.push_back(wasm::ValType::F64);
534317017Sdim    Params.push_back(wasm::ValType::I32);
535317017Sdim    break;
536317017Sdim  case f64_func_i64:
537317017Sdim    Rets.push_back(wasm::ValType::F64);
538317017Sdim    Params.push_back(wasm::ValType::I64);
539317017Sdim    break;
540317017Sdim  case i32_func_f32:
541317017Sdim    Rets.push_back(wasm::ValType::I32);
542317017Sdim    Params.push_back(wasm::ValType::F32);
543317017Sdim    break;
544317017Sdim  case i32_func_f64:
545317017Sdim    Rets.push_back(wasm::ValType::I32);
546317017Sdim    Params.push_back(wasm::ValType::F64);
547317017Sdim    break;
548317017Sdim  case i32_func_i32:
549317017Sdim    Rets.push_back(wasm::ValType::I32);
550317017Sdim    Params.push_back(wasm::ValType::I32);
551317017Sdim    break;
552317017Sdim  case i64_func_f32:
553317017Sdim    Rets.push_back(wasm::ValType::I64);
554317017Sdim    Params.push_back(wasm::ValType::F32);
555317017Sdim    break;
556317017Sdim  case i64_func_f64:
557317017Sdim    Rets.push_back(wasm::ValType::I64);
558317017Sdim    Params.push_back(wasm::ValType::F64);
559317017Sdim    break;
560317017Sdim  case i64_func_i64:
561317017Sdim    Rets.push_back(wasm::ValType::I64);
562317017Sdim    Params.push_back(wasm::ValType::I64);
563317017Sdim    break;
564317017Sdim  case f32_func_f32_f32:
565317017Sdim    Rets.push_back(wasm::ValType::F32);
566317017Sdim    Params.push_back(wasm::ValType::F32);
567317017Sdim    Params.push_back(wasm::ValType::F32);
568317017Sdim    break;
569317017Sdim  case f32_func_f32_i32:
570317017Sdim    Rets.push_back(wasm::ValType::F32);
571317017Sdim    Params.push_back(wasm::ValType::F32);
572317017Sdim    Params.push_back(wasm::ValType::I32);
573317017Sdim    break;
574317017Sdim  case f32_func_i64_i64:
575317017Sdim    Rets.push_back(wasm::ValType::F32);
576317017Sdim    Params.push_back(wasm::ValType::I64);
577317017Sdim    Params.push_back(wasm::ValType::I64);
578317017Sdim    break;
579317017Sdim  case f64_func_f64_f64:
580317017Sdim    Rets.push_back(wasm::ValType::F64);
581317017Sdim    Params.push_back(wasm::ValType::F64);
582317017Sdim    Params.push_back(wasm::ValType::F64);
583317017Sdim    break;
584317017Sdim  case f64_func_f64_i32:
585317017Sdim    Rets.push_back(wasm::ValType::F64);
586317017Sdim    Params.push_back(wasm::ValType::F64);
587317017Sdim    Params.push_back(wasm::ValType::I32);
588317017Sdim    break;
589317017Sdim  case f64_func_i64_i64:
590317017Sdim    Rets.push_back(wasm::ValType::F64);
591317017Sdim    Params.push_back(wasm::ValType::I64);
592317017Sdim    Params.push_back(wasm::ValType::I64);
593317017Sdim    break;
594317017Sdim  case i16_func_f32:
595317017Sdim    Rets.push_back(wasm::ValType::I32);
596317017Sdim    Params.push_back(wasm::ValType::F32);
597317017Sdim    break;
598317017Sdim  case i8_func_i8_i8:
599317017Sdim    Rets.push_back(wasm::ValType::I32);
600317017Sdim    Params.push_back(wasm::ValType::I32);
601317017Sdim    Params.push_back(wasm::ValType::I32);
602317017Sdim    break;
603317017Sdim  case func_f32_iPTR_iPTR:
604317017Sdim    Params.push_back(wasm::ValType::F32);
605341825Sdim    Params.push_back(iPTR);
606341825Sdim    Params.push_back(iPTR);
607317017Sdim    break;
608317017Sdim  case func_f64_iPTR_iPTR:
609317017Sdim    Params.push_back(wasm::ValType::F64);
610341825Sdim    Params.push_back(iPTR);
611341825Sdim    Params.push_back(iPTR);
612317017Sdim    break;
613317017Sdim  case i16_func_i16_i16:
614317017Sdim    Rets.push_back(wasm::ValType::I32);
615317017Sdim    Params.push_back(wasm::ValType::I32);
616317017Sdim    Params.push_back(wasm::ValType::I32);
617317017Sdim    break;
618317017Sdim  case i32_func_f32_f32:
619317017Sdim    Rets.push_back(wasm::ValType::I32);
620317017Sdim    Params.push_back(wasm::ValType::F32);
621317017Sdim    Params.push_back(wasm::ValType::F32);
622317017Sdim    break;
623317017Sdim  case i32_func_f64_f64:
624317017Sdim    Rets.push_back(wasm::ValType::I32);
625317017Sdim    Params.push_back(wasm::ValType::F64);
626317017Sdim    Params.push_back(wasm::ValType::F64);
627317017Sdim    break;
628317017Sdim  case i32_func_i32_i32:
629317017Sdim    Rets.push_back(wasm::ValType::I32);
630317017Sdim    Params.push_back(wasm::ValType::I32);
631317017Sdim    Params.push_back(wasm::ValType::I32);
632317017Sdim    break;
633341825Sdim  case i32_func_i32_i32_iPTR:
634341825Sdim    Rets.push_back(wasm::ValType::I32);
635341825Sdim    Params.push_back(wasm::ValType::I32);
636341825Sdim    Params.push_back(wasm::ValType::I32);
637341825Sdim    Params.push_back(iPTR);
638341825Sdim    break;
639317017Sdim  case i64_func_i64_i64:
640317017Sdim    Rets.push_back(wasm::ValType::I64);
641317017Sdim    Params.push_back(wasm::ValType::I64);
642317017Sdim    Params.push_back(wasm::ValType::I64);
643317017Sdim    break;
644341825Sdim  case i64_func_i64_i64_iPTR:
645341825Sdim    Rets.push_back(wasm::ValType::I64);
646341825Sdim    Params.push_back(wasm::ValType::I64);
647341825Sdim    Params.push_back(wasm::ValType::I64);
648341825Sdim    Params.push_back(iPTR);
649341825Sdim    break;
650317017Sdim  case i64_i64_func_f32:
651317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
652317017Sdim    Rets.push_back(wasm::ValType::I64);
653317017Sdim    Rets.push_back(wasm::ValType::I64);
654317017Sdim#else
655341825Sdim    Params.push_back(iPTR);
656317017Sdim#endif
657317017Sdim    Params.push_back(wasm::ValType::F32);
658317017Sdim    break;
659317017Sdim  case i64_i64_func_f64:
660317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
661317017Sdim    Rets.push_back(wasm::ValType::I64);
662317017Sdim    Rets.push_back(wasm::ValType::I64);
663317017Sdim#else
664341825Sdim    Params.push_back(iPTR);
665317017Sdim#endif
666317017Sdim    Params.push_back(wasm::ValType::F64);
667317017Sdim    break;
668317017Sdim  case i16_i16_func_i16_i16:
669317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
670317017Sdim    Rets.push_back(wasm::ValType::I32);
671317017Sdim    Rets.push_back(wasm::ValType::I32);
672317017Sdim#else
673341825Sdim    Params.push_back(iPTR);
674317017Sdim#endif
675317017Sdim    Params.push_back(wasm::ValType::I32);
676317017Sdim    Params.push_back(wasm::ValType::I32);
677317017Sdim    break;
678317017Sdim  case i32_i32_func_i32_i32:
679317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
680317017Sdim    Rets.push_back(wasm::ValType::I32);
681317017Sdim    Rets.push_back(wasm::ValType::I32);
682317017Sdim#else
683341825Sdim    Params.push_back(iPTR);
684317017Sdim#endif
685317017Sdim    Params.push_back(wasm::ValType::I32);
686317017Sdim    Params.push_back(wasm::ValType::I32);
687317017Sdim    break;
688317017Sdim  case i64_i64_func_i64_i64:
689317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
690317017Sdim    Rets.push_back(wasm::ValType::I64);
691317017Sdim    Rets.push_back(wasm::ValType::I64);
692317017Sdim#else
693341825Sdim    Params.push_back(iPTR);
694317017Sdim#endif
695317017Sdim    Params.push_back(wasm::ValType::I64);
696317017Sdim    Params.push_back(wasm::ValType::I64);
697317017Sdim    break;
698317017Sdim  case i64_i64_func_i64_i64_i64_i64:
699317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
700317017Sdim    Rets.push_back(wasm::ValType::I64);
701317017Sdim    Rets.push_back(wasm::ValType::I64);
702317017Sdim#else
703341825Sdim    Params.push_back(iPTR);
704317017Sdim#endif
705317017Sdim    Params.push_back(wasm::ValType::I64);
706317017Sdim    Params.push_back(wasm::ValType::I64);
707317017Sdim    Params.push_back(wasm::ValType::I64);
708317017Sdim    Params.push_back(wasm::ValType::I64);
709317017Sdim    break;
710341825Sdim  case i64_i64_func_i64_i64_i64_i64_iPTR:
711341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
712341825Sdim    Rets.push_back(wasm::ValType::I64);
713341825Sdim    Rets.push_back(wasm::ValType::I64);
714341825Sdim#else
715341825Sdim    Params.push_back(iPTR);
716341825Sdim#endif
717341825Sdim    Params.push_back(wasm::ValType::I64);
718341825Sdim    Params.push_back(wasm::ValType::I64);
719341825Sdim    Params.push_back(wasm::ValType::I64);
720341825Sdim    Params.push_back(wasm::ValType::I64);
721341825Sdim    Params.push_back(iPTR);
722341825Sdim    break;
723317017Sdim  case i64_i64_i64_i64_func_i64_i64_i64_i64:
724317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
725317017Sdim    Rets.push_back(wasm::ValType::I64);
726317017Sdim    Rets.push_back(wasm::ValType::I64);
727317017Sdim    Rets.push_back(wasm::ValType::I64);
728317017Sdim    Rets.push_back(wasm::ValType::I64);
729317017Sdim#else
730341825Sdim    Params.push_back(iPTR);
731317017Sdim#endif
732317017Sdim    Params.push_back(wasm::ValType::I64);
733317017Sdim    Params.push_back(wasm::ValType::I64);
734317017Sdim    Params.push_back(wasm::ValType::I64);
735317017Sdim    Params.push_back(wasm::ValType::I64);
736317017Sdim    break;
737317017Sdim  case i64_i64_func_i64_i64_i32:
738317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
739317017Sdim    Rets.push_back(wasm::ValType::I64);
740317017Sdim    Rets.push_back(wasm::ValType::I64);
741317017Sdim    Rets.push_back(wasm::ValType::I64);
742317017Sdim    Rets.push_back(wasm::ValType::I64);
743317017Sdim#else
744341825Sdim    Params.push_back(iPTR);
745317017Sdim#endif
746317017Sdim    Params.push_back(wasm::ValType::I64);
747317017Sdim    Params.push_back(wasm::ValType::I64);
748317017Sdim    Params.push_back(wasm::ValType::I32);
749317017Sdim    break;
750317017Sdim  case iPTR_func_iPTR_i32_iPTR:
751341825Sdim    Rets.push_back(iPTR);
752341825Sdim    Params.push_back(iPTR);
753317017Sdim    Params.push_back(wasm::ValType::I32);
754341825Sdim    Params.push_back(iPTR);
755317017Sdim    break;
756317017Sdim  case iPTR_func_iPTR_iPTR_iPTR:
757341825Sdim    Rets.push_back(iPTR);
758341825Sdim    Params.push_back(iPTR);
759341825Sdim    Params.push_back(iPTR);
760341825Sdim    Params.push_back(iPTR);
761317017Sdim    break;
762317017Sdim  case f32_func_f32_f32_f32:
763317017Sdim    Rets.push_back(wasm::ValType::F32);
764317017Sdim    Params.push_back(wasm::ValType::F32);
765317017Sdim    Params.push_back(wasm::ValType::F32);
766317017Sdim    Params.push_back(wasm::ValType::F32);
767317017Sdim    break;
768317017Sdim  case f64_func_f64_f64_f64:
769317017Sdim    Rets.push_back(wasm::ValType::F64);
770317017Sdim    Params.push_back(wasm::ValType::F64);
771317017Sdim    Params.push_back(wasm::ValType::F64);
772317017Sdim    Params.push_back(wasm::ValType::F64);
773317017Sdim    break;
774317017Sdim  case func_i64_i64_iPTR_iPTR:
775317017Sdim    Params.push_back(wasm::ValType::I64);
776317017Sdim    Params.push_back(wasm::ValType::I64);
777341825Sdim    Params.push_back(iPTR);
778341825Sdim    Params.push_back(iPTR);
779317017Sdim    break;
780317017Sdim  case func_iPTR_f32:
781341825Sdim    Params.push_back(iPTR);
782317017Sdim    Params.push_back(wasm::ValType::F32);
783317017Sdim    break;
784317017Sdim  case func_iPTR_f64:
785341825Sdim    Params.push_back(iPTR);
786317017Sdim    Params.push_back(wasm::ValType::F64);
787317017Sdim    break;
788317017Sdim  case func_iPTR_i32:
789341825Sdim    Params.push_back(iPTR);
790317017Sdim    Params.push_back(wasm::ValType::I32);
791317017Sdim    break;
792317017Sdim  case func_iPTR_i64:
793341825Sdim    Params.push_back(iPTR);
794317017Sdim    Params.push_back(wasm::ValType::I64);
795317017Sdim    break;
796317017Sdim  case func_iPTR_i64_i64:
797341825Sdim    Params.push_back(iPTR);
798317017Sdim    Params.push_back(wasm::ValType::I64);
799317017Sdim    Params.push_back(wasm::ValType::I64);
800317017Sdim    break;
801317017Sdim  case func_iPTR_i64_i64_i64_i64:
802341825Sdim    Params.push_back(iPTR);
803317017Sdim    Params.push_back(wasm::ValType::I64);
804317017Sdim    Params.push_back(wasm::ValType::I64);
805317017Sdim    Params.push_back(wasm::ValType::I64);
806317017Sdim    Params.push_back(wasm::ValType::I64);
807317017Sdim    break;
808317017Sdim  case func_iPTR_i64_i64_i64_i64_i64_i64:
809341825Sdim    Params.push_back(iPTR);
810317017Sdim    Params.push_back(wasm::ValType::I64);
811317017Sdim    Params.push_back(wasm::ValType::I64);
812317017Sdim    Params.push_back(wasm::ValType::I64);
813317017Sdim    Params.push_back(wasm::ValType::I64);
814317017Sdim    Params.push_back(wasm::ValType::I64);
815317017Sdim    Params.push_back(wasm::ValType::I64);
816317017Sdim    break;
817317017Sdim  case i32_func_i64_i64:
818317017Sdim    Rets.push_back(wasm::ValType::I32);
819317017Sdim    Params.push_back(wasm::ValType::I64);
820317017Sdim    Params.push_back(wasm::ValType::I64);
821317017Sdim    break;
822317017Sdim  case i32_func_i64_i64_i64_i64:
823317017Sdim    Rets.push_back(wasm::ValType::I32);
824317017Sdim    Params.push_back(wasm::ValType::I64);
825317017Sdim    Params.push_back(wasm::ValType::I64);
826317017Sdim    Params.push_back(wasm::ValType::I64);
827317017Sdim    Params.push_back(wasm::ValType::I64);
828317017Sdim    break;
829317017Sdim  case unsupported:
830317017Sdim    llvm_unreachable("unsupported runtime library signature");
831317017Sdim  }
832317017Sdim}
833317017Sdim
834341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
835341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
836341825Sdim// other than here, just roll its logic into this version.
837317017Sdimvoid llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
838317017Sdim                        SmallVectorImpl<wasm::ValType> &Rets,
839317017Sdim                        SmallVectorImpl<wasm::ValType> &Params) {
840341825Sdim  auto& Map = LibcallNameMap->Map;
841341825Sdim  auto val = Map.find(Name);
842341825Sdim  assert(val != Map.end() && "unexpected runtime library name");
843341825Sdim  return GetSignature(Subtarget, val->second, Rets, Params);
844317017Sdim}
845