138b42b4aSDan Gohman // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- 238b42b4aSDan Gohman // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 638b42b4aSDan Gohman // 738b42b4aSDan Gohman //===----------------------------------------------------------------------===// 838b42b4aSDan Gohman /// 938b42b4aSDan Gohman /// \file 105f8f34e4SAdrian Prantl /// This file contains signature information for runtime libcalls. 1138b42b4aSDan Gohman /// 1238b42b4aSDan Gohman /// CodeGen uses external symbols, which it refers to by name. The WebAssembly 1338b42b4aSDan Gohman /// target needs type information for all functions. This file contains a big 1438b42b4aSDan Gohman /// table providing type signatures for all runtime library functions that LLVM 1538b42b4aSDan Gohman /// uses. 1638b42b4aSDan Gohman /// 1738b42b4aSDan Gohman /// This is currently a fairly heavy-handed solution. 1838b42b4aSDan Gohman /// 1938b42b4aSDan Gohman //===----------------------------------------------------------------------===// 2038b42b4aSDan Gohman 2138b42b4aSDan Gohman #include "WebAssemblyRuntimeLibcallSignatures.h" 2238b42b4aSDan Gohman #include "WebAssemblySubtarget.h" 2338b42b4aSDan Gohman #include "llvm/CodeGen/RuntimeLibcalls.h" 2453b3855bSDerek Schuff #include "llvm/Support/ManagedStatic.h" 2538b42b4aSDan Gohman 2638b42b4aSDan Gohman using namespace llvm; 2738b42b4aSDan Gohman 2838b42b4aSDan Gohman namespace { 2938b42b4aSDan Gohman 3038b42b4aSDan Gohman enum RuntimeLibcallSignature { 3138b42b4aSDan Gohman func, 3238b42b4aSDan Gohman f32_func_f32, 3338b42b4aSDan Gohman f32_func_f64, 3438b42b4aSDan Gohman f32_func_i32, 3538b42b4aSDan Gohman f32_func_i64, 3638b42b4aSDan Gohman f32_func_i16, 3738b42b4aSDan Gohman f64_func_f32, 3838b42b4aSDan Gohman f64_func_f64, 3938b42b4aSDan Gohman f64_func_i32, 4038b42b4aSDan Gohman f64_func_i64, 4138b42b4aSDan Gohman i32_func_f32, 4238b42b4aSDan Gohman i32_func_f64, 4338b42b4aSDan Gohman i32_func_i32, 4438b42b4aSDan Gohman i64_func_f32, 4538b42b4aSDan Gohman i64_func_f64, 4638b42b4aSDan Gohman i64_func_i64, 4738b42b4aSDan Gohman f32_func_f32_f32, 4838b42b4aSDan Gohman f32_func_f32_i32, 4938b42b4aSDan Gohman f32_func_i64_i64, 5038b42b4aSDan Gohman f64_func_f64_f64, 5138b42b4aSDan Gohman f64_func_f64_i32, 5238b42b4aSDan Gohman f64_func_i64_i64, 5338b42b4aSDan Gohman i16_func_f32, 543a7532e6SDan Gohman i16_func_f64, 553a7532e6SDan Gohman i16_func_i64_i64, 5638b42b4aSDan Gohman i8_func_i8_i8, 5738b42b4aSDan Gohman func_f32_iPTR_iPTR, 5838b42b4aSDan Gohman func_f64_iPTR_iPTR, 5938b42b4aSDan Gohman i16_func_i16_i16, 6038b42b4aSDan Gohman i32_func_f32_f32, 6138b42b4aSDan Gohman i32_func_f64_f64, 6238b42b4aSDan Gohman i32_func_i32_i32, 63b17de645SDan Gohman i32_func_i32_i32_iPTR, 6438b42b4aSDan Gohman i64_func_i64_i64, 65b17de645SDan Gohman i64_func_i64_i64_iPTR, 6638b42b4aSDan Gohman i64_i64_func_f32, 6738b42b4aSDan Gohman i64_i64_func_f64, 6838b42b4aSDan Gohman i16_i16_func_i16_i16, 6938b42b4aSDan Gohman i32_i32_func_i32_i32, 7038b42b4aSDan Gohman i64_i64_func_i64_i64, 7138b42b4aSDan Gohman i64_i64_func_i64_i64_i64_i64, 72b17de645SDan Gohman i64_i64_func_i64_i64_i64_i64_iPTR, 7338b42b4aSDan Gohman i64_i64_i64_i64_func_i64_i64_i64_i64, 7438b42b4aSDan Gohman i64_i64_func_i64_i64_i32, 7538b42b4aSDan Gohman iPTR_func_iPTR_i32_iPTR, 7638b42b4aSDan Gohman iPTR_func_iPTR_iPTR_iPTR, 7738b42b4aSDan Gohman f32_func_f32_f32_f32, 7838b42b4aSDan Gohman f64_func_f64_f64_f64, 7938b42b4aSDan Gohman func_i64_i64_iPTR_iPTR, 8038b42b4aSDan Gohman func_iPTR_f32, 8138b42b4aSDan Gohman func_iPTR_f64, 8238b42b4aSDan Gohman func_iPTR_i32, 8338b42b4aSDan Gohman func_iPTR_i64, 8438b42b4aSDan Gohman func_iPTR_i64_i64, 85caeb6cfbSSam Clegg func_iPTR_i64_i64_i32, 8638b42b4aSDan Gohman func_iPTR_i64_i64_i64_i64, 8738b42b4aSDan Gohman func_iPTR_i64_i64_i64_i64_i64_i64, 8838b42b4aSDan Gohman i32_func_i64_i64, 8938b42b4aSDan Gohman i32_func_i64_i64_i64_i64, 90a49496fbSDan Gohman iPTR_func_f32, 91a49496fbSDan Gohman iPTR_func_f64, 92a49496fbSDan Gohman iPTR_func_i64_i64, 9338b42b4aSDan Gohman unsupported 9438b42b4aSDan Gohman }; 9538b42b4aSDan Gohman 9653b3855bSDerek Schuff struct RuntimeLibcallSignatureTable { 9753b3855bSDerek Schuff std::vector<RuntimeLibcallSignature> Table; 9853b3855bSDerek Schuff 9953b3855bSDerek Schuff // Any newly-added libcalls will be unsupported by default. 10053b3855bSDerek Schuff RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) { 10138b42b4aSDan Gohman // Integer 10253b3855bSDerek Schuff Table[RTLIB::SHL_I16] = i16_func_i16_i16; 10353b3855bSDerek Schuff Table[RTLIB::SHL_I32] = i32_func_i32_i32; 10453b3855bSDerek Schuff Table[RTLIB::SHL_I64] = i64_func_i64_i64; 10553b3855bSDerek Schuff Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32; 10653b3855bSDerek Schuff Table[RTLIB::SRL_I16] = i16_func_i16_i16; 10753b3855bSDerek Schuff Table[RTLIB::SRL_I32] = i32_func_i32_i32; 10853b3855bSDerek Schuff Table[RTLIB::SRL_I64] = i64_func_i64_i64; 10953b3855bSDerek Schuff Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32; 11053b3855bSDerek Schuff Table[RTLIB::SRA_I16] = i16_func_i16_i16; 11153b3855bSDerek Schuff Table[RTLIB::SRA_I32] = i32_func_i32_i32; 11253b3855bSDerek Schuff Table[RTLIB::SRA_I64] = i64_func_i64_i64; 11353b3855bSDerek Schuff Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32; 11453b3855bSDerek Schuff Table[RTLIB::MUL_I8] = i8_func_i8_i8; 11553b3855bSDerek Schuff Table[RTLIB::MUL_I16] = i16_func_i16_i16; 11653b3855bSDerek Schuff Table[RTLIB::MUL_I32] = i32_func_i32_i32; 11753b3855bSDerek Schuff Table[RTLIB::MUL_I64] = i64_func_i64_i64; 11853b3855bSDerek Schuff Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64; 119b17de645SDan Gohman Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR; 120b17de645SDan Gohman Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR; 121b17de645SDan Gohman Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR; 12253b3855bSDerek Schuff Table[RTLIB::SDIV_I8] = i8_func_i8_i8; 12353b3855bSDerek Schuff Table[RTLIB::SDIV_I16] = i16_func_i16_i16; 12453b3855bSDerek Schuff Table[RTLIB::SDIV_I32] = i32_func_i32_i32; 12553b3855bSDerek Schuff Table[RTLIB::SDIV_I64] = i64_func_i64_i64; 12653b3855bSDerek Schuff Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64; 12753b3855bSDerek Schuff Table[RTLIB::UDIV_I8] = i8_func_i8_i8; 12853b3855bSDerek Schuff Table[RTLIB::UDIV_I16] = i16_func_i16_i16; 12953b3855bSDerek Schuff Table[RTLIB::UDIV_I32] = i32_func_i32_i32; 13053b3855bSDerek Schuff Table[RTLIB::UDIV_I64] = i64_func_i64_i64; 13153b3855bSDerek Schuff Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64; 13253b3855bSDerek Schuff Table[RTLIB::SREM_I8] = i8_func_i8_i8; 13353b3855bSDerek Schuff Table[RTLIB::SREM_I16] = i16_func_i16_i16; 13453b3855bSDerek Schuff Table[RTLIB::SREM_I32] = i32_func_i32_i32; 13553b3855bSDerek Schuff Table[RTLIB::SREM_I64] = i64_func_i64_i64; 13653b3855bSDerek Schuff Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64; 13753b3855bSDerek Schuff Table[RTLIB::UREM_I8] = i8_func_i8_i8; 13853b3855bSDerek Schuff Table[RTLIB::UREM_I16] = i16_func_i16_i16; 13953b3855bSDerek Schuff Table[RTLIB::UREM_I32] = i32_func_i32_i32; 14053b3855bSDerek Schuff Table[RTLIB::UREM_I64] = i64_func_i64_i64; 14153b3855bSDerek Schuff Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64; 14253b3855bSDerek Schuff Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8; 14353b3855bSDerek Schuff Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16; 14453b3855bSDerek Schuff Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32; 14553b3855bSDerek Schuff Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64; 14653b3855bSDerek Schuff Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 14753b3855bSDerek Schuff Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8; 14853b3855bSDerek Schuff Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16; 14953b3855bSDerek Schuff Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32; 15053b3855bSDerek Schuff Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64; 15153b3855bSDerek Schuff Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 15253b3855bSDerek Schuff Table[RTLIB::NEG_I32] = i32_func_i32; 15353b3855bSDerek Schuff Table[RTLIB::NEG_I64] = i64_func_i64; 15438b42b4aSDan Gohman 15553b3855bSDerek Schuff // Floating-point. 15653b3855bSDerek Schuff // All F80 and PPCF128 routines are unsupported. 15753b3855bSDerek Schuff Table[RTLIB::ADD_F32] = f32_func_f32_f32; 15853b3855bSDerek Schuff Table[RTLIB::ADD_F64] = f64_func_f64_f64; 15953b3855bSDerek Schuff Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64; 16053b3855bSDerek Schuff Table[RTLIB::SUB_F32] = f32_func_f32_f32; 16153b3855bSDerek Schuff Table[RTLIB::SUB_F64] = f64_func_f64_f64; 16253b3855bSDerek Schuff Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64; 16353b3855bSDerek Schuff Table[RTLIB::MUL_F32] = f32_func_f32_f32; 16453b3855bSDerek Schuff Table[RTLIB::MUL_F64] = f64_func_f64_f64; 16553b3855bSDerek Schuff Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64; 16653b3855bSDerek Schuff Table[RTLIB::DIV_F32] = f32_func_f32_f32; 16753b3855bSDerek Schuff Table[RTLIB::DIV_F64] = f64_func_f64_f64; 16853b3855bSDerek Schuff Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64; 16953b3855bSDerek Schuff Table[RTLIB::REM_F32] = f32_func_f32_f32; 17053b3855bSDerek Schuff Table[RTLIB::REM_F64] = f64_func_f64_f64; 17153b3855bSDerek Schuff Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64; 17253b3855bSDerek Schuff Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32; 17353b3855bSDerek Schuff Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64; 17453b3855bSDerek Schuff Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64; 17553b3855bSDerek Schuff Table[RTLIB::POWI_F32] = f32_func_f32_i32; 17653b3855bSDerek Schuff Table[RTLIB::POWI_F64] = f64_func_f64_i32; 177caeb6cfbSSam Clegg Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i32; 17853b3855bSDerek Schuff Table[RTLIB::SQRT_F32] = f32_func_f32; 17953b3855bSDerek Schuff Table[RTLIB::SQRT_F64] = f64_func_f64; 18053b3855bSDerek Schuff Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64; 181*e252293dSThomas Lively Table[RTLIB::CBRT_F32] = f32_func_f32; 182*e252293dSThomas Lively Table[RTLIB::CBRT_F64] = f64_func_f64; 183*e252293dSThomas Lively Table[RTLIB::CBRT_F128] = func_iPTR_i64_i64; 18453b3855bSDerek Schuff Table[RTLIB::LOG_F32] = f32_func_f32; 18553b3855bSDerek Schuff Table[RTLIB::LOG_F64] = f64_func_f64; 18653b3855bSDerek Schuff Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; 18753b3855bSDerek Schuff Table[RTLIB::LOG2_F32] = f32_func_f32; 18853b3855bSDerek Schuff Table[RTLIB::LOG2_F64] = f64_func_f64; 18953b3855bSDerek Schuff Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; 19053b3855bSDerek Schuff Table[RTLIB::LOG10_F32] = f32_func_f32; 19153b3855bSDerek Schuff Table[RTLIB::LOG10_F64] = f64_func_f64; 19253b3855bSDerek Schuff Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; 19353b3855bSDerek Schuff Table[RTLIB::EXP_F32] = f32_func_f32; 19453b3855bSDerek Schuff Table[RTLIB::EXP_F64] = f64_func_f64; 19553b3855bSDerek Schuff Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; 19653b3855bSDerek Schuff Table[RTLIB::EXP2_F32] = f32_func_f32; 19753b3855bSDerek Schuff Table[RTLIB::EXP2_F64] = f64_func_f64; 19853b3855bSDerek Schuff Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; 19953b3855bSDerek Schuff Table[RTLIB::SIN_F32] = f32_func_f32; 20053b3855bSDerek Schuff Table[RTLIB::SIN_F64] = f64_func_f64; 20153b3855bSDerek Schuff Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; 20253b3855bSDerek Schuff Table[RTLIB::COS_F32] = f32_func_f32; 20353b3855bSDerek Schuff Table[RTLIB::COS_F64] = f64_func_f64; 20453b3855bSDerek Schuff Table[RTLIB::COS_F128] = func_iPTR_i64_i64; 20553b3855bSDerek Schuff Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; 20653b3855bSDerek Schuff Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; 20753b3855bSDerek Schuff Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; 20853b3855bSDerek Schuff Table[RTLIB::POW_F32] = f32_func_f32_f32; 20953b3855bSDerek Schuff Table[RTLIB::POW_F64] = f64_func_f64_f64; 21053b3855bSDerek Schuff Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; 21153b3855bSDerek Schuff Table[RTLIB::CEIL_F32] = f32_func_f32; 21253b3855bSDerek Schuff Table[RTLIB::CEIL_F64] = f64_func_f64; 21353b3855bSDerek Schuff Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; 21453b3855bSDerek Schuff Table[RTLIB::TRUNC_F32] = f32_func_f32; 21553b3855bSDerek Schuff Table[RTLIB::TRUNC_F64] = f64_func_f64; 21653b3855bSDerek Schuff Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; 21753b3855bSDerek Schuff Table[RTLIB::RINT_F32] = f32_func_f32; 21853b3855bSDerek Schuff Table[RTLIB::RINT_F64] = f64_func_f64; 21953b3855bSDerek Schuff Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; 22053b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F32] = f32_func_f32; 22153b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F64] = f64_func_f64; 22253b3855bSDerek Schuff Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; 22353b3855bSDerek Schuff Table[RTLIB::ROUND_F32] = f32_func_f32; 22453b3855bSDerek Schuff Table[RTLIB::ROUND_F64] = f64_func_f64; 22553b3855bSDerek Schuff Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; 226a49496fbSDan Gohman Table[RTLIB::LROUND_F32] = iPTR_func_f32; 227a49496fbSDan Gohman Table[RTLIB::LROUND_F64] = iPTR_func_f64; 228a49496fbSDan Gohman Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64; 229a49496fbSDan Gohman Table[RTLIB::LLROUND_F32] = i64_func_f32; 230a49496fbSDan Gohman Table[RTLIB::LLROUND_F64] = i64_func_f64; 231a49496fbSDan Gohman Table[RTLIB::LLROUND_F128] = i64_func_i64_i64; 23226d711beSThomas Lively Table[RTLIB::LRINT_F32] = iPTR_func_f32; 23326d711beSThomas Lively Table[RTLIB::LRINT_F64] = iPTR_func_f64; 23426d711beSThomas Lively Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64; 23526d711beSThomas Lively Table[RTLIB::LLRINT_F32] = i64_func_f32; 23626d711beSThomas Lively Table[RTLIB::LLRINT_F64] = i64_func_f64; 23726d711beSThomas Lively Table[RTLIB::LLRINT_F128] = i64_func_i64_i64; 23853b3855bSDerek Schuff Table[RTLIB::FLOOR_F32] = f32_func_f32; 23953b3855bSDerek Schuff Table[RTLIB::FLOOR_F64] = f64_func_f64; 24053b3855bSDerek Schuff Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; 24153b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; 24253b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; 24353b3855bSDerek Schuff Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; 24453b3855bSDerek Schuff Table[RTLIB::FMIN_F32] = f32_func_f32_f32; 24553b3855bSDerek Schuff Table[RTLIB::FMIN_F64] = f64_func_f64_f64; 24653b3855bSDerek Schuff Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; 24753b3855bSDerek Schuff Table[RTLIB::FMAX_F32] = f32_func_f32_f32; 24853b3855bSDerek Schuff Table[RTLIB::FMAX_F64] = f64_func_f64_f64; 24953b3855bSDerek Schuff Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; 25038b42b4aSDan Gohman 25153b3855bSDerek Schuff // Conversion 2523a7532e6SDan Gohman // All F80 and PPCF128 routines are unsupported. 25353b3855bSDerek Schuff Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; 25453b3855bSDerek Schuff Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; 25553b3855bSDerek Schuff Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; 25653b3855bSDerek Schuff Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; 25753b3855bSDerek Schuff Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; 2583a7532e6SDan Gohman Table[RTLIB::FPROUND_F64_F16] = i16_func_f64; 25953b3855bSDerek Schuff Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; 2603a7532e6SDan Gohman Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64; 26153b3855bSDerek Schuff Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; 26253b3855bSDerek Schuff Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; 26353b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; 26453b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; 26553b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; 26653b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; 26753b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; 26853b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; 26953b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; 27053b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; 27153b3855bSDerek Schuff Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; 27253b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; 27353b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; 27453b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; 27553b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; 27653b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; 27753b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; 27853b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; 27953b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; 28053b3855bSDerek Schuff Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; 28153b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; 28253b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; 28353b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; 28453b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; 28553b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; 28653b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; 28753b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; 28853b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; 28953b3855bSDerek Schuff Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; 29053b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; 29153b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; 29253b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; 29353b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; 29453b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; 29553b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; 29653b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; 29753b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; 29853b3855bSDerek Schuff Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; 29938b42b4aSDan Gohman 30053b3855bSDerek Schuff // Comparison 30153b3855bSDerek Schuff // ALl F80 and PPCF128 routines are unsupported. 30253b3855bSDerek Schuff Table[RTLIB::OEQ_F32] = i32_func_f32_f32; 30353b3855bSDerek Schuff Table[RTLIB::OEQ_F64] = i32_func_f64_f64; 30453b3855bSDerek Schuff Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; 30553b3855bSDerek Schuff Table[RTLIB::UNE_F32] = i32_func_f32_f32; 30653b3855bSDerek Schuff Table[RTLIB::UNE_F64] = i32_func_f64_f64; 30753b3855bSDerek Schuff Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; 30853b3855bSDerek Schuff Table[RTLIB::OGE_F32] = i32_func_f32_f32; 30953b3855bSDerek Schuff Table[RTLIB::OGE_F64] = i32_func_f64_f64; 31053b3855bSDerek Schuff Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; 31153b3855bSDerek Schuff Table[RTLIB::OLT_F32] = i32_func_f32_f32; 31253b3855bSDerek Schuff Table[RTLIB::OLT_F64] = i32_func_f64_f64; 31353b3855bSDerek Schuff Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; 31453b3855bSDerek Schuff Table[RTLIB::OLE_F32] = i32_func_f32_f32; 31553b3855bSDerek Schuff Table[RTLIB::OLE_F64] = i32_func_f64_f64; 31653b3855bSDerek Schuff Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; 31753b3855bSDerek Schuff Table[RTLIB::OGT_F32] = i32_func_f32_f32; 31853b3855bSDerek Schuff Table[RTLIB::OGT_F64] = i32_func_f64_f64; 31953b3855bSDerek Schuff Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; 32053b3855bSDerek Schuff Table[RTLIB::UO_F32] = i32_func_f32_f32; 32153b3855bSDerek Schuff Table[RTLIB::UO_F64] = i32_func_f64_f64; 32253b3855bSDerek Schuff Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; 32338b42b4aSDan Gohman 32453b3855bSDerek Schuff // Memory 32553b3855bSDerek Schuff Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 32653b3855bSDerek Schuff Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 32753b3855bSDerek Schuff Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 32838b42b4aSDan Gohman 3298306cb57SDan Gohman // __stack_chk_fail 3308306cb57SDan Gohman Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func; 3318306cb57SDan Gohman 3321a3cbe72SThomas Lively // Return address handling 3331a3cbe72SThomas Lively Table[RTLIB::RETURN_ADDRESS] = i32_func_i32; 3341a3cbe72SThomas Lively 33553b3855bSDerek Schuff // Element-wise Atomic memory 33653b3855bSDerek Schuff // TODO: Fix these when we implement atomic support 33753b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 33853b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 33953b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 34053b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 34153b3855bSDerek Schuff Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 34253b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 34353b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 34453b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 34553b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 34653b3855bSDerek Schuff Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 347c855c728SDaniel Neilson 34853b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 34953b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 35053b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 35153b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 35253b3855bSDerek Schuff Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 35338b42b4aSDan Gohman 35438b42b4aSDan Gohman // Atomic '__sync_*' libcalls. 35553b3855bSDerek Schuff // TODO: Fix these when we implement atomic support 35653b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 35753b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 35853b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 35953b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 36053b3855bSDerek Schuff Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 36153b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 36253b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 36353b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 36453b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 36553b3855bSDerek Schuff Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 36653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 36753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 36853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 36953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 37053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 37153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 37253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 37353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 37453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 37553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 37653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 37753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 37853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 37953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 38053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 38153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 38253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 38353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 38453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 38553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 38653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 38753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 38853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 38953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 39053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 39153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 39253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 39353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 39453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 39553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 39653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 39753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 39853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 39953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 40053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 40153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 40253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 40353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 40453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 40553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 40653b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 40753b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 40853b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 40953b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 41053b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 41153b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 41253b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 41353b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 41453b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 41553b3855bSDerek Schuff Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 41638b42b4aSDan Gohman 41738b42b4aSDan Gohman // Atomic '__atomic_*' libcalls. 41853b3855bSDerek Schuff // TODO: Fix these when we implement atomic support 41953b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD] = unsupported; 42053b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 42153b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 42253b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 42353b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 42453b3855bSDerek Schuff Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 42538b42b4aSDan Gohman 42653b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE] = unsupported; 42753b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_1] = unsupported; 42853b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_2] = unsupported; 42953b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_4] = unsupported; 43053b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_8] = unsupported; 43153b3855bSDerek Schuff Table[RTLIB::ATOMIC_STORE_16] = unsupported; 43238b42b4aSDan Gohman 43353b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 43453b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 43553b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 43653b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 43753b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 43853b3855bSDerek Schuff Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 43938b42b4aSDan Gohman 44053b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 44153b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 44253b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 44353b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 44453b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 44553b3855bSDerek Schuff Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 44638b42b4aSDan Gohman 44753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 44853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 44953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 45053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 45153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 45238b42b4aSDan Gohman 45353b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 45453b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 45553b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 45653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 45753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 45838b42b4aSDan Gohman 45953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 46053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 46153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 46253b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 46353b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 46438b42b4aSDan Gohman 46553b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 46653b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 46753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 46853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 46953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 47038b42b4aSDan Gohman 47153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 47253b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 47353b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 47453b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 47553b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 47638b42b4aSDan Gohman 47753b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 47853b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 47953b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 48053b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 48153b3855bSDerek Schuff Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 48253b3855bSDerek Schuff } 48338b42b4aSDan Gohman }; 48438b42b4aSDan Gohman 485bfb02aecSDerek Schuff ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures; 48638b42b4aSDan Gohman 48753b3855bSDerek Schuff // Maps libcall names to their RTLIB::Libcall number. Builds the map in a 48853b3855bSDerek Schuff // constructor for use with ManagedStatic 48953b3855bSDerek Schuff struct StaticLibcallNameMap { 49053b3855bSDerek Schuff StringMap<RTLIB::Libcall> Map; 49153b3855bSDerek Schuff StaticLibcallNameMap() { 492b84e158dSBenjamin Kramer static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = { 493ae87f86eSBenjamin Kramer #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code}, 494e06bac47SPeter Collingbourne #include "llvm/IR/RuntimeLibcalls.def" 49553b3855bSDerek Schuff #undef HANDLE_LIBCALL 496ae87f86eSBenjamin Kramer }; 497ae87f86eSBenjamin Kramer for (const auto &NameLibcall : NameLibcalls) { 498ae87f86eSBenjamin Kramer if (NameLibcall.first != nullptr && 499ae87f86eSBenjamin Kramer RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) { 500ae87f86eSBenjamin Kramer assert(Map.find(NameLibcall.first) == Map.end() && 501ae87f86eSBenjamin Kramer "duplicate libcall names in name map"); 502ae87f86eSBenjamin Kramer Map[NameLibcall.first] = NameLibcall.second; 503ae87f86eSBenjamin Kramer } 504ae87f86eSBenjamin Kramer } 5053a7532e6SDan Gohman // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is 5063a7532e6SDan Gohman // consistent with the f64 and f128 names. 5073a7532e6SDan Gohman Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32; 5083a7532e6SDan Gohman Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16; 5091a3cbe72SThomas Lively 5101a3cbe72SThomas Lively Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS; 51153b3855bSDerek Schuff } 51238b42b4aSDan Gohman }; 51338b42b4aSDan Gohman 51453b3855bSDerek Schuff } // end anonymous namespace 51553b3855bSDerek Schuff 51618c56a07SHeejin Ahn void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 51770ce1af9SDerek Schuff RTLIB::Libcall LC, 51870ce1af9SDerek Schuff SmallVectorImpl<wasm::ValType> &Rets, 519e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) { 52038b42b4aSDan Gohman assert(Rets.empty()); 52138b42b4aSDan Gohman assert(Params.empty()); 52238b42b4aSDan Gohman 52318c56a07SHeejin Ahn wasm::ValType PtrTy = 524bd1716aeSSam Clegg Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 52538b42b4aSDan Gohman 52653b3855bSDerek Schuff auto &Table = RuntimeLibcallSignatures->Table; 52753b3855bSDerek Schuff switch (Table[LC]) { 52838b42b4aSDan Gohman case func: 52938b42b4aSDan Gohman break; 53038b42b4aSDan Gohman case f32_func_f32: 531e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 532e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 53338b42b4aSDan Gohman break; 53438b42b4aSDan Gohman case f32_func_f64: 535e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 536e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 53738b42b4aSDan Gohman break; 53838b42b4aSDan Gohman case f32_func_i32: 539e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 540e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 54138b42b4aSDan Gohman break; 54238b42b4aSDan Gohman case f32_func_i64: 543e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 544e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 54538b42b4aSDan Gohman break; 54638b42b4aSDan Gohman case f32_func_i16: 547e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 548e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 54938b42b4aSDan Gohman break; 55038b42b4aSDan Gohman case f64_func_f32: 551e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 552e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 55338b42b4aSDan Gohman break; 55438b42b4aSDan Gohman case f64_func_f64: 555e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 556e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 55738b42b4aSDan Gohman break; 55838b42b4aSDan Gohman case f64_func_i32: 559e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 560e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 56138b42b4aSDan Gohman break; 56238b42b4aSDan Gohman case f64_func_i64: 563e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 564e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 56538b42b4aSDan Gohman break; 56638b42b4aSDan Gohman case i32_func_f32: 567e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 568e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 56938b42b4aSDan Gohman break; 57038b42b4aSDan Gohman case i32_func_f64: 571e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 572e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 57338b42b4aSDan Gohman break; 57438b42b4aSDan Gohman case i32_func_i32: 575e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 576e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 57738b42b4aSDan Gohman break; 57838b42b4aSDan Gohman case i64_func_f32: 579e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 580e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 58138b42b4aSDan Gohman break; 58238b42b4aSDan Gohman case i64_func_f64: 583e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 584e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 58538b42b4aSDan Gohman break; 58638b42b4aSDan Gohman case i64_func_i64: 587e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 588e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 58938b42b4aSDan Gohman break; 59038b42b4aSDan Gohman case f32_func_f32_f32: 591e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 592e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 593e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 59438b42b4aSDan Gohman break; 59538b42b4aSDan Gohman case f32_func_f32_i32: 596e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 597e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 598e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 59938b42b4aSDan Gohman break; 60038b42b4aSDan Gohman case f32_func_i64_i64: 601e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 602e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 603e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 60438b42b4aSDan Gohman break; 60538b42b4aSDan Gohman case f64_func_f64_f64: 606e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 607e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 608e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 60938b42b4aSDan Gohman break; 61038b42b4aSDan Gohman case f64_func_f64_i32: 611e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 612e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 613e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 61438b42b4aSDan Gohman break; 61538b42b4aSDan Gohman case f64_func_i64_i64: 616e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 617e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 618e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 61938b42b4aSDan Gohman break; 62038b42b4aSDan Gohman case i16_func_f32: 621e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 622e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 62338b42b4aSDan Gohman break; 6243a7532e6SDan Gohman case i16_func_f64: 6253a7532e6SDan Gohman Rets.push_back(wasm::ValType::I32); 6263a7532e6SDan Gohman Params.push_back(wasm::ValType::F64); 6273a7532e6SDan Gohman break; 6283a7532e6SDan Gohman case i16_func_i64_i64: 6293a7532e6SDan Gohman Rets.push_back(wasm::ValType::I32); 6303a7532e6SDan Gohman Params.push_back(wasm::ValType::I64); 6313a7532e6SDan Gohman Params.push_back(wasm::ValType::I64); 6323a7532e6SDan Gohman break; 63338b42b4aSDan Gohman case i8_func_i8_i8: 634e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 635e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 636e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 63738b42b4aSDan Gohman break; 63838b42b4aSDan Gohman case func_f32_iPTR_iPTR: 639e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 64018c56a07SHeejin Ahn Params.push_back(PtrTy); 64118c56a07SHeejin Ahn Params.push_back(PtrTy); 64238b42b4aSDan Gohman break; 64338b42b4aSDan Gohman case func_f64_iPTR_iPTR: 644e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 64518c56a07SHeejin Ahn Params.push_back(PtrTy); 64618c56a07SHeejin Ahn Params.push_back(PtrTy); 64738b42b4aSDan Gohman break; 64838b42b4aSDan Gohman case i16_func_i16_i16: 649e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 650e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 651e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 65238b42b4aSDan Gohman break; 65338b42b4aSDan Gohman case i32_func_f32_f32: 654e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 655e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 656e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 65738b42b4aSDan Gohman break; 65838b42b4aSDan Gohman case i32_func_f64_f64: 659e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 660e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 661e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 66238b42b4aSDan Gohman break; 66338b42b4aSDan Gohman case i32_func_i32_i32: 664e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 665e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 666e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 66738b42b4aSDan Gohman break; 668b17de645SDan Gohman case i32_func_i32_i32_iPTR: 669b17de645SDan Gohman Rets.push_back(wasm::ValType::I32); 670b17de645SDan Gohman Params.push_back(wasm::ValType::I32); 671b17de645SDan Gohman Params.push_back(wasm::ValType::I32); 67218c56a07SHeejin Ahn Params.push_back(PtrTy); 673b17de645SDan Gohman break; 67438b42b4aSDan Gohman case i64_func_i64_i64: 675e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 676e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 677e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 67838b42b4aSDan Gohman break; 679b17de645SDan Gohman case i64_func_i64_i64_iPTR: 680b17de645SDan Gohman Rets.push_back(wasm::ValType::I64); 681b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 682b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 68318c56a07SHeejin Ahn Params.push_back(PtrTy); 684b17de645SDan Gohman break; 68538b42b4aSDan Gohman case i64_i64_func_f32: 68638b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 687e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 688e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 68938b42b4aSDan Gohman #else 69018c56a07SHeejin Ahn Params.push_back(PtrTy); 69138b42b4aSDan Gohman #endif 692e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 69338b42b4aSDan Gohman break; 69438b42b4aSDan Gohman case i64_i64_func_f64: 69538b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 696e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 697e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 69838b42b4aSDan Gohman #else 69918c56a07SHeejin Ahn Params.push_back(PtrTy); 70038b42b4aSDan Gohman #endif 701e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 70238b42b4aSDan Gohman break; 70338b42b4aSDan Gohman case i16_i16_func_i16_i16: 70438b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 705e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 706e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 70738b42b4aSDan Gohman #else 70818c56a07SHeejin Ahn Params.push_back(PtrTy); 70938b42b4aSDan Gohman #endif 710e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 711e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 71238b42b4aSDan Gohman break; 71338b42b4aSDan Gohman case i32_i32_func_i32_i32: 71438b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 715e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 716e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 71738b42b4aSDan Gohman #else 71818c56a07SHeejin Ahn Params.push_back(PtrTy); 71938b42b4aSDan Gohman #endif 720e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 721e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 72238b42b4aSDan Gohman break; 72338b42b4aSDan Gohman case i64_i64_func_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); 72738b42b4aSDan Gohman #else 72818c56a07SHeejin Ahn Params.push_back(PtrTy); 72938b42b4aSDan Gohman #endif 730e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 731e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 73238b42b4aSDan Gohman break; 73338b42b4aSDan Gohman case i64_i64_func_i64_i64_i64_i64: 73438b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 735e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 736e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 73738b42b4aSDan Gohman #else 73818c56a07SHeejin Ahn Params.push_back(PtrTy); 73938b42b4aSDan Gohman #endif 740e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 741e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 742e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 743e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 74438b42b4aSDan Gohman break; 745b17de645SDan Gohman case i64_i64_func_i64_i64_i64_i64_iPTR: 746b17de645SDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 747b17de645SDan Gohman Rets.push_back(wasm::ValType::I64); 748b17de645SDan Gohman Rets.push_back(wasm::ValType::I64); 749b17de645SDan Gohman #else 75018c56a07SHeejin Ahn Params.push_back(PtrTy); 751b17de645SDan Gohman #endif 752b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 753b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 754b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 755b17de645SDan Gohman Params.push_back(wasm::ValType::I64); 75618c56a07SHeejin Ahn Params.push_back(PtrTy); 757b17de645SDan Gohman break; 75838b42b4aSDan Gohman case i64_i64_i64_i64_func_i64_i64_i64_i64: 75938b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 760e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 761e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 762e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 763e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 76438b42b4aSDan Gohman #else 76518c56a07SHeejin Ahn Params.push_back(PtrTy); 76638b42b4aSDan Gohman #endif 767e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 768e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 769e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 770e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 77138b42b4aSDan Gohman break; 77238b42b4aSDan Gohman case i64_i64_func_i64_i64_i32: 77338b42b4aSDan Gohman #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 774e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 775e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 776e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 777e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I64); 77838b42b4aSDan Gohman #else 77918c56a07SHeejin Ahn Params.push_back(PtrTy); 78038b42b4aSDan Gohman #endif 781e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 782e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 783e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 78438b42b4aSDan Gohman break; 78538b42b4aSDan Gohman case iPTR_func_iPTR_i32_iPTR: 78618c56a07SHeejin Ahn Rets.push_back(PtrTy); 78718c56a07SHeejin Ahn Params.push_back(PtrTy); 788e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 78918c56a07SHeejin Ahn Params.push_back(PtrTy); 79038b42b4aSDan Gohman break; 79138b42b4aSDan Gohman case iPTR_func_iPTR_iPTR_iPTR: 79218c56a07SHeejin Ahn Rets.push_back(PtrTy); 79318c56a07SHeejin Ahn Params.push_back(PtrTy); 79418c56a07SHeejin Ahn Params.push_back(PtrTy); 79518c56a07SHeejin Ahn Params.push_back(PtrTy); 79638b42b4aSDan Gohman break; 79738b42b4aSDan Gohman case f32_func_f32_f32_f32: 798e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F32); 799e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 800e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 801e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 80238b42b4aSDan Gohman break; 80338b42b4aSDan Gohman case f64_func_f64_f64_f64: 804e2688c43SDerek Schuff Rets.push_back(wasm::ValType::F64); 805e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 806e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 807e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 80838b42b4aSDan Gohman break; 80938b42b4aSDan Gohman case func_i64_i64_iPTR_iPTR: 810e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 811e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 81218c56a07SHeejin Ahn Params.push_back(PtrTy); 81318c56a07SHeejin Ahn Params.push_back(PtrTy); 81438b42b4aSDan Gohman break; 81538b42b4aSDan Gohman case func_iPTR_f32: 81618c56a07SHeejin Ahn Params.push_back(PtrTy); 817e2688c43SDerek Schuff Params.push_back(wasm::ValType::F32); 81838b42b4aSDan Gohman break; 81938b42b4aSDan Gohman case func_iPTR_f64: 82018c56a07SHeejin Ahn Params.push_back(PtrTy); 821e2688c43SDerek Schuff Params.push_back(wasm::ValType::F64); 82238b42b4aSDan Gohman break; 82338b42b4aSDan Gohman case func_iPTR_i32: 82418c56a07SHeejin Ahn Params.push_back(PtrTy); 825e2688c43SDerek Schuff Params.push_back(wasm::ValType::I32); 82638b42b4aSDan Gohman break; 82738b42b4aSDan Gohman case func_iPTR_i64: 82818c56a07SHeejin Ahn Params.push_back(PtrTy); 829e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 83038b42b4aSDan Gohman break; 83138b42b4aSDan Gohman case func_iPTR_i64_i64: 83218c56a07SHeejin Ahn Params.push_back(PtrTy); 833e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 834e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 83538b42b4aSDan Gohman break; 836caeb6cfbSSam Clegg case func_iPTR_i64_i64_i32: 837caeb6cfbSSam Clegg Params.push_back(PtrTy); 838caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I64); 839caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I64); 840caeb6cfbSSam Clegg Params.push_back(wasm::ValType::I32); 841caeb6cfbSSam Clegg break; 84238b42b4aSDan Gohman case func_iPTR_i64_i64_i64_i64: 84318c56a07SHeejin Ahn Params.push_back(PtrTy); 844e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 845e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 846e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 847e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 84838b42b4aSDan Gohman break; 84938b42b4aSDan Gohman case func_iPTR_i64_i64_i64_i64_i64_i64: 85018c56a07SHeejin Ahn Params.push_back(PtrTy); 851e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 852e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 853e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 854e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 855e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 856e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 85738b42b4aSDan Gohman break; 85838b42b4aSDan Gohman case i32_func_i64_i64: 859e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 860e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 861e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 86238b42b4aSDan Gohman break; 86338b42b4aSDan Gohman case i32_func_i64_i64_i64_i64: 864e2688c43SDerek Schuff Rets.push_back(wasm::ValType::I32); 865e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 866e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 867e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 868e2688c43SDerek Schuff Params.push_back(wasm::ValType::I64); 86938b42b4aSDan Gohman break; 870a49496fbSDan Gohman case iPTR_func_f32: 871a49496fbSDan Gohman Rets.push_back(PtrTy); 872a49496fbSDan Gohman Params.push_back(wasm::ValType::F32); 873a49496fbSDan Gohman break; 874a49496fbSDan Gohman case iPTR_func_f64: 875a49496fbSDan Gohman Rets.push_back(PtrTy); 876a49496fbSDan Gohman Params.push_back(wasm::ValType::F64); 877a49496fbSDan Gohman break; 878a49496fbSDan Gohman case iPTR_func_i64_i64: 879a49496fbSDan Gohman Rets.push_back(PtrTy); 880a49496fbSDan Gohman Params.push_back(wasm::ValType::I64); 881a49496fbSDan Gohman Params.push_back(wasm::ValType::I64); 882a49496fbSDan Gohman break; 88338b42b4aSDan Gohman case unsupported: 88438b42b4aSDan Gohman llvm_unreachable("unsupported runtime library signature"); 88538b42b4aSDan Gohman } 88638b42b4aSDan Gohman } 88738b42b4aSDan Gohman 88853b3855bSDerek Schuff static ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 88953b3855bSDerek Schuff // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 89053b3855bSDerek Schuff // other than here, just roll its logic into this version. 89118c56a07SHeejin Ahn void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 89270ce1af9SDerek Schuff const char *Name, 893e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Rets, 894e2688c43SDerek Schuff SmallVectorImpl<wasm::ValType> &Params) { 89553b3855bSDerek Schuff auto &Map = LibcallNameMap->Map; 89618c56a07SHeejin Ahn auto Val = Map.find(Name); 8978306cb57SDan Gohman #ifndef NDEBUG 8988306cb57SDan Gohman if (Val == Map.end()) { 8998d6e80f9SDan Gohman auto message = std::string("unexpected runtime library name: ") + Name; 9008d6e80f9SDan Gohman llvm_unreachable(message.c_str()); 9018306cb57SDan Gohman } 9028306cb57SDan Gohman #endif 90318c56a07SHeejin Ahn return getLibcallSignature(Subtarget, Val->second, Rets, Params); 90438b42b4aSDan Gohman } 905