Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyRuntimeLibcallSignatures.cpp @@ -22,6 +22,7 @@ #include "WebAssemblyRuntimeLibcallSignatures.h" #include "WebAssemblySubtarget.h" #include "llvm/CodeGen/RuntimeLibcalls.h" +#include "llvm/Support/ManagedStatic.h" using namespace llvm; @@ -84,982 +85,399 @@ 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, -/* LOG_FINITE_F32 */ unsupported, -/* LOG_FINITE_F64 */ unsupported, -/* LOG_FINITE_F80 */ unsupported, -/* LOG_FINITE_F128 */ unsupported, -/* LOG_FINITE_PPCF128 */ unsupported, -/* LOG2_F32 */ f32_func_f32, -/* LOG2_F64 */ f64_func_f64, -/* LOG2_F80 */ unsupported, -/* LOG2_F128 */ func_iPTR_i64_i64, -/* LOG2_PPCF128 */ unsupported, -/* LOG2_FINITE_F32 */ unsupported, -/* LOG2_FINITE_F64 */ unsupported, -/* LOG2_FINITE_F80 */ unsupported, -/* LOG2_FINITE_F128 */ unsupported, -/* LOG2_FINITE_PPCF128 */ unsupported, -/* LOG10_F32 */ f32_func_f32, -/* LOG10_F64 */ f64_func_f64, -/* LOG10_F80 */ unsupported, -/* LOG10_F128 */ func_iPTR_i64_i64, -/* LOG10_PPCF128 */ unsupported, -/* LOG10_FINITE_F32 */ unsupported, -/* LOG10_FINITE_F64 */ unsupported, -/* LOG10_FINITE_F80 */ unsupported, -/* LOG10_FINITE_F128 */ unsupported, -/* LOG10_FINITE_PPCF128 */ unsupported, -/* EXP_F32 */ f32_func_f32, -/* EXP_F64 */ f64_func_f64, -/* EXP_F80 */ unsupported, -/* EXP_F128 */ func_iPTR_i64_i64, -/* EXP_PPCF128 */ unsupported, -/* EXP_FINITE_F32 */ unsupported, -/* EXP_FINITE_F64 */ unsupported, -/* EXP_FINITE_F80 */ unsupported, -/* EXP_FINITE_F128 */ unsupported, -/* EXP_FINITE_PPCF128 */ unsupported, -/* EXP2_F32 */ f32_func_f32, -/* EXP2_F64 */ f64_func_f64, -/* EXP2_F80 */ unsupported, -/* EXP2_F128 */ func_iPTR_i64_i64, -/* EXP2_PPCF128 */ unsupported, -/* EXP2_FINITE_F32 */ unsupported, -/* EXP2_FINITE_F64 */ unsupported, -/* EXP2_FINITE_F80 */ unsupported, -/* EXP2_FINITE_F128 */ unsupported, -/* EXP2_FINITE_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, -/* POW_FINITE_F32 */ unsupported, -/* POW_FINITE_F64 */ unsupported, -/* POW_FINITE_F80 */ unsupported, -/* POW_FINITE_F128 */ unsupported, -/* POW_FINITE_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_F80_F128 */ 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, -/* FPROUND_F128_F80 */ 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, +struct RuntimeLibcallSignatureTable { + std::vector Table; + + // Any newly-added libcalls will be unsupported by default. + RuntimeLibcallSignatureTable() : Table(RTLIB::UNKNOWN_LIBCALL, unsupported) { + // Integer + Table[RTLIB::SHL_I16] = i16_func_i16_i16; + Table[RTLIB::SHL_I32] = i32_func_i32_i32; + Table[RTLIB::SHL_I64] = i64_func_i64_i64; + Table[RTLIB::SHL_I128] = i64_i64_func_i64_i64_i32; + Table[RTLIB::SRL_I16] = i16_func_i16_i16; + Table[RTLIB::SRL_I32] = i32_func_i32_i32; + Table[RTLIB::SRL_I64] = i64_func_i64_i64; + Table[RTLIB::SRL_I128] = i64_i64_func_i64_i64_i32; + Table[RTLIB::SRA_I16] = i16_func_i16_i16; + Table[RTLIB::SRA_I32] = i32_func_i32_i32; + Table[RTLIB::SRA_I64] = i64_func_i64_i64; + Table[RTLIB::SRA_I128] = i64_i64_func_i64_i64_i32; + Table[RTLIB::MUL_I8] = i8_func_i8_i8; + Table[RTLIB::MUL_I16] = i16_func_i16_i16; + Table[RTLIB::MUL_I32] = i32_func_i32_i32; + Table[RTLIB::MUL_I64] = i64_func_i64_i64; + Table[RTLIB::MUL_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::MULO_I32] = i32_func_i32_i32; + Table[RTLIB::MULO_I64] = i64_func_i64_i64; + Table[RTLIB::MULO_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::SDIV_I8] = i8_func_i8_i8; + Table[RTLIB::SDIV_I16] = i16_func_i16_i16; + Table[RTLIB::SDIV_I32] = i32_func_i32_i32; + Table[RTLIB::SDIV_I64] = i64_func_i64_i64; + Table[RTLIB::SDIV_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::UDIV_I8] = i8_func_i8_i8; + Table[RTLIB::UDIV_I16] = i16_func_i16_i16; + Table[RTLIB::UDIV_I32] = i32_func_i32_i32; + Table[RTLIB::UDIV_I64] = i64_func_i64_i64; + Table[RTLIB::UDIV_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::SREM_I8] = i8_func_i8_i8; + Table[RTLIB::SREM_I16] = i16_func_i16_i16; + Table[RTLIB::SREM_I32] = i32_func_i32_i32; + Table[RTLIB::SREM_I64] = i64_func_i64_i64; + Table[RTLIB::SREM_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::UREM_I8] = i8_func_i8_i8; + Table[RTLIB::UREM_I16] = i16_func_i16_i16; + Table[RTLIB::UREM_I32] = i32_func_i32_i32; + Table[RTLIB::UREM_I64] = i64_func_i64_i64; + Table[RTLIB::UREM_I128] = i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::SDIVREM_I8] = i8_func_i8_i8; + Table[RTLIB::SDIVREM_I16] = i16_i16_func_i16_i16; + Table[RTLIB::SDIVREM_I32] = i32_i32_func_i32_i32; + Table[RTLIB::SDIVREM_I64] = i64_func_i64_i64; + Table[RTLIB::SDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::UDIVREM_I8] = i8_func_i8_i8; + Table[RTLIB::UDIVREM_I16] = i16_i16_func_i16_i16; + Table[RTLIB::UDIVREM_I32] = i32_i32_func_i32_i32; + Table[RTLIB::UDIVREM_I64] = i64_i64_func_i64_i64; + Table[RTLIB::UDIVREM_I128] = i64_i64_i64_i64_func_i64_i64_i64_i64; + Table[RTLIB::NEG_I32] = i32_func_i32; + Table[RTLIB::NEG_I64] = i64_func_i64; + + // Floating-point. + // All F80 and PPCF128 routines are unsupported. + Table[RTLIB::ADD_F32] = f32_func_f32_f32; + Table[RTLIB::ADD_F64] = f64_func_f64_f64; + Table[RTLIB::ADD_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::SUB_F32] = f32_func_f32_f32; + Table[RTLIB::SUB_F64] = f64_func_f64_f64; + Table[RTLIB::SUB_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::MUL_F32] = f32_func_f32_f32; + Table[RTLIB::MUL_F64] = f64_func_f64_f64; + Table[RTLIB::MUL_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::DIV_F32] = f32_func_f32_f32; + Table[RTLIB::DIV_F64] = f64_func_f64_f64; + Table[RTLIB::DIV_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::REM_F32] = f32_func_f32_f32; + Table[RTLIB::REM_F64] = f64_func_f64_f64; + Table[RTLIB::REM_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::FMA_F32] = f32_func_f32_f32_f32; + Table[RTLIB::FMA_F64] = f64_func_f64_f64_f64; + Table[RTLIB::FMA_F128] = func_iPTR_i64_i64_i64_i64_i64_i64; + Table[RTLIB::POWI_F32] = f32_func_f32_i32; + Table[RTLIB::POWI_F64] = f64_func_f64_i32; + Table[RTLIB::POWI_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::SQRT_F32] = f32_func_f32; + Table[RTLIB::SQRT_F64] = f64_func_f64; + Table[RTLIB::SQRT_F128] = func_iPTR_i64_i64; + Table[RTLIB::LOG_F32] = f32_func_f32; + Table[RTLIB::LOG_F64] = f64_func_f64; + Table[RTLIB::LOG_F128] = func_iPTR_i64_i64; + Table[RTLIB::LOG2_F32] = f32_func_f32; + Table[RTLIB::LOG2_F64] = f64_func_f64; + Table[RTLIB::LOG2_F128] = func_iPTR_i64_i64; + Table[RTLIB::LOG10_F32] = f32_func_f32; + Table[RTLIB::LOG10_F64] = f64_func_f64; + Table[RTLIB::LOG10_F128] = func_iPTR_i64_i64; + Table[RTLIB::EXP_F32] = f32_func_f32; + Table[RTLIB::EXP_F64] = f64_func_f64; + Table[RTLIB::EXP_F128] = func_iPTR_i64_i64; + Table[RTLIB::EXP2_F32] = f32_func_f32; + Table[RTLIB::EXP2_F64] = f64_func_f64; + Table[RTLIB::EXP2_F128] = func_iPTR_i64_i64; + Table[RTLIB::SIN_F32] = f32_func_f32; + Table[RTLIB::SIN_F64] = f64_func_f64; + Table[RTLIB::SIN_F128] = func_iPTR_i64_i64; + Table[RTLIB::COS_F32] = f32_func_f32; + Table[RTLIB::COS_F64] = f64_func_f64; + Table[RTLIB::COS_F128] = func_iPTR_i64_i64; + Table[RTLIB::SINCOS_F32] = func_f32_iPTR_iPTR; + Table[RTLIB::SINCOS_F64] = func_f64_iPTR_iPTR; + Table[RTLIB::SINCOS_F128] = func_i64_i64_iPTR_iPTR; + Table[RTLIB::POW_F32] = f32_func_f32_f32; + Table[RTLIB::POW_F64] = f64_func_f64_f64; + Table[RTLIB::POW_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::CEIL_F32] = f32_func_f32; + Table[RTLIB::CEIL_F64] = f64_func_f64; + Table[RTLIB::CEIL_F128] = func_iPTR_i64_i64; + Table[RTLIB::TRUNC_F32] = f32_func_f32; + Table[RTLIB::TRUNC_F64] = f64_func_f64; + Table[RTLIB::TRUNC_F128] = func_iPTR_i64_i64; + Table[RTLIB::RINT_F32] = f32_func_f32; + Table[RTLIB::RINT_F64] = f64_func_f64; + Table[RTLIB::RINT_F128] = func_iPTR_i64_i64; + Table[RTLIB::NEARBYINT_F32] = f32_func_f32; + Table[RTLIB::NEARBYINT_F64] = f64_func_f64; + Table[RTLIB::NEARBYINT_F128] = func_iPTR_i64_i64; + Table[RTLIB::ROUND_F32] = f32_func_f32; + Table[RTLIB::ROUND_F64] = f64_func_f64; + Table[RTLIB::ROUND_F128] = func_iPTR_i64_i64; + Table[RTLIB::FLOOR_F32] = f32_func_f32; + Table[RTLIB::FLOOR_F64] = f64_func_f64; + Table[RTLIB::FLOOR_F128] = func_iPTR_i64_i64; + Table[RTLIB::COPYSIGN_F32] = f32_func_f32_f32; + Table[RTLIB::COPYSIGN_F64] = f64_func_f64_f64; + Table[RTLIB::COPYSIGN_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::FMIN_F32] = f32_func_f32_f32; + Table[RTLIB::FMIN_F64] = f64_func_f64_f64; + Table[RTLIB::FMIN_F128] = func_iPTR_i64_i64_i64_i64; + Table[RTLIB::FMAX_F32] = f32_func_f32_f32; + Table[RTLIB::FMAX_F64] = f64_func_f64_f64; + Table[RTLIB::FMAX_F128] = func_iPTR_i64_i64_i64_i64; + + // Conversion + // All F80 and PPCF128 routines are unspported. + Table[RTLIB::FPEXT_F64_F128] = func_iPTR_f64; + Table[RTLIB::FPEXT_F32_F128] = func_iPTR_f32; + Table[RTLIB::FPEXT_F32_F64] = f64_func_f32; + Table[RTLIB::FPEXT_F16_F32] = f32_func_i16; + Table[RTLIB::FPROUND_F32_F16] = i16_func_f32; + Table[RTLIB::FPROUND_F64_F32] = f32_func_f64; + Table[RTLIB::FPROUND_F128_F32] = f32_func_i64_i64; + Table[RTLIB::FPROUND_F128_F64] = f64_func_i64_i64; + Table[RTLIB::FPTOSINT_F32_I32] = i32_func_f32; + Table[RTLIB::FPTOSINT_F32_I64] = i64_func_f32; + Table[RTLIB::FPTOSINT_F32_I128] = i64_i64_func_f32; + Table[RTLIB::FPTOSINT_F64_I32] = i32_func_f64; + Table[RTLIB::FPTOSINT_F64_I64] = i64_func_f64; + Table[RTLIB::FPTOSINT_F64_I128] = i64_i64_func_f64; + Table[RTLIB::FPTOSINT_F128_I32] = i32_func_i64_i64; + Table[RTLIB::FPTOSINT_F128_I64] = i64_func_i64_i64; + Table[RTLIB::FPTOSINT_F128_I128] = i64_i64_func_i64_i64; + Table[RTLIB::FPTOUINT_F32_I32] = i32_func_f32; + Table[RTLIB::FPTOUINT_F32_I64] = i64_func_f32; + Table[RTLIB::FPTOUINT_F32_I128] = i64_i64_func_f32; + Table[RTLIB::FPTOUINT_F64_I32] = i32_func_f64; + Table[RTLIB::FPTOUINT_F64_I64] = i64_func_f64; + Table[RTLIB::FPTOUINT_F64_I128] = i64_i64_func_f64; + Table[RTLIB::FPTOUINT_F128_I32] = i32_func_i64_i64; + Table[RTLIB::FPTOUINT_F128_I64] = i64_func_i64_i64; + Table[RTLIB::FPTOUINT_F128_I128] = i64_i64_func_i64_i64; + Table[RTLIB::SINTTOFP_I32_F32] = f32_func_i32; + Table[RTLIB::SINTTOFP_I32_F64] = f64_func_i32; + Table[RTLIB::SINTTOFP_I32_F128] = func_iPTR_i32; + Table[RTLIB::SINTTOFP_I64_F32] = f32_func_i64; + Table[RTLIB::SINTTOFP_I64_F64] = f64_func_i64; + Table[RTLIB::SINTTOFP_I64_F128] = func_iPTR_i64; + Table[RTLIB::SINTTOFP_I128_F32] = f32_func_i64_i64; + Table[RTLIB::SINTTOFP_I128_F64] = f64_func_i64_i64; + Table[RTLIB::SINTTOFP_I128_F128] = func_iPTR_i64_i64; + Table[RTLIB::UINTTOFP_I32_F32] = f32_func_i32; + Table[RTLIB::UINTTOFP_I32_F64] = f64_func_i64; + Table[RTLIB::UINTTOFP_I32_F128] = func_iPTR_i32; + Table[RTLIB::UINTTOFP_I64_F32] = f32_func_i64; + Table[RTLIB::UINTTOFP_I64_F64] = f64_func_i64; + Table[RTLIB::UINTTOFP_I64_F128] = func_iPTR_i64; + Table[RTLIB::UINTTOFP_I128_F32] = f32_func_i64_i64; + Table[RTLIB::UINTTOFP_I128_F64] = f64_func_i64_i64; + Table[RTLIB::UINTTOFP_I128_F128] = func_iPTR_i64_i64; + + // Comparison + // ALl F80 and PPCF128 routines are unsupported. + Table[RTLIB::OEQ_F32] = i32_func_f32_f32; + Table[RTLIB::OEQ_F64] = i32_func_f64_f64; + Table[RTLIB::OEQ_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::UNE_F32] = i32_func_f32_f32; + Table[RTLIB::UNE_F64] = i32_func_f64_f64; + Table[RTLIB::UNE_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::OGE_F32] = i32_func_f32_f32; + Table[RTLIB::OGE_F64] = i32_func_f64_f64; + Table[RTLIB::OGE_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::OLT_F32] = i32_func_f32_f32; + Table[RTLIB::OLT_F64] = i32_func_f64_f64; + Table[RTLIB::OLT_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::OLE_F32] = i32_func_f32_f32; + Table[RTLIB::OLE_F64] = i32_func_f64_f64; + Table[RTLIB::OLE_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::OGT_F32] = i32_func_f32_f32; + Table[RTLIB::OGT_F64] = i32_func_f64_f64; + Table[RTLIB::OGT_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::UO_F32] = i32_func_f32_f32; + Table[RTLIB::UO_F64] = i32_func_f64_f64; + Table[RTLIB::UO_F128] = i32_func_i64_i64_i64_i64; + Table[RTLIB::O_F32] = i32_func_f32_f32; + Table[RTLIB::O_F64] = i32_func_f64_f64; + Table[RTLIB::O_F128] = i32_func_i64_i64_i64_i64; + + // Memory + Table[RTLIB::MEMCPY] = iPTR_func_iPTR_iPTR_iPTR; + Table[RTLIB::MEMSET] = iPTR_func_iPTR_i32_iPTR; + Table[RTLIB::MEMMOVE] = iPTR_func_iPTR_iPTR_iPTR; + + // Element-wise Atomic memory + // TODO: Fix these when we implement atomic support + Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; + Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; + Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; + Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; + Table[RTLIB::MEMCPY_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; + Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; + Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; + Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; + Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; + Table[RTLIB::MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; + + Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_1] = unsupported; + Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_2] = unsupported; + Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_4] = unsupported; + Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_8] = unsupported; + Table[RTLIB::MEMSET_ELEMENT_UNORDERED_ATOMIC_16] = unsupported; + + // Atomic '__sync_*' libcalls. + // TODO: Fix these when we implement atomic support + Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1] = unsupported; + Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2] = unsupported; + Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4] = unsupported; + Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8] = unsupported; + Table[RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16] = unsupported; + Table[RTLIB::SYNC_LOCK_TEST_AND_SET_1] = unsupported; + Table[RTLIB::SYNC_LOCK_TEST_AND_SET_2] = unsupported; + Table[RTLIB::SYNC_LOCK_TEST_AND_SET_4] = unsupported; + Table[RTLIB::SYNC_LOCK_TEST_AND_SET_8] = unsupported; + Table[RTLIB::SYNC_LOCK_TEST_AND_SET_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_ADD_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_ADD_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_ADD_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_ADD_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_ADD_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_SUB_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_SUB_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_SUB_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_SUB_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_SUB_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_AND_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_AND_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_AND_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_AND_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_AND_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_OR_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_OR_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_OR_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_OR_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_OR_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_XOR_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_XOR_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_XOR_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_XOR_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_XOR_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_NAND_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_NAND_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_NAND_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_NAND_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_NAND_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MAX_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MAX_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MAX_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MAX_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MAX_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMAX_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMAX_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMAX_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMAX_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMAX_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MIN_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MIN_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MIN_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MIN_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_MIN_16] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMIN_1] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMIN_2] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMIN_4] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMIN_8] = unsupported; + Table[RTLIB::SYNC_FETCH_AND_UMIN_16] = unsupported; + + // Atomic '__atomic_*' libcalls. + // TODO: Fix these when we implement atomic support + Table[RTLIB::ATOMIC_LOAD] = unsupported; + Table[RTLIB::ATOMIC_LOAD_1] = unsupported; + Table[RTLIB::ATOMIC_LOAD_2] = unsupported; + Table[RTLIB::ATOMIC_LOAD_4] = unsupported; + Table[RTLIB::ATOMIC_LOAD_8] = unsupported; + Table[RTLIB::ATOMIC_LOAD_16] = unsupported; + + Table[RTLIB::ATOMIC_STORE] = unsupported; + Table[RTLIB::ATOMIC_STORE_1] = unsupported; + Table[RTLIB::ATOMIC_STORE_2] = unsupported; + Table[RTLIB::ATOMIC_STORE_4] = unsupported; + Table[RTLIB::ATOMIC_STORE_8] = unsupported; + Table[RTLIB::ATOMIC_STORE_16] = unsupported; + + Table[RTLIB::ATOMIC_EXCHANGE] = unsupported; + Table[RTLIB::ATOMIC_EXCHANGE_1] = unsupported; + Table[RTLIB::ATOMIC_EXCHANGE_2] = unsupported; + Table[RTLIB::ATOMIC_EXCHANGE_4] = unsupported; + Table[RTLIB::ATOMIC_EXCHANGE_8] = unsupported; + Table[RTLIB::ATOMIC_EXCHANGE_16] = unsupported; + + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE] = unsupported; + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_1] = unsupported; + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_2] = unsupported; + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_4] = unsupported; + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_8] = unsupported; + Table[RTLIB::ATOMIC_COMPARE_EXCHANGE_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_ADD_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_ADD_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_ADD_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_ADD_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_ADD_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_SUB_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_SUB_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_SUB_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_SUB_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_SUB_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_AND_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_AND_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_AND_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_AND_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_AND_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_OR_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_OR_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_OR_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_OR_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_OR_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_XOR_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_XOR_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_XOR_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_XOR_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_XOR_16] = unsupported; + + Table[RTLIB::ATOMIC_FETCH_NAND_1] = unsupported; + Table[RTLIB::ATOMIC_FETCH_NAND_2] = unsupported; + Table[RTLIB::ATOMIC_FETCH_NAND_4] = unsupported; + Table[RTLIB::ATOMIC_FETCH_NAND_8] = unsupported; + Table[RTLIB::ATOMIC_FETCH_NAND_16] = unsupported; + } +}; -// Stack Protector Fail. -/* STACKPROTECTOR_CHECK_FAIL */ func, -// Deoptimization. -/* DEOPTIMIZE */ unsupported, +StringRef StringRefOrEmpty(const char* arg) { + if (arg) return StringRef(arg); + return StringRef(); +} +// Maps libcall names to their RTLIB::Libcall number. Builds the map in a +// constructor for use with ManagedStatic +struct StaticLibcallNameMap { + StringMap Map; + StaticLibcallNameMap() { +#define HANDLE_LIBCALL(code, name) \ + Map[StringRefOrEmpty(name)] = RTLIB::code; + #include "llvm/CodeGen/RuntimeLibcalls.def" +#undef HANDLE_LIBCALL + } }; -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, -/* LOG_FINITE_F32 */ nullptr, -/* LOG_FINITE_F64 */ nullptr, -/* LOG_FINITE_F80 */ nullptr, -/* LOG_FINITE_F128 */ nullptr, -/* LOG_FINITE_PPCF128 */ nullptr, -/* LOG2_F32 */ "log2f", -/* LOG2_F64 */ "log2", -/* LOG2_F80 */ nullptr, -/* LOG2_F128 */ "log2l", -/* LOG2_PPCF128 */ nullptr, -/* LOG2_FINITE_F32 */ nullptr, -/* LOG2_FINITE_F64 */ nullptr, -/* LOG2_FINITE_F80 */ nullptr, -/* LOG2_FINITE_F128 */ nullptr, -/* LOG2_FINITE_PPCF128 */ nullptr, -/* LOG10_F32 */ "log10f", -/* LOG10_F64 */ "log10", -/* LOG10_F80 */ nullptr, -/* LOG10_F128 */ "log10l", -/* LOG10_PPCF128 */ nullptr, -/* LOG10_FINITE_F32 */ nullptr, -/* LOG10_FINITE_F64 */ nullptr, -/* LOG10_FINITE_F80 */ nullptr, -/* LOG10_FINITE_F128 */ nullptr, -/* LOG10_FINITE_PPCF128 */ nullptr, -/* EXP_F32 */ "expf", -/* EXP_F64 */ "exp", -/* EXP_F80 */ nullptr, -/* EXP_F128 */ "expl", -/* EXP_PPCF128 */ nullptr, -/* EXP_FINITE_F32 */ nullptr, -/* EXP_FINITE_F64 */ nullptr, -/* EXP_FINITE_F80 */ nullptr, -/* EXP_FINITE_F128 */ nullptr, -/* EXP_FINITE_PPCF128 */ nullptr, -/* EXP2_F32 */ "exp2f", -/* EXP2_F64 */ "exp2", -/* EXP2_F80 */ nullptr, -/* EXP2_F128 */ "exp2l", -/* EXP2_PPCF128 */ nullptr, -/* EXP2_FINITE_F32 */ nullptr, -/* EXP2_FINITE_F64 */ nullptr, -/* EXP2_FINITE_F80 */ nullptr, -/* EXP2_FINITE_F128 */ nullptr, -/* EXP2_FINITE_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, -/* POW_FINITE_F32 */ nullptr, -/* POW_FINITE_F64 */ nullptr, -/* POW_FINITE_F80 */ nullptr, -/* POW_FINITE_F128 */ nullptr, -/* POW_FINITE_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_F80_F128 */ 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, -/* FPROUND_F128_F80 */ 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", +ManagedStatic RuntimeLibcallSignatures; + +} // end anonymous namespace -/* STACKPROTECTOR_CHECK_FAIL */ "__stack_chk_fail", -/* DEOPTIMIZE */ "__llvm_deoptimize", -}; void llvm::GetSignature(const WebAssemblySubtarget &Subtarget, RTLIB::Libcall LC, SmallVectorImpl &Rets, @@ -1071,7 +489,8 @@ WebAssembly::ExprType::I64 : WebAssembly::ExprType::I32; - switch (RuntimeLibcallSignatures[LC]) { + auto& Table = RuntimeLibcallSignatures->Table; + switch (Table[LC]) { case func: break; case f32_func_f32: @@ -1379,15 +798,14 @@ } } +static ManagedStatic LibcallNameMap; +// TODO: If the RTLIB::Libcall-taking flavor of GetSignature remains unsed +// other than here, just roll its logic into this version. 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"); + auto& Map = LibcallNameMap->Map; + auto val = Map.find(Name); + assert(val != Map.end() && "unexpected runtime library name"); + return GetSignature(Subtarget, val->second, Rets, Params); }