PR82687, g++.dg/asan/default-options-1.C fails with PR82575 fix
[official-gcc.git] / gcc / config / mips / mips-msa.md
blob87d889d72963209c16326e744b729b65ae860624
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.
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.
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/>.
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
95 ;; All vector modes with 128 bits.
96 (define_mode_iterator MSA      [V2DF V4SF V2DI V4SI V8HI V16QI])
98 ;; Same as MSA.  Used by vcond to iterate two modes.
99 (define_mode_iterator MSA_2    [V2DF V4SF V2DI V4SI V8HI V16QI])
101 ;; Only used for splitting insert_d and copy_{u,s}.d.
102 (define_mode_iterator MSA_D    [V2DI V2DF])
104 ;; Only used for copy_{u,s}.w.
105 (define_mode_iterator MSA_W    [V4SI V4SF])
107 ;; Only integer modes.
108 (define_mode_iterator IMSA     [V2DI V4SI V8HI V16QI])
110 ;; As IMSA but excludes V16QI.
111 (define_mode_iterator IMSA_DWH [V2DI V4SI V8HI])
113 ;; As IMSA but excludes V2DI.
114 (define_mode_iterator IMSA_WHB [V4SI V8HI V16QI])
116 ;; Only integer modes equal or larger than a word.
117 (define_mode_iterator IMSA_DW  [V2DI V4SI])
119 ;; Only integer modes smaller than a word.
120 (define_mode_iterator IMSA_HB  [V8HI V16QI])
122 ;; Only integer modes for fixed-point madd_q/maddr_q.
123 (define_mode_iterator IMSA_WH  [V4SI V8HI])
125 ;; Only floating-point modes.
126 (define_mode_iterator FMSA     [V2DF V4SF])
128 ;; Only used for immediate set shuffle elements instruction.
129 (define_mode_iterator MSA_WHB_W [V4SI V8HI V16QI V4SF])
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")])
140 ;; The attribute gives half modes for vector modes.
141 (define_mode_attr VHMODE
142   [(V8HI "V16QI")
143    (V4SI "V8HI")
144    (V2DI "V4SI")])
146 ;; The attribute gives double modes for vector modes.
147 (define_mode_attr VDMODE
148   [(V4SI "V2DI")
149    (V8HI "V4SI")
150    (V16QI "V8HI")])
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")])
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")])
167 ;; Only used with MSA_D iterator.
168 (define_mode_attr msa_d
169   [(V2DI "reg_or_0")
170    (V2DF "register")])
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")])
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")])
190 ;; This attribute gives suffix for integers in VHMODE.
191 (define_mode_attr hmsafmt
192   [(V2DI "w")
193    (V4SI "h")
194    (V8HI "b")])
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")])
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")])
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")])
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")])
234 (define_expand "vec_init<mode><unitmode>"
235   [(match_operand:MSA 0 "register_operand")
236    (match_operand:MSA 1 "")]
237   "ISA_HAS_MSA"
239   mips_expand_vector_init (operands[0], operands[1]);
240   DONE;
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>")])
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"
264   operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, true/*high_p*/);
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"
275   operands[2] = mips_msa_vec_parallel_const_half (V4SFmode, false/*high_p*/);
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"
283   mips_expand_vec_unpack (operands, false/*unsigned_p*/, true/*high_p*/);
284   DONE;
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"
292   mips_expand_vec_unpack (operands, false/*unsigned_p*/, false/*high_p*/);
293   DONE;
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"
301   mips_expand_vec_unpack (operands, true/*unsigned_p*/, true/*high_p*/);
302   DONE;
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"
310   mips_expand_vec_unpack (operands, true/*unsigned_p*/, false/*high_p*/);
311   DONE;
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"
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;
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"
338   rtx temp;
339   HOST_WIDE_INT val = INTVAL (operands[2]);
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;
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))]
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]));
383   [(set_attr "move_type" "fmove")
384    (set_attr "mode" "<UNITMODE>")])
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"
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;
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"
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;
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))"
420   mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands);
421   DONE;
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))"
434   mips_expand_vec_cond_expr (<MSA:MODE>mode, <MSA:VIMODE>mode, operands);
435   DONE;
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"
447   if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode))
448     return "#";
449   else
450     return "insert.<msafmt>\t%w0[%y3],%z1";
452   [(set_attr "type" "simd_insert")
453    (set_attr "mode" "<MODE>")])
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)]
465   mips_split_msa_insert_d (operands[0], operands[2], operands[3], operands[1]);
466   DONE;
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>")])
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>")])
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>")])
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")])
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>")])
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>")])
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"
546   if (TARGET_64BIT)
547     return "copy_s.<msafmt>\t%0,%w1[%2]";
548   else
549     return "#";
551   "reload_completed && ISA_HAS_MSA && !TARGET_64BIT"
552   [(const_int 0)]
554   mips_split_msa_copy_d (operands[0], operands[1], operands[2],
555                          gen_msa_copy_s_w);
556   DONE;
558   [(set_attr "type" "simd_copy")
559    (set_attr "mode" "<MODE>")])
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"
568   if (mips_expand_vec_perm_const (operands))
569     DONE;
570   else
571     FAIL;
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"
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;
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"
591   rtx reg = gen_reg_rtx (<MODE>mode);
592   emit_move_insn (reg, CONST0_RTX (<MODE>mode));
593   operands[2] = reg;
596 (define_expand "msa_ldi<mode>"
597   [(match_operand:IMSA 0 "register_operand")
598    (match_operand 1 "const_imm10_operand")]
599   "ISA_HAS_MSA"
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;
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>")])
620 (define_expand "mov<mode>"
621   [(set (match_operand:MSA 0)
622         (match_operand:MSA 1))]
623   "ISA_HAS_MSA"
625   if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
626     DONE;
629 (define_expand "movmisalign<mode>"
630   [(set (match_operand:MSA 0)
631         (match_operand:MSA 1))]
632   "ISA_HAS_MSA"
634   if (mips_legitimize_move (<MODE>mode, operands[0], operands[1]))
635     DONE;
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>")])
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)]
655   mips_split_move_insn (operands[0], operands[1], curr_insn);
656   DONE;
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"
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;
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"
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;
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"
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));
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     }
710   [(set_attr "alu_type" "simd_add")
711    (set_attr "type" "simd_int_arith")
712    (set_attr "mode" "<MODE>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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"
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     }
842   [(set_attr "type" "simd_logic,simd_bit,simd_logic")
843    (set_attr "mode" "<MODE>")])
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")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
1197 (define_code_iterator ICC [eq le leu lt ltu])
1199 (define_code_attr icc
1200   [(eq  "eq")
1201    (le  "le_s")
1202    (leu "le_u")
1203    (lt  "lt_s")
1204    (ltu "lt_u")])
1206 (define_code_attr icci
1207   [(eq  "eqi")
1208    (le  "lei_s")
1209    (leu "lei_u")
1210    (lt  "lti_s")
1211    (ltu "lti_u")])
1213 (define_code_attr cmpi
1214   [(eq   "s")
1215    (le   "s")
1216    (leu  "u")
1217    (lt   "s")
1218    (ltu  "u")])
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>")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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>")])
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>")])
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>")])
1537 (define_code_iterator FCC [unordered ordered eq ne le lt uneq unle unlt])
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")])
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])
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")])
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>")])
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>")])
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>")])
1597 (define_mode_attr fint
1598   [(V4SF "v4si")
1599    (V2DF "v2di")])
1601 (define_mode_attr FQ
1602   [(V4SF "V8HI")
1603    (V2DF "V4SI")])
1605 (define_mode_attr FINTCNV
1606   [(V4SF "I2S")
1607    (V2DF "I2D")])
1609 (define_mode_attr FINTCNV_2
1610   [(V4SF "S2I")
1611    (V2DF "D2I")])
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>")])
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>")])
1632 (define_mode_attr FFQ
1633   [(V4SF "V8HI")
1634    (V2DF "V4SI")])
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>")])
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>")])
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"
1662   if (which_alternative == 1)
1663     return "ldi.<msafmt>\t%w0,0";
1665   if (!TARGET_64BIT && (<MODE>mode == V2DImode || <MODE>mode == V2DFmode))
1666     return "#";
1667   else
1668     return "fill.<msafmt>\t%w0,%z1";
1670   [(set_attr "type" "simd_fill")
1671    (set_attr "mode" "<MODE>")])
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)]
1680   mips_split_msa_fill_d (operands[0], operands[1]);
1681   DONE;
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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>")])
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>")])
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>")])
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"
2481   HOST_WIDE_INT val = 0;
2482   unsigned int i;
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);
2488   operands[2] = GEN_INT (val);
2489   return "shf.<msafmt>\t%w0,%w1,%X2";
2491   [(set_attr "type" "simd_shf")
2492    (set_attr "mode" "<MODE>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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>")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
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")])
2704 (define_code_attr msabr
2705   [(eq "bz")
2706    (ne "bnz")])
2708 (define_code_attr msabr_neg
2709   [(eq "bnz")
2710    (ne "bz")])
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"
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"));
2728  [(set_attr "type" "simd_branch")
2729   (set_attr "mode" "<MODE>")
2730   (set_attr "compact_form" "never")])
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"
2742   return mips_output_conditional_branch (insn, operands,
2743                                          MIPS_BRANCH ("<msabr>.v", "%w1,%0"),
2744                                          MIPS_BRANCH ("<msabr_neg>.v",
2745                                                       "%w1,%0"));
2747  [(set_attr "type" "simd_branch")
2748   (set_attr "mode" "TI")
2749   (set_attr "compact_form" "never")])