1;; Arm M-profile Vector Extension Machine Description
2;; Copyright (C) 2019-2022 Free Software Foundation, Inc.
3;;
4;; This file is part of GCC.
5;;
6;; GCC is free software; you can redistribute it and/or modify it
7;; under the terms of the GNU General Public License as published by
8;; the Free Software Foundation; either version 3, or (at your option)
9;; any later version.
10;;
11;; GCC is distributed in the hope that it will be useful, but
12;; WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14;; General Public License for more details.
15;;
16;; You should have received a copy of the GNU General Public License
17;; along with GCC; see the file COPYING3.  If not see
18;; <http://www.gnu.org/licenses/>.
19
20(define_insn "*mve_mov<mode>"
21  [(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w,w,r,w,Ux,w")
22          (match_operand:MVE_types 1 "general_operand" "w,r,w,Dn,UxUi,r,Dm,w,Ul"))]
23  "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
24{
25  if (which_alternative == 3 || which_alternative == 6)
26    {
27      int width, is_valid;
28      static char templ[40];
29
30      is_valid = simd_immediate_valid_for_move (operands[1], <MODE>mode,
31          &operands[1], &width);
32
33      gcc_assert (is_valid != 0);
34
35      if (width == 0)
36          return "vmov.f32\t%q0, %1  @ <mode>";
37      else
38          sprintf (templ, "vmov.i%d\t%%q0, %%x1  @ <mode>", width);
39      return templ;
40    }
41
42  if (which_alternative == 4 || which_alternative == 7)
43    {
44      if (<MODE>mode == V2DFmode || <MODE>mode == V2DImode || <MODE>mode == TImode)
45          {
46            if (which_alternative == 7)
47              output_asm_insn ("vstrw.32\t%q1, %E0", operands);
48            else
49              output_asm_insn ("vldrw.u32\t%q0, %E1",operands);
50          }
51      else
52          {
53            if (which_alternative == 7)
54              output_asm_insn ("vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0", operands);
55            else
56              output_asm_insn ("vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1", operands);
57          }
58      return "";
59    }
60  switch (which_alternative)
61    {
62    case 0:
63      return "vmov\t%q0, %q1";
64    case 1:
65      return "vmov\t%e0, %Q1, %R1  @ <mode>\;vmov\t%f0, %J1, %K1";
66    case 2:
67      return "vmov\t%Q0, %R0, %e1  @ <mode>\;vmov\t%J0, %K0, %f1";
68    case 5:
69      return output_move_quad (operands);
70    case 8:
71          return output_move_neon (operands);
72    default:
73      gcc_unreachable ();
74      return "";
75    }
76}
77  [(set_attr "type" "mve_move,mve_move,mve_move,mve_move,mve_load,multiple,mve_move,mve_store,mve_load")
78   (set_attr "length" "4,8,8,4,8,8,4,4,4")
79   (set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*,*")
80   (set_attr "neg_pool_range" "*,*,*,*,996,*,*,*,*")])
81
82(define_insn "*mve_vdup<mode>"
83  [(set (match_operand:MVE_vecs 0 "s_register_operand" "=w")
84          (vec_duplicate:MVE_vecs
85            (match_operand:<V_elem> 1 "s_register_operand" "r")))]
86  "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
87  "vdup.<V_sz_elem>\t%q0, %1"
88  [(set_attr "length" "4")
89   (set_attr "type" "mve_move")])
90
91;;
92;; [vst4q])
93;;
94(define_insn "mve_vst4q<mode>"
95  [(set (match_operand:XI 0 "mve_struct_operand" "=Ug")
96          (unspec:XI [(match_operand:XI 1 "s_register_operand" "w")
97                        (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
98           VST4Q))
99  ]
100  "TARGET_HAVE_MVE"
101{
102   rtx ops[6];
103   int regno = REGNO (operands[1]);
104   ops[0] = gen_rtx_REG (TImode, regno);
105   ops[1] = gen_rtx_REG (TImode, regno+4);
106   ops[2] = gen_rtx_REG (TImode, regno+8);
107   ops[3] = gen_rtx_REG (TImode, regno+12);
108   rtx reg  = operands[0];
109   while (reg && !REG_P (reg))
110    reg = XEXP (reg, 0);
111   gcc_assert (REG_P (reg));
112   ops[4] = reg;
113   ops[5] = operands[0];
114   /* Here in first three instructions data is stored to ops[4]'s location but
115      in the fourth instruction data is stored to operands[0], this is to
116      support the writeback.  */
117   output_asm_insn ("vst40.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
118                        "vst41.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
119                        "vst42.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
120                        "vst43.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, %5", ops);
121   return "";
122}
123  [(set_attr "length" "16")])
124
125;;
126;; [vrndq_m_f])
127;;
128(define_insn "mve_vrndq_m_f<mode>"
129  [
130   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
131          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
132                           (match_operand:MVE_0 2 "s_register_operand" "w")
133                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
134           VRNDQ_M_F))
135  ]
136  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
137  "vpst\;vrintzt.f%#<V_sz_elem>\t%q0, %q2"
138  [(set_attr "type" "mve_move")
139   (set_attr "length""8")])
140
141;;
142;; [vrndxq_f])
143;;
144(define_insn "mve_vrndxq_f<mode>"
145  [
146   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
147          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
148           VRNDXQ_F))
149  ]
150  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
151  "vrintx.f%#<V_sz_elem>      %q0, %q1"
152  [(set_attr "type" "mve_move")
153])
154
155;;
156;; [vrndq_f])
157;;
158(define_insn "mve_vrndq_f<mode>"
159  [
160   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
161          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
162           VRNDQ_F))
163  ]
164  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
165  "vrintz.f%#<V_sz_elem>      %q0, %q1"
166  [(set_attr "type" "mve_move")
167])
168
169;;
170;; [vrndpq_f])
171;;
172(define_insn "mve_vrndpq_f<mode>"
173  [
174   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
175          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
176           VRNDPQ_F))
177  ]
178  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
179  "vrintp.f%#<V_sz_elem>      %q0, %q1"
180  [(set_attr "type" "mve_move")
181])
182
183;;
184;; [vrndnq_f])
185;;
186(define_insn "mve_vrndnq_f<mode>"
187  [
188   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
189          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
190           VRNDNQ_F))
191  ]
192  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
193  "vrintn.f%#<V_sz_elem>      %q0, %q1"
194  [(set_attr "type" "mve_move")
195])
196
197;;
198;; [vrndmq_f])
199;;
200(define_insn "mve_vrndmq_f<mode>"
201  [
202   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
203          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
204           VRNDMQ_F))
205  ]
206  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
207  "vrintm.f%#<V_sz_elem>      %q0, %q1"
208  [(set_attr "type" "mve_move")
209])
210
211;;
212;; [vrndaq_f])
213;;
214(define_insn "mve_vrndaq_f<mode>"
215  [
216   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
217          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
218           VRNDAQ_F))
219  ]
220  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
221  "vrinta.f%#<V_sz_elem>      %q0, %q1"
222  [(set_attr "type" "mve_move")
223])
224
225;;
226;; [vrev64q_f])
227;;
228(define_insn "mve_vrev64q_f<mode>"
229  [
230   (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
231          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
232           VREV64Q_F))
233  ]
234  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
235  "vrev64.%#<V_sz_elem>\t%q0, %q1"
236  [(set_attr "type" "mve_move")
237])
238
239;;
240;; [vnegq_f])
241;;
242(define_insn "mve_vnegq_f<mode>"
243  [
244   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
245          (neg:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")))
246  ]
247  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
248  "vneg.f%#<V_sz_elem>\t%q0, %q1"
249  [(set_attr "type" "mve_move")
250])
251
252;;
253;; [vdupq_n_f])
254;;
255(define_insn "mve_vdupq_n_f<mode>"
256  [
257   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
258          (unspec:MVE_0 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
259           VDUPQ_N_F))
260  ]
261  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
262  "vdup.%#<V_sz_elem>\t%q0, %1"
263  [(set_attr "type" "mve_move")
264])
265
266;;
267;; [vabsq_f])
268;;
269(define_insn "mve_vabsq_f<mode>"
270  [
271   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
272          (abs:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")))
273  ]
274  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
275  "vabs.f%#<V_sz_elem>\t%q0, %q1"
276  [(set_attr "type" "mve_move")
277])
278
279;;
280;; [vrev32q_f])
281;;
282(define_insn "mve_vrev32q_fv8hf"
283  [
284   (set (match_operand:V8HF 0 "s_register_operand" "=w")
285          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "w")]
286           VREV32Q_F))
287  ]
288  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
289  "vrev32.16\t%q0, %q1"
290  [(set_attr "type" "mve_move")
291])
292;;
293;; [vcvttq_f32_f16])
294;;
295(define_insn "mve_vcvttq_f32_f16v4sf"
296  [
297   (set (match_operand:V4SF 0 "s_register_operand" "=w")
298          (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
299           VCVTTQ_F32_F16))
300  ]
301  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
302  "vcvtt.f32.f16\t%q0, %q1"
303  [(set_attr "type" "mve_move")
304])
305
306;;
307;; [vcvtbq_f32_f16])
308;;
309(define_insn "mve_vcvtbq_f32_f16v4sf"
310  [
311   (set (match_operand:V4SF 0 "s_register_operand" "=w")
312          (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
313           VCVTBQ_F32_F16))
314  ]
315  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
316  "vcvtb.f32.f16\t%q0, %q1"
317  [(set_attr "type" "mve_move")
318])
319
320;;
321;; [vcvtq_to_f_s, vcvtq_to_f_u])
322;;
323(define_insn "mve_vcvtq_to_f_<supf><mode>"
324  [
325   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
326          (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
327           VCVTQ_TO_F))
328  ]
329  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
330  "vcvt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q1"
331  [(set_attr "type" "mve_move")
332])
333
334;;
335;; [vrev64q_u, vrev64q_s])
336;;
337(define_insn "mve_vrev64q_<supf><mode>"
338  [
339   (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
340          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
341           VREV64Q))
342  ]
343  "TARGET_HAVE_MVE"
344  "vrev64.%#<V_sz_elem>\t%q0, %q1"
345  [(set_attr "type" "mve_move")
346])
347
348;;
349;; [vcvtq_from_f_s, vcvtq_from_f_u])
350;;
351(define_insn "mve_vcvtq_from_f_<supf><mode>"
352  [
353   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
354          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
355           VCVTQ_FROM_F))
356  ]
357  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
358  "vcvt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
359  [(set_attr "type" "mve_move")
360])
361;; [vqnegq_s])
362;;
363(define_insn "mve_vqnegq_s<mode>"
364  [
365   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
366          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
367           VQNEGQ_S))
368  ]
369  "TARGET_HAVE_MVE"
370  "vqneg.s%#<V_sz_elem>\t%q0, %q1"
371  [(set_attr "type" "mve_move")
372])
373
374;;
375;; [vqabsq_s])
376;;
377(define_insn "mve_vqabsq_s<mode>"
378  [
379   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
380          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
381           VQABSQ_S))
382  ]
383  "TARGET_HAVE_MVE"
384  "vqabs.s%#<V_sz_elem>\t%q0, %q1"
385  [(set_attr "type" "mve_move")
386])
387
388;;
389;; [vnegq_s])
390;;
391(define_insn "mve_vnegq_s<mode>"
392  [
393   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
394          (neg:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
395  ]
396  "TARGET_HAVE_MVE"
397  "vneg.s%#<V_sz_elem>\t%q0, %q1"
398  [(set_attr "type" "mve_move")
399])
400
401;;
402;; [vmvnq_u, vmvnq_s])
403;;
404(define_insn "mve_vmvnq_u<mode>"
405  [
406   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
407          (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
408  ]
409  "TARGET_HAVE_MVE"
410  "vmvn\t%q0, %q1"
411  [(set_attr "type" "mve_move")
412])
413(define_expand "mve_vmvnq_s<mode>"
414  [
415   (set (match_operand:MVE_2 0 "s_register_operand")
416          (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
417  ]
418  "TARGET_HAVE_MVE"
419)
420
421;;
422;; [vdupq_n_u, vdupq_n_s])
423;;
424(define_insn "mve_vdupq_n_<supf><mode>"
425  [
426   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
427          (unspec:MVE_2 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
428           VDUPQ_N))
429  ]
430  "TARGET_HAVE_MVE"
431  "vdup.%#<V_sz_elem>\t%q0, %1"
432  [(set_attr "type" "mve_move")
433])
434
435;;
436;; [vclzq_u, vclzq_s])
437;;
438(define_insn "@mve_vclzq_s<mode>"
439  [
440   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
441          (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
442  ]
443  "TARGET_HAVE_MVE"
444  "vclz.i%#<V_sz_elem>\t%q0, %q1"
445  [(set_attr "type" "mve_move")
446])
447(define_expand "mve_vclzq_u<mode>"
448  [
449   (set (match_operand:MVE_2 0 "s_register_operand")
450          (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
451  ]
452  "TARGET_HAVE_MVE"
453)
454
455;;
456;; [vclsq_s])
457;;
458(define_insn "mve_vclsq_s<mode>"
459  [
460   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
461          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
462           VCLSQ_S))
463  ]
464  "TARGET_HAVE_MVE"
465  "vcls.s%#<V_sz_elem>\t%q0, %q1"
466  [(set_attr "type" "mve_move")
467])
468
469;;
470;; [vaddvq_s, vaddvq_u])
471;;
472(define_insn "@mve_vaddvq_<supf><mode>"
473  [
474   (set (match_operand:SI 0 "s_register_operand" "=Te")
475          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")]
476           VADDVQ))
477  ]
478  "TARGET_HAVE_MVE"
479  "vaddv.<supf>%#<V_sz_elem>\t%0, %q1"
480  [(set_attr "type" "mve_move")
481])
482
483;;
484;; [vabsq_s])
485;;
486(define_insn "mve_vabsq_s<mode>"
487  [
488   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
489          (abs:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
490  ]
491  "TARGET_HAVE_MVE"
492  "vabs.s%#<V_sz_elem>\t%q0, %q1"
493  [(set_attr "type" "mve_move")
494])
495
496;;
497;; [vrev32q_u, vrev32q_s])
498;;
499(define_insn "mve_vrev32q_<supf><mode>"
500  [
501   (set (match_operand:MVE_3 0 "s_register_operand" "=w")
502          (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "w")]
503           VREV32Q))
504  ]
505  "TARGET_HAVE_MVE"
506  "vrev32.%#<V_sz_elem>\t%q0, %q1"
507  [(set_attr "type" "mve_move")
508])
509
510;;
511;; [vmovltq_u, vmovltq_s])
512;;
513(define_insn "mve_vmovltq_<supf><mode>"
514  [
515   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
516          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")]
517           VMOVLTQ))
518  ]
519  "TARGET_HAVE_MVE"
520  "vmovlt.<supf>%#<V_sz_elem>\t%q0, %q1"
521  [(set_attr "type" "mve_move")
522])
523
524;;
525;; [vmovlbq_s, vmovlbq_u])
526;;
527(define_insn "mve_vmovlbq_<supf><mode>"
528  [
529   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
530          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")]
531           VMOVLBQ))
532  ]
533  "TARGET_HAVE_MVE"
534  "vmovlb.<supf>%#<V_sz_elem>\t%q0, %q1"
535  [(set_attr "type" "mve_move")
536])
537
538;;
539;; [vcvtpq_s, vcvtpq_u])
540;;
541(define_insn "mve_vcvtpq_<supf><mode>"
542  [
543   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
544          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
545           VCVTPQ))
546  ]
547  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
548  "vcvtp.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
549  [(set_attr "type" "mve_move")
550])
551
552;;
553;; [vcvtnq_s, vcvtnq_u])
554;;
555(define_insn "mve_vcvtnq_<supf><mode>"
556  [
557   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
558          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
559           VCVTNQ))
560  ]
561  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
562  "vcvtn.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
563  [(set_attr "type" "mve_move")
564])
565
566;;
567;; [vcvtmq_s, vcvtmq_u])
568;;
569(define_insn "mve_vcvtmq_<supf><mode>"
570  [
571   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
572          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
573           VCVTMQ))
574  ]
575  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
576  "vcvtm.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
577  [(set_attr "type" "mve_move")
578])
579
580;;
581;; [vcvtaq_u, vcvtaq_s])
582;;
583(define_insn "mve_vcvtaq_<supf><mode>"
584  [
585   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
586          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
587           VCVTAQ))
588  ]
589  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
590  "vcvta.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
591  [(set_attr "type" "mve_move")
592])
593
594;;
595;; [vmvnq_n_u, vmvnq_n_s])
596;;
597(define_insn "mve_vmvnq_n_<supf><mode>"
598  [
599   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
600          (unspec:MVE_5 [(match_operand:<V_elem> 1 "immediate_operand" "i")]
601           VMVNQ_N))
602  ]
603  "TARGET_HAVE_MVE"
604  "vmvn.i%#<V_sz_elem>\t%q0, %1"
605  [(set_attr "type" "mve_move")
606])
607
608;;
609;; [vrev16q_u, vrev16q_s])
610;;
611(define_insn "mve_vrev16q_<supf>v16qi"
612  [
613   (set (match_operand:V16QI 0 "s_register_operand" "=w")
614          (unspec:V16QI [(match_operand:V16QI 1 "s_register_operand" "w")]
615           VREV16Q))
616  ]
617  "TARGET_HAVE_MVE"
618  "vrev16.8\t%q0, %q1"
619  [(set_attr "type" "mve_move")
620])
621
622;;
623;; [vaddlvq_s vaddlvq_u])
624;;
625(define_insn "mve_vaddlvq_<supf>v4si"
626  [
627   (set (match_operand:DI 0 "s_register_operand" "=r")
628          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")]
629           VADDLVQ))
630  ]
631  "TARGET_HAVE_MVE"
632  "vaddlv.<supf>32\t%Q0, %R0, %q1"
633  [(set_attr "type" "mve_move")
634])
635
636;;
637;; [vctp8q vctp16q vctp32q vctp64q])
638;;
639(define_insn "mve_vctp<mode1>qhi"
640  [
641   (set (match_operand:HI 0 "vpr_register_operand" "=Up")
642          (unspec:HI [(match_operand:SI 1 "s_register_operand" "r")]
643          VCTPQ))
644  ]
645  "TARGET_HAVE_MVE"
646  "vctp.<mode1>\t%1"
647  [(set_attr "type" "mve_move")
648])
649
650;;
651;; [vpnot])
652;;
653(define_insn "mve_vpnothi"
654  [
655   (set (match_operand:HI 0 "vpr_register_operand" "=Up")
656          (unspec:HI [(match_operand:HI 1 "vpr_register_operand" "0")]
657           VPNOT))
658  ]
659  "TARGET_HAVE_MVE"
660  "vpnot"
661  [(set_attr "type" "mve_move")
662])
663
664;;
665;; [vsubq_n_f])
666;;
667(define_insn "mve_vsubq_n_f<mode>"
668  [
669   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
670          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
671                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
672           VSUBQ_N_F))
673  ]
674  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
675  "vsub.f<V_sz_elem>\t%q0, %q1, %2"
676  [(set_attr "type" "mve_move")
677])
678
679;;
680;; [vbrsrq_n_f])
681;;
682(define_insn "mve_vbrsrq_n_f<mode>"
683  [
684   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
685          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
686                           (match_operand:SI 2 "s_register_operand" "r")]
687           VBRSRQ_N_F))
688  ]
689  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
690  "vbrsr.<V_sz_elem>\t%q0, %q1, %2"
691  [(set_attr "type" "mve_move")
692])
693
694;;
695;; [vcvtq_n_to_f_s, vcvtq_n_to_f_u])
696;;
697(define_insn "mve_vcvtq_n_to_f_<supf><mode>"
698  [
699   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
700          (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
701                           (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
702           VCVTQ_N_TO_F))
703  ]
704  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
705  "vcvt.f<V_sz_elem>.<supf><V_sz_elem>\t%q0, %q1, %2"
706  [(set_attr "type" "mve_move")
707])
708
709;; [vcreateq_f])
710;;
711(define_insn "mve_vcreateq_f<mode>"
712  [
713   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
714          (unspec:MVE_0 [(match_operand:DI 1 "s_register_operand" "r")
715                           (match_operand:DI 2 "s_register_operand" "r")]
716           VCREATEQ_F))
717  ]
718  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
719  "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
720  [(set_attr "type" "mve_move")
721   (set_attr "length""8")])
722
723;;
724;; [vcreateq_u, vcreateq_s])
725;;
726(define_insn "mve_vcreateq_<supf><mode>"
727  [
728   (set (match_operand:MVE_1 0 "s_register_operand" "=w")
729          (unspec:MVE_1 [(match_operand:DI 1 "s_register_operand" "r")
730                           (match_operand:DI 2 "s_register_operand" "r")]
731           VCREATEQ))
732  ]
733  "TARGET_HAVE_MVE"
734  "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
735  [(set_attr "type" "mve_move")
736   (set_attr "length""8")])
737
738;;
739;; [vshrq_n_s, vshrq_n_u])
740;;
741;; Version that takes an immediate as operand 2.
742(define_insn "mve_vshrq_n_<supf><mode>"
743  [
744   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
745          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
746                           (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
747           VSHRQ_N))
748  ]
749  "TARGET_HAVE_MVE"
750  "vshr.<supf><V_sz_elem>\t%q0, %q1, %2"
751  [(set_attr "type" "mve_move")
752])
753
754;; Versions that take constant vectors as operand 2 (with all elements
755;; equal).
756(define_insn "mve_vshrq_n_s<mode>_imm"
757  [
758   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
759          (ashiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
760                              (match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
761  ]
762  "TARGET_HAVE_MVE"
763  {
764    return neon_output_shift_immediate ("vshr", 's', &operands[2],
765                                                  <MODE>mode,
766                                                  VALID_NEON_QREG_MODE (<MODE>mode),
767                                                  true);
768  }
769  [(set_attr "type" "mve_move")
770])
771(define_insn "mve_vshrq_n_u<mode>_imm"
772  [
773   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
774          (lshiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
775                              (match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
776  ]
777  "TARGET_HAVE_MVE"
778  {
779    return neon_output_shift_immediate ("vshr", 'u', &operands[2],
780                                                  <MODE>mode,
781                                                  VALID_NEON_QREG_MODE (<MODE>mode),
782                                                  true);
783  }
784  [(set_attr "type" "mve_move")
785])
786
787;;
788;; [vcvtq_n_from_f_s, vcvtq_n_from_f_u])
789;;
790(define_insn "mve_vcvtq_n_from_f_<supf><mode>"
791  [
792   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
793          (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
794                           (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
795           VCVTQ_N_FROM_F))
796  ]
797  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
798  "vcvt.<supf><V_sz_elem>.f<V_sz_elem>\t%q0, %q1, %2"
799  [(set_attr "type" "mve_move")
800])
801
802;;
803;; [vaddlvq_p_s])
804;;
805(define_insn "mve_vaddlvq_p_<supf>v4si"
806  [
807   (set (match_operand:DI 0 "s_register_operand" "=r")
808          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
809                        (match_operand:V4BI 2 "vpr_register_operand" "Up")]
810           VADDLVQ_P))
811  ]
812  "TARGET_HAVE_MVE"
813  "vpst\;vaddlvt.<supf>32\t%Q0, %R0, %q1"
814  [(set_attr "type" "mve_move")
815   (set_attr "length""8")])
816
817;;
818;; [vcmpneq_, vcmpcsq_, vcmpeqq_, vcmpgeq_, vcmpgtq_, vcmphiq_, vcmpleq_, vcmpltq_])
819;;
820(define_insn "@mve_vcmp<mve_cmp_op>q_<mode>"
821  [
822   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
823          (MVE_COMPARISONS:<MVE_VPRED> (match_operand:MVE_2 1 "s_register_operand" "w")
824                        (match_operand:MVE_2 2 "s_register_operand" "w")))
825  ]
826  "TARGET_HAVE_MVE"
827  "vcmp.<mve_cmp_type>%#<V_sz_elem>\t<mve_cmp_op>, %q1, %q2"
828  [(set_attr "type" "mve_move")
829])
830
831;;
832;; [vcmpcsq_n_, vcmpeqq_n_, vcmpgeq_n_, vcmpgtq_n_, vcmphiq_n_, vcmpleq_n_, vcmpltq_n_, vcmpneq_n_])
833;;
834(define_insn "mve_vcmp<mve_cmp_op>q_n_<mode>"
835  [
836   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
837          (MVE_COMPARISONS:<MVE_VPRED>
838           (match_operand:MVE_2 1 "s_register_operand" "w")
839           (vec_duplicate:MVE_2 (match_operand:<V_elem> 2 "s_register_operand" "r"))))
840  ]
841  "TARGET_HAVE_MVE"
842  "vcmp.<mve_cmp_type>%#<V_sz_elem>     <mve_cmp_op>, %q1, %2"
843  [(set_attr "type" "mve_move")
844])
845
846;;
847;; [vshlq_s, vshlq_u])
848;; See vec-common.md
849
850;;
851;; [vabdq_s, vabdq_u])
852;;
853(define_insn "mve_vabdq_<supf><mode>"
854  [
855   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
856          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
857                           (match_operand:MVE_2 2 "s_register_operand" "w")]
858           VABDQ))
859  ]
860  "TARGET_HAVE_MVE"
861  "vabd.<supf>%#<V_sz_elem>   %q0, %q1, %q2"
862  [(set_attr "type" "mve_move")
863])
864
865;;
866;; [vaddq_n_s, vaddq_n_u])
867;;
868(define_insn "mve_vaddq_n_<supf><mode>"
869  [
870   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
871          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
872                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
873           VADDQ_N))
874  ]
875  "TARGET_HAVE_MVE"
876  "vadd.i%#<V_sz_elem>\t%q0, %q1, %2"
877  [(set_attr "type" "mve_move")
878])
879
880;;
881;; [vaddvaq_s, vaddvaq_u])
882;;
883(define_insn "mve_vaddvaq_<supf><mode>"
884  [
885   (set (match_operand:SI 0 "s_register_operand" "=Te")
886          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
887                        (match_operand:MVE_2 2 "s_register_operand" "w")]
888           VADDVAQ))
889  ]
890  "TARGET_HAVE_MVE"
891  "vaddva.<supf>%#<V_sz_elem>\t%0, %q2"
892  [(set_attr "type" "mve_move")
893])
894
895;;
896;; [vaddvq_p_u, vaddvq_p_s])
897;;
898(define_insn "mve_vaddvq_p_<supf><mode>"
899  [
900   (set (match_operand:SI 0 "s_register_operand" "=Te")
901          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
902                        (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
903           VADDVQ_P))
904  ]
905  "TARGET_HAVE_MVE"
906  "vpst\;vaddvt.<supf>%#<V_sz_elem>     %0, %q1"
907  [(set_attr "type" "mve_move")
908   (set_attr "length""8")])
909
910;;
911;; [vandq_u, vandq_s])
912;;
913;; signed and unsigned versions are the same: define the unsigned
914;; insn, and use an expander for the signed one as we still reference
915;; both names from arm_mve.h.
916;; We use the same code as in neon.md (TODO: avoid this duplication).
917(define_insn "mve_vandq_u<mode>"
918  [
919   (set (match_operand:MVE_2 0 "s_register_operand" "=w,w")
920          (and:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w,0")
921                       (match_operand:MVE_2 2 "neon_inv_logic_op2" "w,DL")))
922  ]
923  "TARGET_HAVE_MVE"
924  "@
925   vand\t%q0, %q1, %q2
926   * return neon_output_logic_immediate (\"vand\", &operands[2], <MODE>mode, 1, VALID_NEON_QREG_MODE (<MODE>mode));"
927  [(set_attr "type" "mve_move")
928])
929(define_expand "mve_vandq_s<mode>"
930  [
931   (set (match_operand:MVE_2 0 "s_register_operand")
932          (and:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
933                       (match_operand:MVE_2 2 "neon_inv_logic_op2")))
934  ]
935  "TARGET_HAVE_MVE"
936)
937
938;;
939;; [vbicq_s, vbicq_u])
940;;
941(define_insn "mve_vbicq_u<mode>"
942  [
943   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
944          (and:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand" "w"))
945                                    (match_operand:MVE_2 1 "s_register_operand" "w")))
946  ]
947  "TARGET_HAVE_MVE"
948  "vbic\t%q0, %q1, %q2"
949  [(set_attr "type" "mve_move")
950])
951
952(define_expand "mve_vbicq_s<mode>"
953  [
954   (set (match_operand:MVE_2 0 "s_register_operand")
955          (and:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand"))
956                       (match_operand:MVE_2 1 "s_register_operand")))
957  ]
958  "TARGET_HAVE_MVE"
959)
960
961;;
962;; [vbrsrq_n_u, vbrsrq_n_s])
963;;
964(define_insn "mve_vbrsrq_n_<supf><mode>"
965  [
966   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
967          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
968                           (match_operand:SI 2 "s_register_operand" "r")]
969           VBRSRQ_N))
970  ]
971  "TARGET_HAVE_MVE"
972  "vbrsr.%#<V_sz_elem>\t%q0, %q1, %2"
973  [(set_attr "type" "mve_move")
974])
975
976;;
977;; [vcaddq, vcaddq_rot90, vcadd_rot180, vcadd_rot270])
978;;
979(define_insn "mve_vcaddq<mve_rot><mode>"
980  [
981   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
982          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
983                           (match_operand:MVE_2 2 "s_register_operand" "w")]
984           VCADD))
985  ]
986  "TARGET_HAVE_MVE"
987  "vcadd.i%#<V_sz_elem>       %q0, %q1, %q2, #<rot>"
988  [(set_attr "type" "mve_move")
989])
990
991;; Auto vectorizer pattern for int vcadd
992(define_expand "cadd<rot><mode>3"
993  [(set (match_operand:MVE_2 0 "register_operand")
994          (unspec:MVE_2 [(match_operand:MVE_2 1 "register_operand")
995                           (match_operand:MVE_2 2 "register_operand")]
996            VCADD))]
997  "TARGET_HAVE_MVE && !BYTES_BIG_ENDIAN"
998)
999
1000;;
1001;; [veorq_u, veorq_s])
1002;;
1003(define_insn "mve_veorq_u<mode>"
1004  [
1005   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1006          (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1007                       (match_operand:MVE_2 2 "s_register_operand" "w")))
1008  ]
1009  "TARGET_HAVE_MVE"
1010  "veor\t%q0, %q1, %q2"
1011  [(set_attr "type" "mve_move")
1012])
1013(define_expand "mve_veorq_s<mode>"
1014  [
1015   (set (match_operand:MVE_2 0 "s_register_operand")
1016          (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
1017                       (match_operand:MVE_2 2 "s_register_operand")))
1018  ]
1019  "TARGET_HAVE_MVE"
1020)
1021
1022;;
1023;; [vhaddq_n_u, vhaddq_n_s])
1024;;
1025(define_insn "mve_vhaddq_n_<supf><mode>"
1026  [
1027   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1028          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1029                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1030           VHADDQ_N))
1031  ]
1032  "TARGET_HAVE_MVE"
1033  "vhadd.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1034  [(set_attr "type" "mve_move")
1035])
1036
1037;;
1038;; [vhaddq_s, vhaddq_u])
1039;;
1040(define_insn "@mve_vhaddq_<supf><mode>"
1041  [
1042   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1043          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1044                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1045           VHADDQ))
1046  ]
1047  "TARGET_HAVE_MVE"
1048  "vhadd.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1049  [(set_attr "type" "mve_move")
1050])
1051
1052;;
1053;; [vhcaddq_rot270_s])
1054;;
1055(define_insn "mve_vhcaddq_rot270_s<mode>"
1056  [
1057   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
1058          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1059                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1060           VHCADDQ_ROT270_S))
1061  ]
1062  "TARGET_HAVE_MVE"
1063  "vhcadd.s%#<V_sz_elem>\t%q0, %q1, %q2, #270"
1064  [(set_attr "type" "mve_move")
1065])
1066
1067;;
1068;; [vhcaddq_rot90_s])
1069;;
1070(define_insn "mve_vhcaddq_rot90_s<mode>"
1071  [
1072   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
1073          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1074                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1075           VHCADDQ_ROT90_S))
1076  ]
1077  "TARGET_HAVE_MVE"
1078  "vhcadd.s%#<V_sz_elem>\t%q0, %q1, %q2, #90"
1079  [(set_attr "type" "mve_move")
1080])
1081
1082;;
1083;; [vhsubq_n_u, vhsubq_n_s])
1084;;
1085(define_insn "mve_vhsubq_n_<supf><mode>"
1086  [
1087   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1088          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1089                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1090           VHSUBQ_N))
1091  ]
1092  "TARGET_HAVE_MVE"
1093  "vhsub.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1094  [(set_attr "type" "mve_move")
1095])
1096
1097;;
1098;; [vhsubq_s, vhsubq_u])
1099;;
1100(define_insn "mve_vhsubq_<supf><mode>"
1101  [
1102   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1103          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1104                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1105           VHSUBQ))
1106  ]
1107  "TARGET_HAVE_MVE"
1108  "vhsub.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1109  [(set_attr "type" "mve_move")
1110])
1111
1112;;
1113;; [vmaxaq_s])
1114;;
1115(define_insn "mve_vmaxaq_s<mode>"
1116  [
1117   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1118          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1119                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1120           VMAXAQ_S))
1121  ]
1122  "TARGET_HAVE_MVE"
1123  "vmaxa.s%#<V_sz_elem>       %q0, %q2"
1124  [(set_attr "type" "mve_move")
1125])
1126
1127;;
1128;; [vmaxavq_s])
1129;;
1130(define_insn "mve_vmaxavq_s<mode>"
1131  [
1132   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1133          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1134                                (match_operand:MVE_2 2 "s_register_operand" "w")]
1135           VMAXAVQ_S))
1136  ]
1137  "TARGET_HAVE_MVE"
1138  "vmaxav.s%#<V_sz_elem>\t%0, %q2"
1139  [(set_attr "type" "mve_move")
1140])
1141
1142;;
1143;; [vmaxq_u, vmaxq_s])
1144;;
1145(define_insn "mve_vmaxq_s<mode>"
1146  [
1147   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1148          (smax:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1149                        (match_operand:MVE_2 2 "s_register_operand" "w")))
1150  ]
1151  "TARGET_HAVE_MVE"
1152  "vmax.%#<V_s_elem>\t%q0, %q1, %q2"
1153  [(set_attr "type" "mve_move")
1154])
1155
1156(define_insn "mve_vmaxq_u<mode>"
1157  [
1158   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1159          (umax:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1160                        (match_operand:MVE_2 2 "s_register_operand" "w")))
1161  ]
1162  "TARGET_HAVE_MVE"
1163  "vmax.%#<V_u_elem>\t%q0, %q1, %q2"
1164  [(set_attr "type" "mve_move")
1165])
1166
1167;;
1168;; [vmaxvq_u, vmaxvq_s])
1169;;
1170(define_insn "mve_vmaxvq_<supf><mode>"
1171  [
1172   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1173          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1174                                (match_operand:MVE_2 2 "s_register_operand" "w")]
1175           VMAXVQ))
1176  ]
1177  "TARGET_HAVE_MVE"
1178  "vmaxv.<supf>%#<V_sz_elem>\t%0, %q2"
1179  [(set_attr "type" "mve_move")
1180])
1181
1182;;
1183;; [vminaq_s])
1184;;
1185(define_insn "mve_vminaq_s<mode>"
1186  [
1187   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1188          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1189                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1190           VMINAQ_S))
1191  ]
1192  "TARGET_HAVE_MVE"
1193  "vmina.s%#<V_sz_elem>\t%q0, %q2"
1194  [(set_attr "type" "mve_move")
1195])
1196
1197;;
1198;; [vminavq_s])
1199;;
1200(define_insn "mve_vminavq_s<mode>"
1201  [
1202   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1203          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1204                                (match_operand:MVE_2 2 "s_register_operand" "w")]
1205           VMINAVQ_S))
1206  ]
1207  "TARGET_HAVE_MVE"
1208  "vminav.s%#<V_sz_elem>\t%0, %q2"
1209  [(set_attr "type" "mve_move")
1210])
1211
1212;;
1213;; [vminq_s, vminq_u])
1214;;
1215(define_insn "mve_vminq_s<mode>"
1216  [
1217   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1218          (smin:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1219                        (match_operand:MVE_2 2 "s_register_operand" "w")))
1220  ]
1221  "TARGET_HAVE_MVE"
1222  "vmin.%#<V_s_elem>\t%q0, %q1, %q2"
1223  [(set_attr "type" "mve_move")
1224])
1225
1226(define_insn "mve_vminq_u<mode>"
1227  [
1228   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1229          (umin:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1230                        (match_operand:MVE_2 2 "s_register_operand" "w")))
1231  ]
1232  "TARGET_HAVE_MVE"
1233  "vmin.%#<V_u_elem>\t%q0, %q1, %q2"
1234  [(set_attr "type" "mve_move")
1235])
1236
1237;;
1238;; [vminvq_u, vminvq_s])
1239;;
1240(define_insn "mve_vminvq_<supf><mode>"
1241  [
1242   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1243          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1244                                (match_operand:MVE_2 2 "s_register_operand" "w")]
1245           VMINVQ))
1246  ]
1247  "TARGET_HAVE_MVE"
1248  "vminv.<supf>%#<V_sz_elem>\t%0, %q2"
1249  [(set_attr "type" "mve_move")
1250])
1251
1252;;
1253;; [vmladavq_u, vmladavq_s])
1254;;
1255(define_insn "mve_vmladavq_<supf><mode>"
1256  [
1257   (set (match_operand:SI 0 "s_register_operand" "=Te")
1258          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1259                        (match_operand:MVE_2 2 "s_register_operand" "w")]
1260           VMLADAVQ))
1261  ]
1262  "TARGET_HAVE_MVE"
1263  "vmladav.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
1264  [(set_attr "type" "mve_move")
1265])
1266
1267;;
1268;; [vmladavxq_s])
1269;;
1270(define_insn "mve_vmladavxq_s<mode>"
1271  [
1272   (set (match_operand:SI 0 "s_register_operand" "=Te")
1273          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1274                        (match_operand:MVE_2 2 "s_register_operand" "w")]
1275           VMLADAVXQ_S))
1276  ]
1277  "TARGET_HAVE_MVE"
1278  "vmladavx.s%#<V_sz_elem>\t%0, %q1, %q2"
1279  [(set_attr "type" "mve_move")
1280])
1281
1282;;
1283;; [vmlsdavq_s])
1284;;
1285(define_insn "mve_vmlsdavq_s<mode>"
1286  [
1287   (set (match_operand:SI 0 "s_register_operand" "=Te")
1288          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1289                        (match_operand:MVE_2 2 "s_register_operand" "w")]
1290           VMLSDAVQ_S))
1291  ]
1292  "TARGET_HAVE_MVE"
1293  "vmlsdav.s%#<V_sz_elem>\t%0, %q1, %q2"
1294  [(set_attr "type" "mve_move")
1295])
1296
1297;;
1298;; [vmlsdavxq_s])
1299;;
1300(define_insn "mve_vmlsdavxq_s<mode>"
1301  [
1302   (set (match_operand:SI 0 "s_register_operand" "=Te")
1303          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1304                        (match_operand:MVE_2 2 "s_register_operand" "w")]
1305           VMLSDAVXQ_S))
1306  ]
1307  "TARGET_HAVE_MVE"
1308  "vmlsdavx.s%#<V_sz_elem>\t%0, %q1, %q2"
1309  [(set_attr "type" "mve_move")
1310])
1311
1312;;
1313;; [vmulhq_s, vmulhq_u])
1314;;
1315(define_insn "mve_vmulhq_<supf><mode>"
1316  [
1317   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1318          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1319                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1320           VMULHQ))
1321  ]
1322  "TARGET_HAVE_MVE"
1323  "vmulh.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1324  [(set_attr "type" "mve_move")
1325])
1326
1327;;
1328;; [vmullbq_int_u, vmullbq_int_s])
1329;;
1330(define_insn "mve_vmullbq_int_<supf><mode>"
1331  [
1332   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1333          (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
1334                                          (match_operand:MVE_2 2 "s_register_operand" "w")]
1335           VMULLBQ_INT))
1336  ]
1337  "TARGET_HAVE_MVE"
1338  "vmullb.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1339  [(set_attr "type" "mve_move")
1340])
1341
1342;;
1343;; [vmulltq_int_u, vmulltq_int_s])
1344;;
1345(define_insn "mve_vmulltq_int_<supf><mode>"
1346  [
1347   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1348          (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
1349                                          (match_operand:MVE_2 2 "s_register_operand" "w")]
1350           VMULLTQ_INT))
1351  ]
1352  "TARGET_HAVE_MVE"
1353  "vmullt.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1354  [(set_attr "type" "mve_move")
1355])
1356
1357;;
1358;; [vmulq_n_u, vmulq_n_s])
1359;;
1360(define_insn "mve_vmulq_n_<supf><mode>"
1361  [
1362   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1363          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1364                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1365           VMULQ_N))
1366  ]
1367  "TARGET_HAVE_MVE"
1368  "vmul.i%#<V_sz_elem>\t%q0, %q1, %2"
1369  [(set_attr "type" "mve_move")
1370])
1371
1372;;
1373;; [vmulq_u, vmulq_s])
1374;;
1375(define_insn "mve_vmulq_<supf><mode>"
1376  [
1377   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1378          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1379                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1380           VMULQ))
1381  ]
1382  "TARGET_HAVE_MVE"
1383  "vmul.i%#<V_sz_elem>\t%q0, %q1, %q2"
1384  [(set_attr "type" "mve_move")
1385])
1386
1387(define_insn "mve_vmulq<mode>"
1388  [
1389   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1390          (mult:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1391                        (match_operand:MVE_2 2 "s_register_operand" "w")))
1392  ]
1393  "TARGET_HAVE_MVE"
1394  "vmul.i%#<V_sz_elem>\t%q0, %q1, %q2"
1395  [(set_attr "type" "mve_move")
1396])
1397
1398;;
1399;; [vornq_u, vornq_s])
1400;;
1401(define_insn "mve_vornq_s<mode>"
1402  [
1403   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1404          (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand" "w"))
1405                       (match_operand:MVE_2 1 "s_register_operand" "w")))
1406  ]
1407  "TARGET_HAVE_MVE"
1408   "vorn\t%q0, %q1, %q2"
1409  [(set_attr "type" "mve_move")
1410])
1411
1412(define_expand "mve_vornq_u<mode>"
1413  [
1414   (set (match_operand:MVE_2 0 "s_register_operand")
1415          (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand"))
1416                       (match_operand:MVE_2 1 "s_register_operand")))
1417  ]
1418  "TARGET_HAVE_MVE"
1419)
1420
1421;;
1422;; [vorrq_s, vorrq_u])
1423;;
1424;; signed and unsigned versions are the same: define the unsigned
1425;; insn, and use an expander for the signed one as we still reference
1426;; both names from arm_mve.h.
1427;; We use the same code as in neon.md (TODO: avoid this duplication).
1428(define_insn "mve_vorrq_s<mode>"
1429  [
1430   (set (match_operand:MVE_2 0 "s_register_operand" "=w,w")
1431          (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w,0")
1432                       (match_operand:MVE_2 2 "neon_logic_op2" "w,Dl")))
1433  ]
1434  "TARGET_HAVE_MVE"
1435  "@
1436   vorr\t%q0, %q1, %q2
1437   * return neon_output_logic_immediate (\"vorr\", &operands[2], <MODE>mode, 0, VALID_NEON_QREG_MODE (<MODE>mode));"
1438  [(set_attr "type" "mve_move")
1439])
1440(define_expand "mve_vorrq_u<mode>"
1441  [
1442   (set (match_operand:MVE_2 0 "s_register_operand")
1443          (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
1444                       (match_operand:MVE_2 2 "neon_logic_op2")))
1445  ]
1446  "TARGET_HAVE_MVE"
1447)
1448
1449;;
1450;; [vqaddq_n_s, vqaddq_n_u])
1451;;
1452(define_insn "mve_vqaddq_n_<supf><mode>"
1453  [
1454   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1455          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1456                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1457           VQADDQ_N))
1458  ]
1459  "TARGET_HAVE_MVE"
1460  "vqadd.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1461  [(set_attr "type" "mve_move")
1462])
1463
1464;;
1465;; [vqaddq_u, vqaddq_s])
1466;;
1467(define_insn "mve_vqaddq_<supf><mode>"
1468  [
1469   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1470          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1471                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1472           VQADDQ))
1473  ]
1474  "TARGET_HAVE_MVE"
1475  "vqadd.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1476  [(set_attr "type" "mve_move")
1477])
1478
1479;;
1480;; [vqdmulhq_n_s])
1481;;
1482(define_insn "mve_vqdmulhq_n_s<mode>"
1483  [
1484   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1485          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1486                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1487           VQDMULHQ_N_S))
1488  ]
1489  "TARGET_HAVE_MVE"
1490  "vqdmulh.s%#<V_sz_elem>\t%q0, %q1, %2"
1491  [(set_attr "type" "mve_move")
1492])
1493
1494;;
1495;; [vqdmulhq_s])
1496;;
1497(define_insn "mve_vqdmulhq_s<mode>"
1498  [
1499   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1500          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1501                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1502           VQDMULHQ_S))
1503  ]
1504  "TARGET_HAVE_MVE"
1505  "vqdmulh.s%#<V_sz_elem>\t%q0, %q1, %q2"
1506  [(set_attr "type" "mve_move")
1507])
1508
1509;;
1510;; [vqrdmulhq_n_s])
1511;;
1512(define_insn "mve_vqrdmulhq_n_s<mode>"
1513  [
1514   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1515          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1516                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1517           VQRDMULHQ_N_S))
1518  ]
1519  "TARGET_HAVE_MVE"
1520  "vqrdmulh.s%#<V_sz_elem>\t%q0, %q1, %2"
1521  [(set_attr "type" "mve_move")
1522])
1523
1524;;
1525;; [vqrdmulhq_s])
1526;;
1527(define_insn "mve_vqrdmulhq_s<mode>"
1528  [
1529   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1530          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1531                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1532           VQRDMULHQ_S))
1533  ]
1534  "TARGET_HAVE_MVE"
1535  "vqrdmulh.s%#<V_sz_elem>\t%q0, %q1, %q2"
1536  [(set_attr "type" "mve_move")
1537])
1538
1539;;
1540;; [vqrshlq_n_s, vqrshlq_n_u])
1541;;
1542(define_insn "mve_vqrshlq_n_<supf><mode>"
1543  [
1544   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1545          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1546                           (match_operand:SI 2 "s_register_operand" "r")]
1547           VQRSHLQ_N))
1548  ]
1549  "TARGET_HAVE_MVE"
1550  "vqrshl.<supf>%#<V_sz_elem>\t%q0, %2"
1551  [(set_attr "type" "mve_move")
1552])
1553
1554;;
1555;; [vqrshlq_s, vqrshlq_u])
1556;;
1557(define_insn "mve_vqrshlq_<supf><mode>"
1558  [
1559   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1560          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1561                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1562           VQRSHLQ))
1563  ]
1564  "TARGET_HAVE_MVE"
1565  "vqrshl.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1566  [(set_attr "type" "mve_move")
1567])
1568
1569;;
1570;; [vqshlq_n_s, vqshlq_n_u])
1571;;
1572(define_insn "mve_vqshlq_n_<supf><mode>"
1573  [
1574   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1575          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1576                           (match_operand:SI 2 "immediate_operand" "i")]
1577           VQSHLQ_N))
1578  ]
1579  "TARGET_HAVE_MVE"
1580  "vqshl.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1581  [(set_attr "type" "mve_move")
1582])
1583
1584;;
1585;; [vqshlq_r_u, vqshlq_r_s])
1586;;
1587(define_insn "mve_vqshlq_r_<supf><mode>"
1588  [
1589   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1590          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1591                           (match_operand:SI 2 "s_register_operand" "r")]
1592           VQSHLQ_R))
1593  ]
1594  "TARGET_HAVE_MVE"
1595  "vqshl.<supf>%#<V_sz_elem>\t%q0, %2"
1596  [(set_attr "type" "mve_move")
1597])
1598
1599;;
1600;; [vqshlq_s, vqshlq_u])
1601;;
1602(define_insn "mve_vqshlq_<supf><mode>"
1603  [
1604   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1605          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1606                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1607           VQSHLQ))
1608  ]
1609  "TARGET_HAVE_MVE"
1610  "vqshl.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1611  [(set_attr "type" "mve_move")
1612])
1613
1614;;
1615;; [vqshluq_n_s])
1616;;
1617(define_insn "mve_vqshluq_n_s<mode>"
1618  [
1619   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1620          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1621                           (match_operand:SI 2 "<MVE_pred>" "<MVE_constraint>")]
1622           VQSHLUQ_N_S))
1623  ]
1624  "TARGET_HAVE_MVE"
1625  "vqshlu.s%#<V_sz_elem>\t%q0, %q1, %2"
1626  [(set_attr "type" "mve_move")
1627])
1628
1629;;
1630;; [vqsubq_n_s, vqsubq_n_u])
1631;;
1632(define_insn "mve_vqsubq_n_<supf><mode>"
1633  [
1634   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1635          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1636                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1637           VQSUBQ_N))
1638  ]
1639  "TARGET_HAVE_MVE"
1640  "vqsub.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1641  [(set_attr "type" "mve_move")
1642])
1643
1644;;
1645;; [vqsubq_u, vqsubq_s])
1646;;
1647(define_insn "mve_vqsubq_<supf><mode>"
1648  [
1649   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1650          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1651                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1652           VQSUBQ))
1653  ]
1654  "TARGET_HAVE_MVE"
1655  "vqsub.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1656  [(set_attr "type" "mve_move")
1657])
1658
1659;;
1660;; [vrhaddq_s, vrhaddq_u])
1661;;
1662(define_insn "@mve_vrhaddq_<supf><mode>"
1663  [
1664   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1665          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1666                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1667           VRHADDQ))
1668  ]
1669  "TARGET_HAVE_MVE"
1670  "vrhadd.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1671  [(set_attr "type" "mve_move")
1672])
1673
1674;;
1675;; [vrmulhq_s, vrmulhq_u])
1676;;
1677(define_insn "mve_vrmulhq_<supf><mode>"
1678  [
1679   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1680          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1681                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1682           VRMULHQ))
1683  ]
1684  "TARGET_HAVE_MVE"
1685  "vrmulh.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1686  [(set_attr "type" "mve_move")
1687])
1688
1689;;
1690;; [vrshlq_n_u, vrshlq_n_s])
1691;;
1692(define_insn "mve_vrshlq_n_<supf><mode>"
1693  [
1694   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1695          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1696                           (match_operand:SI 2 "s_register_operand" "r")]
1697           VRSHLQ_N))
1698  ]
1699  "TARGET_HAVE_MVE"
1700  "vrshl.<supf>%#<V_sz_elem>\t%q0, %2"
1701  [(set_attr "type" "mve_move")
1702])
1703
1704;;
1705;; [vrshlq_s, vrshlq_u])
1706;;
1707(define_insn "mve_vrshlq_<supf><mode>"
1708  [
1709   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1710          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1711                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1712           VRSHLQ))
1713  ]
1714  "TARGET_HAVE_MVE"
1715  "vrshl.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1716  [(set_attr "type" "mve_move")
1717])
1718
1719;;
1720;; [vrshrq_n_s, vrshrq_n_u])
1721;;
1722(define_insn "mve_vrshrq_n_<supf><mode>"
1723  [
1724   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1725          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1726                           (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
1727           VRSHRQ_N))
1728  ]
1729  "TARGET_HAVE_MVE"
1730  "vrshr.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1731  [(set_attr "type" "mve_move")
1732])
1733
1734;;
1735;; [vshlq_n_u, vshlq_n_s])
1736;;
1737(define_insn "mve_vshlq_n_<supf><mode>"
1738  [
1739   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1740          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1741                           (match_operand:SI 2 "immediate_operand" "i")]
1742           VSHLQ_N))
1743  ]
1744  "TARGET_HAVE_MVE"
1745  "vshl.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1746  [(set_attr "type" "mve_move")
1747])
1748
1749;;
1750;; [vshlq_r_s, vshlq_r_u])
1751;;
1752(define_insn "mve_vshlq_r_<supf><mode>"
1753  [
1754   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1755          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1756                           (match_operand:SI 2 "s_register_operand" "r")]
1757           VSHLQ_R))
1758  ]
1759  "TARGET_HAVE_MVE"
1760  "vshl.<supf>%#<V_sz_elem>\t%q0, %2"
1761  [(set_attr "type" "mve_move")
1762])
1763
1764;;
1765;; [vsubq_n_s, vsubq_n_u])
1766;;
1767(define_insn "mve_vsubq_n_<supf><mode>"
1768  [
1769   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1770          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1771                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1772           VSUBQ_N))
1773  ]
1774  "TARGET_HAVE_MVE"
1775  "vsub.i%#<V_sz_elem>\t%q0, %q1, %2"
1776  [(set_attr "type" "mve_move")
1777])
1778
1779;;
1780;; [vsubq_s, vsubq_u])
1781;;
1782(define_insn "mve_vsubq_<supf><mode>"
1783  [
1784   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1785          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1786                           (match_operand:MVE_2 2 "s_register_operand" "w")]
1787           VSUBQ))
1788  ]
1789  "TARGET_HAVE_MVE"
1790  "vsub.i%#<V_sz_elem>\t%q0, %q1, %q2"
1791  [(set_attr "type" "mve_move")
1792])
1793
1794(define_insn "mve_vsubq<mode>"
1795  [
1796   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1797          (minus:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1798                         (match_operand:MVE_2 2 "s_register_operand" "w")))
1799  ]
1800  "TARGET_HAVE_MVE"
1801  "vsub.i%#<V_sz_elem>\t%q0, %q1, %q2"
1802  [(set_attr "type" "mve_move")
1803])
1804
1805;;
1806;; [vabdq_f])
1807;;
1808(define_insn "mve_vabdq_f<mode>"
1809  [
1810   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1811          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1812                           (match_operand:MVE_0 2 "s_register_operand" "w")]
1813           VABDQ_F))
1814  ]
1815  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1816  "vabd.f%#<V_sz_elem>        %q0, %q1, %q2"
1817  [(set_attr "type" "mve_move")
1818])
1819
1820;;
1821;; [vaddlvaq_s vaddlvaq_u])
1822;;
1823(define_insn "mve_vaddlvaq_<supf>v4si"
1824  [
1825   (set (match_operand:DI 0 "s_register_operand" "=r")
1826          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
1827                        (match_operand:V4SI 2 "s_register_operand" "w")]
1828           VADDLVAQ))
1829  ]
1830  "TARGET_HAVE_MVE"
1831  "vaddlva.<supf>32\t%Q0, %R0, %q2"
1832  [(set_attr "type" "mve_move")
1833])
1834
1835;;
1836;; [vaddq_n_f])
1837;;
1838(define_insn "mve_vaddq_n_f<mode>"
1839  [
1840   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1841          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1842                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
1843           VADDQ_N_F))
1844  ]
1845  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1846  "vadd.f%#<V_sz_elem>\t%q0, %q1, %2"
1847  [(set_attr "type" "mve_move")
1848])
1849
1850;;
1851;; [vandq_f])
1852;;
1853(define_insn "mve_vandq_f<mode>"
1854  [
1855   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1856          (and:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1857                       (match_operand:MVE_0 2 "s_register_operand" "w")))
1858  ]
1859  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1860  "vand\t%q0, %q1, %q2"
1861  [(set_attr "type" "mve_move")
1862])
1863
1864;;
1865;; [vbicq_f])
1866;;
1867(define_insn "mve_vbicq_f<mode>"
1868  [
1869   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1870          (and:MVE_0 (not:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w"))
1871                                    (match_operand:MVE_0 2 "s_register_operand" "w")))
1872  ]
1873  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1874  "vbic\t%q0, %q1, %q2"
1875  [(set_attr "type" "mve_move")
1876])
1877
1878;;
1879;; [vbicq_n_s, vbicq_n_u])
1880;;
1881(define_insn "mve_vbicq_n_<supf><mode>"
1882  [
1883   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
1884          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
1885                           (match_operand:SI 2 "immediate_operand" "i")]
1886           VBICQ_N))
1887  ]
1888  "TARGET_HAVE_MVE"
1889  "vbic.i%#<V_sz_elem>\t%q0, %2"
1890  [(set_attr "type" "mve_move")
1891])
1892
1893;;
1894;; [vcaddq, vcaddq_rot90, vcadd_rot180, vcadd_rot270])
1895;;
1896(define_insn "mve_vcaddq<mve_rot><mode>"
1897  [
1898   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
1899          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1900                           (match_operand:MVE_0 2 "s_register_operand" "w")]
1901           VCADD))
1902  ]
1903  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1904  "vcadd.f%#<V_sz_elem>       %q0, %q1, %q2, #<rot>"
1905  [(set_attr "type" "mve_move")
1906])
1907
1908;;
1909;; [vcmpeqq_f, vcmpgeq_f, vcmpgtq_f, vcmpleq_f, vcmpltq_f, vcmpneq_f])
1910;;
1911(define_insn "@mve_vcmp<mve_cmp_op>q_f<mode>"
1912  [
1913   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1914          (MVE_FP_COMPARISONS:<MVE_VPRED> (match_operand:MVE_0 1 "s_register_operand" "w")
1915                                     (match_operand:MVE_0 2 "s_register_operand" "w")))
1916  ]
1917  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1918  "vcmp.f%#<V_sz_elem>        <mve_cmp_op>, %q1, %q2"
1919  [(set_attr "type" "mve_move")
1920])
1921
1922;;
1923;; [vcmpeqq_n_f, vcmpgeq_n_f, vcmpgtq_n_f, vcmpleq_n_f, vcmpltq_n_f, vcmpneq_n_f])
1924;;
1925(define_insn "@mve_vcmp<mve_cmp_op>q_n_f<mode>"
1926  [
1927   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1928          (MVE_FP_COMPARISONS:<MVE_VPRED>
1929           (match_operand:MVE_0 1 "s_register_operand" "w")
1930           (vec_duplicate:MVE_0 (match_operand:<V_elem> 2 "s_register_operand" "r"))))
1931  ]
1932  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1933  "vcmp.f%#<V_sz_elem>        <mve_cmp_op>, %q1, %2"
1934  [(set_attr "type" "mve_move")
1935])
1936
1937;;
1938;; [vcmulq, vcmulq_rot90, vcmulq_rot180, vcmulq_rot270])
1939;;
1940(define_insn "mve_vcmulq<mve_rot><mode>"
1941  [
1942   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
1943          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1944                           (match_operand:MVE_0 2 "s_register_operand" "w")]
1945           VCMUL))
1946  ]
1947  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1948  "vcmul.f%#<V_sz_elem>       %q0, %q1, %q2, #<rot>"
1949  [(set_attr "type" "mve_move")
1950])
1951
1952;;
1953;; [vctp8q_m vctp16q_m vctp32q_m vctp64q_m])
1954;;
1955(define_insn "mve_vctp<mode1>q_mhi"
1956  [
1957   (set (match_operand:HI 0 "vpr_register_operand" "=Up")
1958          (unspec:HI [(match_operand:SI 1 "s_register_operand" "r")
1959                        (match_operand:HI 2 "vpr_register_operand" "Up")]
1960           VCTPQ_M))
1961  ]
1962  "TARGET_HAVE_MVE"
1963  "vpst\;vctpt.<mode1>\t%1"
1964  [(set_attr "type" "mve_move")
1965   (set_attr "length""8")])
1966
1967;;
1968;; [vcvtbq_f16_f32])
1969;;
1970(define_insn "mve_vcvtbq_f16_f32v8hf"
1971  [
1972   (set (match_operand:V8HF 0 "s_register_operand" "=w")
1973          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1974                          (match_operand:V4SF 2 "s_register_operand" "w")]
1975           VCVTBQ_F16_F32))
1976  ]
1977  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1978  "vcvtb.f16.f32\t%q0, %q2"
1979  [(set_attr "type" "mve_move")
1980])
1981
1982;;
1983;; [vcvttq_f16_f32])
1984;;
1985(define_insn "mve_vcvttq_f16_f32v8hf"
1986  [
1987   (set (match_operand:V8HF 0 "s_register_operand" "=w")
1988          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1989                          (match_operand:V4SF 2 "s_register_operand" "w")]
1990           VCVTTQ_F16_F32))
1991  ]
1992  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1993  "vcvtt.f16.f32\t%q0, %q2"
1994  [(set_attr "type" "mve_move")
1995])
1996
1997;;
1998;; [veorq_f])
1999;;
2000(define_insn "mve_veorq_f<mode>"
2001  [
2002   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2003          (xor:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2004                       (match_operand:MVE_0 2 "s_register_operand" "w")))
2005  ]
2006  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2007  "veor\t%q0, %q1, %q2"
2008  [(set_attr "type" "mve_move")
2009])
2010
2011;;
2012;; [vmaxnmaq_f])
2013;;
2014(define_insn "mve_vmaxnmaq_f<mode>"
2015  [
2016   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2017          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2018                           (match_operand:MVE_0 2 "s_register_operand" "w")]
2019           VMAXNMAQ_F))
2020  ]
2021  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2022  "vmaxnma.f%#<V_sz_elem>     %q0, %q2"
2023  [(set_attr "type" "mve_move")
2024])
2025
2026;;
2027;; [vmaxnmavq_f])
2028;;
2029(define_insn "mve_vmaxnmavq_f<mode>"
2030  [
2031   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2032          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2033                                (match_operand:MVE_0 2 "s_register_operand" "w")]
2034           VMAXNMAVQ_F))
2035  ]
2036  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2037  "vmaxnmav.f%#<V_sz_elem>    %0, %q2"
2038  [(set_attr "type" "mve_move")
2039])
2040
2041;;
2042;; [vmaxnmq_f])
2043;;
2044(define_insn "mve_vmaxnmq_f<mode>"
2045  [
2046   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2047          (smax:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2048                        (match_operand:MVE_0 2 "s_register_operand" "w")))
2049  ]
2050  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2051  "vmaxnm.f%#<V_sz_elem>      %q0, %q1, %q2"
2052  [(set_attr "type" "mve_move")
2053])
2054
2055;;
2056;; [vmaxnmvq_f])
2057;;
2058(define_insn "mve_vmaxnmvq_f<mode>"
2059  [
2060   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2061          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2062                                (match_operand:MVE_0 2 "s_register_operand" "w")]
2063           VMAXNMVQ_F))
2064  ]
2065  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2066  "vmaxnmv.f%#<V_sz_elem>     %0, %q2"
2067  [(set_attr "type" "mve_move")
2068])
2069
2070;;
2071;; [vminnmaq_f])
2072;;
2073(define_insn "mve_vminnmaq_f<mode>"
2074  [
2075   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2076          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2077                           (match_operand:MVE_0 2 "s_register_operand" "w")]
2078           VMINNMAQ_F))
2079  ]
2080  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2081  "vminnma.f%#<V_sz_elem>     %q0, %q2"
2082  [(set_attr "type" "mve_move")
2083])
2084
2085;;
2086;; [vminnmavq_f])
2087;;
2088(define_insn "mve_vminnmavq_f<mode>"
2089  [
2090   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2091          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2092                                (match_operand:MVE_0 2 "s_register_operand" "w")]
2093           VMINNMAVQ_F))
2094  ]
2095  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2096  "vminnmav.f%#<V_sz_elem>    %0, %q2"
2097  [(set_attr "type" "mve_move")
2098])
2099
2100;;
2101;; [vminnmq_f])
2102;;
2103(define_insn "mve_vminnmq_f<mode>"
2104  [
2105   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2106          (smin:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2107                        (match_operand:MVE_0 2 "s_register_operand" "w")))
2108  ]
2109  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2110  "vminnm.f%#<V_sz_elem>      %q0, %q1, %q2"
2111  [(set_attr "type" "mve_move")
2112])
2113
2114;;
2115;; [vminnmvq_f])
2116;;
2117(define_insn "mve_vminnmvq_f<mode>"
2118  [
2119   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2120          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2121                                (match_operand:MVE_0 2 "s_register_operand" "w")]
2122           VMINNMVQ_F))
2123  ]
2124  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2125  "vminnmv.f%#<V_sz_elem>     %0, %q2"
2126  [(set_attr "type" "mve_move")
2127])
2128
2129;;
2130;; [vmlaldavq_u, vmlaldavq_s])
2131;;
2132(define_insn "mve_vmlaldavq_<supf><mode>"
2133  [
2134   (set (match_operand:DI 0 "s_register_operand" "=r")
2135          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2136                        (match_operand:MVE_5 2 "s_register_operand" "w")]
2137           VMLALDAVQ))
2138  ]
2139  "TARGET_HAVE_MVE"
2140  "vmlaldav.<supf>%#<V_sz_elem>         %Q0, %R0, %q1, %q2"
2141  [(set_attr "type" "mve_move")
2142])
2143
2144;;
2145;; [vmlaldavxq_s])
2146;;
2147(define_insn "mve_vmlaldavxq_s<mode>"
2148  [
2149   (set (match_operand:DI 0 "s_register_operand" "=r")
2150          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2151                        (match_operand:MVE_5 2 "s_register_operand" "w")]
2152           VMLALDAVXQ_S))
2153  ]
2154  "TARGET_HAVE_MVE"
2155  "vmlaldavx.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
2156  [(set_attr "type" "mve_move")
2157])
2158
2159;;
2160;; [vmlsldavq_s])
2161;;
2162(define_insn "mve_vmlsldavq_s<mode>"
2163  [
2164   (set (match_operand:DI 0 "s_register_operand" "=r")
2165          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2166                        (match_operand:MVE_5 2 "s_register_operand" "w")]
2167           VMLSLDAVQ_S))
2168  ]
2169  "TARGET_HAVE_MVE"
2170  "vmlsldav.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
2171  [(set_attr "type" "mve_move")
2172])
2173
2174;;
2175;; [vmlsldavxq_s])
2176;;
2177(define_insn "mve_vmlsldavxq_s<mode>"
2178  [
2179   (set (match_operand:DI 0 "s_register_operand" "=r")
2180          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2181                        (match_operand:MVE_5 2 "s_register_operand" "w")]
2182           VMLSLDAVXQ_S))
2183  ]
2184  "TARGET_HAVE_MVE"
2185  "vmlsldavx.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
2186  [(set_attr "type" "mve_move")
2187])
2188
2189;;
2190;; [vmovnbq_u, vmovnbq_s])
2191;;
2192(define_insn "mve_vmovnbq_<supf><mode>"
2193  [
2194   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2195          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2196                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2197           VMOVNBQ))
2198  ]
2199  "TARGET_HAVE_MVE"
2200  "vmovnb.i%#<V_sz_elem>      %q0, %q2"
2201  [(set_attr "type" "mve_move")
2202])
2203
2204;;
2205;; [vmovntq_s, vmovntq_u])
2206;;
2207(define_insn "mve_vmovntq_<supf><mode>"
2208  [
2209   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2210          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2211                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2212           VMOVNTQ))
2213  ]
2214  "TARGET_HAVE_MVE"
2215  "vmovnt.i%#<V_sz_elem>      %q0, %q2"
2216  [(set_attr "type" "mve_move")
2217])
2218
2219;;
2220;; [vmulq_f])
2221;;
2222(define_insn "mve_vmulq_f<mode>"
2223  [
2224   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2225          (mult:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2226                        (match_operand:MVE_0 2 "s_register_operand" "w")))
2227  ]
2228  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2229  "vmul.f%#<V_sz_elem>        %q0, %q1, %q2"
2230  [(set_attr "type" "mve_move")
2231])
2232
2233;;
2234;; [vmulq_n_f])
2235;;
2236(define_insn "mve_vmulq_n_f<mode>"
2237  [
2238   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2239          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
2240                           (match_operand:<V_elem> 2 "s_register_operand" "r")]
2241           VMULQ_N_F))
2242  ]
2243  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2244  "vmul.f%#<V_sz_elem>        %q0, %q1, %2"
2245  [(set_attr "type" "mve_move")
2246])
2247
2248;;
2249;; [vornq_f])
2250;;
2251(define_insn "mve_vornq_f<mode>"
2252  [
2253   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2254          (ior:MVE_0 (not:MVE_0 (match_operand:MVE_0 2 "s_register_operand" "w"))
2255                       (match_operand:MVE_0 1 "s_register_operand" "w")))
2256  ]
2257  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2258  "vorn\t%q0, %q1, %q2"
2259  [(set_attr "type" "mve_move")
2260])
2261
2262;;
2263;; [vorrq_f])
2264;;
2265(define_insn "mve_vorrq_f<mode>"
2266  [
2267   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2268          (ior:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2269                       (match_operand:MVE_0 2 "s_register_operand" "w")))
2270  ]
2271  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2272  "vorr\t%q0, %q1, %q2"
2273  [(set_attr "type" "mve_move")
2274])
2275
2276;;
2277;; [vorrq_n_u, vorrq_n_s])
2278;;
2279(define_insn "mve_vorrq_n_<supf><mode>"
2280  [
2281   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2282          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2283                           (match_operand:SI 2 "immediate_operand" "i")]
2284           VORRQ_N))
2285  ]
2286  "TARGET_HAVE_MVE"
2287  "vorr.i%#<V_sz_elem>        %q0, %2"
2288  [(set_attr "type" "mve_move")
2289])
2290
2291;;
2292;; [vqdmullbq_n_s])
2293;;
2294(define_insn "mve_vqdmullbq_n_s<mode>"
2295  [
2296   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2297          (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
2298                                          (match_operand:<V_elem> 2 "s_register_operand" "r")]
2299           VQDMULLBQ_N_S))
2300  ]
2301  "TARGET_HAVE_MVE"
2302  "vqdmullb.s%#<V_sz_elem>    %q0, %q1, %2"
2303  [(set_attr "type" "mve_move")
2304])
2305
2306;;
2307;; [vqdmullbq_s])
2308;;
2309(define_insn "mve_vqdmullbq_s<mode>"
2310  [
2311   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2312          (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
2313                                          (match_operand:MVE_5 2 "s_register_operand" "w")]
2314           VQDMULLBQ_S))
2315  ]
2316  "TARGET_HAVE_MVE"
2317  "vqdmullb.s%#<V_sz_elem>    %q0, %q1, %q2"
2318  [(set_attr "type" "mve_move")
2319])
2320
2321;;
2322;; [vqdmulltq_n_s])
2323;;
2324(define_insn "mve_vqdmulltq_n_s<mode>"
2325  [
2326   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2327          (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
2328                                          (match_operand:<V_elem> 2 "s_register_operand" "r")]
2329           VQDMULLTQ_N_S))
2330  ]
2331  "TARGET_HAVE_MVE"
2332  "vqdmullt.s%#<V_sz_elem>    %q0, %q1, %2"
2333  [(set_attr "type" "mve_move")
2334])
2335
2336;;
2337;; [vqdmulltq_s])
2338;;
2339(define_insn "mve_vqdmulltq_s<mode>"
2340  [
2341   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2342          (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
2343                                          (match_operand:MVE_5 2 "s_register_operand" "w")]
2344           VQDMULLTQ_S))
2345  ]
2346  "TARGET_HAVE_MVE"
2347  "vqdmullt.s%#<V_sz_elem>    %q0, %q1, %q2"
2348  [(set_attr "type" "mve_move")
2349])
2350
2351;;
2352;; [vqmovnbq_u, vqmovnbq_s])
2353;;
2354(define_insn "mve_vqmovnbq_<supf><mode>"
2355  [
2356   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2357          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2358                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2359           VQMOVNBQ))
2360  ]
2361  "TARGET_HAVE_MVE"
2362  "vqmovnb.<supf>%#<V_sz_elem>          %q0, %q2"
2363  [(set_attr "type" "mve_move")
2364])
2365
2366;;
2367;; [vqmovntq_u, vqmovntq_s])
2368;;
2369(define_insn "mve_vqmovntq_<supf><mode>"
2370  [
2371   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2372          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2373                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2374           VQMOVNTQ))
2375  ]
2376  "TARGET_HAVE_MVE"
2377  "vqmovnt.<supf>%#<V_sz_elem>          %q0, %q2"
2378  [(set_attr "type" "mve_move")
2379])
2380
2381;;
2382;; [vqmovunbq_s])
2383;;
2384(define_insn "mve_vqmovunbq_s<mode>"
2385  [
2386   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2387          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2388                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2389           VQMOVUNBQ_S))
2390  ]
2391  "TARGET_HAVE_MVE"
2392  "vqmovunb.s%#<V_sz_elem>    %q0, %q2"
2393  [(set_attr "type" "mve_move")
2394])
2395
2396;;
2397;; [vqmovuntq_s])
2398;;
2399(define_insn "mve_vqmovuntq_s<mode>"
2400  [
2401   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2402          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2403                                         (match_operand:MVE_5 2 "s_register_operand" "w")]
2404           VQMOVUNTQ_S))
2405  ]
2406  "TARGET_HAVE_MVE"
2407  "vqmovunt.s%#<V_sz_elem>    %q0, %q2"
2408  [(set_attr "type" "mve_move")
2409])
2410
2411;;
2412;; [vrmlaldavhxq_s])
2413;;
2414(define_insn "mve_vrmlaldavhxq_sv4si"
2415  [
2416   (set (match_operand:DI 0 "s_register_operand" "=r")
2417          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2418                        (match_operand:V4SI 2 "s_register_operand" "w")]
2419           VRMLALDAVHXQ_S))
2420  ]
2421  "TARGET_HAVE_MVE"
2422  "vrmlaldavhx.s32\t%Q0, %R0, %q1, %q2"
2423  [(set_attr "type" "mve_move")
2424])
2425
2426;;
2427;; [vrmlsldavhq_s])
2428;;
2429(define_insn "mve_vrmlsldavhq_sv4si"
2430  [
2431   (set (match_operand:DI 0 "s_register_operand" "=r")
2432          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2433                        (match_operand:V4SI 2 "s_register_operand" "w")]
2434           VRMLSLDAVHQ_S))
2435  ]
2436  "TARGET_HAVE_MVE"
2437  "vrmlsldavh.s32\t%Q0, %R0, %q1, %q2"
2438  [(set_attr "type" "mve_move")
2439])
2440
2441;;
2442;; [vrmlsldavhxq_s])
2443;;
2444(define_insn "mve_vrmlsldavhxq_sv4si"
2445  [
2446   (set (match_operand:DI 0 "s_register_operand" "=r")
2447          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2448                        (match_operand:V4SI 2 "s_register_operand" "w")]
2449           VRMLSLDAVHXQ_S))
2450  ]
2451  "TARGET_HAVE_MVE"
2452  "vrmlsldavhx.s32\t%Q0, %R0, %q1, %q2"
2453  [(set_attr "type" "mve_move")
2454])
2455
2456;;
2457;; [vshllbq_n_s, vshllbq_n_u])
2458;;
2459(define_insn "mve_vshllbq_n_<supf><mode>"
2460  [
2461   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2462          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
2463                                          (match_operand:SI 2 "immediate_operand" "i")]
2464           VSHLLBQ_N))
2465  ]
2466  "TARGET_HAVE_MVE"
2467  "vshllb.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
2468  [(set_attr "type" "mve_move")
2469])
2470
2471;;
2472;; [vshlltq_n_u, vshlltq_n_s])
2473;;
2474(define_insn "mve_vshlltq_n_<supf><mode>"
2475  [
2476   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2477          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
2478                                          (match_operand:SI 2 "immediate_operand" "i")]
2479           VSHLLTQ_N))
2480  ]
2481  "TARGET_HAVE_MVE"
2482  "vshllt.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
2483  [(set_attr "type" "mve_move")
2484])
2485
2486;;
2487;; [vsubq_f])
2488;;
2489(define_insn "mve_vsubq_f<mode>"
2490  [
2491   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2492          (minus:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
2493                         (match_operand:MVE_0 2 "s_register_operand" "w")))
2494  ]
2495  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2496  "vsub.f%#<V_sz_elem>\t%q0, %q1, %q2"
2497  [(set_attr "type" "mve_move")
2498])
2499
2500;;
2501;; [vmulltq_poly_p])
2502;;
2503(define_insn "mve_vmulltq_poly_p<mode>"
2504  [
2505   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2506          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
2507                                          (match_operand:MVE_3 2 "s_register_operand" "w")]
2508           VMULLTQ_POLY_P))
2509  ]
2510  "TARGET_HAVE_MVE"
2511  "vmullt.p%#<V_sz_elem>\t%q0, %q1, %q2"
2512  [(set_attr "type" "mve_move")
2513])
2514
2515;;
2516;; [vmullbq_poly_p])
2517;;
2518(define_insn "mve_vmullbq_poly_p<mode>"
2519  [
2520   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2521          (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
2522                                          (match_operand:MVE_3 2 "s_register_operand" "w")]
2523           VMULLBQ_POLY_P))
2524  ]
2525  "TARGET_HAVE_MVE"
2526  "vmullb.p%#<V_sz_elem>\t%q0, %q1, %q2"
2527  [(set_attr "type" "mve_move")
2528])
2529
2530;;
2531;; [vrmlaldavhq_u vrmlaldavhq_s])
2532;;
2533(define_insn "mve_vrmlaldavhq_<supf>v4si"
2534  [
2535   (set (match_operand:DI 0 "s_register_operand" "=r")
2536          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2537                        (match_operand:V4SI 2 "s_register_operand" "w")]
2538           VRMLALDAVHQ))
2539  ]
2540  "TARGET_HAVE_MVE"
2541  "vrmlaldavh.<supf>32\t%Q0, %R0, %q1, %q2"
2542  [(set_attr "type" "mve_move")
2543])
2544
2545;;
2546;; [vbicq_m_n_s, vbicq_m_n_u])
2547;;
2548(define_insn "mve_vbicq_m_n_<supf><mode>"
2549  [
2550   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2551          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2552                           (match_operand:SI 2 "immediate_operand" "i")
2553                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2554           VBICQ_M_N))
2555  ]
2556  "TARGET_HAVE_MVE"
2557  "vpst\;vbict.i%#<V_sz_elem>\t%q0, %2"
2558  [(set_attr "type" "mve_move")
2559   (set_attr "length""8")])
2560;;
2561;; [vcmpeqq_m_f])
2562;;
2563(define_insn "mve_vcmpeqq_m_f<mode>"
2564  [
2565   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2566          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
2567                        (match_operand:MVE_0 2 "s_register_operand" "w")
2568                        (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2569           VCMPEQQ_M_F))
2570  ]
2571  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2572  "vpst\;vcmpt.f%#<V_sz_elem> eq, %q1, %q2"
2573  [(set_attr "type" "mve_move")
2574   (set_attr "length""8")])
2575;;
2576;; [vcvtaq_m_u, vcvtaq_m_s])
2577;;
2578(define_insn "mve_vcvtaq_m_<supf><mode>"
2579  [
2580   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2581          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2582                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2583                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2584           VCVTAQ_M))
2585  ]
2586  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2587  "vpst\;vcvtat.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
2588  [(set_attr "type" "mve_move")
2589   (set_attr "length""8")])
2590;;
2591;; [vcvtq_m_to_f_s, vcvtq_m_to_f_u])
2592;;
2593(define_insn "mve_vcvtq_m_to_f_<supf><mode>"
2594  [
2595   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2596          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2597                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2598                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2599           VCVTQ_M_TO_F))
2600  ]
2601  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2602  "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q2"
2603  [(set_attr "type" "mve_move")
2604   (set_attr "length""8")])
2605;;
2606;; [vqrshrnbq_n_u, vqrshrnbq_n_s])
2607;;
2608(define_insn "mve_vqrshrnbq_n_<supf><mode>"
2609  [
2610   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2611          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2612                                         (match_operand:MVE_5 2 "s_register_operand" "w")
2613                                         (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
2614           VQRSHRNBQ_N))
2615  ]
2616  "TARGET_HAVE_MVE"
2617  "vqrshrnb.<supf>%#<V_sz_elem>         %q0, %q2, %3"
2618  [(set_attr "type" "mve_move")
2619])
2620;;
2621;; [vqrshrunbq_n_s])
2622;;
2623(define_insn "mve_vqrshrunbq_n_s<mode>"
2624  [
2625   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2626          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2627                                         (match_operand:MVE_5 2 "s_register_operand" "w")
2628                                         (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
2629           VQRSHRUNBQ_N_S))
2630  ]
2631  "TARGET_HAVE_MVE"
2632  "vqrshrunb.s%#<V_sz_elem>\t%q0, %q2, %3"
2633  [(set_attr "type" "mve_move")
2634])
2635;;
2636;; [vrmlaldavhaq_s vrmlaldavhaq_u])
2637;;
2638(define_insn "mve_vrmlaldavhaq_<supf>v4si"
2639  [
2640   (set (match_operand:DI 0 "s_register_operand" "=r")
2641          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2642                        (match_operand:V4SI 2 "s_register_operand" "w")
2643                        (match_operand:V4SI 3 "s_register_operand" "w")]
2644           VRMLALDAVHAQ))
2645  ]
2646  "TARGET_HAVE_MVE"
2647  "vrmlaldavha.<supf>32\t%Q0, %R0, %q2, %q3"
2648  [(set_attr "type" "mve_move")
2649])
2650
2651;;
2652;; [vabavq_s, vabavq_u])
2653;;
2654(define_insn "mve_vabavq_<supf><mode>"
2655  [
2656   (set (match_operand:SI 0 "s_register_operand" "=r")
2657          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2658                        (match_operand:MVE_2 2 "s_register_operand" "w")
2659                        (match_operand:MVE_2 3 "s_register_operand" "w")]
2660           VABAVQ))
2661  ]
2662  "TARGET_HAVE_MVE"
2663  "vabav.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
2664  [(set_attr "type" "mve_move")
2665])
2666
2667;;
2668;; [vshlcq_u vshlcq_s]
2669;;
2670(define_expand "mve_vshlcq_vec_<supf><mode>"
2671 [(match_operand:MVE_2 0 "s_register_operand")
2672  (match_operand:MVE_2 1 "s_register_operand")
2673  (match_operand:SI 2 "s_register_operand")
2674  (match_operand:SI 3 "mve_imm_32")
2675  (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
2676 "TARGET_HAVE_MVE"
2677{
2678  rtx ignore_wb = gen_reg_rtx (SImode);
2679  emit_insn(gen_mve_vshlcq_<supf><mode>(operands[0], ignore_wb, operands[1],
2680                                              operands[2], operands[3]));
2681  DONE;
2682})
2683
2684(define_expand "mve_vshlcq_carry_<supf><mode>"
2685 [(match_operand:SI 0 "s_register_operand")
2686  (match_operand:MVE_2 1 "s_register_operand")
2687  (match_operand:SI 2 "s_register_operand")
2688  (match_operand:SI 3 "mve_imm_32")
2689  (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
2690 "TARGET_HAVE_MVE"
2691{
2692  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
2693  emit_insn(gen_mve_vshlcq_<supf><mode>(ignore_vec, operands[0], operands[1],
2694                                              operands[2], operands[3]));
2695  DONE;
2696})
2697
2698(define_insn "mve_vshlcq_<supf><mode>"
2699 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
2700       (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
2701                          (match_operand:SI 3 "s_register_operand" "1")
2702                          (match_operand:SI 4 "mve_imm_32" "Rf")]
2703          VSHLCQ))
2704  (set (match_operand:SI  1 "s_register_operand" "=r")
2705       (unspec:SI [(match_dup 2)
2706                       (match_dup 3)
2707                       (match_dup 4)]
2708          VSHLCQ))]
2709 "TARGET_HAVE_MVE"
2710 "vshlc\t%q0, %1, %4")
2711
2712;;
2713;; [vabsq_m_s])
2714;;
2715(define_insn "mve_vabsq_m_s<mode>"
2716  [
2717   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2718          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2719                           (match_operand:MVE_2 2 "s_register_operand" "w")
2720                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2721           VABSQ_M_S))
2722  ]
2723  "TARGET_HAVE_MVE"
2724  "vpst\;vabst.s%#<V_sz_elem> %q0, %q2"
2725  [(set_attr "type" "mve_move")
2726   (set_attr "length""8")])
2727
2728;;
2729;; [vaddvaq_p_u, vaddvaq_p_s])
2730;;
2731(define_insn "mve_vaddvaq_p_<supf><mode>"
2732  [
2733   (set (match_operand:SI 0 "s_register_operand" "=Te")
2734          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2735                           (match_operand:MVE_2 2 "s_register_operand" "w")
2736                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2737           VADDVAQ_P))
2738  ]
2739  "TARGET_HAVE_MVE"
2740  "vpst\;vaddvat.<supf>%#<V_sz_elem>    %0, %q2"
2741  [(set_attr "type" "mve_move")
2742   (set_attr "length""8")])
2743
2744;;
2745;; [vclsq_m_s])
2746;;
2747(define_insn "mve_vclsq_m_s<mode>"
2748  [
2749   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2750          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2751                           (match_operand:MVE_2 2 "s_register_operand" "w")
2752                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2753           VCLSQ_M_S))
2754  ]
2755  "TARGET_HAVE_MVE"
2756  "vpst\;vclst.s%#<V_sz_elem> %q0, %q2"
2757  [(set_attr "type" "mve_move")
2758   (set_attr "length""8")])
2759
2760;;
2761;; [vclzq_m_s, vclzq_m_u])
2762;;
2763(define_insn "mve_vclzq_m_<supf><mode>"
2764  [
2765   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2766          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2767                           (match_operand:MVE_2 2 "s_register_operand" "w")
2768                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2769           VCLZQ_M))
2770  ]
2771  "TARGET_HAVE_MVE"
2772  "vpst\;vclzt.i%#<V_sz_elem> %q0, %q2"
2773  [(set_attr "type" "mve_move")
2774   (set_attr "length""8")])
2775
2776;;
2777;; [vcmpcsq_m_n_u])
2778;;
2779(define_insn "mve_vcmpcsq_m_n_u<mode>"
2780  [
2781   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2782          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2783                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2784                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2785           VCMPCSQ_M_N_U))
2786  ]
2787  "TARGET_HAVE_MVE"
2788  "vpst\;vcmpt.u%#<V_sz_elem> cs, %q1, %2"
2789  [(set_attr "type" "mve_move")
2790   (set_attr "length""8")])
2791
2792;;
2793;; [vcmpcsq_m_u])
2794;;
2795(define_insn "mve_vcmpcsq_m_u<mode>"
2796  [
2797   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2798          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2799                           (match_operand:MVE_2 2 "s_register_operand" "w")
2800                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2801           VCMPCSQ_M_U))
2802  ]
2803  "TARGET_HAVE_MVE"
2804  "vpst\;vcmpt.u%#<V_sz_elem> cs, %q1, %q2"
2805  [(set_attr "type" "mve_move")
2806   (set_attr "length""8")])
2807
2808;;
2809;; [vcmpeqq_m_n_u, vcmpeqq_m_n_s])
2810;;
2811(define_insn "mve_vcmpeqq_m_n_<supf><mode>"
2812  [
2813   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2814          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2815                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2816                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2817           VCMPEQQ_M_N))
2818  ]
2819  "TARGET_HAVE_MVE"
2820  "vpst\;vcmpt.i%#<V_sz_elem> eq, %q1, %2"
2821  [(set_attr "type" "mve_move")
2822   (set_attr "length""8")])
2823
2824;;
2825;; [vcmpeqq_m_u, vcmpeqq_m_s])
2826;;
2827(define_insn "mve_vcmpeqq_m_<supf><mode>"
2828  [
2829   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2830          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2831                           (match_operand:MVE_2 2 "s_register_operand" "w")
2832                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2833           VCMPEQQ_M))
2834  ]
2835  "TARGET_HAVE_MVE"
2836  "vpst\;vcmpt.i%#<V_sz_elem> eq, %q1, %q2"
2837  [(set_attr "type" "mve_move")
2838   (set_attr "length""8")])
2839
2840;;
2841;; [vcmpgeq_m_n_s])
2842;;
2843(define_insn "mve_vcmpgeq_m_n_s<mode>"
2844  [
2845   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2846          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2847                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2848                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2849           VCMPGEQ_M_N_S))
2850  ]
2851  "TARGET_HAVE_MVE"
2852  "vpst\;vcmpt.s%#<V_sz_elem> ge, %q1, %2"
2853  [(set_attr "type" "mve_move")
2854   (set_attr "length""8")])
2855
2856;;
2857;; [vcmpgeq_m_s])
2858;;
2859(define_insn "mve_vcmpgeq_m_s<mode>"
2860  [
2861   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2862          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2863                           (match_operand:MVE_2 2 "s_register_operand" "w")
2864                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2865           VCMPGEQ_M_S))
2866  ]
2867  "TARGET_HAVE_MVE"
2868  "vpst\;vcmpt.s%#<V_sz_elem> ge, %q1, %q2"
2869  [(set_attr "type" "mve_move")
2870   (set_attr "length""8")])
2871
2872;;
2873;; [vcmpgtq_m_n_s])
2874;;
2875(define_insn "mve_vcmpgtq_m_n_s<mode>"
2876  [
2877   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2878          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2879                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2880                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2881           VCMPGTQ_M_N_S))
2882  ]
2883  "TARGET_HAVE_MVE"
2884  "vpst\;vcmpt.s%#<V_sz_elem> gt, %q1, %2"
2885  [(set_attr "type" "mve_move")
2886   (set_attr "length""8")])
2887
2888;;
2889;; [vcmpgtq_m_s])
2890;;
2891(define_insn "mve_vcmpgtq_m_s<mode>"
2892  [
2893   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2894          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2895                           (match_operand:MVE_2 2 "s_register_operand" "w")
2896                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2897           VCMPGTQ_M_S))
2898  ]
2899  "TARGET_HAVE_MVE"
2900  "vpst\;vcmpt.s%#<V_sz_elem> gt, %q1, %q2"
2901  [(set_attr "type" "mve_move")
2902   (set_attr "length""8")])
2903
2904;;
2905;; [vcmphiq_m_n_u])
2906;;
2907(define_insn "mve_vcmphiq_m_n_u<mode>"
2908  [
2909   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2910          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2911                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2912                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2913           VCMPHIQ_M_N_U))
2914  ]
2915  "TARGET_HAVE_MVE"
2916  "vpst\;vcmpt.u%#<V_sz_elem> hi, %q1, %2"
2917  [(set_attr "type" "mve_move")
2918   (set_attr "length""8")])
2919
2920;;
2921;; [vcmphiq_m_u])
2922;;
2923(define_insn "mve_vcmphiq_m_u<mode>"
2924  [
2925   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2926          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2927                           (match_operand:MVE_2 2 "s_register_operand" "w")
2928                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2929           VCMPHIQ_M_U))
2930  ]
2931  "TARGET_HAVE_MVE"
2932  "vpst\;vcmpt.u%#<V_sz_elem> hi, %q1, %q2"
2933  [(set_attr "type" "mve_move")
2934   (set_attr "length""8")])
2935
2936;;
2937;; [vcmpleq_m_n_s])
2938;;
2939(define_insn "mve_vcmpleq_m_n_s<mode>"
2940  [
2941   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2942          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2943                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2944                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2945           VCMPLEQ_M_N_S))
2946  ]
2947  "TARGET_HAVE_MVE"
2948  "vpst\;vcmpt.s%#<V_sz_elem> le, %q1, %2"
2949  [(set_attr "type" "mve_move")
2950   (set_attr "length""8")])
2951
2952;;
2953;; [vcmpleq_m_s])
2954;;
2955(define_insn "mve_vcmpleq_m_s<mode>"
2956  [
2957   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2958          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2959                           (match_operand:MVE_2 2 "s_register_operand" "w")
2960                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2961           VCMPLEQ_M_S))
2962  ]
2963  "TARGET_HAVE_MVE"
2964  "vpst\;vcmpt.s%#<V_sz_elem> le, %q1, %q2"
2965  [(set_attr "type" "mve_move")
2966   (set_attr "length""8")])
2967
2968;;
2969;; [vcmpltq_m_n_s])
2970;;
2971(define_insn "mve_vcmpltq_m_n_s<mode>"
2972  [
2973   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2974          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2975                           (match_operand:<V_elem> 2 "s_register_operand" "r")
2976                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2977           VCMPLTQ_M_N_S))
2978  ]
2979  "TARGET_HAVE_MVE"
2980  "vpst\;vcmpt.s%#<V_sz_elem> lt, %q1, %2"
2981  [(set_attr "type" "mve_move")
2982   (set_attr "length""8")])
2983
2984;;
2985;; [vcmpltq_m_s])
2986;;
2987(define_insn "mve_vcmpltq_m_s<mode>"
2988  [
2989   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2990          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
2991                           (match_operand:MVE_2 2 "s_register_operand" "w")
2992                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2993           VCMPLTQ_M_S))
2994  ]
2995  "TARGET_HAVE_MVE"
2996  "vpst\;vcmpt.s%#<V_sz_elem> lt, %q1, %q2"
2997  [(set_attr "type" "mve_move")
2998   (set_attr "length""8")])
2999
3000;;
3001;; [vcmpneq_m_n_u, vcmpneq_m_n_s])
3002;;
3003(define_insn "mve_vcmpneq_m_n_<supf><mode>"
3004  [
3005   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3006          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
3007                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3008                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3009           VCMPNEQ_M_N))
3010  ]
3011  "TARGET_HAVE_MVE"
3012  "vpst\;vcmpt.i%#<V_sz_elem> ne, %q1, %2"
3013  [(set_attr "type" "mve_move")
3014   (set_attr "length""8")])
3015
3016;;
3017;; [vcmpneq_m_s, vcmpneq_m_u])
3018;;
3019(define_insn "mve_vcmpneq_m_<supf><mode>"
3020  [
3021   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3022          (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
3023                           (match_operand:MVE_2 2 "s_register_operand" "w")
3024                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3025           VCMPNEQ_M))
3026  ]
3027  "TARGET_HAVE_MVE"
3028  "vpst\;vcmpt.i%#<V_sz_elem> ne, %q1, %q2"
3029  [(set_attr "type" "mve_move")
3030   (set_attr "length""8")])
3031
3032;;
3033;; [vdupq_m_n_s, vdupq_m_n_u])
3034;;
3035(define_insn "mve_vdupq_m_n_<supf><mode>"
3036  [
3037   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3038          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3039                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3040                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3041           VDUPQ_M_N))
3042  ]
3043  "TARGET_HAVE_MVE"
3044  "vpst\;vdupt.%#<V_sz_elem>\t%q0, %2"
3045  [(set_attr "type" "mve_move")
3046   (set_attr "length""8")])
3047
3048;;
3049;; [vmaxaq_m_s])
3050;;
3051(define_insn "mve_vmaxaq_m_s<mode>"
3052  [
3053   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3054          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3055                           (match_operand:MVE_2 2 "s_register_operand" "w")
3056                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3057           VMAXAQ_M_S))
3058  ]
3059  "TARGET_HAVE_MVE"
3060  "vpst\;vmaxat.s%#<V_sz_elem>          %q0, %q2"
3061  [(set_attr "type" "mve_move")
3062   (set_attr "length""8")])
3063
3064;;
3065;; [vmaxavq_p_s])
3066;;
3067(define_insn "mve_vmaxavq_p_s<mode>"
3068  [
3069   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
3070          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
3071                           (match_operand:MVE_2 2 "s_register_operand" "w")
3072                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3073           VMAXAVQ_P_S))
3074  ]
3075  "TARGET_HAVE_MVE"
3076  "vpst\;vmaxavt.s%#<V_sz_elem>         %0, %q2"
3077  [(set_attr "type" "mve_move")
3078   (set_attr "length""8")])
3079
3080;;
3081;; [vmaxvq_p_u, vmaxvq_p_s])
3082;;
3083(define_insn "mve_vmaxvq_p_<supf><mode>"
3084  [
3085   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
3086          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
3087                           (match_operand:MVE_2 2 "s_register_operand" "w")
3088                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3089           VMAXVQ_P))
3090  ]
3091  "TARGET_HAVE_MVE"
3092  "vpst\;vmaxvt.<supf>%#<V_sz_elem>     %0, %q2"
3093  [(set_attr "type" "mve_move")
3094   (set_attr "length""8")])
3095
3096;;
3097;; [vminaq_m_s])
3098;;
3099(define_insn "mve_vminaq_m_s<mode>"
3100  [
3101   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3102          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3103                           (match_operand:MVE_2 2 "s_register_operand" "w")
3104                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3105           VMINAQ_M_S))
3106  ]
3107  "TARGET_HAVE_MVE"
3108  "vpst\;vminat.s%#<V_sz_elem>          %q0, %q2"
3109  [(set_attr "type" "mve_move")
3110   (set_attr "length""8")])
3111
3112;;
3113;; [vminavq_p_s])
3114;;
3115(define_insn "mve_vminavq_p_s<mode>"
3116  [
3117   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
3118          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
3119                           (match_operand:MVE_2 2 "s_register_operand" "w")
3120                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3121           VMINAVQ_P_S))
3122  ]
3123  "TARGET_HAVE_MVE"
3124  "vpst\;vminavt.s%#<V_sz_elem>         %0, %q2"
3125  [(set_attr "type" "mve_move")
3126   (set_attr "length""8")])
3127
3128;;
3129;; [vminvq_p_s, vminvq_p_u])
3130;;
3131(define_insn "mve_vminvq_p_<supf><mode>"
3132  [
3133   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
3134          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
3135                           (match_operand:MVE_2 2 "s_register_operand" "w")
3136                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3137           VMINVQ_P))
3138  ]
3139  "TARGET_HAVE_MVE"
3140  "vpst\;vminvt.<supf>%#<V_sz_elem>\t%0, %q2"
3141  [(set_attr "type" "mve_move")
3142   (set_attr "length""8")])
3143
3144;;
3145;; [vmladavaq_u, vmladavaq_s])
3146;;
3147(define_insn "mve_vmladavaq_<supf><mode>"
3148  [
3149   (set (match_operand:SI 0 "s_register_operand" "=Te")
3150          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
3151                           (match_operand:MVE_2 2 "s_register_operand" "w")
3152                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3153           VMLADAVAQ))
3154  ]
3155  "TARGET_HAVE_MVE"
3156  "vmladava.<supf>%#<V_sz_elem>         %0, %q2, %q3"
3157  [(set_attr "type" "mve_move")
3158])
3159
3160;;
3161;; [vmladavq_p_u, vmladavq_p_s])
3162;;
3163(define_insn "mve_vmladavq_p_<supf><mode>"
3164  [
3165   (set (match_operand:SI 0 "s_register_operand" "=Te")
3166          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
3167                           (match_operand:MVE_2 2 "s_register_operand" "w")
3168                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3169           VMLADAVQ_P))
3170  ]
3171  "TARGET_HAVE_MVE"
3172  "vpst\;vmladavt.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
3173  [(set_attr "type" "mve_move")
3174   (set_attr "length""8")])
3175
3176;;
3177;; [vmladavxq_p_s])
3178;;
3179(define_insn "mve_vmladavxq_p_s<mode>"
3180  [
3181   (set (match_operand:SI 0 "s_register_operand" "=Te")
3182          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
3183                           (match_operand:MVE_2 2 "s_register_operand" "w")
3184                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3185           VMLADAVXQ_P_S))
3186  ]
3187  "TARGET_HAVE_MVE"
3188  "vpst\;vmladavxt.s%#<V_sz_elem>\t%0, %q1, %q2"
3189  [(set_attr "type" "mve_move")
3190   (set_attr "length""8")])
3191
3192;;
3193;; [vmlaq_n_u, vmlaq_n_s])
3194;;
3195(define_insn "mve_vmlaq_n_<supf><mode>"
3196  [
3197   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3198          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3199                           (match_operand:MVE_2 2 "s_register_operand" "w")
3200                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3201           VMLAQ_N))
3202  ]
3203  "TARGET_HAVE_MVE"
3204  "vmla.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
3205  [(set_attr "type" "mve_move")
3206])
3207
3208;;
3209;; [vmlasq_n_u, vmlasq_n_s])
3210;;
3211(define_insn "mve_vmlasq_n_<supf><mode>"
3212  [
3213   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3214          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3215                           (match_operand:MVE_2 2 "s_register_operand" "w")
3216                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3217           VMLASQ_N))
3218  ]
3219  "TARGET_HAVE_MVE"
3220  "vmlas.<supf>%#<V_sz_elem>  %q0, %q2, %3"
3221  [(set_attr "type" "mve_move")
3222])
3223
3224;;
3225;; [vmlsdavq_p_s])
3226;;
3227(define_insn "mve_vmlsdavq_p_s<mode>"
3228  [
3229   (set (match_operand:SI 0 "s_register_operand" "=Te")
3230          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
3231                           (match_operand:MVE_2 2 "s_register_operand" "w")
3232                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3233           VMLSDAVQ_P_S))
3234  ]
3235  "TARGET_HAVE_MVE"
3236  "vpst\;vmlsdavt.s%#<V_sz_elem>        %0, %q1, %q2"
3237  [(set_attr "type" "mve_move")
3238   (set_attr "length""8")])
3239
3240;;
3241;; [vmlsdavxq_p_s])
3242;;
3243(define_insn "mve_vmlsdavxq_p_s<mode>"
3244  [
3245   (set (match_operand:SI 0 "s_register_operand" "=Te")
3246          (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
3247                           (match_operand:MVE_2 2 "s_register_operand" "w")
3248                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3249           VMLSDAVXQ_P_S))
3250  ]
3251  "TARGET_HAVE_MVE"
3252  "vpst\;vmlsdavxt.s%#<V_sz_elem>       %0, %q1, %q2"
3253  [(set_attr "type" "mve_move")
3254   (set_attr "length""8")])
3255
3256;;
3257;; [vmvnq_m_s, vmvnq_m_u])
3258;;
3259(define_insn "mve_vmvnq_m_<supf><mode>"
3260  [
3261   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3262          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3263                           (match_operand:MVE_2 2 "s_register_operand" "w")
3264                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3265           VMVNQ_M))
3266  ]
3267  "TARGET_HAVE_MVE"
3268  "vpst\;vmvnt\t%q0, %q2"
3269  [(set_attr "type" "mve_move")
3270   (set_attr "length""8")])
3271
3272;;
3273;; [vnegq_m_s])
3274;;
3275(define_insn "mve_vnegq_m_s<mode>"
3276  [
3277   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3278          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3279                           (match_operand:MVE_2 2 "s_register_operand" "w")
3280                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3281           VNEGQ_M_S))
3282  ]
3283  "TARGET_HAVE_MVE"
3284  "vpst\;vnegt.s%#<V_sz_elem>\t%q0, %q2"
3285  [(set_attr "type" "mve_move")
3286   (set_attr "length""8")])
3287
3288;;
3289;; [vpselq_u, vpselq_s])
3290;;
3291(define_insn "@mve_vpselq_<supf><mode>"
3292  [
3293   (set (match_operand:MVE_1 0 "s_register_operand" "=w")
3294          (unspec:MVE_1 [(match_operand:MVE_1 1 "s_register_operand" "w")
3295                           (match_operand:MVE_1 2 "s_register_operand" "w")
3296                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3297           VPSELQ))
3298  ]
3299  "TARGET_HAVE_MVE"
3300  "vpsel\t%q0, %q1, %q2"
3301  [(set_attr "type" "mve_move")
3302])
3303
3304;;
3305;; [vqabsq_m_s])
3306;;
3307(define_insn "mve_vqabsq_m_s<mode>"
3308  [
3309   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3310          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3311                           (match_operand:MVE_2 2 "s_register_operand" "w")
3312                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3313           VQABSQ_M_S))
3314  ]
3315  "TARGET_HAVE_MVE"
3316  "vpst\;vqabst.s%#<V_sz_elem>\t%q0, %q2"
3317  [(set_attr "type" "mve_move")
3318   (set_attr "length""8")])
3319
3320;;
3321;; [vqdmlahq_n_s])
3322;;
3323(define_insn "mve_vqdmlahq_n_<supf><mode>"
3324  [
3325   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3326          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3327                           (match_operand:MVE_2 2 "s_register_operand" "w")
3328                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3329           VQDMLAHQ_N))
3330  ]
3331  "TARGET_HAVE_MVE"
3332  "vqdmlah.s%#<V_sz_elem>\t%q0, %q2, %3"
3333  [(set_attr "type" "mve_move")
3334])
3335
3336;;
3337;; [vqdmlashq_n_s])
3338;;
3339(define_insn "mve_vqdmlashq_n_<supf><mode>"
3340  [
3341   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3342          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3343                           (match_operand:MVE_2 2 "s_register_operand" "w")
3344                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3345           VQDMLASHQ_N))
3346  ]
3347  "TARGET_HAVE_MVE"
3348  "vqdmlash.s%#<V_sz_elem>\t%q0, %q2, %3"
3349  [(set_attr "type" "mve_move")
3350])
3351
3352;;
3353;; [vqnegq_m_s])
3354;;
3355(define_insn "mve_vqnegq_m_s<mode>"
3356  [
3357   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3358          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3359                           (match_operand:MVE_2 2 "s_register_operand" "w")
3360                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3361           VQNEGQ_M_S))
3362  ]
3363  "TARGET_HAVE_MVE"
3364  "vpst\;vqnegt.s%#<V_sz_elem>          %q0, %q2"
3365  [(set_attr "type" "mve_move")
3366   (set_attr "length""8")])
3367
3368;;
3369;; [vqrdmladhq_s])
3370;;
3371(define_insn "mve_vqrdmladhq_s<mode>"
3372  [
3373   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3374          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3375                           (match_operand:MVE_2 2 "s_register_operand" "w")
3376                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3377           VQRDMLADHQ_S))
3378  ]
3379  "TARGET_HAVE_MVE"
3380  "vqrdmladh.s%#<V_sz_elem>\t%q0, %q2, %q3"
3381  [(set_attr "type" "mve_move")
3382])
3383
3384;;
3385;; [vqrdmladhxq_s])
3386;;
3387(define_insn "mve_vqrdmladhxq_s<mode>"
3388  [
3389   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3390          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3391                           (match_operand:MVE_2 2 "s_register_operand" "w")
3392                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3393           VQRDMLADHXQ_S))
3394  ]
3395  "TARGET_HAVE_MVE"
3396  "vqrdmladhx.s%#<V_sz_elem>\t%q0, %q2, %q3"
3397  [(set_attr "type" "mve_move")
3398])
3399
3400;;
3401;; [vqrdmlahq_n_s])
3402;;
3403(define_insn "mve_vqrdmlahq_n_<supf><mode>"
3404  [
3405   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3406          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3407                           (match_operand:MVE_2 2 "s_register_operand" "w")
3408                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3409           VQRDMLAHQ_N))
3410  ]
3411  "TARGET_HAVE_MVE"
3412  "vqrdmlah.s%#<V_sz_elem>\t%q0, %q2, %3"
3413  [(set_attr "type" "mve_move")
3414])
3415
3416;;
3417;; [vqrdmlashq_n_s])
3418;;
3419(define_insn "mve_vqrdmlashq_n_<supf><mode>"
3420  [
3421   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3422          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3423                           (match_operand:MVE_2 2 "s_register_operand" "w")
3424                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
3425           VQRDMLASHQ_N))
3426  ]
3427  "TARGET_HAVE_MVE"
3428  "vqrdmlash.s%#<V_sz_elem>\t%q0, %q2, %3"
3429  [(set_attr "type" "mve_move")
3430])
3431
3432;;
3433;; [vqrdmlsdhq_s])
3434;;
3435(define_insn "mve_vqrdmlsdhq_s<mode>"
3436  [
3437   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3438          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3439                           (match_operand:MVE_2 2 "s_register_operand" "w")
3440                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3441           VQRDMLSDHQ_S))
3442  ]
3443  "TARGET_HAVE_MVE"
3444  "vqrdmlsdh.s%#<V_sz_elem>\t%q0, %q2, %q3"
3445  [(set_attr "type" "mve_move")
3446])
3447
3448;;
3449;; [vqrdmlsdhxq_s])
3450;;
3451(define_insn "mve_vqrdmlsdhxq_s<mode>"
3452  [
3453   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3454          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3455                           (match_operand:MVE_2 2 "s_register_operand" "w")
3456                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3457           VQRDMLSDHXQ_S))
3458  ]
3459  "TARGET_HAVE_MVE"
3460  "vqrdmlsdhx.s%#<V_sz_elem>\t%q0, %q2, %q3"
3461  [(set_attr "type" "mve_move")
3462])
3463
3464;;
3465;; [vqrshlq_m_n_s, vqrshlq_m_n_u])
3466;;
3467(define_insn "mve_vqrshlq_m_n_<supf><mode>"
3468  [
3469   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3470          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3471                           (match_operand:SI 2 "s_register_operand" "r")
3472                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3473           VQRSHLQ_M_N))
3474  ]
3475  "TARGET_HAVE_MVE"
3476  "vpst\;vqrshlt.<supf>%#<V_sz_elem>    %q0, %2"
3477  [(set_attr "type" "mve_move")
3478   (set_attr "length""8")])
3479
3480;;
3481;; [vqshlq_m_r_u, vqshlq_m_r_s])
3482;;
3483(define_insn "mve_vqshlq_m_r_<supf><mode>"
3484  [
3485   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3486          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3487                           (match_operand:SI 2 "s_register_operand" "r")
3488                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3489           VQSHLQ_M_R))
3490  ]
3491  "TARGET_HAVE_MVE"
3492  "vpst\;vqshlt.<supf>%#<V_sz_elem>\t%q0, %2"
3493  [(set_attr "type" "mve_move")
3494   (set_attr "length""8")])
3495
3496;;
3497;; [vrev64q_m_u, vrev64q_m_s])
3498;;
3499(define_insn "mve_vrev64q_m_<supf><mode>"
3500  [
3501   (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
3502          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3503                           (match_operand:MVE_2 2 "s_register_operand" "w")
3504                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3505           VREV64Q_M))
3506  ]
3507  "TARGET_HAVE_MVE"
3508  "vpst\;vrev64t.%#<V_sz_elem>\t%q0, %q2"
3509  [(set_attr "type" "mve_move")
3510   (set_attr "length""8")])
3511
3512;;
3513;; [vrshlq_m_n_s, vrshlq_m_n_u])
3514;;
3515(define_insn "mve_vrshlq_m_n_<supf><mode>"
3516  [
3517   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3518          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3519                           (match_operand:SI 2 "s_register_operand" "r")
3520                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3521           VRSHLQ_M_N))
3522  ]
3523  "TARGET_HAVE_MVE"
3524  "vpst\;vrshlt.<supf>%#<V_sz_elem>\t%q0, %2"
3525  [(set_attr "type" "mve_move")
3526   (set_attr "length""8")])
3527
3528;;
3529;; [vshlq_m_r_u, vshlq_m_r_s])
3530;;
3531(define_insn "mve_vshlq_m_r_<supf><mode>"
3532  [
3533   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3534          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3535                           (match_operand:SI 2 "s_register_operand" "r")
3536                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3537           VSHLQ_M_R))
3538  ]
3539  "TARGET_HAVE_MVE"
3540  "vpst\;vshlt.<supf>%#<V_sz_elem>\t%q0, %2"
3541  [(set_attr "type" "mve_move")
3542   (set_attr "length""8")])
3543
3544;;
3545;; [vsliq_n_u, vsliq_n_s])
3546;;
3547(define_insn "mve_vsliq_n_<supf><mode>"
3548  [
3549   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3550          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3551                           (match_operand:MVE_2 2 "s_register_operand" "w")
3552                           (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")]
3553           VSLIQ_N))
3554  ]
3555  "TARGET_HAVE_MVE"
3556  "vsli.%#<V_sz_elem>\t%q0, %q2, %3"
3557  [(set_attr "type" "mve_move")
3558])
3559
3560;;
3561;; [vsriq_n_u, vsriq_n_s])
3562;;
3563(define_insn "mve_vsriq_n_<supf><mode>"
3564  [
3565   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3566          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3567                           (match_operand:MVE_2 2 "s_register_operand" "w")
3568                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")]
3569           VSRIQ_N))
3570  ]
3571  "TARGET_HAVE_MVE"
3572  "vsri.%#<V_sz_elem>\t%q0, %q2, %3"
3573  [(set_attr "type" "mve_move")
3574])
3575
3576;;
3577;; [vqdmlsdhxq_s])
3578;;
3579(define_insn "mve_vqdmlsdhxq_s<mode>"
3580  [
3581   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3582          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3583                           (match_operand:MVE_2 2 "s_register_operand" "w")
3584                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3585           VQDMLSDHXQ_S))
3586  ]
3587  "TARGET_HAVE_MVE"
3588  "vqdmlsdhx.s%#<V_sz_elem>\t%q0, %q2, %q3"
3589  [(set_attr "type" "mve_move")
3590])
3591
3592;;
3593;; [vqdmlsdhq_s])
3594;;
3595(define_insn "mve_vqdmlsdhq_s<mode>"
3596  [
3597   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3598          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3599                           (match_operand:MVE_2 2 "s_register_operand" "w")
3600                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3601           VQDMLSDHQ_S))
3602  ]
3603  "TARGET_HAVE_MVE"
3604  "vqdmlsdh.s%#<V_sz_elem>\t%q0, %q2, %q3"
3605  [(set_attr "type" "mve_move")
3606])
3607
3608;;
3609;; [vqdmladhxq_s])
3610;;
3611(define_insn "mve_vqdmladhxq_s<mode>"
3612  [
3613   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3614          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3615                           (match_operand:MVE_2 2 "s_register_operand" "w")
3616                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3617           VQDMLADHXQ_S))
3618  ]
3619  "TARGET_HAVE_MVE"
3620  "vqdmladhx.s%#<V_sz_elem>\t%q0, %q2, %q3"
3621  [(set_attr "type" "mve_move")
3622])
3623
3624;;
3625;; [vqdmladhq_s])
3626;;
3627(define_insn "mve_vqdmladhq_s<mode>"
3628  [
3629   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3630          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3631                           (match_operand:MVE_2 2 "s_register_operand" "w")
3632                           (match_operand:MVE_2 3 "s_register_operand" "w")]
3633           VQDMLADHQ_S))
3634  ]
3635  "TARGET_HAVE_MVE"
3636  "vqdmladh.s%#<V_sz_elem>\t%q0, %q2, %q3"
3637  [(set_attr "type" "mve_move")
3638])
3639
3640;;
3641;; [vmlsdavaxq_s])
3642;;
3643(define_insn "mve_vmlsdavaxq_s<mode>"
3644  [
3645   (set (match_operand:SI 0 "s_register_operand" "=Te")
3646          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
3647                        (match_operand:MVE_2 2 "s_register_operand" "w")
3648                        (match_operand:MVE_2 3 "s_register_operand" "w")]
3649           VMLSDAVAXQ_S))
3650  ]
3651  "TARGET_HAVE_MVE"
3652  "vmlsdavax.s%#<V_sz_elem>\t%0, %q2, %q3"
3653  [(set_attr "type" "mve_move")
3654])
3655
3656;;
3657;; [vmlsdavaq_s])
3658;;
3659(define_insn "mve_vmlsdavaq_s<mode>"
3660  [
3661   (set (match_operand:SI 0 "s_register_operand" "=Te")
3662          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
3663                        (match_operand:MVE_2 2 "s_register_operand" "w")
3664                        (match_operand:MVE_2 3 "s_register_operand" "w")]
3665           VMLSDAVAQ_S))
3666  ]
3667  "TARGET_HAVE_MVE"
3668  "vmlsdava.s%#<V_sz_elem>\t%0, %q2, %q3"
3669  [(set_attr "type" "mve_move")
3670])
3671
3672;;
3673;; [vmladavaxq_s])
3674;;
3675(define_insn "mve_vmladavaxq_s<mode>"
3676  [
3677   (set (match_operand:SI 0 "s_register_operand" "=Te")
3678          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
3679                        (match_operand:MVE_2 2 "s_register_operand" "w")
3680                        (match_operand:MVE_2 3 "s_register_operand" "w")]
3681           VMLADAVAXQ_S))
3682  ]
3683  "TARGET_HAVE_MVE"
3684  "vmladavax.s%#<V_sz_elem>\t%0, %q2, %q3"
3685  [(set_attr "type" "mve_move")
3686])
3687;;
3688;; [vabsq_m_f])
3689;;
3690(define_insn "mve_vabsq_m_f<mode>"
3691  [
3692   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3693          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3694                           (match_operand:MVE_0 2 "s_register_operand" "w")
3695                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3696           VABSQ_M_F))
3697  ]
3698  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3699  "vpst\;vabst.f%#<V_sz_elem> %q0, %q2"
3700  [(set_attr "type" "mve_move")
3701   (set_attr "length""8")])
3702
3703;;
3704;; [vaddlvaq_p_s vaddlvaq_p_u])
3705;;
3706(define_insn "mve_vaddlvaq_p_<supf>v4si"
3707  [
3708   (set (match_operand:DI 0 "s_register_operand" "=r")
3709          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3710                           (match_operand:V4SI 2 "s_register_operand" "w")
3711                           (match_operand:V4BI 3 "vpr_register_operand" "Up")]
3712           VADDLVAQ_P))
3713  ]
3714  "TARGET_HAVE_MVE"
3715  "vpst\;vaddlvat.<supf>32\t%Q0, %R0, %q2"
3716  [(set_attr "type" "mve_move")
3717   (set_attr "length""8")])
3718;;
3719;; [vcmlaq, vcmlaq_rot90, vcmlaq_rot180, vcmlaq_rot270])
3720;;
3721(define_insn "mve_vcmlaq<mve_rot><mode>"
3722  [
3723   (set (match_operand:MVE_0 0 "s_register_operand" "=w,w")
3724          (plus:MVE_0 (match_operand:MVE_0 1 "reg_or_zero_operand" "Dz,0")
3725                        (unspec:MVE_0
3726                            [(match_operand:MVE_0 2 "s_register_operand" "w,w")
3727                             (match_operand:MVE_0 3 "s_register_operand" "w,w")]
3728                         VCMLA)))
3729  ]
3730  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3731  "@
3732   vcmul.f%#<V_sz_elem>       %q0, %q2, %q3, #<rot>
3733   vcmla.f%#<V_sz_elem>       %q0, %q2, %q3, #<rot>"
3734  [(set_attr "type" "mve_move")
3735])
3736
3737;;
3738;; [vcmpeqq_m_n_f])
3739;;
3740(define_insn "mve_vcmpeqq_m_n_f<mode>"
3741  [
3742   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3743          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3744                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3745                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3746           VCMPEQQ_M_N_F))
3747  ]
3748  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3749  "vpst\;vcmpt.f%#<V_sz_elem> eq, %q1, %2"
3750  [(set_attr "type" "mve_move")
3751   (set_attr "length""8")])
3752
3753;;
3754;; [vcmpgeq_m_f])
3755;;
3756(define_insn "mve_vcmpgeq_m_f<mode>"
3757  [
3758   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3759          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3760                           (match_operand:MVE_0 2 "s_register_operand" "w")
3761                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3762           VCMPGEQ_M_F))
3763  ]
3764  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3765  "vpst\;vcmpt.f%#<V_sz_elem> ge, %q1, %q2"
3766  [(set_attr "type" "mve_move")
3767   (set_attr "length""8")])
3768
3769;;
3770;; [vcmpgeq_m_n_f])
3771;;
3772(define_insn "mve_vcmpgeq_m_n_f<mode>"
3773  [
3774   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3775          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3776                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3777                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3778           VCMPGEQ_M_N_F))
3779  ]
3780  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3781  "vpst\;vcmpt.f%#<V_sz_elem> ge, %q1, %2"
3782  [(set_attr "type" "mve_move")
3783   (set_attr "length""8")])
3784
3785;;
3786;; [vcmpgtq_m_f])
3787;;
3788(define_insn "mve_vcmpgtq_m_f<mode>"
3789  [
3790   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3791          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3792                           (match_operand:MVE_0 2 "s_register_operand" "w")
3793                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3794           VCMPGTQ_M_F))
3795  ]
3796  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3797  "vpst\;vcmpt.f%#<V_sz_elem> gt, %q1, %q2"
3798  [(set_attr "type" "mve_move")
3799   (set_attr "length""8")])
3800
3801;;
3802;; [vcmpgtq_m_n_f])
3803;;
3804(define_insn "mve_vcmpgtq_m_n_f<mode>"
3805  [
3806   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3807          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3808                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3809                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3810           VCMPGTQ_M_N_F))
3811  ]
3812  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3813  "vpst\;vcmpt.f%#<V_sz_elem> gt, %q1, %2"
3814  [(set_attr "type" "mve_move")
3815   (set_attr "length""8")])
3816
3817;;
3818;; [vcmpleq_m_f])
3819;;
3820(define_insn "mve_vcmpleq_m_f<mode>"
3821  [
3822   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3823          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3824                           (match_operand:MVE_0 2 "s_register_operand" "w")
3825                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3826           VCMPLEQ_M_F))
3827  ]
3828  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3829  "vpst\;vcmpt.f%#<V_sz_elem> le, %q1, %q2"
3830  [(set_attr "type" "mve_move")
3831   (set_attr "length""8")])
3832
3833;;
3834;; [vcmpleq_m_n_f])
3835;;
3836(define_insn "mve_vcmpleq_m_n_f<mode>"
3837  [
3838   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3839          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3840                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3841                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3842           VCMPLEQ_M_N_F))
3843  ]
3844  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3845  "vpst\;vcmpt.f%#<V_sz_elem> le, %q1, %2"
3846  [(set_attr "type" "mve_move")
3847   (set_attr "length""8")])
3848
3849;;
3850;; [vcmpltq_m_f])
3851;;
3852(define_insn "mve_vcmpltq_m_f<mode>"
3853  [
3854   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3855          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3856                           (match_operand:MVE_0 2 "s_register_operand" "w")
3857                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3858           VCMPLTQ_M_F))
3859  ]
3860  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3861  "vpst\;vcmpt.f%#<V_sz_elem> lt, %q1, %q2"
3862  [(set_attr "type" "mve_move")
3863   (set_attr "length""8")])
3864
3865;;
3866;; [vcmpltq_m_n_f])
3867;;
3868(define_insn "mve_vcmpltq_m_n_f<mode>"
3869  [
3870   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3871          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3872                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3873                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3874           VCMPLTQ_M_N_F))
3875  ]
3876  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3877  "vpst\;vcmpt.f%#<V_sz_elem> lt, %q1, %2"
3878  [(set_attr "type" "mve_move")
3879   (set_attr "length""8")])
3880
3881;;
3882;; [vcmpneq_m_f])
3883;;
3884(define_insn "mve_vcmpneq_m_f<mode>"
3885  [
3886   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3887          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3888                           (match_operand:MVE_0 2 "s_register_operand" "w")
3889                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3890           VCMPNEQ_M_F))
3891  ]
3892  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3893  "vpst\;vcmpt.f%#<V_sz_elem> ne, %q1, %q2"
3894  [(set_attr "type" "mve_move")
3895   (set_attr "length""8")])
3896
3897;;
3898;; [vcmpneq_m_n_f])
3899;;
3900(define_insn "mve_vcmpneq_m_n_f<mode>"
3901  [
3902   (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
3903          (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
3904                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3905                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3906           VCMPNEQ_M_N_F))
3907  ]
3908  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3909  "vpst\;vcmpt.f%#<V_sz_elem> ne, %q1, %2"
3910  [(set_attr "type" "mve_move")
3911   (set_attr "length""8")])
3912
3913;;
3914;; [vcvtbq_m_f16_f32])
3915;;
3916(define_insn "mve_vcvtbq_m_f16_f32v8hf"
3917  [
3918   (set (match_operand:V8HF 0 "s_register_operand" "=w")
3919          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
3920                           (match_operand:V4SF 2 "s_register_operand" "w")
3921                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3922           VCVTBQ_M_F16_F32))
3923  ]
3924  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3925  "vpst\;vcvtbt.f16.f32\t%q0, %q2"
3926  [(set_attr "type" "mve_move")
3927   (set_attr "length""8")])
3928
3929;;
3930;; [vcvtbq_m_f32_f16])
3931;;
3932(define_insn "mve_vcvtbq_m_f32_f16v4sf"
3933  [
3934   (set (match_operand:V4SF 0 "s_register_operand" "=w")
3935          (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
3936                           (match_operand:V8HF 2 "s_register_operand" "w")
3937                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3938           VCVTBQ_M_F32_F16))
3939  ]
3940  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3941  "vpst\;vcvtbt.f32.f16\t%q0, %q2"
3942  [(set_attr "type" "mve_move")
3943   (set_attr "length""8")])
3944
3945;;
3946;; [vcvttq_m_f16_f32])
3947;;
3948(define_insn "mve_vcvttq_m_f16_f32v8hf"
3949  [
3950   (set (match_operand:V8HF 0 "s_register_operand" "=w")
3951          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
3952                           (match_operand:V4SF 2 "s_register_operand" "w")
3953                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3954           VCVTTQ_M_F16_F32))
3955  ]
3956  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3957  "vpst\;vcvttt.f16.f32\t%q0, %q2"
3958  [(set_attr "type" "mve_move")
3959   (set_attr "length""8")])
3960
3961;;
3962;; [vcvttq_m_f32_f16])
3963;;
3964(define_insn "mve_vcvttq_m_f32_f16v4sf"
3965  [
3966   (set (match_operand:V4SF 0 "s_register_operand" "=w")
3967          (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
3968                           (match_operand:V8HF 2 "s_register_operand" "w")
3969                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3970           VCVTTQ_M_F32_F16))
3971  ]
3972  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3973  "vpst\;vcvttt.f32.f16\t%q0, %q2"
3974  [(set_attr "type" "mve_move")
3975   (set_attr "length""8")])
3976
3977;;
3978;; [vdupq_m_n_f])
3979;;
3980(define_insn "mve_vdupq_m_n_f<mode>"
3981  [
3982   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3983          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3984                           (match_operand:<V_elem> 2 "s_register_operand" "r")
3985                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3986           VDUPQ_M_N_F))
3987  ]
3988  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3989  "vpst\;vdupt.%#<V_sz_elem>\t%q0, %2"
3990  [(set_attr "type" "mve_move")
3991   (set_attr "length""8")])
3992
3993;;
3994;; [vfmaq_f])
3995;;
3996(define_insn "mve_vfmaq_f<mode>"
3997  [
3998   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3999          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4000                           (match_operand:MVE_0 2 "s_register_operand" "w")
4001                           (match_operand:MVE_0 3 "s_register_operand" "w")]
4002           VFMAQ_F))
4003  ]
4004  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4005  "vfma.f%#<V_sz_elem>        %q0, %q2, %q3"
4006  [(set_attr "type" "mve_move")
4007])
4008
4009;;
4010;; [vfmaq_n_f])
4011;;
4012(define_insn "mve_vfmaq_n_f<mode>"
4013  [
4014   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4015          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4016                           (match_operand:MVE_0 2 "s_register_operand" "w")
4017                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
4018           VFMAQ_N_F))
4019  ]
4020  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4021  "vfma.f%#<V_sz_elem>        %q0, %q2, %3"
4022  [(set_attr "type" "mve_move")
4023])
4024
4025;;
4026;; [vfmasq_n_f])
4027;;
4028(define_insn "mve_vfmasq_n_f<mode>"
4029  [
4030   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4031          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4032                           (match_operand:MVE_0 2 "s_register_operand" "w")
4033                           (match_operand:<V_elem> 3 "s_register_operand" "r")]
4034           VFMASQ_N_F))
4035  ]
4036  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4037  "vfmas.f%#<V_sz_elem>       %q0, %q2, %3"
4038  [(set_attr "type" "mve_move")
4039])
4040;;
4041;; [vfmsq_f])
4042;;
4043(define_insn "mve_vfmsq_f<mode>"
4044  [
4045   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4046          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4047                           (match_operand:MVE_0 2 "s_register_operand" "w")
4048                           (match_operand:MVE_0 3 "s_register_operand" "w")]
4049           VFMSQ_F))
4050  ]
4051  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4052  "vfms.f%#<V_sz_elem>        %q0, %q2, %q3"
4053  [(set_attr "type" "mve_move")
4054])
4055
4056;;
4057;; [vmaxnmaq_m_f])
4058;;
4059(define_insn "mve_vmaxnmaq_m_f<mode>"
4060  [
4061   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4062          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4063                           (match_operand:MVE_0 2 "s_register_operand" "w")
4064                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4065           VMAXNMAQ_M_F))
4066  ]
4067  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4068  "vpst\;vmaxnmat.f%#<V_sz_elem>        %q0, %q2"
4069  [(set_attr "type" "mve_move")
4070   (set_attr "length""8")])
4071;;
4072;; [vmaxnmavq_p_f])
4073;;
4074(define_insn "mve_vmaxnmavq_p_f<mode>"
4075  [
4076   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
4077          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
4078                           (match_operand:MVE_0 2 "s_register_operand" "w")
4079                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4080           VMAXNMAVQ_P_F))
4081  ]
4082  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4083  "vpst\;vmaxnmavt.f%#<V_sz_elem>       %0, %q2"
4084  [(set_attr "type" "mve_move")
4085   (set_attr "length""8")])
4086
4087;;
4088;; [vmaxnmvq_p_f])
4089;;
4090(define_insn "mve_vmaxnmvq_p_f<mode>"
4091  [
4092   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
4093          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
4094                           (match_operand:MVE_0 2 "s_register_operand" "w")
4095                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4096           VMAXNMVQ_P_F))
4097  ]
4098  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4099  "vpst\;vmaxnmvt.f%#<V_sz_elem>        %0, %q2"
4100  [(set_attr "type" "mve_move")
4101   (set_attr "length""8")])
4102;;
4103;; [vminnmaq_m_f])
4104;;
4105(define_insn "mve_vminnmaq_m_f<mode>"
4106  [
4107   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4108          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4109                           (match_operand:MVE_0 2 "s_register_operand" "w")
4110                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4111           VMINNMAQ_M_F))
4112  ]
4113  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4114  "vpst\;vminnmat.f%#<V_sz_elem>        %q0, %q2"
4115  [(set_attr "type" "mve_move")
4116   (set_attr "length""8")])
4117
4118;;
4119;; [vminnmavq_p_f])
4120;;
4121(define_insn "mve_vminnmavq_p_f<mode>"
4122  [
4123   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
4124          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
4125                           (match_operand:MVE_0 2 "s_register_operand" "w")
4126                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4127           VMINNMAVQ_P_F))
4128  ]
4129  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4130  "vpst\;vminnmavt.f%#<V_sz_elem>       %0, %q2"
4131  [(set_attr "type" "mve_move")
4132   (set_attr "length""8")])
4133;;
4134;; [vminnmvq_p_f])
4135;;
4136(define_insn "mve_vminnmvq_p_f<mode>"
4137  [
4138   (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
4139          (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
4140                           (match_operand:MVE_0 2 "s_register_operand" "w")
4141                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4142           VMINNMVQ_P_F))
4143  ]
4144  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4145  "vpst\;vminnmvt.f%#<V_sz_elem>        %0, %q2"
4146  [(set_attr "type" "mve_move")
4147   (set_attr "length""8")])
4148
4149;;
4150;; [vmlaldavaq_s, vmlaldavaq_u])
4151;;
4152(define_insn "mve_vmlaldavaq_<supf><mode>"
4153  [
4154   (set (match_operand:DI 0 "s_register_operand" "=r")
4155          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4156                           (match_operand:MVE_5 2 "s_register_operand" "w")
4157                           (match_operand:MVE_5 3 "s_register_operand" "w")]
4158           VMLALDAVAQ))
4159  ]
4160  "TARGET_HAVE_MVE"
4161  "vmlaldava.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
4162  [(set_attr "type" "mve_move")
4163])
4164
4165;;
4166;; [vmlaldavaxq_s])
4167;;
4168(define_insn "mve_vmlaldavaxq_s<mode>"
4169  [
4170   (set (match_operand:DI 0 "s_register_operand" "=r")
4171          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4172                           (match_operand:MVE_5 2 "s_register_operand" "w")
4173                           (match_operand:MVE_5 3 "s_register_operand" "w")]
4174           VMLALDAVAXQ_S))
4175  ]
4176  "TARGET_HAVE_MVE"
4177  "vmlaldavax.s%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
4178  [(set_attr "type" "mve_move")
4179])
4180
4181;;
4182;; [vmlaldavq_p_u, vmlaldavq_p_s])
4183;;
4184(define_insn "mve_vmlaldavq_p_<supf><mode>"
4185  [
4186   (set (match_operand:DI 0 "s_register_operand" "=r")
4187          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
4188                           (match_operand:MVE_5 2 "s_register_operand" "w")
4189                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4190           VMLALDAVQ_P))
4191  ]
4192  "TARGET_HAVE_MVE"
4193  "vpst\;vmlaldavt.<supf>%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
4194  [(set_attr "type" "mve_move")
4195   (set_attr "length""8")])
4196
4197;;
4198;; [vmlaldavxq_p_s])
4199;;
4200(define_insn "mve_vmlaldavxq_p_s<mode>"
4201  [
4202   (set (match_operand:DI 0 "s_register_operand" "=r")
4203          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
4204                           (match_operand:MVE_5 2 "s_register_operand" "w")
4205                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4206           VMLALDAVXQ_P_S))
4207  ]
4208  "TARGET_HAVE_MVE"
4209  "vpst\;vmlaldavxt.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
4210  [(set_attr "type" "mve_move")
4211   (set_attr "length""8")])
4212;;
4213;; [vmlsldavaq_s])
4214;;
4215(define_insn "mve_vmlsldavaq_s<mode>"
4216  [
4217   (set (match_operand:DI 0 "s_register_operand" "=r")
4218          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4219                           (match_operand:MVE_5 2 "s_register_operand" "w")
4220                           (match_operand:MVE_5 3 "s_register_operand" "w")]
4221           VMLSLDAVAQ_S))
4222  ]
4223  "TARGET_HAVE_MVE"
4224  "vmlsldava.s%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
4225  [(set_attr "type" "mve_move")
4226])
4227
4228;;
4229;; [vmlsldavaxq_s])
4230;;
4231(define_insn "mve_vmlsldavaxq_s<mode>"
4232  [
4233   (set (match_operand:DI 0 "s_register_operand" "=r")
4234          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4235                           (match_operand:MVE_5 2 "s_register_operand" "w")
4236                           (match_operand:MVE_5 3 "s_register_operand" "w")]
4237           VMLSLDAVAXQ_S))
4238  ]
4239  "TARGET_HAVE_MVE"
4240  "vmlsldavax.s%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
4241  [(set_attr "type" "mve_move")
4242])
4243
4244;;
4245;; [vmlsldavq_p_s])
4246;;
4247(define_insn "mve_vmlsldavq_p_s<mode>"
4248  [
4249   (set (match_operand:DI 0 "s_register_operand" "=r")
4250          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
4251                           (match_operand:MVE_5 2 "s_register_operand" "w")
4252                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4253           VMLSLDAVQ_P_S))
4254  ]
4255  "TARGET_HAVE_MVE"
4256  "vpst\;vmlsldavt.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
4257  [(set_attr "type" "mve_move")
4258   (set_attr "length""8")])
4259
4260;;
4261;; [vmlsldavxq_p_s])
4262;;
4263(define_insn "mve_vmlsldavxq_p_s<mode>"
4264  [
4265   (set (match_operand:DI 0 "s_register_operand" "=r")
4266          (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
4267                           (match_operand:MVE_5 2 "s_register_operand" "w")
4268                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4269           VMLSLDAVXQ_P_S))
4270  ]
4271  "TARGET_HAVE_MVE"
4272  "vpst\;vmlsldavxt.s%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
4273  [(set_attr "type" "mve_move")
4274   (set_attr "length""8")])
4275;;
4276;; [vmovlbq_m_u, vmovlbq_m_s])
4277;;
4278(define_insn "mve_vmovlbq_m_<supf><mode>"
4279  [
4280   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
4281          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
4282                           (match_operand:MVE_3 2 "s_register_operand" "w")
4283                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4284           VMOVLBQ_M))
4285  ]
4286  "TARGET_HAVE_MVE"
4287  "vpst\;vmovlbt.<supf>%#<V_sz_elem>    %q0, %q2"
4288  [(set_attr "type" "mve_move")
4289   (set_attr "length""8")])
4290;;
4291;; [vmovltq_m_u, vmovltq_m_s])
4292;;
4293(define_insn "mve_vmovltq_m_<supf><mode>"
4294  [
4295   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
4296          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
4297                           (match_operand:MVE_3 2 "s_register_operand" "w")
4298                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4299           VMOVLTQ_M))
4300  ]
4301  "TARGET_HAVE_MVE"
4302  "vpst\;vmovltt.<supf>%#<V_sz_elem>    %q0, %q2"
4303  [(set_attr "type" "mve_move")
4304   (set_attr "length""8")])
4305;;
4306;; [vmovnbq_m_u, vmovnbq_m_s])
4307;;
4308(define_insn "mve_vmovnbq_m_<supf><mode>"
4309  [
4310   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4311          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4312                           (match_operand:MVE_5 2 "s_register_operand" "w")
4313                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4314           VMOVNBQ_M))
4315  ]
4316  "TARGET_HAVE_MVE"
4317  "vpst\;vmovnbt.i%#<V_sz_elem>         %q0, %q2"
4318  [(set_attr "type" "mve_move")
4319   (set_attr "length""8")])
4320
4321;;
4322;; [vmovntq_m_u, vmovntq_m_s])
4323;;
4324(define_insn "mve_vmovntq_m_<supf><mode>"
4325  [
4326   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4327          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4328                           (match_operand:MVE_5 2 "s_register_operand" "w")
4329                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4330           VMOVNTQ_M))
4331  ]
4332  "TARGET_HAVE_MVE"
4333  "vpst\;vmovntt.i%#<V_sz_elem>         %q0, %q2"
4334  [(set_attr "type" "mve_move")
4335   (set_attr "length""8")])
4336
4337;;
4338;; [vmvnq_m_n_u, vmvnq_m_n_s])
4339;;
4340(define_insn "mve_vmvnq_m_n_<supf><mode>"
4341  [
4342   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4343          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4344                           (match_operand:SI 2 "immediate_operand" "i")
4345                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4346           VMVNQ_M_N))
4347  ]
4348  "TARGET_HAVE_MVE"
4349  "vpst\;vmvnt.i%#<V_sz_elem>\t%q0, %2"
4350  [(set_attr "type" "mve_move")
4351   (set_attr "length""8")])
4352;;
4353;; [vnegq_m_f])
4354;;
4355(define_insn "mve_vnegq_m_f<mode>"
4356  [
4357   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4358          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4359                           (match_operand:MVE_0 2 "s_register_operand" "w")
4360                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4361           VNEGQ_M_F))
4362  ]
4363  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4364  "vpst\;vnegt.f%#<V_sz_elem> %q0, %q2"
4365  [(set_attr "type" "mve_move")
4366   (set_attr "length""8")])
4367
4368;;
4369;; [vorrq_m_n_s, vorrq_m_n_u])
4370;;
4371(define_insn "mve_vorrq_m_n_<supf><mode>"
4372  [
4373   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4374          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4375                           (match_operand:SI 2 "immediate_operand" "i")
4376                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4377           VORRQ_M_N))
4378  ]
4379  "TARGET_HAVE_MVE"
4380  "vpst\;vorrt.i%#<V_sz_elem>\t%q0, %2"
4381  [(set_attr "type" "mve_move")
4382   (set_attr "length""8")])
4383;;
4384;; [vpselq_f])
4385;;
4386(define_insn "@mve_vpselq_f<mode>"
4387  [
4388   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4389          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
4390                           (match_operand:MVE_0 2 "s_register_operand" "w")
4391                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4392           VPSELQ_F))
4393  ]
4394  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4395  "vpsel\t%q0, %q1, %q2"
4396  [(set_attr "type" "mve_move")
4397])
4398
4399;;
4400;; [vqmovnbq_m_s, vqmovnbq_m_u])
4401;;
4402(define_insn "mve_vqmovnbq_m_<supf><mode>"
4403  [
4404   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4405          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4406                           (match_operand:MVE_5 2 "s_register_operand" "w")
4407                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4408           VQMOVNBQ_M))
4409  ]
4410  "TARGET_HAVE_MVE"
4411  "vpst\;vqmovnbt.<supf>%#<V_sz_elem>   %q0, %q2"
4412  [(set_attr "type" "mve_move")
4413   (set_attr "length""8")])
4414
4415;;
4416;; [vqmovntq_m_u, vqmovntq_m_s])
4417;;
4418(define_insn "mve_vqmovntq_m_<supf><mode>"
4419  [
4420   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4421          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4422                           (match_operand:MVE_5 2 "s_register_operand" "w")
4423                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4424           VQMOVNTQ_M))
4425  ]
4426  "TARGET_HAVE_MVE"
4427  "vpst\;vqmovntt.<supf>%#<V_sz_elem>   %q0, %q2"
4428  [(set_attr "type" "mve_move")
4429   (set_attr "length""8")])
4430
4431;;
4432;; [vqmovunbq_m_s])
4433;;
4434(define_insn "mve_vqmovunbq_m_s<mode>"
4435  [
4436   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4437          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4438                           (match_operand:MVE_5 2 "s_register_operand" "w")
4439                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4440           VQMOVUNBQ_M_S))
4441  ]
4442  "TARGET_HAVE_MVE"
4443  "vpst\;vqmovunbt.s%#<V_sz_elem>       %q0, %q2"
4444  [(set_attr "type" "mve_move")
4445   (set_attr "length""8")])
4446
4447;;
4448;; [vqmovuntq_m_s])
4449;;
4450(define_insn "mve_vqmovuntq_m_s<mode>"
4451  [
4452   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4453          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4454                           (match_operand:MVE_5 2 "s_register_operand" "w")
4455                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4456           VQMOVUNTQ_M_S))
4457  ]
4458  "TARGET_HAVE_MVE"
4459  "vpst\;vqmovuntt.s%#<V_sz_elem>       %q0, %q2"
4460  [(set_attr "type" "mve_move")
4461   (set_attr "length""8")])
4462
4463;;
4464;; [vqrshrntq_n_u, vqrshrntq_n_s])
4465;;
4466(define_insn "mve_vqrshrntq_n_<supf><mode>"
4467  [
4468   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4469          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4470                           (match_operand:MVE_5 2 "s_register_operand" "w")
4471                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4472           VQRSHRNTQ_N))
4473  ]
4474  "TARGET_HAVE_MVE"
4475  "vqrshrnt.<supf>%#<V_sz_elem>         %q0, %q2, %3"
4476  [(set_attr "type" "mve_move")
4477])
4478
4479;;
4480;; [vqrshruntq_n_s])
4481;;
4482(define_insn "mve_vqrshruntq_n_s<mode>"
4483  [
4484   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4485          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4486                           (match_operand:MVE_5 2 "s_register_operand" "w")
4487                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4488           VQRSHRUNTQ_N_S))
4489  ]
4490  "TARGET_HAVE_MVE"
4491  "vqrshrunt.s%#<V_sz_elem>   %q0, %q2, %3"
4492  [(set_attr "type" "mve_move")
4493])
4494
4495;;
4496;; [vqshrnbq_n_u, vqshrnbq_n_s])
4497;;
4498(define_insn "mve_vqshrnbq_n_<supf><mode>"
4499  [
4500   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4501          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4502                           (match_operand:MVE_5 2 "s_register_operand" "w")
4503                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4504           VQSHRNBQ_N))
4505  ]
4506  "TARGET_HAVE_MVE"
4507  "vqshrnb.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
4508  [(set_attr "type" "mve_move")
4509])
4510
4511;;
4512;; [vqshrntq_n_u, vqshrntq_n_s])
4513;;
4514(define_insn "mve_vqshrntq_n_<supf><mode>"
4515  [
4516   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4517          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4518                           (match_operand:MVE_5 2 "s_register_operand" "w")
4519                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4520           VQSHRNTQ_N))
4521  ]
4522  "TARGET_HAVE_MVE"
4523  "vqshrnt.<supf>%#<V_sz_elem>          %q0, %q2, %3"
4524  [(set_attr "type" "mve_move")
4525])
4526
4527;;
4528;; [vqshrunbq_n_s])
4529;;
4530(define_insn "mve_vqshrunbq_n_s<mode>"
4531  [
4532   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4533          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4534                           (match_operand:MVE_5 2 "s_register_operand" "w")
4535                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4536           VQSHRUNBQ_N_S))
4537  ]
4538  "TARGET_HAVE_MVE"
4539  "vqshrunb.s%#<V_sz_elem>    %q0, %q2, %3"
4540  [(set_attr "type" "mve_move")
4541])
4542
4543;;
4544;; [vqshruntq_n_s])
4545;;
4546(define_insn "mve_vqshruntq_n_s<mode>"
4547  [
4548   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4549          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4550                           (match_operand:MVE_5 2 "s_register_operand" "w")
4551                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4552           VQSHRUNTQ_N_S))
4553  ]
4554  "TARGET_HAVE_MVE"
4555  "vqshrunt.s%#<V_sz_elem>    %q0, %q2, %3"
4556  [(set_attr "type" "mve_move")
4557])
4558
4559;;
4560;; [vrev32q_m_f])
4561;;
4562(define_insn "mve_vrev32q_m_fv8hf"
4563  [
4564   (set (match_operand:V8HF 0 "s_register_operand" "=w")
4565          (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
4566                           (match_operand:V8HF 2 "s_register_operand" "w")
4567                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4568           VREV32Q_M_F))
4569  ]
4570  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4571  "vpst\;vrev32t.16\t%q0, %q2"
4572  [(set_attr "type" "mve_move")
4573   (set_attr "length""8")])
4574
4575;;
4576;; [vrev32q_m_s, vrev32q_m_u])
4577;;
4578(define_insn "mve_vrev32q_m_<supf><mode>"
4579  [
4580   (set (match_operand:MVE_3 0 "s_register_operand" "=w")
4581          (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "0")
4582                           (match_operand:MVE_3 2 "s_register_operand" "w")
4583                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4584           VREV32Q_M))
4585  ]
4586  "TARGET_HAVE_MVE"
4587  "vpst\;vrev32t.%#<V_sz_elem>\t%q0, %q2"
4588  [(set_attr "type" "mve_move")
4589   (set_attr "length""8")])
4590
4591;;
4592;; [vrev64q_m_f])
4593;;
4594(define_insn "mve_vrev64q_m_f<mode>"
4595  [
4596   (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
4597          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4598                           (match_operand:MVE_0 2 "s_register_operand" "w")
4599                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4600           VREV64Q_M_F))
4601  ]
4602  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4603  "vpst\;vrev64t.%#<V_sz_elem>\t%q0, %q2"
4604  [(set_attr "type" "mve_move")
4605   (set_attr "length""8")])
4606
4607;;
4608;; [vrmlaldavhaxq_s])
4609;;
4610(define_insn "mve_vrmlaldavhaxq_sv4si"
4611  [
4612   (set (match_operand:DI 0 "s_register_operand" "=r")
4613          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4614                           (match_operand:V4SI 2 "s_register_operand" "w")
4615                           (match_operand:V4SI 3 "s_register_operand" "w")]
4616           VRMLALDAVHAXQ_S))
4617  ]
4618  "TARGET_HAVE_MVE"
4619  "vrmlaldavhax.s32\t%Q0, %R0, %q2, %q3"
4620  [(set_attr "type" "mve_move")
4621])
4622
4623;;
4624;; [vrmlaldavhxq_p_s])
4625;;
4626(define_insn "mve_vrmlaldavhxq_p_sv4si"
4627  [
4628   (set (match_operand:DI 0 "s_register_operand" "=r")
4629          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
4630                           (match_operand:V4SI 2 "s_register_operand" "w")
4631                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4632           VRMLALDAVHXQ_P_S))
4633  ]
4634  "TARGET_HAVE_MVE"
4635  "vpst\;vrmlaldavhxt.s32\t%Q0, %R0, %q1, %q2"
4636  [(set_attr "type" "mve_move")
4637   (set_attr "length""8")])
4638
4639;;
4640;; [vrmlsldavhaxq_s])
4641;;
4642(define_insn "mve_vrmlsldavhaxq_sv4si"
4643  [
4644   (set (match_operand:DI 0 "s_register_operand" "=r")
4645          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4646                           (match_operand:V4SI 2 "s_register_operand" "w")
4647                           (match_operand:V4SI 3 "s_register_operand" "w")]
4648           VRMLSLDAVHAXQ_S))
4649  ]
4650  "TARGET_HAVE_MVE"
4651  "vrmlsldavhax.s32\t%Q0, %R0, %q2, %q3"
4652  [(set_attr "type" "mve_move")
4653])
4654
4655;;
4656;; [vrmlsldavhq_p_s])
4657;;
4658(define_insn "mve_vrmlsldavhq_p_sv4si"
4659  [
4660   (set (match_operand:DI 0 "s_register_operand" "=r")
4661          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
4662                           (match_operand:V4SI 2 "s_register_operand" "w")
4663                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4664           VRMLSLDAVHQ_P_S))
4665  ]
4666  "TARGET_HAVE_MVE"
4667  "vpst\;vrmlsldavht.s32\t%Q0, %R0, %q1, %q2"
4668  [(set_attr "type" "mve_move")
4669   (set_attr "length""8")])
4670
4671;;
4672;; [vrmlsldavhxq_p_s])
4673;;
4674(define_insn "mve_vrmlsldavhxq_p_sv4si"
4675  [
4676   (set (match_operand:DI 0 "s_register_operand" "=r")
4677          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
4678                           (match_operand:V4SI 2 "s_register_operand" "w")
4679                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4680           VRMLSLDAVHXQ_P_S))
4681  ]
4682  "TARGET_HAVE_MVE"
4683  "vpst\;vrmlsldavhxt.s32\t%Q0, %R0, %q1, %q2"
4684  [(set_attr "type" "mve_move")
4685   (set_attr "length""8")])
4686
4687;;
4688;; [vrndaq_m_f])
4689;;
4690(define_insn "mve_vrndaq_m_f<mode>"
4691  [
4692   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4693          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4694                           (match_operand:MVE_0 2 "s_register_operand" "w")
4695                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4696           VRNDAQ_M_F))
4697  ]
4698  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4699  "vpst\;vrintat.f%#<V_sz_elem>         %q0, %q2"
4700  [(set_attr "type" "mve_move")
4701   (set_attr "length""8")])
4702
4703;;
4704;; [vrndmq_m_f])
4705;;
4706(define_insn "mve_vrndmq_m_f<mode>"
4707  [
4708   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4709          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4710                           (match_operand:MVE_0 2 "s_register_operand" "w")
4711                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4712           VRNDMQ_M_F))
4713  ]
4714  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4715  "vpst\;vrintmt.f%#<V_sz_elem>         %q0, %q2"
4716  [(set_attr "type" "mve_move")
4717   (set_attr "length""8")])
4718
4719;;
4720;; [vrndnq_m_f])
4721;;
4722(define_insn "mve_vrndnq_m_f<mode>"
4723  [
4724   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4725          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4726                           (match_operand:MVE_0 2 "s_register_operand" "w")
4727                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4728           VRNDNQ_M_F))
4729  ]
4730  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4731  "vpst\;vrintnt.f%#<V_sz_elem>         %q0, %q2"
4732  [(set_attr "type" "mve_move")
4733   (set_attr "length""8")])
4734
4735;;
4736;; [vrndpq_m_f])
4737;;
4738(define_insn "mve_vrndpq_m_f<mode>"
4739  [
4740   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4741          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4742                           (match_operand:MVE_0 2 "s_register_operand" "w")
4743                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4744           VRNDPQ_M_F))
4745  ]
4746  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4747  "vpst\;vrintpt.f%#<V_sz_elem>         %q0, %q2"
4748  [(set_attr "type" "mve_move")
4749   (set_attr "length""8")])
4750
4751;;
4752;; [vrndxq_m_f])
4753;;
4754(define_insn "mve_vrndxq_m_f<mode>"
4755  [
4756   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
4757          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
4758                           (match_operand:MVE_0 2 "s_register_operand" "w")
4759                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4760           VRNDXQ_M_F))
4761  ]
4762  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4763  "vpst\;vrintxt.f%#<V_sz_elem>         %q0, %q2"
4764  [(set_attr "type" "mve_move")
4765   (set_attr "length""8")])
4766
4767;;
4768;; [vrshrnbq_n_s, vrshrnbq_n_u])
4769;;
4770(define_insn "mve_vrshrnbq_n_<supf><mode>"
4771  [
4772   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4773          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4774                           (match_operand:MVE_5 2 "s_register_operand" "w")
4775                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4776           VRSHRNBQ_N))
4777  ]
4778  "TARGET_HAVE_MVE"
4779  "vrshrnb.i%#<V_sz_elem>     %q0, %q2, %3"
4780  [(set_attr "type" "mve_move")
4781])
4782
4783;;
4784;; [vrshrntq_n_u, vrshrntq_n_s])
4785;;
4786(define_insn "mve_vrshrntq_n_<supf><mode>"
4787  [
4788   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4789          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4790                           (match_operand:MVE_5 2 "s_register_operand" "w")
4791                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4792           VRSHRNTQ_N))
4793  ]
4794  "TARGET_HAVE_MVE"
4795  "vrshrnt.i%#<V_sz_elem>     %q0, %q2, %3"
4796  [(set_attr "type" "mve_move")
4797])
4798
4799;;
4800;; [vshrnbq_n_u, vshrnbq_n_s])
4801;;
4802(define_insn "mve_vshrnbq_n_<supf><mode>"
4803  [
4804   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4805          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4806                           (match_operand:MVE_5 2 "s_register_operand" "w")
4807                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4808           VSHRNBQ_N))
4809  ]
4810  "TARGET_HAVE_MVE"
4811  "vshrnb.i%#<V_sz_elem>      %q0, %q2, %3"
4812  [(set_attr "type" "mve_move")
4813])
4814
4815;;
4816;; [vshrntq_n_s, vshrntq_n_u])
4817;;
4818(define_insn "mve_vshrntq_n_<supf><mode>"
4819  [
4820   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
4821          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
4822                                         (match_operand:MVE_5 2 "s_register_operand" "w")
4823                                         (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
4824           VSHRNTQ_N))
4825  ]
4826  "TARGET_HAVE_MVE"
4827  "vshrnt.i%#<V_sz_elem>\t%q0, %q2, %3"
4828  [(set_attr "type" "mve_move")
4829])
4830
4831;;
4832;; [vcvtmq_m_s, vcvtmq_m_u])
4833;;
4834(define_insn "mve_vcvtmq_m_<supf><mode>"
4835  [
4836   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4837          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4838                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
4839                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4840           VCVTMQ_M))
4841  ]
4842  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4843  "vpst\;vcvtmt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
4844  [(set_attr "type" "mve_move")
4845   (set_attr "length""8")])
4846
4847;;
4848;; [vcvtpq_m_u, vcvtpq_m_s])
4849;;
4850(define_insn "mve_vcvtpq_m_<supf><mode>"
4851  [
4852   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4853          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4854                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
4855                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4856           VCVTPQ_M))
4857  ]
4858  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4859  "vpst\;vcvtpt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
4860  [(set_attr "type" "mve_move")
4861   (set_attr "length""8")])
4862
4863;;
4864;; [vcvtnq_m_s, vcvtnq_m_u])
4865;;
4866(define_insn "mve_vcvtnq_m_<supf><mode>"
4867  [
4868   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4869          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4870                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
4871                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4872           VCVTNQ_M))
4873  ]
4874  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4875  "vpst\;vcvtnt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
4876  [(set_attr "type" "mve_move")
4877   (set_attr "length""8")])
4878
4879;;
4880;; [vcvtq_m_n_from_f_s, vcvtq_m_n_from_f_u])
4881;;
4882(define_insn "mve_vcvtq_m_n_from_f_<supf><mode>"
4883  [
4884   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4885          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4886                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
4887                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
4888                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
4889           VCVTQ_M_N_FROM_F))
4890  ]
4891  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4892  "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2, %3"
4893  [(set_attr "type" "mve_move")
4894   (set_attr "length""8")])
4895
4896;;
4897;; [vrev16q_m_u, vrev16q_m_s])
4898;;
4899(define_insn "mve_vrev16q_m_<supf>v16qi"
4900  [
4901   (set (match_operand:V16QI 0 "s_register_operand" "=w")
4902          (unspec:V16QI [(match_operand:V16QI 1 "s_register_operand" "0")
4903                           (match_operand:V16QI 2 "s_register_operand" "w")
4904                           (match_operand:V16BI 3 "vpr_register_operand" "Up")]
4905           VREV16Q_M))
4906  ]
4907  "TARGET_HAVE_MVE"
4908  "vpst\;vrev16t.8\t%q0, %q2"
4909  [(set_attr "type" "mve_move")
4910   (set_attr "length""8")])
4911
4912;;
4913;; [vcvtq_m_from_f_u, vcvtq_m_from_f_s])
4914;;
4915(define_insn "mve_vcvtq_m_from_f_<supf><mode>"
4916  [
4917   (set (match_operand:MVE_5 0 "s_register_operand" "=w")
4918          (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
4919                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
4920                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4921           VCVTQ_M_FROM_F))
4922  ]
4923  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4924  "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
4925  [(set_attr "type" "mve_move")
4926   (set_attr "length""8")])
4927
4928;;
4929;; [vrmlaldavhq_p_u vrmlaldavhq_p_s])
4930;;
4931(define_insn "mve_vrmlaldavhq_p_<supf>v4si"
4932  [
4933   (set (match_operand:DI 0 "s_register_operand" "=r")
4934          (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
4935                        (match_operand:V4SI 2 "s_register_operand" "w")
4936                        (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4937           VRMLALDAVHQ_P))
4938  ]
4939  "TARGET_HAVE_MVE"
4940  "vpst\;vrmlaldavht.<supf>32\t%Q0, %R0, %q1, %q2"
4941  [(set_attr "type" "mve_move")
4942   (set_attr "length""8")])
4943
4944;;
4945;; [vrmlsldavhaq_s])
4946;;
4947(define_insn "mve_vrmlsldavhaq_sv4si"
4948  [
4949   (set (match_operand:DI 0 "s_register_operand" "=r")
4950          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
4951                        (match_operand:V4SI 2 "s_register_operand" "w")
4952                        (match_operand:V4SI 3 "s_register_operand" "w")]
4953           VRMLSLDAVHAQ_S))
4954  ]
4955  "TARGET_HAVE_MVE"
4956  "vrmlsldavha.s32\t%Q0, %R0, %q2, %q3"
4957  [(set_attr "type" "mve_move")
4958])
4959
4960;;
4961;; [vabavq_p_s, vabavq_p_u])
4962;;
4963(define_insn "mve_vabavq_p_<supf><mode>"
4964  [
4965   (set (match_operand:SI 0 "s_register_operand" "=r")
4966          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
4967                        (match_operand:MVE_2 2 "s_register_operand" "w")
4968                        (match_operand:MVE_2 3 "s_register_operand" "w")
4969                        (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
4970           VABAVQ_P))
4971  ]
4972  "TARGET_HAVE_MVE"
4973  "vpst\;vabavt.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
4974  [(set_attr "type" "mve_move")
4975   (set_attr "length" "8")])
4976
4977;;
4978;; [vqshluq_m_n_s])
4979;;
4980(define_insn "mve_vqshluq_m_n_s<mode>"
4981  [
4982   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
4983          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
4984                           (match_operand:MVE_2 2 "s_register_operand" "w")
4985                           (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
4986                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
4987           VQSHLUQ_M_N_S))
4988  ]
4989  "TARGET_HAVE_MVE"
4990  "vpst\n\tvqshlut.s%#<V_sz_elem>\t%q0, %q2, %3"
4991  [(set_attr "type" "mve_move")
4992   (set_attr "length" "8")])
4993
4994;;
4995;; [vshlq_m_s, vshlq_m_u])
4996;;
4997(define_insn "mve_vshlq_m_<supf><mode>"
4998  [
4999   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5000          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5001                           (match_operand:MVE_2 2 "s_register_operand" "w")
5002                           (match_operand:MVE_2 3 "s_register_operand" "w")
5003                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5004           VSHLQ_M))
5005  ]
5006  "TARGET_HAVE_MVE"
5007  "vpst\;vshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5008  [(set_attr "type" "mve_move")
5009   (set_attr "length" "8")])
5010
5011;;
5012;; [vsriq_m_n_s, vsriq_m_n_u])
5013;;
5014(define_insn "mve_vsriq_m_n_<supf><mode>"
5015  [
5016   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5017          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5018                           (match_operand:MVE_2 2 "s_register_operand" "w")
5019                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
5020                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5021           VSRIQ_M_N))
5022  ]
5023  "TARGET_HAVE_MVE"
5024  "vpst\;vsrit.%#<V_sz_elem>\t%q0, %q2, %3"
5025  [(set_attr "type" "mve_move")
5026   (set_attr "length" "8")])
5027
5028;;
5029;; [vsubq_m_u, vsubq_m_s])
5030;;
5031(define_insn "mve_vsubq_m_<supf><mode>"
5032  [
5033   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5034          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5035                           (match_operand:MVE_2 2 "s_register_operand" "w")
5036                           (match_operand:MVE_2 3 "s_register_operand" "w")
5037                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5038           VSUBQ_M))
5039  ]
5040  "TARGET_HAVE_MVE"
5041  "vpst\;vsubt.i%#<V_sz_elem>\t%q0, %q2, %q3"
5042  [(set_attr "type" "mve_move")
5043   (set_attr "length" "8")])
5044
5045;;
5046;; [vcvtq_m_n_to_f_u, vcvtq_m_n_to_f_s])
5047;;
5048(define_insn "mve_vcvtq_m_n_to_f_<supf><mode>"
5049  [
5050   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
5051          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
5052                           (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
5053                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
5054                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5055           VCVTQ_M_N_TO_F))
5056  ]
5057  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5058  "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5059  [(set_attr "type" "mve_move")
5060   (set_attr "length""8")])
5061;;
5062;; [vabdq_m_s, vabdq_m_u])
5063;;
5064(define_insn "mve_vabdq_m_<supf><mode>"
5065  [
5066   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5067          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5068                           (match_operand:MVE_2 2 "s_register_operand" "w")
5069                           (match_operand:MVE_2 3 "s_register_operand" "w")
5070                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5071           VABDQ_M))
5072  ]
5073  "TARGET_HAVE_MVE"
5074  "vpst\;vabdt.<supf>%#<V_sz_elem>      %q0, %q2, %q3"
5075  [(set_attr "type" "mve_move")
5076   (set_attr "length""8")])
5077
5078;;
5079;; [vaddq_m_n_s, vaddq_m_n_u])
5080;;
5081(define_insn "mve_vaddq_m_n_<supf><mode>"
5082  [
5083   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5084          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5085                           (match_operand:MVE_2 2 "s_register_operand" "w")
5086                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5087                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5088           VADDQ_M_N))
5089  ]
5090  "TARGET_HAVE_MVE"
5091  "vpst\;vaddt.i%#<V_sz_elem> %q0, %q2, %3"
5092  [(set_attr "type" "mve_move")
5093   (set_attr "length""8")])
5094
5095;;
5096;; [vaddq_m_u, vaddq_m_s])
5097;;
5098(define_insn "mve_vaddq_m_<supf><mode>"
5099  [
5100   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5101          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5102                           (match_operand:MVE_2 2 "s_register_operand" "w")
5103                           (match_operand:MVE_2 3 "s_register_operand" "w")
5104                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5105           VADDQ_M))
5106  ]
5107  "TARGET_HAVE_MVE"
5108  "vpst\;vaddt.i%#<V_sz_elem> %q0, %q2, %q3"
5109  [(set_attr "type" "mve_move")
5110   (set_attr "length""8")])
5111
5112;;
5113;; [vandq_m_u, vandq_m_s])
5114;;
5115(define_insn "mve_vandq_m_<supf><mode>"
5116  [
5117   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5118          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5119                           (match_operand:MVE_2 2 "s_register_operand" "w")
5120                           (match_operand:MVE_2 3 "s_register_operand" "w")
5121                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5122           VANDQ_M))
5123  ]
5124  "TARGET_HAVE_MVE"
5125  "vpst\;vandt\t%q0, %q2, %q3"
5126  [(set_attr "type" "mve_move")
5127   (set_attr "length""8")])
5128
5129;;
5130;; [vbicq_m_u, vbicq_m_s])
5131;;
5132(define_insn "mve_vbicq_m_<supf><mode>"
5133  [
5134   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5135          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5136                           (match_operand:MVE_2 2 "s_register_operand" "w")
5137                           (match_operand:MVE_2 3 "s_register_operand" "w")
5138                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5139           VBICQ_M))
5140  ]
5141  "TARGET_HAVE_MVE"
5142  "vpst\;vbict\t%q0, %q2, %q3"
5143  [(set_attr "type" "mve_move")
5144   (set_attr "length""8")])
5145
5146;;
5147;; [vbrsrq_m_n_u, vbrsrq_m_n_s])
5148;;
5149(define_insn "mve_vbrsrq_m_n_<supf><mode>"
5150  [
5151   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5152          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5153                           (match_operand:MVE_2 2 "s_register_operand" "w")
5154                           (match_operand:SI 3 "s_register_operand" "r")
5155                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5156           VBRSRQ_M_N))
5157  ]
5158  "TARGET_HAVE_MVE"
5159  "vpst\;vbrsrt.%#<V_sz_elem> %q0, %q2, %3"
5160  [(set_attr "type" "mve_move")
5161   (set_attr "length""8")])
5162
5163;;
5164;; [vcaddq_rot270_m_u, vcaddq_rot270_m_s])
5165;;
5166(define_insn "mve_vcaddq_rot270_m_<supf><mode>"
5167  [
5168   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
5169          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5170                           (match_operand:MVE_2 2 "s_register_operand" "w")
5171                           (match_operand:MVE_2 3 "s_register_operand" "w")
5172                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5173           VCADDQ_ROT270_M))
5174  ]
5175  "TARGET_HAVE_MVE"
5176  "vpst\;vcaddt.i%#<V_sz_elem>          %q0, %q2, %q3, #270"
5177  [(set_attr "type" "mve_move")
5178   (set_attr "length""8")])
5179
5180;;
5181;; [vcaddq_rot90_m_u, vcaddq_rot90_m_s])
5182;;
5183(define_insn "mve_vcaddq_rot90_m_<supf><mode>"
5184  [
5185   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
5186          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5187                           (match_operand:MVE_2 2 "s_register_operand" "w")
5188                           (match_operand:MVE_2 3 "s_register_operand" "w")
5189                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5190           VCADDQ_ROT90_M))
5191  ]
5192  "TARGET_HAVE_MVE"
5193  "vpst\;vcaddt.i%#<V_sz_elem>          %q0, %q2, %q3, #90"
5194  [(set_attr "type" "mve_move")
5195   (set_attr "length""8")])
5196
5197;;
5198;; [veorq_m_s, veorq_m_u])
5199;;
5200(define_insn "mve_veorq_m_<supf><mode>"
5201  [
5202   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5203          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5204                           (match_operand:MVE_2 2 "s_register_operand" "w")
5205                           (match_operand:MVE_2 3 "s_register_operand" "w")
5206                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5207           VEORQ_M))
5208  ]
5209  "TARGET_HAVE_MVE"
5210  "vpst\;veort\t%q0, %q2, %q3"
5211  [(set_attr "type" "mve_move")
5212   (set_attr "length""8")])
5213
5214;;
5215;; [vhaddq_m_n_s, vhaddq_m_n_u])
5216;;
5217(define_insn "mve_vhaddq_m_n_<supf><mode>"
5218  [
5219   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5220          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5221                           (match_operand:MVE_2 2 "s_register_operand" "w")
5222                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5223                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5224           VHADDQ_M_N))
5225  ]
5226  "TARGET_HAVE_MVE"
5227  "vpst\;vhaddt.<supf>%#<V_sz_elem>     %q0, %q2, %3"
5228  [(set_attr "type" "mve_move")
5229   (set_attr "length""8")])
5230
5231;;
5232;; [vhaddq_m_s, vhaddq_m_u])
5233;;
5234(define_insn "mve_vhaddq_m_<supf><mode>"
5235  [
5236   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5237          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5238                           (match_operand:MVE_2 2 "s_register_operand" "w")
5239                           (match_operand:MVE_2 3 "s_register_operand" "w")
5240                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5241           VHADDQ_M))
5242  ]
5243  "TARGET_HAVE_MVE"
5244  "vpst\;vhaddt.<supf>%#<V_sz_elem>     %q0, %q2, %q3"
5245  [(set_attr "type" "mve_move")
5246   (set_attr "length""8")])
5247
5248;;
5249;; [vhsubq_m_n_s, vhsubq_m_n_u])
5250;;
5251(define_insn "mve_vhsubq_m_n_<supf><mode>"
5252  [
5253   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5254          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5255                           (match_operand:MVE_2 2 "s_register_operand" "w")
5256                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5257                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5258           VHSUBQ_M_N))
5259  ]
5260  "TARGET_HAVE_MVE"
5261  "vpst\;vhsubt.<supf>%#<V_sz_elem>     %q0, %q2, %3"
5262  [(set_attr "type" "mve_move")
5263   (set_attr "length""8")])
5264
5265;;
5266;; [vhsubq_m_s, vhsubq_m_u])
5267;;
5268(define_insn "mve_vhsubq_m_<supf><mode>"
5269  [
5270   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5271          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5272                           (match_operand:MVE_2 2 "s_register_operand" "w")
5273                           (match_operand:MVE_2 3 "s_register_operand" "w")
5274                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5275           VHSUBQ_M))
5276  ]
5277  "TARGET_HAVE_MVE"
5278  "vpst\;vhsubt.<supf>%#<V_sz_elem>     %q0, %q2, %q3"
5279  [(set_attr "type" "mve_move")
5280   (set_attr "length""8")])
5281
5282;;
5283;; [vmaxq_m_s, vmaxq_m_u])
5284;;
5285(define_insn "mve_vmaxq_m_<supf><mode>"
5286  [
5287   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5288          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5289                           (match_operand:MVE_2 2 "s_register_operand" "w")
5290                           (match_operand:MVE_2 3 "s_register_operand" "w")
5291                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5292           VMAXQ_M))
5293  ]
5294  "TARGET_HAVE_MVE"
5295  "vpst\;vmaxt.<supf>%#<V_sz_elem>      %q0, %q2, %q3"
5296  [(set_attr "type" "mve_move")
5297   (set_attr "length""8")])
5298
5299;;
5300;; [vminq_m_s, vminq_m_u])
5301;;
5302(define_insn "mve_vminq_m_<supf><mode>"
5303  [
5304   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5305          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5306                           (match_operand:MVE_2 2 "s_register_operand" "w")
5307                           (match_operand:MVE_2 3 "s_register_operand" "w")
5308                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5309           VMINQ_M))
5310  ]
5311  "TARGET_HAVE_MVE"
5312  "vpst\;vmint.<supf>%#<V_sz_elem>      %q0, %q2, %q3"
5313  [(set_attr "type" "mve_move")
5314   (set_attr "length""8")])
5315
5316;;
5317;; [vmladavaq_p_u, vmladavaq_p_s])
5318;;
5319(define_insn "mve_vmladavaq_p_<supf><mode>"
5320  [
5321   (set (match_operand:SI 0 "s_register_operand" "=Te")
5322          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
5323                        (match_operand:MVE_2 2 "s_register_operand" "w")
5324                        (match_operand:MVE_2 3 "s_register_operand" "w")
5325                        (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5326           VMLADAVAQ_P))
5327  ]
5328  "TARGET_HAVE_MVE"
5329  "vpst\;vmladavat.<supf>%#<V_sz_elem>  %0, %q2, %q3"
5330  [(set_attr "type" "mve_move")
5331   (set_attr "length""8")])
5332
5333;;
5334;; [vmlaq_m_n_s, vmlaq_m_n_u])
5335;;
5336(define_insn "mve_vmlaq_m_n_<supf><mode>"
5337  [
5338   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5339          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5340                           (match_operand:MVE_2 2 "s_register_operand" "w")
5341                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5342                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5343           VMLAQ_M_N))
5344  ]
5345  "TARGET_HAVE_MVE"
5346  "vpst\;vmlat.<supf>%#<V_sz_elem>      %q0, %q2, %3"
5347  [(set_attr "type" "mve_move")
5348   (set_attr "length""8")])
5349
5350;;
5351;; [vmlasq_m_n_u, vmlasq_m_n_s])
5352;;
5353(define_insn "mve_vmlasq_m_n_<supf><mode>"
5354  [
5355   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5356          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5357                           (match_operand:MVE_2 2 "s_register_operand" "w")
5358                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5359                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5360           VMLASQ_M_N))
5361  ]
5362  "TARGET_HAVE_MVE"
5363  "vpst\;vmlast.<supf>%#<V_sz_elem>     %q0, %q2, %3"
5364  [(set_attr "type" "mve_move")
5365   (set_attr "length""8")])
5366
5367;;
5368;; [vmulhq_m_s, vmulhq_m_u])
5369;;
5370(define_insn "mve_vmulhq_m_<supf><mode>"
5371  [
5372   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5373          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5374                           (match_operand:MVE_2 2 "s_register_operand" "w")
5375                           (match_operand:MVE_2 3 "s_register_operand" "w")
5376                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5377           VMULHQ_M))
5378  ]
5379  "TARGET_HAVE_MVE"
5380  "vpst\;vmulht.<supf>%#<V_sz_elem>     %q0, %q2, %q3"
5381  [(set_attr "type" "mve_move")
5382   (set_attr "length""8")])
5383
5384;;
5385;; [vmullbq_int_m_u, vmullbq_int_m_s])
5386;;
5387(define_insn "mve_vmullbq_int_m_<supf><mode>"
5388  [
5389   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
5390          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
5391                                          (match_operand:MVE_2 2 "s_register_operand" "w")
5392                                          (match_operand:MVE_2 3 "s_register_operand" "w")
5393                                          (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5394           VMULLBQ_INT_M))
5395  ]
5396  "TARGET_HAVE_MVE"
5397  "vpst\;vmullbt.<supf>%#<V_sz_elem>    %q0, %q2, %q3"
5398  [(set_attr "type" "mve_move")
5399   (set_attr "length""8")])
5400
5401;;
5402;; [vmulltq_int_m_s, vmulltq_int_m_u])
5403;;
5404(define_insn "mve_vmulltq_int_m_<supf><mode>"
5405  [
5406   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
5407          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
5408                                          (match_operand:MVE_2 2 "s_register_operand" "w")
5409                                          (match_operand:MVE_2 3 "s_register_operand" "w")
5410                                          (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5411           VMULLTQ_INT_M))
5412  ]
5413  "TARGET_HAVE_MVE"
5414  "vpst\;vmulltt.<supf>%#<V_sz_elem>    %q0, %q2, %q3"
5415  [(set_attr "type" "mve_move")
5416   (set_attr "length""8")])
5417
5418;;
5419;; [vmulq_m_n_u, vmulq_m_n_s])
5420;;
5421(define_insn "mve_vmulq_m_n_<supf><mode>"
5422  [
5423   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5424          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5425                           (match_operand:MVE_2 2 "s_register_operand" "w")
5426                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5427                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5428           VMULQ_M_N))
5429  ]
5430  "TARGET_HAVE_MVE"
5431  "vpst\;vmult.i%#<V_sz_elem> %q0, %q2, %3"
5432  [(set_attr "type" "mve_move")
5433   (set_attr "length""8")])
5434
5435;;
5436;; [vmulq_m_s, vmulq_m_u])
5437;;
5438(define_insn "mve_vmulq_m_<supf><mode>"
5439  [
5440   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5441          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5442                           (match_operand:MVE_2 2 "s_register_operand" "w")
5443                           (match_operand:MVE_2 3 "s_register_operand" "w")
5444                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5445           VMULQ_M))
5446  ]
5447  "TARGET_HAVE_MVE"
5448  "vpst\;vmult.i%#<V_sz_elem> %q0, %q2, %q3"
5449  [(set_attr "type" "mve_move")
5450   (set_attr "length""8")])
5451
5452;;
5453;; [vornq_m_u, vornq_m_s])
5454;;
5455(define_insn "mve_vornq_m_<supf><mode>"
5456  [
5457   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5458          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5459                           (match_operand:MVE_2 2 "s_register_operand" "w")
5460                           (match_operand:MVE_2 3 "s_register_operand" "w")
5461                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5462           VORNQ_M))
5463  ]
5464  "TARGET_HAVE_MVE"
5465  "vpst\;vornt\t%q0, %q2, %q3"
5466  [(set_attr "type" "mve_move")
5467   (set_attr "length""8")])
5468
5469;;
5470;; [vorrq_m_s, vorrq_m_u])
5471;;
5472(define_insn "mve_vorrq_m_<supf><mode>"
5473  [
5474   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5475          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5476                           (match_operand:MVE_2 2 "s_register_operand" "w")
5477                           (match_operand:MVE_2 3 "s_register_operand" "w")
5478                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5479           VORRQ_M))
5480  ]
5481  "TARGET_HAVE_MVE"
5482  "vpst\;vorrt\t%q0, %q2, %q3"
5483  [(set_attr "type" "mve_move")
5484   (set_attr "length""8")])
5485
5486;;
5487;; [vqaddq_m_n_u, vqaddq_m_n_s])
5488;;
5489(define_insn "mve_vqaddq_m_n_<supf><mode>"
5490  [
5491   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5492          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5493                           (match_operand:MVE_2 2 "s_register_operand" "w")
5494                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5495                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5496           VQADDQ_M_N))
5497  ]
5498  "TARGET_HAVE_MVE"
5499  "vpst\;vqaddt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5500  [(set_attr "type" "mve_move")
5501   (set_attr "length""8")])
5502
5503;;
5504;; [vqaddq_m_u, vqaddq_m_s])
5505;;
5506(define_insn "mve_vqaddq_m_<supf><mode>"
5507  [
5508   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5509          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5510                           (match_operand:MVE_2 2 "s_register_operand" "w")
5511                           (match_operand:MVE_2 3 "s_register_operand" "w")
5512                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5513           VQADDQ_M))
5514  ]
5515  "TARGET_HAVE_MVE"
5516  "vpst\;vqaddt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5517  [(set_attr "type" "mve_move")
5518   (set_attr "length""8")])
5519
5520;;
5521;; [vqdmlahq_m_n_s])
5522;;
5523(define_insn "mve_vqdmlahq_m_n_s<mode>"
5524  [
5525   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5526          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5527                           (match_operand:MVE_2 2 "s_register_operand" "w")
5528                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5529                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5530           VQDMLAHQ_M_N_S))
5531  ]
5532  "TARGET_HAVE_MVE"
5533  "vpst\;vqdmlaht.s%#<V_sz_elem>\t%q0, %q2, %3"
5534  [(set_attr "type" "mve_move")
5535   (set_attr "length""8")])
5536
5537;;
5538;; [vqdmlashq_m_n_s])
5539;;
5540(define_insn "mve_vqdmlashq_m_n_s<mode>"
5541  [
5542   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5543          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5544                           (match_operand:MVE_2 2 "s_register_operand" "w")
5545                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5546                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5547           VQDMLASHQ_M_N_S))
5548  ]
5549  "TARGET_HAVE_MVE"
5550  "vpst\;vqdmlasht.s%#<V_sz_elem>\t%q0, %q2, %3"
5551  [(set_attr "type" "mve_move")
5552   (set_attr "length""8")])
5553
5554;;
5555;; [vqrdmlahq_m_n_s])
5556;;
5557(define_insn "mve_vqrdmlahq_m_n_s<mode>"
5558  [
5559   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5560          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5561                           (match_operand:MVE_2 2 "s_register_operand" "w")
5562                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5563                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5564           VQRDMLAHQ_M_N_S))
5565  ]
5566  "TARGET_HAVE_MVE"
5567  "vpst\;vqrdmlaht.s%#<V_sz_elem>\t%q0, %q2, %3"
5568  [(set_attr "type" "mve_move")
5569   (set_attr "length""8")])
5570
5571;;
5572;; [vqrdmlashq_m_n_s])
5573;;
5574(define_insn "mve_vqrdmlashq_m_n_s<mode>"
5575  [
5576   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5577          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5578                           (match_operand:MVE_2 2 "s_register_operand" "w")
5579                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5580                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5581           VQRDMLASHQ_M_N_S))
5582  ]
5583  "TARGET_HAVE_MVE"
5584  "vpst\;vqrdmlasht.s%#<V_sz_elem>\t%q0, %q2, %3"
5585  [(set_attr "type" "mve_move")
5586   (set_attr "length""8")])
5587
5588;;
5589;; [vqrshlq_m_u, vqrshlq_m_s])
5590;;
5591(define_insn "mve_vqrshlq_m_<supf><mode>"
5592  [
5593   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5594          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5595                           (match_operand:MVE_2 2 "s_register_operand" "w")
5596                           (match_operand:MVE_2 3 "s_register_operand" "w")
5597                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5598           VQRSHLQ_M))
5599  ]
5600  "TARGET_HAVE_MVE"
5601  "vpst\;vqrshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5602  [(set_attr "type" "mve_move")
5603   (set_attr "length""8")])
5604
5605;;
5606;; [vqshlq_m_n_s, vqshlq_m_n_u])
5607;;
5608(define_insn "mve_vqshlq_m_n_<supf><mode>"
5609  [
5610   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5611          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5612                           (match_operand:MVE_2 2 "s_register_operand" "w")
5613                           (match_operand:SI 3 "immediate_operand" "i")
5614                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5615           VQSHLQ_M_N))
5616  ]
5617  "TARGET_HAVE_MVE"
5618  "vpst\;vqshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5619  [(set_attr "type" "mve_move")
5620   (set_attr "length""8")])
5621
5622;;
5623;; [vqshlq_m_u, vqshlq_m_s])
5624;;
5625(define_insn "mve_vqshlq_m_<supf><mode>"
5626  [
5627   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5628          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5629                           (match_operand:MVE_2 2 "s_register_operand" "w")
5630                           (match_operand:MVE_2 3 "s_register_operand" "w")
5631                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5632           VQSHLQ_M))
5633  ]
5634  "TARGET_HAVE_MVE"
5635  "vpst\;vqshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5636  [(set_attr "type" "mve_move")
5637   (set_attr "length""8")])
5638
5639;;
5640;; [vqsubq_m_n_u, vqsubq_m_n_s])
5641;;
5642(define_insn "mve_vqsubq_m_n_<supf><mode>"
5643  [
5644   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5645          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5646                           (match_operand:MVE_2 2 "s_register_operand" "w")
5647                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5648                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5649           VQSUBQ_M_N))
5650  ]
5651  "TARGET_HAVE_MVE"
5652  "vpst\;vqsubt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5653  [(set_attr "type" "mve_move")
5654   (set_attr "length""8")])
5655
5656;;
5657;; [vqsubq_m_u, vqsubq_m_s])
5658;;
5659(define_insn "mve_vqsubq_m_<supf><mode>"
5660  [
5661   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5662          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5663                           (match_operand:MVE_2 2 "s_register_operand" "w")
5664                           (match_operand:MVE_2 3 "s_register_operand" "w")
5665                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5666           VQSUBQ_M))
5667  ]
5668  "TARGET_HAVE_MVE"
5669  "vpst\;vqsubt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5670  [(set_attr "type" "mve_move")
5671   (set_attr "length""8")])
5672
5673;;
5674;; [vrhaddq_m_u, vrhaddq_m_s])
5675;;
5676(define_insn "mve_vrhaddq_m_<supf><mode>"
5677  [
5678   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5679          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5680                           (match_operand:MVE_2 2 "s_register_operand" "w")
5681                           (match_operand:MVE_2 3 "s_register_operand" "w")
5682                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5683           VRHADDQ_M))
5684  ]
5685  "TARGET_HAVE_MVE"
5686  "vpst\;vrhaddt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5687  [(set_attr "type" "mve_move")
5688   (set_attr "length""8")])
5689
5690;;
5691;; [vrmulhq_m_u, vrmulhq_m_s])
5692;;
5693(define_insn "mve_vrmulhq_m_<supf><mode>"
5694  [
5695   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5696          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5697                           (match_operand:MVE_2 2 "s_register_operand" "w")
5698                           (match_operand:MVE_2 3 "s_register_operand" "w")
5699                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5700           VRMULHQ_M))
5701  ]
5702  "TARGET_HAVE_MVE"
5703  "vpst\;vrmulht.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5704  [(set_attr "type" "mve_move")
5705   (set_attr "length""8")])
5706
5707;;
5708;; [vrshlq_m_s, vrshlq_m_u])
5709;;
5710(define_insn "mve_vrshlq_m_<supf><mode>"
5711  [
5712   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5713          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5714                           (match_operand:MVE_2 2 "s_register_operand" "w")
5715                           (match_operand:MVE_2 3 "s_register_operand" "w")
5716                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5717           VRSHLQ_M))
5718  ]
5719  "TARGET_HAVE_MVE"
5720  "vpst\;vrshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
5721  [(set_attr "type" "mve_move")
5722   (set_attr "length""8")])
5723
5724;;
5725;; [vrshrq_m_n_s, vrshrq_m_n_u])
5726;;
5727(define_insn "mve_vrshrq_m_n_<supf><mode>"
5728  [
5729   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5730          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5731                           (match_operand:MVE_2 2 "s_register_operand" "w")
5732                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
5733                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5734           VRSHRQ_M_N))
5735  ]
5736  "TARGET_HAVE_MVE"
5737  "vpst\;vrshrt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5738  [(set_attr "type" "mve_move")
5739   (set_attr "length""8")])
5740
5741;;
5742;; [vshlq_m_n_s, vshlq_m_n_u])
5743;;
5744(define_insn "mve_vshlq_m_n_<supf><mode>"
5745  [
5746   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5747          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5748                           (match_operand:MVE_2 2 "s_register_operand" "w")
5749                           (match_operand:SI 3 "immediate_operand" "i")
5750                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5751           VSHLQ_M_N))
5752  ]
5753  "TARGET_HAVE_MVE"
5754  "vpst\;vshlt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5755  [(set_attr "type" "mve_move")
5756   (set_attr "length""8")])
5757
5758;;
5759;; [vshrq_m_n_s, vshrq_m_n_u])
5760;;
5761(define_insn "mve_vshrq_m_n_<supf><mode>"
5762  [
5763   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5764          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5765                           (match_operand:MVE_2 2 "s_register_operand" "w")
5766                           (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
5767                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5768           VSHRQ_M_N))
5769  ]
5770  "TARGET_HAVE_MVE"
5771  "vpst\;vshrt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
5772  [(set_attr "type" "mve_move")
5773   (set_attr "length""8")])
5774
5775;;
5776;; [vsliq_m_n_u, vsliq_m_n_s])
5777;;
5778(define_insn "mve_vsliq_m_n_<supf><mode>"
5779   [
5780   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5781       (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5782                           (match_operand:MVE_2 2 "s_register_operand" "w")
5783                           (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
5784                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5785           VSLIQ_M_N))
5786  ]
5787  "TARGET_HAVE_MVE"
5788  "vpst\;vslit.%#<V_sz_elem>\t%q0, %q2, %3"
5789  [(set_attr "type" "mve_move")
5790   (set_attr "length""8")])
5791
5792;;
5793;; [vsubq_m_n_s, vsubq_m_n_u])
5794;;
5795(define_insn "mve_vsubq_m_n_<supf><mode>"
5796  [
5797   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5798          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5799                           (match_operand:MVE_2 2 "s_register_operand" "w")
5800                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5801                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5802           VSUBQ_M_N))
5803  ]
5804  "TARGET_HAVE_MVE"
5805  "vpst\;vsubt.i%#<V_sz_elem>\t%q0, %q2, %3"
5806  [(set_attr "type" "mve_move")
5807   (set_attr "length""8")])
5808
5809;;
5810;; [vhcaddq_rot270_m_s])
5811;;
5812(define_insn "mve_vhcaddq_rot270_m_s<mode>"
5813  [
5814   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
5815          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5816                           (match_operand:MVE_2 2 "s_register_operand" "w")
5817                           (match_operand:MVE_2 3 "s_register_operand" "w")
5818                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5819           VHCADDQ_ROT270_M_S))
5820  ]
5821  "TARGET_HAVE_MVE"
5822  "vpst\;vhcaddt.s%#<V_sz_elem>\t%q0, %q2, %q3, #270"
5823  [(set_attr "type" "mve_move")
5824   (set_attr "length""8")])
5825
5826;;
5827;; [vhcaddq_rot90_m_s])
5828;;
5829(define_insn "mve_vhcaddq_rot90_m_s<mode>"
5830  [
5831   (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
5832          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5833                           (match_operand:MVE_2 2 "s_register_operand" "w")
5834                           (match_operand:MVE_2 3 "s_register_operand" "w")
5835                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5836           VHCADDQ_ROT90_M_S))
5837  ]
5838  "TARGET_HAVE_MVE"
5839  "vpst\;vhcaddt.s%#<V_sz_elem>\t%q0, %q2, %q3, #90"
5840  [(set_attr "type" "mve_move")
5841   (set_attr "length""8")])
5842
5843;;
5844;; [vmladavaxq_p_s])
5845;;
5846(define_insn "mve_vmladavaxq_p_s<mode>"
5847  [
5848   (set (match_operand:SI 0 "s_register_operand" "=Te")
5849          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
5850                           (match_operand:MVE_2 2 "s_register_operand" "w")
5851                           (match_operand:MVE_2 3 "s_register_operand" "w")
5852                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5853           VMLADAVAXQ_P_S))
5854  ]
5855  "TARGET_HAVE_MVE"
5856  "vpst\;vmladavaxt.s%#<V_sz_elem>\t%0, %q2, %q3"
5857  [(set_attr "type" "mve_move")
5858   (set_attr "length""8")])
5859
5860;;
5861;; [vmlsdavaq_p_s])
5862;;
5863(define_insn "mve_vmlsdavaq_p_s<mode>"
5864  [
5865   (set (match_operand:SI 0 "s_register_operand" "=Te")
5866          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
5867                           (match_operand:MVE_2 2 "s_register_operand" "w")
5868                           (match_operand:MVE_2 3 "s_register_operand" "w")
5869                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5870           VMLSDAVAQ_P_S))
5871  ]
5872  "TARGET_HAVE_MVE"
5873  "vpst\;vmlsdavat.s%#<V_sz_elem>\t%0, %q2, %q3"
5874  [(set_attr "type" "mve_move")
5875   (set_attr "length""8")])
5876
5877;;
5878;; [vmlsdavaxq_p_s])
5879;;
5880(define_insn "mve_vmlsdavaxq_p_s<mode>"
5881  [
5882   (set (match_operand:SI 0 "s_register_operand" "=Te")
5883          (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
5884                           (match_operand:MVE_2 2 "s_register_operand" "w")
5885                           (match_operand:MVE_2 3 "s_register_operand" "w")
5886                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5887           VMLSDAVAXQ_P_S))
5888  ]
5889  "TARGET_HAVE_MVE"
5890  "vpst\;vmlsdavaxt.s%#<V_sz_elem>\t%0, %q2, %q3"
5891  [(set_attr "type" "mve_move")
5892   (set_attr "length""8")])
5893
5894;;
5895;; [vqdmladhq_m_s])
5896;;
5897(define_insn "mve_vqdmladhq_m_s<mode>"
5898  [
5899   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5900          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5901                           (match_operand:MVE_2 2 "s_register_operand" "w")
5902                           (match_operand:MVE_2 3 "s_register_operand" "w")
5903                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5904           VQDMLADHQ_M_S))
5905  ]
5906  "TARGET_HAVE_MVE"
5907  "vpst\;vqdmladht.s%#<V_sz_elem>\t%q0, %q2, %q3"
5908  [(set_attr "type" "mve_move")
5909   (set_attr "length""8")])
5910
5911;;
5912;; [vqdmladhxq_m_s])
5913;;
5914(define_insn "mve_vqdmladhxq_m_s<mode>"
5915  [
5916   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5917          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5918                           (match_operand:MVE_2 2 "s_register_operand" "w")
5919                           (match_operand:MVE_2 3 "s_register_operand" "w")
5920                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5921           VQDMLADHXQ_M_S))
5922  ]
5923  "TARGET_HAVE_MVE"
5924  "vpst\;vqdmladhxt.s%#<V_sz_elem>\t%q0, %q2, %q3"
5925  [(set_attr "type" "mve_move")
5926   (set_attr "length""8")])
5927
5928;;
5929;; [vqdmlsdhq_m_s])
5930;;
5931(define_insn "mve_vqdmlsdhq_m_s<mode>"
5932  [
5933   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5934          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5935                           (match_operand:MVE_2 2 "s_register_operand" "w")
5936                           (match_operand:MVE_2 3 "s_register_operand" "w")
5937                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5938           VQDMLSDHQ_M_S))
5939  ]
5940  "TARGET_HAVE_MVE"
5941  "vpst\;vqdmlsdht.s%#<V_sz_elem>\t%q0, %q2, %q3"
5942  [(set_attr "type" "mve_move")
5943   (set_attr "length""8")])
5944
5945;;
5946;; [vqdmlsdhxq_m_s])
5947;;
5948(define_insn "mve_vqdmlsdhxq_m_s<mode>"
5949  [
5950   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5951          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5952                           (match_operand:MVE_2 2 "s_register_operand" "w")
5953                           (match_operand:MVE_2 3 "s_register_operand" "w")
5954                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5955           VQDMLSDHXQ_M_S))
5956  ]
5957  "TARGET_HAVE_MVE"
5958  "vpst\;vqdmlsdhxt.s%#<V_sz_elem>\t%q0, %q2, %q3"
5959  [(set_attr "type" "mve_move")
5960   (set_attr "length""8")])
5961
5962;;
5963;; [vqdmulhq_m_n_s])
5964;;
5965(define_insn "mve_vqdmulhq_m_n_s<mode>"
5966  [
5967   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5968          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5969                           (match_operand:MVE_2 2 "s_register_operand" "w")
5970                           (match_operand:<V_elem> 3 "s_register_operand" "r")
5971                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5972           VQDMULHQ_M_N_S))
5973  ]
5974  "TARGET_HAVE_MVE"
5975  "vpst\;vqdmulht.s%#<V_sz_elem>\t%q0, %q2, %3"
5976  [(set_attr "type" "mve_move")
5977   (set_attr "length""8")])
5978
5979;;
5980;; [vqdmulhq_m_s])
5981;;
5982(define_insn "mve_vqdmulhq_m_s<mode>"
5983  [
5984   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5985          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5986                           (match_operand:MVE_2 2 "s_register_operand" "w")
5987                           (match_operand:MVE_2 3 "s_register_operand" "w")
5988                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5989           VQDMULHQ_M_S))
5990  ]
5991  "TARGET_HAVE_MVE"
5992  "vpst\;vqdmulht.s%#<V_sz_elem>\t%q0, %q2, %q3"
5993  [(set_attr "type" "mve_move")
5994   (set_attr "length""8")])
5995
5996;;
5997;; [vqrdmladhq_m_s])
5998;;
5999(define_insn "mve_vqrdmladhq_m_s<mode>"
6000  [
6001   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6002          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6003                           (match_operand:MVE_2 2 "s_register_operand" "w")
6004                           (match_operand:MVE_2 3 "s_register_operand" "w")
6005                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6006           VQRDMLADHQ_M_S))
6007  ]
6008  "TARGET_HAVE_MVE"
6009  "vpst\;vqrdmladht.s%#<V_sz_elem>\t%q0, %q2, %q3"
6010  [(set_attr "type" "mve_move")
6011   (set_attr "length""8")])
6012
6013;;
6014;; [vqrdmladhxq_m_s])
6015;;
6016(define_insn "mve_vqrdmladhxq_m_s<mode>"
6017  [
6018   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6019          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6020                           (match_operand:MVE_2 2 "s_register_operand" "w")
6021                           (match_operand:MVE_2 3 "s_register_operand" "w")
6022                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6023           VQRDMLADHXQ_M_S))
6024  ]
6025  "TARGET_HAVE_MVE"
6026  "vpst\;vqrdmladhxt.s%#<V_sz_elem>\t%q0, %q2, %q3"
6027  [(set_attr "type" "mve_move")
6028   (set_attr "length""8")])
6029
6030;;
6031;; [vqrdmlsdhq_m_s])
6032;;
6033(define_insn "mve_vqrdmlsdhq_m_s<mode>"
6034  [
6035   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6036          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6037                           (match_operand:MVE_2 2 "s_register_operand" "w")
6038                           (match_operand:MVE_2 3 "s_register_operand" "w")
6039                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6040           VQRDMLSDHQ_M_S))
6041  ]
6042  "TARGET_HAVE_MVE"
6043  "vpst\;vqrdmlsdht.s%#<V_sz_elem>\t%q0, %q2, %q3"
6044  [(set_attr "type" "mve_move")
6045   (set_attr "length""8")])
6046
6047;;
6048;; [vqrdmlsdhxq_m_s])
6049;;
6050(define_insn "mve_vqrdmlsdhxq_m_s<mode>"
6051  [
6052   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6053          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6054                           (match_operand:MVE_2 2 "s_register_operand" "w")
6055                           (match_operand:MVE_2 3 "s_register_operand" "w")
6056                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6057           VQRDMLSDHXQ_M_S))
6058  ]
6059  "TARGET_HAVE_MVE"
6060  "vpst\;vqrdmlsdhxt.s%#<V_sz_elem>\t%q0, %q2, %q3"
6061  [(set_attr "type" "mve_move")
6062   (set_attr "length""8")])
6063
6064;;
6065;; [vqrdmulhq_m_n_s])
6066;;
6067(define_insn "mve_vqrdmulhq_m_n_s<mode>"
6068  [
6069   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6070          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6071                           (match_operand:MVE_2 2 "s_register_operand" "w")
6072                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6073                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6074           VQRDMULHQ_M_N_S))
6075  ]
6076  "TARGET_HAVE_MVE"
6077  "vpst\;vqrdmulht.s%#<V_sz_elem>\t%q0, %q2, %3"
6078  [(set_attr "type" "mve_move")
6079   (set_attr "length""8")])
6080
6081;;
6082;; [vqrdmulhq_m_s])
6083;;
6084(define_insn "mve_vqrdmulhq_m_s<mode>"
6085  [
6086   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
6087          (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
6088                           (match_operand:MVE_2 2 "s_register_operand" "w")
6089                           (match_operand:MVE_2 3 "s_register_operand" "w")
6090                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6091           VQRDMULHQ_M_S))
6092  ]
6093  "TARGET_HAVE_MVE"
6094  "vpst\;vqrdmulht.s%#<V_sz_elem>\t%q0, %q2, %q3"
6095  [(set_attr "type" "mve_move")
6096   (set_attr "length""8")])
6097
6098;;
6099;; [vmlaldavaq_p_u, vmlaldavaq_p_s])
6100;;
6101(define_insn "mve_vmlaldavaq_p_<supf><mode>"
6102  [
6103   (set (match_operand:DI 0 "s_register_operand" "=r")
6104          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6105                           (match_operand:MVE_5 2 "s_register_operand" "w")
6106                           (match_operand:MVE_5 3 "s_register_operand" "w")
6107                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6108           VMLALDAVAQ_P))
6109  ]
6110  "TARGET_HAVE_MVE"
6111  "vpst\;vmlaldavat.<supf>%#<V_sz_elem> %Q0, %R0, %q2, %q3"
6112  [(set_attr "type" "mve_move")
6113   (set_attr "length""8")])
6114
6115;;
6116;; [vmlaldavaxq_p_s])
6117;;
6118(define_insn "mve_vmlaldavaxq_p_<supf><mode>"
6119  [
6120   (set (match_operand:DI 0 "s_register_operand" "=r")
6121          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6122                           (match_operand:MVE_5 2 "s_register_operand" "w")
6123                           (match_operand:MVE_5 3 "s_register_operand" "w")
6124                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6125           VMLALDAVAXQ_P))
6126  ]
6127  "TARGET_HAVE_MVE"
6128  "vpst\;vmlaldavaxt.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
6129  [(set_attr "type" "mve_move")
6130   (set_attr "length""8")])
6131
6132;;
6133;; [vqrshrnbq_m_n_u, vqrshrnbq_m_n_s])
6134;;
6135(define_insn "mve_vqrshrnbq_m_n_<supf><mode>"
6136  [
6137   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6138          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6139                           (match_operand:MVE_5 2 "s_register_operand" "w")
6140                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6141                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6142           VQRSHRNBQ_M_N))
6143  ]
6144  "TARGET_HAVE_MVE"
6145  "vpst\;vqrshrnbt.<supf>%#<V_sz_elem>  %q0, %q2, %3"
6146  [(set_attr "type" "mve_move")
6147   (set_attr "length""8")])
6148
6149;;
6150;; [vqrshrntq_m_n_s, vqrshrntq_m_n_u])
6151;;
6152(define_insn "mve_vqrshrntq_m_n_<supf><mode>"
6153  [
6154   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6155          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6156                           (match_operand:MVE_5 2 "s_register_operand" "w")
6157                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6158                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6159           VQRSHRNTQ_M_N))
6160  ]
6161  "TARGET_HAVE_MVE"
6162  "vpst\;vqrshrntt.<supf>%#<V_sz_elem>  %q0, %q2, %3"
6163  [(set_attr "type" "mve_move")
6164   (set_attr "length""8")])
6165
6166;;
6167;; [vqshrnbq_m_n_u, vqshrnbq_m_n_s])
6168;;
6169(define_insn "mve_vqshrnbq_m_n_<supf><mode>"
6170  [
6171   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6172          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6173                           (match_operand:MVE_5 2 "s_register_operand" "w")
6174                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6175                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6176           VQSHRNBQ_M_N))
6177  ]
6178  "TARGET_HAVE_MVE"
6179  "vpst\n\tvqshrnbt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
6180  [(set_attr "type" "mve_move")
6181   (set_attr "length""8")])
6182
6183;;
6184;; [vqshrntq_m_n_s, vqshrntq_m_n_u])
6185;;
6186(define_insn "mve_vqshrntq_m_n_<supf><mode>"
6187  [
6188   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6189          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6190                           (match_operand:MVE_5 2 "s_register_operand" "w")
6191                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6192                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6193           VQSHRNTQ_M_N))
6194  ]
6195  "TARGET_HAVE_MVE"
6196  "vpst\;vqshrntt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
6197  [(set_attr "type" "mve_move")
6198   (set_attr "length""8")])
6199
6200;;
6201;; [vrmlaldavhaq_p_s])
6202;;
6203(define_insn "mve_vrmlaldavhaq_p_sv4si"
6204  [
6205   (set (match_operand:DI 0 "s_register_operand" "=r")
6206          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6207                           (match_operand:V4SI 2 "s_register_operand" "w")
6208                           (match_operand:V4SI 3 "s_register_operand" "w")
6209                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6210           VRMLALDAVHAQ_P_S))
6211  ]
6212  "TARGET_HAVE_MVE"
6213  "vpst\;vrmlaldavhat.s32\t%Q0, %R0, %q2, %q3"
6214  [(set_attr "type" "mve_move")
6215   (set_attr "length""8")])
6216
6217;;
6218;; [vrshrnbq_m_n_u, vrshrnbq_m_n_s])
6219;;
6220(define_insn "mve_vrshrnbq_m_n_<supf><mode>"
6221  [
6222   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6223          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6224                           (match_operand:MVE_5 2 "s_register_operand" "w")
6225                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6226                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6227           VRSHRNBQ_M_N))
6228  ]
6229  "TARGET_HAVE_MVE"
6230  "vpst\;vrshrnbt.i%#<V_sz_elem>\t%q0, %q2, %3"
6231  [(set_attr "type" "mve_move")
6232   (set_attr "length""8")])
6233
6234;;
6235;; [vrshrntq_m_n_u, vrshrntq_m_n_s])
6236;;
6237(define_insn "mve_vrshrntq_m_n_<supf><mode>"
6238  [
6239   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6240          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6241                           (match_operand:MVE_5 2 "s_register_operand" "w")
6242                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6243                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6244           VRSHRNTQ_M_N))
6245  ]
6246  "TARGET_HAVE_MVE"
6247  "vpst\;vrshrntt.i%#<V_sz_elem>\t%q0, %q2, %3"
6248  [(set_attr "type" "mve_move")
6249   (set_attr "length""8")])
6250
6251;;
6252;; [vshllbq_m_n_u, vshllbq_m_n_s])
6253;;
6254(define_insn "mve_vshllbq_m_n_<supf><mode>"
6255  [
6256   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
6257          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6258                           (match_operand:MVE_3 2 "s_register_operand" "w")
6259                           (match_operand:SI 3 "immediate_operand" "i")
6260                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6261           VSHLLBQ_M_N))
6262  ]
6263  "TARGET_HAVE_MVE"
6264  "vpst\;vshllbt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
6265  [(set_attr "type" "mve_move")
6266   (set_attr "length""8")])
6267
6268;;
6269;; [vshlltq_m_n_u, vshlltq_m_n_s])
6270;;
6271(define_insn "mve_vshlltq_m_n_<supf><mode>"
6272  [
6273   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
6274          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6275                           (match_operand:MVE_3 2 "s_register_operand" "w")
6276                           (match_operand:SI 3 "immediate_operand" "i")
6277                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6278           VSHLLTQ_M_N))
6279  ]
6280  "TARGET_HAVE_MVE"
6281  "vpst\;vshlltt.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
6282  [(set_attr "type" "mve_move")
6283   (set_attr "length""8")])
6284
6285;;
6286;; [vshrnbq_m_n_s, vshrnbq_m_n_u])
6287;;
6288(define_insn "mve_vshrnbq_m_n_<supf><mode>"
6289  [
6290   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6291          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6292                           (match_operand:MVE_5 2 "s_register_operand" "w")
6293                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6294                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6295           VSHRNBQ_M_N))
6296  ]
6297  "TARGET_HAVE_MVE"
6298  "vpst\;vshrnbt.i%#<V_sz_elem>\t%q0, %q2, %3"
6299  [(set_attr "type" "mve_move")
6300   (set_attr "length""8")])
6301
6302;;
6303;; [vshrntq_m_n_s, vshrntq_m_n_u])
6304;;
6305(define_insn "mve_vshrntq_m_n_<supf><mode>"
6306  [
6307   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6308          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6309                           (match_operand:MVE_5 2 "s_register_operand" "w")
6310                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6311                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6312           VSHRNTQ_M_N))
6313  ]
6314  "TARGET_HAVE_MVE"
6315  "vpst\;vshrntt.i%#<V_sz_elem>\t%q0, %q2, %3"
6316  [(set_attr "type" "mve_move")
6317   (set_attr "length""8")])
6318
6319;;
6320;; [vmlsldavaq_p_s])
6321;;
6322(define_insn "mve_vmlsldavaq_p_s<mode>"
6323  [
6324   (set (match_operand:DI 0 "s_register_operand" "=r")
6325          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6326                           (match_operand:MVE_5 2 "s_register_operand" "w")
6327                           (match_operand:MVE_5 3 "s_register_operand" "w")
6328                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6329           VMLSLDAVAQ_P_S))
6330  ]
6331  "TARGET_HAVE_MVE"
6332  "vpst\;vmlsldavat.s%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
6333  [(set_attr "type" "mve_move")
6334   (set_attr "length""8")])
6335
6336;;
6337;; [vmlsldavaxq_p_s])
6338;;
6339(define_insn "mve_vmlsldavaxq_p_s<mode>"
6340  [
6341   (set (match_operand:DI 0 "s_register_operand" "=r")
6342          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6343                           (match_operand:MVE_5 2 "s_register_operand" "w")
6344                           (match_operand:MVE_5 3 "s_register_operand" "w")
6345                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6346           VMLSLDAVAXQ_P_S))
6347  ]
6348  "TARGET_HAVE_MVE"
6349  "vpst\;vmlsldavaxt.s%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
6350  [(set_attr "type" "mve_move")
6351   (set_attr "length""8")])
6352
6353;;
6354;; [vmullbq_poly_m_p])
6355;;
6356(define_insn "mve_vmullbq_poly_m_p<mode>"
6357  [
6358   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
6359          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6360                           (match_operand:MVE_3 2 "s_register_operand" "w")
6361                           (match_operand:MVE_3 3 "s_register_operand" "w")
6362                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6363           VMULLBQ_POLY_M_P))
6364  ]
6365  "TARGET_HAVE_MVE"
6366  "vpst\;vmullbt.p%#<V_sz_elem>\t%q0, %q2, %q3"
6367  [(set_attr "type" "mve_move")
6368   (set_attr "length""8")])
6369
6370;;
6371;; [vmulltq_poly_m_p])
6372;;
6373(define_insn "mve_vmulltq_poly_m_p<mode>"
6374  [
6375   (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
6376          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6377                           (match_operand:MVE_3 2 "s_register_operand" "w")
6378                           (match_operand:MVE_3 3 "s_register_operand" "w")
6379                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6380           VMULLTQ_POLY_M_P))
6381  ]
6382  "TARGET_HAVE_MVE"
6383  "vpst\;vmulltt.p%#<V_sz_elem>\t%q0, %q2, %q3"
6384  [(set_attr "type" "mve_move")
6385   (set_attr "length""8")])
6386
6387;;
6388;; [vqdmullbq_m_n_s])
6389;;
6390(define_insn "mve_vqdmullbq_m_n_s<mode>"
6391  [
6392   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
6393          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6394                           (match_operand:MVE_5 2 "s_register_operand" "w")
6395                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6396                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6397           VQDMULLBQ_M_N_S))
6398  ]
6399  "TARGET_HAVE_MVE"
6400  "vpst\;vqdmullbt.s%#<V_sz_elem>\t%q0, %q2, %3"
6401  [(set_attr "type" "mve_move")
6402   (set_attr "length""8")])
6403
6404;;
6405;; [vqdmullbq_m_s])
6406;;
6407(define_insn "mve_vqdmullbq_m_s<mode>"
6408  [
6409   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
6410          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6411                           (match_operand:MVE_5 2 "s_register_operand" "w")
6412                           (match_operand:MVE_5 3 "s_register_operand" "w")
6413                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6414           VQDMULLBQ_M_S))
6415  ]
6416  "TARGET_HAVE_MVE"
6417  "vpst\;vqdmullbt.s%#<V_sz_elem>\t%q0, %q2, %q3"
6418  [(set_attr "type" "mve_move")
6419   (set_attr "length""8")])
6420
6421;;
6422;; [vqdmulltq_m_n_s])
6423;;
6424(define_insn "mve_vqdmulltq_m_n_s<mode>"
6425  [
6426   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
6427          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6428                           (match_operand:MVE_5 2 "s_register_operand" "w")
6429                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6430                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6431           VQDMULLTQ_M_N_S))
6432  ]
6433  "TARGET_HAVE_MVE"
6434  "vpst\;vqdmulltt.s%#<V_sz_elem>\t%q0, %q2, %3"
6435  [(set_attr "type" "mve_move")
6436   (set_attr "length""8")])
6437
6438;;
6439;; [vqdmulltq_m_s])
6440;;
6441(define_insn "mve_vqdmulltq_m_s<mode>"
6442  [
6443   (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
6444          (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
6445                           (match_operand:MVE_5 2 "s_register_operand" "w")
6446                           (match_operand:MVE_5 3 "s_register_operand" "w")
6447                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6448           VQDMULLTQ_M_S))
6449  ]
6450  "TARGET_HAVE_MVE"
6451  "vpst\;vqdmulltt.s%#<V_sz_elem>\t%q0, %q2, %q3"
6452  [(set_attr "type" "mve_move")
6453   (set_attr "length""8")])
6454
6455;;
6456;; [vqrshrunbq_m_n_s])
6457;;
6458(define_insn "mve_vqrshrunbq_m_n_s<mode>"
6459  [
6460   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6461          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6462                           (match_operand:MVE_5 2 "s_register_operand" "w")
6463                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6464                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6465           VQRSHRUNBQ_M_N_S))
6466  ]
6467  "TARGET_HAVE_MVE"
6468  "vpst\;vqrshrunbt.s%#<V_sz_elem>\t%q0, %q2, %3"
6469  [(set_attr "type" "mve_move")
6470   (set_attr "length""8")])
6471
6472;;
6473;; [vqrshruntq_m_n_s])
6474;;
6475(define_insn "mve_vqrshruntq_m_n_s<mode>"
6476  [
6477   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6478          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6479                           (match_operand:MVE_5 2 "s_register_operand" "w")
6480                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6481                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6482           VQRSHRUNTQ_M_N_S))
6483  ]
6484  "TARGET_HAVE_MVE"
6485  "vpst\;vqrshruntt.s%#<V_sz_elem>\t%q0, %q2, %3"
6486  [(set_attr "type" "mve_move")
6487   (set_attr "length""8")])
6488
6489;;
6490;; [vqshrunbq_m_n_s])
6491;;
6492(define_insn "mve_vqshrunbq_m_n_s<mode>"
6493  [
6494   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6495          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6496                           (match_operand:MVE_5 2 "s_register_operand" "w")
6497                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6498                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6499           VQSHRUNBQ_M_N_S))
6500  ]
6501  "TARGET_HAVE_MVE"
6502  "vpst\;vqshrunbt.s%#<V_sz_elem>\t%q0, %q2, %3"
6503  [(set_attr "type" "mve_move")
6504   (set_attr "length""8")])
6505
6506;;
6507;; [vqshruntq_m_n_s])
6508;;
6509(define_insn "mve_vqshruntq_m_n_s<mode>"
6510  [
6511   (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
6512          (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
6513                           (match_operand:MVE_5 2 "s_register_operand" "w")
6514                           (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
6515                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6516           VQSHRUNTQ_M_N_S))
6517  ]
6518  "TARGET_HAVE_MVE"
6519  "vpst\;vqshruntt.s%#<V_sz_elem>\t%q0, %q2, %3"
6520  [(set_attr "type" "mve_move")
6521   (set_attr "length""8")])
6522
6523;;
6524;; [vrmlaldavhaq_p_u])
6525;;
6526(define_insn "mve_vrmlaldavhaq_p_uv4si"
6527  [
6528   (set (match_operand:DI 0 "s_register_operand" "=r")
6529          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6530                           (match_operand:V4SI 2 "s_register_operand" "w")
6531                           (match_operand:V4SI 3 "s_register_operand" "w")
6532                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6533           VRMLALDAVHAQ_P_U))
6534  ]
6535  "TARGET_HAVE_MVE"
6536  "vpst\;vrmlaldavhat.u32\t%Q0, %R0, %q2, %q3"
6537  [(set_attr "type" "mve_move")
6538   (set_attr "length""8")])
6539
6540;;
6541;; [vrmlaldavhaxq_p_s])
6542;;
6543(define_insn "mve_vrmlaldavhaxq_p_sv4si"
6544  [
6545   (set (match_operand:DI 0 "s_register_operand" "=r")
6546          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6547                           (match_operand:V4SI 2 "s_register_operand" "w")
6548                           (match_operand:V4SI 3 "s_register_operand" "w")
6549                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6550           VRMLALDAVHAXQ_P_S))
6551  ]
6552  "TARGET_HAVE_MVE"
6553  "vpst\;vrmlaldavhaxt.s32\t%Q0, %R0, %q2, %q3"
6554  [(set_attr "type" "mve_move")
6555   (set_attr "length""8")])
6556
6557;;
6558;; [vrmlsldavhaq_p_s])
6559;;
6560(define_insn "mve_vrmlsldavhaq_p_sv4si"
6561  [
6562   (set (match_operand:DI 0 "s_register_operand" "=r")
6563          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6564                           (match_operand:V4SI 2 "s_register_operand" "w")
6565                           (match_operand:V4SI 3 "s_register_operand" "w")
6566                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6567           VRMLSLDAVHAQ_P_S))
6568  ]
6569  "TARGET_HAVE_MVE"
6570  "vpst\;vrmlsldavhat.s32\t%Q0, %R0, %q2, %q3"
6571  [(set_attr "type" "mve_move")
6572   (set_attr "length""8")])
6573
6574;;
6575;; [vrmlsldavhaxq_p_s])
6576;;
6577(define_insn "mve_vrmlsldavhaxq_p_sv4si"
6578  [
6579   (set (match_operand:DI 0 "s_register_operand" "=r")
6580          (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
6581                           (match_operand:V4SI 2 "s_register_operand" "w")
6582                           (match_operand:V4SI 3 "s_register_operand" "w")
6583                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6584           VRMLSLDAVHAXQ_P_S))
6585  ]
6586  "TARGET_HAVE_MVE"
6587  "vpst\;vrmlsldavhaxt.s32\t%Q0, %R0, %q2, %q3"
6588  [(set_attr "type" "mve_move")
6589   (set_attr "length""8")])
6590;;
6591;; [vabdq_m_f])
6592;;
6593(define_insn "mve_vabdq_m_f<mode>"
6594  [
6595   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6596          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6597                           (match_operand:MVE_0 2 "s_register_operand" "w")
6598                           (match_operand:MVE_0 3 "s_register_operand" "w")
6599                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6600           VABDQ_M_F))
6601  ]
6602  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6603  "vpst\;vabdt.f%#<V_sz_elem> %q0, %q2, %q3"
6604  [(set_attr "type" "mve_move")
6605   (set_attr "length""8")])
6606
6607;;
6608;; [vaddq_m_f])
6609;;
6610(define_insn "mve_vaddq_m_f<mode>"
6611  [
6612   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6613          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6614                           (match_operand:MVE_0 2 "s_register_operand" "w")
6615                           (match_operand:MVE_0 3 "s_register_operand" "w")
6616                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6617           VADDQ_M_F))
6618  ]
6619  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6620  "vpst\;vaddt.f%#<V_sz_elem> %q0, %q2, %q3"
6621  [(set_attr "type" "mve_move")
6622   (set_attr "length""8")])
6623
6624;;
6625;; [vaddq_m_n_f])
6626;;
6627(define_insn "mve_vaddq_m_n_f<mode>"
6628  [
6629   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6630          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6631                           (match_operand:MVE_0 2 "s_register_operand" "w")
6632                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6633                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6634           VADDQ_M_N_F))
6635  ]
6636  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6637  "vpst\;vaddt.f%#<V_sz_elem> %q0, %q2, %3"
6638  [(set_attr "type" "mve_move")
6639   (set_attr "length""8")])
6640
6641;;
6642;; [vandq_m_f])
6643;;
6644(define_insn "mve_vandq_m_f<mode>"
6645  [
6646   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6647          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6648                           (match_operand:MVE_0 2 "s_register_operand" "w")
6649                           (match_operand:MVE_0 3 "s_register_operand" "w")
6650                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6651           VANDQ_M_F))
6652  ]
6653  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6654  "vpst\;vandt\t%q0, %q2, %q3"
6655  [(set_attr "type" "mve_move")
6656   (set_attr "length""8")])
6657
6658;;
6659;; [vbicq_m_f])
6660;;
6661(define_insn "mve_vbicq_m_f<mode>"
6662  [
6663   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6664          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6665                           (match_operand:MVE_0 2 "s_register_operand" "w")
6666                           (match_operand:MVE_0 3 "s_register_operand" "w")
6667                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6668           VBICQ_M_F))
6669  ]
6670  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6671  "vpst\;vbict\t%q0, %q2, %q3"
6672  [(set_attr "type" "mve_move")
6673   (set_attr "length""8")])
6674
6675;;
6676;; [vbrsrq_m_n_f])
6677;;
6678(define_insn "mve_vbrsrq_m_n_f<mode>"
6679  [
6680   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6681          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6682                           (match_operand:MVE_0 2 "s_register_operand" "w")
6683                           (match_operand:SI 3 "s_register_operand" "r")
6684                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6685           VBRSRQ_M_N_F))
6686  ]
6687  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6688  "vpst\;vbrsrt.%#<V_sz_elem> %q0, %q2, %3"
6689  [(set_attr "type" "mve_move")
6690   (set_attr "length""8")])
6691
6692;;
6693;; [vcaddq_rot270_m_f])
6694;;
6695(define_insn "mve_vcaddq_rot270_m_f<mode>"
6696  [
6697   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6698          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6699                           (match_operand:MVE_0 2 "s_register_operand" "w")
6700                           (match_operand:MVE_0 3 "s_register_operand" "w")
6701                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6702           VCADDQ_ROT270_M_F))
6703  ]
6704  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6705  "vpst\;vcaddt.f%#<V_sz_elem>          %q0, %q2, %q3, #270"
6706  [(set_attr "type" "mve_move")
6707   (set_attr "length""8")])
6708
6709;;
6710;; [vcaddq_rot90_m_f])
6711;;
6712(define_insn "mve_vcaddq_rot90_m_f<mode>"
6713  [
6714   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6715          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6716                           (match_operand:MVE_0 2 "s_register_operand" "w")
6717                           (match_operand:MVE_0 3 "s_register_operand" "w")
6718                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6719           VCADDQ_ROT90_M_F))
6720  ]
6721  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6722  "vpst\;vcaddt.f%#<V_sz_elem>          %q0, %q2, %q3, #90"
6723  [(set_attr "type" "mve_move")
6724   (set_attr "length""8")])
6725
6726;;
6727;; [vcmlaq_m_f])
6728;;
6729(define_insn "mve_vcmlaq_m_f<mode>"
6730  [
6731   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6732          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6733                           (match_operand:MVE_0 2 "s_register_operand" "w")
6734                           (match_operand:MVE_0 3 "s_register_operand" "w")
6735                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6736           VCMLAQ_M_F))
6737  ]
6738  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6739  "vpst\;vcmlat.f%#<V_sz_elem>          %q0, %q2, %q3, #0"
6740  [(set_attr "type" "mve_move")
6741   (set_attr "length""8")])
6742
6743;;
6744;; [vcmlaq_rot180_m_f])
6745;;
6746(define_insn "mve_vcmlaq_rot180_m_f<mode>"
6747  [
6748   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6749          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6750                           (match_operand:MVE_0 2 "s_register_operand" "w")
6751                           (match_operand:MVE_0 3 "s_register_operand" "w")
6752                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6753           VCMLAQ_ROT180_M_F))
6754  ]
6755  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6756  "vpst\;vcmlat.f%#<V_sz_elem>          %q0, %q2, %q3, #180"
6757  [(set_attr "type" "mve_move")
6758   (set_attr "length""8")])
6759
6760;;
6761;; [vcmlaq_rot270_m_f])
6762;;
6763(define_insn "mve_vcmlaq_rot270_m_f<mode>"
6764  [
6765   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6766          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6767                           (match_operand:MVE_0 2 "s_register_operand" "w")
6768                           (match_operand:MVE_0 3 "s_register_operand" "w")
6769                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6770           VCMLAQ_ROT270_M_F))
6771  ]
6772  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6773  "vpst\;vcmlat.f%#<V_sz_elem>          %q0, %q2, %q3, #270"
6774  [(set_attr "type" "mve_move")
6775   (set_attr "length""8")])
6776
6777;;
6778;; [vcmlaq_rot90_m_f])
6779;;
6780(define_insn "mve_vcmlaq_rot90_m_f<mode>"
6781  [
6782   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6783          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6784                           (match_operand:MVE_0 2 "s_register_operand" "w")
6785                           (match_operand:MVE_0 3 "s_register_operand" "w")
6786                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6787           VCMLAQ_ROT90_M_F))
6788  ]
6789  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6790  "vpst\;vcmlat.f%#<V_sz_elem>          %q0, %q2, %q3, #90"
6791  [(set_attr "type" "mve_move")
6792   (set_attr "length""8")])
6793
6794;;
6795;; [vcmulq_m_f])
6796;;
6797(define_insn "mve_vcmulq_m_f<mode>"
6798  [
6799   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6800          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6801                           (match_operand:MVE_0 2 "s_register_operand" "w")
6802                           (match_operand:MVE_0 3 "s_register_operand" "w")
6803                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6804           VCMULQ_M_F))
6805  ]
6806  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6807  "vpst\;vcmult.f%#<V_sz_elem>          %q0, %q2, %q3, #0"
6808  [(set_attr "type" "mve_move")
6809   (set_attr "length""8")])
6810
6811;;
6812;; [vcmulq_rot180_m_f])
6813;;
6814(define_insn "mve_vcmulq_rot180_m_f<mode>"
6815  [
6816   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6817          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6818                           (match_operand:MVE_0 2 "s_register_operand" "w")
6819                           (match_operand:MVE_0 3 "s_register_operand" "w")
6820                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6821           VCMULQ_ROT180_M_F))
6822  ]
6823  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6824  "vpst\;vcmult.f%#<V_sz_elem>          %q0, %q2, %q3, #180"
6825  [(set_attr "type" "mve_move")
6826   (set_attr "length""8")])
6827
6828;;
6829;; [vcmulq_rot270_m_f])
6830;;
6831(define_insn "mve_vcmulq_rot270_m_f<mode>"
6832  [
6833   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6834          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6835                           (match_operand:MVE_0 2 "s_register_operand" "w")
6836                           (match_operand:MVE_0 3 "s_register_operand" "w")
6837                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6838           VCMULQ_ROT270_M_F))
6839  ]
6840  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6841  "vpst\;vcmult.f%#<V_sz_elem>          %q0, %q2, %q3, #270"
6842  [(set_attr "type" "mve_move")
6843   (set_attr "length""8")])
6844
6845;;
6846;; [vcmulq_rot90_m_f])
6847;;
6848(define_insn "mve_vcmulq_rot90_m_f<mode>"
6849  [
6850   (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
6851          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6852                           (match_operand:MVE_0 2 "s_register_operand" "w")
6853                           (match_operand:MVE_0 3 "s_register_operand" "w")
6854                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6855           VCMULQ_ROT90_M_F))
6856  ]
6857  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6858  "vpst\;vcmult.f%#<V_sz_elem>          %q0, %q2, %q3, #90"
6859  [(set_attr "type" "mve_move")
6860   (set_attr "length""8")])
6861
6862;;
6863;; [veorq_m_f])
6864;;
6865(define_insn "mve_veorq_m_f<mode>"
6866  [
6867   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6868          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6869                           (match_operand:MVE_0 2 "s_register_operand" "w")
6870                           (match_operand:MVE_0 3 "s_register_operand" "w")
6871                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6872           VEORQ_M_F))
6873  ]
6874  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6875  "vpst\;veort\t%q0, %q2, %q3"
6876  [(set_attr "type" "mve_move")
6877   (set_attr "length""8")])
6878
6879;;
6880;; [vfmaq_m_f])
6881;;
6882(define_insn "mve_vfmaq_m_f<mode>"
6883  [
6884   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6885          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6886                           (match_operand:MVE_0 2 "s_register_operand" "w")
6887                           (match_operand:MVE_0 3 "s_register_operand" "w")
6888                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6889           VFMAQ_M_F))
6890  ]
6891  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6892  "vpst\;vfmat.f%#<V_sz_elem> %q0, %q2, %q3"
6893  [(set_attr "type" "mve_move")
6894   (set_attr "length""8")])
6895
6896;;
6897;; [vfmaq_m_n_f])
6898;;
6899(define_insn "mve_vfmaq_m_n_f<mode>"
6900  [
6901   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6902          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6903                           (match_operand:MVE_0 2 "s_register_operand" "w")
6904                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6905                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6906           VFMAQ_M_N_F))
6907  ]
6908  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6909  "vpst\;vfmat.f%#<V_sz_elem> %q0, %q2, %3"
6910  [(set_attr "type" "mve_move")
6911   (set_attr "length""8")])
6912
6913;;
6914;; [vfmasq_m_n_f])
6915;;
6916(define_insn "mve_vfmasq_m_n_f<mode>"
6917  [
6918   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6919          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6920                           (match_operand:MVE_0 2 "s_register_operand" "w")
6921                           (match_operand:<V_elem> 3 "s_register_operand" "r")
6922                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6923           VFMASQ_M_N_F))
6924  ]
6925  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6926  "vpst\;vfmast.f%#<V_sz_elem>          %q0, %q2, %3"
6927  [(set_attr "type" "mve_move")
6928   (set_attr "length""8")])
6929
6930;;
6931;; [vfmsq_m_f])
6932;;
6933(define_insn "mve_vfmsq_m_f<mode>"
6934  [
6935   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6936          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6937                           (match_operand:MVE_0 2 "s_register_operand" "w")
6938                           (match_operand:MVE_0 3 "s_register_operand" "w")
6939                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6940           VFMSQ_M_F))
6941  ]
6942  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6943  "vpst\;vfmst.f%#<V_sz_elem> %q0, %q2, %q3"
6944  [(set_attr "type" "mve_move")
6945   (set_attr "length""8")])
6946
6947;;
6948;; [vmaxnmq_m_f])
6949;;
6950(define_insn "mve_vmaxnmq_m_f<mode>"
6951  [
6952   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6953          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6954                           (match_operand:MVE_0 2 "s_register_operand" "w")
6955                           (match_operand:MVE_0 3 "s_register_operand" "w")
6956                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6957           VMAXNMQ_M_F))
6958  ]
6959  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6960  "vpst\;vmaxnmt.f%#<V_sz_elem>         %q0, %q2, %q3"
6961  [(set_attr "type" "mve_move")
6962   (set_attr "length""8")])
6963
6964;;
6965;; [vminnmq_m_f])
6966;;
6967(define_insn "mve_vminnmq_m_f<mode>"
6968  [
6969   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6970          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6971                           (match_operand:MVE_0 2 "s_register_operand" "w")
6972                           (match_operand:MVE_0 3 "s_register_operand" "w")
6973                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6974           VMINNMQ_M_F))
6975  ]
6976  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6977  "vpst\;vminnmt.f%#<V_sz_elem>         %q0, %q2, %q3"
6978  [(set_attr "type" "mve_move")
6979   (set_attr "length""8")])
6980
6981;;
6982;; [vmulq_m_f])
6983;;
6984(define_insn "mve_vmulq_m_f<mode>"
6985  [
6986   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
6987          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
6988                           (match_operand:MVE_0 2 "s_register_operand" "w")
6989                           (match_operand:MVE_0 3 "s_register_operand" "w")
6990                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6991           VMULQ_M_F))
6992  ]
6993  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6994  "vpst\;vmult.f%#<V_sz_elem> %q0, %q2, %q3"
6995  [(set_attr "type" "mve_move")
6996   (set_attr "length""8")])
6997
6998;;
6999;; [vmulq_m_n_f])
7000;;
7001(define_insn "mve_vmulq_m_n_f<mode>"
7002  [
7003   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7004          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
7005                           (match_operand:MVE_0 2 "s_register_operand" "w")
7006                           (match_operand:<V_elem> 3 "s_register_operand" "r")
7007                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7008           VMULQ_M_N_F))
7009  ]
7010  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7011  "vpst\;vmult.f%#<V_sz_elem> %q0, %q2, %3"
7012  [(set_attr "type" "mve_move")
7013   (set_attr "length""8")])
7014
7015;;
7016;; [vornq_m_f])
7017;;
7018(define_insn "mve_vornq_m_f<mode>"
7019  [
7020   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7021          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
7022                           (match_operand:MVE_0 2 "s_register_operand" "w")
7023                           (match_operand:MVE_0 3 "s_register_operand" "w")
7024                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7025           VORNQ_M_F))
7026  ]
7027  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7028  "vpst\;vornt\t%q0, %q2, %q3"
7029  [(set_attr "type" "mve_move")
7030   (set_attr "length""8")])
7031
7032;;
7033;; [vorrq_m_f])
7034;;
7035(define_insn "mve_vorrq_m_f<mode>"
7036  [
7037   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7038          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
7039                           (match_operand:MVE_0 2 "s_register_operand" "w")
7040                           (match_operand:MVE_0 3 "s_register_operand" "w")
7041                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7042           VORRQ_M_F))
7043  ]
7044  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7045  "vpst\;vorrt\t%q0, %q2, %q3"
7046  [(set_attr "type" "mve_move")
7047   (set_attr "length""8")])
7048
7049;;
7050;; [vsubq_m_f])
7051;;
7052(define_insn "mve_vsubq_m_f<mode>"
7053  [
7054   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7055          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
7056                           (match_operand:MVE_0 2 "s_register_operand" "w")
7057                           (match_operand:MVE_0 3 "s_register_operand" "w")
7058                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7059           VSUBQ_M_F))
7060  ]
7061  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7062  "vpst\;vsubt.f%#<V_sz_elem>\t%q0, %q2, %q3"
7063  [(set_attr "type" "mve_move")
7064   (set_attr "length""8")])
7065
7066;;
7067;; [vsubq_m_n_f])
7068;;
7069(define_insn "mve_vsubq_m_n_f<mode>"
7070  [
7071   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7072          (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
7073                           (match_operand:MVE_0 2 "s_register_operand" "w")
7074                           (match_operand:<V_elem> 3 "s_register_operand" "r")
7075                           (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7076           VSUBQ_M_N_F))
7077  ]
7078  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7079  "vpst\;vsubt.f%#<V_sz_elem>\t%q0, %q2, %3"
7080  [(set_attr "type" "mve_move")
7081   (set_attr "length""8")])
7082
7083;;
7084;; [vstrbq_s vstrbq_u]
7085;;
7086(define_insn "mve_vstrbq_<supf><mode>"
7087  [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
7088          (unspec:<MVE_B_ELEM> [(match_operand:MVE_2 1 "s_register_operand" "w")]
7089           VSTRBQ))
7090  ]
7091  "TARGET_HAVE_MVE"
7092{
7093   rtx ops[2];
7094   int regno = REGNO (operands[1]);
7095   ops[1] = gen_rtx_REG (TImode, regno);
7096   ops[0]  = operands[0];
7097   output_asm_insn("vstrb.<V_sz_elem>\t%q1, %E0",ops);
7098   return "";
7099}
7100  [(set_attr "length" "4")])
7101
7102;;
7103;; [vstrbq_scatter_offset_s vstrbq_scatter_offset_u]
7104;;
7105(define_expand "mve_vstrbq_scatter_offset_<supf><mode>"
7106  [(match_operand:<MVE_B_ELEM> 0 "mve_scatter_memory")
7107   (match_operand:MVE_2 1 "s_register_operand")
7108   (match_operand:MVE_2 2 "s_register_operand")
7109   (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
7110  "TARGET_HAVE_MVE"
7111{
7112  rtx ind = XEXP (operands[0], 0);
7113  gcc_assert (REG_P (ind));
7114  emit_insn (gen_mve_vstrbq_scatter_offset_<supf><mode>_insn (ind, operands[1],
7115                                                                            operands[2]));
7116  DONE;
7117})
7118
7119(define_insn "mve_vstrbq_scatter_offset_<supf><mode>_insn"
7120  [(set (mem:BLK (scratch))
7121          (unspec:BLK
7122            [(match_operand:SI 0 "register_operand" "r")
7123             (match_operand:MVE_2 1 "s_register_operand" "w")
7124             (match_operand:MVE_2 2 "s_register_operand" "w")]
7125            VSTRBSOQ))]
7126  "TARGET_HAVE_MVE"
7127  "vstrb.<V_sz_elem>\t%q2, [%0, %q1]"
7128  [(set_attr "length" "4")])
7129
7130;;
7131;; [vstrwq_scatter_base_s vstrwq_scatter_base_u]
7132;;
7133(define_insn "mve_vstrwq_scatter_base_<supf>v4si"
7134  [(set (mem:BLK (scratch))
7135          (unspec:BLK
7136                    [(match_operand:V4SI 0 "s_register_operand" "w")
7137                     (match_operand:SI 1 "immediate_operand" "i")
7138                     (match_operand:V4SI 2 "s_register_operand" "w")]
7139           VSTRWSBQ))
7140  ]
7141  "TARGET_HAVE_MVE"
7142{
7143   rtx ops[3];
7144   ops[0] = operands[0];
7145   ops[1] = operands[1];
7146   ops[2] = operands[2];
7147   output_asm_insn("vstrw.u32\t%q2, [%q0, %1]",ops);
7148   return "";
7149}
7150  [(set_attr "length" "4")])
7151
7152;;
7153;; [vldrbq_gather_offset_s vldrbq_gather_offset_u]
7154;;
7155(define_insn "mve_vldrbq_gather_offset_<supf><mode>"
7156  [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
7157          (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
7158                           (match_operand:MVE_2 2 "s_register_operand" "w")]
7159           VLDRBGOQ))
7160  ]
7161  "TARGET_HAVE_MVE"
7162{
7163   rtx ops[3];
7164   ops[0] = operands[0];
7165   ops[1] = operands[1];
7166   ops[2] = operands[2];
7167   if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
7168     output_asm_insn ("vldrb.u8\t%q0, [%m1, %q2]",ops);
7169   else
7170     output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
7171   return "";
7172}
7173  [(set_attr "length" "4")])
7174
7175;;
7176;; [vldrbq_s vldrbq_u]
7177;;
7178(define_insn "mve_vldrbq_<supf><mode>"
7179  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
7180          (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")]
7181           VLDRBQ))
7182  ]
7183  "TARGET_HAVE_MVE"
7184{
7185   rtx ops[2];
7186   int regno = REGNO (operands[0]);
7187   ops[0] = gen_rtx_REG (TImode, regno);
7188   ops[1]  = operands[1];
7189   if (<V_sz_elem> == 8)
7190     output_asm_insn ("vldrb.<V_sz_elem>\t%q0, %E1",ops);
7191   else
7192     output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, %E1",ops);
7193   return "";
7194}
7195  [(set_attr "length" "4")])
7196
7197;;
7198;; [vldrwq_gather_base_s vldrwq_gather_base_u]
7199;;
7200(define_insn "mve_vldrwq_gather_base_<supf>v4si"
7201  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
7202          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
7203                          (match_operand:SI 2 "immediate_operand" "i")]
7204           VLDRWGBQ))
7205  ]
7206  "TARGET_HAVE_MVE"
7207{
7208   rtx ops[3];
7209   ops[0] = operands[0];
7210   ops[1] = operands[1];
7211   ops[2] = operands[2];
7212   output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
7213   return "";
7214}
7215  [(set_attr "length" "4")])
7216
7217;;
7218;; [vstrbq_scatter_offset_p_s vstrbq_scatter_offset_p_u]
7219;;
7220(define_expand "mve_vstrbq_scatter_offset_p_<supf><mode>"
7221  [(match_operand:<MVE_B_ELEM>  0 "mve_scatter_memory")
7222   (match_operand:MVE_2 1 "s_register_operand")
7223   (match_operand:MVE_2 2 "s_register_operand")
7224   (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
7225   (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
7226  "TARGET_HAVE_MVE"
7227{
7228  rtx ind = XEXP (operands[0], 0);
7229  gcc_assert (REG_P (ind));
7230  emit_insn (
7231    gen_mve_vstrbq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
7232                                                                   operands[2],
7233                                                                   operands[3]));
7234  DONE;
7235})
7236
7237(define_insn "mve_vstrbq_scatter_offset_p_<supf><mode>_insn"
7238  [(set (mem:BLK (scratch))
7239          (unspec:BLK
7240            [(match_operand:SI 0 "register_operand" "r")
7241             (match_operand:MVE_2 1 "s_register_operand" "w")
7242             (match_operand:MVE_2 2 "s_register_operand" "w")
7243             (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7244            VSTRBSOQ))]
7245  "TARGET_HAVE_MVE"
7246  "vpst\;vstrbt.<V_sz_elem>\t%q2, [%0, %q1]"
7247  [(set_attr "length" "8")])
7248
7249;;
7250;; [vstrwq_scatter_base_p_s vstrwq_scatter_base_p_u]
7251;;
7252(define_insn "mve_vstrwq_scatter_base_p_<supf>v4si"
7253  [(set (mem:BLK (scratch))
7254          (unspec:BLK
7255                    [(match_operand:V4SI 0 "s_register_operand" "w")
7256                     (match_operand:SI 1 "immediate_operand" "i")
7257                     (match_operand:V4SI 2 "s_register_operand" "w")
7258                     (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7259           VSTRWSBQ))
7260  ]
7261  "TARGET_HAVE_MVE"
7262{
7263   rtx ops[3];
7264   ops[0] = operands[0];
7265   ops[1] = operands[1];
7266   ops[2] = operands[2];
7267   output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
7268   return "";
7269}
7270  [(set_attr "length" "8")])
7271
7272(define_insn "mve_vstrbq_p_<supf><mode>"
7273  [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
7274          (unspec:<MVE_B_ELEM>
7275           [(match_operand:MVE_2 1 "s_register_operand" "w")
7276            (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
7277            (match_dup 0)]
7278           VSTRBQ))]
7279  "TARGET_HAVE_MVE"
7280{
7281   rtx ops[2];
7282   int regno = REGNO (operands[1]);
7283   ops[1] = gen_rtx_REG (TImode, regno);
7284   ops[0]  = operands[0];
7285   output_asm_insn ("vpst\;vstrbt.<V_sz_elem>\t%q1, %E0",ops);
7286   return "";
7287}
7288  [(set_attr "length" "8")])
7289
7290;;
7291;; [vldrbq_gather_offset_z_s vldrbq_gather_offset_z_u]
7292;;
7293(define_insn "mve_vldrbq_gather_offset_z_<supf><mode>"
7294  [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
7295          (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
7296                           (match_operand:MVE_2 2 "s_register_operand" "w")
7297                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7298           VLDRBGOQ))
7299  ]
7300  "TARGET_HAVE_MVE"
7301{
7302   rtx ops[4];
7303   ops[0] = operands[0];
7304   ops[1] = operands[1];
7305   ops[2] = operands[2];
7306   ops[3] = operands[3];
7307   if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
7308     output_asm_insn ("vpst\n\tvldrbt.u8\t%q0, [%m1, %q2]",ops);
7309   else
7310     output_asm_insn ("vpst\n\tvldrbt.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
7311   return "";
7312}
7313  [(set_attr "length" "8")])
7314
7315;;
7316;; [vldrbq_z_s vldrbq_z_u]
7317;;
7318(define_insn "mve_vldrbq_z_<supf><mode>"
7319  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
7320          (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")
7321                           (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
7322           VLDRBQ))
7323  ]
7324  "TARGET_HAVE_MVE"
7325{
7326   rtx ops[2];
7327   int regno = REGNO (operands[0]);
7328   ops[0] = gen_rtx_REG (TImode, regno);
7329   ops[1]  = operands[1];
7330   if (<V_sz_elem> == 8)
7331     output_asm_insn ("vpst\;vldrbt.<V_sz_elem>\t%q0, %E1",ops);
7332   else
7333     output_asm_insn ("vpst\;vldrbt.<supf><V_sz_elem>\t%q0, %E1",ops);
7334   return "";
7335}
7336  [(set_attr "length" "8")])
7337
7338;;
7339;; [vldrwq_gather_base_z_s vldrwq_gather_base_z_u]
7340;;
7341(define_insn "mve_vldrwq_gather_base_z_<supf>v4si"
7342  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
7343          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
7344                          (match_operand:SI 2 "immediate_operand" "i")
7345                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7346           VLDRWGBQ))
7347  ]
7348  "TARGET_HAVE_MVE"
7349{
7350   rtx ops[3];
7351   ops[0] = operands[0];
7352   ops[1] = operands[1];
7353   ops[2] = operands[2];
7354   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
7355   return "";
7356}
7357  [(set_attr "length" "8")])
7358
7359;;
7360;; [vldrhq_f]
7361;;
7362(define_insn "mve_vldrhq_fv8hf"
7363  [(set (match_operand:V8HF 0 "s_register_operand" "=w")
7364          (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")]
7365           VLDRHQ_F))
7366  ]
7367  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7368{
7369   rtx ops[2];
7370   int regno = REGNO (operands[0]);
7371   ops[0] = gen_rtx_REG (TImode, regno);
7372   ops[1]  = operands[1];
7373   output_asm_insn ("vldrh.16\t%q0, %E1",ops);
7374   return "";
7375}
7376  [(set_attr "length" "4")])
7377
7378;;
7379;; [vldrhq_gather_offset_s vldrhq_gather_offset_u]
7380;;
7381(define_insn "mve_vldrhq_gather_offset_<supf><mode>"
7382  [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
7383          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
7384                           (match_operand:MVE_6 2 "s_register_operand" "w")]
7385          VLDRHGOQ))
7386  ]
7387  "TARGET_HAVE_MVE"
7388{
7389   rtx ops[3];
7390   ops[0] = operands[0];
7391   ops[1] = operands[1];
7392   ops[2] = operands[2];
7393   if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
7394     output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2]",ops);
7395   else
7396     output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
7397   return "";
7398}
7399  [(set_attr "length" "4")])
7400
7401;;
7402;; [vldrhq_gather_offset_z_s vldrhq_gather_offset_z_u]
7403;;
7404(define_insn "mve_vldrhq_gather_offset_z_<supf><mode>"
7405  [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
7406          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
7407                           (match_operand:MVE_6 2 "s_register_operand" "w")
7408                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
7409          ]VLDRHGOQ))
7410  ]
7411  "TARGET_HAVE_MVE"
7412{
7413   rtx ops[4];
7414   ops[0] = operands[0];
7415   ops[1] = operands[1];
7416   ops[2] = operands[2];
7417   ops[3] = operands[3];
7418   if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
7419     output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2]",ops);
7420   else
7421     output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
7422   return "";
7423}
7424 [(set_attr "length" "8")])
7425
7426;;
7427;; [vldrhq_gather_shifted_offset_s vldrhq_gather_shifted_offset_u]
7428;;
7429(define_insn "mve_vldrhq_gather_shifted_offset_<supf><mode>"
7430  [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
7431          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
7432                           (match_operand:MVE_6 2 "s_register_operand" "w")]
7433          VLDRHGSOQ))
7434  ]
7435  "TARGET_HAVE_MVE"
7436{
7437   rtx ops[3];
7438   ops[0] = operands[0];
7439   ops[1] = operands[1];
7440   ops[2] = operands[2];
7441      if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
7442     output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
7443   else
7444     output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
7445   return "";
7446}
7447  [(set_attr "length" "4")])
7448
7449;;
7450;; [vldrhq_gather_shifted_offset_z_s vldrhq_gather_shited_offset_z_u]
7451;;
7452(define_insn "mve_vldrhq_gather_shifted_offset_z_<supf><mode>"
7453  [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
7454          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
7455                           (match_operand:MVE_6 2 "s_register_operand" "w")
7456                           (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
7457          ]VLDRHGSOQ))
7458  ]
7459  "TARGET_HAVE_MVE"
7460{
7461   rtx ops[4];
7462   ops[0] = operands[0];
7463   ops[1] = operands[1];
7464   ops[2] = operands[2];
7465   ops[3] = operands[3];
7466   if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
7467     output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
7468   else
7469     output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
7470   return "";
7471}
7472  [(set_attr "length" "8")])
7473
7474;;
7475;; [vldrhq_s, vldrhq_u]
7476;;
7477(define_insn "mve_vldrhq_<supf><mode>"
7478  [(set (match_operand:MVE_6 0 "s_register_operand" "=w")
7479          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")]
7480           VLDRHQ))
7481  ]
7482  "TARGET_HAVE_MVE"
7483{
7484   rtx ops[2];
7485   int regno = REGNO (operands[0]);
7486   ops[0] = gen_rtx_REG (TImode, regno);
7487   ops[1]  = operands[1];
7488   if (<V_sz_elem> == 16)
7489     output_asm_insn ("vldrh.16\t%q0, %E1",ops);
7490   else
7491     output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, %E1",ops);
7492   return "";
7493}
7494  [(set_attr "length" "4")])
7495
7496;;
7497;; [vldrhq_z_f]
7498;;
7499(define_insn "mve_vldrhq_z_fv8hf"
7500  [(set (match_operand:V8HF 0 "s_register_operand" "=w")
7501          (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")
7502          (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
7503           VLDRHQ_F))
7504  ]
7505  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7506{
7507   rtx ops[2];
7508   int regno = REGNO (operands[0]);
7509   ops[0] = gen_rtx_REG (TImode, regno);
7510   ops[1]  = operands[1];
7511   output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
7512   return "";
7513}
7514  [(set_attr "length" "8")])
7515
7516;;
7517;; [vldrhq_z_s vldrhq_z_u]
7518;;
7519(define_insn "mve_vldrhq_z_<supf><mode>"
7520  [(set (match_operand:MVE_6 0 "s_register_operand" "=w")
7521          (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")
7522          (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
7523           VLDRHQ))
7524  ]
7525  "TARGET_HAVE_MVE"
7526{
7527   rtx ops[2];
7528   int regno = REGNO (operands[0]);
7529   ops[0] = gen_rtx_REG (TImode, regno);
7530   ops[1]  = operands[1];
7531   if (<V_sz_elem> == 16)
7532     output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
7533   else
7534     output_asm_insn ("vpst\;vldrht.<supf><V_sz_elem>\t%q0, %E1",ops);
7535   return "";
7536}
7537  [(set_attr "length" "8")])
7538
7539;;
7540;; [vldrwq_f]
7541;;
7542(define_insn "mve_vldrwq_fv4sf"
7543  [(set (match_operand:V4SF 0 "s_register_operand" "=w")
7544          (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
7545           VLDRWQ_F))
7546  ]
7547  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7548{
7549   rtx ops[2];
7550   int regno = REGNO (operands[0]);
7551   ops[0] = gen_rtx_REG (TImode, regno);
7552   ops[1]  = operands[1];
7553   output_asm_insn ("vldrw.32\t%q0, %E1",ops);
7554   return "";
7555}
7556  [(set_attr "length" "4")])
7557
7558;;
7559;; [vldrwq_s vldrwq_u]
7560;;
7561(define_insn "mve_vldrwq_<supf>v4si"
7562  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
7563          (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
7564           VLDRWQ))
7565  ]
7566  "TARGET_HAVE_MVE"
7567{
7568   rtx ops[2];
7569   int regno = REGNO (operands[0]);
7570   ops[0] = gen_rtx_REG (TImode, regno);
7571   ops[1]  = operands[1];
7572   output_asm_insn ("vldrw.32\t%q0, %E1",ops);
7573   return "";
7574}
7575  [(set_attr "length" "4")])
7576
7577;;
7578;; [vldrwq_z_f]
7579;;
7580(define_insn "mve_vldrwq_z_fv4sf"
7581  [(set (match_operand:V4SF 0 "s_register_operand" "=w")
7582          (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
7583          (match_operand:V4BI 2 "vpr_register_operand" "Up")]
7584           VLDRWQ_F))
7585  ]
7586  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7587{
7588   rtx ops[2];
7589   int regno = REGNO (operands[0]);
7590   ops[0] = gen_rtx_REG (TImode, regno);
7591   ops[1]  = operands[1];
7592   output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
7593   return "";
7594}
7595  [(set_attr "length" "8")])
7596
7597;;
7598;; [vldrwq_z_s vldrwq_z_u]
7599;;
7600(define_insn "mve_vldrwq_z_<supf>v4si"
7601  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
7602          (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
7603          (match_operand:V4BI 2 "vpr_register_operand" "Up")]
7604           VLDRWQ))
7605  ]
7606  "TARGET_HAVE_MVE"
7607{
7608   rtx ops[2];
7609   int regno = REGNO (operands[0]);
7610   ops[0] = gen_rtx_REG (TImode, regno);
7611   ops[1]  = operands[1];
7612   output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
7613   return "";
7614}
7615  [(set_attr "length" "8")])
7616
7617(define_expand "mve_vld1q_f<mode>"
7618  [(match_operand:MVE_0 0 "s_register_operand")
7619   (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "mve_memory_operand")] VLD1Q_F)
7620  ]
7621  "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
7622{
7623  emit_insn (gen_mve_vldr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
7624  DONE;
7625})
7626
7627(define_expand "mve_vld1q_<supf><mode>"
7628  [(match_operand:MVE_2 0 "s_register_operand")
7629   (unspec:MVE_2 [(match_operand:MVE_2 1 "mve_memory_operand")] VLD1Q)
7630  ]
7631  "TARGET_HAVE_MVE"
7632{
7633  emit_insn (gen_mve_vldr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
7634  DONE;
7635})
7636
7637;;
7638;; [vldrdq_gather_base_s vldrdq_gather_base_u]
7639;;
7640(define_insn "mve_vldrdq_gather_base_<supf>v2di"
7641  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7642          (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
7643                          (match_operand:SI 2 "immediate_operand" "i")]
7644           VLDRDGBQ))
7645  ]
7646  "TARGET_HAVE_MVE"
7647{
7648   rtx ops[3];
7649   ops[0] = operands[0];
7650   ops[1] = operands[1];
7651   ops[2] = operands[2];
7652   output_asm_insn ("vldrd.64\t%q0, [%q1, %2]",ops);
7653   return "";
7654}
7655  [(set_attr "length" "4")])
7656
7657;;
7658;; [vldrdq_gather_base_z_s vldrdq_gather_base_z_u]
7659;;
7660(define_insn "mve_vldrdq_gather_base_z_<supf>v2di"
7661  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7662          (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
7663                          (match_operand:SI 2 "immediate_operand" "i")
7664                          (match_operand:HI 3 "vpr_register_operand" "Up")]
7665           VLDRDGBQ))
7666  ]
7667  "TARGET_HAVE_MVE"
7668{
7669   rtx ops[3];
7670   ops[0] = operands[0];
7671   ops[1] = operands[1];
7672   ops[2] = operands[2];
7673   output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%q1, %2]",ops);
7674   return "";
7675}
7676  [(set_attr "length" "8")])
7677
7678;;
7679;; [vldrdq_gather_offset_s vldrdq_gather_offset_u]
7680;;
7681(define_insn "mve_vldrdq_gather_offset_<supf>v2di"
7682 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7683       (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
7684                         (match_operand:V2DI 2 "s_register_operand" "w")]
7685          VLDRDGOQ))
7686 ]
7687 "TARGET_HAVE_MVE"
7688{
7689  rtx ops[3];
7690  ops[0] = operands[0];
7691  ops[1] = operands[1];
7692  ops[2] = operands[2];
7693  output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2]",ops);
7694  return "";
7695}
7696 [(set_attr "length" "4")])
7697
7698;;
7699;; [vldrdq_gather_offset_z_s vldrdq_gather_offset_z_u]
7700;;
7701(define_insn "mve_vldrdq_gather_offset_z_<supf>v2di"
7702 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7703       (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
7704                         (match_operand:V2DI 2 "s_register_operand" "w")
7705                         (match_operand:HI 3 "vpr_register_operand" "Up")]
7706          VLDRDGOQ))
7707 ]
7708 "TARGET_HAVE_MVE"
7709{
7710  rtx ops[3];
7711  ops[0] = operands[0];
7712  ops[1] = operands[1];
7713  ops[2] = operands[2];
7714  output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2]",ops);
7715  return "";
7716}
7717 [(set_attr "length" "8")])
7718
7719;;
7720;; [vldrdq_gather_shifted_offset_s vldrdq_gather_shifted_offset_u]
7721;;
7722(define_insn "mve_vldrdq_gather_shifted_offset_<supf>v2di"
7723  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7724          (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
7725                          (match_operand:V2DI 2 "s_register_operand" "w")]
7726           VLDRDGSOQ))
7727  ]
7728  "TARGET_HAVE_MVE"
7729{
7730   rtx ops[3];
7731   ops[0] = operands[0];
7732   ops[1] = operands[1];
7733   ops[2] = operands[2];
7734   output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
7735   return "";
7736}
7737  [(set_attr "length" "4")])
7738
7739;;
7740;; [vldrdq_gather_shifted_offset_z_s vldrdq_gather_shifted_offset_z_u]
7741;;
7742(define_insn "mve_vldrdq_gather_shifted_offset_z_<supf>v2di"
7743  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
7744          (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
7745                          (match_operand:V2DI 2 "s_register_operand" "w")
7746                          (match_operand:HI 3 "vpr_register_operand" "Up")]
7747           VLDRDGSOQ))
7748  ]
7749  "TARGET_HAVE_MVE"
7750{
7751   rtx ops[3];
7752   ops[0] = operands[0];
7753   ops[1] = operands[1];
7754   ops[2] = operands[2];
7755   output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
7756   return "";
7757}
7758  [(set_attr "length" "8")])
7759
7760;;
7761;; [vldrhq_gather_offset_f]
7762;;
7763(define_insn "mve_vldrhq_gather_offset_fv8hf"
7764  [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
7765          (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
7766                          (match_operand:V8HI 2 "s_register_operand" "w")]
7767           VLDRHQGO_F))
7768  ]
7769  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7770{
7771   rtx ops[3];
7772   ops[0] = operands[0];
7773   ops[1] = operands[1];
7774   ops[2] = operands[2];
7775   output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2]",ops);
7776   return "";
7777}
7778  [(set_attr "length" "4")])
7779
7780;;
7781;; [vldrhq_gather_offset_z_f]
7782;;
7783(define_insn "mve_vldrhq_gather_offset_z_fv8hf"
7784  [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
7785          (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
7786                          (match_operand:V8HI 2 "s_register_operand" "w")
7787                          (match_operand:V8BI 3 "vpr_register_operand" "Up")]
7788           VLDRHQGO_F))
7789  ]
7790  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7791{
7792   rtx ops[4];
7793   ops[0] = operands[0];
7794   ops[1] = operands[1];
7795   ops[2] = operands[2];
7796   ops[3] = operands[3];
7797   output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2]",ops);
7798   return "";
7799}
7800  [(set_attr "length" "8")])
7801
7802;;
7803;; [vldrhq_gather_shifted_offset_f]
7804;;
7805(define_insn "mve_vldrhq_gather_shifted_offset_fv8hf"
7806  [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
7807          (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
7808                          (match_operand:V8HI 2 "s_register_operand" "w")]
7809           VLDRHQGSO_F))
7810  ]
7811  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7812{
7813   rtx ops[3];
7814   ops[0] = operands[0];
7815   ops[1] = operands[1];
7816   ops[2] = operands[2];
7817   output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
7818   return "";
7819}
7820  [(set_attr "length" "4")])
7821
7822;;
7823;; [vldrhq_gather_shifted_offset_z_f]
7824;;
7825(define_insn "mve_vldrhq_gather_shifted_offset_z_fv8hf"
7826  [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
7827          (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
7828                          (match_operand:V8HI 2 "s_register_operand" "w")
7829                          (match_operand:V8BI 3 "vpr_register_operand" "Up")]
7830           VLDRHQGSO_F))
7831  ]
7832  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7833{
7834   rtx ops[4];
7835   ops[0] = operands[0];
7836   ops[1] = operands[1];
7837   ops[2] = operands[2];
7838   ops[3] = operands[3];
7839   output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
7840   return "";
7841}
7842  [(set_attr "length" "8")])
7843
7844;;
7845;; [vldrwq_gather_base_f]
7846;;
7847(define_insn "mve_vldrwq_gather_base_fv4sf"
7848  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
7849          (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
7850                          (match_operand:SI 2 "immediate_operand" "i")]
7851           VLDRWQGB_F))
7852  ]
7853  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7854{
7855   rtx ops[3];
7856   ops[0] = operands[0];
7857   ops[1] = operands[1];
7858   ops[2] = operands[2];
7859   output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
7860   return "";
7861}
7862  [(set_attr "length" "4")])
7863
7864;;
7865;; [vldrwq_gather_base_z_f]
7866;;
7867(define_insn "mve_vldrwq_gather_base_z_fv4sf"
7868  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
7869          (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
7870                          (match_operand:SI 2 "immediate_operand" "i")
7871                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7872           VLDRWQGB_F))
7873  ]
7874  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7875{
7876   rtx ops[3];
7877   ops[0] = operands[0];
7878   ops[1] = operands[1];
7879   ops[2] = operands[2];
7880   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
7881   return "";
7882}
7883  [(set_attr "length" "8")])
7884
7885;;
7886;; [vldrwq_gather_offset_f]
7887;;
7888(define_insn "mve_vldrwq_gather_offset_fv4sf"
7889  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
7890          (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
7891                           (match_operand:V4SI 2 "s_register_operand" "w")]
7892           VLDRWQGO_F))
7893  ]
7894  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7895{
7896   rtx ops[3];
7897   ops[0] = operands[0];
7898   ops[1] = operands[1];
7899   ops[2] = operands[2];
7900   output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
7901   return "";
7902}
7903  [(set_attr "length" "4")])
7904
7905;;
7906;; [vldrwq_gather_offset_s vldrwq_gather_offset_u]
7907;;
7908(define_insn "mve_vldrwq_gather_offset_<supf>v4si"
7909  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
7910          (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
7911                           (match_operand:V4SI 2 "s_register_operand" "w")]
7912           VLDRWGOQ))
7913  ]
7914  "TARGET_HAVE_MVE"
7915{
7916   rtx ops[3];
7917   ops[0] = operands[0];
7918   ops[1] = operands[1];
7919   ops[2] = operands[2];
7920   output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
7921   return "";
7922}
7923  [(set_attr "length" "4")])
7924
7925;;
7926;; [vldrwq_gather_offset_z_f]
7927;;
7928(define_insn "mve_vldrwq_gather_offset_z_fv4sf"
7929  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
7930          (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
7931                          (match_operand:V4SI 2 "s_register_operand" "w")
7932                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7933           VLDRWQGO_F))
7934  ]
7935  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7936{
7937   rtx ops[4];
7938   ops[0] = operands[0];
7939   ops[1] = operands[1];
7940   ops[2] = operands[2];
7941   ops[3] = operands[3];
7942   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
7943   return "";
7944}
7945  [(set_attr "length" "8")])
7946
7947;;
7948;; [vldrwq_gather_offset_z_s vldrwq_gather_offset_z_u]
7949;;
7950(define_insn "mve_vldrwq_gather_offset_z_<supf>v4si"
7951  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
7952          (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
7953                          (match_operand:V4SI 2 "s_register_operand" "w")
7954                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7955           VLDRWGOQ))
7956  ]
7957  "TARGET_HAVE_MVE"
7958{
7959   rtx ops[4];
7960   ops[0] = operands[0];
7961   ops[1] = operands[1];
7962   ops[2] = operands[2];
7963   ops[3] = operands[3];
7964   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
7965   return "";
7966}
7967  [(set_attr "length" "8")])
7968
7969;;
7970;; [vldrwq_gather_shifted_offset_f]
7971;;
7972(define_insn "mve_vldrwq_gather_shifted_offset_fv4sf"
7973  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
7974          (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
7975                          (match_operand:V4SI 2 "s_register_operand" "w")]
7976           VLDRWQGSO_F))
7977  ]
7978  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7979{
7980   rtx ops[3];
7981   ops[0] = operands[0];
7982   ops[1] = operands[1];
7983   ops[2] = operands[2];
7984   output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
7985   return "";
7986}
7987  [(set_attr "length" "4")])
7988
7989;;
7990;; [vldrwq_gather_shifted_offset_s vldrwq_gather_shifted_offset_u]
7991;;
7992(define_insn "mve_vldrwq_gather_shifted_offset_<supf>v4si"
7993  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
7994          (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
7995                          (match_operand:V4SI 2 "s_register_operand" "w")]
7996           VLDRWGSOQ))
7997  ]
7998  "TARGET_HAVE_MVE"
7999{
8000   rtx ops[3];
8001   ops[0] = operands[0];
8002   ops[1] = operands[1];
8003   ops[2] = operands[2];
8004   output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
8005   return "";
8006}
8007  [(set_attr "length" "4")])
8008
8009;;
8010;; [vldrwq_gather_shifted_offset_z_f]
8011;;
8012(define_insn "mve_vldrwq_gather_shifted_offset_z_fv4sf"
8013  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
8014          (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
8015                          (match_operand:V4SI 2 "s_register_operand" "w")
8016                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8017           VLDRWQGSO_F))
8018  ]
8019  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8020{
8021   rtx ops[4];
8022   ops[0] = operands[0];
8023   ops[1] = operands[1];
8024   ops[2] = operands[2];
8025   ops[3] = operands[3];
8026   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
8027   return "";
8028}
8029  [(set_attr "length" "8")])
8030
8031;;
8032;; [vldrwq_gather_shifted_offset_z_s vldrwq_gather_shifted_offset_z_u]
8033;;
8034(define_insn "mve_vldrwq_gather_shifted_offset_z_<supf>v4si"
8035  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
8036          (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
8037                          (match_operand:V4SI 2 "s_register_operand" "w")
8038                          (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8039           VLDRWGSOQ))
8040  ]
8041  "TARGET_HAVE_MVE"
8042{
8043   rtx ops[4];
8044   ops[0] = operands[0];
8045   ops[1] = operands[1];
8046   ops[2] = operands[2];
8047   ops[3] = operands[3];
8048   output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
8049   return "";
8050}
8051  [(set_attr "length" "8")])
8052
8053;;
8054;; [vstrhq_f]
8055;;
8056(define_insn "mve_vstrhq_fv8hf"
8057  [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
8058          (unspec:V8HI [(match_operand:V8HF 1 "s_register_operand" "w")]
8059           VSTRHQ_F))
8060  ]
8061  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8062{
8063   rtx ops[2];
8064   int regno = REGNO (operands[1]);
8065   ops[1] = gen_rtx_REG (TImode, regno);
8066   ops[0]  = operands[0];
8067   output_asm_insn ("vstrh.16\t%q1, %E0",ops);
8068   return "";
8069}
8070  [(set_attr "length" "4")])
8071
8072;;
8073;; [vstrhq_p_f]
8074;;
8075(define_insn "mve_vstrhq_p_fv8hf"
8076  [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
8077          (unspec:V8HI
8078           [(match_operand:V8HF 1 "s_register_operand" "w")
8079            (match_operand:V8BI 2 "vpr_register_operand" "Up")
8080            (match_dup 0)]
8081           VSTRHQ_F))]
8082  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8083{
8084   rtx ops[2];
8085   int regno = REGNO (operands[1]);
8086   ops[1] = gen_rtx_REG (TImode, regno);
8087   ops[0]  = operands[0];
8088   output_asm_insn ("vpst\;vstrht.16\t%q1, %E0",ops);
8089   return "";
8090}
8091  [(set_attr "length" "8")])
8092
8093;;
8094;; [vstrhq_p_s vstrhq_p_u]
8095;;
8096(define_insn "mve_vstrhq_p_<supf><mode>"
8097  [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
8098          (unspec:<MVE_H_ELEM>
8099           [(match_operand:MVE_6 1 "s_register_operand" "w")
8100            (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
8101            (match_dup 0)]
8102           VSTRHQ))
8103  ]
8104  "TARGET_HAVE_MVE"
8105{
8106   rtx ops[2];
8107   int regno = REGNO (operands[1]);
8108   ops[1] = gen_rtx_REG (TImode, regno);
8109   ops[0]  = operands[0];
8110   output_asm_insn ("vpst\;vstrht.<V_sz_elem>\t%q1, %E0",ops);
8111   return "";
8112}
8113  [(set_attr "length" "8")])
8114
8115;;
8116;; [vstrhq_scatter_offset_p_s vstrhq_scatter_offset_p_u]
8117;;
8118(define_expand "mve_vstrhq_scatter_offset_p_<supf><mode>"
8119  [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
8120   (match_operand:MVE_6 1 "s_register_operand")
8121   (match_operand:MVE_6 2 "s_register_operand")
8122   (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
8123   (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
8124  "TARGET_HAVE_MVE"
8125{
8126  rtx ind = XEXP (operands[0], 0);
8127  gcc_assert (REG_P (ind));
8128  emit_insn (
8129    gen_mve_vstrhq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
8130                                                                   operands[2],
8131                                                                   operands[3]));
8132  DONE;
8133})
8134
8135(define_insn "mve_vstrhq_scatter_offset_p_<supf><mode>_insn"
8136  [(set (mem:BLK (scratch))
8137          (unspec:BLK
8138            [(match_operand:SI 0 "register_operand" "r")
8139             (match_operand:MVE_6 1 "s_register_operand" "w")
8140             (match_operand:MVE_6 2 "s_register_operand" "w")
8141             (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8142            VSTRHSOQ))]
8143  "TARGET_HAVE_MVE"
8144  "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1]"
8145  [(set_attr "length" "8")])
8146
8147;;
8148;; [vstrhq_scatter_offset_s vstrhq_scatter_offset_u]
8149;;
8150(define_expand "mve_vstrhq_scatter_offset_<supf><mode>"
8151  [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
8152   (match_operand:MVE_6 1 "s_register_operand")
8153   (match_operand:MVE_6 2 "s_register_operand")
8154   (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
8155  "TARGET_HAVE_MVE"
8156{
8157  rtx ind = XEXP (operands[0], 0);
8158  gcc_assert (REG_P (ind));
8159  emit_insn (gen_mve_vstrhq_scatter_offset_<supf><mode>_insn (ind, operands[1],
8160                                                                            operands[2]));
8161  DONE;
8162})
8163
8164(define_insn "mve_vstrhq_scatter_offset_<supf><mode>_insn"
8165  [(set (mem:BLK (scratch))
8166          (unspec:BLK
8167            [(match_operand:SI 0 "register_operand" "r")
8168             (match_operand:MVE_6 1 "s_register_operand" "w")
8169             (match_operand:MVE_6 2 "s_register_operand" "w")]
8170            VSTRHSOQ))]
8171  "TARGET_HAVE_MVE"
8172  "vstrh.<V_sz_elem>\t%q2, [%0, %q1]"
8173  [(set_attr "length" "4")])
8174
8175;;
8176;; [vstrhq_scatter_shifted_offset_p_s vstrhq_scatter_shifted_offset_p_u]
8177;;
8178(define_expand "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>"
8179  [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
8180   (match_operand:MVE_6 1 "s_register_operand")
8181   (match_operand:MVE_6 2 "s_register_operand")
8182   (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
8183   (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
8184  "TARGET_HAVE_MVE"
8185{
8186  rtx ind = XEXP (operands[0], 0);
8187  gcc_assert (REG_P (ind));
8188  emit_insn (
8189    gen_mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn (ind, operands[1],
8190                                                                             operands[2],
8191                                                                             operands[3]));
8192  DONE;
8193})
8194
8195(define_insn "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn"
8196  [(set (mem:BLK (scratch))
8197          (unspec:BLK
8198            [(match_operand:SI 0 "register_operand" "r")
8199             (match_operand:MVE_6 1 "s_register_operand" "w")
8200             (match_operand:MVE_6 2 "s_register_operand" "w")
8201             (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8202            VSTRHSSOQ))]
8203  "TARGET_HAVE_MVE"
8204  "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
8205  [(set_attr "length" "8")])
8206
8207;;
8208;; [vstrhq_scatter_shifted_offset_s vstrhq_scatter_shifted_offset_u]
8209;;
8210(define_expand "mve_vstrhq_scatter_shifted_offset_<supf><mode>"
8211  [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
8212   (match_operand:MVE_6 1 "s_register_operand")
8213   (match_operand:MVE_6 2 "s_register_operand")
8214   (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
8215  "TARGET_HAVE_MVE"
8216{
8217  rtx ind = XEXP (operands[0], 0);
8218  gcc_assert (REG_P (ind));
8219  emit_insn (
8220    gen_mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn (ind, operands[1],
8221                                                                           operands[2]));
8222  DONE;
8223})
8224
8225(define_insn "mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn"
8226  [(set (mem:BLK (scratch))
8227          (unspec:BLK
8228            [(match_operand:SI 0 "register_operand" "r")
8229             (match_operand:MVE_6 1 "s_register_operand" "w")
8230             (match_operand:MVE_6 2 "s_register_operand" "w")]
8231            VSTRHSSOQ))]
8232  "TARGET_HAVE_MVE"
8233  "vstrh.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
8234  [(set_attr "length" "4")])
8235
8236;;
8237;; [vstrhq_s, vstrhq_u]
8238;;
8239(define_insn "mve_vstrhq_<supf><mode>"
8240  [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
8241          (unspec:<MVE_H_ELEM> [(match_operand:MVE_6 1 "s_register_operand" "w")]
8242           VSTRHQ))
8243  ]
8244  "TARGET_HAVE_MVE"
8245{
8246   rtx ops[2];
8247   int regno = REGNO (operands[1]);
8248   ops[1] = gen_rtx_REG (TImode, regno);
8249   ops[0]  = operands[0];
8250   output_asm_insn ("vstrh.<V_sz_elem>\t%q1, %E0",ops);
8251   return "";
8252}
8253  [(set_attr "length" "4")])
8254
8255;;
8256;; [vstrwq_f]
8257;;
8258(define_insn "mve_vstrwq_fv4sf"
8259  [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
8260          (unspec:V4SI [(match_operand:V4SF 1 "s_register_operand" "w")]
8261           VSTRWQ_F))
8262  ]
8263  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8264{
8265   rtx ops[2];
8266   int regno = REGNO (operands[1]);
8267   ops[1] = gen_rtx_REG (TImode, regno);
8268   ops[0]  = operands[0];
8269   output_asm_insn ("vstrw.32\t%q1, %E0",ops);
8270   return "";
8271}
8272  [(set_attr "length" "4")])
8273
8274;;
8275;; [vstrwq_p_f]
8276;;
8277(define_insn "mve_vstrwq_p_fv4sf"
8278  [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
8279          (unspec:V4SI
8280           [(match_operand:V4SF 1 "s_register_operand" "w")
8281            (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
8282            (match_dup 0)]
8283           VSTRWQ_F))]
8284  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8285{
8286   rtx ops[2];
8287   int regno = REGNO (operands[1]);
8288   ops[1] = gen_rtx_REG (TImode, regno);
8289   ops[0]  = operands[0];
8290   output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
8291   return "";
8292}
8293  [(set_attr "length" "8")])
8294
8295;;
8296;; [vstrwq_p_s vstrwq_p_u]
8297;;
8298(define_insn "mve_vstrwq_p_<supf>v4si"
8299  [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
8300          (unspec:V4SI
8301           [(match_operand:V4SI 1 "s_register_operand" "w")
8302            (match_operand:V4BI 2 "vpr_register_operand" "Up")
8303            (match_dup 0)]
8304           VSTRWQ))]
8305  "TARGET_HAVE_MVE"
8306{
8307   rtx ops[2];
8308   int regno = REGNO (operands[1]);
8309   ops[1] = gen_rtx_REG (TImode, regno);
8310   ops[0]  = operands[0];
8311   output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
8312   return "";
8313}
8314  [(set_attr "length" "8")])
8315
8316;;
8317;; [vstrwq_s vstrwq_u]
8318;;
8319(define_insn "mve_vstrwq_<supf>v4si"
8320  [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
8321          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")]
8322           VSTRWQ))
8323  ]
8324  "TARGET_HAVE_MVE"
8325{
8326   rtx ops[2];
8327   int regno = REGNO (operands[1]);
8328   ops[1] = gen_rtx_REG (TImode, regno);
8329   ops[0]  = operands[0];
8330   output_asm_insn ("vstrw.32\t%q1, %E0",ops);
8331   return "";
8332}
8333  [(set_attr "length" "4")])
8334
8335(define_expand "mve_vst1q_f<mode>"
8336  [(match_operand:<MVE_CNVT> 0 "mve_memory_operand")
8337   (unspec:<MVE_CNVT> [(match_operand:MVE_0 1 "s_register_operand")] VST1Q_F)
8338  ]
8339  "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
8340{
8341  emit_insn (gen_mve_vstr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
8342  DONE;
8343})
8344
8345(define_expand "mve_vst1q_<supf><mode>"
8346  [(match_operand:MVE_2 0 "mve_memory_operand")
8347   (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand")] VST1Q)
8348  ]
8349  "TARGET_HAVE_MVE"
8350{
8351  emit_insn (gen_mve_vstr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
8352  DONE;
8353})
8354
8355;;
8356;; [vstrdq_scatter_base_p_s vstrdq_scatter_base_p_u]
8357;;
8358(define_insn "mve_vstrdq_scatter_base_p_<supf>v2di"
8359  [(set (mem:BLK (scratch))
8360          (unspec:BLK
8361                    [(match_operand:V2DI 0 "s_register_operand" "w")
8362                     (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
8363                     (match_operand:V2DI 2 "s_register_operand" "w")
8364                     (match_operand:HI 3 "vpr_register_operand" "Up")]
8365           VSTRDSBQ))
8366  ]
8367  "TARGET_HAVE_MVE"
8368{
8369   rtx ops[3];
8370   ops[0] = operands[0];
8371   ops[1] = operands[1];
8372   ops[2] = operands[2];
8373   output_asm_insn ("vpst\;\tvstrdt.u64\t%q2, [%q0, %1]",ops);
8374   return "";
8375}
8376  [(set_attr "length" "8")])
8377
8378;;
8379;; [vstrdq_scatter_base_s vstrdq_scatter_base_u]
8380;;
8381(define_insn "mve_vstrdq_scatter_base_<supf>v2di"
8382  [(set (mem:BLK (scratch))
8383          (unspec:BLK
8384                    [(match_operand:V2DI 0 "s_register_operand" "=w")
8385                     (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
8386                     (match_operand:V2DI 2 "s_register_operand" "w")]
8387           VSTRDSBQ))
8388  ]
8389  "TARGET_HAVE_MVE"
8390{
8391   rtx ops[3];
8392   ops[0] = operands[0];
8393   ops[1] = operands[1];
8394   ops[2] = operands[2];
8395   output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]",ops);
8396   return "";
8397}
8398  [(set_attr "length" "4")])
8399
8400;;
8401;; [vstrdq_scatter_offset_p_s vstrdq_scatter_offset_p_u]
8402;;
8403(define_expand "mve_vstrdq_scatter_offset_p_<supf>v2di"
8404  [(match_operand:V2DI 0 "mve_scatter_memory")
8405   (match_operand:V2DI 1 "s_register_operand")
8406   (match_operand:V2DI 2 "s_register_operand")
8407   (match_operand:HI 3 "vpr_register_operand")
8408   (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
8409  "TARGET_HAVE_MVE"
8410{
8411  rtx ind = XEXP (operands[0], 0);
8412  gcc_assert (REG_P (ind));
8413  emit_insn (gen_mve_vstrdq_scatter_offset_p_<supf>v2di_insn (ind, operands[1],
8414                                                                            operands[2],
8415                                                                            operands[3]));
8416  DONE;
8417})
8418
8419(define_insn "mve_vstrdq_scatter_offset_p_<supf>v2di_insn"
8420  [(set (mem:BLK (scratch))
8421          (unspec:BLK
8422            [(match_operand:SI 0 "register_operand" "r")
8423             (match_operand:V2DI 1 "s_register_operand" "w")
8424             (match_operand:V2DI 2 "s_register_operand" "w")
8425             (match_operand:HI 3 "vpr_register_operand" "Up")]
8426            VSTRDSOQ))]
8427  "TARGET_HAVE_MVE"
8428  "vpst\;vstrdt.64\t%q2, [%0, %q1]"
8429  [(set_attr "length" "8")])
8430
8431;;
8432;; [vstrdq_scatter_offset_s vstrdq_scatter_offset_u]
8433;;
8434(define_expand "mve_vstrdq_scatter_offset_<supf>v2di"
8435  [(match_operand:V2DI 0 "mve_scatter_memory")
8436   (match_operand:V2DI 1 "s_register_operand")
8437   (match_operand:V2DI 2 "s_register_operand")
8438   (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
8439  "TARGET_HAVE_MVE"
8440{
8441  rtx ind = XEXP (operands[0], 0);
8442  gcc_assert (REG_P (ind));
8443  emit_insn (gen_mve_vstrdq_scatter_offset_<supf>v2di_insn (ind, operands[1],
8444                                                                          operands[2]));
8445  DONE;
8446})
8447
8448(define_insn "mve_vstrdq_scatter_offset_<supf>v2di_insn"
8449  [(set (mem:BLK (scratch))
8450          (unspec:BLK
8451            [(match_operand:SI 0 "register_operand" "r")
8452             (match_operand:V2DI 1 "s_register_operand" "w")
8453             (match_operand:V2DI 2 "s_register_operand" "w")]
8454            VSTRDSOQ))]
8455  "TARGET_HAVE_MVE"
8456  "vstrd.64\t%q2, [%0, %q1]"
8457  [(set_attr "length" "4")])
8458
8459;;
8460;; [vstrdq_scatter_shifted_offset_p_s vstrdq_scatter_shifted_offset_p_u]
8461;;
8462(define_expand "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di"
8463  [(match_operand:V2DI 0 "mve_scatter_memory")
8464   (match_operand:V2DI 1 "s_register_operand")
8465   (match_operand:V2DI 2 "s_register_operand")
8466   (match_operand:HI 3 "vpr_register_operand")
8467   (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
8468  "TARGET_HAVE_MVE"
8469{
8470  rtx ind = XEXP (operands[0], 0);
8471  gcc_assert (REG_P (ind));
8472  emit_insn (
8473    gen_mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn (ind, operands[1],
8474                                                                           operands[2],
8475                                                                           operands[3]));
8476  DONE;
8477})
8478
8479(define_insn "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn"
8480  [(set (mem:BLK (scratch))
8481          (unspec:BLK
8482            [(match_operand:SI 0 "register_operand" "r")
8483             (match_operand:V2DI 1 "s_register_operand" "w")
8484             (match_operand:V2DI 2 "s_register_operand" "w")
8485             (match_operand:HI 3 "vpr_register_operand" "Up")]
8486            VSTRDSSOQ))]
8487  "TARGET_HAVE_MVE"
8488  "vpst\;vstrdt.64\t%q2, [%0, %q1, uxtw #3]"
8489  [(set_attr "length" "8")])
8490
8491;;
8492;; [vstrdq_scatter_shifted_offset_s vstrdq_scatter_shifted_offset_u]
8493;;
8494(define_expand "mve_vstrdq_scatter_shifted_offset_<supf>v2di"
8495  [(match_operand:V2DI 0 "mve_scatter_memory")
8496   (match_operand:V2DI 1 "s_register_operand")
8497   (match_operand:V2DI 2 "s_register_operand")
8498   (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
8499  "TARGET_HAVE_MVE"
8500{
8501  rtx ind = XEXP (operands[0], 0);
8502  gcc_assert (REG_P (ind));
8503  emit_insn (
8504    gen_mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn (ind, operands[1],
8505                                                                         operands[2]));
8506  DONE;
8507})
8508
8509(define_insn "mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn"
8510  [(set (mem:BLK (scratch))
8511          (unspec:BLK
8512            [(match_operand:SI 0 "register_operand" "r")
8513             (match_operand:V2DI 1 "s_register_operand" "w")
8514             (match_operand:V2DI 2 "s_register_operand" "w")]
8515            VSTRDSSOQ))]
8516  "TARGET_HAVE_MVE"
8517  "vstrd.64\t%q2, [%0, %q1, uxtw #3]"
8518  [(set_attr "length" "4")])
8519
8520;;
8521;; [vstrhq_scatter_offset_f]
8522;;
8523(define_expand "mve_vstrhq_scatter_offset_fv8hf"
8524  [(match_operand:V8HI 0 "mve_scatter_memory")
8525   (match_operand:V8HI 1 "s_register_operand")
8526   (match_operand:V8HF 2 "s_register_operand")
8527   (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
8528  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8529{
8530  rtx ind = XEXP (operands[0], 0);
8531  gcc_assert (REG_P (ind));
8532  emit_insn (gen_mve_vstrhq_scatter_offset_fv8hf_insn (ind, operands[1],
8533                                                                   operands[2]));
8534  DONE;
8535})
8536
8537(define_insn "mve_vstrhq_scatter_offset_fv8hf_insn"
8538  [(set (mem:BLK (scratch))
8539          (unspec:BLK
8540            [(match_operand:SI 0 "register_operand" "r")
8541             (match_operand:V8HI 1 "s_register_operand" "w")
8542             (match_operand:V8HF 2 "s_register_operand" "w")]
8543            VSTRHQSO_F))]
8544  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8545  "vstrh.16\t%q2, [%0, %q1]"
8546  [(set_attr "length" "4")])
8547
8548;;
8549;; [vstrhq_scatter_offset_p_f]
8550;;
8551(define_expand "mve_vstrhq_scatter_offset_p_fv8hf"
8552  [(match_operand:V8HI 0 "mve_scatter_memory")
8553   (match_operand:V8HI 1 "s_register_operand")
8554   (match_operand:V8HF 2 "s_register_operand")
8555   (match_operand:V8BI 3 "vpr_register_operand")
8556   (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
8557  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8558{
8559  rtx ind = XEXP (operands[0], 0);
8560  gcc_assert (REG_P (ind));
8561  emit_insn (gen_mve_vstrhq_scatter_offset_p_fv8hf_insn (ind, operands[1],
8562                                                                       operands[2],
8563                                                                       operands[3]));
8564  DONE;
8565})
8566
8567(define_insn "mve_vstrhq_scatter_offset_p_fv8hf_insn"
8568  [(set (mem:BLK (scratch))
8569          (unspec:BLK
8570            [(match_operand:SI 0 "register_operand" "r")
8571             (match_operand:V8HI 1 "s_register_operand" "w")
8572             (match_operand:V8HF 2 "s_register_operand" "w")
8573             (match_operand:V8BI 3 "vpr_register_operand" "Up")]
8574            VSTRHQSO_F))]
8575  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8576  "vpst\;vstrht.16\t%q2, [%0, %q1]"
8577  [(set_attr "length" "8")])
8578
8579;;
8580;; [vstrhq_scatter_shifted_offset_f]
8581;;
8582(define_expand "mve_vstrhq_scatter_shifted_offset_fv8hf"
8583  [(match_operand:V8HI 0 "memory_operand" "=Us")
8584   (match_operand:V8HI 1 "s_register_operand" "w")
8585   (match_operand:V8HF 2 "s_register_operand" "w")
8586   (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
8587  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8588{
8589  rtx ind = XEXP (operands[0], 0);
8590  gcc_assert (REG_P (ind));
8591  emit_insn (gen_mve_vstrhq_scatter_shifted_offset_fv8hf_insn (ind, operands[1],
8592                                                                             operands[2]));
8593  DONE;
8594})
8595
8596(define_insn "mve_vstrhq_scatter_shifted_offset_fv8hf_insn"
8597  [(set (mem:BLK (scratch))
8598          (unspec:BLK
8599            [(match_operand:SI 0 "register_operand" "r")
8600             (match_operand:V8HI 1 "s_register_operand" "w")
8601             (match_operand:V8HF 2 "s_register_operand" "w")]
8602            VSTRHQSSO_F))]
8603  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8604  "vstrh.16\t%q2, [%0, %q1, uxtw #1]"
8605  [(set_attr "length" "4")])
8606
8607;;
8608;; [vstrhq_scatter_shifted_offset_p_f]
8609;;
8610(define_expand "mve_vstrhq_scatter_shifted_offset_p_fv8hf"
8611  [(match_operand:V8HI 0 "memory_operand" "=Us")
8612   (match_operand:V8HI 1 "s_register_operand" "w")
8613   (match_operand:V8HF 2 "s_register_operand" "w")
8614   (match_operand:V8BI 3 "vpr_register_operand" "Up")
8615   (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
8616  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8617{
8618  rtx ind = XEXP (operands[0], 0);
8619  gcc_assert (REG_P (ind));
8620  emit_insn (
8621    gen_mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn (ind, operands[1],
8622                                                                      operands[2],
8623                                                                      operands[3]));
8624  DONE;
8625})
8626
8627(define_insn "mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn"
8628  [(set (mem:BLK (scratch))
8629          (unspec:BLK
8630            [(match_operand:SI 0 "register_operand" "r")
8631             (match_operand:V8HI 1 "s_register_operand" "w")
8632             (match_operand:V8HF 2 "s_register_operand" "w")
8633             (match_operand:V8BI 3 "vpr_register_operand" "Up")]
8634            VSTRHQSSO_F))]
8635  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8636  "vpst\;vstrht.16\t%q2, [%0, %q1, uxtw #1]"
8637  [(set_attr "length" "8")])
8638
8639;;
8640;; [vstrwq_scatter_base_f]
8641;;
8642(define_insn "mve_vstrwq_scatter_base_fv4sf"
8643  [(set (mem:BLK (scratch))
8644          (unspec:BLK
8645                    [(match_operand:V4SI 0 "s_register_operand" "w")
8646                     (match_operand:SI 1 "immediate_operand" "i")
8647                     (match_operand:V4SF 2 "s_register_operand" "w")]
8648           VSTRWQSB_F))
8649  ]
8650  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8651{
8652   rtx ops[3];
8653   ops[0] = operands[0];
8654   ops[1] = operands[1];
8655   ops[2] = operands[2];
8656   output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]",ops);
8657   return "";
8658}
8659  [(set_attr "length" "4")])
8660
8661;;
8662;; [vstrwq_scatter_base_p_f]
8663;;
8664(define_insn "mve_vstrwq_scatter_base_p_fv4sf"
8665  [(set (mem:BLK (scratch))
8666          (unspec:BLK
8667                    [(match_operand:V4SI 0 "s_register_operand" "w")
8668                     (match_operand:SI 1 "immediate_operand" "i")
8669                     (match_operand:V4SF 2 "s_register_operand" "w")
8670                     (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8671           VSTRWQSB_F))
8672  ]
8673  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8674{
8675   rtx ops[3];
8676   ops[0] = operands[0];
8677   ops[1] = operands[1];
8678   ops[2] = operands[2];
8679   output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
8680   return "";
8681}
8682  [(set_attr "length" "8")])
8683
8684;;
8685;; [vstrwq_scatter_offset_f]
8686;;
8687(define_expand "mve_vstrwq_scatter_offset_fv4sf"
8688  [(match_operand:V4SI 0 "mve_scatter_memory")
8689   (match_operand:V4SI 1 "s_register_operand")
8690   (match_operand:V4SF 2 "s_register_operand")
8691   (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
8692  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8693{
8694  rtx ind = XEXP (operands[0], 0);
8695  gcc_assert (REG_P (ind));
8696  emit_insn (gen_mve_vstrwq_scatter_offset_fv4sf_insn (ind, operands[1],
8697                                                                   operands[2]));
8698  DONE;
8699})
8700
8701(define_insn "mve_vstrwq_scatter_offset_fv4sf_insn"
8702  [(set (mem:BLK (scratch))
8703          (unspec:BLK
8704            [(match_operand:SI 0 "register_operand" "r")
8705             (match_operand:V4SI 1 "s_register_operand" "w")
8706             (match_operand:V4SF 2 "s_register_operand" "w")]
8707            VSTRWQSO_F))]
8708  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8709  "vstrw.32\t%q2, [%0, %q1]"
8710  [(set_attr "length" "4")])
8711
8712;;
8713;; [vstrwq_scatter_offset_p_f]
8714;;
8715(define_expand "mve_vstrwq_scatter_offset_p_fv4sf"
8716  [(match_operand:V4SI 0 "mve_scatter_memory")
8717   (match_operand:V4SI 1 "s_register_operand")
8718   (match_operand:V4SF 2 "s_register_operand")
8719   (match_operand:V4BI 3 "vpr_register_operand")
8720   (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
8721  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8722{
8723  rtx ind = XEXP (operands[0], 0);
8724  gcc_assert (REG_P (ind));
8725  emit_insn (gen_mve_vstrwq_scatter_offset_p_fv4sf_insn (ind, operands[1],
8726                                                                       operands[2],
8727                                                                       operands[3]));
8728  DONE;
8729})
8730
8731(define_insn "mve_vstrwq_scatter_offset_p_fv4sf_insn"
8732  [(set (mem:BLK (scratch))
8733          (unspec:BLK
8734            [(match_operand:SI 0 "register_operand" "r")
8735             (match_operand:V4SI 1 "s_register_operand" "w")
8736             (match_operand:V4SF 2 "s_register_operand" "w")
8737             (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8738            VSTRWQSO_F))]
8739  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8740  "vpst\;vstrwt.32\t%q2, [%0, %q1]"
8741  [(set_attr "length" "8")])
8742
8743;;
8744;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
8745;;
8746(define_expand "mve_vstrwq_scatter_offset_p_<supf>v4si"
8747  [(match_operand:V4SI 0 "mve_scatter_memory")
8748   (match_operand:V4SI 1 "s_register_operand")
8749   (match_operand:V4SI 2 "s_register_operand")
8750   (match_operand:V4BI 3 "vpr_register_operand")
8751   (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
8752  "TARGET_HAVE_MVE"
8753{
8754  rtx ind = XEXP (operands[0], 0);
8755  gcc_assert (REG_P (ind));
8756  emit_insn (gen_mve_vstrwq_scatter_offset_p_<supf>v4si_insn (ind, operands[1],
8757                                                                            operands[2],
8758                                                                            operands[3]));
8759  DONE;
8760})
8761
8762(define_insn "mve_vstrwq_scatter_offset_p_<supf>v4si_insn"
8763  [(set (mem:BLK (scratch))
8764          (unspec:BLK
8765            [(match_operand:SI 0 "register_operand" "r")
8766             (match_operand:V4SI 1 "s_register_operand" "w")
8767             (match_operand:V4SI 2 "s_register_operand" "w")
8768             (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8769            VSTRWSOQ))]
8770  "TARGET_HAVE_MVE"
8771  "vpst\;vstrwt.32\t%q2, [%0, %q1]"
8772  [(set_attr "length" "8")])
8773
8774;;
8775;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
8776;;
8777(define_expand "mve_vstrwq_scatter_offset_<supf>v4si"
8778  [(match_operand:V4SI 0 "mve_scatter_memory")
8779   (match_operand:V4SI 1 "s_register_operand")
8780   (match_operand:V4SI 2 "s_register_operand")
8781   (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
8782  "TARGET_HAVE_MVE"
8783{
8784  rtx ind = XEXP (operands[0], 0);
8785  gcc_assert (REG_P (ind));
8786  emit_insn (gen_mve_vstrwq_scatter_offset_<supf>v4si_insn (ind, operands[1],
8787                                                                          operands[2]));
8788  DONE;
8789})
8790
8791(define_insn "mve_vstrwq_scatter_offset_<supf>v4si_insn"
8792  [(set (mem:BLK (scratch))
8793          (unspec:BLK
8794            [(match_operand:SI 0 "register_operand" "r")
8795             (match_operand:V4SI 1 "s_register_operand" "w")
8796             (match_operand:V4SI 2 "s_register_operand" "w")]
8797            VSTRWSOQ))]
8798  "TARGET_HAVE_MVE"
8799  "vstrw.32\t%q2, [%0, %q1]"
8800  [(set_attr "length" "4")])
8801
8802;;
8803;; [vstrwq_scatter_shifted_offset_f]
8804;;
8805(define_expand "mve_vstrwq_scatter_shifted_offset_fv4sf"
8806  [(match_operand:V4SI 0 "mve_scatter_memory")
8807   (match_operand:V4SI 1 "s_register_operand")
8808   (match_operand:V4SF 2 "s_register_operand")
8809   (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
8810  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8811{
8812  rtx ind = XEXP (operands[0], 0);
8813  gcc_assert (REG_P (ind));
8814  emit_insn (gen_mve_vstrwq_scatter_shifted_offset_fv4sf_insn (ind, operands[1],
8815                                                                             operands[2]));
8816  DONE;
8817})
8818
8819(define_insn "mve_vstrwq_scatter_shifted_offset_fv4sf_insn"
8820  [(set (mem:BLK (scratch))
8821          (unspec:BLK
8822            [(match_operand:SI 0 "register_operand" "r")
8823             (match_operand:V4SI 1 "s_register_operand" "w")
8824             (match_operand:V4SF 2 "s_register_operand" "w")]
8825           VSTRWQSSO_F))]
8826  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8827  "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
8828  [(set_attr "length" "8")])
8829
8830;;
8831;; [vstrwq_scatter_shifted_offset_p_f]
8832;;
8833(define_expand "mve_vstrwq_scatter_shifted_offset_p_fv4sf"
8834  [(match_operand:V4SI 0 "mve_scatter_memory")
8835   (match_operand:V4SI 1 "s_register_operand")
8836   (match_operand:V4SF 2 "s_register_operand")
8837   (match_operand:V4BI 3 "vpr_register_operand")
8838   (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
8839  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8840{
8841  rtx ind = XEXP (operands[0], 0);
8842  gcc_assert (REG_P (ind));
8843  emit_insn (
8844    gen_mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn (ind, operands[1],
8845                                                                      operands[2],
8846                                                                      operands[3]));
8847  DONE;
8848})
8849
8850(define_insn "mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn"
8851  [(set (mem:BLK (scratch))
8852          (unspec:BLK
8853            [(match_operand:SI 0 "register_operand" "r")
8854             (match_operand:V4SI 1 "s_register_operand" "w")
8855             (match_operand:V4SF 2 "s_register_operand" "w")
8856             (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8857            VSTRWQSSO_F))]
8858  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8859  "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
8860  [(set_attr "length" "8")])
8861
8862;;
8863;; [vstrwq_scatter_shifted_offset_p_s vstrwq_scatter_shifted_offset_p_u]
8864;;
8865(define_expand "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si"
8866  [(match_operand:V4SI 0 "mve_scatter_memory")
8867   (match_operand:V4SI 1 "s_register_operand")
8868   (match_operand:V4SI 2 "s_register_operand")
8869   (match_operand:V4BI 3 "vpr_register_operand")
8870   (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
8871  "TARGET_HAVE_MVE"
8872{
8873  rtx ind = XEXP (operands[0], 0);
8874  gcc_assert (REG_P (ind));
8875  emit_insn (
8876    gen_mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn (ind, operands[1],
8877                                                                           operands[2],
8878                                                                           operands[3]));
8879  DONE;
8880})
8881
8882(define_insn "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn"
8883  [(set (mem:BLK (scratch))
8884          (unspec:BLK
8885            [(match_operand:SI 0 "register_operand" "r")
8886             (match_operand:V4SI 1 "s_register_operand" "w")
8887             (match_operand:V4SI 2 "s_register_operand" "w")
8888             (match_operand:V4BI 3 "vpr_register_operand" "Up")]
8889            VSTRWSSOQ))]
8890  "TARGET_HAVE_MVE"
8891  "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
8892  [(set_attr "length" "8")])
8893
8894;;
8895;; [vstrwq_scatter_shifted_offset_s vstrwq_scatter_shifted_offset_u]
8896;;
8897(define_expand "mve_vstrwq_scatter_shifted_offset_<supf>v4si"
8898  [(match_operand:V4SI 0 "mve_scatter_memory")
8899   (match_operand:V4SI 1 "s_register_operand")
8900   (match_operand:V4SI 2 "s_register_operand")
8901   (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
8902  "TARGET_HAVE_MVE"
8903{
8904  rtx ind = XEXP (operands[0], 0);
8905  gcc_assert (REG_P (ind));
8906  emit_insn (
8907    gen_mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn (ind, operands[1],
8908                                                                         operands[2]));
8909  DONE;
8910})
8911
8912(define_insn "mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn"
8913  [(set (mem:BLK (scratch))
8914          (unspec:BLK
8915            [(match_operand:SI 0 "register_operand" "r")
8916             (match_operand:V4SI 1 "s_register_operand" "w")
8917             (match_operand:V4SI 2 "s_register_operand" "w")]
8918            VSTRWSSOQ))]
8919  "TARGET_HAVE_MVE"
8920  "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
8921  [(set_attr "length" "4")])
8922
8923;;
8924;; [vaddq_s, vaddq_u])
8925;;
8926(define_insn "mve_vaddq<mode>"
8927  [
8928   (set (match_operand:MVE_2 0 "s_register_operand" "=w")
8929          (plus:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
8930                        (match_operand:MVE_2 2 "s_register_operand" "w")))
8931  ]
8932  "TARGET_HAVE_MVE"
8933  "vadd.i%#<V_sz_elem>\t%q0, %q1, %q2"
8934  [(set_attr "type" "mve_move")
8935])
8936
8937;;
8938;; [vaddq_f])
8939;;
8940(define_insn "mve_vaddq_f<mode>"
8941  [
8942   (set (match_operand:MVE_0 0 "s_register_operand" "=w")
8943          (plus:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
8944                        (match_operand:MVE_0 2 "s_register_operand" "w")))
8945  ]
8946  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
8947  "vadd.f%#<V_sz_elem>\t%q0, %q1, %q2"
8948  [(set_attr "type" "mve_move")
8949])
8950
8951;;
8952;; [vidupq_n_u])
8953;;
8954(define_expand "mve_vidupq_n_u<mode>"
8955 [(match_operand:MVE_2 0 "s_register_operand")
8956  (match_operand:SI 1 "s_register_operand")
8957  (match_operand:SI 2 "mve_imm_selective_upto_8")]
8958 "TARGET_HAVE_MVE"
8959{
8960  rtx temp = gen_reg_rtx (SImode);
8961  emit_move_insn (temp, operands[1]);
8962  rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
8963  emit_insn (gen_mve_vidupq_u<mode>_insn (operands[0], temp, operands[1],
8964                                                    operands[2], inc));
8965  DONE;
8966})
8967
8968;;
8969;; [vidupq_u_insn])
8970;;
8971(define_insn "mve_vidupq_u<mode>_insn"
8972 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
8973       (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
8974                          (match_operand:SI 3 "mve_imm_selective_upto_8" "Rg")]
8975           VIDUPQ))
8976  (set (match_operand:SI 1 "s_register_operand" "=Te")
8977       (plus:SI (match_dup 2)
8978                    (match_operand:SI 4 "immediate_operand" "i")))]
8979 "TARGET_HAVE_MVE"
8980 "vidup.u%#<V_sz_elem>\t%q0, %1, %3")
8981
8982;;
8983;; [vidupq_m_n_u])
8984;;
8985(define_expand "mve_vidupq_m_n_u<mode>"
8986  [(match_operand:MVE_2 0 "s_register_operand")
8987   (match_operand:MVE_2 1 "s_register_operand")
8988   (match_operand:SI 2 "s_register_operand")
8989   (match_operand:SI 3 "mve_imm_selective_upto_8")
8990   (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
8991  "TARGET_HAVE_MVE"
8992{
8993  rtx temp = gen_reg_rtx (SImode);
8994  emit_move_insn (temp, operands[2]);
8995  rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
8996  emit_insn (gen_mve_vidupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
8997                                                       operands[2], operands[3],
8998                                                       operands[4], inc));
8999  DONE;
9000})
9001
9002;;
9003;; [vidupq_m_wb_u_insn])
9004;;
9005(define_insn "mve_vidupq_m_wb_u<mode>_insn"
9006 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9007       (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
9008                          (match_operand:SI 3 "s_register_operand" "2")
9009                          (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
9010                          (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
9011          VIDUPQ_M))
9012  (set (match_operand:SI 2 "s_register_operand" "=Te")
9013       (plus:SI (match_dup 3)
9014                    (match_operand:SI 6 "immediate_operand" "i")))]
9015 "TARGET_HAVE_MVE"
9016 "vpst\;\tvidupt.u%#<V_sz_elem>\t%q0, %2, %4"
9017 [(set_attr "length""8")])
9018
9019;;
9020;; [vddupq_n_u])
9021;;
9022(define_expand "mve_vddupq_n_u<mode>"
9023 [(match_operand:MVE_2 0 "s_register_operand")
9024  (match_operand:SI 1 "s_register_operand")
9025  (match_operand:SI 2 "mve_imm_selective_upto_8")]
9026 "TARGET_HAVE_MVE"
9027{
9028  rtx temp = gen_reg_rtx (SImode);
9029  emit_move_insn (temp, operands[1]);
9030  rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
9031  emit_insn (gen_mve_vddupq_u<mode>_insn (operands[0], temp, operands[1],
9032                                                    operands[2], inc));
9033  DONE;
9034})
9035
9036;;
9037;; [vddupq_u_insn])
9038;;
9039(define_insn "mve_vddupq_u<mode>_insn"
9040 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9041       (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
9042                          (match_operand:SI 3 "immediate_operand" "i")]
9043          VDDUPQ))
9044  (set (match_operand:SI 1 "s_register_operand" "=Te")
9045       (minus:SI (match_dup 2)
9046                     (match_operand:SI 4 "immediate_operand" "i")))]
9047 "TARGET_HAVE_MVE"
9048 "vddup.u%#<V_sz_elem>\t%q0, %1, %3")
9049
9050;;
9051;; [vddupq_m_n_u])
9052;;
9053(define_expand "mve_vddupq_m_n_u<mode>"
9054  [(match_operand:MVE_2 0 "s_register_operand")
9055   (match_operand:MVE_2 1 "s_register_operand")
9056   (match_operand:SI 2 "s_register_operand")
9057   (match_operand:SI 3 "mve_imm_selective_upto_8")
9058   (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
9059  "TARGET_HAVE_MVE"
9060{
9061  rtx temp = gen_reg_rtx (SImode);
9062  emit_move_insn (temp, operands[2]);
9063  rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
9064  emit_insn (gen_mve_vddupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
9065                                                       operands[2], operands[3],
9066                                                       operands[4], inc));
9067  DONE;
9068})
9069
9070;;
9071;; [vddupq_m_wb_u_insn])
9072;;
9073(define_insn "mve_vddupq_m_wb_u<mode>_insn"
9074 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9075       (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
9076                          (match_operand:SI 3 "s_register_operand" "2")
9077                          (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
9078                          (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
9079          VDDUPQ_M))
9080  (set (match_operand:SI 2 "s_register_operand" "=Te")
9081       (minus:SI (match_dup 3)
9082                     (match_operand:SI 6 "immediate_operand" "i")))]
9083 "TARGET_HAVE_MVE"
9084 "vpst\;vddupt.u%#<V_sz_elem>\t%q0, %2, %4"
9085 [(set_attr "length""8")])
9086
9087;;
9088;; [vdwdupq_n_u])
9089;;
9090(define_expand "mve_vdwdupq_n_u<mode>"
9091 [(match_operand:MVE_2 0 "s_register_operand")
9092  (match_operand:SI 1 "s_register_operand")
9093  (match_operand:DI 2 "s_register_operand")
9094  (match_operand:SI 3 "mve_imm_selective_upto_8")]
9095 "TARGET_HAVE_MVE"
9096{
9097  rtx ignore_wb = gen_reg_rtx (SImode);
9098  emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
9099                                                        operands[1], operands[2],
9100                                                        operands[3]));
9101  DONE;
9102})
9103
9104;;
9105;; [vdwdupq_wb_u])
9106;;
9107(define_expand "mve_vdwdupq_wb_u<mode>"
9108 [(match_operand:SI 0 "s_register_operand")
9109  (match_operand:SI 1 "s_register_operand")
9110  (match_operand:DI 2 "s_register_operand")
9111  (match_operand:SI 3 "mve_imm_selective_upto_8")
9112  (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
9113 "TARGET_HAVE_MVE"
9114{
9115  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
9116  emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
9117                                                        operands[1], operands[2],
9118                                                        operands[3]));
9119  DONE;
9120})
9121
9122;;
9123;; [vdwdupq_wb_u_insn])
9124;;
9125(define_insn "mve_vdwdupq_wb_u<mode>_insn"
9126  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9127          (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
9128                           (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
9129                           (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
9130           VDWDUPQ))
9131   (set (match_operand:SI 1 "s_register_operand" "=Te")
9132          (unspec:SI [(match_dup 2)
9133                        (subreg:SI (match_dup 3) 4)
9134                        (match_dup 4)]
9135           VDWDUPQ))]
9136  "TARGET_HAVE_MVE"
9137  "vdwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
9138)
9139
9140;;
9141;; [vdwdupq_m_n_u])
9142;;
9143(define_expand "mve_vdwdupq_m_n_u<mode>"
9144 [(match_operand:MVE_2 0 "s_register_operand")
9145  (match_operand:MVE_2 1 "s_register_operand")
9146  (match_operand:SI 2 "s_register_operand")
9147  (match_operand:DI 3 "s_register_operand")
9148  (match_operand:SI 4 "mve_imm_selective_upto_8")
9149  (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
9150 "TARGET_HAVE_MVE"
9151{
9152  rtx ignore_wb = gen_reg_rtx (SImode);
9153  emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
9154                                                            operands[1], operands[2],
9155                                                            operands[3], operands[4],
9156                                                            operands[5]));
9157  DONE;
9158})
9159
9160;;
9161;; [vdwdupq_m_wb_u])
9162;;
9163(define_expand "mve_vdwdupq_m_wb_u<mode>"
9164 [(match_operand:SI 0 "s_register_operand")
9165  (match_operand:MVE_2 1 "s_register_operand")
9166  (match_operand:SI 2 "s_register_operand")
9167  (match_operand:DI 3 "s_register_operand")
9168  (match_operand:SI 4 "mve_imm_selective_upto_8")
9169  (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
9170 "TARGET_HAVE_MVE"
9171{
9172  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
9173  emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
9174                                                            operands[1], operands[2],
9175                                                            operands[3], operands[4],
9176                                                            operands[5]));
9177  DONE;
9178})
9179
9180;;
9181;; [vdwdupq_m_wb_u_insn])
9182;;
9183(define_insn "mve_vdwdupq_m_wb_u<mode>_insn"
9184  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9185          (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
9186                           (match_operand:SI 3 "s_register_operand" "1")
9187                           (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
9188                           (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
9189                           (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
9190           VDWDUPQ_M))
9191   (set (match_operand:SI 1 "s_register_operand" "=Te")
9192          (unspec:SI [(match_dup 2)
9193                        (match_dup 3)
9194                        (subreg:SI (match_dup 4) 4)
9195                        (match_dup 5)
9196                        (match_dup 6)]
9197           VDWDUPQ_M))
9198  ]
9199  "TARGET_HAVE_MVE"
9200  "vpst\;vdwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
9201  [(set_attr "type" "mve_move")
9202   (set_attr "length""8")])
9203
9204;;
9205;; [viwdupq_n_u])
9206;;
9207(define_expand "mve_viwdupq_n_u<mode>"
9208 [(match_operand:MVE_2 0 "s_register_operand")
9209  (match_operand:SI 1 "s_register_operand")
9210  (match_operand:DI 2 "s_register_operand")
9211  (match_operand:SI 3 "mve_imm_selective_upto_8")]
9212 "TARGET_HAVE_MVE"
9213{
9214  rtx ignore_wb = gen_reg_rtx (SImode);
9215  emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
9216                                                        operands[1], operands[2],
9217                                                        operands[3]));
9218  DONE;
9219})
9220
9221;;
9222;; [viwdupq_wb_u])
9223;;
9224(define_expand "mve_viwdupq_wb_u<mode>"
9225 [(match_operand:SI 0 "s_register_operand")
9226  (match_operand:SI 1 "s_register_operand")
9227  (match_operand:DI 2 "s_register_operand")
9228  (match_operand:SI 3 "mve_imm_selective_upto_8")
9229  (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
9230 "TARGET_HAVE_MVE"
9231{
9232  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
9233  emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
9234                                                        operands[1], operands[2],
9235                                                        operands[3]));
9236  DONE;
9237})
9238
9239;;
9240;; [viwdupq_wb_u_insn])
9241;;
9242(define_insn "mve_viwdupq_wb_u<mode>_insn"
9243  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9244          (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
9245                           (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
9246                           (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
9247           VIWDUPQ))
9248   (set (match_operand:SI 1 "s_register_operand" "=Te")
9249          (unspec:SI [(match_dup 2)
9250                        (subreg:SI (match_dup 3) 4)
9251                        (match_dup 4)]
9252           VIWDUPQ))]
9253  "TARGET_HAVE_MVE"
9254  "viwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
9255)
9256
9257;;
9258;; [viwdupq_m_n_u])
9259;;
9260(define_expand "mve_viwdupq_m_n_u<mode>"
9261 [(match_operand:MVE_2 0 "s_register_operand")
9262  (match_operand:MVE_2 1 "s_register_operand")
9263  (match_operand:SI 2 "s_register_operand")
9264  (match_operand:DI 3 "s_register_operand")
9265  (match_operand:SI 4 "mve_imm_selective_upto_8")
9266  (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
9267 "TARGET_HAVE_MVE"
9268{
9269  rtx ignore_wb = gen_reg_rtx (SImode);
9270  emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
9271                                                            operands[1], operands[2],
9272                                                            operands[3], operands[4],
9273                                                            operands[5]));
9274  DONE;
9275})
9276
9277;;
9278;; [viwdupq_m_wb_u])
9279;;
9280(define_expand "mve_viwdupq_m_wb_u<mode>"
9281 [(match_operand:SI 0 "s_register_operand")
9282  (match_operand:MVE_2 1 "s_register_operand")
9283  (match_operand:SI 2 "s_register_operand")
9284  (match_operand:DI 3 "s_register_operand")
9285  (match_operand:SI 4 "mve_imm_selective_upto_8")
9286  (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
9287 "TARGET_HAVE_MVE"
9288{
9289  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
9290  emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
9291                                                            operands[1], operands[2],
9292                                                            operands[3], operands[4],
9293                                                            operands[5]));
9294  DONE;
9295})
9296
9297;;
9298;; [viwdupq_m_wb_u_insn])
9299;;
9300(define_insn "mve_viwdupq_m_wb_u<mode>_insn"
9301  [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9302          (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
9303                           (match_operand:SI 3 "s_register_operand" "1")
9304                           (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
9305                           (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
9306                           (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
9307           VIWDUPQ_M))
9308   (set (match_operand:SI 1 "s_register_operand" "=Te")
9309          (unspec:SI [(match_dup 2)
9310                        (match_dup 3)
9311                        (subreg:SI (match_dup 4) 4)
9312                        (match_dup 5)
9313                        (match_dup 6)]
9314           VIWDUPQ_M))
9315  ]
9316  "TARGET_HAVE_MVE"
9317  "vpst\;\tviwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
9318  [(set_attr "type" "mve_move")
9319   (set_attr "length""8")])
9320
9321;;
9322;; [vstrwq_scatter_base_wb_s vstrwq_scatter_base_wb_u]
9323;;
9324(define_insn "mve_vstrwq_scatter_base_wb_<supf>v4si"
9325  [(set (mem:BLK (scratch))
9326          (unspec:BLK
9327                    [(match_operand:V4SI 1 "s_register_operand" "0")
9328                     (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
9329                     (match_operand:V4SI 3 "s_register_operand" "w")]
9330           VSTRWSBWBQ))
9331   (set (match_operand:V4SI 0 "s_register_operand" "=w")
9332          (unspec:V4SI [(match_dup 1) (match_dup 2)]
9333           VSTRWSBWBQ))
9334  ]
9335  "TARGET_HAVE_MVE"
9336{
9337   rtx ops[3];
9338   ops[0] = operands[1];
9339   ops[1] = operands[2];
9340   ops[2] = operands[3];
9341   output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
9342   return "";
9343}
9344  [(set_attr "length" "4")])
9345
9346;;
9347;; [vstrwq_scatter_base_wb_p_s vstrwq_scatter_base_wb_p_u]
9348;;
9349(define_insn "mve_vstrwq_scatter_base_wb_p_<supf>v4si"
9350 [(set (mem:BLK (scratch))
9351       (unspec:BLK
9352                    [(match_operand:V4SI 1 "s_register_operand" "0")
9353                     (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
9354                     (match_operand:V4SI 3 "s_register_operand" "w")
9355                     (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9356          VSTRWSBWBQ))
9357   (set (match_operand:V4SI 0 "s_register_operand" "=w")
9358          (unspec:V4SI [(match_dup 1) (match_dup 2)]
9359           VSTRWSBWBQ))
9360  ]
9361  "TARGET_HAVE_MVE"
9362{
9363   rtx ops[3];
9364   ops[0] = operands[1];
9365   ops[1] = operands[2];
9366   ops[2] = operands[3];
9367   output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops);
9368   return "";
9369}
9370  [(set_attr "length" "8")])
9371
9372;;
9373;; [vstrwq_scatter_base_wb_f]
9374;;
9375(define_insn "mve_vstrwq_scatter_base_wb_fv4sf"
9376 [(set (mem:BLK (scratch))
9377       (unspec:BLK
9378                    [(match_operand:V4SI 1 "s_register_operand" "0")
9379                     (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
9380                     (match_operand:V4SF 3 "s_register_operand" "w")]
9381           VSTRWQSBWB_F))
9382   (set (match_operand:V4SI 0 "s_register_operand" "=w")
9383          (unspec:V4SI [(match_dup 1) (match_dup 2)]
9384           VSTRWQSBWB_F))
9385  ]
9386  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9387{
9388   rtx ops[3];
9389   ops[0] = operands[1];
9390   ops[1] = operands[2];
9391   ops[2] = operands[3];
9392   output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
9393   return "";
9394}
9395  [(set_attr "length" "4")])
9396
9397;;
9398;; [vstrwq_scatter_base_wb_p_f]
9399;;
9400(define_insn "mve_vstrwq_scatter_base_wb_p_fv4sf"
9401 [(set (mem:BLK (scratch))
9402       (unspec:BLK
9403                    [(match_operand:V4SI 1 "s_register_operand" "0")
9404                     (match_operand:SI 2 "mve_vstrw_immediate" "Rl")
9405                     (match_operand:V4SF 3 "s_register_operand" "w")
9406                     (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9407          VSTRWQSBWB_F))
9408   (set (match_operand:V4SI 0 "s_register_operand" "=w")
9409          (unspec:V4SI [(match_dup 1) (match_dup 2)]
9410           VSTRWQSBWB_F))
9411  ]
9412  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9413{
9414   rtx ops[3];
9415   ops[0] = operands[1];
9416   ops[1] = operands[2];
9417   ops[2] = operands[3];
9418   output_asm_insn ("vpst\;vstrwt.u32\t%q2, [%q0, %1]!",ops);
9419   return "";
9420}
9421  [(set_attr "length" "8")])
9422
9423;;
9424;; [vstrdq_scatter_base_wb_s vstrdq_scatter_base_wb_u]
9425;;
9426(define_insn "mve_vstrdq_scatter_base_wb_<supf>v2di"
9427  [(set (mem:BLK (scratch))
9428          (unspec:BLK
9429                    [(match_operand:V2DI 1 "s_register_operand" "0")
9430                     (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
9431                     (match_operand:V2DI 3 "s_register_operand" "w")]
9432           VSTRDSBWBQ))
9433   (set (match_operand:V2DI 0 "s_register_operand" "=&w")
9434          (unspec:V2DI [(match_dup 1) (match_dup 2)]
9435           VSTRDSBWBQ))
9436  ]
9437  "TARGET_HAVE_MVE"
9438{
9439   rtx ops[3];
9440   ops[0] = operands[1];
9441   ops[1] = operands[2];
9442   ops[2] = operands[3];
9443   output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]!",ops);
9444   return "";
9445}
9446  [(set_attr "length" "4")])
9447
9448;;
9449;; [vstrdq_scatter_base_wb_p_s vstrdq_scatter_base_wb_p_u]
9450;;
9451(define_insn "mve_vstrdq_scatter_base_wb_p_<supf>v2di"
9452  [(set (mem:BLK (scratch))
9453          (unspec:BLK
9454                    [(match_operand:V2DI 1 "s_register_operand" "0")
9455                     (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
9456                     (match_operand:V2DI 3 "s_register_operand" "w")
9457                     (match_operand:HI 4 "vpr_register_operand" "Up")]
9458           VSTRDSBWBQ))
9459   (set (match_operand:V2DI 0 "s_register_operand" "=w")
9460          (unspec:V2DI [(match_dup 1) (match_dup 2)]
9461           VSTRDSBWBQ))
9462  ]
9463  "TARGET_HAVE_MVE"
9464{
9465   rtx ops[3];
9466   ops[0] = operands[1];
9467   ops[1] = operands[2];
9468   ops[2] = operands[3];
9469   output_asm_insn ("vpst\;vstrdt.u64\t%q2, [%q0, %1]!",ops);
9470   return "";
9471}
9472  [(set_attr "length" "8")])
9473
9474(define_expand "mve_vldrwq_gather_base_wb_<supf>v4si"
9475  [(match_operand:V4SI 0 "s_register_operand")
9476   (match_operand:V4SI 1 "s_register_operand")
9477   (match_operand:SI 2 "mve_vldrd_immediate")
9478   (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
9479  "TARGET_HAVE_MVE"
9480{
9481  rtx ignore_result = gen_reg_rtx (V4SImode);
9482  emit_insn (
9483  gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (ignore_result, operands[0],
9484                                                             operands[1], operands[2]));
9485  DONE;
9486})
9487
9488(define_expand "mve_vldrwq_gather_base_nowb_<supf>v4si"
9489  [(match_operand:V4SI 0 "s_register_operand")
9490   (match_operand:V4SI 1 "s_register_operand")
9491   (match_operand:SI 2 "mve_vldrd_immediate")
9492   (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
9493  "TARGET_HAVE_MVE"
9494{
9495  rtx ignore_wb = gen_reg_rtx (V4SImode);
9496  emit_insn (
9497  gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (operands[0], ignore_wb,
9498                                                             operands[1], operands[2]));
9499  DONE;
9500})
9501
9502;;
9503;; [vldrwq_gather_base_wb_s vldrwq_gather_base_wb_u]
9504;;
9505(define_insn "mve_vldrwq_gather_base_wb_<supf>v4si_insn"
9506  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
9507          (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
9508                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9509                          (mem:BLK (scratch))]
9510           VLDRWGBWBQ))
9511   (set (match_operand:V4SI 1 "s_register_operand" "=&w")
9512          (unspec:V4SI [(match_dup 2) (match_dup 3)]
9513           VLDRWGBWBQ))
9514  ]
9515  "TARGET_HAVE_MVE"
9516{
9517   rtx ops[3];
9518   ops[0] = operands[0];
9519   ops[1] = operands[2];
9520   ops[2] = operands[3];
9521   output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
9522   return "";
9523}
9524  [(set_attr "length" "4")])
9525
9526(define_expand "mve_vldrwq_gather_base_wb_z_<supf>v4si"
9527  [(match_operand:V4SI 0 "s_register_operand")
9528   (match_operand:V4SI 1 "s_register_operand")
9529   (match_operand:SI 2 "mve_vldrd_immediate")
9530   (match_operand:V4BI 3 "vpr_register_operand")
9531   (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
9532  "TARGET_HAVE_MVE"
9533{
9534  rtx ignore_result = gen_reg_rtx (V4SImode);
9535  emit_insn (
9536  gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (ignore_result, operands[0],
9537                                                               operands[1], operands[2],
9538                                                               operands[3]));
9539  DONE;
9540})
9541(define_expand "mve_vldrwq_gather_base_nowb_z_<supf>v4si"
9542  [(match_operand:V4SI 0 "s_register_operand")
9543   (match_operand:V4SI 1 "s_register_operand")
9544   (match_operand:SI 2 "mve_vldrd_immediate")
9545   (match_operand:V4BI 3 "vpr_register_operand")
9546   (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
9547  "TARGET_HAVE_MVE"
9548{
9549  rtx ignore_wb = gen_reg_rtx (V4SImode);
9550  emit_insn (
9551  gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (operands[0], ignore_wb,
9552                                                               operands[1], operands[2],
9553                                                               operands[3]));
9554  DONE;
9555})
9556
9557;;
9558;; [vldrwq_gather_base_wb_z_s vldrwq_gather_base_wb_z_u]
9559;;
9560(define_insn "mve_vldrwq_gather_base_wb_z_<supf>v4si_insn"
9561  [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
9562          (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
9563                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9564                          (match_operand:V4BI 4 "vpr_register_operand" "Up")
9565                          (mem:BLK (scratch))]
9566           VLDRWGBWBQ))
9567   (set (match_operand:V4SI 1 "s_register_operand" "=&w")
9568          (unspec:V4SI [(match_dup 2) (match_dup 3)]
9569           VLDRWGBWBQ))
9570  ]
9571  "TARGET_HAVE_MVE"
9572{
9573   rtx ops[3];
9574   ops[0] = operands[0];
9575   ops[1] = operands[2];
9576   ops[2] = operands[3];
9577   output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
9578   return "";
9579}
9580  [(set_attr "length" "8")])
9581
9582(define_expand "mve_vldrwq_gather_base_wb_fv4sf"
9583  [(match_operand:V4SI 0 "s_register_operand")
9584   (match_operand:V4SI 1 "s_register_operand")
9585   (match_operand:SI 2 "mve_vldrd_immediate")
9586   (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
9587  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9588{
9589  rtx ignore_result = gen_reg_rtx (V4SFmode);
9590  emit_insn (
9591  gen_mve_vldrwq_gather_base_wb_fv4sf_insn (ignore_result, operands[0],
9592                                                      operands[1], operands[2]));
9593  DONE;
9594})
9595
9596(define_expand "mve_vldrwq_gather_base_nowb_fv4sf"
9597  [(match_operand:V4SF 0 "s_register_operand")
9598   (match_operand:V4SI 1 "s_register_operand")
9599   (match_operand:SI 2 "mve_vldrd_immediate")
9600   (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
9601  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9602{
9603  rtx ignore_wb = gen_reg_rtx (V4SImode);
9604  emit_insn (
9605  gen_mve_vldrwq_gather_base_wb_fv4sf_insn (operands[0], ignore_wb,
9606                                                      operands[1], operands[2]));
9607  DONE;
9608})
9609
9610;;
9611;; [vldrwq_gather_base_wb_f]
9612;;
9613(define_insn "mve_vldrwq_gather_base_wb_fv4sf_insn"
9614  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
9615          (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
9616                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9617                          (mem:BLK (scratch))]
9618           VLDRWQGBWB_F))
9619   (set (match_operand:V4SI 1 "s_register_operand" "=&w")
9620          (unspec:V4SI [(match_dup 2) (match_dup 3)]
9621           VLDRWQGBWB_F))
9622  ]
9623  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9624{
9625   rtx ops[3];
9626   ops[0] = operands[0];
9627   ops[1] = operands[2];
9628   ops[2] = operands[3];
9629   output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
9630   return "";
9631}
9632  [(set_attr "length" "4")])
9633
9634(define_expand "mve_vldrwq_gather_base_wb_z_fv4sf"
9635  [(match_operand:V4SI 0 "s_register_operand")
9636   (match_operand:V4SI 1 "s_register_operand")
9637   (match_operand:SI 2 "mve_vldrd_immediate")
9638   (match_operand:V4BI 3 "vpr_register_operand")
9639   (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
9640  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9641{
9642  rtx ignore_result = gen_reg_rtx (V4SFmode);
9643  emit_insn (
9644  gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (ignore_result, operands[0],
9645                                                        operands[1], operands[2],
9646                                                        operands[3]));
9647  DONE;
9648})
9649
9650(define_expand "mve_vldrwq_gather_base_nowb_z_fv4sf"
9651  [(match_operand:V4SF 0 "s_register_operand")
9652   (match_operand:V4SI 1 "s_register_operand")
9653   (match_operand:SI 2 "mve_vldrd_immediate")
9654   (match_operand:V4BI 3 "vpr_register_operand")
9655   (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
9656  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9657{
9658  rtx ignore_wb = gen_reg_rtx (V4SImode);
9659  emit_insn (
9660  gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (operands[0], ignore_wb,
9661                                                        operands[1], operands[2],
9662                                                        operands[3]));
9663  DONE;
9664})
9665
9666;;
9667;; [vldrwq_gather_base_wb_z_f]
9668;;
9669(define_insn "mve_vldrwq_gather_base_wb_z_fv4sf_insn"
9670  [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
9671          (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
9672                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9673                          (match_operand:V4BI 4 "vpr_register_operand" "Up")
9674                          (mem:BLK (scratch))]
9675           VLDRWQGBWB_F))
9676   (set (match_operand:V4SI 1 "s_register_operand" "=&w")
9677          (unspec:V4SI [(match_dup 2) (match_dup 3)]
9678           VLDRWQGBWB_F))
9679  ]
9680  "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
9681{
9682   rtx ops[3];
9683   ops[0] = operands[0];
9684   ops[1] = operands[2];
9685   ops[2] = operands[3];
9686   output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
9687   return "";
9688}
9689  [(set_attr "length" "8")])
9690
9691(define_expand "mve_vldrdq_gather_base_wb_<supf>v2di"
9692  [(match_operand:V2DI 0 "s_register_operand")
9693   (match_operand:V2DI 1 "s_register_operand")
9694   (match_operand:SI 2 "mve_vldrd_immediate")
9695   (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
9696  "TARGET_HAVE_MVE"
9697{
9698  rtx ignore_result = gen_reg_rtx (V2DImode);
9699  emit_insn (
9700  gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (ignore_result, operands[0],
9701                                                             operands[1], operands[2]));
9702  DONE;
9703})
9704
9705(define_expand "mve_vldrdq_gather_base_nowb_<supf>v2di"
9706  [(match_operand:V2DI 0 "s_register_operand")
9707   (match_operand:V2DI 1 "s_register_operand")
9708   (match_operand:SI 2 "mve_vldrd_immediate")
9709   (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
9710  "TARGET_HAVE_MVE"
9711{
9712  rtx ignore_wb = gen_reg_rtx (V2DImode);
9713  emit_insn (
9714  gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (operands[0], ignore_wb,
9715                                                             operands[1], operands[2]));
9716  DONE;
9717})
9718
9719
9720;;
9721;; [vldrdq_gather_base_wb_s vldrdq_gather_base_wb_u]
9722;;
9723(define_insn "mve_vldrdq_gather_base_wb_<supf>v2di_insn"
9724  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
9725          (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
9726                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9727                          (mem:BLK (scratch))]
9728           VLDRDGBWBQ))
9729   (set (match_operand:V2DI 1 "s_register_operand" "=&w")
9730          (unspec:V2DI [(match_dup 2) (match_dup 3)]
9731           VLDRDGBWBQ))
9732  ]
9733  "TARGET_HAVE_MVE"
9734{
9735   rtx ops[3];
9736   ops[0] = operands[0];
9737   ops[1] = operands[2];
9738   ops[2] = operands[3];
9739   output_asm_insn ("vldrd.64\t%q0, [%q1, %2]!",ops);
9740   return "";
9741}
9742  [(set_attr "length" "4")])
9743
9744(define_expand "mve_vldrdq_gather_base_wb_z_<supf>v2di"
9745  [(match_operand:V2DI 0 "s_register_operand")
9746   (match_operand:V2DI 1 "s_register_operand")
9747   (match_operand:SI 2 "mve_vldrd_immediate")
9748   (match_operand:HI 3 "vpr_register_operand")
9749   (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
9750  "TARGET_HAVE_MVE"
9751{
9752  rtx ignore_result = gen_reg_rtx (V2DImode);
9753  emit_insn (
9754  gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (ignore_result, operands[0],
9755                                                               operands[1], operands[2],
9756                                                               operands[3]));
9757  DONE;
9758})
9759
9760(define_expand "mve_vldrdq_gather_base_nowb_z_<supf>v2di"
9761  [(match_operand:V2DI 0 "s_register_operand")
9762   (match_operand:V2DI 1 "s_register_operand")
9763   (match_operand:SI 2 "mve_vldrd_immediate")
9764   (match_operand:HI 3 "vpr_register_operand")
9765   (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
9766  "TARGET_HAVE_MVE"
9767{
9768  rtx ignore_wb = gen_reg_rtx (V2DImode);
9769  emit_insn (
9770  gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (operands[0], ignore_wb,
9771                                                               operands[1], operands[2],
9772                                                               operands[3]));
9773  DONE;
9774})
9775
9776(define_insn "get_fpscr_nzcvqc"
9777 [(set (match_operand:SI 0 "register_operand" "=r")
9778   (unspec_volatile:SI [(reg:SI VFPCC_REGNUM)] UNSPEC_GET_FPSCR_NZCVQC))]
9779 "TARGET_HAVE_MVE"
9780 "vmrs\\t%0, FPSCR_nzcvqc"
9781  [(set_attr "type" "mve_move")])
9782
9783(define_insn "set_fpscr_nzcvqc"
9784 [(set (reg:SI VFPCC_REGNUM)
9785   (unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")]
9786    VUNSPEC_SET_FPSCR_NZCVQC))]
9787 "TARGET_HAVE_MVE"
9788 "vmsr\\tFPSCR_nzcvqc, %0"
9789  [(set_attr "type" "mve_move")])
9790
9791;;
9792;; [vldrdq_gather_base_wb_z_s vldrdq_gather_base_wb_z_u]
9793;;
9794(define_insn "mve_vldrdq_gather_base_wb_z_<supf>v2di_insn"
9795  [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
9796          (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
9797                          (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
9798                          (match_operand:HI 4 "vpr_register_operand" "Up")
9799                          (mem:BLK (scratch))]
9800           VLDRDGBWBQ))
9801   (set (match_operand:V2DI 1 "s_register_operand" "=&w")
9802          (unspec:V2DI [(match_dup 2) (match_dup 3)]
9803           VLDRDGBWBQ))
9804  ]
9805  "TARGET_HAVE_MVE"
9806{
9807   rtx ops[3];
9808   ops[0] = operands[0];
9809   ops[1] = operands[2];
9810   ops[2] = operands[3];
9811   output_asm_insn ("vpst\;vldrdt.u64\t%q0, [%q1, %2]!",ops);
9812   return "";
9813}
9814  [(set_attr "length" "8")])
9815;;
9816;; [vadciq_m_s, vadciq_m_u])
9817;;
9818(define_insn "mve_vadciq_m_<supf>v4si"
9819  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9820          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
9821                          (match_operand:V4SI 2 "s_register_operand" "w")
9822                          (match_operand:V4SI 3 "s_register_operand" "w")
9823                          (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9824           VADCIQ_M))
9825   (set (reg:SI VFPCC_REGNUM)
9826          (unspec:SI [(const_int 0)]
9827           VADCIQ_M))
9828  ]
9829  "TARGET_HAVE_MVE"
9830  "vpst\;vadcit.i32\t%q0, %q2, %q3"
9831  [(set_attr "type" "mve_move")
9832   (set_attr "length" "8")])
9833
9834;;
9835;; [vadciq_u, vadciq_s])
9836;;
9837(define_insn "mve_vadciq_<supf>v4si"
9838  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9839          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9840                          (match_operand:V4SI 2 "s_register_operand" "w")]
9841           VADCIQ))
9842   (set (reg:SI VFPCC_REGNUM)
9843          (unspec:SI [(const_int 0)]
9844           VADCIQ))
9845  ]
9846  "TARGET_HAVE_MVE"
9847  "vadci.i32\t%q0, %q1, %q2"
9848  [(set_attr "type" "mve_move")
9849   (set_attr "length" "4")])
9850
9851;;
9852;; [vadcq_m_s, vadcq_m_u])
9853;;
9854(define_insn "mve_vadcq_m_<supf>v4si"
9855  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9856          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
9857                          (match_operand:V4SI 2 "s_register_operand" "w")
9858                          (match_operand:V4SI 3 "s_register_operand" "w")
9859                          (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9860           VADCQ_M))
9861   (set (reg:SI VFPCC_REGNUM)
9862          (unspec:SI [(reg:SI VFPCC_REGNUM)]
9863           VADCQ_M))
9864  ]
9865  "TARGET_HAVE_MVE"
9866  "vpst\;vadct.i32\t%q0, %q2, %q3"
9867  [(set_attr "type" "mve_move")
9868   (set_attr "length" "8")])
9869
9870;;
9871;; [vadcq_u, vadcq_s])
9872;;
9873(define_insn "mve_vadcq_<supf>v4si"
9874  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9875          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9876                           (match_operand:V4SI 2 "s_register_operand" "w")]
9877           VADCQ))
9878   (set (reg:SI VFPCC_REGNUM)
9879          (unspec:SI [(reg:SI VFPCC_REGNUM)]
9880           VADCQ))
9881  ]
9882  "TARGET_HAVE_MVE"
9883  "vadc.i32\t%q0, %q1, %q2"
9884  [(set_attr "type" "mve_move")
9885   (set_attr "length" "4")
9886   (set_attr "conds" "set")])
9887
9888;;
9889;; [vsbciq_m_u, vsbciq_m_s])
9890;;
9891(define_insn "mve_vsbciq_m_<supf>v4si"
9892  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9893          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9894                          (match_operand:V4SI 2 "s_register_operand" "w")
9895                          (match_operand:V4SI 3 "s_register_operand" "w")
9896                          (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9897           VSBCIQ_M))
9898   (set (reg:SI VFPCC_REGNUM)
9899          (unspec:SI [(const_int 0)]
9900           VSBCIQ_M))
9901  ]
9902  "TARGET_HAVE_MVE"
9903  "vpst\;vsbcit.i32\t%q0, %q2, %q3"
9904  [(set_attr "type" "mve_move")
9905   (set_attr "length" "8")])
9906
9907;;
9908;; [vsbciq_s, vsbciq_u])
9909;;
9910(define_insn "mve_vsbciq_<supf>v4si"
9911  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9912          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9913                          (match_operand:V4SI 2 "s_register_operand" "w")]
9914           VSBCIQ))
9915   (set (reg:SI VFPCC_REGNUM)
9916          (unspec:SI [(const_int 0)]
9917           VSBCIQ))
9918  ]
9919  "TARGET_HAVE_MVE"
9920  "vsbci.i32\t%q0, %q1, %q2"
9921  [(set_attr "type" "mve_move")
9922   (set_attr "length" "4")])
9923
9924;;
9925;; [vsbcq_m_u, vsbcq_m_s])
9926;;
9927(define_insn "mve_vsbcq_m_<supf>v4si"
9928  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9929          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9930                          (match_operand:V4SI 2 "s_register_operand" "w")
9931                          (match_operand:V4SI 3 "s_register_operand" "w")
9932                          (match_operand:V4BI 4 "vpr_register_operand" "Up")]
9933           VSBCQ_M))
9934   (set (reg:SI VFPCC_REGNUM)
9935          (unspec:SI [(reg:SI VFPCC_REGNUM)]
9936           VSBCQ_M))
9937  ]
9938  "TARGET_HAVE_MVE"
9939  "vpst\;vsbct.i32\t%q0, %q2, %q3"
9940  [(set_attr "type" "mve_move")
9941   (set_attr "length" "8")])
9942
9943;;
9944;; [vsbcq_s, vsbcq_u])
9945;;
9946(define_insn "mve_vsbcq_<supf>v4si"
9947  [(set (match_operand:V4SI 0 "s_register_operand" "=w")
9948          (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
9949                          (match_operand:V4SI 2 "s_register_operand" "w")]
9950           VSBCQ))
9951   (set (reg:SI VFPCC_REGNUM)
9952          (unspec:SI [(reg:SI VFPCC_REGNUM)]
9953           VSBCQ))
9954  ]
9955  "TARGET_HAVE_MVE"
9956  "vsbc.i32\t%q0, %q1, %q2"
9957  [(set_attr "type" "mve_move")
9958   (set_attr "length" "4")])
9959
9960;;
9961;; [vst2q])
9962;;
9963(define_insn "mve_vst2q<mode>"
9964  [(set (match_operand:OI 0 "mve_struct_operand" "=Ug")
9965          (unspec:OI [(match_operand:OI 1 "s_register_operand" "w")
9966                        (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
9967           VST2Q))
9968  ]
9969  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
9970   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
9971{
9972   rtx ops[4];
9973   int regno = REGNO (operands[1]);
9974   ops[0] = gen_rtx_REG (TImode, regno);
9975   ops[1] = gen_rtx_REG (TImode, regno + 4);
9976   rtx reg  = operands[0];
9977   while (reg && !REG_P (reg))
9978    reg = XEXP (reg, 0);
9979   gcc_assert (REG_P (reg));
9980   ops[2] = reg;
9981   ops[3] = operands[0];
9982   output_asm_insn ("vst20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
9983                        "vst21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
9984   return "";
9985}
9986  [(set_attr "length" "8")])
9987
9988;;
9989;; [vld2q])
9990;;
9991(define_insn "mve_vld2q<mode>"
9992  [(set (match_operand:OI 0 "s_register_operand" "=w")
9993          (unspec:OI [(match_operand:OI 1 "mve_struct_operand" "Ug")
9994                        (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
9995           VLD2Q))
9996  ]
9997  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
9998   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
9999{
10000   rtx ops[4];
10001   int regno = REGNO (operands[0]);
10002   ops[0] = gen_rtx_REG (TImode, regno);
10003   ops[1] = gen_rtx_REG (TImode, regno + 4);
10004   rtx reg  = operands[1];
10005   while (reg && !REG_P (reg))
10006    reg = XEXP (reg, 0);
10007   gcc_assert (REG_P (reg));
10008   ops[2] = reg;
10009   ops[3] = operands[1];
10010   output_asm_insn ("vld20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
10011                        "vld21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
10012   return "";
10013}
10014  [(set_attr "length" "8")])
10015
10016;;
10017;; [vld4q])
10018;;
10019(define_insn "mve_vld4q<mode>"
10020  [(set (match_operand:XI 0 "s_register_operand" "=w")
10021          (unspec:XI [(match_operand:XI 1 "mve_struct_operand" "Ug")
10022                        (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
10023           VLD4Q))
10024  ]
10025  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10026   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
10027{
10028   rtx ops[6];
10029   int regno = REGNO (operands[0]);
10030   ops[0] = gen_rtx_REG (TImode, regno);
10031   ops[1] = gen_rtx_REG (TImode, regno+4);
10032   ops[2] = gen_rtx_REG (TImode, regno+8);
10033   ops[3] = gen_rtx_REG (TImode, regno + 12);
10034   rtx reg  = operands[1];
10035   while (reg && !REG_P (reg))
10036    reg = XEXP (reg, 0);
10037   gcc_assert (REG_P (reg));
10038   ops[4] = reg;
10039   ops[5] = operands[1];
10040   output_asm_insn ("vld40.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
10041                        "vld41.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
10042                        "vld42.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
10043                        "vld43.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, %5", ops);
10044   return "";
10045}
10046  [(set_attr "length" "16")])
10047;;
10048;; [vgetq_lane_u, vgetq_lane_s, vgetq_lane_f])
10049;;
10050(define_insn "mve_vec_extract<mode><V_elem_l>"
10051 [(set (match_operand:<V_elem> 0 "nonimmediate_operand" "=r")
10052   (vec_select:<V_elem>
10053    (match_operand:MVE_VLD_ST 1 "s_register_operand" "w")
10054    (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
10055  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10056   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
10057{
10058  if (BYTES_BIG_ENDIAN)
10059    {
10060      int elt = INTVAL (operands[2]);
10061      elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
10062      operands[2] = GEN_INT (elt);
10063    }
10064  return "vmov.<V_extr_elem>\t%0, %q1[%c2]";
10065}
10066 [(set_attr "type" "mve_move")])
10067
10068(define_insn "mve_vec_extractv2didi"
10069 [(set (match_operand:DI 0 "nonimmediate_operand" "=r")
10070   (vec_select:DI
10071    (match_operand:V2DI 1 "s_register_operand" "w")
10072    (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
10073  "TARGET_HAVE_MVE"
10074{
10075  int elt = INTVAL (operands[2]);
10076  if (BYTES_BIG_ENDIAN)
10077    elt = 1 - elt;
10078
10079  if (elt == 0)
10080   return "vmov\t%Q0, %R0, %e1";
10081  else
10082   return "vmov\t%Q0, %R0, %f1";
10083}
10084 [(set_attr "type" "mve_move")])
10085
10086(define_insn "*mve_vec_extract_sext_internal<mode>"
10087 [(set (match_operand:SI 0 "s_register_operand" "=r")
10088   (sign_extend:SI
10089    (vec_select:<V_elem>
10090     (match_operand:MVE_2 1 "s_register_operand" "w")
10091     (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
10092  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10093   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
10094{
10095  if (BYTES_BIG_ENDIAN)
10096    {
10097      int elt = INTVAL (operands[2]);
10098      elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
10099      operands[2] = GEN_INT (elt);
10100    }
10101  return "vmov.s<V_sz_elem>\t%0, %q1[%c2]";
10102}
10103 [(set_attr "type" "mve_move")])
10104
10105(define_insn "*mve_vec_extract_zext_internal<mode>"
10106 [(set (match_operand:SI 0 "s_register_operand" "=r")
10107   (zero_extend:SI
10108    (vec_select:<V_elem>
10109     (match_operand:MVE_2 1 "s_register_operand" "w")
10110     (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
10111  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10112   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
10113{
10114  if (BYTES_BIG_ENDIAN)
10115    {
10116      int elt = INTVAL (operands[2]);
10117      elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
10118      operands[2] = GEN_INT (elt);
10119    }
10120  return "vmov.u<V_sz_elem>\t%0, %q1[%c2]";
10121}
10122 [(set_attr "type" "mve_move")])
10123
10124;;
10125;; [vsetq_lane_u, vsetq_lane_s, vsetq_lane_f])
10126;;
10127(define_insn "mve_vec_set<mode>_internal"
10128 [(set (match_operand:VQ2 0 "s_register_operand" "=w")
10129       (vec_merge:VQ2
10130          (vec_duplicate:VQ2
10131            (match_operand:<V_elem> 1 "nonimmediate_operand" "r"))
10132          (match_operand:VQ2 3 "s_register_operand" "0")
10133          (match_operand:SI 2 "immediate_operand" "i")))]
10134  "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10135   || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
10136{
10137  int elt = ffs ((int) INTVAL (operands[2])) - 1;
10138  if (BYTES_BIG_ENDIAN)
10139    elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
10140  operands[2] = GEN_INT (elt);
10141
10142  return "vmov.<V_sz_elem>\t%q0[%c2], %1";
10143}
10144 [(set_attr "type" "mve_move")])
10145
10146(define_insn "mve_vec_setv2di_internal"
10147 [(set (match_operand:V2DI 0 "s_register_operand" "=w")
10148       (vec_merge:V2DI
10149          (vec_duplicate:V2DI
10150            (match_operand:DI 1 "nonimmediate_operand" "r"))
10151          (match_operand:V2DI 3 "s_register_operand" "0")
10152          (match_operand:SI 2 "immediate_operand" "i")))]
10153 "TARGET_HAVE_MVE"
10154{
10155  int elt = ffs ((int) INTVAL (operands[2])) - 1;
10156  if (BYTES_BIG_ENDIAN)
10157    elt = 1 - elt;
10158
10159  if (elt == 0)
10160   return "vmov\t%e0, %Q1, %R1";
10161  else
10162   return "vmov\t%f0, %J1, %K1";
10163}
10164 [(set_attr "type" "mve_move")])
10165
10166;;
10167;; [uqrshll_di]
10168;;
10169(define_insn "mve_uqrshll_sat<supf>_di"
10170  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10171          (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
10172                        (match_operand:SI 2 "register_operand" "r")]
10173           UQRSHLLQ))]
10174  "TARGET_HAVE_MVE"
10175  "uqrshll%?\\t%Q1, %R1, #<supf>, %2"
10176  [(set_attr "predicable" "yes")])
10177
10178;;
10179;; [sqrshrl_di]
10180;;
10181(define_insn "mve_sqrshrl_sat<supf>_di"
10182  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10183          (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
10184                        (match_operand:SI 2 "register_operand" "r")]
10185           SQRSHRLQ))]
10186  "TARGET_HAVE_MVE"
10187  "sqrshrl%?\\t%Q1, %R1, #<supf>, %2"
10188  [(set_attr "predicable" "yes")])
10189
10190;;
10191;; [uqrshl_si]
10192;;
10193(define_insn "mve_uqrshl_si"
10194  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10195          (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
10196                        (match_operand:SI 2 "register_operand" "r")]
10197           UQRSHL))]
10198  "TARGET_HAVE_MVE"
10199  "uqrshl%?\\t%1, %2"
10200  [(set_attr "predicable" "yes")])
10201
10202;;
10203;; [sqrshr_si]
10204;;
10205(define_insn "mve_sqrshr_si"
10206  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10207          (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
10208                        (match_operand:SI 2 "register_operand" "r")]
10209           SQRSHR))]
10210  "TARGET_HAVE_MVE"
10211  "sqrshr%?\\t%1, %2"
10212  [(set_attr "predicable" "yes")])
10213
10214;;
10215;; [uqshll_di]
10216;;
10217(define_insn "mve_uqshll_di"
10218  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10219          (us_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
10220                          (match_operand:SI 2 "immediate_operand" "Pg")))]
10221  "TARGET_HAVE_MVE"
10222  "uqshll%?\\t%Q1, %R1, %2"
10223  [(set_attr "predicable" "yes")])
10224
10225;;
10226;; [urshrl_di]
10227;;
10228(define_insn "mve_urshrl_di"
10229  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10230          (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
10231                        (match_operand:SI 2 "immediate_operand" "Pg")]
10232           URSHRL))]
10233  "TARGET_HAVE_MVE"
10234  "urshrl%?\\t%Q1, %R1, %2"
10235  [(set_attr "predicable" "yes")])
10236
10237;;
10238;; [uqshl_si]
10239;;
10240(define_insn "mve_uqshl_si"
10241  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10242          (us_ashift:SI (match_operand:SI 1 "arm_general_register_operand" "0")
10243                          (match_operand:SI 2 "immediate_operand" "Pg")))]
10244  "TARGET_HAVE_MVE"
10245  "uqshl%?\\t%1, %2"
10246  [(set_attr "predicable" "yes")])
10247
10248;;
10249;; [urshr_si]
10250;;
10251(define_insn "mve_urshr_si"
10252  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10253          (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
10254                        (match_operand:SI 2 "immediate_operand" "Pg")]
10255           URSHR))]
10256  "TARGET_HAVE_MVE"
10257  "urshr%?\\t%1, %2"
10258  [(set_attr "predicable" "yes")])
10259
10260;;
10261;; [sqshl_si]
10262;;
10263(define_insn "mve_sqshl_si"
10264  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10265          (ss_ashift:SI (match_operand:DI 1 "arm_general_register_operand" "0")
10266                          (match_operand:SI 2 "immediate_operand" "Pg")))]
10267  "TARGET_HAVE_MVE"
10268  "sqshl%?\\t%1, %2"
10269  [(set_attr "predicable" "yes")])
10270
10271;;
10272;; [srshr_si]
10273;;
10274(define_insn "mve_srshr_si"
10275  [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
10276          (unspec:SI [(match_operand:DI 1 "arm_general_register_operand" "0")
10277                        (match_operand:SI 2 "immediate_operand" "Pg")]
10278           SRSHR))]
10279  "TARGET_HAVE_MVE"
10280  "srshr%?\\t%1, %2"
10281  [(set_attr "predicable" "yes")])
10282
10283;;
10284;; [srshrl_di]
10285;;
10286(define_insn "mve_srshrl_di"
10287  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10288          (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
10289                        (match_operand:SI 2 "immediate_operand" "Pg")]
10290           SRSHRL))]
10291  "TARGET_HAVE_MVE"
10292  "srshrl%?\\t%Q1, %R1, %2"
10293  [(set_attr "predicable" "yes")])
10294
10295;;
10296;; [sqshll_di]
10297;;
10298(define_insn "mve_sqshll_di"
10299  [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
10300          (ss_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
10301                          (match_operand:SI 2 "immediate_operand" "Pg")))]
10302  "TARGET_HAVE_MVE"
10303  "sqshll%?\\t%Q1, %R1, %2"
10304  [(set_attr "predicable" "yes")])
10305
10306;;
10307;; [vshlcq_m_u vshlcq_m_s]
10308;;
10309(define_expand "mve_vshlcq_m_vec_<supf><mode>"
10310 [(match_operand:MVE_2 0 "s_register_operand")
10311  (match_operand:MVE_2 1 "s_register_operand")
10312  (match_operand:SI 2 "s_register_operand")
10313  (match_operand:SI 3 "mve_imm_32")
10314  (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
10315  (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
10316 "TARGET_HAVE_MVE"
10317{
10318  rtx ignore_wb = gen_reg_rtx (SImode);
10319  emit_insn (gen_mve_vshlcq_m_<supf><mode> (operands[0], ignore_wb, operands[1],
10320                                                      operands[2], operands[3],
10321                                                      operands[4]));
10322  DONE;
10323})
10324
10325(define_expand "mve_vshlcq_m_carry_<supf><mode>"
10326 [(match_operand:SI 0 "s_register_operand")
10327  (match_operand:MVE_2 1 "s_register_operand")
10328  (match_operand:SI 2 "s_register_operand")
10329  (match_operand:SI 3 "mve_imm_32")
10330  (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
10331  (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
10332 "TARGET_HAVE_MVE"
10333{
10334  rtx ignore_vec = gen_reg_rtx (<MODE>mode);
10335  emit_insn (gen_mve_vshlcq_m_<supf><mode> (ignore_vec, operands[0],
10336                                                      operands[1], operands[2],
10337                                                      operands[3], operands[4]));
10338  DONE;
10339})
10340
10341(define_insn "mve_vshlcq_m_<supf><mode>"
10342 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
10343       (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
10344                          (match_operand:SI 3 "s_register_operand" "1")
10345                          (match_operand:SI 4 "mve_imm_32" "Rf")
10346                          (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
10347          VSHLCQ_M))
10348  (set (match_operand:SI  1 "s_register_operand" "=r")
10349       (unspec:SI [(match_dup 2)
10350                       (match_dup 3)
10351                       (match_dup 4)
10352                       (match_dup 5)]
10353          VSHLCQ_M))
10354 ]
10355 "TARGET_HAVE_MVE"
10356 "vpst\;vshlct\t%q0, %1, %4"
10357 [(set_attr "type" "mve_move")
10358  (set_attr "length" "8")])
10359
10360;; CDE instructions on MVE registers.
10361
10362(define_insn "arm_vcx1qv16qi"
10363  [(set (match_operand:V16QI 0 "register_operand" "=t")
10364          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10365                                 (match_operand:SI 2 "const_int_mve_cde1_operand" "i")]
10366           UNSPEC_VCDE))]
10367  "TARGET_CDE && TARGET_HAVE_MVE"
10368  "vcx1\\tp%c1, %q0, #%c2"
10369  [(set_attr "type" "coproc")]
10370)
10371
10372(define_insn "arm_vcx1qav16qi"
10373  [(set (match_operand:V16QI 0 "register_operand" "=t")
10374          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10375                                  (match_operand:V16QI 2 "register_operand" "0")
10376                                  (match_operand:SI 3 "const_int_mve_cde1_operand" "i")]
10377           UNSPEC_VCDEA))]
10378  "TARGET_CDE && TARGET_HAVE_MVE"
10379  "vcx1a\\tp%c1, %q0, #%c3"
10380  [(set_attr "type" "coproc")]
10381)
10382
10383(define_insn "arm_vcx2qv16qi"
10384  [(set (match_operand:V16QI 0 "register_operand" "=t")
10385          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10386                                (match_operand:V16QI 2 "register_operand" "t")
10387                                (match_operand:SI 3 "const_int_mve_cde2_operand" "i")]
10388           UNSPEC_VCDE))]
10389  "TARGET_CDE && TARGET_HAVE_MVE"
10390  "vcx2\\tp%c1, %q0, %q2, #%c3"
10391  [(set_attr "type" "coproc")]
10392)
10393
10394(define_insn "arm_vcx2qav16qi"
10395  [(set (match_operand:V16QI 0 "register_operand" "=t")
10396          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10397                                (match_operand:V16QI 2 "register_operand" "0")
10398                                (match_operand:V16QI 3 "register_operand" "t")
10399                                (match_operand:SI 4 "const_int_mve_cde2_operand" "i")]
10400           UNSPEC_VCDEA))]
10401  "TARGET_CDE && TARGET_HAVE_MVE"
10402  "vcx2a\\tp%c1, %q0, %q3, #%c4"
10403  [(set_attr "type" "coproc")]
10404)
10405
10406(define_insn "arm_vcx3qv16qi"
10407  [(set (match_operand:V16QI 0 "register_operand" "=t")
10408          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10409                                (match_operand:V16QI 2 "register_operand" "t")
10410                                (match_operand:V16QI 3 "register_operand" "t")
10411                                (match_operand:SI 4 "const_int_mve_cde3_operand" "i")]
10412           UNSPEC_VCDE))]
10413  "TARGET_CDE && TARGET_HAVE_MVE"
10414  "vcx3\\tp%c1, %q0, %q2, %q3, #%c4"
10415  [(set_attr "type" "coproc")]
10416)
10417
10418(define_insn "arm_vcx3qav16qi"
10419  [(set (match_operand:V16QI 0 "register_operand" "=t")
10420          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10421                                (match_operand:V16QI 2 "register_operand" "0")
10422                                (match_operand:V16QI 3 "register_operand" "t")
10423                                (match_operand:V16QI 4 "register_operand" "t")
10424                                (match_operand:SI 5 "const_int_mve_cde3_operand" "i")]
10425           UNSPEC_VCDEA))]
10426  "TARGET_CDE && TARGET_HAVE_MVE"
10427  "vcx3a\\tp%c1, %q0, %q3, %q4, #%c5"
10428  [(set_attr "type" "coproc")]
10429)
10430
10431(define_insn "arm_vcx1q<a>_p_v16qi"
10432  [(set (match_operand:V16QI 0 "register_operand" "=t")
10433          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10434                                 (match_operand:V16QI 2 "register_operand" "0")
10435                                 (match_operand:SI 3 "const_int_mve_cde1_operand" "i")
10436                                 (match_operand:V16BI 4 "vpr_register_operand" "Up")]
10437           CDE_VCX))]
10438  "TARGET_CDE && TARGET_HAVE_MVE"
10439  "vpst\;vcx1<a>t\\tp%c1, %q0, #%c3"
10440  [(set_attr "type" "coproc")
10441   (set_attr "length" "8")]
10442)
10443
10444(define_insn "arm_vcx2q<a>_p_v16qi"
10445  [(set (match_operand:V16QI 0 "register_operand" "=t")
10446          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10447                                (match_operand:V16QI 2 "register_operand" "0")
10448                                (match_operand:V16QI 3 "register_operand" "t")
10449                                (match_operand:SI 4 "const_int_mve_cde2_operand" "i")
10450                                (match_operand:V16BI 5 "vpr_register_operand" "Up")]
10451           CDE_VCX))]
10452  "TARGET_CDE && TARGET_HAVE_MVE"
10453  "vpst\;vcx2<a>t\\tp%c1, %q0, %q3, #%c4"
10454  [(set_attr "type" "coproc")
10455   (set_attr "length" "8")]
10456)
10457
10458(define_insn "arm_vcx3q<a>_p_v16qi"
10459  [(set (match_operand:V16QI 0 "register_operand" "=t")
10460          (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
10461                                (match_operand:V16QI 2 "register_operand" "0")
10462                                (match_operand:V16QI 3 "register_operand" "t")
10463                                (match_operand:V16QI 4 "register_operand" "t")
10464                                (match_operand:SI 5 "const_int_mve_cde3_operand" "i")
10465                                (match_operand:V16BI 6 "vpr_register_operand" "Up")]
10466           CDE_VCX))]
10467  "TARGET_CDE && TARGET_HAVE_MVE"
10468  "vpst\;vcx3<a>t\\tp%c1, %q0, %q3, %q4, #%c5"
10469  [(set_attr "type" "coproc")
10470   (set_attr "length" "8")]
10471)
10472
10473(define_insn "*movmisalign<mode>_mve_store"
10474  [(set (match_operand:MVE_VLD_ST 0 "mve_memory_operand"         "=Ux")
10475          (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "s_register_operand" " w")]
10476           UNSPEC_MISALIGNED_ACCESS))]
10477  "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10478    || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
10479   && !BYTES_BIG_ENDIAN && unaligned_access"
10480  "vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0"
10481  [(set_attr "type" "mve_store")]
10482)
10483
10484
10485(define_insn "*movmisalign<mode>_mve_load"
10486  [(set (match_operand:MVE_VLD_ST 0 "s_register_operand"                                   "=w")
10487          (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "mve_memory_operand" " Ux")]
10488           UNSPEC_MISALIGNED_ACCESS))]
10489  "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
10490    || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
10491   && !BYTES_BIG_ENDIAN && unaligned_access"
10492  "vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1"
10493  [(set_attr "type" "mve_load")]
10494)
10495
10496;; Expander for VxBI moves
10497(define_expand "mov<mode>"
10498  [(set (match_operand:MVE_7 0 "nonimmediate_operand")
10499        (match_operand:MVE_7 1 "general_operand"))]
10500  "TARGET_HAVE_MVE"
10501  {
10502    if (!register_operand (operands[0], <MODE>mode))
10503      operands[1] = force_reg (<MODE>mode, operands[1]);
10504  }
10505)
10506
10507;; Expanders for vec_cmp and vcond
10508
10509(define_expand "vec_cmp<mode><MVE_vpred>"
10510  [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
10511          (match_operator:<MVE_VPRED> 1 "comparison_operator"
10512            [(match_operand:MVE_VLD_ST 2 "s_register_operand")
10513             (match_operand:MVE_VLD_ST 3 "reg_or_zero_operand")]))]
10514  "TARGET_HAVE_MVE
10515   && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
10516{
10517  arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
10518                                   operands[2], operands[3], false);
10519  DONE;
10520})
10521
10522(define_expand "vec_cmpu<mode><MVE_vpred>"
10523  [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
10524          (match_operator:<MVE_VPRED> 1 "comparison_operator"
10525            [(match_operand:MVE_2 2 "s_register_operand")
10526             (match_operand:MVE_2 3 "reg_or_zero_operand")]))]
10527  "TARGET_HAVE_MVE"
10528{
10529  arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
10530                                   operands[2], operands[3], false);
10531  DONE;
10532})
10533
10534(define_expand "vcond_mask_<mode><MVE_vpred>"
10535  [(set (match_operand:MVE_VLD_ST 0 "s_register_operand")
10536          (if_then_else:MVE_VLD_ST
10537            (match_operand:<MVE_VPRED> 3 "s_register_operand")
10538            (match_operand:MVE_VLD_ST 1 "s_register_operand")
10539            (match_operand:MVE_VLD_ST 2 "s_register_operand")))]
10540  "TARGET_HAVE_MVE"
10541{
10542  switch (GET_MODE_CLASS (<MODE>mode))
10543    {
10544      case MODE_VECTOR_INT:
10545          emit_insn (gen_mve_vpselq (VPSELQ_S, <MODE>mode, operands[0],
10546                                           operands[1], operands[2], operands[3]));
10547          break;
10548      case MODE_VECTOR_FLOAT:
10549          emit_insn (gen_mve_vpselq_f (<MODE>mode, operands[0],
10550                                             operands[1], operands[2], operands[3]));
10551          break;
10552      default:
10553          gcc_unreachable ();
10554    }
10555  DONE;
10556})
10557