1*0b57cec5SDimitry Andric // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric ///
9*0b57cec5SDimitry Andric /// \file
10*0b57cec5SDimitry Andric /// This file contains signature information for runtime libcalls.
11*0b57cec5SDimitry Andric ///
12*0b57cec5SDimitry Andric /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
13*0b57cec5SDimitry Andric /// target needs type information for all functions. This file contains a big
14*0b57cec5SDimitry Andric /// table providing type signatures for all runtime library functions that LLVM
15*0b57cec5SDimitry Andric /// uses.
16*0b57cec5SDimitry Andric ///
17*0b57cec5SDimitry Andric /// This is currently a fairly heavy-handed solution.
18*0b57cec5SDimitry Andric ///
19*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
20*0b57cec5SDimitry Andric 
21*0b57cec5SDimitry Andric #include "WebAssemblyRuntimeLibcallSignatures.h"
22*0b57cec5SDimitry Andric #include "WebAssemblySubtarget.h"
23*0b57cec5SDimitry Andric #include "llvm/CodeGen/RuntimeLibcalls.h"
24*0b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h"
25*0b57cec5SDimitry Andric 
26*0b57cec5SDimitry Andric using namespace llvm;
27*0b57cec5SDimitry Andric 
28*0b57cec5SDimitry Andric namespace {
29*0b57cec5SDimitry Andric 
30*0b57cec5SDimitry Andric enum RuntimeLibcallSignature {
31*0b57cec5SDimitry Andric   func,
32*0b57cec5SDimitry Andric   f32_func_f32,
33*0b57cec5SDimitry Andric   f32_func_f64,
34*0b57cec5SDimitry Andric   f32_func_i32,
35*0b57cec5SDimitry Andric   f32_func_i64,
36*0b57cec5SDimitry Andric   f32_func_i16,
37*0b57cec5SDimitry Andric   f64_func_f32,
38*0b57cec5SDimitry Andric   f64_func_f64,
39*0b57cec5SDimitry Andric   f64_func_i32,
40*0b57cec5SDimitry Andric   f64_func_i64,
41*0b57cec5SDimitry Andric   i32_func_f32,
42*0b57cec5SDimitry Andric   i32_func_f64,
43*0b57cec5SDimitry Andric   i32_func_i32,
44*0b57cec5SDimitry Andric   i64_func_f32,
45*0b57cec5SDimitry Andric   i64_func_f64,
46*0b57cec5SDimitry Andric   i64_func_i64,
47*0b57cec5SDimitry Andric   f32_func_f32_f32,
48*0b57cec5SDimitry Andric   f32_func_f32_i32,
49*0b57cec5SDimitry Andric   f32_func_i64_i64,
50*0b57cec5SDimitry Andric   f64_func_f64_f64,
51*0b57cec5SDimitry Andric   f64_func_f64_i32,
52*0b57cec5SDimitry Andric   f64_func_i64_i64,
53*0b57cec5SDimitry Andric   i16_func_f32,
54*0b57cec5SDimitry Andric   i16_func_f64,
55*0b57cec5SDimitry Andric   i16_func_i64_i64,
56*0b57cec5SDimitry Andric   i8_func_i8_i8,
57*0b57cec5SDimitry Andric   func_f32_iPTR_iPTR,
58*0b57cec5SDimitry Andric   func_f64_iPTR_iPTR,
59*0b57cec5SDimitry Andric   i16_func_i16_i16,
60*0b57cec5SDimitry Andric   i32_func_f32_f32,
61*0b57cec5SDimitry Andric   i32_func_f64_f64,
62*0b57cec5SDimitry Andric   i32_func_i32_i32,
63*0b57cec5SDimitry Andric   i32_func_i32_i32_iPTR,
64*0b57cec5SDimitry Andric   i64_func_i64_i64,
65*0b57cec5SDimitry Andric   i64_func_i64_i64_iPTR,
66*0b57cec5SDimitry Andric   i64_i64_func_f32,
67*0b57cec5SDimitry Andric   i64_i64_func_f64,
68*0b57cec5SDimitry Andric   i16_i16_func_i16_i16,
69*0b57cec5SDimitry Andric   i32_i32_func_i32_i32,
70*0b57cec5SDimitry Andric   i64_i64_func_i64_i64,
71*0b57cec5SDimitry Andric   i64_i64_func_i64_i64_i64_i64,
72*0b57cec5SDimitry Andric   i64_i64_func_i64_i64_i64_i64_iPTR,
73*0b57cec5SDimitry Andric   i64_i64_i64_i64_func_i64_i64_i64_i64,
74*0b57cec5SDimitry Andric   i64_i64_func_i64_i64_i32,
75*0b57cec5SDimitry Andric   iPTR_func_iPTR_i32_iPTR,
76*0b57cec5SDimitry Andric   iPTR_func_iPTR_iPTR_iPTR,
77*0b57cec5SDimitry Andric   f32_func_f32_f32_f32,
78*0b57cec5SDimitry Andric   f64_func_f64_f64_f64,
79*0b57cec5SDimitry Andric   func_i64_i64_iPTR_iPTR,
80*0b57cec5SDimitry Andric   func_iPTR_f32,
81*0b57cec5SDimitry Andric   func_iPTR_f64,
82*0b57cec5SDimitry Andric   func_iPTR_i32,
83*0b57cec5SDimitry Andric   func_iPTR_i64,
84*0b57cec5SDimitry Andric   func_iPTR_i64_i64,
855ffd83dbSDimitry Andric   func_iPTR_i64_i64_i32,
86*0b57cec5SDimitry Andric   func_iPTR_i64_i64_i64_i64,
87*0b57cec5SDimitry Andric   func_iPTR_i64_i64_i64_i64_i64_i64,
88*0b57cec5SDimitry Andric   i32_func_i64_i64,
89*0b57cec5SDimitry Andric   i32_func_i64_i64_i64_i64,
90*0b57cec5SDimitry Andric   iPTR_func_f32,
91*0b57cec5SDimitry Andric   iPTR_func_f64,
92*0b57cec5SDimitry Andric   iPTR_func_i64_i64,
93*0b57cec5SDimitry Andric   unsupported
94*0b57cec5SDimitry Andric };
95*0b57cec5SDimitry Andric 
96*0b57cec5SDimitry Andric struct RuntimeLibcallSignatureTable {
97*0b57cec5SDimitry Andric   std::vector<RuntimeLibcallSignature> Table;
98*0b57cec5SDimitry Andric 
99*0b57cec5SDimitry Andric   // Any newly-added libcalls will be unsupported by default.
100*0b57cec5SDimitry Andric   RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
101*0b57cec5SDimitry Andric     // Integer
102*0b57cec5SDimitry Andric     Table[RTLIB::SHL_I16] = i16_func_i16_i16;
103*0b57cec5SDimitry Andric     Table[RTLIB::SHL_I32] = i32_func_i32_i32;
104*0b57cec5SDimitry Andric     Table[RTLIB::SHL_I64] = i64_func_i64_i64;
105*0b57cec5SDimitry Andric     Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
106*0b57cec5SDimitry Andric     Table[RTLIB::SRL_I16] = i16_func_i16_i16;
107*0b57cec5SDimitry Andric     Table[RTLIB::SRL_I32] = i32_func_i32_i32;
108*0b57cec5SDimitry Andric     Table[RTLIB::SRL_I64] = i64_func_i64_i64;
109*0b57cec5SDimitry Andric     Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
110*0b57cec5SDimitry Andric     Table[RTLIB::SRA_I16] = i16_func_i16_i16;
111*0b57cec5SDimitry Andric     Table[RTLIB::SRA_I32] = i32_func_i32_i32;
112*0b57cec5SDimitry Andric     Table[RTLIB::SRA_I64] = i64_func_i64_i64;
113*0b57cec5SDimitry Andric     Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
114*0b57cec5SDimitry Andric     Table[RTLIB::MUL_I8] = i8_func_i8_i8;
115*0b57cec5SDimitry Andric     Table[RTLIB::MUL_I16] = i16_func_i16_i16;
116*0b57cec5SDimitry Andric     Table[RTLIB::MUL_I32] = i32_func_i32_i32;
117*0b57cec5SDimitry Andric     Table[RTLIB::MUL_I64] = i64_func_i64_i64;
118*0b57cec5SDimitry Andric     Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
119*0b57cec5SDimitry Andric     Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
120*0b57cec5SDimitry Andric     Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
121*0b57cec5SDimitry Andric     Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
122*0b57cec5SDimitry Andric     Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
123*0b57cec5SDimitry Andric     Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
124*0b57cec5SDimitry Andric     Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
125*0b57cec5SDimitry Andric     Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
126*0b57cec5SDimitry Andric     Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
127*0b57cec5SDimitry Andric     Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
128*0b57cec5SDimitry Andric     Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
129*0b57cec5SDimitry Andric     Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
130*0b57cec5SDimitry Andric     Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
131*0b57cec5SDimitry Andric     Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
132*0b57cec5SDimitry Andric     Table[RTLIB::SREM_I8] = i8_func_i8_i8;
133*0b57cec5SDimitry Andric     Table[RTLIB::SREM_I16] = i16_func_i16_i16;
134*0b57cec5SDimitry Andric     Table[RTLIB::SREM_I32] = i32_func_i32_i32;
135*0b57cec5SDimitry Andric     Table[RTLIB::SREM_I64] = i64_func_i64_i64;
136*0b57cec5SDimitry Andric     Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
137*0b57cec5SDimitry Andric     Table[RTLIB::UREM_I8] = i8_func_i8_i8;
138*0b57cec5SDimitry Andric     Table[RTLIB::UREM_I16] = i16_func_i16_i16;
139*0b57cec5SDimitry Andric     Table[RTLIB::UREM_I32] = i32_func_i32_i32;
140*0b57cec5SDimitry Andric     Table[RTLIB::UREM_I64] = i64_func_i64_i64;
141*0b57cec5SDimitry Andric     Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
142*0b57cec5SDimitry Andric     Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
143*0b57cec5SDimitry Andric     Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
144*0b57cec5SDimitry Andric     Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
145*0b57cec5SDimitry Andric     Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
146*0b57cec5SDimitry Andric     Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
147*0b57cec5SDimitry Andric     Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
148*0b57cec5SDimitry Andric     Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
149*0b57cec5SDimitry Andric     Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
150*0b57cec5SDimitry Andric     Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
151*0b57cec5SDimitry Andric     Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
152*0b57cec5SDimitry Andric     Table[RTLIB::NEG_I32] = i32_func_i32;
153*0b57cec5SDimitry Andric     Table[RTLIB::NEG_I64] = i64_func_i64;
154*0b57cec5SDimitry Andric 
155*0b57cec5SDimitry Andric     // Floating-point.
156*0b57cec5SDimitry Andric     // All F80 and PPCF128 routines are unsupported.
157*0b57cec5SDimitry Andric     Table[RTLIB::ADD_F32] = f32_func_f32_f32;
158*0b57cec5SDimitry Andric     Table[RTLIB::ADD_F64] = f64_func_f64_f64;
159*0b57cec5SDimitry Andric     Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
160*0b57cec5SDimitry Andric     Table[RTLIB::SUB_F32] = f32_func_f32_f32;
161*0b57cec5SDimitry Andric     Table[RTLIB::SUB_F64] = f64_func_f64_f64;
162*0b57cec5SDimitry Andric     Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
163*0b57cec5SDimitry Andric     Table[RTLIB::MUL_F32] = f32_func_f32_f32;
164*0b57cec5SDimitry Andric     Table[RTLIB::MUL_F64] = f64_func_f64_f64;
165*0b57cec5SDimitry Andric     Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
166*0b57cec5SDimitry Andric     Table[RTLIB::DIV_F32] = f32_func_f32_f32;
167*0b57cec5SDimitry Andric     Table[RTLIB::DIV_F64] = f64_func_f64_f64;
168*0b57cec5SDimitry Andric     Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
169*0b57cec5SDimitry Andric     Table[RTLIB::REM_F32] = f32_func_f32_f32;
170*0b57cec5SDimitry Andric     Table[RTLIB::REM_F64] = f64_func_f64_f64;
171*0b57cec5SDimitry Andric     Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
172*0b57cec5SDimitry Andric     Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
173*0b57cec5SDimitry Andric     Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
174*0b57cec5SDimitry Andric     Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
175*0b57cec5SDimitry Andric     Table[RTLIB::POWI_F32] = f32_func_f32_i32;
176*0b57cec5SDimitry Andric     Table[RTLIB::POWI_F64] = f64_func_f64_i32;
1775ffd83dbSDimitry Andric     Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i32;
178*0b57cec5SDimitry Andric     Table[RTLIB::SQRT_F32] = f32_func_f32;
179*0b57cec5SDimitry Andric     Table[RTLIB::SQRT_F64] = f64_func_f64;
180*0b57cec5SDimitry Andric     Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
1815ffd83dbSDimitry Andric     Table[RTLIB::CBRT_F32] = f32_func_f32;
1825ffd83dbSDimitry Andric     Table[RTLIB::CBRT_F64] = f64_func_f64;
1835ffd83dbSDimitry Andric     Table[RTLIB::CBRT_F128] = func_iPTR_i64_i64;
184*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F32] = f32_func_f32;
185*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F64] = f64_func_f64;
186*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
187*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F32] = f32_func_f32;
188*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F64] = f64_func_f64;
189*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
190*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F32] = f32_func_f32;
191*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F64] = f64_func_f64;
192*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
193*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F32] = f32_func_f32;
194*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F64] = f64_func_f64;
195*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
196*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F32] = f32_func_f32;
197*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F64] = f64_func_f64;
198*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
199*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F32] = f32_func_f32;
200*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F64] = f64_func_f64;
201*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
202*0b57cec5SDimitry Andric     Table[RTLIB::COS_F32] = f32_func_f32;
203*0b57cec5SDimitry Andric     Table[RTLIB::COS_F64] = f64_func_f64;
204*0b57cec5SDimitry Andric     Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
205*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
206*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
207*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
208*0b57cec5SDimitry Andric     Table[RTLIB::POW_F32] = f32_func_f32_f32;
209*0b57cec5SDimitry Andric     Table[RTLIB::POW_F64] = f64_func_f64_f64;
210*0b57cec5SDimitry Andric     Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
211*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F32] = f32_func_f32;
212*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F64] = f64_func_f64;
213*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
214*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F32] = f32_func_f32;
215*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F64] = f64_func_f64;
216*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
217*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F32] = f32_func_f32;
218*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F64] = f64_func_f64;
219*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
220*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
221*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
222*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
223*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F32] = f32_func_f32;
224*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F64] = f64_func_f64;
225*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
226*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F32] = iPTR_func_f32;
227*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F64] = iPTR_func_f64;
228*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
229*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F32] = i64_func_f32;
230*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F64] = i64_func_f64;
231*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
232*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F32] = iPTR_func_f32;
233*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F64] = iPTR_func_f64;
234*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
235*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F32] = i64_func_f32;
236*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F64] = i64_func_f64;
237*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
238*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F32] = f32_func_f32;
239*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F64] = f64_func_f64;
240*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
241*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
242*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
243*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
244*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
245*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
246*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
247*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
248*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
249*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
250*0b57cec5SDimitry Andric 
251*0b57cec5SDimitry Andric     // Conversion
252*0b57cec5SDimitry Andric     // All F80 and PPCF128 routines are unsupported.
253*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
254*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
255*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
256*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
257*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
258*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
259*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
260*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
261*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
262*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
263*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
264*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
265*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
266*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
267*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
268*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
269*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
270*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
271*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
272*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
273*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
274*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
275*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
276*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
277*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
278*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
279*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
280*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
281*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
282*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
283*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
284*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
285*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
286*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
287*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
288*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
289*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
290*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
291*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
292*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
293*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
294*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
295*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
296*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
297*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
298*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
299*0b57cec5SDimitry Andric 
300*0b57cec5SDimitry Andric     // Comparison
301*0b57cec5SDimitry Andric     // ALl F80 and PPCF128 routines are unsupported.
302*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
303*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
304*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
305*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F32] = i32_func_f32_f32;
306*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F64] = i32_func_f64_f64;
307*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
308*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F32] = i32_func_f32_f32;
309*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F64] = i32_func_f64_f64;
310*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
311*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F32] = i32_func_f32_f32;
312*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F64] = i32_func_f64_f64;
313*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
314*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F32] = i32_func_f32_f32;
315*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F64] = i32_func_f64_f64;
316*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
317*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F32] = i32_func_f32_f32;
318*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F64] = i32_func_f64_f64;
319*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
320*0b57cec5SDimitry Andric     Table[RTLIB::UO_F32] = i32_func_f32_f32;
321*0b57cec5SDimitry Andric     Table[RTLIB::UO_F64] = i32_func_f64_f64;
322*0b57cec5SDimitry Andric     Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
323*0b57cec5SDimitry Andric 
324*0b57cec5SDimitry Andric     // Memory
325*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
326*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
327*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
328*0b57cec5SDimitry Andric 
329*0b57cec5SDimitry Andric     // __stack_chk_fail
330*0b57cec5SDimitry Andric     Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
331*0b57cec5SDimitry Andric 
332*0b57cec5SDimitry Andric     // Return address handling
333*0b57cec5SDimitry Andric     Table[RTLIB::RETURN_ADDRESS] = i32_func_i32;
334*0b57cec5SDimitry Andric 
335*0b57cec5SDimitry Andric     // Element-wise Atomic memory
336*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
337*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
338*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
339*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
340*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
341*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
342*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
343*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
344*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
345*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
346*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
347*0b57cec5SDimitry Andric 
348*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
349*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
350*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
351*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
352*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
353*0b57cec5SDimitry Andric 
354*0b57cec5SDimitry Andric     // Atomic '__sync_*' libcalls.
355*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
356*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
357*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
358*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
359*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
360*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
361*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
362*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
363*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
364*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
365*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
366*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
367*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
368*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
369*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
370*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
371*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
372*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
373*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
374*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
375*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
376*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
377*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
378*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
379*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
380*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
381*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
382*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
383*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
384*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
385*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
386*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
387*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
388*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
389*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
390*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
391*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
392*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
393*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
394*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
395*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
396*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
397*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
398*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
399*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
400*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
401*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
402*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
403*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
404*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
405*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
406*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
407*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
408*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
409*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
410*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
411*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
412*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
413*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
414*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
415*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
416*0b57cec5SDimitry Andric 
417*0b57cec5SDimitry Andric     // Atomic '__atomic_*' libcalls.
418*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
419*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD] = unsupported;
420*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
421*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
422*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
423*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
424*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
425*0b57cec5SDimitry Andric 
426*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE] = unsupported;
427*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_1] = unsupported;
428*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_2] = unsupported;
429*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_4] = unsupported;
430*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_8] = unsupported;
431*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_16] = unsupported;
432*0b57cec5SDimitry Andric 
433*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
434*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
435*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
436*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
437*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
438*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
439*0b57cec5SDimitry Andric 
440*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
441*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
442*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
443*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
444*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
445*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
446*0b57cec5SDimitry Andric 
447*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
448*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
449*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
450*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
451*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
452*0b57cec5SDimitry Andric 
453*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
454*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
455*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
456*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
457*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
458*0b57cec5SDimitry Andric 
459*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
460*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
461*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
462*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
463*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
464*0b57cec5SDimitry Andric 
465*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
466*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
467*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
468*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
469*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
470*0b57cec5SDimitry Andric 
471*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
472*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
473*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
474*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
475*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
476*0b57cec5SDimitry Andric 
477*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
478*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
479*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
480*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
481*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
482*0b57cec5SDimitry Andric   }
483*0b57cec5SDimitry Andric };
484*0b57cec5SDimitry Andric 
485*0b57cec5SDimitry Andric ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
486*0b57cec5SDimitry Andric 
487*0b57cec5SDimitry Andric // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
488*0b57cec5SDimitry Andric // constructor for use with ManagedStatic
489*0b57cec5SDimitry Andric struct StaticLibcallNameMap {
490*0b57cec5SDimitry Andric   StringMap<RTLIB::Libcall> Map;
491*0b57cec5SDimitry Andric   StaticLibcallNameMap() {
492*0b57cec5SDimitry Andric     static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
493*0b57cec5SDimitry Andric #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
494*0b57cec5SDimitry Andric #include "llvm/IR/RuntimeLibcalls.def"
495*0b57cec5SDimitry Andric #undef HANDLE_LIBCALL
496*0b57cec5SDimitry Andric     };
497*0b57cec5SDimitry Andric     for (const auto &NameLibcall : NameLibcalls) {
498*0b57cec5SDimitry Andric       if (NameLibcall.first != nullptr &&
499*0b57cec5SDimitry Andric           RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
500*0b57cec5SDimitry Andric         assert(Map.find(NameLibcall.first) == Map.end() &&
501*0b57cec5SDimitry Andric                "duplicate libcall names in name map");
502*0b57cec5SDimitry Andric         Map[NameLibcall.first] = NameLibcall.second;
503*0b57cec5SDimitry Andric       }
504*0b57cec5SDimitry Andric     }
505*0b57cec5SDimitry Andric     // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
506*0b57cec5SDimitry Andric     // consistent with the f64 and f128 names.
507*0b57cec5SDimitry Andric     Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
508*0b57cec5SDimitry Andric     Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
509*0b57cec5SDimitry Andric 
510*0b57cec5SDimitry Andric     Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
511*0b57cec5SDimitry Andric   }
512*0b57cec5SDimitry Andric };
513*0b57cec5SDimitry Andric 
514*0b57cec5SDimitry Andric } // end anonymous namespace
515*0b57cec5SDimitry Andric 
516*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
517*0b57cec5SDimitry Andric                                RTLIB::Libcall LC,
518*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Rets,
519*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Params) {
520*0b57cec5SDimitry Andric   assert(Rets.empty());
521*0b57cec5SDimitry Andric   assert(Params.empty());
522*0b57cec5SDimitry Andric 
523*0b57cec5SDimitry Andric   wasm::ValType PtrTy =
524*0b57cec5SDimitry Andric       Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
525*0b57cec5SDimitry Andric 
526*0b57cec5SDimitry Andric   auto &Table = RuntimeLibcallSignatures->Table;
527*0b57cec5SDimitry Andric   switch (Table[LC]) {
528*0b57cec5SDimitry Andric   case func:
529*0b57cec5SDimitry Andric     break;
530*0b57cec5SDimitry Andric   case f32_func_f32:
531*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
532*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
533*0b57cec5SDimitry Andric     break;
534*0b57cec5SDimitry Andric   case f32_func_f64:
535*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
536*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
537*0b57cec5SDimitry Andric     break;
538*0b57cec5SDimitry Andric   case f32_func_i32:
539*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
540*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
541*0b57cec5SDimitry Andric     break;
542*0b57cec5SDimitry Andric   case f32_func_i64:
543*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
544*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
545*0b57cec5SDimitry Andric     break;
546*0b57cec5SDimitry Andric   case f32_func_i16:
547*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
548*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
549*0b57cec5SDimitry Andric     break;
550*0b57cec5SDimitry Andric   case f64_func_f32:
551*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
552*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
553*0b57cec5SDimitry Andric     break;
554*0b57cec5SDimitry Andric   case f64_func_f64:
555*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
556*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
557*0b57cec5SDimitry Andric     break;
558*0b57cec5SDimitry Andric   case f64_func_i32:
559*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
560*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
561*0b57cec5SDimitry Andric     break;
562*0b57cec5SDimitry Andric   case f64_func_i64:
563*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
564*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
565*0b57cec5SDimitry Andric     break;
566*0b57cec5SDimitry Andric   case i32_func_f32:
567*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
568*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
569*0b57cec5SDimitry Andric     break;
570*0b57cec5SDimitry Andric   case i32_func_f64:
571*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
572*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
573*0b57cec5SDimitry Andric     break;
574*0b57cec5SDimitry Andric   case i32_func_i32:
575*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
576*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
577*0b57cec5SDimitry Andric     break;
578*0b57cec5SDimitry Andric   case i64_func_f32:
579*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
580*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
581*0b57cec5SDimitry Andric     break;
582*0b57cec5SDimitry Andric   case i64_func_f64:
583*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
584*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
585*0b57cec5SDimitry Andric     break;
586*0b57cec5SDimitry Andric   case i64_func_i64:
587*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
588*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
589*0b57cec5SDimitry Andric     break;
590*0b57cec5SDimitry Andric   case f32_func_f32_f32:
591*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
592*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
593*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
594*0b57cec5SDimitry Andric     break;
595*0b57cec5SDimitry Andric   case f32_func_f32_i32:
596*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
597*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
598*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
599*0b57cec5SDimitry Andric     break;
600*0b57cec5SDimitry Andric   case f32_func_i64_i64:
601*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
602*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
603*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
604*0b57cec5SDimitry Andric     break;
605*0b57cec5SDimitry Andric   case f64_func_f64_f64:
606*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
607*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
608*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
609*0b57cec5SDimitry Andric     break;
610*0b57cec5SDimitry Andric   case f64_func_f64_i32:
611*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
612*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
613*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
614*0b57cec5SDimitry Andric     break;
615*0b57cec5SDimitry Andric   case f64_func_i64_i64:
616*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
617*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
618*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
619*0b57cec5SDimitry Andric     break;
620*0b57cec5SDimitry Andric   case i16_func_f32:
621*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
622*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
623*0b57cec5SDimitry Andric     break;
624*0b57cec5SDimitry Andric   case i16_func_f64:
625*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
626*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
627*0b57cec5SDimitry Andric     break;
628*0b57cec5SDimitry Andric   case i16_func_i64_i64:
629*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
630*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
631*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
632*0b57cec5SDimitry Andric     break;
633*0b57cec5SDimitry Andric   case i8_func_i8_i8:
634*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
635*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
636*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
637*0b57cec5SDimitry Andric     break;
638*0b57cec5SDimitry Andric   case func_f32_iPTR_iPTR:
639*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
640*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
641*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
642*0b57cec5SDimitry Andric     break;
643*0b57cec5SDimitry Andric   case func_f64_iPTR_iPTR:
644*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
645*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
646*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
647*0b57cec5SDimitry Andric     break;
648*0b57cec5SDimitry Andric   case i16_func_i16_i16:
649*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
650*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
651*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
652*0b57cec5SDimitry Andric     break;
653*0b57cec5SDimitry Andric   case i32_func_f32_f32:
654*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
655*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
656*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
657*0b57cec5SDimitry Andric     break;
658*0b57cec5SDimitry Andric   case i32_func_f64_f64:
659*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
660*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
661*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
662*0b57cec5SDimitry Andric     break;
663*0b57cec5SDimitry Andric   case i32_func_i32_i32:
664*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
665*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
666*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
667*0b57cec5SDimitry Andric     break;
668*0b57cec5SDimitry Andric   case i32_func_i32_i32_iPTR:
669*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
670*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
671*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
672*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
673*0b57cec5SDimitry Andric     break;
674*0b57cec5SDimitry Andric   case i64_func_i64_i64:
675*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
676*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
677*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
678*0b57cec5SDimitry Andric     break;
679*0b57cec5SDimitry Andric   case i64_func_i64_i64_iPTR:
680*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
681*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
682*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
683*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
684*0b57cec5SDimitry Andric     break;
685*0b57cec5SDimitry Andric   case i64_i64_func_f32:
686*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
687*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
688*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
689*0b57cec5SDimitry Andric #else
690*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
691*0b57cec5SDimitry Andric #endif
692*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
693*0b57cec5SDimitry Andric     break;
694*0b57cec5SDimitry Andric   case i64_i64_func_f64:
695*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
696*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
697*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
698*0b57cec5SDimitry Andric #else
699*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
700*0b57cec5SDimitry Andric #endif
701*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
702*0b57cec5SDimitry Andric     break;
703*0b57cec5SDimitry Andric   case i16_i16_func_i16_i16:
704*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
705*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
706*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
707*0b57cec5SDimitry Andric #else
708*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
709*0b57cec5SDimitry Andric #endif
710*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
711*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
712*0b57cec5SDimitry Andric     break;
713*0b57cec5SDimitry Andric   case i32_i32_func_i32_i32:
714*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
715*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
716*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
717*0b57cec5SDimitry Andric #else
718*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
719*0b57cec5SDimitry Andric #endif
720*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
721*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
722*0b57cec5SDimitry Andric     break;
723*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64:
724*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
725*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
726*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
727*0b57cec5SDimitry Andric #else
728*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
729*0b57cec5SDimitry Andric #endif
730*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
731*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
732*0b57cec5SDimitry Andric     break;
733*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i64_i64:
734*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
735*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
736*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
737*0b57cec5SDimitry Andric #else
738*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
739*0b57cec5SDimitry Andric #endif
740*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
741*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
742*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
743*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
744*0b57cec5SDimitry Andric     break;
745*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i64_i64_iPTR:
746*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
747*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
748*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
749*0b57cec5SDimitry Andric #else
750*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
751*0b57cec5SDimitry Andric #endif
752*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
753*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
754*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
755*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
756*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
757*0b57cec5SDimitry Andric     break;
758*0b57cec5SDimitry Andric   case i64_i64_i64_i64_func_i64_i64_i64_i64:
759*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
760*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
761*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
762*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
763*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
764*0b57cec5SDimitry Andric #else
765*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
766*0b57cec5SDimitry Andric #endif
767*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
768*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
769*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
770*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
771*0b57cec5SDimitry Andric     break;
772*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i32:
773*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
774*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
775*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
776*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
777*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
778*0b57cec5SDimitry Andric #else
779*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
780*0b57cec5SDimitry Andric #endif
781*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
782*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
783*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
784*0b57cec5SDimitry Andric     break;
785*0b57cec5SDimitry Andric   case iPTR_func_iPTR_i32_iPTR:
786*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
787*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
788*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
789*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
790*0b57cec5SDimitry Andric     break;
791*0b57cec5SDimitry Andric   case iPTR_func_iPTR_iPTR_iPTR:
792*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
793*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
794*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
795*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
796*0b57cec5SDimitry Andric     break;
797*0b57cec5SDimitry Andric   case f32_func_f32_f32_f32:
798*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
799*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
800*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
801*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
802*0b57cec5SDimitry Andric     break;
803*0b57cec5SDimitry Andric   case f64_func_f64_f64_f64:
804*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
805*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
806*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
807*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
808*0b57cec5SDimitry Andric     break;
809*0b57cec5SDimitry Andric   case func_i64_i64_iPTR_iPTR:
810*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
811*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
812*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
813*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
814*0b57cec5SDimitry Andric     break;
815*0b57cec5SDimitry Andric   case func_iPTR_f32:
816*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
817*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
818*0b57cec5SDimitry Andric     break;
819*0b57cec5SDimitry Andric   case func_iPTR_f64:
820*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
821*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
822*0b57cec5SDimitry Andric     break;
823*0b57cec5SDimitry Andric   case func_iPTR_i32:
824*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
825*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
826*0b57cec5SDimitry Andric     break;
827*0b57cec5SDimitry Andric   case func_iPTR_i64:
828*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
829*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
830*0b57cec5SDimitry Andric     break;
831*0b57cec5SDimitry Andric   case func_iPTR_i64_i64:
832*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
833*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
834*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
835*0b57cec5SDimitry Andric     break;
8365ffd83dbSDimitry Andric   case func_iPTR_i64_i64_i32:
8375ffd83dbSDimitry Andric     Params.push_back(PtrTy);
8385ffd83dbSDimitry Andric     Params.push_back(wasm::ValType::I64);
8395ffd83dbSDimitry Andric     Params.push_back(wasm::ValType::I64);
8405ffd83dbSDimitry Andric     Params.push_back(wasm::ValType::I32);
8415ffd83dbSDimitry Andric     break;
842*0b57cec5SDimitry Andric   case func_iPTR_i64_i64_i64_i64:
843*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
844*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
845*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
846*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
847*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
848*0b57cec5SDimitry Andric     break;
849*0b57cec5SDimitry Andric   case func_iPTR_i64_i64_i64_i64_i64_i64:
850*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
851*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
852*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
853*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
854*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
855*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
856*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
857*0b57cec5SDimitry Andric     break;
858*0b57cec5SDimitry Andric   case i32_func_i64_i64:
859*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
860*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
861*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
862*0b57cec5SDimitry Andric     break;
863*0b57cec5SDimitry Andric   case i32_func_i64_i64_i64_i64:
864*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
865*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
866*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
867*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
868*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
869*0b57cec5SDimitry Andric     break;
870*0b57cec5SDimitry Andric   case iPTR_func_f32:
871*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
872*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
873*0b57cec5SDimitry Andric     break;
874*0b57cec5SDimitry Andric   case iPTR_func_f64:
875*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
876*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
877*0b57cec5SDimitry Andric     break;
878*0b57cec5SDimitry Andric   case iPTR_func_i64_i64:
879*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
880*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
881*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
882*0b57cec5SDimitry Andric     break;
883*0b57cec5SDimitry Andric   case unsupported:
884*0b57cec5SDimitry Andric     llvm_unreachable("unsupported runtime library signature");
885*0b57cec5SDimitry Andric   }
886*0b57cec5SDimitry Andric }
887*0b57cec5SDimitry Andric 
888*0b57cec5SDimitry Andric static ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
889*0b57cec5SDimitry Andric // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
890*0b57cec5SDimitry Andric // other than here, just roll its logic into this version.
891*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
892*0b57cec5SDimitry Andric                                const char *Name,
893*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Rets,
894*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Params) {
895*0b57cec5SDimitry Andric   auto &Map = LibcallNameMap->Map;
896*0b57cec5SDimitry Andric   auto Val = Map.find(Name);
897*0b57cec5SDimitry Andric #ifndef NDEBUG
898*0b57cec5SDimitry Andric   if (Val == Map.end()) {
899*0b57cec5SDimitry Andric     auto message = std::string("unexpected runtime library name: ") + Name;
900*0b57cec5SDimitry Andric     llvm_unreachable(message.c_str());
901*0b57cec5SDimitry Andric   }
902*0b57cec5SDimitry Andric #endif
903*0b57cec5SDimitry Andric   return getLibcallSignature(Subtarget, Val->second, Rets, Params);
904*0b57cec5SDimitry Andric }
905