// CodeGen/RuntimeLibcallSignatures.cpp - R.T. Lib. Call Signatures -*- C++ -*-- // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief This file contains signature information for runtime libcalls. /// /// CodeGen uses external symbols, which it refers to by name. The WebAssembly /// target needs type information for all functions. This file contains a big /// table providing type signatures for all runtime library functions that LLVM /// uses. /// /// This is currently a fairly heavy-handed solution. /// //===----------------------------------------------------------------------===// #include "WebAssemblyRuntimeLibcallSignatures.h" #include "WebAssemblySubtarget.h" #include "llvm/CodeGen/RuntimeLibcalls.h" using namespace llvm; namespace { enum RuntimeLibcallSignature { func, f32_func_f32, f32_func_f64, f32_func_i32, f32_func_i64, f32_func_i16, f64_func_f32, f64_func_f64, f64_func_i32, f64_func_i64, i32_func_f32, i32_func_f64, i32_func_i32, i64_func_f32, i64_func_f64, i64_func_i64, f32_func_f32_f32, f32_func_f32_i32, f32_func_i64_i64, f64_func_f64_f64, f64_func_f64_i32, f64_func_i64_i64, i16_func_f32, i8_func_i8_i8, func_f32_iPTR_iPTR, func_f64_iPTR_iPTR, i16_func_i16_i16, i32_func_f32_f32, i32_func_f64_f64, i32_func_i32_i32, i64_func_i64_i64, i64_i64_func_f32, i64_i64_func_f64, i16_i16_func_i16_i16, i32_i32_func_i32_i32, i64_i64_func_i64_i64, i64_i64_func_i64_i64_i64_i64, i64_i64_i64_i64_func_i64_i64_i64_i64, i64_i64_func_i64_i64_i32, iPTR_func_iPTR_i32_iPTR, iPTR_func_iPTR_iPTR_iPTR, f32_func_f32_f32_f32, f64_func_f64_f64_f64, func_i64_i64_iPTR_iPTR, func_iPTR_f32, func_iPTR_f64, func_iPTR_i32, func_iPTR_i64, func_iPTR_i64_i64, func_iPTR_i64_i64_i64_i64, func_iPTR_i64_i64_i64_i64_i64_i64, i32_func_i64_i64, i32_func_i64_i64_i64_i64, unsupported }; } // end anonymous namespace static const RuntimeLibcallSignature RuntimeLibcallSignatures[RTLIB::UNKNOWN_LIBCALL] = { // Integer /* SHL_I16 */ i16_func_i16_i16, /* SHL_I32 */ i32_func_i32_i32, /* SHL_I64 */ i64_func_i64_i64, /* SHL_I128 */ i64_i64_func_i64_i64_i32, /* SRL_I16 */ i16_func_i16_i16, /* SRL_I32 */ i32_func_i32_i32, /* SRL_I64 */ i64_func_i64_i64, /* SRL_I128 */ i64_i64_func_i64_i64_i32, /* SRA_I16 */ i16_func_i16_i16, /* SRA_I32 */ i32_func_i32_i32, /* SRA_I64 */ i64_func_i64_i64, /* SRA_I128 */ i64_i64_func_i64_i64_i32, /* MUL_I8 */ i8_func_i8_i8, /* MUL_I16 */ i16_func_i16_i16, /* MUL_I32 */ i32_func_i32_i32, /* MUL_I64 */ i64_func_i64_i64, /* MUL_I128 */ i64_i64_func_i64_i64_i64_i64, /* MULO_I32 */ i32_func_i32_i32, /* MULO_I64 */ i64_func_i64_i64, /* MULO_I128 */ i64_i64_func_i64_i64_i64_i64, /* SDIV_I8 */ i8_func_i8_i8, /* SDIV_I16 */ i16_func_i16_i16, /* SDIV_I32 */ i32_func_i32_i32, /* SDIV_I64 */ i64_func_i64_i64, /* SDIV_I128 */ i64_i64_func_i64_i64_i64_i64, /* UDIV_I8 */ i8_func_i8_i8, /* UDIV_I16 */ i16_func_i16_i16, /* UDIV_I32 */ i32_func_i32_i32, /* UDIV_I64 */ i64_func_i64_i64, /* UDIV_I128 */ i64_i64_func_i64_i64_i64_i64, /* SREM_I8 */ i8_func_i8_i8, /* SREM_I16 */ i16_func_i16_i16, /* SREM_I32 */ i32_func_i32_i32, /* SREM_I64 */ i64_func_i64_i64, /* SREM_I128 */ i64_i64_func_i64_i64_i64_i64, /* UREM_I8 */ i8_func_i8_i8, /* UREM_I16 */ i16_func_i16_i16, /* UREM_I32 */ i32_func_i32_i32, /* UREM_I64 */ i64_func_i64_i64, /* UREM_I128 */ i64_i64_func_i64_i64_i64_i64, /* SDIVREM_I8 */ i8_func_i8_i8, /* SDIVREM_I16 */ i16_i16_func_i16_i16, /* SDIVREM_I32 */ i32_i32_func_i32_i32, /* SDIVREM_I64 */ i64_func_i64_i64, /* SDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64, /* UDIVREM_I8 */ i8_func_i8_i8, /* UDIVREM_I16 */ i16_i16_func_i16_i16, /* UDIVREM_I32 */ i32_i32_func_i32_i32, /* UDIVREM_I64 */ i64_i64_func_i64_i64, /* UDIVREM_I128 */ i64_i64_i64_i64_func_i64_i64_i64_i64, /* NEG_I32 */ i32_func_i32, /* NEG_I64 */ i64_func_i64, // FLOATING POINT /* ADD_F32 */ f32_func_f32_f32, /* ADD_F64 */ f64_func_f64_f64, /* ADD_F80 */ unsupported, /* ADD_F128 */ func_iPTR_i64_i64_i64_i64, /* ADD_PPCF128 */ unsupported, /* SUB_F32 */ f32_func_f32_f32, /* SUB_F64 */ f64_func_f64_f64, /* SUB_F80 */ unsupported, /* SUB_F128 */ func_iPTR_i64_i64_i64_i64, /* SUB_PPCF128 */ unsupported, /* MUL_F32 */ f32_func_f32_f32, /* MUL_F64 */ f64_func_f64_f64, /* MUL_F80 */ unsupported, /* MUL_F128 */ func_iPTR_i64_i64_i64_i64, /* MUL_PPCF128 */ unsupported, /* DIV_F32 */ f32_func_f32_f32, /* DIV_F64 */ f64_func_f64_f64, /* DIV_F80 */ unsupported, /* DIV_F128 */ func_iPTR_i64_i64_i64_i64, /* DIV_PPCF128 */ unsupported, /* REM_F32 */ f32_func_f32_f32, /* REM_F64 */ f64_func_f64_f64, /* REM_F80 */ unsupported, /* REM_F128 */ func_iPTR_i64_i64_i64_i64, /* REM_PPCF128 */ unsupported, /* FMA_F32 */ f32_func_f32_f32_f32, /* FMA_F64 */ f64_func_f64_f64_f64, /* FMA_F80 */ unsupported, /* FMA_F128 */ func_iPTR_i64_i64_i64_i64_i64_i64, /* FMA_PPCF128 */ unsupported, /* POWI_F32 */ f32_func_f32_i32, /* POWI_F64 */ f64_func_f64_i32, /* POWI_F80 */ unsupported, /* POWI_F128 */ func_iPTR_i64_i64_i64_i64, /* POWI_PPCF128 */ unsupported, /* SQRT_F32 */ f32_func_f32, /* SQRT_F64 */ f64_func_f64, /* SQRT_F80 */ unsupported, /* SQRT_F128 */ func_iPTR_i64_i64, /* SQRT_PPCF128 */ unsupported, /* LOG_F32 */ f32_func_f32, /* LOG_F64 */ f64_func_f64, /* LOG_F80 */ unsupported, /* LOG_F128 */ func_iPTR_i64_i64, /* LOG_PPCF128 */ unsupported, /* LOG2_F32 */ f32_func_f32, /* LOG2_F64 */ f64_func_f64, /* LOG2_F80 */ unsupported, /* LOG2_F128 */ func_iPTR_i64_i64, /* LOG2_PPCF128 */ unsupported, /* LOG10_F32 */ f32_func_f32, /* LOG10_F64 */ f64_func_f64, /* LOG10_F80 */ unsupported, /* LOG10_F128 */ func_iPTR_i64_i64, /* LOG10_PPCF128 */ unsupported, /* EXP_F32 */ f32_func_f32, /* EXP_F64 */ f64_func_f64, /* EXP_F80 */ unsupported, /* EXP_F128 */ func_iPTR_i64_i64, /* EXP_PPCF128 */ unsupported, /* EXP2_F32 */ f32_func_f32, /* EXP2_F64 */ f64_func_f64, /* EXP2_F80 */ unsupported, /* EXP2_F128 */ func_iPTR_i64_i64, /* EXP2_PPCF128 */ unsupported, /* SIN_F32 */ f32_func_f32, /* SIN_F64 */ f64_func_f64, /* SIN_F80 */ unsupported, /* SIN_F128 */ func_iPTR_i64_i64, /* SIN_PPCF128 */ unsupported, /* COS_F32 */ f32_func_f32, /* COS_F64 */ f64_func_f64, /* COS_F80 */ unsupported, /* COS_F128 */ func_iPTR_i64_i64, /* COS_PPCF128 */ unsupported, /* SINCOS_F32 */ func_f32_iPTR_iPTR, /* SINCOS_F64 */ func_f64_iPTR_iPTR, /* SINCOS_F80 */ unsupported, /* SINCOS_F128 */ func_i64_i64_iPTR_iPTR, /* SINCOS_PPCF128 */ unsupported, /* SINCOS_STRET_F32 */ unsupported, /* SINCOS_STRET_F64 */ unsupported, /* POW_F32 */ f32_func_f32_f32, /* POW_F64 */ f64_func_f64_f64, /* POW_F80 */ unsupported, /* POW_F128 */ func_iPTR_i64_i64_i64_i64, /* POW_PPCF128 */ unsupported, /* CEIL_F32 */ f32_func_f32, /* CEIL_F64 */ f64_func_f64, /* CEIL_F80 */ unsupported, /* CEIL_F128 */ func_iPTR_i64_i64, /* CEIL_PPCF128 */ unsupported, /* TRUNC_F32 */ f32_func_f32, /* TRUNC_F64 */ f64_func_f64, /* TRUNC_F80 */ unsupported, /* TRUNC_F128 */ func_iPTR_i64_i64, /* TRUNC_PPCF128 */ unsupported, /* RINT_F32 */ f32_func_f32, /* RINT_F64 */ f64_func_f64, /* RINT_F80 */ unsupported, /* RINT_F128 */ func_iPTR_i64_i64, /* RINT_PPCF128 */ unsupported, /* NEARBYINT_F32 */ f32_func_f32, /* NEARBYINT_F64 */ f64_func_f64, /* NEARBYINT_F80 */ unsupported, /* NEARBYINT_F128 */ func_iPTR_i64_i64, /* NEARBYINT_PPCF128 */ unsupported, /* ROUND_F32 */ f32_func_f32, /* ROUND_F64 */ f64_func_f64, /* ROUND_F80 */ unsupported, /* ROUND_F128 */ func_iPTR_i64_i64, /* ROUND_PPCF128 */ unsupported, /* FLOOR_F32 */ f32_func_f32, /* FLOOR_F64 */ f64_func_f64, /* FLOOR_F80 */ unsupported, /* FLOOR_F128 */ func_iPTR_i64_i64, /* FLOOR_PPCF128 */ unsupported, /* COPYSIGN_F32 */ f32_func_f32_f32, /* COPYSIGN_F64 */ f64_func_f64_f64, /* COPYSIGN_F80 */ unsupported, /* COPYSIGN_F128 */ func_iPTR_i64_i64_i64_i64, /* COPYSIGN_PPCF128 */ unsupported, /* FMIN_F32 */ f32_func_f32_f32, /* FMIN_F64 */ f64_func_f64_f64, /* FMIN_F80 */ unsupported, /* FMIN_F128 */ func_iPTR_i64_i64_i64_i64, /* FMIN_PPCF128 */ unsupported, /* FMAX_F32 */ f32_func_f32_f32, /* FMAX_F64 */ f64_func_f64_f64, /* FMAX_F80 */ unsupported, /* FMAX_F128 */ func_iPTR_i64_i64_i64_i64, /* FMAX_PPCF128 */ unsupported, // CONVERSION /* FPEXT_F32_PPCF128 */ unsupported, /* FPEXT_F64_PPCF128 */ unsupported, /* FPEXT_F64_F128 */ func_iPTR_f64, /* FPEXT_F32_F128 */ func_iPTR_f32, /* FPEXT_F32_F64 */ f64_func_f32, /* FPEXT_F16_F32 */ f32_func_i16, /* FPROUND_F32_F16 */ i16_func_f32, /* FPROUND_F64_F16 */ unsupported, /* FPROUND_F80_F16 */ unsupported, /* FPROUND_F128_F16 */ unsupported, /* FPROUND_PPCF128_F16 */ unsupported, /* FPROUND_F64_F32 */ f32_func_f64, /* FPROUND_F80_F32 */ unsupported, /* FPROUND_F128_F32 */ f32_func_i64_i64, /* FPROUND_PPCF128_F32 */ unsupported, /* FPROUND_F80_F64 */ unsupported, /* FPROUND_F128_F64 */ f64_func_i64_i64, /* FPROUND_PPCF128_F64 */ unsupported, /* FPTOSINT_F32_I32 */ i32_func_f32, /* FPTOSINT_F32_I64 */ i64_func_f32, /* FPTOSINT_F32_I128 */ i64_i64_func_f32, /* FPTOSINT_F64_I32 */ i32_func_f64, /* FPTOSINT_F64_I64 */ i64_func_f64, /* FPTOSINT_F64_I128 */ i64_i64_func_f64, /* FPTOSINT_F80_I32 */ unsupported, /* FPTOSINT_F80_I64 */ unsupported, /* FPTOSINT_F80_I128 */ unsupported, /* FPTOSINT_F128_I32 */ i32_func_i64_i64, /* FPTOSINT_F128_I64 */ i64_func_i64_i64, /* FPTOSINT_F128_I128 */ i64_i64_func_i64_i64, /* FPTOSINT_PPCF128_I32 */ unsupported, /* FPTOSINT_PPCF128_I64 */ unsupported, /* FPTOSINT_PPCF128_I128 */ unsupported, /* FPTOUINT_F32_I32 */ i32_func_f32, /* FPTOUINT_F32_I64 */ i64_func_f32, /* FPTOUINT_F32_I128 */ i64_i64_func_f32, /* FPTOUINT_F64_I32 */ i32_func_f64, /* FPTOUINT_F64_I64 */ i64_func_f64, /* FPTOUINT_F64_I128 */ i64_i64_func_f64, /* FPTOUINT_F80_I32 */ unsupported, /* FPTOUINT_F80_I64 */ unsupported, /* FPTOUINT_F80_I128 */ unsupported, /* FPTOUINT_F128_I32 */ i32_func_i64_i64, /* FPTOUINT_F128_I64 */ i64_func_i64_i64, /* FPTOUINT_F128_I128 */ i64_i64_func_i64_i64, /* FPTOUINT_PPCF128_I32 */ unsupported, /* FPTOUINT_PPCF128_I64 */ unsupported, /* FPTOUINT_PPCF128_I128 */ unsupported, /* SINTTOFP_I32_F32 */ f32_func_i32, /* SINTTOFP_I32_F64 */ f64_func_i32, /* SINTTOFP_I32_F80 */ unsupported, /* SINTTOFP_I32_F128 */ func_iPTR_i32, /* SINTTOFP_I32_PPCF128 */ unsupported, /* SINTTOFP_I64_F32 */ f32_func_i64, /* SINTTOFP_I64_F64 */ f64_func_i64, /* SINTTOFP_I64_F80 */ unsupported, /* SINTTOFP_I64_F128 */ func_iPTR_i64, /* SINTTOFP_I64_PPCF128 */ unsupported, /* SINTTOFP_I128_F32 */ f32_func_i64_i64, /* SINTTOFP_I128_F64 */ f64_func_i64_i64, /* SINTTOFP_I128_F80 */ unsupported, /* SINTTOFP_I128_F128 */ func_iPTR_i64_i64, /* SINTTOFP_I128_PPCF128 */ unsupported, /* UINTTOFP_I32_F32 */ f32_func_i32, /* UINTTOFP_I32_F64 */ f64_func_i64, /* UINTTOFP_I32_F80 */ unsupported, /* UINTTOFP_I32_F128 */ func_iPTR_i32, /* UINTTOFP_I32_PPCF128 */ unsupported, /* UINTTOFP_I64_F32 */ f32_func_i64, /* UINTTOFP_I64_F64 */ f64_func_i64, /* UINTTOFP_I64_F80 */ unsupported, /* UINTTOFP_I64_F128 */ func_iPTR_i64, /* UINTTOFP_I64_PPCF128 */ unsupported, /* UINTTOFP_I128_F32 */ f32_func_i64_i64, /* UINTTOFP_I128_F64 */ f64_func_i64_i64, /* UINTTOFP_I128_F80 */ unsupported, /* UINTTOFP_I128_F128 */ func_iPTR_i64_i64, /* UINTTOFP_I128_PPCF128 */ unsupported, // COMPARISON /* OEQ_F32 */ i32_func_f32_f32, /* OEQ_F64 */ i32_func_f64_f64, /* OEQ_F128 */ i32_func_i64_i64_i64_i64, /* OEQ_PPCF128 */ unsupported, /* UNE_F32 */ i32_func_f32_f32, /* UNE_F64 */ i32_func_f64_f64, /* UNE_F128 */ i32_func_i64_i64_i64_i64, /* UNE_PPCF128 */ unsupported, /* OGE_F32 */ i32_func_f32_f32, /* OGE_F64 */ i32_func_f64_f64, /* OGE_F128 */ i32_func_i64_i64_i64_i64, /* OGE_PPCF128 */ unsupported, /* OLT_F32 */ i32_func_f32_f32, /* OLT_F64 */ i32_func_f64_f64, /* OLT_F128 */ i32_func_i64_i64_i64_i64, /* OLT_PPCF128 */ unsupported, /* OLE_F32 */ i32_func_f32_f32, /* OLE_F64 */ i32_func_f64_f64, /* OLE_F128 */ i32_func_i64_i64_i64_i64, /* OLE_PPCF128 */ unsupported, /* OGT_F32 */ i32_func_f32_f32, /* OGT_F64 */ i32_func_f64_f64, /* OGT_F128 */ i32_func_i64_i64_i64_i64, /* OGT_PPCF128 */ unsupported, /* UO_F32 */ i32_func_f32_f32, /* UO_F64 */ i32_func_f64_f64, /* UO_F128 */ i32_func_i64_i64_i64_i64, /* UO_PPCF128 */ unsupported, /* O_F32 */ i32_func_f32_f32, /* O_F64 */ i32_func_f64_f64, /* O_F128 */ i32_func_i64_i64_i64_i64, /* O_PPCF128 */ unsupported, // MEMORY /* MEMCPY */ iPTR_func_iPTR_iPTR_iPTR, /* MEMMOVE */ iPTR_func_iPTR_iPTR_iPTR, /* MEMSET */ iPTR_func_iPTR_i32_iPTR, /* BZERO */ unsupported, // ELEMENT-WISE ATOMIC MEMORY /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_1 */ unsupported, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_2 */ unsupported, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_4 */ unsupported, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_8 */ unsupported, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_16 */ unsupported, // EXCEPTION HANDLING /* UNWIND_RESUME */ unsupported, // Note: there's two sets of atomics libcalls; see // for more info on the // difference between them. // Atomic '__sync_*' libcalls. /* SYNC_VAL_COMPARE_AND_SWAP_1 */ unsupported, /* SYNC_VAL_COMPARE_AND_SWAP_2 */ unsupported, /* SYNC_VAL_COMPARE_AND_SWAP_4 */ unsupported, /* SYNC_VAL_COMPARE_AND_SWAP_8 */ unsupported, /* SYNC_VAL_COMPARE_AND_SWAP_16 */ unsupported, /* SYNC_LOCK_TEST_AND_SET_1 */ unsupported, /* SYNC_LOCK_TEST_AND_SET_2 */ unsupported, /* SYNC_LOCK_TEST_AND_SET_4 */ unsupported, /* SYNC_LOCK_TEST_AND_SET_8 */ unsupported, /* SYNC_LOCK_TEST_AND_SET_16 */ unsupported, /* SYNC_FETCH_AND_ADD_1 */ unsupported, /* SYNC_FETCH_AND_ADD_2 */ unsupported, /* SYNC_FETCH_AND_ADD_4 */ unsupported, /* SYNC_FETCH_AND_ADD_8 */ unsupported, /* SYNC_FETCH_AND_ADD_16 */ unsupported, /* SYNC_FETCH_AND_SUB_1 */ unsupported, /* SYNC_FETCH_AND_SUB_2 */ unsupported, /* SYNC_FETCH_AND_SUB_4 */ unsupported, /* SYNC_FETCH_AND_SUB_8 */ unsupported, /* SYNC_FETCH_AND_SUB_16 */ unsupported, /* SYNC_FETCH_AND_AND_1 */ unsupported, /* SYNC_FETCH_AND_AND_2 */ unsupported, /* SYNC_FETCH_AND_AND_4 */ unsupported, /* SYNC_FETCH_AND_AND_8 */ unsupported, /* SYNC_FETCH_AND_AND_16 */ unsupported, /* SYNC_FETCH_AND_OR_1 */ unsupported, /* SYNC_FETCH_AND_OR_2 */ unsupported, /* SYNC_FETCH_AND_OR_4 */ unsupported, /* SYNC_FETCH_AND_OR_8 */ unsupported, /* SYNC_FETCH_AND_OR_16 */ unsupported, /* SYNC_FETCH_AND_XOR_1 */ unsupported, /* SYNC_FETCH_AND_XOR_2 */ unsupported, /* SYNC_FETCH_AND_XOR_4 */ unsupported, /* SYNC_FETCH_AND_XOR_8 */ unsupported, /* SYNC_FETCH_AND_XOR_16 */ unsupported, /* SYNC_FETCH_AND_NAND_1 */ unsupported, /* SYNC_FETCH_AND_NAND_2 */ unsupported, /* SYNC_FETCH_AND_NAND_4 */ unsupported, /* SYNC_FETCH_AND_NAND_8 */ unsupported, /* SYNC_FETCH_AND_NAND_16 */ unsupported, /* SYNC_FETCH_AND_MAX_1 */ unsupported, /* SYNC_FETCH_AND_MAX_2 */ unsupported, /* SYNC_FETCH_AND_MAX_4 */ unsupported, /* SYNC_FETCH_AND_MAX_8 */ unsupported, /* SYNC_FETCH_AND_MAX_16 */ unsupported, /* SYNC_FETCH_AND_UMAX_1 */ unsupported, /* SYNC_FETCH_AND_UMAX_2 */ unsupported, /* SYNC_FETCH_AND_UMAX_4 */ unsupported, /* SYNC_FETCH_AND_UMAX_8 */ unsupported, /* SYNC_FETCH_AND_UMAX_16 */ unsupported, /* SYNC_FETCH_AND_MIN_1 */ unsupported, /* SYNC_FETCH_AND_MIN_2 */ unsupported, /* SYNC_FETCH_AND_MIN_4 */ unsupported, /* SYNC_FETCH_AND_MIN_8 */ unsupported, /* SYNC_FETCH_AND_MIN_16 */ unsupported, /* SYNC_FETCH_AND_UMIN_1 */ unsupported, /* SYNC_FETCH_AND_UMIN_2 */ unsupported, /* SYNC_FETCH_AND_UMIN_4 */ unsupported, /* SYNC_FETCH_AND_UMIN_8 */ unsupported, /* SYNC_FETCH_AND_UMIN_16 */ unsupported, // Atomic '__atomic_*' libcalls. /* ATOMIC_LOAD */ unsupported, /* ATOMIC_LOAD_1 */ unsupported, /* ATOMIC_LOAD_2 */ unsupported, /* ATOMIC_LOAD_4 */ unsupported, /* ATOMIC_LOAD_8 */ unsupported, /* ATOMIC_LOAD_16 */ unsupported, /* ATOMIC_STORE */ unsupported, /* ATOMIC_STORE_1 */ unsupported, /* ATOMIC_STORE_2 */ unsupported, /* ATOMIC_STORE_4 */ unsupported, /* ATOMIC_STORE_8 */ unsupported, /* ATOMIC_STORE_16 */ unsupported, /* ATOMIC_EXCHANGE */ unsupported, /* ATOMIC_EXCHANGE_1 */ unsupported, /* ATOMIC_EXCHANGE_2 */ unsupported, /* ATOMIC_EXCHANGE_4 */ unsupported, /* ATOMIC_EXCHANGE_8 */ unsupported, /* ATOMIC_EXCHANGE_16 */ unsupported, /* ATOMIC_COMPARE_EXCHANGE */ unsupported, /* ATOMIC_COMPARE_EXCHANGE_1 */ unsupported, /* ATOMIC_COMPARE_EXCHANGE_2 */ unsupported, /* ATOMIC_COMPARE_EXCHANGE_4 */ unsupported, /* ATOMIC_COMPARE_EXCHANGE_8 */ unsupported, /* ATOMIC_COMPARE_EXCHANGE_16 */ unsupported, /* ATOMIC_FETCH_ADD_1 */ unsupported, /* ATOMIC_FETCH_ADD_2 */ unsupported, /* ATOMIC_FETCH_ADD_4 */ unsupported, /* ATOMIC_FETCH_ADD_8 */ unsupported, /* ATOMIC_FETCH_ADD_16 */ unsupported, /* ATOMIC_FETCH_SUB_1 */ unsupported, /* ATOMIC_FETCH_SUB_2 */ unsupported, /* ATOMIC_FETCH_SUB_4 */ unsupported, /* ATOMIC_FETCH_SUB_8 */ unsupported, /* ATOMIC_FETCH_SUB_16 */ unsupported, /* ATOMIC_FETCH_AND_1 */ unsupported, /* ATOMIC_FETCH_AND_2 */ unsupported, /* ATOMIC_FETCH_AND_4 */ unsupported, /* ATOMIC_FETCH_AND_8 */ unsupported, /* ATOMIC_FETCH_AND_16 */ unsupported, /* ATOMIC_FETCH_OR_1 */ unsupported, /* ATOMIC_FETCH_OR_2 */ unsupported, /* ATOMIC_FETCH_OR_4 */ unsupported, /* ATOMIC_FETCH_OR_8 */ unsupported, /* ATOMIC_FETCH_OR_16 */ unsupported, /* ATOMIC_FETCH_XOR_1 */ unsupported, /* ATOMIC_FETCH_XOR_2 */ unsupported, /* ATOMIC_FETCH_XOR_4 */ unsupported, /* ATOMIC_FETCH_XOR_8 */ unsupported, /* ATOMIC_FETCH_XOR_16 */ unsupported, /* ATOMIC_FETCH_NAND_1 */ unsupported, /* ATOMIC_FETCH_NAND_2 */ unsupported, /* ATOMIC_FETCH_NAND_4 */ unsupported, /* ATOMIC_FETCH_NAND_8 */ unsupported, /* ATOMIC_FETCH_NAND_16 */ unsupported, // Stack Protector Fail. /* STACKPROTECTOR_CHECK_FAIL */ func, // Deoptimization. /* DEOPTIMIZE */ unsupported, }; static const char * RuntimeLibcallNames[RTLIB::UNKNOWN_LIBCALL] = { /* SHL_I16 */ "__ashlhi3", /* SHL_I32 */ "__ashlsi3", /* SHL_I64 */ "__ashldi3", /* SHL_I128 */ "__ashlti3", /* SRL_I16 */ "__lshrhi3", /* SRL_I32 */ "__lshrsi3", /* SRL_I64 */ "__lshrdi3", /* SRL_I128 */ "__lshrti3", /* SRA_I16 */ "__ashrhi3", /* SRA_I32 */ "__ashrsi3", /* SRA_I64 */ "__ashrdi3", /* SRA_I128 */ "__ashrti3", /* MUL_I8 */ "__mulqi3", /* MUL_I16 */ "__mulhi3", /* MUL_I32 */ "__mulsi3", /* MUL_I64 */ "__muldi3", /* MUL_I128 */ "__multi3", /* MULO_I32 */ "__mulosi4", /* MULO_I64 */ "__mulodi4", /* MULO_I128 */ "__muloti4", /* SDIV_I8 */ "__divqi3", /* SDIV_I16 */ "__divhi3", /* SDIV_I32 */ "__divsi3", /* SDIV_I64 */ "__divdi3", /* SDIV_I128 */ "__divti3", /* UDIV_I8 */ "__udivqi3", /* UDIV_I16 */ "__udivhi3", /* UDIV_I32 */ "__udivsi3", /* UDIV_I64 */ "__udivdi3", /* UDIV_I128 */ "__udivti3", /* SREM_I8 */ "__modqi3", /* SREM_I16 */ "__modhi3", /* SREM_I32 */ "__modsi3", /* SREM_I64 */ "__moddi3", /* SREM_I128 */ "__modti3", /* UREM_I8 */ "__umodqi3", /* UREM_I16 */ "__umodhi3", /* UREM_I32 */ "__umodsi3", /* UREM_I64 */ "__umoddi3", /* UREM_I128 */ "__umodti3", /* SDIVREM_I8 */ nullptr, /* SDIVREM_I16 */ nullptr, /* SDIVREM_I32 */ nullptr, /* SDIVREM_I64 */ nullptr, /* SDIVREM_I128 */ nullptr, /* UDIVREM_I8 */ nullptr, /* UDIVREM_I16 */ nullptr, /* UDIVREM_I32 */ nullptr, /* UDIVREM_I64 */ nullptr, /* UDIVREM_I128 */ nullptr, /* NEG_I32 */ "__negsi2", /* NEG_I64 */ "__negdi2", /* ADD_F32 */ "__addsf3", /* ADD_F64 */ "__adddf3", /* ADD_F80 */ nullptr, /* ADD_F128 */ "__addtf3", /* ADD_PPCF128 */ nullptr, /* SUB_F32 */ "__subsf3", /* SUB_F64 */ "__subdf3", /* SUB_F80 */ nullptr, /* SUB_F128 */ "__subtf3", /* SUB_PPCF128 */ nullptr, /* MUL_F32 */ "__mulsf3", /* MUL_F64 */ "__muldf3", /* MUL_F80 */ nullptr, /* MUL_F128 */ "__multf3", /* MUL_PPCF128 */ nullptr, /* DIV_F32 */ "__divsf3", /* DIV_F64 */ "__divdf3", /* DIV_F80 */ nullptr, /* DIV_F128 */ "__divtf3", /* DIV_PPCF128 */ nullptr, /* REM_F32 */ "fmodf", /* REM_F64 */ "fmod", /* REM_F80 */ nullptr, /* REM_F128 */ "fmodl", /* REM_PPCF128 */ nullptr, /* FMA_F32 */ "fmaf", /* FMA_F64 */ "fma", /* FMA_F80 */ nullptr, /* FMA_F128 */ "fmal", /* FMA_PPCF128 */ nullptr, /* POWI_F32 */ "__powisf2", /* POWI_F64 */ "__powidf2", /* POWI_F80 */ nullptr, /* POWI_F128 */ "__powitf2", /* POWI_PPCF128 */ nullptr, /* SQRT_F32 */ "sqrtf", /* SQRT_F64 */ "sqrt", /* SQRT_F80 */ nullptr, /* SQRT_F128 */ "sqrtl", /* SQRT_PPCF128 */ nullptr, /* LOG_F32 */ "logf", /* LOG_F64 */ "log", /* LOG_F80 */ nullptr, /* LOG_F128 */ "logl", /* LOG_PPCF128 */ nullptr, /* LOG2_F32 */ "log2f", /* LOG2_F64 */ "log2", /* LOG2_F80 */ nullptr, /* LOG2_F128 */ "log2l", /* LOG2_PPCF128 */ nullptr, /* LOG10_F32 */ "log10f", /* LOG10_F64 */ "log10", /* LOG10_F80 */ nullptr, /* LOG10_F128 */ "log10l", /* LOG10_PPCF128 */ nullptr, /* EXP_F32 */ "expf", /* EXP_F64 */ "exp", /* EXP_F80 */ nullptr, /* EXP_F128 */ "expl", /* EXP_PPCF128 */ nullptr, /* EXP2_F32 */ "exp2f", /* EXP2_F64 */ "exp2", /* EXP2_F80 */ nullptr, /* EXP2_F128 */ "exp2l", /* EXP2_PPCF128 */ nullptr, /* SIN_F32 */ "sinf", /* SIN_F64 */ "sin", /* SIN_F80 */ nullptr, /* SIN_F128 */ "sinl", /* SIN_PPCF128 */ nullptr, /* COS_F32 */ "cosf", /* COS_F64 */ "cos", /* COS_F80 */ nullptr, /* COS_F128 */ "cosl", /* COS_PPCF128 */ nullptr, /* SINCOS_F32 */ "sincosf", /* SINCOS_F64 */ "sincos", /* SINCOS_F80 */ nullptr, /* SINCOS_F128 */ "sincosl", /* SINCOS_PPCF128 */ nullptr, /* SINCOS_STRET_F32 */ nullptr, /* SINCOS_STRET_F64 */ nullptr, /* POW_F32 */ "powf", /* POW_F64 */ "pow", /* POW_F80 */ nullptr, /* POW_F128 */ "powl", /* POW_PPCF128 */ nullptr, /* CEIL_F32 */ "ceilf", /* CEIL_F64 */ "ceil", /* CEIL_F80 */ nullptr, /* CEIL_F128 */ "ceill", /* CEIL_PPCF128 */ nullptr, /* TRUNC_F32 */ "truncf", /* TRUNC_F64 */ "trunc", /* TRUNC_F80 */ nullptr, /* TRUNC_F128 */ "truncl", /* TRUNC_PPCF128 */ nullptr, /* RINT_F32 */ "rintf", /* RINT_F64 */ "rint", /* RINT_F80 */ nullptr, /* RINT_F128 */ "rintl", /* RINT_PPCF128 */ nullptr, /* NEARBYINT_F32 */ "nearbyintf", /* NEARBYINT_F64 */ "nearbyint", /* NEARBYINT_F80 */ nullptr, /* NEARBYINT_F128 */ "nearbyintl", /* NEARBYINT_PPCF128 */ nullptr, /* ROUND_F32 */ "roundf", /* ROUND_F64 */ "round", /* ROUND_F80 */ nullptr, /* ROUND_F128 */ "roundl", /* ROUND_PPCF128 */ nullptr, /* FLOOR_F32 */ "floorf", /* FLOOR_F64 */ "floor", /* FLOOR_F80 */ nullptr, /* FLOOR_F128 */ "floorl", /* FLOOR_PPCF128 */ nullptr, /* COPYSIGN_F32 */ "copysignf", /* COPYSIGN_F64 */ "copysign", /* COPYSIGN_F80 */ nullptr, /* COPYSIGN_F128 */ "copysignl", /* COPYSIGN_PPCF128 */ nullptr, /* FMIN_F32 */ "fminf", /* FMIN_F64 */ "fmin", /* FMIN_F80 */ nullptr, /* FMIN_F128 */ "fminl", /* FMIN_PPCF128 */ nullptr, /* FMAX_F32 */ "fmaxf", /* FMAX_F64 */ "fmax", /* FMAX_F80 */ nullptr, /* FMAX_F128 */ "fmaxl", /* FMAX_PPCF128 */ nullptr, /* FPEXT_F32_PPCF128 */ nullptr, /* FPEXT_F64_PPCF128 */ nullptr, /* FPEXT_F64_F128 */ "__extenddftf2", /* FPEXT_F32_F128 */ "__extendsftf2", /* FPEXT_F32_F64 */ "__extendsfdf2", /* FPEXT_F16_F32 */ "__gnu_h2f_ieee", /* FPROUND_F32_F16 */ "__gnu_f2h_ieee", /* FPROUND_F64_F16 */ nullptr, /* FPROUND_F80_F16 */ nullptr, /* FPROUND_F128_F16 */ nullptr, /* FPROUND_PPCF128_F16 */ nullptr, /* FPROUND_F64_F32 */ "__truncdfsf2", /* FPROUND_F80_F32 */ "__truncxfsf2", /* FPROUND_F128_F32 */ "__trunctfsf2", /* FPROUND_PPCF128_F32 */ nullptr, /* FPROUND_F80_F64 */ "__truncxfdf2", /* FPROUND_F128_F64 */ "__trunctfdf2", /* FPROUND_PPCF128_F64 */ nullptr, /* FPTOSINT_F32_I32 */ "__fixsfsi", /* FPTOSINT_F32_I64 */ "__fixsfdi", /* FPTOSINT_F32_I128 */ "__fixsfti", /* FPTOSINT_F64_I32 */ "__fixdfsi", /* FPTOSINT_F64_I64 */ "__fixdfdi", /* FPTOSINT_F64_I128 */ "__fixdfti", /* FPTOSINT_F80_I32 */ "__fixxfsi", /* FPTOSINT_F80_I64 */ "__fixxfdi", /* FPTOSINT_F80_I128 */ "__fixxfti", /* FPTOSINT_F128_I32 */ "__fixtfsi", /* FPTOSINT_F128_I64 */ "__fixtfdi", /* FPTOSINT_F128_I128 */ "__fixtfti", /* FPTOSINT_PPCF128_I32 */ nullptr, /* FPTOSINT_PPCF128_I64 */ nullptr, /* FPTOSINT_PPCF128_I128 */ nullptr, /* FPTOUINT_F32_I32 */ "__fixunssfsi", /* FPTOUINT_F32_I64 */ "__fixunssfdi", /* FPTOUINT_F32_I128 */ "__fixunssfti", /* FPTOUINT_F64_I32 */ "__fixunsdfsi", /* FPTOUINT_F64_I64 */ "__fixunsdfdi", /* FPTOUINT_F64_I128 */ "__fixunsdfti", /* FPTOUINT_F80_I32 */ "__fixunsxfsi", /* FPTOUINT_F80_I64 */ "__fixunsxfdi", /* FPTOUINT_F80_I128 */ "__fixunsxfti", /* FPTOUINT_F128_I32 */ "__fixunstfsi", /* FPTOUINT_F128_I64 */ "__fixunstfdi", /* FPTOUINT_F128_I128 */ "__fixunstfti", /* FPTOUINT_PPCF128_I32 */ nullptr, /* FPTOUINT_PPCF128_I64 */ nullptr, /* FPTOUINT_PPCF128_I128 */ nullptr, /* SINTTOFP_I32_F32 */ "__floatsisf", /* SINTTOFP_I32_F64 */ "__floatsidf", /* SINTTOFP_I32_F80 */ nullptr, /* SINTTOFP_I32_F128 */ "__floatsitf", /* SINTTOFP_I32_PPCF128 */ nullptr, /* SINTTOFP_I64_F32 */ "__floatdisf", /* SINTTOFP_I64_F64 */ "__floatdidf", /* SINTTOFP_I64_F80 */ nullptr, /* SINTTOFP_I64_F128 */ "__floatditf", /* SINTTOFP_I64_PPCF128 */ nullptr, /* SINTTOFP_I128_F32 */ "__floattisf", /* SINTTOFP_I128_F64 */ "__floattidf", /* SINTTOFP_I128_F80 */ nullptr, /* SINTTOFP_I128_F128 */ "__floattitf", /* SINTTOFP_I128_PPCF128 */ nullptr, /* UINTTOFP_I32_F32 */ "__floatunsisf", /* UINTTOFP_I32_F64 */ "__floatunsidf", /* UINTTOFP_I32_F80 */ nullptr, /* UINTTOFP_I32_F128 */ "__floatunsitf", /* UINTTOFP_I32_PPCF128 */ nullptr, /* UINTTOFP_I64_F32 */ "__floatundisf", /* UINTTOFP_I64_F64 */ "__floatundidf", /* UINTTOFP_I64_F80 */ nullptr, /* UINTTOFP_I64_F128 */ "__floatunditf", /* UINTTOFP_I64_PPCF128 */ nullptr, /* UINTTOFP_I128_F32 */ "__floatuntisf", /* UINTTOFP_I128_F64 */ "__floatuntidf", /* UINTTOFP_I128_F80 */ nullptr, /* UINTTOFP_I128_F128 */ "__floatuntitf", /* UINTTOFP_I128_PPCF128 */ nullptr, /* OEQ_F32 */ "__eqsf2", /* OEQ_F64 */ "__eqdf2", /* OEQ_F128 */ "__eqtf2", /* OEQ_PPCF128 */ nullptr, /* UNE_F32 */ "__nesf2", /* UNE_F64 */ "__nedf2", /* UNE_F128 */ "__netf2", /* UNE_PPCF128 */ nullptr, /* OGE_F32 */ "__gesf2", /* OGE_F64 */ "__gedf2", /* OGE_F128 */ "__getf2", /* OGE_PPCF128 */ nullptr, /* OLT_F32 */ "__ltsf2", /* OLT_F64 */ "__ltdf2", /* OLT_F128 */ "__lttf2", /* OLT_PPCF128 */ nullptr, /* OLE_F32 */ "__lesf2", /* OLE_F64 */ "__ledf2", /* OLE_F128 */ "__letf2", /* OLE_PPCF128 */ nullptr, /* OGT_F32 */ "__gtsf2", /* OGT_F64 */ "__gtdf2", /* OGT_F128 */ "__gttf2", /* OGT_PPCF128 */ nullptr, /* UO_F32 */ "__unordsf2", /* UO_F64 */ "__unorddf2", /* UO_F128 */ "__unordtf2", /* UO_PPCF128 */ nullptr, /* O_F32 */ "__unordsf2", /* O_F64 */ "__unorddf2", /* O_F128 */ "__unordtf2", /* O_PPCF128 */ nullptr, /* MEMCPY */ "memcpy", /* MEMMOVE */ "memset", /* MEMSET */ "memmove", /* BZERO */ nullptr, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr, /* MEMCPY_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr, /* MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_1 */ nullptr, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_2 */ nullptr, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_4 */ nullptr, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_8 */ nullptr, /* MEMSET_ELEMENT_UNORDERED_ATOMIC_16 */ nullptr, /* UNWIND_RESUME */ "_Unwind_Resume", /* SYNC_VAL_COMPARE_AND_SWAP_1 */ "__sync_val_compare_and_swap_1", /* SYNC_VAL_COMPARE_AND_SWAP_2 */ "__sync_val_compare_and_swap_2", /* SYNC_VAL_COMPARE_AND_SWAP_4 */ "__sync_val_compare_and_swap_4", /* SYNC_VAL_COMPARE_AND_SWAP_8 */ "__sync_val_compare_and_swap_8", /* SYNC_VAL_COMPARE_AND_SWAP_16 */ "__sync_val_compare_and_swap_16", /* SYNC_LOCK_TEST_AND_SET_1 */ "__sync_lock_test_and_set_1", /* SYNC_LOCK_TEST_AND_SET_2 */ "__sync_lock_test_and_set_2", /* SYNC_LOCK_TEST_AND_SET_4 */ "__sync_lock_test_and_set_4", /* SYNC_LOCK_TEST_AND_SET_8 */ "__sync_lock_test_and_set_8", /* SYNC_LOCK_TEST_AND_SET_16 */ "__sync_lock_test_and_set_16", /* SYNC_FETCH_AND_ADD_1 */ "__sync_fetch_and_add_1", /* SYNC_FETCH_AND_ADD_2 */ "__sync_fetch_and_add_2", /* SYNC_FETCH_AND_ADD_4 */ "__sync_fetch_and_add_4", /* SYNC_FETCH_AND_ADD_8 */ "__sync_fetch_and_add_8", /* SYNC_FETCH_AND_ADD_16 */ "__sync_fetch_and_add_16", /* SYNC_FETCH_AND_SUB_1 */ "__sync_fetch_and_sub_1", /* SYNC_FETCH_AND_SUB_2 */ "__sync_fetch_and_sub_2", /* SYNC_FETCH_AND_SUB_4 */ "__sync_fetch_and_sub_4", /* SYNC_FETCH_AND_SUB_8 */ "__sync_fetch_and_sub_8", /* SYNC_FETCH_AND_SUB_16 */ "__sync_fetch_and_sub_16", /* SYNC_FETCH_AND_AND_1 */ "__sync_fetch_and_and_1", /* SYNC_FETCH_AND_AND_2 */ "__sync_fetch_and_and_2", /* SYNC_FETCH_AND_AND_4 */ "__sync_fetch_and_and_4", /* SYNC_FETCH_AND_AND_8 */ "__sync_fetch_and_and_8", /* SYNC_FETCH_AND_AND_16 */ "__sync_fetch_and_and_16", /* SYNC_FETCH_AND_OR_1 */ "__sync_fetch_and_or_1", /* SYNC_FETCH_AND_OR_2 */ "__sync_fetch_and_or_2", /* SYNC_FETCH_AND_OR_4 */ "__sync_fetch_and_or_4", /* SYNC_FETCH_AND_OR_8 */ "__sync_fetch_and_or_8", /* SYNC_FETCH_AND_OR_16 */ "__sync_fetch_and_or_16", /* SYNC_FETCH_AND_XOR_1 */ "__sync_fetch_and_xor_1", /* SYNC_FETCH_AND_XOR_2 */ "__sync_fetch_and_xor_2", /* SYNC_FETCH_AND_XOR_4 */ "__sync_fetch_and_xor_4", /* SYNC_FETCH_AND_XOR_8 */ "__sync_fetch_and_xor_8", /* SYNC_FETCH_AND_XOR_16 */ "__sync_fetch_and_xor_16", /* SYNC_FETCH_AND_NAND_1 */ "__sync_fetch_and_nand_1", /* SYNC_FETCH_AND_NAND_2 */ "__sync_fetch_and_nand_2", /* SYNC_FETCH_AND_NAND_4 */ "__sync_fetch_and_nand_4", /* SYNC_FETCH_AND_NAND_8 */ "__sync_fetch_and_nand_8", /* SYNC_FETCH_AND_NAND_16 */ "__sync_fetch_and_nand_16", /* SYNC_FETCH_AND_MAX_1 */ "__sync_fetch_and_max_1", /* SYNC_FETCH_AND_MAX_2 */ "__sync_fetch_and_max_2", /* SYNC_FETCH_AND_MAX_4 */ "__sync_fetch_and_max_4", /* SYNC_FETCH_AND_MAX_8 */ "__sync_fetch_and_max_8", /* SYNC_FETCH_AND_MAX_16 */ "__sync_fetch_and_max_16", /* SYNC_FETCH_AND_UMAX_1 */ "__sync_fetch_and_umax_1", /* SYNC_FETCH_AND_UMAX_2 */ "__sync_fetch_and_umax_2", /* SYNC_FETCH_AND_UMAX_4 */ "__sync_fetch_and_umax_4", /* SYNC_FETCH_AND_UMAX_8 */ "__sync_fetch_and_umax_8", /* SYNC_FETCH_AND_UMAX_16 */ "__sync_fetch_and_umax_16", /* SYNC_FETCH_AND_MIN_1 */ "__sync_fetch_and_min_1", /* SYNC_FETCH_AND_MIN_2 */ "__sync_fetch_and_min_2", /* SYNC_FETCH_AND_MIN_4 */ "__sync_fetch_and_min_4", /* SYNC_FETCH_AND_MIN_8 */ "__sync_fetch_and_min_8", /* SYNC_FETCH_AND_MIN_16 */ "__sync_fetch_and_min_16", /* SYNC_FETCH_AND_UMIN_1 */ "__sync_fetch_and_umin_1", /* SYNC_FETCH_AND_UMIN_2 */ "__sync_fetch_and_umin_2", /* SYNC_FETCH_AND_UMIN_4 */ "__sync_fetch_and_umin_4", /* SYNC_FETCH_AND_UMIN_8 */ "__sync_fetch_and_umin_8", /* SYNC_FETCH_AND_UMIN_16 */ "__sync_fetch_and_umin_16", /* ATOMIC_LOAD */ "__atomic_load", /* ATOMIC_LOAD_1 */ "__atomic_load_1", /* ATOMIC_LOAD_2 */ "__atomic_load_2", /* ATOMIC_LOAD_4 */ "__atomic_load_4", /* ATOMIC_LOAD_8 */ "__atomic_load_8", /* ATOMIC_LOAD_16 */ "__atomic_load_16", /* ATOMIC_STORE */ "__atomic_store", /* ATOMIC_STORE_1 */ "__atomic_store_1", /* ATOMIC_STORE_2 */ "__atomic_store_2", /* ATOMIC_STORE_4 */ "__atomic_store_4", /* ATOMIC_STORE_8 */ "__atomic_store_8", /* ATOMIC_STORE_16 */ "__atomic_store_16", /* ATOMIC_EXCHANGE */ "__atomic_exchange", /* ATOMIC_EXCHANGE_1 */ "__atomic_exchange_1", /* ATOMIC_EXCHANGE_2 */ "__atomic_exchange_2", /* ATOMIC_EXCHANGE_4 */ "__atomic_exchange_4", /* ATOMIC_EXCHANGE_8 */ "__atomic_exchange_8", /* ATOMIC_EXCHANGE_16 */ "__atomic_exchange_16", /* ATOMIC_COMPARE_EXCHANGE */ "__atomic_compare_exchange", /* ATOMIC_COMPARE_EXCHANGE_1 */ "__atomic_compare_exchange_1", /* ATOMIC_COMPARE_EXCHANGE_2 */ "__atomic_compare_exchange_2", /* ATOMIC_COMPARE_EXCHANGE_4 */ "__atomic_compare_exchange_4", /* ATOMIC_COMPARE_EXCHANGE_8 */ "__atomic_compare_exchange_8", /* ATOMIC_COMPARE_EXCHANGE_16 */ "__atomic_compare_exchange_16", /* ATOMIC_FETCH_ADD_1 */ "__atomic_fetch_add_1", /* ATOMIC_FETCH_ADD_2 */ "__atomic_fetch_add_2", /* ATOMIC_FETCH_ADD_4 */ "__atomic_fetch_add_4", /* ATOMIC_FETCH_ADD_8 */ "__atomic_fetch_add_8", /* ATOMIC_FETCH_ADD_16 */ "__atomic_fetch_add_16", /* ATOMIC_FETCH_SUB_1 */ "__atomic_fetch_sub_1", /* ATOMIC_FETCH_SUB_2 */ "__atomic_fetch_sub_2", /* ATOMIC_FETCH_SUB_4 */ "__atomic_fetch_sub_4", /* ATOMIC_FETCH_SUB_8 */ "__atomic_fetch_sub_8", /* ATOMIC_FETCH_SUB_16 */ "__atomic_fetch_sub_16", /* ATOMIC_FETCH_AND_1 */ "__atomic_fetch_and_1", /* ATOMIC_FETCH_AND_2 */ "__atomic_fetch_and_2", /* ATOMIC_FETCH_AND_4 */ "__atomic_fetch_and_4", /* ATOMIC_FETCH_AND_8 */ "__atomic_fetch_and_8", /* ATOMIC_FETCH_AND_16 */ "__atomic_fetch_and_16", /* ATOMIC_FETCH_OR_1 */ "__atomic_fetch_or_1", /* ATOMIC_FETCH_OR_2 */ "__atomic_fetch_or_2", /* ATOMIC_FETCH_OR_4 */ "__atomic_fetch_or_4", /* ATOMIC_FETCH_OR_8 */ "__atomic_fetch_or_8", /* ATOMIC_FETCH_OR_16 */ "__atomic_fetch_or_16", /* ATOMIC_FETCH_XOR_1 */ "__atomic_fetch_xor_1", /* ATOMIC_FETCH_XOR_2 */ "__atomic_fetch_xor_2", /* ATOMIC_FETCH_XOR_4 */ "__atomic_fetch_xor_4", /* ATOMIC_FETCH_XOR_8 */ "__atomic_fetch_xor_8", /* ATOMIC_FETCH_XOR_16 */ "__atomic_fetch_xor_16", /* ATOMIC_FETCH_NAND_1 */ "__atomic_fetch_nand_1", /* ATOMIC_FETCH_NAND_2 */ "__atomic_fetch_nand_2", /* ATOMIC_FETCH_NAND_4 */ "__atomic_fetch_nand_4", /* ATOMIC_FETCH_NAND_8 */ "__atomic_fetch_nand_8", /* ATOMIC_FETCH_NAND_16 */ "__atomic_fetch_nand_16", /* STACKPROTECTOR_CHECK_FAIL */ "__stack_chk_fail", /* DEOPTIMIZE */ "__llvm_deoptimize", }; void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, RTLIB::Libcall LC, SmallVectorImpl &Rets, SmallVectorImpl &Params) { assert(Rets.empty()); assert(Params.empty()); WebAssembly::ExprType iPTR = Subtarget.hasAddr64() ? WebAssembly::ExprType::I64 : WebAssembly::ExprType::I32; switch (RuntimeLibcallSignatures[LC]) { case func: break; case f32_func_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f32_func_f64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F64); break; case f32_func_i32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f32_func_i64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I64); break; case f32_func_i16: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f64_func_f32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F32); break; case f64_func_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case f64_func_i32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I32); break; case f64_func_i64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I64); break; case i32_func_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); break; case i32_func_f64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F64); break; case i32_func_i32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_func_f32: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::F32); break; case i64_func_f64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::F64); break; case i64_func_i64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case f32_func_f32_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f32_func_f32_i32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I32); break; case f32_func_i64_i64: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case f64_func_f64_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case f64_func_f64_i32: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I32); break; case f64_func_i64_i64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i16_func_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); break; case i8_func_i8_i8: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case func_f32_iPTR_iPTR: Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case func_f64_iPTR_iPTR: Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case i16_func_i16_i16: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i32_func_f32_f32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case i32_func_f64_f64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case i32_func_i32_i32: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_func_i64_i64: Rets.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_f32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::F32); break; case i64_i64_func_f64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::F64); break; case i16_i16_func_i16_i16: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I32); Rets.push_back(wasm::ValType::I32); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i32_i32_func_i32_i32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I32); Rets.push_back(wasm::ValType::I32); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I32); break; case i64_i64_func_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_i64_i64_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_i64_i64_func_i64_i64_i64_i64: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i64_i64_func_i64_i64_i32: #if 0 // TODO: Enable this when wasm gets multiple-return-value support. Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); Rets.push_back(wasm::ValType::I64); #else Params.push_back(wasm::ValType(iPTR)); #endif Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I32); break; case iPTR_func_iPTR_i32_iPTR: Rets.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType(iPTR)); break; case iPTR_func_iPTR_iPTR_iPTR: Rets.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case f32_func_f32_f32_f32: Rets.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); Params.push_back(wasm::ValType::F32); break; case f64_func_f64_f64_f64: Rets.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); Params.push_back(wasm::ValType::F64); break; case func_i64_i64_iPTR_iPTR: Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType(iPTR)); break; case func_iPTR_f32: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::F32); break; case func_iPTR_f64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::F64); break; case func_iPTR_i32: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I32); break; case func_iPTR_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case func_iPTR_i64_i64_i64_i64_i64_i64: Params.push_back(wasm::ValType(iPTR)); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i32_func_i64_i64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case i32_func_i64_i64_i64_i64: Rets.push_back(wasm::ValType::I32); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); Params.push_back(wasm::ValType::I64); break; case unsupported: llvm_unreachable("unsupported runtime library signature"); } } void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, const char *Name, SmallVectorImpl &Rets, SmallVectorImpl &Params) { assert(strcmp(RuntimeLibcallNames[RTLIB::DEOPTIMIZE], "__llvm_deoptimize") == 0); for (size_t i = 0, e = RTLIB::UNKNOWN_LIBCALL; i < e; ++i) if (RuntimeLibcallNames[i] && strcmp(RuntimeLibcallNames[i], Name) == 0) return GetSignature(Subtarget, RTLIB::Libcall(i), Rets, Params); llvm_unreachable("unexpected runtime library name"); }