IntrinsicsNVVM.td revision 263508
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
14def 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_f : GCCBuiltin<"__nvvm_sqrt_f">,
409      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
410  def int_nvvm_sqrt_rn_ftz_f : GCCBuiltin<"__nvvm_sqrt_rn_ftz_f">,
411      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
412  def int_nvvm_sqrt_rn_f : GCCBuiltin<"__nvvm_sqrt_rn_f">,
413      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
414  def int_nvvm_sqrt_rz_ftz_f : GCCBuiltin<"__nvvm_sqrt_rz_ftz_f">,
415      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
416  def int_nvvm_sqrt_rz_f : GCCBuiltin<"__nvvm_sqrt_rz_f">,
417      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
418  def int_nvvm_sqrt_rm_ftz_f : GCCBuiltin<"__nvvm_sqrt_rm_ftz_f">,
419      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
420  def int_nvvm_sqrt_rm_f : GCCBuiltin<"__nvvm_sqrt_rm_f">,
421      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
422  def int_nvvm_sqrt_rp_ftz_f : GCCBuiltin<"__nvvm_sqrt_rp_ftz_f">,
423      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
424  def int_nvvm_sqrt_rp_f : GCCBuiltin<"__nvvm_sqrt_rp_f">,
425      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
426  def int_nvvm_sqrt_approx_ftz_f : GCCBuiltin<"__nvvm_sqrt_approx_ftz_f">,
427      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
428  def int_nvvm_sqrt_approx_f : GCCBuiltin<"__nvvm_sqrt_approx_f">,
429      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
430
431  def int_nvvm_sqrt_rn_d : GCCBuiltin<"__nvvm_sqrt_rn_d">,
432      Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
433  def int_nvvm_sqrt_rz_d : GCCBuiltin<"__nvvm_sqrt_rz_d">,
434      Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
435  def int_nvvm_sqrt_rm_d : GCCBuiltin<"__nvvm_sqrt_rm_d">,
436      Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
437  def int_nvvm_sqrt_rp_d : GCCBuiltin<"__nvvm_sqrt_rp_d">,
438      Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
439
440//
441// Rsqrt
442//
443
444  def int_nvvm_rsqrt_approx_ftz_f : GCCBuiltin<"__nvvm_rsqrt_approx_ftz_f">,
445      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
446  def int_nvvm_rsqrt_approx_f : GCCBuiltin<"__nvvm_rsqrt_approx_f">,
447      Intrinsic<[llvm_float_ty], [llvm_float_ty], [IntrNoMem]>;
448  def int_nvvm_rsqrt_approx_d : GCCBuiltin<"__nvvm_rsqrt_approx_d">,
449      Intrinsic<[llvm_double_ty], [llvm_double_ty], [IntrNoMem]>;
450
451//
452// Add
453//
454
455  def int_nvvm_add_rn_ftz_f : GCCBuiltin<"__nvvm_add_rn_ftz_f">,
456      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
457        [IntrNoMem, Commutative]>;
458  def int_nvvm_add_rn_f : GCCBuiltin<"__nvvm_add_rn_f">,
459      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
460        [IntrNoMem, Commutative]>;
461  def int_nvvm_add_rz_ftz_f : GCCBuiltin<"__nvvm_add_rz_ftz_f">,
462      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
463        [IntrNoMem, Commutative]>;
464  def int_nvvm_add_rz_f : GCCBuiltin<"__nvvm_add_rz_f">,
465      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
466        [IntrNoMem, Commutative]>;
467  def int_nvvm_add_rm_ftz_f : GCCBuiltin<"__nvvm_add_rm_ftz_f">,
468      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
469        [IntrNoMem, Commutative]>;
470  def int_nvvm_add_rm_f : GCCBuiltin<"__nvvm_add_rm_f">,
471      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
472        [IntrNoMem, Commutative]>;
473  def int_nvvm_add_rp_ftz_f : GCCBuiltin<"__nvvm_add_rp_ftz_f">,
474      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
475        [IntrNoMem, Commutative]>;
476  def int_nvvm_add_rp_f : GCCBuiltin<"__nvvm_add_rp_f">,
477      Intrinsic<[llvm_float_ty], [llvm_float_ty, llvm_float_ty],
478        [IntrNoMem, Commutative]>;
479
480  def int_nvvm_add_rn_d : GCCBuiltin<"__nvvm_add_rn_d">,
481      Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
482        [IntrNoMem, Commutative]>;
483  def int_nvvm_add_rz_d : GCCBuiltin<"__nvvm_add_rz_d">,
484      Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
485        [IntrNoMem, Commutative]>;
486  def int_nvvm_add_rm_d : GCCBuiltin<"__nvvm_add_rm_d">,
487      Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
488        [IntrNoMem, Commutative]>;
489  def int_nvvm_add_rp_d : GCCBuiltin<"__nvvm_add_rp_d">,
490      Intrinsic<[llvm_double_ty], [llvm_double_ty, llvm_double_ty],
491        [IntrNoMem, Commutative]>;
492
493//
494// Convert
495//
496
497  def int_nvvm_d2f_rn_ftz : GCCBuiltin<"__nvvm_d2f_rn_ftz">,
498      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
499  def int_nvvm_d2f_rn : GCCBuiltin<"__nvvm_d2f_rn">,
500      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
501  def int_nvvm_d2f_rz_ftz : GCCBuiltin<"__nvvm_d2f_rz_ftz">,
502      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
503  def int_nvvm_d2f_rz : GCCBuiltin<"__nvvm_d2f_rz">,
504      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
505  def int_nvvm_d2f_rm_ftz : GCCBuiltin<"__nvvm_d2f_rm_ftz">,
506      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
507  def int_nvvm_d2f_rm : GCCBuiltin<"__nvvm_d2f_rm">,
508      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
509  def int_nvvm_d2f_rp_ftz : GCCBuiltin<"__nvvm_d2f_rp_ftz">,
510      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
511  def int_nvvm_d2f_rp : GCCBuiltin<"__nvvm_d2f_rp">,
512      Intrinsic<[llvm_float_ty], [llvm_double_ty], [IntrNoMem]>;
513
514  def int_nvvm_d2i_rn : GCCBuiltin<"__nvvm_d2i_rn">,
515      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
516  def int_nvvm_d2i_rz : GCCBuiltin<"__nvvm_d2i_rz">,
517      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
518  def int_nvvm_d2i_rm : GCCBuiltin<"__nvvm_d2i_rm">,
519      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
520  def int_nvvm_d2i_rp : GCCBuiltin<"__nvvm_d2i_rp">,
521      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
522
523  def int_nvvm_d2ui_rn : GCCBuiltin<"__nvvm_d2ui_rn">,
524      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
525  def int_nvvm_d2ui_rz : GCCBuiltin<"__nvvm_d2ui_rz">,
526      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
527  def int_nvvm_d2ui_rm : GCCBuiltin<"__nvvm_d2ui_rm">,
528      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
529  def int_nvvm_d2ui_rp : GCCBuiltin<"__nvvm_d2ui_rp">,
530      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
531
532  def int_nvvm_i2d_rn : GCCBuiltin<"__nvvm_i2d_rn">,
533      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
534  def int_nvvm_i2d_rz : GCCBuiltin<"__nvvm_i2d_rz">,
535      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
536  def int_nvvm_i2d_rm : GCCBuiltin<"__nvvm_i2d_rm">,
537      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
538  def int_nvvm_i2d_rp : GCCBuiltin<"__nvvm_i2d_rp">,
539      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
540
541  def int_nvvm_ui2d_rn : GCCBuiltin<"__nvvm_ui2d_rn">,
542      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
543  def int_nvvm_ui2d_rz : GCCBuiltin<"__nvvm_ui2d_rz">,
544      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
545  def int_nvvm_ui2d_rm : GCCBuiltin<"__nvvm_ui2d_rm">,
546      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
547  def int_nvvm_ui2d_rp : GCCBuiltin<"__nvvm_ui2d_rp">,
548      Intrinsic<[llvm_double_ty], [llvm_i32_ty], [IntrNoMem]>;
549
550  def int_nvvm_f2i_rn_ftz : GCCBuiltin<"__nvvm_f2i_rn_ftz">,
551      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
552  def int_nvvm_f2i_rn : GCCBuiltin<"__nvvm_f2i_rn">,
553      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
554  def int_nvvm_f2i_rz_ftz : GCCBuiltin<"__nvvm_f2i_rz_ftz">,
555      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
556  def int_nvvm_f2i_rz : GCCBuiltin<"__nvvm_f2i_rz">,
557      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
558  def int_nvvm_f2i_rm_ftz : GCCBuiltin<"__nvvm_f2i_rm_ftz">,
559      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
560  def int_nvvm_f2i_rm : GCCBuiltin<"__nvvm_f2i_rm">,
561      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
562  def int_nvvm_f2i_rp_ftz : GCCBuiltin<"__nvvm_f2i_rp_ftz">,
563      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
564  def int_nvvm_f2i_rp : GCCBuiltin<"__nvvm_f2i_rp">,
565      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
566
567  def int_nvvm_f2ui_rn_ftz : GCCBuiltin<"__nvvm_f2ui_rn_ftz">,
568      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
569  def int_nvvm_f2ui_rn : GCCBuiltin<"__nvvm_f2ui_rn">,
570      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
571  def int_nvvm_f2ui_rz_ftz : GCCBuiltin<"__nvvm_f2ui_rz_ftz">,
572      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
573  def int_nvvm_f2ui_rz : GCCBuiltin<"__nvvm_f2ui_rz">,
574      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
575  def int_nvvm_f2ui_rm_ftz : GCCBuiltin<"__nvvm_f2ui_rm_ftz">,
576      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
577  def int_nvvm_f2ui_rm : GCCBuiltin<"__nvvm_f2ui_rm">,
578      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
579  def int_nvvm_f2ui_rp_ftz : GCCBuiltin<"__nvvm_f2ui_rp_ftz">,
580      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
581  def int_nvvm_f2ui_rp : GCCBuiltin<"__nvvm_f2ui_rp">,
582      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
583
584  def int_nvvm_i2f_rn : GCCBuiltin<"__nvvm_i2f_rn">,
585      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
586  def int_nvvm_i2f_rz : GCCBuiltin<"__nvvm_i2f_rz">,
587      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
588  def int_nvvm_i2f_rm : GCCBuiltin<"__nvvm_i2f_rm">,
589      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
590  def int_nvvm_i2f_rp : GCCBuiltin<"__nvvm_i2f_rp">,
591      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
592
593  def int_nvvm_ui2f_rn : GCCBuiltin<"__nvvm_ui2f_rn">,
594      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
595  def int_nvvm_ui2f_rz : GCCBuiltin<"__nvvm_ui2f_rz">,
596      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
597  def int_nvvm_ui2f_rm : GCCBuiltin<"__nvvm_ui2f_rm">,
598      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
599  def int_nvvm_ui2f_rp : GCCBuiltin<"__nvvm_ui2f_rp">,
600      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
601
602  def int_nvvm_lohi_i2d : GCCBuiltin<"__nvvm_lohi_i2d">,
603      Intrinsic<[llvm_double_ty], [llvm_i32_ty, llvm_i32_ty],
604        [IntrNoMem, Commutative]>;
605
606  def int_nvvm_d2i_lo : GCCBuiltin<"__nvvm_d2i_lo">,
607      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
608  def int_nvvm_d2i_hi : GCCBuiltin<"__nvvm_d2i_hi">,
609      Intrinsic<[llvm_i32_ty], [llvm_double_ty], [IntrNoMem]>;
610
611  def int_nvvm_f2ll_rn_ftz : GCCBuiltin<"__nvvm_f2ll_rn_ftz">,
612      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
613  def int_nvvm_f2ll_rn : GCCBuiltin<"__nvvm_f2ll_rn">,
614      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
615  def int_nvvm_f2ll_rz_ftz : GCCBuiltin<"__nvvm_f2ll_rz_ftz">,
616      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
617  def int_nvvm_f2ll_rz : GCCBuiltin<"__nvvm_f2ll_rz">,
618      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
619  def int_nvvm_f2ll_rm_ftz : GCCBuiltin<"__nvvm_f2ll_rm_ftz">,
620      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
621  def int_nvvm_f2ll_rm : GCCBuiltin<"__nvvm_f2ll_rm">,
622      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
623  def int_nvvm_f2ll_rp_ftz : GCCBuiltin<"__nvvm_f2ll_rp_ftz">,
624      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
625  def int_nvvm_f2ll_rp : GCCBuiltin<"__nvvm_f2ll_rp">,
626      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
627
628  def int_nvvm_f2ull_rn_ftz : GCCBuiltin<"__nvvm_f2ull_rn_ftz">,
629      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
630  def int_nvvm_f2ull_rn : GCCBuiltin<"__nvvm_f2ull_rn">,
631      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
632  def int_nvvm_f2ull_rz_ftz : GCCBuiltin<"__nvvm_f2ull_rz_ftz">,
633      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
634  def int_nvvm_f2ull_rz : GCCBuiltin<"__nvvm_f2ull_rz">,
635      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
636  def int_nvvm_f2ull_rm_ftz : GCCBuiltin<"__nvvm_f2ull_rm_ftz">,
637      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
638  def int_nvvm_f2ull_rm : GCCBuiltin<"__nvvm_f2ull_rm">,
639      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
640  def int_nvvm_f2ull_rp_ftz : GCCBuiltin<"__nvvm_f2ull_rp_ftz">,
641      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
642  def int_nvvm_f2ull_rp : GCCBuiltin<"__nvvm_f2ull_rp">,
643      Intrinsic<[llvm_i64_ty], [llvm_float_ty], [IntrNoMem]>;
644
645  def int_nvvm_d2ll_rn : GCCBuiltin<"__nvvm_d2ll_rn">,
646      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
647  def int_nvvm_d2ll_rz : GCCBuiltin<"__nvvm_d2ll_rz">,
648      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
649  def int_nvvm_d2ll_rm : GCCBuiltin<"__nvvm_d2ll_rm">,
650      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
651  def int_nvvm_d2ll_rp : GCCBuiltin<"__nvvm_d2ll_rp">,
652      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
653
654  def int_nvvm_d2ull_rn : GCCBuiltin<"__nvvm_d2ull_rn">,
655      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
656  def int_nvvm_d2ull_rz : GCCBuiltin<"__nvvm_d2ull_rz">,
657      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
658  def int_nvvm_d2ull_rm : GCCBuiltin<"__nvvm_d2ull_rm">,
659      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
660  def int_nvvm_d2ull_rp : GCCBuiltin<"__nvvm_d2ull_rp">,
661      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
662
663  def int_nvvm_ll2f_rn : GCCBuiltin<"__nvvm_ll2f_rn">,
664      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
665  def int_nvvm_ll2f_rz : GCCBuiltin<"__nvvm_ll2f_rz">,
666      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
667  def int_nvvm_ll2f_rm : GCCBuiltin<"__nvvm_ll2f_rm">,
668      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
669  def int_nvvm_ll2f_rp : GCCBuiltin<"__nvvm_ll2f_rp">,
670      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
671  def int_nvvm_ull2f_rn : GCCBuiltin<"__nvvm_ull2f_rn">,
672      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
673  def int_nvvm_ull2f_rz : GCCBuiltin<"__nvvm_ull2f_rz">,
674      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
675  def int_nvvm_ull2f_rm : GCCBuiltin<"__nvvm_ull2f_rm">,
676      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
677  def int_nvvm_ull2f_rp : GCCBuiltin<"__nvvm_ull2f_rp">,
678      Intrinsic<[llvm_float_ty], [llvm_i64_ty], [IntrNoMem]>;
679
680  def int_nvvm_ll2d_rn : GCCBuiltin<"__nvvm_ll2d_rn">,
681      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
682  def int_nvvm_ll2d_rz : GCCBuiltin<"__nvvm_ll2d_rz">,
683      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
684  def int_nvvm_ll2d_rm : GCCBuiltin<"__nvvm_ll2d_rm">,
685      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
686  def int_nvvm_ll2d_rp : GCCBuiltin<"__nvvm_ll2d_rp">,
687      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
688  def int_nvvm_ull2d_rn : GCCBuiltin<"__nvvm_ull2d_rn">,
689      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
690  def int_nvvm_ull2d_rz : GCCBuiltin<"__nvvm_ull2d_rz">,
691      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
692  def int_nvvm_ull2d_rm : GCCBuiltin<"__nvvm_ull2d_rm">,
693      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
694  def int_nvvm_ull2d_rp : GCCBuiltin<"__nvvm_ull2d_rp">,
695      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
696
697  def int_nvvm_f2h_rn_ftz : GCCBuiltin<"__nvvm_f2h_rn_ftz">,
698      Intrinsic<[llvm_i16_ty], [llvm_float_ty], [IntrNoMem]>;
699  def int_nvvm_f2h_rn : GCCBuiltin<"__nvvm_f2h_rn">,
700      Intrinsic<[llvm_i16_ty], [llvm_float_ty], [IntrNoMem]>;
701
702  def int_nvvm_h2f : GCCBuiltin<"__nvvm_h2f">,
703      Intrinsic<[llvm_float_ty], [llvm_i16_ty], [IntrNoMem]>;
704
705//
706// Bitcast
707//
708
709  def int_nvvm_bitcast_f2i : GCCBuiltin<"__nvvm_bitcast_f2i">,
710      Intrinsic<[llvm_i32_ty], [llvm_float_ty], [IntrNoMem]>;
711  def int_nvvm_bitcast_i2f : GCCBuiltin<"__nvvm_bitcast_i2f">,
712      Intrinsic<[llvm_float_ty], [llvm_i32_ty], [IntrNoMem]>;
713
714  def int_nvvm_bitcast_ll2d : GCCBuiltin<"__nvvm_bitcast_ll2d">,
715      Intrinsic<[llvm_double_ty], [llvm_i64_ty], [IntrNoMem]>;
716  def int_nvvm_bitcast_d2ll : GCCBuiltin<"__nvvm_bitcast_d2ll">,
717      Intrinsic<[llvm_i64_ty], [llvm_double_ty], [IntrNoMem]>;
718
719
720// Atomic not available as an llvm intrinsic.
721  def int_nvvm_atomic_load_add_f32 : Intrinsic<[llvm_float_ty],
722          [LLVMAnyPointerType<llvm_float_ty>, llvm_float_ty],
723                                      [IntrReadWriteArgMem, NoCapture<0>]>;
724  def int_nvvm_atomic_load_inc_32 : Intrinsic<[llvm_i32_ty],
725          [LLVMAnyPointerType<llvm_i32_ty>, llvm_i32_ty],
726                                      [IntrReadWriteArgMem, NoCapture<0>]>;
727  def int_nvvm_atomic_load_dec_32 : Intrinsic<[llvm_i32_ty],
728          [LLVMAnyPointerType<llvm_i32_ty>, llvm_i32_ty],
729                                      [IntrReadWriteArgMem, NoCapture<0>]>;
730
731// Bar.Sync
732  def int_cuda_syncthreads : GCCBuiltin<"__syncthreads">,
733      Intrinsic<[], [], []>;
734  def int_nvvm_barrier0 : GCCBuiltin<"__nvvm_bar0">,
735      Intrinsic<[], [], []>;
736  def int_nvvm_barrier0_popc : GCCBuiltin<"__nvvm_bar0_popc">,
737      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
738  def int_nvvm_barrier0_and : GCCBuiltin<"__nvvm_bar0_and">,
739      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
740  def int_nvvm_barrier0_or : GCCBuiltin<"__nvvm_bar0_or">,
741      Intrinsic<[llvm_i32_ty], [llvm_i32_ty], []>;
742
743  // Membar
744  def int_nvvm_membar_cta : GCCBuiltin<"__nvvm_membar_cta">,
745      Intrinsic<[], [], []>;
746  def int_nvvm_membar_gl : GCCBuiltin<"__nvvm_membar_gl">,
747      Intrinsic<[], [], []>;
748  def int_nvvm_membar_sys : GCCBuiltin<"__nvvm_membar_sys">,
749      Intrinsic<[], [], []>;
750
751
752// Accessing special registers
753  def int_nvvm_read_ptx_sreg_tid_x :
754      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
755      GCCBuiltin<"__nvvm_read_ptx_sreg_tid_x">;
756  def int_nvvm_read_ptx_sreg_tid_y :
757      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
758      GCCBuiltin<"__nvvm_read_ptx_sreg_tid_y">;
759  def int_nvvm_read_ptx_sreg_tid_z :
760      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
761      GCCBuiltin<"__nvvm_read_ptx_sreg_tid_z">;
762
763  def int_nvvm_read_ptx_sreg_ntid_x :
764      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
765      GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_x">;
766  def int_nvvm_read_ptx_sreg_ntid_y :
767      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
768      GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_y">;
769  def int_nvvm_read_ptx_sreg_ntid_z :
770      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
771      GCCBuiltin<"__nvvm_read_ptx_sreg_ntid_z">;
772
773  def int_nvvm_read_ptx_sreg_ctaid_x :
774      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
775      GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_x">;
776  def int_nvvm_read_ptx_sreg_ctaid_y :
777      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
778      GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_y">;
779  def int_nvvm_read_ptx_sreg_ctaid_z :
780      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
781      GCCBuiltin<"__nvvm_read_ptx_sreg_ctaid_z">;
782
783  def int_nvvm_read_ptx_sreg_nctaid_x :
784      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
785      GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_x">;
786  def int_nvvm_read_ptx_sreg_nctaid_y :
787      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
788      GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_y">;
789  def int_nvvm_read_ptx_sreg_nctaid_z :
790      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
791      GCCBuiltin<"__nvvm_read_ptx_sreg_nctaid_z">;
792
793  def int_nvvm_read_ptx_sreg_warpsize :
794      Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
795      GCCBuiltin<"__nvvm_read_ptx_sreg_warpsize">;
796
797
798// Generated within nvvm. Use for ldu on sm_20 or later
799// @TODO: Revisit this, Changed LLVMAnyPointerType to LLVMPointerType
800def int_nvvm_ldu_global_i : Intrinsic<[llvm_anyint_ty],
801  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
802  "llvm.nvvm.ldu.global.i">;
803def int_nvvm_ldu_global_f : Intrinsic<[llvm_anyfloat_ty],
804  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
805  "llvm.nvvm.ldu.global.f">;
806def int_nvvm_ldu_global_p : Intrinsic<[llvm_anyptr_ty],
807  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
808  "llvm.nvvm.ldu.global.p">;
809
810// Generated within nvvm. Use for ldg on sm_35 or later
811def int_nvvm_ldg_global_i : Intrinsic<[llvm_anyint_ty],
812  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
813  "llvm.nvvm.ldg.global.i">;
814def int_nvvm_ldg_global_f : Intrinsic<[llvm_anyfloat_ty],
815  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
816  "llvm.nvvm.ldg.global.f">;
817def int_nvvm_ldg_global_p : Intrinsic<[llvm_anyptr_ty],
818  [LLVMPointerType<LLVMMatchType<0>>], [IntrReadMem, NoCapture<0>],
819  "llvm.nvvm.ldg.global.p">;
820
821// Use for generic pointers
822// - These intrinsics are used to convert address spaces.
823// - The input pointer and output pointer must have the same type, except for
824//   the address-space. (This restriction is not enforced here as there is
825//   currently no way to describe it).
826// - This complements the llvm bitcast, which can be used to cast one type
827//   of pointer to another type of pointer, while the address space remains
828//   the same.
829def int_nvvm_ptr_local_to_gen: Intrinsic<[llvm_anyptr_ty],
830                 [llvm_anyptr_ty], [IntrNoMem],
831                 "llvm.nvvm.ptr.local.to.gen">;
832def int_nvvm_ptr_shared_to_gen: Intrinsic<[llvm_anyptr_ty],
833                 [llvm_anyptr_ty], [IntrNoMem],
834                 "llvm.nvvm.ptr.shared.to.gen">;
835def int_nvvm_ptr_global_to_gen: Intrinsic<[llvm_anyptr_ty],
836                 [llvm_anyptr_ty], [IntrNoMem],
837                 "llvm.nvvm.ptr.global.to.gen">;
838def int_nvvm_ptr_constant_to_gen: Intrinsic<[llvm_anyptr_ty],
839                 [llvm_anyptr_ty], [IntrNoMem],
840                 "llvm.nvvm.ptr.constant.to.gen">;
841
842def int_nvvm_ptr_gen_to_global: Intrinsic<[llvm_anyptr_ty],
843                 [llvm_anyptr_ty], [IntrNoMem],
844                 "llvm.nvvm.ptr.gen.to.global">;
845def int_nvvm_ptr_gen_to_shared: Intrinsic<[llvm_anyptr_ty],
846                 [llvm_anyptr_ty], [IntrNoMem],
847                 "llvm.nvvm.ptr.gen.to.shared">;
848def int_nvvm_ptr_gen_to_local: Intrinsic<[llvm_anyptr_ty],
849                 [llvm_anyptr_ty], [IntrNoMem],
850                 "llvm.nvvm.ptr.gen.to.local">;
851def int_nvvm_ptr_gen_to_constant: Intrinsic<[llvm_anyptr_ty],
852                 [llvm_anyptr_ty], [IntrNoMem],
853                 "llvm.nvvm.ptr.gen.to.constant">;
854
855// Used in nvvm internally to help address space opt and ptx code generation
856// This is for params that are passed to kernel functions by pointer by-val.
857def int_nvvm_ptr_gen_to_param: Intrinsic<[llvm_anyptr_ty],
858                                     [llvm_anyptr_ty],
859                                   [IntrNoMem],
860                                   "llvm.nvvm.ptr.gen.to.param">;
861
862// Move intrinsics, used in nvvm internally
863
864def int_nvvm_move_i16 : Intrinsic<[llvm_i16_ty], [llvm_i16_ty], [IntrNoMem],
865  "llvm.nvvm.move.i16">;
866def int_nvvm_move_i32 : Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem],
867  "llvm.nvvm.move.i32">;
868def int_nvvm_move_i64 : Intrinsic<[llvm_i64_ty], [llvm_i64_ty], [IntrNoMem],
869  "llvm.nvvm.move.i64">;
870def int_nvvm_move_float : Intrinsic<[llvm_float_ty], [llvm_float_ty],
871  [IntrNoMem], "llvm.nvvm.move.float">;
872def int_nvvm_move_double : Intrinsic<[llvm_double_ty], [llvm_double_ty],
873  [IntrNoMem], "llvm.nvvm.move.double">;
874def int_nvvm_move_ptr : Intrinsic<[llvm_anyptr_ty], [llvm_anyptr_ty],
875  [IntrNoMem, NoCapture<0>], "llvm.nvvm.move.ptr">;
876
877
878/// Error / Warn
879def int_nvvm_compiler_error :
880    Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.error">;
881def int_nvvm_compiler_warn :
882    Intrinsic<[], [llvm_anyptr_ty], [], "llvm.nvvm.compiler.warn">;
883
884
885// Old PTX back-end intrinsics retained here for backwards-compatibility
886
887multiclass PTXReadSpecialRegisterIntrinsic_v4i32<string prefix> {
888// FIXME: Do we need the 128-bit integer type version?
889//    def _r64   : Intrinsic<[llvm_i128_ty],   [], [IntrNoMem]>;
890
891// FIXME: Enable this once v4i32 support is enabled in back-end.
892//    def _v4i16 : Intrinsic<[llvm_v4i32_ty], [], [IntrNoMem]>;
893
894  def _x     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
895               GCCBuiltin<!strconcat(prefix, "_x")>;
896  def _y     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
897               GCCBuiltin<!strconcat(prefix, "_y")>;
898  def _z     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
899               GCCBuiltin<!strconcat(prefix, "_z")>;
900  def _w     : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
901               GCCBuiltin<!strconcat(prefix, "_w")>;
902}
903
904class PTXReadSpecialRegisterIntrinsic_r32<string name>
905  : Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>,
906    GCCBuiltin<name>;
907
908class PTXReadSpecialRegisterIntrinsic_r64<string name>
909  : Intrinsic<[llvm_i64_ty], [], [IntrNoMem]>,
910    GCCBuiltin<name>;
911
912defm int_ptx_read_tid        : PTXReadSpecialRegisterIntrinsic_v4i32
913                               <"__builtin_ptx_read_tid">;
914defm int_ptx_read_ntid       : PTXReadSpecialRegisterIntrinsic_v4i32
915                               <"__builtin_ptx_read_ntid">;
916
917def int_ptx_read_laneid      : PTXReadSpecialRegisterIntrinsic_r32
918                               <"__builtin_ptx_read_laneid">;
919def int_ptx_read_warpid      : PTXReadSpecialRegisterIntrinsic_r32
920                               <"__builtin_ptx_read_warpid">;
921def int_ptx_read_nwarpid     : PTXReadSpecialRegisterIntrinsic_r32
922                               <"__builtin_ptx_read_nwarpid">;
923
924defm int_ptx_read_ctaid      : PTXReadSpecialRegisterIntrinsic_v4i32
925                               <"__builtin_ptx_read_ctaid">;
926defm int_ptx_read_nctaid     : PTXReadSpecialRegisterIntrinsic_v4i32
927                               <"__builtin_ptx_read_nctaid">;
928
929def int_ptx_read_smid        : PTXReadSpecialRegisterIntrinsic_r32
930                               <"__builtin_ptx_read_smid">;
931def int_ptx_read_nsmid       : PTXReadSpecialRegisterIntrinsic_r32
932                               <"__builtin_ptx_read_nsmid">;
933def int_ptx_read_gridid      : PTXReadSpecialRegisterIntrinsic_r32
934                               <"__builtin_ptx_read_gridid">;
935
936def int_ptx_read_lanemask_eq : PTXReadSpecialRegisterIntrinsic_r32
937                               <"__builtin_ptx_read_lanemask_eq">;
938def int_ptx_read_lanemask_le : PTXReadSpecialRegisterIntrinsic_r32
939                               <"__builtin_ptx_read_lanemask_le">;
940def int_ptx_read_lanemask_lt : PTXReadSpecialRegisterIntrinsic_r32
941                               <"__builtin_ptx_read_lanemask_lt">;
942def int_ptx_read_lanemask_ge : PTXReadSpecialRegisterIntrinsic_r32
943                               <"__builtin_ptx_read_lanemask_ge">;
944def int_ptx_read_lanemask_gt : PTXReadSpecialRegisterIntrinsic_r32
945                               <"__builtin_ptx_read_lanemask_gt">;
946
947def int_ptx_read_clock       : PTXReadSpecialRegisterIntrinsic_r32
948                               <"__builtin_ptx_read_clock">;
949def int_ptx_read_clock64     : PTXReadSpecialRegisterIntrinsic_r64
950                               <"__builtin_ptx_read_clock64">;
951
952def int_ptx_read_pm0         : PTXReadSpecialRegisterIntrinsic_r32
953                               <"__builtin_ptx_read_pm0">;
954def int_ptx_read_pm1         : PTXReadSpecialRegisterIntrinsic_r32
955                               <"__builtin_ptx_read_pm1">;
956def int_ptx_read_pm2         : PTXReadSpecialRegisterIntrinsic_r32
957                               <"__builtin_ptx_read_pm2">;
958def int_ptx_read_pm3         : PTXReadSpecialRegisterIntrinsic_r32
959                               <"__builtin_ptx_read_pm3">;
960
961def int_ptx_bar_sync : Intrinsic<[], [llvm_i32_ty], []>,
962                       GCCBuiltin<"__builtin_ptx_bar_sync">;
963