Revert commit r160307. We decide to move builtins selection to the backend.
[oota-llvm.git] / include / llvm / IntrinsicsMips.td
1 //===- IntrinsicsMips.td - Defines Mips 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 MIPS-specific intrinsics.
11 //
12 //===----------------------------------------------------------------------===//
13
14 //===----------------------------------------------------------------------===//
15 // MIPS DSP data types
16 def mips_v2q15_ty: LLVMType<v2i16>;
17 def mips_q31_ty: LLVMType<i32>;
18
19 let TargetPrefix = "mips" in {  // All intrinsics start with "llvm.mips.".
20
21 //===----------------------------------------------------------------------===//
22 // Addition/subtraction
23
24 def int_mips_addu_qb : GCCBuiltin<"__builtin_mips_addu_qb">,
25   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_v4i8_ty],
26             [IntrNoMem, Commutative]>;
27 def int_mips_addu_s_qb : GCCBuiltin<"__builtin_mips_addu_s_qb">,
28   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_v4i8_ty],
29             [IntrNoMem, Commutative]>;
30 def int_mips_subu_qb : GCCBuiltin<"__builtin_mips_subu_qb">,
31   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem]>;
32 def int_mips_subu_s_qb : GCCBuiltin<"__builtin_mips_subu_s_qb">,
33   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem]>;
34
35 def int_mips_addq_ph : GCCBuiltin<"__builtin_mips_addq_ph">,
36   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty],
37             [IntrNoMem, Commutative]>;
38 def int_mips_addq_s_ph : GCCBuiltin<"__builtin_mips_addq_s_ph">,
39   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty],
40             [IntrNoMem, Commutative]>;
41 def int_mips_subq_ph : GCCBuiltin<"__builtin_mips_subq_ph">,
42   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
43 def int_mips_subq_s_ph : GCCBuiltin<"__builtin_mips_subq_s_ph">,
44   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
45
46 def int_mips_madd: GCCBuiltin<"__builtin_mips_madd">,
47   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
48             [IntrNoMem, Commutative]>;
49 def int_mips_maddu: GCCBuiltin<"__builtin_mips_maddu">,
50   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
51             [IntrNoMem, Commutative]>;
52
53 def int_mips_msub: GCCBuiltin<"__builtin_mips_msub">,
54   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
55             [IntrNoMem]>;
56 def int_mips_msubu: GCCBuiltin<"__builtin_mips_msubu">,
57   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
58             [IntrNoMem]>;
59
60 def int_mips_addq_s_w: GCCBuiltin<"__builtin_mips_addq_s_w">,
61   Intrinsic<[mips_q31_ty], [mips_q31_ty, mips_q31_ty],
62             [IntrNoMem, Commutative]>;
63 def int_mips_subq_s_w: GCCBuiltin<"__builtin_mips_subq_s_w">,
64   Intrinsic<[mips_q31_ty], [mips_q31_ty, mips_q31_ty], [IntrNoMem]>;
65
66 def int_mips_addsc: GCCBuiltin<"__builtin_mips_addsc">,
67   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
68             [IntrNoMem, Commutative]>;
69 def int_mips_addwc: GCCBuiltin<"__builtin_mips_addwc">,
70   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
71             [IntrNoMem, Commutative]>;
72
73 def int_mips_modsub: GCCBuiltin<"__builtin_mips_modsub">,
74   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
75
76 def int_mips_raddu_w_qb: GCCBuiltin<"__builtin_mips_raddu_w_qb">,
77   Intrinsic<[llvm_i32_ty], [llvm_v4i8_ty], [IntrNoMem]>;
78
79 //===----------------------------------------------------------------------===//
80 // Absolute value
81
82 def int_mips_absq_s_ph: GCCBuiltin<"__builtin_mips_absq_s_ph">,
83   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty], [IntrNoMem]>;
84 def int_mips_absq_s_w: GCCBuiltin<"__builtin_mips_absq_s_w">,
85   Intrinsic<[mips_q31_ty], [mips_q31_ty], [IntrNoMem]>;
86
87 //===----------------------------------------------------------------------===//
88 // Precision reduce/expand
89
90 def int_mips_precrq_qb_ph: GCCBuiltin<"__builtin_mips_precrq_qb_ph">,
91   Intrinsic<[llvm_v4i8_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
92 def int_mips_precrqu_s_qb_ph: GCCBuiltin<"__builtin_mips_precrqu_s_qb_ph">,
93   Intrinsic<[llvm_v4i8_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
94 def int_mips_precrq_ph_w: GCCBuiltin<"__builtin_mips_precrq_ph_w">,
95   Intrinsic<[mips_v2q15_ty], [mips_q31_ty, mips_q31_ty], [IntrNoMem]>;
96 def int_mips_precrq_rs_ph_w: GCCBuiltin<"__builtin_mips_precrq_rs_ph_w">,
97   Intrinsic<[mips_v2q15_ty], [mips_q31_ty, mips_q31_ty], [IntrNoMem]>;
98 def int_mips_preceq_w_phl: GCCBuiltin<"__builtin_mips_preceq_w_phl">,
99   Intrinsic<[mips_q31_ty], [mips_v2q15_ty], [IntrNoMem]>;
100 def int_mips_preceq_w_phr: GCCBuiltin<"__builtin_mips_preceq_w_phr">,
101   Intrinsic<[mips_q31_ty], [mips_v2q15_ty], [IntrNoMem]>;
102 def int_mips_precequ_ph_qbl: GCCBuiltin<"__builtin_mips_precequ_ph_qbl">,
103   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
104 def int_mips_precequ_ph_qbr: GCCBuiltin<"__builtin_mips_precequ_ph_qbr">,
105   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
106 def int_mips_precequ_ph_qbla: GCCBuiltin<"__builtin_mips_precequ_ph_qbla">,
107   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
108 def int_mips_precequ_ph_qbra: GCCBuiltin<"__builtin_mips_precequ_ph_qbra">,
109   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
110 def int_mips_preceu_ph_qbl: GCCBuiltin<"__builtin_mips_preceu_ph_qbl">,
111   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
112 def int_mips_preceu_ph_qbr: GCCBuiltin<"__builtin_mips_preceu_ph_qbr">,
113   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
114 def int_mips_preceu_ph_qbla: GCCBuiltin<"__builtin_mips_preceu_ph_qbla">,
115   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
116 def int_mips_preceu_ph_qbra: GCCBuiltin<"__builtin_mips_preceu_ph_qbra">,
117   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty], [IntrNoMem]>;
118
119 //===----------------------------------------------------------------------===//
120 // Shift
121
122 def int_mips_shll_qb: GCCBuiltin<"__builtin_mips_shll_qb">,
123   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_i32_ty], [IntrNoMem]>;
124 def int_mips_shrl_qb: GCCBuiltin<"__builtin_mips_shrl_qb">,
125   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_i32_ty], [IntrNoMem]>;
126 def int_mips_shll_ph: GCCBuiltin<"__builtin_mips_shll_ph">,
127   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, llvm_i32_ty], [IntrNoMem]>;
128 def int_mips_shll_s_ph: GCCBuiltin<"__builtin_mips_shll_s_ph">,
129   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, llvm_i32_ty], [IntrNoMem]>;
130 def int_mips_shra_ph: GCCBuiltin<"__builtin_mips_shra_ph">,
131   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, llvm_i32_ty], [IntrNoMem]>;
132 def int_mips_shra_r_ph: GCCBuiltin<"__builtin_mips_shra_r_ph">,
133   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, llvm_i32_ty], [IntrNoMem]>;
134 def int_mips_shll_s_w: GCCBuiltin<"__builtin_mips_shll_s_w">,
135   Intrinsic<[mips_q31_ty], [mips_q31_ty, llvm_i32_ty], [IntrNoMem]>;
136 def int_mips_shra_r_w: GCCBuiltin<"__builtin_mips_shra_r_w">,
137   Intrinsic<[mips_q31_ty], [mips_q31_ty, llvm_i32_ty], [IntrNoMem]>;
138 def int_mips_shilo: GCCBuiltin<"__builtin_mips_shilo">,
139   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
140
141 //===----------------------------------------------------------------------===//
142 // Multiplication
143
144 def int_mips_muleu_s_ph_qbl: GCCBuiltin<"__builtin_mips_muleu_s_ph_qbl">,
145   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty, mips_v2q15_ty], [IntrNoMem]>;
146 def int_mips_muleu_s_ph_qbr: GCCBuiltin<"__builtin_mips_muleu_s_ph_qbr">,
147   Intrinsic<[mips_v2q15_ty], [llvm_v4i8_ty, mips_v2q15_ty], [IntrNoMem]>;
148 def int_mips_mulq_rs_ph: GCCBuiltin<"__builtin_mips_mulq_rs_ph">,
149   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty],
150             [IntrNoMem, Commutative]>;
151 def int_mips_muleq_s_w_phl: GCCBuiltin<"__builtin_mips_muleq_s_w_phl">,
152   Intrinsic<[mips_q31_ty], [mips_v2q15_ty, mips_v2q15_ty],
153             [IntrNoMem, Commutative]>;
154 def int_mips_muleq_s_w_phr: GCCBuiltin<"__builtin_mips_muleq_s_w_phr">,
155   Intrinsic<[mips_q31_ty], [mips_v2q15_ty, mips_v2q15_ty],
156             [IntrNoMem, Commutative]>;
157 def int_mips_mulsaq_s_w_ph: GCCBuiltin<"__builtin_mips_mulsaq_s_w_ph">,
158   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
159             [IntrNoMem]>;
160 def int_mips_maq_s_w_phl: GCCBuiltin<"__builtin_mips_maq_s_w_phl">,
161   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
162             [IntrNoMem]>;
163 def int_mips_maq_s_w_phr: GCCBuiltin<"__builtin_mips_maq_s_w_phr">,
164   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
165             [IntrNoMem]>;
166 def int_mips_maq_sa_w_phl: GCCBuiltin<"__builtin_mips_maq_sa_w_phl">,
167   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
168             [IntrNoMem]>;
169 def int_mips_maq_sa_w_phr: GCCBuiltin<"__builtin_mips_maq_sa_w_phr">,
170   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
171             [IntrNoMem]>;
172 def int_mips_mult: GCCBuiltin<"__builtin_mips_mult">,
173   Intrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty],
174             [IntrNoMem, Commutative]>;
175 def int_mips_multu: GCCBuiltin<"__builtin_mips_multu">,
176   Intrinsic<[llvm_i64_ty], [llvm_i32_ty, llvm_i32_ty],
177             [IntrNoMem, Commutative]>;
178
179 //===----------------------------------------------------------------------===//
180 // Dot product with accumulate/subtract
181
182 def int_mips_dpau_h_qbl: GCCBuiltin<"__builtin_mips_dpau_h_qbl">,
183   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_v4i8_ty, llvm_v4i8_ty],
184             [IntrNoMem]>;
185 def int_mips_dpau_h_qbr: GCCBuiltin<"__builtin_mips_dpau_h_qbr">,
186   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_v4i8_ty, llvm_v4i8_ty],
187             [IntrNoMem]>;
188 def int_mips_dpsu_h_qbl: GCCBuiltin<"__builtin_mips_dpsu_h_qbl">,
189   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_v4i8_ty, llvm_v4i8_ty],
190             [IntrNoMem]>;
191 def int_mips_dpsu_h_qbr: GCCBuiltin<"__builtin_mips_dpsu_h_qbr">,
192   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_v4i8_ty, llvm_v4i8_ty],
193             [IntrNoMem]>;
194 def int_mips_dpaq_s_w_ph: GCCBuiltin<"__builtin_mips_dpaq_s_w_ph">,
195   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
196             [IntrNoMem]>;
197 def int_mips_dpsq_s_w_ph: GCCBuiltin<"__builtin_mips_dpsq_s_w_ph">,
198   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_v2q15_ty, mips_v2q15_ty],
199             [IntrNoMem]>;
200 def int_mips_dpaq_sa_l_w: GCCBuiltin<"__builtin_mips_dpaq_sa_l_w">,
201   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_q31_ty, mips_q31_ty],
202             [IntrNoMem]>;
203 def int_mips_dpsq_sa_l_w: GCCBuiltin<"__builtin_mips_dpsq_sa_l_w">,
204   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, mips_q31_ty, mips_q31_ty],
205             [IntrNoMem]>;
206
207 //===----------------------------------------------------------------------===//
208 // Comparison
209
210 def int_mips_cmpu_eq_qb: GCCBuiltin<"__builtin_mips_cmpu_eq_qb">,
211   Intrinsic<[], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem, Commutative]>;
212 def int_mips_cmpu_lt_qb: GCCBuiltin<"__builtin_mips_cmpu_lt_qb">,
213   Intrinsic<[], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem, Commutative]>;
214 def int_mips_cmpu_le_qb: GCCBuiltin<"__builtin_mips_cmpu_le_qb">,
215   Intrinsic<[], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem, Commutative]>;
216 def int_mips_cmpgu_eq_qb: GCCBuiltin<"__builtin_mips_cmpgu_eq_qb">,
217   Intrinsic<[llvm_i32_ty], [llvm_v4i8_ty, llvm_v4i8_ty],
218             [IntrNoMem, Commutative]>;
219 def int_mips_cmpgu_lt_qb: GCCBuiltin<"__builtin_mips_cmpgu_lt_qb">,
220   Intrinsic<[llvm_i32_ty], [llvm_v4i8_ty, llvm_v4i8_ty],
221             [IntrNoMem, Commutative]>;
222 def int_mips_cmpgu_le_qb: GCCBuiltin<"__builtin_mips_cmpgu_le_qb">,
223   Intrinsic<[llvm_i32_ty], [llvm_v4i8_ty, llvm_v4i8_ty],
224             [IntrNoMem, Commutative]>;
225 def int_mips_cmp_eq_ph: GCCBuiltin<"__builtin_mips_cmp_eq_ph">,
226   Intrinsic<[], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem, Commutative]>;
227 def int_mips_cmp_lt_ph: GCCBuiltin<"__builtin_mips_cmp_lt_ph">,
228   Intrinsic<[], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem, Commutative]>;
229 def int_mips_cmp_le_ph: GCCBuiltin<"__builtin_mips_cmp_le_ph">,
230   Intrinsic<[], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem, Commutative]>;
231
232 //===----------------------------------------------------------------------===//
233 // Extracting
234
235 def int_mips_extr_s_h: GCCBuiltin<"__builtin_mips_extr_s_h">,
236   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
237 def int_mips_extr_w: GCCBuiltin<"__builtin_mips_extr_w">,
238   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
239 def int_mips_extr_rs_w: GCCBuiltin<"__builtin_mips_extr_rs_w">,
240   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
241 def int_mips_extr_r_w: GCCBuiltin<"__builtin_mips_extr_r_w">,
242   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
243 def int_mips_extp: GCCBuiltin<"__builtin_mips_extp">,
244   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
245 def int_mips_extpdp: GCCBuiltin<"__builtin_mips_extpdp">,
246   Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
247
248 //===----------------------------------------------------------------------===//
249 // Misc
250
251 def int_mips_wrdsp: GCCBuiltin<"__builtin_mips_wrdsp">,
252   Intrinsic<[], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
253 def int_mips_rddsp: GCCBuiltin<"__builtin_mips_rddsp">,
254   Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
255
256 def int_mips_insv: GCCBuiltin<"__builtin_mips_insv">,
257   Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
258 def int_mips_bitrev: GCCBuiltin<"__builtin_mips_bitrev">,
259   Intrinsic<[llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
260
261 def int_mips_packrl_ph: GCCBuiltin<"__builtin_mips_packrl_ph">,
262   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
263
264 def int_mips_repl_qb: GCCBuiltin<"__builtin_mips_repl_qb">,
265   Intrinsic<[llvm_v4i8_ty], [llvm_i32_ty], [IntrNoMem]>;
266 def int_mips_repl_ph: GCCBuiltin<"__builtin_mips_repl_ph">,
267   Intrinsic<[mips_v2q15_ty], [llvm_i32_ty], [IntrNoMem]>;
268
269 def int_mips_pick_qb: GCCBuiltin<"__builtin_mips_pick_qb">,
270   Intrinsic<[llvm_v4i8_ty], [llvm_v4i8_ty, llvm_v4i8_ty], [IntrNoMem]>;
271 def int_mips_pick_ph: GCCBuiltin<"__builtin_mips_pick_ph">,
272   Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
273
274 def int_mips_mthlip: GCCBuiltin<"__builtin_mips_mthlip">,
275   Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
276
277 def int_mips_bposge32: GCCBuiltin<"__builtin_mips_bposge32">,
278   Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
279
280 def int_mips_lbux: GCCBuiltin<"__builtin_mips_lbux">,
281   Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrReadArgMem]>;
282 def int_mips_lhx: GCCBuiltin<"__builtin_mips_lhx">,
283   Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrReadArgMem]>;
284 def int_mips_lwx: GCCBuiltin<"__builtin_mips_lwx">,
285   Intrinsic<[llvm_i32_ty], [llvm_ptr_ty, llvm_i32_ty], [IntrReadArgMem]>;
286 }