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;
319317017Sdim
320341825Sdim    // Memory
321341825Sdim    Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
322341825Sdim    Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
323341825Sdim    Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
324317017Sdim
325353358Sdim    // __stack_chk_fail
326353358Sdim    Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
327353358Sdim
328353358Sdim    // Return address handling
329353358Sdim    Table[RTLIB::RETURN_ADDRESS] = i32_func_i32;
330353358Sdim
331341825Sdim    // Element-wise Atomic memory
332341825Sdim    // TODO: Fix these when we implement atomic support
333341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
334341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
335341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
336341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
337341825Sdim    Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
338341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
339341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
340341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
341341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
342341825Sdim    Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
343320970Sdim
344341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
345341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
346341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
347341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
348341825Sdim    Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
349317017Sdim
350341825Sdim    // Atomic '__sync_*' libcalls.
351341825Sdim    // TODO: Fix these when we implement atomic support
352341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
353341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
354341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
355341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
356341825Sdim    Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
357341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
358341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
359341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
360341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
361341825Sdim    Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
362341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
363341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
364341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
365341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
366341825Sdim    Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
367341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
368341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
369341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
370341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
371341825Sdim    Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
372341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
373341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
374341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
375341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
376341825Sdim    Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
377341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
378341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
379341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
380341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
381341825Sdim    Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
382341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
383341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
384341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
385341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
386341825Sdim    Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
387341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
388341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
389341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
390341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
391341825Sdim    Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
392341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
393341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
394341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
395341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
396341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
397341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
398341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
399341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
400341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
401341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
402341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
403341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
404341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
405341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
406341825Sdim    Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
407341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
408341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
409341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
410341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
411341825Sdim    Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
412317017Sdim
413341825Sdim    // Atomic '__atomic_*' libcalls.
414341825Sdim    // TODO: Fix these when we implement atomic support
415341825Sdim    Table[RTLIB::ATOMIC_LOAD] = unsupported;
416341825Sdim    Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
417341825Sdim    Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
418341825Sdim    Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
419341825Sdim    Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
420341825Sdim    Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
421317017Sdim
422341825Sdim    Table[RTLIB::ATOMIC_STORE] = unsupported;
423341825Sdim    Table[RTLIB::ATOMIC_STORE_1] = unsupported;
424341825Sdim    Table[RTLIB::ATOMIC_STORE_2] = unsupported;
425341825Sdim    Table[RTLIB::ATOMIC_STORE_4] = unsupported;
426341825Sdim    Table[RTLIB::ATOMIC_STORE_8] = unsupported;
427341825Sdim    Table[RTLIB::ATOMIC_STORE_16] = unsupported;
428317017Sdim
429341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
430341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
431341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
432341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
433341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
434341825Sdim    Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
435317017Sdim
436341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
437341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
438341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
439341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
440341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
441341825Sdim    Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
442317017Sdim
443341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
444341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
445341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
446341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
447341825Sdim    Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
448317017Sdim
449341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
450341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
451341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
452341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
453341825Sdim    Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
454317017Sdim
455341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
456341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
457341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
458341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
459341825Sdim    Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
460317017Sdim
461341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
462341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
463341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
464341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
465341825Sdim    Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
466317017Sdim
467341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
468341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
469341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
470341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
471341825Sdim    Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
472317017Sdim
473341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
474341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
475341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
476341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
477341825Sdim    Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
478341825Sdim  }
479341825Sdim};
480317017Sdim
481341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
482317017Sdim
483341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a
484341825Sdim// constructor for use with ManagedStatic
485341825Sdimstruct StaticLibcallNameMap {
486341825Sdim  StringMap<RTLIB::Libcall> Map;
487341825Sdim  StaticLibcallNameMap() {
488341825Sdim    static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
489341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
490341825Sdim#include "llvm/IR/RuntimeLibcalls.def"
491341825Sdim#undef HANDLE_LIBCALL
492341825Sdim    };
493341825Sdim    for (const auto &NameLibcall : NameLibcalls) {
494341825Sdim      if (NameLibcall.first != nullptr &&
495341825Sdim          RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
496341825Sdim        assert(Map.find(NameLibcall.first) == Map.end() &&
497341825Sdim               "duplicate libcall names in name map");
498341825Sdim        Map[NameLibcall.first] = NameLibcall.second;
499341825Sdim      }
500341825Sdim    }
501353358Sdim    // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
502353358Sdim    // consistent with the f64 and f128 names.
503353358Sdim    Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
504353358Sdim    Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
505353358Sdim
506353358Sdim    Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
507341825Sdim  }
508317017Sdim};
509317017Sdim
510341825Sdim} // end anonymous namespace
511317017Sdim
512353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
513344779Sdim                               RTLIB::Libcall LC,
514344779Sdim                               SmallVectorImpl<wasm::ValType> &Rets,
515344779Sdim                               SmallVectorImpl<wasm::ValType> &Params) {
516317017Sdim  assert(Rets.empty());
517317017Sdim  assert(Params.empty());
518317017Sdim
519353358Sdim  wasm::ValType PtrTy =
520341825Sdim      Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
521317017Sdim
522344779Sdim  auto &Table = RuntimeLibcallSignatures->Table;
523341825Sdim  switch (Table[LC]) {
524317017Sdim  case func:
525317017Sdim    break;
526317017Sdim  case f32_func_f32:
527317017Sdim    Rets.push_back(wasm::ValType::F32);
528317017Sdim    Params.push_back(wasm::ValType::F32);
529317017Sdim    break;
530317017Sdim  case f32_func_f64:
531317017Sdim    Rets.push_back(wasm::ValType::F32);
532317017Sdim    Params.push_back(wasm::ValType::F64);
533317017Sdim    break;
534317017Sdim  case f32_func_i32:
535317017Sdim    Rets.push_back(wasm::ValType::F32);
536317017Sdim    Params.push_back(wasm::ValType::I32);
537317017Sdim    break;
538317017Sdim  case f32_func_i64:
539317017Sdim    Rets.push_back(wasm::ValType::F32);
540317017Sdim    Params.push_back(wasm::ValType::I64);
541317017Sdim    break;
542317017Sdim  case f32_func_i16:
543317017Sdim    Rets.push_back(wasm::ValType::F32);
544317017Sdim    Params.push_back(wasm::ValType::I32);
545317017Sdim    break;
546317017Sdim  case f64_func_f32:
547317017Sdim    Rets.push_back(wasm::ValType::F64);
548317017Sdim    Params.push_back(wasm::ValType::F32);
549317017Sdim    break;
550317017Sdim  case f64_func_f64:
551317017Sdim    Rets.push_back(wasm::ValType::F64);
552317017Sdim    Params.push_back(wasm::ValType::F64);
553317017Sdim    break;
554317017Sdim  case f64_func_i32:
555317017Sdim    Rets.push_back(wasm::ValType::F64);
556317017Sdim    Params.push_back(wasm::ValType::I32);
557317017Sdim    break;
558317017Sdim  case f64_func_i64:
559317017Sdim    Rets.push_back(wasm::ValType::F64);
560317017Sdim    Params.push_back(wasm::ValType::I64);
561317017Sdim    break;
562317017Sdim  case i32_func_f32:
563317017Sdim    Rets.push_back(wasm::ValType::I32);
564317017Sdim    Params.push_back(wasm::ValType::F32);
565317017Sdim    break;
566317017Sdim  case i32_func_f64:
567317017Sdim    Rets.push_back(wasm::ValType::I32);
568317017Sdim    Params.push_back(wasm::ValType::F64);
569317017Sdim    break;
570317017Sdim  case i32_func_i32:
571317017Sdim    Rets.push_back(wasm::ValType::I32);
572317017Sdim    Params.push_back(wasm::ValType::I32);
573317017Sdim    break;
574317017Sdim  case i64_func_f32:
575317017Sdim    Rets.push_back(wasm::ValType::I64);
576317017Sdim    Params.push_back(wasm::ValType::F32);
577317017Sdim    break;
578317017Sdim  case i64_func_f64:
579317017Sdim    Rets.push_back(wasm::ValType::I64);
580317017Sdim    Params.push_back(wasm::ValType::F64);
581317017Sdim    break;
582317017Sdim  case i64_func_i64:
583317017Sdim    Rets.push_back(wasm::ValType::I64);
584317017Sdim    Params.push_back(wasm::ValType::I64);
585317017Sdim    break;
586317017Sdim  case f32_func_f32_f32:
587317017Sdim    Rets.push_back(wasm::ValType::F32);
588317017Sdim    Params.push_back(wasm::ValType::F32);
589317017Sdim    Params.push_back(wasm::ValType::F32);
590317017Sdim    break;
591317017Sdim  case f32_func_f32_i32:
592317017Sdim    Rets.push_back(wasm::ValType::F32);
593317017Sdim    Params.push_back(wasm::ValType::F32);
594317017Sdim    Params.push_back(wasm::ValType::I32);
595317017Sdim    break;
596317017Sdim  case f32_func_i64_i64:
597317017Sdim    Rets.push_back(wasm::ValType::F32);
598317017Sdim    Params.push_back(wasm::ValType::I64);
599317017Sdim    Params.push_back(wasm::ValType::I64);
600317017Sdim    break;
601317017Sdim  case f64_func_f64_f64:
602317017Sdim    Rets.push_back(wasm::ValType::F64);
603317017Sdim    Params.push_back(wasm::ValType::F64);
604317017Sdim    Params.push_back(wasm::ValType::F64);
605317017Sdim    break;
606317017Sdim  case f64_func_f64_i32:
607317017Sdim    Rets.push_back(wasm::ValType::F64);
608317017Sdim    Params.push_back(wasm::ValType::F64);
609317017Sdim    Params.push_back(wasm::ValType::I32);
610317017Sdim    break;
611317017Sdim  case f64_func_i64_i64:
612317017Sdim    Rets.push_back(wasm::ValType::F64);
613317017Sdim    Params.push_back(wasm::ValType::I64);
614317017Sdim    Params.push_back(wasm::ValType::I64);
615317017Sdim    break;
616317017Sdim  case i16_func_f32:
617317017Sdim    Rets.push_back(wasm::ValType::I32);
618317017Sdim    Params.push_back(wasm::ValType::F32);
619317017Sdim    break;
620353358Sdim  case i16_func_f64:
621353358Sdim    Rets.push_back(wasm::ValType::I32);
622353358Sdim    Params.push_back(wasm::ValType::F64);
623353358Sdim    break;
624353358Sdim  case i16_func_i64_i64:
625353358Sdim    Rets.push_back(wasm::ValType::I32);
626353358Sdim    Params.push_back(wasm::ValType::I64);
627353358Sdim    Params.push_back(wasm::ValType::I64);
628353358Sdim    break;
629317017Sdim  case i8_func_i8_i8:
630317017Sdim    Rets.push_back(wasm::ValType::I32);
631317017Sdim    Params.push_back(wasm::ValType::I32);
632317017Sdim    Params.push_back(wasm::ValType::I32);
633317017Sdim    break;
634317017Sdim  case func_f32_iPTR_iPTR:
635317017Sdim    Params.push_back(wasm::ValType::F32);
636353358Sdim    Params.push_back(PtrTy);
637353358Sdim    Params.push_back(PtrTy);
638317017Sdim    break;
639317017Sdim  case func_f64_iPTR_iPTR:
640317017Sdim    Params.push_back(wasm::ValType::F64);
641353358Sdim    Params.push_back(PtrTy);
642353358Sdim    Params.push_back(PtrTy);
643317017Sdim    break;
644317017Sdim  case i16_func_i16_i16:
645317017Sdim    Rets.push_back(wasm::ValType::I32);
646317017Sdim    Params.push_back(wasm::ValType::I32);
647317017Sdim    Params.push_back(wasm::ValType::I32);
648317017Sdim    break;
649317017Sdim  case i32_func_f32_f32:
650317017Sdim    Rets.push_back(wasm::ValType::I32);
651317017Sdim    Params.push_back(wasm::ValType::F32);
652317017Sdim    Params.push_back(wasm::ValType::F32);
653317017Sdim    break;
654317017Sdim  case i32_func_f64_f64:
655317017Sdim    Rets.push_back(wasm::ValType::I32);
656317017Sdim    Params.push_back(wasm::ValType::F64);
657317017Sdim    Params.push_back(wasm::ValType::F64);
658317017Sdim    break;
659317017Sdim  case i32_func_i32_i32:
660317017Sdim    Rets.push_back(wasm::ValType::I32);
661317017Sdim    Params.push_back(wasm::ValType::I32);
662317017Sdim    Params.push_back(wasm::ValType::I32);
663317017Sdim    break;
664341825Sdim  case i32_func_i32_i32_iPTR:
665341825Sdim    Rets.push_back(wasm::ValType::I32);
666341825Sdim    Params.push_back(wasm::ValType::I32);
667341825Sdim    Params.push_back(wasm::ValType::I32);
668353358Sdim    Params.push_back(PtrTy);
669341825Sdim    break;
670317017Sdim  case i64_func_i64_i64:
671317017Sdim    Rets.push_back(wasm::ValType::I64);
672317017Sdim    Params.push_back(wasm::ValType::I64);
673317017Sdim    Params.push_back(wasm::ValType::I64);
674317017Sdim    break;
675341825Sdim  case i64_func_i64_i64_iPTR:
676341825Sdim    Rets.push_back(wasm::ValType::I64);
677341825Sdim    Params.push_back(wasm::ValType::I64);
678341825Sdim    Params.push_back(wasm::ValType::I64);
679353358Sdim    Params.push_back(PtrTy);
680341825Sdim    break;
681317017Sdim  case i64_i64_func_f32:
682317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
683317017Sdim    Rets.push_back(wasm::ValType::I64);
684317017Sdim    Rets.push_back(wasm::ValType::I64);
685317017Sdim#else
686353358Sdim    Params.push_back(PtrTy);
687317017Sdim#endif
688317017Sdim    Params.push_back(wasm::ValType::F32);
689317017Sdim    break;
690317017Sdim  case i64_i64_func_f64:
691317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
692317017Sdim    Rets.push_back(wasm::ValType::I64);
693317017Sdim    Rets.push_back(wasm::ValType::I64);
694317017Sdim#else
695353358Sdim    Params.push_back(PtrTy);
696317017Sdim#endif
697317017Sdim    Params.push_back(wasm::ValType::F64);
698317017Sdim    break;
699317017Sdim  case i16_i16_func_i16_i16:
700317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
701317017Sdim    Rets.push_back(wasm::ValType::I32);
702317017Sdim    Rets.push_back(wasm::ValType::I32);
703317017Sdim#else
704353358Sdim    Params.push_back(PtrTy);
705317017Sdim#endif
706317017Sdim    Params.push_back(wasm::ValType::I32);
707317017Sdim    Params.push_back(wasm::ValType::I32);
708317017Sdim    break;
709317017Sdim  case i32_i32_func_i32_i32:
710317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
711317017Sdim    Rets.push_back(wasm::ValType::I32);
712317017Sdim    Rets.push_back(wasm::ValType::I32);
713317017Sdim#else
714353358Sdim    Params.push_back(PtrTy);
715317017Sdim#endif
716317017Sdim    Params.push_back(wasm::ValType::I32);
717317017Sdim    Params.push_back(wasm::ValType::I32);
718317017Sdim    break;
719317017Sdim  case i64_i64_func_i64_i64:
720317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
721317017Sdim    Rets.push_back(wasm::ValType::I64);
722317017Sdim    Rets.push_back(wasm::ValType::I64);
723317017Sdim#else
724353358Sdim    Params.push_back(PtrTy);
725317017Sdim#endif
726317017Sdim    Params.push_back(wasm::ValType::I64);
727317017Sdim    Params.push_back(wasm::ValType::I64);
728317017Sdim    break;
729317017Sdim  case i64_i64_func_i64_i64_i64_i64:
730317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
731317017Sdim    Rets.push_back(wasm::ValType::I64);
732317017Sdim    Rets.push_back(wasm::ValType::I64);
733317017Sdim#else
734353358Sdim    Params.push_back(PtrTy);
735317017Sdim#endif
736317017Sdim    Params.push_back(wasm::ValType::I64);
737317017Sdim    Params.push_back(wasm::ValType::I64);
738317017Sdim    Params.push_back(wasm::ValType::I64);
739317017Sdim    Params.push_back(wasm::ValType::I64);
740317017Sdim    break;
741341825Sdim  case i64_i64_func_i64_i64_i64_i64_iPTR:
742341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
743341825Sdim    Rets.push_back(wasm::ValType::I64);
744341825Sdim    Rets.push_back(wasm::ValType::I64);
745341825Sdim#else
746353358Sdim    Params.push_back(PtrTy);
747341825Sdim#endif
748341825Sdim    Params.push_back(wasm::ValType::I64);
749341825Sdim    Params.push_back(wasm::ValType::I64);
750341825Sdim    Params.push_back(wasm::ValType::I64);
751341825Sdim    Params.push_back(wasm::ValType::I64);
752353358Sdim    Params.push_back(PtrTy);
753341825Sdim    break;
754317017Sdim  case i64_i64_i64_i64_func_i64_i64_i64_i64:
755317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
756317017Sdim    Rets.push_back(wasm::ValType::I64);
757317017Sdim    Rets.push_back(wasm::ValType::I64);
758317017Sdim    Rets.push_back(wasm::ValType::I64);
759317017Sdim    Rets.push_back(wasm::ValType::I64);
760317017Sdim#else
761353358Sdim    Params.push_back(PtrTy);
762317017Sdim#endif
763317017Sdim    Params.push_back(wasm::ValType::I64);
764317017Sdim    Params.push_back(wasm::ValType::I64);
765317017Sdim    Params.push_back(wasm::ValType::I64);
766317017Sdim    Params.push_back(wasm::ValType::I64);
767317017Sdim    break;
768317017Sdim  case i64_i64_func_i64_i64_i32:
769317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support.
770317017Sdim    Rets.push_back(wasm::ValType::I64);
771317017Sdim    Rets.push_back(wasm::ValType::I64);
772317017Sdim    Rets.push_back(wasm::ValType::I64);
773317017Sdim    Rets.push_back(wasm::ValType::I64);
774317017Sdim#else
775353358Sdim    Params.push_back(PtrTy);
776317017Sdim#endif
777317017Sdim    Params.push_back(wasm::ValType::I64);
778317017Sdim    Params.push_back(wasm::ValType::I64);
779317017Sdim    Params.push_back(wasm::ValType::I32);
780317017Sdim    break;
781317017Sdim  case iPTR_func_iPTR_i32_iPTR:
782353358Sdim    Rets.push_back(PtrTy);
783353358Sdim    Params.push_back(PtrTy);
784317017Sdim    Params.push_back(wasm::ValType::I32);
785353358Sdim    Params.push_back(PtrTy);
786317017Sdim    break;
787317017Sdim  case iPTR_func_iPTR_iPTR_iPTR:
788353358Sdim    Rets.push_back(PtrTy);
789353358Sdim    Params.push_back(PtrTy);
790353358Sdim    Params.push_back(PtrTy);
791353358Sdim    Params.push_back(PtrTy);
792317017Sdim    break;
793317017Sdim  case f32_func_f32_f32_f32:
794317017Sdim    Rets.push_back(wasm::ValType::F32);
795317017Sdim    Params.push_back(wasm::ValType::F32);
796317017Sdim    Params.push_back(wasm::ValType::F32);
797317017Sdim    Params.push_back(wasm::ValType::F32);
798317017Sdim    break;
799317017Sdim  case f64_func_f64_f64_f64:
800317017Sdim    Rets.push_back(wasm::ValType::F64);
801317017Sdim    Params.push_back(wasm::ValType::F64);
802317017Sdim    Params.push_back(wasm::ValType::F64);
803317017Sdim    Params.push_back(wasm::ValType::F64);
804317017Sdim    break;
805317017Sdim  case func_i64_i64_iPTR_iPTR:
806317017Sdim    Params.push_back(wasm::ValType::I64);
807317017Sdim    Params.push_back(wasm::ValType::I64);
808353358Sdim    Params.push_back(PtrTy);
809353358Sdim    Params.push_back(PtrTy);
810317017Sdim    break;
811317017Sdim  case func_iPTR_f32:
812353358Sdim    Params.push_back(PtrTy);
813317017Sdim    Params.push_back(wasm::ValType::F32);
814317017Sdim    break;
815317017Sdim  case func_iPTR_f64:
816353358Sdim    Params.push_back(PtrTy);
817317017Sdim    Params.push_back(wasm::ValType::F64);
818317017Sdim    break;
819317017Sdim  case func_iPTR_i32:
820353358Sdim    Params.push_back(PtrTy);
821317017Sdim    Params.push_back(wasm::ValType::I32);
822317017Sdim    break;
823317017Sdim  case func_iPTR_i64:
824353358Sdim    Params.push_back(PtrTy);
825317017Sdim    Params.push_back(wasm::ValType::I64);
826317017Sdim    break;
827317017Sdim  case func_iPTR_i64_i64:
828353358Sdim    Params.push_back(PtrTy);
829317017Sdim    Params.push_back(wasm::ValType::I64);
830317017Sdim    Params.push_back(wasm::ValType::I64);
831317017Sdim    break;
832317017Sdim  case func_iPTR_i64_i64_i64_i64:
833353358Sdim    Params.push_back(PtrTy);
834317017Sdim    Params.push_back(wasm::ValType::I64);
835317017Sdim    Params.push_back(wasm::ValType::I64);
836317017Sdim    Params.push_back(wasm::ValType::I64);
837317017Sdim    Params.push_back(wasm::ValType::I64);
838317017Sdim    break;
839317017Sdim  case func_iPTR_i64_i64_i64_i64_i64_i64:
840353358Sdim    Params.push_back(PtrTy);
841317017Sdim    Params.push_back(wasm::ValType::I64);
842317017Sdim    Params.push_back(wasm::ValType::I64);
843317017Sdim    Params.push_back(wasm::ValType::I64);
844317017Sdim    Params.push_back(wasm::ValType::I64);
845317017Sdim    Params.push_back(wasm::ValType::I64);
846317017Sdim    Params.push_back(wasm::ValType::I64);
847317017Sdim    break;
848317017Sdim  case i32_func_i64_i64:
849317017Sdim    Rets.push_back(wasm::ValType::I32);
850317017Sdim    Params.push_back(wasm::ValType::I64);
851317017Sdim    Params.push_back(wasm::ValType::I64);
852317017Sdim    break;
853317017Sdim  case i32_func_i64_i64_i64_i64:
854317017Sdim    Rets.push_back(wasm::ValType::I32);
855317017Sdim    Params.push_back(wasm::ValType::I64);
856317017Sdim    Params.push_back(wasm::ValType::I64);
857317017Sdim    Params.push_back(wasm::ValType::I64);
858317017Sdim    Params.push_back(wasm::ValType::I64);
859317017Sdim    break;
860353358Sdim  case iPTR_func_f32:
861353358Sdim    Rets.push_back(PtrTy);
862353358Sdim    Params.push_back(wasm::ValType::F32);
863353358Sdim    break;
864353358Sdim  case iPTR_func_f64:
865353358Sdim    Rets.push_back(PtrTy);
866353358Sdim    Params.push_back(wasm::ValType::F64);
867353358Sdim    break;
868353358Sdim  case iPTR_func_i64_i64:
869353358Sdim    Rets.push_back(PtrTy);
870353358Sdim    Params.push_back(wasm::ValType::I64);
871353358Sdim    Params.push_back(wasm::ValType::I64);
872353358Sdim    break;
873317017Sdim  case unsupported:
874317017Sdim    llvm_unreachable("unsupported runtime library signature");
875317017Sdim  }
876317017Sdim}
877317017Sdim
878341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
879341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
880341825Sdim// other than here, just roll its logic into this version.
881353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
882344779Sdim                               const char *Name,
883344779Sdim                               SmallVectorImpl<wasm::ValType> &Rets,
884344779Sdim                               SmallVectorImpl<wasm::ValType> &Params) {
885344779Sdim  auto &Map = LibcallNameMap->Map;
886353358Sdim  auto Val = Map.find(Name);
887353358Sdim#ifndef NDEBUG
888353358Sdim  if (Val == Map.end()) {
889353358Sdim    auto message = std::string("unexpected runtime library name: ") + Name;
890353358Sdim    llvm_unreachable(message.c_str());
891353358Sdim  }
892353358Sdim#endif
893353358Sdim  return getLibcallSignature(Subtarget, Val->second, Rets, Params);
894317017Sdim}
895