Dan Gohman | 38b42b4 | 2017-02-22 18:34:16 +0000 | [diff] [blame] | 1 | // CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | /// |
| 10 | /// \file |
| 11 | /// \brief This file contains signature information for runtime libcalls. |
| 12 | /// |
| 13 | /// CodeGen uses external symbols, which it refers to by name. The WebAssembly |
| 14 | /// target needs type information for all functions. This file contains a big |
| 15 | /// table providing type signatures for all runtime library functions that LLVM |
| 16 | /// uses. |
| 17 | /// |
| 18 | /// This is currently a fairly heavy-handed solution. |
| 19 | /// |
| 20 | //===----------------------------------------------------------------------===// |
| 21 | |
| 22 | #include "WebAssemblyRuntimeLibcallSignatures.h" |
| 23 | #include "WebAssemblySubtarget.h" |
| 24 | #include "llvm/CodeGen/RuntimeLibcalls.h" |
| 25 | |
| 26 | using namespace llvm; |
| 27 | |
| 28 | namespace { |
| 29 | |
| 30 | enum RuntimeLibcallSignature { |
| 31 | func, |
| 32 | f32_func_f32, |
| 33 | f32_func_f64, |
| 34 | f32_func_i32, |
| 35 | f32_func_i64, |
| 36 | f32_func_i16, |
| 37 | f64_func_f32, |
| 38 | f64_func_f64, |
| 39 | f64_func_i32, |
| 40 | f64_func_i64, |
| 41 | i32_func_f32, |
| 42 | i32_func_f64, |
| 43 | i32_func_i32, |
| 44 | i64_func_f32, |
| 45 | i64_func_f64, |
| 46 | i64_func_i64, |
| 47 | f32_func_f32_f32, |
| 48 | f32_func_f32_i32, |
| 49 | f32_func_i64_i64, |
| 50 | f64_func_f64_f64, |
| 51 | f64_func_f64_i32, |
| 52 | f64_func_i64_i64, |
| 53 | i16_func_f32, |
| 54 | i8_func_i8_i8, |
| 55 | func_f32_iPTR_iPTR, |
| 56 | func_f64_iPTR_iPTR, |
| 57 | i16_func_i16_i16, |
| 58 | i32_func_f32_f32, |
| 59 | i32_func_f64_f64, |
| 60 | i32_func_i32_i32, |
| 61 | i64_func_i64_i64, |
| 62 | i64_i64_func_f32, |
| 63 | i64_i64_func_f64, |
| 64 | i16_i16_func_i16_i16, |
| 65 | i32_i32_func_i32_i32, |
| 66 | i64_i64_func_i64_i64, |
| 67 | i64_i64_func_i64_i64_i64_i64, |
| 68 | i64_i64_i64_i64_func_i64_i64_i64_i64, |
| 69 | i64_i64_func_i64_i64_i32, |
| 70 | iPTR_func_iPTR_i32_iPTR, |
| 71 | iPTR_func_iPTR_iPTR_iPTR, |
| 72 | f32_func_f32_f32_f32, |
| 73 | f64_func_f64_f64_f64, |
| 74 | func_i64_i64_iPTR_iPTR, |
| 75 | func_iPTR_f32, |
| 76 | func_iPTR_f64, |
| 77 | func_iPTR_i32, |
| 78 | func_iPTR_i64, |
| 79 | func_iPTR_i64_i64, |
| 80 | func_iPTR_i64_i64_i64_i64, |
| 81 | func_iPTR_i64_i64_i64_i64_i64_i64, |
| 82 | i32_func_i64_i64, |
| 83 | i32_func_i64_i64_i64_i64, |
| 84 | unsupported |
| 85 | }; |
| 86 | |
| 87 | } // end anonymous namespace |
| 88 | |
| 89 | static const RuntimeLibcallSignature |
| 90 | RuntimeLibcallSignatures[RTLIB::UNKNOWN_LIBCALL] = { |
| 91 | // Integer |
| 92 | /* SHL_I16 */ i16_func_i16_i16, |
| 93 | /* SHL_I32 */ i32_func_i32_i32, |
| 94 | /* SHL_I64 */ i64_func_i64_i64, |
| 95 | /* SHL_I128 */ i64_i64_func_i64_i64_i32, |
| 96 | /* SRL_I16 */ i16_func_i16_i16, |
| 97 | /* SRL_I32 */ i32_func_i32_i32, |
| 98 | /* SRL_I64 */ i64_func_i64_i64, |
| 99 | /* SRL_I128 */ i64_i64_func_i64_i64_i32, |
| 100 | /* SRA_I16 */ i16_func_i16_i16, |
| 101 | /* SRA_I32 */ i32_func_i32_i32, |
| 102 | /* SRA_I64 */ i64_func_i64_i64, |
| 103 | /* SRA_I128 */ i64_i64_func_i64_i64_i32, |
| 104 | /* MUL_I8 */ i8_func_i8_i8, |
| 105 | /* MUL_I16 */ i16_func_i16_i16, |
| 106 | /* MUL_I32 */ i32_func_i32_i32, |
| 107 | /* MUL_I64 */ i64_func_i64_i64, |
| 108 | /* MUL_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 109 | /* MULO_I32 */ i32_func_i32_i32, |
| 110 | /* MULO_I64 */ i64_func_i64_i64, |
| 111 | /* MULO_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 112 | /* SDIV_I8 */ i8_func_i8_i8, |
| 113 | /* SDIV_I16 */ i16_func_i16_i16, |
| 114 | /* SDIV_I32 */ i32_func_i32_i32, |
| 115 | /* SDIV_I64 */ i64_func_i64_i64, |
| 116 | /* SDIV_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 117 | /* UDIV_I8 */ i8_func_i8_i8, |
| 118 | /* UDIV_I16 */ i16_func_i16_i16, |
| 119 | /* UDIV_I32 */ i32_func_i32_i32, |
| 120 | /* UDIV_I64 */ i64_func_i64_i64, |
| 121 | /* UDIV_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 122 | /* SREM_I8 */ i8_func_i8_i8, |
| 123 | /* SREM_I16 */ i16_func_i16_i16, |
| 124 | /* SREM_I32 */ i32_func_i32_i32, |
| 125 | /* SREM_I64 */ i64_func_i64_i64, |
| 126 | /* SREM_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 127 | /* UREM_I8 */ i8_func_i8_i8, |
| 128 | /* UREM_I16 */ i16_func_i16_i16, |
| 129 | /* UREM_I32 */ i32_func_i32_i32, |
| 130 | /* UREM_I64 */ i64_func_i64_i64, |
| 131 | /* UREM_I128 */ i64_i64_func_i64_i64_i64_i64, |
| 132 | /* SDIVREM_I8 */ i8_func_i8_i8, |
| 133 | /* SDIVREM_I16 */ i16_i16_func_i16_i16, |
| 134 | /* SDIVREM_I32 */ i32_i32_func_i32_i32, |
| 135 | /* SDIVREM_I64 */ i64_func_i64_i64, |
| 136 | /* SDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64, |
| 137 | /* UDIVREM_I8 */ i8_func_i8_i8, |
| 138 | /* UDIVREM_I16 */ i16_i16_func_i16_i16, |
| 139 | /* UDIVREM_I32 */ i32_i32_func_i32_i32, |
| 140 | /* UDIVREM_I64 */ i64_i64_func_i64_i64, |
| 141 | /* UDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64, |
| 142 | /* NEG_I32 */ i32_func_i32, |
| 143 | /* NEG_I64 */ i64_func_i64, |
| 144 | |
| 145 | // FLOATING POINT |
| 146 | /* ADD_F32 */ f32_func_f32_f32, |
| 147 | /* ADD_F64 */ f64_func_f64_f64, |
| 148 | /* ADD_F80 */ unsupported, |
| 149 | /* ADD_F128 */ func_iPTR_i64_i64_i64_i64, |
| 150 | /* ADD_PPCF128 */ unsupported, |
| 151 | /* SUB_F32 */ f32_func_f32_f32, |
| 152 | /* SUB_F64 */ f64_func_f64_f64, |
| 153 | /* SUB_F80 */ unsupported, |
| 154 | /* SUB_F128 */ func_iPTR_i64_i64_i64_i64, |
| 155 | /* SUB_PPCF128 */ unsupported, |
| 156 | /* MUL_F32 */ f32_func_f32_f32, |
| 157 | /* MUL_F64 */ f64_func_f64_f64, |
| 158 | /* MUL_F80 */ unsupported, |
| 159 | /* MUL_F128 */ func_iPTR_i64_i64_i64_i64, |
| 160 | /* MUL_PPCF128 */ unsupported, |
| 161 | /* DIV_F32 */ f32_func_f32_f32, |
| 162 | /* DIV_F64 */ f64_func_f64_f64, |
| 163 | /* DIV_F80 */ unsupported, |
| 164 | /* DIV_F128 */ func_iPTR_i64_i64_i64_i64, |
| 165 | /* DIV_PPCF128 */ unsupported, |
| 166 | /* REM_F32 */ f32_func_f32_f32, |
| 167 | /* REM_F64 */ f64_func_f64_f64, |
| 168 | /* REM_F80 */ unsupported, |
| 169 | /* REM_F128 */ func_iPTR_i64_i64_i64_i64, |
| 170 | /* REM_PPCF128 */ unsupported, |
| 171 | /* FMA_F32 */ f32_func_f32_f32_f32, |
| 172 | /* FMA_F64 */ f64_func_f64_f64_f64, |
| 173 | /* FMA_F80 */ unsupported, |
| 174 | /* FMA_F128 */ func_iPTR_i64_i64_i64_i64_i64_i64, |
| 175 | /* FMA_PPCF128 */ unsupported, |
| 176 | /* POWI_F32 */ f32_func_f32_i32, |
| 177 | /* POWI_F64 */ f64_func_f64_i32, |
| 178 | /* POWI_F80 */ unsupported, |
| 179 | /* POWI_F128 */ func_iPTR_i64_i64_i64_i64, |
| 180 | /* POWI_PPCF128 */ unsupported, |
| 181 | /* SQRT_F32 */ f32_func_f32, |
| 182 | /* SQRT_F64 */ f64_func_f64, |
| 183 | /* SQRT_F80 */ unsupported, |
| 184 | /* SQRT_F128 */ func_iPTR_i64_i64, |
| 185 | /* SQRT_PPCF128 */ unsupported, |
| 186 | /* LOG_F32 */ f32_func_f32, |
| 187 | /* LOG_F64 */ f64_func_f64, |
| 188 | /* LOG_F80 */ unsupported, |
| 189 | /* LOG_F128 */ func_iPTR_i64_i64, |
| 190 | /* LOG_PPCF128 */ unsupported, |
| 191 | /* LOG2_F32 */ f32_func_f32, |
| 192 | /* LOG2_F64 */ f64_func_f64, |
| 193 | /* LOG2_F80 */ unsupported, |
| 194 | /* LOG2_F128 */ func_iPTR_i64_i64, |
| 195 | /* LOG2_PPCF128 */ unsupported, |
| 196 | /* LOG10_F32 */ f32_func_f32, |
| 197 | /* LOG10_F64 */ f64_func_f64, |
| 198 | /* LOG10_F80 */ unsupported, |
| 199 | /* LOG10_F128 */ func_iPTR_i64_i64, |
| 200 | /* LOG10_PPCF128 */ unsupported, |
| 201 | /* EXP_F32 */ f32_func_f32, |
| 202 | /* EXP_F64 */ f64_func_f64, |
| 203 | /* EXP_F80 */ unsupported, |
| 204 | /* EXP_F128 */ func_iPTR_i64_i64, |
| 205 | /* EXP_PPCF128 */ unsupported, |
| 206 | /* EXP2_F32 */ f32_func_f32, |
| 207 | /* EXP2_F64 */ f64_func_f64, |
| 208 | /* EXP2_F80 */ unsupported, |
| 209 | /* EXP2_F128 */ func_iPTR_i64_i64, |
| 210 | /* EXP2_PPCF128 */ unsupported, |
| 211 | /* SIN_F32 */ f32_func_f32, |
| 212 | /* SIN_F64 */ f64_func_f64, |
| 213 | /* SIN_F80 */ unsupported, |
| 214 | /* SIN_F128 */ func_iPTR_i64_i64, |
| 215 | /* SIN_PPCF128 */ unsupported, |
| 216 | /* COS_F32 */ f32_func_f32, |
| 217 | /* COS_F64 */ f64_func_f64, |
| 218 | /* COS_F80 */ unsupported, |
| 219 | /* COS_F128 */ func_iPTR_i64_i64, |
| 220 | /* COS_PPCF128 */ unsupported, |
| 221 | /* SINCOS_F32 */ func_f32_iPTR_iPTR, |
| 222 | /* SINCOS_F64 */ func_f64_iPTR_iPTR, |
| 223 | /* SINCOS_F80 */ unsupported, |
| 224 | /* SINCOS_F128 */ func_i64_i64_iPTR_iPTR, |
| 225 | /* SINCOS_PPCF128 */ unsupported, |
| 226 | /* POW_F32 */ f32_func_f32_f32, |
| 227 | /* POW_F64 */ f64_func_f64_f64, |
| 228 | /* POW_F80 */ unsupported, |
| 229 | /* POW_F128 */ func_iPTR_i64_i64_i64_i64, |
| 230 | /* POW_PPCF128 */ unsupported, |
| 231 | /* CEIL_F32 */ f32_func_f32, |
| 232 | /* CEIL_F64 */ f64_func_f64, |
| 233 | /* CEIL_F80 */ unsupported, |
| 234 | /* CEIL_F128 */ func_iPTR_i64_i64, |
| 235 | /* CEIL_PPCF128 */ unsupported, |
| 236 | /* TRUNC_F32 */ f32_func_f32, |
| 237 | /* TRUNC_F64 */ f64_func_f64, |
| 238 | /* TRUNC_F80 */ unsupported, |
| 239 | /* TRUNC_F128 */ func_iPTR_i64_i64, |
| 240 | /* TRUNC_PPCF128 */ unsupported, |
| 241 | /* RINT_F32 */ f32_func_f32, |
| 242 | /* RINT_F64 */ f64_func_f64, |
| 243 | /* RINT_F80 */ unsupported, |
| 244 | /* RINT_F128 */ func_iPTR_i64_i64, |
| 245 | /* RINT_PPCF128 */ unsupported, |
| 246 | /* NEARBYINT_F32 */ f32_func_f32, |
| 247 | /* NEARBYINT_F64 */ f64_func_f64, |
| 248 | /* NEARBYINT_F80 */ unsupported, |
| 249 | /* NEARBYINT_F128 */ func_iPTR_i64_i64, |
| 250 | /* NEARBYINT_PPCF128 */ unsupported, |
| 251 | /* ROUND_F32 */ f32_func_f32, |
| 252 | /* ROUND_F64 */ f64_func_f64, |
| 253 | /* ROUND_F80 */ unsupported, |
| 254 | /* ROUND_F128 */ func_iPTR_i64_i64, |
| 255 | /* ROUND_PPCF128 */ unsupported, |
| 256 | /* FLOOR_F32 */ f32_func_f32, |
| 257 | /* FLOOR_F64 */ f64_func_f64, |
| 258 | /* FLOOR_F80 */ unsupported, |
| 259 | /* FLOOR_F128 */ func_iPTR_i64_i64, |
| 260 | /* FLOOR_PPCF128 */ unsupported, |
| 261 | /* COPYSIGN_F32 */ f32_func_f32_f32, |
| 262 | /* COPYSIGN_F64 */ f64_func_f64_f64, |
| 263 | /* COPYSIGN_F80 */ unsupported, |
| 264 | /* COPYSIGN_F128 */ func_iPTR_i64_i64_i64_i64, |
| 265 | /* COPYSIGN_PPCF128 */ unsupported, |
| 266 | /* FMIN_F32 */ f32_func_f32_f32, |
| 267 | /* FMIN_F64 */ f64_func_f64_f64, |
| 268 | /* FMIN_F80 */ unsupported, |
| 269 | /* FMIN_F128 */ func_iPTR_i64_i64_i64_i64, |
| 270 | /* FMIN_PPCF128 */ unsupported, |
| 271 | /* FMAX_F32 */ f32_func_f32_f32, |
| 272 | /* FMAX_F64 */ f64_func_f64_f64, |
| 273 | /* FMAX_F80 */ unsupported, |
| 274 | /* FMAX_F128 */ func_iPTR_i64_i64_i64_i64, |
| 275 | /* FMAX_PPCF128 */ unsupported, |
| 276 | |
| 277 | // CONVERSION |
| 278 | /* FPEXT_F32_PPCF128 */ unsupported, |
| 279 | /* FPEXT_F64_PPCF128 */ unsupported, |
| 280 | /* FPEXT_F64_F128 */ func_iPTR_f64, |
| 281 | /* FPEXT_F32_F128 */ func_iPTR_f32, |
| 282 | /* FPEXT_F32_F64 */ f64_func_f32, |
| 283 | /* FPEXT_F16_F32 */ f32_func_i16, |
| 284 | /* FPROUND_F32_F16 */ i16_func_f32, |
| 285 | /* FPROUND_F64_F16 */ unsupported, |
| 286 | /* FPROUND_F80_F16 */ unsupported, |
| 287 | /* FPROUND_F128_F16 */ unsupported, |
| 288 | /* FPROUND_PPCF128_F16 */ unsupported, |
| 289 | /* FPROUND_F64_F32 */ f32_func_f64, |
| 290 | /* FPROUND_F80_F32 */ unsupported, |
| 291 | /* FPROUND_F128_F32 */ f32_func_i64_i64, |
| 292 | /* FPROUND_PPCF128_F32 */ unsupported, |
| 293 | /* FPROUND_F80_F64 */ unsupported, |
| 294 | /* FPROUND_F128_F64 */ f64_func_i64_i64, |
| 295 | /* FPROUND_PPCF128_F64 */ unsupported, |
| 296 | /* FPTOSINT_F32_I32 */ i32_func_f32, |
| 297 | /* FPTOSINT_F32_I64 */ i64_func_f32, |
| 298 | /* FPTOSINT_F32_I128 */ i64_i64_func_f32, |
| 299 | /* FPTOSINT_F64_I32 */ i32_func_f64, |
| 300 | /* FPTOSINT_F64_I64 */ i64_func_f64, |
| 301 | /* FPTOSINT_F64_I128 */ i64_i64_func_f64, |
| 302 | /* FPTOSINT_F80_I32 */ unsupported, |
| 303 | /* FPTOSINT_F80_I64 */ unsupported, |
| 304 | /* FPTOSINT_F80_I128 */ unsupported, |
| 305 | /* FPTOSINT_F128_I32 */ i32_func_i64_i64, |
| 306 | /* FPTOSINT_F128_I64 */ i64_func_i64_i64, |
| 307 | /* FPTOSINT_F128_I128 */ i64_i64_func_i64_i64, |
| 308 | /* FPTOSINT_PPCF128_I32 */ unsupported, |
| 309 | /* FPTOSINT_PPCF128_I64 */ unsupported, |
| 310 | /* FPTOSINT_PPCF128_I128 */ unsupported, |
| 311 | /* FPTOUINT_F32_I32 */ i32_func_f32, |
| 312 | /* FPTOUINT_F32_I64 */ i64_func_f32, |
| 313 | /* FPTOUINT_F32_I128 */ i64_i64_func_f32, |
| 314 | /* FPTOUINT_F64_I32 */ i32_func_f64, |
| 315 | /* FPTOUINT_F64_I64 */ i64_func_f64, |
| 316 | /* FPTOUINT_F64_I128 */ i64_i64_func_f64, |
| 317 | /* FPTOUINT_F80_I32 */ unsupported, |
| 318 | /* FPTOUINT_F80_I64 */ unsupported, |
| 319 | /* FPTOUINT_F80_I128 */ unsupported, |
| 320 | /* FPTOUINT_F128_I32 */ i32_func_i64_i64, |
| 321 | /* FPTOUINT_F128_I64 */ i64_func_i64_i64, |
| 322 | /* FPTOUINT_F128_I128 */ i64_i64_func_i64_i64, |
| 323 | /* FPTOUINT_PPCF128_I32 */ unsupported, |
| 324 | /* FPTOUINT_PPCF128_I64 */ unsupported, |
| 325 | /* FPTOUINT_PPCF128_I128 */ unsupported, |
| 326 | /* SINTTOFP_I32_F32 */ f32_func_i32, |
| 327 | /* SINTTOFP_I32_F64 */ f64_func_i32, |
| 328 | /* SINTTOFP_I32_F80 */ unsupported, |
| 329 | /* SINTTOFP_I32_F128 */ func_iPTR_i32, |
| 330 | /* SINTTOFP_I32_PPCF128 */ unsupported, |
| 331 | /* SINTTOFP_I64_F32 */ f32_func_i64, |
| 332 | /* SINTTOFP_I64_F64 */ f64_func_i64, |
| 333 | /* SINTTOFP_I64_F80 */ unsupported, |
| 334 | /* SINTTOFP_I64_F128 */ func_iPTR_i64, |
| 335 | /* SINTTOFP_I64_PPCF128 */ unsupported, |
| 336 | /* SINTTOFP_I128_F32 */ f32_func_i64_i64, |
| 337 | /* SINTTOFP_I128_F64 */ f64_func_i64_i64, |
| 338 | /* SINTTOFP_I128_F80 */ unsupported, |
| 339 | /* SINTTOFP_I128_F128 */ func_iPTR_i64_i64, |
| 340 | /* SINTTOFP_I128_PPCF128 */ unsupported, |
| 341 | /* UINTTOFP_I32_F32 */ f32_func_i32, |
| 342 | /* UINTTOFP_I32_F64 */ f64_func_i64, |
| 343 | /* UINTTOFP_I32_F80 */ unsupported, |
| 344 | /* UINTTOFP_I32_F128 */ func_iPTR_i32, |
| 345 | /* UINTTOFP_I32_PPCF128 */ unsupported, |
| 346 | /* UINTTOFP_I64_F32 */ f32_func_i64, |
| 347 | /* UINTTOFP_I64_F64 */ f64_func_i64, |
| 348 | /* UINTTOFP_I64_F80 */ unsupported, |
| 349 | /* UINTTOFP_I64_F128 */ func_iPTR_i64, |
| 350 | /* UINTTOFP_I64_PPCF128 */ unsupported, |
| 351 | /* UINTTOFP_I128_F32 */ f32_func_i64_i64, |
| 352 | /* UINTTOFP_I128_F64 */ f64_func_i64_i64, |
| 353 | /* UINTTOFP_I128_F80 */ unsupported, |
| 354 | /* UINTTOFP_I128_F128 */ func_iPTR_i64_i64, |
| 355 | /* UINTTOFP_I128_PPCF128 */ unsupported, |
| 356 | |
| 357 | // COMPARISON |
| 358 | /* OEQ_F32 */ i32_func_f32_f32, |
| 359 | /* OEQ_F64 */ i32_func_f64_f64, |
| 360 | /* OEQ_F128 */ i32_func_i64_i64_i64_i64, |
| 361 | /* OEQ_PPCF128 */ unsupported, |
| 362 | /* UNE_F32 */ i32_func_f32_f32, |
| 363 | /* UNE_F64 */ i32_func_f64_f64, |
| 364 | /* UNE_F128 */ i32_func_i64_i64_i64_i64, |
| 365 | /* UNE_PPCF128 */ unsupported, |
| 366 | /* OGE_F32 */ i32_func_f32_f32, |
| 367 | /* OGE_F64 */ i32_func_f64_f64, |
| 368 | /* OGE_F128 */ i32_func_i64_i64_i64_i64, |
| 369 | /* OGE_PPCF128 */ unsupported, |
| 370 | /* OLT_F32 */ i32_func_f32_f32, |
| 371 | /* OLT_F64 */ i32_func_f64_f64, |
| 372 | /* OLT_F128 */ i32_func_i64_i64_i64_i64, |
| 373 | /* OLT_PPCF128 */ unsupported, |
| 374 | /* OLE_F32 */ i32_func_f32_f32, |
| 375 | /* OLE_F64 */ i32_func_f64_f64, |
| 376 | /* OLE_F128 */ i32_func_i64_i64_i64_i64, |
| 377 | /* OLE_PPCF128 */ unsupported, |
| 378 | /* OGT_F32 */ i32_func_f32_f32, |
| 379 | /* OGT_F64 */ i32_func_f64_f64, |
| 380 | /* OGT_F128 */ i32_func_i64_i64_i64_i64, |
| 381 | /* OGT_PPCF128 */ unsupported, |
| 382 | /* UO_F32 */ i32_func_f32_f32, |
| 383 | /* UO_F64 */ i32_func_f64_f64, |
| 384 | /* UO_F128 */ i32_func_i64_i64_i64_i64, |
| 385 | /* UO_PPCF128 */ unsupported, |
| 386 | /* O_F32 */ i32_func_f32_f32, |
| 387 | /* O_F64 */ i32_func_f64_f64, |
| 388 | /* O_F128 */ i32_func_i64_i64_i64_i64, |
| 389 | /* O_PPCF128 */ unsupported, |
| 390 | |
| 391 | // MEMORY |
| 392 | /* MEMCPY */ iPTR_func_iPTR_iPTR_iPTR, |
| 393 | /* MEMSET */ iPTR_func_iPTR_i32_iPTR, |
| 394 | /* MEMMOVE */ iPTR_func_iPTR_iPTR_iPTR, |
| 395 | |
| 396 | // ELEMENT-WISE ATOMIC MEMORY |
| 397 | /* MEMCPY_ELEMENT_ATOMIC_1 */ iPTR_func_iPTR_iPTR_iPTR, |
| 398 | /* MEMCPY_ELEMENT_ATOMIC_2 */ iPTR_func_iPTR_iPTR_iPTR, |
| 399 | /* MEMCPY_ELEMENT_ATOMIC_4 */ iPTR_func_iPTR_iPTR_iPTR, |
| 400 | /* MEMCPY_ELEMENT_ATOMIC_8 */ iPTR_func_iPTR_iPTR_iPTR, |
| 401 | /* MEMCPY_ELEMENT_ATOMIC_16 */ iPTR_func_iPTR_iPTR_iPTR, |
| 402 | |
| 403 | // EXCEPTION HANDLING |
| 404 | /* UNWIND_RESUME */ unsupported, |
| 405 | |
| 406 | // Note: there's two sets of atomics libcalls; see |
| 407 | // <http://llvm.org/docs/Atomics.html> for more info on the |
| 408 | // difference between them. |
| 409 | |
| 410 | // Atomic '__sync_*' libcalls. |
| 411 | /* SYNC_VAL_COMPARE_AND_SWAP_1 */ unsupported, |
| 412 | /* SYNC_VAL_COMPARE_AND_SWAP_2 */ unsupported, |
| 413 | /* SYNC_VAL_COMPARE_AND_SWAP_4 */ unsupported, |
| 414 | /* SYNC_VAL_COMPARE_AND_SWAP_8 */ unsupported, |
| 415 | /* SYNC_VAL_COMPARE_AND_SWAP_16 */ unsupported, |
| 416 | /* SYNC_LOCK_TEST_AND_SET_1 */ unsupported, |
| 417 | /* SYNC_LOCK_TEST_AND_SET_2 */ unsupported, |
| 418 | /* SYNC_LOCK_TEST_AND_SET_4 */ unsupported, |
| 419 | /* SYNC_LOCK_TEST_AND_SET_8 */ unsupported, |
| 420 | /* SYNC_LOCK_TEST_AND_SET_16 */ unsupported, |
| 421 | /* SYNC_FETCH_AND_ADD_1 */ unsupported, |
| 422 | /* SYNC_FETCH_AND_ADD_2 */ unsupported, |
| 423 | /* SYNC_FETCH_AND_ADD_4 */ unsupported, |
| 424 | /* SYNC_FETCH_AND_ADD_8 */ unsupported, |
| 425 | /* SYNC_FETCH_AND_ADD_16 */ unsupported, |
| 426 | /* SYNC_FETCH_AND_SUB_1 */ unsupported, |
| 427 | /* SYNC_FETCH_AND_SUB_2 */ unsupported, |
| 428 | /* SYNC_FETCH_AND_SUB_4 */ unsupported, |
| 429 | /* SYNC_FETCH_AND_SUB_8 */ unsupported, |
| 430 | /* SYNC_FETCH_AND_SUB_16 */ unsupported, |
| 431 | /* SYNC_FETCH_AND_AND_1 */ unsupported, |
| 432 | /* SYNC_FETCH_AND_AND_2 */ unsupported, |
| 433 | /* SYNC_FETCH_AND_AND_4 */ unsupported, |
| 434 | /* SYNC_FETCH_AND_AND_8 */ unsupported, |
| 435 | /* SYNC_FETCH_AND_AND_16 */ unsupported, |
| 436 | /* SYNC_FETCH_AND_OR_1 */ unsupported, |
| 437 | /* SYNC_FETCH_AND_OR_2 */ unsupported, |
| 438 | /* SYNC_FETCH_AND_OR_4 */ unsupported, |
| 439 | /* SYNC_FETCH_AND_OR_8 */ unsupported, |
| 440 | /* SYNC_FETCH_AND_OR_16 */ unsupported, |
| 441 | /* SYNC_FETCH_AND_XOR_1 */ unsupported, |
| 442 | /* SYNC_FETCH_AND_XOR_2 */ unsupported, |
| 443 | /* SYNC_FETCH_AND_XOR_4 */ unsupported, |
| 444 | /* SYNC_FETCH_AND_XOR_8 */ unsupported, |
| 445 | /* SYNC_FETCH_AND_XOR_16 */ unsupported, |
| 446 | /* SYNC_FETCH_AND_NAND_1 */ unsupported, |
| 447 | /* SYNC_FETCH_AND_NAND_2 */ unsupported, |
| 448 | /* SYNC_FETCH_AND_NAND_4 */ unsupported, |
| 449 | /* SYNC_FETCH_AND_NAND_8 */ unsupported, |
| 450 | /* SYNC_FETCH_AND_NAND_16 */ unsupported, |
| 451 | /* SYNC_FETCH_AND_MAX_1 */ unsupported, |
| 452 | /* SYNC_FETCH_AND_MAX_2 */ unsupported, |
| 453 | /* SYNC_FETCH_AND_MAX_4 */ unsupported, |
| 454 | /* SYNC_FETCH_AND_MAX_8 */ unsupported, |
| 455 | /* SYNC_FETCH_AND_MAX_16 */ unsupported, |
| 456 | /* SYNC_FETCH_AND_UMAX_1 */ unsupported, |
| 457 | /* SYNC_FETCH_AND_UMAX_2 */ unsupported, |
| 458 | /* SYNC_FETCH_AND_UMAX_4 */ unsupported, |
| 459 | /* SYNC_FETCH_AND_UMAX_8 */ unsupported, |
| 460 | /* SYNC_FETCH_AND_UMAX_16 */ unsupported, |
| 461 | /* SYNC_FETCH_AND_MIN_1 */ unsupported, |
| 462 | /* SYNC_FETCH_AND_MIN_2 */ unsupported, |
| 463 | /* SYNC_FETCH_AND_MIN_4 */ unsupported, |
| 464 | /* SYNC_FETCH_AND_MIN_8 */ unsupported, |
| 465 | /* SYNC_FETCH_AND_MIN_16 */ unsupported, |
| 466 | /* SYNC_FETCH_AND_UMIN_1 */ unsupported, |
| 467 | /* SYNC_FETCH_AND_UMIN_2 */ unsupported, |
| 468 | /* SYNC_FETCH_AND_UMIN_4 */ unsupported, |
| 469 | /* SYNC_FETCH_AND_UMIN_8 */ unsupported, |
| 470 | /* SYNC_FETCH_AND_UMIN_16 */ unsupported, |
| 471 | |
| 472 | // Atomic '__atomic_*' libcalls. |
| 473 | /* ATOMIC_LOAD */ unsupported, |
| 474 | /* ATOMIC_LOAD_1 */ unsupported, |
| 475 | /* ATOMIC_LOAD_2 */ unsupported, |
| 476 | /* ATOMIC_LOAD_4 */ unsupported, |
| 477 | /* ATOMIC_LOAD_8 */ unsupported, |
| 478 | /* ATOMIC_LOAD_16 */ unsupported, |
| 479 | |
| 480 | /* ATOMIC_STORE */ unsupported, |
| 481 | /* ATOMIC_STORE_1 */ unsupported, |
| 482 | /* ATOMIC_STORE_2 */ unsupported, |
| 483 | /* ATOMIC_STORE_4 */ unsupported, |
| 484 | /* ATOMIC_STORE_8 */ unsupported, |
| 485 | /* ATOMIC_STORE_16 */ unsupported, |
| 486 | |
| 487 | /* ATOMIC_EXCHANGE */ unsupported, |
| 488 | /* ATOMIC_EXCHANGE_1 */ unsupported, |
| 489 | /* ATOMIC_EXCHANGE_2 */ unsupported, |
| 490 | /* ATOMIC_EXCHANGE_4 */ unsupported, |
| 491 | /* ATOMIC_EXCHANGE_8 */ unsupported, |
| 492 | /* ATOMIC_EXCHANGE_16 */ unsupported, |
| 493 | |
| 494 | /* ATOMIC_COMPARE_EXCHANGE */ unsupported, |
| 495 | /* ATOMIC_COMPARE_EXCHANGE_1 */ unsupported, |
| 496 | /* ATOMIC_COMPARE_EXCHANGE_2 */ unsupported, |
| 497 | /* ATOMIC_COMPARE_EXCHANGE_4 */ unsupported, |
| 498 | /* ATOMIC_COMPARE_EXCHANGE_8 */ unsupported, |
| 499 | /* ATOMIC_COMPARE_EXCHANGE_16 */ unsupported, |
| 500 | |
| 501 | /* ATOMIC_FETCH_ADD_1 */ unsupported, |
| 502 | /* ATOMIC_FETCH_ADD_2 */ unsupported, |
| 503 | /* ATOMIC_FETCH_ADD_4 */ unsupported, |
| 504 | /* ATOMIC_FETCH_ADD_8 */ unsupported, |
| 505 | /* ATOMIC_FETCH_ADD_16 */ unsupported, |
| 506 | |
| 507 | /* ATOMIC_FETCH_SUB_1 */ unsupported, |
| 508 | /* ATOMIC_FETCH_SUB_2 */ unsupported, |
| 509 | /* ATOMIC_FETCH_SUB_4 */ unsupported, |
| 510 | /* ATOMIC_FETCH_SUB_8 */ unsupported, |
| 511 | /* ATOMIC_FETCH_SUB_16 */ unsupported, |
| 512 | |
| 513 | /* ATOMIC_FETCH_AND_1 */ unsupported, |
| 514 | /* ATOMIC_FETCH_AND_2 */ unsupported, |
| 515 | /* ATOMIC_FETCH_AND_4 */ unsupported, |
| 516 | /* ATOMIC_FETCH_AND_8 */ unsupported, |
| 517 | /* ATOMIC_FETCH_AND_16 */ unsupported, |
| 518 | |
| 519 | /* ATOMIC_FETCH_OR_1 */ unsupported, |
| 520 | /* ATOMIC_FETCH_OR_2 */ unsupported, |
| 521 | /* ATOMIC_FETCH_OR_4 */ unsupported, |
| 522 | /* ATOMIC_FETCH_OR_8 */ unsupported, |
| 523 | /* ATOMIC_FETCH_OR_16 */ unsupported, |
| 524 | |
| 525 | /* ATOMIC_FETCH_XOR_1 */ unsupported, |
| 526 | /* ATOMIC_FETCH_XOR_2 */ unsupported, |
| 527 | /* ATOMIC_FETCH_XOR_4 */ unsupported, |
| 528 | /* ATOMIC_FETCH_XOR_8 */ unsupported, |
| 529 | /* ATOMIC_FETCH_XOR_16 */ unsupported, |
| 530 | |
| 531 | /* ATOMIC_FETCH_NAND_1 */ unsupported, |
| 532 | /* ATOMIC_FETCH_NAND_2 */ unsupported, |
| 533 | /* ATOMIC_FETCH_NAND_4 */ unsupported, |
| 534 | /* ATOMIC_FETCH_NAND_8 */ unsupported, |
| 535 | /* ATOMIC_FETCH_NAND_16 */ unsupported, |
| 536 | |
| 537 | // Stack Protector Fail. |
| 538 | /* STACKPROTECTOR_CHECK_FAIL */ func, |
| 539 | |
| 540 | // Deoptimization. |
| 541 | /* DEOPTIMIZE */ unsupported, |
| 542 | |
| 543 | }; |
| 544 | |
| 545 | static const char * |
| 546 | RuntimeLibcallNames[RTLIB::UNKNOWN_LIBCALL] = { |
| 547 | /* SHL_I16 */ "__ashlhi3", |
| 548 | /* SHL_I32 */ "__ashlsi3", |
| 549 | /* SHL_I64 */ "__ashldi3", |
| 550 | /* SHL_I128 */ "__ashlti3", |
| 551 | /* SRL_I16 */ "__lshrhi3", |
| 552 | /* SRL_I32 */ "__lshrsi3", |
| 553 | /* SRL_I64 */ "__lshrdi3", |
| 554 | /* SRL_I128 */ "__lshrti3", |
| 555 | /* SRA_I16 */ "__ashrhi3", |
| 556 | /* SRA_I32 */ "__ashrsi3", |
| 557 | /* SRA_I64 */ "__ashrdi3", |
| 558 | /* SRA_I128 */ "__ashrti3", |
| 559 | /* MUL_I8 */ "__mulqi3", |
| 560 | /* MUL_I16 */ "__mulhi3", |
| 561 | /* MUL_I32 */ "__mulsi3", |
| 562 | /* MUL_I64 */ "__muldi3", |
| 563 | /* MUL_I128 */ "__multi3", |
| 564 | /* MULO_I32 */ "__mulosi4", |
| 565 | /* MULO_I64 */ "__mulodi4", |
| 566 | /* MULO_I128 */ "__muloti4", |
| 567 | /* SDIV_I8 */ "__divqi3", |
| 568 | /* SDIV_I16 */ "__divhi3", |
| 569 | /* SDIV_I32 */ "__divsi3", |
| 570 | /* SDIV_I64 */ "__divdi3", |
| 571 | /* SDIV_I128 */ "__divti3", |
| 572 | /* UDIV_I8 */ "__udivqi3", |
| 573 | /* UDIV_I16 */ "__udivhi3", |
| 574 | /* UDIV_I32 */ "__udivsi3", |
| 575 | /* UDIV_I64 */ "__udivdi3", |
| 576 | /* UDIV_I128 */ "__udivti3", |
| 577 | /* SREM_I8 */ "__modqi3", |
| 578 | /* SREM_I16 */ "__modhi3", |
| 579 | /* SREM_I32 */ "__modsi3", |
| 580 | /* SREM_I64 */ "__moddi3", |
| 581 | /* SREM_I128 */ "__modti3", |
| 582 | /* UREM_I8 */ "__umodqi3", |
| 583 | /* UREM_I16 */ "__umodhi3", |
| 584 | /* UREM_I32 */ "__umodsi3", |
| 585 | /* UREM_I64 */ "__umoddi3", |
| 586 | /* UREM_I128 */ "__umodti3", |
| 587 | /* SDIVREM_I8 */ nullptr, |
| 588 | /* SDIVREM_I16 */ nullptr, |
| 589 | /* SDIVREM_I32 */ nullptr, |
| 590 | /* SDIVREM_I64 */ nullptr, |
| 591 | /* SDIVREM_I128 */ nullptr, |
| 592 | /* UDIVREM_I8 */ nullptr, |
| 593 | /* UDIVREM_I16 */ nullptr, |
| 594 | /* UDIVREM_I32 */ nullptr, |
| 595 | /* UDIVREM_I64 */ nullptr, |
| 596 | /* UDIVREM_I128 */ nullptr, |
| 597 | /* NEG_I32 */ "__negsi2", |
| 598 | /* NEG_I64 */ "__negdi2", |
| 599 | /* ADD_F32 */ "__addsf3", |
| 600 | /* ADD_F64 */ "__adddf3", |
| 601 | /* ADD_F80 */ nullptr, |
| 602 | /* ADD_F128 */ "__addtf3", |
| 603 | /* ADD_PPCF128 */ nullptr, |
| 604 | /* SUB_F32 */ "__subsf3", |
| 605 | /* SUB_F64 */ "__subdf3", |
| 606 | /* SUB_F80 */ nullptr, |
| 607 | /* SUB_F128 */ "__subtf3", |
| 608 | /* SUB_PPCF128 */ nullptr, |
| 609 | /* MUL_F32 */ "__mulsf3", |
| 610 | /* MUL_F64 */ "__muldf3", |
| 611 | /* MUL_F80 */ nullptr, |
| 612 | /* MUL_F128 */ "__multf3", |
| 613 | /* MUL_PPCF128 */ nullptr, |
| 614 | /* DIV_F32 */ "__divsf3", |
| 615 | /* DIV_F64 */ "__divdf3", |
| 616 | /* DIV_F80 */ nullptr, |
| 617 | /* DIV_F128 */ "__divtf3", |
| 618 | /* DIV_PPCF128 */ nullptr, |
| 619 | /* REM_F32 */ "fmodf", |
| 620 | /* REM_F64 */ "fmod", |
| 621 | /* REM_F80 */ nullptr, |
| 622 | /* REM_F128 */ "fmodl", |
| 623 | /* REM_PPCF128 */ nullptr, |
| 624 | /* FMA_F32 */ "fmaf", |
| 625 | /* FMA_F64 */ "fma", |
| 626 | /* FMA_F80 */ nullptr, |
| 627 | /* FMA_F128 */ "fmal", |
| 628 | /* FMA_PPCF128 */ nullptr, |
| 629 | /* POWI_F32 */ "__powisf2", |
| 630 | /* POWI_F64 */ "__powidf2", |
| 631 | /* POWI_F80 */ nullptr, |
| 632 | /* POWI_F128 */ "__powitf2", |
| 633 | /* POWI_PPCF128 */ nullptr, |
| 634 | /* SQRT_F32 */ "sqrtf", |
| 635 | /* SQRT_F64 */ "sqrt", |
| 636 | /* SQRT_F80 */ nullptr, |
| 637 | /* SQRT_F128 */ "sqrtl", |
| 638 | /* SQRT_PPCF128 */ nullptr, |
| 639 | /* LOG_F32 */ "logf", |
| 640 | /* LOG_F64 */ "log", |
| 641 | /* LOG_F80 */ nullptr, |
| 642 | /* LOG_F128 */ "logl", |
| 643 | /* LOG_PPCF128 */ nullptr, |
| 644 | /* LOG2_F32 */ "log2f", |
| 645 | /* LOG2_F64 */ "log2", |
| 646 | /* LOG2_F80 */ nullptr, |
| 647 | /* LOG2_F128 */ "log2l", |
| 648 | /* LOG2_PPCF128 */ nullptr, |
| 649 | /* LOG10_F32 */ "log10f", |
| 650 | /* LOG10_F64 */ "log10", |
| 651 | /* LOG10_F80 */ nullptr, |
| 652 | /* LOG10_F128 */ "log10l", |
| 653 | /* LOG10_PPCF128 */ nullptr, |
| 654 | /* EXP_F32 */ "expf", |
| 655 | /* EXP_F64 */ "exp", |
| 656 | /* EXP_F80 */ nullptr, |
| 657 | /* EXP_F128 */ "expl", |
| 658 | /* EXP_PPCF128 */ nullptr, |
| 659 | /* EXP2_F32 */ "exp2f", |
| 660 | /* EXP2_F64 */ "exp2", |
| 661 | /* EXP2_F80 */ nullptr, |
| 662 | /* EXP2_F128 */ "exp2l", |
| 663 | /* EXP2_PPCF128 */ nullptr, |
| 664 | /* SIN_F32 */ "sinf", |
| 665 | /* SIN_F64 */ "sin", |
| 666 | /* SIN_F80 */ nullptr, |
| 667 | /* SIN_F128 */ "sinl", |
| 668 | /* SIN_PPCF128 */ nullptr, |
| 669 | /* COS_F32 */ "cosf", |
| 670 | /* COS_F64 */ "cos", |
| 671 | /* COS_F80 */ nullptr, |
| 672 | /* COS_F128 */ "cosl", |
| 673 | /* COS_PPCF128 */ nullptr, |
| 674 | /* SINCOS_F32 */ "sincosf", |
| 675 | /* SINCOS_F64 */ "sincos", |
| 676 | /* SINCOS_F80 */ nullptr, |
| 677 | /* SINCOS_F128 */ "sincosl", |
| 678 | /* SINCOS_PPCF128 */ nullptr, |
| 679 | /* POW_F32 */ "powf", |
| 680 | /* POW_F64 */ "pow", |
| 681 | /* POW_F80 */ nullptr, |
| 682 | /* POW_F128 */ "powl", |
| 683 | /* POW_PPCF128 */ nullptr, |
| 684 | /* CEIL_F32 */ "ceilf", |
| 685 | /* CEIL_F64 */ "ceil", |
| 686 | /* CEIL_F80 */ nullptr, |
| 687 | /* CEIL_F128 */ "ceill", |
| 688 | /* CEIL_PPCF128 */ nullptr, |
| 689 | /* TRUNC_F32 */ "truncf", |
| 690 | /* TRUNC_F64 */ "trunc", |
| 691 | /* TRUNC_F80 */ nullptr, |
| 692 | /* TRUNC_F128 */ "truncl", |
| 693 | /* TRUNC_PPCF128 */ nullptr, |
| 694 | /* RINT_F32 */ "rintf", |
| 695 | /* RINT_F64 */ "rint", |
| 696 | /* RINT_F80 */ nullptr, |
| 697 | /* RINT_F128 */ "rintl", |
| 698 | /* RINT_PPCF128 */ nullptr, |
| 699 | /* NEARBYINT_F32 */ "nearbyintf", |
| 700 | /* NEARBYINT_F64 */ "nearbyint", |
| 701 | /* NEARBYINT_F80 */ nullptr, |
| 702 | /* NEARBYINT_F128 */ "nearbyintl", |
| 703 | /* NEARBYINT_PPCF128 */ nullptr, |
| 704 | /* ROUND_F32 */ "roundf", |
| 705 | /* ROUND_F64 */ "round", |
| 706 | /* ROUND_F80 */ nullptr, |
| 707 | /* ROUND_F128 */ "roundl", |
| 708 | /* ROUND_PPCF128 */ nullptr, |
| 709 | /* FLOOR_F32 */ "floorf", |
| 710 | /* FLOOR_F64 */ "floor", |
| 711 | /* FLOOR_F80 */ nullptr, |
| 712 | /* FLOOR_F128 */ "floorl", |
| 713 | /* FLOOR_PPCF128 */ nullptr, |
| 714 | /* COPYSIGN_F32 */ "copysignf", |
| 715 | /* COPYSIGN_F64 */ "copysign", |
| 716 | /* COPYSIGN_F80 */ nullptr, |
| 717 | /* COPYSIGN_F128 */ "copysignl", |
| 718 | /* COPYSIGN_PPCF128 */ nullptr, |
| 719 | /* FMIN_F32 */ "fminf", |
| 720 | /* FMIN_F64 */ "fmin", |
| 721 | /* FMIN_F80 */ nullptr, |
| 722 | /* FMIN_F128 */ "fminl", |
| 723 | /* FMIN_PPCF128 */ nullptr, |
| 724 | /* FMAX_F32 */ "fmaxf", |
| 725 | /* FMAX_F64 */ "fmax", |
| 726 | /* FMAX_F80 */ nullptr, |
| 727 | /* FMAX_F128 */ "fmaxl", |
| 728 | /* FMAX_PPCF128 */ nullptr, |
| 729 | /* FPEXT_F32_PPCF128 */ nullptr, |
| 730 | /* FPEXT_F64_PPCF128 */ nullptr, |
| 731 | /* FPEXT_F64_F128 */ "__extenddftf2", |
| 732 | /* FPEXT_F32_F128 */ "__extendsftf2", |
| 733 | /* FPEXT_F32_F64 */ "__extendsfdf2", |
| 734 | /* FPEXT_F16_F32 */ "__gnu_h2f_ieee", |
| 735 | /* FPROUND_F32_F16 */ "__gnu_f2h_ieee", |
| 736 | /* FPROUND_F64_F16 */ nullptr, |
| 737 | /* FPROUND_F80_F16 */ nullptr, |
| 738 | /* FPROUND_F128_F16 */ nullptr, |
| 739 | /* FPROUND_PPCF128_F16 */ nullptr, |
| 740 | /* FPROUND_F64_F32 */ "__truncdfsf2", |
| 741 | /* FPROUND_F80_F32 */ "__truncxfsf2", |
| 742 | /* FPROUND_F128_F32 */ "__trunctfsf2", |
| 743 | /* FPROUND_PPCF128_F32 */ nullptr, |
| 744 | /* FPROUND_F80_F64 */ "__truncxfdf2", |
| 745 | /* FPROUND_F128_F64 */ "__trunctfdf2", |
| 746 | /* FPROUND_PPCF128_F64 */ nullptr, |
| 747 | /* FPTOSINT_F32_I32 */ "__fixsfsi", |
| 748 | /* FPTOSINT_F32_I64 */ "__fixsfdi", |
| 749 | /* FPTOSINT_F32_I128 */ "__fixsfti", |
| 750 | /* FPTOSINT_F64_I32 */ "__fixdfsi", |
| 751 | /* FPTOSINT_F64_I64 */ "__fixdfdi", |
| 752 | /* FPTOSINT_F64_I128 */ "__fixdfti", |
| 753 | /* FPTOSINT_F80_I32 */ "__fixxfsi", |
| 754 | /* FPTOSINT_F80_I64 */ "__fixxfdi", |
| 755 | /* FPTOSINT_F80_I128 */ "__fixxfti", |
| 756 | /* FPTOSINT_F128_I32 */ "__fixtfsi", |
| 757 | /* FPTOSINT_F128_I64 */ "__fixtfdi", |
| 758 | /* FPTOSINT_F128_I128 */ "__fixtfti", |
| 759 | /* FPTOSINT_PPCF128_I32 */ nullptr, |
| 760 | /* FPTOSINT_PPCF128_I64 */ nullptr, |
| 761 | /* FPTOSINT_PPCF128_I128 */ nullptr, |
| 762 | /* FPTOUINT_F32_I32 */ "__fixunssfsi", |
| 763 | /* FPTOUINT_F32_I64 */ "__fixunssfdi", |
| 764 | /* FPTOUINT_F32_I128 */ "__fixunssfti", |
| 765 | /* FPTOUINT_F64_I32 */ "__fixunsdfsi", |
| 766 | /* FPTOUINT_F64_I64 */ "__fixunsdfdi", |
| 767 | /* FPTOUINT_F64_I128 */ "__fixunsdfti", |
| 768 | /* FPTOUINT_F80_I32 */ "__fixunsxfsi", |
| 769 | /* FPTOUINT_F80_I64 */ "__fixunsxfdi", |
| 770 | /* FPTOUINT_F80_I128 */ "__fixunsxfti", |
| 771 | /* FPTOUINT_F128_I32 */ "__fixunstfsi", |
| 772 | /* FPTOUINT_F128_I64 */ "__fixunstfdi", |
| 773 | /* FPTOUINT_F128_I128 */ "__fixunstfti", |
| 774 | /* FPTOUINT_PPCF128_I32 */ nullptr, |
| 775 | /* FPTOUINT_PPCF128_I64 */ nullptr, |
| 776 | /* FPTOUINT_PPCF128_I128 */ nullptr, |
| 777 | /* SINTTOFP_I32_F32 */ "__floatsisf", |
| 778 | /* SINTTOFP_I32_F64 */ "__floatsidf", |
| 779 | /* SINTTOFP_I32_F80 */ nullptr, |
| 780 | /* SINTTOFP_I32_F128 */ "__floatsitf", |
| 781 | /* SINTTOFP_I32_PPCF128 */ nullptr, |
| 782 | /* SINTTOFP_I64_F32 */ "__floatdisf", |
| 783 | /* SINTTOFP_I64_F64 */ "__floatdidf", |
| 784 | /* SINTTOFP_I64_F80 */ nullptr, |
| 785 | /* SINTTOFP_I64_F128 */ "__floatditf", |
| 786 | /* SINTTOFP_I64_PPCF128 */ nullptr, |
| 787 | /* SINTTOFP_I128_F32 */ "__floattisf", |
| 788 | /* SINTTOFP_I128_F64 */ "__floattidf", |
| 789 | /* SINTTOFP_I128_F80 */ nullptr, |
| 790 | /* SINTTOFP_I128_F128 */ "__floattitf", |
| 791 | /* SINTTOFP_I128_PPCF128 */ nullptr, |
| 792 | /* UINTTOFP_I32_F32 */ "__floatunsisf", |
| 793 | /* UINTTOFP_I32_F64 */ "__floatunsidf", |
| 794 | /* UINTTOFP_I32_F80 */ nullptr, |
| 795 | /* UINTTOFP_I32_F128 */ "__floatunsitf", |
| 796 | /* UINTTOFP_I32_PPCF128 */ nullptr, |
| 797 | /* UINTTOFP_I64_F32 */ "__floatundisf", |
| 798 | /* UINTTOFP_I64_F64 */ "__floatundidf", |
| 799 | /* UINTTOFP_I64_F80 */ nullptr, |
| 800 | /* UINTTOFP_I64_F128 */ "__floatunditf", |
| 801 | /* UINTTOFP_I64_PPCF128 */ nullptr, |
| 802 | /* UINTTOFP_I128_F32 */ "__floatuntisf", |
| 803 | /* UINTTOFP_I128_F64 */ "__floatuntidf", |
| 804 | /* UINTTOFP_I128_F80 */ nullptr, |
| 805 | /* UINTTOFP_I128_F128 */ "__floatuntitf", |
| 806 | /* UINTTOFP_I128_PPCF128 */ nullptr, |
| 807 | /* OEQ_F32 */ "__eqsf2", |
| 808 | /* OEQ_F64 */ "__eqdf2", |
| 809 | /* OEQ_F128 */ "__eqtf2", |
| 810 | /* OEQ_PPCF128 */ nullptr, |
| 811 | /* UNE_F32 */ "__nesf2", |
| 812 | /* UNE_F64 */ "__nedf2", |
| 813 | /* UNE_F128 */ "__netf2", |
| 814 | /* UNE_PPCF128 */ nullptr, |
| 815 | /* OGE_F32 */ "__gesf2", |
| 816 | /* OGE_F64 */ "__gedf2", |
| 817 | /* OGE_F128 */ "__getf2", |
| 818 | /* OGE_PPCF128 */ nullptr, |
| 819 | /* OLT_F32 */ "__ltsf2", |
| 820 | /* OLT_F64 */ "__ltdf2", |
| 821 | /* OLT_F128 */ "__lttf2", |
| 822 | /* OLT_PPCF128 */ nullptr, |
| 823 | /* OLE_F32 */ "__lesf2", |
| 824 | /* OLE_F64 */ "__ledf2", |
| 825 | /* OLE_F128 */ "__letf2", |
| 826 | /* OLE_PPCF128 */ nullptr, |
| 827 | /* OGT_F32 */ "__gtsf2", |
| 828 | /* OGT_F64 */ "__gtdf2", |
| 829 | /* OGT_F128 */ "__gttf2", |
| 830 | /* OGT_PPCF128 */ nullptr, |
| 831 | /* UO_F32 */ "__unordsf2", |
| 832 | /* UO_F64 */ "__unorddf2", |
| 833 | /* UO_F128 */ "__unordtf2", |
| 834 | /* UO_PPCF128 */ nullptr, |
| 835 | /* O_F32 */ "__unordsf2", |
| 836 | /* O_F64 */ "__unorddf2", |
| 837 | /* O_F128 */ "__unordtf2", |
| 838 | /* O_PPCF128 */ nullptr, |
| 839 | /* MEMCPY */ "memcpy", |
| 840 | /* MEMMOVE */ "memset", |
| 841 | /* MEMSET */ "memmove", |
| 842 | /* MEMCPY_ELEMENT_ATOMIC_1 */ "MEMCPY_ELEMENT_ATOMIC_1", |
| 843 | /* MEMCPY_ELEMENT_ATOMIC_2 */ "MEMCPY_ELEMENT_ATOMIC_2", |
| 844 | /* MEMCPY_ELEMENT_ATOMIC_4 */ "MEMCPY_ELEMENT_ATOMIC_4", |
| 845 | /* MEMCPY_ELEMENT_ATOMIC_8 */ "MEMCPY_ELEMENT_ATOMIC_8", |
| 846 | /* MEMCPY_ELEMENT_ATOMIC_16 */ "MEMCPY_ELEMENT_ATOMIC_16", |
| 847 | /* UNWIND_RESUME */ "_Unwind_Resume", |
| 848 | /* SYNC_VAL_COMPARE_AND_SWAP_1 */ "__sync_val_compare_and_swap_1", |
| 849 | /* SYNC_VAL_COMPARE_AND_SWAP_2 */ "__sync_val_compare_and_swap_2", |
| 850 | /* SYNC_VAL_COMPARE_AND_SWAP_4 */ "__sync_val_compare_and_swap_4", |
| 851 | /* SYNC_VAL_COMPARE_AND_SWAP_8 */ "__sync_val_compare_and_swap_8", |
| 852 | /* SYNC_VAL_COMPARE_AND_SWAP_16 */ "__sync_val_compare_and_swap_16", |
| 853 | /* SYNC_LOCK_TEST_AND_SET_1 */ "__sync_lock_test_and_set_1", |
| 854 | /* SYNC_LOCK_TEST_AND_SET_2 */ "__sync_lock_test_and_set_2", |
| 855 | /* SYNC_LOCK_TEST_AND_SET_4 */ "__sync_lock_test_and_set_4", |
| 856 | /* SYNC_LOCK_TEST_AND_SET_8 */ "__sync_lock_test_and_set_8", |
| 857 | /* SYNC_LOCK_TEST_AND_SET_16 */ "__sync_lock_test_and_set_16", |
| 858 | /* SYNC_FETCH_AND_ADD_1 */ "__sync_fetch_and_add_1", |
| 859 | /* SYNC_FETCH_AND_ADD_2 */ "__sync_fetch_and_add_2", |
| 860 | /* SYNC_FETCH_AND_ADD_4 */ "__sync_fetch_and_add_4", |
| 861 | /* SYNC_FETCH_AND_ADD_8 */ "__sync_fetch_and_add_8", |
| 862 | /* SYNC_FETCH_AND_ADD_16 */ "__sync_fetch_and_add_16", |
| 863 | /* SYNC_FETCH_AND_SUB_1 */ "__sync_fetch_and_sub_1", |
| 864 | /* SYNC_FETCH_AND_SUB_2 */ "__sync_fetch_and_sub_2", |
| 865 | /* SYNC_FETCH_AND_SUB_4 */ "__sync_fetch_and_sub_4", |
| 866 | /* SYNC_FETCH_AND_SUB_8 */ "__sync_fetch_and_sub_8", |
| 867 | /* SYNC_FETCH_AND_SUB_16 */ "__sync_fetch_and_sub_16", |
| 868 | /* SYNC_FETCH_AND_AND_1 */ "__sync_fetch_and_and_1", |
| 869 | /* SYNC_FETCH_AND_AND_2 */ "__sync_fetch_and_and_2", |
| 870 | /* SYNC_FETCH_AND_AND_4 */ "__sync_fetch_and_and_4", |
| 871 | /* SYNC_FETCH_AND_AND_8 */ "__sync_fetch_and_and_8", |
| 872 | /* SYNC_FETCH_AND_AND_16 */ "__sync_fetch_and_and_16", |
| 873 | /* SYNC_FETCH_AND_OR_1 */ "__sync_fetch_and_or_1", |
| 874 | /* SYNC_FETCH_AND_OR_2 */ "__sync_fetch_and_or_2", |
| 875 | /* SYNC_FETCH_AND_OR_4 */ "__sync_fetch_and_or_4", |
| 876 | /* SYNC_FETCH_AND_OR_8 */ "__sync_fetch_and_or_8", |
| 877 | /* SYNC_FETCH_AND_OR_16 */ "__sync_fetch_and_or_16", |
| 878 | /* SYNC_FETCH_AND_XOR_1 */ "__sync_fetch_and_xor_1", |
| 879 | /* SYNC_FETCH_AND_XOR_2 */ "__sync_fetch_and_xor_2", |
| 880 | /* SYNC_FETCH_AND_XOR_4 */ "__sync_fetch_and_xor_4", |
| 881 | /* SYNC_FETCH_AND_XOR_8 */ "__sync_fetch_and_xor_8", |
| 882 | /* SYNC_FETCH_AND_XOR_16 */ "__sync_fetch_and_xor_16", |
| 883 | /* SYNC_FETCH_AND_NAND_1 */ "__sync_fetch_and_nand_1", |
| 884 | /* SYNC_FETCH_AND_NAND_2 */ "__sync_fetch_and_nand_2", |
| 885 | /* SYNC_FETCH_AND_NAND_4 */ "__sync_fetch_and_nand_4", |
| 886 | /* SYNC_FETCH_AND_NAND_8 */ "__sync_fetch_and_nand_8", |
| 887 | /* SYNC_FETCH_AND_NAND_16 */ "__sync_fetch_and_nand_16", |
| 888 | /* SYNC_FETCH_AND_MAX_1 */ "__sync_fetch_and_max_1", |
| 889 | /* SYNC_FETCH_AND_MAX_2 */ "__sync_fetch_and_max_2", |
| 890 | /* SYNC_FETCH_AND_MAX_4 */ "__sync_fetch_and_max_4", |
| 891 | /* SYNC_FETCH_AND_MAX_8 */ "__sync_fetch_and_max_8", |
| 892 | /* SYNC_FETCH_AND_MAX_16 */ "__sync_fetch_and_max_16", |
| 893 | /* SYNC_FETCH_AND_UMAX_1 */ "__sync_fetch_and_umax_1", |
| 894 | /* SYNC_FETCH_AND_UMAX_2 */ "__sync_fetch_and_umax_2", |
| 895 | /* SYNC_FETCH_AND_UMAX_4 */ "__sync_fetch_and_umax_4", |
| 896 | /* SYNC_FETCH_AND_UMAX_8 */ "__sync_fetch_and_umax_8", |
| 897 | /* SYNC_FETCH_AND_UMAX_16 */ "__sync_fetch_and_umax_16", |
| 898 | /* SYNC_FETCH_AND_MIN_1 */ "__sync_fetch_and_min_1", |
| 899 | /* SYNC_FETCH_AND_MIN_2 */ "__sync_fetch_and_min_2", |
| 900 | /* SYNC_FETCH_AND_MIN_4 */ "__sync_fetch_and_min_4", |
| 901 | /* SYNC_FETCH_AND_MIN_8 */ "__sync_fetch_and_min_8", |
| 902 | /* SYNC_FETCH_AND_MIN_16 */ "__sync_fetch_and_min_16", |
| 903 | /* SYNC_FETCH_AND_UMIN_1 */ "__sync_fetch_and_umin_1", |
| 904 | /* SYNC_FETCH_AND_UMIN_2 */ "__sync_fetch_and_umin_2", |
| 905 | /* SYNC_FETCH_AND_UMIN_4 */ "__sync_fetch_and_umin_4", |
| 906 | /* SYNC_FETCH_AND_UMIN_8 */ "__sync_fetch_and_umin_8", |
| 907 | /* SYNC_FETCH_AND_UMIN_16 */ "__sync_fetch_and_umin_16", |
| 908 | |
| 909 | /* ATOMIC_LOAD */ "__atomic_load", |
| 910 | /* ATOMIC_LOAD_1 */ "__atomic_load_1", |
| 911 | /* ATOMIC_LOAD_2 */ "__atomic_load_2", |
| 912 | /* ATOMIC_LOAD_4 */ "__atomic_load_4", |
| 913 | /* ATOMIC_LOAD_8 */ "__atomic_load_8", |
| 914 | /* ATOMIC_LOAD_16 */ "__atomic_load_16", |
| 915 | |
| 916 | /* ATOMIC_STORE */ "__atomic_store", |
| 917 | /* ATOMIC_STORE_1 */ "__atomic_store_1", |
| 918 | /* ATOMIC_STORE_2 */ "__atomic_store_2", |
| 919 | /* ATOMIC_STORE_4 */ "__atomic_store_4", |
| 920 | /* ATOMIC_STORE_8 */ "__atomic_store_8", |
| 921 | /* ATOMIC_STORE_16 */ "__atomic_store_16", |
| 922 | |
| 923 | /* ATOMIC_EXCHANGE */ "__atomic_exchange", |
| 924 | /* ATOMIC_EXCHANGE_1 */ "__atomic_exchange_1", |
| 925 | /* ATOMIC_EXCHANGE_2 */ "__atomic_exchange_2", |
| 926 | /* ATOMIC_EXCHANGE_4 */ "__atomic_exchange_4", |
| 927 | /* ATOMIC_EXCHANGE_8 */ "__atomic_exchange_8", |
| 928 | /* ATOMIC_EXCHANGE_16 */ "__atomic_exchange_16", |
| 929 | |
| 930 | /* ATOMIC_COMPARE_EXCHANGE */ "__atomic_compare_exchange", |
| 931 | /* ATOMIC_COMPARE_EXCHANGE_1 */ "__atomic_compare_exchange_1", |
| 932 | /* ATOMIC_COMPARE_EXCHANGE_2 */ "__atomic_compare_exchange_2", |
| 933 | /* ATOMIC_COMPARE_EXCHANGE_4 */ "__atomic_compare_exchange_4", |
| 934 | /* ATOMIC_COMPARE_EXCHANGE_8 */ "__atomic_compare_exchange_8", |
| 935 | /* ATOMIC_COMPARE_EXCHANGE_16 */ "__atomic_compare_exchange_16", |
| 936 | |
| 937 | /* ATOMIC_FETCH_ADD_1 */ "__atomic_fetch_add_1", |
| 938 | /* ATOMIC_FETCH_ADD_2 */ "__atomic_fetch_add_2", |
| 939 | /* ATOMIC_FETCH_ADD_4 */ "__atomic_fetch_add_4", |
| 940 | /* ATOMIC_FETCH_ADD_8 */ "__atomic_fetch_add_8", |
| 941 | /* ATOMIC_FETCH_ADD_16 */ "__atomic_fetch_add_16", |
| 942 | /* ATOMIC_FETCH_SUB_1 */ "__atomic_fetch_sub_1", |
| 943 | /* ATOMIC_FETCH_SUB_2 */ "__atomic_fetch_sub_2", |
| 944 | /* ATOMIC_FETCH_SUB_4 */ "__atomic_fetch_sub_4", |
| 945 | /* ATOMIC_FETCH_SUB_8 */ "__atomic_fetch_sub_8", |
| 946 | /* ATOMIC_FETCH_SUB_16 */ "__atomic_fetch_sub_16", |
| 947 | /* ATOMIC_FETCH_AND_1 */ "__atomic_fetch_and_1", |
| 948 | /* ATOMIC_FETCH_AND_2 */ "__atomic_fetch_and_2", |
| 949 | /* ATOMIC_FETCH_AND_4 */ "__atomic_fetch_and_4", |
| 950 | /* ATOMIC_FETCH_AND_8 */ "__atomic_fetch_and_8", |
| 951 | /* ATOMIC_FETCH_AND_16 */ "__atomic_fetch_and_16", |
| 952 | /* ATOMIC_FETCH_OR_1 */ "__atomic_fetch_or_1", |
| 953 | /* ATOMIC_FETCH_OR_2 */ "__atomic_fetch_or_2", |
| 954 | /* ATOMIC_FETCH_OR_4 */ "__atomic_fetch_or_4", |
| 955 | /* ATOMIC_FETCH_OR_8 */ "__atomic_fetch_or_8", |
| 956 | /* ATOMIC_FETCH_OR_16 */ "__atomic_fetch_or_16", |
| 957 | /* ATOMIC_FETCH_XOR_1 */ "__atomic_fetch_xor_1", |
| 958 | /* ATOMIC_FETCH_XOR_2 */ "__atomic_fetch_xor_2", |
| 959 | /* ATOMIC_FETCH_XOR_4 */ "__atomic_fetch_xor_4", |
| 960 | /* ATOMIC_FETCH_XOR_8 */ "__atomic_fetch_xor_8", |
| 961 | /* ATOMIC_FETCH_XOR_16 */ "__atomic_fetch_xor_16", |
| 962 | /* ATOMIC_FETCH_NAND_1 */ "__atomic_fetch_nand_1", |
| 963 | /* ATOMIC_FETCH_NAND_2 */ "__atomic_fetch_nand_2", |
| 964 | /* ATOMIC_FETCH_NAND_4 */ "__atomic_fetch_nand_4", |
| 965 | /* ATOMIC_FETCH_NAND_8 */ "__atomic_fetch_nand_8", |
| 966 | /* ATOMIC_FETCH_NAND_16 */ "__atomic_fetch_nand_16", |
| 967 | |
| 968 | /* STACKPROTECTOR_CHECK_FAIL */ "__stack_chk_fail", |
| 969 | |
| 970 | /* DEOPTIMIZE */ "__llvm_deoptimize", |
| 971 | }; |
| 972 | |
| 973 | void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, |
| 974 | RTLIB::Libcall LC, |
| 975 | SmallVectorImpl<unsigned> &Rets, |
| 976 | SmallVectorImpl<unsigned> &Params) |
| 977 | { |
| 978 | assert(Rets.empty()); |
| 979 | assert(Params.empty()); |
| 980 | |
| 981 | WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ? |
| 982 | WebAssembly::ExprType::I64 : |
| 983 | WebAssembly::ExprType::I32; |
| 984 | |
| 985 | switch (RuntimeLibcallSignatures[LC]) { |
| 986 | case func: |
| 987 | break; |
| 988 | case f32_func_f32: |
| 989 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 990 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 991 | break; |
| 992 | case f32_func_f64: |
| 993 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 994 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 995 | break; |
| 996 | case f32_func_i32: |
| 997 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 998 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 999 | break; |
| 1000 | case f32_func_i64: |
| 1001 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1002 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1003 | break; |
| 1004 | case f32_func_i16: |
| 1005 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1006 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1007 | break; |
| 1008 | case f64_func_f32: |
| 1009 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1010 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1011 | break; |
| 1012 | case f64_func_f64: |
| 1013 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1014 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1015 | break; |
| 1016 | case f64_func_i32: |
| 1017 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1018 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1019 | break; |
| 1020 | case f64_func_i64: |
| 1021 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1022 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1023 | break; |
| 1024 | case i32_func_f32: |
| 1025 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1026 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1027 | break; |
| 1028 | case i32_func_f64: |
| 1029 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1030 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1031 | break; |
| 1032 | case i32_func_i32: |
| 1033 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1034 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1035 | break; |
| 1036 | case i64_func_f32: |
| 1037 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1038 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1039 | break; |
| 1040 | case i64_func_f64: |
| 1041 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1042 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1043 | break; |
| 1044 | case i64_func_i64: |
| 1045 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1046 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1047 | break; |
| 1048 | case f32_func_f32_f32: |
| 1049 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1050 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1051 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1052 | break; |
| 1053 | case f32_func_f32_i32: |
| 1054 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1055 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1056 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1057 | break; |
| 1058 | case f32_func_i64_i64: |
| 1059 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1060 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1061 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1062 | break; |
| 1063 | case f64_func_f64_f64: |
| 1064 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1065 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1066 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1067 | break; |
| 1068 | case f64_func_f64_i32: |
| 1069 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1070 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1071 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1072 | break; |
| 1073 | case f64_func_i64_i64: |
| 1074 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1075 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1076 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1077 | break; |
| 1078 | case i16_func_f32: |
| 1079 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1080 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1081 | break; |
| 1082 | case i8_func_i8_i8: |
| 1083 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1084 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1085 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1086 | break; |
| 1087 | case func_f32_iPTR_iPTR: |
| 1088 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1089 | Params.push_back(unsigned(iPTR)); |
| 1090 | Params.push_back(unsigned(iPTR)); |
| 1091 | break; |
| 1092 | case func_f64_iPTR_iPTR: |
| 1093 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1094 | Params.push_back(unsigned(iPTR)); |
| 1095 | Params.push_back(unsigned(iPTR)); |
| 1096 | break; |
| 1097 | case i16_func_i16_i16: |
| 1098 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1099 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1100 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1101 | break; |
| 1102 | case i32_func_f32_f32: |
| 1103 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1104 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1105 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1106 | break; |
| 1107 | case i32_func_f64_f64: |
| 1108 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1109 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1110 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1111 | break; |
| 1112 | case i32_func_i32_i32: |
| 1113 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1114 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1115 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1116 | break; |
| 1117 | case i64_func_i64_i64: |
| 1118 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1119 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1120 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1121 | break; |
| 1122 | case i64_i64_func_f32: |
| 1123 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1124 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1125 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1126 | #else |
| 1127 | Params.push_back(unsigned(iPTR)); |
| 1128 | #endif |
| 1129 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1130 | break; |
| 1131 | case i64_i64_func_f64: |
| 1132 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1133 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1134 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1135 | #else |
| 1136 | Params.push_back(unsigned(iPTR)); |
| 1137 | #endif |
| 1138 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1139 | break; |
| 1140 | case i16_i16_func_i16_i16: |
| 1141 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1142 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1143 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1144 | #else |
| 1145 | Params.push_back(unsigned(iPTR)); |
| 1146 | #endif |
| 1147 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1148 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1149 | break; |
| 1150 | case i32_i32_func_i32_i32: |
| 1151 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1152 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1153 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1154 | #else |
| 1155 | Params.push_back(unsigned(iPTR)); |
| 1156 | #endif |
| 1157 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1158 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1159 | break; |
| 1160 | case i64_i64_func_i64_i64: |
| 1161 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1162 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1163 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1164 | #else |
| 1165 | Params.push_back(unsigned(iPTR)); |
| 1166 | #endif |
| 1167 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1168 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1169 | break; |
| 1170 | case i64_i64_func_i64_i64_i64_i64: |
| 1171 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1172 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1173 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1174 | #else |
| 1175 | Params.push_back(unsigned(iPTR)); |
| 1176 | #endif |
| 1177 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1178 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1179 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1180 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1181 | break; |
| 1182 | case i64_i64_i64_i64_func_i64_i64_i64_i64: |
| 1183 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1184 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1185 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1186 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1187 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1188 | #else |
| 1189 | Params.push_back(unsigned(iPTR)); |
| 1190 | #endif |
| 1191 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1192 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1193 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1194 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1195 | break; |
| 1196 | case i64_i64_func_i64_i64_i32: |
| 1197 | #if 0 // TODO: Enable this when wasm gets multiple-return-value support. |
| 1198 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1199 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1200 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1201 | Rets.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1202 | #else |
| 1203 | Params.push_back(unsigned(iPTR)); |
| 1204 | #endif |
| 1205 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1206 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1207 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1208 | break; |
| 1209 | case iPTR_func_iPTR_i32_iPTR: |
| 1210 | Rets.push_back(unsigned(iPTR)); |
| 1211 | Params.push_back(unsigned(iPTR)); |
| 1212 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1213 | Params.push_back(unsigned(iPTR)); |
| 1214 | break; |
| 1215 | case iPTR_func_iPTR_iPTR_iPTR: |
| 1216 | Rets.push_back(unsigned(iPTR)); |
| 1217 | Params.push_back(unsigned(iPTR)); |
| 1218 | Params.push_back(unsigned(iPTR)); |
| 1219 | Params.push_back(unsigned(iPTR)); |
| 1220 | break; |
| 1221 | case f32_func_f32_f32_f32: |
| 1222 | Rets.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1223 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1224 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1225 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1226 | break; |
| 1227 | case f64_func_f64_f64_f64: |
| 1228 | Rets.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1229 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1230 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1231 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1232 | break; |
| 1233 | case func_i64_i64_iPTR_iPTR: |
| 1234 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1235 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1236 | Params.push_back(unsigned(iPTR)); |
| 1237 | Params.push_back(unsigned(iPTR)); |
| 1238 | break; |
| 1239 | case func_iPTR_f32: |
| 1240 | Params.push_back(unsigned(iPTR)); |
| 1241 | Params.push_back(unsigned(WebAssembly::ExprType::F32)); |
| 1242 | break; |
| 1243 | case func_iPTR_f64: |
| 1244 | Params.push_back(unsigned(iPTR)); |
| 1245 | Params.push_back(unsigned(WebAssembly::ExprType::F64)); |
| 1246 | break; |
| 1247 | case func_iPTR_i32: |
| 1248 | Params.push_back(unsigned(iPTR)); |
| 1249 | Params.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1250 | break; |
| 1251 | case func_iPTR_i64: |
| 1252 | Params.push_back(unsigned(iPTR)); |
| 1253 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1254 | break; |
| 1255 | case func_iPTR_i64_i64: |
| 1256 | Params.push_back(unsigned(iPTR)); |
| 1257 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1258 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1259 | break; |
| 1260 | case func_iPTR_i64_i64_i64_i64: |
| 1261 | Params.push_back(unsigned(iPTR)); |
| 1262 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1263 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1264 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1265 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1266 | break; |
| 1267 | case func_iPTR_i64_i64_i64_i64_i64_i64: |
| 1268 | Params.push_back(unsigned(iPTR)); |
| 1269 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1270 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1271 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1272 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1273 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1274 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1275 | break; |
| 1276 | case i32_func_i64_i64: |
| 1277 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1278 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1279 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1280 | break; |
| 1281 | case i32_func_i64_i64_i64_i64: |
| 1282 | Rets.push_back(unsigned(WebAssembly::ExprType::I32)); |
| 1283 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1284 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1285 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1286 | Params.push_back(unsigned(WebAssembly::ExprType::I64)); |
| 1287 | break; |
| 1288 | case unsupported: |
| 1289 | llvm_unreachable("unsupported runtime library signature"); |
| 1290 | } |
| 1291 | } |
| 1292 | |
| 1293 | void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, |
| 1294 | const char *Name, |
| 1295 | SmallVectorImpl<unsigned> &Rets, |
| 1296 | SmallVectorImpl<unsigned> &Params) |
| 1297 | { |
| 1298 | assert(strcmp(RuntimeLibcallNames[RTLIB::DEOPTIMIZE], "__llvm_deoptimize") == |
| 1299 | 0); |
| 1300 | |
| 1301 | for (size_t i = 0, e = RTLIB::UNKNOWN_LIBCALL; i < e; ++i) |
| 1302 | if (RuntimeLibcallNames[i] && strcmp(RuntimeLibcallNames[i], Name) == 0) |
| 1303 | return GetSignature(Subtarget, RTLIB::Libcall(i), Rets, Params); |
| 1304 | |
| 1305 | llvm_unreachable("unexpected runtime library name"); |
| 1306 | } |