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 #include "llvm/Support/ManagedStatic.h" 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric using namespace llvm; 27*0b57cec5SDimitry Andric 28*0b57cec5SDimitry Andric namespace { 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric enum RuntimeLibcallSignature { 31*0b57cec5SDimitry Andric func, 32*0b57cec5SDimitry Andric f32_func_f32, 33*0b57cec5SDimitry Andric f32_func_f64, 34*0b57cec5SDimitry Andric f32_func_i32, 35*0b57cec5SDimitry Andric f32_func_i64, 36*0b57cec5SDimitry Andric f32_func_i16, 37*0b57cec5SDimitry Andric f64_func_f32, 38*0b57cec5SDimitry Andric f64_func_f64, 39*0b57cec5SDimitry Andric f64_func_i32, 40*0b57cec5SDimitry Andric f64_func_i64, 41*0b57cec5SDimitry Andric i32_func_f32, 42*0b57cec5SDimitry Andric i32_func_f64, 43*0b57cec5SDimitry Andric i32_func_i32, 44*0b57cec5SDimitry Andric i64_func_f32, 45*0b57cec5SDimitry Andric i64_func_f64, 46*0b57cec5SDimitry Andric i64_func_i64, 47*0b57cec5SDimitry Andric f32_func_f32_f32, 48*0b57cec5SDimitry Andric f32_func_f32_i32, 49*0b57cec5SDimitry Andric f32_func_i64_i64, 50*0b57cec5SDimitry Andric f64_func_f64_f64, 51*0b57cec5SDimitry Andric f64_func_f64_i32, 52*0b57cec5SDimitry Andric f64_func_i64_i64, 53*0b57cec5SDimitry Andric i16_func_f32, 54*0b57cec5SDimitry Andric i16_func_f64, 55*0b57cec5SDimitry Andric i16_func_i64_i64, 56*0b57cec5SDimitry Andric i8_func_i8_i8, 57*0b57cec5SDimitry Andric func_f32_iPTR_iPTR, 58*0b57cec5SDimitry Andric func_f64_iPTR_iPTR, 59*0b57cec5SDimitry Andric i16_func_i16_i16, 60*0b57cec5SDimitry Andric i32_func_f32_f32, 61*0b57cec5SDimitry Andric i32_func_f64_f64, 62*0b57cec5SDimitry Andric i32_func_i32_i32, 63*0b57cec5SDimitry Andric i32_func_i32_i32_iPTR, 64*0b57cec5SDimitry Andric i64_func_i64_i64, 65*0b57cec5SDimitry Andric i64_func_i64_i64_iPTR, 66*0b57cec5SDimitry Andric i64_i64_func_f32, 67*0b57cec5SDimitry Andric i64_i64_func_f64, 68*0b57cec5SDimitry Andric i16_i16_func_i16_i16, 69*0b57cec5SDimitry Andric i32_i32_func_i32_i32, 70*0b57cec5SDimitry Andric i64_i64_func_i64_i64, 71*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i64_i64, 72*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i64_i64_iPTR, 73*0b57cec5SDimitry Andric i64_i64_i64_i64_func_i64_i64_i64_i64, 74*0b57cec5SDimitry Andric i64_i64_func_i64_i64_i32, 75*0b57cec5SDimitry Andric iPTR_func_iPTR_i32_iPTR, 76*0b57cec5SDimitry Andric iPTR_func_iPTR_iPTR_iPTR, 77*0b57cec5SDimitry Andric f32_func_f32_f32_f32, 78*0b57cec5SDimitry Andric f64_func_f64_f64_f64, 79*0b57cec5SDimitry Andric func_i64_i64_iPTR_iPTR, 80*0b57cec5SDimitry Andric func_iPTR_f32, 81*0b57cec5SDimitry Andric func_iPTR_f64, 82*0b57cec5SDimitry Andric func_iPTR_i32, 83*0b57cec5SDimitry Andric func_iPTR_i64, 84*0b57cec5SDimitry Andric func_iPTR_i64_i64, 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; 176*0b57cec5SDimitry Andric Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64; 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; 180*0b57cec5SDimitry Andric Table[RTLIB::LOG_F32] = f32_func_f32; 181*0b57cec5SDimitry Andric Table[RTLIB::LOG_F64] = f64_func_f64; 182*0b57cec5SDimitry Andric Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; 183*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F32] = f32_func_f32; 184*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F64] = f64_func_f64; 185*0b57cec5SDimitry Andric Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; 186*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F32] = f32_func_f32; 187*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F64] = f64_func_f64; 188*0b57cec5SDimitry Andric Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; 189*0b57cec5SDimitry Andric Table[RTLIB::EXP_F32] = f32_func_f32; 190*0b57cec5SDimitry Andric Table[RTLIB::EXP_F64] = f64_func_f64; 191*0b57cec5SDimitry Andric Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; 192*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F32] = f32_func_f32; 193*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F64] = f64_func_f64; 194*0b57cec5SDimitry Andric Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; 195*0b57cec5SDimitry Andric Table[RTLIB::SIN_F32] = f32_func_f32; 196*0b57cec5SDimitry Andric Table[RTLIB::SIN_F64] = f64_func_f64; 197*0b57cec5SDimitry Andric Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; 198*0b57cec5SDimitry Andric Table[RTLIB::COS_F32] = f32_func_f32; 199*0b57cec5SDimitry Andric Table[RTLIB::COS_F64] = f64_func_f64; 200*0b57cec5SDimitry Andric Table[RTLIB::COS_F128] = func_iPTR_i64_i64; 201*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; 202*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; 203*0b57cec5SDimitry Andric Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; 204*0b57cec5SDimitry Andric Table[RTLIB::POW_F32] = f32_func_f32_f32; 205*0b57cec5SDimitry Andric Table[RTLIB::POW_F64] = f64_func_f64_f64; 206*0b57cec5SDimitry Andric Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; 207*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F32] = f32_func_f32; 208*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F64] = f64_func_f64; 209*0b57cec5SDimitry Andric Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; 210*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F32] = f32_func_f32; 211*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F64] = f64_func_f64; 212*0b57cec5SDimitry Andric Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; 213*0b57cec5SDimitry Andric Table[RTLIB::RINT_F32] = f32_func_f32; 214*0b57cec5SDimitry Andric Table[RTLIB::RINT_F64] = f64_func_f64; 215*0b57cec5SDimitry Andric Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; 216*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F32] = f32_func_f32; 217*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F64] = f64_func_f64; 218*0b57cec5SDimitry Andric Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; 219*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F32] = f32_func_f32; 220*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F64] = f64_func_f64; 221*0b57cec5SDimitry Andric Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; 222*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F32] = iPTR_func_f32; 223*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F64] = iPTR_func_f64; 224*0b57cec5SDimitry Andric Table[RTLIB::LROUND_F128] = iPTR_func_i64_i64; 225*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F32] = i64_func_f32; 226*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F64] = i64_func_f64; 227*0b57cec5SDimitry Andric Table[RTLIB::LLROUND_F128] = i64_func_i64_i64; 228*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F32] = iPTR_func_f32; 229*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F64] = iPTR_func_f64; 230*0b57cec5SDimitry Andric Table[RTLIB::LRINT_F128] = iPTR_func_i64_i64; 231*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F32] = i64_func_f32; 232*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F64] = i64_func_f64; 233*0b57cec5SDimitry Andric Table[RTLIB::LLRINT_F128] = i64_func_i64_i64; 234*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F32] = f32_func_f32; 235*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F64] = f64_func_f64; 236*0b57cec5SDimitry Andric Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; 237*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; 238*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; 239*0b57cec5SDimitry Andric Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; 240*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F32] = f32_func_f32_f32; 241*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F64] = f64_func_f64_f64; 242*0b57cec5SDimitry Andric Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; 243*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F32] = f32_func_f32_f32; 244*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F64] = f64_func_f64_f64; 245*0b57cec5SDimitry Andric Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; 246*0b57cec5SDimitry Andric 247*0b57cec5SDimitry Andric // Conversion 248*0b57cec5SDimitry Andric // All F80 and PPCF128 routines are unsupported. 249*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; 250*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; 251*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; 252*0b57cec5SDimitry Andric Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; 253*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; 254*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F64_F16] = i16_func_f64; 255*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; 256*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F16] = i16_func_i64_i64; 257*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; 258*0b57cec5SDimitry Andric Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; 259*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; 260*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; 261*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; 262*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; 263*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; 264*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; 265*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; 266*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; 267*0b57cec5SDimitry Andric Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; 268*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; 269*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; 270*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; 271*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; 272*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; 273*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; 274*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; 275*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; 276*0b57cec5SDimitry Andric Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; 277*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; 278*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; 279*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; 280*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; 281*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; 282*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; 283*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; 284*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; 285*0b57cec5SDimitry Andric Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; 286*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; 287*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; 288*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; 289*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; 290*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; 291*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; 292*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; 293*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; 294*0b57cec5SDimitry Andric Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; 295*0b57cec5SDimitry Andric 296*0b57cec5SDimitry Andric // Comparison 297*0b57cec5SDimitry Andric // ALl F80 and PPCF128 routines are unsupported. 298*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F32] = i32_func_f32_f32; 299*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F64] = i32_func_f64_f64; 300*0b57cec5SDimitry Andric Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; 301*0b57cec5SDimitry Andric Table[RTLIB::UNE_F32] = i32_func_f32_f32; 302*0b57cec5SDimitry Andric Table[RTLIB::UNE_F64] = i32_func_f64_f64; 303*0b57cec5SDimitry Andric Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; 304*0b57cec5SDimitry Andric Table[RTLIB::OGE_F32] = i32_func_f32_f32; 305*0b57cec5SDimitry Andric Table[RTLIB::OGE_F64] = i32_func_f64_f64; 306*0b57cec5SDimitry Andric Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; 307*0b57cec5SDimitry Andric Table[RTLIB::OLT_F32] = i32_func_f32_f32; 308*0b57cec5SDimitry Andric Table[RTLIB::OLT_F64] = i32_func_f64_f64; 309*0b57cec5SDimitry Andric Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; 310*0b57cec5SDimitry Andric Table[RTLIB::OLE_F32] = i32_func_f32_f32; 311*0b57cec5SDimitry Andric Table[RTLIB::OLE_F64] = i32_func_f64_f64; 312*0b57cec5SDimitry Andric Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; 313*0b57cec5SDimitry Andric Table[RTLIB::OGT_F32] = i32_func_f32_f32; 314*0b57cec5SDimitry Andric Table[RTLIB::OGT_F64] = i32_func_f64_f64; 315*0b57cec5SDimitry Andric Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; 316*0b57cec5SDimitry Andric Table[RTLIB::UO_F32] = i32_func_f32_f32; 317*0b57cec5SDimitry Andric Table[RTLIB::UO_F64] = i32_func_f64_f64; 318*0b57cec5SDimitry Andric Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; 319*0b57cec5SDimitry Andric // O_FXX has the weird property that it uses the same libcall name as UO_FXX 320*0b57cec5SDimitry Andric // This breaks our name-based lookup. Fortunately only the UO family of 321*0b57cec5SDimitry Andric // libcalls appears to be actually used. 322*0b57cec5SDimitry Andric Table[RTLIB::O_F32] = unsupported; 323*0b57cec5SDimitry Andric Table[RTLIB::O_F64] = unsupported; 324*0b57cec5SDimitry Andric Table[RTLIB::O_F128] = unsupported; 325*0b57cec5SDimitry Andric 326*0b57cec5SDimitry Andric // Memory 327*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; 328*0b57cec5SDimitry Andric Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; 329*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; 330*0b57cec5SDimitry Andric 331*0b57cec5SDimitry Andric // __stack_chk_fail 332*0b57cec5SDimitry Andric Table[RTLIB::STACKPROTECTOR_CHECK_FAIL] = func; 333*0b57cec5SDimitry Andric 334*0b57cec5SDimitry Andric // Return address handling 335*0b57cec5SDimitry Andric Table[RTLIB::RETURN_ADDRESS] = i32_func_i32; 336*0b57cec5SDimitry Andric 337*0b57cec5SDimitry Andric // Element-wise Atomic memory 338*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 339*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 340*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 341*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 342*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 343*0b57cec5SDimitry Andric Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 344*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 345*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 346*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 347*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 348*0b57cec5SDimitry Andric Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 349*0b57cec5SDimitry Andric 350*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; 351*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; 352*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; 353*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; 354*0b57cec5SDimitry Andric Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; 355*0b57cec5SDimitry Andric 356*0b57cec5SDimitry Andric // Atomic '__sync_*' libcalls. 357*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 358*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; 359*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; 360*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; 361*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; 362*0b57cec5SDimitry Andric Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; 363*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; 364*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; 365*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; 366*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; 367*0b57cec5SDimitry Andric Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; 368*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; 369*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; 370*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; 371*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; 372*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; 373*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; 374*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; 375*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; 376*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; 377*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; 378*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; 379*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; 380*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; 381*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; 382*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; 383*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; 384*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; 385*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; 386*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; 387*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; 388*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; 389*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; 390*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; 391*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; 392*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; 393*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; 394*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; 395*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; 396*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; 397*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; 398*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; 399*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; 400*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; 401*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; 402*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; 403*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; 404*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; 405*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; 406*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; 407*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; 408*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; 409*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; 410*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; 411*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; 412*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; 413*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; 414*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; 415*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; 416*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; 417*0b57cec5SDimitry Andric Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; 418*0b57cec5SDimitry Andric 419*0b57cec5SDimitry Andric // Atomic '__atomic_*' libcalls. 420*0b57cec5SDimitry Andric // TODO: Fix these when we implement atomic support 421*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD] = unsupported; 422*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_1] = unsupported; 423*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_2] = unsupported; 424*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_4] = unsupported; 425*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_8] = unsupported; 426*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_LOAD_16] = unsupported; 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE] = unsupported; 429*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_1] = unsupported; 430*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_2] = unsupported; 431*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_4] = unsupported; 432*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_8] = unsupported; 433*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_STORE_16] = unsupported; 434*0b57cec5SDimitry Andric 435*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; 436*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; 437*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; 438*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; 439*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; 440*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; 441*0b57cec5SDimitry Andric 442*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; 443*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; 444*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; 445*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; 446*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; 447*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; 448*0b57cec5SDimitry Andric 449*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; 450*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; 451*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; 452*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; 453*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; 454*0b57cec5SDimitry Andric 455*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; 456*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; 457*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; 458*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; 459*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; 460*0b57cec5SDimitry Andric 461*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; 462*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; 463*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; 464*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; 465*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; 466*0b57cec5SDimitry Andric 467*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; 468*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; 469*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; 470*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; 471*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; 472*0b57cec5SDimitry Andric 473*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; 474*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; 475*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; 476*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; 477*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; 478*0b57cec5SDimitry Andric 479*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; 480*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; 481*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; 482*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; 483*0b57cec5SDimitry Andric Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; 484*0b57cec5SDimitry Andric } 485*0b57cec5SDimitry Andric }; 486*0b57cec5SDimitry Andric 487*0b57cec5SDimitry Andric ManagedStatic<RuntimeLibcallSignatureTable> RuntimeLibcallSignatures; 488*0b57cec5SDimitry Andric 489*0b57cec5SDimitry Andric // Maps libcall names to their RTLIB::Libcall number. Builds the map in a 490*0b57cec5SDimitry Andric // constructor for use with ManagedStatic 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 && 501*0b57cec5SDimitry Andric RuntimeLibcallSignatures->Table[NameLibcall.second] != unsupported) { 502*0b57cec5SDimitry Andric assert(Map.find(NameLibcall.first) == Map.end() && 503*0b57cec5SDimitry Andric "duplicate libcall names in name map"); 504*0b57cec5SDimitry Andric Map[NameLibcall.first] = NameLibcall.second; 505*0b57cec5SDimitry Andric } 506*0b57cec5SDimitry Andric } 507*0b57cec5SDimitry Andric // Override the __gnu_f2h_ieee/__gnu_h2f_ieee names so that the f32 name is 508*0b57cec5SDimitry Andric // consistent with the f64 and f128 names. 509*0b57cec5SDimitry Andric Map["__extendhfsf2"] = RTLIB::FPEXT_F16_F32; 510*0b57cec5SDimitry Andric Map["__truncsfhf2"] = RTLIB::FPROUND_F32_F16; 511*0b57cec5SDimitry Andric 512*0b57cec5SDimitry Andric Map["emscripten_return_address"] = RTLIB::RETURN_ADDRESS; 513*0b57cec5SDimitry Andric } 514*0b57cec5SDimitry Andric }; 515*0b57cec5SDimitry Andric 516*0b57cec5SDimitry Andric } // end anonymous namespace 517*0b57cec5SDimitry Andric 518*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 519*0b57cec5SDimitry Andric RTLIB::Libcall LC, 520*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Rets, 521*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Params) { 522*0b57cec5SDimitry Andric assert(Rets.empty()); 523*0b57cec5SDimitry Andric assert(Params.empty()); 524*0b57cec5SDimitry Andric 525*0b57cec5SDimitry Andric wasm::ValType PtrTy = 526*0b57cec5SDimitry Andric Subtarget.hasAddr64() ? wasm::ValType::I64 : wasm::ValType::I32; 527*0b57cec5SDimitry Andric 528*0b57cec5SDimitry Andric auto &Table = RuntimeLibcallSignatures->Table; 529*0b57cec5SDimitry Andric switch (Table[LC]) { 530*0b57cec5SDimitry Andric case func: 531*0b57cec5SDimitry Andric break; 532*0b57cec5SDimitry Andric case f32_func_f32: 533*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 534*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 535*0b57cec5SDimitry Andric break; 536*0b57cec5SDimitry Andric case f32_func_f64: 537*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 538*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 539*0b57cec5SDimitry Andric break; 540*0b57cec5SDimitry Andric case f32_func_i32: 541*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 542*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 543*0b57cec5SDimitry Andric break; 544*0b57cec5SDimitry Andric case f32_func_i64: 545*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 546*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 547*0b57cec5SDimitry Andric break; 548*0b57cec5SDimitry Andric case f32_func_i16: 549*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 550*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 551*0b57cec5SDimitry Andric break; 552*0b57cec5SDimitry Andric case f64_func_f32: 553*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 554*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 555*0b57cec5SDimitry Andric break; 556*0b57cec5SDimitry Andric case f64_func_f64: 557*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 558*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 559*0b57cec5SDimitry Andric break; 560*0b57cec5SDimitry Andric case f64_func_i32: 561*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 562*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 563*0b57cec5SDimitry Andric break; 564*0b57cec5SDimitry Andric case f64_func_i64: 565*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 566*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 567*0b57cec5SDimitry Andric break; 568*0b57cec5SDimitry Andric case i32_func_f32: 569*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 570*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 571*0b57cec5SDimitry Andric break; 572*0b57cec5SDimitry Andric case i32_func_f64: 573*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 574*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 575*0b57cec5SDimitry Andric break; 576*0b57cec5SDimitry Andric case i32_func_i32: 577*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 578*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 579*0b57cec5SDimitry Andric break; 580*0b57cec5SDimitry Andric case i64_func_f32: 581*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 582*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 583*0b57cec5SDimitry Andric break; 584*0b57cec5SDimitry Andric case i64_func_f64: 585*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 586*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 587*0b57cec5SDimitry Andric break; 588*0b57cec5SDimitry Andric case i64_func_i64: 589*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 590*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 591*0b57cec5SDimitry Andric break; 592*0b57cec5SDimitry Andric case f32_func_f32_f32: 593*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 594*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 595*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 596*0b57cec5SDimitry Andric break; 597*0b57cec5SDimitry Andric case f32_func_f32_i32: 598*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 599*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 600*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 601*0b57cec5SDimitry Andric break; 602*0b57cec5SDimitry Andric case f32_func_i64_i64: 603*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 604*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 605*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 606*0b57cec5SDimitry Andric break; 607*0b57cec5SDimitry Andric case f64_func_f64_f64: 608*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 609*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 610*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 611*0b57cec5SDimitry Andric break; 612*0b57cec5SDimitry Andric case f64_func_f64_i32: 613*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 614*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 615*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 616*0b57cec5SDimitry Andric break; 617*0b57cec5SDimitry Andric case f64_func_i64_i64: 618*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 619*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 620*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 621*0b57cec5SDimitry Andric break; 622*0b57cec5SDimitry Andric case i16_func_f32: 623*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 624*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 625*0b57cec5SDimitry Andric break; 626*0b57cec5SDimitry Andric case i16_func_f64: 627*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 628*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 629*0b57cec5SDimitry Andric break; 630*0b57cec5SDimitry Andric case i16_func_i64_i64: 631*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 632*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 633*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 634*0b57cec5SDimitry Andric break; 635*0b57cec5SDimitry Andric case i8_func_i8_i8: 636*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 637*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 638*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 639*0b57cec5SDimitry Andric break; 640*0b57cec5SDimitry Andric case func_f32_iPTR_iPTR: 641*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 642*0b57cec5SDimitry Andric Params.push_back(PtrTy); 643*0b57cec5SDimitry Andric Params.push_back(PtrTy); 644*0b57cec5SDimitry Andric break; 645*0b57cec5SDimitry Andric case func_f64_iPTR_iPTR: 646*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 647*0b57cec5SDimitry Andric Params.push_back(PtrTy); 648*0b57cec5SDimitry Andric Params.push_back(PtrTy); 649*0b57cec5SDimitry Andric break; 650*0b57cec5SDimitry Andric case i16_func_i16_i16: 651*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 652*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 653*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 654*0b57cec5SDimitry Andric break; 655*0b57cec5SDimitry Andric case i32_func_f32_f32: 656*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 657*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 658*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 659*0b57cec5SDimitry Andric break; 660*0b57cec5SDimitry Andric case i32_func_f64_f64: 661*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 662*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 663*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 664*0b57cec5SDimitry Andric break; 665*0b57cec5SDimitry Andric case i32_func_i32_i32: 666*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 667*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 668*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 669*0b57cec5SDimitry Andric break; 670*0b57cec5SDimitry Andric case i32_func_i32_i32_iPTR: 671*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 672*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 673*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 674*0b57cec5SDimitry Andric Params.push_back(PtrTy); 675*0b57cec5SDimitry Andric break; 676*0b57cec5SDimitry Andric case i64_func_i64_i64: 677*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 678*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 679*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 680*0b57cec5SDimitry Andric break; 681*0b57cec5SDimitry Andric case i64_func_i64_i64_iPTR: 682*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 683*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 684*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 685*0b57cec5SDimitry Andric Params.push_back(PtrTy); 686*0b57cec5SDimitry Andric break; 687*0b57cec5SDimitry Andric case i64_i64_func_f32: 688*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 689*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 690*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 691*0b57cec5SDimitry Andric #else 692*0b57cec5SDimitry Andric Params.push_back(PtrTy); 693*0b57cec5SDimitry Andric #endif 694*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 695*0b57cec5SDimitry Andric break; 696*0b57cec5SDimitry Andric case i64_i64_func_f64: 697*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 698*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 699*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 700*0b57cec5SDimitry Andric #else 701*0b57cec5SDimitry Andric Params.push_back(PtrTy); 702*0b57cec5SDimitry Andric #endif 703*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 704*0b57cec5SDimitry Andric break; 705*0b57cec5SDimitry Andric case i16_i16_func_i16_i16: 706*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 707*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 708*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 709*0b57cec5SDimitry Andric #else 710*0b57cec5SDimitry Andric Params.push_back(PtrTy); 711*0b57cec5SDimitry Andric #endif 712*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 713*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 714*0b57cec5SDimitry Andric break; 715*0b57cec5SDimitry Andric case i32_i32_func_i32_i32: 716*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 717*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 718*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 719*0b57cec5SDimitry Andric #else 720*0b57cec5SDimitry Andric Params.push_back(PtrTy); 721*0b57cec5SDimitry Andric #endif 722*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 723*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 724*0b57cec5SDimitry Andric break; 725*0b57cec5SDimitry Andric case i64_i64_func_i64_i64: 726*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 727*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 728*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 729*0b57cec5SDimitry Andric #else 730*0b57cec5SDimitry Andric Params.push_back(PtrTy); 731*0b57cec5SDimitry Andric #endif 732*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 733*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 734*0b57cec5SDimitry Andric break; 735*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i64_i64: 736*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 737*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 738*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 739*0b57cec5SDimitry Andric #else 740*0b57cec5SDimitry Andric Params.push_back(PtrTy); 741*0b57cec5SDimitry Andric #endif 742*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 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 break; 747*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i64_i64_iPTR: 748*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 749*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 750*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 751*0b57cec5SDimitry Andric #else 752*0b57cec5SDimitry Andric Params.push_back(PtrTy); 753*0b57cec5SDimitry Andric #endif 754*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 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(PtrTy); 759*0b57cec5SDimitry Andric break; 760*0b57cec5SDimitry Andric case i64_i64_i64_i64_func_i64_i64_i64_i64: 761*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 762*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 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 #else 767*0b57cec5SDimitry Andric Params.push_back(PtrTy); 768*0b57cec5SDimitry Andric #endif 769*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 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 break; 774*0b57cec5SDimitry Andric case i64_i64_func_i64_i64_i32: 775*0b57cec5SDimitry Andric #if 0 // TODO: Enable this when wasm gets multiple-return-value support. 776*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I64); 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 #else 781*0b57cec5SDimitry Andric Params.push_back(PtrTy); 782*0b57cec5SDimitry Andric #endif 783*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 784*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 785*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 786*0b57cec5SDimitry Andric break; 787*0b57cec5SDimitry Andric case iPTR_func_iPTR_i32_iPTR: 788*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 789*0b57cec5SDimitry Andric Params.push_back(PtrTy); 790*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 791*0b57cec5SDimitry Andric Params.push_back(PtrTy); 792*0b57cec5SDimitry Andric break; 793*0b57cec5SDimitry Andric case iPTR_func_iPTR_iPTR_iPTR: 794*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 795*0b57cec5SDimitry Andric Params.push_back(PtrTy); 796*0b57cec5SDimitry Andric Params.push_back(PtrTy); 797*0b57cec5SDimitry Andric Params.push_back(PtrTy); 798*0b57cec5SDimitry Andric break; 799*0b57cec5SDimitry Andric case f32_func_f32_f32_f32: 800*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F32); 801*0b57cec5SDimitry Andric Params.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 break; 805*0b57cec5SDimitry Andric case f64_func_f64_f64_f64: 806*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::F64); 807*0b57cec5SDimitry Andric Params.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 break; 811*0b57cec5SDimitry Andric case func_i64_i64_iPTR_iPTR: 812*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 813*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 814*0b57cec5SDimitry Andric Params.push_back(PtrTy); 815*0b57cec5SDimitry Andric Params.push_back(PtrTy); 816*0b57cec5SDimitry Andric break; 817*0b57cec5SDimitry Andric case func_iPTR_f32: 818*0b57cec5SDimitry Andric Params.push_back(PtrTy); 819*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 820*0b57cec5SDimitry Andric break; 821*0b57cec5SDimitry Andric case func_iPTR_f64: 822*0b57cec5SDimitry Andric Params.push_back(PtrTy); 823*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 824*0b57cec5SDimitry Andric break; 825*0b57cec5SDimitry Andric case func_iPTR_i32: 826*0b57cec5SDimitry Andric Params.push_back(PtrTy); 827*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I32); 828*0b57cec5SDimitry Andric break; 829*0b57cec5SDimitry Andric case func_iPTR_i64: 830*0b57cec5SDimitry Andric Params.push_back(PtrTy); 831*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 832*0b57cec5SDimitry Andric break; 833*0b57cec5SDimitry Andric case func_iPTR_i64_i64: 834*0b57cec5SDimitry Andric Params.push_back(PtrTy); 835*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 836*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 837*0b57cec5SDimitry Andric break; 838*0b57cec5SDimitry Andric case func_iPTR_i64_i64_i64_i64: 839*0b57cec5SDimitry Andric Params.push_back(PtrTy); 840*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 841*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 842*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 843*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 844*0b57cec5SDimitry Andric break; 845*0b57cec5SDimitry Andric case func_iPTR_i64_i64_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 Params.push_back(wasm::ValType::I64); 852*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 853*0b57cec5SDimitry Andric break; 854*0b57cec5SDimitry Andric case i32_func_i64_i64: 855*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 856*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 857*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 858*0b57cec5SDimitry Andric break; 859*0b57cec5SDimitry Andric case i32_func_i64_i64_i64_i64: 860*0b57cec5SDimitry Andric Rets.push_back(wasm::ValType::I32); 861*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 862*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 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 iPTR_func_f32: 867*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 868*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F32); 869*0b57cec5SDimitry Andric break; 870*0b57cec5SDimitry Andric case iPTR_func_f64: 871*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 872*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::F64); 873*0b57cec5SDimitry Andric break; 874*0b57cec5SDimitry Andric case iPTR_func_i64_i64: 875*0b57cec5SDimitry Andric Rets.push_back(PtrTy); 876*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 877*0b57cec5SDimitry Andric Params.push_back(wasm::ValType::I64); 878*0b57cec5SDimitry Andric break; 879*0b57cec5SDimitry Andric case unsupported: 880*0b57cec5SDimitry Andric llvm_unreachable("unsupported runtime library signature"); 881*0b57cec5SDimitry Andric } 882*0b57cec5SDimitry Andric } 883*0b57cec5SDimitry Andric 884*0b57cec5SDimitry Andric static ManagedStatic<StaticLibcallNameMap> LibcallNameMap; 885*0b57cec5SDimitry Andric // TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed 886*0b57cec5SDimitry Andric // other than here, just roll its logic into this version. 887*0b57cec5SDimitry Andric void llvm::getLibcallSignature(const WebAssemblySubtarget &Subtarget, 888*0b57cec5SDimitry Andric const char *Name, 889*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Rets, 890*0b57cec5SDimitry Andric SmallVectorImpl<wasm::ValType> &Params) { 891*0b57cec5SDimitry Andric auto &Map = LibcallNameMap->Map; 892*0b57cec5SDimitry Andric auto Val = Map.find(Name); 893*0b57cec5SDimitry Andric #ifndef NDEBUG 894*0b57cec5SDimitry Andric if (Val == Map.end()) { 895*0b57cec5SDimitry Andric auto message = std::string("unexpected runtime library name: ") + Name; 896*0b57cec5SDimitry Andric llvm_unreachable(message.c_str()); 897*0b57cec5SDimitry Andric } 898*0b57cec5SDimitry Andric #endif 899*0b57cec5SDimitry Andric return getLibcallSignature(Subtarget, Val->second, Rets, Params); 900*0b57cec5SDimitry Andric } 901