Restrict sin/cos optimization to 64-bit only for now. 32-bit is a bit messy and less...
[oota-llvm.git] / lib / Target / R600 / AMDILIntrinsics.td
1 //===- AMDILIntrinsics.td - Defines AMDIL Intrinscs -*- 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 amdil-specific intrinsics
11 //
12 //===---------------------------------------------------------------===//
13 //===--------------------------------------------------------------------===//
14 // Intrinsic classes
15 // Generic versions of the above classes but for Target specific intrinsics
16 // instead of SDNode patterns.
17 //===--------------------------------------------------------------------===//
18 let TargetPrefix = "AMDIL", isTarget = 1 in {
19      class VoidIntLong :
20           Intrinsic<[llvm_i64_ty], [], []>;
21      class VoidIntInt :
22           Intrinsic<[llvm_i32_ty], [], []>;
23      class VoidIntBool :
24           Intrinsic<[llvm_i32_ty], [], []>;
25      class UnaryIntInt :
26           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
27      class UnaryIntFloat :
28           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
29      class ConvertIntFTOI :
30           Intrinsic<[llvm_anyint_ty], [llvm_anyfloat_ty], [IntrNoMem]>;
31      class ConvertIntITOF :
32           Intrinsic<[llvm_anyfloat_ty], [llvm_anyint_ty], [IntrNoMem]>;
33      class UnaryIntNoRetInt :
34           Intrinsic<[], [llvm_anyint_ty], []>;
35      class UnaryIntNoRetFloat :
36           Intrinsic<[], [llvm_anyfloat_ty], []>;
37      class BinaryIntInt :
38           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
39      class BinaryIntFloat :
40           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
41      class BinaryIntNoRetInt :
42           Intrinsic<[], [llvm_anyint_ty, LLVMMatchType<0>], []>;
43      class BinaryIntNoRetFloat :
44           Intrinsic<[], [llvm_anyfloat_ty, LLVMMatchType<0>], []>;
45      class TernaryIntInt :
46           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
47           LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
48      class TernaryIntFloat :
49           Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>,
50           LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
51      class QuaternaryIntInt :
52           Intrinsic<[llvm_anyint_ty], [LLVMMatchType<0>,
53           LLVMMatchType<0>, LLVMMatchType<0>, LLVMMatchType<0>], [IntrNoMem]>;
54      class UnaryAtomicInt :
55           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
56      class BinaryAtomicInt :
57           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
58      class TernaryAtomicInt :
59           Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty]>;
60      class UnaryAtomicIntNoRet :
61           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
62      class BinaryAtomicIntNoRet :
63           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
64      class TernaryAtomicIntNoRet :
65           Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty], [IntrReadWriteArgMem]>;
66 }
67
68 let TargetPrefix = "AMDIL", isTarget = 1 in {
69   def int_AMDIL_abs : GCCBuiltin<"__amdil_abs">, UnaryIntInt;
70
71   def int_AMDIL_bit_extract_i32 : GCCBuiltin<"__amdil_ibit_extract">,
72           TernaryIntInt;
73   def int_AMDIL_bit_extract_u32 : GCCBuiltin<"__amdil_ubit_extract">,
74           TernaryIntInt;
75   def int_AMDIL_bit_reverse_u32 : GCCBuiltin<"__amdil_ubit_reverse">,
76           UnaryIntInt;
77   def int_AMDIL_bit_count_i32 : GCCBuiltin<"__amdil_count_bits">,
78           UnaryIntInt;
79   def int_AMDIL_bit_find_first_lo : GCCBuiltin<"__amdil_ffb_lo">,
80           UnaryIntInt;
81   def int_AMDIL_bit_find_first_hi : GCCBuiltin<"__amdil_ffb_hi">,
82           UnaryIntInt;
83   def int_AMDIL_bit_find_first_sgn : GCCBuiltin<"__amdil_ffb_signed">,
84           UnaryIntInt;
85   def int_AMDIL_media_bitalign : GCCBuiltin<"__amdil_bitalign">,
86                     TernaryIntInt;
87   def int_AMDIL_media_bytealign : GCCBuiltin<"__amdil_bytealign">,
88                     TernaryIntInt;
89   def int_AMDIL_bit_insert_u32 : GCCBuiltin<"__amdil_ubit_insert">,
90                     QuaternaryIntInt;
91   def int_AMDIL_bfi : GCCBuiltin<"__amdil_bfi">,
92       TernaryIntInt;
93   def int_AMDIL_bfm : GCCBuiltin<"__amdil_bfm">,
94       BinaryIntInt;
95   def int_AMDIL_mad_i32 : GCCBuiltin<"__amdil_imad">,
96           TernaryIntInt;
97   def int_AMDIL_mad_u32 : GCCBuiltin<"__amdil_umad">,
98           TernaryIntInt;
99   def int_AMDIL_mad     : GCCBuiltin<"__amdil_mad">,
100           TernaryIntFloat;
101   def int_AMDIL_mulhi_i32 : GCCBuiltin<"__amdil_imul_high">,
102           BinaryIntInt;
103   def int_AMDIL_mulhi_u32 : GCCBuiltin<"__amdil_umul_high">,
104           BinaryIntInt;
105   def int_AMDIL_mul24_i32 : GCCBuiltin<"__amdil_imul24">,
106           BinaryIntInt;
107   def int_AMDIL_mul24_u32 : GCCBuiltin<"__amdil_umul24">,
108           BinaryIntInt;
109   def int_AMDIL_mulhi24_i32 : GCCBuiltin<"__amdil_imul24_high">,
110           BinaryIntInt;
111   def int_AMDIL_mulhi24_u32 : GCCBuiltin<"__amdil_umul24_high">,
112           BinaryIntInt;
113   def int_AMDIL_mad24_i32 : GCCBuiltin<"__amdil_imad24">,
114           TernaryIntInt;
115   def int_AMDIL_mad24_u32 : GCCBuiltin<"__amdil_umad24">,
116           TernaryIntInt;
117   def int_AMDIL_carry_i32 : GCCBuiltin<"__amdil_carry">,
118           BinaryIntInt;
119   def int_AMDIL_borrow_i32 : GCCBuiltin<"__amdil_borrow">,
120           BinaryIntInt;
121   def int_AMDIL_min_i32 : GCCBuiltin<"__amdil_imin">,
122           BinaryIntInt;
123   def int_AMDIL_min_u32 : GCCBuiltin<"__amdil_umin">,
124           BinaryIntInt;
125   def int_AMDIL_min     : GCCBuiltin<"__amdil_min">,
126           BinaryIntFloat;
127   def int_AMDIL_max_i32 : GCCBuiltin<"__amdil_imax">,
128           BinaryIntInt;
129   def int_AMDIL_max_u32 : GCCBuiltin<"__amdil_umax">,
130           BinaryIntInt;
131   def int_AMDIL_max     : GCCBuiltin<"__amdil_max">,
132           BinaryIntFloat;
133   def int_AMDIL_media_lerp_u4 : GCCBuiltin<"__amdil_u4lerp">,
134           TernaryIntInt;
135   def int_AMDIL_media_sad : GCCBuiltin<"__amdil_sad">,
136           TernaryIntInt;
137   def int_AMDIL_media_sad_hi : GCCBuiltin<"__amdil_sadhi">,
138           TernaryIntInt;
139   def int_AMDIL_fraction : GCCBuiltin<"__amdil_fraction">,
140           UnaryIntFloat;
141   def int_AMDIL_clamp : GCCBuiltin<"__amdil_clamp">,
142           TernaryIntFloat;
143   def int_AMDIL_pireduce : GCCBuiltin<"__amdil_pireduce">,
144           UnaryIntFloat;
145   def int_AMDIL_round_nearest : GCCBuiltin<"__amdil_round_nearest">,
146           UnaryIntFloat;
147   def int_AMDIL_round_neginf : GCCBuiltin<"__amdil_round_neginf">,
148           UnaryIntFloat;
149   def int_AMDIL_round_zero : GCCBuiltin<"__amdil_round_zero">,
150           UnaryIntFloat;
151   def int_AMDIL_acos : GCCBuiltin<"__amdil_acos">,
152           UnaryIntFloat;
153   def int_AMDIL_atan : GCCBuiltin<"__amdil_atan">,
154           UnaryIntFloat;
155   def int_AMDIL_asin : GCCBuiltin<"__amdil_asin">,
156           UnaryIntFloat;
157   def int_AMDIL_cos : GCCBuiltin<"__amdil_cos">,
158           UnaryIntFloat;
159   def int_AMDIL_cos_vec : GCCBuiltin<"__amdil_cos_vec">,
160           UnaryIntFloat;
161   def int_AMDIL_tan : GCCBuiltin<"__amdil_tan">,
162           UnaryIntFloat;
163   def int_AMDIL_sin : GCCBuiltin<"__amdil_sin">,
164           UnaryIntFloat;
165   def int_AMDIL_sin_vec : GCCBuiltin<"__amdil_sin_vec">,
166           UnaryIntFloat;
167   def int_AMDIL_pow : GCCBuiltin<"__amdil_pow">, BinaryIntFloat;
168   def int_AMDIL_div : GCCBuiltin<"__amdil_div">, BinaryIntFloat;
169   def int_AMDIL_udiv : GCCBuiltin<"__amdil_udiv">, BinaryIntInt;
170   def int_AMDIL_sqrt: GCCBuiltin<"__amdil_sqrt">,
171           UnaryIntFloat;
172   def int_AMDIL_sqrt_vec: GCCBuiltin<"__amdil_sqrt_vec">,
173           UnaryIntFloat;
174   def int_AMDIL_exp : GCCBuiltin<"__amdil_exp">,
175           UnaryIntFloat;
176   def int_AMDIL_exp_vec : GCCBuiltin<"__amdil_exp_vec">,
177           UnaryIntFloat;
178   def int_AMDIL_exn : GCCBuiltin<"__amdil_exn">,
179           UnaryIntFloat;
180   def int_AMDIL_log_vec : GCCBuiltin<"__amdil_log_vec">,
181           UnaryIntFloat;
182   def int_AMDIL_ln : GCCBuiltin<"__amdil_ln">,
183           UnaryIntFloat;
184   def int_AMDIL_sign: GCCBuiltin<"__amdil_sign">,
185           UnaryIntFloat;
186   def int_AMDIL_fma: GCCBuiltin<"__amdil_fma">,
187           TernaryIntFloat;
188   def int_AMDIL_rsq : GCCBuiltin<"__amdil_rsq">,
189           UnaryIntFloat;
190   def int_AMDIL_rsq_vec : GCCBuiltin<"__amdil_rsq_vec">,
191           UnaryIntFloat;
192   def int_AMDIL_length : GCCBuiltin<"__amdil_length">,
193           UnaryIntFloat;
194   def int_AMDIL_lerp : GCCBuiltin<"__amdil_lerp">,
195           TernaryIntFloat;
196   def int_AMDIL_media_sad4 : GCCBuiltin<"__amdil_sad4">,
197       Intrinsic<[llvm_i32_ty], [llvm_v4i32_ty,
198            llvm_v4i32_ty, llvm_i32_ty], []>;
199
200   def int_AMDIL_frexp_f64 : GCCBuiltin<"__amdil_frexp">,
201         Intrinsic<[llvm_v2i64_ty], [llvm_double_ty], []>;
202  def int_AMDIL_ldexp : GCCBuiltin<"__amdil_ldexp">,
203     Intrinsic<[llvm_anyfloat_ty], [llvm_anyfloat_ty, llvm_anyint_ty], []>;
204   def int_AMDIL_drcp : GCCBuiltin<"__amdil_rcp">,
205       Intrinsic<[llvm_double_ty], [llvm_double_ty], []>;
206   def int_AMDIL_convert_f16_f32 : GCCBuiltin<"__amdil_half_to_float">,
207       ConvertIntITOF;
208   def int_AMDIL_convert_f32_f16 : GCCBuiltin<"__amdil_float_to_half">,
209       ConvertIntFTOI;
210   def int_AMDIL_convert_f32_i32_rpi : GCCBuiltin<"__amdil_float_to_int_rpi">,
211       ConvertIntFTOI;
212   def int_AMDIL_convert_f32_i32_flr : GCCBuiltin<"__amdil_float_to_int_flr">,
213       ConvertIntFTOI;
214   def int_AMDIL_convert_f32_f16_near : GCCBuiltin<"__amdil_float_to_half_near">,
215       ConvertIntFTOI;
216   def int_AMDIL_convert_f32_f16_neg_inf : GCCBuiltin<"__amdil_float_to_half_neg_inf">,
217       ConvertIntFTOI;
218   def int_AMDIL_convert_f32_f16_plus_inf : GCCBuiltin<"__amdil_float_to_half_plus_inf">,
219       ConvertIntFTOI;
220  def int_AMDIL_media_convert_f2v4u8 : GCCBuiltin<"__amdil_f_2_u4">,
221       Intrinsic<[llvm_i32_ty], [llvm_v4f32_ty], []>;
222   def int_AMDIL_media_unpack_byte_0 : GCCBuiltin<"__amdil_unpack_0">,
223       ConvertIntITOF;
224   def int_AMDIL_media_unpack_byte_1 : GCCBuiltin<"__amdil_unpack_1">,
225       ConvertIntITOF;
226   def int_AMDIL_media_unpack_byte_2 : GCCBuiltin<"__amdil_unpack_2">,
227       ConvertIntITOF;
228   def int_AMDIL_media_unpack_byte_3 : GCCBuiltin<"__amdil_unpack_3">,
229       ConvertIntITOF;
230   def int_AMDIL_dp2_add : GCCBuiltin<"__amdil_dp2_add">,
231         Intrinsic<[llvm_float_ty], [llvm_v2f32_ty,
232           llvm_v2f32_ty, llvm_float_ty], []>;
233   def int_AMDIL_dp2 : GCCBuiltin<"__amdil_dp2">,
234         Intrinsic<[llvm_float_ty], [llvm_v2f32_ty,
235           llvm_v2f32_ty], []>;
236   def int_AMDIL_dp3 : GCCBuiltin<"__amdil_dp3">,
237         Intrinsic<[llvm_float_ty], [llvm_v4f32_ty,
238           llvm_v4f32_ty], []>;
239   def int_AMDIL_dp4 : GCCBuiltin<"__amdil_dp4">,
240         Intrinsic<[llvm_float_ty], [llvm_v4f32_ty,
241           llvm_v4f32_ty], []>;
242 }