1//===-- CodeGen/RuntimeLibcalls.h - Runtime Library Calls -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the enum representing the list of runtime library calls
10// the backend may emit during code generation, and also some helper functions.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H
15#define LLVM_CODEGEN_RUNTIMELIBCALLS_H
16
17#include "llvm/CodeGen/ValueTypes.h"
18#include "llvm/Support/AtomicOrdering.h"
19
20namespace llvm {
21namespace 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#define HANDLE_LIBCALL(code, name) code,
32 #include "llvm/IR/RuntimeLibcalls.def"
33#undef HANDLE_LIBCALL
34 };
35
36 /// GetFPLibCall - Helper to return the right libcall for the given floating
37 /// point type, or UNKNOWN_LIBCALL if there is none.
38 Libcall getFPLibCall(EVT VT,
39 Libcall Call_F32,
40 Libcall Call_F64,
41 Libcall Call_F80,
42 Libcall Call_F128,
43 Libcall Call_PPCF128);
44
45 /// getFPEXT - Return the FPEXT_*_* value for the given types, or
46 /// UNKNOWN_LIBCALL if there is none.
47 Libcall getFPEXT(EVT OpVT, EVT RetVT);
48
49 /// getFPROUND - Return the FPROUND_*_* value for the given types, or
50 /// UNKNOWN_LIBCALL if there is none.
51 Libcall getFPROUND(EVT OpVT, EVT RetVT);
52
53 /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
54 /// UNKNOWN_LIBCALL if there is none.
55 Libcall getFPTOSINT(EVT OpVT, EVT RetVT);
56
57 /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
58 /// UNKNOWN_LIBCALL if there is none.
59 Libcall getFPTOUINT(EVT OpVT, EVT RetVT);
60
61 /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
62 /// UNKNOWN_LIBCALL if there is none.
63 Libcall getSINTTOFP(EVT OpVT, EVT RetVT);
64
65 /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
66 /// UNKNOWN_LIBCALL if there is none.
67 Libcall getUINTTOFP(EVT OpVT, EVT RetVT);
68
69 /// getPOWI - Return the POWI_* value for the given types, or
70 /// UNKNOWN_LIBCALL if there is none.
71 Libcall getPOWI(EVT RetVT);
72
73 /// getLDEXP - Return the LDEXP_* value for the given types, or
74 /// UNKNOWN_LIBCALL if there is none.
75 Libcall getLDEXP(EVT RetVT);
76
77 /// getFREXP - Return the FREXP_* value for the given types, or
78 /// UNKNOWN_LIBCALL if there is none.
79 Libcall getFREXP(EVT RetVT);
80
81 /// Return the SYNC_FETCH_AND_* value for the given opcode and type, or
82 /// UNKNOWN_LIBCALL if there is none.
83 Libcall getSYNC(unsigned Opc, MVT VT);
84
85 /// Return the outline atomics value for the given atomic ordering, access
86 /// size and set of libcalls for a given atomic, or UNKNOWN_LIBCALL if there
87 /// is none.
88 Libcall getOutlineAtomicHelper(const Libcall (&LC)[5][4],
89 AtomicOrdering Order, uint64_t MemSize);
90
91 /// Return the outline atomics value for the given opcode, atomic ordering
92 /// and type, or UNKNOWN_LIBCALL if there is none.
93 Libcall getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order, MVT VT);
94
95 /// getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return
96 /// MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or
97 /// UNKNOW_LIBCALL if there is none.
98 Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize);
99
100 /// getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return
101 /// MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or
102 /// UNKNOW_LIBCALL if there is none.
103 Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize);
104
105 /// getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return
106 /// MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given element size or
107 /// UNKNOW_LIBCALL if there is none.
108 Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize);
109
110}
111}
112
113#endif
114

source code of llvm/include/llvm/CodeGen/RuntimeLibcalls.h