1263508Sdim//===-- CodeGen/RuntimeLibcalls.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,
191263508Sdim    ROUND_F32,
192263508Sdim    ROUND_F64,
193263508Sdim    ROUND_F80,
194263508Sdim    ROUND_F128,
195263508Sdim    ROUND_PPCF128,
196193323Sed    FLOOR_F32,
197193323Sed    FLOOR_F64,
198193323Sed    FLOOR_F80,
199249423Sdim    FLOOR_F128,
200193323Sed    FLOOR_PPCF128,
201205218Srdivacky    COPYSIGN_F32,
202205218Srdivacky    COPYSIGN_F64,
203205218Srdivacky    COPYSIGN_F80,
204249423Sdim    COPYSIGN_F128,
205205218Srdivacky    COPYSIGN_PPCF128,
206193323Sed
207193323Sed    // CONVERSION
208249423Sdim    FPEXT_F64_F128,
209249423Sdim    FPEXT_F32_F128,
210193323Sed    FPEXT_F32_F64,
211205218Srdivacky    FPEXT_F16_F32,
212205218Srdivacky    FPROUND_F32_F16,
213193323Sed    FPROUND_F64_F32,
214193323Sed    FPROUND_F80_F32,
215249423Sdim    FPROUND_F128_F32,
216193323Sed    FPROUND_PPCF128_F32,
217193323Sed    FPROUND_F80_F64,
218249423Sdim    FPROUND_F128_F64,
219193323Sed    FPROUND_PPCF128_F64,
220194612Sed    FPTOSINT_F32_I8,
221194612Sed    FPTOSINT_F32_I16,
222193323Sed    FPTOSINT_F32_I32,
223193323Sed    FPTOSINT_F32_I64,
224193323Sed    FPTOSINT_F32_I128,
225206083Srdivacky    FPTOSINT_F64_I8,
226206083Srdivacky    FPTOSINT_F64_I16,
227193323Sed    FPTOSINT_F64_I32,
228193323Sed    FPTOSINT_F64_I64,
229193323Sed    FPTOSINT_F64_I128,
230193323Sed    FPTOSINT_F80_I32,
231193323Sed    FPTOSINT_F80_I64,
232193323Sed    FPTOSINT_F80_I128,
233249423Sdim    FPTOSINT_F128_I32,
234249423Sdim    FPTOSINT_F128_I64,
235249423Sdim    FPTOSINT_F128_I128,
236193323Sed    FPTOSINT_PPCF128_I32,
237193323Sed    FPTOSINT_PPCF128_I64,
238193323Sed    FPTOSINT_PPCF128_I128,
239194612Sed    FPTOUINT_F32_I8,
240194612Sed    FPTOUINT_F32_I16,
241193323Sed    FPTOUINT_F32_I32,
242193323Sed    FPTOUINT_F32_I64,
243193323Sed    FPTOUINT_F32_I128,
244206083Srdivacky    FPTOUINT_F64_I8,
245206083Srdivacky    FPTOUINT_F64_I16,
246193323Sed    FPTOUINT_F64_I32,
247193323Sed    FPTOUINT_F64_I64,
248193323Sed    FPTOUINT_F64_I128,
249193323Sed    FPTOUINT_F80_I32,
250193323Sed    FPTOUINT_F80_I64,
251193323Sed    FPTOUINT_F80_I128,
252249423Sdim    FPTOUINT_F128_I32,
253249423Sdim    FPTOUINT_F128_I64,
254249423Sdim    FPTOUINT_F128_I128,
255193323Sed    FPTOUINT_PPCF128_I32,
256193323Sed    FPTOUINT_PPCF128_I64,
257193323Sed    FPTOUINT_PPCF128_I128,
258193323Sed    SINTTOFP_I32_F32,
259193323Sed    SINTTOFP_I32_F64,
260193323Sed    SINTTOFP_I32_F80,
261249423Sdim    SINTTOFP_I32_F128,
262193323Sed    SINTTOFP_I32_PPCF128,
263193323Sed    SINTTOFP_I64_F32,
264193323Sed    SINTTOFP_I64_F64,
265193323Sed    SINTTOFP_I64_F80,
266249423Sdim    SINTTOFP_I64_F128,
267193323Sed    SINTTOFP_I64_PPCF128,
268193323Sed    SINTTOFP_I128_F32,
269193323Sed    SINTTOFP_I128_F64,
270193323Sed    SINTTOFP_I128_F80,
271249423Sdim    SINTTOFP_I128_F128,
272193323Sed    SINTTOFP_I128_PPCF128,
273193323Sed    UINTTOFP_I32_F32,
274193323Sed    UINTTOFP_I32_F64,
275193323Sed    UINTTOFP_I32_F80,
276249423Sdim    UINTTOFP_I32_F128,
277193323Sed    UINTTOFP_I32_PPCF128,
278193323Sed    UINTTOFP_I64_F32,
279193323Sed    UINTTOFP_I64_F64,
280193323Sed    UINTTOFP_I64_F80,
281249423Sdim    UINTTOFP_I64_F128,
282193323Sed    UINTTOFP_I64_PPCF128,
283193323Sed    UINTTOFP_I128_F32,
284193323Sed    UINTTOFP_I128_F64,
285193323Sed    UINTTOFP_I128_F80,
286249423Sdim    UINTTOFP_I128_F128,
287193323Sed    UINTTOFP_I128_PPCF128,
288193323Sed
289193323Sed    // COMPARISON
290193323Sed    OEQ_F32,
291193323Sed    OEQ_F64,
292249423Sdim    OEQ_F128,
293193323Sed    UNE_F32,
294193323Sed    UNE_F64,
295249423Sdim    UNE_F128,
296193323Sed    OGE_F32,
297193323Sed    OGE_F64,
298249423Sdim    OGE_F128,
299193323Sed    OLT_F32,
300193323Sed    OLT_F64,
301249423Sdim    OLT_F128,
302193323Sed    OLE_F32,
303193323Sed    OLE_F64,
304249423Sdim    OLE_F128,
305193323Sed    OGT_F32,
306193323Sed    OGT_F64,
307249423Sdim    OGT_F128,
308193323Sed    UO_F32,
309193323Sed    UO_F64,
310249423Sdim    UO_F128,
311193323Sed    O_F32,
312193323Sed    O_F64,
313249423Sdim    O_F128,
314193323Sed
315198090Srdivacky    // MEMORY
316198090Srdivacky    MEMCPY,
317198090Srdivacky    MEMSET,
318198090Srdivacky    MEMMOVE,
319198090Srdivacky
320193323Sed    // EXCEPTION HANDLING
321193323Sed    UNWIND_RESUME,
322193323Sed
323210299Sed    // Family ATOMICs
324210299Sed    SYNC_VAL_COMPARE_AND_SWAP_1,
325210299Sed    SYNC_VAL_COMPARE_AND_SWAP_2,
326210299Sed    SYNC_VAL_COMPARE_AND_SWAP_4,
327210299Sed    SYNC_VAL_COMPARE_AND_SWAP_8,
328263508Sdim    SYNC_VAL_COMPARE_AND_SWAP_16,
329210299Sed    SYNC_LOCK_TEST_AND_SET_1,
330210299Sed    SYNC_LOCK_TEST_AND_SET_2,
331210299Sed    SYNC_LOCK_TEST_AND_SET_4,
332210299Sed    SYNC_LOCK_TEST_AND_SET_8,
333263508Sdim    SYNC_LOCK_TEST_AND_SET_16,
334210299Sed    SYNC_FETCH_AND_ADD_1,
335210299Sed    SYNC_FETCH_AND_ADD_2,
336210299Sed    SYNC_FETCH_AND_ADD_4,
337210299Sed    SYNC_FETCH_AND_ADD_8,
338263508Sdim    SYNC_FETCH_AND_ADD_16,
339210299Sed    SYNC_FETCH_AND_SUB_1,
340210299Sed    SYNC_FETCH_AND_SUB_2,
341210299Sed    SYNC_FETCH_AND_SUB_4,
342210299Sed    SYNC_FETCH_AND_SUB_8,
343263508Sdim    SYNC_FETCH_AND_SUB_16,
344210299Sed    SYNC_FETCH_AND_AND_1,
345210299Sed    SYNC_FETCH_AND_AND_2,
346210299Sed    SYNC_FETCH_AND_AND_4,
347210299Sed    SYNC_FETCH_AND_AND_8,
348263508Sdim    SYNC_FETCH_AND_AND_16,
349210299Sed    SYNC_FETCH_AND_OR_1,
350210299Sed    SYNC_FETCH_AND_OR_2,
351210299Sed    SYNC_FETCH_AND_OR_4,
352210299Sed    SYNC_FETCH_AND_OR_8,
353263508Sdim    SYNC_FETCH_AND_OR_16,
354210299Sed    SYNC_FETCH_AND_XOR_1,
355210299Sed    SYNC_FETCH_AND_XOR_2,
356210299Sed    SYNC_FETCH_AND_XOR_4,
357210299Sed    SYNC_FETCH_AND_XOR_8,
358263508Sdim    SYNC_FETCH_AND_XOR_16,
359210299Sed    SYNC_FETCH_AND_NAND_1,
360210299Sed    SYNC_FETCH_AND_NAND_2,
361210299Sed    SYNC_FETCH_AND_NAND_4,
362210299Sed    SYNC_FETCH_AND_NAND_8,
363263508Sdim    SYNC_FETCH_AND_NAND_16,
364263508Sdim    SYNC_FETCH_AND_MAX_1,
365263508Sdim    SYNC_FETCH_AND_MAX_2,
366263508Sdim    SYNC_FETCH_AND_MAX_4,
367263508Sdim    SYNC_FETCH_AND_MAX_8,
368263508Sdim    SYNC_FETCH_AND_MAX_16,
369263508Sdim    SYNC_FETCH_AND_UMAX_1,
370263508Sdim    SYNC_FETCH_AND_UMAX_2,
371263508Sdim    SYNC_FETCH_AND_UMAX_4,
372263508Sdim    SYNC_FETCH_AND_UMAX_8,
373263508Sdim    SYNC_FETCH_AND_UMAX_16,
374263508Sdim    SYNC_FETCH_AND_MIN_1,
375263508Sdim    SYNC_FETCH_AND_MIN_2,
376263508Sdim    SYNC_FETCH_AND_MIN_4,
377263508Sdim    SYNC_FETCH_AND_MIN_8,
378263508Sdim    SYNC_FETCH_AND_MIN_16,
379263508Sdim    SYNC_FETCH_AND_UMIN_1,
380263508Sdim    SYNC_FETCH_AND_UMIN_2,
381263508Sdim    SYNC_FETCH_AND_UMIN_4,
382263508Sdim    SYNC_FETCH_AND_UMIN_8,
383263508Sdim    SYNC_FETCH_AND_UMIN_16,
384210299Sed
385263508Sdim    // Stack Protector Fail.
386263508Sdim    STACKPROTECTOR_CHECK_FAIL,
387263508Sdim
388193323Sed    UNKNOWN_LIBCALL
389193323Sed  };
390193323Sed
391193323Sed  /// getFPEXT - Return the FPEXT_*_* value for the given types, or
392193323Sed  /// UNKNOWN_LIBCALL if there is none.
393198090Srdivacky  Libcall getFPEXT(EVT OpVT, EVT RetVT);
394193323Sed
395193323Sed  /// getFPROUND - Return the FPROUND_*_* value for the given types, or
396193323Sed  /// UNKNOWN_LIBCALL if there is none.
397198090Srdivacky  Libcall getFPROUND(EVT OpVT, EVT RetVT);
398193323Sed
399193323Sed  /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
400193323Sed  /// UNKNOWN_LIBCALL if there is none.
401198090Srdivacky  Libcall getFPTOSINT(EVT OpVT, EVT RetVT);
402193323Sed
403193323Sed  /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
404193323Sed  /// UNKNOWN_LIBCALL if there is none.
405198090Srdivacky  Libcall getFPTOUINT(EVT OpVT, EVT RetVT);
406193323Sed
407193323Sed  /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
408193323Sed  /// UNKNOWN_LIBCALL if there is none.
409198090Srdivacky  Libcall getSINTTOFP(EVT OpVT, EVT RetVT);
410193323Sed
411193323Sed  /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
412193323Sed  /// UNKNOWN_LIBCALL if there is none.
413198090Srdivacky  Libcall getUINTTOFP(EVT OpVT, EVT RetVT);
414193323Sed}
415193323Sed}
416193323Sed
417193323Sed#endif
418