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; 299*bfb02aecSDerek Schuff // O_FXX has the weird property that it uses the same libcall name as UO_FXX 300*bfb02aecSDerek Schuff // This breaks our name-based lookup. Fortunately only the UO family of 301*bfb02aecSDerek Schuff // libcalls appears to be actually used. 302*bfb02aecSDerek Schuff Table[RTLIB::O_F32] = unsupported; 303*bfb02aecSDerek Schuff Table[RTLIB::O_F64] = unsupported; 304*bfb02aecSDerek 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 461*bfb02aecSDerek 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() { 46853b3855bSDerek Schuff #define HANDLE_LIBCALL(code, name) \ 469*bfb02aecSDerek Schuff if (name && RuntimeLibcallSignatures->Table[RTLIB::code] != unsupported) { \ 470*bfb02aecSDerek Schuff assert(Map.find(StringRef::withNullAsEmpty(name)) == Map.end() && \ 471*bfb02aecSDerek Schuff "duplicate libcall names in name map"); \ 472*bfb02aecSDerek Schuff Map[StringRef::withNullAsEmpty(name)] = RTLIB::code; \ 473*bfb02aecSDerek Schuff } 47453b3855bSDerek Schuff #include "llvm/CodeGen/RuntimeLibcalls.def" 47553b3855bSDerek Schuff #undef HANDLE_LIBCALL 47653b3855bSDerek Schuff } 47738b42b4aSDan Gohman }; 47838b42b4aSDan Gohman 47953b3855bSDerek Schuff } // end anonymous namespace 48053b3855bSDerek Schuff 48153b3855bSDerek Schuff 48253b3855bSDerek Schuff 48338b42b4aSDan Gohman void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, 484e2688c43SDerek Schuff RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets, 485e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) { 48638b42b4aSDan Gohman assert(Rets.empty()); 48738b42b4aSDan Gohman assert(Params.empty()); 48838b42b4aSDan Gohman 48938b42b4aSDan Gohman WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ? 49038b42b4aSDan Gohman WebAssembly::ExprType::I64 : 49138b42b4aSDan Gohman WebAssembly::ExprType::I32; 49238b42b4aSDan Gohman 49353b3855bSDerek Schuff auto& Table = RuntimeLibcallSignatures->Table; 49453b3855bSDerek Schuff switch (Table[LC]) { 49538b42b4aSDan Gohman case func: 49638b42b4aSDan Gohman break; 49738b42b4aSDan Gohman case f32_func_f32: 498e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 499e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 50038b42b4aSDan Gohman break; 50138b42b4aSDan Gohman case f32_func_f64: 502e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 503e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 50438b42b4aSDan Gohman break; 50538b42b4aSDan Gohman case f32_func_i32: 506e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 507e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 50838b42b4aSDan Gohman break; 50938b42b4aSDan Gohman case f32_func_i64: 510e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 511e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 51238b42b4aSDan Gohman break; 51338b42b4aSDan Gohman case f32_func_i16: 514e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 515e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 51638b42b4aSDan Gohman break; 51738b42b4aSDan Gohman case f64_func_f32: 518e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 519e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 52038b42b4aSDan Gohman break; 52138b42b4aSDan Gohman case f64_func_f64: 522e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 523e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 52438b42b4aSDan Gohman break; 52538b42b4aSDan Gohman case f64_func_i32: 526e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 527e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 52838b42b4aSDan Gohman break; 52938b42b4aSDan Gohman case f64_func_i64: 530e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 531e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 53238b42b4aSDan Gohman break; 53338b42b4aSDan Gohman case i32_func_f32: 534e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 535e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 53638b42b4aSDan Gohman break; 53738b42b4aSDan Gohman case i32_func_f64: 538e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 539e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 54038b42b4aSDan Gohman break; 54138b42b4aSDan Gohman case i32_func_i32: 542e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 543e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 54438b42b4aSDan Gohman break; 54538b42b4aSDan Gohman case i64_func_f32: 546e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 547e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 54838b42b4aSDan Gohman break; 54938b42b4aSDan Gohman case i64_func_f64: 550e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 551e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 55238b42b4aSDan Gohman break; 55338b42b4aSDan Gohman case i64_func_i64: 554e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 555e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 55638b42b4aSDan Gohman break; 55738b42b4aSDan Gohman case f32_func_f32_f32: 558e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 559e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 560e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 56138b42b4aSDan Gohman break; 56238b42b4aSDan Gohman case f32_func_f32_i32: 563e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 564e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 565e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 56638b42b4aSDan Gohman break; 56738b42b4aSDan Gohman case f32_func_i64_i64: 568e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 569e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 570e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 57138b42b4aSDan Gohman break; 57238b42b4aSDan Gohman case f64_func_f64_f64: 573e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 574e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 575e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 57638b42b4aSDan Gohman break; 57738b42b4aSDan Gohman case f64_func_f64_i32: 578e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 579e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 580e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 58138b42b4aSDan Gohman break; 58238b42b4aSDan Gohman case f64_func_i64_i64: 583e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 584e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 585e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 58638b42b4aSDan Gohman break; 58738b42b4aSDan Gohman case i16_func_f32: 588e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 589e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 59038b42b4aSDan Gohman break; 59138b42b4aSDan Gohman case i8_func_i8_i8: 592e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 593e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 594e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 59538b42b4aSDan Gohman break; 59638b42b4aSDan Gohman case func_f32_iPTR_iPTR: 597e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 598e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 599e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 60038b42b4aSDan Gohman break; 60138b42b4aSDan Gohman case func_f64_iPTR_iPTR: 602e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 603e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 604e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 60538b42b4aSDan Gohman break; 60638b42b4aSDan Gohman case i16_func_i16_i16: 607e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 608e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 609e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 61038b42b4aSDan Gohman break; 61138b42b4aSDan Gohman case i32_func_f32_f32: 612e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 613e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 614e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 61538b42b4aSDan Gohman break; 61638b42b4aSDan Gohman case i32_func_f64_f64: 617e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 618e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 619e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 62038b42b4aSDan Gohman break; 62138b42b4aSDan Gohman case i32_func_i32_i32: 622e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 623e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 624e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 62538b42b4aSDan Gohman break; 62638b42b4aSDan Gohman case i64_func_i64_i64: 627e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 628e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 629e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 63038b42b4aSDan Gohman break; 63138b42b4aSDan Gohman case i64_i64_func_f32: 63238b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 633e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 634e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 63538b42b4aSDan Gohman #else 636e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 63738b42b4aSDan Gohman #endif 638e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 63938b42b4aSDan Gohman break; 64038b42b4aSDan Gohman case i64_i64_func_f64: 64138b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 642e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 643e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 64438b42b4aSDan Gohman #else 645e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 64638b42b4aSDan Gohman #endif 647e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 64838b42b4aSDan Gohman break; 64938b42b4aSDan Gohman case i16_i16_func_i16_i16: 65038b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 651e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 652e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 65338b42b4aSDan Gohman #else 654e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 65538b42b4aSDan Gohman #endif 656e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 657e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 65838b42b4aSDan Gohman break; 65938b42b4aSDan Gohman case i32_i32_func_i32_i32: 66038b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 661e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 662e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 66338b42b4aSDan Gohman #else 664e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 66538b42b4aSDan Gohman #endif 666e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 667e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 66838b42b4aSDan Gohman break; 66938b42b4aSDan Gohman case i64_i64_func_i64_i64: 67038b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 671e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 672e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 67338b42b4aSDan Gohman #else 674e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 67538b42b4aSDan Gohman #endif 676e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 677e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 67838b42b4aSDan Gohman break; 67938b42b4aSDan Gohman case i64_i64_func_i64_i64_i64_i64: 68038b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 681e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 682e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 68338b42b4aSDan Gohman #else 684e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 68538b42b4aSDan Gohman #endif 686e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 687e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 688e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 689e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 69038b42b4aSDan Gohman break; 69138b42b4aSDan Gohman case i64_i64_i64_i64_func_i64_i64_i64_i64: 69238b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 693e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 694e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 695e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 696e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 69738b42b4aSDan Gohman #else 698e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 69938b42b4aSDan Gohman #endif 700e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 701e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 702e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 703e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 70438b42b4aSDan Gohman break; 70538b42b4aSDan Gohman case i64_i64_func_i64_i64_i32: 70638b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 707e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 708e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 709e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 710e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 71138b42b4aSDan Gohman #else 712e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 71338b42b4aSDan Gohman #endif 714e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 715e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 716e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 71738b42b4aSDan Gohman break; 71838b42b4aSDan Gohman case iPTR_func_iPTR_i32_iPTR: 719e2688c43SDerek Schuff Rets.push_back(wasm::ValType(iPTR)); 720e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 721e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 722e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 72338b42b4aSDan Gohman break; 72438b42b4aSDan Gohman case iPTR_func_iPTR_iPTR_iPTR: 725e2688c43SDerek Schuff Rets.push_back(wasm::ValType(iPTR)); 726e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 727e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 728e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 72938b42b4aSDan Gohman break; 73038b42b4aSDan Gohman case f32_func_f32_f32_f32: 731e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 732e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 733e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 734e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 73538b42b4aSDan Gohman break; 73638b42b4aSDan Gohman case f64_func_f64_f64_f64: 737e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 738e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 739e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 740e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 74138b42b4aSDan Gohman break; 74238b42b4aSDan Gohman case func_i64_i64_iPTR_iPTR: 743e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 744e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 745e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 746e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 74738b42b4aSDan Gohman break; 74838b42b4aSDan Gohman case func_iPTR_f32: 749e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 750e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 75138b42b4aSDan Gohman break; 75238b42b4aSDan Gohman case func_iPTR_f64: 753e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 754e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 75538b42b4aSDan Gohman break; 75638b42b4aSDan Gohman case func_iPTR_i32: 757e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 758e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 75938b42b4aSDan Gohman break; 76038b42b4aSDan Gohman case func_iPTR_i64: 761e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 762e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 76338b42b4aSDan Gohman break; 76438b42b4aSDan Gohman case func_iPTR_i64_i64: 765e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 766e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 767e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 76838b42b4aSDan Gohman break; 76938b42b4aSDan Gohman case func_iPTR_i64_i64_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); 773e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 774e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 77538b42b4aSDan Gohman break; 77638b42b4aSDan Gohman case func_iPTR_i64_i64_i64_i64_i64_i64: 777e2688c43SDerek Schuff Params.push_back(wasm::ValType(iPTR)); 778e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 779e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 780e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 781e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 782e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 783e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 78438b42b4aSDan Gohman break; 78538b42b4aSDan Gohman case i32_func_i64_i64: 786e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 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_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); 794e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 795e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 79638b42b4aSDan Gohman break; 79738b42b4aSDan Gohman case unsupported: 79838b42b4aSDan Gohman llvm_unreachable("unsupported runtime library signature"); 79938b42b4aSDan Gohman } 80038b42b4aSDan Gohman } 80138b42b4aSDan Gohman 80253b3855bSDerek Schuff static ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 80353b3855bSDerek Schuff // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 80453b3855bSDerek Schuff // other than here, just roll its logic into this version. 805e2688c43SDerek Schuff void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name, 806e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Rets, 807e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) { 80853b3855bSDerek Schuff auto& Map = LibcallNameMap->Map; 80953b3855bSDerek Schuff auto val = Map.find(Name); 81053b3855bSDerek Schuff assert(val != Map.end() && "unexpected runtime library name"); 81153b3855bSDerek Schuff return GetSignature(Subtarget, val->second, Rets, Params); 81238b42b4aSDan Gohman } 813