Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/mips/mips-msa.md @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 ;; Machine Description for MIPS MSA ASE | |
2 ;; Based on the MIPS MSA spec Revision 1.11 8/4/2014 | |
3 ;; | |
4 ;; Copyright (C) 2015-2017 Free Software Foundation, Inc. | |
5 ;; | |
6 ;; This file is part of GCC. | |
7 ;; | |
8 ;; GCC is free software; you can redistribute it and/or modify | |
9 ;; it under the terms of the GNU General Public License as published by | |
10 ;; the Free Software Foundation; either version 3, or (at your option) | |
11 ;; any later version. | |
12 ;; | |
13 ;; GCC is distributed in the hope that it will be useful, | |
14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 ;; GNU General Public License for more details. | |
17 ;; | |
18 ;; You should have received a copy of the GNU General Public License | |
19 ;; along with GCC; see the file COPYING3. If not see | |
20 ;; <http://www.gnu.org/licenses/>. | |
21 ;; | |
22 | |
23 (define_c_enum "unspec" [ | |
24 UNSPEC_MSA_ASUB_S | |
25 UNSPEC_MSA_ASUB_U | |
26 UNSPEC_MSA_AVE_S | |
27 UNSPEC_MSA_AVE_U | |
28 UNSPEC_MSA_AVER_S | |
29 UNSPEC_MSA_AVER_U | |
30 UNSPEC_MSA_BCLR | |
31 UNSPEC_MSA_BCLRI | |
32 UNSPEC_MSA_BINSL | |
33 UNSPEC_MSA_BINSLI | |
34 UNSPEC_MSA_BINSR | |
35 UNSPEC_MSA_BINSRI | |
36 UNSPEC_MSA_BNEG | |
37 UNSPEC_MSA_BNEGI | |
38 UNSPEC_MSA_BSET | |
39 UNSPEC_MSA_BSETI | |
40 UNSPEC_MSA_BRANCH_V | |
41 UNSPEC_MSA_BRANCH | |
42 UNSPEC_MSA_CFCMSA | |
43 UNSPEC_MSA_CTCMSA | |
44 UNSPEC_MSA_FCAF | |
45 UNSPEC_MSA_FCLASS | |
46 UNSPEC_MSA_FCUNE | |
47 UNSPEC_MSA_FEXDO | |
48 UNSPEC_MSA_FEXP2 | |
49 UNSPEC_MSA_FEXUPL | |
50 UNSPEC_MSA_FEXUPR | |
51 UNSPEC_MSA_FFQL | |
52 UNSPEC_MSA_FFQR | |
53 UNSPEC_MSA_FLOG2 | |
54 UNSPEC_MSA_FRCP | |
55 UNSPEC_MSA_FRINT | |
56 UNSPEC_MSA_FRSQRT | |
57 UNSPEC_MSA_FSAF | |
58 UNSPEC_MSA_FSEQ | |
59 UNSPEC_MSA_FSLE | |
60 UNSPEC_MSA_FSLT | |
61 UNSPEC_MSA_FSNE | |
62 UNSPEC_MSA_FSOR | |
63 UNSPEC_MSA_FSUEQ | |
64 UNSPEC_MSA_FSULE | |
65 UNSPEC_MSA_FSULT | |
66 UNSPEC_MSA_FSUN | |
67 UNSPEC_MSA_FSUNE | |
68 UNSPEC_MSA_FTINT_S | |
69 UNSPEC_MSA_FTINT_U | |
70 UNSPEC_MSA_FTQ | |
71 UNSPEC_MSA_MADD_Q | |
72 UNSPEC_MSA_MADDR_Q | |
73 UNSPEC_MSA_MSUB_Q | |
74 UNSPEC_MSA_MSUBR_Q | |
75 UNSPEC_MSA_MUL_Q | |
76 UNSPEC_MSA_MULR_Q | |
77 UNSPEC_MSA_NLOC | |
78 UNSPEC_MSA_SAT_S | |
79 UNSPEC_MSA_SAT_U | |
80 UNSPEC_MSA_SLD | |
81 UNSPEC_MSA_SLDI | |
82 UNSPEC_MSA_SPLAT | |
83 UNSPEC_MSA_SPLATI | |
84 UNSPEC_MSA_SRAR | |
85 UNSPEC_MSA_SRARI | |
86 UNSPEC_MSA_SRLR | |
87 UNSPEC_MSA_SRLRI | |
88 UNSPEC_MSA_SUBS_S | |
89 UNSPEC_MSA_SUBS_U | |
90 UNSPEC_MSA_SUBSUU_S | |
91 UNSPEC_MSA_SUBSUS_U | |
92 UNSPEC_MSA_VSHF | |
93 ]) | |
94 | |
95 ;; All vector modes with 128 bits. | |
96 (define_mode_iterator MSA [V2DF V4SF V2DI V4SI V8HI V16QI]) | |
97 | |
98 ;; Same as MSA. Used by vcond to iterate two modes. | |
99 (define_mode_iterator MSA_2 [V2DF V4SF V2DI V4SI V8HI V16QI]) | |
100 | |
101 ;; Only used for splitting insert_d and copy_{u,s}.d. | |
102 (define_mode_iterator MSA_D [V2DI V2DF]) | |
103 | |
104 ;; Only used for copy_{u,s}.w. | |
105 (define_mode_iterator MSA_W [V4SI V4SF]) | |
106 | |
107 ;; Only integer modes. | |
108 (define_mode_iterator IMSA [V2DI V4SI V8HI V16QI]) | |
109 | |
110 ;; As IMSA but excludes V16QI. | |
111 (define_mode_iterator IMSA_DWH [V2DI V4SI V8HI]) | |
112 | |
113 ;; As IMSA but excludes V2DI. | |
114 (define_mode_iterator IMSA_WHB [V4SI V8HI V16QI]) | |
115 | |
116 ;; Only integer modes equal or larger than a word. | |
117 (define_mode_iterator IMSA_DW [V2DI V4SI]) | |
118 | |
119 ;; Only integer modes smaller than a word. | |
120 (define_mode_iterator IMSA_HB [V8HI V16QI]) | |
121 | |
122 ;; Only integer modes for fixed-point madd_q/maddr_q. | |
123 (define_mode_iterator IMSA_WH [V4SI V8HI]) | |
124 | |
125 ;; Only floating-point modes. | |
126 (define_mode_iterator FMSA [V2DF V4SF]) | |
127 | |
128 ;; Only used for immediate set shuffle elements instruction. | |
129 (define_mode_iterator MSA_WHB_W [V4SI V8HI V16QI V4SF]) | |
130 | |
131 ;; The attribute gives the integer vector mode with same size. | |
132 (define_mode_attr VIMODE | |
133 [(V2DF "V2DI") | |
134 (V4SF "V4SI") | |
135 (V2DI "V2DI") | |
136 (V4SI "V4SI") | |
137 (V8HI "V8HI") | |
138 (V16QI "V16QI")]) | |
139 | |
140 ;; The attribute gives half modes for vector modes. | |
141 (define_mode_attr VHMODE | |
142 [(V8HI "V16QI") | |
143 (V4SI "V8HI") | |
144 (V2DI "V4SI")]) | |
145 | |
146 ;; The attribute gives double modes for vector modes. | |
147 (define_mode_attr VDMODE | |
148 [(V4SI "V2DI") | |
149 (V8HI "V4SI") | |
150 (V16QI "V8HI")]) | |
151 | |
152 ;; The attribute gives half modes with same number of elements for vector modes. | |
153 (define_mode_attr VTRUNCMODE | |
154 [(V8HI "V8QI") | |
155 (V4SI "V4HI") | |
156 (V2DI "V2SI")]) | |
157 | |
158 ;; This attribute gives the mode of the result for "copy_s_b, copy_u_b" etc. | |
159 (define_mode_attr VRES | |
160 [(V2DF "DF") | |
161 (V4SF "SF") | |
162 (V2DI "DI") | |
163 (V4SI "SI") | |
164 (V8HI "SI") | |
165 (V16QI "SI")]) | |
166 | |
167 ;; Only used with MSA_D iterator. | |
168 (define_mode_attr msa_d | |
169 [(V2DI "reg_or_0") | |
170 (V2DF "register")]) | |
171 | |
172 ;; This attribute gives the integer vector mode with same size. | |
173 (define_mode_attr mode_i | |
174 [(V2DF "v2di") | |
175 (V4SF "v4si") | |
176 (V2DI "v2di") | |
177 (V4SI "v4si") | |
178 (V8HI "v8hi") | |
179 (V16QI "v16qi")]) | |
180 | |
181 ;; This attribute gives suffix for MSA instructions. | |
182 (define_mode_attr msafmt | |
183 [(V2DF "d") | |
184 (V4SF "w") | |
185 (V2DI "d") | |
186 (V4SI "w") | |
187 (V8HI "h") | |
188 (V16QI "b")]) | |
189 | |
190 ;; This attribute gives suffix for integers in VHMODE. | |
191 (define_mode_attr hmsafmt | |
192 [(V2DI "w") | |
193 (V4SI "h") | |
194 (V8HI "b")]) | |
195 | |
196 ;; This attribute gives define_insn suffix for MSA instructions that need | |
197 ;; distinction between integer and floating point. | |
198 (define_mode_attr msafmt_f | |
199 [(V2DF "d_f") | |
200 (V4SF "w_f") | |
201 (V2DI "d") | |
202 (V4SI "w") | |
203 (V8HI "h") | |
204 (V16QI "b")]) | |
205 | |
206 ;; This is used to form an immediate operand constraint using | |
207 ;; "const_<indeximm>_operand". | |
208 (define_mode_attr indeximm | |
209 [(V2DF "0_or_1") | |
210 (V4SF "0_to_3") | |
211 (V2DI "0_or_1") | |
212 (V4SI "0_to_3") | |
213 (V8HI "uimm3") | |
214 (V16QI "uimm4")]) | |
215 | |
216 ;; This attribute represents bitmask needed for vec_merge using | |
217 ;; "const_<bitmask>_operand". | |
218 (define_mode_attr bitmask | |
219 [(V2DF "exp_2") | |
220 (V4SF "exp_4") | |
221 (V2DI "exp_2") | |
222 (V4SI "exp_4") | |
223 (V8HI "exp_8") | |
224 (V16QI "exp_16")]) | |
225 | |
226 ;; This attribute is used to form an immediate operand constraint using | |
227 ;; "const_<bitimm>_operand". | |
228 (define_mode_attr bitimm | |
229 [(V16QI "uimm3") | |
230 (V8HI "uimm4") | |
231 (V4SI "uimm5") | |
232 (V2DI "uimm6")]) | |
233 | |
234 (define_expand "vec_init<mode><unitmode>" | |
235 [(match_operand:MSA 0 "register_operand") | |
236 (match_operand:MSA 1 "")] | |
237 "ISA_HAS_MSA" | |
238 { | |
239 mips_expand_vector_init (operands[0], operands[1]); | |
240 DONE; | |
241 }) | |
242 | |
243 ;; pckev pattern with implicit type conversion. | |
244 (define_insn "vec_pack_trunc_<mode>" | |
245 [(set (match_operand:<VHMODE> 0 "register_operand" "=f") | |
246 (vec_concat:<VHMODE> | |
247 (truncate:<VTRUNCMODE> | |
248 (match_operand:IMSA_DWH 1 "register_operand" "f")) | |
249 (truncate:<VTRUNCMODE> | |
250 (match_operand:IMSA_DWH 2 "register_operand" "f"))))] | |
251 "ISA_HAS_MSA" | |
252 "pckev.<hmsafmt>\t%w0,%w2,%w1" | |
253 [(set_attr "type" "simd_permute") | |
254 (set_attr "mode" "<MODE>")]) | |
255 | |
256 (define_expand "vec_unpacks_hi_v4sf" | |
257 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
258 (float_extend:V2DF | |
259 (vec_select:V2SF | |
260 (match_operand:V4SF 1 "register_operand" "f") | |
261 (match_dup 2))))] | |
262 "ISA_HAS_MSA" | |
263 { | |
264 operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, true/*high_p*/); | |
265 }) | |
266 | |
267 (define_expand "vec_unpacks_lo_v4sf" | |
268 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
269 (float_extend:V2DF | |
270 (vec_select:V2SF | |
271 (match_operand:V4SF 1 "register_operand" "f") | |
272 (match_dup 2))))] | |
273 "ISA_HAS_MSA" | |
274 { | |
275 operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, false/*high_p*/); | |
276 }) | |
277 | |
278 (define_expand "vec_unpacks_hi_<mode>" | |
279 [(match_operand:<VDMODE> 0 "register_operand") | |
280 (match_operand:IMSA_WHB 1 "register_operand")] | |
281 "ISA_HAS_MSA" | |
282 { | |
283 mips_expand_vec_unpack (operands, false/*unsigned_p*/, true/*high_p*/); | |
284 DONE; | |
285 }) | |
286 | |
287 (define_expand "vec_unpacks_lo_<mode>" | |
288 [(match_operand:<VDMODE> 0 "register_operand") | |
289 (match_operand:IMSA_WHB 1 "register_operand")] | |
290 "ISA_HAS_MSA" | |
291 { | |
292 mips_expand_vec_unpack (operands, false/*unsigned_p*/, false/*high_p*/); | |
293 DONE; | |
294 }) | |
295 | |
296 (define_expand "vec_unpacku_hi_<mode>" | |
297 [(match_operand:<VDMODE> 0 "register_operand") | |
298 (match_operand:IMSA_WHB 1 "register_operand")] | |
299 "ISA_HAS_MSA" | |
300 { | |
301 mips_expand_vec_unpack (operands, true/*unsigned_p*/, true/*high_p*/); | |
302 DONE; | |
303 }) | |
304 | |
305 (define_expand "vec_unpacku_lo_<mode>" | |
306 [(match_operand:<VDMODE> 0 "register_operand") | |
307 (match_operand:IMSA_WHB 1 "register_operand")] | |
308 "ISA_HAS_MSA" | |
309 { | |
310 mips_expand_vec_unpack (operands, true/*unsigned_p*/, false/*high_p*/); | |
311 DONE; | |
312 }) | |
313 | |
314 (define_expand "vec_extract<mode><unitmode>" | |
315 [(match_operand:<UNITMODE> 0 "register_operand") | |
316 (match_operand:IMSA 1 "register_operand") | |
317 (match_operand 2 "const_<indeximm>_operand")] | |
318 "ISA_HAS_MSA" | |
319 { | |
320 if (<UNITMODE>mode == QImode || <UNITMODE>mode == HImode) | |
321 { | |
322 rtx dest1 = gen_reg_rtx (SImode); | |
323 emit_insn (gen_msa_copy_s_<msafmt> (dest1, operands[1], operands[2])); | |
324 emit_move_insn (operands[0], | |
325 gen_lowpart (<UNITMODE>mode, dest1)); | |
326 } | |
327 else | |
328 emit_insn (gen_msa_copy_s_<msafmt> (operands[0], operands[1], operands[2])); | |
329 DONE; | |
330 }) | |
331 | |
332 (define_expand "vec_extract<mode><unitmode>" | |
333 [(match_operand:<UNITMODE> 0 "register_operand") | |
334 (match_operand:FMSA 1 "register_operand") | |
335 (match_operand 2 "const_<indeximm>_operand")] | |
336 "ISA_HAS_MSA" | |
337 { | |
338 rtx temp; | |
339 HOST_WIDE_INT val = INTVAL (operands[2]); | |
340 | |
341 if (val == 0) | |
342 temp = operands[1]; | |
343 else | |
344 { | |
345 /* We need to do the SLDI operation in V16QImode and adjust | |
346 operands[2] accordingly. */ | |
347 rtx wd = gen_reg_rtx (V16QImode); | |
348 rtx ws = gen_reg_rtx (V16QImode); | |
349 emit_move_insn (ws, gen_rtx_SUBREG (V16QImode, operands[1], 0)); | |
350 rtx n = GEN_INT (val * GET_MODE_SIZE (<UNITMODE>mode)); | |
351 gcc_assert (INTVAL (n) < GET_MODE_NUNITS (V16QImode)); | |
352 emit_insn (gen_msa_sldi_b (wd, ws, ws, n)); | |
353 temp = gen_reg_rtx (<MODE>mode); | |
354 emit_move_insn (temp, gen_rtx_SUBREG (<MODE>mode, wd, 0)); | |
355 } | |
356 emit_insn (gen_msa_vec_extract_<msafmt_f> (operands[0], temp)); | |
357 DONE; | |
358 }) | |
359 | |
360 (define_insn_and_split "msa_vec_extract_<msafmt_f>" | |
361 [(set (match_operand:<UNITMODE> 0 "register_operand" "=f") | |
362 (vec_select:<UNITMODE> | |
363 (match_operand:FMSA 1 "register_operand" "f") | |
364 (parallel [(const_int 0)])))] | |
365 "ISA_HAS_MSA" | |
366 "#" | |
367 "&& reload_completed" | |
368 [(set (match_dup 0) (match_dup 1))] | |
369 { | |
370 /* An MSA register cannot be reinterpreted as a single precision | |
371 register when using -mno-odd-spreg and the MSA register is | |
372 an odd number. */ | |
373 if (<UNITMODE>mode == SFmode && !TARGET_ODD_SPREG | |
374 && (REGNO (operands[1]) & 1)) | |
375 { | |
376 emit_move_insn (gen_rtx_REG (<MODE>mode, REGNO (operands[0])), | |
377 operands[1]); | |
378 operands[1] = operands[0]; | |
379 } | |
380 else | |
381 operands[1] = gen_rtx_REG (<UNITMODE>mode, REGNO (operands[1])); | |
382 } | |
383 [(set_attr "move_type" "fmove") | |
384 (set_attr "mode" "<UNITMODE>")]) | |
385 | |
386 (define_expand "vec_set<mode>" | |
387 [(match_operand:IMSA 0 "register_operand") | |
388 (match_operand:<UNITMODE> 1 "reg_or_0_operand") | |
389 (match_operand 2 "const_<indeximm>_operand")] | |
390 "ISA_HAS_MSA" | |
391 { | |
392 rtx index = GEN_INT (1 << INTVAL (operands[2])); | |
393 emit_insn (gen_msa_insert_<msafmt> (operands[0], operands[1], | |
394 operands[0], index)); | |
395 DONE; | |
396 }) | |
397 | |
398 (define_expand "vec_set<mode>" | |
399 [(match_operand:FMSA 0 "register_operand") | |
400 (match_operand:<UNITMODE> 1 "register_operand") | |
401 (match_operand 2 "const_<indeximm>_operand")] | |
402 "ISA_HAS_MSA" | |
403 { | |
404 rtx index = GEN_INT (1 << INTVAL (operands[2])); | |
405 emit_insn (gen_msa_insve_<msafmt_f>_scalar (operands[0], operands[1], | |
406 operands[0], index)); | |
407 DONE; | |
408 }) | |
409 | |
410 (define_expand "vcondu<MSA:mode><IMSA:mode>" | |
411 [(match_operand:MSA 0 "register_operand") | |
412 (match_operand:MSA 1 "reg_or_m1_operand") | |
413 (match_operand:MSA 2 "reg_or_0_operand") | |
414 (match_operator 3 "" | |
415 [(match_operand:IMSA 4 "register_operand") | |
416 (match_operand:IMSA 5 "register_operand")])] | |
417 "ISA_HAS_MSA | |
418 && (GET_MODE_NUNITS (<MSA:MODE>mode) == GET_MODE_NUNITS (<IMSA:MODE>mode))" | |
419 { | |
420 mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands); | |
421 DONE; | |
422 }) | |
423 | |
424 (define_expand "vcond<MSA:mode><MSA_2:mode>" | |
425 [(match_operand:MSA 0 "register_operand") | |
426 (match_operand:MSA 1 "reg_or_m1_operand") | |
427 (match_operand:MSA 2 "reg_or_0_operand") | |
428 (match_operator 3 "" | |
429 [(match_operand:MSA_2 4 "register_operand") | |
430 (match_operand:MSA_2 5 "register_operand")])] | |
431 "ISA_HAS_MSA | |
432 && (GET_MODE_NUNITS (<MSA:MODE>mode) == GET_MODE_NUNITS (<MSA_2:MODE>mode))" | |
433 { | |
434 mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands); | |
435 DONE; | |
436 }) | |
437 | |
438 (define_insn "msa_insert_<msafmt_f>" | |
439 [(set (match_operand:MSA 0 "register_operand" "=f") | |
440 (vec_merge:MSA | |
441 (vec_duplicate:MSA | |
442 (match_operand:<UNITMODE> 1 "reg_or_0_operand" "dJ")) | |
443 (match_operand:MSA 2 "register_operand" "0") | |
444 (match_operand 3 "const_<bitmask>_operand" "")))] | |
445 "ISA_HAS_MSA" | |
446 { | |
447 if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode)) | |
448 return "#"; | |
449 else | |
450 return "insert.<msafmt>\t%w0[%y3],%z1"; | |
451 } | |
452 [(set_attr "type" "simd_insert") | |
453 (set_attr "mode" "<MODE>")]) | |
454 | |
455 (define_split | |
456 [(set (match_operand:MSA_D 0 "register_operand") | |
457 (vec_merge:MSA_D | |
458 (vec_duplicate:MSA_D | |
459 (match_operand:<UNITMODE> 1 "<MSA_D:msa_d>_operand")) | |
460 (match_operand:MSA_D 2 "register_operand") | |
461 (match_operand 3 "const_<bitmask>_operand")))] | |
462 "reload_completed && ISA_HAS_MSA && !TARGET_64BIT" | |
463 [(const_int 0)] | |
464 { | |
465 mips_split_msa_insert_d (operands[0], operands[2], operands[3], operands[1]); | |
466 DONE; | |
467 }) | |
468 | |
469 (define_insn "msa_insve_<msafmt_f>" | |
470 [(set (match_operand:MSA 0 "register_operand" "=f") | |
471 (vec_merge:MSA | |
472 (vec_duplicate:MSA | |
473 (vec_select:<UNITMODE> | |
474 (match_operand:MSA 1 "register_operand" "f") | |
475 (parallel [(const_int 0)]))) | |
476 (match_operand:MSA 2 "register_operand" "0") | |
477 (match_operand 3 "const_<bitmask>_operand" "")))] | |
478 "ISA_HAS_MSA" | |
479 "insve.<msafmt>\t%w0[%y3],%w1[0]" | |
480 [(set_attr "type" "simd_insert") | |
481 (set_attr "mode" "<MODE>")]) | |
482 | |
483 ;; Operand 3 is a scalar. | |
484 (define_insn "msa_insve_<msafmt_f>_scalar" | |
485 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
486 (vec_merge:FMSA | |
487 (vec_duplicate:FMSA | |
488 (match_operand:<UNITMODE> 1 "register_operand" "f")) | |
489 (match_operand:FMSA 2 "register_operand" "0") | |
490 (match_operand 3 "const_<bitmask>_operand" "")))] | |
491 "ISA_HAS_MSA" | |
492 "insve.<msafmt>\t%w0[%y3],%w1[0]" | |
493 [(set_attr "type" "simd_insert") | |
494 (set_attr "mode" "<MODE>")]) | |
495 | |
496 (define_insn "msa_copy_<su>_<msafmt>" | |
497 [(set (match_operand:<VRES> 0 "register_operand" "=d") | |
498 (any_extend:<VRES> | |
499 (vec_select:<UNITMODE> | |
500 (match_operand:IMSA_HB 1 "register_operand" "f") | |
501 (parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))] | |
502 "ISA_HAS_MSA" | |
503 "copy_<su>.<msafmt>\t%0,%w1[%2]" | |
504 [(set_attr "type" "simd_copy") | |
505 (set_attr "mode" "<MODE>")]) | |
506 | |
507 (define_insn "msa_copy_u_w" | |
508 [(set (match_operand:DI 0 "register_operand" "=d") | |
509 (zero_extend:DI | |
510 (vec_select:SI | |
511 (match_operand:V4SI 1 "register_operand" "f") | |
512 (parallel [(match_operand 2 "const_0_to_3_operand" "")]))))] | |
513 "ISA_HAS_MSA && TARGET_64BIT" | |
514 "copy_u.w\t%0,%w1[%2]" | |
515 [(set_attr "type" "simd_copy") | |
516 (set_attr "mode" "V4SI")]) | |
517 | |
518 (define_insn "msa_copy_s_<msafmt_f>_64bit" | |
519 [(set (match_operand:DI 0 "register_operand" "=d") | |
520 (sign_extend:DI | |
521 (vec_select:<UNITMODE> | |
522 (match_operand:MSA_W 1 "register_operand" "f") | |
523 (parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))] | |
524 "ISA_HAS_MSA && TARGET_64BIT" | |
525 "copy_s.<msafmt>\t%0,%w1[%2]" | |
526 [(set_attr "type" "simd_copy") | |
527 (set_attr "mode" "<MODE>")]) | |
528 | |
529 (define_insn "msa_copy_s_<msafmt_f>" | |
530 [(set (match_operand:<UNITMODE> 0 "register_operand" "=d") | |
531 (vec_select:<UNITMODE> | |
532 (match_operand:MSA_W 1 "register_operand" "f") | |
533 (parallel [(match_operand 2 "const_<indeximm>_operand" "")])))] | |
534 "ISA_HAS_MSA" | |
535 "copy_s.<msafmt>\t%0,%w1[%2]" | |
536 [(set_attr "type" "simd_copy") | |
537 (set_attr "mode" "<MODE>")]) | |
538 | |
539 (define_insn_and_split "msa_copy_s_<msafmt_f>" | |
540 [(set (match_operand:<UNITMODE> 0 "register_operand" "=d") | |
541 (vec_select:<UNITMODE> | |
542 (match_operand:MSA_D 1 "register_operand" "f") | |
543 (parallel [(match_operand 2 "const_<indeximm>_operand" "")])))] | |
544 "ISA_HAS_MSA" | |
545 { | |
546 if (TARGET_64BIT) | |
547 return "copy_s.<msafmt>\t%0,%w1[%2]"; | |
548 else | |
549 return "#"; | |
550 } | |
551 "reload_completed && ISA_HAS_MSA && !TARGET_64BIT" | |
552 [(const_int 0)] | |
553 { | |
554 mips_split_msa_copy_d (operands[0], operands[1], operands[2], | |
555 gen_msa_copy_s_w); | |
556 DONE; | |
557 } | |
558 [(set_attr "type" "simd_copy") | |
559 (set_attr "mode" "<MODE>")]) | |
560 | |
561 (define_expand "vec_perm_const<mode>" | |
562 [(match_operand:MSA 0 "register_operand") | |
563 (match_operand:MSA 1 "register_operand") | |
564 (match_operand:MSA 2 "register_operand") | |
565 (match_operand:<VIMODE> 3 "")] | |
566 "ISA_HAS_MSA" | |
567 { | |
568 if (mips_expand_vec_perm_const (operands)) | |
569 DONE; | |
570 else | |
571 FAIL; | |
572 }) | |
573 | |
574 (define_expand "abs<mode>2" | |
575 [(match_operand:IMSA 0 "register_operand" "=f") | |
576 (abs:IMSA (match_operand:IMSA 1 "register_operand" "f"))] | |
577 "ISA_HAS_MSA" | |
578 { | |
579 rtx reg = gen_reg_rtx (<MODE>mode); | |
580 emit_move_insn (reg, CONST0_RTX (<MODE>mode)); | |
581 emit_insn (gen_msa_add_a_<msafmt> (operands[0], operands[1], reg)); | |
582 DONE; | |
583 }) | |
584 | |
585 (define_expand "neg<mode>2" | |
586 [(set (match_operand:MSA 0 "register_operand") | |
587 (minus:MSA (match_dup 2) | |
588 (match_operand:MSA 1 "register_operand")))] | |
589 "ISA_HAS_MSA" | |
590 { | |
591 rtx reg = gen_reg_rtx (<MODE>mode); | |
592 emit_move_insn (reg, CONST0_RTX (<MODE>mode)); | |
593 operands[2] = reg; | |
594 }) | |
595 | |
596 (define_expand "msa_ldi<mode>" | |
597 [(match_operand:IMSA 0 "register_operand") | |
598 (match_operand 1 "const_imm10_operand")] | |
599 "ISA_HAS_MSA" | |
600 { | |
601 if (<MODE>mode == V16QImode) | |
602 operands[1] = GEN_INT (trunc_int_for_mode (INTVAL (operands[1]), | |
603 <UNITMODE>mode)); | |
604 emit_move_insn (operands[0], | |
605 mips_gen_const_int_vector (<MODE>mode, INTVAL (operands[1]))); | |
606 DONE; | |
607 }) | |
608 | |
609 (define_insn "vec_perm<mode>" | |
610 [(set (match_operand:MSA 0 "register_operand" "=f") | |
611 (unspec:MSA [(match_operand:MSA 1 "register_operand" "f") | |
612 (match_operand:MSA 2 "register_operand" "f") | |
613 (match_operand:<VIMODE> 3 "register_operand" "0")] | |
614 UNSPEC_MSA_VSHF))] | |
615 "ISA_HAS_MSA" | |
616 "vshf.<msafmt>\t%w0,%w2,%w1" | |
617 [(set_attr "type" "simd_sld") | |
618 (set_attr "mode" "<MODE>")]) | |
619 | |
620 (define_expand "mov<mode>" | |
621 [(set (match_operand:MSA 0) | |
622 (match_operand:MSA 1))] | |
623 "ISA_HAS_MSA" | |
624 { | |
625 if (mips_legitimize_move (<MODE>mode, operands[0], operands[1])) | |
626 DONE; | |
627 }) | |
628 | |
629 (define_expand "movmisalign<mode>" | |
630 [(set (match_operand:MSA 0) | |
631 (match_operand:MSA 1))] | |
632 "ISA_HAS_MSA" | |
633 { | |
634 if (mips_legitimize_move (<MODE>mode, operands[0], operands[1])) | |
635 DONE; | |
636 }) | |
637 | |
638 ;; 128-bit MSA modes can only exist in MSA registers or memory. An exception | |
639 ;; is allowing MSA modes for GP registers for arguments and return values. | |
640 (define_insn "mov<mode>_msa" | |
641 [(set (match_operand:MSA 0 "nonimmediate_operand" "=f,f,R,*d,*f") | |
642 (match_operand:MSA 1 "move_operand" "fYGYI,R,f,*f,*d"))] | |
643 "ISA_HAS_MSA" | |
644 { return mips_output_move (operands[0], operands[1]); } | |
645 [(set_attr "type" "simd_move,simd_load,simd_store,simd_copy,simd_insert") | |
646 (set_attr "mode" "<MODE>")]) | |
647 | |
648 (define_split | |
649 [(set (match_operand:MSA 0 "nonimmediate_operand") | |
650 (match_operand:MSA 1 "move_operand"))] | |
651 "reload_completed && ISA_HAS_MSA | |
652 && mips_split_move_insn_p (operands[0], operands[1], insn)" | |
653 [(const_int 0)] | |
654 { | |
655 mips_split_move_insn (operands[0], operands[1], curr_insn); | |
656 DONE; | |
657 }) | |
658 | |
659 ;; Offset load | |
660 (define_expand "msa_ld_<msafmt_f>" | |
661 [(match_operand:MSA 0 "register_operand") | |
662 (match_operand 1 "pmode_register_operand") | |
663 (match_operand 2 "aq10<msafmt>_operand")] | |
664 "ISA_HAS_MSA" | |
665 { | |
666 rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], | |
667 INTVAL (operands[2])); | |
668 mips_emit_move (operands[0], gen_rtx_MEM (<MODE>mode, addr)); | |
669 DONE; | |
670 }) | |
671 | |
672 ;; Offset store | |
673 (define_expand "msa_st_<msafmt_f>" | |
674 [(match_operand:MSA 0 "register_operand") | |
675 (match_operand 1 "pmode_register_operand") | |
676 (match_operand 2 "aq10<msafmt>_operand")] | |
677 "ISA_HAS_MSA" | |
678 { | |
679 rtx addr = plus_constant (GET_MODE (operands[1]), operands[1], | |
680 INTVAL (operands[2])); | |
681 mips_emit_move (gen_rtx_MEM (<MODE>mode, addr), operands[0]); | |
682 DONE; | |
683 }) | |
684 | |
685 ;; Integer operations | |
686 (define_insn "add<mode>3" | |
687 [(set (match_operand:IMSA 0 "register_operand" "=f,f,f") | |
688 (plus:IMSA | |
689 (match_operand:IMSA 1 "register_operand" "f,f,f") | |
690 (match_operand:IMSA 2 "reg_or_vector_same_ximm5_operand" "f,Unv5,Uuv5")))] | |
691 "ISA_HAS_MSA" | |
692 { | |
693 switch (which_alternative) | |
694 { | |
695 case 0: | |
696 return "addv.<msafmt>\t%w0,%w1,%w2"; | |
697 case 1: | |
698 { | |
699 HOST_WIDE_INT val = INTVAL (CONST_VECTOR_ELT (operands[2], 0)); | |
700 | |
701 operands[2] = GEN_INT (-val); | |
702 return "subvi.<msafmt>\t%w0,%w1,%d2"; | |
703 } | |
704 case 2: | |
705 return "addvi.<msafmt>\t%w0,%w1,%E2"; | |
706 default: | |
707 gcc_unreachable (); | |
708 } | |
709 } | |
710 [(set_attr "alu_type" "simd_add") | |
711 (set_attr "type" "simd_int_arith") | |
712 (set_attr "mode" "<MODE>")]) | |
713 | |
714 (define_insn "sub<mode>3" | |
715 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
716 (minus:IMSA | |
717 (match_operand:IMSA 1 "register_operand" "f,f") | |
718 (match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))] | |
719 "ISA_HAS_MSA" | |
720 "@ | |
721 subv.<msafmt>\t%w0,%w1,%w2 | |
722 subvi.<msafmt>\t%w0,%w1,%E2" | |
723 [(set_attr "alu_type" "simd_add") | |
724 (set_attr "type" "simd_int_arith") | |
725 (set_attr "mode" "<MODE>")]) | |
726 | |
727 (define_insn "mul<mode>3" | |
728 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
729 (mult:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
730 (match_operand:IMSA 2 "register_operand" "f")))] | |
731 "ISA_HAS_MSA" | |
732 "mulv.<msafmt>\t%w0,%w1,%w2" | |
733 [(set_attr "type" "simd_mul") | |
734 (set_attr "mode" "<MODE>")]) | |
735 | |
736 (define_insn "msa_maddv_<msafmt>" | |
737 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
738 (plus:IMSA (mult:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
739 (match_operand:IMSA 2 "register_operand" "f")) | |
740 (match_operand:IMSA 3 "register_operand" "0")))] | |
741 "ISA_HAS_MSA" | |
742 "maddv.<msafmt>\t%w0,%w1,%w2" | |
743 [(set_attr "type" "simd_mul") | |
744 (set_attr "mode" "<MODE>")]) | |
745 | |
746 (define_insn "msa_msubv_<msafmt>" | |
747 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
748 (minus:IMSA (match_operand:IMSA 1 "register_operand" "0") | |
749 (mult:IMSA (match_operand:IMSA 2 "register_operand" "f") | |
750 (match_operand:IMSA 3 "register_operand" "f"))))] | |
751 "ISA_HAS_MSA" | |
752 "msubv.<msafmt>\t%w0,%w2,%w3" | |
753 [(set_attr "type" "simd_mul") | |
754 (set_attr "mode" "<MODE>")]) | |
755 | |
756 (define_insn "div<mode>3" | |
757 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
758 (div:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
759 (match_operand:IMSA 2 "register_operand" "f")))] | |
760 "ISA_HAS_MSA" | |
761 { return mips_msa_output_division ("div_s.<msafmt>\t%w0,%w1,%w2", operands); } | |
762 [(set_attr "type" "simd_div") | |
763 (set_attr "mode" "<MODE>")]) | |
764 | |
765 (define_insn "udiv<mode>3" | |
766 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
767 (udiv:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
768 (match_operand:IMSA 2 "register_operand" "f")))] | |
769 "ISA_HAS_MSA" | |
770 { return mips_msa_output_division ("div_u.<msafmt>\t%w0,%w1,%w2", operands); } | |
771 [(set_attr "type" "simd_div") | |
772 (set_attr "mode" "<MODE>")]) | |
773 | |
774 (define_insn "mod<mode>3" | |
775 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
776 (mod:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
777 (match_operand:IMSA 2 "register_operand" "f")))] | |
778 "ISA_HAS_MSA" | |
779 { return mips_msa_output_division ("mod_s.<msafmt>\t%w0,%w1,%w2", operands); } | |
780 [(set_attr "type" "simd_div") | |
781 (set_attr "mode" "<MODE>")]) | |
782 | |
783 (define_insn "umod<mode>3" | |
784 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
785 (umod:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
786 (match_operand:IMSA 2 "register_operand" "f")))] | |
787 "ISA_HAS_MSA" | |
788 { return mips_msa_output_division ("mod_u.<msafmt>\t%w0,%w1,%w2", operands); } | |
789 [(set_attr "type" "simd_div") | |
790 (set_attr "mode" "<MODE>")]) | |
791 | |
792 (define_insn "xor<mode>3" | |
793 [(set (match_operand:IMSA 0 "register_operand" "=f,f,f") | |
794 (xor:IMSA | |
795 (match_operand:IMSA 1 "register_operand" "f,f,f") | |
796 (match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YC,Urv8")))] | |
797 "ISA_HAS_MSA" | |
798 "@ | |
799 xor.v\t%w0,%w1,%w2 | |
800 bnegi.%v0\t%w0,%w1,%V2 | |
801 xori.b\t%w0,%w1,%B2" | |
802 [(set_attr "type" "simd_logic,simd_bit,simd_logic") | |
803 (set_attr "mode" "<MODE>")]) | |
804 | |
805 (define_insn "ior<mode>3" | |
806 [(set (match_operand:IMSA 0 "register_operand" "=f,f,f") | |
807 (ior:IMSA | |
808 (match_operand:IMSA 1 "register_operand" "f,f,f") | |
809 (match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YC,Urv8")))] | |
810 "ISA_HAS_MSA" | |
811 "@ | |
812 or.v\t%w0,%w1,%w2 | |
813 bseti.%v0\t%w0,%w1,%V2 | |
814 ori.b\t%w0,%w1,%B2" | |
815 [(set_attr "type" "simd_logic,simd_bit,simd_logic") | |
816 (set_attr "mode" "<MODE>")]) | |
817 | |
818 (define_insn "and<mode>3" | |
819 [(set (match_operand:IMSA 0 "register_operand" "=f,f,f") | |
820 (and:IMSA | |
821 (match_operand:IMSA 1 "register_operand" "f,f,f") | |
822 (match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,YZ,Urv8")))] | |
823 "ISA_HAS_MSA" | |
824 { | |
825 switch (which_alternative) | |
826 { | |
827 case 0: | |
828 return "and.v\t%w0,%w1,%w2"; | |
829 case 1: | |
830 { | |
831 rtx elt0 = CONST_VECTOR_ELT (operands[2], 0); | |
832 unsigned HOST_WIDE_INT val = ~UINTVAL (elt0); | |
833 operands[2] = mips_gen_const_int_vector (<MODE>mode, val & (-val)); | |
834 return "bclri.%v0\t%w0,%w1,%V2"; | |
835 } | |
836 case 2: | |
837 return "andi.b\t%w0,%w1,%B2"; | |
838 default: | |
839 gcc_unreachable (); | |
840 } | |
841 } | |
842 [(set_attr "type" "simd_logic,simd_bit,simd_logic") | |
843 (set_attr "mode" "<MODE>")]) | |
844 | |
845 (define_insn "one_cmpl<mode>2" | |
846 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
847 (not:IMSA (match_operand:IMSA 1 "register_operand" "f")))] | |
848 "ISA_HAS_MSA" | |
849 "nor.v\t%w0,%w1,%w1" | |
850 [(set_attr "type" "simd_logic") | |
851 (set_attr "mode" "TI")]) | |
852 | |
853 (define_insn "vlshr<mode>3" | |
854 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
855 (lshiftrt:IMSA | |
856 (match_operand:IMSA 1 "register_operand" "f,f") | |
857 (match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))] | |
858 "ISA_HAS_MSA" | |
859 "@ | |
860 srl.<msafmt>\t%w0,%w1,%w2 | |
861 srli.<msafmt>\t%w0,%w1,%E2" | |
862 [(set_attr "type" "simd_shift") | |
863 (set_attr "mode" "<MODE>")]) | |
864 | |
865 (define_insn "vashr<mode>3" | |
866 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
867 (ashiftrt:IMSA | |
868 (match_operand:IMSA 1 "register_operand" "f,f") | |
869 (match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))] | |
870 "ISA_HAS_MSA" | |
871 "@ | |
872 sra.<msafmt>\t%w0,%w1,%w2 | |
873 srai.<msafmt>\t%w0,%w1,%E2" | |
874 [(set_attr "type" "simd_shift") | |
875 (set_attr "mode" "<MODE>")]) | |
876 | |
877 (define_insn "vashl<mode>3" | |
878 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
879 (ashift:IMSA | |
880 (match_operand:IMSA 1 "register_operand" "f,f") | |
881 (match_operand:IMSA 2 "reg_or_vector_same_uimm6_operand" "f,Uuv6")))] | |
882 "ISA_HAS_MSA" | |
883 "@ | |
884 sll.<msafmt>\t%w0,%w1,%w2 | |
885 slli.<msafmt>\t%w0,%w1,%E2" | |
886 [(set_attr "type" "simd_shift") | |
887 (set_attr "mode" "<MODE>")]) | |
888 | |
889 ;; Floating-point operations | |
890 (define_insn "add<mode>3" | |
891 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
892 (plus:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
893 (match_operand:FMSA 2 "register_operand" "f")))] | |
894 "ISA_HAS_MSA" | |
895 "fadd.<msafmt>\t%w0,%w1,%w2" | |
896 [(set_attr "type" "simd_fadd") | |
897 (set_attr "mode" "<MODE>")]) | |
898 | |
899 (define_insn "sub<mode>3" | |
900 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
901 (minus:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
902 (match_operand:FMSA 2 "register_operand" "f")))] | |
903 "ISA_HAS_MSA" | |
904 "fsub.<msafmt>\t%w0,%w1,%w2" | |
905 [(set_attr "type" "simd_fadd") | |
906 (set_attr "mode" "<MODE>")]) | |
907 | |
908 (define_insn "mul<mode>3" | |
909 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
910 (mult:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
911 (match_operand:FMSA 2 "register_operand" "f")))] | |
912 "ISA_HAS_MSA" | |
913 "fmul.<msafmt>\t%w0,%w1,%w2" | |
914 [(set_attr "type" "simd_fmul") | |
915 (set_attr "mode" "<MODE>")]) | |
916 | |
917 (define_insn "div<mode>3" | |
918 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
919 (div:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
920 (match_operand:FMSA 2 "register_operand" "f")))] | |
921 "ISA_HAS_MSA" | |
922 "fdiv.<msafmt>\t%w0,%w1,%w2" | |
923 [(set_attr "type" "simd_fdiv") | |
924 (set_attr "mode" "<MODE>")]) | |
925 | |
926 (define_insn "fma<mode>4" | |
927 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
928 (fma:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
929 (match_operand:FMSA 2 "register_operand" "f") | |
930 (match_operand:FMSA 3 "register_operand" "0")))] | |
931 "ISA_HAS_MSA" | |
932 "fmadd.<msafmt>\t%w0,%w1,%w2" | |
933 [(set_attr "type" "simd_fmadd") | |
934 (set_attr "mode" "<MODE>")]) | |
935 | |
936 (define_insn "fnma<mode>4" | |
937 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
938 (fma:FMSA (neg:FMSA (match_operand:FMSA 1 "register_operand" "f")) | |
939 (match_operand:FMSA 2 "register_operand" "f") | |
940 (match_operand:FMSA 3 "register_operand" "0")))] | |
941 "ISA_HAS_MSA" | |
942 "fmsub.<msafmt>\t%w0,%w1,%w2" | |
943 [(set_attr "type" "simd_fmadd") | |
944 (set_attr "mode" "<MODE>")]) | |
945 | |
946 (define_insn "sqrt<mode>2" | |
947 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
948 (sqrt:FMSA (match_operand:FMSA 1 "register_operand" "f")))] | |
949 "ISA_HAS_MSA" | |
950 "fsqrt.<msafmt>\t%w0,%w1" | |
951 [(set_attr "type" "simd_fdiv") | |
952 (set_attr "mode" "<MODE>")]) | |
953 | |
954 ;; Built-in functions | |
955 (define_insn "msa_add_a_<msafmt>" | |
956 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
957 (plus:IMSA (abs:IMSA (match_operand:IMSA 1 "register_operand" "f")) | |
958 (abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))))] | |
959 "ISA_HAS_MSA" | |
960 "add_a.<msafmt>\t%w0,%w1,%w2" | |
961 [(set_attr "type" "simd_int_arith") | |
962 (set_attr "mode" "<MODE>")]) | |
963 | |
964 (define_insn "msa_adds_a_<msafmt>" | |
965 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
966 (ss_plus:IMSA | |
967 (abs:IMSA (match_operand:IMSA 1 "register_operand" "f")) | |
968 (abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))))] | |
969 "ISA_HAS_MSA" | |
970 "adds_a.<msafmt>\t%w0,%w1,%w2" | |
971 [(set_attr "type" "simd_int_arith") | |
972 (set_attr "mode" "<MODE>")]) | |
973 | |
974 (define_insn "ssadd<mode>3" | |
975 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
976 (ss_plus:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
977 (match_operand:IMSA 2 "register_operand" "f")))] | |
978 "ISA_HAS_MSA" | |
979 "adds_s.<msafmt>\t%w0,%w1,%w2" | |
980 [(set_attr "type" "simd_int_arith") | |
981 (set_attr "mode" "<MODE>")]) | |
982 | |
983 (define_insn "usadd<mode>3" | |
984 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
985 (us_plus:IMSA (match_operand:IMSA 1 "register_operand" "f") | |
986 (match_operand:IMSA 2 "register_operand" "f")))] | |
987 "ISA_HAS_MSA" | |
988 "adds_u.<msafmt>\t%w0,%w1,%w2" | |
989 [(set_attr "type" "simd_int_arith") | |
990 (set_attr "mode" "<MODE>")]) | |
991 | |
992 (define_insn "msa_asub_s_<msafmt>" | |
993 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
994 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
995 (match_operand:IMSA 2 "register_operand" "f")] | |
996 UNSPEC_MSA_ASUB_S))] | |
997 "ISA_HAS_MSA" | |
998 "asub_s.<msafmt>\t%w0,%w1,%w2" | |
999 [(set_attr "type" "simd_int_arith") | |
1000 (set_attr "mode" "<MODE>")]) | |
1001 | |
1002 (define_insn "msa_asub_u_<msafmt>" | |
1003 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1004 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1005 (match_operand:IMSA 2 "register_operand" "f")] | |
1006 UNSPEC_MSA_ASUB_U))] | |
1007 "ISA_HAS_MSA" | |
1008 "asub_u.<msafmt>\t%w0,%w1,%w2" | |
1009 [(set_attr "type" "simd_int_arith") | |
1010 (set_attr "mode" "<MODE>")]) | |
1011 | |
1012 (define_insn "msa_ave_s_<msafmt>" | |
1013 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1014 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1015 (match_operand:IMSA 2 "register_operand" "f")] | |
1016 UNSPEC_MSA_AVE_S))] | |
1017 "ISA_HAS_MSA" | |
1018 "ave_s.<msafmt>\t%w0,%w1,%w2" | |
1019 [(set_attr "type" "simd_int_arith") | |
1020 (set_attr "mode" "<MODE>")]) | |
1021 | |
1022 (define_insn "msa_ave_u_<msafmt>" | |
1023 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1024 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1025 (match_operand:IMSA 2 "register_operand" "f")] | |
1026 UNSPEC_MSA_AVE_U))] | |
1027 "ISA_HAS_MSA" | |
1028 "ave_u.<msafmt>\t%w0,%w1,%w2" | |
1029 [(set_attr "type" "simd_int_arith") | |
1030 (set_attr "mode" "<MODE>")]) | |
1031 | |
1032 (define_insn "msa_aver_s_<msafmt>" | |
1033 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1034 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1035 (match_operand:IMSA 2 "register_operand" "f")] | |
1036 UNSPEC_MSA_AVER_S))] | |
1037 "ISA_HAS_MSA" | |
1038 "aver_s.<msafmt>\t%w0,%w1,%w2" | |
1039 [(set_attr "type" "simd_int_arith") | |
1040 (set_attr "mode" "<MODE>")]) | |
1041 | |
1042 (define_insn "msa_aver_u_<msafmt>" | |
1043 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1044 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1045 (match_operand:IMSA 2 "register_operand" "f")] | |
1046 UNSPEC_MSA_AVER_U))] | |
1047 "ISA_HAS_MSA" | |
1048 "aver_u.<msafmt>\t%w0,%w1,%w2" | |
1049 [(set_attr "type" "simd_int_arith") | |
1050 (set_attr "mode" "<MODE>")]) | |
1051 | |
1052 (define_insn "msa_bclr_<msafmt>" | |
1053 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1054 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1055 (match_operand:IMSA 2 "register_operand" "f")] | |
1056 UNSPEC_MSA_BCLR))] | |
1057 "ISA_HAS_MSA" | |
1058 "bclr.<msafmt>\t%w0,%w1,%w2" | |
1059 [(set_attr "type" "simd_bit") | |
1060 (set_attr "mode" "<MODE>")]) | |
1061 | |
1062 (define_insn "msa_bclri_<msafmt>" | |
1063 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1064 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1065 (match_operand 2 "const_<bitimm>_operand" "")] | |
1066 UNSPEC_MSA_BCLRI))] | |
1067 "ISA_HAS_MSA" | |
1068 "bclri.<msafmt>\t%w0,%w1,%2" | |
1069 [(set_attr "type" "simd_bit") | |
1070 (set_attr "mode" "<MODE>")]) | |
1071 | |
1072 (define_insn "msa_binsl_<msafmt>" | |
1073 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1074 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0") | |
1075 (match_operand:IMSA 2 "register_operand" "f") | |
1076 (match_operand:IMSA 3 "register_operand" "f")] | |
1077 UNSPEC_MSA_BINSL))] | |
1078 "ISA_HAS_MSA" | |
1079 "binsl.<msafmt>\t%w0,%w2,%w3" | |
1080 [(set_attr "type" "simd_bitins") | |
1081 (set_attr "mode" "<MODE>")]) | |
1082 | |
1083 (define_insn "msa_binsli_<msafmt>" | |
1084 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1085 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0") | |
1086 (match_operand:IMSA 2 "register_operand" "f") | |
1087 (match_operand 3 "const_<bitimm>_operand" "")] | |
1088 UNSPEC_MSA_BINSLI))] | |
1089 "ISA_HAS_MSA" | |
1090 "binsli.<msafmt>\t%w0,%w2,%3" | |
1091 [(set_attr "type" "simd_bitins") | |
1092 (set_attr "mode" "<MODE>")]) | |
1093 | |
1094 (define_insn "msa_binsr_<msafmt>" | |
1095 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1096 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0") | |
1097 (match_operand:IMSA 2 "register_operand" "f") | |
1098 (match_operand:IMSA 3 "register_operand" "f")] | |
1099 UNSPEC_MSA_BINSR))] | |
1100 "ISA_HAS_MSA" | |
1101 "binsr.<msafmt>\t%w0,%w2,%w3" | |
1102 [(set_attr "type" "simd_bitins") | |
1103 (set_attr "mode" "<MODE>")]) | |
1104 | |
1105 (define_insn "msa_binsri_<msafmt>" | |
1106 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1107 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "0") | |
1108 (match_operand:IMSA 2 "register_operand" "f") | |
1109 (match_operand 3 "const_<bitimm>_operand" "")] | |
1110 UNSPEC_MSA_BINSRI))] | |
1111 "ISA_HAS_MSA" | |
1112 "binsri.<msafmt>\t%w0,%w2,%3" | |
1113 [(set_attr "type" "simd_bitins") | |
1114 (set_attr "mode" "<MODE>")]) | |
1115 | |
1116 (define_insn "msa_bmnz_<msafmt>" | |
1117 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
1118 (ior:IMSA (and:IMSA (match_operand:IMSA 2 "register_operand" "f,f") | |
1119 (match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8")) | |
1120 (and:IMSA (not:IMSA (match_dup 3)) | |
1121 (match_operand:IMSA 1 "register_operand" "0,0"))))] | |
1122 "ISA_HAS_MSA" | |
1123 "@ | |
1124 bmnz.v\t%w0,%w2,%w3 | |
1125 bmnzi.b\t%w0,%w2,%B3" | |
1126 [(set_attr "type" "simd_bitmov") | |
1127 (set_attr "mode" "<MODE>")]) | |
1128 | |
1129 (define_insn "msa_bmz_<msafmt>" | |
1130 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
1131 (ior:IMSA (and:IMSA (not:IMSA | |
1132 (match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8")) | |
1133 (match_operand:IMSA 2 "register_operand" "f,f")) | |
1134 (and:IMSA (match_operand:IMSA 1 "register_operand" "0,0") | |
1135 (match_dup 3))))] | |
1136 "ISA_HAS_MSA" | |
1137 "@ | |
1138 bmz.v\t%w0,%w2,%w3 | |
1139 bmzi.b\t%w0,%w2,%B3" | |
1140 [(set_attr "type" "simd_bitmov") | |
1141 (set_attr "mode" "<MODE>")]) | |
1142 | |
1143 (define_insn "msa_bneg_<msafmt>" | |
1144 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1145 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1146 (match_operand:IMSA 2 "register_operand" "f")] | |
1147 UNSPEC_MSA_BNEG))] | |
1148 "ISA_HAS_MSA" | |
1149 "bneg.<msafmt>\t%w0,%w1,%w2" | |
1150 [(set_attr "type" "simd_bit") | |
1151 (set_attr "mode" "<MODE>")]) | |
1152 | |
1153 (define_insn "msa_bnegi_<msafmt>" | |
1154 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1155 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1156 (match_operand 2 "const_msa_branch_operand" "")] | |
1157 UNSPEC_MSA_BNEGI))] | |
1158 "ISA_HAS_MSA" | |
1159 "bnegi.<msafmt>\t%w0,%w1,%2" | |
1160 [(set_attr "type" "simd_bit") | |
1161 (set_attr "mode" "<MODE>")]) | |
1162 | |
1163 (define_insn "msa_bsel_<msafmt>" | |
1164 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
1165 (ior:IMSA (and:IMSA (not:IMSA | |
1166 (match_operand:IMSA 1 "register_operand" "0,0")) | |
1167 (match_operand:IMSA 2 "register_operand" "f,f")) | |
1168 (and:IMSA (match_dup 1) | |
1169 (match_operand:IMSA 3 "reg_or_vector_same_val_operand" "f,Urv8"))))] | |
1170 "ISA_HAS_MSA" | |
1171 "@ | |
1172 bsel.v\t%w0,%w2,%w3 | |
1173 bseli.b\t%w0,%w2,%B3" | |
1174 [(set_attr "type" "simd_bitmov") | |
1175 (set_attr "mode" "<MODE>")]) | |
1176 | |
1177 (define_insn "msa_bset_<msafmt>" | |
1178 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1179 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1180 (match_operand:IMSA 2 "register_operand" "f")] | |
1181 UNSPEC_MSA_BSET))] | |
1182 "ISA_HAS_MSA" | |
1183 "bset.<msafmt>\t%w0,%w1,%w2" | |
1184 [(set_attr "type" "simd_bit") | |
1185 (set_attr "mode" "<MODE>")]) | |
1186 | |
1187 (define_insn "msa_bseti_<msafmt>" | |
1188 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
1189 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
1190 (match_operand 2 "const_<bitimm>_operand" "")] | |
1191 UNSPEC_MSA_BSETI))] | |
1192 "ISA_HAS_MSA" | |
1193 "bseti.<msafmt>\t%w0,%w1,%2" | |
1194 [(set_attr "type" "simd_bit") | |
1195 (set_attr "mode" "<MODE>")]) | |
1196 | |
1197 (define_code_iterator ICC [eq le leu lt ltu]) | |
1198 | |
1199 (define_code_attr icc | |
1200 [(eq "eq") | |
1201 (le "le_s") | |
1202 (leu "le_u") | |
1203 (lt "lt_s") | |
1204 (ltu "lt_u")]) | |
1205 | |
1206 (define_code_attr icci | |
1207 [(eq "eqi") | |
1208 (le "lei_s") | |
1209 (leu "lei_u") | |
1210 (lt "lti_s") | |
1211 (ltu "lti_u")]) | |
1212 | |
1213 (define_code_attr cmpi | |
1214 [(eq "s") | |
1215 (le "s") | |
1216 (leu "u") | |
1217 (lt "s") | |
1218 (ltu "u")]) | |
1219 | |
1220 (define_insn "msa_c<ICC:icc>_<IMSA:msafmt>" | |
1221 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
1222 (ICC:IMSA | |
1223 (match_operand:IMSA 1 "register_operand" "f,f") | |
1224 (match_operand:IMSA 2 "reg_or_vector_same_<ICC:cmpi>imm5_operand" "f,U<ICC:cmpi>v5")))] | |
1225 "ISA_HAS_MSA" | |
1226 "@ | |
1227 c<ICC:icc>.<IMSA:msafmt>\t%w0,%w1,%w2 | |
1228 c<ICC:icci>.<IMSA:msafmt>\t%w0,%w1,%E2" | |
1229 [(set_attr "type" "simd_int_arith") | |
1230 (set_attr "mode" "<MODE>")]) | |
1231 | |
1232 (define_insn "msa_dotp_<su>_d" | |
1233 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
1234 (plus:V2DI | |
1235 (mult:V2DI | |
1236 (any_extend:V2DI | |
1237 (vec_select:V2SI | |
1238 (match_operand:V4SI 1 "register_operand" "%f") | |
1239 (parallel [(const_int 0) (const_int 2)]))) | |
1240 (any_extend:V2DI | |
1241 (vec_select:V2SI | |
1242 (match_operand:V4SI 2 "register_operand" "f") | |
1243 (parallel [(const_int 0) (const_int 2)])))) | |
1244 (mult:V2DI | |
1245 (any_extend:V2DI | |
1246 (vec_select:V2SI (match_dup 1) | |
1247 (parallel [(const_int 1) (const_int 3)]))) | |
1248 (any_extend:V2DI | |
1249 (vec_select:V2SI (match_dup 2) | |
1250 (parallel [(const_int 1) (const_int 3)]))))))] | |
1251 "ISA_HAS_MSA" | |
1252 "dotp_<su>.d\t%w0,%w1,%w2" | |
1253 [(set_attr "type" "simd_mul") | |
1254 (set_attr "mode" "V2DI")]) | |
1255 | |
1256 (define_insn "msa_dotp_<su>_w" | |
1257 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1258 (plus:V4SI | |
1259 (mult:V4SI | |
1260 (any_extend:V4SI | |
1261 (vec_select:V4HI | |
1262 (match_operand:V8HI 1 "register_operand" "%f") | |
1263 (parallel [(const_int 0) (const_int 2) | |
1264 (const_int 4) (const_int 6)]))) | |
1265 (any_extend:V4SI | |
1266 (vec_select:V4HI | |
1267 (match_operand:V8HI 2 "register_operand" "f") | |
1268 (parallel [(const_int 0) (const_int 2) | |
1269 (const_int 4) (const_int 6)])))) | |
1270 (mult:V4SI | |
1271 (any_extend:V4SI | |
1272 (vec_select:V4HI (match_dup 1) | |
1273 (parallel [(const_int 1) (const_int 3) | |
1274 (const_int 5) (const_int 7)]))) | |
1275 (any_extend:V4SI | |
1276 (vec_select:V4HI (match_dup 2) | |
1277 (parallel [(const_int 1) (const_int 3) | |
1278 (const_int 5) (const_int 7)]))))))] | |
1279 "ISA_HAS_MSA" | |
1280 "dotp_<su>.w\t%w0,%w1,%w2" | |
1281 [(set_attr "type" "simd_mul") | |
1282 (set_attr "mode" "V4SI")]) | |
1283 | |
1284 (define_insn "msa_dotp_<su>_h" | |
1285 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1286 (plus:V8HI | |
1287 (mult:V8HI | |
1288 (any_extend:V8HI | |
1289 (vec_select:V8QI | |
1290 (match_operand:V16QI 1 "register_operand" "%f") | |
1291 (parallel [(const_int 0) (const_int 2) | |
1292 (const_int 4) (const_int 6) | |
1293 (const_int 8) (const_int 10) | |
1294 (const_int 12) (const_int 14)]))) | |
1295 (any_extend:V8HI | |
1296 (vec_select:V8QI | |
1297 (match_operand:V16QI 2 "register_operand" "f") | |
1298 (parallel [(const_int 0) (const_int 2) | |
1299 (const_int 4) (const_int 6) | |
1300 (const_int 8) (const_int 10) | |
1301 (const_int 12) (const_int 14)])))) | |
1302 (mult:V8HI | |
1303 (any_extend:V8HI | |
1304 (vec_select:V8QI (match_dup 1) | |
1305 (parallel [(const_int 1) (const_int 3) | |
1306 (const_int 5) (const_int 7) | |
1307 (const_int 9) (const_int 11) | |
1308 (const_int 13) (const_int 15)]))) | |
1309 (any_extend:V8HI | |
1310 (vec_select:V8QI (match_dup 2) | |
1311 (parallel [(const_int 1) (const_int 3) | |
1312 (const_int 5) (const_int 7) | |
1313 (const_int 9) (const_int 11) | |
1314 (const_int 13) (const_int 15)]))))))] | |
1315 "ISA_HAS_MSA" | |
1316 "dotp_<su>.h\t%w0,%w1,%w2" | |
1317 [(set_attr "type" "simd_mul") | |
1318 (set_attr "mode" "V8HI")]) | |
1319 | |
1320 (define_insn "msa_dpadd_<su>_d" | |
1321 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
1322 (plus:V2DI | |
1323 (plus:V2DI | |
1324 (mult:V2DI | |
1325 (any_extend:V2DI | |
1326 (vec_select:V2SI | |
1327 (match_operand:V4SI 2 "register_operand" "%f") | |
1328 (parallel [(const_int 0) (const_int 2)]))) | |
1329 (any_extend:V2DI | |
1330 (vec_select:V2SI | |
1331 (match_operand:V4SI 3 "register_operand" "f") | |
1332 (parallel [(const_int 0) (const_int 2)])))) | |
1333 (mult:V2DI | |
1334 (any_extend:V2DI | |
1335 (vec_select:V2SI (match_dup 2) | |
1336 (parallel [(const_int 1) (const_int 3)]))) | |
1337 (any_extend:V2DI | |
1338 (vec_select:V2SI (match_dup 3) | |
1339 (parallel [(const_int 1) (const_int 3)]))))) | |
1340 (match_operand:V2DI 1 "register_operand" "0")))] | |
1341 "ISA_HAS_MSA" | |
1342 "dpadd_<su>.d\t%w0,%w2,%w3" | |
1343 [(set_attr "type" "simd_mul") | |
1344 (set_attr "mode" "V2DI")]) | |
1345 | |
1346 (define_insn "msa_dpadd_<su>_w" | |
1347 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1348 (plus:V4SI | |
1349 (plus:V4SI | |
1350 (mult:V4SI | |
1351 (any_extend:V4SI | |
1352 (vec_select:V4HI | |
1353 (match_operand:V8HI 2 "register_operand" "%f") | |
1354 (parallel [(const_int 0) (const_int 2) | |
1355 (const_int 4) (const_int 6)]))) | |
1356 (any_extend:V4SI | |
1357 (vec_select:V4HI | |
1358 (match_operand:V8HI 3 "register_operand" "f") | |
1359 (parallel [(const_int 0) (const_int 2) | |
1360 (const_int 4) (const_int 6)])))) | |
1361 (mult:V4SI | |
1362 (any_extend:V4SI | |
1363 (vec_select:V4HI (match_dup 2) | |
1364 (parallel [(const_int 1) (const_int 3) | |
1365 (const_int 5) (const_int 7)]))) | |
1366 (any_extend:V4SI | |
1367 (vec_select:V4HI (match_dup 3) | |
1368 (parallel [(const_int 1) (const_int 3) | |
1369 (const_int 5) (const_int 7)]))))) | |
1370 (match_operand:V4SI 1 "register_operand" "0")))] | |
1371 "ISA_HAS_MSA" | |
1372 "dpadd_<su>.w\t%w0,%w2,%w3" | |
1373 [(set_attr "type" "simd_mul") | |
1374 (set_attr "mode" "V4SI")]) | |
1375 | |
1376 (define_insn "msa_dpadd_<su>_h" | |
1377 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1378 (plus:V8HI | |
1379 (plus:V8HI | |
1380 (mult:V8HI | |
1381 (any_extend:V8HI | |
1382 (vec_select:V8QI | |
1383 (match_operand:V16QI 2 "register_operand" "%f") | |
1384 (parallel [(const_int 0) (const_int 2) | |
1385 (const_int 4) (const_int 6) | |
1386 (const_int 8) (const_int 10) | |
1387 (const_int 12) (const_int 14)]))) | |
1388 (any_extend:V8HI | |
1389 (vec_select:V8QI | |
1390 (match_operand:V16QI 3 "register_operand" "f") | |
1391 (parallel [(const_int 0) (const_int 2) | |
1392 (const_int 4) (const_int 6) | |
1393 (const_int 8) (const_int 10) | |
1394 (const_int 12) (const_int 14)])))) | |
1395 (mult:V8HI | |
1396 (any_extend:V8HI | |
1397 (vec_select:V8QI (match_dup 2) | |
1398 (parallel [(const_int 1) (const_int 3) | |
1399 (const_int 5) (const_int 7) | |
1400 (const_int 9) (const_int 11) | |
1401 (const_int 13) (const_int 15)]))) | |
1402 (any_extend:V8HI | |
1403 (vec_select:V8QI (match_dup 3) | |
1404 (parallel [(const_int 1) (const_int 3) | |
1405 (const_int 5) (const_int 7) | |
1406 (const_int 9) (const_int 11) | |
1407 (const_int 13) (const_int 15)]))))) | |
1408 (match_operand:V8HI 1 "register_operand" "0")))] | |
1409 "ISA_HAS_MSA" | |
1410 "dpadd_<su>.h\t%w0,%w2,%w3" | |
1411 [(set_attr "type" "simd_mul") | |
1412 (set_attr "mode" "V8HI")]) | |
1413 | |
1414 (define_insn "msa_dpsub_<su>_d" | |
1415 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
1416 (minus:V2DI | |
1417 (match_operand:V2DI 1 "register_operand" "0") | |
1418 (plus:V2DI | |
1419 (mult:V2DI | |
1420 (any_extend:V2DI | |
1421 (vec_select:V2SI | |
1422 (match_operand:V4SI 2 "register_operand" "%f") | |
1423 (parallel [(const_int 0) (const_int 2)]))) | |
1424 (any_extend:V2DI | |
1425 (vec_select:V2SI | |
1426 (match_operand:V4SI 3 "register_operand" "f") | |
1427 (parallel [(const_int 0) (const_int 2)])))) | |
1428 (mult:V2DI | |
1429 (any_extend:V2DI | |
1430 (vec_select:V2SI (match_dup 2) | |
1431 (parallel [(const_int 1) (const_int 3)]))) | |
1432 (any_extend:V2DI | |
1433 (vec_select:V2SI (match_dup 3) | |
1434 (parallel [(const_int 1) (const_int 3)])))))))] | |
1435 "ISA_HAS_MSA" | |
1436 "dpsub_<su>.d\t%w0,%w2,%w3" | |
1437 [(set_attr "type" "simd_mul") | |
1438 (set_attr "mode" "V2DI")]) | |
1439 | |
1440 (define_insn "msa_dpsub_<su>_w" | |
1441 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1442 (minus:V4SI | |
1443 (match_operand:V4SI 1 "register_operand" "0") | |
1444 (plus:V4SI | |
1445 (mult:V4SI | |
1446 (any_extend:V4SI | |
1447 (vec_select:V4HI | |
1448 (match_operand:V8HI 2 "register_operand" "%f") | |
1449 (parallel [(const_int 0) (const_int 2) | |
1450 (const_int 4) (const_int 6)]))) | |
1451 (any_extend:V4SI | |
1452 (vec_select:V4HI | |
1453 (match_operand:V8HI 3 "register_operand" "f") | |
1454 (parallel [(const_int 0) (const_int 2) | |
1455 (const_int 4) (const_int 6)])))) | |
1456 (mult:V4SI | |
1457 (any_extend:V4SI | |
1458 (vec_select:V4HI (match_dup 2) | |
1459 (parallel [(const_int 1) (const_int 3) | |
1460 (const_int 5) (const_int 7)]))) | |
1461 (any_extend:V4SI | |
1462 (vec_select:V4HI (match_dup 3) | |
1463 (parallel [(const_int 1) (const_int 3) | |
1464 (const_int 5) (const_int 7)])))))))] | |
1465 "ISA_HAS_MSA" | |
1466 "dpsub_<su>.w\t%w0,%w2,%w3" | |
1467 [(set_attr "type" "simd_mul") | |
1468 (set_attr "mode" "V4SI")]) | |
1469 | |
1470 (define_insn "msa_dpsub_<su>_h" | |
1471 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1472 (minus:V8HI | |
1473 (match_operand:V8HI 1 "register_operand" "0") | |
1474 (plus:V8HI | |
1475 (mult:V8HI | |
1476 (any_extend:V8HI | |
1477 (vec_select:V8QI | |
1478 (match_operand:V16QI 2 "register_operand" "%f") | |
1479 (parallel [(const_int 0) (const_int 2) | |
1480 (const_int 4) (const_int 6) | |
1481 (const_int 8) (const_int 10) | |
1482 (const_int 12) (const_int 14)]))) | |
1483 (any_extend:V8HI | |
1484 (vec_select:V8QI | |
1485 (match_operand:V16QI 3 "register_operand" "f") | |
1486 (parallel [(const_int 0) (const_int 2) | |
1487 (const_int 4) (const_int 6) | |
1488 (const_int 8) (const_int 10) | |
1489 (const_int 12) (const_int 14)])))) | |
1490 (mult:V8HI | |
1491 (any_extend:V8HI | |
1492 (vec_select:V8QI (match_dup 2) | |
1493 (parallel [(const_int 1) (const_int 3) | |
1494 (const_int 5) (const_int 7) | |
1495 (const_int 9) (const_int 11) | |
1496 (const_int 13) (const_int 15)]))) | |
1497 (any_extend:V8HI | |
1498 (vec_select:V8QI (match_dup 3) | |
1499 (parallel [(const_int 1) (const_int 3) | |
1500 (const_int 5) (const_int 7) | |
1501 (const_int 9) (const_int 11) | |
1502 (const_int 13) (const_int 15)])))))))] | |
1503 "ISA_HAS_MSA" | |
1504 "dpsub_<su>.h\t%w0,%w2,%w3" | |
1505 [(set_attr "type" "simd_mul") | |
1506 (set_attr "mode" "V8HI")]) | |
1507 | |
1508 (define_insn "msa_fclass_<msafmt>" | |
1509 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1510 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")] | |
1511 UNSPEC_MSA_FCLASS))] | |
1512 "ISA_HAS_MSA" | |
1513 "fclass.<msafmt>\t%w0,%w1" | |
1514 [(set_attr "type" "simd_fclass") | |
1515 (set_attr "mode" "<MODE>")]) | |
1516 | |
1517 (define_insn "msa_fcaf_<msafmt>" | |
1518 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1519 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f") | |
1520 (match_operand:FMSA 2 "register_operand" "f")] | |
1521 UNSPEC_MSA_FCAF))] | |
1522 "ISA_HAS_MSA" | |
1523 "fcaf.<msafmt>\t%w0,%w1,%w2" | |
1524 [(set_attr "type" "simd_fcmp") | |
1525 (set_attr "mode" "<MODE>")]) | |
1526 | |
1527 (define_insn "msa_fcune_<FMSA:msafmt>" | |
1528 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1529 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f") | |
1530 (match_operand:FMSA 2 "register_operand" "f")] | |
1531 UNSPEC_MSA_FCUNE))] | |
1532 "ISA_HAS_MSA" | |
1533 "fcune.<FMSA:msafmt>\t%w0,%w1,%w2" | |
1534 [(set_attr "type" "simd_fcmp") | |
1535 (set_attr "mode" "<MODE>")]) | |
1536 | |
1537 (define_code_iterator FCC [unordered ordered eq ne le lt uneq unle unlt]) | |
1538 | |
1539 (define_code_attr fcc | |
1540 [(unordered "fcun") | |
1541 (ordered "fcor") | |
1542 (eq "fceq") | |
1543 (ne "fcne") | |
1544 (uneq "fcueq") | |
1545 (unle "fcule") | |
1546 (unlt "fcult") | |
1547 (le "fcle") | |
1548 (lt "fclt")]) | |
1549 | |
1550 (define_int_iterator FSC_UNS [UNSPEC_MSA_FSAF UNSPEC_MSA_FSUN UNSPEC_MSA_FSOR | |
1551 UNSPEC_MSA_FSEQ UNSPEC_MSA_FSNE UNSPEC_MSA_FSUEQ | |
1552 UNSPEC_MSA_FSUNE UNSPEC_MSA_FSULE UNSPEC_MSA_FSULT | |
1553 UNSPEC_MSA_FSLE UNSPEC_MSA_FSLT]) | |
1554 | |
1555 (define_int_attr fsc | |
1556 [(UNSPEC_MSA_FSAF "fsaf") | |
1557 (UNSPEC_MSA_FSUN "fsun") | |
1558 (UNSPEC_MSA_FSOR "fsor") | |
1559 (UNSPEC_MSA_FSEQ "fseq") | |
1560 (UNSPEC_MSA_FSNE "fsne") | |
1561 (UNSPEC_MSA_FSUEQ "fsueq") | |
1562 (UNSPEC_MSA_FSUNE "fsune") | |
1563 (UNSPEC_MSA_FSULE "fsule") | |
1564 (UNSPEC_MSA_FSULT "fsult") | |
1565 (UNSPEC_MSA_FSLE "fsle") | |
1566 (UNSPEC_MSA_FSLT "fslt")]) | |
1567 | |
1568 (define_insn "msa_<FCC:fcc>_<FMSA:msafmt>" | |
1569 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1570 (FCC:<VIMODE> (match_operand:FMSA 1 "register_operand" "f") | |
1571 (match_operand:FMSA 2 "register_operand" "f")))] | |
1572 "ISA_HAS_MSA" | |
1573 "<FCC:fcc>.<FMSA:msafmt>\t%w0,%w1,%w2" | |
1574 [(set_attr "type" "simd_fcmp") | |
1575 (set_attr "mode" "<MODE>")]) | |
1576 | |
1577 (define_insn "msa_<fsc>_<FMSA:msafmt>" | |
1578 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1579 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f") | |
1580 (match_operand:FMSA 2 "register_operand" "f")] | |
1581 FSC_UNS))] | |
1582 "ISA_HAS_MSA" | |
1583 "<fsc>.<FMSA:msafmt>\t%w0,%w1,%w2" | |
1584 [(set_attr "type" "simd_fcmp") | |
1585 (set_attr "mode" "<MODE>")]) | |
1586 | |
1587 (define_insn "msa_fexp2_<msafmt>" | |
1588 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1589 (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f") | |
1590 (match_operand:<VIMODE> 2 "register_operand" "f")] | |
1591 UNSPEC_MSA_FEXP2))] | |
1592 "ISA_HAS_MSA" | |
1593 "fexp2.<msafmt>\t%w0,%w1,%w2" | |
1594 [(set_attr "type" "simd_fexp2") | |
1595 (set_attr "mode" "<MODE>")]) | |
1596 | |
1597 (define_mode_attr fint | |
1598 [(V4SF "v4si") | |
1599 (V2DF "v2di")]) | |
1600 | |
1601 (define_mode_attr FQ | |
1602 [(V4SF "V8HI") | |
1603 (V2DF "V4SI")]) | |
1604 | |
1605 (define_mode_attr FINTCNV | |
1606 [(V4SF "I2S") | |
1607 (V2DF "I2D")]) | |
1608 | |
1609 (define_mode_attr FINTCNV_2 | |
1610 [(V4SF "S2I") | |
1611 (V2DF "D2I")]) | |
1612 | |
1613 (define_insn "float<fint><FMSA:mode>2" | |
1614 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1615 (float:FMSA (match_operand:<VIMODE> 1 "register_operand" "f")))] | |
1616 "ISA_HAS_MSA" | |
1617 "ffint_s.<msafmt>\t%w0,%w1" | |
1618 [(set_attr "type" "simd_fcvt") | |
1619 (set_attr "cnv_mode" "<FINTCNV>") | |
1620 (set_attr "mode" "<MODE>")]) | |
1621 | |
1622 (define_insn "floatuns<fint><FMSA:mode>2" | |
1623 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1624 (unsigned_float:FMSA | |
1625 (match_operand:<VIMODE> 1 "register_operand" "f")))] | |
1626 "ISA_HAS_MSA" | |
1627 "ffint_u.<msafmt>\t%w0,%w1" | |
1628 [(set_attr "type" "simd_fcvt") | |
1629 (set_attr "cnv_mode" "<FINTCNV>") | |
1630 (set_attr "mode" "<MODE>")]) | |
1631 | |
1632 (define_mode_attr FFQ | |
1633 [(V4SF "V8HI") | |
1634 (V2DF "V4SI")]) | |
1635 | |
1636 (define_insn "msa_ffql_<msafmt>" | |
1637 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1638 (unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")] | |
1639 UNSPEC_MSA_FFQL))] | |
1640 "ISA_HAS_MSA" | |
1641 "ffql.<msafmt>\t%w0,%w1" | |
1642 [(set_attr "type" "simd_fcvt") | |
1643 (set_attr "cnv_mode" "<FINTCNV>") | |
1644 (set_attr "mode" "<MODE>")]) | |
1645 | |
1646 (define_insn "msa_ffqr_<msafmt>" | |
1647 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1648 (unspec:FMSA [(match_operand:<FQ> 1 "register_operand" "f")] | |
1649 UNSPEC_MSA_FFQR))] | |
1650 "ISA_HAS_MSA" | |
1651 "ffqr.<msafmt>\t%w0,%w1" | |
1652 [(set_attr "type" "simd_fcvt") | |
1653 (set_attr "cnv_mode" "<FINTCNV>") | |
1654 (set_attr "mode" "<MODE>")]) | |
1655 | |
1656 (define_insn "msa_fill_<msafmt_f>" | |
1657 [(set (match_operand:MSA 0 "register_operand" "=f,f") | |
1658 (vec_duplicate:MSA | |
1659 (match_operand:<UNITMODE> 1 "reg_or_0_operand" "d,J")))] | |
1660 "ISA_HAS_MSA" | |
1661 { | |
1662 if (which_alternative == 1) | |
1663 return "ldi.<msafmt>\t%w0,0"; | |
1664 | |
1665 if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode)) | |
1666 return "#"; | |
1667 else | |
1668 return "fill.<msafmt>\t%w0,%z1"; | |
1669 } | |
1670 [(set_attr "type" "simd_fill") | |
1671 (set_attr "mode" "<MODE>")]) | |
1672 | |
1673 (define_split | |
1674 [(set (match_operand:MSA_D 0 "register_operand") | |
1675 (vec_duplicate:MSA_D | |
1676 (match_operand:<UNITMODE> 1 "register_operand")))] | |
1677 "reload_completed && ISA_HAS_MSA && !TARGET_64BIT" | |
1678 [(const_int 0)] | |
1679 { | |
1680 mips_split_msa_fill_d (operands[0], operands[1]); | |
1681 DONE; | |
1682 }) | |
1683 | |
1684 (define_insn "msa_flog2_<msafmt>" | |
1685 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1686 (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")] | |
1687 UNSPEC_MSA_FLOG2))] | |
1688 "ISA_HAS_MSA" | |
1689 "flog2.<msafmt>\t%w0,%w1" | |
1690 [(set_attr "type" "simd_flog2") | |
1691 (set_attr "mode" "<MODE>")]) | |
1692 | |
1693 (define_insn "smax<mode>3" | |
1694 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1695 (smax:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
1696 (match_operand:FMSA 2 "register_operand" "f")))] | |
1697 "ISA_HAS_MSA" | |
1698 "fmax.<msafmt>\t%w0,%w1,%w2" | |
1699 [(set_attr "type" "simd_fminmax") | |
1700 (set_attr "mode" "<MODE>")]) | |
1701 | |
1702 (define_insn "msa_fmax_a_<msafmt>" | |
1703 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1704 (if_then_else:FMSA | |
1705 (gt (abs:FMSA (match_operand:FMSA 1 "register_operand" "f")) | |
1706 (abs:FMSA (match_operand:FMSA 2 "register_operand" "f"))) | |
1707 (match_dup 1) | |
1708 (match_dup 2)))] | |
1709 "ISA_HAS_MSA" | |
1710 "fmax_a.<msafmt>\t%w0,%w1,%w2" | |
1711 [(set_attr "type" "simd_fminmax") | |
1712 (set_attr "mode" "<MODE>")]) | |
1713 | |
1714 (define_insn "smin<mode>3" | |
1715 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1716 (smin:FMSA (match_operand:FMSA 1 "register_operand" "f") | |
1717 (match_operand:FMSA 2 "register_operand" "f")))] | |
1718 "ISA_HAS_MSA" | |
1719 "fmin.<msafmt>\t%w0,%w1,%w2" | |
1720 [(set_attr "type" "simd_fminmax") | |
1721 (set_attr "mode" "<MODE>")]) | |
1722 | |
1723 (define_insn "msa_fmin_a_<msafmt>" | |
1724 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1725 (if_then_else:FMSA | |
1726 (lt (abs:FMSA (match_operand:FMSA 1 "register_operand" "f")) | |
1727 (abs:FMSA (match_operand:FMSA 2 "register_operand" "f"))) | |
1728 (match_dup 1) | |
1729 (match_dup 2)))] | |
1730 "ISA_HAS_MSA" | |
1731 "fmin_a.<msafmt>\t%w0,%w1,%w2" | |
1732 [(set_attr "type" "simd_fminmax") | |
1733 (set_attr "mode" "<MODE>")]) | |
1734 | |
1735 (define_insn "msa_frcp_<msafmt>" | |
1736 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1737 (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")] | |
1738 UNSPEC_MSA_FRCP))] | |
1739 "ISA_HAS_MSA" | |
1740 "frcp.<msafmt>\t%w0,%w1" | |
1741 [(set_attr "type" "simd_fdiv") | |
1742 (set_attr "mode" "<MODE>")]) | |
1743 | |
1744 (define_insn "msa_frint_<msafmt>" | |
1745 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1746 (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")] | |
1747 UNSPEC_MSA_FRINT))] | |
1748 "ISA_HAS_MSA" | |
1749 "frint.<msafmt>\t%w0,%w1" | |
1750 [(set_attr "type" "simd_fcvt") | |
1751 (set_attr "mode" "<MODE>")]) | |
1752 | |
1753 (define_insn "msa_frsqrt_<msafmt>" | |
1754 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
1755 (unspec:FMSA [(match_operand:FMSA 1 "register_operand" "f")] | |
1756 UNSPEC_MSA_FRSQRT))] | |
1757 "ISA_HAS_MSA" | |
1758 "frsqrt.<msafmt>\t%w0,%w1" | |
1759 [(set_attr "type" "simd_fdiv") | |
1760 (set_attr "mode" "<MODE>")]) | |
1761 | |
1762 (define_insn "msa_ftint_s_<msafmt>" | |
1763 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1764 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")] | |
1765 UNSPEC_MSA_FTINT_S))] | |
1766 "ISA_HAS_MSA" | |
1767 "ftint_s.<msafmt>\t%w0,%w1" | |
1768 [(set_attr "type" "simd_fcvt") | |
1769 (set_attr "cnv_mode" "<FINTCNV_2>") | |
1770 (set_attr "mode" "<MODE>")]) | |
1771 | |
1772 (define_insn "msa_ftint_u_<msafmt>" | |
1773 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1774 (unspec:<VIMODE> [(match_operand:FMSA 1 "register_operand" "f")] | |
1775 UNSPEC_MSA_FTINT_U))] | |
1776 "ISA_HAS_MSA" | |
1777 "ftint_u.<msafmt>\t%w0,%w1" | |
1778 [(set_attr "type" "simd_fcvt") | |
1779 (set_attr "cnv_mode" "<FINTCNV_2>") | |
1780 (set_attr "mode" "<MODE>")]) | |
1781 | |
1782 (define_insn "fix_trunc<FMSA:mode><mode_i>2" | |
1783 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1784 (fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))] | |
1785 "ISA_HAS_MSA" | |
1786 "ftrunc_s.<msafmt>\t%w0,%w1" | |
1787 [(set_attr "type" "simd_fcvt") | |
1788 (set_attr "cnv_mode" "<FINTCNV_2>") | |
1789 (set_attr "mode" "<MODE>")]) | |
1790 | |
1791 (define_insn "fixuns_trunc<FMSA:mode><mode_i>2" | |
1792 [(set (match_operand:<VIMODE> 0 "register_operand" "=f") | |
1793 (unsigned_fix:<VIMODE> (match_operand:FMSA 1 "register_operand" "f")))] | |
1794 "ISA_HAS_MSA" | |
1795 "ftrunc_u.<msafmt>\t%w0,%w1" | |
1796 [(set_attr "type" "simd_fcvt") | |
1797 (set_attr "cnv_mode" "<FINTCNV_2>") | |
1798 (set_attr "mode" "<MODE>")]) | |
1799 | |
1800 (define_insn "msa_ftq_h" | |
1801 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1802 (unspec:V8HI [(match_operand:V4SF 1 "register_operand" "f") | |
1803 (match_operand:V4SF 2 "register_operand" "f")] | |
1804 UNSPEC_MSA_FTQ))] | |
1805 "ISA_HAS_MSA" | |
1806 "ftq.h\t%w0,%w1,%w2" | |
1807 [(set_attr "type" "simd_fcvt") | |
1808 (set_attr "cnv_mode" "S2I") | |
1809 (set_attr "mode" "V4SF")]) | |
1810 | |
1811 (define_insn "msa_ftq_w" | |
1812 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1813 (unspec:V4SI [(match_operand:V2DF 1 "register_operand" "f") | |
1814 (match_operand:V2DF 2 "register_operand" "f")] | |
1815 UNSPEC_MSA_FTQ))] | |
1816 "ISA_HAS_MSA" | |
1817 "ftq.w\t%w0,%w1,%w2" | |
1818 [(set_attr "type" "simd_fcvt") | |
1819 (set_attr "cnv_mode" "D2I") | |
1820 (set_attr "mode" "V2DF")]) | |
1821 | |
1822 (define_insn "msa_h<optab>_<su>_h" | |
1823 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1824 (addsub:V8HI | |
1825 (any_extend:V8HI | |
1826 (vec_select:V8QI | |
1827 (match_operand:V16QI 1 "register_operand" "f") | |
1828 (parallel [(const_int 1) (const_int 3) | |
1829 (const_int 5) (const_int 7) | |
1830 (const_int 9) (const_int 11) | |
1831 (const_int 13) (const_int 15)]))) | |
1832 (any_extend:V8HI | |
1833 (vec_select:V8QI | |
1834 (match_operand:V16QI 2 "register_operand" "f") | |
1835 (parallel [(const_int 0) (const_int 2) | |
1836 (const_int 4) (const_int 6) | |
1837 (const_int 8) (const_int 10) | |
1838 (const_int 12) (const_int 14)])))))] | |
1839 "ISA_HAS_MSA" | |
1840 "h<optab>_<su>.h\t%w0,%w1,%w2" | |
1841 [(set_attr "type" "simd_int_arith") | |
1842 (set_attr "mode" "V8HI")]) | |
1843 | |
1844 (define_insn "msa_h<optab>_<su>_w" | |
1845 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1846 (addsub:V4SI | |
1847 (any_extend:V4SI | |
1848 (vec_select:V4HI | |
1849 (match_operand:V8HI 1 "register_operand" "f") | |
1850 (parallel [(const_int 1) (const_int 3) | |
1851 (const_int 5) (const_int 7)]))) | |
1852 (any_extend:V4SI | |
1853 (vec_select:V4HI | |
1854 (match_operand:V8HI 2 "register_operand" "f") | |
1855 (parallel [(const_int 0) (const_int 2) | |
1856 (const_int 4) (const_int 6)])))))] | |
1857 "ISA_HAS_MSA" | |
1858 "h<optab>_<su>.w\t%w0,%w1,%w2" | |
1859 [(set_attr "type" "simd_int_arith") | |
1860 (set_attr "mode" "V4SI")]) | |
1861 | |
1862 (define_insn "msa_h<optab>_<su>_d" | |
1863 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
1864 (addsub:V2DI | |
1865 (any_extend:V2DI | |
1866 (vec_select:V2SI | |
1867 (match_operand:V4SI 1 "register_operand" "f") | |
1868 (parallel [(const_int 1) (const_int 3)]))) | |
1869 (any_extend:V2DI | |
1870 (vec_select:V2SI | |
1871 (match_operand:V4SI 2 "register_operand" "f") | |
1872 (parallel [(const_int 0) (const_int 2)])))))] | |
1873 "ISA_HAS_MSA" | |
1874 "h<optab>_<su>.d\t%w0,%w1,%w2" | |
1875 [(set_attr "type" "simd_int_arith") | |
1876 (set_attr "mode" "V2DI")]) | |
1877 | |
1878 (define_insn "msa_ilvev_b" | |
1879 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
1880 (vec_select:V16QI | |
1881 (vec_concat:V32QI | |
1882 (match_operand:V16QI 1 "register_operand" "f") | |
1883 (match_operand:V16QI 2 "register_operand" "f")) | |
1884 (parallel [(const_int 0) (const_int 16) | |
1885 (const_int 2) (const_int 18) | |
1886 (const_int 4) (const_int 20) | |
1887 (const_int 6) (const_int 22) | |
1888 (const_int 8) (const_int 24) | |
1889 (const_int 10) (const_int 26) | |
1890 (const_int 12) (const_int 28) | |
1891 (const_int 14) (const_int 30)])))] | |
1892 "ISA_HAS_MSA" | |
1893 "ilvev.b\t%w0,%w2,%w1" | |
1894 [(set_attr "type" "simd_permute") | |
1895 (set_attr "mode" "V16QI")]) | |
1896 | |
1897 (define_insn "msa_ilvev_h" | |
1898 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1899 (vec_select:V8HI | |
1900 (vec_concat:V16HI | |
1901 (match_operand:V8HI 1 "register_operand" "f") | |
1902 (match_operand:V8HI 2 "register_operand" "f")) | |
1903 (parallel [(const_int 0) (const_int 8) | |
1904 (const_int 2) (const_int 10) | |
1905 (const_int 4) (const_int 12) | |
1906 (const_int 6) (const_int 14)])))] | |
1907 "ISA_HAS_MSA" | |
1908 "ilvev.h\t%w0,%w2,%w1" | |
1909 [(set_attr "type" "simd_permute") | |
1910 (set_attr "mode" "V8HI")]) | |
1911 | |
1912 (define_insn "msa_ilvev_w" | |
1913 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1914 (vec_select:V4SI | |
1915 (vec_concat:V8SI | |
1916 (match_operand:V4SI 1 "register_operand" "f") | |
1917 (match_operand:V4SI 2 "register_operand" "f")) | |
1918 (parallel [(const_int 0) (const_int 4) | |
1919 (const_int 2) (const_int 6)])))] | |
1920 "ISA_HAS_MSA" | |
1921 "ilvev.w\t%w0,%w2,%w1" | |
1922 [(set_attr "type" "simd_permute") | |
1923 (set_attr "mode" "V4SI")]) | |
1924 | |
1925 (define_insn "msa_ilvev_w_f" | |
1926 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
1927 (vec_select:V4SF | |
1928 (vec_concat:V8SF | |
1929 (match_operand:V4SF 1 "register_operand" "f") | |
1930 (match_operand:V4SF 2 "register_operand" "f")) | |
1931 (parallel [(const_int 0) (const_int 4) | |
1932 (const_int 2) (const_int 6)])))] | |
1933 "ISA_HAS_MSA" | |
1934 "ilvev.w\t%w0,%w2,%w1" | |
1935 [(set_attr "type" "simd_permute") | |
1936 (set_attr "mode" "V4SF")]) | |
1937 | |
1938 (define_insn "msa_ilvl_b" | |
1939 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
1940 (vec_select:V16QI | |
1941 (vec_concat:V32QI | |
1942 (match_operand:V16QI 1 "register_operand" "f") | |
1943 (match_operand:V16QI 2 "register_operand" "f")) | |
1944 (parallel [(const_int 8) (const_int 24) | |
1945 (const_int 9) (const_int 25) | |
1946 (const_int 10) (const_int 26) | |
1947 (const_int 11) (const_int 27) | |
1948 (const_int 12) (const_int 28) | |
1949 (const_int 13) (const_int 29) | |
1950 (const_int 14) (const_int 30) | |
1951 (const_int 15) (const_int 31)])))] | |
1952 "ISA_HAS_MSA" | |
1953 "ilvl.b\t%w0,%w2,%w1" | |
1954 [(set_attr "type" "simd_permute") | |
1955 (set_attr "mode" "V16QI")]) | |
1956 | |
1957 (define_insn "msa_ilvl_h" | |
1958 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
1959 (vec_select:V8HI | |
1960 (vec_concat:V16HI | |
1961 (match_operand:V8HI 1 "register_operand" "f") | |
1962 (match_operand:V8HI 2 "register_operand" "f")) | |
1963 (parallel [(const_int 4) (const_int 12) | |
1964 (const_int 5) (const_int 13) | |
1965 (const_int 6) (const_int 14) | |
1966 (const_int 7) (const_int 15)])))] | |
1967 "ISA_HAS_MSA" | |
1968 "ilvl.h\t%w0,%w2,%w1" | |
1969 [(set_attr "type" "simd_permute") | |
1970 (set_attr "mode" "V8HI")]) | |
1971 | |
1972 (define_insn "msa_ilvl_w" | |
1973 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
1974 (vec_select:V4SI | |
1975 (vec_concat:V8SI | |
1976 (match_operand:V4SI 1 "register_operand" "f") | |
1977 (match_operand:V4SI 2 "register_operand" "f")) | |
1978 (parallel [(const_int 2) (const_int 6) | |
1979 (const_int 3) (const_int 7)])))] | |
1980 "ISA_HAS_MSA" | |
1981 "ilvl.w\t%w0,%w2,%w1" | |
1982 [(set_attr "type" "simd_permute") | |
1983 (set_attr "mode" "V4SI")]) | |
1984 | |
1985 (define_insn "msa_ilvl_w_f" | |
1986 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
1987 (vec_select:V4SF | |
1988 (vec_concat:V8SF | |
1989 (match_operand:V4SF 1 "register_operand" "f") | |
1990 (match_operand:V4SF 2 "register_operand" "f")) | |
1991 (parallel [(const_int 2) (const_int 6) | |
1992 (const_int 3) (const_int 7)])))] | |
1993 "ISA_HAS_MSA" | |
1994 "ilvl.w\t%w0,%w2,%w1" | |
1995 [(set_attr "type" "simd_permute") | |
1996 (set_attr "mode" "V4SF")]) | |
1997 | |
1998 (define_insn "msa_ilvl_d" | |
1999 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
2000 (vec_select:V2DI | |
2001 (vec_concat:V4DI | |
2002 (match_operand:V2DI 1 "register_operand" "f") | |
2003 (match_operand:V2DI 2 "register_operand" "f")) | |
2004 (parallel [(const_int 1) (const_int 3)])))] | |
2005 "ISA_HAS_MSA" | |
2006 "ilvl.d\t%w0,%w2,%w1" | |
2007 [(set_attr "type" "simd_permute") | |
2008 (set_attr "mode" "V2DI")]) | |
2009 | |
2010 (define_insn "msa_ilvl_d_f" | |
2011 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
2012 (vec_select:V2DF | |
2013 (vec_concat:V4DF | |
2014 (match_operand:V2DF 1 "register_operand" "f") | |
2015 (match_operand:V2DF 2 "register_operand" "f")) | |
2016 (parallel [(const_int 1) (const_int 3)])))] | |
2017 "ISA_HAS_MSA" | |
2018 "ilvl.d\t%w0,%w2,%w1" | |
2019 [(set_attr "type" "simd_permute") | |
2020 (set_attr "mode" "V2DF")]) | |
2021 | |
2022 (define_insn "msa_ilvod_b" | |
2023 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
2024 (vec_select:V16QI | |
2025 (vec_concat:V32QI | |
2026 (match_operand:V16QI 1 "register_operand" "f") | |
2027 (match_operand:V16QI 2 "register_operand" "f")) | |
2028 (parallel [(const_int 1) (const_int 17) | |
2029 (const_int 3) (const_int 19) | |
2030 (const_int 5) (const_int 21) | |
2031 (const_int 7) (const_int 23) | |
2032 (const_int 9) (const_int 25) | |
2033 (const_int 11) (const_int 27) | |
2034 (const_int 13) (const_int 29) | |
2035 (const_int 15) (const_int 31)])))] | |
2036 "ISA_HAS_MSA" | |
2037 "ilvod.b\t%w0,%w2,%w1" | |
2038 [(set_attr "type" "simd_permute") | |
2039 (set_attr "mode" "V16QI")]) | |
2040 | |
2041 (define_insn "msa_ilvod_h" | |
2042 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
2043 (vec_select:V8HI | |
2044 (vec_concat:V16HI | |
2045 (match_operand:V8HI 1 "register_operand" "f") | |
2046 (match_operand:V8HI 2 "register_operand" "f")) | |
2047 (parallel [(const_int 1) (const_int 9) | |
2048 (const_int 3) (const_int 11) | |
2049 (const_int 5) (const_int 13) | |
2050 (const_int 7) (const_int 15)])))] | |
2051 "ISA_HAS_MSA" | |
2052 "ilvod.h\t%w0,%w2,%w1" | |
2053 [(set_attr "type" "simd_permute") | |
2054 (set_attr "mode" "V8HI")]) | |
2055 | |
2056 (define_insn "msa_ilvod_w" | |
2057 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
2058 (vec_select:V4SI | |
2059 (vec_concat:V8SI | |
2060 (match_operand:V4SI 1 "register_operand" "f") | |
2061 (match_operand:V4SI 2 "register_operand" "f")) | |
2062 (parallel [(const_int 1) (const_int 5) | |
2063 (const_int 3) (const_int 7)])))] | |
2064 "ISA_HAS_MSA" | |
2065 "ilvod.w\t%w0,%w2,%w1" | |
2066 [(set_attr "type" "simd_permute") | |
2067 (set_attr "mode" "V4SI")]) | |
2068 | |
2069 (define_insn "msa_ilvod_w_f" | |
2070 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2071 (vec_select:V4SF | |
2072 (vec_concat:V8SF | |
2073 (match_operand:V4SF 1 "register_operand" "f") | |
2074 (match_operand:V4SF 2 "register_operand" "f")) | |
2075 (parallel [(const_int 1) (const_int 5) | |
2076 (const_int 3) (const_int 7)])))] | |
2077 "ISA_HAS_MSA" | |
2078 "ilvod.w\t%w0,%w2,%w1" | |
2079 [(set_attr "type" "simd_permute") | |
2080 (set_attr "mode" "V4SF")]) | |
2081 | |
2082 (define_insn "msa_ilvr_b" | |
2083 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
2084 (vec_select:V16QI | |
2085 (vec_concat:V32QI | |
2086 (match_operand:V16QI 1 "register_operand" "f") | |
2087 (match_operand:V16QI 2 "register_operand" "f")) | |
2088 (parallel [(const_int 0) (const_int 16) | |
2089 (const_int 1) (const_int 17) | |
2090 (const_int 2) (const_int 18) | |
2091 (const_int 3) (const_int 19) | |
2092 (const_int 4) (const_int 20) | |
2093 (const_int 5) (const_int 21) | |
2094 (const_int 6) (const_int 22) | |
2095 (const_int 7) (const_int 23)])))] | |
2096 "ISA_HAS_MSA" | |
2097 "ilvr.b\t%w0,%w2,%w1" | |
2098 [(set_attr "type" "simd_permute") | |
2099 (set_attr "mode" "V16QI")]) | |
2100 | |
2101 (define_insn "msa_ilvr_h" | |
2102 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
2103 (vec_select:V8HI | |
2104 (vec_concat:V16HI | |
2105 (match_operand:V8HI 1 "register_operand" "f") | |
2106 (match_operand:V8HI 2 "register_operand" "f")) | |
2107 (parallel [(const_int 0) (const_int 8) | |
2108 (const_int 1) (const_int 9) | |
2109 (const_int 2) (const_int 10) | |
2110 (const_int 3) (const_int 11)])))] | |
2111 "ISA_HAS_MSA" | |
2112 "ilvr.h\t%w0,%w2,%w1" | |
2113 [(set_attr "type" "simd_permute") | |
2114 (set_attr "mode" "V8HI")]) | |
2115 | |
2116 (define_insn "msa_ilvr_w" | |
2117 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
2118 (vec_select:V4SI | |
2119 (vec_concat:V8SI | |
2120 (match_operand:V4SI 1 "register_operand" "f") | |
2121 (match_operand:V4SI 2 "register_operand" "f")) | |
2122 (parallel [(const_int 0) (const_int 4) | |
2123 (const_int 1) (const_int 5)])))] | |
2124 "ISA_HAS_MSA" | |
2125 "ilvr.w\t%w0,%w2,%w1" | |
2126 [(set_attr "type" "simd_permute") | |
2127 (set_attr "mode" "V4SI")]) | |
2128 | |
2129 (define_insn "msa_ilvr_w_f" | |
2130 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2131 (vec_select:V4SF | |
2132 (vec_concat:V8SF | |
2133 (match_operand:V4SF 1 "register_operand" "f") | |
2134 (match_operand:V4SF 2 "register_operand" "f")) | |
2135 (parallel [(const_int 0) (const_int 4) | |
2136 (const_int 1) (const_int 5)])))] | |
2137 "ISA_HAS_MSA" | |
2138 "ilvr.w\t%w0,%w2,%w1" | |
2139 [(set_attr "type" "simd_permute") | |
2140 (set_attr "mode" "V4SF")]) | |
2141 | |
2142 (define_insn "msa_ilvr_d" | |
2143 [(set (match_operand:V2DI 0 "register_operand" "=f") | |
2144 (vec_select:V2DI | |
2145 (vec_concat:V4DI | |
2146 (match_operand:V2DI 1 "register_operand" "f") | |
2147 (match_operand:V2DI 2 "register_operand" "f")) | |
2148 (parallel [(const_int 0) (const_int 2)])))] | |
2149 "ISA_HAS_MSA" | |
2150 "ilvr.d\t%w0,%w2,%w1" | |
2151 [(set_attr "type" "simd_permute") | |
2152 (set_attr "mode" "V2DI")]) | |
2153 | |
2154 (define_insn "msa_ilvr_d_f" | |
2155 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
2156 (vec_select:V2DF | |
2157 (vec_concat:V4DF | |
2158 (match_operand:V2DF 1 "register_operand" "f") | |
2159 (match_operand:V2DF 2 "register_operand" "f")) | |
2160 (parallel [(const_int 0) (const_int 2)])))] | |
2161 "ISA_HAS_MSA" | |
2162 "ilvr.d\t%w0,%w2,%w1" | |
2163 [(set_attr "type" "simd_permute") | |
2164 (set_attr "mode" "V2DF")]) | |
2165 | |
2166 (define_insn "msa_madd_q_<msafmt>" | |
2167 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2168 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0") | |
2169 (match_operand:IMSA_WH 2 "register_operand" "f") | |
2170 (match_operand:IMSA_WH 3 "register_operand" "f")] | |
2171 UNSPEC_MSA_MADD_Q))] | |
2172 "ISA_HAS_MSA" | |
2173 "madd_q.<msafmt>\t%w0,%w2,%w3" | |
2174 [(set_attr "type" "simd_mul") | |
2175 (set_attr "mode" "<MODE>")]) | |
2176 | |
2177 (define_insn "msa_maddr_q_<msafmt>" | |
2178 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2179 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0") | |
2180 (match_operand:IMSA_WH 2 "register_operand" "f") | |
2181 (match_operand:IMSA_WH 3 "register_operand" "f")] | |
2182 UNSPEC_MSA_MADDR_Q))] | |
2183 "ISA_HAS_MSA" | |
2184 "maddr_q.<msafmt>\t%w0,%w2,%w3" | |
2185 [(set_attr "type" "simd_mul") | |
2186 (set_attr "mode" "<MODE>")]) | |
2187 | |
2188 (define_insn "msa_max_a_<msafmt>" | |
2189 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2190 (if_then_else:IMSA | |
2191 (gt (abs:IMSA (match_operand:IMSA 1 "register_operand" "f")) | |
2192 (abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))) | |
2193 (match_dup 1) | |
2194 (match_dup 2)))] | |
2195 "ISA_HAS_MSA" | |
2196 "max_a.<msafmt>\t%w0,%w1,%w2" | |
2197 [(set_attr "type" "simd_int_arith") | |
2198 (set_attr "mode" "<MODE>")]) | |
2199 | |
2200 (define_insn "smax<mode>3" | |
2201 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
2202 (smax:IMSA (match_operand:IMSA 1 "register_operand" "f,f") | |
2203 (match_operand:IMSA 2 "reg_or_vector_same_simm5_operand" "f,Usv5")))] | |
2204 "ISA_HAS_MSA" | |
2205 "@ | |
2206 max_s.<msafmt>\t%w0,%w1,%w2 | |
2207 maxi_s.<msafmt>\t%w0,%w1,%E2" | |
2208 [(set_attr "type" "simd_int_arith") | |
2209 (set_attr "mode" "<MODE>")]) | |
2210 | |
2211 (define_insn "umax<mode>3" | |
2212 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
2213 (umax:IMSA (match_operand:IMSA 1 "register_operand" "f,f") | |
2214 (match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))] | |
2215 "ISA_HAS_MSA" | |
2216 "@ | |
2217 max_u.<msafmt>\t%w0,%w1,%w2 | |
2218 maxi_u.<msafmt>\t%w0,%w1,%B2" | |
2219 [(set_attr "type" "simd_int_arith") | |
2220 (set_attr "mode" "<MODE>")]) | |
2221 | |
2222 (define_insn "msa_min_a_<msafmt>" | |
2223 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2224 (if_then_else:IMSA | |
2225 (lt (abs:IMSA (match_operand:IMSA 1 "register_operand" "f")) | |
2226 (abs:IMSA (match_operand:IMSA 2 "register_operand" "f"))) | |
2227 (match_dup 1) | |
2228 (match_dup 2)))] | |
2229 "ISA_HAS_MSA" | |
2230 "min_a.<msafmt>\t%w0,%w1,%w2" | |
2231 [(set_attr "type" "simd_int_arith") | |
2232 (set_attr "mode" "<MODE>")]) | |
2233 | |
2234 (define_insn "smin<mode>3" | |
2235 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
2236 (smin:IMSA (match_operand:IMSA 1 "register_operand" "f,f") | |
2237 (match_operand:IMSA 2 "reg_or_vector_same_simm5_operand" "f,Usv5")))] | |
2238 "ISA_HAS_MSA" | |
2239 "@ | |
2240 min_s.<msafmt>\t%w0,%w1,%w2 | |
2241 mini_s.<msafmt>\t%w0,%w1,%E2" | |
2242 [(set_attr "type" "simd_int_arith") | |
2243 (set_attr "mode" "<MODE>")]) | |
2244 | |
2245 (define_insn "umin<mode>3" | |
2246 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
2247 (umin:IMSA (match_operand:IMSA 1 "register_operand" "f,f") | |
2248 (match_operand:IMSA 2 "reg_or_vector_same_uimm5_operand" "f,Uuv5")))] | |
2249 "ISA_HAS_MSA" | |
2250 "@ | |
2251 min_u.<msafmt>\t%w0,%w1,%w2 | |
2252 mini_u.<msafmt>\t%w0,%w1,%B2" | |
2253 [(set_attr "type" "simd_int_arith") | |
2254 (set_attr "mode" "<MODE>")]) | |
2255 | |
2256 (define_insn "msa_msub_q_<msafmt>" | |
2257 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2258 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0") | |
2259 (match_operand:IMSA_WH 2 "register_operand" "f") | |
2260 (match_operand:IMSA_WH 3 "register_operand" "f")] | |
2261 UNSPEC_MSA_MSUB_Q))] | |
2262 "ISA_HAS_MSA" | |
2263 "msub_q.<msafmt>\t%w0,%w2,%w3" | |
2264 [(set_attr "type" "simd_mul") | |
2265 (set_attr "mode" "<MODE>")]) | |
2266 | |
2267 (define_insn "msa_msubr_q_<msafmt>" | |
2268 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2269 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "0") | |
2270 (match_operand:IMSA_WH 2 "register_operand" "f") | |
2271 (match_operand:IMSA_WH 3 "register_operand" "f")] | |
2272 UNSPEC_MSA_MSUBR_Q))] | |
2273 "ISA_HAS_MSA" | |
2274 "msubr_q.<msafmt>\t%w0,%w2,%w3" | |
2275 [(set_attr "type" "simd_mul") | |
2276 (set_attr "mode" "<MODE>")]) | |
2277 | |
2278 (define_insn "msa_mul_q_<msafmt>" | |
2279 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2280 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "f") | |
2281 (match_operand:IMSA_WH 2 "register_operand" "f")] | |
2282 UNSPEC_MSA_MUL_Q))] | |
2283 "ISA_HAS_MSA" | |
2284 "mul_q.<msafmt>\t%w0,%w1,%w2" | |
2285 [(set_attr "type" "simd_mul") | |
2286 (set_attr "mode" "<MODE>")]) | |
2287 | |
2288 (define_insn "msa_mulr_q_<msafmt>" | |
2289 [(set (match_operand:IMSA_WH 0 "register_operand" "=f") | |
2290 (unspec:IMSA_WH [(match_operand:IMSA_WH 1 "register_operand" "f") | |
2291 (match_operand:IMSA_WH 2 "register_operand" "f")] | |
2292 UNSPEC_MSA_MULR_Q))] | |
2293 "ISA_HAS_MSA" | |
2294 "mulr_q.<msafmt>\t%w0,%w1,%w2" | |
2295 [(set_attr "type" "simd_mul") | |
2296 (set_attr "mode" "<MODE>")]) | |
2297 | |
2298 (define_insn "msa_nloc_<msafmt>" | |
2299 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2300 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f")] | |
2301 UNSPEC_MSA_NLOC))] | |
2302 "ISA_HAS_MSA" | |
2303 "nloc.<msafmt>\t%w0,%w1" | |
2304 [(set_attr "type" "simd_bit") | |
2305 (set_attr "mode" "<MODE>")]) | |
2306 | |
2307 (define_insn "clz<mode>2" | |
2308 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2309 (clz:IMSA (match_operand:IMSA 1 "register_operand" "f")))] | |
2310 "ISA_HAS_MSA" | |
2311 "nlzc.<msafmt>\t%w0,%w1" | |
2312 [(set_attr "type" "simd_bit") | |
2313 (set_attr "mode" "<MODE>")]) | |
2314 | |
2315 (define_insn "msa_nor_<msafmt>" | |
2316 [(set (match_operand:IMSA 0 "register_operand" "=f,f") | |
2317 (and:IMSA (not:IMSA (match_operand:IMSA 1 "register_operand" "f,f")) | |
2318 (not:IMSA (match_operand:IMSA 2 "reg_or_vector_same_val_operand" "f,Urv8"))))] | |
2319 "ISA_HAS_MSA" | |
2320 "@ | |
2321 nor.v\t%w0,%w1,%w2 | |
2322 nori.b\t%w0,%w1,%B2" | |
2323 [(set_attr "type" "simd_logic") | |
2324 (set_attr "mode" "<MODE>")]) | |
2325 | |
2326 (define_insn "msa_pckev_b" | |
2327 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
2328 (vec_select:V16QI | |
2329 (vec_concat:V32QI | |
2330 (match_operand:V16QI 1 "register_operand" "f") | |
2331 (match_operand:V16QI 2 "register_operand" "f")) | |
2332 (parallel [(const_int 0) (const_int 2) | |
2333 (const_int 4) (const_int 6) | |
2334 (const_int 8) (const_int 10) | |
2335 (const_int 12) (const_int 14) | |
2336 (const_int 16) (const_int 18) | |
2337 (const_int 20) (const_int 22) | |
2338 (const_int 24) (const_int 26) | |
2339 (const_int 28) (const_int 30)])))] | |
2340 "ISA_HAS_MSA" | |
2341 "pckev.b\t%w0,%w2,%w1" | |
2342 [(set_attr "type" "simd_permute") | |
2343 (set_attr "mode" "V16QI")]) | |
2344 | |
2345 (define_insn "msa_pckev_h" | |
2346 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
2347 (vec_select:V8HI | |
2348 (vec_concat:V16HI | |
2349 (match_operand:V8HI 1 "register_operand" "f") | |
2350 (match_operand:V8HI 2 "register_operand" "f")) | |
2351 (parallel [(const_int 0) (const_int 2) | |
2352 (const_int 4) (const_int 6) | |
2353 (const_int 8) (const_int 10) | |
2354 (const_int 12) (const_int 14)])))] | |
2355 "ISA_HAS_MSA" | |
2356 "pckev.h\t%w0,%w2,%w1" | |
2357 [(set_attr "type" "simd_permute") | |
2358 (set_attr "mode" "V8HI")]) | |
2359 | |
2360 (define_insn "msa_pckev_w" | |
2361 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
2362 (vec_select:V4SI | |
2363 (vec_concat:V8SI | |
2364 (match_operand:V4SI 1 "register_operand" "f") | |
2365 (match_operand:V4SI 2 "register_operand" "f")) | |
2366 (parallel [(const_int 0) (const_int 2) | |
2367 (const_int 4) (const_int 6)])))] | |
2368 "ISA_HAS_MSA" | |
2369 "pckev.w\t%w0,%w2,%w1" | |
2370 [(set_attr "type" "simd_permute") | |
2371 (set_attr "mode" "V4SI")]) | |
2372 | |
2373 (define_insn "msa_pckev_w_f" | |
2374 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2375 (vec_select:V4SF | |
2376 (vec_concat:V8SF | |
2377 (match_operand:V4SF 1 "register_operand" "f") | |
2378 (match_operand:V4SF 2 "register_operand" "f")) | |
2379 (parallel [(const_int 0) (const_int 2) | |
2380 (const_int 4) (const_int 6)])))] | |
2381 "ISA_HAS_MSA" | |
2382 "pckev.w\t%w0,%w2,%w1" | |
2383 [(set_attr "type" "simd_permute") | |
2384 (set_attr "mode" "V4SF")]) | |
2385 | |
2386 (define_insn "msa_pckod_b" | |
2387 [(set (match_operand:V16QI 0 "register_operand" "=f") | |
2388 (vec_select:V16QI | |
2389 (vec_concat:V32QI | |
2390 (match_operand:V16QI 1 "register_operand" "f") | |
2391 (match_operand:V16QI 2 "register_operand" "f")) | |
2392 (parallel [(const_int 1) (const_int 3) | |
2393 (const_int 5) (const_int 7) | |
2394 (const_int 9) (const_int 11) | |
2395 (const_int 13) (const_int 15) | |
2396 (const_int 17) (const_int 19) | |
2397 (const_int 21) (const_int 23) | |
2398 (const_int 25) (const_int 27) | |
2399 (const_int 29) (const_int 31)])))] | |
2400 "ISA_HAS_MSA" | |
2401 "pckod.b\t%w0,%w2,%w1" | |
2402 [(set_attr "type" "simd_permute") | |
2403 (set_attr "mode" "V16QI")]) | |
2404 | |
2405 (define_insn "msa_pckod_h" | |
2406 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
2407 (vec_select:V8HI | |
2408 (vec_concat:V16HI | |
2409 (match_operand:V8HI 1 "register_operand" "f") | |
2410 (match_operand:V8HI 2 "register_operand" "f")) | |
2411 (parallel [(const_int 1) (const_int 3) | |
2412 (const_int 5) (const_int 7) | |
2413 (const_int 9) (const_int 11) | |
2414 (const_int 13) (const_int 15)])))] | |
2415 "ISA_HAS_MSA" | |
2416 "pckod.h\t%w0,%w2,%w1" | |
2417 [(set_attr "type" "simd_permute") | |
2418 (set_attr "mode" "V8HI")]) | |
2419 | |
2420 (define_insn "msa_pckod_w" | |
2421 [(set (match_operand:V4SI 0 "register_operand" "=f") | |
2422 (vec_select:V4SI | |
2423 (vec_concat:V8SI | |
2424 (match_operand:V4SI 1 "register_operand" "f") | |
2425 (match_operand:V4SI 2 "register_operand" "f")) | |
2426 (parallel [(const_int 1) (const_int 3) | |
2427 (const_int 5) (const_int 7)])))] | |
2428 "ISA_HAS_MSA" | |
2429 "pckod.w\t%w0,%w2,%w1" | |
2430 [(set_attr "type" "simd_permute") | |
2431 (set_attr "mode" "V4SI")]) | |
2432 | |
2433 (define_insn "msa_pckod_w_f" | |
2434 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2435 (vec_select:V4SF | |
2436 (vec_concat:V8SF | |
2437 (match_operand:V4SF 1 "register_operand" "f") | |
2438 (match_operand:V4SF 2 "register_operand" "f")) | |
2439 (parallel [(const_int 1) (const_int 3) | |
2440 (const_int 5) (const_int 7)])))] | |
2441 "ISA_HAS_MSA" | |
2442 "pckod.w\t%w0,%w2,%w1" | |
2443 [(set_attr "type" "simd_permute") | |
2444 (set_attr "mode" "V4SF")]) | |
2445 | |
2446 (define_insn "popcount<mode>2" | |
2447 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2448 (popcount:IMSA (match_operand:IMSA 1 "register_operand" "f")))] | |
2449 "ISA_HAS_MSA" | |
2450 "pcnt.<msafmt>\t%w0,%w1" | |
2451 [(set_attr "type" "simd_pcnt") | |
2452 (set_attr "mode" "<MODE>")]) | |
2453 | |
2454 (define_insn "msa_sat_s_<msafmt>" | |
2455 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2456 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2457 (match_operand 2 "const_<bitimm>_operand" "")] | |
2458 UNSPEC_MSA_SAT_S))] | |
2459 "ISA_HAS_MSA" | |
2460 "sat_s.<msafmt>\t%w0,%w1,%2" | |
2461 [(set_attr "type" "simd_sat") | |
2462 (set_attr "mode" "<MODE>")]) | |
2463 | |
2464 (define_insn "msa_sat_u_<msafmt>" | |
2465 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2466 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2467 (match_operand 2 "const_<bitimm>_operand" "")] | |
2468 UNSPEC_MSA_SAT_U))] | |
2469 "ISA_HAS_MSA" | |
2470 "sat_u.<msafmt>\t%w0,%w1,%2" | |
2471 [(set_attr "type" "simd_sat") | |
2472 (set_attr "mode" "<MODE>")]) | |
2473 | |
2474 (define_insn "msa_shf_<msafmt_f>" | |
2475 [(set (match_operand:MSA_WHB_W 0 "register_operand" "=f") | |
2476 (vec_select:MSA_WHB_W | |
2477 (match_operand:MSA_WHB_W 1 "register_operand" "f") | |
2478 (match_operand 2 "par_const_vector_shf_set_operand" "")))] | |
2479 "ISA_HAS_MSA" | |
2480 { | |
2481 HOST_WIDE_INT val = 0; | |
2482 unsigned int i; | |
2483 | |
2484 /* We convert the selection to an immediate. */ | |
2485 for (i = 0; i < 4; i++) | |
2486 val |= INTVAL (XVECEXP (operands[2], 0, i)) << (2 * i); | |
2487 | |
2488 operands[2] = GEN_INT (val); | |
2489 return "shf.<msafmt>\t%w0,%w1,%X2"; | |
2490 } | |
2491 [(set_attr "type" "simd_shf") | |
2492 (set_attr "mode" "<MODE>")]) | |
2493 | |
2494 (define_insn "msa_srar_<msafmt>" | |
2495 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2496 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2497 (match_operand:IMSA 2 "register_operand" "f")] | |
2498 UNSPEC_MSA_SRAR))] | |
2499 "ISA_HAS_MSA" | |
2500 "srar.<msafmt>\t%w0,%w1,%w2" | |
2501 [(set_attr "type" "simd_shift") | |
2502 (set_attr "mode" "<MODE>")]) | |
2503 | |
2504 (define_insn "msa_srari_<msafmt>" | |
2505 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2506 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2507 (match_operand 2 "const_<bitimm>_operand" "")] | |
2508 UNSPEC_MSA_SRARI))] | |
2509 "ISA_HAS_MSA" | |
2510 "srari.<msafmt>\t%w0,%w1,%2" | |
2511 [(set_attr "type" "simd_shift") | |
2512 (set_attr "mode" "<MODE>")]) | |
2513 | |
2514 (define_insn "msa_srlr_<msafmt>" | |
2515 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2516 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2517 (match_operand:IMSA 2 "register_operand" "f")] | |
2518 UNSPEC_MSA_SRLR))] | |
2519 "ISA_HAS_MSA" | |
2520 "srlr.<msafmt>\t%w0,%w1,%w2" | |
2521 [(set_attr "type" "simd_shift") | |
2522 (set_attr "mode" "<MODE>")]) | |
2523 | |
2524 (define_insn "msa_srlri_<msafmt>" | |
2525 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2526 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2527 (match_operand 2 "const_<bitimm>_operand" "")] | |
2528 UNSPEC_MSA_SRLRI))] | |
2529 "ISA_HAS_MSA" | |
2530 "srlri.<msafmt>\t%w0,%w1,%2" | |
2531 [(set_attr "type" "simd_shift") | |
2532 (set_attr "mode" "<MODE>")]) | |
2533 | |
2534 (define_insn "msa_subs_s_<msafmt>" | |
2535 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2536 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2537 (match_operand:IMSA 2 "register_operand" "f")] | |
2538 UNSPEC_MSA_SUBS_S))] | |
2539 "ISA_HAS_MSA" | |
2540 "subs_s.<msafmt>\t%w0,%w1,%w2" | |
2541 [(set_attr "type" "simd_int_arith") | |
2542 (set_attr "mode" "<MODE>")]) | |
2543 | |
2544 (define_insn "msa_subs_u_<msafmt>" | |
2545 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2546 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2547 (match_operand:IMSA 2 "register_operand" "f")] | |
2548 UNSPEC_MSA_SUBS_U))] | |
2549 "ISA_HAS_MSA" | |
2550 "subs_u.<msafmt>\t%w0,%w1,%w2" | |
2551 [(set_attr "type" "simd_int_arith") | |
2552 (set_attr "mode" "<MODE>")]) | |
2553 | |
2554 (define_insn "msa_subsuu_s_<msafmt>" | |
2555 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2556 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2557 (match_operand:IMSA 2 "register_operand" "f")] | |
2558 UNSPEC_MSA_SUBSUU_S))] | |
2559 "ISA_HAS_MSA" | |
2560 "subsuu_s.<msafmt>\t%w0,%w1,%w2" | |
2561 [(set_attr "type" "simd_int_arith") | |
2562 (set_attr "mode" "<MODE>")]) | |
2563 | |
2564 (define_insn "msa_subsus_u_<msafmt>" | |
2565 [(set (match_operand:IMSA 0 "register_operand" "=f") | |
2566 (unspec:IMSA [(match_operand:IMSA 1 "register_operand" "f") | |
2567 (match_operand:IMSA 2 "register_operand" "f")] | |
2568 UNSPEC_MSA_SUBSUS_U))] | |
2569 "ISA_HAS_MSA" | |
2570 "subsus_u.<msafmt>\t%w0,%w1,%w2" | |
2571 [(set_attr "type" "simd_int_arith") | |
2572 (set_attr "mode" "<MODE>")]) | |
2573 | |
2574 (define_insn "msa_sld_<msafmt_f>" | |
2575 [(set (match_operand:MSA 0 "register_operand" "=f") | |
2576 (unspec:MSA [(match_operand:MSA 1 "register_operand" "0") | |
2577 (match_operand:MSA 2 "register_operand" "f") | |
2578 (match_operand:SI 3 "reg_or_0_operand" "dJ")] | |
2579 UNSPEC_MSA_SLD))] | |
2580 "ISA_HAS_MSA" | |
2581 "sld.<msafmt>\t%w0,%w2[%z3]" | |
2582 [(set_attr "type" "simd_sld") | |
2583 (set_attr "mode" "<MODE>")]) | |
2584 | |
2585 (define_insn "msa_sldi_<msafmt_f>" | |
2586 [(set (match_operand:MSA 0 "register_operand" "=f") | |
2587 (unspec:MSA [(match_operand:MSA 1 "register_operand" "0") | |
2588 (match_operand:MSA 2 "register_operand" "f") | |
2589 (match_operand 3 "const_<indeximm>_operand" "")] | |
2590 UNSPEC_MSA_SLDI))] | |
2591 "ISA_HAS_MSA" | |
2592 "sldi.<msafmt>\t%w0,%w2[%3]" | |
2593 [(set_attr "type" "simd_sld") | |
2594 (set_attr "mode" "<MODE>")]) | |
2595 | |
2596 (define_insn "msa_splat_<msafmt_f>" | |
2597 [(set (match_operand:MSA 0 "register_operand" "=f") | |
2598 (unspec:MSA [(match_operand:MSA 1 "register_operand" "f") | |
2599 (match_operand:SI 2 "register_operand" "d")] | |
2600 UNSPEC_MSA_SPLAT))] | |
2601 "ISA_HAS_MSA" | |
2602 "splat.<msafmt>\t%w0,%w1[%z2]" | |
2603 [(set_attr "type" "simd_splat") | |
2604 (set_attr "mode" "<MODE>")]) | |
2605 | |
2606 (define_insn "msa_splati_<msafmt_f>" | |
2607 [(set (match_operand:MSA 0 "register_operand" "=f") | |
2608 (vec_duplicate:MSA | |
2609 (vec_select:<UNITMODE> | |
2610 (match_operand:MSA 1 "register_operand" "f") | |
2611 (parallel [(match_operand 2 "const_<indeximm>_operand" "")]))))] | |
2612 "ISA_HAS_MSA" | |
2613 "splati.<msafmt>\t%w0,%w1[%2]" | |
2614 [(set_attr "type" "simd_splat") | |
2615 (set_attr "mode" "<MODE>")]) | |
2616 | |
2617 (define_insn "msa_splati_<msafmt_f>_scalar" | |
2618 [(set (match_operand:FMSA 0 "register_operand" "=f") | |
2619 (unspec:FMSA [(match_operand:<UNITMODE> 1 "register_operand" "f")] | |
2620 UNSPEC_MSA_SPLATI))] | |
2621 "ISA_HAS_MSA" | |
2622 "splati.<msafmt>\t%w0,%w1[0]" | |
2623 [(set_attr "type" "simd_splat") | |
2624 (set_attr "mode" "<MODE>")]) | |
2625 | |
2626 (define_insn "msa_cfcmsa" | |
2627 [(set (match_operand:SI 0 "register_operand" "=d") | |
2628 (unspec_volatile:SI [(match_operand 1 "const_uimm5_operand" "")] | |
2629 UNSPEC_MSA_CFCMSA))] | |
2630 "ISA_HAS_MSA" | |
2631 "cfcmsa\t%0,$%1" | |
2632 [(set_attr "type" "simd_cmsa") | |
2633 (set_attr "mode" "SI")]) | |
2634 | |
2635 (define_insn "msa_ctcmsa" | |
2636 [(unspec_volatile [(match_operand 0 "const_uimm5_operand" "") | |
2637 (match_operand:SI 1 "register_operand" "d")] | |
2638 UNSPEC_MSA_CTCMSA)] | |
2639 "ISA_HAS_MSA" | |
2640 "ctcmsa\t$%0,%1" | |
2641 [(set_attr "type" "simd_cmsa") | |
2642 (set_attr "mode" "SI")]) | |
2643 | |
2644 (define_insn "msa_fexdo_h" | |
2645 [(set (match_operand:V8HI 0 "register_operand" "=f") | |
2646 (unspec:V8HI [(match_operand:V4SF 1 "register_operand" "f") | |
2647 (match_operand:V4SF 2 "register_operand" "f")] | |
2648 UNSPEC_MSA_FEXDO))] | |
2649 "ISA_HAS_MSA" | |
2650 "fexdo.h\t%w0,%w1,%w2" | |
2651 [(set_attr "type" "simd_fcvt") | |
2652 (set_attr "mode" "V8HI")]) | |
2653 | |
2654 (define_insn "vec_pack_trunc_v2df" | |
2655 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2656 (vec_concat:V4SF | |
2657 (float_truncate:V2SF (match_operand:V2DF 1 "register_operand" "f")) | |
2658 (float_truncate:V2SF (match_operand:V2DF 2 "register_operand" "f"))))] | |
2659 "ISA_HAS_MSA" | |
2660 "fexdo.w\t%w0,%w2,%w1" | |
2661 [(set_attr "type" "simd_fcvt") | |
2662 (set_attr "mode" "V4SF")]) | |
2663 | |
2664 (define_insn "msa_fexupl_w" | |
2665 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2666 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")] | |
2667 UNSPEC_MSA_FEXUPL))] | |
2668 "ISA_HAS_MSA" | |
2669 "fexupl.w\t%w0,%w1" | |
2670 [(set_attr "type" "simd_fcvt") | |
2671 (set_attr "mode" "V4SF")]) | |
2672 | |
2673 (define_insn "msa_fexupl_d" | |
2674 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
2675 (float_extend:V2DF | |
2676 (vec_select:V2SF | |
2677 (match_operand:V4SF 1 "register_operand" "f") | |
2678 (parallel [(const_int 2) (const_int 3)]))))] | |
2679 "ISA_HAS_MSA" | |
2680 "fexupl.d\t%w0,%w1" | |
2681 [(set_attr "type" "simd_fcvt") | |
2682 (set_attr "mode" "V2DF")]) | |
2683 | |
2684 (define_insn "msa_fexupr_w" | |
2685 [(set (match_operand:V4SF 0 "register_operand" "=f") | |
2686 (unspec:V4SF [(match_operand:V8HI 1 "register_operand" "f")] | |
2687 UNSPEC_MSA_FEXUPR))] | |
2688 "ISA_HAS_MSA" | |
2689 "fexupr.w\t%w0,%w1" | |
2690 [(set_attr "type" "simd_fcvt") | |
2691 (set_attr "mode" "V4SF")]) | |
2692 | |
2693 (define_insn "msa_fexupr_d" | |
2694 [(set (match_operand:V2DF 0 "register_operand" "=f") | |
2695 (float_extend:V2DF | |
2696 (vec_select:V2SF | |
2697 (match_operand:V4SF 1 "register_operand" "f") | |
2698 (parallel [(const_int 0) (const_int 1)]))))] | |
2699 "ISA_HAS_MSA" | |
2700 "fexupr.d\t%w0,%w1" | |
2701 [(set_attr "type" "simd_fcvt") | |
2702 (set_attr "mode" "V2DF")]) | |
2703 | |
2704 (define_code_attr msabr | |
2705 [(eq "bz") | |
2706 (ne "bnz")]) | |
2707 | |
2708 (define_code_attr msabr_neg | |
2709 [(eq "bnz") | |
2710 (ne "bz")]) | |
2711 | |
2712 (define_insn "msa_<msabr>_<msafmt_f>" | |
2713 [(set (pc) (if_then_else | |
2714 (equality_op | |
2715 (unspec:SI [(match_operand:MSA 1 "register_operand" "f")] | |
2716 UNSPEC_MSA_BRANCH) | |
2717 (match_operand:SI 2 "const_0_operand")) | |
2718 (label_ref (match_operand 0)) | |
2719 (pc)))] | |
2720 "ISA_HAS_MSA" | |
2721 { | |
2722 return mips_output_conditional_branch (insn, operands, | |
2723 MIPS_BRANCH ("<msabr>.<msafmt>", | |
2724 "%w1,%0"), | |
2725 MIPS_BRANCH ("<msabr_neg>.<msafmt>", | |
2726 "%w1,%0")); | |
2727 } | |
2728 [(set_attr "type" "simd_branch") | |
2729 (set_attr "mode" "<MODE>") | |
2730 (set_attr "compact_form" "never")]) | |
2731 | |
2732 (define_insn "msa_<msabr>_v_<msafmt_f>" | |
2733 [(set (pc) (if_then_else | |
2734 (equality_op | |
2735 (unspec:SI [(match_operand:MSA 1 "register_operand" "f")] | |
2736 UNSPEC_MSA_BRANCH_V) | |
2737 (match_operand:SI 2 "const_0_operand")) | |
2738 (label_ref (match_operand 0)) | |
2739 (pc)))] | |
2740 "ISA_HAS_MSA" | |
2741 { | |
2742 return mips_output_conditional_branch (insn, operands, | |
2743 MIPS_BRANCH ("<msabr>.v", "%w1,%0"), | |
2744 MIPS_BRANCH ("<msabr_neg>.v", | |
2745 "%w1,%0")); | |
2746 } | |
2747 [(set_attr "type" "simd_branch") | |
2748 (set_attr "mode" "TI") | |
2749 (set_attr "compact_form" "never")]) |