138b42b4aSDan Gohman // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*--
238b42b4aSDan Gohman //
338b42b4aSDan Gohman //                     The LLVM Compiler Infrastructure
438b42b4aSDan Gohman //
538b42b4aSDan Gohman // This file is distributed under the University of Illinois Open Source
638b42b4aSDan Gohman // License. See LICENSE.TXT for details.
738b42b4aSDan Gohman //
838b42b4aSDan Gohman //===----------------------------------------------------------------------===//
938b42b4aSDan Gohman ///
1038b42b4aSDan Gohman /// \file
1138b42b4aSDan Gohman /// \brief This file contains signature information for runtime libcalls.
1238b42b4aSDan Gohman ///
1338b42b4aSDan Gohman /// CodeGen uses external symbols, which it refers to by name. The WebAssembly
1438b42b4aSDan Gohman /// target needs type information for all functions. This file contains a big
1538b42b4aSDan Gohman /// table providing type signatures for all runtime library functions that LLVM
1638b42b4aSDan Gohman /// uses.
1738b42b4aSDan Gohman ///
1838b42b4aSDan Gohman /// This is currently a fairly heavy-handed solution.
1938b42b4aSDan Gohman ///
2038b42b4aSDan Gohman //===----------------------------------------------------------------------===//
2138b42b4aSDan Gohman 
2238b42b4aSDan Gohman #include "WebAssemblyRuntimeLibcallSignatures.h"
2338b42b4aSDan Gohman #include "WebAssemblySubtarget.h"
2438b42b4aSDan Gohman #include "llvm/CodeGen/RuntimeLibcalls.h"
2553b3855bSDerek Schuff #include "llvm/Support/ManagedStatic.h"
2638b42b4aSDan Gohman 
2738b42b4aSDan Gohman using namespace llvm;
2838b42b4aSDan Gohman 
2938b42b4aSDan Gohman namespace {
3038b42b4aSDan Gohman 
3138b42b4aSDan Gohman enum RuntimeLibcallSignature {
3238b42b4aSDan Gohman   func,
3338b42b4aSDan Gohman   f32_func_f32,
3438b42b4aSDan Gohman   f32_func_f64,
3538b42b4aSDan Gohman   f32_func_i32,
3638b42b4aSDan Gohman   f32_func_i64,
3738b42b4aSDan Gohman   f32_func_i16,
3838b42b4aSDan Gohman   f64_func_f32,
3938b42b4aSDan Gohman   f64_func_f64,
4038b42b4aSDan Gohman   f64_func_i32,
4138b42b4aSDan Gohman   f64_func_i64,
4238b42b4aSDan Gohman   i32_func_f32,
4338b42b4aSDan Gohman   i32_func_f64,
4438b42b4aSDan Gohman   i32_func_i32,
4538b42b4aSDan Gohman   i64_func_f32,
4638b42b4aSDan Gohman   i64_func_f64,
4738b42b4aSDan Gohman   i64_func_i64,
4838b42b4aSDan Gohman   f32_func_f32_f32,
4938b42b4aSDan Gohman   f32_func_f32_i32,
5038b42b4aSDan Gohman   f32_func_i64_i64,
5138b42b4aSDan Gohman   f64_func_f64_f64,
5238b42b4aSDan Gohman   f64_func_f64_i32,
5338b42b4aSDan Gohman   f64_func_i64_i64,
5438b42b4aSDan Gohman   i16_func_f32,
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,
6238b42b4aSDan Gohman   i64_func_i64_i64,
6338b42b4aSDan Gohman   i64_i64_func_f32,
6438b42b4aSDan Gohman   i64_i64_func_f64,
6538b42b4aSDan Gohman   i16_i16_func_i16_i16,
6638b42b4aSDan Gohman   i32_i32_func_i32_i32,
6738b42b4aSDan Gohman   i64_i64_func_i64_i64,
6838b42b4aSDan Gohman   i64_i64_func_i64_i64_i64_i64,
6938b42b4aSDan Gohman   i64_i64_i64_i64_func_i64_i64_i64_i64,
7038b42b4aSDan Gohman   i64_i64_func_i64_i64_i32,
7138b42b4aSDan Gohman   iPTR_func_iPTR_i32_iPTR,
7238b42b4aSDan Gohman   iPTR_func_iPTR_iPTR_iPTR,
7338b42b4aSDan Gohman   f32_func_f32_f32_f32,
7438b42b4aSDan Gohman   f64_func_f64_f64_f64,
7538b42b4aSDan Gohman   func_i64_i64_iPTR_iPTR,
7638b42b4aSDan Gohman   func_iPTR_f32,
7738b42b4aSDan Gohman   func_iPTR_f64,
7838b42b4aSDan Gohman   func_iPTR_i32,
7938b42b4aSDan Gohman   func_iPTR_i64,
8038b42b4aSDan Gohman   func_iPTR_i64_i64,
8138b42b4aSDan Gohman   func_iPTR_i64_i64_i64_i64,
8238b42b4aSDan Gohman   func_iPTR_i64_i64_i64_i64_i64_i64,
8338b42b4aSDan Gohman   i32_func_i64_i64,
8438b42b4aSDan Gohman   i32_func_i64_i64_i64_i64,
8538b42b4aSDan Gohman   unsupported
8638b42b4aSDan Gohman };
8738b42b4aSDan Gohman 
8838b42b4aSDan Gohman 
8953b3855bSDerek Schuff struct RuntimeLibcallSignatureTable {
9053b3855bSDerek Schuff   std::vector<RuntimeLibcallSignature> Table;
9153b3855bSDerek Schuff 
9253b3855bSDerek Schuff   // Any newly-added libcalls will be unsupported by default.
9353b3855bSDerek Schuff   RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
9438b42b4aSDan Gohman     // Integer
9553b3855bSDerek Schuff     Table[RTLIB::SHL_I16] = i16_func_i16_i16;
9653b3855bSDerek Schuff     Table[RTLIB::SHL_I32] = i32_func_i32_i32;
9753b3855bSDerek Schuff     Table[RTLIB::SHL_I64] = i64_func_i64_i64;
9853b3855bSDerek Schuff     Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
9953b3855bSDerek Schuff     Table[RTLIB::SRL_I16] = i16_func_i16_i16;
10053b3855bSDerek Schuff     Table[RTLIB::SRL_I32] = i32_func_i32_i32;
10153b3855bSDerek Schuff     Table[RTLIB::SRL_I64] = i64_func_i64_i64;
10253b3855bSDerek Schuff     Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
10353b3855bSDerek Schuff     Table[RTLIB::SRA_I16] = i16_func_i16_i16;
10453b3855bSDerek Schuff     Table[RTLIB::SRA_I32] = i32_func_i32_i32;
10553b3855bSDerek Schuff     Table[RTLIB::SRA_I64] = i64_func_i64_i64;
10653b3855bSDerek Schuff     Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
10753b3855bSDerek Schuff     Table[RTLIB::MUL_I8] = i8_func_i8_i8;
10853b3855bSDerek Schuff     Table[RTLIB::MUL_I16] = i16_func_i16_i16;
10953b3855bSDerek Schuff     Table[RTLIB::MUL_I32] = i32_func_i32_i32;
11053b3855bSDerek Schuff     Table[RTLIB::MUL_I64] = i64_func_i64_i64;
11153b3855bSDerek Schuff     Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
11253b3855bSDerek Schuff     Table[RTLIB::MULO_I32] = i32_func_i32_i32;
11353b3855bSDerek Schuff     Table[RTLIB::MULO_I64] = i64_func_i64_i64;
11453b3855bSDerek Schuff     Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64;
11553b3855bSDerek Schuff     Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
11653b3855bSDerek Schuff     Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
11753b3855bSDerek Schuff     Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
11853b3855bSDerek Schuff     Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
11953b3855bSDerek Schuff     Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
12053b3855bSDerek Schuff     Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
12153b3855bSDerek Schuff     Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
12253b3855bSDerek Schuff     Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
12353b3855bSDerek Schuff     Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
12453b3855bSDerek Schuff     Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
12553b3855bSDerek Schuff     Table[RTLIB::SREM_I8] = i8_func_i8_i8;
12653b3855bSDerek Schuff     Table[RTLIB::SREM_I16] = i16_func_i16_i16;
12753b3855bSDerek Schuff     Table[RTLIB::SREM_I32] = i32_func_i32_i32;
12853b3855bSDerek Schuff     Table[RTLIB::SREM_I64] = i64_func_i64_i64;
12953b3855bSDerek Schuff     Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
13053b3855bSDerek Schuff     Table[RTLIB::UREM_I8] = i8_func_i8_i8;
13153b3855bSDerek Schuff     Table[RTLIB::UREM_I16] = i16_func_i16_i16;
13253b3855bSDerek Schuff     Table[RTLIB::UREM_I32] = i32_func_i32_i32;
13353b3855bSDerek Schuff     Table[RTLIB::UREM_I64] = i64_func_i64_i64;
13453b3855bSDerek Schuff     Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
13553b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
13653b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
13753b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
13853b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
13953b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
14053b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
14153b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
14253b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
14353b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
14453b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
14553b3855bSDerek Schuff     Table[RTLIB::NEG_I32] = i32_func_i32;
14653b3855bSDerek Schuff     Table[RTLIB::NEG_I64] = i64_func_i64;
14738b42b4aSDan Gohman 
14853b3855bSDerek Schuff     // Floating-point.
14953b3855bSDerek Schuff     // All F80 and PPCF128 routines are unsupported.
15053b3855bSDerek Schuff     Table[RTLIB::ADD_F32] = f32_func_f32_f32;
15153b3855bSDerek Schuff     Table[RTLIB::ADD_F64] = f64_func_f64_f64;
15253b3855bSDerek Schuff     Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
15353b3855bSDerek Schuff     Table[RTLIB::SUB_F32] = f32_func_f32_f32;
15453b3855bSDerek Schuff     Table[RTLIB::SUB_F64] = f64_func_f64_f64;
15553b3855bSDerek Schuff     Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
15653b3855bSDerek Schuff     Table[RTLIB::MUL_F32] = f32_func_f32_f32;
15753b3855bSDerek Schuff     Table[RTLIB::MUL_F64] = f64_func_f64_f64;
15853b3855bSDerek Schuff     Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
15953b3855bSDerek Schuff     Table[RTLIB::DIV_F32] = f32_func_f32_f32;
16053b3855bSDerek Schuff     Table[RTLIB::DIV_F64] = f64_func_f64_f64;
16153b3855bSDerek Schuff     Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
16253b3855bSDerek Schuff     Table[RTLIB::REM_F32] = f32_func_f32_f32;
16353b3855bSDerek Schuff     Table[RTLIB::REM_F64] = f64_func_f64_f64;
16453b3855bSDerek Schuff     Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
16553b3855bSDerek Schuff     Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
16653b3855bSDerek Schuff     Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
16753b3855bSDerek Schuff     Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
16853b3855bSDerek Schuff     Table[RTLIB::POWI_F32] = f32_func_f32_i32;
16953b3855bSDerek Schuff     Table[RTLIB::POWI_F64] = f64_func_f64_i32;
17053b3855bSDerek Schuff     Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64;
17153b3855bSDerek Schuff     Table[RTLIB::SQRT_F32] = f32_func_f32;
17253b3855bSDerek Schuff     Table[RTLIB::SQRT_F64] = f64_func_f64;
17353b3855bSDerek Schuff     Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
17453b3855bSDerek Schuff     Table[RTLIB::LOG_F32] = f32_func_f32;
17553b3855bSDerek Schuff     Table[RTLIB::LOG_F64] = f64_func_f64;
17653b3855bSDerek Schuff     Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
17753b3855bSDerek Schuff     Table[RTLIB::LOG2_F32] = f32_func_f32;
17853b3855bSDerek Schuff     Table[RTLIB::LOG2_F64] = f64_func_f64;
17953b3855bSDerek Schuff     Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
18053b3855bSDerek Schuff     Table[RTLIB::LOG10_F32] = f32_func_f32;
18153b3855bSDerek Schuff     Table[RTLIB::LOG10_F64] = f64_func_f64;
18253b3855bSDerek Schuff     Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
18353b3855bSDerek Schuff     Table[RTLIB::EXP_F32] = f32_func_f32;
18453b3855bSDerek Schuff     Table[RTLIB::EXP_F64] = f64_func_f64;
18553b3855bSDerek Schuff     Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
18653b3855bSDerek Schuff     Table[RTLIB::EXP2_F32] = f32_func_f32;
18753b3855bSDerek Schuff     Table[RTLIB::EXP2_F64] = f64_func_f64;
18853b3855bSDerek Schuff     Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
18953b3855bSDerek Schuff     Table[RTLIB::SIN_F32] = f32_func_f32;
19053b3855bSDerek Schuff     Table[RTLIB::SIN_F64] = f64_func_f64;
19153b3855bSDerek Schuff     Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
19253b3855bSDerek Schuff     Table[RTLIB::COS_F32] = f32_func_f32;
19353b3855bSDerek Schuff     Table[RTLIB::COS_F64] = f64_func_f64;
19453b3855bSDerek Schuff     Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
19553b3855bSDerek Schuff     Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
19653b3855bSDerek Schuff     Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
19753b3855bSDerek Schuff     Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
19853b3855bSDerek Schuff     Table[RTLIB::POW_F32] = f32_func_f32_f32;
19953b3855bSDerek Schuff     Table[RTLIB::POW_F64] = f64_func_f64_f64;
20053b3855bSDerek Schuff     Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
20153b3855bSDerek Schuff     Table[RTLIB::CEIL_F32] = f32_func_f32;
20253b3855bSDerek Schuff     Table[RTLIB::CEIL_F64] = f64_func_f64;
20353b3855bSDerek Schuff     Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
20453b3855bSDerek Schuff     Table[RTLIB::TRUNC_F32] = f32_func_f32;
20553b3855bSDerek Schuff     Table[RTLIB::TRUNC_F64] = f64_func_f64;
20653b3855bSDerek Schuff     Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
20753b3855bSDerek Schuff     Table[RTLIB::RINT_F32] = f32_func_f32;
20853b3855bSDerek Schuff     Table[RTLIB::RINT_F64] = f64_func_f64;
20953b3855bSDerek Schuff     Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
21053b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
21153b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
21253b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
21353b3855bSDerek Schuff     Table[RTLIB::ROUND_F32] = f32_func_f32;
21453b3855bSDerek Schuff     Table[RTLIB::ROUND_F64] = f64_func_f64;
21553b3855bSDerek Schuff     Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
21653b3855bSDerek Schuff     Table[RTLIB::FLOOR_F32] = f32_func_f32;
21753b3855bSDerek Schuff     Table[RTLIB::FLOOR_F64] = f64_func_f64;
21853b3855bSDerek Schuff     Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
21953b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
22053b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
22153b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
22253b3855bSDerek Schuff     Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
22353b3855bSDerek Schuff     Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
22453b3855bSDerek Schuff     Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
22553b3855bSDerek Schuff     Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
22653b3855bSDerek Schuff     Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
22753b3855bSDerek Schuff     Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
22838b42b4aSDan Gohman 
22953b3855bSDerek Schuff     // Conversion
23053b3855bSDerek Schuff     // All F80 and PPCF128 routines are unspported.
23153b3855bSDerek Schuff     Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
23253b3855bSDerek Schuff     Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
23353b3855bSDerek Schuff     Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
23453b3855bSDerek Schuff     Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
23553b3855bSDerek Schuff     Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
23653b3855bSDerek Schuff     Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
23753b3855bSDerek Schuff     Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
23853b3855bSDerek Schuff     Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
23953b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
24053b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
24153b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
24253b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
24353b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
24453b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
24553b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
24653b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
24753b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
24853b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
24953b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
25053b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
25153b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
25253b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
25353b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
25453b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
25553b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
25653b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
25753b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
25853b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
25953b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
26053b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
26153b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
26253b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
26353b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
26453b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
26553b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
26653b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
26753b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
26853b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
26953b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
27053b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
27153b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
27253b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
27353b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
27453b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
27538b42b4aSDan Gohman 
27653b3855bSDerek Schuff     // Comparison
27753b3855bSDerek Schuff     // ALl F80 and PPCF128 routines are unsupported.
27853b3855bSDerek Schuff     Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
27953b3855bSDerek Schuff     Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
28053b3855bSDerek Schuff     Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
28153b3855bSDerek Schuff     Table[RTLIB::UNE_F32] = i32_func_f32_f32;
28253b3855bSDerek Schuff     Table[RTLIB::UNE_F64] = i32_func_f64_f64;
28353b3855bSDerek Schuff     Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
28453b3855bSDerek Schuff     Table[RTLIB::OGE_F32] = i32_func_f32_f32;
28553b3855bSDerek Schuff     Table[RTLIB::OGE_F64] = i32_func_f64_f64;
28653b3855bSDerek Schuff     Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
28753b3855bSDerek Schuff     Table[RTLIB::OLT_F32] = i32_func_f32_f32;
28853b3855bSDerek Schuff     Table[RTLIB::OLT_F64] = i32_func_f64_f64;
28953b3855bSDerek Schuff     Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
29053b3855bSDerek Schuff     Table[RTLIB::OLE_F32] = i32_func_f32_f32;
29153b3855bSDerek Schuff     Table[RTLIB::OLE_F64] = i32_func_f64_f64;
29253b3855bSDerek Schuff     Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
29353b3855bSDerek Schuff     Table[RTLIB::OGT_F32] = i32_func_f32_f32;
29453b3855bSDerek Schuff     Table[RTLIB::OGT_F64] = i32_func_f64_f64;
29553b3855bSDerek Schuff     Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
29653b3855bSDerek Schuff     Table[RTLIB::UO_F32] = i32_func_f32_f32;
29753b3855bSDerek Schuff     Table[RTLIB::UO_F64] = i32_func_f64_f64;
29853b3855bSDerek Schuff     Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
299bfb02aecSDerek Schuff     // O_FXX has the weird property that it uses the same libcall name as UO_FXX
300bfb02aecSDerek Schuff     // This breaks our name-based lookup. Fortunately only the UO family of
301bfb02aecSDerek Schuff     // libcalls appears to be actually used.
302bfb02aecSDerek Schuff     Table[RTLIB::O_F32] = unsupported;
303bfb02aecSDerek Schuff     Table[RTLIB::O_F64] = unsupported;
304bfb02aecSDerek Schuff     Table[RTLIB::O_F128] = unsupported;
30538b42b4aSDan Gohman 
30653b3855bSDerek Schuff     // Memory
30753b3855bSDerek Schuff     Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
30853b3855bSDerek Schuff     Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
30953b3855bSDerek Schuff     Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
31038b42b4aSDan Gohman 
31153b3855bSDerek Schuff     // Element-wise Atomic memory
31253b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
31353b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
31453b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
31553b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
31653b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
31753b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
31853b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
31953b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
32053b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
32153b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
32253b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
323c855c728SDaniel Neilson 
32453b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
32553b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
32653b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
32753b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
32853b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
32938b42b4aSDan Gohman 
33038b42b4aSDan Gohman     // Atomic '__sync_*' libcalls.
33153b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
33253b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
33353b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
33453b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
33553b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
33653b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
33753b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
33853b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
33953b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
34053b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
34153b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
34253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
34353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
34453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
34553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
34653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
34753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
34853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
34953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
35053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
35153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
35253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
35353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
35453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
35553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
35653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
35753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
35853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
35953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
36053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
36153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
36253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
36353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
36453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
36553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
36653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
36753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
36853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
36953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
37053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
37153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
37253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
37353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
37453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
37553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
37653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
37753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
37853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
37953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
38053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
38153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
38253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
38353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
38453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
38553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
38653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
38753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
38853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
38953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
39053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
39153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
39238b42b4aSDan Gohman 
39338b42b4aSDan Gohman     // Atomic '__atomic_*' libcalls.
39453b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
39553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD] = unsupported;
39653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
39753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
39853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
39953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
40053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
40138b42b4aSDan Gohman 
40253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE] = unsupported;
40353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_1] = unsupported;
40453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_2] = unsupported;
40553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_4] = unsupported;
40653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_8] = unsupported;
40753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_16] = unsupported;
40838b42b4aSDan Gohman 
40953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
41053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
41153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
41253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
41353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
41453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
41538b42b4aSDan Gohman 
41653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
41753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
41853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
41953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
42053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
42153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
42238b42b4aSDan Gohman 
42353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
42453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
42553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
42653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
42753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
42838b42b4aSDan Gohman 
42953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
43053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
43153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
43253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
43353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
43438b42b4aSDan Gohman 
43553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
43653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
43753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
43853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
43953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
44038b42b4aSDan Gohman 
44153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
44253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
44353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
44453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
44553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
44638b42b4aSDan Gohman 
44753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
44853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
44953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
45053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
45153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
45238b42b4aSDan Gohman 
45353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
45453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
45553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
45653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
45753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
45853b3855bSDerek Schuff   }
45938b42b4aSDan Gohman };
46038b42b4aSDan Gohman 
461bfb02aecSDerek Schuff ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
46238b42b4aSDan Gohman 
46353b3855bSDerek Schuff // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
46453b3855bSDerek Schuff // constructor for use with ManagedStatic
46553b3855bSDerek Schuff struct StaticLibcallNameMap {
46653b3855bSDerek Schuff   StringMap<RTLIB::Libcall> Map;
46753b3855bSDerek Schuff   StaticLibcallNameMap() {
468*ae87f86eSBenjamin Kramer     static constexpr std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
469*ae87f86eSBenjamin Kramer #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
47053b3855bSDerek Schuff #include "llvm/CodeGen/RuntimeLibcalls.def"
47153b3855bSDerek Schuff #undef HANDLE_LIBCALL
472*ae87f86eSBenjamin Kramer     };
473*ae87f86eSBenjamin Kramer     for (const auto &NameLibcall : NameLibcalls) {
474*ae87f86eSBenjamin Kramer       if (NameLibcall.first != nullptr &&
475*ae87f86eSBenjamin Kramer           RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
476*ae87f86eSBenjamin Kramer         assert(Map.find(NameLibcall.first) == Map.end() &&
477*ae87f86eSBenjamin Kramer                "duplicate libcall names in name map");
478*ae87f86eSBenjamin Kramer         Map[NameLibcall.first] = NameLibcall.second;
479*ae87f86eSBenjamin Kramer       }
480*ae87f86eSBenjamin Kramer     }
48153b3855bSDerek Schuff   }
48238b42b4aSDan Gohman };
48338b42b4aSDan Gohman 
48453b3855bSDerek Schuff } // end anonymous namespace
48553b3855bSDerek Schuff 
48653b3855bSDerek Schuff 
48753b3855bSDerek Schuff 
48838b42b4aSDan Gohman void llvm::GetSignature(const WebAssemblySubtarget &Subtarget,
489e2688c43SDerek Schuff                         RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
490e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Params) {
49138b42b4aSDan Gohman   assert(Rets.empty());
49238b42b4aSDan Gohman   assert(Params.empty());
49338b42b4aSDan Gohman 
49438b42b4aSDan Gohman   WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ?
49538b42b4aSDan Gohman                                WebAssembly::ExprType::I64 :
49638b42b4aSDan Gohman                                WebAssembly::ExprType::I32;
49738b42b4aSDan Gohman 
49853b3855bSDerek Schuff   auto& Table = RuntimeLibcallSignatures->Table;
49953b3855bSDerek Schuff   switch (Table[LC]) {
50038b42b4aSDan Gohman   case func:
50138b42b4aSDan Gohman     break;
50238b42b4aSDan Gohman   case f32_func_f32:
503e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
504e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
50538b42b4aSDan Gohman     break;
50638b42b4aSDan Gohman   case f32_func_f64:
507e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
508e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
50938b42b4aSDan Gohman     break;
51038b42b4aSDan Gohman   case f32_func_i32:
511e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
512e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
51338b42b4aSDan Gohman     break;
51438b42b4aSDan Gohman   case f32_func_i64:
515e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
516e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
51738b42b4aSDan Gohman     break;
51838b42b4aSDan Gohman   case f32_func_i16:
519e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
520e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
52138b42b4aSDan Gohman     break;
52238b42b4aSDan Gohman   case f64_func_f32:
523e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
524e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
52538b42b4aSDan Gohman     break;
52638b42b4aSDan Gohman   case f64_func_f64:
527e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
528e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
52938b42b4aSDan Gohman     break;
53038b42b4aSDan Gohman   case f64_func_i32:
531e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
532e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
53338b42b4aSDan Gohman     break;
53438b42b4aSDan Gohman   case f64_func_i64:
535e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
536e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
53738b42b4aSDan Gohman     break;
53838b42b4aSDan Gohman   case i32_func_f32:
539e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
540e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
54138b42b4aSDan Gohman     break;
54238b42b4aSDan Gohman   case i32_func_f64:
543e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
544e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
54538b42b4aSDan Gohman     break;
54638b42b4aSDan Gohman   case i32_func_i32:
547e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
548e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
54938b42b4aSDan Gohman     break;
55038b42b4aSDan Gohman   case i64_func_f32:
551e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
552e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
55338b42b4aSDan Gohman     break;
55438b42b4aSDan Gohman   case i64_func_f64:
555e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
556e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
55738b42b4aSDan Gohman     break;
55838b42b4aSDan Gohman   case i64_func_i64:
559e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
560e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
56138b42b4aSDan Gohman     break;
56238b42b4aSDan Gohman   case f32_func_f32_f32:
563e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
564e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
565e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
56638b42b4aSDan Gohman     break;
56738b42b4aSDan Gohman   case f32_func_f32_i32:
568e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
569e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
570e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
57138b42b4aSDan Gohman     break;
57238b42b4aSDan Gohman   case f32_func_i64_i64:
573e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
574e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
575e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
57638b42b4aSDan Gohman     break;
57738b42b4aSDan Gohman   case f64_func_f64_f64:
578e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
579e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
580e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
58138b42b4aSDan Gohman     break;
58238b42b4aSDan Gohman   case f64_func_f64_i32:
583e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
584e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
585e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
58638b42b4aSDan Gohman     break;
58738b42b4aSDan Gohman   case f64_func_i64_i64:
588e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
589e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
590e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
59138b42b4aSDan Gohman     break;
59238b42b4aSDan Gohman   case i16_func_f32:
593e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
594e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
59538b42b4aSDan Gohman     break;
59638b42b4aSDan Gohman   case i8_func_i8_i8:
597e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
598e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
599e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
60038b42b4aSDan Gohman     break;
60138b42b4aSDan Gohman   case func_f32_iPTR_iPTR:
602e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
603e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
604e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
60538b42b4aSDan Gohman     break;
60638b42b4aSDan Gohman   case func_f64_iPTR_iPTR:
607e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
608e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
609e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
61038b42b4aSDan Gohman     break;
61138b42b4aSDan Gohman   case i16_func_i16_i16:
612e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
613e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
614e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
61538b42b4aSDan Gohman     break;
61638b42b4aSDan Gohman   case i32_func_f32_f32:
617e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
618e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
619e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
62038b42b4aSDan Gohman     break;
62138b42b4aSDan Gohman   case i32_func_f64_f64:
622e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
623e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
624e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
62538b42b4aSDan Gohman     break;
62638b42b4aSDan Gohman   case i32_func_i32_i32:
627e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
628e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
629e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
63038b42b4aSDan Gohman     break;
63138b42b4aSDan Gohman   case i64_func_i64_i64:
632e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
633e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
634e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
63538b42b4aSDan Gohman     break;
63638b42b4aSDan Gohman   case i64_i64_func_f32:
63738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
638e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
639e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
64038b42b4aSDan Gohman #else
641e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
64238b42b4aSDan Gohman #endif
643e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
64438b42b4aSDan Gohman     break;
64538b42b4aSDan Gohman   case i64_i64_func_f64:
64638b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
647e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
648e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
64938b42b4aSDan Gohman #else
650e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
65138b42b4aSDan Gohman #endif
652e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
65338b42b4aSDan Gohman     break;
65438b42b4aSDan Gohman   case i16_i16_func_i16_i16:
65538b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
656e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
657e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
65838b42b4aSDan Gohman #else
659e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
66038b42b4aSDan Gohman #endif
661e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
662e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
66338b42b4aSDan Gohman     break;
66438b42b4aSDan Gohman   case i32_i32_func_i32_i32:
66538b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
666e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
667e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
66838b42b4aSDan Gohman #else
669e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
67038b42b4aSDan Gohman #endif
671e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
672e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
67338b42b4aSDan Gohman     break;
67438b42b4aSDan Gohman   case i64_i64_func_i64_i64:
67538b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
676e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
677e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
67838b42b4aSDan Gohman #else
679e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
68038b42b4aSDan Gohman #endif
681e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
682e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
68338b42b4aSDan Gohman     break;
68438b42b4aSDan Gohman   case i64_i64_func_i64_i64_i64_i64:
68538b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
686e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
687e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
68838b42b4aSDan Gohman #else
689e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
69038b42b4aSDan Gohman #endif
691e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
692e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
693e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
694e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
69538b42b4aSDan Gohman     break;
69638b42b4aSDan Gohman   case i64_i64_i64_i64_func_i64_i64_i64_i64:
69738b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
698e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
699e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
700e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
701e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
70238b42b4aSDan Gohman #else
703e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
70438b42b4aSDan Gohman #endif
705e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
706e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
707e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
708e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
70938b42b4aSDan Gohman     break;
71038b42b4aSDan Gohman   case i64_i64_func_i64_i64_i32:
71138b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
712e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
713e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
714e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
715e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
71638b42b4aSDan Gohman #else
717e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
71838b42b4aSDan Gohman #endif
719e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
720e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
721e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
72238b42b4aSDan Gohman     break;
72338b42b4aSDan Gohman   case iPTR_func_iPTR_i32_iPTR:
724e2688c43SDerek Schuff     Rets.push_back(wasm::ValType(iPTR));
725e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
726e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
727e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
72838b42b4aSDan Gohman     break;
72938b42b4aSDan Gohman   case iPTR_func_iPTR_iPTR_iPTR:
730e2688c43SDerek Schuff     Rets.push_back(wasm::ValType(iPTR));
731e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
732e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
733e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
73438b42b4aSDan Gohman     break;
73538b42b4aSDan Gohman   case f32_func_f32_f32_f32:
736e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
737e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
738e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
739e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
74038b42b4aSDan Gohman     break;
74138b42b4aSDan Gohman   case f64_func_f64_f64_f64:
742e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
743e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
744e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
745e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
74638b42b4aSDan Gohman     break;
74738b42b4aSDan Gohman   case func_i64_i64_iPTR_iPTR:
748e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
749e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
750e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
751e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
75238b42b4aSDan Gohman     break;
75338b42b4aSDan Gohman   case func_iPTR_f32:
754e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
755e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
75638b42b4aSDan Gohman     break;
75738b42b4aSDan Gohman   case func_iPTR_f64:
758e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
759e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
76038b42b4aSDan Gohman     break;
76138b42b4aSDan Gohman   case func_iPTR_i32:
762e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
763e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
76438b42b4aSDan Gohman     break;
76538b42b4aSDan Gohman   case func_iPTR_i64:
766e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
767e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
76838b42b4aSDan Gohman     break;
76938b42b4aSDan Gohman   case func_iPTR_i64_i64:
770e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
771e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
772e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
77338b42b4aSDan Gohman     break;
77438b42b4aSDan Gohman   case func_iPTR_i64_i64_i64_i64:
775e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
776e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
777e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
778e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
779e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
78038b42b4aSDan Gohman     break;
78138b42b4aSDan Gohman   case func_iPTR_i64_i64_i64_i64_i64_i64:
782e2688c43SDerek Schuff     Params.push_back(wasm::ValType(iPTR));
783e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
784e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
785e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
786e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
787e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
788e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
78938b42b4aSDan Gohman     break;
79038b42b4aSDan Gohman   case i32_func_i64_i64:
791e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
792e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
793e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
79438b42b4aSDan Gohman     break;
79538b42b4aSDan Gohman   case i32_func_i64_i64_i64_i64:
796e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
797e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
798e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
799e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
800e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
80138b42b4aSDan Gohman     break;
80238b42b4aSDan Gohman   case unsupported:
80338b42b4aSDan Gohman     llvm_unreachable("unsupported runtime library signature");
80438b42b4aSDan Gohman   }
80538b42b4aSDan Gohman }
80638b42b4aSDan Gohman 
80753b3855bSDerek Schuff static ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
80853b3855bSDerek Schuff // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
80953b3855bSDerek Schuff // other than here, just roll its logic into this version.
810e2688c43SDerek Schuff void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
811e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Rets,
812e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Params) {
81353b3855bSDerek Schuff   auto& Map = LibcallNameMap->Map;
81453b3855bSDerek Schuff   auto val = Map.find(Name);
81553b3855bSDerek Schuff   assert(val != Map.end() && "unexpected runtime library name");
81653b3855bSDerek Schuff   return GetSignature(Subtarget, val->second, Rets, Params);
81738b42b4aSDan Gohman }
818