| //===-- CodeGen/RuntimeLibcall.h - Runtime Library Calls --------*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file defines the enum representing the list of runtime library calls | |
| // the backend may emit during code generation, and also some helper functions. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H | |
| #define LLVM_CODEGEN_RUNTIMELIBCALLS_H | |
| #include "llvm/CodeGen/ValueTypes.h" | |
| namespace llvm { | |
| namespace RTLIB { | |
| /// RTLIB::Libcall enum - This enum defines all of the runtime library calls | |
| /// the backend can emit. The various long double types cannot be merged, | |
| /// because 80-bit library functions use "xf" and 128-bit use "tf". | |
| /// | |
| /// When adding PPCF128 functions here, note that their names generally need | |
| /// to be overridden for Darwin with the xxx$LDBL128 form. See | |
| /// PPCISelLowering.cpp. | |
| /// | |
| enum Libcall { | |
| // Integer | |
| SHL_I16, | |
| SHL_I32, | |
| SHL_I64, | |
| SHL_I128, | |
| SRL_I16, | |
| SRL_I32, | |
| SRL_I64, | |
| SRL_I128, | |
| SRA_I16, | |
| SRA_I32, | |
| SRA_I64, | |
| SRA_I128, | |
| MUL_I8, | |
| MUL_I16, | |
| MUL_I32, | |
| MUL_I64, | |
| MUL_I128, | |
| MULO_I32, | |
| MULO_I64, | |
| MULO_I128, | |
| SDIV_I8, | |
| SDIV_I16, | |
| SDIV_I32, | |
| SDIV_I64, | |
| SDIV_I128, | |
| UDIV_I8, | |
| UDIV_I16, | |
| UDIV_I32, | |
| UDIV_I64, | |
| UDIV_I128, | |
| SREM_I8, | |
| SREM_I16, | |
| SREM_I32, | |
| SREM_I64, | |
| SREM_I128, | |
| UREM_I8, | |
| UREM_I16, | |
| UREM_I32, | |
| UREM_I64, | |
| UREM_I128, | |
| SDIVREM_I8, | |
| SDIVREM_I16, | |
| SDIVREM_I32, | |
| SDIVREM_I64, | |
| SDIVREM_I128, | |
| UDIVREM_I8, | |
| UDIVREM_I16, | |
| UDIVREM_I32, | |
| UDIVREM_I64, | |
| UDIVREM_I128, | |
| NEG_I32, | |
| NEG_I64, | |
| // FLOATING POINT | |
| ADD_F32, | |
| ADD_F64, | |
| ADD_F80, | |
| ADD_PPCF128, | |
| SUB_F32, | |
| SUB_F64, | |
| SUB_F80, | |
| SUB_PPCF128, | |
| MUL_F32, | |
| MUL_F64, | |
| MUL_F80, | |
| MUL_PPCF128, | |
| DIV_F32, | |
| DIV_F64, | |
| DIV_F80, | |
| DIV_PPCF128, | |
| REM_F32, | |
| REM_F64, | |
| REM_F80, | |
| REM_PPCF128, | |
| FMA_F32, | |
| FMA_F64, | |
| FMA_F80, | |
| FMA_PPCF128, | |
| POWI_F32, | |
| POWI_F64, | |
| POWI_F80, | |
| POWI_PPCF128, | |
| SQRT_F32, | |
| SQRT_F64, | |
| SQRT_F80, | |
| SQRT_PPCF128, | |
| LOG_F32, | |
| LOG_F64, | |
| LOG_F80, | |
| LOG_PPCF128, | |
| LOG2_F32, | |
| LOG2_F64, | |
| LOG2_F80, | |
| LOG2_PPCF128, | |
| LOG10_F32, | |
| LOG10_F64, | |
| LOG10_F80, | |
| LOG10_PPCF128, | |
| EXP_F32, | |
| EXP_F64, | |
| EXP_F80, | |
| EXP_PPCF128, | |
| EXP2_F32, | |
| EXP2_F64, | |
| EXP2_F80, | |
| EXP2_PPCF128, | |
| SIN_F32, | |
| SIN_F64, | |
| SIN_F80, | |
| SIN_PPCF128, | |
| COS_F32, | |
| COS_F64, | |
| COS_F80, | |
| COS_PPCF128, | |
| POW_F32, | |
| POW_F64, | |
| POW_F80, | |
| POW_PPCF128, | |
| CEIL_F32, | |
| CEIL_F64, | |
| CEIL_F80, | |
| CEIL_PPCF128, | |
| TRUNC_F32, | |
| TRUNC_F64, | |
| TRUNC_F80, | |
| TRUNC_PPCF128, | |
| RINT_F32, | |
| RINT_F64, | |
| RINT_F80, | |
| RINT_PPCF128, | |
| NEARBYINT_F32, | |
| NEARBYINT_F64, | |
| NEARBYINT_F80, | |
| NEARBYINT_PPCF128, | |
| FLOOR_F32, | |
| FLOOR_F64, | |
| FLOOR_F80, | |
| FLOOR_PPCF128, | |
| COPYSIGN_F32, | |
| COPYSIGN_F64, | |
| COPYSIGN_F80, | |
| COPYSIGN_PPCF128, | |
| // CONVERSION | |
| FPEXT_F32_F64, | |
| FPEXT_F16_F32, | |
| FPROUND_F32_F16, | |
| FPROUND_F64_F32, | |
| FPROUND_F80_F32, | |
| FPROUND_PPCF128_F32, | |
| FPROUND_F80_F64, | |
| FPROUND_PPCF128_F64, | |
| FPTOSINT_F32_I8, | |
| FPTOSINT_F32_I16, | |
| FPTOSINT_F32_I32, | |
| FPTOSINT_F32_I64, | |
| FPTOSINT_F32_I128, | |
| FPTOSINT_F64_I8, | |
| FPTOSINT_F64_I16, | |
| FPTOSINT_F64_I32, | |
| FPTOSINT_F64_I64, | |
| FPTOSINT_F64_I128, | |
| FPTOSINT_F80_I32, | |
| FPTOSINT_F80_I64, | |
| FPTOSINT_F80_I128, | |
| FPTOSINT_PPCF128_I32, | |
| FPTOSINT_PPCF128_I64, | |
| FPTOSINT_PPCF128_I128, | |
| FPTOUINT_F32_I8, | |
| FPTOUINT_F32_I16, | |
| FPTOUINT_F32_I32, | |
| FPTOUINT_F32_I64, | |
| FPTOUINT_F32_I128, | |
| FPTOUINT_F64_I8, | |
| FPTOUINT_F64_I16, | |
| FPTOUINT_F64_I32, | |
| FPTOUINT_F64_I64, | |
| FPTOUINT_F64_I128, | |
| FPTOUINT_F80_I32, | |
| FPTOUINT_F80_I64, | |
| FPTOUINT_F80_I128, | |
| FPTOUINT_PPCF128_I32, | |
| FPTOUINT_PPCF128_I64, | |
| FPTOUINT_PPCF128_I128, | |
| SINTTOFP_I32_F32, | |
| SINTTOFP_I32_F64, | |
| SINTTOFP_I32_F80, | |
| SINTTOFP_I32_PPCF128, | |
| SINTTOFP_I64_F32, | |
| SINTTOFP_I64_F64, | |
| SINTTOFP_I64_F80, | |
| SINTTOFP_I64_PPCF128, | |
| SINTTOFP_I128_F32, | |
| SINTTOFP_I128_F64, | |
| SINTTOFP_I128_F80, | |
| SINTTOFP_I128_PPCF128, | |
| UINTTOFP_I32_F32, | |
| UINTTOFP_I32_F64, | |
| UINTTOFP_I32_F80, | |
| UINTTOFP_I32_PPCF128, | |
| UINTTOFP_I64_F32, | |
| UINTTOFP_I64_F64, | |
| UINTTOFP_I64_F80, | |
| UINTTOFP_I64_PPCF128, | |
| UINTTOFP_I128_F32, | |
| UINTTOFP_I128_F64, | |
| UINTTOFP_I128_F80, | |
| UINTTOFP_I128_PPCF128, | |
| // COMPARISON | |
| OEQ_F32, | |
| OEQ_F64, | |
| UNE_F32, | |
| UNE_F64, | |
| OGE_F32, | |
| OGE_F64, | |
| OLT_F32, | |
| OLT_F64, | |
| OLE_F32, | |
| OLE_F64, | |
| OGT_F32, | |
| OGT_F64, | |
| UO_F32, | |
| UO_F64, | |
| O_F32, | |
| O_F64, | |
| // MEMORY | |
| MEMCPY, | |
| MEMSET, | |
| MEMMOVE, | |
| // EXCEPTION HANDLING | |
| UNWIND_RESUME, | |
| // Family ATOMICs | |
| SYNC_VAL_COMPARE_AND_SWAP_1, | |
| SYNC_VAL_COMPARE_AND_SWAP_2, | |
| SYNC_VAL_COMPARE_AND_SWAP_4, | |
| SYNC_VAL_COMPARE_AND_SWAP_8, | |
| SYNC_LOCK_TEST_AND_SET_1, | |
| SYNC_LOCK_TEST_AND_SET_2, | |
| SYNC_LOCK_TEST_AND_SET_4, | |
| SYNC_LOCK_TEST_AND_SET_8, | |
| SYNC_FETCH_AND_ADD_1, | |
| SYNC_FETCH_AND_ADD_2, | |
| SYNC_FETCH_AND_ADD_4, | |
| SYNC_FETCH_AND_ADD_8, | |
| SYNC_FETCH_AND_SUB_1, | |
| SYNC_FETCH_AND_SUB_2, | |
| SYNC_FETCH_AND_SUB_4, | |
| SYNC_FETCH_AND_SUB_8, | |
| SYNC_FETCH_AND_AND_1, | |
| SYNC_FETCH_AND_AND_2, | |
| SYNC_FETCH_AND_AND_4, | |
| SYNC_FETCH_AND_AND_8, | |
| SYNC_FETCH_AND_OR_1, | |
| SYNC_FETCH_AND_OR_2, | |
| SYNC_FETCH_AND_OR_4, | |
| SYNC_FETCH_AND_OR_8, | |
| SYNC_FETCH_AND_XOR_1, | |
| SYNC_FETCH_AND_XOR_2, | |
| SYNC_FETCH_AND_XOR_4, | |
| SYNC_FETCH_AND_XOR_8, | |
| SYNC_FETCH_AND_NAND_1, | |
| SYNC_FETCH_AND_NAND_2, | |
| SYNC_FETCH_AND_NAND_4, | |
| SYNC_FETCH_AND_NAND_8, | |
| UNKNOWN_LIBCALL | |
| }; | |
| /// getFPEXT - Return the FPEXT_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getFPEXT(EVT OpVT, EVT RetVT); | |
| /// getFPROUND - Return the FPROUND_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getFPROUND(EVT OpVT, EVT RetVT); | |
| /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getFPTOSINT(EVT OpVT, EVT RetVT); | |
| /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getFPTOUINT(EVT OpVT, EVT RetVT); | |
| /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getSINTTOFP(EVT OpVT, EVT RetVT); | |
| /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or | |
| /// UNKNOWN_LIBCALL if there is none. | |
| Libcall getUINTTOFP(EVT OpVT, EVT RetVT); | |
| } | |
| } | |
| #endif |