xref: /src/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
171d5a254SDimitry Andric // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
271d5a254SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
671d5a254SDimitry Andric //
771d5a254SDimitry Andric //===----------------------------------------------------------------------===//
871d5a254SDimitry Andric ///
971d5a254SDimitry Andric /// \file
10eb11fae6SDimitry Andric /// This file contains signature information for runtime libcalls.
1171d5a254SDimitry Andric ///
1271d5a254SDimitry Andric /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
1371d5a254SDimitry Andric /// target needs type information for all functions. This file contains a big
1471d5a254SDimitry Andric /// table providing type signatures for all runtime library functions that LLVM
1571d5a254SDimitry Andric /// uses.
1671d5a254SDimitry Andric ///
1771d5a254SDimitry Andric /// This is currently a fairly heavy-handed solution.
1871d5a254SDimitry Andric ///
1971d5a254SDimitry Andric //===----------------------------------------------------------------------===//
2071d5a254SDimitry Andric 
2171d5a254SDimitry Andric #include "WebAssemblyRuntimeLibcallSignatures.h"
2271d5a254SDimitry Andric #include "WebAssemblySubtarget.h"
23ac9a064cSDimitry Andric #include "WebAssemblyUtilities.h"
24ac9a064cSDimitry Andric #include "llvm/CodeGen/RuntimeLibcallUtil.h"
2571d5a254SDimitry Andric 
2671d5a254SDimitry Andric using namespace llvm;
2771d5a254SDimitry Andric 
2871d5a254SDimitry Andric namespace {
2971d5a254SDimitry Andric 
3071d5a254SDimitry Andric enum RuntimeLibcallSignature {
3171d5a254SDimitry Andric   func,
3271d5a254SDimitry Andric   f32_func_f32,
3371d5a254SDimitry Andric   f32_func_f64,
3471d5a254SDimitry Andric   f32_func_i32,
3571d5a254SDimitry Andric   f32_func_i64,
3671d5a254SDimitry Andric   f32_func_i16,
3771d5a254SDimitry Andric   f64_func_f32,
3871d5a254SDimitry Andric   f64_func_f64,
3971d5a254SDimitry Andric   f64_func_i32,
4071d5a254SDimitry Andric   f64_func_i64,
4171d5a254SDimitry Andric   i32_func_f32,
4271d5a254SDimitry Andric   i32_func_f64,
4371d5a254SDimitry Andric   i32_func_i32,
4471d5a254SDimitry Andric   i64_func_f32,
4571d5a254SDimitry Andric   i64_func_f64,
4671d5a254SDimitry Andric   i64_func_i64,
4771d5a254SDimitry Andric   f32_func_f32_f32,
4871d5a254SDimitry Andric   f32_func_f32_i32,
4971d5a254SDimitry Andric   f32_func_i64_i64,
5071d5a254SDimitry Andric   f64_func_f64_f64,
5171d5a254SDimitry Andric   f64_func_f64_i32,
5271d5a254SDimitry Andric   f64_func_i64_i64,
5371d5a254SDimitry Andric   i16_func_f32,
54e6d15924SDimitry Andric   i16_func_f64,
55e6d15924SDimitry Andric   i16_func_i64_i64,
5671d5a254SDimitry Andric   i8_func_i8_i8,
5771d5a254SDimitry Andric   func_f32_iPTR_iPTR,
5871d5a254SDimitry Andric   func_f64_iPTR_iPTR,
5971d5a254SDimitry Andric   i16_func_i16_i16,
6071d5a254SDimitry Andric   i32_func_f32_f32,
6171d5a254SDimitry Andric   i32_func_f64_f64,
6271d5a254SDimitry Andric   i32_func_i32_i32,
63eb11fae6SDimitry Andric   i32_func_i32_i32_iPTR,
6471d5a254SDimitry Andric   i64_func_i64_i64,
65eb11fae6SDimitry Andric   i64_func_i64_i64_iPTR,
667fa27ce4SDimitry Andric   i64_i64_func_i32,
677fa27ce4SDimitry Andric   i64_i64_func_i64,
6871d5a254SDimitry Andric   i64_i64_func_f32,
6971d5a254SDimitry Andric   i64_i64_func_f64,
7071d5a254SDimitry Andric   i16_i16_func_i16_i16,
7171d5a254SDimitry Andric   i32_i32_func_i32_i32,
7271d5a254SDimitry Andric   i64_i64_func_i64_i64,
7371d5a254SDimitry Andric   i64_i64_func_i64_i64_i64_i64,
74eb11fae6SDimitry Andric   i64_i64_func_i64_i64_i64_i64_iPTR,
7571d5a254SDimitry Andric   i64_i64_i64_i64_func_i64_i64_i64_i64,
7671d5a254SDimitry Andric   i64_i64_func_i64_i64_i32,
777fa27ce4SDimitry Andric   i64_i64_func_i64_i64_i64_i64_i64_i64,
78e3b55780SDimitry Andric   iPTR_func_i32,
7971d5a254SDimitry Andric   iPTR_func_iPTR_i32_iPTR,
8071d5a254SDimitry Andric   iPTR_func_iPTR_iPTR_iPTR,
8171d5a254SDimitry Andric   f32_func_f32_f32_f32,
8271d5a254SDimitry Andric   f64_func_f64_f64_f64,
8371d5a254SDimitry Andric   func_i64_i64_iPTR_iPTR,
8471d5a254SDimitry Andric   i32_func_i64_i64,
8571d5a254SDimitry Andric   i32_func_i64_i64_i64_i64,
86e6d15924SDimitry Andric   iPTR_func_f32,
87e6d15924SDimitry Andric   iPTR_func_f64,
88e6d15924SDimitry Andric   iPTR_func_i64_i64,
8971d5a254SDimitry Andric   unsupported
9071d5a254SDimitry Andric };
9171d5a254SDimitry Andric 
92eb11fae6SDimitry Andric struct RuntimeLibcallSignatureTable {
93eb11fae6SDimitry Andric   std::vector<RuntimeLibcallSignature> Table;
94eb11fae6SDimitry Andric 
95eb11fae6SDimitry Andric   // Any newly-added libcalls will be unsupported by default.
RuntimeLibcallSignatureTable__anon68865e020111::RuntimeLibcallSignatureTable96eb11fae6SDimitry Andric   RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
9771d5a254SDimitry Andric     // Integer
98eb11fae6SDimitry Andric     Table[RTLIB::SHL_I16] = i16_func_i16_i16;
99eb11fae6SDimitry Andric     Table[RTLIB::SHL_I32] = i32_func_i32_i32;
100eb11fae6SDimitry Andric     Table[RTLIB::SHL_I64] = i64_func_i64_i64;
101eb11fae6SDimitry Andric     Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
102eb11fae6SDimitry Andric     Table[RTLIB::SRL_I16] = i16_func_i16_i16;
103eb11fae6SDimitry Andric     Table[RTLIB::SRL_I32] = i32_func_i32_i32;
104eb11fae6SDimitry Andric     Table[RTLIB::SRL_I64] = i64_func_i64_i64;
105eb11fae6SDimitry Andric     Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
106eb11fae6SDimitry Andric     Table[RTLIB::SRA_I16] = i16_func_i16_i16;
107eb11fae6SDimitry Andric     Table[RTLIB::SRA_I32] = i32_func_i32_i32;
108eb11fae6SDimitry Andric     Table[RTLIB::SRA_I64] = i64_func_i64_i64;
109eb11fae6SDimitry Andric     Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
110eb11fae6SDimitry Andric     Table[RTLIB::MUL_I8] = i8_func_i8_i8;
111eb11fae6SDimitry Andric     Table[RTLIB::MUL_I16] = i16_func_i16_i16;
112eb11fae6SDimitry Andric     Table[RTLIB::MUL_I32] = i32_func_i32_i32;
113eb11fae6SDimitry Andric     Table[RTLIB::MUL_I64] = i64_func_i64_i64;
114eb11fae6SDimitry Andric     Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
115eb11fae6SDimitry Andric     Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
116eb11fae6SDimitry Andric     Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
117eb11fae6SDimitry Andric     Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
118eb11fae6SDimitry Andric     Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
119eb11fae6SDimitry Andric     Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
120eb11fae6SDimitry Andric     Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
121eb11fae6SDimitry Andric     Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
122eb11fae6SDimitry Andric     Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
123eb11fae6SDimitry Andric     Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
124eb11fae6SDimitry Andric     Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
125eb11fae6SDimitry Andric     Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
126eb11fae6SDimitry Andric     Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
127eb11fae6SDimitry Andric     Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
128eb11fae6SDimitry Andric     Table[RTLIB::SREM_I8] = i8_func_i8_i8;
129eb11fae6SDimitry Andric     Table[RTLIB::SREM_I16] = i16_func_i16_i16;
130eb11fae6SDimitry Andric     Table[RTLIB::SREM_I32] = i32_func_i32_i32;
131eb11fae6SDimitry Andric     Table[RTLIB::SREM_I64] = i64_func_i64_i64;
132eb11fae6SDimitry Andric     Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
133eb11fae6SDimitry Andric     Table[RTLIB::UREM_I8] = i8_func_i8_i8;
134eb11fae6SDimitry Andric     Table[RTLIB::UREM_I16] = i16_func_i16_i16;
135eb11fae6SDimitry Andric     Table[RTLIB::UREM_I32] = i32_func_i32_i32;
136eb11fae6SDimitry Andric     Table[RTLIB::UREM_I64] = i64_func_i64_i64;
137eb11fae6SDimitry Andric     Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
138eb11fae6SDimitry Andric     Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
139eb11fae6SDimitry Andric     Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
140eb11fae6SDimitry Andric     Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
141eb11fae6SDimitry Andric     Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
142eb11fae6SDimitry Andric     Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
143eb11fae6SDimitry Andric     Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
144eb11fae6SDimitry Andric     Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
145eb11fae6SDimitry Andric     Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
146eb11fae6SDimitry Andric     Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
147eb11fae6SDimitry Andric     Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
148eb11fae6SDimitry Andric     Table[RTLIB::NEG_I32] = i32_func_i32;
149eb11fae6SDimitry Andric     Table[RTLIB::NEG_I64] = i64_func_i64;
15071d5a254SDimitry Andric 
151eb11fae6SDimitry Andric     // Floating-point.
152eb11fae6SDimitry Andric     // All F80 and PPCF128 routines are unsupported.
153eb11fae6SDimitry Andric     Table[RTLIB::ADD_F32] = f32_func_f32_f32;
154eb11fae6SDimitry Andric     Table[RTLIB::ADD_F64] = f64_func_f64_f64;
1557fa27ce4SDimitry Andric     Table[RTLIB::ADD_F128] = i64_i64_func_i64_i64_i64_i64;
156eb11fae6SDimitry Andric     Table[RTLIB::SUB_F32] = f32_func_f32_f32;
157eb11fae6SDimitry Andric     Table[RTLIB::SUB_F64] = f64_func_f64_f64;
1587fa27ce4SDimitry Andric     Table[RTLIB::SUB_F128] = i64_i64_func_i64_i64_i64_i64;
159eb11fae6SDimitry Andric     Table[RTLIB::MUL_F32] = f32_func_f32_f32;
160eb11fae6SDimitry Andric     Table[RTLIB::MUL_F64] = f64_func_f64_f64;
1617fa27ce4SDimitry Andric     Table[RTLIB::MUL_F128] = i64_i64_func_i64_i64_i64_i64;
162eb11fae6SDimitry Andric     Table[RTLIB::DIV_F32] = f32_func_f32_f32;
163eb11fae6SDimitry Andric     Table[RTLIB::DIV_F64] = f64_func_f64_f64;
1647fa27ce4SDimitry Andric     Table[RTLIB::DIV_F128] = i64_i64_func_i64_i64_i64_i64;
165eb11fae6SDimitry Andric     Table[RTLIB::REM_F32] = f32_func_f32_f32;
166eb11fae6SDimitry Andric     Table[RTLIB::REM_F64] = f64_func_f64_f64;
1677fa27ce4SDimitry Andric     Table[RTLIB::REM_F128] = i64_i64_func_i64_i64_i64_i64;
168eb11fae6SDimitry Andric     Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
169eb11fae6SDimitry Andric     Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
1707fa27ce4SDimitry Andric     Table[RTLIB::FMA_F128] = i64_i64_func_i64_i64_i64_i64_i64_i64;
171eb11fae6SDimitry Andric     Table[RTLIB::POWI_F32] = f32_func_f32_i32;
172eb11fae6SDimitry Andric     Table[RTLIB::POWI_F64] = f64_func_f64_i32;
1737fa27ce4SDimitry Andric     Table[RTLIB::POWI_F128] = i64_i64_func_i64_i64_i32;
174eb11fae6SDimitry Andric     Table[RTLIB::SQRT_F32] = f32_func_f32;
175eb11fae6SDimitry Andric     Table[RTLIB::SQRT_F64] = f64_func_f64;
1767fa27ce4SDimitry Andric     Table[RTLIB::SQRT_F128] = i64_i64_func_i64_i64;
177cfca06d7SDimitry Andric     Table[RTLIB::CBRT_F32] = f32_func_f32;
178cfca06d7SDimitry Andric     Table[RTLIB::CBRT_F64] = f64_func_f64;
1797fa27ce4SDimitry Andric     Table[RTLIB::CBRT_F128] = i64_i64_func_i64_i64;
180eb11fae6SDimitry Andric     Table[RTLIB::LOG_F32] = f32_func_f32;
181eb11fae6SDimitry Andric     Table[RTLIB::LOG_F64] = f64_func_f64;
1827fa27ce4SDimitry Andric     Table[RTLIB::LOG_F128] = i64_i64_func_i64_i64;
183eb11fae6SDimitry Andric     Table[RTLIB::LOG2_F32] = f32_func_f32;
184eb11fae6SDimitry Andric     Table[RTLIB::LOG2_F64] = f64_func_f64;
1857fa27ce4SDimitry Andric     Table[RTLIB::LOG2_F128] = i64_i64_func_i64_i64;
186eb11fae6SDimitry Andric     Table[RTLIB::LOG10_F32] = f32_func_f32;
187eb11fae6SDimitry Andric     Table[RTLIB::LOG10_F64] = f64_func_f64;
1887fa27ce4SDimitry Andric     Table[RTLIB::LOG10_F128] = i64_i64_func_i64_i64;
189eb11fae6SDimitry Andric     Table[RTLIB::EXP_F32] = f32_func_f32;
190eb11fae6SDimitry Andric     Table[RTLIB::EXP_F64] = f64_func_f64;
1917fa27ce4SDimitry Andric     Table[RTLIB::EXP_F128] = i64_i64_func_i64_i64;
192eb11fae6SDimitry Andric     Table[RTLIB::EXP2_F32] = f32_func_f32;
193eb11fae6SDimitry Andric     Table[RTLIB::EXP2_F64] = f64_func_f64;
1947fa27ce4SDimitry Andric     Table[RTLIB::EXP2_F128] = i64_i64_func_i64_i64;
195b1c73532SDimitry Andric     Table[RTLIB::EXP10_F32] = f32_func_f32;
196b1c73532SDimitry Andric     Table[RTLIB::EXP10_F64] = f64_func_f64;
197b1c73532SDimitry Andric     Table[RTLIB::EXP10_F128] = i64_i64_func_i64_i64;
198eb11fae6SDimitry Andric     Table[RTLIB::SIN_F32] = f32_func_f32;
199eb11fae6SDimitry Andric     Table[RTLIB::SIN_F64] = f64_func_f64;
2007fa27ce4SDimitry Andric     Table[RTLIB::SIN_F128] = i64_i64_func_i64_i64;
201eb11fae6SDimitry Andric     Table[RTLIB::COS_F32] = f32_func_f32;
202eb11fae6SDimitry Andric     Table[RTLIB::COS_F64] = f64_func_f64;
2037fa27ce4SDimitry Andric     Table[RTLIB::COS_F128] = i64_i64_func_i64_i64;
204ac9a064cSDimitry Andric     Table[RTLIB::TAN_F32] = f32_func_f32;
205ac9a064cSDimitry Andric     Table[RTLIB::TAN_F64] = f64_func_f64;
206ac9a064cSDimitry Andric     Table[RTLIB::TAN_F128] = i64_i64_func_i64_i64;
207ac9a064cSDimitry Andric     Table[RTLIB::ASIN_F32] = f32_func_f32;
208ac9a064cSDimitry Andric     Table[RTLIB::ASIN_F64] = f64_func_f64;
209ac9a064cSDimitry Andric     Table[RTLIB::ASIN_F128] = i64_i64_func_i64_i64;
210ac9a064cSDimitry Andric     Table[RTLIB::ACOS_F32] = f32_func_f32;
211ac9a064cSDimitry Andric     Table[RTLIB::ACOS_F64] = f64_func_f64;
212ac9a064cSDimitry Andric     Table[RTLIB::ACOS_F128] = i64_i64_func_i64_i64;
213ac9a064cSDimitry Andric     Table[RTLIB::ATAN_F32] = f32_func_f32;
214ac9a064cSDimitry Andric     Table[RTLIB::ATAN_F64] = f64_func_f64;
215ac9a064cSDimitry Andric     Table[RTLIB::ATAN_F128] = i64_i64_func_i64_i64;
216ac9a064cSDimitry Andric     Table[RTLIB::SINH_F32] = f32_func_f32;
217ac9a064cSDimitry Andric     Table[RTLIB::SINH_F64] = f64_func_f64;
218ac9a064cSDimitry Andric     Table[RTLIB::SINH_F128] = i64_i64_func_i64_i64;
219ac9a064cSDimitry Andric     Table[RTLIB::COSH_F32] = f32_func_f32;
220ac9a064cSDimitry Andric     Table[RTLIB::COSH_F64] = f64_func_f64;
221ac9a064cSDimitry Andric     Table[RTLIB::COSH_F128] = i64_i64_func_i64_i64;
222ac9a064cSDimitry Andric     Table[RTLIB::TANH_F32] = f32_func_f32;
223ac9a064cSDimitry Andric     Table[RTLIB::TANH_F64] = f64_func_f64;
224ac9a064cSDimitry Andric     Table[RTLIB::TANH_F128] = i64_i64_func_i64_i64;
225eb11fae6SDimitry Andric     Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
226eb11fae6SDimitry Andric     Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
227eb11fae6SDimitry Andric     Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
228eb11fae6SDimitry Andric     Table[RTLIB::POW_F32] = f32_func_f32_f32;
229eb11fae6SDimitry Andric     Table[RTLIB::POW_F64] = f64_func_f64_f64;
2307fa27ce4SDimitry Andric     Table[RTLIB::POW_F128] = i64_i64_func_i64_i64_i64_i64;
231eb11fae6SDimitry Andric     Table[RTLIB::CEIL_F32] = f32_func_f32;
232eb11fae6SDimitry Andric     Table[RTLIB::CEIL_F64] = f64_func_f64;
2337fa27ce4SDimitry Andric     Table[RTLIB::CEIL_F128] = i64_i64_func_i64_i64;
234eb11fae6SDimitry Andric     Table[RTLIB::TRUNC_F32] = f32_func_f32;
235eb11fae6SDimitry Andric     Table[RTLIB::TRUNC_F64] = f64_func_f64;
2367fa27ce4SDimitry Andric     Table[RTLIB::TRUNC_F128] = i64_i64_func_i64_i64;
237eb11fae6SDimitry Andric     Table[RTLIB::RINT_F32] = f32_func_f32;
238eb11fae6SDimitry Andric     Table[RTLIB::RINT_F64] = f64_func_f64;
2397fa27ce4SDimitry Andric     Table[RTLIB::RINT_F128] = i64_i64_func_i64_i64;
240eb11fae6SDimitry Andric     Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
241eb11fae6SDimitry Andric     Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
2427fa27ce4SDimitry Andric     Table[RTLIB::NEARBYINT_F128] = i64_i64_func_i64_i64;
243eb11fae6SDimitry Andric     Table[RTLIB::ROUND_F32] = f32_func_f32;
244eb11fae6SDimitry Andric     Table[RTLIB::ROUND_F64] = f64_func_f64;
2457fa27ce4SDimitry Andric     Table[RTLIB::ROUND_F128] = i64_i64_func_i64_i64;
2467fa27ce4SDimitry Andric     Table[RTLIB::ROUNDEVEN_F32] = f32_func_f32;
2477fa27ce4SDimitry Andric     Table[RTLIB::ROUNDEVEN_F64] = f64_func_f64;
2487fa27ce4SDimitry Andric     Table[RTLIB::ROUNDEVEN_F128] = i64_i64_func_i64_i64;
249e6d15924SDimitry Andric     Table[RTLIB::LROUND_F32] = iPTR_func_f32;
250e6d15924SDimitry Andric     Table[RTLIB::LROUND_F64] = iPTR_func_f64;
251e6d15924SDimitry Andric     Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
252e6d15924SDimitry Andric     Table[RTLIB::LLROUND_F32] = i64_func_f32;
253e6d15924SDimitry Andric     Table[RTLIB::LLROUND_F64] = i64_func_f64;
254e6d15924SDimitry Andric     Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
255e6d15924SDimitry Andric     Table[RTLIB::LRINT_F32] = iPTR_func_f32;
256e6d15924SDimitry Andric     Table[RTLIB::LRINT_F64] = iPTR_func_f64;
257e6d15924SDimitry Andric     Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
258e6d15924SDimitry Andric     Table[RTLIB::LLRINT_F32] = i64_func_f32;
259e6d15924SDimitry Andric     Table[RTLIB::LLRINT_F64] = i64_func_f64;
260e6d15924SDimitry Andric     Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
261eb11fae6SDimitry Andric     Table[RTLIB::FLOOR_F32] = f32_func_f32;
262eb11fae6SDimitry Andric     Table[RTLIB::FLOOR_F64] = f64_func_f64;
2637fa27ce4SDimitry Andric     Table[RTLIB::FLOOR_F128] = i64_i64_func_i64_i64;
264eb11fae6SDimitry Andric     Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
265eb11fae6SDimitry Andric     Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
2667fa27ce4SDimitry Andric     Table[RTLIB::COPYSIGN_F128] = i64_i64_func_i64_i64_i64_i64;
267eb11fae6SDimitry Andric     Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
268eb11fae6SDimitry Andric     Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
2697fa27ce4SDimitry Andric     Table[RTLIB::FMIN_F128] = i64_i64_func_i64_i64_i64_i64;
270eb11fae6SDimitry Andric     Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
271eb11fae6SDimitry Andric     Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
2727fa27ce4SDimitry Andric     Table[RTLIB::FMAX_F128] = i64_i64_func_i64_i64_i64_i64;
2737fa27ce4SDimitry Andric     Table[RTLIB::LDEXP_F32] = f32_func_f32_i32;
2747fa27ce4SDimitry Andric     Table[RTLIB::LDEXP_F64] = f64_func_f64_i32;
2757fa27ce4SDimitry Andric     Table[RTLIB::LDEXP_F128] = i64_i64_func_i64_i64_i32;
2767fa27ce4SDimitry Andric     Table[RTLIB::FREXP_F32] = f32_func_f32_i32;
2777fa27ce4SDimitry Andric     Table[RTLIB::FREXP_F64] = f64_func_f64_i32;
2787fa27ce4SDimitry Andric     Table[RTLIB::FREXP_F128] = i64_i64_func_i64_i64_i32;
27971d5a254SDimitry Andric 
280eb11fae6SDimitry Andric     // Conversion
281e6d15924SDimitry Andric     // All F80 and PPCF128 routines are unsupported.
2827fa27ce4SDimitry Andric     Table[RTLIB::FPEXT_F64_F128] = i64_i64_func_f64;
2837fa27ce4SDimitry Andric     Table[RTLIB::FPEXT_F32_F128] = i64_i64_func_f32;
284eb11fae6SDimitry Andric     Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
285eb11fae6SDimitry Andric     Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
286eb11fae6SDimitry Andric     Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
287e6d15924SDimitry Andric     Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
288eb11fae6SDimitry Andric     Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
289e6d15924SDimitry Andric     Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
290eb11fae6SDimitry Andric     Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
291eb11fae6SDimitry Andric     Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
292eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
293eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
294eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
295eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
296eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
297eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
298eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
299eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
300eb11fae6SDimitry Andric     Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
301eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
302eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
303eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
304eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
305eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
306eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
307eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
308eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
309eb11fae6SDimitry Andric     Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
310eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
311eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
3127fa27ce4SDimitry Andric     Table[RTLIB::SINTTOFP_I32_F128] = i64_i64_func_i32;
313eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
314eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
3157fa27ce4SDimitry Andric     Table[RTLIB::SINTTOFP_I64_F128] = i64_i64_func_i64;
316eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
317eb11fae6SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
3187fa27ce4SDimitry Andric     Table[RTLIB::SINTTOFP_I128_F128] = i64_i64_func_i64_i64;
319eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
320eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
3217fa27ce4SDimitry Andric     Table[RTLIB::UINTTOFP_I32_F128] = i64_i64_func_i32;
322eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
323eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
3247fa27ce4SDimitry Andric     Table[RTLIB::UINTTOFP_I64_F128] = i64_i64_func_i64;
325eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
326eb11fae6SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
3277fa27ce4SDimitry Andric     Table[RTLIB::UINTTOFP_I128_F128] = i64_i64_func_i64_i64;
32871d5a254SDimitry Andric 
329eb11fae6SDimitry Andric     // Comparison
330eb11fae6SDimitry Andric     // ALl F80 and PPCF128 routines are unsupported.
331eb11fae6SDimitry Andric     Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
332eb11fae6SDimitry Andric     Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
333eb11fae6SDimitry Andric     Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
334eb11fae6SDimitry Andric     Table[RTLIB::UNE_F32] = i32_func_f32_f32;
335eb11fae6SDimitry Andric     Table[RTLIB::UNE_F64] = i32_func_f64_f64;
336eb11fae6SDimitry Andric     Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
337eb11fae6SDimitry Andric     Table[RTLIB::OGE_F32] = i32_func_f32_f32;
338eb11fae6SDimitry Andric     Table[RTLIB::OGE_F64] = i32_func_f64_f64;
339eb11fae6SDimitry Andric     Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
340eb11fae6SDimitry Andric     Table[RTLIB::OLT_F32] = i32_func_f32_f32;
341eb11fae6SDimitry Andric     Table[RTLIB::OLT_F64] = i32_func_f64_f64;
342eb11fae6SDimitry Andric     Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
343eb11fae6SDimitry Andric     Table[RTLIB::OLE_F32] = i32_func_f32_f32;
344eb11fae6SDimitry Andric     Table[RTLIB::OLE_F64] = i32_func_f64_f64;
345eb11fae6SDimitry Andric     Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
346eb11fae6SDimitry Andric     Table[RTLIB::OGT_F32] = i32_func_f32_f32;
347eb11fae6SDimitry Andric     Table[RTLIB::OGT_F64] = i32_func_f64_f64;
348eb11fae6SDimitry Andric     Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
349eb11fae6SDimitry Andric     Table[RTLIB::UO_F32] = i32_func_f32_f32;
350eb11fae6SDimitry Andric     Table[RTLIB::UO_F64] = i32_func_f64_f64;
351eb11fae6SDimitry Andric     Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
35271d5a254SDimitry Andric 
353eb11fae6SDimitry Andric     // Memory
354eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
355eb11fae6SDimitry Andric     Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
356eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
35771d5a254SDimitry Andric 
358e6d15924SDimitry Andric     // __stack_chk_fail
359e6d15924SDimitry Andric     Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
360e6d15924SDimitry Andric 
361e6d15924SDimitry Andric     // Return address handling
362e3b55780SDimitry Andric     Table[RTLIB::RETURN_ADDRESS] = iPTR_func_i32;
363e6d15924SDimitry Andric 
364eb11fae6SDimitry Andric     // Element-wise Atomic memory
365eb11fae6SDimitry Andric     // TODO: Fix these when we implement atomic support
366eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
367eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
368eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
369eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
370eb11fae6SDimitry Andric     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
371eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
372eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
373eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
374eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
375eb11fae6SDimitry Andric     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
376ca089b24SDimitry Andric 
377eb11fae6SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
378eb11fae6SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
379eb11fae6SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
380eb11fae6SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
381eb11fae6SDimitry Andric     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
38271d5a254SDimitry Andric 
38371d5a254SDimitry Andric     // Atomic '__sync_*' libcalls.
384eb11fae6SDimitry Andric     // TODO: Fix these when we implement atomic support
385eb11fae6SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
386eb11fae6SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
387eb11fae6SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
388eb11fae6SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
389eb11fae6SDimitry Andric     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
390eb11fae6SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
391eb11fae6SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
392eb11fae6SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
393eb11fae6SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
394eb11fae6SDimitry Andric     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
395eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
396eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
397eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
398eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
399eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
400eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
401eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
402eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
403eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
404eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
405eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
406eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
407eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
408eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
409eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
410eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
411eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
412eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
413eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
414eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
415eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
416eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
417eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
418eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
419eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
420eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
421eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
422eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
423eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
424eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
425eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
426eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
427eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
428eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
429eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
430eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
431eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
432eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
433eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
434eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
435eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
436eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
437eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
438eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
439eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
440eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
441eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
442eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
443eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
444eb11fae6SDimitry Andric     Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
44571d5a254SDimitry Andric 
44671d5a254SDimitry Andric     // Atomic '__atomic_*' libcalls.
447eb11fae6SDimitry Andric     // TODO: Fix these when we implement atomic support
448eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD] = unsupported;
449eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
450eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
451eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
452eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
453eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
45471d5a254SDimitry Andric 
455eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE] = unsupported;
456eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE_1] = unsupported;
457eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE_2] = unsupported;
458eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE_4] = unsupported;
459eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE_8] = unsupported;
460eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_STORE_16] = unsupported;
46171d5a254SDimitry Andric 
462eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
463eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
464eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
465eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
466eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
467eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
46871d5a254SDimitry Andric 
469eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
470eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
471eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
472eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
473eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
474eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
47571d5a254SDimitry Andric 
476eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
477eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
478eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
479eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
480eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
48171d5a254SDimitry Andric 
482eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
483eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
484eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
485eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
486eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
48771d5a254SDimitry Andric 
488eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
489eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
490eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
491eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
492eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
49371d5a254SDimitry Andric 
494eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
495eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
496eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
497eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
498eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
49971d5a254SDimitry Andric 
500eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
501eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
502eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
503eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
504eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
50571d5a254SDimitry Andric 
506eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
507eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
508eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
509eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
510eb11fae6SDimitry Andric     Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
511eb11fae6SDimitry Andric   }
51271d5a254SDimitry Andric };
51371d5a254SDimitry Andric 
getRuntimeLibcallSignatures()5141f917f69SDimitry Andric RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() {
5151f917f69SDimitry Andric   static RuntimeLibcallSignatureTable RuntimeLibcallSignatures;
5161f917f69SDimitry Andric   return RuntimeLibcallSignatures;
5171f917f69SDimitry Andric }
51871d5a254SDimitry Andric 
519eb11fae6SDimitry Andric // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
5201f917f69SDimitry Andric // constructor for use with a static variable
521eb11fae6SDimitry Andric struct StaticLibcallNameMap {
522eb11fae6SDimitry Andric   StringMap<RTLIB::Libcall> Map;
StaticLibcallNameMap__anon68865e020111::StaticLibcallNameMap523eb11fae6SDimitry Andric   StaticLibcallNameMap() {
524eb11fae6SDimitry Andric     static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
525eb11fae6SDimitry Andric #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
526eb11fae6SDimitry Andric #include "llvm/IR/RuntimeLibcalls.def"
527eb11fae6SDimitry Andric #undef HANDLE_LIBCALL
52871d5a254SDimitry Andric     };
529eb11fae6SDimitry Andric     for (const auto &NameLibcall : NameLibcalls) {
530eb11fae6SDimitry Andric       if (NameLibcall.first != nullptr &&
5311f917f69SDimitry Andric           getRuntimeLibcallSignatures().Table[NameLibcall.second] !=
5321f917f69SDimitry Andric               unsupported) {
5337fa27ce4SDimitry Andric         assert(!Map.contains(NameLibcall.first) &&
534eb11fae6SDimitry Andric                "duplicate libcall names in name map");
535eb11fae6SDimitry Andric         Map[NameLibcall.first] = NameLibcall.second;
536eb11fae6SDimitry Andric       }
537eb11fae6SDimitry Andric     }
538e6d15924SDimitry Andric     // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
539e6d15924SDimitry Andric     // consistent with the f64 and f128 names.
540e6d15924SDimitry Andric     Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
541e6d15924SDimitry Andric     Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
542e6d15924SDimitry Andric 
543e6d15924SDimitry Andric     Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
544eb11fae6SDimitry Andric   }
545eb11fae6SDimitry Andric };
546eb11fae6SDimitry Andric 
547eb11fae6SDimitry Andric } // end anonymous namespace
548eb11fae6SDimitry Andric 
getLibcallSignature(const WebAssemblySubtarget & Subtarget,RTLIB::Libcall LC,SmallVectorImpl<wasm::ValType> & Rets,SmallVectorImpl<wasm::ValType> & Params)549ac9a064cSDimitry Andric void WebAssembly::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
550d8e91e46SDimitry Andric                                       RTLIB::Libcall LC,
551d8e91e46SDimitry Andric                                       SmallVectorImpl<wasm::ValType> &Rets,
55271d5a254SDimitry Andric                                       SmallVectorImpl<wasm::ValType> &Params) {
55371d5a254SDimitry Andric   assert(Rets.empty());
55471d5a254SDimitry Andric   assert(Params.empty());
55571d5a254SDimitry Andric 
556e6d15924SDimitry Andric   wasm::ValType PtrTy =
557eb11fae6SDimitry Andric       Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
55871d5a254SDimitry Andric 
5591f917f69SDimitry Andric   auto &Table = getRuntimeLibcallSignatures().Table;
560eb11fae6SDimitry Andric   switch (Table[LC]) {
56171d5a254SDimitry Andric   case func:
56271d5a254SDimitry Andric     break;
56371d5a254SDimitry Andric   case f32_func_f32:
56471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
56571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
56671d5a254SDimitry Andric     break;
56771d5a254SDimitry Andric   case f32_func_f64:
56871d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
56971d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
57071d5a254SDimitry Andric     break;
57171d5a254SDimitry Andric   case f32_func_i32:
57271d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
57371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
57471d5a254SDimitry Andric     break;
57571d5a254SDimitry Andric   case f32_func_i64:
57671d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
57771d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
57871d5a254SDimitry Andric     break;
57971d5a254SDimitry Andric   case f32_func_i16:
58071d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
58171d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
58271d5a254SDimitry Andric     break;
58371d5a254SDimitry Andric   case f64_func_f32:
58471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
58571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
58671d5a254SDimitry Andric     break;
58771d5a254SDimitry Andric   case f64_func_f64:
58871d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
58971d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
59071d5a254SDimitry Andric     break;
59171d5a254SDimitry Andric   case f64_func_i32:
59271d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
59371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
59471d5a254SDimitry Andric     break;
59571d5a254SDimitry Andric   case f64_func_i64:
59671d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
59771d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
59871d5a254SDimitry Andric     break;
59971d5a254SDimitry Andric   case i32_func_f32:
60071d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
60171d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
60271d5a254SDimitry Andric     break;
60371d5a254SDimitry Andric   case i32_func_f64:
60471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
60571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
60671d5a254SDimitry Andric     break;
60771d5a254SDimitry Andric   case i32_func_i32:
60871d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
60971d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
61071d5a254SDimitry Andric     break;
61171d5a254SDimitry Andric   case i64_func_f32:
61271d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I64);
61371d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
61471d5a254SDimitry Andric     break;
61571d5a254SDimitry Andric   case i64_func_f64:
61671d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I64);
61771d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
61871d5a254SDimitry Andric     break;
61971d5a254SDimitry Andric   case i64_func_i64:
62071d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I64);
62171d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
62271d5a254SDimitry Andric     break;
62371d5a254SDimitry Andric   case f32_func_f32_f32:
62471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
62571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
62671d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
62771d5a254SDimitry Andric     break;
62871d5a254SDimitry Andric   case f32_func_f32_i32:
62971d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
63071d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
63171d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
63271d5a254SDimitry Andric     break;
63371d5a254SDimitry Andric   case f32_func_i64_i64:
63471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
63571d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
63671d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
63771d5a254SDimitry Andric     break;
63871d5a254SDimitry Andric   case f64_func_f64_f64:
63971d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
64071d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
64171d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
64271d5a254SDimitry Andric     break;
64371d5a254SDimitry Andric   case f64_func_f64_i32:
64471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
64571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
64671d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
64771d5a254SDimitry Andric     break;
64871d5a254SDimitry Andric   case f64_func_i64_i64:
64971d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
65071d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
65171d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
65271d5a254SDimitry Andric     break;
65371d5a254SDimitry Andric   case i16_func_f32:
65471d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
65571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
65671d5a254SDimitry Andric     break;
657e6d15924SDimitry Andric   case i16_func_f64:
658e6d15924SDimitry Andric     Rets.push_back(wasm::ValType::I32);
659e6d15924SDimitry Andric     Params.push_back(wasm::ValType::F64);
660e6d15924SDimitry Andric     break;
661e6d15924SDimitry Andric   case i16_func_i64_i64:
662e6d15924SDimitry Andric     Rets.push_back(wasm::ValType::I32);
663e6d15924SDimitry Andric     Params.push_back(wasm::ValType::I64);
664e6d15924SDimitry Andric     Params.push_back(wasm::ValType::I64);
665e6d15924SDimitry Andric     break;
66671d5a254SDimitry Andric   case i8_func_i8_i8:
66771d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
66871d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
66971d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
67071d5a254SDimitry Andric     break;
67171d5a254SDimitry Andric   case func_f32_iPTR_iPTR:
67271d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
673e6d15924SDimitry Andric     Params.push_back(PtrTy);
674e6d15924SDimitry Andric     Params.push_back(PtrTy);
67571d5a254SDimitry Andric     break;
67671d5a254SDimitry Andric   case func_f64_iPTR_iPTR:
67771d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
678e6d15924SDimitry Andric     Params.push_back(PtrTy);
679e6d15924SDimitry Andric     Params.push_back(PtrTy);
68071d5a254SDimitry Andric     break;
68171d5a254SDimitry Andric   case i16_func_i16_i16:
68271d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
68371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
68471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
68571d5a254SDimitry Andric     break;
68671d5a254SDimitry Andric   case i32_func_f32_f32:
68771d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
68871d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
68971d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
69071d5a254SDimitry Andric     break;
69171d5a254SDimitry Andric   case i32_func_f64_f64:
69271d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
69371d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
69471d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
69571d5a254SDimitry Andric     break;
69671d5a254SDimitry Andric   case i32_func_i32_i32:
69771d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
69871d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
69971d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
70071d5a254SDimitry Andric     break;
701eb11fae6SDimitry Andric   case i32_func_i32_i32_iPTR:
702eb11fae6SDimitry Andric     Rets.push_back(wasm::ValType::I32);
703eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I32);
704eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I32);
705e6d15924SDimitry Andric     Params.push_back(PtrTy);
706eb11fae6SDimitry Andric     break;
70771d5a254SDimitry Andric   case i64_func_i64_i64:
70871d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I64);
70971d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
71071d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
71171d5a254SDimitry Andric     break;
712eb11fae6SDimitry Andric   case i64_func_i64_i64_iPTR:
713eb11fae6SDimitry Andric     Rets.push_back(wasm::ValType::I64);
714eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
715eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
716e6d15924SDimitry Andric     Params.push_back(PtrTy);
717eb11fae6SDimitry Andric     break;
71871d5a254SDimitry Andric   case i64_i64_func_f32:
719ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
72071d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
72171d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7227fa27ce4SDimitry Andric     } else {
723e6d15924SDimitry Andric       Params.push_back(PtrTy);
7247fa27ce4SDimitry Andric     }
72571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
72671d5a254SDimitry Andric     break;
72771d5a254SDimitry Andric   case i64_i64_func_f64:
728ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
72971d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
73071d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7317fa27ce4SDimitry Andric     } else {
732e6d15924SDimitry Andric       Params.push_back(PtrTy);
7337fa27ce4SDimitry Andric     }
73471d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
73571d5a254SDimitry Andric     break;
73671d5a254SDimitry Andric   case i16_i16_func_i16_i16:
737ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
73871d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I32);
73971d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I32);
7407fa27ce4SDimitry Andric     } else {
741e6d15924SDimitry Andric       Params.push_back(PtrTy);
7427fa27ce4SDimitry Andric     }
74371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
74471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
74571d5a254SDimitry Andric     break;
74671d5a254SDimitry Andric   case i32_i32_func_i32_i32:
747ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
74871d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I32);
74971d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I32);
7507fa27ce4SDimitry Andric     } else {
751e6d15924SDimitry Andric       Params.push_back(PtrTy);
7527fa27ce4SDimitry Andric     }
75371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
75471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
75571d5a254SDimitry Andric     break;
75671d5a254SDimitry Andric   case i64_i64_func_i64_i64:
757ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
75871d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
75971d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7607fa27ce4SDimitry Andric     } else {
761e6d15924SDimitry Andric       Params.push_back(PtrTy);
7627fa27ce4SDimitry Andric     }
76371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
76471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
76571d5a254SDimitry Andric     break;
76671d5a254SDimitry Andric   case i64_i64_func_i64_i64_i64_i64:
767ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
76871d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
76971d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7707fa27ce4SDimitry Andric     } else {
771e6d15924SDimitry Andric       Params.push_back(PtrTy);
7727fa27ce4SDimitry Andric     }
77371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
77471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
77571d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
77671d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
77771d5a254SDimitry Andric     break;
778eb11fae6SDimitry Andric   case i64_i64_func_i64_i64_i64_i64_iPTR:
779ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
780eb11fae6SDimitry Andric       Rets.push_back(wasm::ValType::I64);
781eb11fae6SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7827fa27ce4SDimitry Andric     } else {
783e6d15924SDimitry Andric       Params.push_back(PtrTy);
7847fa27ce4SDimitry Andric     }
785eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
786eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
787eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
788eb11fae6SDimitry Andric     Params.push_back(wasm::ValType::I64);
789e6d15924SDimitry Andric     Params.push_back(PtrTy);
790eb11fae6SDimitry Andric     break;
79171d5a254SDimitry Andric   case i64_i64_i64_i64_func_i64_i64_i64_i64:
792ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
79371d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
79471d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
79571d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
79671d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
7977fa27ce4SDimitry Andric     } else {
798e6d15924SDimitry Andric       Params.push_back(PtrTy);
7997fa27ce4SDimitry Andric     }
80071d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
80171d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
80271d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
80371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
80471d5a254SDimitry Andric     break;
80571d5a254SDimitry Andric   case i64_i64_func_i64_i64_i32:
806ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
80771d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
80871d5a254SDimitry Andric       Rets.push_back(wasm::ValType::I64);
8097fa27ce4SDimitry Andric     } else {
810e6d15924SDimitry Andric       Params.push_back(PtrTy);
8117fa27ce4SDimitry Andric     }
81271d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
81371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
81471d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
81571d5a254SDimitry Andric     break;
816e3b55780SDimitry Andric   case iPTR_func_i32:
817e3b55780SDimitry Andric     Rets.push_back(PtrTy);
818e3b55780SDimitry Andric     Params.push_back(wasm::ValType::I32);
819e3b55780SDimitry Andric     break;
82071d5a254SDimitry Andric   case iPTR_func_iPTR_i32_iPTR:
821e6d15924SDimitry Andric     Rets.push_back(PtrTy);
822e6d15924SDimitry Andric     Params.push_back(PtrTy);
82371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I32);
824e6d15924SDimitry Andric     Params.push_back(PtrTy);
82571d5a254SDimitry Andric     break;
82671d5a254SDimitry Andric   case iPTR_func_iPTR_iPTR_iPTR:
827e6d15924SDimitry Andric     Rets.push_back(PtrTy);
828e6d15924SDimitry Andric     Params.push_back(PtrTy);
829e6d15924SDimitry Andric     Params.push_back(PtrTy);
830e6d15924SDimitry Andric     Params.push_back(PtrTy);
83171d5a254SDimitry Andric     break;
83271d5a254SDimitry Andric   case f32_func_f32_f32_f32:
83371d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F32);
83471d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
83571d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
83671d5a254SDimitry Andric     Params.push_back(wasm::ValType::F32);
83771d5a254SDimitry Andric     break;
83871d5a254SDimitry Andric   case f64_func_f64_f64_f64:
83971d5a254SDimitry Andric     Rets.push_back(wasm::ValType::F64);
84071d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
84171d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
84271d5a254SDimitry Andric     Params.push_back(wasm::ValType::F64);
84371d5a254SDimitry Andric     break;
84471d5a254SDimitry Andric   case func_i64_i64_iPTR_iPTR:
84571d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
84671d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
847e6d15924SDimitry Andric     Params.push_back(PtrTy);
848e6d15924SDimitry Andric     Params.push_back(PtrTy);
84971d5a254SDimitry Andric     break;
85071d5a254SDimitry Andric   case i32_func_i64_i64:
85171d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
85271d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
85371d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
85471d5a254SDimitry Andric     break;
85571d5a254SDimitry Andric   case i32_func_i64_i64_i64_i64:
85671d5a254SDimitry Andric     Rets.push_back(wasm::ValType::I32);
85771d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
85871d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
85971d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
86071d5a254SDimitry Andric     Params.push_back(wasm::ValType::I64);
86171d5a254SDimitry Andric     break;
862e6d15924SDimitry Andric   case iPTR_func_f32:
863e6d15924SDimitry Andric     Rets.push_back(PtrTy);
864e6d15924SDimitry Andric     Params.push_back(wasm::ValType::F32);
865e6d15924SDimitry Andric     break;
866e6d15924SDimitry Andric   case iPTR_func_f64:
867e6d15924SDimitry Andric     Rets.push_back(PtrTy);
868e6d15924SDimitry Andric     Params.push_back(wasm::ValType::F64);
869e6d15924SDimitry Andric     break;
870e6d15924SDimitry Andric   case iPTR_func_i64_i64:
871e6d15924SDimitry Andric     Rets.push_back(PtrTy);
872e6d15924SDimitry Andric     Params.push_back(wasm::ValType::I64);
873e6d15924SDimitry Andric     Params.push_back(wasm::ValType::I64);
874e6d15924SDimitry Andric     break;
8757fa27ce4SDimitry Andric   case i64_i64_func_i64_i64_i64_i64_i64_i64:
876ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
8777fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
8787fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
8797fa27ce4SDimitry Andric     } else {
8807fa27ce4SDimitry Andric       Params.push_back(PtrTy);
8817fa27ce4SDimitry Andric     }
8827fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8837fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8847fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8857fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8867fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8877fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
8887fa27ce4SDimitry Andric     break;
8897fa27ce4SDimitry Andric   case i64_i64_func_i32:
890ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
8917fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
8927fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
8937fa27ce4SDimitry Andric     } else {
8947fa27ce4SDimitry Andric       Params.push_back(PtrTy);
8957fa27ce4SDimitry Andric     }
8967fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I32);
8977fa27ce4SDimitry Andric     break;
8987fa27ce4SDimitry Andric   case i64_i64_func_i64:
899ac9a064cSDimitry Andric     if (WebAssembly::canLowerMultivalueReturn(&Subtarget)) {
9007fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
9017fa27ce4SDimitry Andric       Rets.push_back(wasm::ValType::I64);
9027fa27ce4SDimitry Andric     } else {
9037fa27ce4SDimitry Andric       Params.push_back(PtrTy);
9047fa27ce4SDimitry Andric     }
9057fa27ce4SDimitry Andric     Params.push_back(wasm::ValType::I64);
9067fa27ce4SDimitry Andric     break;
90771d5a254SDimitry Andric   case unsupported:
90871d5a254SDimitry Andric     llvm_unreachable("unsupported runtime library signature");
90971d5a254SDimitry Andric   }
91071d5a254SDimitry Andric }
91171d5a254SDimitry Andric 
9127fa27ce4SDimitry Andric // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unused
913eb11fae6SDimitry Andric // other than here, just roll its logic into this version.
getLibcallSignature(const WebAssemblySubtarget & Subtarget,StringRef Name,SmallVectorImpl<wasm::ValType> & Rets,SmallVectorImpl<wasm::ValType> & Params)914ac9a064cSDimitry Andric void WebAssembly::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
915344a3780SDimitry Andric                                       StringRef Name,
91671d5a254SDimitry Andric                                       SmallVectorImpl<wasm::ValType> &Rets,
91771d5a254SDimitry Andric                                       SmallVectorImpl<wasm::ValType> &Params) {
9181f917f69SDimitry Andric   static StaticLibcallNameMap LibcallNameMap;
9191f917f69SDimitry Andric   auto &Map = LibcallNameMap.Map;
920e6d15924SDimitry Andric   auto Val = Map.find(Name);
921e6d15924SDimitry Andric #ifndef NDEBUG
922e6d15924SDimitry Andric   if (Val == Map.end()) {
9237fa27ce4SDimitry Andric     auto Message =
9247fa27ce4SDimitry Andric         std::string("unexpected runtime library name: ") + std::string(Name);
9257fa27ce4SDimitry Andric     llvm_unreachable(Message.c_str());
926e6d15924SDimitry Andric   }
927e6d15924SDimitry Andric #endif
928e6d15924SDimitry Andric   return getLibcallSignature(Subtarget, Val->second, Rets, Params);
92971d5a254SDimitry Andric }
930