WebAssemblyRuntimeLibcallSignatures.cpp revision 353358
1317017Sdim// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
2317017Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6317017Sdim//
7317017Sdim//===----------------------------------------------------------------------===//
8317017Sdim///
9317017Sdim/// \file
10341825Sdim/// This file contains signature information for runtime libcalls.
11317017Sdim///
12317017Sdim/// CodeGen uses external symbols, which it refers to by name. The WebAssembly
13317017Sdim/// target needs type information for all functions. This file contains a big
14317017Sdim/// table providing type signatures for all runtime library functions that LLVM
15317017Sdim/// uses.
16317017Sdim///
17317017Sdim/// This is currently a fairly heavy-handed solution.
18317017Sdim///
19317017Sdim//===----------------------------------------------------------------------===//
20317017Sdim
21317017Sdim#include "WebAssemblyRuntimeLibcallSignatures.h"
22317017Sdim#include "WebAssemblySubtarget.h"
23317017Sdim#include "llvm/CodeGen/RuntimeLibcalls.h"
24341825Sdim#include "llvm/Support/ManagedStatic.h"
25317017Sdim
26317017Sdimusing namespace llvm;
27317017Sdim
28317017Sdimnamespace {
29317017Sdim
30317017Sdimenum RuntimeLibcallSignature {
31317017Sdim  func,
32317017Sdim  f32_func_f32,
33317017Sdim  f32_func_f64,
34317017Sdim  f32_func_i32,
35317017Sdim  f32_func_i64,
36317017Sdim  f32_func_i16,
37317017Sdim  f64_func_f32,
38317017Sdim  f64_func_f64,
39317017Sdim  f64_func_i32,
40317017Sdim  f64_func_i64,
41317017Sdim  i32_func_f32,
42317017Sdim  i32_func_f64,
43317017Sdim  i32_func_i32,
44317017Sdim  i64_func_f32,
45317017Sdim  i64_func_f64,
46317017Sdim  i64_func_i64,
47317017Sdim  f32_func_f32_f32,
48317017Sdim  f32_func_f32_i32,
49317017Sdim  f32_func_i64_i64,
50317017Sdim  f64_func_f64_f64,
51317017Sdim  f64_func_f64_i32,
52317017Sdim  f64_func_i64_i64,
53317017Sdim  i16_func_f32,
54353358Sdim  i16_func_f64,
55353358Sdim  i16_func_i64_i64,
56317017Sdim  i8_func_i8_i8,
57317017Sdim  func_f32_iPTR_iPTR,
58317017Sdim  func_f64_iPTR_iPTR,
59317017Sdim  i16_func_i16_i16,
60317017Sdim  i32_func_f32_f32,
61317017Sdim  i32_func_f64_f64,
62317017Sdim  i32_func_i32_i32,
63341825Sdim  i32_func_i32_i32_iPTR,
64317017Sdim  i64_func_i64_i64,
65341825Sdim  i64_func_i64_i64_iPTR,
66317017Sdim  i64_i64_func_f32,
67317017Sdim  i64_i64_func_f64,
68317017Sdim  i16_i16_func_i16_i16,
69317017Sdim  i32_i32_func_i32_i32,
70317017Sdim  i64_i64_func_i64_i64,
71317017Sdim  i64_i64_func_i64_i64_i64_i64,
72341825Sdim  i64_i64_func_i64_i64_i64_i64_iPTR,
73317017Sdim  i64_i64_i64_i64_func_i64_i64_i64_i64,
74317017Sdim  i64_i64_func_i64_i64_i32,
75317017Sdim  iPTR_func_iPTR_i32_iPTR,
76317017Sdim  iPTR_func_iPTR_iPTR_iPTR,
77317017Sdim  f32_func_f32_f32_f32,
78317017Sdim  f64_func_f64_f64_f64,
79317017Sdim  func_i64_i64_iPTR_iPTR,
80317017Sdim  func_iPTR_f32,
81317017Sdim  func_iPTR_f64,
82317017Sdim  func_iPTR_i32,
83317017Sdim  func_iPTR_i64,
84317017Sdim  func_iPTR_i64_i64,
85317017Sdim  func_iPTR_i64_i64_i64_i64,
86317017Sdim  func_iPTR_i64_i64_i64_i64_i64_i64,
87317017Sdim  i32_func_i64_i64,
88317017Sdim  i32_func_i64_i64_i64_i64,
89353358Sdim  iPTR_func_f32,
90353358Sdim  iPTR_func_f64,
91353358Sdim  iPTR_func_i64_i64,
92317017Sdim  unsupported
93317017Sdim};
94317017Sdim
95341825Sdimstruct RuntimeLibcallSignatureTable {
96341825Sdim  std::vector<RuntimeLibcallSignature> Table;
97317017Sdim
98341825Sdim  // Any newly-added libcalls will be unsupported by default.
99341825Sdim  RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
100341825Sdim    // Integer
101341825Sdim    Table[RTLIB::SHL_I16] = i16_func_i16_i16;
102341825Sdim    Table[RTLIB::SHL_I32] = i32_func_i32_i32;
103341825Sdim    Table[RTLIB::SHL_I64] = i64_func_i64_i64;
104341825Sdim    Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
105341825Sdim    Table[RTLIB::SRL_I16] = i16_func_i16_i16;
106341825Sdim    Table[RTLIB::SRL_I32] = i32_func_i32_i32;
107341825Sdim    Table[RTLIB::SRL_I64] = i64_func_i64_i64;
108341825Sdim    Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
109341825Sdim    Table[RTLIB::SRA_I16] = i16_func_i16_i16;
110341825Sdim    Table[RTLIB::SRA_I32] = i32_func_i32_i32;
111341825Sdim    Table[RTLIB::SRA_I64] = i64_func_i64_i64;
112341825Sdim    Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
113341825Sdim    Table[RTLIB::MUL_I8] = i8_func_i8_i8;
114341825Sdim    Table[RTLIB::MUL_I16] = i16_func_i16_i16;
115341825Sdim    Table[RTLIB::MUL_I32] = i32_func_i32_i32;
116341825Sdim    Table[RTLIB::MUL_I64] = i64_func_i64_i64;
117341825Sdim    Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
118341825Sdim    Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
119341825Sdim    Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
120341825Sdim    Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
121341825Sdim    Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
122341825Sdim    Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
123341825Sdim    Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
124341825Sdim    Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
125341825Sdim    Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
126341825Sdim    Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
127341825Sdim    Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
128341825Sdim    Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
129341825Sdim    Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
130341825Sdim    Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
131341825Sdim    Table[RTLIB::SREM_I8] = i8_func_i8_i8;
132341825Sdim    Table[RTLIB::SREM_I16] = i16_func_i16_i16;
133341825Sdim    Table[RTLIB::SREM_I32] = i32_func_i32_i32;
134341825Sdim    Table[RTLIB::SREM_I64] = i64_func_i64_i64;
135341825Sdim    Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
136341825Sdim    Table[RTLIB::UREM_I8] = i8_func_i8_i8;
137341825Sdim    Table[RTLIB::UREM_I16] = i16_func_i16_i16;
138341825Sdim    Table[RTLIB::UREM_I32] = i32_func_i32_i32;
139341825Sdim    Table[RTLIB::UREM_I64] = i64_func_i64_i64;
140341825Sdim    Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
141341825Sdim    Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
142341825Sdim    Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
143341825Sdim    Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
144341825Sdim    Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
145341825Sdim    Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
146341825Sdim    Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
147341825Sdim    Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
148341825Sdim    Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
149341825Sdim    Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
150341825Sdim    Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
151341825Sdim    Table[RTLIB::NEG_I32] = i32_func_i32;
152341825Sdim    Table[RTLIB::NEG_I64] = i64_func_i64;
153317017Sdim
154341825Sdim    // Floating-point.
155341825Sdim    // All F80 and PPCF128 routines are unsupported.
156341825Sdim    Table[RTLIB::ADD_F32] = f32_func_f32_f32;
157341825Sdim    Table[RTLIB::ADD_F64] = f64_func_f64_f64;
158341825Sdim    Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
159341825Sdim    Table[RTLIB::SUB_F32] = f32_func_f32_f32;
160341825Sdim    Table[RTLIB::SUB_F64] = f64_func_f64_f64;
161341825Sdim    Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
162341825Sdim    Table[RTLIB::MUL_F32] = f32_func_f32_f32;
163341825Sdim    Table[RTLIB::MUL_F64] = f64_func_f64_f64;
164341825Sdim    Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
165341825Sdim    Table[RTLIB::DIV_F32] = f32_func_f32_f32;
166341825Sdim    Table[RTLIB::DIV_F64] = f64_func_f64_f64;
167341825Sdim    Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
168341825Sdim    Table[RTLIB::REM_F32] = f32_func_f32_f32;
169341825Sdim    Table[RTLIB::REM_F64] = f64_func_f64_f64;
170341825Sdim    Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
171341825Sdim    Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
172341825Sdim    Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
173341825Sdim    Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
174341825Sdim    Table[RTLIB::POWI_F32] = f32_func_f32_i32;
175341825Sdim    Table[RTLIB::POWI_F64] = f64_func_f64_i32;
176341825Sdim    Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64;
177341825Sdim    Table[RTLIB::SQRT_F32] = f32_func_f32;
178341825Sdim    Table[RTLIB::SQRT_F64] = f64_func_f64;
179341825Sdim    Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
180341825Sdim    Table[RTLIB::LOG_F32] = f32_func_f32;
181341825Sdim    Table[RTLIB::LOG_F64] = f64_func_f64;
182341825Sdim    Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
183341825Sdim    Table[RTLIB::LOG2_F32] = f32_func_f32;
184341825Sdim    Table[RTLIB::LOG2_F64] = f64_func_f64;
185341825Sdim    Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
186341825Sdim    Table[RTLIB::LOG10_F32] = f32_func_f32;
187341825Sdim    Table[RTLIB::LOG10_F64] = f64_func_f64;
188341825Sdim    Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
189341825Sdim    Table[RTLIB::EXP_F32] = f32_func_f32;
190341825Sdim    Table[RTLIB::EXP_F64] = f64_func_f64;
191341825Sdim    Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
192341825Sdim    Table[RTLIB::EXP2_F32] = f32_func_f32;
193341825Sdim    Table[RTLIB::EXP2_F64] = f64_func_f64;
194341825Sdim    Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
195341825Sdim    Table[RTLIB::SIN_F32] = f32_func_f32;
196341825Sdim    Table[RTLIB::SIN_F64] = f64_func_f64;
197341825Sdim    Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
198341825Sdim    Table[RTLIB::COS_F32] = f32_func_f32;
199341825Sdim    Table[RTLIB::COS_F64] = f64_func_f64;
200341825Sdim    Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
201341825Sdim    Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
202341825Sdim    Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
203341825Sdim    Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
204341825Sdim    Table[RTLIB::POW_F32] = f32_func_f32_f32;
205341825Sdim    Table[RTLIB::POW_F64] = f64_func_f64_f64;
206341825Sdim    Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
207341825Sdim    Table[RTLIB::CEIL_F32] = f32_func_f32;
208341825Sdim    Table[RTLIB::CEIL_F64] = f64_func_f64;
209341825Sdim    Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
210341825Sdim    Table[RTLIB::TRUNC_F32] = f32_func_f32;
211341825Sdim    Table[RTLIB::TRUNC_F64] = f64_func_f64;
212341825Sdim    Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
213341825Sdim    Table[RTLIB::RINT_F32] = f32_func_f32;
214341825Sdim    Table[RTLIB::RINT_F64] = f64_func_f64;
215341825Sdim    Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
216341825Sdim    Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
217341825Sdim    Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
218341825Sdim    Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
219341825Sdim    Table[RTLIB::ROUND_F32] = f32_func_f32;
220341825Sdim    Table[RTLIB::ROUND_F64] = f64_func_f64;
221341825Sdim    Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
222353358Sdim    Table[RTLIB::LROUND_F32] = iPTR_func_f32;
223353358Sdim    Table[RTLIB::LROUND_F64] = iPTR_func_f64;
224353358Sdim    Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
225353358Sdim    Table[RTLIB::LLROUND_F32] = i64_func_f32;
226353358Sdim    Table[RTLIB::LLROUND_F64] = i64_func_f64;
227353358Sdim    Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
228353358Sdim    Table[RTLIB::LRINT_F32] = iPTR_func_f32;
229353358Sdim    Table[RTLIB::LRINT_F64] = iPTR_func_f64;
230353358Sdim    Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
231353358Sdim    Table[RTLIB::LLRINT_F32] = i64_func_f32;
232353358Sdim    Table[RTLIB::LLRINT_F64] = i64_func_f64;
233353358Sdim    Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
234341825Sdim    Table[RTLIB::FLOOR_F32] = f32_func_f32;
235341825Sdim    Table[RTLIB::FLOOR_F64] = f64_func_f64;
236341825Sdim    Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
237341825Sdim    Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
238341825Sdim    Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
239341825Sdim    Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
240341825Sdim    Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
241341825Sdim    Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
242341825Sdim    Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
243341825Sdim    Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
244341825Sdim    Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
245341825Sdim    Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
246317017Sdim
247341825Sdim    // Conversion
248353358Sdim    // All F80 and PPCF128 routines are unsupported.
249341825Sdim    Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
250341825Sdim    Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
251341825Sdim    Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
252341825Sdim    Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
253341825Sdim    Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
254353358Sdim    Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
255341825Sdim    Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
256353358Sdim    Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
257341825Sdim    Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
258341825Sdim    Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
259341825Sdim    Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
260341825Sdim    Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
261341825Sdim    Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
262341825Sdim    Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
263341825Sdim    Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
264341825Sdim    Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
265341825Sdim    Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
266341825Sdim    Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
267341825Sdim    Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
268341825Sdim    Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
269341825Sdim    Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
270341825Sdim    Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
271341825Sdim    Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
272341825Sdim    Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
273341825Sdim    Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
274341825Sdim    Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
275341825Sdim    Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
276341825Sdim    Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
277341825Sdim    Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
278341825Sdim    Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
279341825Sdim    Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
280341825Sdim    Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
281341825Sdim    Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
282341825Sdim    Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
283341825Sdim    Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
284341825Sdim    Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
285341825Sdim    Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
286341825Sdim    Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
287341825Sdim    Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
288341825Sdim    Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
289341825Sdim    Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
290341825Sdim    Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
291341825Sdim    Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
292341825Sdim    Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
293341825Sdim    Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
294341825Sdim    Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
295317017Sdim
296341825Sdim    // Comparison
297341825Sdim    // ALl F80 and PPCF128 routines are unsupported.
298341825Sdim    Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
299341825Sdim    Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
300341825Sdim    Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
301341825Sdim    Table[RTLIB::UNE_F32] = i32_func_f32_f32;
302341825Sdim    Table[RTLIB::UNE_F64] = i32_func_f64_f64;
303341825Sdim    Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
304341825Sdim    Table[RTLIB::OGE_F32] = i32_func_f32_f32;
305341825Sdim    Table[RTLIB::OGE_F64] = i32_func_f64_f64;
306341825Sdim    Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
307341825Sdim    Table[RTLIB::OLT_F32] = i32_func_f32_f32;
308341825Sdim    Table[RTLIB::OLT_F64] = i32_func_f64_f64;
309341825Sdim    Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
310341825Sdim    Table[RTLIB::OLE_F32] = i32_func_f32_f32;
311341825Sdim    Table[RTLIB::OLE_F64] = i32_func_f64_f64;
312341825Sdim    Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
313341825Sdim    Table[RTLIB::OGT_F32] = i32_func_f32_f32;
314341825Sdim    Table[RTLIB::OGT_F64] = i32_func_f64_f64;
315341825Sdim    Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
316341825Sdim    Table[RTLIB::UO_F32] = i32_func_f32_f32;
317341825Sdim    Table[RTLIB::UO_F64] = i32_func_f64_f64;
318341825Sdim    Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
319341825Sdim    // O_FXX has the weird property that it uses the same libcall name as UO_FXX
320341825Sdim    // This breaks our name-based lookup. Fortunately only the UO family of
321341825Sdim    // libcalls appears to be actually used.
322341825Sdim    Table[RTLIB::O_F32] = unsupported;
323341825Sdim    Table[RTLIB::O_F64] = unsupported;
324341825Sdim    Table[RTLIB::O_F128] = unsupported;
325317017Sdim
326341825Sdim    // Memory
327341825Sdim    Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
328341825Sdim    Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
329341825Sdim    Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
330317017Sdim
331353358Sdim    // __stack_chk_fail
332353358Sdim    Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
333353358Sdim
334353358Sdim    // Return address handling
335353358Sdim    Table[RTLIB::RETURN_ADDRESS] = i32_func_i32;
336353358Sdim
337341825Sdim    // Element-wise Atomic memory
338341825Sdim    // TODO: Fix these when we implement atomic support
339341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
340341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
341341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
342341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
343341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
344341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
345341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
346341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
347341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
348341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
349320970Sdim
350341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
351341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
352341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
353341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
354341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
355317017Sdim
356341825Sdim    // Atomic '__sync_*' libcalls.
357341825Sdim    // TODO: Fix these when we implement atomic support
358341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
359341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
360341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
361341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
362341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
363341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
364341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
365341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
366341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
367341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
368341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
369341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
370341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
371341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
372341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
373341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
374341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
375341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
376341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
377341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
378341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
379341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
380341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
381341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
382341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
383341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
384341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
385341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
386341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
387341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
388341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
389341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
390341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
391341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
392341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
393341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
394341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
395341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
396341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
397341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
398341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
399341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
400341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
401341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
402341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
403341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
404341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
405341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
406341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
407341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
408341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
409341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
410341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
411341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
412341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
413341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
414341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
415341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
416341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
417341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
418317017Sdim
419341825Sdim    // Atomic '__atomic_*' libcalls.
420341825Sdim    // TODO: Fix these when we implement atomic support
421341825Sdim    Table[RTLIB::ATOMIC_LOAD] = unsupported;
422341825Sdim    Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
423341825Sdim    Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
424341825Sdim    Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
425341825Sdim    Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
426341825Sdim    Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
427317017Sdim
428341825Sdim    Table[RTLIB::ATOMIC_STORE] = unsupported;
429341825Sdim    Table[RTLIB::ATOMIC_STORE_1] = unsupported;
430341825Sdim    Table[RTLIB::ATOMIC_STORE_2] = unsupported;
431341825Sdim    Table[RTLIB::ATOMIC_STORE_4] = unsupported;
432341825Sdim    Table[RTLIB::ATOMIC_STORE_8] = unsupported;
433341825Sdim    Table[RTLIB::ATOMIC_STORE_16] = unsupported;
434317017Sdim
435341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
436341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
437341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
438341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
439341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
440341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
441317017Sdim
442341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
443341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
444341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
445341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
446341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
447341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
448317017Sdim
449341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
450341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
451341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
452341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
453341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
454317017Sdim
455341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
456341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
457341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
458341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
459341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
460317017Sdim
461341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
462341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
463341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
464341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
465341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
466317017Sdim
467341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
468341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
469341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
470341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
471341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
472317017Sdim
473341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
474341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
475341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
476341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
477341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
478317017Sdim
479341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
480341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
481341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
482341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
483341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
484341825Sdim  }
485341825Sdim};
486317017Sdim
487341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
488317017Sdim
489341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a
490341825Sdim// constructor for use with ManagedStatic
491341825Sdimstruct StaticLibcallNameMap {
492341825Sdim  StringMap<RTLIB::Libcall> Map;
493341825Sdim  StaticLibcallNameMap() {
494341825Sdim    static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
495341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
496341825Sdim#include "llvm/IR/RuntimeLibcalls.def"
497341825Sdim#undef HANDLE_LIBCALL
498341825Sdim    };
499341825Sdim    for (const auto &NameLibcall : NameLibcalls) {
500341825Sdim      if (NameLibcall.first != nullptr &&
501341825Sdim          RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
502341825Sdim        assert(Map.find(NameLibcall.first) == Map.end() &&
503341825Sdim               "duplicate libcall names in name map");
504341825Sdim        Map[NameLibcall.first] = NameLibcall.second;
505341825Sdim      }
506341825Sdim    }
507353358Sdim    // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
508353358Sdim    // consistent with the f64 and f128 names.
509353358Sdim    Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
510353358Sdim    Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
511353358Sdim
512353358Sdim    Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
513341825Sdim  }
514317017Sdim};
515317017Sdim
516341825Sdim} // end anonymous namespace
517317017Sdim
518353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
519344779Sdim                               RTLIB::Libcall LC,
520344779Sdim                               SmallVectorImpl<wasm::ValType> &Rets,
521344779Sdim                               SmallVectorImpl<wasm::ValType> &Params) {
522317017Sdim  assert(Rets.empty());
523317017Sdim  assert(Params.empty());
524317017Sdim
525353358Sdim  wasm::ValType PtrTy =
526341825Sdim      Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
527317017Sdim
528344779Sdim  auto &Table = RuntimeLibcallSignatures->Table;
529341825Sdim  switch (Table[LC]) {
530317017Sdim  case func:
531317017Sdim    break;
532317017Sdim  case f32_func_f32:
533317017Sdim    Rets.push_back(wasm::ValType::F32);
534317017Sdim    Params.push_back(wasm::ValType::F32);
535317017Sdim    break;
536317017Sdim  case f32_func_f64:
537317017Sdim    Rets.push_back(wasm::ValType::F32);
538317017Sdim    Params.push_back(wasm::ValType::F64);
539317017Sdim    break;
540317017Sdim  case f32_func_i32:
541317017Sdim    Rets.push_back(wasm::ValType::F32);
542317017Sdim    Params.push_back(wasm::ValType::I32);
543317017Sdim    break;
544317017Sdim  case f32_func_i64:
545317017Sdim    Rets.push_back(wasm::ValType::F32);
546317017Sdim    Params.push_back(wasm::ValType::I64);
547317017Sdim    break;
548317017Sdim  case f32_func_i16:
549317017Sdim    Rets.push_back(wasm::ValType::F32);
550317017Sdim    Params.push_back(wasm::ValType::I32);
551317017Sdim    break;
552317017Sdim  case f64_func_f32:
553317017Sdim    Rets.push_back(wasm::ValType::F64);
554317017Sdim    Params.push_back(wasm::ValType::F32);
555317017Sdim    break;
556317017Sdim  case f64_func_f64:
557317017Sdim    Rets.push_back(wasm::ValType::F64);
558317017Sdim    Params.push_back(wasm::ValType::F64);
559317017Sdim    break;
560317017Sdim  case f64_func_i32:
561317017Sdim    Rets.push_back(wasm::ValType::F64);
562317017Sdim    Params.push_back(wasm::ValType::I32);
563317017Sdim    break;
564317017Sdim  case f64_func_i64:
565317017Sdim    Rets.push_back(wasm::ValType::F64);
566317017Sdim    Params.push_back(wasm::ValType::I64);
567317017Sdim    break;
568317017Sdim  case i32_func_f32:
569317017Sdim    Rets.push_back(wasm::ValType::I32);
570317017Sdim    Params.push_back(wasm::ValType::F32);
571317017Sdim    break;
572317017Sdim  case i32_func_f64:
573317017Sdim    Rets.push_back(wasm::ValType::I32);
574317017Sdim    Params.push_back(wasm::ValType::F64);
575317017Sdim    break;
576317017Sdim  case i32_func_i32:
577317017Sdim    Rets.push_back(wasm::ValType::I32);
578317017Sdim    Params.push_back(wasm::ValType::I32);
579317017Sdim    break;
580317017Sdim  case i64_func_f32:
581317017Sdim    Rets.push_back(wasm::ValType::I64);
582317017Sdim    Params.push_back(wasm::ValType::F32);
583317017Sdim    break;
584317017Sdim  case i64_func_f64:
585317017Sdim    Rets.push_back(wasm::ValType::I64);
586317017Sdim    Params.push_back(wasm::ValType::F64);
587317017Sdim    break;
588317017Sdim  case i64_func_i64:
589317017Sdim    Rets.push_back(wasm::ValType::I64);
590317017Sdim    Params.push_back(wasm::ValType::I64);
591317017Sdim    break;
592317017Sdim  case f32_func_f32_f32:
593317017Sdim    Rets.push_back(wasm::ValType::F32);
594317017Sdim    Params.push_back(wasm::ValType::F32);
595317017Sdim    Params.push_back(wasm::ValType::F32);
596317017Sdim    break;
597317017Sdim  case f32_func_f32_i32:
598317017Sdim    Rets.push_back(wasm::ValType::F32);
599317017Sdim    Params.push_back(wasm::ValType::F32);
600317017Sdim    Params.push_back(wasm::ValType::I32);
601317017Sdim    break;
602317017Sdim  case f32_func_i64_i64:
603317017Sdim    Rets.push_back(wasm::ValType::F32);
604317017Sdim    Params.push_back(wasm::ValType::I64);
605317017Sdim    Params.push_back(wasm::ValType::I64);
606317017Sdim    break;
607317017Sdim  case f64_func_f64_f64:
608317017Sdim    Rets.push_back(wasm::ValType::F64);
609317017Sdim    Params.push_back(wasm::ValType::F64);
610317017Sdim    Params.push_back(wasm::ValType::F64);
611317017Sdim    break;
612317017Sdim  case f64_func_f64_i32:
613317017Sdim    Rets.push_back(wasm::ValType::F64);
614317017Sdim    Params.push_back(wasm::ValType::F64);
615317017Sdim    Params.push_back(wasm::ValType::I32);
616317017Sdim    break;
617317017Sdim  case f64_func_i64_i64:
618317017Sdim    Rets.push_back(wasm::ValType::F64);
619317017Sdim    Params.push_back(wasm::ValType::I64);
620317017Sdim    Params.push_back(wasm::ValType::I64);
621317017Sdim    break;
622317017Sdim  case i16_func_f32:
623317017Sdim    Rets.push_back(wasm::ValType::I32);
624317017Sdim    Params.push_back(wasm::ValType::F32);
625317017Sdim    break;
626353358Sdim  case i16_func_f64:
627353358Sdim    Rets.push_back(wasm::ValType::I32);
628353358Sdim    Params.push_back(wasm::ValType::F64);
629353358Sdim    break;
630353358Sdim  case i16_func_i64_i64:
631353358Sdim    Rets.push_back(wasm::ValType::I32);
632353358Sdim    Params.push_back(wasm::ValType::I64);
633353358Sdim    Params.push_back(wasm::ValType::I64);
634353358Sdim    break;
635317017Sdim  case i8_func_i8_i8:
636317017Sdim    Rets.push_back(wasm::ValType::I32);
637317017Sdim    Params.push_back(wasm::ValType::I32);
638317017Sdim    Params.push_back(wasm::ValType::I32);
639317017Sdim    break;
640317017Sdim  case func_f32_iPTR_iPTR:
641317017Sdim    Params.push_back(wasm::ValType::F32);
642353358Sdim    Params.push_back(PtrTy);
643353358Sdim    Params.push_back(PtrTy);
644317017Sdim    break;
645317017Sdim  case func_f64_iPTR_iPTR:
646317017Sdim    Params.push_back(wasm::ValType::F64);
647353358Sdim    Params.push_back(PtrTy);
648353358Sdim    Params.push_back(PtrTy);
649317017Sdim    break;
650317017Sdim  case i16_func_i16_i16:
651317017Sdim    Rets.push_back(wasm::ValType::I32);
652317017Sdim    Params.push_back(wasm::ValType::I32);
653317017Sdim    Params.push_back(wasm::ValType::I32);
654317017Sdim    break;
655317017Sdim  case i32_func_f32_f32:
656317017Sdim    Rets.push_back(wasm::ValType::I32);
657317017Sdim    Params.push_back(wasm::ValType::F32);
658317017Sdim    Params.push_back(wasm::ValType::F32);
659317017Sdim    break;
660317017Sdim  case i32_func_f64_f64:
661317017Sdim    Rets.push_back(wasm::ValType::I32);
662317017Sdim    Params.push_back(wasm::ValType::F64);
663317017Sdim    Params.push_back(wasm::ValType::F64);
664317017Sdim    break;
665317017Sdim  case i32_func_i32_i32:
666317017Sdim    Rets.push_back(wasm::ValType::I32);
667317017Sdim    Params.push_back(wasm::ValType::I32);
668317017Sdim    Params.push_back(wasm::ValType::I32);
669317017Sdim    break;
670341825Sdim  case i32_func_i32_i32_iPTR:
671341825Sdim    Rets.push_back(wasm::ValType::I32);
672341825Sdim    Params.push_back(wasm::ValType::I32);
673341825Sdim    Params.push_back(wasm::ValType::I32);
674353358Sdim    Params.push_back(PtrTy);
675341825Sdim    break;
676317017Sdim  case i64_func_i64_i64:
677317017Sdim    Rets.push_back(wasm::ValType::I64);
678317017Sdim    Params.push_back(wasm::ValType::I64);
679317017Sdim    Params.push_back(wasm::ValType::I64);
680317017Sdim    break;
681341825Sdim  case i64_func_i64_i64_iPTR:
682341825Sdim    Rets.push_back(wasm::ValType::I64);
683341825Sdim    Params.push_back(wasm::ValType::I64);
684341825Sdim    Params.push_back(wasm::ValType::I64);
685353358Sdim    Params.push_back(PtrTy);
686341825Sdim    break;
687317017Sdim  case i64_i64_func_f32:
688317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
689317017Sdim    Rets.push_back(wasm::ValType::I64);
690317017Sdim    Rets.push_back(wasm::ValType::I64);
691317017Sdim#else
692353358Sdim    Params.push_back(PtrTy);
693317017Sdim#endif
694317017Sdim    Params.push_back(wasm::ValType::F32);
695317017Sdim    break;
696317017Sdim  case i64_i64_func_f64:
697317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
698317017Sdim    Rets.push_back(wasm::ValType::I64);
699317017Sdim    Rets.push_back(wasm::ValType::I64);
700317017Sdim#else
701353358Sdim    Params.push_back(PtrTy);
702317017Sdim#endif
703317017Sdim    Params.push_back(wasm::ValType::F64);
704317017Sdim    break;
705317017Sdim  case i16_i16_func_i16_i16:
706317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
707317017Sdim    Rets.push_back(wasm::ValType::I32);
708317017Sdim    Rets.push_back(wasm::ValType::I32);
709317017Sdim#else
710353358Sdim    Params.push_back(PtrTy);
711317017Sdim#endif
712317017Sdim    Params.push_back(wasm::ValType::I32);
713317017Sdim    Params.push_back(wasm::ValType::I32);
714317017Sdim    break;
715317017Sdim  case i32_i32_func_i32_i32:
716317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
717317017Sdim    Rets.push_back(wasm::ValType::I32);
718317017Sdim    Rets.push_back(wasm::ValType::I32);
719317017Sdim#else
720353358Sdim    Params.push_back(PtrTy);
721317017Sdim#endif
722317017Sdim    Params.push_back(wasm::ValType::I32);
723317017Sdim    Params.push_back(wasm::ValType::I32);
724317017Sdim    break;
725317017Sdim  case i64_i64_func_i64_i64:
726317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
727317017Sdim    Rets.push_back(wasm::ValType::I64);
728317017Sdim    Rets.push_back(wasm::ValType::I64);
729317017Sdim#else
730353358Sdim    Params.push_back(PtrTy);
731317017Sdim#endif
732317017Sdim    Params.push_back(wasm::ValType::I64);
733317017Sdim    Params.push_back(wasm::ValType::I64);
734317017Sdim    break;
735317017Sdim  case i64_i64_func_i64_i64_i64_i64:
736317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
737317017Sdim    Rets.push_back(wasm::ValType::I64);
738317017Sdim    Rets.push_back(wasm::ValType::I64);
739317017Sdim#else
740353358Sdim    Params.push_back(PtrTy);
741317017Sdim#endif
742317017Sdim    Params.push_back(wasm::ValType::I64);
743317017Sdim    Params.push_back(wasm::ValType::I64);
744317017Sdim    Params.push_back(wasm::ValType::I64);
745317017Sdim    Params.push_back(wasm::ValType::I64);
746317017Sdim    break;
747341825Sdim  case i64_i64_func_i64_i64_i64_i64_iPTR:
748341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
749341825Sdim    Rets.push_back(wasm::ValType::I64);
750341825Sdim    Rets.push_back(wasm::ValType::I64);
751341825Sdim#else
752353358Sdim    Params.push_back(PtrTy);
753341825Sdim#endif
754341825Sdim    Params.push_back(wasm::ValType::I64);
755341825Sdim    Params.push_back(wasm::ValType::I64);
756341825Sdim    Params.push_back(wasm::ValType::I64);
757341825Sdim    Params.push_back(wasm::ValType::I64);
758353358Sdim    Params.push_back(PtrTy);
759341825Sdim    break;
760317017Sdim  case i64_i64_i64_i64_func_i64_i64_i64_i64:
761317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
762317017Sdim    Rets.push_back(wasm::ValType::I64);
763317017Sdim    Rets.push_back(wasm::ValType::I64);
764317017Sdim    Rets.push_back(wasm::ValType::I64);
765317017Sdim    Rets.push_back(wasm::ValType::I64);
766317017Sdim#else
767353358Sdim    Params.push_back(PtrTy);
768317017Sdim#endif
769317017Sdim    Params.push_back(wasm::ValType::I64);
770317017Sdim    Params.push_back(wasm::ValType::I64);
771317017Sdim    Params.push_back(wasm::ValType::I64);
772317017Sdim    Params.push_back(wasm::ValType::I64);
773317017Sdim    break;
774317017Sdim  case i64_i64_func_i64_i64_i32:
775317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
776317017Sdim    Rets.push_back(wasm::ValType::I64);
777317017Sdim    Rets.push_back(wasm::ValType::I64);
778317017Sdim    Rets.push_back(wasm::ValType::I64);
779317017Sdim    Rets.push_back(wasm::ValType::I64);
780317017Sdim#else
781353358Sdim    Params.push_back(PtrTy);
782317017Sdim#endif
783317017Sdim    Params.push_back(wasm::ValType::I64);
784317017Sdim    Params.push_back(wasm::ValType::I64);
785317017Sdim    Params.push_back(wasm::ValType::I32);
786317017Sdim    break;
787317017Sdim  case iPTR_func_iPTR_i32_iPTR:
788353358Sdim    Rets.push_back(PtrTy);
789353358Sdim    Params.push_back(PtrTy);
790317017Sdim    Params.push_back(wasm::ValType::I32);
791353358Sdim    Params.push_back(PtrTy);
792317017Sdim    break;
793317017Sdim  case iPTR_func_iPTR_iPTR_iPTR:
794353358Sdim    Rets.push_back(PtrTy);
795353358Sdim    Params.push_back(PtrTy);
796353358Sdim    Params.push_back(PtrTy);
797353358Sdim    Params.push_back(PtrTy);
798317017Sdim    break;
799317017Sdim  case f32_func_f32_f32_f32:
800317017Sdim    Rets.push_back(wasm::ValType::F32);
801317017Sdim    Params.push_back(wasm::ValType::F32);
802317017Sdim    Params.push_back(wasm::ValType::F32);
803317017Sdim    Params.push_back(wasm::ValType::F32);
804317017Sdim    break;
805317017Sdim  case f64_func_f64_f64_f64:
806317017Sdim    Rets.push_back(wasm::ValType::F64);
807317017Sdim    Params.push_back(wasm::ValType::F64);
808317017Sdim    Params.push_back(wasm::ValType::F64);
809317017Sdim    Params.push_back(wasm::ValType::F64);
810317017Sdim    break;
811317017Sdim  case func_i64_i64_iPTR_iPTR:
812317017Sdim    Params.push_back(wasm::ValType::I64);
813317017Sdim    Params.push_back(wasm::ValType::I64);
814353358Sdim    Params.push_back(PtrTy);
815353358Sdim    Params.push_back(PtrTy);
816317017Sdim    break;
817317017Sdim  case func_iPTR_f32:
818353358Sdim    Params.push_back(PtrTy);
819317017Sdim    Params.push_back(wasm::ValType::F32);
820317017Sdim    break;
821317017Sdim  case func_iPTR_f64:
822353358Sdim    Params.push_back(PtrTy);
823317017Sdim    Params.push_back(wasm::ValType::F64);
824317017Sdim    break;
825317017Sdim  case func_iPTR_i32:
826353358Sdim    Params.push_back(PtrTy);
827317017Sdim    Params.push_back(wasm::ValType::I32);
828317017Sdim    break;
829317017Sdim  case func_iPTR_i64:
830353358Sdim    Params.push_back(PtrTy);
831317017Sdim    Params.push_back(wasm::ValType::I64);
832317017Sdim    break;
833317017Sdim  case func_iPTR_i64_i64:
834353358Sdim    Params.push_back(PtrTy);
835317017Sdim    Params.push_back(wasm::ValType::I64);
836317017Sdim    Params.push_back(wasm::ValType::I64);
837317017Sdim    break;
838317017Sdim  case func_iPTR_i64_i64_i64_i64:
839353358Sdim    Params.push_back(PtrTy);
840317017Sdim    Params.push_back(wasm::ValType::I64);
841317017Sdim    Params.push_back(wasm::ValType::I64);
842317017Sdim    Params.push_back(wasm::ValType::I64);
843317017Sdim    Params.push_back(wasm::ValType::I64);
844317017Sdim    break;
845317017Sdim  case func_iPTR_i64_i64_i64_i64_i64_i64:
846353358Sdim    Params.push_back(PtrTy);
847317017Sdim    Params.push_back(wasm::ValType::I64);
848317017Sdim    Params.push_back(wasm::ValType::I64);
849317017Sdim    Params.push_back(wasm::ValType::I64);
850317017Sdim    Params.push_back(wasm::ValType::I64);
851317017Sdim    Params.push_back(wasm::ValType::I64);
852317017Sdim    Params.push_back(wasm::ValType::I64);
853317017Sdim    break;
854317017Sdim  case i32_func_i64_i64:
855317017Sdim    Rets.push_back(wasm::ValType::I32);
856317017Sdim    Params.push_back(wasm::ValType::I64);
857317017Sdim    Params.push_back(wasm::ValType::I64);
858317017Sdim    break;
859317017Sdim  case i32_func_i64_i64_i64_i64:
860317017Sdim    Rets.push_back(wasm::ValType::I32);
861317017Sdim    Params.push_back(wasm::ValType::I64);
862317017Sdim    Params.push_back(wasm::ValType::I64);
863317017Sdim    Params.push_back(wasm::ValType::I64);
864317017Sdim    Params.push_back(wasm::ValType::I64);
865317017Sdim    break;
866353358Sdim  case iPTR_func_f32:
867353358Sdim    Rets.push_back(PtrTy);
868353358Sdim    Params.push_back(wasm::ValType::F32);
869353358Sdim    break;
870353358Sdim  case iPTR_func_f64:
871353358Sdim    Rets.push_back(PtrTy);
872353358Sdim    Params.push_back(wasm::ValType::F64);
873353358Sdim    break;
874353358Sdim  case iPTR_func_i64_i64:
875353358Sdim    Rets.push_back(PtrTy);
876353358Sdim    Params.push_back(wasm::ValType::I64);
877353358Sdim    Params.push_back(wasm::ValType::I64);
878353358Sdim    break;
879317017Sdim  case unsupported:
880317017Sdim    llvm_unreachable("unsupported runtime library signature");
881317017Sdim  }
882317017Sdim}
883317017Sdim
884341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
885341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
886341825Sdim// other than here, just roll its logic into this version.
887353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
888344779Sdim                               const char *Name,
889344779Sdim                               SmallVectorImpl<wasm::ValType> &Rets,
890344779Sdim                               SmallVectorImpl<wasm::ValType> &Params) {
891344779Sdim  auto &Map = LibcallNameMap->Map;
892353358Sdim  auto Val = Map.find(Name);
893353358Sdim#ifndef NDEBUG
894353358Sdim  if (Val == Map.end()) {
895353358Sdim    auto message = std::string("unexpected runtime library name: ") + Name;
896353358Sdim    llvm_unreachable(message.c_str());
897353358Sdim  }
898353358Sdim#endif
899353358Sdim  return getLibcallSignature(Subtarget, Val->second, Rets, Params);
900317017Sdim}
901