RuntimeLibcalls.h revision b0f1e1780c736c62fb99e5824825d2a60a53b53b
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_I16,
45    MUL_I32,
46    MUL_I64,
47    MUL_I128,
48    SDIV_I16,
49    SDIV_I32,
50    SDIV_I64,
51    SDIV_I128,
52    UDIV_I16,
53    UDIV_I32,
54    UDIV_I64,
55    UDIV_I128,
56    SREM_I16,
57    SREM_I32,
58    SREM_I64,
59    SREM_I128,
60    UREM_I16,
61    UREM_I32,
62    UREM_I64,
63    UREM_I128,
64    NEG_I32,
65    NEG_I64,
66
67    // FLOATING POINT
68    ADD_F32,
69    ADD_F64,
70    ADD_F80,
71    ADD_PPCF128,
72    SUB_F32,
73    SUB_F64,
74    SUB_F80,
75    SUB_PPCF128,
76    MUL_F32,
77    MUL_F64,
78    MUL_F80,
79    MUL_PPCF128,
80    DIV_F32,
81    DIV_F64,
82    DIV_F80,
83    DIV_PPCF128,
84    REM_F32,
85    REM_F64,
86    REM_F80,
87    REM_PPCF128,
88    POWI_F32,
89    POWI_F64,
90    POWI_F80,
91    POWI_PPCF128,
92    SQRT_F32,
93    SQRT_F64,
94    SQRT_F80,
95    SQRT_PPCF128,
96    LOG_F32,
97    LOG_F64,
98    LOG_F80,
99    LOG_PPCF128,
100    LOG2_F32,
101    LOG2_F64,
102    LOG2_F80,
103    LOG2_PPCF128,
104    LOG10_F32,
105    LOG10_F64,
106    LOG10_F80,
107    LOG10_PPCF128,
108    EXP_F32,
109    EXP_F64,
110    EXP_F80,
111    EXP_PPCF128,
112    EXP2_F32,
113    EXP2_F64,
114    EXP2_F80,
115    EXP2_PPCF128,
116    SIN_F32,
117    SIN_F64,
118    SIN_F80,
119    SIN_PPCF128,
120    COS_F32,
121    COS_F64,
122    COS_F80,
123    COS_PPCF128,
124    POW_F32,
125    POW_F64,
126    POW_F80,
127    POW_PPCF128,
128    CEIL_F32,
129    CEIL_F64,
130    CEIL_F80,
131    CEIL_PPCF128,
132    TRUNC_F32,
133    TRUNC_F64,
134    TRUNC_F80,
135    TRUNC_PPCF128,
136    RINT_F32,
137    RINT_F64,
138    RINT_F80,
139    RINT_PPCF128,
140    NEARBYINT_F32,
141    NEARBYINT_F64,
142    NEARBYINT_F80,
143    NEARBYINT_PPCF128,
144    FLOOR_F32,
145    FLOOR_F64,
146    FLOOR_F80,
147    FLOOR_PPCF128,
148
149    // CONVERSION
150    FPEXT_F32_F64,
151    FPROUND_F64_F32,
152    FPROUND_F80_F32,
153    FPROUND_PPCF128_F32,
154    FPROUND_F80_F64,
155    FPROUND_PPCF128_F64,
156    FPTOSINT_F32_I32,
157    FPTOSINT_F32_I64,
158    FPTOSINT_F32_I128,
159    FPTOSINT_F64_I32,
160    FPTOSINT_F64_I64,
161    FPTOSINT_F64_I128,
162    FPTOSINT_F80_I32,
163    FPTOSINT_F80_I64,
164    FPTOSINT_F80_I128,
165    FPTOSINT_PPCF128_I32,
166    FPTOSINT_PPCF128_I64,
167    FPTOSINT_PPCF128_I128,
168    FPTOUINT_F32_I32,
169    FPTOUINT_F32_I64,
170    FPTOUINT_F32_I128,
171    FPTOUINT_F64_I32,
172    FPTOUINT_F64_I64,
173    FPTOUINT_F64_I128,
174    FPTOUINT_F80_I32,
175    FPTOUINT_F80_I64,
176    FPTOUINT_F80_I128,
177    FPTOUINT_PPCF128_I32,
178    FPTOUINT_PPCF128_I64,
179    FPTOUINT_PPCF128_I128,
180    SINTTOFP_I32_F32,
181    SINTTOFP_I32_F64,
182    SINTTOFP_I32_F80,
183    SINTTOFP_I32_PPCF128,
184    SINTTOFP_I64_F32,
185    SINTTOFP_I64_F64,
186    SINTTOFP_I64_F80,
187    SINTTOFP_I64_PPCF128,
188    SINTTOFP_I128_F32,
189    SINTTOFP_I128_F64,
190    SINTTOFP_I128_F80,
191    SINTTOFP_I128_PPCF128,
192    UINTTOFP_I32_F32,
193    UINTTOFP_I32_F64,
194    UINTTOFP_I32_F80,
195    UINTTOFP_I32_PPCF128,
196    UINTTOFP_I64_F32,
197    UINTTOFP_I64_F64,
198    UINTTOFP_I64_F80,
199    UINTTOFP_I64_PPCF128,
200    UINTTOFP_I128_F32,
201    UINTTOFP_I128_F64,
202    UINTTOFP_I128_F80,
203    UINTTOFP_I128_PPCF128,
204
205    // COMPARISON
206    OEQ_F32,
207    OEQ_F64,
208    UNE_F32,
209    UNE_F64,
210    OGE_F32,
211    OGE_F64,
212    OLT_F32,
213    OLT_F64,
214    OLE_F32,
215    OLE_F64,
216    OGT_F32,
217    OGT_F64,
218    UO_F32,
219    UO_F64,
220    O_F32,
221    O_F64,
222
223    // EXCEPTION HANDLING
224    UNWIND_RESUME,
225
226    UNKNOWN_LIBCALL
227  };
228
229  /// getFPEXT - Return the FPEXT_*_* value for the given types, or
230  /// UNKNOWN_LIBCALL if there is none.
231  Libcall getFPEXT(MVT OpVT, MVT RetVT);
232
233  /// getFPROUND - Return the FPROUND_*_* value for the given types, or
234  /// UNKNOWN_LIBCALL if there is none.
235  Libcall getFPROUND(MVT OpVT, MVT RetVT);
236
237  /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
238  /// UNKNOWN_LIBCALL if there is none.
239  Libcall getFPTOSINT(MVT OpVT, MVT RetVT);
240
241  /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
242  /// UNKNOWN_LIBCALL if there is none.
243  Libcall getFPTOUINT(MVT OpVT, MVT RetVT);
244
245  /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
246  /// UNKNOWN_LIBCALL if there is none.
247  Libcall getSINTTOFP(MVT OpVT, MVT RetVT);
248
249  /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
250  /// UNKNOWN_LIBCALL if there is none.
251  Libcall getUINTTOFP(MVT OpVT, MVT RetVT);
252}
253}
254
255#endif
256