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,
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;
176*0b57cec5SDimitry Andric     Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64;
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;
180*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F32] = f32_func_f32;
181*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F64] = f64_func_f64;
182*0b57cec5SDimitry Andric     Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
183*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F32] = f32_func_f32;
184*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F64] = f64_func_f64;
185*0b57cec5SDimitry Andric     Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
186*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F32] = f32_func_f32;
187*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F64] = f64_func_f64;
188*0b57cec5SDimitry Andric     Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
189*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F32] = f32_func_f32;
190*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F64] = f64_func_f64;
191*0b57cec5SDimitry Andric     Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
192*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F32] = f32_func_f32;
193*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F64] = f64_func_f64;
194*0b57cec5SDimitry Andric     Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
195*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F32] = f32_func_f32;
196*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F64] = f64_func_f64;
197*0b57cec5SDimitry Andric     Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
198*0b57cec5SDimitry Andric     Table[RTLIB::COS_F32] = f32_func_f32;
199*0b57cec5SDimitry Andric     Table[RTLIB::COS_F64] = f64_func_f64;
200*0b57cec5SDimitry Andric     Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
201*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
202*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
203*0b57cec5SDimitry Andric     Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
204*0b57cec5SDimitry Andric     Table[RTLIB::POW_F32] = f32_func_f32_f32;
205*0b57cec5SDimitry Andric     Table[RTLIB::POW_F64] = f64_func_f64_f64;
206*0b57cec5SDimitry Andric     Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
207*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F32] = f32_func_f32;
208*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F64] = f64_func_f64;
209*0b57cec5SDimitry Andric     Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
210*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F32] = f32_func_f32;
211*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F64] = f64_func_f64;
212*0b57cec5SDimitry Andric     Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
213*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F32] = f32_func_f32;
214*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F64] = f64_func_f64;
215*0b57cec5SDimitry Andric     Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
216*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
217*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
218*0b57cec5SDimitry Andric     Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
219*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F32] = f32_func_f32;
220*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F64] = f64_func_f64;
221*0b57cec5SDimitry Andric     Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
222*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F32] = iPTR_func_f32;
223*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F64] = iPTR_func_f64;
224*0b57cec5SDimitry Andric     Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
225*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F32] = i64_func_f32;
226*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F64] = i64_func_f64;
227*0b57cec5SDimitry Andric     Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
228*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F32] = iPTR_func_f32;
229*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F64] = iPTR_func_f64;
230*0b57cec5SDimitry Andric     Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
231*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F32] = i64_func_f32;
232*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F64] = i64_func_f64;
233*0b57cec5SDimitry Andric     Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
234*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F32] = f32_func_f32;
235*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F64] = f64_func_f64;
236*0b57cec5SDimitry Andric     Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
237*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
238*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
239*0b57cec5SDimitry Andric     Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
240*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
241*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
242*0b57cec5SDimitry Andric     Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
243*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
244*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
245*0b57cec5SDimitry Andric     Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
246*0b57cec5SDimitry Andric 
247*0b57cec5SDimitry Andric     // Conversion
248*0b57cec5SDimitry Andric     // All F80 and PPCF128 routines are unsupported.
249*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
250*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
251*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
252*0b57cec5SDimitry Andric     Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
253*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
254*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
255*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
256*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
257*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
258*0b57cec5SDimitry Andric     Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
259*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
260*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
261*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
262*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
263*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
264*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
265*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
266*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
267*0b57cec5SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
268*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
269*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
270*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
271*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
272*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
273*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
274*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
275*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
276*0b57cec5SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
277*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
278*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
279*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
280*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
281*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
282*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
283*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
284*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
285*0b57cec5SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
286*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
287*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
288*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
289*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
290*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
291*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
292*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
293*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
294*0b57cec5SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
295*0b57cec5SDimitry Andric 
296*0b57cec5SDimitry Andric     // Comparison
297*0b57cec5SDimitry Andric     // ALl F80 and PPCF128 routines are unsupported.
298*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
299*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
300*0b57cec5SDimitry Andric     Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
301*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F32] = i32_func_f32_f32;
302*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F64] = i32_func_f64_f64;
303*0b57cec5SDimitry Andric     Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
304*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F32] = i32_func_f32_f32;
305*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F64] = i32_func_f64_f64;
306*0b57cec5SDimitry Andric     Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
307*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F32] = i32_func_f32_f32;
308*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F64] = i32_func_f64_f64;
309*0b57cec5SDimitry Andric     Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
310*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F32] = i32_func_f32_f32;
311*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F64] = i32_func_f64_f64;
312*0b57cec5SDimitry Andric     Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
313*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F32] = i32_func_f32_f32;
314*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F64] = i32_func_f64_f64;
315*0b57cec5SDimitry Andric     Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
316*0b57cec5SDimitry Andric     Table[RTLIB::UO_F32] = i32_func_f32_f32;
317*0b57cec5SDimitry Andric     Table[RTLIB::UO_F64] = i32_func_f64_f64;
318*0b57cec5SDimitry Andric     Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
319*0b57cec5SDimitry Andric     // O_FXX has the weird property that it uses the same libcall name as UO_FXX
320*0b57cec5SDimitry Andric     // This breaks our name-based lookup. Fortunately only the UO family of
321*0b57cec5SDimitry Andric     // libcalls appears to be actually used.
322*0b57cec5SDimitry Andric     Table[RTLIB::O_F32] = unsupported;
323*0b57cec5SDimitry Andric     Table[RTLIB::O_F64] = unsupported;
324*0b57cec5SDimitry Andric     Table[RTLIB::O_F128] = unsupported;
325*0b57cec5SDimitry Andric 
326*0b57cec5SDimitry Andric     // Memory
327*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
328*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
329*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
330*0b57cec5SDimitry Andric 
331*0b57cec5SDimitry Andric     // __stack_chk_fail
332*0b57cec5SDimitry Andric     Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
333*0b57cec5SDimitry Andric 
334*0b57cec5SDimitry Andric     // Return address handling
335*0b57cec5SDimitry Andric     Table[RTLIB::RETURN_ADDRESS] = i32_func_i32;
336*0b57cec5SDimitry Andric 
337*0b57cec5SDimitry Andric     // Element-wise Atomic memory
338*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
339*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
340*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
341*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
342*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
343*0b57cec5SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
344*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
345*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
346*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
347*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
348*0b57cec5SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
349*0b57cec5SDimitry Andric 
350*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
351*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
352*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
353*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
354*0b57cec5SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
355*0b57cec5SDimitry Andric 
356*0b57cec5SDimitry Andric     // Atomic '__sync_*' libcalls.
357*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
358*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
359*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
360*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
361*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
362*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
363*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
364*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
365*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
366*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
367*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
368*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
369*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
370*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
371*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
372*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
373*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
374*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
375*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
376*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
377*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
378*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
379*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
380*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
381*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
382*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
383*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
384*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
385*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
386*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
387*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
388*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
389*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
390*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
391*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
392*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
393*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
394*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
395*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
396*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
397*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
398*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
399*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
400*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
401*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
402*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
403*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
404*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
405*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
406*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
407*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
408*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
409*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
410*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
411*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
412*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
413*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
414*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
415*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
416*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
417*0b57cec5SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
418*0b57cec5SDimitry Andric 
419*0b57cec5SDimitry Andric     // Atomic '__atomic_*' libcalls.
420*0b57cec5SDimitry Andric     // TODO: Fix these when we implement atomic support
421*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD] = unsupported;
422*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
423*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
424*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
425*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
426*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
427*0b57cec5SDimitry Andric 
428*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE] = unsupported;
429*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_1] = unsupported;
430*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_2] = unsupported;
431*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_4] = unsupported;
432*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_8] = unsupported;
433*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_STORE_16] = unsupported;
434*0b57cec5SDimitry Andric 
435*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
436*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
437*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
438*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
439*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
440*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
441*0b57cec5SDimitry Andric 
442*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
443*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
444*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
445*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
446*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
447*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
448*0b57cec5SDimitry Andric 
449*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
450*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
451*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
452*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
453*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
454*0b57cec5SDimitry Andric 
455*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
456*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
457*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
458*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
459*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
460*0b57cec5SDimitry Andric 
461*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
462*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
463*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
464*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
465*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
466*0b57cec5SDimitry Andric 
467*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
468*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
469*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
470*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
471*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
472*0b57cec5SDimitry Andric 
473*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
474*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
475*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
476*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
477*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
478*0b57cec5SDimitry Andric 
479*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
480*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
481*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
482*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
483*0b57cec5SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
484*0b57cec5SDimitry Andric   }
485*0b57cec5SDimitry Andric };
486*0b57cec5SDimitry Andric 
487*0b57cec5SDimitry Andric ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
488*0b57cec5SDimitry Andric 
489*0b57cec5SDimitry Andric // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
490*0b57cec5SDimitry Andric // constructor for use with ManagedStatic
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 &&
501*0b57cec5SDimitry Andric           RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
502*0b57cec5SDimitry Andric         assert(Map.find(NameLibcall.first) == Map.end() &&
503*0b57cec5SDimitry Andric                "duplicate libcall names in name map");
504*0b57cec5SDimitry Andric         Map[NameLibcall.first] = NameLibcall.second;
505*0b57cec5SDimitry Andric       }
506*0b57cec5SDimitry Andric     }
507*0b57cec5SDimitry Andric     // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
508*0b57cec5SDimitry Andric     // consistent with the f64 and f128 names.
509*0b57cec5SDimitry Andric     Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
510*0b57cec5SDimitry Andric     Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
511*0b57cec5SDimitry Andric 
512*0b57cec5SDimitry Andric     Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
513*0b57cec5SDimitry Andric   }
514*0b57cec5SDimitry Andric };
515*0b57cec5SDimitry Andric 
516*0b57cec5SDimitry Andric } // end anonymous namespace
517*0b57cec5SDimitry Andric 
518*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
519*0b57cec5SDimitry Andric                                RTLIB::Libcall LC,
520*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Rets,
521*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Params) {
522*0b57cec5SDimitry Andric   assert(Rets.empty());
523*0b57cec5SDimitry Andric   assert(Params.empty());
524*0b57cec5SDimitry Andric 
525*0b57cec5SDimitry Andric   wasm::ValType PtrTy =
526*0b57cec5SDimitry Andric       Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
527*0b57cec5SDimitry Andric 
528*0b57cec5SDimitry Andric   auto &Table = RuntimeLibcallSignatures->Table;
529*0b57cec5SDimitry Andric   switch (Table[LC]) {
530*0b57cec5SDimitry Andric   case func:
531*0b57cec5SDimitry Andric     break;
532*0b57cec5SDimitry Andric   case f32_func_f32:
533*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
534*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
535*0b57cec5SDimitry Andric     break;
536*0b57cec5SDimitry Andric   case f32_func_f64:
537*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
538*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
539*0b57cec5SDimitry Andric     break;
540*0b57cec5SDimitry Andric   case f32_func_i32:
541*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
542*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
543*0b57cec5SDimitry Andric     break;
544*0b57cec5SDimitry Andric   case f32_func_i64:
545*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
546*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
547*0b57cec5SDimitry Andric     break;
548*0b57cec5SDimitry Andric   case f32_func_i16:
549*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
550*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
551*0b57cec5SDimitry Andric     break;
552*0b57cec5SDimitry Andric   case f64_func_f32:
553*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
554*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
555*0b57cec5SDimitry Andric     break;
556*0b57cec5SDimitry Andric   case f64_func_f64:
557*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
558*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
559*0b57cec5SDimitry Andric     break;
560*0b57cec5SDimitry Andric   case f64_func_i32:
561*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
562*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
563*0b57cec5SDimitry Andric     break;
564*0b57cec5SDimitry Andric   case f64_func_i64:
565*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
566*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
567*0b57cec5SDimitry Andric     break;
568*0b57cec5SDimitry Andric   case i32_func_f32:
569*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
570*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
571*0b57cec5SDimitry Andric     break;
572*0b57cec5SDimitry Andric   case i32_func_f64:
573*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
574*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
575*0b57cec5SDimitry Andric     break;
576*0b57cec5SDimitry Andric   case i32_func_i32:
577*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
578*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
579*0b57cec5SDimitry Andric     break;
580*0b57cec5SDimitry Andric   case i64_func_f32:
581*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
582*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
583*0b57cec5SDimitry Andric     break;
584*0b57cec5SDimitry Andric   case i64_func_f64:
585*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
586*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
587*0b57cec5SDimitry Andric     break;
588*0b57cec5SDimitry Andric   case i64_func_i64:
589*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
590*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
591*0b57cec5SDimitry Andric     break;
592*0b57cec5SDimitry Andric   case f32_func_f32_f32:
593*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
594*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
595*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
596*0b57cec5SDimitry Andric     break;
597*0b57cec5SDimitry Andric   case f32_func_f32_i32:
598*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
599*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
600*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
601*0b57cec5SDimitry Andric     break;
602*0b57cec5SDimitry Andric   case f32_func_i64_i64:
603*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
604*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
605*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
606*0b57cec5SDimitry Andric     break;
607*0b57cec5SDimitry Andric   case f64_func_f64_f64:
608*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
609*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
610*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
611*0b57cec5SDimitry Andric     break;
612*0b57cec5SDimitry Andric   case f64_func_f64_i32:
613*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
614*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
615*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
616*0b57cec5SDimitry Andric     break;
617*0b57cec5SDimitry Andric   case f64_func_i64_i64:
618*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
619*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
620*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
621*0b57cec5SDimitry Andric     break;
622*0b57cec5SDimitry Andric   case i16_func_f32:
623*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
624*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
625*0b57cec5SDimitry Andric     break;
626*0b57cec5SDimitry Andric   case i16_func_f64:
627*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
628*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
629*0b57cec5SDimitry Andric     break;
630*0b57cec5SDimitry Andric   case i16_func_i64_i64:
631*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
632*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
633*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
634*0b57cec5SDimitry Andric     break;
635*0b57cec5SDimitry Andric   case i8_func_i8_i8:
636*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
637*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
638*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
639*0b57cec5SDimitry Andric     break;
640*0b57cec5SDimitry Andric   case func_f32_iPTR_iPTR:
641*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
642*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
643*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
644*0b57cec5SDimitry Andric     break;
645*0b57cec5SDimitry Andric   case func_f64_iPTR_iPTR:
646*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
647*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
648*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
649*0b57cec5SDimitry Andric     break;
650*0b57cec5SDimitry Andric   case i16_func_i16_i16:
651*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
652*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
653*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
654*0b57cec5SDimitry Andric     break;
655*0b57cec5SDimitry Andric   case i32_func_f32_f32:
656*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
657*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
658*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
659*0b57cec5SDimitry Andric     break;
660*0b57cec5SDimitry Andric   case i32_func_f64_f64:
661*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
662*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
663*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
664*0b57cec5SDimitry Andric     break;
665*0b57cec5SDimitry Andric   case i32_func_i32_i32:
666*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
667*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
668*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
669*0b57cec5SDimitry Andric     break;
670*0b57cec5SDimitry Andric   case i32_func_i32_i32_iPTR:
671*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
672*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
673*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
674*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
675*0b57cec5SDimitry Andric     break;
676*0b57cec5SDimitry Andric   case i64_func_i64_i64:
677*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
678*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
679*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
680*0b57cec5SDimitry Andric     break;
681*0b57cec5SDimitry Andric   case i64_func_i64_i64_iPTR:
682*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
683*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
684*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
685*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
686*0b57cec5SDimitry Andric     break;
687*0b57cec5SDimitry Andric   case i64_i64_func_f32:
688*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
689*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
690*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
691*0b57cec5SDimitry Andric #else
692*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
693*0b57cec5SDimitry Andric #endif
694*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
695*0b57cec5SDimitry Andric     break;
696*0b57cec5SDimitry Andric   case i64_i64_func_f64:
697*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
698*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
699*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
700*0b57cec5SDimitry Andric #else
701*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
702*0b57cec5SDimitry Andric #endif
703*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
704*0b57cec5SDimitry Andric     break;
705*0b57cec5SDimitry Andric   case i16_i16_func_i16_i16:
706*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
707*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
708*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
709*0b57cec5SDimitry Andric #else
710*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
711*0b57cec5SDimitry Andric #endif
712*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
713*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
714*0b57cec5SDimitry Andric     break;
715*0b57cec5SDimitry Andric   case i32_i32_func_i32_i32:
716*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
717*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
718*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
719*0b57cec5SDimitry Andric #else
720*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
721*0b57cec5SDimitry Andric #endif
722*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
723*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
724*0b57cec5SDimitry Andric     break;
725*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64:
726*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
727*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
728*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
729*0b57cec5SDimitry Andric #else
730*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
731*0b57cec5SDimitry Andric #endif
732*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
733*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
734*0b57cec5SDimitry Andric     break;
735*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i64_i64:
736*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
737*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
738*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
739*0b57cec5SDimitry Andric #else
740*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
741*0b57cec5SDimitry Andric #endif
742*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
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     break;
747*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i64_i64_iPTR:
748*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
749*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
750*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
751*0b57cec5SDimitry Andric #else
752*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
753*0b57cec5SDimitry Andric #endif
754*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
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(PtrTy);
759*0b57cec5SDimitry Andric     break;
760*0b57cec5SDimitry Andric   case i64_i64_i64_i64_func_i64_i64_i64_i64:
761*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
762*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
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 #else
767*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
768*0b57cec5SDimitry Andric #endif
769*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
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     break;
774*0b57cec5SDimitry Andric   case i64_i64_func_i64_i64_i32:
775*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
776*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I64);
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 #else
781*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
782*0b57cec5SDimitry Andric #endif
783*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
784*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
785*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
786*0b57cec5SDimitry Andric     break;
787*0b57cec5SDimitry Andric   case iPTR_func_iPTR_i32_iPTR:
788*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
789*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
790*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
791*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
792*0b57cec5SDimitry Andric     break;
793*0b57cec5SDimitry Andric   case iPTR_func_iPTR_iPTR_iPTR:
794*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
795*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
796*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
797*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
798*0b57cec5SDimitry Andric     break;
799*0b57cec5SDimitry Andric   case f32_func_f32_f32_f32:
800*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F32);
801*0b57cec5SDimitry Andric     Params.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     break;
805*0b57cec5SDimitry Andric   case f64_func_f64_f64_f64:
806*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::F64);
807*0b57cec5SDimitry Andric     Params.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     break;
811*0b57cec5SDimitry Andric   case func_i64_i64_iPTR_iPTR:
812*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
813*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
814*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
815*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
816*0b57cec5SDimitry Andric     break;
817*0b57cec5SDimitry Andric   case func_iPTR_f32:
818*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
819*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
820*0b57cec5SDimitry Andric     break;
821*0b57cec5SDimitry Andric   case func_iPTR_f64:
822*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
823*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
824*0b57cec5SDimitry Andric     break;
825*0b57cec5SDimitry Andric   case func_iPTR_i32:
826*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
827*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I32);
828*0b57cec5SDimitry Andric     break;
829*0b57cec5SDimitry Andric   case func_iPTR_i64:
830*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
831*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
832*0b57cec5SDimitry Andric     break;
833*0b57cec5SDimitry Andric   case func_iPTR_i64_i64:
834*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
835*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
836*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
837*0b57cec5SDimitry Andric     break;
838*0b57cec5SDimitry Andric   case func_iPTR_i64_i64_i64_i64:
839*0b57cec5SDimitry Andric     Params.push_back(PtrTy);
840*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
841*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
842*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
843*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
844*0b57cec5SDimitry Andric     break;
845*0b57cec5SDimitry Andric   case func_iPTR_i64_i64_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     Params.push_back(wasm::ValType::I64);
852*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
853*0b57cec5SDimitry Andric     break;
854*0b57cec5SDimitry Andric   case i32_func_i64_i64:
855*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
856*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
857*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
858*0b57cec5SDimitry Andric     break;
859*0b57cec5SDimitry Andric   case i32_func_i64_i64_i64_i64:
860*0b57cec5SDimitry Andric     Rets.push_back(wasm::ValType::I32);
861*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
862*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
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 iPTR_func_f32:
867*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
868*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F32);
869*0b57cec5SDimitry Andric     break;
870*0b57cec5SDimitry Andric   case iPTR_func_f64:
871*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
872*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::F64);
873*0b57cec5SDimitry Andric     break;
874*0b57cec5SDimitry Andric   case iPTR_func_i64_i64:
875*0b57cec5SDimitry Andric     Rets.push_back(PtrTy);
876*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
877*0b57cec5SDimitry Andric     Params.push_back(wasm::ValType::I64);
878*0b57cec5SDimitry Andric     break;
879*0b57cec5SDimitry Andric   case unsupported:
880*0b57cec5SDimitry Andric     llvm_unreachable("unsupported runtime library signature");
881*0b57cec5SDimitry Andric   }
882*0b57cec5SDimitry Andric }
883*0b57cec5SDimitry Andric 
884*0b57cec5SDimitry Andric static ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
885*0b57cec5SDimitry Andric // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
886*0b57cec5SDimitry Andric // other than here, just roll its logic into this version.
887*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
888*0b57cec5SDimitry Andric                                const char *Name,
889*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Rets,
890*0b57cec5SDimitry Andric                                SmallVectorImpl<wasm::ValType> &Params) {
891*0b57cec5SDimitry Andric   auto &Map = LibcallNameMap->Map;
892*0b57cec5SDimitry Andric   auto Val = Map.find(Name);
893*0b57cec5SDimitry Andric #ifndef NDEBUG
894*0b57cec5SDimitry Andric   if (Val == Map.end()) {
895*0b57cec5SDimitry Andric     auto message = std::string("unexpected runtime library name: ") + Name;
896*0b57cec5SDimitry Andric     llvm_unreachable(message.c_str());
897*0b57cec5SDimitry Andric   }
898*0b57cec5SDimitry Andric #endif
899*0b57cec5SDimitry Andric   return getLibcallSignature(Subtarget, Val->second, Rets, Params);
900*0b57cec5SDimitry Andric }
901