138b42b4aSDan Gohman // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
238b42b4aSDan Gohman //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
638b42b4aSDan Gohman //
738b42b4aSDan Gohman //===----------------------------------------------------------------------===//
838b42b4aSDan Gohman ///
938b42b4aSDan Gohman /// \file
105f8f34e4SAdrian Prantl /// This file contains signature information for runtime libcalls.
1138b42b4aSDan Gohman ///
1238b42b4aSDan Gohman /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
1338b42b4aSDan Gohman /// target needs type information for all functions. This file contains a big
1438b42b4aSDan Gohman /// table providing type signatures for all runtime library functions that LLVM
1538b42b4aSDan Gohman /// uses.
1638b42b4aSDan Gohman ///
1738b42b4aSDan Gohman /// This is currently a fairly heavy-handed solution.
1838b42b4aSDan Gohman ///
1938b42b4aSDan Gohman //===----------------------------------------------------------------------===//
2038b42b4aSDan Gohman
2138b42b4aSDan Gohman #include "WebAssemblyRuntimeLibcallSignatures.h"
2238b42b4aSDan Gohman #include "WebAssemblySubtarget.h"
2338b42b4aSDan Gohman #include "llvm/CodeGen/RuntimeLibcalls.h"
2438b42b4aSDan Gohman
2538b42b4aSDan Gohman using namespace llvm;
2638b42b4aSDan Gohman
2738b42b4aSDan Gohman namespace {
2838b42b4aSDan Gohman
2938b42b4aSDan Gohman enum RuntimeLibcallSignature {
3038b42b4aSDan Gohman func,
3138b42b4aSDan Gohman f32_func_f32,
3238b42b4aSDan Gohman f32_func_f64,
3338b42b4aSDan Gohman f32_func_i32,
3438b42b4aSDan Gohman f32_func_i64,
3538b42b4aSDan Gohman f32_func_i16,
3638b42b4aSDan Gohman f64_func_f32,
3738b42b4aSDan Gohman f64_func_f64,
3838b42b4aSDan Gohman f64_func_i32,
3938b42b4aSDan Gohman f64_func_i64,
4038b42b4aSDan Gohman i32_func_f32,
4138b42b4aSDan Gohman i32_func_f64,
4238b42b4aSDan Gohman i32_func_i32,
4338b42b4aSDan Gohman i64_func_f32,
4438b42b4aSDan Gohman i64_func_f64,
4538b42b4aSDan Gohman i64_func_i64,
4638b42b4aSDan Gohman f32_func_f32_f32,
4738b42b4aSDan Gohman f32_func_f32_i32,
4838b42b4aSDan Gohman f32_func_i64_i64,
4938b42b4aSDan Gohman f64_func_f64_f64,
5038b42b4aSDan Gohman f64_func_f64_i32,
5138b42b4aSDan Gohman f64_func_i64_i64,
5238b42b4aSDan Gohman i16_func_f32,
533a7532e6SDan Gohman i16_func_f64,
543a7532e6SDan Gohman i16_func_i64_i64,
5538b42b4aSDan Gohman i8_func_i8_i8,
5638b42b4aSDan Gohman func_f32_iPTR_iPTR,
5738b42b4aSDan Gohman func_f64_iPTR_iPTR,
5838b42b4aSDan Gohman i16_func_i16_i16,
5938b42b4aSDan Gohman i32_func_f32_f32,
6038b42b4aSDan Gohman i32_func_f64_f64,
6138b42b4aSDan Gohman i32_func_i32_i32,
62b17de645SDan Gohman i32_func_i32_i32_iPTR,
6338b42b4aSDan Gohman i64_func_i64_i64,
64b17de645SDan Gohman i64_func_i64_i64_iPTR,
6538b42b4aSDan Gohman i64_i64_func_f32,
6638b42b4aSDan Gohman i64_i64_func_f64,
6738b42b4aSDan Gohman i16_i16_func_i16_i16,
6838b42b4aSDan Gohman i32_i32_func_i32_i32,
6938b42b4aSDan Gohman i64_i64_func_i64_i64,
7038b42b4aSDan Gohman i64_i64_func_i64_i64_i64_i64,
71b17de645SDan Gohman i64_i64_func_i64_i64_i64_i64_iPTR,
7238b42b4aSDan Gohman i64_i64_i64_i64_func_i64_i64_i64_i64,
7338b42b4aSDan Gohman i64_i64_func_i64_i64_i32,
7438b42b4aSDan Gohman iPTR_func_iPTR_i32_iPTR,
7538b42b4aSDan Gohman iPTR_func_iPTR_iPTR_iPTR,
7638b42b4aSDan Gohman f32_func_f32_f32_f32,
7738b42b4aSDan Gohman f64_func_f64_f64_f64,
7838b42b4aSDan Gohman func_i64_i64_iPTR_iPTR,
7938b42b4aSDan Gohman func_iPTR_f32,
8038b42b4aSDan Gohman func_iPTR_f64,
8138b42b4aSDan Gohman func_iPTR_i32,
8238b42b4aSDan Gohman func_iPTR_i64,
8338b42b4aSDan Gohman func_iPTR_i64_i64,
84caeb6cfbSSam Clegg func_iPTR_i64_i64_i32,
8538b42b4aSDan Gohman func_iPTR_i64_i64_i64_i64,
8638b42b4aSDan Gohman func_iPTR_i64_i64_i64_i64_i64_i64,
8738b42b4aSDan Gohman i32_func_i64_i64,
8838b42b4aSDan Gohman i32_func_i64_i64_i64_i64,
89a49496fbSDan Gohman iPTR_func_f32,
90a49496fbSDan Gohman iPTR_func_f64,
91a49496fbSDan Gohman iPTR_func_i64_i64,
9238b42b4aSDan Gohman unsupported
9338b42b4aSDan Gohman };
9438b42b4aSDan Gohman
9553b3855bSDerek Schuff struct RuntimeLibcallSignatureTable {
9653b3855bSDerek Schuff std::vector<RuntimeLibcallSignature> Table;
9753b3855bSDerek Schuff
9853b3855bSDerek Schuff // Any newly-added libcalls will be unsupported by default.
RuntimeLibcallSignatureTable__anon0df04add0111::RuntimeLibcallSignatureTable9953b3855bSDerek Schuff RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
10038b42b4aSDan Gohman // Integer
10153b3855bSDerek Schuff Table[RTLIB::SHL_I16] = i16_func_i16_i16;
10253b3855bSDerek Schuff Table[RTLIB::SHL_I32] = i32_func_i32_i32;
10353b3855bSDerek Schuff Table[RTLIB::SHL_I64] = i64_func_i64_i64;
10453b3855bSDerek Schuff Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
10553b3855bSDerek Schuff Table[RTLIB::SRL_I16] = i16_func_i16_i16;
10653b3855bSDerek Schuff Table[RTLIB::SRL_I32] = i32_func_i32_i32;
10753b3855bSDerek Schuff Table[RTLIB::SRL_I64] = i64_func_i64_i64;
10853b3855bSDerek Schuff Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
10953b3855bSDerek Schuff Table[RTLIB::SRA_I16] = i16_func_i16_i16;
11053b3855bSDerek Schuff Table[RTLIB::SRA_I32] = i32_func_i32_i32;
11153b3855bSDerek Schuff Table[RTLIB::SRA_I64] = i64_func_i64_i64;
11253b3855bSDerek Schuff Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
11353b3855bSDerek Schuff Table[RTLIB::MUL_I8] = i8_func_i8_i8;
11453b3855bSDerek Schuff Table[RTLIB::MUL_I16] = i16_func_i16_i16;
11553b3855bSDerek Schuff Table[RTLIB::MUL_I32] = i32_func_i32_i32;
11653b3855bSDerek Schuff Table[RTLIB::MUL_I64] = i64_func_i64_i64;
11753b3855bSDerek Schuff Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
118b17de645SDan Gohman Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
119b17de645SDan Gohman Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
120b17de645SDan Gohman Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
12153b3855bSDerek Schuff Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
12253b3855bSDerek Schuff Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
12353b3855bSDerek Schuff Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
12453b3855bSDerek Schuff Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
12553b3855bSDerek Schuff Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
12653b3855bSDerek Schuff Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
12753b3855bSDerek Schuff Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
12853b3855bSDerek Schuff Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
12953b3855bSDerek Schuff Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
13053b3855bSDerek Schuff Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
13153b3855bSDerek Schuff Table[RTLIB::SREM_I8] = i8_func_i8_i8;
13253b3855bSDerek Schuff Table[RTLIB::SREM_I16] = i16_func_i16_i16;
13353b3855bSDerek Schuff Table[RTLIB::SREM_I32] = i32_func_i32_i32;
13453b3855bSDerek Schuff Table[RTLIB::SREM_I64] = i64_func_i64_i64;
13553b3855bSDerek Schuff Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
13653b3855bSDerek Schuff Table[RTLIB::UREM_I8] = i8_func_i8_i8;
13753b3855bSDerek Schuff Table[RTLIB::UREM_I16] = i16_func_i16_i16;
13853b3855bSDerek Schuff Table[RTLIB::UREM_I32] = i32_func_i32_i32;
13953b3855bSDerek Schuff Table[RTLIB::UREM_I64] = i64_func_i64_i64;
14053b3855bSDerek Schuff Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
14153b3855bSDerek Schuff Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
14253b3855bSDerek Schuff Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
14353b3855bSDerek Schuff Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
14453b3855bSDerek Schuff Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
14553b3855bSDerek Schuff Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
14653b3855bSDerek Schuff Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
14753b3855bSDerek Schuff Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
14853b3855bSDerek Schuff Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
14953b3855bSDerek Schuff Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
15053b3855bSDerek Schuff Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
15153b3855bSDerek Schuff Table[RTLIB::NEG_I32] = i32_func_i32;
15253b3855bSDerek Schuff Table[RTLIB::NEG_I64] = i64_func_i64;
15338b42b4aSDan Gohman
15453b3855bSDerek Schuff // Floating-point.
15553b3855bSDerek Schuff // All F80 and PPCF128 routines are unsupported.
15653b3855bSDerek Schuff Table[RTLIB::ADD_F32] = f32_func_f32_f32;
15753b3855bSDerek Schuff Table[RTLIB::ADD_F64] = f64_func_f64_f64;
15853b3855bSDerek Schuff Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
15953b3855bSDerek Schuff Table[RTLIB::SUB_F32] = f32_func_f32_f32;
16053b3855bSDerek Schuff Table[RTLIB::SUB_F64] = f64_func_f64_f64;
16153b3855bSDerek Schuff Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
16253b3855bSDerek Schuff Table[RTLIB::MUL_F32] = f32_func_f32_f32;
16353b3855bSDerek Schuff Table[RTLIB::MUL_F64] = f64_func_f64_f64;
16453b3855bSDerek Schuff Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
16553b3855bSDerek Schuff Table[RTLIB::DIV_F32] = f32_func_f32_f32;
16653b3855bSDerek Schuff Table[RTLIB::DIV_F64] = f64_func_f64_f64;
16753b3855bSDerek Schuff Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
16853b3855bSDerek Schuff Table[RTLIB::REM_F32] = f32_func_f32_f32;
16953b3855bSDerek Schuff Table[RTLIB::REM_F64] = f64_func_f64_f64;
17053b3855bSDerek Schuff Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
17153b3855bSDerek Schuff Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
17253b3855bSDerek Schuff Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
17353b3855bSDerek Schuff Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
17453b3855bSDerek Schuff Table[RTLIB::POWI_F32] = f32_func_f32_i32;
17553b3855bSDerek Schuff Table[RTLIB::POWI_F64] = f64_func_f64_i32;
176caeb6cfbSSam Clegg Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i32;
17753b3855bSDerek Schuff Table[RTLIB::SQRT_F32] = f32_func_f32;
17853b3855bSDerek Schuff Table[RTLIB::SQRT_F64] = f64_func_f64;
17953b3855bSDerek Schuff Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
180e252293dSThomas Lively Table[RTLIB::CBRT_F32] = f32_func_f32;
181e252293dSThomas Lively Table[RTLIB::CBRT_F64] = f64_func_f64;
182e252293dSThomas Lively Table[RTLIB::CBRT_F128] = func_iPTR_i64_i64;
18353b3855bSDerek Schuff Table[RTLIB::LOG_F32] = f32_func_f32;
18453b3855bSDerek Schuff Table[RTLIB::LOG_F64] = f64_func_f64;
18553b3855bSDerek Schuff Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
18653b3855bSDerek Schuff Table[RTLIB::LOG2_F32] = f32_func_f32;
18753b3855bSDerek Schuff Table[RTLIB::LOG2_F64] = f64_func_f64;
18853b3855bSDerek Schuff Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
18953b3855bSDerek Schuff Table[RTLIB::LOG10_F32] = f32_func_f32;
19053b3855bSDerek Schuff Table[RTLIB::LOG10_F64] = f64_func_f64;
19153b3855bSDerek Schuff Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
19253b3855bSDerek Schuff Table[RTLIB::EXP_F32] = f32_func_f32;
19353b3855bSDerek Schuff Table[RTLIB::EXP_F64] = f64_func_f64;
19453b3855bSDerek Schuff Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
19553b3855bSDerek Schuff Table[RTLIB::EXP2_F32] = f32_func_f32;
19653b3855bSDerek Schuff Table[RTLIB::EXP2_F64] = f64_func_f64;
19753b3855bSDerek Schuff Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
19853b3855bSDerek Schuff Table[RTLIB::SIN_F32] = f32_func_f32;
19953b3855bSDerek Schuff Table[RTLIB::SIN_F64] = f64_func_f64;
20053b3855bSDerek Schuff Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
20153b3855bSDerek Schuff Table[RTLIB::COS_F32] = f32_func_f32;
20253b3855bSDerek Schuff Table[RTLIB::COS_F64] = f64_func_f64;
20353b3855bSDerek Schuff Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
20453b3855bSDerek Schuff Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
20553b3855bSDerek Schuff Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
20653b3855bSDerek Schuff Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
20753b3855bSDerek Schuff Table[RTLIB::POW_F32] = f32_func_f32_f32;
20853b3855bSDerek Schuff Table[RTLIB::POW_F64] = f64_func_f64_f64;
20953b3855bSDerek Schuff Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
21053b3855bSDerek Schuff Table[RTLIB::CEIL_F32] = f32_func_f32;
21153b3855bSDerek Schuff Table[RTLIB::CEIL_F64] = f64_func_f64;
21253b3855bSDerek Schuff Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
21353b3855bSDerek Schuff Table[RTLIB::TRUNC_F32] = f32_func_f32;
21453b3855bSDerek Schuff Table[RTLIB::TRUNC_F64] = f64_func_f64;
21553b3855bSDerek Schuff Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
21653b3855bSDerek Schuff Table[RTLIB::RINT_F32] = f32_func_f32;
21753b3855bSDerek Schuff Table[RTLIB::RINT_F64] = f64_func_f64;
21853b3855bSDerek Schuff Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
21953b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
22053b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
22153b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
22253b3855bSDerek Schuff Table[RTLIB::ROUND_F32] = f32_func_f32;
22353b3855bSDerek Schuff Table[RTLIB::ROUND_F64] = f64_func_f64;
22453b3855bSDerek Schuff Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
225a49496fbSDan Gohman Table[RTLIB::LROUND_F32] = iPTR_func_f32;
226a49496fbSDan Gohman Table[RTLIB::LROUND_F64] = iPTR_func_f64;
227a49496fbSDan Gohman Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64;
228a49496fbSDan Gohman Table[RTLIB::LLROUND_F32] = i64_func_f32;
229a49496fbSDan Gohman Table[RTLIB::LLROUND_F64] = i64_func_f64;
230a49496fbSDan Gohman Table[RTLIB::LLROUND_F128] = i64_func_i64_i64;
23126d711beSThomas Lively Table[RTLIB::LRINT_F32] = iPTR_func_f32;
23226d711beSThomas Lively Table[RTLIB::LRINT_F64] = iPTR_func_f64;
23326d711beSThomas Lively Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64;
23426d711beSThomas Lively Table[RTLIB::LLRINT_F32] = i64_func_f32;
23526d711beSThomas Lively Table[RTLIB::LLRINT_F64] = i64_func_f64;
23626d711beSThomas Lively Table[RTLIB::LLRINT_F128] = i64_func_i64_i64;
23753b3855bSDerek Schuff Table[RTLIB::FLOOR_F32] = f32_func_f32;
23853b3855bSDerek Schuff Table[RTLIB::FLOOR_F64] = f64_func_f64;
23953b3855bSDerek Schuff Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
24053b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
24153b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
24253b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
24353b3855bSDerek Schuff Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
24453b3855bSDerek Schuff Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
24553b3855bSDerek Schuff Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
24653b3855bSDerek Schuff Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
24753b3855bSDerek Schuff Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
24853b3855bSDerek Schuff Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
24938b42b4aSDan Gohman
25053b3855bSDerek Schuff // Conversion
2513a7532e6SDan Gohman // All F80 and PPCF128 routines are unsupported.
25253b3855bSDerek Schuff Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
25353b3855bSDerek Schuff Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
25453b3855bSDerek Schuff Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
25553b3855bSDerek Schuff Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
25653b3855bSDerek Schuff Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
2573a7532e6SDan Gohman Table[RTLIB::FPROUND_F64_F16] = i16_func_f64;
25853b3855bSDerek Schuff Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
2593a7532e6SDan Gohman Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64;
26053b3855bSDerek Schuff Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
26153b3855bSDerek Schuff Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
26253b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
26353b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
26453b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
26553b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
26653b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
26753b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
26853b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
26953b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
27053b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
27153b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
27253b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
27353b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
27453b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
27553b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
27653b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
27753b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
27853b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
27953b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
28053b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
28153b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
28253b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
28353b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
28453b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
28553b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
28653b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
28753b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
28853b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
28953b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
29053b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
29153b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
29253b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
29353b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
29453b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
29553b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
29653b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
29753b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
29838b42b4aSDan Gohman
29953b3855bSDerek Schuff // Comparison
30053b3855bSDerek Schuff // ALl F80 and PPCF128 routines are unsupported.
30153b3855bSDerek Schuff Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
30253b3855bSDerek Schuff Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
30353b3855bSDerek Schuff Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
30453b3855bSDerek Schuff Table[RTLIB::UNE_F32] = i32_func_f32_f32;
30553b3855bSDerek Schuff Table[RTLIB::UNE_F64] = i32_func_f64_f64;
30653b3855bSDerek Schuff Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
30753b3855bSDerek Schuff Table[RTLIB::OGE_F32] = i32_func_f32_f32;
30853b3855bSDerek Schuff Table[RTLIB::OGE_F64] = i32_func_f64_f64;
30953b3855bSDerek Schuff Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
31053b3855bSDerek Schuff Table[RTLIB::OLT_F32] = i32_func_f32_f32;
31153b3855bSDerek Schuff Table[RTLIB::OLT_F64] = i32_func_f64_f64;
31253b3855bSDerek Schuff Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
31353b3855bSDerek Schuff Table[RTLIB::OLE_F32] = i32_func_f32_f32;
31453b3855bSDerek Schuff Table[RTLIB::OLE_F64] = i32_func_f64_f64;
31553b3855bSDerek Schuff Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
31653b3855bSDerek Schuff Table[RTLIB::OGT_F32] = i32_func_f32_f32;
31753b3855bSDerek Schuff Table[RTLIB::OGT_F64] = i32_func_f64_f64;
31853b3855bSDerek Schuff Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
31953b3855bSDerek Schuff Table[RTLIB::UO_F32] = i32_func_f32_f32;
32053b3855bSDerek Schuff Table[RTLIB::UO_F64] = i32_func_f64_f64;
32153b3855bSDerek Schuff Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
32238b42b4aSDan Gohman
32353b3855bSDerek Schuff // Memory
32453b3855bSDerek Schuff Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
32553b3855bSDerek Schuff Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
32653b3855bSDerek Schuff Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
32738b42b4aSDan Gohman
3288306cb57SDan Gohman // __stack_chk_fail
3298306cb57SDan Gohman Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func;
3308306cb57SDan Gohman
3311a3cbe72SThomas Lively // Return address handling
3321a3cbe72SThomas Lively Table[RTLIB::RETURN_ADDRESS] = i32_func_i32;
3331a3cbe72SThomas Lively
33453b3855bSDerek Schuff // Element-wise Atomic memory
33553b3855bSDerek Schuff // TODO: Fix these when we implement atomic support
33653b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
33753b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
33853b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
33953b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
34053b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
34153b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
34253b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
34353b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
34453b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
34553b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
346c855c728SDaniel Neilson
34753b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
34853b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
34953b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
35053b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
35153b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
35238b42b4aSDan Gohman
35338b42b4aSDan Gohman // Atomic '__sync_*' libcalls.
35453b3855bSDerek Schuff // TODO: Fix these when we implement atomic support
35553b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
35653b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
35753b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
35853b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
35953b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
36053b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
36153b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
36253b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
36353b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
36453b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
36553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
36653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
36753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
36853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
36953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
37053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
37153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
37253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
37353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
37453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
37553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
37653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
37753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
37853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
37953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
38053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
38153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
38253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
38353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
38453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
38553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
38653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
38753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
38853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
38953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
39053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
39153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
39253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
39353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
39453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
39553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
39653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
39753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
39853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
39953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
40053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
40153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
40253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
40353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
40453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
40553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
40653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
40753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
40853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
40953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
41053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
41153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
41253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
41353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
41453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
41538b42b4aSDan Gohman
41638b42b4aSDan Gohman // Atomic '__atomic_*' libcalls.
41753b3855bSDerek Schuff // TODO: Fix these when we implement atomic support
41853b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD] = unsupported;
41953b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
42053b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
42153b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
42253b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
42353b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
42438b42b4aSDan Gohman
42553b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE] = unsupported;
42653b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_1] = unsupported;
42753b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_2] = unsupported;
42853b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_4] = unsupported;
42953b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_8] = unsupported;
43053b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_16] = unsupported;
43138b42b4aSDan Gohman
43253b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
43353b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
43453b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
43553b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
43653b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
43753b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
43838b42b4aSDan Gohman
43953b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
44053b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
44153b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
44253b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
44353b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
44453b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
44538b42b4aSDan Gohman
44653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
44753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
44853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
44953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
45053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
45138b42b4aSDan Gohman
45253b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
45353b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
45453b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
45553b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
45653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
45738b42b4aSDan Gohman
45853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
45953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
46053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
46153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
46253b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
46338b42b4aSDan Gohman
46453b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
46553b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
46653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
46753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
46853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
46938b42b4aSDan Gohman
47053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
47153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
47253b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
47353b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
47453b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
47538b42b4aSDan Gohman
47653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
47753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
47853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
47953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
48053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
48153b3855bSDerek Schuff }
48238b42b4aSDan Gohman };
48338b42b4aSDan Gohman
getRuntimeLibcallSignatures()484*ede60037SNicolai Hähnle RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() {
485*ede60037SNicolai Hähnle static RuntimeLibcallSignatureTable RuntimeLibcallSignatures;
486*ede60037SNicolai Hähnle return RuntimeLibcallSignatures;
487*ede60037SNicolai Hähnle }
48838b42b4aSDan Gohman
48953b3855bSDerek Schuff // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
490*ede60037SNicolai Hähnle // constructor for use with a static variable
49153b3855bSDerek Schuff struct StaticLibcallNameMap {
49253b3855bSDerek Schuff StringMap<RTLIB::Libcall> Map;
StaticLibcallNameMap__anon0df04add0111::StaticLibcallNameMap49353b3855bSDerek Schuff StaticLibcallNameMap() {
494b84e158dSBenjamin Kramer static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
495ae87f86eSBenjamin Kramer #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
496e06bac47SPeter Collingbourne #include "llvm/IR/RuntimeLibcalls.def"
49753b3855bSDerek Schuff #undef HANDLE_LIBCALL
498ae87f86eSBenjamin Kramer };
499ae87f86eSBenjamin Kramer for (const auto &NameLibcall : NameLibcalls) {
500ae87f86eSBenjamin Kramer if (NameLibcall.first != nullptr &&
501*ede60037SNicolai Hähnle getRuntimeLibcallSignatures().Table[NameLibcall.second] !=
502*ede60037SNicolai Hähnle unsupported) {
503ae87f86eSBenjamin Kramer assert(Map.find(NameLibcall.first) == Map.end() &&
504ae87f86eSBenjamin Kramer "duplicate libcall names in name map");
505ae87f86eSBenjamin Kramer Map[NameLibcall.first] = NameLibcall.second;
506ae87f86eSBenjamin Kramer }
507ae87f86eSBenjamin Kramer }
5083a7532e6SDan Gohman // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is
5093a7532e6SDan Gohman // consistent with the f64 and f128 names.
5103a7532e6SDan Gohman Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32;
5113a7532e6SDan Gohman Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16;
5121a3cbe72SThomas Lively
5131a3cbe72SThomas Lively Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS;
51453b3855bSDerek Schuff }
51538b42b4aSDan Gohman };
51638b42b4aSDan Gohman
51753b3855bSDerek Schuff } // end anonymous namespace
51853b3855bSDerek Schuff
getLibcallSignature(const WebAssemblySubtarget & Subtarget,RTLIB::Libcall LC,SmallVectorImpl<wasm::ValType> & Rets,SmallVectorImpl<wasm::ValType> & Params)51918c56a07SHeejin Ahn void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
52070ce1af9SDerek Schuff RTLIB::Libcall LC,
52170ce1af9SDerek Schuff SmallVectorImpl<wasm::ValType> &Rets,
522e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) {
52338b42b4aSDan Gohman assert(Rets.empty());
52438b42b4aSDan Gohman assert(Params.empty());
52538b42b4aSDan Gohman
52618c56a07SHeejin Ahn wasm::ValType PtrTy =
527bd1716aeSSam Clegg Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
52838b42b4aSDan Gohman
529*ede60037SNicolai Hähnle auto &Table = getRuntimeLibcallSignatures().Table;
53053b3855bSDerek Schuff switch (Table[LC]) {
53138b42b4aSDan Gohman case func:
53238b42b4aSDan Gohman break;
53338b42b4aSDan Gohman case f32_func_f32:
534e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
535e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
53638b42b4aSDan Gohman break;
53738b42b4aSDan Gohman case f32_func_f64:
538e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
539e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
54038b42b4aSDan Gohman break;
54138b42b4aSDan Gohman case f32_func_i32:
542e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
543e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
54438b42b4aSDan Gohman break;
54538b42b4aSDan Gohman case f32_func_i64:
546e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
547e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
54838b42b4aSDan Gohman break;
54938b42b4aSDan Gohman case f32_func_i16:
550e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
551e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
55238b42b4aSDan Gohman break;
55338b42b4aSDan Gohman case f64_func_f32:
554e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
555e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
55638b42b4aSDan Gohman break;
55738b42b4aSDan Gohman case f64_func_f64:
558e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
559e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
56038b42b4aSDan Gohman break;
56138b42b4aSDan Gohman case f64_func_i32:
562e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
563e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
56438b42b4aSDan Gohman break;
56538b42b4aSDan Gohman case f64_func_i64:
566e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
567e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
56838b42b4aSDan Gohman break;
56938b42b4aSDan Gohman case i32_func_f32:
570e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
571e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
57238b42b4aSDan Gohman break;
57338b42b4aSDan Gohman case i32_func_f64:
574e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
575e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
57638b42b4aSDan Gohman break;
57738b42b4aSDan Gohman case i32_func_i32:
578e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
579e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
58038b42b4aSDan Gohman break;
58138b42b4aSDan Gohman case i64_func_f32:
582e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
583e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
58438b42b4aSDan Gohman break;
58538b42b4aSDan Gohman case i64_func_f64:
586e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
587e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
58838b42b4aSDan Gohman break;
58938b42b4aSDan Gohman case i64_func_i64:
590e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
591e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
59238b42b4aSDan Gohman break;
59338b42b4aSDan Gohman case f32_func_f32_f32:
594e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
595e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
596e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
59738b42b4aSDan Gohman break;
59838b42b4aSDan Gohman case f32_func_f32_i32:
599e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
600e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
601e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
60238b42b4aSDan Gohman break;
60338b42b4aSDan Gohman case f32_func_i64_i64:
604e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
605e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
606e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
60738b42b4aSDan Gohman break;
60838b42b4aSDan Gohman case f64_func_f64_f64:
609e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
610e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
611e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
61238b42b4aSDan Gohman break;
61338b42b4aSDan Gohman case f64_func_f64_i32:
614e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
615e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
616e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
61738b42b4aSDan Gohman break;
61838b42b4aSDan Gohman case f64_func_i64_i64:
619e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
620e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
621e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
62238b42b4aSDan Gohman break;
62338b42b4aSDan Gohman case i16_func_f32:
624e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
625e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
62638b42b4aSDan Gohman break;
6273a7532e6SDan Gohman case i16_func_f64:
6283a7532e6SDan Gohman Rets.push_back(wasm::ValType::I32);
6293a7532e6SDan Gohman Params.push_back(wasm::ValType::F64);
6303a7532e6SDan Gohman break;
6313a7532e6SDan Gohman case i16_func_i64_i64:
6323a7532e6SDan Gohman Rets.push_back(wasm::ValType::I32);
6333a7532e6SDan Gohman Params.push_back(wasm::ValType::I64);
6343a7532e6SDan Gohman Params.push_back(wasm::ValType::I64);
6353a7532e6SDan Gohman break;
63638b42b4aSDan Gohman case i8_func_i8_i8:
637e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
638e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
639e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
64038b42b4aSDan Gohman break;
64138b42b4aSDan Gohman case func_f32_iPTR_iPTR:
642e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
64318c56a07SHeejin Ahn Params.push_back(PtrTy);
64418c56a07SHeejin Ahn Params.push_back(PtrTy);
64538b42b4aSDan Gohman break;
64638b42b4aSDan Gohman case func_f64_iPTR_iPTR:
647e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
64818c56a07SHeejin Ahn Params.push_back(PtrTy);
64918c56a07SHeejin Ahn Params.push_back(PtrTy);
65038b42b4aSDan Gohman break;
65138b42b4aSDan Gohman case i16_func_i16_i16:
652e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
653e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
654e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
65538b42b4aSDan Gohman break;
65638b42b4aSDan Gohman case i32_func_f32_f32:
657e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
658e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
659e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
66038b42b4aSDan Gohman break;
66138b42b4aSDan Gohman case i32_func_f64_f64:
662e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
663e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
664e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
66538b42b4aSDan Gohman break;
66638b42b4aSDan Gohman case i32_func_i32_i32:
667e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
668e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
669e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
67038b42b4aSDan Gohman break;
671b17de645SDan Gohman case i32_func_i32_i32_iPTR:
672b17de645SDan Gohman Rets.push_back(wasm::ValType::I32);
673b17de645SDan Gohman Params.push_back(wasm::ValType::I32);
674b17de645SDan Gohman Params.push_back(wasm::ValType::I32);
67518c56a07SHeejin Ahn Params.push_back(PtrTy);
676b17de645SDan Gohman break;
67738b42b4aSDan Gohman case i64_func_i64_i64:
678e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
679e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
680e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
68138b42b4aSDan Gohman break;
682b17de645SDan Gohman case i64_func_i64_i64_iPTR:
683b17de645SDan Gohman Rets.push_back(wasm::ValType::I64);
684b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
685b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
68618c56a07SHeejin Ahn Params.push_back(PtrTy);
687b17de645SDan Gohman break;
68838b42b4aSDan Gohman case i64_i64_func_f32:
68938b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
690e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
691e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
69238b42b4aSDan Gohman #else
69318c56a07SHeejin Ahn Params.push_back(PtrTy);
69438b42b4aSDan Gohman #endif
695e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
69638b42b4aSDan Gohman break;
69738b42b4aSDan Gohman case i64_i64_func_f64:
69838b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
699e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
700e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
70138b42b4aSDan Gohman #else
70218c56a07SHeejin Ahn Params.push_back(PtrTy);
70338b42b4aSDan Gohman #endif
704e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
70538b42b4aSDan Gohman break;
70638b42b4aSDan Gohman case i16_i16_func_i16_i16:
70738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
708e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
709e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
71038b42b4aSDan Gohman #else
71118c56a07SHeejin Ahn Params.push_back(PtrTy);
71238b42b4aSDan Gohman #endif
713e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
714e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
71538b42b4aSDan Gohman break;
71638b42b4aSDan Gohman case i32_i32_func_i32_i32:
71738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
718e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
719e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
72038b42b4aSDan Gohman #else
72118c56a07SHeejin Ahn Params.push_back(PtrTy);
72238b42b4aSDan Gohman #endif
723e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
724e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
72538b42b4aSDan Gohman break;
72638b42b4aSDan Gohman case i64_i64_func_i64_i64:
72738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
728e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
729e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
73038b42b4aSDan Gohman #else
73118c56a07SHeejin Ahn Params.push_back(PtrTy);
73238b42b4aSDan Gohman #endif
733e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
734e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
73538b42b4aSDan Gohman break;
73638b42b4aSDan Gohman case i64_i64_func_i64_i64_i64_i64:
73738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
738e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
739e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
74038b42b4aSDan Gohman #else
74118c56a07SHeejin Ahn Params.push_back(PtrTy);
74238b42b4aSDan Gohman #endif
743e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
744e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
745e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
746e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
74738b42b4aSDan Gohman break;
748b17de645SDan Gohman case i64_i64_func_i64_i64_i64_i64_iPTR:
749b17de645SDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
750b17de645SDan Gohman Rets.push_back(wasm::ValType::I64);
751b17de645SDan Gohman Rets.push_back(wasm::ValType::I64);
752b17de645SDan Gohman #else
75318c56a07SHeejin Ahn Params.push_back(PtrTy);
754b17de645SDan Gohman #endif
755b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
756b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
757b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
758b17de645SDan Gohman Params.push_back(wasm::ValType::I64);
75918c56a07SHeejin Ahn Params.push_back(PtrTy);
760b17de645SDan Gohman break;
76138b42b4aSDan Gohman case i64_i64_i64_i64_func_i64_i64_i64_i64:
76238b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
763e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
764e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
765e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
766e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
76738b42b4aSDan Gohman #else
76818c56a07SHeejin Ahn Params.push_back(PtrTy);
76938b42b4aSDan Gohman #endif
770e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
771e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
772e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
773e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
77438b42b4aSDan Gohman break;
77538b42b4aSDan Gohman case i64_i64_func_i64_i64_i32:
77638b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
777e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
778e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
779e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
780e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64);
78138b42b4aSDan Gohman #else
78218c56a07SHeejin Ahn Params.push_back(PtrTy);
78338b42b4aSDan Gohman #endif
784e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
785e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
786e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
78738b42b4aSDan Gohman break;
78838b42b4aSDan Gohman case iPTR_func_iPTR_i32_iPTR:
78918c56a07SHeejin Ahn Rets.push_back(PtrTy);
79018c56a07SHeejin Ahn Params.push_back(PtrTy);
791e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
79218c56a07SHeejin Ahn Params.push_back(PtrTy);
79338b42b4aSDan Gohman break;
79438b42b4aSDan Gohman case iPTR_func_iPTR_iPTR_iPTR:
79518c56a07SHeejin Ahn Rets.push_back(PtrTy);
79618c56a07SHeejin Ahn Params.push_back(PtrTy);
79718c56a07SHeejin Ahn Params.push_back(PtrTy);
79818c56a07SHeejin Ahn Params.push_back(PtrTy);
79938b42b4aSDan Gohman break;
80038b42b4aSDan Gohman case f32_func_f32_f32_f32:
801e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32);
802e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
803e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
804e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
80538b42b4aSDan Gohman break;
80638b42b4aSDan Gohman case f64_func_f64_f64_f64:
807e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64);
808e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
809e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
810e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
81138b42b4aSDan Gohman break;
81238b42b4aSDan Gohman case func_i64_i64_iPTR_iPTR:
813e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
814e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
81518c56a07SHeejin Ahn Params.push_back(PtrTy);
81618c56a07SHeejin Ahn Params.push_back(PtrTy);
81738b42b4aSDan Gohman break;
81838b42b4aSDan Gohman case func_iPTR_f32:
81918c56a07SHeejin Ahn Params.push_back(PtrTy);
820e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32);
82138b42b4aSDan Gohman break;
82238b42b4aSDan Gohman case func_iPTR_f64:
82318c56a07SHeejin Ahn Params.push_back(PtrTy);
824e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64);
82538b42b4aSDan Gohman break;
82638b42b4aSDan Gohman case func_iPTR_i32:
82718c56a07SHeejin Ahn Params.push_back(PtrTy);
828e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32);
82938b42b4aSDan Gohman break;
83038b42b4aSDan Gohman case func_iPTR_i64:
83118c56a07SHeejin Ahn Params.push_back(PtrTy);
832e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
83338b42b4aSDan Gohman break;
83438b42b4aSDan Gohman case func_iPTR_i64_i64:
83518c56a07SHeejin Ahn Params.push_back(PtrTy);
836e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
837e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
83838b42b4aSDan Gohman break;
839caeb6cfbSSam Clegg case func_iPTR_i64_i64_i32:
840caeb6cfbSSam Clegg Params.push_back(PtrTy);
841caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I64);
842caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I64);
843caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I32);
844caeb6cfbSSam Clegg break;
84538b42b4aSDan Gohman case func_iPTR_i64_i64_i64_i64:
84618c56a07SHeejin Ahn Params.push_back(PtrTy);
847e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
848e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
849e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
850e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
85138b42b4aSDan Gohman break;
85238b42b4aSDan Gohman case func_iPTR_i64_i64_i64_i64_i64_i64:
85318c56a07SHeejin Ahn Params.push_back(PtrTy);
854e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
855e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
856e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
857e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
858e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
859e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
86038b42b4aSDan Gohman break;
86138b42b4aSDan Gohman case i32_func_i64_i64:
862e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
863e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
864e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
86538b42b4aSDan Gohman break;
86638b42b4aSDan Gohman case i32_func_i64_i64_i64_i64:
867e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32);
868e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
869e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
870e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
871e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64);
87238b42b4aSDan Gohman break;
873a49496fbSDan Gohman case iPTR_func_f32:
874a49496fbSDan Gohman Rets.push_back(PtrTy);
875a49496fbSDan Gohman Params.push_back(wasm::ValType::F32);
876a49496fbSDan Gohman break;
877a49496fbSDan Gohman case iPTR_func_f64:
878a49496fbSDan Gohman Rets.push_back(PtrTy);
879a49496fbSDan Gohman Params.push_back(wasm::ValType::F64);
880a49496fbSDan Gohman break;
881a49496fbSDan Gohman case iPTR_func_i64_i64:
882a49496fbSDan Gohman Rets.push_back(PtrTy);
883a49496fbSDan Gohman Params.push_back(wasm::ValType::I64);
884a49496fbSDan Gohman Params.push_back(wasm::ValType::I64);
885a49496fbSDan Gohman break;
88638b42b4aSDan Gohman case unsupported:
88738b42b4aSDan Gohman llvm_unreachable("unsupported runtime library signature");
88838b42b4aSDan Gohman }
88938b42b4aSDan Gohman }
89038b42b4aSDan Gohman
89153b3855bSDerek Schuff // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
89253b3855bSDerek Schuff // other than here, just roll its logic into this version.
getLibcallSignature(const WebAssemblySubtarget & Subtarget,StringRef Name,SmallVectorImpl<wasm::ValType> & Rets,SmallVectorImpl<wasm::ValType> & Params)89318c56a07SHeejin Ahn void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget,
8949647a6f7SWouter van Oortmerssen StringRef Name,
895e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Rets,
896e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) {
897*ede60037SNicolai Hähnle static StaticLibcallNameMap LibcallNameMap;
898*ede60037SNicolai Hähnle auto &Map = LibcallNameMap.Map;
89918c56a07SHeejin Ahn auto Val = Map.find(Name);
9008306cb57SDan Gohman #ifndef NDEBUG
9018306cb57SDan Gohman if (Val == Map.end()) {
9029647a6f7SWouter van Oortmerssen auto message = std::string("unexpected runtime library name: ") +
9039647a6f7SWouter van Oortmerssen std::string(Name);
9048d6e80f9SDan Gohman llvm_unreachable(message.c_str());
9058306cb57SDan Gohman }
9068306cb57SDan Gohman #endif
90718c56a07SHeejin Ahn return getLibcallSignature(Subtarget, Val->second, Rets, Params);
90838b42b4aSDan Gohman }
909