WebAssemblyRuntimeLibcallSignatures.cpp revision 341825
1317017Sdim// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- 2317017Sdim// 3317017Sdim// The LLVM Compiler Infrastructure 4317017Sdim// 5317017Sdim// This file is distributed under the University of Illinois Open Source 6317017Sdim// License. See LICENSE.TXT for details. 7317017Sdim// 8317017Sdim//===----------------------------------------------------------------------===// 9317017Sdim/// 10317017Sdim/// \file 11341825Sdim/// This file contains signature information for runtime libcalls. 12317017Sdim/// 13317017Sdim/// CodeGen uses external symbols, which it refers to by name. The WebAssembly 14317017Sdim/// target needs type information for all functions. This file contains a big 15317017Sdim/// table providing type signatures for all runtime library functions that LLVM 16317017Sdim/// uses. 17317017Sdim/// 18317017Sdim/// This is currently a fairly heavy-handed solution. 19317017Sdim/// 20317017Sdim//===----------------------------------------------------------------------===// 21317017Sdim 22317017Sdim#include "WebAssemblyRuntimeLibcallSignatures.h" 23317017Sdim#include "WebAssemblySubtarget.h" 24317017Sdim#include "llvm/CodeGen/RuntimeLibcalls.h" 25341825Sdim#include "llvm/Support/ManagedStatic.h" 26317017Sdim 27317017Sdimusing namespace llvm; 28317017Sdim 29317017Sdimnamespace { 30317017Sdim 31317017Sdimenum RuntimeLibcallSignature { 32317017Sdim func, 33317017Sdim f32_func_f32, 34317017Sdim f32_func_f64, 35317017Sdim f32_func_i32, 36317017Sdim f32_func_i64, 37317017Sdim f32_func_i16, 38317017Sdim f64_func_f32, 39317017Sdim f64_func_f64, 40317017Sdim f64_func_i32, 41317017Sdim f64_func_i64, 42317017Sdim i32_func_f32, 43317017Sdim i32_func_f64, 44317017Sdim i32_func_i32, 45317017Sdim i64_func_f32, 46317017Sdim i64_func_f64, 47317017Sdim i64_func_i64, 48317017Sdim f32_func_f32_f32, 49317017Sdim f32_func_f32_i32, 50317017Sdim f32_func_i64_i64, 51317017Sdim f64_func_f64_f64, 52317017Sdim f64_func_f64_i32, 53317017Sdim f64_func_i64_i64, 54317017Sdim i16_func_f32, 55317017Sdim i8_func_i8_i8, 56317017Sdim func_f32_iPTR_iPTR, 57317017Sdim func_f64_iPTR_iPTR, 58317017Sdim i16_func_i16_i16, 59317017Sdim i32_func_f32_f32, 60317017Sdim i32_func_f64_f64, 61317017Sdim i32_func_i32_i32, 62341825Sdim i32_func_i32_i32_iPTR, 63317017Sdim i64_func_i64_i64, 64341825Sdim i64_func_i64_i64_iPTR, 65317017Sdim i64_i64_func_f32, 66317017Sdim i64_i64_func_f64, 67317017Sdim i16_i16_func_i16_i16, 68317017Sdim i32_i32_func_i32_i32, 69317017Sdim i64_i64_func_i64_i64, 70317017Sdim i64_i64_func_i64_i64_i64_i64, 71341825Sdim i64_i64_func_i64_i64_i64_i64_iPTR, 72317017Sdim i64_i64_i64_i64_func_i64_i64_i64_i64, 73317017Sdim i64_i64_func_i64_i64_i32, 74317017Sdim iPTR_func_iPTR_i32_iPTR, 75317017Sdim iPTR_func_iPTR_iPTR_iPTR, 76317017Sdim f32_func_f32_f32_f32, 77317017Sdim f64_func_f64_f64_f64, 78317017Sdim func_i64_i64_iPTR_iPTR, 79317017Sdim func_iPTR_f32, 80317017Sdim func_iPTR_f64, 81317017Sdim func_iPTR_i32, 82317017Sdim func_iPTR_i64, 83317017Sdim func_iPTR_i64_i64, 84317017Sdim func_iPTR_i64_i64_i64_i64, 85317017Sdim func_iPTR_i64_i64_i64_i64_i64_i64, 86317017Sdim i32_func_i64_i64, 87317017Sdim i32_func_i64_i64_i64_i64, 88317017Sdim unsupported 89317017Sdim}; 90317017Sdim 91317017Sdim 92341825Sdimstruct RuntimeLibcallSignatureTable { 93341825Sdim std::vector<RuntimeLibcallSignature> Table; 94317017Sdim 95341825Sdim // Any newly-added libcalls will be unsupported by default. 96341825Sdim RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) { 97341825Sdim // Integer 98341825Sdim Table[RTLIB::SHL_I16] = i16_func_i16_i16; 99341825Sdim Table[RTLIB::SHL_I32] = i32_func_i32_i32; 100341825Sdim Table[RTLIB::SHL_I64] = i64_func_i64_i64; 101341825Sdim Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32; 102341825Sdim Table[RTLIB::SRL_I16] = i16_func_i16_i16; 103341825Sdim Table[RTLIB::SRL_I32] = i32_func_i32_i32; 104341825Sdim Table[RTLIB::SRL_I64] = i64_func_i64_i64; 105341825Sdim Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32; 106341825Sdim Table[RTLIB::SRA_I16] = i16_func_i16_i16; 107341825Sdim Table[RTLIB::SRA_I32] = i32_func_i32_i32; 108341825Sdim Table[RTLIB::SRA_I64] = i64_func_i64_i64; 109341825Sdim Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32; 110341825Sdim Table[RTLIB::MUL_I8] = i8_func_i8_i8; 111341825Sdim Table[RTLIB::MUL_I16] = i16_func_i16_i16; 112341825Sdim Table[RTLIB::MUL_I32] = i32_func_i32_i32; 113341825Sdim Table[RTLIB::MUL_I64] = i64_func_i64_i64; 114341825Sdim Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64; 115341825Sdim Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR; 116341825Sdim Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR; 117341825Sdim Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR; 118341825Sdim Table[RTLIB::SDIV_I8] = i8_func_i8_i8; 119341825Sdim Table[RTLIB::SDIV_I16] = i16_func_i16_i16; 120341825Sdim Table[RTLIB::SDIV_I32] = i32_func_i32_i32; 121341825Sdim Table[RTLIB::SDIV_I64] = i64_func_i64_i64; 122341825Sdim Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64; 123341825Sdim Table[RTLIB::UDIV_I8] = i8_func_i8_i8; 124341825Sdim Table[RTLIB::UDIV_I16] = i16_func_i16_i16; 125341825Sdim Table[RTLIB::UDIV_I32] = i32_func_i32_i32; 126341825Sdim Table[RTLIB::UDIV_I64] = i64_func_i64_i64; 127341825Sdim Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64; 128341825Sdim Table[RTLIB::SREM_I8] = i8_func_i8_i8; 129341825Sdim Table[RTLIB::SREM_I16] = i16_func_i16_i16; 130341825Sdim Table[RTLIB::SREM_I32] = i32_func_i32_i32; 131341825Sdim Table[RTLIB::SREM_I64] = i64_func_i64_i64; 132341825Sdim Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64; 133341825Sdim Table[RTLIB::UREM_I8] = i8_func_i8_i8; 134341825Sdim Table[RTLIB::UREM_I16] = i16_func_i16_i16; 135341825Sdim Table[RTLIB::UREM_I32] = i32_func_i32_i32; 136341825Sdim Table[RTLIB::UREM_I64] = i64_func_i64_i64; 137341825Sdim Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64; 138341825Sdim Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8; 139341825Sdim Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16; 140341825Sdim Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32; 141341825Sdim Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64; 142341825Sdim Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 143341825Sdim Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8; 144341825Sdim Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16; 145341825Sdim Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32; 146341825Sdim Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64; 147341825Sdim Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 148341825Sdim Table[RTLIB::NEG_I32] = i32_func_i32; 149341825Sdim Table[RTLIB::NEG_I64] = i64_func_i64; 150317017Sdim 151341825Sdim // Floating-point. 152341825Sdim // All F80 and PPCF128 routines are unsupported. 153341825Sdim Table[RTLIB::ADD_F32] = f32_func_f32_f32; 154341825Sdim Table[RTLIB::ADD_F64] = f64_func_f64_f64; 155341825Sdim Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64; 156341825Sdim Table[RTLIB::SUB_F32] = f32_func_f32_f32; 157341825Sdim Table[RTLIB::SUB_F64] = f64_func_f64_f64; 158341825Sdim Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64; 159341825Sdim Table[RTLIB::MUL_F32] = f32_func_f32_f32; 160341825Sdim Table[RTLIB::MUL_F64] = f64_func_f64_f64; 161341825Sdim Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64; 162341825Sdim Table[RTLIB::DIV_F32] = f32_func_f32_f32; 163341825Sdim Table[RTLIB::DIV_F64] = f64_func_f64_f64; 164341825Sdim Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64; 165341825Sdim Table[RTLIB::REM_F32] = f32_func_f32_f32; 166341825Sdim Table[RTLIB::REM_F64] = f64_func_f64_f64; 167341825Sdim Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64; 168341825Sdim Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32; 169341825Sdim Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64; 170341825Sdim Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64; 171341825Sdim Table[RTLIB::POWI_F32] = f32_func_f32_i32; 172341825Sdim Table[RTLIB::POWI_F64] = f64_func_f64_i32; 173341825Sdim Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64; 174341825Sdim Table[RTLIB::SQRT_F32] = f32_func_f32; 175341825Sdim Table[RTLIB::SQRT_F64] = f64_func_f64; 176341825Sdim Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64; 177341825Sdim Table[RTLIB::LOG_F32] = f32_func_f32; 178341825Sdim Table[RTLIB::LOG_F64] = f64_func_f64; 179341825Sdim Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; 180341825Sdim Table[RTLIB::LOG2_F32] = f32_func_f32; 181341825Sdim Table[RTLIB::LOG2_F64] = f64_func_f64; 182341825Sdim Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; 183341825Sdim Table[RTLIB::LOG10_F32] = f32_func_f32; 184341825Sdim Table[RTLIB::LOG10_F64] = f64_func_f64; 185341825Sdim Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; 186341825Sdim Table[RTLIB::EXP_F32] = f32_func_f32; 187341825Sdim Table[RTLIB::EXP_F64] = f64_func_f64; 188341825Sdim Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; 189341825Sdim Table[RTLIB::EXP2_F32] = f32_func_f32; 190341825Sdim Table[RTLIB::EXP2_F64] = f64_func_f64; 191341825Sdim Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; 192341825Sdim Table[RTLIB::SIN_F32] = f32_func_f32; 193341825Sdim Table[RTLIB::SIN_F64] = f64_func_f64; 194341825Sdim Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; 195341825Sdim Table[RTLIB::COS_F32] = f32_func_f32; 196341825Sdim Table[RTLIB::COS_F64] = f64_func_f64; 197341825Sdim Table[RTLIB::COS_F128] = func_iPTR_i64_i64; 198341825Sdim Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; 199341825Sdim Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; 200341825Sdim Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; 201341825Sdim Table[RTLIB::POW_F32] = f32_func_f32_f32; 202341825Sdim Table[RTLIB::POW_F64] = f64_func_f64_f64; 203341825Sdim Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; 204341825Sdim Table[RTLIB::CEIL_F32] = f32_func_f32; 205341825Sdim Table[RTLIB::CEIL_F64] = f64_func_f64; 206341825Sdim Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; 207341825Sdim Table[RTLIB::TRUNC_F32] = f32_func_f32; 208341825Sdim Table[RTLIB::TRUNC_F64] = f64_func_f64; 209341825Sdim Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; 210341825Sdim Table[RTLIB::RINT_F32] = f32_func_f32; 211341825Sdim Table[RTLIB::RINT_F64] = f64_func_f64; 212341825Sdim Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; 213341825Sdim Table[RTLIB::NEARBYINT_F32] = f32_func_f32; 214341825Sdim Table[RTLIB::NEARBYINT_F64] = f64_func_f64; 215341825Sdim Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; 216341825Sdim Table[RTLIB::ROUND_F32] = f32_func_f32; 217341825Sdim Table[RTLIB::ROUND_F64] = f64_func_f64; 218341825Sdim Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; 219341825Sdim Table[RTLIB::FLOOR_F32] = f32_func_f32; 220341825Sdim Table[RTLIB::FLOOR_F64] = f64_func_f64; 221341825Sdim Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; 222341825Sdim Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; 223341825Sdim Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; 224341825Sdim Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; 225341825Sdim Table[RTLIB::FMIN_F32] = f32_func_f32_f32; 226341825Sdim Table[RTLIB::FMIN_F64] = f64_func_f64_f64; 227341825Sdim Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; 228341825Sdim Table[RTLIB::FMAX_F32] = f32_func_f32_f32; 229341825Sdim Table[RTLIB::FMAX_F64] = f64_func_f64_f64; 230341825Sdim Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; 231317017Sdim 232341825Sdim // Conversion 233341825Sdim // All F80 and PPCF128 routines are unspported. 234341825Sdim Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; 235341825Sdim Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; 236341825Sdim Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; 237341825Sdim Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; 238341825Sdim Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; 239341825Sdim Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; 240341825Sdim Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; 241341825Sdim Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; 242341825Sdim Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; 243341825Sdim Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; 244341825Sdim Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; 245341825Sdim Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; 246341825Sdim Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; 247341825Sdim Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; 248341825Sdim Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; 249341825Sdim Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; 250341825Sdim Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; 251341825Sdim Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; 252341825Sdim Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; 253341825Sdim Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; 254341825Sdim Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; 255341825Sdim Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; 256341825Sdim Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; 257341825Sdim Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; 258341825Sdim Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; 259341825Sdim Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; 260341825Sdim Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; 261341825Sdim Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; 262341825Sdim Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; 263341825Sdim Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; 264341825Sdim Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; 265341825Sdim Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; 266341825Sdim Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; 267341825Sdim Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; 268341825Sdim Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; 269341825Sdim Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; 270341825Sdim Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; 271341825Sdim Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; 272341825Sdim Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; 273341825Sdim Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; 274341825Sdim Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; 275341825Sdim Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; 276341825Sdim Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; 277341825Sdim Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; 278317017Sdim 279341825Sdim // Comparison 280341825Sdim // ALl F80 and PPCF128 routines are unsupported. 281341825Sdim Table[RTLIB::OEQ_F32] = i32_func_f32_f32; 282341825Sdim Table[RTLIB::OEQ_F64] = i32_func_f64_f64; 283341825Sdim Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; 284341825Sdim Table[RTLIB::UNE_F32] = i32_func_f32_f32; 285341825Sdim Table[RTLIB::UNE_F64] = i32_func_f64_f64; 286341825Sdim Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; 287341825Sdim Table[RTLIB::OGE_F32] = i32_func_f32_f32; 288341825Sdim Table[RTLIB::OGE_F64] = i32_func_f64_f64; 289341825Sdim Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; 290341825Sdim Table[RTLIB::OLT_F32] = i32_func_f32_f32; 291341825Sdim Table[RTLIB::OLT_F64] = i32_func_f64_f64; 292341825Sdim Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; 293341825Sdim Table[RTLIB::OLE_F32] = i32_func_f32_f32; 294341825Sdim Table[RTLIB::OLE_F64] = i32_func_f64_f64; 295341825Sdim Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; 296341825Sdim Table[RTLIB::OGT_F32] = i32_func_f32_f32; 297341825Sdim Table[RTLIB::OGT_F64] = i32_func_f64_f64; 298341825Sdim Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; 299341825Sdim Table[RTLIB::UO_F32] = i32_func_f32_f32; 300341825Sdim Table[RTLIB::UO_F64] = i32_func_f64_f64; 301341825Sdim Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; 302341825Sdim // O_FXX has the weird property that it uses the same libcall name as UO_FXX 303341825Sdim // This breaks our name-based lookup. Fortunately only the UO family of 304341825Sdim // libcalls appears to be actually used. 305341825Sdim Table[RTLIB::O_F32] = unsupported; 306341825Sdim Table[RTLIB::O_F64] = unsupported; 307341825Sdim Table[RTLIB::O_F128] = unsupported; 308317017Sdim 309341825Sdim // Memory 310341825Sdim Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 311341825Sdim Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 312341825Sdim Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 313317017Sdim 314341825Sdim // Element-wise Atomic memory 315341825Sdim // TODO: Fix these when we implement atomic support 316341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 317341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 318341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 319341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 320341825Sdim Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 321341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 322341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 323341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 324341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 325341825Sdim Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 326320970Sdim 327341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 328341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 329341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 330341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 331341825Sdim Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 332317017Sdim 333341825Sdim // Atomic '__sync_*' libcalls. 334341825Sdim // TODO: Fix these when we implement atomic support 335341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 336341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 337341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 338341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 339341825Sdim Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 340341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 341341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 342341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 343341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 344341825Sdim Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 345341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 346341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 347341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 348341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 349341825Sdim Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 350341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 351341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 352341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 353341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 354341825Sdim Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 355341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 356341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 357341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 358341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 359341825Sdim Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 360341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 361341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 362341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 363341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 364341825Sdim Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 365341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 366341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 367341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 368341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 369341825Sdim Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 370341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 371341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 372341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 373341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 374341825Sdim Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 375341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 376341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 377341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 378341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 379341825Sdim Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 380341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 381341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 382341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 383341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 384341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 385341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 386341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 387341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 388341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 389341825Sdim Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 390341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 391341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 392341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 393341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 394341825Sdim Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 395317017Sdim 396341825Sdim // Atomic '__atomic_*' libcalls. 397341825Sdim // TODO: Fix these when we implement atomic support 398341825Sdim Table[RTLIB::ATOMIC_LOAD] = unsupported; 399341825Sdim Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 400341825Sdim Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 401341825Sdim Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 402341825Sdim Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 403341825Sdim Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 404317017Sdim 405341825Sdim Table[RTLIB::ATOMIC_STORE] = unsupported; 406341825Sdim Table[RTLIB::ATOMIC_STORE_1] = unsupported; 407341825Sdim Table[RTLIB::ATOMIC_STORE_2] = unsupported; 408341825Sdim Table[RTLIB::ATOMIC_STORE_4] = unsupported; 409341825Sdim Table[RTLIB::ATOMIC_STORE_8] = unsupported; 410341825Sdim Table[RTLIB::ATOMIC_STORE_16] = unsupported; 411317017Sdim 412341825Sdim Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 413341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 414341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 415341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 416341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 417341825Sdim Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 418317017Sdim 419341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 420341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 421341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 422341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 423341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 424341825Sdim Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 425317017Sdim 426341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 427341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 428341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 429341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 430341825Sdim Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 431317017Sdim 432341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 433341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 434341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 435341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 436341825Sdim Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 437317017Sdim 438341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 439341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 440341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 441341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 442341825Sdim Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 443317017Sdim 444341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 445341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 446341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 447341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 448341825Sdim Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 449317017Sdim 450341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 451341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 452341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 453341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 454341825Sdim Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 455317017Sdim 456341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 457341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 458341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 459341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 460341825Sdim Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 461341825Sdim } 462341825Sdim}; 463317017Sdim 464341825SdimManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures; 465317017Sdim 466341825Sdim// Maps libcall names to their RTLIB::Libcall number. Builds the map in a 467341825Sdim// constructor for use with ManagedStatic 468341825Sdimstruct StaticLibcallNameMap { 469341825Sdim StringMap<RTLIB::Libcall> Map; 470341825Sdim StaticLibcallNameMap() { 471341825Sdim static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = { 472341825Sdim#define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code}, 473341825Sdim#include "llvm/IR/RuntimeLibcalls.def" 474341825Sdim#undef HANDLE_LIBCALL 475341825Sdim }; 476341825Sdim for (const auto &NameLibcall : NameLibcalls) { 477341825Sdim if (NameLibcall.first != nullptr && 478341825Sdim RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) { 479341825Sdim assert(Map.find(NameLibcall.first) == Map.end() && 480341825Sdim "duplicate libcall names in name map"); 481341825Sdim Map[NameLibcall.first] = NameLibcall.second; 482341825Sdim } 483341825Sdim } 484341825Sdim } 485317017Sdim}; 486317017Sdim 487341825Sdim} // end anonymous namespace 488317017Sdim 489317017Sdim 490317017Sdim 491317017Sdimvoid llvm::GetSignature(const WebAssemblySubtarget &Subtarget, 492317017Sdim RTLIB::Libcall LC, SmallVectorImpl<wasm::ValType> &Rets, 493317017Sdim SmallVectorImpl<wasm::ValType> &Params) { 494317017Sdim assert(Rets.empty()); 495317017Sdim assert(Params.empty()); 496317017Sdim 497341825Sdim wasm::ValType iPTR = 498341825Sdim Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 499317017Sdim 500341825Sdim auto& Table = RuntimeLibcallSignatures->Table; 501341825Sdim switch (Table[LC]) { 502317017Sdim case func: 503317017Sdim break; 504317017Sdim case f32_func_f32: 505317017Sdim Rets.push_back(wasm::ValType::F32); 506317017Sdim Params.push_back(wasm::ValType::F32); 507317017Sdim break; 508317017Sdim case f32_func_f64: 509317017Sdim Rets.push_back(wasm::ValType::F32); 510317017Sdim Params.push_back(wasm::ValType::F64); 511317017Sdim break; 512317017Sdim case f32_func_i32: 513317017Sdim Rets.push_back(wasm::ValType::F32); 514317017Sdim Params.push_back(wasm::ValType::I32); 515317017Sdim break; 516317017Sdim case f32_func_i64: 517317017Sdim Rets.push_back(wasm::ValType::F32); 518317017Sdim Params.push_back(wasm::ValType::I64); 519317017Sdim break; 520317017Sdim case f32_func_i16: 521317017Sdim Rets.push_back(wasm::ValType::F32); 522317017Sdim Params.push_back(wasm::ValType::I32); 523317017Sdim break; 524317017Sdim case f64_func_f32: 525317017Sdim Rets.push_back(wasm::ValType::F64); 526317017Sdim Params.push_back(wasm::ValType::F32); 527317017Sdim break; 528317017Sdim case f64_func_f64: 529317017Sdim Rets.push_back(wasm::ValType::F64); 530317017Sdim Params.push_back(wasm::ValType::F64); 531317017Sdim break; 532317017Sdim case f64_func_i32: 533317017Sdim Rets.push_back(wasm::ValType::F64); 534317017Sdim Params.push_back(wasm::ValType::I32); 535317017Sdim break; 536317017Sdim case f64_func_i64: 537317017Sdim Rets.push_back(wasm::ValType::F64); 538317017Sdim Params.push_back(wasm::ValType::I64); 539317017Sdim break; 540317017Sdim case i32_func_f32: 541317017Sdim Rets.push_back(wasm::ValType::I32); 542317017Sdim Params.push_back(wasm::ValType::F32); 543317017Sdim break; 544317017Sdim case i32_func_f64: 545317017Sdim Rets.push_back(wasm::ValType::I32); 546317017Sdim Params.push_back(wasm::ValType::F64); 547317017Sdim break; 548317017Sdim case i32_func_i32: 549317017Sdim Rets.push_back(wasm::ValType::I32); 550317017Sdim Params.push_back(wasm::ValType::I32); 551317017Sdim break; 552317017Sdim case i64_func_f32: 553317017Sdim Rets.push_back(wasm::ValType::I64); 554317017Sdim Params.push_back(wasm::ValType::F32); 555317017Sdim break; 556317017Sdim case i64_func_f64: 557317017Sdim Rets.push_back(wasm::ValType::I64); 558317017Sdim Params.push_back(wasm::ValType::F64); 559317017Sdim break; 560317017Sdim case i64_func_i64: 561317017Sdim Rets.push_back(wasm::ValType::I64); 562317017Sdim Params.push_back(wasm::ValType::I64); 563317017Sdim break; 564317017Sdim case f32_func_f32_f32: 565317017Sdim Rets.push_back(wasm::ValType::F32); 566317017Sdim Params.push_back(wasm::ValType::F32); 567317017Sdim Params.push_back(wasm::ValType::F32); 568317017Sdim break; 569317017Sdim case f32_func_f32_i32: 570317017Sdim Rets.push_back(wasm::ValType::F32); 571317017Sdim Params.push_back(wasm::ValType::F32); 572317017Sdim Params.push_back(wasm::ValType::I32); 573317017Sdim break; 574317017Sdim case f32_func_i64_i64: 575317017Sdim Rets.push_back(wasm::ValType::F32); 576317017Sdim Params.push_back(wasm::ValType::I64); 577317017Sdim Params.push_back(wasm::ValType::I64); 578317017Sdim break; 579317017Sdim case f64_func_f64_f64: 580317017Sdim Rets.push_back(wasm::ValType::F64); 581317017Sdim Params.push_back(wasm::ValType::F64); 582317017Sdim Params.push_back(wasm::ValType::F64); 583317017Sdim break; 584317017Sdim case f64_func_f64_i32: 585317017Sdim Rets.push_back(wasm::ValType::F64); 586317017Sdim Params.push_back(wasm::ValType::F64); 587317017Sdim Params.push_back(wasm::ValType::I32); 588317017Sdim break; 589317017Sdim case f64_func_i64_i64: 590317017Sdim Rets.push_back(wasm::ValType::F64); 591317017Sdim Params.push_back(wasm::ValType::I64); 592317017Sdim Params.push_back(wasm::ValType::I64); 593317017Sdim break; 594317017Sdim case i16_func_f32: 595317017Sdim Rets.push_back(wasm::ValType::I32); 596317017Sdim Params.push_back(wasm::ValType::F32); 597317017Sdim break; 598317017Sdim case i8_func_i8_i8: 599317017Sdim Rets.push_back(wasm::ValType::I32); 600317017Sdim Params.push_back(wasm::ValType::I32); 601317017Sdim Params.push_back(wasm::ValType::I32); 602317017Sdim break; 603317017Sdim case func_f32_iPTR_iPTR: 604317017Sdim Params.push_back(wasm::ValType::F32); 605341825Sdim Params.push_back(iPTR); 606341825Sdim Params.push_back(iPTR); 607317017Sdim break; 608317017Sdim case func_f64_iPTR_iPTR: 609317017Sdim Params.push_back(wasm::ValType::F64); 610341825Sdim Params.push_back(iPTR); 611341825Sdim Params.push_back(iPTR); 612317017Sdim break; 613317017Sdim case i16_func_i16_i16: 614317017Sdim Rets.push_back(wasm::ValType::I32); 615317017Sdim Params.push_back(wasm::ValType::I32); 616317017Sdim Params.push_back(wasm::ValType::I32); 617317017Sdim break; 618317017Sdim case i32_func_f32_f32: 619317017Sdim Rets.push_back(wasm::ValType::I32); 620317017Sdim Params.push_back(wasm::ValType::F32); 621317017Sdim Params.push_back(wasm::ValType::F32); 622317017Sdim break; 623317017Sdim case i32_func_f64_f64: 624317017Sdim Rets.push_back(wasm::ValType::I32); 625317017Sdim Params.push_back(wasm::ValType::F64); 626317017Sdim Params.push_back(wasm::ValType::F64); 627317017Sdim break; 628317017Sdim case i32_func_i32_i32: 629317017Sdim Rets.push_back(wasm::ValType::I32); 630317017Sdim Params.push_back(wasm::ValType::I32); 631317017Sdim Params.push_back(wasm::ValType::I32); 632317017Sdim break; 633341825Sdim case i32_func_i32_i32_iPTR: 634341825Sdim Rets.push_back(wasm::ValType::I32); 635341825Sdim Params.push_back(wasm::ValType::I32); 636341825Sdim Params.push_back(wasm::ValType::I32); 637341825Sdim Params.push_back(iPTR); 638341825Sdim break; 639317017Sdim case i64_func_i64_i64: 640317017Sdim Rets.push_back(wasm::ValType::I64); 641317017Sdim Params.push_back(wasm::ValType::I64); 642317017Sdim Params.push_back(wasm::ValType::I64); 643317017Sdim break; 644341825Sdim case i64_func_i64_i64_iPTR: 645341825Sdim Rets.push_back(wasm::ValType::I64); 646341825Sdim Params.push_back(wasm::ValType::I64); 647341825Sdim Params.push_back(wasm::ValType::I64); 648341825Sdim Params.push_back(iPTR); 649341825Sdim break; 650317017Sdim case i64_i64_func_f32: 651317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 652317017Sdim Rets.push_back(wasm::ValType::I64); 653317017Sdim Rets.push_back(wasm::ValType::I64); 654317017Sdim#else 655341825Sdim Params.push_back(iPTR); 656317017Sdim#endif 657317017Sdim Params.push_back(wasm::ValType::F32); 658317017Sdim break; 659317017Sdim case i64_i64_func_f64: 660317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 661317017Sdim Rets.push_back(wasm::ValType::I64); 662317017Sdim Rets.push_back(wasm::ValType::I64); 663317017Sdim#else 664341825Sdim Params.push_back(iPTR); 665317017Sdim#endif 666317017Sdim Params.push_back(wasm::ValType::F64); 667317017Sdim break; 668317017Sdim case i16_i16_func_i16_i16: 669317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 670317017Sdim Rets.push_back(wasm::ValType::I32); 671317017Sdim Rets.push_back(wasm::ValType::I32); 672317017Sdim#else 673341825Sdim Params.push_back(iPTR); 674317017Sdim#endif 675317017Sdim Params.push_back(wasm::ValType::I32); 676317017Sdim Params.push_back(wasm::ValType::I32); 677317017Sdim break; 678317017Sdim case i32_i32_func_i32_i32: 679317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 680317017Sdim Rets.push_back(wasm::ValType::I32); 681317017Sdim Rets.push_back(wasm::ValType::I32); 682317017Sdim#else 683341825Sdim Params.push_back(iPTR); 684317017Sdim#endif 685317017Sdim Params.push_back(wasm::ValType::I32); 686317017Sdim Params.push_back(wasm::ValType::I32); 687317017Sdim break; 688317017Sdim case i64_i64_func_i64_i64: 689317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 690317017Sdim Rets.push_back(wasm::ValType::I64); 691317017Sdim Rets.push_back(wasm::ValType::I64); 692317017Sdim#else 693341825Sdim Params.push_back(iPTR); 694317017Sdim#endif 695317017Sdim Params.push_back(wasm::ValType::I64); 696317017Sdim Params.push_back(wasm::ValType::I64); 697317017Sdim break; 698317017Sdim case i64_i64_func_i64_i64_i64_i64: 699317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 700317017Sdim Rets.push_back(wasm::ValType::I64); 701317017Sdim Rets.push_back(wasm::ValType::I64); 702317017Sdim#else 703341825Sdim Params.push_back(iPTR); 704317017Sdim#endif 705317017Sdim Params.push_back(wasm::ValType::I64); 706317017Sdim Params.push_back(wasm::ValType::I64); 707317017Sdim Params.push_back(wasm::ValType::I64); 708317017Sdim Params.push_back(wasm::ValType::I64); 709317017Sdim break; 710341825Sdim case i64_i64_func_i64_i64_i64_i64_iPTR: 711341825Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 712341825Sdim Rets.push_back(wasm::ValType::I64); 713341825Sdim Rets.push_back(wasm::ValType::I64); 714341825Sdim#else 715341825Sdim Params.push_back(iPTR); 716341825Sdim#endif 717341825Sdim Params.push_back(wasm::ValType::I64); 718341825Sdim Params.push_back(wasm::ValType::I64); 719341825Sdim Params.push_back(wasm::ValType::I64); 720341825Sdim Params.push_back(wasm::ValType::I64); 721341825Sdim Params.push_back(iPTR); 722341825Sdim break; 723317017Sdim case i64_i64_i64_i64_func_i64_i64_i64_i64: 724317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 725317017Sdim Rets.push_back(wasm::ValType::I64); 726317017Sdim Rets.push_back(wasm::ValType::I64); 727317017Sdim Rets.push_back(wasm::ValType::I64); 728317017Sdim Rets.push_back(wasm::ValType::I64); 729317017Sdim#else 730341825Sdim Params.push_back(iPTR); 731317017Sdim#endif 732317017Sdim Params.push_back(wasm::ValType::I64); 733317017Sdim Params.push_back(wasm::ValType::I64); 734317017Sdim Params.push_back(wasm::ValType::I64); 735317017Sdim Params.push_back(wasm::ValType::I64); 736317017Sdim break; 737317017Sdim case i64_i64_func_i64_i64_i32: 738317017Sdim#if 0 // TODO: Enable this when wasm gets multiple-return-value support. 739317017Sdim Rets.push_back(wasm::ValType::I64); 740317017Sdim Rets.push_back(wasm::ValType::I64); 741317017Sdim Rets.push_back(wasm::ValType::I64); 742317017Sdim Rets.push_back(wasm::ValType::I64); 743317017Sdim#else 744341825Sdim Params.push_back(iPTR); 745317017Sdim#endif 746317017Sdim Params.push_back(wasm::ValType::I64); 747317017Sdim Params.push_back(wasm::ValType::I64); 748317017Sdim Params.push_back(wasm::ValType::I32); 749317017Sdim break; 750317017Sdim case iPTR_func_iPTR_i32_iPTR: 751341825Sdim Rets.push_back(iPTR); 752341825Sdim Params.push_back(iPTR); 753317017Sdim Params.push_back(wasm::ValType::I32); 754341825Sdim Params.push_back(iPTR); 755317017Sdim break; 756317017Sdim case iPTR_func_iPTR_iPTR_iPTR: 757341825Sdim Rets.push_back(iPTR); 758341825Sdim Params.push_back(iPTR); 759341825Sdim Params.push_back(iPTR); 760341825Sdim Params.push_back(iPTR); 761317017Sdim break; 762317017Sdim case f32_func_f32_f32_f32: 763317017Sdim Rets.push_back(wasm::ValType::F32); 764317017Sdim Params.push_back(wasm::ValType::F32); 765317017Sdim Params.push_back(wasm::ValType::F32); 766317017Sdim Params.push_back(wasm::ValType::F32); 767317017Sdim break; 768317017Sdim case f64_func_f64_f64_f64: 769317017Sdim Rets.push_back(wasm::ValType::F64); 770317017Sdim Params.push_back(wasm::ValType::F64); 771317017Sdim Params.push_back(wasm::ValType::F64); 772317017Sdim Params.push_back(wasm::ValType::F64); 773317017Sdim break; 774317017Sdim case func_i64_i64_iPTR_iPTR: 775317017Sdim Params.push_back(wasm::ValType::I64); 776317017Sdim Params.push_back(wasm::ValType::I64); 777341825Sdim Params.push_back(iPTR); 778341825Sdim Params.push_back(iPTR); 779317017Sdim break; 780317017Sdim case func_iPTR_f32: 781341825Sdim Params.push_back(iPTR); 782317017Sdim Params.push_back(wasm::ValType::F32); 783317017Sdim break; 784317017Sdim case func_iPTR_f64: 785341825Sdim Params.push_back(iPTR); 786317017Sdim Params.push_back(wasm::ValType::F64); 787317017Sdim break; 788317017Sdim case func_iPTR_i32: 789341825Sdim Params.push_back(iPTR); 790317017Sdim Params.push_back(wasm::ValType::I32); 791317017Sdim break; 792317017Sdim case func_iPTR_i64: 793341825Sdim Params.push_back(iPTR); 794317017Sdim Params.push_back(wasm::ValType::I64); 795317017Sdim break; 796317017Sdim case func_iPTR_i64_i64: 797341825Sdim Params.push_back(iPTR); 798317017Sdim Params.push_back(wasm::ValType::I64); 799317017Sdim Params.push_back(wasm::ValType::I64); 800317017Sdim break; 801317017Sdim case func_iPTR_i64_i64_i64_i64: 802341825Sdim Params.push_back(iPTR); 803317017Sdim Params.push_back(wasm::ValType::I64); 804317017Sdim Params.push_back(wasm::ValType::I64); 805317017Sdim Params.push_back(wasm::ValType::I64); 806317017Sdim Params.push_back(wasm::ValType::I64); 807317017Sdim break; 808317017Sdim case func_iPTR_i64_i64_i64_i64_i64_i64: 809341825Sdim Params.push_back(iPTR); 810317017Sdim Params.push_back(wasm::ValType::I64); 811317017Sdim Params.push_back(wasm::ValType::I64); 812317017Sdim Params.push_back(wasm::ValType::I64); 813317017Sdim Params.push_back(wasm::ValType::I64); 814317017Sdim Params.push_back(wasm::ValType::I64); 815317017Sdim Params.push_back(wasm::ValType::I64); 816317017Sdim break; 817317017Sdim case i32_func_i64_i64: 818317017Sdim Rets.push_back(wasm::ValType::I32); 819317017Sdim Params.push_back(wasm::ValType::I64); 820317017Sdim Params.push_back(wasm::ValType::I64); 821317017Sdim break; 822317017Sdim case i32_func_i64_i64_i64_i64: 823317017Sdim Rets.push_back(wasm::ValType::I32); 824317017Sdim Params.push_back(wasm::ValType::I64); 825317017Sdim Params.push_back(wasm::ValType::I64); 826317017Sdim Params.push_back(wasm::ValType::I64); 827317017Sdim Params.push_back(wasm::ValType::I64); 828317017Sdim break; 829317017Sdim case unsupported: 830317017Sdim llvm_unreachable("unsupported runtime library signature"); 831317017Sdim } 832317017Sdim} 833317017Sdim 834341825Sdimstatic ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 835341825Sdim// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 836341825Sdim// other than here, just roll its logic into this version. 837317017Sdimvoid llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name, 838317017Sdim SmallVectorImpl<wasm::ValType> &Rets, 839317017Sdim SmallVectorImpl<wasm::ValType> &Params) { 840341825Sdim auto& Map = LibcallNameMap->Map; 841341825Sdim auto val = Map.find(Name); 842341825Sdim assert(val != Map.end() && "unexpected runtime library name"); 843341825Sdim return GetSignature(Subtarget, val->second, Rets, Params); 844317017Sdim} 845