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