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; 319317017Sdim 320341825Sdim // Memory 321341825Sdim Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 322341825Sdim Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 323341825Sdim Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 324317017Sdim 325353358Sdim // __stack_chk_fail 326353358Sdim Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func; 327353358Sdim 328353358Sdim // Return address handling 329353358Sdim Table[RTLIB::RETURN_ADDRESS] = i32_func_i32; 330353358Sdim 331341825Sdim // Element-wise Atomic memory 332341825Sdim // TODO: Fix these when we implement atomic support 333341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 334341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 335341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 336341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 337341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 338341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 339341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 340341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 341341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 342341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 343320970Sdim 344341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 345341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 346341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 347341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 348341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 349317017Sdim 350341825Sdim // Atomic '__sync_*' libcalls. 351341825Sdim // TODO: Fix these when we implement atomic support 352341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 353341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 354341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 355341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 356341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 357341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 358341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 359341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 360341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 361341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 362341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 363341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 364341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 365341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 366341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 367341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 368341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 369341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 370341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 371341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 372341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 373341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 374341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 375341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 376341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 377341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 378341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 379341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 380341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 381341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 382341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 383341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 384341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 385341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 386341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 387341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 388341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 389341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 390341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 391341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 392341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 393341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 394341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 395341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 396341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 397341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 398341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 399341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 400341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 401341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 402341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 403341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 404341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 405341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 406341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 407341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 408341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 409341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 410341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 411341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 412317017Sdim 413341825Sdim // Atomic '__atomic_*' libcalls. 414341825Sdim // TODO: Fix these when we implement atomic support 415341825Sdim Table[RTLIB::ATOMIC_LOAD] = unsupported; 416341825Sdim Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 417341825Sdim Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 418341825Sdim Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 419341825Sdim Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 420341825Sdim Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 421317017Sdim 422341825Sdim Table[RTLIB::ATOMIC_STORE] = unsupported; 423341825Sdim Table[RTLIB::ATOMIC_STORE_1] = unsupported; 424341825Sdim Table[RTLIB::ATOMIC_STORE_2] = unsupported; 425341825Sdim Table[RTLIB::ATOMIC_STORE_4] = unsupported; 426341825Sdim Table[RTLIB::ATOMIC_STORE_8] = unsupported; 427341825Sdim Table[RTLIB::ATOMIC_STORE_16] = unsupported; 428317017Sdim 429341825Sdim Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 430341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 431341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 432341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 433341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 434341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 435317017Sdim 436341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 437341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 438341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 439341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 440341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 441341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 442317017Sdim 443341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 444341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 445341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 446341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 447341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 448317017Sdim 449341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 450341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 451341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 452341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 453341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 454317017Sdim 455341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 456341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 457341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 458341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 459341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 460317017Sdim 461341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 462341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 463341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 464341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 465341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 466317017Sdim 467341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 468341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 469341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 470341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 471341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 472317017Sdim 473341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 474341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 475341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 476341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 477341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 478341825Sdim } 479341825Sdim}; 480317017Sdim 481341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures; 482317017Sdim 483341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a 484341825Sdim// constructor for use with ManagedStatic 485341825Sdimstruct StaticLibcallNameMap { 486341825Sdim StringMap<RTLIB::Libcall> Map; 487341825Sdim StaticLibcallNameMap() { 488341825Sdim static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = { 489341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code}, 490341825Sdim#include "llvm/IR/RuntimeLibcalls.def" 491341825Sdim#undef HANDLE_LIBCALL 492341825Sdim }; 493341825Sdim for (const auto &NameLibcall : NameLibcalls) { 494341825Sdim if (NameLibcall.first != nullptr && 495341825Sdim RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) { 496341825Sdim assert(Map.find(NameLibcall.first) == Map.end() && 497341825Sdim "duplicate libcall names in name map"); 498341825Sdim Map[NameLibcall.first] = NameLibcall.second; 499341825Sdim } 500341825Sdim } 501353358Sdim // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is 502353358Sdim // consistent with the f64 and f128 names. 503353358Sdim Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32; 504353358Sdim Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16; 505353358Sdim 506353358Sdim Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS; 507341825Sdim } 508317017Sdim}; 509317017Sdim 510341825Sdim} // end anonymous namespace 511317017Sdim 512353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 513344779Sdim RTLIB::Libcall LC, 514344779Sdim SmallVectorImpl<wasm::ValType> &Rets, 515344779Sdim SmallVectorImpl<wasm::ValType> &Params) { 516317017Sdim assert(Rets.empty()); 517317017Sdim assert(Params.empty()); 518317017Sdim 519353358Sdim wasm::ValType PtrTy = 520341825Sdim Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 521317017Sdim 522344779Sdim auto &Table = RuntimeLibcallSignatures->Table; 523341825Sdim switch (Table[LC]) { 524317017Sdim case func: 525317017Sdim break; 526317017Sdim case f32_func_f32: 527317017Sdim Rets.push_back(wasm::ValType::F32); 528317017Sdim Params.push_back(wasm::ValType::F32); 529317017Sdim break; 530317017Sdim case f32_func_f64: 531317017Sdim Rets.push_back(wasm::ValType::F32); 532317017Sdim Params.push_back(wasm::ValType::F64); 533317017Sdim break; 534317017Sdim case f32_func_i32: 535317017Sdim Rets.push_back(wasm::ValType::F32); 536317017Sdim Params.push_back(wasm::ValType::I32); 537317017Sdim break; 538317017Sdim case f32_func_i64: 539317017Sdim Rets.push_back(wasm::ValType::F32); 540317017Sdim Params.push_back(wasm::ValType::I64); 541317017Sdim break; 542317017Sdim case f32_func_i16: 543317017Sdim Rets.push_back(wasm::ValType::F32); 544317017Sdim Params.push_back(wasm::ValType::I32); 545317017Sdim break; 546317017Sdim case f64_func_f32: 547317017Sdim Rets.push_back(wasm::ValType::F64); 548317017Sdim Params.push_back(wasm::ValType::F32); 549317017Sdim break; 550317017Sdim case f64_func_f64: 551317017Sdim Rets.push_back(wasm::ValType::F64); 552317017Sdim Params.push_back(wasm::ValType::F64); 553317017Sdim break; 554317017Sdim case f64_func_i32: 555317017Sdim Rets.push_back(wasm::ValType::F64); 556317017Sdim Params.push_back(wasm::ValType::I32); 557317017Sdim break; 558317017Sdim case f64_func_i64: 559317017Sdim Rets.push_back(wasm::ValType::F64); 560317017Sdim Params.push_back(wasm::ValType::I64); 561317017Sdim break; 562317017Sdim case i32_func_f32: 563317017Sdim Rets.push_back(wasm::ValType::I32); 564317017Sdim Params.push_back(wasm::ValType::F32); 565317017Sdim break; 566317017Sdim case i32_func_f64: 567317017Sdim Rets.push_back(wasm::ValType::I32); 568317017Sdim Params.push_back(wasm::ValType::F64); 569317017Sdim break; 570317017Sdim case i32_func_i32: 571317017Sdim Rets.push_back(wasm::ValType::I32); 572317017Sdim Params.push_back(wasm::ValType::I32); 573317017Sdim break; 574317017Sdim case i64_func_f32: 575317017Sdim Rets.push_back(wasm::ValType::I64); 576317017Sdim Params.push_back(wasm::ValType::F32); 577317017Sdim break; 578317017Sdim case i64_func_f64: 579317017Sdim Rets.push_back(wasm::ValType::I64); 580317017Sdim Params.push_back(wasm::ValType::F64); 581317017Sdim break; 582317017Sdim case i64_func_i64: 583317017Sdim Rets.push_back(wasm::ValType::I64); 584317017Sdim Params.push_back(wasm::ValType::I64); 585317017Sdim break; 586317017Sdim case f32_func_f32_f32: 587317017Sdim Rets.push_back(wasm::ValType::F32); 588317017Sdim Params.push_back(wasm::ValType::F32); 589317017Sdim Params.push_back(wasm::ValType::F32); 590317017Sdim break; 591317017Sdim case f32_func_f32_i32: 592317017Sdim Rets.push_back(wasm::ValType::F32); 593317017Sdim Params.push_back(wasm::ValType::F32); 594317017Sdim Params.push_back(wasm::ValType::I32); 595317017Sdim break; 596317017Sdim case f32_func_i64_i64: 597317017Sdim Rets.push_back(wasm::ValType::F32); 598317017Sdim Params.push_back(wasm::ValType::I64); 599317017Sdim Params.push_back(wasm::ValType::I64); 600317017Sdim break; 601317017Sdim case f64_func_f64_f64: 602317017Sdim Rets.push_back(wasm::ValType::F64); 603317017Sdim Params.push_back(wasm::ValType::F64); 604317017Sdim Params.push_back(wasm::ValType::F64); 605317017Sdim break; 606317017Sdim case f64_func_f64_i32: 607317017Sdim Rets.push_back(wasm::ValType::F64); 608317017Sdim Params.push_back(wasm::ValType::F64); 609317017Sdim Params.push_back(wasm::ValType::I32); 610317017Sdim break; 611317017Sdim case f64_func_i64_i64: 612317017Sdim Rets.push_back(wasm::ValType::F64); 613317017Sdim Params.push_back(wasm::ValType::I64); 614317017Sdim Params.push_back(wasm::ValType::I64); 615317017Sdim break; 616317017Sdim case i16_func_f32: 617317017Sdim Rets.push_back(wasm::ValType::I32); 618317017Sdim Params.push_back(wasm::ValType::F32); 619317017Sdim break; 620353358Sdim case i16_func_f64: 621353358Sdim Rets.push_back(wasm::ValType::I32); 622353358Sdim Params.push_back(wasm::ValType::F64); 623353358Sdim break; 624353358Sdim case i16_func_i64_i64: 625353358Sdim Rets.push_back(wasm::ValType::I32); 626353358Sdim Params.push_back(wasm::ValType::I64); 627353358Sdim Params.push_back(wasm::ValType::I64); 628353358Sdim break; 629317017Sdim case i8_func_i8_i8: 630317017Sdim Rets.push_back(wasm::ValType::I32); 631317017Sdim Params.push_back(wasm::ValType::I32); 632317017Sdim Params.push_back(wasm::ValType::I32); 633317017Sdim break; 634317017Sdim case func_f32_iPTR_iPTR: 635317017Sdim Params.push_back(wasm::ValType::F32); 636353358Sdim Params.push_back(PtrTy); 637353358Sdim Params.push_back(PtrTy); 638317017Sdim break; 639317017Sdim case func_f64_iPTR_iPTR: 640317017Sdim Params.push_back(wasm::ValType::F64); 641353358Sdim Params.push_back(PtrTy); 642353358Sdim Params.push_back(PtrTy); 643317017Sdim break; 644317017Sdim case i16_func_i16_i16: 645317017Sdim Rets.push_back(wasm::ValType::I32); 646317017Sdim Params.push_back(wasm::ValType::I32); 647317017Sdim Params.push_back(wasm::ValType::I32); 648317017Sdim break; 649317017Sdim case i32_func_f32_f32: 650317017Sdim Rets.push_back(wasm::ValType::I32); 651317017Sdim Params.push_back(wasm::ValType::F32); 652317017Sdim Params.push_back(wasm::ValType::F32); 653317017Sdim break; 654317017Sdim case i32_func_f64_f64: 655317017Sdim Rets.push_back(wasm::ValType::I32); 656317017Sdim Params.push_back(wasm::ValType::F64); 657317017Sdim Params.push_back(wasm::ValType::F64); 658317017Sdim break; 659317017Sdim case i32_func_i32_i32: 660317017Sdim Rets.push_back(wasm::ValType::I32); 661317017Sdim Params.push_back(wasm::ValType::I32); 662317017Sdim Params.push_back(wasm::ValType::I32); 663317017Sdim break; 664341825Sdim case i32_func_i32_i32_iPTR: 665341825Sdim Rets.push_back(wasm::ValType::I32); 666341825Sdim Params.push_back(wasm::ValType::I32); 667341825Sdim Params.push_back(wasm::ValType::I32); 668353358Sdim Params.push_back(PtrTy); 669341825Sdim break; 670317017Sdim case i64_func_i64_i64: 671317017Sdim Rets.push_back(wasm::ValType::I64); 672317017Sdim Params.push_back(wasm::ValType::I64); 673317017Sdim Params.push_back(wasm::ValType::I64); 674317017Sdim break; 675341825Sdim case i64_func_i64_i64_iPTR: 676341825Sdim Rets.push_back(wasm::ValType::I64); 677341825Sdim Params.push_back(wasm::ValType::I64); 678341825Sdim Params.push_back(wasm::ValType::I64); 679353358Sdim Params.push_back(PtrTy); 680341825Sdim break; 681317017Sdim case i64_i64_func_f32: 682317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 683317017Sdim Rets.push_back(wasm::ValType::I64); 684317017Sdim Rets.push_back(wasm::ValType::I64); 685317017Sdim#else 686353358Sdim Params.push_back(PtrTy); 687317017Sdim#endif 688317017Sdim Params.push_back(wasm::ValType::F32); 689317017Sdim break; 690317017Sdim case i64_i64_func_f64: 691317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 692317017Sdim Rets.push_back(wasm::ValType::I64); 693317017Sdim Rets.push_back(wasm::ValType::I64); 694317017Sdim#else 695353358Sdim Params.push_back(PtrTy); 696317017Sdim#endif 697317017Sdim Params.push_back(wasm::ValType::F64); 698317017Sdim break; 699317017Sdim case i16_i16_func_i16_i16: 700317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 701317017Sdim Rets.push_back(wasm::ValType::I32); 702317017Sdim Rets.push_back(wasm::ValType::I32); 703317017Sdim#else 704353358Sdim Params.push_back(PtrTy); 705317017Sdim#endif 706317017Sdim Params.push_back(wasm::ValType::I32); 707317017Sdim Params.push_back(wasm::ValType::I32); 708317017Sdim break; 709317017Sdim case i32_i32_func_i32_i32: 710317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 711317017Sdim Rets.push_back(wasm::ValType::I32); 712317017Sdim Rets.push_back(wasm::ValType::I32); 713317017Sdim#else 714353358Sdim Params.push_back(PtrTy); 715317017Sdim#endif 716317017Sdim Params.push_back(wasm::ValType::I32); 717317017Sdim Params.push_back(wasm::ValType::I32); 718317017Sdim break; 719317017Sdim case i64_i64_func_i64_i64: 720317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 721317017Sdim Rets.push_back(wasm::ValType::I64); 722317017Sdim Rets.push_back(wasm::ValType::I64); 723317017Sdim#else 724353358Sdim Params.push_back(PtrTy); 725317017Sdim#endif 726317017Sdim Params.push_back(wasm::ValType::I64); 727317017Sdim Params.push_back(wasm::ValType::I64); 728317017Sdim break; 729317017Sdim case i64_i64_func_i64_i64_i64_i64: 730317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 731317017Sdim Rets.push_back(wasm::ValType::I64); 732317017Sdim Rets.push_back(wasm::ValType::I64); 733317017Sdim#else 734353358Sdim Params.push_back(PtrTy); 735317017Sdim#endif 736317017Sdim Params.push_back(wasm::ValType::I64); 737317017Sdim Params.push_back(wasm::ValType::I64); 738317017Sdim Params.push_back(wasm::ValType::I64); 739317017Sdim Params.push_back(wasm::ValType::I64); 740317017Sdim break; 741341825Sdim case i64_i64_func_i64_i64_i64_i64_iPTR: 742341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 743341825Sdim Rets.push_back(wasm::ValType::I64); 744341825Sdim Rets.push_back(wasm::ValType::I64); 745341825Sdim#else 746353358Sdim Params.push_back(PtrTy); 747341825Sdim#endif 748341825Sdim Params.push_back(wasm::ValType::I64); 749341825Sdim Params.push_back(wasm::ValType::I64); 750341825Sdim Params.push_back(wasm::ValType::I64); 751341825Sdim Params.push_back(wasm::ValType::I64); 752353358Sdim Params.push_back(PtrTy); 753341825Sdim break; 754317017Sdim case i64_i64_i64_i64_func_i64_i64_i64_i64: 755317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 756317017Sdim Rets.push_back(wasm::ValType::I64); 757317017Sdim Rets.push_back(wasm::ValType::I64); 758317017Sdim Rets.push_back(wasm::ValType::I64); 759317017Sdim Rets.push_back(wasm::ValType::I64); 760317017Sdim#else 761353358Sdim Params.push_back(PtrTy); 762317017Sdim#endif 763317017Sdim Params.push_back(wasm::ValType::I64); 764317017Sdim Params.push_back(wasm::ValType::I64); 765317017Sdim Params.push_back(wasm::ValType::I64); 766317017Sdim Params.push_back(wasm::ValType::I64); 767317017Sdim break; 768317017Sdim case i64_i64_func_i64_i64_i32: 769317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 770317017Sdim Rets.push_back(wasm::ValType::I64); 771317017Sdim Rets.push_back(wasm::ValType::I64); 772317017Sdim Rets.push_back(wasm::ValType::I64); 773317017Sdim Rets.push_back(wasm::ValType::I64); 774317017Sdim#else 775353358Sdim Params.push_back(PtrTy); 776317017Sdim#endif 777317017Sdim Params.push_back(wasm::ValType::I64); 778317017Sdim Params.push_back(wasm::ValType::I64); 779317017Sdim Params.push_back(wasm::ValType::I32); 780317017Sdim break; 781317017Sdim case iPTR_func_iPTR_i32_iPTR: 782353358Sdim Rets.push_back(PtrTy); 783353358Sdim Params.push_back(PtrTy); 784317017Sdim Params.push_back(wasm::ValType::I32); 785353358Sdim Params.push_back(PtrTy); 786317017Sdim break; 787317017Sdim case iPTR_func_iPTR_iPTR_iPTR: 788353358Sdim Rets.push_back(PtrTy); 789353358Sdim Params.push_back(PtrTy); 790353358Sdim Params.push_back(PtrTy); 791353358Sdim Params.push_back(PtrTy); 792317017Sdim break; 793317017Sdim case f32_func_f32_f32_f32: 794317017Sdim Rets.push_back(wasm::ValType::F32); 795317017Sdim Params.push_back(wasm::ValType::F32); 796317017Sdim Params.push_back(wasm::ValType::F32); 797317017Sdim Params.push_back(wasm::ValType::F32); 798317017Sdim break; 799317017Sdim case f64_func_f64_f64_f64: 800317017Sdim Rets.push_back(wasm::ValType::F64); 801317017Sdim Params.push_back(wasm::ValType::F64); 802317017Sdim Params.push_back(wasm::ValType::F64); 803317017Sdim Params.push_back(wasm::ValType::F64); 804317017Sdim break; 805317017Sdim case func_i64_i64_iPTR_iPTR: 806317017Sdim Params.push_back(wasm::ValType::I64); 807317017Sdim Params.push_back(wasm::ValType::I64); 808353358Sdim Params.push_back(PtrTy); 809353358Sdim Params.push_back(PtrTy); 810317017Sdim break; 811317017Sdim case func_iPTR_f32: 812353358Sdim Params.push_back(PtrTy); 813317017Sdim Params.push_back(wasm::ValType::F32); 814317017Sdim break; 815317017Sdim case func_iPTR_f64: 816353358Sdim Params.push_back(PtrTy); 817317017Sdim Params.push_back(wasm::ValType::F64); 818317017Sdim break; 819317017Sdim case func_iPTR_i32: 820353358Sdim Params.push_back(PtrTy); 821317017Sdim Params.push_back(wasm::ValType::I32); 822317017Sdim break; 823317017Sdim case func_iPTR_i64: 824353358Sdim Params.push_back(PtrTy); 825317017Sdim Params.push_back(wasm::ValType::I64); 826317017Sdim break; 827317017Sdim case func_iPTR_i64_i64: 828353358Sdim Params.push_back(PtrTy); 829317017Sdim Params.push_back(wasm::ValType::I64); 830317017Sdim Params.push_back(wasm::ValType::I64); 831317017Sdim break; 832317017Sdim case func_iPTR_i64_i64_i64_i64: 833353358Sdim Params.push_back(PtrTy); 834317017Sdim Params.push_back(wasm::ValType::I64); 835317017Sdim Params.push_back(wasm::ValType::I64); 836317017Sdim Params.push_back(wasm::ValType::I64); 837317017Sdim Params.push_back(wasm::ValType::I64); 838317017Sdim break; 839317017Sdim case func_iPTR_i64_i64_i64_i64_i64_i64: 840353358Sdim Params.push_back(PtrTy); 841317017Sdim Params.push_back(wasm::ValType::I64); 842317017Sdim Params.push_back(wasm::ValType::I64); 843317017Sdim Params.push_back(wasm::ValType::I64); 844317017Sdim Params.push_back(wasm::ValType::I64); 845317017Sdim Params.push_back(wasm::ValType::I64); 846317017Sdim Params.push_back(wasm::ValType::I64); 847317017Sdim break; 848317017Sdim case i32_func_i64_i64: 849317017Sdim Rets.push_back(wasm::ValType::I32); 850317017Sdim Params.push_back(wasm::ValType::I64); 851317017Sdim Params.push_back(wasm::ValType::I64); 852317017Sdim break; 853317017Sdim case i32_func_i64_i64_i64_i64: 854317017Sdim Rets.push_back(wasm::ValType::I32); 855317017Sdim Params.push_back(wasm::ValType::I64); 856317017Sdim Params.push_back(wasm::ValType::I64); 857317017Sdim Params.push_back(wasm::ValType::I64); 858317017Sdim Params.push_back(wasm::ValType::I64); 859317017Sdim break; 860353358Sdim case iPTR_func_f32: 861353358Sdim Rets.push_back(PtrTy); 862353358Sdim Params.push_back(wasm::ValType::F32); 863353358Sdim break; 864353358Sdim case iPTR_func_f64: 865353358Sdim Rets.push_back(PtrTy); 866353358Sdim Params.push_back(wasm::ValType::F64); 867353358Sdim break; 868353358Sdim case iPTR_func_i64_i64: 869353358Sdim Rets.push_back(PtrTy); 870353358Sdim Params.push_back(wasm::ValType::I64); 871353358Sdim Params.push_back(wasm::ValType::I64); 872353358Sdim break; 873317017Sdim case unsupported: 874317017Sdim llvm_unreachable("unsupported runtime library signature"); 875317017Sdim } 876317017Sdim} 877317017Sdim 878341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 879341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 880341825Sdim// other than here, just roll its logic into this version. 881353358Sdimvoid llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 882344779Sdim const char *Name, 883344779Sdim SmallVectorImpl<wasm::ValType> &Rets, 884344779Sdim SmallVectorImpl<wasm::ValType> &Params) { 885344779Sdim auto &Map = LibcallNameMap->Map; 886353358Sdim auto Val = Map.find(Name); 887353358Sdim#ifndef NDEBUG 888353358Sdim if (Val == Map.end()) { 889353358Sdim auto message = std::string("unexpected runtime library name: ") + Name; 890353358Sdim llvm_unreachable(message.c_str()); 891353358Sdim } 892353358Sdim#endif 893353358Sdim return getLibcallSignature(Subtarget, Val->second, Rets, Params); 894317017Sdim} 895