1193323Sed//===-- CodeGen/RuntimeLibcall.h - Runtime Library Calls --------*- C++ -*-===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This file defines the enum representing the list of runtime library calls
11193323Sed// the backend may emit during code generation, and also some helper functions.
12193323Sed//
13193323Sed//===----------------------------------------------------------------------===//
14193323Sed
15193323Sed#ifndef LLVM_CODEGEN_RUNTIMELIBCALLS_H
16193323Sed#define LLVM_CODEGEN_RUNTIMELIBCALLS_H
17193323Sed
18193323Sed#include "llvm/CodeGen/ValueTypes.h"
19193323Sed
20193323Sednamespace llvm {
21193323Sednamespace RTLIB {
22193323Sed  /// RTLIB::Libcall enum - This enum defines all of the runtime library calls
23193323Sed  /// the backend can emit.  The various long double types cannot be merged,
24193323Sed  /// because 80-bit library functions use "xf" and 128-bit use "tf".
25224145Sdim  ///
26193323Sed  /// When adding PPCF128 functions here, note that their names generally need
27193323Sed  /// to be overridden for Darwin with the xxx$LDBL128 form.  See
28193323Sed  /// PPCISelLowering.cpp.
29193323Sed  ///
30193323Sed  enum Libcall {
31193323Sed    // Integer
32193323Sed    SHL_I16,
33193323Sed    SHL_I32,
34193323Sed    SHL_I64,
35193323Sed    SHL_I128,
36193323Sed    SRL_I16,
37193323Sed    SRL_I32,
38193323Sed    SRL_I64,
39193323Sed    SRL_I128,
40193323Sed    SRA_I16,
41193323Sed    SRA_I32,
42193323Sed    SRA_I64,
43193323Sed    SRA_I128,
44199481Srdivacky    MUL_I8,
45193323Sed    MUL_I16,
46193323Sed    MUL_I32,
47193323Sed    MUL_I64,
48193323Sed    MUL_I128,
49224145Sdim    MULO_I32,
50224145Sdim    MULO_I64,
51224145Sdim    MULO_I128,
52199481Srdivacky    SDIV_I8,
53193323Sed    SDIV_I16,
54193323Sed    SDIV_I32,
55193323Sed    SDIV_I64,
56193323Sed    SDIV_I128,
57199481Srdivacky    UDIV_I8,
58193323Sed    UDIV_I16,
59193323Sed    UDIV_I32,
60193323Sed    UDIV_I64,
61193323Sed    UDIV_I128,
62199481Srdivacky    SREM_I8,
63193323Sed    SREM_I16,
64193323Sed    SREM_I32,
65193323Sed    SREM_I64,
66193323Sed    SREM_I128,
67199481Srdivacky    UREM_I8,
68193323Sed    UREM_I16,
69193323Sed    UREM_I32,
70193323Sed    UREM_I64,
71193323Sed    UREM_I128,
72221345Sdim    SDIVREM_I8,
73221345Sdim    SDIVREM_I16,
74221345Sdim    SDIVREM_I32,
75221345Sdim    SDIVREM_I64,
76221345Sdim    SDIVREM_I128,
77221345Sdim    UDIVREM_I8,
78221345Sdim    UDIVREM_I16,
79221345Sdim    UDIVREM_I32,
80221345Sdim    UDIVREM_I64,
81221345Sdim    UDIVREM_I128,
82193323Sed    NEG_I32,
83193323Sed    NEG_I64,
84193323Sed
85193323Sed    // FLOATING POINT
86193323Sed    ADD_F32,
87193323Sed    ADD_F64,
88193323Sed    ADD_F80,
89249423Sdim    ADD_F128,
90193323Sed    ADD_PPCF128,
91193323Sed    SUB_F32,
92193323Sed    SUB_F64,
93193323Sed    SUB_F80,
94249423Sdim    SUB_F128,
95193323Sed    SUB_PPCF128,
96193323Sed    MUL_F32,
97193323Sed    MUL_F64,
98193323Sed    MUL_F80,
99249423Sdim    MUL_F128,
100193323Sed    MUL_PPCF128,
101193323Sed    DIV_F32,
102193323Sed    DIV_F64,
103193323Sed    DIV_F80,
104249423Sdim    DIV_F128,
105193323Sed    DIV_PPCF128,
106193323Sed    REM_F32,
107193323Sed    REM_F64,
108193323Sed    REM_F80,
109249423Sdim    REM_F128,
110193323Sed    REM_PPCF128,
111224145Sdim    FMA_F32,
112224145Sdim    FMA_F64,
113224145Sdim    FMA_F80,
114249423Sdim    FMA_F128,
115224145Sdim    FMA_PPCF128,
116193323Sed    POWI_F32,
117193323Sed    POWI_F64,
118193323Sed    POWI_F80,
119249423Sdim    POWI_F128,
120193323Sed    POWI_PPCF128,
121193323Sed    SQRT_F32,
122193323Sed    SQRT_F64,
123193323Sed    SQRT_F80,
124249423Sdim    SQRT_F128,
125193323Sed    SQRT_PPCF128,
126193323Sed    LOG_F32,
127193323Sed    LOG_F64,
128193323Sed    LOG_F80,
129249423Sdim    LOG_F128,
130193323Sed    LOG_PPCF128,
131193323Sed    LOG2_F32,
132193323Sed    LOG2_F64,
133193323Sed    LOG2_F80,
134249423Sdim    LOG2_F128,
135193323Sed    LOG2_PPCF128,
136193323Sed    LOG10_F32,
137193323Sed    LOG10_F64,
138193323Sed    LOG10_F80,
139249423Sdim    LOG10_F128,
140193323Sed    LOG10_PPCF128,
141193323Sed    EXP_F32,
142193323Sed    EXP_F64,
143193323Sed    EXP_F80,
144249423Sdim    EXP_F128,
145193323Sed    EXP_PPCF128,
146193323Sed    EXP2_F32,
147193323Sed    EXP2_F64,
148193323Sed    EXP2_F80,
149249423Sdim    EXP2_F128,
150193323Sed    EXP2_PPCF128,
151193323Sed    SIN_F32,
152193323Sed    SIN_F64,
153193323Sed    SIN_F80,
154249423Sdim    SIN_F128,
155193323Sed    SIN_PPCF128,
156193323Sed    COS_F32,
157193323Sed    COS_F64,
158193323Sed    COS_F80,
159249423Sdim    COS_F128,
160193323Sed    COS_PPCF128,
161249423Sdim    SINCOS_F32,
162249423Sdim    SINCOS_F64,
163249423Sdim    SINCOS_F80,
164249423Sdim    SINCOS_F128,
165249423Sdim    SINCOS_PPCF128,
166193323Sed    POW_F32,
167193323Sed    POW_F64,
168193323Sed    POW_F80,
169249423Sdim    POW_F128,
170193323Sed    POW_PPCF128,
171193323Sed    CEIL_F32,
172193323Sed    CEIL_F64,
173193323Sed    CEIL_F80,
174249423Sdim    CEIL_F128,
175193323Sed    CEIL_PPCF128,
176193323Sed    TRUNC_F32,
177193323Sed    TRUNC_F64,
178193323Sed    TRUNC_F80,
179249423Sdim    TRUNC_F128,
180193323Sed    TRUNC_PPCF128,
181193323Sed    RINT_F32,
182193323Sed    RINT_F64,
183193323Sed    RINT_F80,
184249423Sdim    RINT_F128,
185193323Sed    RINT_PPCF128,
186193323Sed    NEARBYINT_F32,
187193323Sed    NEARBYINT_F64,
188193323Sed    NEARBYINT_F80,
189249423Sdim    NEARBYINT_F128,
190193323Sed    NEARBYINT_PPCF128,
191193323Sed    FLOOR_F32,
192193323Sed    FLOOR_F64,
193193323Sed    FLOOR_F80,
194249423Sdim    FLOOR_F128,
195193323Sed    FLOOR_PPCF128,
196205218Srdivacky    COPYSIGN_F32,
197205218Srdivacky    COPYSIGN_F64,
198205218Srdivacky    COPYSIGN_F80,
199249423Sdim    COPYSIGN_F128,
200205218Srdivacky    COPYSIGN_PPCF128,
201193323Sed
202193323Sed    // CONVERSION
203249423Sdim    FPEXT_F64_F128,
204249423Sdim    FPEXT_F32_F128,
205193323Sed    FPEXT_F32_F64,
206205218Srdivacky    FPEXT_F16_F32,
207205218Srdivacky    FPROUND_F32_F16,
208193323Sed    FPROUND_F64_F32,
209193323Sed    FPROUND_F80_F32,
210249423Sdim    FPROUND_F128_F32,
211193323Sed    FPROUND_PPCF128_F32,
212193323Sed    FPROUND_F80_F64,
213249423Sdim    FPROUND_F128_F64,
214193323Sed    FPROUND_PPCF128_F64,
215194612Sed    FPTOSINT_F32_I8,
216194612Sed    FPTOSINT_F32_I16,
217193323Sed    FPTOSINT_F32_I32,
218193323Sed    FPTOSINT_F32_I64,
219193323Sed    FPTOSINT_F32_I128,
220206083Srdivacky    FPTOSINT_F64_I8,
221206083Srdivacky    FPTOSINT_F64_I16,
222193323Sed    FPTOSINT_F64_I32,
223193323Sed    FPTOSINT_F64_I64,
224193323Sed    FPTOSINT_F64_I128,
225193323Sed    FPTOSINT_F80_I32,
226193323Sed    FPTOSINT_F80_I64,
227193323Sed    FPTOSINT_F80_I128,
228249423Sdim    FPTOSINT_F128_I32,
229249423Sdim    FPTOSINT_F128_I64,
230249423Sdim    FPTOSINT_F128_I128,
231193323Sed    FPTOSINT_PPCF128_I32,
232193323Sed    FPTOSINT_PPCF128_I64,
233193323Sed    FPTOSINT_PPCF128_I128,
234194612Sed    FPTOUINT_F32_I8,
235194612Sed    FPTOUINT_F32_I16,
236193323Sed    FPTOUINT_F32_I32,
237193323Sed    FPTOUINT_F32_I64,
238193323Sed    FPTOUINT_F32_I128,
239206083Srdivacky    FPTOUINT_F64_I8,
240206083Srdivacky    FPTOUINT_F64_I16,
241193323Sed    FPTOUINT_F64_I32,
242193323Sed    FPTOUINT_F64_I64,
243193323Sed    FPTOUINT_F64_I128,
244193323Sed    FPTOUINT_F80_I32,
245193323Sed    FPTOUINT_F80_I64,
246193323Sed    FPTOUINT_F80_I128,
247249423Sdim    FPTOUINT_F128_I32,
248249423Sdim    FPTOUINT_F128_I64,
249249423Sdim    FPTOUINT_F128_I128,
250193323Sed    FPTOUINT_PPCF128_I32,
251193323Sed    FPTOUINT_PPCF128_I64,
252193323Sed    FPTOUINT_PPCF128_I128,
253193323Sed    SINTTOFP_I32_F32,
254193323Sed    SINTTOFP_I32_F64,
255193323Sed    SINTTOFP_I32_F80,
256249423Sdim    SINTTOFP_I32_F128,
257193323Sed    SINTTOFP_I32_PPCF128,
258193323Sed    SINTTOFP_I64_F32,
259193323Sed    SINTTOFP_I64_F64,
260193323Sed    SINTTOFP_I64_F80,
261249423Sdim    SINTTOFP_I64_F128,
262193323Sed    SINTTOFP_I64_PPCF128,
263193323Sed    SINTTOFP_I128_F32,
264193323Sed    SINTTOFP_I128_F64,
265193323Sed    SINTTOFP_I128_F80,
266249423Sdim    SINTTOFP_I128_F128,
267193323Sed    SINTTOFP_I128_PPCF128,
268193323Sed    UINTTOFP_I32_F32,
269193323Sed    UINTTOFP_I32_F64,
270193323Sed    UINTTOFP_I32_F80,
271249423Sdim    UINTTOFP_I32_F128,
272193323Sed    UINTTOFP_I32_PPCF128,
273193323Sed    UINTTOFP_I64_F32,
274193323Sed    UINTTOFP_I64_F64,
275193323Sed    UINTTOFP_I64_F80,
276249423Sdim    UINTTOFP_I64_F128,
277193323Sed    UINTTOFP_I64_PPCF128,
278193323Sed    UINTTOFP_I128_F32,
279193323Sed    UINTTOFP_I128_F64,
280193323Sed    UINTTOFP_I128_F80,
281249423Sdim    UINTTOFP_I128_F128,
282193323Sed    UINTTOFP_I128_PPCF128,
283193323Sed
284193323Sed    // COMPARISON
285193323Sed    OEQ_F32,
286193323Sed    OEQ_F64,
287249423Sdim    OEQ_F128,
288193323Sed    UNE_F32,
289193323Sed    UNE_F64,
290249423Sdim    UNE_F128,
291193323Sed    OGE_F32,
292193323Sed    OGE_F64,
293249423Sdim    OGE_F128,
294193323Sed    OLT_F32,
295193323Sed    OLT_F64,
296249423Sdim    OLT_F128,
297193323Sed    OLE_F32,
298193323Sed    OLE_F64,
299249423Sdim    OLE_F128,
300193323Sed    OGT_F32,
301193323Sed    OGT_F64,
302249423Sdim    OGT_F128,
303193323Sed    UO_F32,
304193323Sed    UO_F64,
305249423Sdim    UO_F128,
306193323Sed    O_F32,
307193323Sed    O_F64,
308249423Sdim    O_F128,
309193323Sed
310198090Srdivacky    // MEMORY
311198090Srdivacky    MEMCPY,
312198090Srdivacky    MEMSET,
313198090Srdivacky    MEMMOVE,
314198090Srdivacky
315193323Sed    // EXCEPTION HANDLING
316193323Sed    UNWIND_RESUME,
317193323Sed
318210299Sed    // Family ATOMICs
319210299Sed    SYNC_VAL_COMPARE_AND_SWAP_1,
320210299Sed    SYNC_VAL_COMPARE_AND_SWAP_2,
321210299Sed    SYNC_VAL_COMPARE_AND_SWAP_4,
322210299Sed    SYNC_VAL_COMPARE_AND_SWAP_8,
323210299Sed    SYNC_LOCK_TEST_AND_SET_1,
324210299Sed    SYNC_LOCK_TEST_AND_SET_2,
325210299Sed    SYNC_LOCK_TEST_AND_SET_4,
326210299Sed    SYNC_LOCK_TEST_AND_SET_8,
327210299Sed    SYNC_FETCH_AND_ADD_1,
328210299Sed    SYNC_FETCH_AND_ADD_2,
329210299Sed    SYNC_FETCH_AND_ADD_4,
330210299Sed    SYNC_FETCH_AND_ADD_8,
331210299Sed    SYNC_FETCH_AND_SUB_1,
332210299Sed    SYNC_FETCH_AND_SUB_2,
333210299Sed    SYNC_FETCH_AND_SUB_4,
334210299Sed    SYNC_FETCH_AND_SUB_8,
335210299Sed    SYNC_FETCH_AND_AND_1,
336210299Sed    SYNC_FETCH_AND_AND_2,
337210299Sed    SYNC_FETCH_AND_AND_4,
338210299Sed    SYNC_FETCH_AND_AND_8,
339210299Sed    SYNC_FETCH_AND_OR_1,
340210299Sed    SYNC_FETCH_AND_OR_2,
341210299Sed    SYNC_FETCH_AND_OR_4,
342210299Sed    SYNC_FETCH_AND_OR_8,
343210299Sed    SYNC_FETCH_AND_XOR_1,
344210299Sed    SYNC_FETCH_AND_XOR_2,
345210299Sed    SYNC_FETCH_AND_XOR_4,
346210299Sed    SYNC_FETCH_AND_XOR_8,
347210299Sed    SYNC_FETCH_AND_NAND_1,
348210299Sed    SYNC_FETCH_AND_NAND_2,
349210299Sed    SYNC_FETCH_AND_NAND_4,
350210299Sed    SYNC_FETCH_AND_NAND_8,
351210299Sed
352193323Sed    UNKNOWN_LIBCALL
353193323Sed  };
354193323Sed
355193323Sed  /// getFPEXT - Return the FPEXT_*_* value for the given types, or
356193323Sed  /// UNKNOWN_LIBCALL if there is none.
357198090Srdivacky  Libcall getFPEXT(EVT OpVT, EVT RetVT);
358193323Sed
359193323Sed  /// getFPROUND - Return the FPROUND_*_* value for the given types, or
360193323Sed  /// UNKNOWN_LIBCALL if there is none.
361198090Srdivacky  Libcall getFPROUND(EVT OpVT, EVT RetVT);
362193323Sed
363193323Sed  /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
364193323Sed  /// UNKNOWN_LIBCALL if there is none.
365198090Srdivacky  Libcall getFPTOSINT(EVT OpVT, EVT RetVT);
366193323Sed
367193323Sed  /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
368193323Sed  /// UNKNOWN_LIBCALL if there is none.
369198090Srdivacky  Libcall getFPTOUINT(EVT OpVT, EVT RetVT);
370193323Sed
371193323Sed  /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
372193323Sed  /// UNKNOWN_LIBCALL if there is none.
373198090Srdivacky  Libcall getSINTTOFP(EVT OpVT, EVT RetVT);
374193323Sed
375193323Sed  /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
376193323Sed  /// UNKNOWN_LIBCALL if there is none.
377198090Srdivacky  Libcall getUINTTOFP(EVT OpVT, EVT RetVT);
378193323Sed}
379193323Sed}
380193323Sed
381193323Sed#endif
382