Sort a few more #include lines in tools/... unittests/... and utils/...
[oota-llvm.git] / include / llvm / IntrinsicsNVVM.td
1 //===- IntrinsicsNVVM.td - Defines NVVM intrinsics ---------*- tablegen -*-===//
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 all of the NVVM-specific intrinsics for use with NVPTX.
11 //
12 //===----------------------------------------------------------------------===//
13
14 def llvm_anyi64ptr_ty     : LLVMAnyPointerType<llvm_i64_ty>;     // (space)i64*
15
16 //
17 // MISC
18 //
19
20   def int_nvvm_clz_i : GCCBuiltin<"__nvvm_clz_i">,
21       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
22   def int_nvvm_clz_ll : GCCBuiltin<"__nvvm_clz_ll">,
23       Intrinsic<[llvm_i32_ty], [llvm_i64_ty], [IntrNoMem]>;
24
25   def int_nvvm_popc_i : GCCBuiltin<"__nvvm_popc_i">,
26       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
27   def int_nvvm_popc_ll : GCCBuiltin<"__nvvm_popc_ll">,
28       Intrinsic<[llvm_i32_ty], [llvm_i64_ty], [IntrNoMem]>;
29
30   def int_nvvm_prmt : GCCBuiltin<"__nvvm_prmt">,
31       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
32         [IntrNoMem, Commutative]>;
33
34 //
35 // Min Max
36 //
37
38   def int_nvvm_min_i : GCCBuiltin<"__nvvm_min_i">,
39       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
40         [IntrNoMem, Commutative]>;
41   def int_nvvm_min_ui : GCCBuiltin<"__nvvm_min_ui">,
42       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
43         [IntrNoMem, Commutative]>;
44
45   def int_nvvm_min_ll : GCCBuiltin<"__nvvm_min_ll">,
46       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
47         [IntrNoMem, Commutative]>;
48   def int_nvvm_min_ull : GCCBuiltin<"__nvvm_min_ull">,
49       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
50         [IntrNoMem, Commutative]>;
51
52   def int_nvvm_max_i : GCCBuiltin<"__nvvm_max_i">,
53       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
54         [IntrNoMem, Commutative]>;
55   def int_nvvm_max_ui : GCCBuiltin<"__nvvm_max_ui">,
56       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
57         [IntrNoMem, Commutative]>;
58
59   def int_nvvm_max_ll : GCCBuiltin<"__nvvm_max_ll">,
60       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
61         [IntrNoMem, Commutative]>;
62   def int_nvvm_max_ull : GCCBuiltin<"__nvvm_max_ull">,
63       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
64         [IntrNoMem, Commutative]>;
65
66   def int_nvvm_fmin_f : GCCBuiltin<"__nvvm_fmin_f">,
67       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
68         [IntrNoMem, Commutative]>;
69   def int_nvvm_fmin_ftz_f : GCCBuiltin<"__nvvm_fmin_ftz_f">,
70       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
71         [IntrNoMem, Commutative]>;
72
73   def int_nvvm_fmax_f : GCCBuiltin<"__nvvm_fmax_f">,
74       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty]
75         , [IntrNoMem, Commutative]>;
76   def int_nvvm_fmax_ftz_f : GCCBuiltin<"__nvvm_fmax_ftz_f">,
77       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
78         [IntrNoMem, Commutative]>;
79
80   def int_nvvm_fmin_d : GCCBuiltin<"__nvvm_fmin_d">,
81       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
82         [IntrNoMem, Commutative]>;
83   def int_nvvm_fmax_d : GCCBuiltin<"__nvvm_fmax_d">,
84       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
85         [IntrNoMem, Commutative]>;
86
87 //
88 // Multiplication
89 //
90
91   def int_nvvm_mulhi_i : GCCBuiltin<"__nvvm_mulhi_i">,
92       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
93         [IntrNoMem, Commutative]>;
94   def int_nvvm_mulhi_ui : GCCBuiltin<"__nvvm_mulhi_ui">,
95       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
96         [IntrNoMem, Commutative]>;
97
98   def int_nvvm_mulhi_ll : GCCBuiltin<"__nvvm_mulhi_ll">,
99       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
100         [IntrNoMem, Commutative]>;
101   def int_nvvm_mulhi_ull : GCCBuiltin<"__nvvm_mulhi_ull">,
102       Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty],
103         [IntrNoMem, Commutative]>;
104
105   def int_nvvm_mul_rn_ftz_f : GCCBuiltin<"__nvvm_mul_rn_ftz_f">,
106       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
107         [IntrNoMem, Commutative]>;
108   def int_nvvm_mul_rn_f : GCCBuiltin<"__nvvm_mul_rn_f">,
109       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
110         [IntrNoMem, Commutative]>;
111   def int_nvvm_mul_rz_ftz_f : GCCBuiltin<"__nvvm_mul_rz_ftz_f">,
112       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
113         [IntrNoMem, Commutative]>;
114   def int_nvvm_mul_rz_f : GCCBuiltin<"__nvvm_mul_rz_f">,
115       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
116         [IntrNoMem, Commutative]>;
117   def int_nvvm_mul_rm_ftz_f : GCCBuiltin<"__nvvm_mul_rm_ftz_f">,
118       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
119         [IntrNoMem, Commutative]>;
120   def int_nvvm_mul_rm_f : GCCBuiltin<"__nvvm_mul_rm_f">,
121       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
122         [IntrNoMem, Commutative]>;
123   def int_nvvm_mul_rp_ftz_f : GCCBuiltin<"__nvvm_mul_rp_ftz_f">,
124       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
125         [IntrNoMem, Commutative]>;
126   def int_nvvm_mul_rp_f : GCCBuiltin<"__nvvm_mul_rp_f">,
127       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
128         [IntrNoMem, Commutative]>;
129
130   def int_nvvm_mul_rn_d : GCCBuiltin<"__nvvm_mul_rn_d">,
131       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
132         [IntrNoMem, Commutative]>;
133   def int_nvvm_mul_rz_d : GCCBuiltin<"__nvvm_mul_rz_d">,
134       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
135         [IntrNoMem, Commutative]>;
136   def int_nvvm_mul_rm_d : GCCBuiltin<"__nvvm_mul_rm_d">,
137       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
138         [IntrNoMem, Commutative]>;
139   def int_nvvm_mul_rp_d : GCCBuiltin<"__nvvm_mul_rp_d">,
140       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
141         [IntrNoMem, Commutative]>;
142
143   def int_nvvm_mul24_i : GCCBuiltin<"__nvvm_mul24_i">,
144       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
145         [IntrNoMem, Commutative]>;
146   def int_nvvm_mul24_ui : GCCBuiltin<"__nvvm_mul24_ui">,
147       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
148         [IntrNoMem, Commutative]>;
149
150 //
151 // Div
152 //
153
154   def int_nvvm_div_approx_ftz_f : GCCBuiltin<"__nvvm_div_approx_ftz_f">,
155       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
156         [IntrNoMem, Commutative]>;
157   def int_nvvm_div_approx_f : GCCBuiltin<"__nvvm_div_approx_f">,
158       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
159         [IntrNoMem, Commutative]>;
160
161   def int_nvvm_div_rn_ftz_f : GCCBuiltin<"__nvvm_div_rn_ftz_f">,
162       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
163         [IntrNoMem, Commutative]>;
164   def int_nvvm_div_rn_f : GCCBuiltin<"__nvvm_div_rn_f">,
165       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
166         [IntrNoMem, Commutative]>;
167
168   def int_nvvm_div_rz_ftz_f : GCCBuiltin<"__nvvm_div_rz_ftz_f">,
169       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
170         [IntrNoMem, Commutative]>;
171   def int_nvvm_div_rz_f : GCCBuiltin<"__nvvm_div_rz_f">,
172       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
173         [IntrNoMem, Commutative]>;
174
175   def int_nvvm_div_rm_ftz_f : GCCBuiltin<"__nvvm_div_rm_ftz_f">,
176       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
177         [IntrNoMem, Commutative]>;
178   def int_nvvm_div_rm_f : GCCBuiltin<"__nvvm_div_rm_f">,
179       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
180         [IntrNoMem, Commutative]>;
181
182   def int_nvvm_div_rp_ftz_f : GCCBuiltin<"__nvvm_div_rp_ftz_f">,
183       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
184         [IntrNoMem, Commutative]>;
185   def int_nvvm_div_rp_f : GCCBuiltin<"__nvvm_div_rp_f">,
186       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
187         [IntrNoMem, Commutative]>;
188
189   def int_nvvm_div_rn_d : GCCBuiltin<"__nvvm_div_rn_d">,
190       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
191         [IntrNoMem, Commutative]>;
192   def int_nvvm_div_rz_d : GCCBuiltin<"__nvvm_div_rz_d">,
193       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
194         [IntrNoMem, Commutative]>;
195   def int_nvvm_div_rm_d : GCCBuiltin<"__nvvm_div_rm_d">,
196       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
197         [IntrNoMem, Commutative]>;
198   def int_nvvm_div_rp_d : GCCBuiltin<"__nvvm_div_rp_d">,
199       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
200         [IntrNoMem, Commutative]>;
201
202 //
203 // Brev
204 //
205
206   def int_nvvm_brev32 : GCCBuiltin<"__nvvm_brev32">,
207       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
208   def int_nvvm_brev64 : GCCBuiltin<"__nvvm_brev64">,
209       Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
210
211 //
212 // Sad
213 //
214
215   def int_nvvm_sad_i : GCCBuiltin<"__nvvm_sad_i">,
216       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
217         [IntrNoMem, Commutative]>;
218   def int_nvvm_sad_ui : GCCBuiltin<"__nvvm_sad_ui">,
219       Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty],
220         [IntrNoMem, Commutative]>;
221
222 //
223 // Floor  Ceil
224 //
225
226   def int_nvvm_floor_ftz_f : GCCBuiltin<"__nvvm_floor_ftz_f">,
227       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
228   def int_nvvm_floor_f : GCCBuiltin<"__nvvm_floor_f">,
229       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
230   def int_nvvm_floor_d : GCCBuiltin<"__nvvm_floor_d">,
231       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
232
233   def int_nvvm_ceil_ftz_f : GCCBuiltin<"__nvvm_ceil_ftz_f">,
234       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
235   def int_nvvm_ceil_f : GCCBuiltin<"__nvvm_ceil_f">,
236       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
237   def int_nvvm_ceil_d : GCCBuiltin<"__nvvm_ceil_d">,
238       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
239
240 //
241 // Abs
242 //
243
244   def int_nvvm_abs_i : GCCBuiltin<"__nvvm_abs_i">,
245       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
246   def int_nvvm_abs_ll : GCCBuiltin<"__nvvm_abs_ll">,
247       Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem]>;
248
249   def int_nvvm_fabs_ftz_f : GCCBuiltin<"__nvvm_fabs_ftz_f">,
250       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
251   def int_nvvm_fabs_f : GCCBuiltin<"__nvvm_fabs_f">,
252       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
253
254   def int_nvvm_fabs_d : GCCBuiltin<"__nvvm_fabs_d">,
255       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
256
257 //
258 // Round
259 //
260
261   def int_nvvm_round_ftz_f : GCCBuiltin<"__nvvm_round_ftz_f">,
262       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
263   def int_nvvm_round_f : GCCBuiltin<"__nvvm_round_f">,
264       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
265
266   def int_nvvm_round_d : GCCBuiltin<"__nvvm_round_d">,
267       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
268
269 //
270 // Trunc
271 //
272
273   def int_nvvm_trunc_ftz_f : GCCBuiltin<"__nvvm_trunc_ftz_f">,
274       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
275   def int_nvvm_trunc_f : GCCBuiltin<"__nvvm_trunc_f">,
276       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
277
278   def int_nvvm_trunc_d : GCCBuiltin<"__nvvm_trunc_d">,
279       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
280
281 //
282 // Saturate
283 //
284
285   def int_nvvm_saturate_ftz_f : GCCBuiltin<"__nvvm_saturate_ftz_f">,
286       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
287   def int_nvvm_saturate_f : GCCBuiltin<"__nvvm_saturate_f">,
288       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
289
290   def int_nvvm_saturate_d : GCCBuiltin<"__nvvm_saturate_d">,
291       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
292
293 //
294 // Exp2  Log2
295 //
296
297   def int_nvvm_ex2_approx_ftz_f : GCCBuiltin<"__nvvm_ex2_approx_ftz_f">,
298       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
299   def int_nvvm_ex2_approx_f : GCCBuiltin<"__nvvm_ex2_approx_f">,
300       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
301   def int_nvvm_ex2_approx_d : GCCBuiltin<"__nvvm_ex2_approx_d">,
302       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
303
304   def int_nvvm_lg2_approx_ftz_f : GCCBuiltin<"__nvvm_lg2_approx_ftz_f">,
305       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
306   def int_nvvm_lg2_approx_f : GCCBuiltin<"__nvvm_lg2_approx_f">,
307       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
308   def int_nvvm_lg2_approx_d : GCCBuiltin<"__nvvm_lg2_approx_d">,
309       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
310
311 //
312 // Sin  Cos
313 //
314
315   def int_nvvm_sin_approx_ftz_f : GCCBuiltin<"__nvvm_sin_approx_ftz_f">,
316       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
317   def int_nvvm_sin_approx_f : GCCBuiltin<"__nvvm_sin_approx_f">,
318       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
319
320   def int_nvvm_cos_approx_ftz_f : GCCBuiltin<"__nvvm_cos_approx_ftz_f">,
321       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
322   def int_nvvm_cos_approx_f : GCCBuiltin<"__nvvm_cos_approx_f">,
323       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
324
325 //
326 // Fma
327 //
328
329   def int_nvvm_fma_rn_ftz_f : GCCBuiltin<"__nvvm_fma_rn_ftz_f">,
330       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
331         [IntrNoMem, Commutative]>;
332   def int_nvvm_fma_rn_f : GCCBuiltin<"__nvvm_fma_rn_f">,
333       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
334         [IntrNoMem, Commutative]>;
335   def int_nvvm_fma_rz_ftz_f : GCCBuiltin<"__nvvm_fma_rz_ftz_f">,
336       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
337         [IntrNoMem, Commutative]>;
338   def int_nvvm_fma_rz_f : GCCBuiltin<"__nvvm_fma_rz_f">,
339       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
340         [IntrNoMem, Commutative]>;
341   def int_nvvm_fma_rm_ftz_f : GCCBuiltin<"__nvvm_fma_rm_ftz_f">,
342       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
343         [IntrNoMem, Commutative]>;
344   def int_nvvm_fma_rm_f : GCCBuiltin<"__nvvm_fma_rm_f">,
345       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
346         [IntrNoMem, Commutative]>;
347   def int_nvvm_fma_rp_ftz_f : GCCBuiltin<"__nvvm_fma_rp_ftz_f">,
348       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
349         [IntrNoMem, Commutative]>;
350   def int_nvvm_fma_rp_f : GCCBuiltin<"__nvvm_fma_rp_f">,
351       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty, llvm_float_ty],
352         [IntrNoMem, Commutative]>;
353
354   def int_nvvm_fma_rn_d : GCCBuiltin<"__nvvm_fma_rn_d">,
355       Intrinsic<[llvm_double_ty],
356         [llvm_double_ty, llvm_double_ty, llvm_double_ty],
357         [IntrNoMem, Commutative]>;
358   def int_nvvm_fma_rz_d : GCCBuiltin<"__nvvm_fma_rz_d">,
359       Intrinsic<[llvm_double_ty],
360         [llvm_double_ty, llvm_double_ty, llvm_double_ty],
361         [IntrNoMem, Commutative]>;
362   def int_nvvm_fma_rm_d : GCCBuiltin<"__nvvm_fma_rm_d">,
363       Intrinsic<[llvm_double_ty],
364         [llvm_double_ty, llvm_double_ty, llvm_double_ty],
365         [IntrNoMem, Commutative]>;
366   def int_nvvm_fma_rp_d : GCCBuiltin<"__nvvm_fma_rp_d">,
367       Intrinsic<[llvm_double_ty],
368         [llvm_double_ty, llvm_double_ty, llvm_double_ty],
369         [IntrNoMem, Commutative]>;
370
371 //
372 // Rcp
373 //
374
375   def int_nvvm_rcp_rn_ftz_f : GCCBuiltin<"__nvvm_rcp_rn_ftz_f">,
376       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
377   def int_nvvm_rcp_rn_f : GCCBuiltin<"__nvvm_rcp_rn_f">,
378       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
379   def int_nvvm_rcp_rz_ftz_f : GCCBuiltin<"__nvvm_rcp_rz_ftz_f">,
380       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
381   def int_nvvm_rcp_rz_f : GCCBuiltin<"__nvvm_rcp_rz_f">,
382       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
383   def int_nvvm_rcp_rm_ftz_f : GCCBuiltin<"__nvvm_rcp_rm_ftz_f">,
384       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
385   def int_nvvm_rcp_rm_f : GCCBuiltin<"__nvvm_rcp_rm_f">,
386       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
387   def int_nvvm_rcp_rp_ftz_f : GCCBuiltin<"__nvvm_rcp_rp_ftz_f">,
388       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
389   def int_nvvm_rcp_rp_f : GCCBuiltin<"__nvvm_rcp_rp_f">,
390       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
391
392   def int_nvvm_rcp_rn_d : GCCBuiltin<"__nvvm_rcp_rn_d">,
393       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
394   def int_nvvm_rcp_rz_d : GCCBuiltin<"__nvvm_rcp_rz_d">,
395       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
396   def int_nvvm_rcp_rm_d : GCCBuiltin<"__nvvm_rcp_rm_d">,
397       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
398   def int_nvvm_rcp_rp_d : GCCBuiltin<"__nvvm_rcp_rp_d">,
399       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
400
401   def int_nvvm_rcp_approx_ftz_d : GCCBuiltin<"__nvvm_rcp_approx_ftz_d">,
402       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
403
404 //
405 // Sqrt
406 //
407
408   def int_nvvm_sqrt_rn_ftz_f : GCCBuiltin<"__nvvm_sqrt_rn_ftz_f">,
409       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
410   def int_nvvm_sqrt_rn_f : GCCBuiltin<"__nvvm_sqrt_rn_f">,
411       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
412   def int_nvvm_sqrt_rz_ftz_f : GCCBuiltin<"__nvvm_sqrt_rz_ftz_f">,
413       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
414   def int_nvvm_sqrt_rz_f : GCCBuiltin<"__nvvm_sqrt_rz_f">,
415       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
416   def int_nvvm_sqrt_rm_ftz_f : GCCBuiltin<"__nvvm_sqrt_rm_ftz_f">,
417       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
418   def int_nvvm_sqrt_rm_f : GCCBuiltin<"__nvvm_sqrt_rm_f">,
419       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
420   def int_nvvm_sqrt_rp_ftz_f : GCCBuiltin<"__nvvm_sqrt_rp_ftz_f">,
421       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
422   def int_nvvm_sqrt_rp_f : GCCBuiltin<"__nvvm_sqrt_rp_f">,
423       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
424   def int_nvvm_sqrt_approx_ftz_f : GCCBuiltin<"__nvvm_sqrt_approx_ftz_f">,
425       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
426   def int_nvvm_sqrt_approx_f : GCCBuiltin<"__nvvm_sqrt_approx_f">,
427       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
428
429   def int_nvvm_sqrt_rn_d : GCCBuiltin<"__nvvm_sqrt_rn_d">,
430       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
431   def int_nvvm_sqrt_rz_d : GCCBuiltin<"__nvvm_sqrt_rz_d">,
432       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
433   def int_nvvm_sqrt_rm_d : GCCBuiltin<"__nvvm_sqrt_rm_d">,
434       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
435   def int_nvvm_sqrt_rp_d : GCCBuiltin<"__nvvm_sqrt_rp_d">,
436       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
437
438 //
439 // Rsqrt
440 //
441
442   def int_nvvm_rsqrt_approx_ftz_f : GCCBuiltin<"__nvvm_rsqrt_approx_ftz_f">,
443       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
444   def int_nvvm_rsqrt_approx_f : GCCBuiltin<"__nvvm_rsqrt_approx_f">,
445       Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
446   def int_nvvm_rsqrt_approx_d : GCCBuiltin<"__nvvm_rsqrt_approx_d">,
447       Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
448
449 //
450 // Add
451 //
452
453   def int_nvvm_add_rn_ftz_f : GCCBuiltin<"__nvvm_add_rn_ftz_f">,
454       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
455         [IntrNoMem, Commutative]>;
456   def int_nvvm_add_rn_f : GCCBuiltin<"__nvvm_add_rn_f">,
457       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
458         [IntrNoMem, Commutative]>;
459   def int_nvvm_add_rz_ftz_f : GCCBuiltin<"__nvvm_add_rz_ftz_f">,
460       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
461         [IntrNoMem, Commutative]>;
462   def int_nvvm_add_rz_f : GCCBuiltin<"__nvvm_add_rz_f">,
463       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
464         [IntrNoMem, Commutative]>;
465   def int_nvvm_add_rm_ftz_f : GCCBuiltin<"__nvvm_add_rm_ftz_f">,
466       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
467         [IntrNoMem, Commutative]>;
468   def int_nvvm_add_rm_f : GCCBuiltin<"__nvvm_add_rm_f">,
469       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
470         [IntrNoMem, Commutative]>;
471   def int_nvvm_add_rp_ftz_f : GCCBuiltin<"__nvvm_add_rp_ftz_f">,
472       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
473         [IntrNoMem, Commutative]>;
474   def int_nvvm_add_rp_f : GCCBuiltin<"__nvvm_add_rp_f">,
475       Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
476         [IntrNoMem, Commutative]>;
477
478   def int_nvvm_add_rn_d : GCCBuiltin<"__nvvm_add_rn_d">,
479       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
480         [IntrNoMem, Commutative]>;
481   def int_nvvm_add_rz_d : GCCBuiltin<"__nvvm_add_rz_d">,
482       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
483         [IntrNoMem, Commutative]>;
484   def int_nvvm_add_rm_d : GCCBuiltin<"__nvvm_add_rm_d">,
485       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
486         [IntrNoMem, Commutative]>;
487   def int_nvvm_add_rp_d : GCCBuiltin<"__nvvm_add_rp_d">,
488       Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
489         [IntrNoMem, Commutative]>;
490
491 //
492 // Convert
493 //
494
495   def int_nvvm_d2f_rn_ftz : GCCBuiltin<"__nvvm_d2f_rn_ftz">,
496       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
497   def int_nvvm_d2f_rn : GCCBuiltin<"__nvvm_d2f_rn">,
498       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
499   def int_nvvm_d2f_rz_ftz : GCCBuiltin<"__nvvm_d2f_rz_ftz">,
500       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
501   def int_nvvm_d2f_rz : GCCBuiltin<"__nvvm_d2f_rz">,
502       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
503   def int_nvvm_d2f_rm_ftz : GCCBuiltin<"__nvvm_d2f_rm_ftz">,
504       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
505   def int_nvvm_d2f_rm : GCCBuiltin<"__nvvm_d2f_rm">,
506       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
507   def int_nvvm_d2f_rp_ftz : GCCBuiltin<"__nvvm_d2f_rp_ftz">,
508       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
509   def int_nvvm_d2f_rp : GCCBuiltin<"__nvvm_d2f_rp">,
510       Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
511
512   def int_nvvm_d2i_rn : GCCBuiltin<"__nvvm_d2i_rn">,
513       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
514   def int_nvvm_d2i_rz : GCCBuiltin<"__nvvm_d2i_rz">,
515       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
516   def int_nvvm_d2i_rm : GCCBuiltin<"__nvvm_d2i_rm">,
517       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
518   def int_nvvm_d2i_rp : GCCBuiltin<"__nvvm_d2i_rp">,
519       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
520
521   def int_nvvm_d2ui_rn : GCCBuiltin<"__nvvm_d2ui_rn">,
522       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
523   def int_nvvm_d2ui_rz : GCCBuiltin<"__nvvm_d2ui_rz">,
524       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
525   def int_nvvm_d2ui_rm : GCCBuiltin<"__nvvm_d2ui_rm">,
526       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
527   def int_nvvm_d2ui_rp : GCCBuiltin<"__nvvm_d2ui_rp">,
528       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
529
530   def int_nvvm_i2d_rn : GCCBuiltin<"__nvvm_i2d_rn">,
531       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
532   def int_nvvm_i2d_rz : GCCBuiltin<"__nvvm_i2d_rz">,
533       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
534   def int_nvvm_i2d_rm : GCCBuiltin<"__nvvm_i2d_rm">,
535       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
536   def int_nvvm_i2d_rp : GCCBuiltin<"__nvvm_i2d_rp">,
537       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
538
539   def int_nvvm_ui2d_rn : GCCBuiltin<"__nvvm_ui2d_rn">,
540       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
541   def int_nvvm_ui2d_rz : GCCBuiltin<"__nvvm_ui2d_rz">,
542       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
543   def int_nvvm_ui2d_rm : GCCBuiltin<"__nvvm_ui2d_rm">,
544       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
545   def int_nvvm_ui2d_rp : GCCBuiltin<"__nvvm_ui2d_rp">,
546       Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
547
548   def int_nvvm_f2i_rn_ftz : GCCBuiltin<"__nvvm_f2i_rn_ftz">,
549       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
550   def int_nvvm_f2i_rn : GCCBuiltin<"__nvvm_f2i_rn">,
551       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
552   def int_nvvm_f2i_rz_ftz : GCCBuiltin<"__nvvm_f2i_rz_ftz">,
553       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
554   def int_nvvm_f2i_rz : GCCBuiltin<"__nvvm_f2i_rz">,
555       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
556   def int_nvvm_f2i_rm_ftz : GCCBuiltin<"__nvvm_f2i_rm_ftz">,
557       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
558   def int_nvvm_f2i_rm : GCCBuiltin<"__nvvm_f2i_rm">,
559       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
560   def int_nvvm_f2i_rp_ftz : GCCBuiltin<"__nvvm_f2i_rp_ftz">,
561       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
562   def int_nvvm_f2i_rp : GCCBuiltin<"__nvvm_f2i_rp">,
563       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
564
565   def int_nvvm_f2ui_rn_ftz : GCCBuiltin<"__nvvm_f2ui_rn_ftz">,
566       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
567   def int_nvvm_f2ui_rn : GCCBuiltin<"__nvvm_f2ui_rn">,
568       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
569   def int_nvvm_f2ui_rz_ftz : GCCBuiltin<"__nvvm_f2ui_rz_ftz">,
570       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
571   def int_nvvm_f2ui_rz : GCCBuiltin<"__nvvm_f2ui_rz">,
572       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
573   def int_nvvm_f2ui_rm_ftz : GCCBuiltin<"__nvvm_f2ui_rm_ftz">,
574       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
575   def int_nvvm_f2ui_rm : GCCBuiltin<"__nvvm_f2ui_rm">,
576       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
577   def int_nvvm_f2ui_rp_ftz : GCCBuiltin<"__nvvm_f2ui_rp_ftz">,
578       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
579   def int_nvvm_f2ui_rp : GCCBuiltin<"__nvvm_f2ui_rp">,
580       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
581
582   def int_nvvm_i2f_rn : GCCBuiltin<"__nvvm_i2f_rn">,
583       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
584   def int_nvvm_i2f_rz : GCCBuiltin<"__nvvm_i2f_rz">,
585       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
586   def int_nvvm_i2f_rm : GCCBuiltin<"__nvvm_i2f_rm">,
587       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
588   def int_nvvm_i2f_rp : GCCBuiltin<"__nvvm_i2f_rp">,
589       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
590
591   def int_nvvm_ui2f_rn : GCCBuiltin<"__nvvm_ui2f_rn">,
592       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
593   def int_nvvm_ui2f_rz : GCCBuiltin<"__nvvm_ui2f_rz">,
594       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
595   def int_nvvm_ui2f_rm : GCCBuiltin<"__nvvm_ui2f_rm">,
596       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
597   def int_nvvm_ui2f_rp : GCCBuiltin<"__nvvm_ui2f_rp">,
598       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
599
600   def int_nvvm_lohi_i2d : GCCBuiltin<"__nvvm_lohi_i2d">,
601       Intrinsic<[llvm_double_ty], [llvm_i32_ty, llvm_i32_ty],
602         [IntrNoMem, Commutative]>;
603
604   def int_nvvm_d2i_lo : GCCBuiltin<"__nvvm_d2i_lo">,
605       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
606   def int_nvvm_d2i_hi : GCCBuiltin<"__nvvm_d2i_hi">,
607       Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
608
609   def int_nvvm_f2ll_rn_ftz : GCCBuiltin<"__nvvm_f2ll_rn_ftz">,
610       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
611   def int_nvvm_f2ll_rn : GCCBuiltin<"__nvvm_f2ll_rn">,
612       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
613   def int_nvvm_f2ll_rz_ftz : GCCBuiltin<"__nvvm_f2ll_rz_ftz">,
614       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
615   def int_nvvm_f2ll_rz : GCCBuiltin<"__nvvm_f2ll_rz">,
616       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
617   def int_nvvm_f2ll_rm_ftz : GCCBuiltin<"__nvvm_f2ll_rm_ftz">,
618       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
619   def int_nvvm_f2ll_rm : GCCBuiltin<"__nvvm_f2ll_rm">,
620       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
621   def int_nvvm_f2ll_rp_ftz : GCCBuiltin<"__nvvm_f2ll_rp_ftz">,
622       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
623   def int_nvvm_f2ll_rp : GCCBuiltin<"__nvvm_f2ll_rp">,
624       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
625
626   def int_nvvm_f2ull_rn_ftz : GCCBuiltin<"__nvvm_f2ull_rn_ftz">,
627       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
628   def int_nvvm_f2ull_rn : GCCBuiltin<"__nvvm_f2ull_rn">,
629       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
630   def int_nvvm_f2ull_rz_ftz : GCCBuiltin<"__nvvm_f2ull_rz_ftz">,
631       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
632   def int_nvvm_f2ull_rz : GCCBuiltin<"__nvvm_f2ull_rz">,
633       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
634   def int_nvvm_f2ull_rm_ftz : GCCBuiltin<"__nvvm_f2ull_rm_ftz">,
635       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
636   def int_nvvm_f2ull_rm : GCCBuiltin<"__nvvm_f2ull_rm">,
637       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
638   def int_nvvm_f2ull_rp_ftz : GCCBuiltin<"__nvvm_f2ull_rp_ftz">,
639       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
640   def int_nvvm_f2ull_rp : GCCBuiltin<"__nvvm_f2ull_rp">,
641       Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
642
643   def int_nvvm_d2ll_rn : GCCBuiltin<"__nvvm_d2ll_rn">,
644       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
645   def int_nvvm_d2ll_rz : GCCBuiltin<"__nvvm_d2ll_rz">,
646       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
647   def int_nvvm_d2ll_rm : GCCBuiltin<"__nvvm_d2ll_rm">,
648       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
649   def int_nvvm_d2ll_rp : GCCBuiltin<"__nvvm_d2ll_rp">,
650       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
651
652   def int_nvvm_d2ull_rn : GCCBuiltin<"__nvvm_d2ull_rn">,
653       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
654   def int_nvvm_d2ull_rz : GCCBuiltin<"__nvvm_d2ull_rz">,
655       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
656   def int_nvvm_d2ull_rm : GCCBuiltin<"__nvvm_d2ull_rm">,
657       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
658   def int_nvvm_d2ull_rp : GCCBuiltin<"__nvvm_d2ull_rp">,
659       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
660
661   def int_nvvm_ll2f_rn : GCCBuiltin<"__nvvm_ll2f_rn">,
662       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
663   def int_nvvm_ll2f_rz : GCCBuiltin<"__nvvm_ll2f_rz">,
664       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
665   def int_nvvm_ll2f_rm : GCCBuiltin<"__nvvm_ll2f_rm">,
666       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
667   def int_nvvm_ll2f_rp : GCCBuiltin<"__nvvm_ll2f_rp">,
668       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
669   def int_nvvm_ull2f_rn : GCCBuiltin<"__nvvm_ull2f_rn">,
670       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
671   def int_nvvm_ull2f_rz : GCCBuiltin<"__nvvm_ull2f_rz">,
672       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
673   def int_nvvm_ull2f_rm : GCCBuiltin<"__nvvm_ull2f_rm">,
674       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
675   def int_nvvm_ull2f_rp : GCCBuiltin<"__nvvm_ull2f_rp">,
676       Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
677
678   def int_nvvm_ll2d_rn : GCCBuiltin<"__nvvm_ll2d_rn">,
679       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
680   def int_nvvm_ll2d_rz : GCCBuiltin<"__nvvm_ll2d_rz">,
681       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
682   def int_nvvm_ll2d_rm : GCCBuiltin<"__nvvm_ll2d_rm">,
683       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
684   def int_nvvm_ll2d_rp : GCCBuiltin<"__nvvm_ll2d_rp">,
685       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
686   def int_nvvm_ull2d_rn : GCCBuiltin<"__nvvm_ull2d_rn">,
687       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
688   def int_nvvm_ull2d_rz : GCCBuiltin<"__nvvm_ull2d_rz">,
689       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
690   def int_nvvm_ull2d_rm : GCCBuiltin<"__nvvm_ull2d_rm">,
691       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
692   def int_nvvm_ull2d_rp : GCCBuiltin<"__nvvm_ull2d_rp">,
693       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
694
695   def int_nvvm_f2h_rn_ftz : GCCBuiltin<"__nvvm_f2h_rn_ftz">,
696       Intrinsic<[llvm_i16_ty], [llvm_float_ty], [IntrNoMem]>;
697   def int_nvvm_f2h_rn : GCCBuiltin<"__nvvm_f2h_rn">,
698       Intrinsic<[llvm_i16_ty], [llvm_float_ty], [IntrNoMem]>;
699
700   def int_nvvm_h2f : GCCBuiltin<"__nvvm_h2f">,
701       Intrinsic<[llvm_float_ty], [llvm_i16_ty], [IntrNoMem]>;
702
703 //
704 // Bitcast
705 //
706
707   def int_nvvm_bitcast_f2i : GCCBuiltin<"__nvvm_bitcast_f2i">,
708       Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
709   def int_nvvm_bitcast_i2f : GCCBuiltin<"__nvvm_bitcast_i2f">,
710       Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
711
712   def int_nvvm_bitcast_ll2d : GCCBuiltin<"__nvvm_bitcast_ll2d">,
713       Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
714   def int_nvvm_bitcast_d2ll : GCCBuiltin<"__nvvm_bitcast_d2ll">,
715       Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
716
717
718 // Atomic not available as an llvm intrinsic.
719   def int_nvvm_atomic_load_add_f32 : Intrinsic<[llvm_float_ty],
720           [LLVMAnyPointerType<llvm_float_ty>, llvm_float_ty],
721                                       [IntrReadWriteArgMem, NoCapture<0>]>;
722   def int_nvvm_atomic_load_inc_32 : Intrinsic<[llvm_i32_ty],
723           [LLVMAnyPointerType<llvm_i32_ty>, llvm_i32_ty],
724                                       [IntrReadWriteArgMem, NoCapture<0>]>;
725   def int_nvvm_atomic_load_dec_32 : Intrinsic<[llvm_i32_ty],
726           [LLVMAnyPointerType<llvm_i32_ty>, llvm_i32_ty],
727                                       [IntrReadWriteArgMem, NoCapture<0>]>;
728
729 // Bar.Sync
730   def int_cuda_syncthreads : GCCBuiltin<"__syncthreads">,
731       Intrinsic<[], [], []>;
732   def int_nvvm_barrier0 : GCCBuiltin<"__nvvm_bar0">,
733       Intrinsic<[], [], []>;
734   def int_nvvm_barrier0_popc : GCCBuiltin<"__nvvm_bar0_popc">,
735       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
736   def int_nvvm_barrier0_and : GCCBuiltin<"__nvvm_bar0_and">,
737       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
738   def int_nvvm_barrier0_or : GCCBuiltin<"__nvvm_bar0_or">,
739       Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
740
741   // Membar
742   def int_nvvm_membar_cta : GCCBuiltin<"__nvvm_membar_cta">,
743       Intrinsic<[], [], []>;
744   def int_nvvm_membar_gl : GCCBuiltin<"__nvvm_membar_gl">,
745       Intrinsic<[], [], []>;
746   def int_nvvm_membar_sys : GCCBuiltin<"__nvvm_membar_sys">,
747       Intrinsic<[], [], []>;
748
749
750 // Accessing special registers
751   def int_nvvm_read_ptx_sreg_tid_x :
752       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
753       GCCBuiltin<"__nvvm_read_ptx_sreg_tid_x">;
754   def int_nvvm_read_ptx_sreg_tid_y :
755       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
756       GCCBuiltin<"__nvvm_read_ptx_sreg_tid_y">;
757   def int_nvvm_read_ptx_sreg_tid_z :
758       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
759       GCCBuiltin<"__nvvm_read_ptx_sreg_tid_z">;
760
761   def int_nvvm_read_ptx_sreg_ntid_x :
762       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
763       GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_x">;
764   def int_nvvm_read_ptx_sreg_ntid_y :
765       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
766       GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_y">;
767   def int_nvvm_read_ptx_sreg_ntid_z :
768       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
769       GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_z">;
770
771   def int_nvvm_read_ptx_sreg_ctaid_x :
772       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
773       GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_x">;
774   def int_nvvm_read_ptx_sreg_ctaid_y :
775       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
776       GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_y">;
777   def int_nvvm_read_ptx_sreg_ctaid_z :
778       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
779       GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_z">;
780
781   def int_nvvm_read_ptx_sreg_nctaid_x :
782       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
783       GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_x">;
784   def int_nvvm_read_ptx_sreg_nctaid_y :
785       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
786       GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_y">;
787   def int_nvvm_read_ptx_sreg_nctaid_z :
788       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
789       GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_z">;
790
791   def int_nvvm_read_ptx_sreg_warpsize :
792       Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
793       GCCBuiltin<"__nvvm_read_ptx_sreg_warpsize">;
794
795
796 // Generated within nvvm. Use for ldu on sm_20 or later
797 // @TODO: Revisit this, Changed LLVMAnyPointerType to LLVMPointerType
798 def int_nvvm_ldu_global_i : Intrinsic<[llvm_anyint_ty],
799   [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
800   "llvm.nvvm.ldu.global.i">;
801 def int_nvvm_ldu_global_f : Intrinsic<[llvm_anyfloat_ty],
802   [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
803   "llvm.nvvm.ldu.global.f">;
804 def int_nvvm_ldu_global_p : Intrinsic<[llvm_anyptr_ty],
805   [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
806   "llvm.nvvm.ldu.global.p">;
807
808
809 // Use for generic pointers
810 // - These intrinsics are used to convert address spaces.
811 // - The input pointer and output pointer must have the same type, except for
812 //   the address-space. (This restriction is not enforced here as there is
813 //   currently no way to describe it).
814 // - This complements the llvm bitcast, which can be used to cast one type
815 //   of pointer to another type of pointer, while the address space remains
816 //   the same.
817 def int_nvvm_ptr_local_to_gen: Intrinsic<[llvm_anyptr_ty],
818                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
819                  "llvm.nvvm.ptr.local.to.gen">;
820 def int_nvvm_ptr_shared_to_gen: Intrinsic<[llvm_anyptr_ty],
821                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
822                  "llvm.nvvm.ptr.shared.to.gen">;
823 def int_nvvm_ptr_global_to_gen: Intrinsic<[llvm_anyptr_ty],
824                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
825                  "llvm.nvvm.ptr.global.to.gen">;
826 def int_nvvm_ptr_constant_to_gen: Intrinsic<[llvm_anyptr_ty],
827                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
828                  "llvm.nvvm.ptr.constant.to.gen">;
829
830 def int_nvvm_ptr_gen_to_global: Intrinsic<[llvm_anyptr_ty],
831                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
832                  "llvm.nvvm.ptr.gen.to.global">;
833 def int_nvvm_ptr_gen_to_shared: Intrinsic<[llvm_anyptr_ty],
834                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
835                  "llvm.nvvm.ptr.gen.to.shared">;
836 def int_nvvm_ptr_gen_to_local: Intrinsic<[llvm_anyptr_ty],
837                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
838                  "llvm.nvvm.ptr.gen.to.local">;
839 def int_nvvm_ptr_gen_to_constant: Intrinsic<[llvm_anyptr_ty],
840                  [llvm_anyptr_ty], [IntrNoMem, NoCapture<0>],
841                  "llvm.nvvm.ptr.gen.to.constant">;
842
843 // Used in nvvm internally to help address space opt and ptx code generation
844 // This is for params that are passed to kernel functions by pointer by-val.
845 def int_nvvm_ptr_gen_to_param: Intrinsic<[llvm_anyptr_ty],
846                                      [llvm_anyptr_ty],
847                                    [IntrNoMem, NoCapture<0>],
848                                    "llvm.nvvm.ptr.gen.to.param">;
849
850 // Move intrinsics, used in nvvm internally
851
852 def int_nvvm_move_i8 : Intrinsic<[llvm_i8_ty], [llvm_i8_ty], [IntrNoMem],
853   "llvm.nvvm.move.i8">;
854 def int_nvvm_move_i16 : Intrinsic<[llvm_i16_ty], [llvm_i16_ty], [IntrNoMem],
855   "llvm.nvvm.move.i16">;
856 def int_nvvm_move_i32 : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem],
857   "llvm.nvvm.move.i32">;
858 def int_nvvm_move_i64 : Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem],
859   "llvm.nvvm.move.i64">;
860 def int_nvvm_move_float : Intrinsic<[llvm_float_ty], [llvm_float_ty],
861   [IntrNoMem], "llvm.nvvm.move.float">;
862 def int_nvvm_move_double : Intrinsic<[llvm_double_ty], [llvm_double_ty],
863   [IntrNoMem], "llvm.nvvm.move.double">;
864 def int_nvvm_move_ptr : Intrinsic<[llvm_anyptr_ty], [llvm_anyptr_ty],
865   [IntrNoMem, NoCapture<0>], "llvm.nvvm.move.ptr">;
866
867
868 /// Error / Warn
869 def int_nvvm_compiler_error :
870     Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.error">;
871 def int_nvvm_compiler_warn :
872     Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.warn">;
873
874
875 // Old PTX back-end intrinsics retained here for backwards-compatibility
876
877 multiclass PTXReadSpecialRegisterIntrinsic_v4i32<string prefix> {
878 // FIXME: Do we need the 128-bit integer type version?
879 //    def _r64   : Intrinsic<[llvm_i128_ty],   [], [IntrNoMem]>;
880
881 // FIXME: Enable this once v4i32 support is enabled in back-end.
882 //    def _v4i16 : Intrinsic<[llvm_v4i32_ty], [], [IntrNoMem]>;
883
884   def _x     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
885                GCCBuiltin<!strconcat(prefix, "_x")>;
886   def _y     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
887                GCCBuiltin<!strconcat(prefix, "_y")>;
888   def _z     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
889                GCCBuiltin<!strconcat(prefix, "_z")>;
890   def _w     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
891                GCCBuiltin<!strconcat(prefix, "_w")>;
892 }
893
894 class PTXReadSpecialRegisterIntrinsic_r32<string name>
895   : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
896     GCCBuiltin<name>;
897
898 class PTXReadSpecialRegisterIntrinsic_r64<string name>
899   : Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>,
900     GCCBuiltin<name>;
901
902 defm int_ptx_read_tid        : PTXReadSpecialRegisterIntrinsic_v4i32
903                                <"__builtin_ptx_read_tid">;
904 defm int_ptx_read_ntid       : PTXReadSpecialRegisterIntrinsic_v4i32
905                                <"__builtin_ptx_read_ntid">;
906
907 def int_ptx_read_laneid      : PTXReadSpecialRegisterIntrinsic_r32
908                                <"__builtin_ptx_read_laneid">;
909 def int_ptx_read_warpid      : PTXReadSpecialRegisterIntrinsic_r32
910                                <"__builtin_ptx_read_warpid">;
911 def int_ptx_read_nwarpid     : PTXReadSpecialRegisterIntrinsic_r32
912                                <"__builtin_ptx_read_nwarpid">;
913
914 defm int_ptx_read_ctaid      : PTXReadSpecialRegisterIntrinsic_v4i32
915                                <"__builtin_ptx_read_ctaid">;
916 defm int_ptx_read_nctaid     : PTXReadSpecialRegisterIntrinsic_v4i32
917                                <"__builtin_ptx_read_nctaid">;
918
919 def int_ptx_read_smid        : PTXReadSpecialRegisterIntrinsic_r32
920                                <"__builtin_ptx_read_smid">;
921 def int_ptx_read_nsmid       : PTXReadSpecialRegisterIntrinsic_r32
922                                <"__builtin_ptx_read_nsmid">;
923 def int_ptx_read_gridid      : PTXReadSpecialRegisterIntrinsic_r32
924                                <"__builtin_ptx_read_gridid">;
925
926 def int_ptx_read_lanemask_eq : PTXReadSpecialRegisterIntrinsic_r32
927                                <"__builtin_ptx_read_lanemask_eq">;
928 def int_ptx_read_lanemask_le : PTXReadSpecialRegisterIntrinsic_r32
929                                <"__builtin_ptx_read_lanemask_le">;
930 def int_ptx_read_lanemask_lt : PTXReadSpecialRegisterIntrinsic_r32
931                                <"__builtin_ptx_read_lanemask_lt">;
932 def int_ptx_read_lanemask_ge : PTXReadSpecialRegisterIntrinsic_r32
933                                <"__builtin_ptx_read_lanemask_ge">;
934 def int_ptx_read_lanemask_gt : PTXReadSpecialRegisterIntrinsic_r32
935                                <"__builtin_ptx_read_lanemask_gt">;
936
937 def int_ptx_read_clock       : PTXReadSpecialRegisterIntrinsic_r32
938                                <"__builtin_ptx_read_clock">;
939 def int_ptx_read_clock64     : PTXReadSpecialRegisterIntrinsic_r64
940                                <"__builtin_ptx_read_clock64">;
941
942 def int_ptx_read_pm0         : PTXReadSpecialRegisterIntrinsic_r32
943                                <"__builtin_ptx_read_pm0">;
944 def int_ptx_read_pm1         : PTXReadSpecialRegisterIntrinsic_r32
945                                <"__builtin_ptx_read_pm1">;
946 def int_ptx_read_pm2         : PTXReadSpecialRegisterIntrinsic_r32
947                                <"__builtin_ptx_read_pm2">;
948 def int_ptx_read_pm3         : PTXReadSpecialRegisterIntrinsic_r32
949                                <"__builtin_ptx_read_pm3">;
950
951 def int_ptx_bar_sync : Intrinsic<[], [llvm_i32_ty], []>,
952                        GCCBuiltin<"__builtin_ptx_bar_sync">;