1 //===- IntrinsicsMips.td - Defines Mips intrinsics ---------*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines all of the MIPS-specific intrinsics.
12 //===----------------------------------------------------------------------===//
14 //===----------------------------------------------------------------------===//
15 // MIPS DSP data types
16 def mips_v2q15_ty: LLVMType<v2i16>;
17 def mips_q31_ty: LLVMType<i32>;
19 let TargetPrefix = "mips" in { // All intrinsics start with "llvm.mips.".
21 //===----------------------------------------------------------------------===//
22 // Addition/subtraction
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]>;
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]>;
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]>;
53 def int_mips_msub: GCCBuiltin<"__builtin_mips_msub">,
54 Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
56 def int_mips_msubu: GCCBuiltin<"__builtin_mips_msubu">,
57 Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty, llvm_i32_ty],
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]>;
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]>;
73 def int_mips_modsub: GCCBuiltin<"__builtin_mips_modsub">,
74 Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
76 def int_mips_raddu_w_qb: GCCBuiltin<"__builtin_mips_raddu_w_qb">,
77 Intrinsic<[llvm_i32_ty], [llvm_v4i8_ty], [IntrNoMem]>;
79 //===----------------------------------------------------------------------===//
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]>;
87 //===----------------------------------------------------------------------===//
88 // Precision reduce/expand
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]>;
119 //===----------------------------------------------------------------------===//
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]>;
141 //===----------------------------------------------------------------------===//
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],
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],
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],
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],
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],
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]>;
179 //===----------------------------------------------------------------------===//
180 // Dot product with accumulate/subtract
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],
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],
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],
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],
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],
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],
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],
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],
207 //===----------------------------------------------------------------------===//
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]>;
232 //===----------------------------------------------------------------------===//
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]>;
248 //===----------------------------------------------------------------------===//
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]>;
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]>;
261 def int_mips_packrl_ph: GCCBuiltin<"__builtin_mips_packrl_ph">,
262 Intrinsic<[mips_v2q15_ty], [mips_v2q15_ty, mips_v2q15_ty], [IntrNoMem]>;
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]>;
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]>;
274 def int_mips_mthlip: GCCBuiltin<"__builtin_mips_mthlip">,
275 Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i32_ty], [IntrNoMem]>;
277 def int_mips_bposge32: GCCBuiltin<"__builtin_mips_bposge32">,
278 Intrinsic<[llvm_i32_ty], [], [IntrNoMem]>;
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]>;