1*0b57cec5SDimitry Andric // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric /// 9*0b57cec5SDimitry Andric /// \file 10*0b57cec5SDimitry Andric /// This file contains signature information for runtime libcalls. 11*0b57cec5SDimitry Andric /// 12*0b57cec5SDimitry Andric /// CodeGen uses external symbols, which it refers to by name. The WebAssembly 13*0b57cec5SDimitry Andric /// target needs type information for all functions. This file contains a big 14*0b57cec5SDimitry Andric /// table providing type signatures for all runtime library functions that LLVM 15*0b57cec5SDimitry Andric /// uses. 16*0b57cec5SDimitry Andric /// 17*0b57cec5SDimitry Andric /// This is currently a fairly heavy-handed solution. 18*0b57cec5SDimitry Andric /// 19*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric #include "WebAssemblyRuntimeLibcallSignatures.h" 22*0b57cec5SDimitry Andric #include "WebAssemblySubtarget.h" 23*0b57cec5SDimitry Andric #include "llvm/CodeGen/RuntimeLibcalls.h" 24*0b57cec5SDimitry Andric 25*0b57cec5SDimitry Andric using namespace llvm; 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric namespace { 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric enum RuntimeLibcallSignature { 30*0b57cec5SDimitry Andric func, 31*0b57cec5SDimitry Andric f32_func_f32, 32*0b57cec5SDimitry Andric f32_func_f64, 33*0b57cec5SDimitry Andric f32_func_i32, 34*0b57cec5SDimitry Andric f32_func_i64, 35*0b57cec5SDimitry Andric f32_func_i16, 36*0b57cec5SDimitry Andric f64_func_f32, 37*0b57cec5SDimitry Andric f64_func_f64, 38*0b57cec5SDimitry Andric f64_func_i32, 39*0b57cec5SDimitry Andric f64_func_i64, 40*0b57cec5SDimitry Andric i32_func_f32, 41*0b57cec5SDimitry Andric i32_func_f64, 42*0b57cec5SDimitry Andric i32_func_i32, 43*0b57cec5SDimitry Andric i64_func_f32, 44*0b57cec5SDimitry Andric i64_func_f64, 45*0b57cec5SDimitry Andric i64_func_i64, 46*0b57cec5SDimitry Andric f32_func_f32_f32, 47*0b57cec5SDimitry Andric f32_func_f32_i32, 48*0b57cec5SDimitry Andric f32_func_i64_i64, 49*0b57cec5SDimitry Andric f64_func_f64_f64, 50*0b57cec5SDimitry Andric f64_func_f64_i32, 51*0b57cec5SDimitry Andric f64_func_i64_i64, 52*0b57cec5SDimitry Andric i16_func_f32, 53*0b57cec5SDimitry Andric i16_func_f64, 54*0b57cec5SDimitry Andric i16_func_i64_i64, 55*0b57cec5SDimitry Andric i8_func_i8_i8, 56*0b57cec5SDimitry Andric func_f32_iPTR_iPTR, 57*0b57cec5SDimitry Andric func_f64_iPTR_iPTR, 58*0b57cec5SDimitry Andric i16_func_i16_i16, 59*0b57cec5SDimitry Andric i32_func_f32_f32, 60*0b57cec5SDimitry Andric i32_func_f64_f64, 61*0b57cec5SDimitry Andric i32_func_i32_i32, 62*0b57cec5SDimitry Andric i32_func_i32_i32_iPTR, 63*0b57cec5SDimitry Andric i64_func_i64_i64, 64*0b57cec5SDimitry Andric i64_func_i64_i64_iPTR, 65*0b57cec5SDimitry Andric i64_i64_func_f32, 66*0b57cec5SDimitry Andric i64_i64_func_f64, 67*0b57cec5SDimitry Andric i16_i16_func_i16_i16, 68*0b57cec5SDimitry Andric i32_i32_func_i32_i32, 69*0b57cec5SDimitry Andric i64_i64_func_i64_i64, 70*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i64_i64, 71*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i64_i64_iPTR, 72*0b57cec5SDimitry Andric i64_i64_i64_i64_func_i64_i64_i64_i64, 73*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i32, 74*0b57cec5SDimitry Andric iPTR_func_iPTR_i32_iPTR, 75*0b57cec5SDimitry Andric iPTR_func_iPTR_iPTR_iPTR, 76*0b57cec5SDimitry Andric f32_func_f32_f32_f32, 77*0b57cec5SDimitry Andric f64_func_f64_f64_f64, 78*0b57cec5SDimitry Andric func_i64_i64_iPTR_iPTR, 79*0b57cec5SDimitry Andric func_iPTR_f32, 80*0b57cec5SDimitry Andric func_iPTR_f64, 81*0b57cec5SDimitry Andric func_iPTR_i32, 82*0b57cec5SDimitry Andric func_iPTR_i64, 83*0b57cec5SDimitry Andric func_iPTR_i64_i64, 845ffd83dbSDimitry Andric func_iPTR_i64_i64_i32, 85*0b57cec5SDimitry Andric func_iPTR_i64_i64_i64_i64, 86*0b57cec5SDimitry Andric func_iPTR_i64_i64_i64_i64_i64_i64, 87*0b57cec5SDimitry Andric i32_func_i64_i64, 88*0b57cec5SDimitry Andric i32_func_i64_i64_i64_i64, 89*0b57cec5SDimitry Andric iPTR_func_f32, 90*0b57cec5SDimitry Andric iPTR_func_f64, 91*0b57cec5SDimitry Andric iPTR_func_i64_i64, 92*0b57cec5SDimitry Andric unsupported 93*0b57cec5SDimitry Andric }; 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andric struct RuntimeLibcallSignatureTable { 96*0b57cec5SDimitry Andric std::vector<RuntimeLibcallSignature> Table; 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andric // Any newly-added libcalls will be unsupported by default. 99*0b57cec5SDimitry Andric RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) { 100*0b57cec5SDimitry Andric // Integer 101*0b57cec5SDimitry Andric Table[RTLIB::SHL_I16] = i16_func_i16_i16; 102*0b57cec5SDimitry Andric Table[RTLIB::SHL_I32] = i32_func_i32_i32; 103*0b57cec5SDimitry Andric Table[RTLIB::SHL_I64] = i64_func_i64_i64; 104*0b57cec5SDimitry Andric Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32; 105*0b57cec5SDimitry Andric Table[RTLIB::SRL_I16] = i16_func_i16_i16; 106*0b57cec5SDimitry Andric Table[RTLIB::SRL_I32] = i32_func_i32_i32; 107*0b57cec5SDimitry Andric Table[RTLIB::SRL_I64] = i64_func_i64_i64; 108*0b57cec5SDimitry Andric Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32; 109*0b57cec5SDimitry Andric Table[RTLIB::SRA_I16] = i16_func_i16_i16; 110*0b57cec5SDimitry Andric Table[RTLIB::SRA_I32] = i32_func_i32_i32; 111*0b57cec5SDimitry Andric Table[RTLIB::SRA_I64] = i64_func_i64_i64; 112*0b57cec5SDimitry Andric Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32; 113*0b57cec5SDimitry Andric Table[RTLIB::MUL_I8] = i8_func_i8_i8; 114*0b57cec5SDimitry Andric Table[RTLIB::MUL_I16] = i16_func_i16_i16; 115*0b57cec5SDimitry Andric Table[RTLIB::MUL_I32] = i32_func_i32_i32; 116*0b57cec5SDimitry Andric Table[RTLIB::MUL_I64] = i64_func_i64_i64; 117*0b57cec5SDimitry Andric Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64; 118*0b57cec5SDimitry Andric Table[RTLIB::MULO_I32] = i32_func_i32_i32_iPTR; 119*0b57cec5SDimitry Andric Table[RTLIB::MULO_I64] = i64_func_i64_i64_iPTR; 120*0b57cec5SDimitry Andric Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64_iPTR; 121*0b57cec5SDimitry Andric Table[RTLIB::SDIV_I8] = i8_func_i8_i8; 122*0b57cec5SDimitry Andric Table[RTLIB::SDIV_I16] = i16_func_i16_i16; 123*0b57cec5SDimitry Andric Table[RTLIB::SDIV_I32] = i32_func_i32_i32; 124*0b57cec5SDimitry Andric Table[RTLIB::SDIV_I64] = i64_func_i64_i64; 125*0b57cec5SDimitry Andric Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64; 126*0b57cec5SDimitry Andric Table[RTLIB::UDIV_I8] = i8_func_i8_i8; 127*0b57cec5SDimitry Andric Table[RTLIB::UDIV_I16] = i16_func_i16_i16; 128*0b57cec5SDimitry Andric Table[RTLIB::UDIV_I32] = i32_func_i32_i32; 129*0b57cec5SDimitry Andric Table[RTLIB::UDIV_I64] = i64_func_i64_i64; 130*0b57cec5SDimitry Andric Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64; 131*0b57cec5SDimitry Andric Table[RTLIB::SREM_I8] = i8_func_i8_i8; 132*0b57cec5SDimitry Andric Table[RTLIB::SREM_I16] = i16_func_i16_i16; 133*0b57cec5SDimitry Andric Table[RTLIB::SREM_I32] = i32_func_i32_i32; 134*0b57cec5SDimitry Andric Table[RTLIB::SREM_I64] = i64_func_i64_i64; 135*0b57cec5SDimitry Andric Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64; 136*0b57cec5SDimitry Andric Table[RTLIB::UREM_I8] = i8_func_i8_i8; 137*0b57cec5SDimitry Andric Table[RTLIB::UREM_I16] = i16_func_i16_i16; 138*0b57cec5SDimitry Andric Table[RTLIB::UREM_I32] = i32_func_i32_i32; 139*0b57cec5SDimitry Andric Table[RTLIB::UREM_I64] = i64_func_i64_i64; 140*0b57cec5SDimitry Andric Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64; 141*0b57cec5SDimitry Andric Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8; 142*0b57cec5SDimitry Andric Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16; 143*0b57cec5SDimitry Andric Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32; 144*0b57cec5SDimitry Andric Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64; 145*0b57cec5SDimitry Andric Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 146*0b57cec5SDimitry Andric Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8; 147*0b57cec5SDimitry Andric Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16; 148*0b57cec5SDimitry Andric Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32; 149*0b57cec5SDimitry Andric Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64; 150*0b57cec5SDimitry Andric Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; 151*0b57cec5SDimitry Andric Table[RTLIB::NEG_I32] = i32_func_i32; 152*0b57cec5SDimitry Andric Table[RTLIB::NEG_I64] = i64_func_i64; 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric // Floating-point. 155*0b57cec5SDimitry Andric // All F80 and PPCF128 routines are unsupported. 156*0b57cec5SDimitry Andric Table[RTLIB::ADD_F32] = f32_func_f32_f32; 157*0b57cec5SDimitry Andric Table[RTLIB::ADD_F64] = f64_func_f64_f64; 158*0b57cec5SDimitry Andric Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64; 159*0b57cec5SDimitry Andric Table[RTLIB::SUB_F32] = f32_func_f32_f32; 160*0b57cec5SDimitry Andric Table[RTLIB::SUB_F64] = f64_func_f64_f64; 161*0b57cec5SDimitry Andric Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64; 162*0b57cec5SDimitry Andric Table[RTLIB::MUL_F32] = f32_func_f32_f32; 163*0b57cec5SDimitry Andric Table[RTLIB::MUL_F64] = f64_func_f64_f64; 164*0b57cec5SDimitry Andric Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64; 165*0b57cec5SDimitry Andric Table[RTLIB::DIV_F32] = f32_func_f32_f32; 166*0b57cec5SDimitry Andric Table[RTLIB::DIV_F64] = f64_func_f64_f64; 167*0b57cec5SDimitry Andric Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64; 168*0b57cec5SDimitry Andric Table[RTLIB::REM_F32] = f32_func_f32_f32; 169*0b57cec5SDimitry Andric Table[RTLIB::REM_F64] = f64_func_f64_f64; 170*0b57cec5SDimitry Andric Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64; 171*0b57cec5SDimitry Andric Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32; 172*0b57cec5SDimitry Andric Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64; 173*0b57cec5SDimitry Andric Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64; 174*0b57cec5SDimitry Andric Table[RTLIB::POWI_F32] = f32_func_f32_i32; 175*0b57cec5SDimitry Andric Table[RTLIB::POWI_F64] = f64_func_f64_i32; 1765ffd83dbSDimitry Andric Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i32; 177*0b57cec5SDimitry Andric Table[RTLIB::SQRT_F32] = f32_func_f32; 178*0b57cec5SDimitry Andric Table[RTLIB::SQRT_F64] = f64_func_f64; 179*0b57cec5SDimitry Andric Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64; 1805ffd83dbSDimitry Andric Table[RTLIB::CBRT_F32] = f32_func_f32; 1815ffd83dbSDimitry Andric Table[RTLIB::CBRT_F64] = f64_func_f64; 1825ffd83dbSDimitry Andric Table[RTLIB::CBRT_F128] = func_iPTR_i64_i64; 183*0b57cec5SDimitry Andric Table[RTLIB::LOG_F32] = f32_func_f32; 184*0b57cec5SDimitry Andric Table[RTLIB::LOG_F64] = f64_func_f64; 185*0b57cec5SDimitry Andric Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; 186*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F32] = f32_func_f32; 187*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F64] = f64_func_f64; 188*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; 189*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F32] = f32_func_f32; 190*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F64] = f64_func_f64; 191*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; 192*0b57cec5SDimitry Andric Table[RTLIB::EXP_F32] = f32_func_f32; 193*0b57cec5SDimitry Andric Table[RTLIB::EXP_F64] = f64_func_f64; 194*0b57cec5SDimitry Andric Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; 195*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F32] = f32_func_f32; 196*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F64] = f64_func_f64; 197*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; 198*0b57cec5SDimitry Andric Table[RTLIB::SIN_F32] = f32_func_f32; 199*0b57cec5SDimitry Andric Table[RTLIB::SIN_F64] = f64_func_f64; 200*0b57cec5SDimitry Andric Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; 201*0b57cec5SDimitry Andric Table[RTLIB::COS_F32] = f32_func_f32; 202*0b57cec5SDimitry Andric Table[RTLIB::COS_F64] = f64_func_f64; 203*0b57cec5SDimitry Andric Table[RTLIB::COS_F128] = func_iPTR_i64_i64; 204*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; 205*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; 206*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; 207*0b57cec5SDimitry Andric Table[RTLIB::POW_F32] = f32_func_f32_f32; 208*0b57cec5SDimitry Andric Table[RTLIB::POW_F64] = f64_func_f64_f64; 209*0b57cec5SDimitry Andric Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; 210*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F32] = f32_func_f32; 211*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F64] = f64_func_f64; 212*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; 213*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F32] = f32_func_f32; 214*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F64] = f64_func_f64; 215*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; 216*0b57cec5SDimitry Andric Table[RTLIB::RINT_F32] = f32_func_f32; 217*0b57cec5SDimitry Andric Table[RTLIB::RINT_F64] = f64_func_f64; 218*0b57cec5SDimitry Andric Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; 219*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F32] = f32_func_f32; 220*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F64] = f64_func_f64; 221*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; 222*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F32] = f32_func_f32; 223*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F64] = f64_func_f64; 224*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; 225*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F32] = iPTR_func_f32; 226*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F64] = iPTR_func_f64; 227*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64; 228*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F32] = i64_func_f32; 229*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F64] = i64_func_f64; 230*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F128] = i64_func_i64_i64; 231*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F32] = iPTR_func_f32; 232*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F64] = iPTR_func_f64; 233*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64; 234*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F32] = i64_func_f32; 235*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F64] = i64_func_f64; 236*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F128] = i64_func_i64_i64; 237*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F32] = f32_func_f32; 238*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F64] = f64_func_f64; 239*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; 240*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; 241*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; 242*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; 243*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F32] = f32_func_f32_f32; 244*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F64] = f64_func_f64_f64; 245*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; 246*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F32] = f32_func_f32_f32; 247*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F64] = f64_func_f64_f64; 248*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; 249*0b57cec5SDimitry Andric 250*0b57cec5SDimitry Andric // Conversion 251*0b57cec5SDimitry Andric // All F80 and PPCF128 routines are unsupported. 252*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; 253*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; 254*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; 255*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; 256*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; 257*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F64_F16] = i16_func_f64; 258*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; 259*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64; 260*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; 261*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; 262*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; 263*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; 264*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; 265*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; 266*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; 267*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; 268*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; 269*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; 270*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; 271*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; 272*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; 273*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; 274*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; 275*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; 276*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; 277*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; 278*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; 279*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; 280*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; 281*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; 282*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; 283*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; 284*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; 285*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; 286*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; 287*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; 288*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; 289*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; 290*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; 291*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; 292*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; 293*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; 294*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; 295*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; 296*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; 297*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; 298*0b57cec5SDimitry Andric 299*0b57cec5SDimitry Andric // Comparison 300*0b57cec5SDimitry Andric // ALl F80 and PPCF128 routines are unsupported. 301*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F32] = i32_func_f32_f32; 302*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F64] = i32_func_f64_f64; 303*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; 304*0b57cec5SDimitry Andric Table[RTLIB::UNE_F32] = i32_func_f32_f32; 305*0b57cec5SDimitry Andric Table[RTLIB::UNE_F64] = i32_func_f64_f64; 306*0b57cec5SDimitry Andric Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; 307*0b57cec5SDimitry Andric Table[RTLIB::OGE_F32] = i32_func_f32_f32; 308*0b57cec5SDimitry Andric Table[RTLIB::OGE_F64] = i32_func_f64_f64; 309*0b57cec5SDimitry Andric Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; 310*0b57cec5SDimitry Andric Table[RTLIB::OLT_F32] = i32_func_f32_f32; 311*0b57cec5SDimitry Andric Table[RTLIB::OLT_F64] = i32_func_f64_f64; 312*0b57cec5SDimitry Andric Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; 313*0b57cec5SDimitry Andric Table[RTLIB::OLE_F32] = i32_func_f32_f32; 314*0b57cec5SDimitry Andric Table[RTLIB::OLE_F64] = i32_func_f64_f64; 315*0b57cec5SDimitry Andric Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; 316*0b57cec5SDimitry Andric Table[RTLIB::OGT_F32] = i32_func_f32_f32; 317*0b57cec5SDimitry Andric Table[RTLIB::OGT_F64] = i32_func_f64_f64; 318*0b57cec5SDimitry Andric Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; 319*0b57cec5SDimitry Andric Table[RTLIB::UO_F32] = i32_func_f32_f32; 320*0b57cec5SDimitry Andric Table[RTLIB::UO_F64] = i32_func_f64_f64; 321*0b57cec5SDimitry Andric Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; 322*0b57cec5SDimitry Andric 323*0b57cec5SDimitry Andric // Memory 324*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 325*0b57cec5SDimitry Andric Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 326*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 327*0b57cec5SDimitry Andric 328*0b57cec5SDimitry Andric // __stack_chk_fail 329*0b57cec5SDimitry Andric Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func; 330*0b57cec5SDimitry Andric 331*0b57cec5SDimitry Andric // Return address handling 332*0b57cec5SDimitry Andric Table[RTLIB::RETURN_ADDRESS] = i32_func_i32; 333*0b57cec5SDimitry Andric 334*0b57cec5SDimitry Andric // Element-wise Atomic memory 335*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 336*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 337*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 338*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 339*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 340*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 341*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 342*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 343*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 344*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 345*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 346*0b57cec5SDimitry Andric 347*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 348*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 349*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 350*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 351*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 352*0b57cec5SDimitry Andric 353*0b57cec5SDimitry Andric // Atomic '__sync_*' libcalls. 354*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 355*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 356*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 357*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 358*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 359*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 360*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 361*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 362*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 363*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 364*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 365*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 366*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 367*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 368*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 369*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 370*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 371*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 372*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 373*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 374*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 375*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 376*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 377*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 378*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 379*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 380*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 381*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 382*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 383*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 384*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 385*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 386*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 387*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 388*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 389*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 390*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 391*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 392*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 393*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 394*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 395*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 396*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 397*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 398*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 399*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 400*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 401*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 402*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 403*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 404*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 405*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 406*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 407*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 408*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 409*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 410*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 411*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 412*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 413*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 414*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 415*0b57cec5SDimitry Andric 416*0b57cec5SDimitry Andric // Atomic '__atomic_*' libcalls. 417*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 418*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD] = unsupported; 419*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 420*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 421*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 422*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 423*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 424*0b57cec5SDimitry Andric 425*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE] = unsupported; 426*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_1] = unsupported; 427*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_2] = unsupported; 428*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_4] = unsupported; 429*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_8] = unsupported; 430*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_16] = unsupported; 431*0b57cec5SDimitry Andric 432*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 433*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 434*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 435*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 436*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 437*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 438*0b57cec5SDimitry Andric 439*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 440*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 441*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 442*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 443*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 444*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 445*0b57cec5SDimitry Andric 446*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 447*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 448*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 449*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 450*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 451*0b57cec5SDimitry Andric 452*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 453*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 454*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 455*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 456*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 457*0b57cec5SDimitry Andric 458*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 459*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 460*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 461*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 462*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 465*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 466*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 467*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 468*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 469*0b57cec5SDimitry Andric 470*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 471*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 472*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 473*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 474*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 475*0b57cec5SDimitry Andric 476*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 477*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 478*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 479*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 480*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 481*0b57cec5SDimitry Andric } 482*0b57cec5SDimitry Andric }; 483*0b57cec5SDimitry Andric 484753f127fSDimitry Andric RuntimeLibcallSignatureTable &getRuntimeLibcallSignatures() { 485753f127fSDimitry Andric static RuntimeLibcallSignatureTable RuntimeLibcallSignatures; 486753f127fSDimitry Andric return RuntimeLibcallSignatures; 487753f127fSDimitry Andric } 488*0b57cec5SDimitry Andric 489*0b57cec5SDimitry Andric // Maps libcall names to their RTLIB::Libcall number. Builds the map in a 490753f127fSDimitry Andric // constructor for use with a static variable 491*0b57cec5SDimitry Andric struct StaticLibcallNameMap { 492*0b57cec5SDimitry Andric StringMap<RTLIB::Libcall> Map; 493*0b57cec5SDimitry Andric StaticLibcallNameMap() { 494*0b57cec5SDimitry Andric static const std::pair<const char *, RTLIB::Libcall> NameLibcalls[] = { 495*0b57cec5SDimitry Andric #define HANDLE_LIBCALL(code, name) {(const char *)name, RTLIB::code}, 496*0b57cec5SDimitry Andric #include "llvm/IR/RuntimeLibcalls.def" 497*0b57cec5SDimitry Andric #undef HANDLE_LIBCALL 498*0b57cec5SDimitry Andric }; 499*0b57cec5SDimitry Andric for (const auto &NameLibcall : NameLibcalls) { 500*0b57cec5SDimitry Andric if (NameLibcall.first != nullptr && 501753f127fSDimitry Andric getRuntimeLibcallSignatures().Table[NameLibcall.second] != 502753f127fSDimitry Andric unsupported) { 503*0b57cec5SDimitry Andric assert(Map.find(NameLibcall.first) == Map.end() && 504*0b57cec5SDimitry Andric "duplicate libcall names in name map"); 505*0b57cec5SDimitry Andric Map[NameLibcall.first] = NameLibcall.second; 506*0b57cec5SDimitry Andric } 507*0b57cec5SDimitry Andric } 508*0b57cec5SDimitry Andric // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is 509*0b57cec5SDimitry Andric // consistent with the f64 and f128 names. 510*0b57cec5SDimitry Andric Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32; 511*0b57cec5SDimitry Andric Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16; 512*0b57cec5SDimitry Andric 513*0b57cec5SDimitry Andric Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS; 514*0b57cec5SDimitry Andric } 515*0b57cec5SDimitry Andric }; 516*0b57cec5SDimitry Andric 517*0b57cec5SDimitry Andric } // end anonymous namespace 518*0b57cec5SDimitry Andric 519*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 520*0b57cec5SDimitry Andric RTLIB::Libcall LC, 521*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Rets, 522*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Params) { 523*0b57cec5SDimitry Andric assert(Rets.empty()); 524*0b57cec5SDimitry Andric assert(Params.empty()); 525*0b57cec5SDimitry Andric 526*0b57cec5SDimitry Andric wasm::ValType PtrTy = 527*0b57cec5SDimitry Andric Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 528*0b57cec5SDimitry Andric 529753f127fSDimitry Andric auto &Table = getRuntimeLibcallSignatures().Table; 530*0b57cec5SDimitry Andric switch (Table[LC]) { 531*0b57cec5SDimitry Andric case func: 532*0b57cec5SDimitry Andric break; 533*0b57cec5SDimitry Andric case f32_func_f32: 534*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 535*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 536*0b57cec5SDimitry Andric break; 537*0b57cec5SDimitry Andric case f32_func_f64: 538*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 539*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 540*0b57cec5SDimitry Andric break; 541*0b57cec5SDimitry Andric case f32_func_i32: 542*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 543*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 544*0b57cec5SDimitry Andric break; 545*0b57cec5SDimitry Andric case f32_func_i64: 546*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 547*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 548*0b57cec5SDimitry Andric break; 549*0b57cec5SDimitry Andric case f32_func_i16: 550*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 551*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 552*0b57cec5SDimitry Andric break; 553*0b57cec5SDimitry Andric case f64_func_f32: 554*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 555*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 556*0b57cec5SDimitry Andric break; 557*0b57cec5SDimitry Andric case f64_func_f64: 558*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 559*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 560*0b57cec5SDimitry Andric break; 561*0b57cec5SDimitry Andric case f64_func_i32: 562*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 563*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 564*0b57cec5SDimitry Andric break; 565*0b57cec5SDimitry Andric case f64_func_i64: 566*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 567*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 568*0b57cec5SDimitry Andric break; 569*0b57cec5SDimitry Andric case i32_func_f32: 570*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 571*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 572*0b57cec5SDimitry Andric break; 573*0b57cec5SDimitry Andric case i32_func_f64: 574*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 575*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 576*0b57cec5SDimitry Andric break; 577*0b57cec5SDimitry Andric case i32_func_i32: 578*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 579*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 580*0b57cec5SDimitry Andric break; 581*0b57cec5SDimitry Andric case i64_func_f32: 582*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 583*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 584*0b57cec5SDimitry Andric break; 585*0b57cec5SDimitry Andric case i64_func_f64: 586*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 587*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 588*0b57cec5SDimitry Andric break; 589*0b57cec5SDimitry Andric case i64_func_i64: 590*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 591*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 592*0b57cec5SDimitry Andric break; 593*0b57cec5SDimitry Andric case f32_func_f32_f32: 594*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 595*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 596*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 597*0b57cec5SDimitry Andric break; 598*0b57cec5SDimitry Andric case f32_func_f32_i32: 599*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 600*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 601*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 602*0b57cec5SDimitry Andric break; 603*0b57cec5SDimitry Andric case f32_func_i64_i64: 604*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 605*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 606*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 607*0b57cec5SDimitry Andric break; 608*0b57cec5SDimitry Andric case f64_func_f64_f64: 609*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 610*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 611*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 612*0b57cec5SDimitry Andric break; 613*0b57cec5SDimitry Andric case f64_func_f64_i32: 614*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 615*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 616*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 617*0b57cec5SDimitry Andric break; 618*0b57cec5SDimitry Andric case f64_func_i64_i64: 619*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 620*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 621*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 622*0b57cec5SDimitry Andric break; 623*0b57cec5SDimitry Andric case i16_func_f32: 624*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 625*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 626*0b57cec5SDimitry Andric break; 627*0b57cec5SDimitry Andric case i16_func_f64: 628*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 629*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 630*0b57cec5SDimitry Andric break; 631*0b57cec5SDimitry Andric case i16_func_i64_i64: 632*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 633*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 634*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 635*0b57cec5SDimitry Andric break; 636*0b57cec5SDimitry Andric case i8_func_i8_i8: 637*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 638*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 639*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 640*0b57cec5SDimitry Andric break; 641*0b57cec5SDimitry Andric case func_f32_iPTR_iPTR: 642*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 643*0b57cec5SDimitry Andric Params.push_back(PtrTy); 644*0b57cec5SDimitry Andric Params.push_back(PtrTy); 645*0b57cec5SDimitry Andric break; 646*0b57cec5SDimitry Andric case func_f64_iPTR_iPTR: 647*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 648*0b57cec5SDimitry Andric Params.push_back(PtrTy); 649*0b57cec5SDimitry Andric Params.push_back(PtrTy); 650*0b57cec5SDimitry Andric break; 651*0b57cec5SDimitry Andric case i16_func_i16_i16: 652*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 653*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 654*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 655*0b57cec5SDimitry Andric break; 656*0b57cec5SDimitry Andric case i32_func_f32_f32: 657*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 658*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 659*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 660*0b57cec5SDimitry Andric break; 661*0b57cec5SDimitry Andric case i32_func_f64_f64: 662*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 663*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 664*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 665*0b57cec5SDimitry Andric break; 666*0b57cec5SDimitry Andric case i32_func_i32_i32: 667*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 668*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 669*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 670*0b57cec5SDimitry Andric break; 671*0b57cec5SDimitry Andric case i32_func_i32_i32_iPTR: 672*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 673*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 674*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 675*0b57cec5SDimitry Andric Params.push_back(PtrTy); 676*0b57cec5SDimitry Andric break; 677*0b57cec5SDimitry Andric case i64_func_i64_i64: 678*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 679*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 680*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 681*0b57cec5SDimitry Andric break; 682*0b57cec5SDimitry Andric case i64_func_i64_i64_iPTR: 683*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 684*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 685*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 686*0b57cec5SDimitry Andric Params.push_back(PtrTy); 687*0b57cec5SDimitry Andric break; 688*0b57cec5SDimitry Andric case i64_i64_func_f32: 689*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 690*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 691*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 692*0b57cec5SDimitry Andric #else 693*0b57cec5SDimitry Andric Params.push_back(PtrTy); 694*0b57cec5SDimitry Andric #endif 695*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 696*0b57cec5SDimitry Andric break; 697*0b57cec5SDimitry Andric case i64_i64_func_f64: 698*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 699*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 700*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 701*0b57cec5SDimitry Andric #else 702*0b57cec5SDimitry Andric Params.push_back(PtrTy); 703*0b57cec5SDimitry Andric #endif 704*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 705*0b57cec5SDimitry Andric break; 706*0b57cec5SDimitry Andric case i16_i16_func_i16_i16: 707*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 708*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 709*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 710*0b57cec5SDimitry Andric #else 711*0b57cec5SDimitry Andric Params.push_back(PtrTy); 712*0b57cec5SDimitry Andric #endif 713*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 714*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 715*0b57cec5SDimitry Andric break; 716*0b57cec5SDimitry Andric case i32_i32_func_i32_i32: 717*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 718*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 719*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 720*0b57cec5SDimitry Andric #else 721*0b57cec5SDimitry Andric Params.push_back(PtrTy); 722*0b57cec5SDimitry Andric #endif 723*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 724*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 725*0b57cec5SDimitry Andric break; 726*0b57cec5SDimitry Andric case i64_i64_func_i64_i64: 727*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 728*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 729*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 730*0b57cec5SDimitry Andric #else 731*0b57cec5SDimitry Andric Params.push_back(PtrTy); 732*0b57cec5SDimitry Andric #endif 733*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 734*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 735*0b57cec5SDimitry Andric break; 736*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i64_i64: 737*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 738*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 739*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 740*0b57cec5SDimitry Andric #else 741*0b57cec5SDimitry Andric Params.push_back(PtrTy); 742*0b57cec5SDimitry Andric #endif 743*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 744*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 745*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 746*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 747*0b57cec5SDimitry Andric break; 748*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i64_i64_iPTR: 749*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 750*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 751*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 752*0b57cec5SDimitry Andric #else 753*0b57cec5SDimitry Andric Params.push_back(PtrTy); 754*0b57cec5SDimitry Andric #endif 755*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 756*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 757*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 758*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 759*0b57cec5SDimitry Andric Params.push_back(PtrTy); 760*0b57cec5SDimitry Andric break; 761*0b57cec5SDimitry Andric case i64_i64_i64_i64_func_i64_i64_i64_i64: 762*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 763*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 764*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 765*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 766*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 767*0b57cec5SDimitry Andric #else 768*0b57cec5SDimitry Andric Params.push_back(PtrTy); 769*0b57cec5SDimitry Andric #endif 770*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 771*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 772*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 773*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 774*0b57cec5SDimitry Andric break; 775*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i32: 776*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 777*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 778*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 779*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 780*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 781*0b57cec5SDimitry Andric #else 782*0b57cec5SDimitry Andric Params.push_back(PtrTy); 783*0b57cec5SDimitry Andric #endif 784*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 785*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 786*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 787*0b57cec5SDimitry Andric break; 788*0b57cec5SDimitry Andric case iPTR_func_iPTR_i32_iPTR: 789*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 790*0b57cec5SDimitry Andric Params.push_back(PtrTy); 791*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 792*0b57cec5SDimitry Andric Params.push_back(PtrTy); 793*0b57cec5SDimitry Andric break; 794*0b57cec5SDimitry Andric case iPTR_func_iPTR_iPTR_iPTR: 795*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 796*0b57cec5SDimitry Andric Params.push_back(PtrTy); 797*0b57cec5SDimitry Andric Params.push_back(PtrTy); 798*0b57cec5SDimitry Andric Params.push_back(PtrTy); 799*0b57cec5SDimitry Andric break; 800*0b57cec5SDimitry Andric case f32_func_f32_f32_f32: 801*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 802*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 803*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 804*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 805*0b57cec5SDimitry Andric break; 806*0b57cec5SDimitry Andric case f64_func_f64_f64_f64: 807*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 808*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 809*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 810*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 811*0b57cec5SDimitry Andric break; 812*0b57cec5SDimitry Andric case func_i64_i64_iPTR_iPTR: 813*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 814*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 815*0b57cec5SDimitry Andric Params.push_back(PtrTy); 816*0b57cec5SDimitry Andric Params.push_back(PtrTy); 817*0b57cec5SDimitry Andric break; 818*0b57cec5SDimitry Andric case func_iPTR_f32: 819*0b57cec5SDimitry Andric Params.push_back(PtrTy); 820*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 821*0b57cec5SDimitry Andric break; 822*0b57cec5SDimitry Andric case func_iPTR_f64: 823*0b57cec5SDimitry Andric Params.push_back(PtrTy); 824*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 825*0b57cec5SDimitry Andric break; 826*0b57cec5SDimitry Andric case func_iPTR_i32: 827*0b57cec5SDimitry Andric Params.push_back(PtrTy); 828*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 829*0b57cec5SDimitry Andric break; 830*0b57cec5SDimitry Andric case func_iPTR_i64: 831*0b57cec5SDimitry Andric Params.push_back(PtrTy); 832*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 833*0b57cec5SDimitry Andric break; 834*0b57cec5SDimitry Andric case func_iPTR_i64_i64: 835*0b57cec5SDimitry Andric Params.push_back(PtrTy); 836*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 837*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 838*0b57cec5SDimitry Andric break; 8395ffd83dbSDimitry Andric case func_iPTR_i64_i64_i32: 8405ffd83dbSDimitry Andric Params.push_back(PtrTy); 8415ffd83dbSDimitry Andric Params.push_back(wasm::ValType::I64); 8425ffd83dbSDimitry Andric Params.push_back(wasm::ValType::I64); 8435ffd83dbSDimitry Andric Params.push_back(wasm::ValType::I32); 8445ffd83dbSDimitry Andric break; 845*0b57cec5SDimitry Andric case func_iPTR_i64_i64_i64_i64: 846*0b57cec5SDimitry Andric Params.push_back(PtrTy); 847*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 848*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 849*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 850*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 851*0b57cec5SDimitry Andric break; 852*0b57cec5SDimitry Andric case func_iPTR_i64_i64_i64_i64_i64_i64: 853*0b57cec5SDimitry Andric Params.push_back(PtrTy); 854*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 855*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 856*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 857*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 858*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 859*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 860*0b57cec5SDimitry Andric break; 861*0b57cec5SDimitry Andric case i32_func_i64_i64: 862*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 863*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 864*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 865*0b57cec5SDimitry Andric break; 866*0b57cec5SDimitry Andric case i32_func_i64_i64_i64_i64: 867*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 868*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 869*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 870*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 871*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 872*0b57cec5SDimitry Andric break; 873*0b57cec5SDimitry Andric case iPTR_func_f32: 874*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 875*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 876*0b57cec5SDimitry Andric break; 877*0b57cec5SDimitry Andric case iPTR_func_f64: 878*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 879*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 880*0b57cec5SDimitry Andric break; 881*0b57cec5SDimitry Andric case iPTR_func_i64_i64: 882*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 883*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 884*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 885*0b57cec5SDimitry Andric break; 886*0b57cec5SDimitry Andric case unsupported: 887*0b57cec5SDimitry Andric llvm_unreachable("unsupported runtime library signature"); 888*0b57cec5SDimitry Andric } 889*0b57cec5SDimitry Andric } 890*0b57cec5SDimitry Andric 891*0b57cec5SDimitry Andric // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 892*0b57cec5SDimitry Andric // other than here, just roll its logic into this version. 893*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 894fe6060f1SDimitry Andric StringRef Name, 895*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Rets, 896*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Params) { 897753f127fSDimitry Andric static StaticLibcallNameMap LibcallNameMap; 898753f127fSDimitry Andric auto &Map = LibcallNameMap.Map; 899*0b57cec5SDimitry Andric auto Val = Map.find(Name); 900*0b57cec5SDimitry Andric #ifndef NDEBUG 901*0b57cec5SDimitry Andric if (Val == Map.end()) { 902fe6060f1SDimitry Andric auto message = std::string("unexpected runtime library name: ") + 903fe6060f1SDimitry Andric std::string(Name); 904*0b57cec5SDimitry Andric llvm_unreachable(message.c_str()); 905*0b57cec5SDimitry Andric } 906*0b57cec5SDimitry Andric #endif 907*0b57cec5SDimitry Andric return getLibcallSignature(Subtarget, Val->second, Rets, Params); 908*0b57cec5SDimitry Andric } 909