Fix an issue where a use might be selected before a def, and then we didn't respect...
[oota-llvm.git] / include / llvm / CodeGen / RuntimeLibcalls.h
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
20 namespace llvm {
21 namespace 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_I32,
33     SHL_I64,
34     SHL_I128,
35     SRL_I32,
36     SRL_I64,
37     SRL_I128,
38     SRA_I32,
39     SRA_I64,
40     SRA_I128,
41     MUL_I32,
42     MUL_I64,
43     MUL_I128,
44     SDIV_I32,
45     SDIV_I64,
46     SDIV_I128,
47     UDIV_I32,
48     UDIV_I64,
49     UDIV_I128,
50     SREM_I32,
51     SREM_I64,
52     SREM_I128,
53     UREM_I32,
54     UREM_I64,
55     UREM_I128,
56     NEG_I32,
57     NEG_I64,
58
59     // FLOATING POINT
60     ADD_F32,
61     ADD_F64,
62     ADD_F80,
63     ADD_PPCF128,
64     SUB_F32,
65     SUB_F64,
66     SUB_F80,
67     SUB_PPCF128,
68     MUL_F32,
69     MUL_F64,
70     MUL_F80,
71     MUL_PPCF128,
72     DIV_F32,
73     DIV_F64,
74     DIV_F80,
75     DIV_PPCF128,
76     REM_F32,
77     REM_F64,
78     REM_F80,
79     REM_PPCF128,
80     POWI_F32,
81     POWI_F64,
82     POWI_F80,
83     POWI_PPCF128,
84     SQRT_F32,
85     SQRT_F64,
86     SQRT_F80,
87     SQRT_PPCF128,
88     SIN_F32,
89     SIN_F64,
90     SIN_F80,
91     SIN_PPCF128,
92     COS_F32,
93     COS_F64,
94     COS_F80,
95     COS_PPCF128,
96     POW_F32,
97     POW_F64,
98     POW_F80,
99     POW_PPCF128,
100     CEIL_F32,
101     CEIL_F64,
102     CEIL_F80,
103     CEIL_PPCF128,
104     TRUNC_F32,
105     TRUNC_F64,
106     TRUNC_F80,
107     TRUNC_PPCF128,
108     RINT_F32,
109     RINT_F64,
110     RINT_F80,
111     RINT_PPCF128,
112     NEARBYINT_F32,
113     NEARBYINT_F64,
114     NEARBYINT_F80,
115     NEARBYINT_PPCF128,
116     FLOOR_F32,
117     FLOOR_F64,
118     FLOOR_F80,
119     FLOOR_PPCF128,
120
121     // CONVERSION
122     FPEXT_F32_F64,
123     FPROUND_F64_F32,
124     FPROUND_F80_F32,
125     FPROUND_PPCF128_F32,
126     FPROUND_F80_F64,
127     FPROUND_PPCF128_F64,
128     FPTOSINT_F32_I32,
129     FPTOSINT_F32_I64,
130     FPTOSINT_F32_I128,
131     FPTOSINT_F64_I32,
132     FPTOSINT_F64_I64,
133     FPTOSINT_F64_I128,
134     FPTOSINT_F80_I32,
135     FPTOSINT_F80_I64,
136     FPTOSINT_F80_I128,
137     FPTOSINT_PPCF128_I32,
138     FPTOSINT_PPCF128_I64,
139     FPTOSINT_PPCF128_I128,
140     FPTOUINT_F32_I32,
141     FPTOUINT_F32_I64,
142     FPTOUINT_F32_I128,
143     FPTOUINT_F64_I32,
144     FPTOUINT_F64_I64,
145     FPTOUINT_F64_I128,
146     FPTOUINT_F80_I32,
147     FPTOUINT_F80_I64,
148     FPTOUINT_F80_I128,
149     FPTOUINT_PPCF128_I32,
150     FPTOUINT_PPCF128_I64,
151     FPTOUINT_PPCF128_I128,
152     SINTTOFP_I32_F32,
153     SINTTOFP_I32_F64,
154     SINTTOFP_I32_F80,
155     SINTTOFP_I32_PPCF128,
156     SINTTOFP_I64_F32,
157     SINTTOFP_I64_F64,
158     SINTTOFP_I64_F80,
159     SINTTOFP_I64_PPCF128,
160     SINTTOFP_I128_F32,
161     SINTTOFP_I128_F64,
162     SINTTOFP_I128_F80,
163     SINTTOFP_I128_PPCF128,
164     UINTTOFP_I32_F32,
165     UINTTOFP_I32_F64,
166     UINTTOFP_I32_F80,
167     UINTTOFP_I32_PPCF128,
168     UINTTOFP_I64_F32,
169     UINTTOFP_I64_F64,
170     UINTTOFP_I64_F80,
171     UINTTOFP_I64_PPCF128,
172     UINTTOFP_I128_F32,
173     UINTTOFP_I128_F64,
174     UINTTOFP_I128_F80,
175     UINTTOFP_I128_PPCF128,
176
177     // COMPARISON
178     OEQ_F32,
179     OEQ_F64,
180     UNE_F32,
181     UNE_F64,
182     OGE_F32,
183     OGE_F64,
184     OLT_F32,
185     OLT_F64,
186     OLE_F32,
187     OLE_F64,
188     OGT_F32,
189     OGT_F64,
190     UO_F32,
191     UO_F64,
192     O_F32,
193     O_F64,
194
195     UNKNOWN_LIBCALL
196   };
197
198   /// getFPEXT - Return the FPEXT_*_* value for the given types, or
199   /// UNKNOWN_LIBCALL if there is none.
200   Libcall getFPEXT(MVT OpVT, MVT RetVT);
201
202   /// getFPROUND - Return the FPROUND_*_* value for the given types, or
203   /// UNKNOWN_LIBCALL if there is none.
204   Libcall getFPROUND(MVT OpVT, MVT RetVT);
205
206   /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
207   /// UNKNOWN_LIBCALL if there is none.
208   Libcall getFPTOSINT(MVT OpVT, MVT RetVT);
209
210   /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
211   /// UNKNOWN_LIBCALL if there is none.
212   Libcall getFPTOUINT(MVT OpVT, MVT RetVT);
213
214   /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
215   /// UNKNOWN_LIBCALL if there is none.
216   Libcall getSINTTOFP(MVT OpVT, MVT RetVT);
217
218   /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
219   /// UNKNOWN_LIBCALL if there is none.
220   Libcall getUINTTOFP(MVT OpVT, MVT RetVT);
221 }
222 }
223
224 #endif