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
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    // 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