1 //===-- CodeGen/RuntimeLibcall.h - Runtime Library Calls --------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the enum representing the list of runtime library calls 11 // the backend may emit during code generation, and also some helper functions. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H 16 #define LLVM_CODEGEN_RUNTIMELIBCALLS_H 17 18 #include "llvm/CodeGen/ValueTypes.h" 19 20 namespace llvm { 21 namespace RTLIB { 22 /// RTLIB::Libcall enum - This enum defines all of the runtime library calls 23 /// the backend can emit. The various long double types cannot be merged, 24 /// because 80-bit library functions use "xf" and 128-bit use "tf". 25 /// 26 /// When adding PPCF128 functions here, note that their names generally need 27 /// to be overridden for Darwin with the xxx$LDBL128 form. See 28 /// PPCISelLowering.cpp. 29 /// 30 enum Libcall { 31 // Integer 32 SHL_I16, 33 SHL_I32, 34 SHL_I64, 35 SHL_I128, 36 SRL_I16, 37 SRL_I32, 38 SRL_I64, 39 SRL_I128, 40 SRA_I16, 41 SRA_I32, 42 SRA_I64, 43 SRA_I128, 44 MUL_I8, 45 MUL_I16, 46 MUL_I32, 47 MUL_I64, 48 MUL_I128, 49 MULO_I32, 50 MULO_I64, 51 MULO_I128, 52 SDIV_I8, 53 SDIV_I16, 54 SDIV_I32, 55 SDIV_I64, 56 SDIV_I128, 57 UDIV_I8, 58 UDIV_I16, 59 UDIV_I32, 60 UDIV_I64, 61 UDIV_I128, 62 SREM_I8, 63 SREM_I16, 64 SREM_I32, 65 SREM_I64, 66 SREM_I128, 67 UREM_I8, 68 UREM_I16, 69 UREM_I32, 70 UREM_I64, 71 UREM_I128, 72 SDIVREM_I8, 73 SDIVREM_I16, 74 SDIVREM_I32, 75 SDIVREM_I64, 76 SDIVREM_I128, 77 UDIVREM_I8, 78 UDIVREM_I16, 79 UDIVREM_I32, 80 UDIVREM_I64, 81 UDIVREM_I128, 82 NEG_I32, 83 NEG_I64, 84 85 // FLOATING POINT 86 ADD_F32, 87 ADD_F64, 88 ADD_F80, 89 ADD_PPCF128, 90 SUB_F32, 91 SUB_F64, 92 SUB_F80, 93 SUB_PPCF128, 94 MUL_F32, 95 MUL_F64, 96 MUL_F80, 97 MUL_PPCF128, 98 DIV_F32, 99 DIV_F64, 100 DIV_F80, 101 DIV_PPCF128, 102 REM_F32, 103 REM_F64, 104 REM_F80, 105 REM_PPCF128, 106 FMA_F32, 107 FMA_F64, 108 FMA_F80, 109 FMA_PPCF128, 110 POWI_F32, 111 POWI_F64, 112 POWI_F80, 113 POWI_PPCF128, 114 SQRT_F32, 115 SQRT_F64, 116 SQRT_F80, 117 SQRT_PPCF128, 118 LOG_F32, 119 LOG_F64, 120 LOG_F80, 121 LOG_PPCF128, 122 LOG2_F32, 123 LOG2_F64, 124 LOG2_F80, 125 LOG2_PPCF128, 126 LOG10_F32, 127 LOG10_F64, 128 LOG10_F80, 129 LOG10_PPCF128, 130 EXP_F32, 131 EXP_F64, 132 EXP_F80, 133 EXP_PPCF128, 134 EXP2_F32, 135 EXP2_F64, 136 EXP2_F80, 137 EXP2_PPCF128, 138 SIN_F32, 139 SIN_F64, 140 SIN_F80, 141 SIN_PPCF128, 142 COS_F32, 143 COS_F64, 144 COS_F80, 145 COS_PPCF128, 146 POW_F32, 147 POW_F64, 148 POW_F80, 149 POW_PPCF128, 150 CEIL_F32, 151 CEIL_F64, 152 CEIL_F80, 153 CEIL_PPCF128, 154 TRUNC_F32, 155 TRUNC_F64, 156 TRUNC_F80, 157 TRUNC_PPCF128, 158 RINT_F32, 159 RINT_F64, 160 RINT_F80, 161 RINT_PPCF128, 162 NEARBYINT_F32, 163 NEARBYINT_F64, 164 NEARBYINT_F80, 165 NEARBYINT_PPCF128, 166 FLOOR_F32, 167 FLOOR_F64, 168 FLOOR_F80, 169 FLOOR_PPCF128, 170 COPYSIGN_F32, 171 COPYSIGN_F64, 172 COPYSIGN_F80, 173 COPYSIGN_PPCF128, 174 175 // CONVERSION 176 FPEXT_F32_F64, 177 FPEXT_F16_F32, 178 FPROUND_F32_F16, 179 FPROUND_F64_F32, 180 FPROUND_F80_F32, 181 FPROUND_PPCF128_F32, 182 FPROUND_F80_F64, 183 FPROUND_PPCF128_F64, 184 FPTOSINT_F32_I8, 185 FPTOSINT_F32_I16, 186 FPTOSINT_F32_I32, 187 FPTOSINT_F32_I64, 188 FPTOSINT_F32_I128, 189 FPTOSINT_F64_I8, 190 FPTOSINT_F64_I16, 191 FPTOSINT_F64_I32, 192 FPTOSINT_F64_I64, 193 FPTOSINT_F64_I128, 194 FPTOSINT_F80_I32, 195 FPTOSINT_F80_I64, 196 FPTOSINT_F80_I128, 197 FPTOSINT_PPCF128_I32, 198 FPTOSINT_PPCF128_I64, 199 FPTOSINT_PPCF128_I128, 200 FPTOUINT_F32_I8, 201 FPTOUINT_F32_I16, 202 FPTOUINT_F32_I32, 203 FPTOUINT_F32_I64, 204 FPTOUINT_F32_I128, 205 FPTOUINT_F64_I8, 206 FPTOUINT_F64_I16, 207 FPTOUINT_F64_I32, 208 FPTOUINT_F64_I64, 209 FPTOUINT_F64_I128, 210 FPTOUINT_F80_I32, 211 FPTOUINT_F80_I64, 212 FPTOUINT_F80_I128, 213 FPTOUINT_PPCF128_I32, 214 FPTOUINT_PPCF128_I64, 215 FPTOUINT_PPCF128_I128, 216 SINTTOFP_I32_F32, 217 SINTTOFP_I32_F64, 218 SINTTOFP_I32_F80, 219 SINTTOFP_I32_PPCF128, 220 SINTTOFP_I64_F32, 221 SINTTOFP_I64_F64, 222 SINTTOFP_I64_F80, 223 SINTTOFP_I64_PPCF128, 224 SINTTOFP_I128_F32, 225 SINTTOFP_I128_F64, 226 SINTTOFP_I128_F80, 227 SINTTOFP_I128_PPCF128, 228 UINTTOFP_I32_F32, 229 UINTTOFP_I32_F64, 230 UINTTOFP_I32_F80, 231 UINTTOFP_I32_PPCF128, 232 UINTTOFP_I64_F32, 233 UINTTOFP_I64_F64, 234 UINTTOFP_I64_F80, 235 UINTTOFP_I64_PPCF128, 236 UINTTOFP_I128_F32, 237 UINTTOFP_I128_F64, 238 UINTTOFP_I128_F80, 239 UINTTOFP_I128_PPCF128, 240 241 // COMPARISON 242 OEQ_F32, 243 OEQ_F64, 244 UNE_F32, 245 UNE_F64, 246 OGE_F32, 247 OGE_F64, 248 OLT_F32, 249 OLT_F64, 250 OLE_F32, 251 OLE_F64, 252 OGT_F32, 253 OGT_F64, 254 UO_F32, 255 UO_F64, 256 O_F32, 257 O_F64, 258 259 // MEMORY 260 MEMCPY, 261 MEMSET, 262 MEMMOVE, 263 264 // EXCEPTION HANDLING 265 UNWIND_RESUME, 266 267 // Family ATOMICs 268 SYNC_VAL_COMPARE_AND_SWAP_1, 269 SYNC_VAL_COMPARE_AND_SWAP_2, 270 SYNC_VAL_COMPARE_AND_SWAP_4, 271 SYNC_VAL_COMPARE_AND_SWAP_8, 272 SYNC_LOCK_TEST_AND_SET_1, 273 SYNC_LOCK_TEST_AND_SET_2, 274 SYNC_LOCK_TEST_AND_SET_4, 275 SYNC_LOCK_TEST_AND_SET_8, 276 SYNC_FETCH_AND_ADD_1, 277 SYNC_FETCH_AND_ADD_2, 278 SYNC_FETCH_AND_ADD_4, 279 SYNC_FETCH_AND_ADD_8, 280 SYNC_FETCH_AND_SUB_1, 281 SYNC_FETCH_AND_SUB_2, 282 SYNC_FETCH_AND_SUB_4, 283 SYNC_FETCH_AND_SUB_8, 284 SYNC_FETCH_AND_AND_1, 285 SYNC_FETCH_AND_AND_2, 286 SYNC_FETCH_AND_AND_4, 287 SYNC_FETCH_AND_AND_8, 288 SYNC_FETCH_AND_OR_1, 289 SYNC_FETCH_AND_OR_2, 290 SYNC_FETCH_AND_OR_4, 291 SYNC_FETCH_AND_OR_8, 292 SYNC_FETCH_AND_XOR_1, 293 SYNC_FETCH_AND_XOR_2, 294 SYNC_FETCH_AND_XOR_4, 295 SYNC_FETCH_AND_XOR_8, 296 SYNC_FETCH_AND_NAND_1, 297 SYNC_FETCH_AND_NAND_2, 298 SYNC_FETCH_AND_NAND_4, 299 SYNC_FETCH_AND_NAND_8, 300 301 UNKNOWN_LIBCALL 302 }; 303 304 /// getFPEXT - Return the FPEXT_*_* value for the given types, or 305 /// UNKNOWN_LIBCALL if there is none. 306 Libcall getFPEXT(EVT OpVT, EVT RetVT); 307 308 /// getFPROUND - Return the FPROUND_*_* value for the given types, or 309 /// UNKNOWN_LIBCALL if there is none. 310 Libcall getFPROUND(EVT OpVT, EVT RetVT); 311 312 /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or 313 /// UNKNOWN_LIBCALL if there is none. 314 Libcall getFPTOSINT(EVT OpVT, EVT RetVT); 315 316 /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or 317 /// UNKNOWN_LIBCALL if there is none. 318 Libcall getFPTOUINT(EVT OpVT, EVT RetVT); 319 320 /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or 321 /// UNKNOWN_LIBCALL if there is none. 322 Libcall getSINTTOFP(EVT OpVT, EVT RetVT); 323 324 /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or 325 /// UNKNOWN_LIBCALL if there is none. 326 Libcall getUINTTOFP(EVT OpVT, EVT RetVT); 327 } 328 } 329 330 #endif 331