Use std::unique instead of a SmallPtrSet to ensure unique instructions in UseSlots.
[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_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     SDIV_I8,
50     SDIV_I16,
51     SDIV_I32,
52     SDIV_I64,
53     SDIV_I128,
54     UDIV_I8,
55     UDIV_I16,
56     UDIV_I32,
57     UDIV_I64,
58     UDIV_I128,
59     SREM_I8,
60     SREM_I16,
61     SREM_I32,
62     SREM_I64,
63     SREM_I128,
64     UREM_I8,
65     UREM_I16,
66     UREM_I32,
67     UREM_I64,
68     UREM_I128,
69     SDIVREM_I8,
70     SDIVREM_I16,
71     SDIVREM_I32,
72     SDIVREM_I64,
73     SDIVREM_I128,
74     UDIVREM_I8,
75     UDIVREM_I16,
76     UDIVREM_I32,
77     UDIVREM_I64,
78     UDIVREM_I128,
79     NEG_I32,
80     NEG_I64,
81
82     // FLOATING POINT
83     ADD_F32,
84     ADD_F64,
85     ADD_F80,
86     ADD_PPCF128,
87     SUB_F32,
88     SUB_F64,
89     SUB_F80,
90     SUB_PPCF128,
91     MUL_F32,
92     MUL_F64,
93     MUL_F80,
94     MUL_PPCF128,
95     DIV_F32,
96     DIV_F64,
97     DIV_F80,
98     DIV_PPCF128,
99     REM_F32,
100     REM_F64,
101     REM_F80,
102     REM_PPCF128,
103     POWI_F32,
104     POWI_F64,
105     POWI_F80,
106     POWI_PPCF128,
107     SQRT_F32,
108     SQRT_F64,
109     SQRT_F80,
110     SQRT_PPCF128,
111     LOG_F32,
112     LOG_F64,
113     LOG_F80,
114     LOG_PPCF128,
115     LOG2_F32,
116     LOG2_F64,
117     LOG2_F80,
118     LOG2_PPCF128,
119     LOG10_F32,
120     LOG10_F64,
121     LOG10_F80,
122     LOG10_PPCF128,
123     EXP_F32,
124     EXP_F64,
125     EXP_F80,
126     EXP_PPCF128,
127     EXP2_F32,
128     EXP2_F64,
129     EXP2_F80,
130     EXP2_PPCF128,
131     SIN_F32,
132     SIN_F64,
133     SIN_F80,
134     SIN_PPCF128,
135     COS_F32,
136     COS_F64,
137     COS_F80,
138     COS_PPCF128,
139     POW_F32,
140     POW_F64,
141     POW_F80,
142     POW_PPCF128,
143     CEIL_F32,
144     CEIL_F64,
145     CEIL_F80,
146     CEIL_PPCF128,
147     TRUNC_F32,
148     TRUNC_F64,
149     TRUNC_F80,
150     TRUNC_PPCF128,
151     RINT_F32,
152     RINT_F64,
153     RINT_F80,
154     RINT_PPCF128,
155     NEARBYINT_F32,
156     NEARBYINT_F64,
157     NEARBYINT_F80,
158     NEARBYINT_PPCF128,
159     FLOOR_F32,
160     FLOOR_F64,
161     FLOOR_F80,
162     FLOOR_PPCF128,
163     COPYSIGN_F32,
164     COPYSIGN_F64,
165     COPYSIGN_F80,
166     COPYSIGN_PPCF128,
167
168     // CONVERSION
169     FPEXT_F32_F64,
170     FPEXT_F16_F32,
171     FPROUND_F32_F16,
172     FPROUND_F64_F32,
173     FPROUND_F80_F32,
174     FPROUND_PPCF128_F32,
175     FPROUND_F80_F64,
176     FPROUND_PPCF128_F64,
177     FPTOSINT_F32_I8,
178     FPTOSINT_F32_I16,
179     FPTOSINT_F32_I32,
180     FPTOSINT_F32_I64,
181     FPTOSINT_F32_I128,
182     FPTOSINT_F64_I8,
183     FPTOSINT_F64_I16,
184     FPTOSINT_F64_I32,
185     FPTOSINT_F64_I64,
186     FPTOSINT_F64_I128,
187     FPTOSINT_F80_I32,
188     FPTOSINT_F80_I64,
189     FPTOSINT_F80_I128,
190     FPTOSINT_PPCF128_I32,
191     FPTOSINT_PPCF128_I64,
192     FPTOSINT_PPCF128_I128,
193     FPTOUINT_F32_I8,
194     FPTOUINT_F32_I16,
195     FPTOUINT_F32_I32,
196     FPTOUINT_F32_I64,
197     FPTOUINT_F32_I128,
198     FPTOUINT_F64_I8,
199     FPTOUINT_F64_I16,
200     FPTOUINT_F64_I32,
201     FPTOUINT_F64_I64,
202     FPTOUINT_F64_I128,
203     FPTOUINT_F80_I32,
204     FPTOUINT_F80_I64,
205     FPTOUINT_F80_I128,
206     FPTOUINT_PPCF128_I32,
207     FPTOUINT_PPCF128_I64,
208     FPTOUINT_PPCF128_I128,
209     SINTTOFP_I32_F32,
210     SINTTOFP_I32_F64,
211     SINTTOFP_I32_F80,
212     SINTTOFP_I32_PPCF128,
213     SINTTOFP_I64_F32,
214     SINTTOFP_I64_F64,
215     SINTTOFP_I64_F80,
216     SINTTOFP_I64_PPCF128,
217     SINTTOFP_I128_F32,
218     SINTTOFP_I128_F64,
219     SINTTOFP_I128_F80,
220     SINTTOFP_I128_PPCF128,
221     UINTTOFP_I32_F32,
222     UINTTOFP_I32_F64,
223     UINTTOFP_I32_F80,
224     UINTTOFP_I32_PPCF128,
225     UINTTOFP_I64_F32,
226     UINTTOFP_I64_F64,
227     UINTTOFP_I64_F80,
228     UINTTOFP_I64_PPCF128,
229     UINTTOFP_I128_F32,
230     UINTTOFP_I128_F64,
231     UINTTOFP_I128_F80,
232     UINTTOFP_I128_PPCF128,
233
234     // COMPARISON
235     OEQ_F32,
236     OEQ_F64,
237     UNE_F32,
238     UNE_F64,
239     OGE_F32,
240     OGE_F64,
241     OLT_F32,
242     OLT_F64,
243     OLE_F32,
244     OLE_F64,
245     OGT_F32,
246     OGT_F64,
247     UO_F32,
248     UO_F64,
249     O_F32,
250     O_F64,
251
252     // MEMORY
253     MEMCPY,
254     MEMSET,
255     MEMMOVE,
256
257     // EXCEPTION HANDLING
258     UNWIND_RESUME,
259
260     // Family ATOMICs
261     SYNC_VAL_COMPARE_AND_SWAP_1,
262     SYNC_VAL_COMPARE_AND_SWAP_2,
263     SYNC_VAL_COMPARE_AND_SWAP_4,
264     SYNC_VAL_COMPARE_AND_SWAP_8,
265     SYNC_LOCK_TEST_AND_SET_1,
266     SYNC_LOCK_TEST_AND_SET_2,
267     SYNC_LOCK_TEST_AND_SET_4,
268     SYNC_LOCK_TEST_AND_SET_8,
269     SYNC_FETCH_AND_ADD_1,
270     SYNC_FETCH_AND_ADD_2,
271     SYNC_FETCH_AND_ADD_4,
272     SYNC_FETCH_AND_ADD_8,
273     SYNC_FETCH_AND_SUB_1,
274     SYNC_FETCH_AND_SUB_2,
275     SYNC_FETCH_AND_SUB_4,
276     SYNC_FETCH_AND_SUB_8,
277     SYNC_FETCH_AND_AND_1,
278     SYNC_FETCH_AND_AND_2,
279     SYNC_FETCH_AND_AND_4,
280     SYNC_FETCH_AND_AND_8,
281     SYNC_FETCH_AND_OR_1,
282     SYNC_FETCH_AND_OR_2,
283     SYNC_FETCH_AND_OR_4,
284     SYNC_FETCH_AND_OR_8,
285     SYNC_FETCH_AND_XOR_1,
286     SYNC_FETCH_AND_XOR_2,
287     SYNC_FETCH_AND_XOR_4,
288     SYNC_FETCH_AND_XOR_8,
289     SYNC_FETCH_AND_NAND_1,
290     SYNC_FETCH_AND_NAND_2,
291     SYNC_FETCH_AND_NAND_4,
292     SYNC_FETCH_AND_NAND_8,
293
294     UNKNOWN_LIBCALL
295   };
296
297   /// getFPEXT - Return the FPEXT_*_* value for the given types, or
298   /// UNKNOWN_LIBCALL if there is none.
299   Libcall getFPEXT(EVT OpVT, EVT RetVT);
300
301   /// getFPROUND - Return the FPROUND_*_* value for the given types, or
302   /// UNKNOWN_LIBCALL if there is none.
303   Libcall getFPROUND(EVT OpVT, EVT RetVT);
304
305   /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
306   /// UNKNOWN_LIBCALL if there is none.
307   Libcall getFPTOSINT(EVT OpVT, EVT RetVT);
308
309   /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
310   /// UNKNOWN_LIBCALL if there is none.
311   Libcall getFPTOUINT(EVT OpVT, EVT RetVT);
312
313   /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
314   /// UNKNOWN_LIBCALL if there is none.
315   Libcall getSINTTOFP(EVT OpVT, EVT RetVT);
316
317   /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
318   /// UNKNOWN_LIBCALL if there is none.
319   Libcall getUINTTOFP(EVT OpVT, EVT RetVT);
320 }
321 }
322
323 #endif