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
115f8f34e4SAdrian Prantl /// 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,
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,
8438b42b4aSDan Gohman   func_iPTR_i64_i64_i64_i64,
8538b42b4aSDan Gohman   func_iPTR_i64_i64_i64_i64_i64_i64,
8638b42b4aSDan Gohman   i32_func_i64_i64,
8738b42b4aSDan Gohman   i32_func_i64_i64_i64_i64,
8838b42b4aSDan Gohman   unsupported
8938b42b4aSDan Gohman };
9038b42b4aSDan Gohman 
9138b42b4aSDan Gohman 
9253b3855bSDerek Schuff struct RuntimeLibcallSignatureTable {
9353b3855bSDerek Schuff   std::vector<RuntimeLibcallSignature> Table;
9453b3855bSDerek Schuff 
9553b3855bSDerek Schuff   // Any newly-added libcalls will be unsupported by default.
9653b3855bSDerek Schuff   RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) {
9738b42b4aSDan Gohman     // Integer
9853b3855bSDerek Schuff     Table[RTLIB::SHL_I16] = i16_func_i16_i16;
9953b3855bSDerek Schuff     Table[RTLIB::SHL_I32] = i32_func_i32_i32;
10053b3855bSDerek Schuff     Table[RTLIB::SHL_I64] = i64_func_i64_i64;
10153b3855bSDerek Schuff     Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32;
10253b3855bSDerek Schuff     Table[RTLIB::SRL_I16] = i16_func_i16_i16;
10353b3855bSDerek Schuff     Table[RTLIB::SRL_I32] = i32_func_i32_i32;
10453b3855bSDerek Schuff     Table[RTLIB::SRL_I64] = i64_func_i64_i64;
10553b3855bSDerek Schuff     Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32;
10653b3855bSDerek Schuff     Table[RTLIB::SRA_I16] = i16_func_i16_i16;
10753b3855bSDerek Schuff     Table[RTLIB::SRA_I32] = i32_func_i32_i32;
10853b3855bSDerek Schuff     Table[RTLIB::SRA_I64] = i64_func_i64_i64;
10953b3855bSDerek Schuff     Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32;
11053b3855bSDerek Schuff     Table[RTLIB::MUL_I8] = i8_func_i8_i8;
11153b3855bSDerek Schuff     Table[RTLIB::MUL_I16] = i16_func_i16_i16;
11253b3855bSDerek Schuff     Table[RTLIB::MUL_I32] = i32_func_i32_i32;
11353b3855bSDerek Schuff     Table[RTLIB::MUL_I64] = i64_func_i64_i64;
11453b3855bSDerek Schuff     Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64;
115b17de645SDan Gohman     Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR;
116b17de645SDan Gohman     Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR;
117b17de645SDan Gohman     Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR;
11853b3855bSDerek Schuff     Table[RTLIB::SDIV_I8] = i8_func_i8_i8;
11953b3855bSDerek Schuff     Table[RTLIB::SDIV_I16] = i16_func_i16_i16;
12053b3855bSDerek Schuff     Table[RTLIB::SDIV_I32] = i32_func_i32_i32;
12153b3855bSDerek Schuff     Table[RTLIB::SDIV_I64] = i64_func_i64_i64;
12253b3855bSDerek Schuff     Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64;
12353b3855bSDerek Schuff     Table[RTLIB::UDIV_I8] = i8_func_i8_i8;
12453b3855bSDerek Schuff     Table[RTLIB::UDIV_I16] = i16_func_i16_i16;
12553b3855bSDerek Schuff     Table[RTLIB::UDIV_I32] = i32_func_i32_i32;
12653b3855bSDerek Schuff     Table[RTLIB::UDIV_I64] = i64_func_i64_i64;
12753b3855bSDerek Schuff     Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64;
12853b3855bSDerek Schuff     Table[RTLIB::SREM_I8] = i8_func_i8_i8;
12953b3855bSDerek Schuff     Table[RTLIB::SREM_I16] = i16_func_i16_i16;
13053b3855bSDerek Schuff     Table[RTLIB::SREM_I32] = i32_func_i32_i32;
13153b3855bSDerek Schuff     Table[RTLIB::SREM_I64] = i64_func_i64_i64;
13253b3855bSDerek Schuff     Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64;
13353b3855bSDerek Schuff     Table[RTLIB::UREM_I8] = i8_func_i8_i8;
13453b3855bSDerek Schuff     Table[RTLIB::UREM_I16] = i16_func_i16_i16;
13553b3855bSDerek Schuff     Table[RTLIB::UREM_I32] = i32_func_i32_i32;
13653b3855bSDerek Schuff     Table[RTLIB::UREM_I64] = i64_func_i64_i64;
13753b3855bSDerek Schuff     Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64;
13853b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8;
13953b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16;
14053b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32;
14153b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64;
14253b3855bSDerek Schuff     Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
14353b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8;
14453b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16;
14553b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32;
14653b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64;
14753b3855bSDerek Schuff     Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64;
14853b3855bSDerek Schuff     Table[RTLIB::NEG_I32] = i32_func_i32;
14953b3855bSDerek Schuff     Table[RTLIB::NEG_I64] = i64_func_i64;
15038b42b4aSDan Gohman 
15153b3855bSDerek Schuff     // Floating-point.
15253b3855bSDerek Schuff     // All F80 and PPCF128 routines are unsupported.
15353b3855bSDerek Schuff     Table[RTLIB::ADD_F32] = f32_func_f32_f32;
15453b3855bSDerek Schuff     Table[RTLIB::ADD_F64] = f64_func_f64_f64;
15553b3855bSDerek Schuff     Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64;
15653b3855bSDerek Schuff     Table[RTLIB::SUB_F32] = f32_func_f32_f32;
15753b3855bSDerek Schuff     Table[RTLIB::SUB_F64] = f64_func_f64_f64;
15853b3855bSDerek Schuff     Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64;
15953b3855bSDerek Schuff     Table[RTLIB::MUL_F32] = f32_func_f32_f32;
16053b3855bSDerek Schuff     Table[RTLIB::MUL_F64] = f64_func_f64_f64;
16153b3855bSDerek Schuff     Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64;
16253b3855bSDerek Schuff     Table[RTLIB::DIV_F32] = f32_func_f32_f32;
16353b3855bSDerek Schuff     Table[RTLIB::DIV_F64] = f64_func_f64_f64;
16453b3855bSDerek Schuff     Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64;
16553b3855bSDerek Schuff     Table[RTLIB::REM_F32] = f32_func_f32_f32;
16653b3855bSDerek Schuff     Table[RTLIB::REM_F64] = f64_func_f64_f64;
16753b3855bSDerek Schuff     Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64;
16853b3855bSDerek Schuff     Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32;
16953b3855bSDerek Schuff     Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64;
17053b3855bSDerek Schuff     Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64;
17153b3855bSDerek Schuff     Table[RTLIB::POWI_F32] = f32_func_f32_i32;
17253b3855bSDerek Schuff     Table[RTLIB::POWI_F64] = f64_func_f64_i32;
17353b3855bSDerek Schuff     Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64;
17453b3855bSDerek Schuff     Table[RTLIB::SQRT_F32] = f32_func_f32;
17553b3855bSDerek Schuff     Table[RTLIB::SQRT_F64] = f64_func_f64;
17653b3855bSDerek Schuff     Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64;
17753b3855bSDerek Schuff     Table[RTLIB::LOG_F32] = f32_func_f32;
17853b3855bSDerek Schuff     Table[RTLIB::LOG_F64] = f64_func_f64;
17953b3855bSDerek Schuff     Table[RTLIB::LOG_F128] = func_iPTR_i64_i64;
18053b3855bSDerek Schuff     Table[RTLIB::LOG2_F32] = f32_func_f32;
18153b3855bSDerek Schuff     Table[RTLIB::LOG2_F64] = f64_func_f64;
18253b3855bSDerek Schuff     Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64;
18353b3855bSDerek Schuff     Table[RTLIB::LOG10_F32] = f32_func_f32;
18453b3855bSDerek Schuff     Table[RTLIB::LOG10_F64] = f64_func_f64;
18553b3855bSDerek Schuff     Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64;
18653b3855bSDerek Schuff     Table[RTLIB::EXP_F32] = f32_func_f32;
18753b3855bSDerek Schuff     Table[RTLIB::EXP_F64] = f64_func_f64;
18853b3855bSDerek Schuff     Table[RTLIB::EXP_F128] = func_iPTR_i64_i64;
18953b3855bSDerek Schuff     Table[RTLIB::EXP2_F32] = f32_func_f32;
19053b3855bSDerek Schuff     Table[RTLIB::EXP2_F64] = f64_func_f64;
19153b3855bSDerek Schuff     Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64;
19253b3855bSDerek Schuff     Table[RTLIB::SIN_F32] = f32_func_f32;
19353b3855bSDerek Schuff     Table[RTLIB::SIN_F64] = f64_func_f64;
19453b3855bSDerek Schuff     Table[RTLIB::SIN_F128] = func_iPTR_i64_i64;
19553b3855bSDerek Schuff     Table[RTLIB::COS_F32] = f32_func_f32;
19653b3855bSDerek Schuff     Table[RTLIB::COS_F64] = f64_func_f64;
19753b3855bSDerek Schuff     Table[RTLIB::COS_F128] = func_iPTR_i64_i64;
19853b3855bSDerek Schuff     Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR;
19953b3855bSDerek Schuff     Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR;
20053b3855bSDerek Schuff     Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR;
20153b3855bSDerek Schuff     Table[RTLIB::POW_F32] = f32_func_f32_f32;
20253b3855bSDerek Schuff     Table[RTLIB::POW_F64] = f64_func_f64_f64;
20353b3855bSDerek Schuff     Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64;
20453b3855bSDerek Schuff     Table[RTLIB::CEIL_F32] = f32_func_f32;
20553b3855bSDerek Schuff     Table[RTLIB::CEIL_F64] = f64_func_f64;
20653b3855bSDerek Schuff     Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64;
20753b3855bSDerek Schuff     Table[RTLIB::TRUNC_F32] = f32_func_f32;
20853b3855bSDerek Schuff     Table[RTLIB::TRUNC_F64] = f64_func_f64;
20953b3855bSDerek Schuff     Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64;
21053b3855bSDerek Schuff     Table[RTLIB::RINT_F32] = f32_func_f32;
21153b3855bSDerek Schuff     Table[RTLIB::RINT_F64] = f64_func_f64;
21253b3855bSDerek Schuff     Table[RTLIB::RINT_F128] = func_iPTR_i64_i64;
21353b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F32] = f32_func_f32;
21453b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F64] = f64_func_f64;
21553b3855bSDerek Schuff     Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64;
21653b3855bSDerek Schuff     Table[RTLIB::ROUND_F32] = f32_func_f32;
21753b3855bSDerek Schuff     Table[RTLIB::ROUND_F64] = f64_func_f64;
21853b3855bSDerek Schuff     Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64;
21953b3855bSDerek Schuff     Table[RTLIB::FLOOR_F32] = f32_func_f32;
22053b3855bSDerek Schuff     Table[RTLIB::FLOOR_F64] = f64_func_f64;
22153b3855bSDerek Schuff     Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64;
22253b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32;
22353b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64;
22453b3855bSDerek Schuff     Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64;
22553b3855bSDerek Schuff     Table[RTLIB::FMIN_F32] = f32_func_f32_f32;
22653b3855bSDerek Schuff     Table[RTLIB::FMIN_F64] = f64_func_f64_f64;
22753b3855bSDerek Schuff     Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64;
22853b3855bSDerek Schuff     Table[RTLIB::FMAX_F32] = f32_func_f32_f32;
22953b3855bSDerek Schuff     Table[RTLIB::FMAX_F64] = f64_func_f64_f64;
23053b3855bSDerek Schuff     Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64;
23138b42b4aSDan Gohman 
23253b3855bSDerek Schuff     // Conversion
23353b3855bSDerek Schuff     // All F80 and PPCF128 routines are unspported.
23453b3855bSDerek Schuff     Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64;
23553b3855bSDerek Schuff     Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32;
23653b3855bSDerek Schuff     Table[RTLIB::FPEXT_F32_F64] = f64_func_f32;
23753b3855bSDerek Schuff     Table[RTLIB::FPEXT_F16_F32] = f32_func_i16;
23853b3855bSDerek Schuff     Table[RTLIB::FPROUND_F32_F16] = i16_func_f32;
23953b3855bSDerek Schuff     Table[RTLIB::FPROUND_F64_F32] = f32_func_f64;
24053b3855bSDerek Schuff     Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64;
24153b3855bSDerek Schuff     Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64;
24253b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32;
24353b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32;
24453b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32;
24553b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64;
24653b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64;
24753b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64;
24853b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64;
24953b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64;
25053b3855bSDerek Schuff     Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64;
25153b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32;
25253b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32;
25353b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32;
25453b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64;
25553b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64;
25653b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64;
25753b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64;
25853b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64;
25953b3855bSDerek Schuff     Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64;
26053b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32;
26153b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32;
26253b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32;
26353b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64;
26453b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64;
26553b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64;
26653b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64;
26753b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64;
26853b3855bSDerek Schuff     Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64;
26953b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32;
27053b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64;
27153b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32;
27253b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64;
27353b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64;
27453b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64;
27553b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64;
27653b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64;
27753b3855bSDerek Schuff     Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64;
27838b42b4aSDan Gohman 
27953b3855bSDerek Schuff     // Comparison
28053b3855bSDerek Schuff     // ALl F80 and PPCF128 routines are unsupported.
28153b3855bSDerek Schuff     Table[RTLIB::OEQ_F32] = i32_func_f32_f32;
28253b3855bSDerek Schuff     Table[RTLIB::OEQ_F64] = i32_func_f64_f64;
28353b3855bSDerek Schuff     Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64;
28453b3855bSDerek Schuff     Table[RTLIB::UNE_F32] = i32_func_f32_f32;
28553b3855bSDerek Schuff     Table[RTLIB::UNE_F64] = i32_func_f64_f64;
28653b3855bSDerek Schuff     Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64;
28753b3855bSDerek Schuff     Table[RTLIB::OGE_F32] = i32_func_f32_f32;
28853b3855bSDerek Schuff     Table[RTLIB::OGE_F64] = i32_func_f64_f64;
28953b3855bSDerek Schuff     Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64;
29053b3855bSDerek Schuff     Table[RTLIB::OLT_F32] = i32_func_f32_f32;
29153b3855bSDerek Schuff     Table[RTLIB::OLT_F64] = i32_func_f64_f64;
29253b3855bSDerek Schuff     Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64;
29353b3855bSDerek Schuff     Table[RTLIB::OLE_F32] = i32_func_f32_f32;
29453b3855bSDerek Schuff     Table[RTLIB::OLE_F64] = i32_func_f64_f64;
29553b3855bSDerek Schuff     Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64;
29653b3855bSDerek Schuff     Table[RTLIB::OGT_F32] = i32_func_f32_f32;
29753b3855bSDerek Schuff     Table[RTLIB::OGT_F64] = i32_func_f64_f64;
29853b3855bSDerek Schuff     Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64;
29953b3855bSDerek Schuff     Table[RTLIB::UO_F32] = i32_func_f32_f32;
30053b3855bSDerek Schuff     Table[RTLIB::UO_F64] = i32_func_f64_f64;
30153b3855bSDerek Schuff     Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64;
302bfb02aecSDerek Schuff     // O_FXX has the weird property that it uses the same libcall name as UO_FXX
303bfb02aecSDerek Schuff     // This breaks our name-based lookup. Fortunately only the UO family of
304bfb02aecSDerek Schuff     // libcalls appears to be actually used.
305bfb02aecSDerek Schuff     Table[RTLIB::O_F32] = unsupported;
306bfb02aecSDerek Schuff     Table[RTLIB::O_F64] = unsupported;
307bfb02aecSDerek Schuff     Table[RTLIB::O_F128] = unsupported;
30838b42b4aSDan Gohman 
30953b3855bSDerek Schuff     // Memory
31053b3855bSDerek Schuff     Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR;
31153b3855bSDerek Schuff     Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR;
31253b3855bSDerek Schuff     Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR;
31338b42b4aSDan Gohman 
31453b3855bSDerek Schuff     // Element-wise Atomic memory
31553b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
31653b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
31753b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
31853b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
31953b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
32053b3855bSDerek Schuff     Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
32153b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
32253b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
32353b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
32453b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
32553b3855bSDerek Schuff     Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
326c855c728SDaniel Neilson 
32753b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported;
32853b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported;
32953b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported;
33053b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported;
33153b3855bSDerek Schuff     Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported;
33238b42b4aSDan Gohman 
33338b42b4aSDan Gohman     // Atomic '__sync_*' libcalls.
33453b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
33553b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported;
33653b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported;
33753b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported;
33853b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported;
33953b3855bSDerek Schuff     Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported;
34053b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported;
34153b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported;
34253b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported;
34353b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported;
34453b3855bSDerek Schuff     Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported;
34553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported;
34653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported;
34753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported;
34853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported;
34953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported;
35053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported;
35153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported;
35253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported;
35353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported;
35453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported;
35553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported;
35653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported;
35753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported;
35853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported;
35953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported;
36053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported;
36153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported;
36253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported;
36353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported;
36453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported;
36553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported;
36653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported;
36753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported;
36853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported;
36953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported;
37053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported;
37153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported;
37253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported;
37353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported;
37453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported;
37553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported;
37653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported;
37753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported;
37853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported;
37953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported;
38053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported;
38153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported;
38253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported;
38353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported;
38453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported;
38553b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported;
38653b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported;
38753b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported;
38853b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported;
38953b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported;
39053b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported;
39153b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported;
39253b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported;
39353b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported;
39453b3855bSDerek Schuff     Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported;
39538b42b4aSDan Gohman 
39638b42b4aSDan Gohman     // Atomic '__atomic_*' libcalls.
39753b3855bSDerek Schuff     // TODO: Fix these when we implement atomic support
39853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD] = unsupported;
39953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_1] = unsupported;
40053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_2] = unsupported;
40153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_4] = unsupported;
40253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_8] = unsupported;
40353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_LOAD_16] = unsupported;
40438b42b4aSDan Gohman 
40553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE] = unsupported;
40653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_1] = unsupported;
40753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_2] = unsupported;
40853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_4] = unsupported;
40953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_8] = unsupported;
41053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_STORE_16] = unsupported;
41138b42b4aSDan Gohman 
41253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE] = unsupported;
41353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported;
41453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported;
41553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported;
41653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported;
41753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported;
41838b42b4aSDan Gohman 
41953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported;
42053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported;
42153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported;
42253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported;
42353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported;
42453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported;
42538b42b4aSDan Gohman 
42653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported;
42753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported;
42853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported;
42953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported;
43053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported;
43138b42b4aSDan Gohman 
43253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported;
43353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported;
43453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported;
43553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported;
43653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported;
43738b42b4aSDan Gohman 
43853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported;
43953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported;
44053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported;
44153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported;
44253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported;
44338b42b4aSDan Gohman 
44453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported;
44553b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported;
44653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported;
44753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported;
44853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported;
44938b42b4aSDan Gohman 
45053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported;
45153b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported;
45253b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported;
45353b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported;
45453b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported;
45538b42b4aSDan Gohman 
45653b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported;
45753b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported;
45853b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported;
45953b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported;
46053b3855bSDerek Schuff     Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported;
46153b3855bSDerek Schuff   }
46238b42b4aSDan Gohman };
46338b42b4aSDan Gohman 
464bfb02aecSDerek Schuff ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures;
46538b42b4aSDan Gohman 
46653b3855bSDerek Schuff // Maps libcall names to their RTLIB::Libcall number. Builds the map in a
46753b3855bSDerek Schuff // constructor for use with ManagedStatic
46853b3855bSDerek Schuff struct StaticLibcallNameMap {
46953b3855bSDerek Schuff   StringMap<RTLIB::Libcall> Map;
47053b3855bSDerek Schuff   StaticLibcallNameMap() {
471b84e158dSBenjamin Kramer     static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = {
472ae87f86eSBenjamin Kramer #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code},
473*e06bac47SPeter Collingbourne #include "llvm/IR/RuntimeLibcalls.def"
47453b3855bSDerek Schuff #undef HANDLE_LIBCALL
475ae87f86eSBenjamin Kramer     };
476ae87f86eSBenjamin Kramer     for (const auto &NameLibcall : NameLibcalls) {
477ae87f86eSBenjamin Kramer       if (NameLibcall.first != nullptr &&
478ae87f86eSBenjamin Kramer           RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) {
479ae87f86eSBenjamin Kramer         assert(Map.find(NameLibcall.first) == Map.end() &&
480ae87f86eSBenjamin Kramer                "duplicate libcall names in name map");
481ae87f86eSBenjamin Kramer         Map[NameLibcall.first] = NameLibcall.second;
482ae87f86eSBenjamin Kramer       }
483ae87f86eSBenjamin Kramer     }
48453b3855bSDerek Schuff   }
48538b42b4aSDan Gohman };
48638b42b4aSDan Gohman 
48753b3855bSDerek Schuff } // end anonymous namespace
48853b3855bSDerek Schuff 
48953b3855bSDerek Schuff 
49053b3855bSDerek Schuff 
49138b42b4aSDan Gohman void llvm::GetSignature(const WebAssemblySubtarget &Subtarget,
492e2688c43SDerek Schuff                         RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets,
493e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Params) {
49438b42b4aSDan Gohman   assert(Rets.empty());
49538b42b4aSDan Gohman   assert(Params.empty());
49638b42b4aSDan Gohman 
497bd1716aeSSam Clegg   wasm::ValType iPTR =
498bd1716aeSSam Clegg       Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32;
49938b42b4aSDan Gohman 
50053b3855bSDerek Schuff   auto& Table = RuntimeLibcallSignatures->Table;
50153b3855bSDerek Schuff   switch (Table[LC]) {
50238b42b4aSDan Gohman   case func:
50338b42b4aSDan Gohman     break;
50438b42b4aSDan Gohman   case f32_func_f32:
505e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
506e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
50738b42b4aSDan Gohman     break;
50838b42b4aSDan Gohman   case f32_func_f64:
509e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
510e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
51138b42b4aSDan Gohman     break;
51238b42b4aSDan Gohman   case f32_func_i32:
513e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
514e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
51538b42b4aSDan Gohman     break;
51638b42b4aSDan Gohman   case f32_func_i64:
517e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
518e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
51938b42b4aSDan Gohman     break;
52038b42b4aSDan Gohman   case f32_func_i16:
521e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
522e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
52338b42b4aSDan Gohman     break;
52438b42b4aSDan Gohman   case f64_func_f32:
525e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
526e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
52738b42b4aSDan Gohman     break;
52838b42b4aSDan Gohman   case f64_func_f64:
529e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
530e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
53138b42b4aSDan Gohman     break;
53238b42b4aSDan Gohman   case f64_func_i32:
533e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
534e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
53538b42b4aSDan Gohman     break;
53638b42b4aSDan Gohman   case f64_func_i64:
537e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
538e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
53938b42b4aSDan Gohman     break;
54038b42b4aSDan Gohman   case i32_func_f32:
541e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
542e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
54338b42b4aSDan Gohman     break;
54438b42b4aSDan Gohman   case i32_func_f64:
545e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
546e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
54738b42b4aSDan Gohman     break;
54838b42b4aSDan Gohman   case i32_func_i32:
549e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
550e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
55138b42b4aSDan Gohman     break;
55238b42b4aSDan Gohman   case i64_func_f32:
553e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
554e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
55538b42b4aSDan Gohman     break;
55638b42b4aSDan Gohman   case i64_func_f64:
557e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
558e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
55938b42b4aSDan Gohman     break;
56038b42b4aSDan Gohman   case i64_func_i64:
561e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
562e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
56338b42b4aSDan Gohman     break;
56438b42b4aSDan Gohman   case f32_func_f32_f32:
565e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
566e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
567e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
56838b42b4aSDan Gohman     break;
56938b42b4aSDan Gohman   case f32_func_f32_i32:
570e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
571e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
572e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
57338b42b4aSDan Gohman     break;
57438b42b4aSDan Gohman   case f32_func_i64_i64:
575e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
576e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
577e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
57838b42b4aSDan Gohman     break;
57938b42b4aSDan Gohman   case f64_func_f64_f64:
580e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
581e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
582e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
58338b42b4aSDan Gohman     break;
58438b42b4aSDan Gohman   case f64_func_f64_i32:
585e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
586e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
587e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
58838b42b4aSDan Gohman     break;
58938b42b4aSDan Gohman   case f64_func_i64_i64:
590e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
591e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
592e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
59338b42b4aSDan Gohman     break;
59438b42b4aSDan Gohman   case i16_func_f32:
595e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
596e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
59738b42b4aSDan Gohman     break;
59838b42b4aSDan Gohman   case i8_func_i8_i8:
599e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
600e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
601e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
60238b42b4aSDan Gohman     break;
60338b42b4aSDan Gohman   case func_f32_iPTR_iPTR:
604e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
605bd1716aeSSam Clegg     Params.push_back(iPTR);
606bd1716aeSSam Clegg     Params.push_back(iPTR);
60738b42b4aSDan Gohman     break;
60838b42b4aSDan Gohman   case func_f64_iPTR_iPTR:
609e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
610bd1716aeSSam Clegg     Params.push_back(iPTR);
611bd1716aeSSam Clegg     Params.push_back(iPTR);
61238b42b4aSDan Gohman     break;
61338b42b4aSDan Gohman   case i16_func_i16_i16:
614e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
615e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
616e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
61738b42b4aSDan Gohman     break;
61838b42b4aSDan Gohman   case i32_func_f32_f32:
619e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
620e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
621e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
62238b42b4aSDan Gohman     break;
62338b42b4aSDan Gohman   case i32_func_f64_f64:
624e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
625e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
626e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
62738b42b4aSDan Gohman     break;
62838b42b4aSDan Gohman   case i32_func_i32_i32:
629e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
630e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
631e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
63238b42b4aSDan Gohman     break;
633b17de645SDan Gohman   case i32_func_i32_i32_iPTR:
634b17de645SDan Gohman     Rets.push_back(wasm::ValType::I32);
635b17de645SDan Gohman     Params.push_back(wasm::ValType::I32);
636b17de645SDan Gohman     Params.push_back(wasm::ValType::I32);
637b17de645SDan Gohman     Params.push_back(iPTR);
638b17de645SDan Gohman     break;
63938b42b4aSDan Gohman   case i64_func_i64_i64:
640e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
641e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
642e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
64338b42b4aSDan Gohman     break;
644b17de645SDan Gohman   case i64_func_i64_i64_iPTR:
645b17de645SDan Gohman     Rets.push_back(wasm::ValType::I64);
646b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
647b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
648b17de645SDan Gohman     Params.push_back(iPTR);
649b17de645SDan Gohman     break;
65038b42b4aSDan Gohman   case i64_i64_func_f32:
65138b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
652e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
653e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
65438b42b4aSDan Gohman #else
655bd1716aeSSam Clegg     Params.push_back(iPTR);
65638b42b4aSDan Gohman #endif
657e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
65838b42b4aSDan Gohman     break;
65938b42b4aSDan Gohman   case i64_i64_func_f64:
66038b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
661e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
662e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
66338b42b4aSDan Gohman #else
664bd1716aeSSam Clegg     Params.push_back(iPTR);
66538b42b4aSDan Gohman #endif
666e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
66738b42b4aSDan Gohman     break;
66838b42b4aSDan Gohman   case i16_i16_func_i16_i16:
66938b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
670e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
671e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
67238b42b4aSDan Gohman #else
673bd1716aeSSam Clegg     Params.push_back(iPTR);
67438b42b4aSDan Gohman #endif
675e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
676e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
67738b42b4aSDan Gohman     break;
67838b42b4aSDan Gohman   case i32_i32_func_i32_i32:
67938b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
680e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
681e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
68238b42b4aSDan Gohman #else
683bd1716aeSSam Clegg     Params.push_back(iPTR);
68438b42b4aSDan Gohman #endif
685e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
686e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
68738b42b4aSDan Gohman     break;
68838b42b4aSDan Gohman   case i64_i64_func_i64_i64:
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
693bd1716aeSSam Clegg     Params.push_back(iPTR);
69438b42b4aSDan Gohman #endif
695e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
696e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
69738b42b4aSDan Gohman     break;
69838b42b4aSDan Gohman   case i64_i64_func_i64_i64_i64_i64:
69938b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
700e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
701e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
70238b42b4aSDan Gohman #else
703bd1716aeSSam Clegg     Params.push_back(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;
710b17de645SDan Gohman   case i64_i64_func_i64_i64_i64_i64_iPTR:
711b17de645SDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
712b17de645SDan Gohman     Rets.push_back(wasm::ValType::I64);
713b17de645SDan Gohman     Rets.push_back(wasm::ValType::I64);
714b17de645SDan Gohman #else
715b17de645SDan Gohman     Params.push_back(iPTR);
716b17de645SDan Gohman #endif
717b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
718b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
719b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
720b17de645SDan Gohman     Params.push_back(wasm::ValType::I64);
721b17de645SDan Gohman     Params.push_back(iPTR);
722b17de645SDan Gohman     break;
72338b42b4aSDan Gohman   case i64_i64_i64_i64_func_i64_i64_i64_i64:
72438b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
725e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
726e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
727e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
728e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
72938b42b4aSDan Gohman #else
730bd1716aeSSam Clegg     Params.push_back(iPTR);
73138b42b4aSDan Gohman #endif
732e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
733e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
734e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
735e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
73638b42b4aSDan Gohman     break;
73738b42b4aSDan Gohman   case i64_i64_func_i64_i64_i32:
73838b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support.
739e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
740e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
741e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
742e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I64);
74338b42b4aSDan Gohman #else
744bd1716aeSSam Clegg     Params.push_back(iPTR);
74538b42b4aSDan Gohman #endif
746e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
747e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
748e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
74938b42b4aSDan Gohman     break;
75038b42b4aSDan Gohman   case iPTR_func_iPTR_i32_iPTR:
751bd1716aeSSam Clegg     Rets.push_back(iPTR);
752bd1716aeSSam Clegg     Params.push_back(iPTR);
753e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
754bd1716aeSSam Clegg     Params.push_back(iPTR);
75538b42b4aSDan Gohman     break;
75638b42b4aSDan Gohman   case iPTR_func_iPTR_iPTR_iPTR:
757bd1716aeSSam Clegg     Rets.push_back(iPTR);
758bd1716aeSSam Clegg     Params.push_back(iPTR);
759bd1716aeSSam Clegg     Params.push_back(iPTR);
760bd1716aeSSam Clegg     Params.push_back(iPTR);
76138b42b4aSDan Gohman     break;
76238b42b4aSDan Gohman   case f32_func_f32_f32_f32:
763e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F32);
764e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
765e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
766e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
76738b42b4aSDan Gohman     break;
76838b42b4aSDan Gohman   case f64_func_f64_f64_f64:
769e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::F64);
770e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
771e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
772e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
77338b42b4aSDan Gohman     break;
77438b42b4aSDan Gohman   case func_i64_i64_iPTR_iPTR:
775e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
776e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
777bd1716aeSSam Clegg     Params.push_back(iPTR);
778bd1716aeSSam Clegg     Params.push_back(iPTR);
77938b42b4aSDan Gohman     break;
78038b42b4aSDan Gohman   case func_iPTR_f32:
781bd1716aeSSam Clegg     Params.push_back(iPTR);
782e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F32);
78338b42b4aSDan Gohman     break;
78438b42b4aSDan Gohman   case func_iPTR_f64:
785bd1716aeSSam Clegg     Params.push_back(iPTR);
786e2688c43SDerek Schuff     Params.push_back(wasm::ValType::F64);
78738b42b4aSDan Gohman     break;
78838b42b4aSDan Gohman   case func_iPTR_i32:
789bd1716aeSSam Clegg     Params.push_back(iPTR);
790e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I32);
79138b42b4aSDan Gohman     break;
79238b42b4aSDan Gohman   case func_iPTR_i64:
793bd1716aeSSam Clegg     Params.push_back(iPTR);
794e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
79538b42b4aSDan Gohman     break;
79638b42b4aSDan Gohman   case func_iPTR_i64_i64:
797bd1716aeSSam Clegg     Params.push_back(iPTR);
798e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
799e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
80038b42b4aSDan Gohman     break;
80138b42b4aSDan Gohman   case func_iPTR_i64_i64_i64_i64:
802bd1716aeSSam Clegg     Params.push_back(iPTR);
803e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
804e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
805e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
806e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
80738b42b4aSDan Gohman     break;
80838b42b4aSDan Gohman   case func_iPTR_i64_i64_i64_i64_i64_i64:
809bd1716aeSSam Clegg     Params.push_back(iPTR);
810e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
811e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
812e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
813e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
814e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
815e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
81638b42b4aSDan Gohman     break;
81738b42b4aSDan Gohman   case i32_func_i64_i64:
818e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
819e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
820e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
82138b42b4aSDan Gohman     break;
82238b42b4aSDan Gohman   case i32_func_i64_i64_i64_i64:
823e2688c43SDerek Schuff     Rets.push_back(wasm::ValType::I32);
824e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
825e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
826e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
827e2688c43SDerek Schuff     Params.push_back(wasm::ValType::I64);
82838b42b4aSDan Gohman     break;
82938b42b4aSDan Gohman   case unsupported:
83038b42b4aSDan Gohman     llvm_unreachable("unsupported runtime library signature");
83138b42b4aSDan Gohman   }
83238b42b4aSDan Gohman }
83338b42b4aSDan Gohman 
83453b3855bSDerek Schuff static ManagedStatic<StaticLibcallNameMap> LibcallNameMap;
83553b3855bSDerek Schuff // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed
83653b3855bSDerek Schuff // other than here, just roll its logic into this version.
837e2688c43SDerek Schuff void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name,
838e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Rets,
839e2688c43SDerek Schuff                         SmallVectorImpl<wasm::ValType> &Params) {
84053b3855bSDerek Schuff   auto& Map = LibcallNameMap->Map;
84153b3855bSDerek Schuff   auto val = Map.find(Name);
84253b3855bSDerek Schuff   assert(val != Map.end() && "unexpected runtime library name");
84353b3855bSDerek Schuff   return GetSignature(Subtarget, val->second, Rets, Params);
84438b42b4aSDan Gohman }
845