WebAssemblyRuntimeLibcallSignatures.cpp revision 353358
1317017Sdim// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- 2317017Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317017Sdim// 7317017Sdim//===----------------------------------------------------------------------===// 8317017Sdim/// 9317017Sdim/// \file 10341825Sdim/// This file contains signature information for runtime libcalls. 11317017Sdim/// 12317017Sdim/// CodeGen uses external symbols, which it refers to by name. The WebAssembly 13317017Sdim/// target needs type information for all functions. This file contains a big 14317017Sdim/// table providing type signatures for all runtime library functions that LLVM 15317017Sdim/// uses. 16317017Sdim/// 17317017Sdim/// This is currently a fairly heavy-handed solution. 18317017Sdim/// 19317017Sdim//===----------------------------------------------------------------------===// 20317017Sdim 21317017Sdim#include "WebAssemblyRuntimeLibcallSignatures.h" 22317017Sdim#include "WebAssemblySubtarget.h" 23317017Sdim#include "llvm/CodeGen/RuntimeLibcalls.h" 24341825Sdim#include "llvm/Support/ManagedStatic.h" 25317017Sdim 26317017Sdimusing namespace llvm; 27317017Sdim 28317017Sdimnamespace { 29317017Sdim 30317017Sdimenum RuntimeLibcallSignature { 31317017Sdim func, 32317017Sdim f32_func_f32, 33317017Sdim f32_func_f64, 34317017Sdim f32_func_i32, 35317017Sdim f32_func_i64, 36317017Sdim f32_func_i16, 37317017Sdim f64_func_f32, 38317017Sdim f64_func_f64, 39317017Sdim f64_func_i32, 40317017Sdim f64_func_i64, 41317017Sdim i32_func_f32, 42317017Sdim i32_func_f64, 43317017Sdim i32_func_i32, 44317017Sdim i64_func_f32, 45317017Sdim i64_func_f64, 46317017Sdim i64_func_i64, 47317017Sdim f32_func_f32_f32, 48317017Sdim f32_func_f32_i32, 49317017Sdim f32_func_i64_i64, 50317017Sdim f64_func_f64_f64, 51317017Sdim f64_func_f64_i32, 52317017Sdim f64_func_i64_i64, 53317017Sdim i16_func_f32, 54353358Sdim i16_func_f64, 55353358Sdim i16_func_i64_i64, 56317017Sdim i8_func_i8_i8, 57317017Sdim func_f32_iPTR_iPTR, 58317017Sdim func_f64_iPTR_iPTR, 59317017Sdim i16_func_i16_i16, 60317017Sdim i32_func_f32_f32, 61317017Sdim i32_func_f64_f64, 62317017Sdim i32_func_i32_i32, 63341825Sdim i32_func_i32_i32_iPTR, 64317017Sdim i64_func_i64_i64, 65341825Sdim i64_func_i64_i64_iPTR, 66317017Sdim i64_i64_func_f32, 67317017Sdim i64_i64_func_f64, 68317017Sdim i16_i16_func_i16_i16, 69317017Sdim i32_i32_func_i32_i32, 70317017Sdim i64_i64_func_i64_i64, 71317017Sdim i64_i64_func_i64_i64_i64_i64, 72341825Sdim i64_i64_func_i64_i64_i64_i64_iPTR, 73317017Sdim i64_i64_i64_i64_func_i64_i64_i64_i64, 74317017Sdim i64_i64_func_i64_i64_i32, 75317017Sdim iPTR_func_iPTR_i32_iPTR, 76317017Sdim iPTR_func_iPTR_iPTR_iPTR, 77317017Sdim f32_func_f32_f32_f32, 78317017Sdim f64_func_f64_f64_f64, 79317017Sdim func_i64_i64_iPTR_iPTR, 80317017Sdim func_iPTR_f32, 81317017Sdim func_iPTR_f64, 82317017Sdim func_iPTR_i32, 83317017Sdim func_iPTR_i64, 84317017Sdim func_iPTR_i64_i64, 85317017Sdim func_iPTR_i64_i64_i64_i64, 86317017Sdim func_iPTR_i64_i64_i64_i64_i64_i64, 87317017Sdim i32_func_i64_i64, 88317017Sdim i32_func_i64_i64_i64_i64, 89353358Sdim iPTR_func_f32, 90353358Sdim iPTR_func_f64, 91353358Sdim iPTR_func_i64_i64, 92317017Sdim unsupported 93317017Sdim}; 94317017Sdim 95341825Sdimstruct RuntimeLibcallSignatureTable { 96341825Sdim std::vector<RuntimeLibcallSignature> Table; 97317017Sdim 98341825Sdim // Any newly-added libcalls will be unsupported by default. 99341825Sdim RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) { 100341825Sdim // Integer 101341825Sdim Table[RTLIB::SHL_I16] = i16_func_i16_i16; 102341825Sdim Table[RTLIB::SHL_I32] = i32_func_i32_i32; 103341825Sdim Table[RTLIB::SHL_I64] = i64_func_i64_i64; 104341825Sdim Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32; 105341825Sdim Table[RTLIB::SRL_I16] = i16_func_i16_i16; 106341825Sdim Table[RTLIB::SRL_I32] = i32_func_i32_i32; 107341825Sdim Table[RTLIB::SRL_I64] = i64_func_i64_i64; 108341825Sdim Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32; 109341825Sdim Table[RTLIB::SRA_I16] = i16_func_i16_i16; 110341825Sdim Table[RTLIB::SRA_I32] = i32_func_i32_i32; 111341825Sdim Table[RTLIB::SRA_I64] = i64_func_i64_i64; 112341825Sdim Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32; 113341825Sdim Table[RTLIB::MUL_I8] = i8_func_i8_i8; 114341825Sdim Table[RTLIB::MUL_I16] = i16_func_i16_i16; 115341825Sdim Table[RTLIB::MUL_I32] = i32_func_i32_i32; 116341825Sdim Table[RTLIB::MUL_I64] = i64_func_i64_i64; 117341825Sdim Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64; 118341825Sdim Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR; 119341825Sdim Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR; 120341825Sdim Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR; 121341825Sdim Table[RTLIB::SDIV_I8] = i8_func_i8_i8; 122341825Sdim Table[RTLIB::SDIV_I16] = i16_func_i16_i16; 123341825Sdim Table[RTLIB::SDIV_I32] = i32_func_i32_i32; 124341825Sdim Table[RTLIB::SDIV_I64] = i64_func_i64_i64; 125341825Sdim Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64; 126341825Sdim Table[RTLIB::UDIV_I8] = i8_func_i8_i8; 127341825Sdim Table[RTLIB::UDIV_I16] = i16_func_i16_i16; 128341825Sdim Table[RTLIB::UDIV_I32] = i32_func_i32_i32; 129341825Sdim Table[RTLIB::UDIV_I64] = i64_func_i64_i64; 130341825Sdim Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64; 131341825Sdim Table[RTLIB::SREM_I8] = i8_func_i8_i8; 132341825Sdim Table[RTLIB::SREM_I16] = i16_func_i16_i16; 133341825Sdim Table[RTLIB::SREM_I32] = i32_func_i32_i32; 134341825Sdim Table[RTLIB::SREM_I64] = i64_func_i64_i64; 135341825Sdim Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64; 136341825Sdim Table[RTLIB::UREM_I8] = i8_func_i8_i8; 137341825Sdim Table[RTLIB::UREM_I16] = i16_func_i16_i16; 138341825Sdim Table[RTLIB::UREM_I32] = i32_func_i32_i32; 139341825Sdim Table[RTLIB::UREM_I64] = i64_func_i64_i64; 140341825Sdim Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64; 141341825Sdim Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8; 142341825Sdim Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16; 143341825Sdim Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32; 144341825Sdim Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64; 145341825Sdim Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 146341825Sdim Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8; 147341825Sdim Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16; 148341825Sdim Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32; 149341825Sdim Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64; 150341825Sdim Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 151341825Sdim Table[RTLIB::NEG_I32] = i32_func_i32; 152341825Sdim Table[RTLIB::NEG_I64] = i64_func_i64; 153317017Sdim 154341825Sdim // Floating-point. 155341825Sdim // All F80 and PPCF128 routines are unsupported. 156341825Sdim Table[RTLIB::ADD_F32] = f32_func_f32_f32; 157341825Sdim Table[RTLIB::ADD_F64] = f64_func_f64_f64; 158341825Sdim Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64; 159341825Sdim Table[RTLIB::SUB_F32] = f32_func_f32_f32; 160341825Sdim Table[RTLIB::SUB_F64] = f64_func_f64_f64; 161341825Sdim Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64; 162341825Sdim Table[RTLIB::MUL_F32] = f32_func_f32_f32; 163341825Sdim Table[RTLIB::MUL_F64] = f64_func_f64_f64; 164341825Sdim Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64; 165341825Sdim Table[RTLIB::DIV_F32] = f32_func_f32_f32; 166341825Sdim Table[RTLIB::DIV_F64] = f64_func_f64_f64; 167341825Sdim Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64; 168341825Sdim Table[RTLIB::REM_F32] = f32_func_f32_f32; 169341825Sdim Table[RTLIB::REM_F64] = f64_func_f64_f64; 170341825Sdim Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64; 171341825Sdim Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32; 172341825Sdim Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64; 173341825Sdim Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64; 174341825Sdim Table[RTLIB::POWI_F32] = f32_func_f32_i32; 175341825Sdim Table[RTLIB::POWI_F64] = f64_func_f64_i32; 176341825Sdim Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64; 177341825Sdim Table[RTLIB::SQRT_F32] = f32_func_f32; 178341825Sdim Table[RTLIB::SQRT_F64] = f64_func_f64; 179341825Sdim Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64; 180341825Sdim Table[RTLIB::LOG_F32] = f32_func_f32; 181341825Sdim Table[RTLIB::LOG_F64] = f64_func_f64; 182341825Sdim Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; 183341825Sdim Table[RTLIB::LOG2_F32] = f32_func_f32; 184341825Sdim Table[RTLIB::LOG2_F64] = f64_func_f64; 185341825Sdim Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; 186341825Sdim Table[RTLIB::LOG10_F32] = f32_func_f32; 187341825Sdim Table[RTLIB::LOG10_F64] = f64_func_f64; 188341825Sdim Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; 189341825Sdim Table[RTLIB::EXP_F32] = f32_func_f32; 190341825Sdim Table[RTLIB::EXP_F64] = f64_func_f64; 191341825Sdim Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; 192341825Sdim Table[RTLIB::EXP2_F32] = f32_func_f32; 193341825Sdim Table[RTLIB::EXP2_F64] = f64_func_f64; 194341825Sdim Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; 195341825Sdim Table[RTLIB::SIN_F32] = f32_func_f32; 196341825Sdim Table[RTLIB::SIN_F64] = f64_func_f64; 197341825Sdim Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; 198341825Sdim Table[RTLIB::COS_F32] = f32_func_f32; 199341825Sdim Table[RTLIB::COS_F64] = f64_func_f64; 200341825Sdim Table[RTLIB::COS_F128] = func_iPTR_i64_i64; 201341825Sdim Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; 202341825Sdim Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; 203341825Sdim Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; 204341825Sdim Table[RTLIB::POW_F32] = f32_func_f32_f32; 205341825Sdim Table[RTLIB::POW_F64] = f64_func_f64_f64; 206341825Sdim Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; 207341825Sdim Table[RTLIB::CEIL_F32] = f32_func_f32; 208341825Sdim Table[RTLIB::CEIL_F64] = f64_func_f64; 209341825Sdim Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; 210341825Sdim Table[RTLIB::TRUNC_F32] = f32_func_f32; 211341825Sdim Table[RTLIB::TRUNC_F64] = f64_func_f64; 212341825Sdim Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; 213341825Sdim Table[RTLIB::RINT_F32] = f32_func_f32; 214341825Sdim Table[RTLIB::RINT_F64] = f64_func_f64; 215341825Sdim Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; 216341825Sdim Table[RTLIB::NEARBYINT_F32] = f32_func_f32; 217341825Sdim Table[RTLIB::NEARBYINT_F64] = f64_func_f64; 218341825Sdim Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; 219341825Sdim Table[RTLIB::ROUND_F32] = f32_func_f32; 220341825Sdim Table[RTLIB::ROUND_F64] = f64_func_f64; 221341825Sdim Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; 222353358Sdim Table[RTLIB::LROUND_F32] = iPTR_func_f32; 223353358Sdim Table[RTLIB::LROUND_F64] = iPTR_func_f64; 224353358Sdim Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64; 225353358Sdim Table[RTLIB::LLROUND_F32] = i64_func_f32; 226353358Sdim Table[RTLIB::LLROUND_F64] = i64_func_f64; 227353358Sdim Table[RTLIB::LLROUND_F128] = i64_func_i64_i64; 228353358Sdim Table[RTLIB::LRINT_F32] = iPTR_func_f32; 229353358Sdim Table[RTLIB::LRINT_F64] = iPTR_func_f64; 230353358Sdim Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64; 231353358Sdim Table[RTLIB::LLRINT_F32] = i64_func_f32; 232353358Sdim Table[RTLIB::LLRINT_F64] = i64_func_f64; 233353358Sdim Table[RTLIB::LLRINT_F128] = i64_func_i64_i64; 234341825Sdim Table[RTLIB::FLOOR_F32] = f32_func_f32; 235341825Sdim Table[RTLIB::FLOOR_F64] = f64_func_f64; 236341825Sdim Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; 237341825Sdim Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; 238341825Sdim Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; 239341825Sdim Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; 240341825Sdim Table[RTLIB::FMIN_F32] = f32_func_f32_f32; 241341825Sdim Table[RTLIB::FMIN_F64] = f64_func_f64_f64; 242341825Sdim Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; 243341825Sdim Table[RTLIB::FMAX_F32] = f32_func_f32_f32; 244341825Sdim Table[RTLIB::FMAX_F64] = f64_func_f64_f64; 245341825Sdim Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; 246317017Sdim 247341825Sdim // Conversion 248353358Sdim // All F80 and PPCF128 routines are unsupported. 249341825Sdim Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; 250341825Sdim Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; 251341825Sdim Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; 252341825Sdim Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; 253341825Sdim Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; 254353358Sdim Table[RTLIB::FPROUND_F64_F16] = i16_func_f64; 255341825Sdim Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; 256353358Sdim Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64; 257341825Sdim Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; 258341825Sdim Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; 259341825Sdim Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; 260341825Sdim Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; 261341825Sdim Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; 262341825Sdim Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; 263341825Sdim Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; 264341825Sdim Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; 265341825Sdim Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; 266341825Sdim Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; 267341825Sdim Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; 268341825Sdim Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; 269341825Sdim Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; 270341825Sdim Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; 271341825Sdim Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; 272341825Sdim Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; 273341825Sdim Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; 274341825Sdim Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; 275341825Sdim Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; 276341825Sdim Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; 277341825Sdim Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; 278341825Sdim Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; 279341825Sdim Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; 280341825Sdim Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; 281341825Sdim Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; 282341825Sdim Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; 283341825Sdim Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; 284341825Sdim Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; 285341825Sdim Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; 286341825Sdim Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; 287341825Sdim Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; 288341825Sdim Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; 289341825Sdim Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; 290341825Sdim Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; 291341825Sdim Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; 292341825Sdim Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; 293341825Sdim Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; 294341825Sdim Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; 295317017Sdim 296341825Sdim // Comparison 297341825Sdim // ALl F80 and PPCF128 routines are unsupported. 298341825Sdim Table[RTLIB::OEQ_F32] = i32_func_f32_f32; 299341825Sdim Table[RTLIB::OEQ_F64] = i32_func_f64_f64; 300341825Sdim Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; 301341825Sdim Table[RTLIB::UNE_F32] = i32_func_f32_f32; 302341825Sdim Table[RTLIB::UNE_F64] = i32_func_f64_f64; 303341825Sdim Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; 304341825Sdim Table[RTLIB::OGE_F32] = i32_func_f32_f32; 305341825Sdim Table[RTLIB::OGE_F64] = i32_func_f64_f64; 306341825Sdim Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; 307341825Sdim Table[RTLIB::OLT_F32] = i32_func_f32_f32; 308341825Sdim Table[RTLIB::OLT_F64] = i32_func_f64_f64; 309341825Sdim Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; 310341825Sdim Table[RTLIB::OLE_F32] = i32_func_f32_f32; 311341825Sdim Table[RTLIB::OLE_F64] = i32_func_f64_f64; 312341825Sdim Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; 313341825Sdim Table[RTLIB::OGT_F32] = i32_func_f32_f32; 314341825Sdim Table[RTLIB::OGT_F64] = i32_func_f64_f64; 315341825Sdim Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; 316341825Sdim Table[RTLIB::UO_F32] = i32_func_f32_f32; 317341825Sdim Table[RTLIB::UO_F64] = i32_func_f64_f64; 318341825Sdim Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; 319341825Sdim // O_FXX has the weird property that it uses the same libcall name as UO_FXX 320341825Sdim // This breaks our name-based lookup. Fortunately only the UO family of 321341825Sdim // libcalls appears to be actually used. 322341825Sdim Table[RTLIB::O_F32] = unsupported; 323341825Sdim Table[RTLIB::O_F64] = unsupported; 324341825Sdim Table[RTLIB::O_F128] = unsupported; 325317017Sdim 326341825Sdim // Memory 327341825Sdim Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 328341825Sdim Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 329341825Sdim Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 330317017Sdim 331353358Sdim // __stack_chk_fail 332353358Sdim Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func; 333353358Sdim 334353358Sdim // Return address handling 335353358Sdim Table[RTLIB::RETURN_ADDRESS] = i32_func_i32; 336353358Sdim 337341825Sdim // Element-wise Atomic memory 338341825Sdim // TODO: Fix these when we implement atomic support 339341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 340341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 341341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 342341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 343341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 344341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 345341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 346341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 347341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 348341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 349320970Sdim 350341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 351341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 352341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 353341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 354341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 355317017Sdim 356341825Sdim // Atomic '__sync_*' libcalls. 357341825Sdim // TODO: Fix these when we implement atomic support 358341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 359341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 360341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 361341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 362341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 363341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 364341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 365341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 366341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 367341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 368341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 369341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 370341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 371341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 372341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 373341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 374341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 375341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 376341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 377341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 378341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 379341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 380341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 381341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 382341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 383341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 384341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 385341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 386341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 387341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 388341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 389341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 390341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 391341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 392341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 393341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 394341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 395341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 396341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 397341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 398341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 399341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 400341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 401341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 402341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 403341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 404341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 405341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 406341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 407341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 408341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 409341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 410341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 411341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 412341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 413341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 414341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 415341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 416341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 417341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 418317017Sdim 419341825Sdim // Atomic '__atomic_*' libcalls. 420341825Sdim // TODO: Fix these when we implement atomic support 421341825Sdim Table[RTLIB::ATOMIC_LOAD] = unsupported; 422341825Sdim Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 423341825Sdim Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 424341825Sdim Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 425341825Sdim Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 426341825Sdim Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 427317017Sdim 428341825Sdim Table[RTLIB::ATOMIC_STORE] = unsupported; 429341825Sdim Table[RTLIB::ATOMIC_STORE_1] = unsupported; 430341825Sdim Table[RTLIB::ATOMIC_STORE_2] = unsupported; 431341825Sdim Table[RTLIB::ATOMIC_STORE_4] = unsupported; 432341825Sdim Table[RTLIB::ATOMIC_STORE_8] = unsupported; 433341825Sdim Table[RTLIB::ATOMIC_STORE_16] = unsupported; 434317017Sdim 435341825Sdim Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 436341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 437341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 438341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 439341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 440341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 441317017Sdim 442341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 443341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 444341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 445341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 446341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 447341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 448317017Sdim 449341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 450341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 451341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 452341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 453341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 454317017Sdim 455341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 456341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 457341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 458341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 459341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 460317017Sdim 461341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 462341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 463341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 464341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 465341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 466317017Sdim 467341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 468341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 469341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 470341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 471341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 472317017Sdim 473341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 474341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 475341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 476341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 477341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 478317017Sdim 479341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 480341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 481341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 482341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 483341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 484341825Sdim } 485341825Sdim}; 486317017Sdim 487341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures; 488317017Sdim 489341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a 490341825Sdim// constructor for use with ManagedStatic 491341825Sdimstruct StaticLibcallNameMap { 492341825Sdim StringMap<RTLIB::Libcall> Map; 493341825Sdim StaticLibcallNameMap() { 494341825Sdim static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = { 495341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code}, 496341825Sdim#include "llvm/IR/RuntimeLibcalls.def" 497341825Sdim#undef HANDLE_LIBCALL 498341825Sdim }; 499341825Sdim for (const auto &NameLibcall : NameLibcalls) { 500341825Sdim if (NameLibcall.first != nullptr && 501341825Sdim RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) { 502341825Sdim assert(Map.find(NameLibcall.first) == Map.end() && 503341825Sdim "duplicate libcall names in name map"); 504341825Sdim Map[NameLibcall.first] = NameLibcall.second; 505341825Sdim } 506341825Sdim } 507353358Sdim // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is 508353358Sdim // consistent with the f64 and f128 names. 509353358Sdim Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32; 510353358Sdim Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16; 511353358Sdim 512353358Sdim Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS; 513341825Sdim } 514317017Sdim}; 515317017Sdim 516341825Sdim} // end anonymous namespace 517317017Sdim 518353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 519344779Sdim RTLIB::Libcall LC, 520344779Sdim SmallVectorImpl<wasm::ValType> &Rets, 521344779Sdim SmallVectorImpl<wasm::ValType> &Params) { 522317017Sdim assert(Rets.empty()); 523317017Sdim assert(Params.empty()); 524317017Sdim 525353358Sdim wasm::ValType PtrTy = 526341825Sdim Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 527317017Sdim 528344779Sdim auto &Table = RuntimeLibcallSignatures->Table; 529341825Sdim switch (Table[LC]) { 530317017Sdim case func: 531317017Sdim break; 532317017Sdim case f32_func_f32: 533317017Sdim Rets.push_back(wasm::ValType::F32); 534317017Sdim Params.push_back(wasm::ValType::F32); 535317017Sdim break; 536317017Sdim case f32_func_f64: 537317017Sdim Rets.push_back(wasm::ValType::F32); 538317017Sdim Params.push_back(wasm::ValType::F64); 539317017Sdim break; 540317017Sdim case f32_func_i32: 541317017Sdim Rets.push_back(wasm::ValType::F32); 542317017Sdim Params.push_back(wasm::ValType::I32); 543317017Sdim break; 544317017Sdim case f32_func_i64: 545317017Sdim Rets.push_back(wasm::ValType::F32); 546317017Sdim Params.push_back(wasm::ValType::I64); 547317017Sdim break; 548317017Sdim case f32_func_i16: 549317017Sdim Rets.push_back(wasm::ValType::F32); 550317017Sdim Params.push_back(wasm::ValType::I32); 551317017Sdim break; 552317017Sdim case f64_func_f32: 553317017Sdim Rets.push_back(wasm::ValType::F64); 554317017Sdim Params.push_back(wasm::ValType::F32); 555317017Sdim break; 556317017Sdim case f64_func_f64: 557317017Sdim Rets.push_back(wasm::ValType::F64); 558317017Sdim Params.push_back(wasm::ValType::F64); 559317017Sdim break; 560317017Sdim case f64_func_i32: 561317017Sdim Rets.push_back(wasm::ValType::F64); 562317017Sdim Params.push_back(wasm::ValType::I32); 563317017Sdim break; 564317017Sdim case f64_func_i64: 565317017Sdim Rets.push_back(wasm::ValType::F64); 566317017Sdim Params.push_back(wasm::ValType::I64); 567317017Sdim break; 568317017Sdim case i32_func_f32: 569317017Sdim Rets.push_back(wasm::ValType::I32); 570317017Sdim Params.push_back(wasm::ValType::F32); 571317017Sdim break; 572317017Sdim case i32_func_f64: 573317017Sdim Rets.push_back(wasm::ValType::I32); 574317017Sdim Params.push_back(wasm::ValType::F64); 575317017Sdim break; 576317017Sdim case i32_func_i32: 577317017Sdim Rets.push_back(wasm::ValType::I32); 578317017Sdim Params.push_back(wasm::ValType::I32); 579317017Sdim break; 580317017Sdim case i64_func_f32: 581317017Sdim Rets.push_back(wasm::ValType::I64); 582317017Sdim Params.push_back(wasm::ValType::F32); 583317017Sdim break; 584317017Sdim case i64_func_f64: 585317017Sdim Rets.push_back(wasm::ValType::I64); 586317017Sdim Params.push_back(wasm::ValType::F64); 587317017Sdim break; 588317017Sdim case i64_func_i64: 589317017Sdim Rets.push_back(wasm::ValType::I64); 590317017Sdim Params.push_back(wasm::ValType::I64); 591317017Sdim break; 592317017Sdim case f32_func_f32_f32: 593317017Sdim Rets.push_back(wasm::ValType::F32); 594317017Sdim Params.push_back(wasm::ValType::F32); 595317017Sdim Params.push_back(wasm::ValType::F32); 596317017Sdim break; 597317017Sdim case f32_func_f32_i32: 598317017Sdim Rets.push_back(wasm::ValType::F32); 599317017Sdim Params.push_back(wasm::ValType::F32); 600317017Sdim Params.push_back(wasm::ValType::I32); 601317017Sdim break; 602317017Sdim case f32_func_i64_i64: 603317017Sdim Rets.push_back(wasm::ValType::F32); 604317017Sdim Params.push_back(wasm::ValType::I64); 605317017Sdim Params.push_back(wasm::ValType::I64); 606317017Sdim break; 607317017Sdim case f64_func_f64_f64: 608317017Sdim Rets.push_back(wasm::ValType::F64); 609317017Sdim Params.push_back(wasm::ValType::F64); 610317017Sdim Params.push_back(wasm::ValType::F64); 611317017Sdim break; 612317017Sdim case f64_func_f64_i32: 613317017Sdim Rets.push_back(wasm::ValType::F64); 614317017Sdim Params.push_back(wasm::ValType::F64); 615317017Sdim Params.push_back(wasm::ValType::I32); 616317017Sdim break; 617317017Sdim case f64_func_i64_i64: 618317017Sdim Rets.push_back(wasm::ValType::F64); 619317017Sdim Params.push_back(wasm::ValType::I64); 620317017Sdim Params.push_back(wasm::ValType::I64); 621317017Sdim break; 622317017Sdim case i16_func_f32: 623317017Sdim Rets.push_back(wasm::ValType::I32); 624317017Sdim Params.push_back(wasm::ValType::F32); 625317017Sdim break; 626353358Sdim case i16_func_f64: 627353358Sdim Rets.push_back(wasm::ValType::I32); 628353358Sdim Params.push_back(wasm::ValType::F64); 629353358Sdim break; 630353358Sdim case i16_func_i64_i64: 631353358Sdim Rets.push_back(wasm::ValType::I32); 632353358Sdim Params.push_back(wasm::ValType::I64); 633353358Sdim Params.push_back(wasm::ValType::I64); 634353358Sdim break; 635317017Sdim case i8_func_i8_i8: 636317017Sdim Rets.push_back(wasm::ValType::I32); 637317017Sdim Params.push_back(wasm::ValType::I32); 638317017Sdim Params.push_back(wasm::ValType::I32); 639317017Sdim break; 640317017Sdim case func_f32_iPTR_iPTR: 641317017Sdim Params.push_back(wasm::ValType::F32); 642353358Sdim Params.push_back(PtrTy); 643353358Sdim Params.push_back(PtrTy); 644317017Sdim break; 645317017Sdim case func_f64_iPTR_iPTR: 646317017Sdim Params.push_back(wasm::ValType::F64); 647353358Sdim Params.push_back(PtrTy); 648353358Sdim Params.push_back(PtrTy); 649317017Sdim break; 650317017Sdim case i16_func_i16_i16: 651317017Sdim Rets.push_back(wasm::ValType::I32); 652317017Sdim Params.push_back(wasm::ValType::I32); 653317017Sdim Params.push_back(wasm::ValType::I32); 654317017Sdim break; 655317017Sdim case i32_func_f32_f32: 656317017Sdim Rets.push_back(wasm::ValType::I32); 657317017Sdim Params.push_back(wasm::ValType::F32); 658317017Sdim Params.push_back(wasm::ValType::F32); 659317017Sdim break; 660317017Sdim case i32_func_f64_f64: 661317017Sdim Rets.push_back(wasm::ValType::I32); 662317017Sdim Params.push_back(wasm::ValType::F64); 663317017Sdim Params.push_back(wasm::ValType::F64); 664317017Sdim break; 665317017Sdim case i32_func_i32_i32: 666317017Sdim Rets.push_back(wasm::ValType::I32); 667317017Sdim Params.push_back(wasm::ValType::I32); 668317017Sdim Params.push_back(wasm::ValType::I32); 669317017Sdim break; 670341825Sdim case i32_func_i32_i32_iPTR: 671341825Sdim Rets.push_back(wasm::ValType::I32); 672341825Sdim Params.push_back(wasm::ValType::I32); 673341825Sdim Params.push_back(wasm::ValType::I32); 674353358Sdim Params.push_back(PtrTy); 675341825Sdim break; 676317017Sdim case i64_func_i64_i64: 677317017Sdim Rets.push_back(wasm::ValType::I64); 678317017Sdim Params.push_back(wasm::ValType::I64); 679317017Sdim Params.push_back(wasm::ValType::I64); 680317017Sdim break; 681341825Sdim case i64_func_i64_i64_iPTR: 682341825Sdim Rets.push_back(wasm::ValType::I64); 683341825Sdim Params.push_back(wasm::ValType::I64); 684341825Sdim Params.push_back(wasm::ValType::I64); 685353358Sdim Params.push_back(PtrTy); 686341825Sdim break; 687317017Sdim case i64_i64_func_f32: 688317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 689317017Sdim Rets.push_back(wasm::ValType::I64); 690317017Sdim Rets.push_back(wasm::ValType::I64); 691317017Sdim#else 692353358Sdim Params.push_back(PtrTy); 693317017Sdim#endif 694317017Sdim Params.push_back(wasm::ValType::F32); 695317017Sdim break; 696317017Sdim case i64_i64_func_f64: 697317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 698317017Sdim Rets.push_back(wasm::ValType::I64); 699317017Sdim Rets.push_back(wasm::ValType::I64); 700317017Sdim#else 701353358Sdim Params.push_back(PtrTy); 702317017Sdim#endif 703317017Sdim Params.push_back(wasm::ValType::F64); 704317017Sdim break; 705317017Sdim case i16_i16_func_i16_i16: 706317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 707317017Sdim Rets.push_back(wasm::ValType::I32); 708317017Sdim Rets.push_back(wasm::ValType::I32); 709317017Sdim#else 710353358Sdim Params.push_back(PtrTy); 711317017Sdim#endif 712317017Sdim Params.push_back(wasm::ValType::I32); 713317017Sdim Params.push_back(wasm::ValType::I32); 714317017Sdim break; 715317017Sdim case i32_i32_func_i32_i32: 716317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 717317017Sdim Rets.push_back(wasm::ValType::I32); 718317017Sdim Rets.push_back(wasm::ValType::I32); 719317017Sdim#else 720353358Sdim Params.push_back(PtrTy); 721317017Sdim#endif 722317017Sdim Params.push_back(wasm::ValType::I32); 723317017Sdim Params.push_back(wasm::ValType::I32); 724317017Sdim break; 725317017Sdim case i64_i64_func_i64_i64: 726317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 727317017Sdim Rets.push_back(wasm::ValType::I64); 728317017Sdim Rets.push_back(wasm::ValType::I64); 729317017Sdim#else 730353358Sdim Params.push_back(PtrTy); 731317017Sdim#endif 732317017Sdim Params.push_back(wasm::ValType::I64); 733317017Sdim Params.push_back(wasm::ValType::I64); 734317017Sdim break; 735317017Sdim case i64_i64_func_i64_i64_i64_i64: 736317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 737317017Sdim Rets.push_back(wasm::ValType::I64); 738317017Sdim Rets.push_back(wasm::ValType::I64); 739317017Sdim#else 740353358Sdim Params.push_back(PtrTy); 741317017Sdim#endif 742317017Sdim Params.push_back(wasm::ValType::I64); 743317017Sdim Params.push_back(wasm::ValType::I64); 744317017Sdim Params.push_back(wasm::ValType::I64); 745317017Sdim Params.push_back(wasm::ValType::I64); 746317017Sdim break; 747341825Sdim case i64_i64_func_i64_i64_i64_i64_iPTR: 748341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 749341825Sdim Rets.push_back(wasm::ValType::I64); 750341825Sdim Rets.push_back(wasm::ValType::I64); 751341825Sdim#else 752353358Sdim Params.push_back(PtrTy); 753341825Sdim#endif 754341825Sdim Params.push_back(wasm::ValType::I64); 755341825Sdim Params.push_back(wasm::ValType::I64); 756341825Sdim Params.push_back(wasm::ValType::I64); 757341825Sdim Params.push_back(wasm::ValType::I64); 758353358Sdim Params.push_back(PtrTy); 759341825Sdim break; 760317017Sdim case i64_i64_i64_i64_func_i64_i64_i64_i64: 761317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 762317017Sdim Rets.push_back(wasm::ValType::I64); 763317017Sdim Rets.push_back(wasm::ValType::I64); 764317017Sdim Rets.push_back(wasm::ValType::I64); 765317017Sdim Rets.push_back(wasm::ValType::I64); 766317017Sdim#else 767353358Sdim Params.push_back(PtrTy); 768317017Sdim#endif 769317017Sdim Params.push_back(wasm::ValType::I64); 770317017Sdim Params.push_back(wasm::ValType::I64); 771317017Sdim Params.push_back(wasm::ValType::I64); 772317017Sdim Params.push_back(wasm::ValType::I64); 773317017Sdim break; 774317017Sdim case i64_i64_func_i64_i64_i32: 775317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 776317017Sdim Rets.push_back(wasm::ValType::I64); 777317017Sdim Rets.push_back(wasm::ValType::I64); 778317017Sdim Rets.push_back(wasm::ValType::I64); 779317017Sdim Rets.push_back(wasm::ValType::I64); 780317017Sdim#else 781353358Sdim Params.push_back(PtrTy); 782317017Sdim#endif 783317017Sdim Params.push_back(wasm::ValType::I64); 784317017Sdim Params.push_back(wasm::ValType::I64); 785317017Sdim Params.push_back(wasm::ValType::I32); 786317017Sdim break; 787317017Sdim case iPTR_func_iPTR_i32_iPTR: 788353358Sdim Rets.push_back(PtrTy); 789353358Sdim Params.push_back(PtrTy); 790317017Sdim Params.push_back(wasm::ValType::I32); 791353358Sdim Params.push_back(PtrTy); 792317017Sdim break; 793317017Sdim case iPTR_func_iPTR_iPTR_iPTR: 794353358Sdim Rets.push_back(PtrTy); 795353358Sdim Params.push_back(PtrTy); 796353358Sdim Params.push_back(PtrTy); 797353358Sdim Params.push_back(PtrTy); 798317017Sdim break; 799317017Sdim case f32_func_f32_f32_f32: 800317017Sdim Rets.push_back(wasm::ValType::F32); 801317017Sdim Params.push_back(wasm::ValType::F32); 802317017Sdim Params.push_back(wasm::ValType::F32); 803317017Sdim Params.push_back(wasm::ValType::F32); 804317017Sdim break; 805317017Sdim case f64_func_f64_f64_f64: 806317017Sdim Rets.push_back(wasm::ValType::F64); 807317017Sdim Params.push_back(wasm::ValType::F64); 808317017Sdim Params.push_back(wasm::ValType::F64); 809317017Sdim Params.push_back(wasm::ValType::F64); 810317017Sdim break; 811317017Sdim case func_i64_i64_iPTR_iPTR: 812317017Sdim Params.push_back(wasm::ValType::I64); 813317017Sdim Params.push_back(wasm::ValType::I64); 814353358Sdim Params.push_back(PtrTy); 815353358Sdim Params.push_back(PtrTy); 816317017Sdim break; 817317017Sdim case func_iPTR_f32: 818353358Sdim Params.push_back(PtrTy); 819317017Sdim Params.push_back(wasm::ValType::F32); 820317017Sdim break; 821317017Sdim case func_iPTR_f64: 822353358Sdim Params.push_back(PtrTy); 823317017Sdim Params.push_back(wasm::ValType::F64); 824317017Sdim break; 825317017Sdim case func_iPTR_i32: 826353358Sdim Params.push_back(PtrTy); 827317017Sdim Params.push_back(wasm::ValType::I32); 828317017Sdim break; 829317017Sdim case func_iPTR_i64: 830353358Sdim Params.push_back(PtrTy); 831317017Sdim Params.push_back(wasm::ValType::I64); 832317017Sdim break; 833317017Sdim case func_iPTR_i64_i64: 834353358Sdim Params.push_back(PtrTy); 835317017Sdim Params.push_back(wasm::ValType::I64); 836317017Sdim Params.push_back(wasm::ValType::I64); 837317017Sdim break; 838317017Sdim case func_iPTR_i64_i64_i64_i64: 839353358Sdim Params.push_back(PtrTy); 840317017Sdim Params.push_back(wasm::ValType::I64); 841317017Sdim Params.push_back(wasm::ValType::I64); 842317017Sdim Params.push_back(wasm::ValType::I64); 843317017Sdim Params.push_back(wasm::ValType::I64); 844317017Sdim break; 845317017Sdim case func_iPTR_i64_i64_i64_i64_i64_i64: 846353358Sdim Params.push_back(PtrTy); 847317017Sdim Params.push_back(wasm::ValType::I64); 848317017Sdim Params.push_back(wasm::ValType::I64); 849317017Sdim Params.push_back(wasm::ValType::I64); 850317017Sdim Params.push_back(wasm::ValType::I64); 851317017Sdim Params.push_back(wasm::ValType::I64); 852317017Sdim Params.push_back(wasm::ValType::I64); 853317017Sdim break; 854317017Sdim case i32_func_i64_i64: 855317017Sdim Rets.push_back(wasm::ValType::I32); 856317017Sdim Params.push_back(wasm::ValType::I64); 857317017Sdim Params.push_back(wasm::ValType::I64); 858317017Sdim break; 859317017Sdim case i32_func_i64_i64_i64_i64: 860317017Sdim Rets.push_back(wasm::ValType::I32); 861317017Sdim Params.push_back(wasm::ValType::I64); 862317017Sdim Params.push_back(wasm::ValType::I64); 863317017Sdim Params.push_back(wasm::ValType::I64); 864317017Sdim Params.push_back(wasm::ValType::I64); 865317017Sdim break; 866353358Sdim case iPTR_func_f32: 867353358Sdim Rets.push_back(PtrTy); 868353358Sdim Params.push_back(wasm::ValType::F32); 869353358Sdim break; 870353358Sdim case iPTR_func_f64: 871353358Sdim Rets.push_back(PtrTy); 872353358Sdim Params.push_back(wasm::ValType::F64); 873353358Sdim break; 874353358Sdim case iPTR_func_i64_i64: 875353358Sdim Rets.push_back(PtrTy); 876353358Sdim Params.push_back(wasm::ValType::I64); 877353358Sdim Params.push_back(wasm::ValType::I64); 878353358Sdim break; 879317017Sdim case unsupported: 880317017Sdim llvm_unreachable("unsupported runtime library signature"); 881317017Sdim } 882317017Sdim} 883317017Sdim 884341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 885341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 886341825Sdim// other than here, just roll its logic into this version. 887353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 888344779Sdim const char *Name, 889344779Sdim SmallVectorImpl<wasm::ValType> &Rets, 890344779Sdim SmallVectorImpl<wasm::ValType> &Params) { 891344779Sdim auto &Map = LibcallNameMap->Map; 892353358Sdim auto Val = Map.find(Name); 893353358Sdim#ifndef NDEBUG 894353358Sdim if (Val == Map.end()) { 895353358Sdim auto message = std::string("unexpected runtime library name: ") + Name; 896353358Sdim llvm_unreachable(message.c_str()); 897353358Sdim } 898353358Sdim#endif 899353358Sdim return getLibcallSignature(Subtarget, Val->second, Rets, Params); 900317017Sdim} 901