1 ;; Arm M-profile Vector Extension Machine Description
2 ;; Copyright (C) 2019-2023 Free Software Foundation, Inc.
4 ;; This file is part of GCC.
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)
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.
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/>.
20 (define_insn "*mve_mov<mode>"
21 [(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w , w, r,Ux,w")
22 (match_operand:MVE_types 1 "general_operand" " w,r,w,DnDm,UxUi,r,w, Ul"))]
23 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
25 switch (which_alternative)
28 return "vmov\t%q0, %q1";
31 return "vmov\t%e0, %Q1, %R1 %@ <mode>\;vmov\t%f0, %J1, %K1";
34 return "vmov\t%Q0, %R0, %e1 %@ <mode>\;vmov\t%J0, %K0, %f1";
36 case 3: /* [w,DnDm]. */
40 is_valid = simd_immediate_valid_for_move (operands[1], <MODE>mode,
41 &operands[1], &width);
43 gcc_assert (is_valid);
46 return "vmov.f32\t%q0, %1 %@ <mode>";
49 const int templ_size = 40;
50 static char templ[templ_size];
51 if (snprintf (templ, templ_size,
52 "vmov.i%d\t%%q0, %%x1 %%@ <mode>", width)
59 case 4: /* [w,UxUi]. */
60 if (<MODE>mode == V2DFmode || <MODE>mode == V2DImode
61 || <MODE>mode == TImode)
62 return "vldrw.u32\t%q0, %E1";
64 return "vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1";
67 return output_move_quad (operands);
70 if (<MODE>mode == V2DFmode || <MODE>mode == V2DImode
71 || <MODE>mode == TImode)
72 return "vstrw.32\t%q1, %E0";
74 return "vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0";
77 return output_move_neon (operands);
84 [(set_attr "type" "mve_move,mve_move,mve_move,mve_move,mve_load,multiple,mve_store,mve_load")
85 (set_attr "length" "4,8,8,4,4,8,4,8")
86 (set_attr "thumb2_pool_range" "*,*,*,*,1018,*,*,*")
87 (set_attr "neg_pool_range" "*,*,*,*,996,*,*,*")])
89 (define_insn "*mve_vdup<mode>"
90 [(set (match_operand:MVE_vecs 0 "s_register_operand" "=w")
91 (vec_duplicate:MVE_vecs
92 (match_operand:<V_elem> 1 "s_register_operand" "r")))]
93 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
94 "vdup.<V_sz_elem>\t%q0, %1"
95 [(set_attr "length" "4")
96 (set_attr "type" "mve_move")])
101 (define_insn "mve_vst4q<mode>"
102 [(set (match_operand:XI 0 "mve_struct_operand" "=Ug")
103 (unspec:XI [(match_operand:XI 1 "s_register_operand" "w")
104 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
110 int regno = REGNO (operands[1]);
111 ops[0] = gen_rtx_REG (TImode, regno);
112 ops[1] = gen_rtx_REG (TImode, regno+4);
113 ops[2] = gen_rtx_REG (TImode, regno+8);
114 ops[3] = gen_rtx_REG (TImode, regno+12);
115 rtx reg = operands[0];
116 while (reg && !REG_P (reg))
118 gcc_assert (REG_P (reg));
120 ops[5] = operands[0];
121 /* Here in first three instructions data is stored to ops[4]'s location but
122 in the fourth instruction data is stored to operands[0], this is to
123 support the writeback. */
124 output_asm_insn ("vst40.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
125 "vst41.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
126 "vst42.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
127 "vst43.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, %5", ops);
130 [(set_attr "length" "16")])
140 (define_insn "@mve_<mve_insn>q_f<mode>"
142 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
143 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
146 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
147 "<mve_mnemo>.f%#<V_sz_elem>\t%q0, %q1"
148 [(set_attr "type" "mve_move")
154 (define_insn "@mve_<mve_insn>q_f<mode>"
156 (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
157 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
158 MVE_FP_VREV64Q_ONLY))
160 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
161 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
162 [(set_attr "type" "mve_move")
169 (define_insn "mve_v<absneg_str>q_f<mode>"
171 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
172 (ABSNEG:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")))
174 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
175 "v<absneg_str>.f%#<V_sz_elem>\t%q0, %q1"
176 [(set_attr "type" "mve_move")
182 (define_insn "@mve_<mve_insn>q_n_f<mode>"
184 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
185 (unspec:MVE_0 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
186 MVE_FP_N_VDUPQ_ONLY))
188 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
189 "<mve_insn>.%#<V_sz_elem>\t%q0, %1"
190 [(set_attr "type" "mve_move")
196 (define_insn "@mve_<mve_insn>q_f<mode>"
198 (set (match_operand:MVE_V8HF 0 "s_register_operand" "=w")
199 (unspec:MVE_V8HF [(match_operand:MVE_V8HF 1 "s_register_operand" "w")]
200 MVE_FP_VREV32Q_ONLY))
202 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
203 "<mve_insn>.<V_sz_elem>\t%q0, %q1"
204 [(set_attr "type" "mve_move")
209 (define_insn "mve_vcvttq_f32_f16v4sf"
211 (set (match_operand:V4SF 0 "s_register_operand" "=w")
212 (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
215 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
216 "vcvtt.f32.f16 %q0, %q1"
217 [(set_attr "type" "mve_move")
223 (define_insn "mve_vcvtbq_f32_f16v4sf"
225 (set (match_operand:V4SF 0 "s_register_operand" "=w")
226 (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
229 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
230 "vcvtb.f32.f16 %q0, %q1"
231 [(set_attr "type" "mve_move")
235 ;; [vcvtq_to_f_s, vcvtq_to_f_u])
237 (define_insn "mve_vcvtq_to_f_<supf><mode>"
239 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
240 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
243 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
244 "vcvt.f%#<V_sz_elem>.<supf>%#<V_sz_elem> %q0, %q1"
245 [(set_attr "type" "mve_move")
249 ;; [vrev64q_u, vrev64q_s])
251 (define_insn "@mve_<mve_insn>q_<supf><mode>"
253 (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
254 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
258 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
259 [(set_attr "type" "mve_move")
263 ;; [vcvtq_from_f_s, vcvtq_from_f_u])
265 (define_insn "mve_vcvtq_from_f_<supf><mode>"
267 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
268 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
271 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
272 "vcvt.<supf>%#<V_sz_elem>.f%#<V_sz_elem> %q0, %q1"
273 [(set_attr "type" "mve_move")
280 (define_insn "mve_v<absneg_str>q_s<mode>"
282 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
283 (ABSNEG:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
286 "v<absneg_str>.s%#<V_sz_elem>\t%q0, %q1"
287 [(set_attr "type" "mve_move")
291 ;; [vmvnq_u, vmvnq_s])
293 (define_insn "mve_vmvnq_u<mode>"
295 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
296 (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
300 [(set_attr "type" "mve_move")
302 (define_expand "mve_vmvnq_s<mode>"
304 (set (match_operand:MVE_2 0 "s_register_operand")
305 (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
311 ;; [vdupq_n_u, vdupq_n_s])
313 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
315 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
316 (unspec:MVE_2 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
320 "<mve_insn>.%#<V_sz_elem>\t%q0, %1"
321 [(set_attr "type" "mve_move")
325 ;; [vclzq_u, vclzq_s])
327 (define_insn "@mve_vclzq_s<mode>"
329 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
330 (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
333 "vclz.i%#<V_sz_elem>\t%q0, %q1"
334 [(set_attr "type" "mve_move")
336 (define_expand "mve_vclzq_u<mode>"
338 (set (match_operand:MVE_2 0 "s_register_operand")
339 (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
349 (define_insn "@mve_<mve_insn>q_<supf><mode>"
351 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
352 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
356 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1"
357 [(set_attr "type" "mve_move")
361 ;; [vaddvq_s, vaddvq_u])
363 (define_insn "@mve_<mve_insn>q_<supf><mode>"
365 (set (match_operand:SI 0 "s_register_operand" "=Te")
366 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")]
370 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q1"
371 [(set_attr "type" "mve_move")
375 ;; [vrev32q_u, vrev32q_s])
377 (define_insn "@mve_<mve_insn>q_<supf><mode>"
379 (set (match_operand:MVE_3 0 "s_register_operand" "=w")
380 (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "w")]
384 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
385 [(set_attr "type" "mve_move")
389 ;; [vmovlbq_s, vmovlbq_u]
390 ;; [vmovltq_u, vmovltq_s]
392 (define_insn "@mve_<mve_insn>q_<supf><mode>"
394 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
395 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")]
399 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1"
400 [(set_attr "type" "mve_move")
404 ;; [vcvtpq_s, vcvtpq_u])
406 (define_insn "mve_vcvtpq_<supf><mode>"
408 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
409 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
412 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
413 "vcvtp.<supf>%#<V_sz_elem>.f%#<V_sz_elem> %q0, %q1"
414 [(set_attr "type" "mve_move")
418 ;; [vcvtnq_s, vcvtnq_u])
420 (define_insn "mve_vcvtnq_<supf><mode>"
422 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
423 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
426 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
427 "vcvtn.<supf>%#<V_sz_elem>.f%#<V_sz_elem> %q0, %q1"
428 [(set_attr "type" "mve_move")
432 ;; [vcvtmq_s, vcvtmq_u])
434 (define_insn "mve_vcvtmq_<supf><mode>"
436 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
437 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
440 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
441 "vcvtm.<supf>%#<V_sz_elem>.f%#<V_sz_elem> %q0, %q1"
442 [(set_attr "type" "mve_move")
446 ;; [vcvtaq_u, vcvtaq_s])
448 (define_insn "mve_vcvtaq_<supf><mode>"
450 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
451 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
454 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
455 "vcvta.<supf>%#<V_sz_elem>.f%#<V_sz_elem> %q0, %q1"
456 [(set_attr "type" "mve_move")
460 ;; [vmvnq_n_u, vmvnq_n_s])
462 (define_insn "mve_vmvnq_n_<supf><mode>"
464 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
465 (unspec:MVE_5 [(match_operand:<V_elem> 1 "immediate_operand" "i")]
469 "vmvn.i%#<V_sz_elem> %q0, %1"
470 [(set_attr "type" "mve_move")
474 ;; [vrev16q_u, vrev16q_s])
476 (define_insn "@mve_<mve_insn>q_<supf><mode>"
478 (set (match_operand:MVE_V16QI 0 "s_register_operand" "=w")
479 (unspec:MVE_V16QI [(match_operand:MVE_V16QI 1 "s_register_operand" "w")]
483 "<mve_insn>.<V_sz_elem>\t%q0, %q1"
484 [(set_attr "type" "mve_move")
488 ;; [vaddlvq_s vaddlvq_u])
490 (define_insn "@mve_<mve_insn>q_<supf>v4si"
492 (set (match_operand:DI 0 "s_register_operand" "=r")
493 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")]
497 "<mve_insn>.<supf>32\t%Q0, %R0, %q1"
498 [(set_attr "type" "mve_move")
502 ;; [vctp8q vctp16q vctp32q vctp64q])
504 (define_insn "mve_vctp<MVE_vctp>q<MVE_vpred>"
506 (set (match_operand:MVE_7 0 "vpr_register_operand" "=Up")
507 (unspec:MVE_7 [(match_operand:SI 1 "s_register_operand" "r")]
512 [(set_attr "type" "mve_move")
518 (define_insn "mve_vpnotv16bi"
520 (set (match_operand:V16BI 0 "vpr_register_operand" "=Up")
521 (unspec:V16BI [(match_operand:V16BI 1 "vpr_register_operand" "0")]
526 [(set_attr "type" "mve_move")
532 (define_insn "mve_vbrsrq_n_f<mode>"
534 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
535 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
536 (match_operand:SI 2 "s_register_operand" "r")]
539 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
540 "vbrsr.<V_sz_elem> %q0, %q1, %2"
541 [(set_attr "type" "mve_move")
545 ;; [vcvtq_n_to_f_s, vcvtq_n_to_f_u])
547 (define_insn "mve_vcvtq_n_to_f_<supf><mode>"
549 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
550 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
551 (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
554 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
555 "vcvt.f<V_sz_elem>.<supf><V_sz_elem>\t%q0, %q1, %2"
556 [(set_attr "type" "mve_move")
561 (define_insn "@mve_<mve_insn>q_f<mode>"
563 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
564 (unspec:MVE_0 [(match_operand:DI 1 "s_register_operand" "r")
565 (match_operand:DI 2 "s_register_operand" "r")]
568 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
569 "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
570 [(set_attr "type" "mve_move")
571 (set_attr "length""8")])
574 ;; [vcreateq_u, vcreateq_s])
576 (define_insn "@mve_<mve_insn>q_<supf><mode>"
578 (set (match_operand:MVE_1 0 "s_register_operand" "=w")
579 (unspec:MVE_1 [(match_operand:DI 1 "s_register_operand" "r")
580 (match_operand:DI 2 "s_register_operand" "r")]
584 "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
585 [(set_attr "type" "mve_move")
586 (set_attr "length""8")])
589 ;; [vrshrq_n_s, vrshrq_n_u]
590 ;; [vshrq_n_s, vshrq_n_u]
592 ;; Version that takes an immediate as operand 2.
593 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
595 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
596 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
597 (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
601 "<mve_insn>.<supf><V_sz_elem>\t%q0, %q1, %2"
602 [(set_attr "type" "mve_move")
605 ;; Versions that take constant vectors as operand 2 (with all elements
607 (define_insn "mve_vshrq_n_s<mode>_imm"
609 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
610 (ashiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
611 (match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
615 return neon_output_shift_immediate ("vshr", 's', &operands[2],
617 VALID_NEON_QREG_MODE (<MODE>mode),
620 [(set_attr "type" "mve_move")
622 (define_insn "mve_vshrq_n_u<mode>_imm"
624 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
625 (lshiftrt:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
626 (match_operand:MVE_2 2 "imm_for_neon_rshift_operand" "i")))
630 return neon_output_shift_immediate ("vshr", 'u', &operands[2],
632 VALID_NEON_QREG_MODE (<MODE>mode),
635 [(set_attr "type" "mve_move")
639 ;; [vcvtq_n_from_f_s, vcvtq_n_from_f_u])
641 (define_insn "mve_vcvtq_n_from_f_<supf><mode>"
643 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
644 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
645 (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
648 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
649 "vcvt.<supf><V_sz_elem>.f<V_sz_elem>\t%q0, %q1, %2"
650 [(set_attr "type" "mve_move")
656 (define_insn "@mve_<mve_insn>q_p_<supf>v4si"
658 (set (match_operand:DI 0 "s_register_operand" "=r")
659 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
660 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
664 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q1"
665 [(set_attr "type" "mve_move")
666 (set_attr "length""8")])
669 ;; [vcmpneq_, vcmpcsq_, vcmpeqq_, vcmpgeq_, vcmpgtq_, vcmphiq_, vcmpleq_, vcmpltq_])
671 (define_insn "@mve_vcmp<mve_cmp_op>q_<mode>"
673 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
674 (MVE_COMPARISONS:<MVE_VPRED> (match_operand:MVE_2 1 "s_register_operand" "w")
675 (match_operand:MVE_2 2 "s_register_operand" "w")))
678 "vcmp.<mve_cmp_type>%#<V_sz_elem>\t<mve_cmp_op>, %q1, %q2"
679 [(set_attr "type" "mve_move")
683 ;; [vcmpcsq_n_, vcmpeqq_n_, vcmpgeq_n_, vcmpgtq_n_, vcmphiq_n_, vcmpleq_n_, vcmpltq_n_, vcmpneq_n_])
685 (define_insn "@mve_vcmp<mve_cmp_op>q_n_<mode>"
687 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
688 (MVE_COMPARISONS:<MVE_VPRED>
689 (match_operand:MVE_2 1 "s_register_operand" "w")
690 (vec_duplicate:MVE_2 (match_operand:<V_elem> 2 "s_register_operand" "r"))))
693 "vcmp.<mve_cmp_type>%#<V_sz_elem> <mve_cmp_op>, %q1, %2"
694 [(set_attr "type" "mve_move")
698 ;; [vshlq_s, vshlq_u])
702 ;; [vabdq_s, vabdq_u]
703 ;; [vhaddq_s, vhaddq_u]
704 ;; [vhsubq_s, vhsubq_u]
705 ;; [vmulhq_s, vmulhq_u]
706 ;; [vqaddq_u, vqaddq_s]
709 ;; [vqrshlq_s, vqrshlq_u]
710 ;; [vqshlq_s, vqshlq_u]
711 ;; [vqsubq_u, vqsubq_s]
712 ;; [vrhaddq_s, vrhaddq_u]
713 ;; [vrmulhq_s, vrmulhq_u]
714 ;; [vrshlq_s, vrshlq_u]
716 (define_insn "@mve_<mve_insn>q_<supf><mode>"
718 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
719 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
720 (match_operand:MVE_2 2 "s_register_operand" "w")]
724 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
725 [(set_attr "type" "mve_move")
729 ;; [vaddq_n_s, vaddq_n_u]
730 ;; [vsubq_n_s, vsubq_n_u]
731 ;; [vmulq_n_s, vmulq_n_u]
733 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
735 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
736 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
737 (match_operand:<V_elem> 2 "s_register_operand" "r")]
741 "<mve_insn>.i%#<V_sz_elem>\t%q0, %q1, %2"
742 [(set_attr "type" "mve_move")
746 ;; [vaddvaq_s, vaddvaq_u])
748 (define_insn "@mve_<mve_insn>q_<supf><mode>"
750 (set (match_operand:SI 0 "s_register_operand" "=Te")
751 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
752 (match_operand:MVE_2 2 "s_register_operand" "w")]
756 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2"
757 [(set_attr "type" "mve_move")
761 ;; [vaddvq_p_u, vaddvq_p_s])
763 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
765 (set (match_operand:SI 0 "s_register_operand" "=Te")
766 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
767 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
771 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q1"
772 [(set_attr "type" "mve_move")
773 (set_attr "length""8")])
776 ;; [vandq_u, vandq_s])
778 ;; signed and unsigned versions are the same: define the unsigned
779 ;; insn, and use an expander for the signed one as we still reference
780 ;; both names from arm_mve.h.
781 ;; We use the same code as in neon.md (TODO: avoid this duplication).
782 (define_insn "mve_vandq_u<mode>"
784 (set (match_operand:MVE_2 0 "s_register_operand" "=w,w")
785 (and:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w,0")
786 (match_operand:MVE_2 2 "neon_inv_logic_op2" "w,DL")))
791 * return neon_output_logic_immediate (\"vand\", &operands[2], <MODE>mode, 1, VALID_NEON_QREG_MODE (<MODE>mode));"
792 [(set_attr "type" "mve_move")
794 (define_expand "mve_vandq_s<mode>"
796 (set (match_operand:MVE_2 0 "s_register_operand")
797 (and:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
798 (match_operand:MVE_2 2 "neon_inv_logic_op2")))
804 ;; [vbicq_s, vbicq_u])
806 (define_insn "mve_vbicq_u<mode>"
808 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
809 (and:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand" "w"))
810 (match_operand:MVE_2 1 "s_register_operand" "w")))
813 "vbic\t%q0, %q1, %q2"
814 [(set_attr "type" "mve_move")
817 (define_expand "mve_vbicq_s<mode>"
819 (set (match_operand:MVE_2 0 "s_register_operand")
820 (and:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand"))
821 (match_operand:MVE_2 1 "s_register_operand")))
827 ;; [vbrsrq_n_u, vbrsrq_n_s])
829 (define_insn "mve_vbrsrq_n_<supf><mode>"
831 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
832 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
833 (match_operand:SI 2 "s_register_operand" "r")]
837 "vbrsr.%#<V_sz_elem> %q0, %q1, %2"
838 [(set_attr "type" "mve_move")
842 ;; [vcaddq, vcaddq_rot90, vcadd_rot180, vcadd_rot270])
844 (define_insn "mve_vcaddq<mve_rot><mode>"
846 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
847 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
848 (match_operand:MVE_2 2 "s_register_operand" "w")]
852 "vcadd.i%#<V_sz_elem> %q0, %q1, %q2, #<rot>"
853 [(set_attr "type" "mve_move")
856 ;; Auto vectorizer pattern for int vcadd
857 (define_expand "cadd<rot><mode>3"
858 [(set (match_operand:MVE_2 0 "register_operand")
859 (unspec:MVE_2 [(match_operand:MVE_2 1 "register_operand")
860 (match_operand:MVE_2 2 "register_operand")]
862 "TARGET_HAVE_MVE && !BYTES_BIG_ENDIAN"
866 ;; [veorq_u, veorq_s])
868 (define_insn "mve_veorq_u<mode>"
870 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
871 (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
872 (match_operand:MVE_2 2 "s_register_operand" "w")))
875 "veor\t%q0, %q1, %q2"
876 [(set_attr "type" "mve_move")
878 (define_expand "mve_veorq_s<mode>"
880 (set (match_operand:MVE_2 0 "s_register_operand")
881 (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
882 (match_operand:MVE_2 2 "s_register_operand")))
888 ;; [vhaddq_n_u, vhaddq_n_s]
889 ;; [vhsubq_n_u, vhsubq_n_s]
890 ;; [vqaddq_n_s, vqaddq_n_u]
893 ;; [vqsubq_n_s, vqsubq_n_u]
895 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
897 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
898 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
899 (match_operand:<V_elem> 2 "s_register_operand" "r")]
900 MVE_INT_SU_N_BINARY))
903 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
904 [(set_attr "type" "mve_move")
908 ;; [vhcaddq_rot270_s])
910 (define_insn "mve_vhcaddq_rot270_s<mode>"
912 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
913 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
914 (match_operand:MVE_2 2 "s_register_operand" "w")]
918 "vhcadd.s%#<V_sz_elem>\t%q0, %q1, %q2, #270"
919 [(set_attr "type" "mve_move")
923 ;; [vhcaddq_rot90_s])
925 (define_insn "mve_vhcaddq_rot90_s<mode>"
927 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
928 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
929 (match_operand:MVE_2 2 "s_register_operand" "w")]
933 "vhcadd.s%#<V_sz_elem>\t%q0, %q1, %q2, #90"
934 [(set_attr "type" "mve_move")
941 (define_insn "@mve_<mve_insn>q_<supf><mode>"
943 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
944 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
945 (match_operand:MVE_2 2 "s_register_operand" "w")]
949 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q2"
950 [(set_attr "type" "mve_move")
954 ;; [vmaxq_u, vmaxq_s]
955 ;; [vminq_s, vminq_u]
957 (define_insn "mve_<max_min_su_str>q_<max_min_supf><mode>"
959 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
960 (MAX_MIN_SU:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
961 (match_operand:MVE_2 2 "s_register_operand" "w")))
964 "<max_min_su_str>.<max_min_supf>%#<V_sz_elem>\t%q0, %q1, %q2"
965 [(set_attr "type" "mve_move")
971 ;; [vmaxvq_u, vmaxvq_s]
973 ;; [vminvq_u, vminvq_s]
975 (define_insn "@mve_<mve_insn>q_<supf><mode>"
977 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
978 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
979 (match_operand:MVE_2 2 "s_register_operand" "w")]
983 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2"
984 [(set_attr "type" "mve_move")
988 ;; [vmladavq_u, vmladavq_s]
993 (define_insn "@mve_<mve_insn>q_<supf><mode>"
995 (set (match_operand:SI 0 "s_register_operand" "=Te")
996 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
997 (match_operand:MVE_2 2 "s_register_operand" "w")]
1001 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
1002 [(set_attr "type" "mve_move")
1006 ;; [vmullbq_int_u, vmullbq_int_s])
1008 (define_insn "mve_vmullbq_int_<supf><mode>"
1010 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1011 (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
1012 (match_operand:MVE_2 2 "s_register_operand" "w")]
1016 "vmullb.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1017 [(set_attr "type" "mve_move")
1021 ;; [vmulltq_int_u, vmulltq_int_s])
1023 (define_insn "mve_vmulltq_int_<supf><mode>"
1025 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1026 (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
1027 (match_operand:MVE_2 2 "s_register_operand" "w")]
1031 "vmullt.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1032 [(set_attr "type" "mve_move")
1036 ;; [vaddq_s, vaddq_u]
1037 ;; [vmulq_u, vmulq_s]
1038 ;; [vsubq_s, vsubq_u]
1040 (define_insn "mve_<mve_addsubmul>q<mode>"
1042 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1043 (MVE_INT_BINARY_RTX:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1044 (match_operand:MVE_2 2 "s_register_operand" "w")))
1047 "<mve_addsubmul>.i%#<V_sz_elem>\t%q0, %q1, %q2"
1048 [(set_attr "type" "mve_move")
1052 ;; [vornq_u, vornq_s])
1054 (define_insn "mve_vornq_s<mode>"
1056 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1057 (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand" "w"))
1058 (match_operand:MVE_2 1 "s_register_operand" "w")))
1061 "vorn\t%q0, %q1, %q2"
1062 [(set_attr "type" "mve_move")
1065 (define_expand "mve_vornq_u<mode>"
1067 (set (match_operand:MVE_2 0 "s_register_operand")
1068 (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand"))
1069 (match_operand:MVE_2 1 "s_register_operand")))
1075 ;; [vorrq_s, vorrq_u])
1077 ;; signed and unsigned versions are the same: define the unsigned
1078 ;; insn, and use an expander for the signed one as we still reference
1079 ;; both names from arm_mve.h.
1080 ;; We use the same code as in neon.md (TODO: avoid this duplication).
1081 (define_insn "mve_vorrq_s<mode>"
1083 (set (match_operand:MVE_2 0 "s_register_operand" "=w,w")
1084 (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w,0")
1085 (match_operand:MVE_2 2 "neon_logic_op2" "w,Dl")))
1090 * return neon_output_logic_immediate (\"vorr\", &operands[2], <MODE>mode, 0, VALID_NEON_QREG_MODE (<MODE>mode));"
1091 [(set_attr "type" "mve_move")
1093 (define_expand "mve_vorrq_u<mode>"
1095 (set (match_operand:MVE_2 0 "s_register_operand")
1096 (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
1097 (match_operand:MVE_2 2 "neon_logic_op2")))
1103 ;; [vqrshlq_n_s, vqrshlq_n_u]
1104 ;; [vrshlq_n_u, vrshlq_n_s]
1106 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1108 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1109 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1110 (match_operand:SI 2 "s_register_operand" "r")]
1114 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %2"
1115 [(set_attr "type" "mve_move")
1119 ;; [vqshlq_n_s, vqshlq_n_u]
1120 ;; [vshlq_n_u, vshlq_n_s]
1122 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1124 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1125 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1126 (match_operand:SI 2 "immediate_operand" "i")]
1130 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1131 [(set_attr "type" "mve_move")
1135 ;; [vqshlq_r_u, vqshlq_r_s]
1136 ;; [vshlq_r_s, vshlq_r_u]
1138 (define_insn "@mve_<mve_insn>q_r_<supf><mode>"
1140 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1141 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1142 (match_operand:SI 2 "s_register_operand" "r")]
1146 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %2"
1147 [(set_attr "type" "mve_move")
1153 (define_insn "mve_vqshluq_n_s<mode>"
1155 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1156 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1157 (match_operand:SI 2 "<MVE_pred>" "<MVE_constraint>")]
1161 "vqshlu.s%#<V_sz_elem>\t%q0, %q1, %2"
1162 [(set_attr "type" "mve_move")
1168 (define_insn "@mve_<mve_insn>q_f<mode>"
1170 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1171 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1172 (match_operand:MVE_0 2 "s_register_operand" "w")]
1175 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1176 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q1, %q2"
1177 [(set_attr "type" "mve_move")
1181 ;; [vaddlvaq_s vaddlvaq_u])
1183 (define_insn "@mve_<mve_insn>q_<supf>v4si"
1185 (set (match_operand:DI 0 "s_register_operand" "=r")
1186 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
1187 (match_operand:V4SI 2 "s_register_operand" "w")]
1191 "<mve_insn>.<supf>32\t%Q0, %R0, %q2"
1192 [(set_attr "type" "mve_move")
1200 (define_insn "@mve_<mve_insn>q_n_f<mode>"
1202 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1203 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1204 (match_operand:<V_elem> 2 "s_register_operand" "r")]
1207 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1208 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q1, %2"
1209 [(set_attr "type" "mve_move")
1215 (define_insn "mve_vandq_f<mode>"
1217 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1218 (and:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1219 (match_operand:MVE_0 2 "s_register_operand" "w")))
1221 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1222 "vand %q0, %q1, %q2"
1223 [(set_attr "type" "mve_move")
1229 (define_insn "mve_vbicq_f<mode>"
1231 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1232 (and:MVE_0 (not:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w"))
1233 (match_operand:MVE_0 2 "s_register_operand" "w")))
1235 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1236 "vbic %q0, %q1, %q2"
1237 [(set_attr "type" "mve_move")
1241 ;; [vcaddq, vcaddq_rot90, vcadd_rot180, vcadd_rot270])
1243 (define_insn "mve_vcaddq<mve_rot><mode>"
1245 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
1246 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1247 (match_operand:MVE_0 2 "s_register_operand" "w")]
1250 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1251 "vcadd.f%#<V_sz_elem> %q0, %q1, %q2, #<rot>"
1252 [(set_attr "type" "mve_move")
1256 ;; [vcmpeqq_f, vcmpgeq_f, vcmpgtq_f, vcmpleq_f, vcmpltq_f, vcmpneq_f])
1258 (define_insn "@mve_vcmp<mve_cmp_op>q_f<mode>"
1260 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1261 (MVE_FP_COMPARISONS:<MVE_VPRED> (match_operand:MVE_0 1 "s_register_operand" "w")
1262 (match_operand:MVE_0 2 "s_register_operand" "w")))
1264 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1265 "vcmp.f%#<V_sz_elem> <mve_cmp_op>, %q1, %q2"
1266 [(set_attr "type" "mve_move")
1270 ;; [vcmpeqq_n_f, vcmpgeq_n_f, vcmpgtq_n_f, vcmpleq_n_f, vcmpltq_n_f, vcmpneq_n_f])
1272 (define_insn "@mve_vcmp<mve_cmp_op>q_n_f<mode>"
1274 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1275 (MVE_FP_COMPARISONS:<MVE_VPRED>
1276 (match_operand:MVE_0 1 "s_register_operand" "w")
1277 (vec_duplicate:MVE_0 (match_operand:<V_elem> 2 "s_register_operand" "r"))))
1279 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1280 "vcmp.f%#<V_sz_elem> <mve_cmp_op>, %q1, %2"
1281 [(set_attr "type" "mve_move")
1285 ;; [vcmulq, vcmulq_rot90, vcmulq_rot180, vcmulq_rot270])
1287 (define_insn "mve_vcmulq<mve_rot><mode>"
1289 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
1290 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1291 (match_operand:MVE_0 2 "s_register_operand" "w")]
1294 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1295 "vcmul.f%#<V_sz_elem> %q0, %q1, %q2, #<rot>"
1296 [(set_attr "type" "mve_move")
1300 ;; [vctp8q_m vctp16q_m vctp32q_m vctp64q_m])
1302 (define_insn "mve_vctp<MVE_vctp>q_m<MVE_vpred>"
1304 (set (match_operand:MVE_7 0 "vpr_register_operand" "=Up")
1305 (unspec:MVE_7 [(match_operand:SI 1 "s_register_operand" "r")
1306 (match_operand:MVE_7 2 "vpr_register_operand" "Up")]
1310 "vpst\;vctpt.<MVE_vctp> %1"
1311 [(set_attr "type" "mve_move")
1312 (set_attr "length""8")])
1315 ;; [vcvtbq_f16_f32])
1317 (define_insn "mve_vcvtbq_f16_f32v8hf"
1319 (set (match_operand:V8HF 0 "s_register_operand" "=w")
1320 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1321 (match_operand:V4SF 2 "s_register_operand" "w")]
1324 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1325 "vcvtb.f16.f32 %q0, %q2"
1326 [(set_attr "type" "mve_move")
1330 ;; [vcvttq_f16_f32])
1332 (define_insn "mve_vcvttq_f16_f32v8hf"
1334 (set (match_operand:V8HF 0 "s_register_operand" "=w")
1335 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1336 (match_operand:V4SF 2 "s_register_operand" "w")]
1339 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1340 "vcvtt.f16.f32 %q0, %q2"
1341 [(set_attr "type" "mve_move")
1347 (define_insn "mve_veorq_f<mode>"
1349 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1350 (xor:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1351 (match_operand:MVE_0 2 "s_register_operand" "w")))
1353 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1354 "veor %q0, %q1, %q2"
1355 [(set_attr "type" "mve_move")
1362 (define_insn "@mve_<mve_insn>q_f<mode>"
1364 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1365 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
1366 (match_operand:MVE_0 2 "s_register_operand" "w")]
1367 MVE_VMAXNMA_VMINNMAQ))
1369 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1370 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q2"
1371 [(set_attr "type" "mve_move")
1380 (define_insn "@mve_<mve_insn>q_f<mode>"
1382 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1383 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1384 (match_operand:MVE_0 2 "s_register_operand" "w")]
1385 MVE_VMAXNMxV_MINNMxVQ))
1387 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1388 "<mve_insn>.f%#<V_sz_elem>\t%0, %q2"
1389 [(set_attr "type" "mve_move")
1396 (define_insn "@mve_<max_min_f_str>q_f<mode>"
1398 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1399 (MAX_MIN_F:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1400 (match_operand:MVE_0 2 "s_register_operand" "w")))
1402 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1403 "<max_min_f_str>.f%#<V_sz_elem> %q0, %q1, %q2"
1404 [(set_attr "type" "mve_move")
1408 ;; [vmlaldavq_u, vmlaldavq_s]
1413 (define_insn "@mve_<mve_insn>q_<supf><mode>"
1415 (set (match_operand:DI 0 "s_register_operand" "=r")
1416 (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
1417 (match_operand:MVE_5 2 "s_register_operand" "w")]
1421 "<mve_insn>.<supf>%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
1422 [(set_attr "type" "mve_move")
1426 ;; [vmovnbq_u, vmovnbq_s]
1427 ;; [vmovntq_s, vmovntq_u]
1428 ;; [vqmovnbq_u, vqmovnbq_s]
1429 ;; [vqmovntq_u, vqmovntq_s]
1433 (define_insn "@mve_<mve_insn>q_<supf><mode>"
1435 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
1436 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
1437 (match_operand:MVE_5 2 "s_register_operand" "w")]
1441 "<mve_insn>.<isu>%#<V_sz_elem>\t%q0, %q2"
1442 [(set_attr "type" "mve_move")
1450 (define_insn "mve_<mve_addsubmul>q_f<mode>"
1452 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1453 (MVE_INT_BINARY_RTX:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1454 (match_operand:MVE_0 2 "s_register_operand" "w")))
1456 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1457 "<mve_addsubmul>.f%#<V_sz_elem>\t%q0, %q1, %q2"
1458 [(set_attr "type" "mve_move")
1464 (define_insn "mve_vornq_f<mode>"
1466 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1467 (ior:MVE_0 (not:MVE_0 (match_operand:MVE_0 2 "s_register_operand" "w"))
1468 (match_operand:MVE_0 1 "s_register_operand" "w")))
1470 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1471 "vorn %q0, %q1, %q2"
1472 [(set_attr "type" "mve_move")
1478 (define_insn "mve_vorrq_f<mode>"
1480 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1481 (ior:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1482 (match_operand:MVE_0 2 "s_register_operand" "w")))
1484 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1485 "vorr %q0, %q1, %q2"
1486 [(set_attr "type" "mve_move")
1490 ;; [vbicq_n_s, vbicq_n_u]
1491 ;; [vorrq_n_u, vorrq_n_s]
1493 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1495 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
1496 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
1497 (match_operand:SI 2 "immediate_operand" "i")]
1498 MVE_INT_N_BINARY_LOGIC))
1501 "<mve_insn>.i%#<V_sz_elem> %q0, %2"
1502 [(set_attr "type" "mve_move")
1508 (define_insn "mve_vqdmullbq_n_s<mode>"
1510 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1511 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1512 (match_operand:<V_elem> 2 "s_register_operand" "r")]
1516 "vqdmullb.s%#<V_sz_elem> %q0, %q1, %2"
1517 [(set_attr "type" "mve_move")
1523 (define_insn "mve_vqdmullbq_s<mode>"
1525 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1526 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1527 (match_operand:MVE_5 2 "s_register_operand" "w")]
1531 "vqdmullb.s%#<V_sz_elem> %q0, %q1, %q2"
1532 [(set_attr "type" "mve_move")
1538 (define_insn "mve_vqdmulltq_n_s<mode>"
1540 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1541 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1542 (match_operand:<V_elem> 2 "s_register_operand" "r")]
1546 "vqdmullt.s%#<V_sz_elem> %q0, %q1, %2"
1547 [(set_attr "type" "mve_move")
1553 (define_insn "mve_vqdmulltq_s<mode>"
1555 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
1556 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1557 (match_operand:MVE_5 2 "s_register_operand" "w")]
1561 "vqdmullt.s%#<V_sz_elem> %q0, %q1, %q2"
1562 [(set_attr "type" "mve_move")
1566 ;; [vrmlaldavhq_u vrmlaldavhq_s]
1571 (define_insn "@mve_<mve_insn>q_<supf>v4si"
1573 (set (match_operand:DI 0 "s_register_operand" "=r")
1574 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
1575 (match_operand:V4SI 2 "s_register_operand" "w")]
1579 "<mve_insn>.<supf>32\t%Q0, %R0, %q1, %q2"
1580 [(set_attr "type" "mve_move")
1584 ;; [vshllbq_n_s, vshllbq_n_u]
1585 ;; [vshlltq_n_u, vshlltq_n_s]
1587 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1589 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1590 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1591 (match_operand:SI 2 "immediate_operand" "i")]
1595 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
1596 [(set_attr "type" "mve_move")
1600 ;; [vmulltq_poly_p])
1602 (define_insn "mve_vmulltq_poly_p<mode>"
1604 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1605 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1606 (match_operand:MVE_3 2 "s_register_operand" "w")]
1610 "vmullt.p%#<V_sz_elem>\t%q0, %q1, %q2"
1611 [(set_attr "type" "mve_move")
1615 ;; [vmullbq_poly_p])
1617 (define_insn "mve_vmullbq_poly_p<mode>"
1619 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1620 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1621 (match_operand:MVE_3 2 "s_register_operand" "w")]
1625 "vmullb.p%#<V_sz_elem>\t%q0, %q1, %q2"
1626 [(set_attr "type" "mve_move")
1637 (define_insn "@mve_vcmp<mve_cmp_op1>q_m_f<mode>"
1639 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1640 (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
1641 (match_operand:MVE_0 2 "s_register_operand" "w")
1642 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1645 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1646 "vpst\;vcmpt.f%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %q2"
1647 [(set_attr "type" "mve_move")
1648 (set_attr "length""8")])
1650 ;; [vcvtaq_m_u, vcvtaq_m_s])
1652 (define_insn "mve_vcvtaq_m_<supf><mode>"
1654 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
1655 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
1656 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
1657 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1660 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1661 "vpst\;vcvtat.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
1662 [(set_attr "type" "mve_move")
1663 (set_attr "length""8")])
1665 ;; [vcvtq_m_to_f_s, vcvtq_m_to_f_u])
1667 (define_insn "mve_vcvtq_m_to_f_<supf><mode>"
1669 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1670 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
1671 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
1672 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1675 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1676 "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem> %q0, %q2"
1677 [(set_attr "type" "mve_move")
1678 (set_attr "length""8")])
1681 ;; [vqrshrnbq_n_u, vqrshrnbq_n_s]
1682 ;; [vqrshrntq_n_u, vqrshrntq_n_s]
1685 ;; [vqshrnbq_n_u, vqshrnbq_n_s]
1686 ;; [vqshrntq_n_u, vqshrntq_n_s]
1689 ;; [vrshrnbq_n_s, vrshrnbq_n_u]
1690 ;; [vrshrntq_n_u, vrshrntq_n_s]
1691 ;; [vshrnbq_n_u, vshrnbq_n_s]
1692 ;; [vshrntq_n_s, vshrntq_n_u]
1694 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1696 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
1697 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
1698 (match_operand:MVE_5 2 "s_register_operand" "w")
1699 (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
1703 "<mve_insn>.<isu>%#<V_sz_elem>\t%q0, %q2, %3"
1704 [(set_attr "type" "mve_move")
1708 ;; [vrmlaldavhaq_s vrmlaldavhaq_u])
1710 (define_insn "mve_vrmlaldavhaq_<supf>v4si"
1712 (set (match_operand:DI 0 "s_register_operand" "=r")
1713 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
1714 (match_operand:V4SI 2 "s_register_operand" "w")
1715 (match_operand:V4SI 3 "s_register_operand" "w")]
1719 "vrmlaldavha.<supf>32\t%Q0, %R0, %q2, %q3"
1720 [(set_attr "type" "mve_move")
1724 ;; [vabavq_s, vabavq_u])
1726 (define_insn "@mve_<mve_insn>q_<supf><mode>"
1728 (set (match_operand:SI 0 "s_register_operand" "=r")
1729 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1730 (match_operand:MVE_2 2 "s_register_operand" "w")
1731 (match_operand:MVE_2 3 "s_register_operand" "w")]
1735 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
1736 [(set_attr "type" "mve_move")
1740 ;; [vshlcq_u vshlcq_s]
1742 (define_expand "mve_vshlcq_vec_<supf><mode>"
1743 [(match_operand:MVE_2 0 "s_register_operand")
1744 (match_operand:MVE_2 1 "s_register_operand")
1745 (match_operand:SI 2 "s_register_operand")
1746 (match_operand:SI 3 "mve_imm_32")
1747 (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
1750 rtx ignore_wb = gen_reg_rtx (SImode);
1751 emit_insn(gen_mve_vshlcq_<supf><mode>(operands[0], ignore_wb, operands[1],
1752 operands[2], operands[3]));
1756 (define_expand "mve_vshlcq_carry_<supf><mode>"
1757 [(match_operand:SI 0 "s_register_operand")
1758 (match_operand:MVE_2 1 "s_register_operand")
1759 (match_operand:SI 2 "s_register_operand")
1760 (match_operand:SI 3 "mve_imm_32")
1761 (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
1764 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
1765 emit_insn(gen_mve_vshlcq_<supf><mode>(ignore_vec, operands[0], operands[1],
1766 operands[2], operands[3]));
1770 (define_insn "mve_vshlcq_<supf><mode>"
1771 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
1772 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
1773 (match_operand:SI 3 "s_register_operand" "1")
1774 (match_operand:SI 4 "mve_imm_32" "Rf")]
1776 (set (match_operand:SI 1 "s_register_operand" "=r")
1777 (unspec:SI [(match_dup 2)
1782 "vshlc %q0, %1, %4")
1787 ;; [vclzq_m_s, vclzq_m_u]
1792 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
1794 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1795 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1796 (match_operand:MVE_2 2 "s_register_operand" "w")
1797 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1801 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2"
1802 [(set_attr "type" "mve_move")
1803 (set_attr "length""8")])
1806 ;; [vaddvaq_p_u, vaddvaq_p_s])
1808 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
1810 (set (match_operand:SI 0 "s_register_operand" "=Te")
1811 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1812 (match_operand:MVE_2 2 "s_register_operand" "w")
1813 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1817 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2"
1818 [(set_attr "type" "mve_move")
1819 (set_attr "length""8")])
1823 ;; [vcmpeqq_m_n_u, vcmpeqq_m_n_s])
1829 ;; [vcmpneq_m_n_u, vcmpneq_m_n_s])
1831 (define_insn "@mve_vcmp<mve_cmp_op1>q_m_n_<supf><mode>"
1833 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1834 (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
1835 (match_operand:<V_elem> 2 "s_register_operand" "r")
1836 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1840 "vpst\;vcmpt.<isu>%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %2"
1841 [(set_attr "type" "mve_move")
1842 (set_attr "length""8")])
1846 ;; [vcmpeqq_m_u, vcmpeqq_m_s]
1852 ;; [vcmpneq_m_s, vcmpneq_m_u]
1854 (define_insn "@mve_vcmp<mve_cmp_op1>q_m_<supf><mode>"
1856 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1857 (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
1858 (match_operand:MVE_2 2 "s_register_operand" "w")
1859 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1863 "vpst\;vcmpt.<isu>%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %q2"
1864 [(set_attr "type" "mve_move")
1865 (set_attr "length""8")])
1868 ;; [vdupq_m_n_s, vdupq_m_n_u])
1870 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
1872 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1873 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1874 (match_operand:<V_elem> 2 "s_register_operand" "r")
1875 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1879 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %2"
1880 [(set_attr "type" "mve_move")
1881 (set_attr "length""8")])
1887 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
1889 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1890 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1891 (match_operand:MVE_2 2 "s_register_operand" "w")
1892 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1896 "vpst\;<mve_insn>t.s%#<V_sz_elem>\t%q0, %q2"
1897 [(set_attr "type" "mve_move")
1898 (set_attr "length""8")])
1902 ;; [vmaxvq_p_u, vmaxvq_p_s]
1904 ;; [vminvq_p_s, vminvq_p_u]
1906 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
1908 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1909 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1910 (match_operand:MVE_2 2 "s_register_operand" "w")
1911 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1912 MVE_VMAXVQ_VMINVQ_P))
1915 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2"
1916 [(set_attr "type" "mve_move")
1917 (set_attr "length""8")])
1920 ;; [vmladavaq_u, vmladavaq_s]
1925 (define_insn "@mve_<mve_insn>q_<supf><mode>"
1927 (set (match_operand:SI 0 "s_register_operand" "=Te")
1928 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1929 (match_operand:MVE_2 2 "s_register_operand" "w")
1930 (match_operand:MVE_2 3 "s_register_operand" "w")]
1934 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
1935 [(set_attr "type" "mve_move")
1939 ;; [vmladavq_p_u, vmladavq_p_s]
1944 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
1946 (set (match_operand:SI 0 "s_register_operand" "=Te")
1947 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1948 (match_operand:MVE_2 2 "s_register_operand" "w")
1949 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1953 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
1954 [(set_attr "type" "mve_move")
1955 (set_attr "length""8")])
1958 ;; [vmlaq_n_u, vmlaq_n_s]
1959 ;; [vmlasq_n_u, vmlasq_n_s]
1965 (define_insn "@mve_<mve_insn>q_n_<supf><mode>"
1967 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1968 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1969 (match_operand:MVE_2 2 "s_register_operand" "w")
1970 (match_operand:<V_elem> 3 "s_register_operand" "r")]
1974 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
1975 [(set_attr "type" "mve_move")
1979 ;; [vmvnq_m_s, vmvnq_m_u])
1981 (define_insn "mve_vmvnq_m_<supf><mode>"
1983 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1984 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1985 (match_operand:MVE_2 2 "s_register_operand" "w")
1986 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1990 "vpst\;vmvnt %q0, %q2"
1991 [(set_attr "type" "mve_move")
1992 (set_attr "length""8")])
1995 ;; [vpselq_u, vpselq_s])
1997 (define_insn "@mve_vpselq_<supf><mode>"
1999 (set (match_operand:MVE_1 0 "s_register_operand" "=w")
2000 (unspec:MVE_1 [(match_operand:MVE_1 1 "s_register_operand" "w")
2001 (match_operand:MVE_1 2 "s_register_operand" "w")
2002 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2006 "vpsel %q0, %q1, %q2"
2007 [(set_attr "type" "mve_move")
2020 (define_insn "@mve_<mve_insn>q_<supf><mode>"
2022 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2023 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2024 (match_operand:MVE_2 2 "s_register_operand" "w")
2025 (match_operand:MVE_2 3 "s_register_operand" "w")]
2029 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q2, %q3"
2030 [(set_attr "type" "mve_move")
2034 ;; [vqrshlq_m_n_s, vqrshlq_m_n_u]
2035 ;; [vrshlq_m_n_s, vrshlq_m_n_u]
2037 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
2039 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2040 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2041 (match_operand:SI 2 "s_register_operand" "r")
2042 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2046 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %2"
2047 [(set_attr "type" "mve_move")
2048 (set_attr "length""8")])
2051 ;; [vqshlq_m_r_u, vqshlq_m_r_s]
2052 ;; [vshlq_m_r_u, vshlq_m_r_s]
2054 (define_insn "@mve_<mve_insn>q_m_r_<supf><mode>"
2056 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2057 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2058 (match_operand:SI 2 "s_register_operand" "r")
2059 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2063 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %2"
2064 [(set_attr "type" "mve_move")
2065 (set_attr "length""8")])
2068 ;; [vrev64q_m_u, vrev64q_m_s])
2070 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2072 (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
2073 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2074 (match_operand:MVE_2 2 "s_register_operand" "w")
2075 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2079 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
2080 [(set_attr "type" "mve_move")
2081 (set_attr "length""8")])
2084 ;; [vsliq_n_u, vsliq_n_s])
2086 (define_insn "mve_vsliq_n_<supf><mode>"
2088 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2089 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2090 (match_operand:MVE_2 2 "s_register_operand" "w")
2091 (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")]
2095 "vsli.%#<V_sz_elem>\t%q0, %q2, %3"
2096 [(set_attr "type" "mve_move")
2100 ;; [vsriq_n_u, vsriq_n_s])
2102 (define_insn "mve_vsriq_n_<supf><mode>"
2104 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2105 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2106 (match_operand:MVE_2 2 "s_register_operand" "w")
2107 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")]
2111 "vsri.%#<V_sz_elem>\t%q0, %q2, %3"
2112 [(set_attr "type" "mve_move")
2125 (define_insn "@mve_<mve_insn>q_m_f<mode>"
2127 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2128 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2129 (match_operand:MVE_0 2 "s_register_operand" "w")
2130 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2133 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2134 "vpst\;<mve_mnemo>t.f%#<V_sz_elem>\t%q0, %q2"
2135 [(set_attr "type" "mve_move")
2136 (set_attr "length""8")])
2139 ;; [vaddlvaq_p_s vaddlvaq_p_u])
2141 (define_insn "@mve_<mve_insn>q_p_<supf>v4si"
2143 (set (match_operand:DI 0 "s_register_operand" "=r")
2144 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2145 (match_operand:V4SI 2 "s_register_operand" "w")
2146 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
2150 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q2"
2151 [(set_attr "type" "mve_move")
2152 (set_attr "length""8")])
2154 ;; [vcmlaq, vcmlaq_rot90, vcmlaq_rot180, vcmlaq_rot270])
2156 (define_insn "mve_vcmlaq<mve_rot><mode>"
2158 (set (match_operand:MVE_0 0 "s_register_operand" "=w,w")
2159 (plus:MVE_0 (match_operand:MVE_0 1 "reg_or_zero_operand" "Dz,0")
2161 [(match_operand:MVE_0 2 "s_register_operand" "w,w")
2162 (match_operand:MVE_0 3 "s_register_operand" "w,w")]
2165 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2167 vcmul.f%#<V_sz_elem> %q0, %q2, %q3, #<rot>
2168 vcmla.f%#<V_sz_elem> %q0, %q2, %q3, #<rot>"
2169 [(set_attr "type" "mve_move")
2180 (define_insn "@mve_vcmp<mve_cmp_op1>q_m_n_f<mode>"
2182 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2183 (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
2184 (match_operand:<V_elem> 2 "s_register_operand" "r")
2185 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2188 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2189 "vpst\;vcmpt.f%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %2"
2190 [(set_attr "type" "mve_move")
2191 (set_attr "length""8")])
2194 ;; [vcvtbq_m_f16_f32])
2196 (define_insn "mve_vcvtbq_m_f16_f32v8hf"
2198 (set (match_operand:V8HF 0 "s_register_operand" "=w")
2199 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
2200 (match_operand:V4SF 2 "s_register_operand" "w")
2201 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2204 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2205 "vpst\;vcvtbt.f16.f32 %q0, %q2"
2206 [(set_attr "type" "mve_move")
2207 (set_attr "length""8")])
2210 ;; [vcvtbq_m_f32_f16])
2212 (define_insn "mve_vcvtbq_m_f32_f16v4sf"
2214 (set (match_operand:V4SF 0 "s_register_operand" "=w")
2215 (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
2216 (match_operand:V8HF 2 "s_register_operand" "w")
2217 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2220 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2221 "vpst\;vcvtbt.f32.f16 %q0, %q2"
2222 [(set_attr "type" "mve_move")
2223 (set_attr "length""8")])
2226 ;; [vcvttq_m_f16_f32])
2228 (define_insn "mve_vcvttq_m_f16_f32v8hf"
2230 (set (match_operand:V8HF 0 "s_register_operand" "=w")
2231 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
2232 (match_operand:V4SF 2 "s_register_operand" "w")
2233 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2236 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2237 "vpst\;vcvttt.f16.f32 %q0, %q2"
2238 [(set_attr "type" "mve_move")
2239 (set_attr "length""8")])
2242 ;; [vcvttq_m_f32_f16])
2244 (define_insn "mve_vcvttq_m_f32_f16v4sf"
2246 (set (match_operand:V4SF 0 "s_register_operand" "=w")
2247 (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
2248 (match_operand:V8HF 2 "s_register_operand" "w")
2249 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2252 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2253 "vpst\;vcvttt.f32.f16 %q0, %q2"
2254 [(set_attr "type" "mve_move")
2255 (set_attr "length""8")])
2260 (define_insn "@mve_<mve_insn>q_m_n_f<mode>"
2262 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2263 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2264 (match_operand:<V_elem> 2 "s_register_operand" "r")
2265 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2266 MVE_FP_M_N_VDUPQ_ONLY))
2268 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2269 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %2"
2270 [(set_attr "type" "mve_move")
2271 (set_attr "length""8")])
2276 (define_insn "mve_vfmaq_f<mode>"
2278 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2279 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2280 (match_operand:MVE_0 2 "s_register_operand" "w")
2281 (match_operand:MVE_0 3 "s_register_operand" "w")]
2284 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2285 "vfma.f%#<V_sz_elem> %q0, %q2, %q3"
2286 [(set_attr "type" "mve_move")
2292 (define_insn "mve_vfmaq_n_f<mode>"
2294 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2295 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2296 (match_operand:MVE_0 2 "s_register_operand" "w")
2297 (match_operand:<V_elem> 3 "s_register_operand" "r")]
2300 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2301 "vfma.f%#<V_sz_elem> %q0, %q2, %3"
2302 [(set_attr "type" "mve_move")
2308 (define_insn "mve_vfmasq_n_f<mode>"
2310 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2311 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2312 (match_operand:MVE_0 2 "s_register_operand" "w")
2313 (match_operand:<V_elem> 3 "s_register_operand" "r")]
2316 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2317 "vfmas.f%#<V_sz_elem> %q0, %q2, %3"
2318 [(set_attr "type" "mve_move")
2323 (define_insn "mve_vfmsq_f<mode>"
2325 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2326 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2327 (match_operand:MVE_0 2 "s_register_operand" "w")
2328 (match_operand:MVE_0 3 "s_register_operand" "w")]
2331 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2332 "vfms.f%#<V_sz_elem> %q0, %q2, %q3"
2333 [(set_attr "type" "mve_move")
2340 (define_insn "@mve_<mve_insn>q_m_f<mode>"
2342 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2343 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2344 (match_operand:MVE_0 2 "s_register_operand" "w")
2345 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2346 MVE_VMAXNMA_VMINNMAQ_M))
2348 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2349 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%q0, %q2"
2350 [(set_attr "type" "mve_move")
2351 (set_attr "length""8")])
2359 (define_insn "@mve_<mve_insn>q_p_f<mode>"
2361 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2362 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2363 (match_operand:MVE_0 2 "s_register_operand" "w")
2364 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2365 MVE_VMAXNMxV_MINNMxVQ_P))
2367 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2368 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%0, %q2"
2369 [(set_attr "type" "mve_move")
2370 (set_attr "length""8")])
2373 ;; [vmlaldavaq_s, vmlaldavaq_u]
2378 (define_insn "@mve_<mve_insn>q_<supf><mode>"
2380 (set (match_operand:DI 0 "s_register_operand" "=r")
2381 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2382 (match_operand:MVE_5 2 "s_register_operand" "w")
2383 (match_operand:MVE_5 3 "s_register_operand" "w")]
2387 "<mve_insn>.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
2388 [(set_attr "type" "mve_move")
2392 ;; [vmlaldavq_p_u, vmlaldavq_p_s]
2397 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
2399 (set (match_operand:DI 0 "s_register_operand" "=r")
2400 (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2401 (match_operand:MVE_5 2 "s_register_operand" "w")
2402 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2406 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
2407 [(set_attr "type" "mve_move")
2408 (set_attr "length""8")])
2411 ;; [vmovlbq_m_u, vmovlbq_m_s])
2412 ;; [vmovltq_m_u, vmovltq_m_s])
2414 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2416 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2417 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2418 (match_operand:MVE_3 2 "s_register_operand" "w")
2419 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2423 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2"
2424 [(set_attr "type" "mve_move")
2425 (set_attr "length""8")])
2428 ;; [vmovnbq_m_u, vmovnbq_m_s]
2429 ;; [vmovntq_m_u, vmovntq_m_s]
2430 ;; [vqmovnbq_m_s, vqmovnbq_m_u]
2431 ;; [vqmovntq_m_u, vqmovntq_m_s]
2435 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2437 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2438 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2439 (match_operand:MVE_5 2 "s_register_operand" "w")
2440 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2444 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2"
2445 [(set_attr "type" "mve_move")
2446 (set_attr "length""8")])
2449 ;; [vmvnq_m_n_u, vmvnq_m_n_s])
2451 (define_insn "mve_vmvnq_m_n_<supf><mode>"
2453 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2454 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2455 (match_operand:SI 2 "immediate_operand" "i")
2456 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2460 "vpst\;vmvnt.i%#<V_sz_elem> %q0, %2"
2461 [(set_attr "type" "mve_move")
2462 (set_attr "length""8")])
2465 ;; [vbicq_m_n_s, vbicq_m_n_u]
2466 ;; [vorrq_m_n_s, vorrq_m_n_u]
2468 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
2470 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2471 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2472 (match_operand:SI 2 "immediate_operand" "i")
2473 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2474 MVE_INT_M_N_BINARY_LOGIC))
2477 "vpst\;<mve_insn>t.i%#<V_sz_elem> %q0, %2"
2478 [(set_attr "type" "mve_move")
2479 (set_attr "length""8")])
2484 (define_insn "@mve_vpselq_f<mode>"
2486 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2487 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
2488 (match_operand:MVE_0 2 "s_register_operand" "w")
2489 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2492 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2493 "vpsel %q0, %q1, %q2"
2494 [(set_attr "type" "mve_move")
2500 (define_insn "@mve_<mve_insn>q_m_f<mode>"
2502 (set (match_operand:MVE_V8HF 0 "s_register_operand" "=w")
2503 (unspec:MVE_V8HF [(match_operand:MVE_V8HF 1 "s_register_operand" "0")
2504 (match_operand:MVE_V8HF 2 "s_register_operand" "w")
2505 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2506 MVE_FP_M_VREV32Q_ONLY))
2508 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2509 "vpst\;<mve_insn>t.<V_sz_elem>\t%q0, %q2"
2510 [(set_attr "type" "mve_move")
2511 (set_attr "length""8")])
2514 ;; [vrev32q_m_s, vrev32q_m_u])
2516 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2518 (set (match_operand:MVE_3 0 "s_register_operand" "=w")
2519 (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "0")
2520 (match_operand:MVE_3 2 "s_register_operand" "w")
2521 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2525 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
2526 [(set_attr "type" "mve_move")
2527 (set_attr "length""8")])
2532 (define_insn "@mve_<mve_insn>q_m_f<mode>"
2534 (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
2535 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2536 (match_operand:MVE_0 2 "s_register_operand" "w")
2537 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2538 MVE_FP_M_VREV64Q_ONLY))
2540 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2541 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
2542 [(set_attr "type" "mve_move")
2543 (set_attr "length""8")])
2546 ;; [vrmlaldavhaxq_s])
2548 (define_insn "mve_vrmlaldavhaxq_sv4si"
2550 (set (match_operand:DI 0 "s_register_operand" "=r")
2551 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2552 (match_operand:V4SI 2 "s_register_operand" "w")
2553 (match_operand:V4SI 3 "s_register_operand" "w")]
2557 "vrmlaldavhax.s32 %Q0, %R0, %q2, %q3"
2558 [(set_attr "type" "mve_move")
2562 ;; [vrmlaldavhq_p_u vrmlaldavhq_p_s]
2563 ;; [vrmlaldavhxq_p_s]
2564 ;; [vrmlsldavhq_p_s]
2565 ;; [vrmlsldavhxq_p_s]
2567 (define_insn "@mve_<mve_insn>q_p_<supf>v4si"
2569 (set (match_operand:DI 0 "s_register_operand" "=r")
2570 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2571 (match_operand:V4SI 2 "s_register_operand" "w")
2572 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
2573 MVE_VRMLxLDAVHxQ_P))
2576 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q1, %q2"
2577 [(set_attr "type" "mve_move")
2578 (set_attr "length""8")])
2581 ;; [vrmlsldavhaxq_s])
2583 (define_insn "mve_vrmlsldavhaxq_sv4si"
2585 (set (match_operand:DI 0 "s_register_operand" "=r")
2586 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2587 (match_operand:V4SI 2 "s_register_operand" "w")
2588 (match_operand:V4SI 3 "s_register_operand" "w")]
2592 "vrmlsldavhax.s32 %Q0, %R0, %q2, %q3"
2593 [(set_attr "type" "mve_move")
2597 ;; [vcvtmq_m_s, vcvtmq_m_u])
2599 (define_insn "mve_vcvtmq_m_<supf><mode>"
2601 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2602 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2603 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2604 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2607 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2608 "vpst\;vcvtmt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
2609 [(set_attr "type" "mve_move")
2610 (set_attr "length""8")])
2613 ;; [vcvtpq_m_u, vcvtpq_m_s])
2615 (define_insn "mve_vcvtpq_m_<supf><mode>"
2617 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2618 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2619 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2620 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2623 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2624 "vpst\;vcvtpt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
2625 [(set_attr "type" "mve_move")
2626 (set_attr "length""8")])
2629 ;; [vcvtnq_m_s, vcvtnq_m_u])
2631 (define_insn "mve_vcvtnq_m_<supf><mode>"
2633 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2634 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2635 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2636 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2639 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2640 "vpst\;vcvtnt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
2641 [(set_attr "type" "mve_move")
2642 (set_attr "length""8")])
2645 ;; [vcvtq_m_n_from_f_s, vcvtq_m_n_from_f_u])
2647 (define_insn "mve_vcvtq_m_n_from_f_<supf><mode>"
2649 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2650 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2651 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2652 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
2653 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2656 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2657 "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2, %3"
2658 [(set_attr "type" "mve_move")
2659 (set_attr "length""8")])
2662 ;; [vrev16q_m_u, vrev16q_m_s])
2664 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2666 (set (match_operand:MVE_V16QI 0 "s_register_operand" "=w")
2667 (unspec:MVE_V16QI [(match_operand:MVE_V16QI 1 "s_register_operand" "0")
2668 (match_operand:MVE_V16QI 2 "s_register_operand" "w")
2669 (match_operand:V16BI 3 "vpr_register_operand" "Up")]
2673 "vpst\;<mve_insn>t.<V_sz_elem>\t%q0, %q2"
2674 [(set_attr "type" "mve_move")
2675 (set_attr "length""8")])
2678 ;; [vcvtq_m_from_f_u, vcvtq_m_from_f_s])
2680 (define_insn "mve_vcvtq_m_from_f_<supf><mode>"
2682 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2683 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2684 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2685 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2688 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2689 "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
2690 [(set_attr "type" "mve_move")
2691 (set_attr "length""8")])
2694 ;; [vrmlsldavhaq_s])
2696 (define_insn "mve_vrmlsldavhaq_sv4si"
2698 (set (match_operand:DI 0 "s_register_operand" "=r")
2699 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2700 (match_operand:V4SI 2 "s_register_operand" "w")
2701 (match_operand:V4SI 3 "s_register_operand" "w")]
2705 "vrmlsldavha.s32 %Q0, %R0, %q2, %q3"
2706 [(set_attr "type" "mve_move")
2710 ;; [vabavq_p_s, vabavq_p_u])
2712 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
2714 (set (match_operand:SI 0 "s_register_operand" "=r")
2715 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2716 (match_operand:MVE_2 2 "s_register_operand" "w")
2717 (match_operand:MVE_2 3 "s_register_operand" "w")
2718 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2722 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
2723 [(set_attr "type" "mve_move")
2724 (set_attr "length" "8")])
2729 (define_insn "mve_vqshluq_m_n_s<mode>"
2731 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2732 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2733 (match_operand:MVE_2 2 "s_register_operand" "w")
2734 (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
2735 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2739 "vpst\n\tvqshlut.s%#<V_sz_elem>\t%q0, %q2, %3"
2740 [(set_attr "type" "mve_move")
2741 (set_attr "length" "8")])
2744 ;; [vsriq_m_n_s, vsriq_m_n_u])
2746 (define_insn "mve_vsriq_m_n_<supf><mode>"
2748 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2749 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2750 (match_operand:MVE_2 2 "s_register_operand" "w")
2751 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
2752 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2756 "vpst\;vsrit.%#<V_sz_elem>\t%q0, %q2, %3"
2757 [(set_attr "type" "mve_move")
2758 (set_attr "length" "8")])
2761 ;; [vcvtq_m_n_to_f_u, vcvtq_m_n_to_f_s])
2763 (define_insn "mve_vcvtq_m_n_to_f_<supf><mode>"
2765 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2766 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2767 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
2768 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
2769 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2772 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2773 "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
2774 [(set_attr "type" "mve_move")
2775 (set_attr "length""8")])
2778 ;; [vabdq_m_s, vabdq_m_u]
2779 ;; [vhaddq_m_s, vhaddq_m_u]
2780 ;; [vhsubq_m_s, vhsubq_m_u]
2781 ;; [vmaxq_m_s, vmaxq_m_u]
2782 ;; [vminq_m_s, vminq_m_u]
2783 ;; [vmulhq_m_s, vmulhq_m_u]
2784 ;; [vqaddq_m_u, vqaddq_m_s]
2791 ;; [vqrdmladhxq_m_s]
2793 ;; [vqrdmlsdhxq_m_s]
2795 ;; [vqrshlq_m_u, vqrshlq_m_s]
2796 ;; [vqshlq_m_u, vqshlq_m_s]
2797 ;; [vqsubq_m_u, vqsubq_m_s]
2798 ;; [vrhaddq_m_u, vrhaddq_m_s]
2799 ;; [vrmulhq_m_u, vrmulhq_m_s]
2800 ;; [vrshlq_m_s, vrshlq_m_u]
2801 ;; [vshlq_m_s, vshlq_m_u]
2803 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2805 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2806 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2807 (match_operand:MVE_2 2 "s_register_operand" "w")
2808 (match_operand:MVE_2 3 "s_register_operand" "w")
2809 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2810 MVE_INT_SU_M_BINARY))
2813 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
2814 [(set_attr "type" "mve_move")
2815 (set_attr "length""8")])
2818 ;; [vaddq_m_n_s, vaddq_m_n_u]
2819 ;; [vsubq_m_n_s, vsubq_m_n_u]
2820 ;; [vmulq_m_n_s, vmulq_m_n_u]
2822 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
2824 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2825 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2826 (match_operand:MVE_2 2 "s_register_operand" "w")
2827 (match_operand:<V_elem> 3 "s_register_operand" "r")
2828 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2829 MVE_INT_M_N_BINARY))
2832 "vpst\;<mve_insn>t.i%#<V_sz_elem> %q0, %q2, %3"
2833 [(set_attr "type" "mve_move")
2834 (set_attr "length""8")])
2837 ;; [vaddq_m_u, vaddq_m_s]
2838 ;; [vsubq_m_u, vsubq_m_s]
2839 ;; [vmulq_m_u, vmulq_m_s]
2841 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2843 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2844 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2845 (match_operand:MVE_2 2 "s_register_operand" "w")
2846 (match_operand:MVE_2 3 "s_register_operand" "w")
2847 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2851 "vpst\;<mve_insn>t.i%#<V_sz_elem> %q0, %q2, %q3"
2852 [(set_attr "type" "mve_move")
2853 (set_attr "length""8")])
2856 ;; [vandq_m_u, vandq_m_s]
2857 ;; [vbicq_m_u, vbicq_m_s]
2858 ;; [veorq_m_u, veorq_m_s]
2859 ;; [vorrq_m_u, vorrq_m_s]
2861 (define_insn "@mve_<mve_insn>q_m_<supf><mode>"
2863 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2864 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2865 (match_operand:MVE_2 2 "s_register_operand" "w")
2866 (match_operand:MVE_2 3 "s_register_operand" "w")
2867 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2868 MVE_INT_M_BINARY_LOGIC))
2871 "vpst\;<mve_insn>t %q0, %q2, %q3"
2872 [(set_attr "type" "mve_move")
2873 (set_attr "length""8")])
2876 ;; [vbrsrq_m_n_u, vbrsrq_m_n_s])
2878 (define_insn "mve_vbrsrq_m_n_<supf><mode>"
2880 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2881 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2882 (match_operand:MVE_2 2 "s_register_operand" "w")
2883 (match_operand:SI 3 "s_register_operand" "r")
2884 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2888 "vpst\;vbrsrt.%#<V_sz_elem> %q0, %q2, %3"
2889 [(set_attr "type" "mve_move")
2890 (set_attr "length""8")])
2893 ;; [vcaddq_rot270_m_u, vcaddq_rot270_m_s])
2895 (define_insn "mve_vcaddq_rot270_m_<supf><mode>"
2897 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
2898 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2899 (match_operand:MVE_2 2 "s_register_operand" "w")
2900 (match_operand:MVE_2 3 "s_register_operand" "w")
2901 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2905 "vpst\;vcaddt.i%#<V_sz_elem> %q0, %q2, %q3, #270"
2906 [(set_attr "type" "mve_move")
2907 (set_attr "length""8")])
2910 ;; [vcaddq_rot90_m_u, vcaddq_rot90_m_s])
2912 (define_insn "mve_vcaddq_rot90_m_<supf><mode>"
2914 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
2915 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2916 (match_operand:MVE_2 2 "s_register_operand" "w")
2917 (match_operand:MVE_2 3 "s_register_operand" "w")
2918 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2922 "vpst\;vcaddt.i%#<V_sz_elem> %q0, %q2, %q3, #90"
2923 [(set_attr "type" "mve_move")
2924 (set_attr "length""8")])
2927 ;; [vhaddq_m_n_s, vhaddq_m_n_u]
2928 ;; [vhsubq_m_n_s, vhsubq_m_n_u]
2929 ;; [vmlaq_m_n_s, vmlaq_m_n_u]
2930 ;; [vmlasq_m_n_u, vmlasq_m_n_s]
2931 ;; [vqaddq_m_n_u, vqaddq_m_n_s]
2933 ;; [vqdmlashq_m_n_s]
2935 ;; [vqrdmlahq_m_n_s]
2936 ;; [vqrdmlashq_m_n_s]
2937 ;; [vqrdmulhq_m_n_s]
2938 ;; [vqsubq_m_n_u, vqsubq_m_n_s]
2940 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
2942 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2943 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2944 (match_operand:MVE_2 2 "s_register_operand" "w")
2945 (match_operand:<V_elem> 3 "s_register_operand" "r")
2946 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2947 MVE_INT_SU_M_N_BINARY))
2950 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
2951 [(set_attr "type" "mve_move")
2952 (set_attr "length""8")])
2956 ;; [vmladavaq_p_u, vmladavaq_p_s]
2961 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
2963 (set (match_operand:SI 0 "s_register_operand" "=Te")
2964 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2965 (match_operand:MVE_2 2 "s_register_operand" "w")
2966 (match_operand:MVE_2 3 "s_register_operand" "w")
2967 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2971 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
2972 [(set_attr "type" "mve_move")
2973 (set_attr "length""8")])
2976 ;; [vmullbq_int_m_u, vmullbq_int_m_s])
2978 (define_insn "mve_vmullbq_int_m_<supf><mode>"
2980 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2981 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2982 (match_operand:MVE_2 2 "s_register_operand" "w")
2983 (match_operand:MVE_2 3 "s_register_operand" "w")
2984 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2988 "vpst\;vmullbt.<supf>%#<V_sz_elem> %q0, %q2, %q3"
2989 [(set_attr "type" "mve_move")
2990 (set_attr "length""8")])
2993 ;; [vmulltq_int_m_s, vmulltq_int_m_u])
2995 (define_insn "mve_vmulltq_int_m_<supf><mode>"
2997 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
2998 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2999 (match_operand:MVE_2 2 "s_register_operand" "w")
3000 (match_operand:MVE_2 3 "s_register_operand" "w")
3001 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3005 "vpst\;vmulltt.<supf>%#<V_sz_elem> %q0, %q2, %q3"
3006 [(set_attr "type" "mve_move")
3007 (set_attr "length""8")])
3010 ;; [vornq_m_u, vornq_m_s])
3012 (define_insn "mve_vornq_m_<supf><mode>"
3014 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3015 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3016 (match_operand:MVE_2 2 "s_register_operand" "w")
3017 (match_operand:MVE_2 3 "s_register_operand" "w")
3018 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3022 "vpst\;vornt %q0, %q2, %q3"
3023 [(set_attr "type" "mve_move")
3024 (set_attr "length""8")])
3027 ;; [vqshlq_m_n_s, vqshlq_m_n_u]
3028 ;; [vshlq_m_n_s, vshlq_m_n_u]
3030 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
3032 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3033 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3034 (match_operand:MVE_2 2 "s_register_operand" "w")
3035 (match_operand:SI 3 "immediate_operand" "i")
3036 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3040 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
3041 [(set_attr "type" "mve_move")
3042 (set_attr "length""8")])
3045 ;; [vrshrq_m_n_s, vrshrq_m_n_u])
3046 ;; [vshrq_m_n_s, vshrq_m_n_u])
3048 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
3050 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3051 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3052 (match_operand:MVE_2 2 "s_register_operand" "w")
3053 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
3054 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3058 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
3059 [(set_attr "type" "mve_move")
3060 (set_attr "length""8")])
3063 ;; [vsliq_m_n_u, vsliq_m_n_s])
3065 (define_insn "mve_vsliq_m_n_<supf><mode>"
3067 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
3068 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3069 (match_operand:MVE_2 2 "s_register_operand" "w")
3070 (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
3071 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3075 "vpst\;vslit.%#<V_sz_elem>\t%q0, %q2, %3"
3076 [(set_attr "type" "mve_move")
3077 (set_attr "length""8")])
3080 ;; [vhcaddq_rot270_m_s])
3082 (define_insn "mve_vhcaddq_rot270_m_s<mode>"
3084 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
3085 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
3086 (match_operand:MVE_2 2 "s_register_operand" "w")
3087 (match_operand:MVE_2 3 "s_register_operand" "w")
3088 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3089 VHCADDQ_ROT270_M_S))
3092 "vpst\;vhcaddt.s%#<V_sz_elem>\t%q0, %q2, %q3, #270"
3093 [(set_attr "type" "mve_move")
3094 (set_attr "length""8")])
3097 ;; [vhcaddq_rot90_m_s])
3099 (define_insn "mve_vhcaddq_rot90_m_s<mode>"
3101 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
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_2 3 "s_register_operand" "w")
3105 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3109 "vpst\;vhcaddt.s%#<V_sz_elem>\t%q0, %q2, %q3, #90"
3110 [(set_attr "type" "mve_move")
3111 (set_attr "length""8")])
3114 ;; [vmlaldavaq_p_u, vmlaldavaq_p_s]
3115 ;; [vmlaldavaxq_p_s]
3117 ;; [vmlsldavaxq_p_s]
3119 (define_insn "@mve_<mve_insn>q_p_<supf><mode>"
3121 (set (match_operand:DI 0 "s_register_operand" "=r")
3122 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3123 (match_operand:MVE_5 2 "s_register_operand" "w")
3124 (match_operand:MVE_5 3 "s_register_operand" "w")
3125 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3129 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
3130 [(set_attr "type" "mve_move")
3131 (set_attr "length""8")])
3134 ;; [vqrshrnbq_m_n_u, vqrshrnbq_m_n_s]
3135 ;; [vqrshrntq_m_n_s, vqrshrntq_m_n_u]
3136 ;; [vqrshrunbq_m_n_s]
3137 ;; [vqrshruntq_m_n_s]
3138 ;; [vqshrnbq_m_n_u, vqshrnbq_m_n_s]
3139 ;; [vqshrntq_m_n_s, vqshrntq_m_n_u]
3140 ;; [vqshrunbq_m_n_s]
3141 ;; [vqshruntq_m_n_s]
3142 ;; [vrshrnbq_m_n_u, vrshrnbq_m_n_s]
3143 ;; [vrshrntq_m_n_u, vrshrntq_m_n_s]
3144 ;; [vshrnbq_m_n_s, vshrnbq_m_n_u]
3145 ;; [vshrntq_m_n_s, vshrntq_m_n_u]
3147 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
3149 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
3150 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
3151 (match_operand:MVE_5 2 "s_register_operand" "w")
3152 (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
3153 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3157 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2, %3"
3158 [(set_attr "type" "mve_move")
3159 (set_attr "length""8")])
3162 ;; [vrmlaldavhaq_p_s])
3164 (define_insn "mve_vrmlaldavhaq_p_sv4si"
3166 (set (match_operand:DI 0 "s_register_operand" "=r")
3167 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3168 (match_operand:V4SI 2 "s_register_operand" "w")
3169 (match_operand:V4SI 3 "s_register_operand" "w")
3170 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3174 "vpst\;vrmlaldavhat.s32\t%Q0, %R0, %q2, %q3"
3175 [(set_attr "type" "mve_move")
3176 (set_attr "length""8")])
3179 ;; [vshllbq_m_n_u, vshllbq_m_n_s]
3180 ;; [vshlltq_m_n_u, vshlltq_m_n_s]
3182 (define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
3184 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
3185 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3186 (match_operand:MVE_3 2 "s_register_operand" "w")
3187 (match_operand:SI 3 "immediate_operand" "i")
3188 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3192 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
3193 [(set_attr "type" "mve_move")
3194 (set_attr "length""8")])
3197 ;; [vmullbq_poly_m_p])
3199 (define_insn "mve_vmullbq_poly_m_p<mode>"
3201 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
3202 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3203 (match_operand:MVE_3 2 "s_register_operand" "w")
3204 (match_operand:MVE_3 3 "s_register_operand" "w")
3205 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3209 "vpst\;vmullbt.p%#<V_sz_elem>\t%q0, %q2, %q3"
3210 [(set_attr "type" "mve_move")
3211 (set_attr "length""8")])
3214 ;; [vmulltq_poly_m_p])
3216 (define_insn "mve_vmulltq_poly_m_p<mode>"
3218 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
3219 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3220 (match_operand:MVE_3 2 "s_register_operand" "w")
3221 (match_operand:MVE_3 3 "s_register_operand" "w")
3222 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3226 "vpst\;vmulltt.p%#<V_sz_elem>\t%q0, %q2, %q3"
3227 [(set_attr "type" "mve_move")
3228 (set_attr "length""8")])
3231 ;; [vqdmullbq_m_n_s])
3233 (define_insn "mve_vqdmullbq_m_n_s<mode>"
3235 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
3236 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3237 (match_operand:MVE_5 2 "s_register_operand" "w")
3238 (match_operand:<V_elem> 3 "s_register_operand" "r")
3239 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3243 "vpst\;vqdmullbt.s%#<V_sz_elem>\t%q0, %q2, %3"
3244 [(set_attr "type" "mve_move")
3245 (set_attr "length""8")])
3250 (define_insn "mve_vqdmullbq_m_s<mode>"
3252 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
3253 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3254 (match_operand:MVE_5 2 "s_register_operand" "w")
3255 (match_operand:MVE_5 3 "s_register_operand" "w")
3256 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3260 "vpst\;vqdmullbt.s%#<V_sz_elem>\t%q0, %q2, %q3"
3261 [(set_attr "type" "mve_move")
3262 (set_attr "length""8")])
3265 ;; [vqdmulltq_m_n_s])
3267 (define_insn "mve_vqdmulltq_m_n_s<mode>"
3269 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
3270 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3271 (match_operand:MVE_5 2 "s_register_operand" "w")
3272 (match_operand:<V_elem> 3 "s_register_operand" "r")
3273 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3277 "vpst\;vqdmulltt.s%#<V_sz_elem>\t%q0, %q2, %3"
3278 [(set_attr "type" "mve_move")
3279 (set_attr "length""8")])
3284 (define_insn "mve_vqdmulltq_m_s<mode>"
3286 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
3287 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3288 (match_operand:MVE_5 2 "s_register_operand" "w")
3289 (match_operand:MVE_5 3 "s_register_operand" "w")
3290 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3294 "vpst\;vqdmulltt.s%#<V_sz_elem>\t%q0, %q2, %q3"
3295 [(set_attr "type" "mve_move")
3296 (set_attr "length""8")])
3299 ;; [vrmlaldavhaq_p_u])
3301 (define_insn "mve_vrmlaldavhaq_p_uv4si"
3303 (set (match_operand:DI 0 "s_register_operand" "=r")
3304 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3305 (match_operand:V4SI 2 "s_register_operand" "w")
3306 (match_operand:V4SI 3 "s_register_operand" "w")
3307 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3311 "vpst\;vrmlaldavhat.u32\t%Q0, %R0, %q2, %q3"
3312 [(set_attr "type" "mve_move")
3313 (set_attr "length""8")])
3316 ;; [vrmlaldavhaxq_p_s])
3318 (define_insn "mve_vrmlaldavhaxq_p_sv4si"
3320 (set (match_operand:DI 0 "s_register_operand" "=r")
3321 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3322 (match_operand:V4SI 2 "s_register_operand" "w")
3323 (match_operand:V4SI 3 "s_register_operand" "w")
3324 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3328 "vpst\;vrmlaldavhaxt.s32\t%Q0, %R0, %q2, %q3"
3329 [(set_attr "type" "mve_move")
3330 (set_attr "length""8")])
3333 ;; [vrmlsldavhaq_p_s])
3335 (define_insn "mve_vrmlsldavhaq_p_sv4si"
3337 (set (match_operand:DI 0 "s_register_operand" "=r")
3338 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3339 (match_operand:V4SI 2 "s_register_operand" "w")
3340 (match_operand:V4SI 3 "s_register_operand" "w")
3341 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3345 "vpst\;vrmlsldavhat.s32\t%Q0, %R0, %q2, %q3"
3346 [(set_attr "type" "mve_move")
3347 (set_attr "length""8")])
3350 ;; [vrmlsldavhaxq_p_s])
3352 (define_insn "mve_vrmlsldavhaxq_p_sv4si"
3354 (set (match_operand:DI 0 "s_register_operand" "=r")
3355 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
3356 (match_operand:V4SI 2 "s_register_operand" "w")
3357 (match_operand:V4SI 3 "s_register_operand" "w")
3358 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3362 "vpst\;vrmlsldavhaxt.s32\t%Q0, %R0, %q2, %q3"
3363 [(set_attr "type" "mve_move")
3364 (set_attr "length""8")])
3374 (define_insn "@mve_<mve_insn>q_m_f<mode>"
3376 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3377 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3378 (match_operand:MVE_0 2 "s_register_operand" "w")
3379 (match_operand:MVE_0 3 "s_register_operand" "w")
3380 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3383 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3384 "vpst\;<mve_insn>t.f%#<V_sz_elem> %q0, %q2, %q3"
3385 [(set_attr "type" "mve_move")
3386 (set_attr "length""8")])
3393 (define_insn "@mve_<mve_insn>q_m_n_f<mode>"
3395 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3396 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3397 (match_operand:MVE_0 2 "s_register_operand" "w")
3398 (match_operand:<V_elem> 3 "s_register_operand" "r")
3399 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3402 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3403 "vpst\;<mve_insn>t.f%#<V_sz_elem> %q0, %q2, %3"
3404 [(set_attr "type" "mve_move")
3405 (set_attr "length""8")])
3413 (define_insn "@mve_<mve_insn>q_m_f<mode>"
3415 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3416 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3417 (match_operand:MVE_0 2 "s_register_operand" "w")
3418 (match_operand:MVE_0 3 "s_register_operand" "w")
3419 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3420 MVE_FP_M_BINARY_LOGIC))
3422 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3423 "vpst\;<mve_insn>t %q0, %q2, %q3"
3424 [(set_attr "type" "mve_move")
3425 (set_attr "length""8")])
3430 (define_insn "mve_vbrsrq_m_n_f<mode>"
3432 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3433 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3434 (match_operand:MVE_0 2 "s_register_operand" "w")
3435 (match_operand:SI 3 "s_register_operand" "r")
3436 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3439 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3440 "vpst\;vbrsrt.%#<V_sz_elem> %q0, %q2, %3"
3441 [(set_attr "type" "mve_move")
3442 (set_attr "length""8")])
3445 ;; [vcaddq_rot270_m_f])
3447 (define_insn "mve_vcaddq_rot270_m_f<mode>"
3449 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3450 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3451 (match_operand:MVE_0 2 "s_register_operand" "w")
3452 (match_operand:MVE_0 3 "s_register_operand" "w")
3453 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3456 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3457 "vpst\;vcaddt.f%#<V_sz_elem> %q0, %q2, %q3, #270"
3458 [(set_attr "type" "mve_move")
3459 (set_attr "length""8")])
3462 ;; [vcaddq_rot90_m_f])
3464 (define_insn "mve_vcaddq_rot90_m_f<mode>"
3466 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3467 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3468 (match_operand:MVE_0 2 "s_register_operand" "w")
3469 (match_operand:MVE_0 3 "s_register_operand" "w")
3470 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3473 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3474 "vpst\;vcaddt.f%#<V_sz_elem> %q0, %q2, %q3, #90"
3475 [(set_attr "type" "mve_move")
3476 (set_attr "length""8")])
3481 (define_insn "mve_vcmlaq_m_f<mode>"
3483 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3484 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3485 (match_operand:MVE_0 2 "s_register_operand" "w")
3486 (match_operand:MVE_0 3 "s_register_operand" "w")
3487 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3490 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3491 "vpst\;vcmlat.f%#<V_sz_elem> %q0, %q2, %q3, #0"
3492 [(set_attr "type" "mve_move")
3493 (set_attr "length""8")])
3496 ;; [vcmlaq_rot180_m_f])
3498 (define_insn "mve_vcmlaq_rot180_m_f<mode>"
3500 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3501 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3502 (match_operand:MVE_0 2 "s_register_operand" "w")
3503 (match_operand:MVE_0 3 "s_register_operand" "w")
3504 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3507 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3508 "vpst\;vcmlat.f%#<V_sz_elem> %q0, %q2, %q3, #180"
3509 [(set_attr "type" "mve_move")
3510 (set_attr "length""8")])
3513 ;; [vcmlaq_rot270_m_f])
3515 (define_insn "mve_vcmlaq_rot270_m_f<mode>"
3517 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3518 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3519 (match_operand:MVE_0 2 "s_register_operand" "w")
3520 (match_operand:MVE_0 3 "s_register_operand" "w")
3521 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3524 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3525 "vpst\;vcmlat.f%#<V_sz_elem> %q0, %q2, %q3, #270"
3526 [(set_attr "type" "mve_move")
3527 (set_attr "length""8")])
3530 ;; [vcmlaq_rot90_m_f])
3532 (define_insn "mve_vcmlaq_rot90_m_f<mode>"
3534 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3535 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3536 (match_operand:MVE_0 2 "s_register_operand" "w")
3537 (match_operand:MVE_0 3 "s_register_operand" "w")
3538 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3541 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3542 "vpst\;vcmlat.f%#<V_sz_elem> %q0, %q2, %q3, #90"
3543 [(set_attr "type" "mve_move")
3544 (set_attr "length""8")])
3549 (define_insn "mve_vcmulq_m_f<mode>"
3551 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3552 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3553 (match_operand:MVE_0 2 "s_register_operand" "w")
3554 (match_operand:MVE_0 3 "s_register_operand" "w")
3555 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3558 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3559 "vpst\;vcmult.f%#<V_sz_elem> %q0, %q2, %q3, #0"
3560 [(set_attr "type" "mve_move")
3561 (set_attr "length""8")])
3564 ;; [vcmulq_rot180_m_f])
3566 (define_insn "mve_vcmulq_rot180_m_f<mode>"
3568 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3569 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3570 (match_operand:MVE_0 2 "s_register_operand" "w")
3571 (match_operand:MVE_0 3 "s_register_operand" "w")
3572 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3575 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3576 "vpst\;vcmult.f%#<V_sz_elem> %q0, %q2, %q3, #180"
3577 [(set_attr "type" "mve_move")
3578 (set_attr "length""8")])
3581 ;; [vcmulq_rot270_m_f])
3583 (define_insn "mve_vcmulq_rot270_m_f<mode>"
3585 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3586 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3587 (match_operand:MVE_0 2 "s_register_operand" "w")
3588 (match_operand:MVE_0 3 "s_register_operand" "w")
3589 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3592 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3593 "vpst\;vcmult.f%#<V_sz_elem> %q0, %q2, %q3, #270"
3594 [(set_attr "type" "mve_move")
3595 (set_attr "length""8")])
3598 ;; [vcmulq_rot90_m_f])
3600 (define_insn "mve_vcmulq_rot90_m_f<mode>"
3602 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
3603 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3604 (match_operand:MVE_0 2 "s_register_operand" "w")
3605 (match_operand:MVE_0 3 "s_register_operand" "w")
3606 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3609 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3610 "vpst\;vcmult.f%#<V_sz_elem> %q0, %q2, %q3, #90"
3611 [(set_attr "type" "mve_move")
3612 (set_attr "length""8")])
3617 (define_insn "mve_vfmaq_m_f<mode>"
3619 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3620 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3621 (match_operand:MVE_0 2 "s_register_operand" "w")
3622 (match_operand:MVE_0 3 "s_register_operand" "w")
3623 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3626 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3627 "vpst\;vfmat.f%#<V_sz_elem> %q0, %q2, %q3"
3628 [(set_attr "type" "mve_move")
3629 (set_attr "length""8")])
3634 (define_insn "mve_vfmaq_m_n_f<mode>"
3636 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3637 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3638 (match_operand:MVE_0 2 "s_register_operand" "w")
3639 (match_operand:<V_elem> 3 "s_register_operand" "r")
3640 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3643 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3644 "vpst\;vfmat.f%#<V_sz_elem> %q0, %q2, %3"
3645 [(set_attr "type" "mve_move")
3646 (set_attr "length""8")])
3651 (define_insn "mve_vfmasq_m_n_f<mode>"
3653 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3654 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3655 (match_operand:MVE_0 2 "s_register_operand" "w")
3656 (match_operand:<V_elem> 3 "s_register_operand" "r")
3657 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3660 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3661 "vpst\;vfmast.f%#<V_sz_elem> %q0, %q2, %3"
3662 [(set_attr "type" "mve_move")
3663 (set_attr "length""8")])
3668 (define_insn "mve_vfmsq_m_f<mode>"
3670 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3671 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3672 (match_operand:MVE_0 2 "s_register_operand" "w")
3673 (match_operand:MVE_0 3 "s_register_operand" "w")
3674 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3677 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3678 "vpst\;vfmst.f%#<V_sz_elem> %q0, %q2, %q3"
3679 [(set_attr "type" "mve_move")
3680 (set_attr "length""8")])
3685 (define_insn "mve_vornq_m_f<mode>"
3687 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3688 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3689 (match_operand:MVE_0 2 "s_register_operand" "w")
3690 (match_operand:MVE_0 3 "s_register_operand" "w")
3691 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
3694 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3695 "vpst\;vornt %q0, %q2, %q3"
3696 [(set_attr "type" "mve_move")
3697 (set_attr "length""8")])
3700 ;; [vstrbq_s vstrbq_u]
3702 (define_insn "mve_vstrbq_<supf><mode>"
3703 [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
3704 (unspec:<MVE_B_ELEM> [(match_operand:MVE_2 1 "s_register_operand" "w")]
3710 int regno = REGNO (operands[1]);
3711 ops[1] = gen_rtx_REG (TImode, regno);
3712 ops[0] = operands[0];
3713 output_asm_insn("vstrb.<V_sz_elem>\t%q1, %E0",ops);
3716 [(set_attr "length" "4")])
3719 ;; [vstrbq_scatter_offset_s vstrbq_scatter_offset_u]
3721 (define_expand "mve_vstrbq_scatter_offset_<supf><mode>"
3722 [(match_operand:<MVE_B_ELEM> 0 "mve_scatter_memory")
3723 (match_operand:MVE_2 1 "s_register_operand")
3724 (match_operand:MVE_2 2 "s_register_operand")
3725 (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
3728 rtx ind = XEXP (operands[0], 0);
3729 gcc_assert (REG_P (ind));
3730 emit_insn (gen_mve_vstrbq_scatter_offset_<supf><mode>_insn (ind, operands[1],
3735 (define_insn "mve_vstrbq_scatter_offset_<supf><mode>_insn"
3736 [(set (mem:BLK (scratch))
3738 [(match_operand:SI 0 "register_operand" "r")
3739 (match_operand:MVE_2 1 "s_register_operand" "w")
3740 (match_operand:MVE_2 2 "s_register_operand" "w")]
3743 "vstrb.<V_sz_elem>\t%q2, [%0, %q1]"
3744 [(set_attr "length" "4")])
3747 ;; [vstrwq_scatter_base_s vstrwq_scatter_base_u]
3749 (define_insn "mve_vstrwq_scatter_base_<supf>v4si"
3750 [(set (mem:BLK (scratch))
3752 [(match_operand:V4SI 0 "s_register_operand" "w")
3753 (match_operand:SI 1 "immediate_operand" "i")
3754 (match_operand:V4SI 2 "s_register_operand" "w")]
3760 ops[0] = operands[0];
3761 ops[1] = operands[1];
3762 ops[2] = operands[2];
3763 output_asm_insn("vstrw.u32\t%q2, [%q0, %1]",ops);
3766 [(set_attr "length" "4")])
3769 ;; [vldrbq_gather_offset_s vldrbq_gather_offset_u]
3771 (define_insn "mve_vldrbq_gather_offset_<supf><mode>"
3772 [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
3773 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
3774 (match_operand:MVE_2 2 "s_register_operand" "w")]
3780 ops[0] = operands[0];
3781 ops[1] = operands[1];
3782 ops[2] = operands[2];
3783 if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
3784 output_asm_insn ("vldrb.u8\t%q0, [%m1, %q2]",ops);
3786 output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3789 [(set_attr "length" "4")])
3792 ;; [vldrbq_s vldrbq_u]
3794 (define_insn "mve_vldrbq_<supf><mode>"
3795 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
3796 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")]
3802 int regno = REGNO (operands[0]);
3803 ops[0] = gen_rtx_REG (TImode, regno);
3804 ops[1] = operands[1];
3805 if (<V_sz_elem> == 8)
3806 output_asm_insn ("vldrb.<V_sz_elem>\t%q0, %E1",ops);
3808 output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, %E1",ops);
3811 [(set_attr "length" "4")])
3814 ;; [vldrwq_gather_base_s vldrwq_gather_base_u]
3816 (define_insn "mve_vldrwq_gather_base_<supf>v4si"
3817 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
3818 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
3819 (match_operand:SI 2 "immediate_operand" "i")]
3825 ops[0] = operands[0];
3826 ops[1] = operands[1];
3827 ops[2] = operands[2];
3828 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
3831 [(set_attr "length" "4")])
3834 ;; [vstrbq_scatter_offset_p_s vstrbq_scatter_offset_p_u]
3836 (define_expand "mve_vstrbq_scatter_offset_p_<supf><mode>"
3837 [(match_operand:<MVE_B_ELEM> 0 "mve_scatter_memory")
3838 (match_operand:MVE_2 1 "s_register_operand")
3839 (match_operand:MVE_2 2 "s_register_operand")
3840 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
3841 (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
3844 rtx ind = XEXP (operands[0], 0);
3845 gcc_assert (REG_P (ind));
3847 gen_mve_vstrbq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
3853 (define_insn "mve_vstrbq_scatter_offset_p_<supf><mode>_insn"
3854 [(set (mem:BLK (scratch))
3856 [(match_operand:SI 0 "register_operand" "r")
3857 (match_operand:MVE_2 1 "s_register_operand" "w")
3858 (match_operand:MVE_2 2 "s_register_operand" "w")
3859 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3862 "vpst\;vstrbt.<V_sz_elem>\t%q2, [%0, %q1]"
3863 [(set_attr "length" "8")])
3866 ;; [vstrwq_scatter_base_p_s vstrwq_scatter_base_p_u]
3868 (define_insn "mve_vstrwq_scatter_base_p_<supf>v4si"
3869 [(set (mem:BLK (scratch))
3871 [(match_operand:V4SI 0 "s_register_operand" "w")
3872 (match_operand:SI 1 "immediate_operand" "i")
3873 (match_operand:V4SI 2 "s_register_operand" "w")
3874 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
3880 ops[0] = operands[0];
3881 ops[1] = operands[1];
3882 ops[2] = operands[2];
3883 output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
3886 [(set_attr "length" "8")])
3888 (define_insn "mve_vstrbq_p_<supf><mode>"
3889 [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
3890 (unspec:<MVE_B_ELEM>
3891 [(match_operand:MVE_2 1 "s_register_operand" "w")
3892 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
3898 int regno = REGNO (operands[1]);
3899 ops[1] = gen_rtx_REG (TImode, regno);
3900 ops[0] = operands[0];
3901 output_asm_insn ("vpst\;vstrbt.<V_sz_elem>\t%q1, %E0",ops);
3904 [(set_attr "length" "8")])
3907 ;; [vldrbq_gather_offset_z_s vldrbq_gather_offset_z_u]
3909 (define_insn "mve_vldrbq_gather_offset_z_<supf><mode>"
3910 [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
3911 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
3912 (match_operand:MVE_2 2 "s_register_operand" "w")
3913 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
3919 ops[0] = operands[0];
3920 ops[1] = operands[1];
3921 ops[2] = operands[2];
3922 ops[3] = operands[3];
3923 if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
3924 output_asm_insn ("vpst\n\tvldrbt.u8\t%q0, [%m1, %q2]",ops);
3926 output_asm_insn ("vpst\n\tvldrbt.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3929 [(set_attr "length" "8")])
3932 ;; [vldrbq_z_s vldrbq_z_u]
3934 (define_insn "mve_vldrbq_z_<supf><mode>"
3935 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
3936 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")
3937 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
3943 int regno = REGNO (operands[0]);
3944 ops[0] = gen_rtx_REG (TImode, regno);
3945 ops[1] = operands[1];
3946 if (<V_sz_elem> == 8)
3947 output_asm_insn ("vpst\;vldrbt.<V_sz_elem>\t%q0, %E1",ops);
3949 output_asm_insn ("vpst\;vldrbt.<supf><V_sz_elem>\t%q0, %E1",ops);
3952 [(set_attr "length" "8")])
3955 ;; [vldrwq_gather_base_z_s vldrwq_gather_base_z_u]
3957 (define_insn "mve_vldrwq_gather_base_z_<supf>v4si"
3958 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
3959 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
3960 (match_operand:SI 2 "immediate_operand" "i")
3961 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
3967 ops[0] = operands[0];
3968 ops[1] = operands[1];
3969 ops[2] = operands[2];
3970 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
3973 [(set_attr "length" "8")])
3978 (define_insn "mve_vldrhq_fv8hf"
3979 [(set (match_operand:V8HF 0 "s_register_operand" "=w")
3980 (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")]
3983 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3986 int regno = REGNO (operands[0]);
3987 ops[0] = gen_rtx_REG (TImode, regno);
3988 ops[1] = operands[1];
3989 output_asm_insn ("vldrh.16\t%q0, %E1",ops);
3992 [(set_attr "length" "4")])
3995 ;; [vldrhq_gather_offset_s vldrhq_gather_offset_u]
3997 (define_insn "mve_vldrhq_gather_offset_<supf><mode>"
3998 [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
3999 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
4000 (match_operand:MVE_6 2 "s_register_operand" "w")]
4006 ops[0] = operands[0];
4007 ops[1] = operands[1];
4008 ops[2] = operands[2];
4009 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
4010 output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2]",ops);
4012 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
4015 [(set_attr "length" "4")])
4018 ;; [vldrhq_gather_offset_z_s vldrhq_gather_offset_z_u]
4020 (define_insn "mve_vldrhq_gather_offset_z_<supf><mode>"
4021 [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
4022 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
4023 (match_operand:MVE_6 2 "s_register_operand" "w")
4024 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
4030 ops[0] = operands[0];
4031 ops[1] = operands[1];
4032 ops[2] = operands[2];
4033 ops[3] = operands[3];
4034 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
4035 output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2]",ops);
4037 output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
4040 [(set_attr "length" "8")])
4043 ;; [vldrhq_gather_shifted_offset_s vldrhq_gather_shifted_offset_u]
4045 (define_insn "mve_vldrhq_gather_shifted_offset_<supf><mode>"
4046 [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
4047 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
4048 (match_operand:MVE_6 2 "s_register_operand" "w")]
4054 ops[0] = operands[0];
4055 ops[1] = operands[1];
4056 ops[2] = operands[2];
4057 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
4058 output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
4060 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
4063 [(set_attr "length" "4")])
4066 ;; [vldrhq_gather_shifted_offset_z_s vldrhq_gather_shited_offset_z_u]
4068 (define_insn "mve_vldrhq_gather_shifted_offset_z_<supf><mode>"
4069 [(set (match_operand:MVE_6 0 "s_register_operand" "=&w")
4070 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
4071 (match_operand:MVE_6 2 "s_register_operand" "w")
4072 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
4078 ops[0] = operands[0];
4079 ops[1] = operands[1];
4080 ops[2] = operands[2];
4081 ops[3] = operands[3];
4082 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
4083 output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
4085 output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
4088 [(set_attr "length" "8")])
4091 ;; [vldrhq_s, vldrhq_u]
4093 (define_insn "mve_vldrhq_<supf><mode>"
4094 [(set (match_operand:MVE_6 0 "s_register_operand" "=w")
4095 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")]
4101 int regno = REGNO (operands[0]);
4102 ops[0] = gen_rtx_REG (TImode, regno);
4103 ops[1] = operands[1];
4104 if (<V_sz_elem> == 16)
4105 output_asm_insn ("vldrh.16\t%q0, %E1",ops);
4107 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, %E1",ops);
4110 [(set_attr "length" "4")])
4115 (define_insn "mve_vldrhq_z_fv8hf"
4116 [(set (match_operand:V8HF 0 "s_register_operand" "=w")
4117 (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")
4118 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
4121 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4124 int regno = REGNO (operands[0]);
4125 ops[0] = gen_rtx_REG (TImode, regno);
4126 ops[1] = operands[1];
4127 output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
4130 [(set_attr "length" "8")])
4133 ;; [vldrhq_z_s vldrhq_z_u]
4135 (define_insn "mve_vldrhq_z_<supf><mode>"
4136 [(set (match_operand:MVE_6 0 "s_register_operand" "=w")
4137 (unspec:MVE_6 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")
4138 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
4144 int regno = REGNO (operands[0]);
4145 ops[0] = gen_rtx_REG (TImode, regno);
4146 ops[1] = operands[1];
4147 if (<V_sz_elem> == 16)
4148 output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
4150 output_asm_insn ("vpst\;vldrht.<supf><V_sz_elem>\t%q0, %E1",ops);
4153 [(set_attr "length" "8")])
4158 (define_insn "mve_vldrwq_fv4sf"
4159 [(set (match_operand:V4SF 0 "s_register_operand" "=w")
4160 (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
4163 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4166 int regno = REGNO (operands[0]);
4167 ops[0] = gen_rtx_REG (TImode, regno);
4168 ops[1] = operands[1];
4169 output_asm_insn ("vldrw.32\t%q0, %E1",ops);
4172 [(set_attr "length" "4")])
4175 ;; [vldrwq_s vldrwq_u]
4177 (define_insn "mve_vldrwq_<supf>v4si"
4178 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
4179 (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
4185 int regno = REGNO (operands[0]);
4186 ops[0] = gen_rtx_REG (TImode, regno);
4187 ops[1] = operands[1];
4188 output_asm_insn ("vldrw.32\t%q0, %E1",ops);
4191 [(set_attr "length" "4")])
4196 (define_insn "mve_vldrwq_z_fv4sf"
4197 [(set (match_operand:V4SF 0 "s_register_operand" "=w")
4198 (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
4199 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
4202 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4205 int regno = REGNO (operands[0]);
4206 ops[0] = gen_rtx_REG (TImode, regno);
4207 ops[1] = operands[1];
4208 output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
4211 [(set_attr "length" "8")])
4214 ;; [vldrwq_z_s vldrwq_z_u]
4216 (define_insn "mve_vldrwq_z_<supf>v4si"
4217 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
4218 (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
4219 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
4225 int regno = REGNO (operands[0]);
4226 ops[0] = gen_rtx_REG (TImode, regno);
4227 ops[1] = operands[1];
4228 output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
4231 [(set_attr "length" "8")])
4233 (define_expand "mve_vld1q_f<mode>"
4234 [(match_operand:MVE_0 0 "s_register_operand")
4235 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "mve_memory_operand")] VLD1Q_F)
4237 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
4239 emit_insn (gen_mve_vldr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
4243 (define_expand "mve_vld1q_<supf><mode>"
4244 [(match_operand:MVE_2 0 "s_register_operand")
4245 (unspec:MVE_2 [(match_operand:MVE_2 1 "mve_memory_operand")] VLD1Q)
4249 emit_insn (gen_mve_vldr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
4254 ;; [vldrdq_gather_base_s vldrdq_gather_base_u]
4256 (define_insn "mve_vldrdq_gather_base_<supf>v2di"
4257 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4258 (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
4259 (match_operand:SI 2 "immediate_operand" "i")]
4265 ops[0] = operands[0];
4266 ops[1] = operands[1];
4267 ops[2] = operands[2];
4268 output_asm_insn ("vldrd.64\t%q0, [%q1, %2]",ops);
4271 [(set_attr "length" "4")])
4274 ;; [vldrdq_gather_base_z_s vldrdq_gather_base_z_u]
4276 (define_insn "mve_vldrdq_gather_base_z_<supf>v2di"
4277 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4278 (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
4279 (match_operand:SI 2 "immediate_operand" "i")
4280 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4286 ops[0] = operands[0];
4287 ops[1] = operands[1];
4288 ops[2] = operands[2];
4289 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%q1, %2]",ops);
4292 [(set_attr "length" "8")])
4295 ;; [vldrdq_gather_offset_s vldrdq_gather_offset_u]
4297 (define_insn "mve_vldrdq_gather_offset_<supf>v2di"
4298 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4299 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
4300 (match_operand:V2DI 2 "s_register_operand" "w")]
4306 ops[0] = operands[0];
4307 ops[1] = operands[1];
4308 ops[2] = operands[2];
4309 output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2]",ops);
4312 [(set_attr "length" "4")])
4315 ;; [vldrdq_gather_offset_z_s vldrdq_gather_offset_z_u]
4317 (define_insn "mve_vldrdq_gather_offset_z_<supf>v2di"
4318 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4319 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
4320 (match_operand:V2DI 2 "s_register_operand" "w")
4321 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4327 ops[0] = operands[0];
4328 ops[1] = operands[1];
4329 ops[2] = operands[2];
4330 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2]",ops);
4333 [(set_attr "length" "8")])
4336 ;; [vldrdq_gather_shifted_offset_s vldrdq_gather_shifted_offset_u]
4338 (define_insn "mve_vldrdq_gather_shifted_offset_<supf>v2di"
4339 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4340 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
4341 (match_operand:V2DI 2 "s_register_operand" "w")]
4347 ops[0] = operands[0];
4348 ops[1] = operands[1];
4349 ops[2] = operands[2];
4350 output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
4353 [(set_attr "length" "4")])
4356 ;; [vldrdq_gather_shifted_offset_z_s vldrdq_gather_shifted_offset_z_u]
4358 (define_insn "mve_vldrdq_gather_shifted_offset_z_<supf>v2di"
4359 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
4360 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
4361 (match_operand:V2DI 2 "s_register_operand" "w")
4362 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4368 ops[0] = operands[0];
4369 ops[1] = operands[1];
4370 ops[2] = operands[2];
4371 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
4374 [(set_attr "length" "8")])
4377 ;; [vldrhq_gather_offset_f]
4379 (define_insn "mve_vldrhq_gather_offset_fv8hf"
4380 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
4381 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
4382 (match_operand:V8HI 2 "s_register_operand" "w")]
4385 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4388 ops[0] = operands[0];
4389 ops[1] = operands[1];
4390 ops[2] = operands[2];
4391 output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2]",ops);
4394 [(set_attr "length" "4")])
4397 ;; [vldrhq_gather_offset_z_f]
4399 (define_insn "mve_vldrhq_gather_offset_z_fv8hf"
4400 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
4401 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
4402 (match_operand:V8HI 2 "s_register_operand" "w")
4403 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
4406 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4409 ops[0] = operands[0];
4410 ops[1] = operands[1];
4411 ops[2] = operands[2];
4412 ops[3] = operands[3];
4413 output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2]",ops);
4416 [(set_attr "length" "8")])
4419 ;; [vldrhq_gather_shifted_offset_f]
4421 (define_insn "mve_vldrhq_gather_shifted_offset_fv8hf"
4422 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
4423 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
4424 (match_operand:V8HI 2 "s_register_operand" "w")]
4427 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4430 ops[0] = operands[0];
4431 ops[1] = operands[1];
4432 ops[2] = operands[2];
4433 output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
4436 [(set_attr "length" "4")])
4439 ;; [vldrhq_gather_shifted_offset_z_f]
4441 (define_insn "mve_vldrhq_gather_shifted_offset_z_fv8hf"
4442 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
4443 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
4444 (match_operand:V8HI 2 "s_register_operand" "w")
4445 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
4448 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4451 ops[0] = operands[0];
4452 ops[1] = operands[1];
4453 ops[2] = operands[2];
4454 ops[3] = operands[3];
4455 output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
4458 [(set_attr "length" "8")])
4461 ;; [vldrwq_gather_base_f]
4463 (define_insn "mve_vldrwq_gather_base_fv4sf"
4464 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4465 (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
4466 (match_operand:SI 2 "immediate_operand" "i")]
4469 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4472 ops[0] = operands[0];
4473 ops[1] = operands[1];
4474 ops[2] = operands[2];
4475 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
4478 [(set_attr "length" "4")])
4481 ;; [vldrwq_gather_base_z_f]
4483 (define_insn "mve_vldrwq_gather_base_z_fv4sf"
4484 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4485 (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
4486 (match_operand:SI 2 "immediate_operand" "i")
4487 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4490 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4493 ops[0] = operands[0];
4494 ops[1] = operands[1];
4495 ops[2] = operands[2];
4496 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
4499 [(set_attr "length" "8")])
4502 ;; [vldrwq_gather_offset_f]
4504 (define_insn "mve_vldrwq_gather_offset_fv4sf"
4505 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4506 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4507 (match_operand:V4SI 2 "s_register_operand" "w")]
4510 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4513 ops[0] = operands[0];
4514 ops[1] = operands[1];
4515 ops[2] = operands[2];
4516 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
4519 [(set_attr "length" "4")])
4522 ;; [vldrwq_gather_offset_s vldrwq_gather_offset_u]
4524 (define_insn "mve_vldrwq_gather_offset_<supf>v4si"
4525 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4526 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4527 (match_operand:V4SI 2 "s_register_operand" "w")]
4533 ops[0] = operands[0];
4534 ops[1] = operands[1];
4535 ops[2] = operands[2];
4536 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
4539 [(set_attr "length" "4")])
4542 ;; [vldrwq_gather_offset_z_f]
4544 (define_insn "mve_vldrwq_gather_offset_z_fv4sf"
4545 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4546 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4547 (match_operand:V4SI 2 "s_register_operand" "w")
4548 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4551 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4554 ops[0] = operands[0];
4555 ops[1] = operands[1];
4556 ops[2] = operands[2];
4557 ops[3] = operands[3];
4558 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
4561 [(set_attr "length" "8")])
4564 ;; [vldrwq_gather_offset_z_s vldrwq_gather_offset_z_u]
4566 (define_insn "mve_vldrwq_gather_offset_z_<supf>v4si"
4567 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4568 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4569 (match_operand:V4SI 2 "s_register_operand" "w")
4570 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4576 ops[0] = operands[0];
4577 ops[1] = operands[1];
4578 ops[2] = operands[2];
4579 ops[3] = operands[3];
4580 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
4583 [(set_attr "length" "8")])
4586 ;; [vldrwq_gather_shifted_offset_f]
4588 (define_insn "mve_vldrwq_gather_shifted_offset_fv4sf"
4589 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4590 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4591 (match_operand:V4SI 2 "s_register_operand" "w")]
4594 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4597 ops[0] = operands[0];
4598 ops[1] = operands[1];
4599 ops[2] = operands[2];
4600 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4603 [(set_attr "length" "4")])
4606 ;; [vldrwq_gather_shifted_offset_s vldrwq_gather_shifted_offset_u]
4608 (define_insn "mve_vldrwq_gather_shifted_offset_<supf>v4si"
4609 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4610 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4611 (match_operand:V4SI 2 "s_register_operand" "w")]
4617 ops[0] = operands[0];
4618 ops[1] = operands[1];
4619 ops[2] = operands[2];
4620 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4623 [(set_attr "length" "4")])
4626 ;; [vldrwq_gather_shifted_offset_z_f]
4628 (define_insn "mve_vldrwq_gather_shifted_offset_z_fv4sf"
4629 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4630 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4631 (match_operand:V4SI 2 "s_register_operand" "w")
4632 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4635 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4638 ops[0] = operands[0];
4639 ops[1] = operands[1];
4640 ops[2] = operands[2];
4641 ops[3] = operands[3];
4642 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4645 [(set_attr "length" "8")])
4648 ;; [vldrwq_gather_shifted_offset_z_s vldrwq_gather_shifted_offset_z_u]
4650 (define_insn "mve_vldrwq_gather_shifted_offset_z_<supf>v4si"
4651 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4652 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4653 (match_operand:V4SI 2 "s_register_operand" "w")
4654 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4660 ops[0] = operands[0];
4661 ops[1] = operands[1];
4662 ops[2] = operands[2];
4663 ops[3] = operands[3];
4664 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4667 [(set_attr "length" "8")])
4672 (define_insn "mve_vstrhq_fv8hf"
4673 [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
4674 (unspec:V8HI [(match_operand:V8HF 1 "s_register_operand" "w")]
4677 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4680 int regno = REGNO (operands[1]);
4681 ops[1] = gen_rtx_REG (TImode, regno);
4682 ops[0] = operands[0];
4683 output_asm_insn ("vstrh.16\t%q1, %E0",ops);
4686 [(set_attr "length" "4")])
4691 (define_insn "mve_vstrhq_p_fv8hf"
4692 [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
4694 [(match_operand:V8HF 1 "s_register_operand" "w")
4695 (match_operand:V8BI 2 "vpr_register_operand" "Up")
4698 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4701 int regno = REGNO (operands[1]);
4702 ops[1] = gen_rtx_REG (TImode, regno);
4703 ops[0] = operands[0];
4704 output_asm_insn ("vpst\;vstrht.16\t%q1, %E0",ops);
4707 [(set_attr "length" "8")])
4710 ;; [vstrhq_p_s vstrhq_p_u]
4712 (define_insn "mve_vstrhq_p_<supf><mode>"
4713 [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
4714 (unspec:<MVE_H_ELEM>
4715 [(match_operand:MVE_6 1 "s_register_operand" "w")
4716 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
4723 int regno = REGNO (operands[1]);
4724 ops[1] = gen_rtx_REG (TImode, regno);
4725 ops[0] = operands[0];
4726 output_asm_insn ("vpst\;vstrht.<V_sz_elem>\t%q1, %E0",ops);
4729 [(set_attr "length" "8")])
4732 ;; [vstrhq_scatter_offset_p_s vstrhq_scatter_offset_p_u]
4734 (define_expand "mve_vstrhq_scatter_offset_p_<supf><mode>"
4735 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
4736 (match_operand:MVE_6 1 "s_register_operand")
4737 (match_operand:MVE_6 2 "s_register_operand")
4738 (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
4739 (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
4742 rtx ind = XEXP (operands[0], 0);
4743 gcc_assert (REG_P (ind));
4745 gen_mve_vstrhq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
4751 (define_insn "mve_vstrhq_scatter_offset_p_<supf><mode>_insn"
4752 [(set (mem:BLK (scratch))
4754 [(match_operand:SI 0 "register_operand" "r")
4755 (match_operand:MVE_6 1 "s_register_operand" "w")
4756 (match_operand:MVE_6 2 "s_register_operand" "w")
4757 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4760 "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1]"
4761 [(set_attr "length" "8")])
4764 ;; [vstrhq_scatter_offset_s vstrhq_scatter_offset_u]
4766 (define_expand "mve_vstrhq_scatter_offset_<supf><mode>"
4767 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
4768 (match_operand:MVE_6 1 "s_register_operand")
4769 (match_operand:MVE_6 2 "s_register_operand")
4770 (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
4773 rtx ind = XEXP (operands[0], 0);
4774 gcc_assert (REG_P (ind));
4775 emit_insn (gen_mve_vstrhq_scatter_offset_<supf><mode>_insn (ind, operands[1],
4780 (define_insn "mve_vstrhq_scatter_offset_<supf><mode>_insn"
4781 [(set (mem:BLK (scratch))
4783 [(match_operand:SI 0 "register_operand" "r")
4784 (match_operand:MVE_6 1 "s_register_operand" "w")
4785 (match_operand:MVE_6 2 "s_register_operand" "w")]
4788 "vstrh.<V_sz_elem>\t%q2, [%0, %q1]"
4789 [(set_attr "length" "4")])
4792 ;; [vstrhq_scatter_shifted_offset_p_s vstrhq_scatter_shifted_offset_p_u]
4794 (define_expand "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>"
4795 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
4796 (match_operand:MVE_6 1 "s_register_operand")
4797 (match_operand:MVE_6 2 "s_register_operand")
4798 (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
4799 (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
4802 rtx ind = XEXP (operands[0], 0);
4803 gcc_assert (REG_P (ind));
4805 gen_mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn (ind, operands[1],
4811 (define_insn "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn"
4812 [(set (mem:BLK (scratch))
4814 [(match_operand:SI 0 "register_operand" "r")
4815 (match_operand:MVE_6 1 "s_register_operand" "w")
4816 (match_operand:MVE_6 2 "s_register_operand" "w")
4817 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
4820 "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
4821 [(set_attr "length" "8")])
4824 ;; [vstrhq_scatter_shifted_offset_s vstrhq_scatter_shifted_offset_u]
4826 (define_expand "mve_vstrhq_scatter_shifted_offset_<supf><mode>"
4827 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
4828 (match_operand:MVE_6 1 "s_register_operand")
4829 (match_operand:MVE_6 2 "s_register_operand")
4830 (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
4833 rtx ind = XEXP (operands[0], 0);
4834 gcc_assert (REG_P (ind));
4836 gen_mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn (ind, operands[1],
4841 (define_insn "mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn"
4842 [(set (mem:BLK (scratch))
4844 [(match_operand:SI 0 "register_operand" "r")
4845 (match_operand:MVE_6 1 "s_register_operand" "w")
4846 (match_operand:MVE_6 2 "s_register_operand" "w")]
4849 "vstrh.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
4850 [(set_attr "length" "4")])
4853 ;; [vstrhq_s, vstrhq_u]
4855 (define_insn "mve_vstrhq_<supf><mode>"
4856 [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
4857 (unspec:<MVE_H_ELEM> [(match_operand:MVE_6 1 "s_register_operand" "w")]
4863 int regno = REGNO (operands[1]);
4864 ops[1] = gen_rtx_REG (TImode, regno);
4865 ops[0] = operands[0];
4866 output_asm_insn ("vstrh.<V_sz_elem>\t%q1, %E0",ops);
4869 [(set_attr "length" "4")])
4874 (define_insn "mve_vstrwq_fv4sf"
4875 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
4876 (unspec:V4SI [(match_operand:V4SF 1 "s_register_operand" "w")]
4879 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4882 int regno = REGNO (operands[1]);
4883 ops[1] = gen_rtx_REG (TImode, regno);
4884 ops[0] = operands[0];
4885 output_asm_insn ("vstrw.32\t%q1, %E0",ops);
4888 [(set_attr "length" "4")])
4893 (define_insn "mve_vstrwq_p_fv4sf"
4894 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
4896 [(match_operand:V4SF 1 "s_register_operand" "w")
4897 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
4900 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4903 int regno = REGNO (operands[1]);
4904 ops[1] = gen_rtx_REG (TImode, regno);
4905 ops[0] = operands[0];
4906 output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
4909 [(set_attr "length" "8")])
4912 ;; [vstrwq_p_s vstrwq_p_u]
4914 (define_insn "mve_vstrwq_p_<supf>v4si"
4915 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
4917 [(match_operand:V4SI 1 "s_register_operand" "w")
4918 (match_operand:V4BI 2 "vpr_register_operand" "Up")
4924 int regno = REGNO (operands[1]);
4925 ops[1] = gen_rtx_REG (TImode, regno);
4926 ops[0] = operands[0];
4927 output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
4930 [(set_attr "length" "8")])
4933 ;; [vstrwq_s vstrwq_u]
4935 (define_insn "mve_vstrwq_<supf>v4si"
4936 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
4937 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")]
4943 int regno = REGNO (operands[1]);
4944 ops[1] = gen_rtx_REG (TImode, regno);
4945 ops[0] = operands[0];
4946 output_asm_insn ("vstrw.32\t%q1, %E0",ops);
4949 [(set_attr "length" "4")])
4951 (define_expand "mve_vst1q_f<mode>"
4952 [(match_operand:<MVE_CNVT> 0 "mve_memory_operand")
4953 (unspec:<MVE_CNVT> [(match_operand:MVE_0 1 "s_register_operand")] VST1Q_F)
4955 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
4957 emit_insn (gen_mve_vstr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
4961 (define_expand "mve_vst1q_<supf><mode>"
4962 [(match_operand:MVE_2 0 "mve_memory_operand")
4963 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand")] VST1Q)
4967 emit_insn (gen_mve_vstr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
4972 ;; [vstrdq_scatter_base_p_s vstrdq_scatter_base_p_u]
4974 (define_insn "mve_vstrdq_scatter_base_p_<supf>v2di"
4975 [(set (mem:BLK (scratch))
4977 [(match_operand:V2DI 0 "s_register_operand" "w")
4978 (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
4979 (match_operand:V2DI 2 "s_register_operand" "w")
4980 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4986 ops[0] = operands[0];
4987 ops[1] = operands[1];
4988 ops[2] = operands[2];
4989 output_asm_insn ("vpst\;\tvstrdt.u64\t%q2, [%q0, %1]",ops);
4992 [(set_attr "length" "8")])
4995 ;; [vstrdq_scatter_base_s vstrdq_scatter_base_u]
4997 (define_insn "mve_vstrdq_scatter_base_<supf>v2di"
4998 [(set (mem:BLK (scratch))
5000 [(match_operand:V2DI 0 "s_register_operand" "=w")
5001 (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
5002 (match_operand:V2DI 2 "s_register_operand" "w")]
5008 ops[0] = operands[0];
5009 ops[1] = operands[1];
5010 ops[2] = operands[2];
5011 output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]",ops);
5014 [(set_attr "length" "4")])
5017 ;; [vstrdq_scatter_offset_p_s vstrdq_scatter_offset_p_u]
5019 (define_expand "mve_vstrdq_scatter_offset_p_<supf>v2di"
5020 [(match_operand:V2DI 0 "mve_scatter_memory")
5021 (match_operand:V2DI 1 "s_register_operand")
5022 (match_operand:V2DI 2 "s_register_operand")
5023 (match_operand:V2QI 3 "vpr_register_operand")
5024 (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
5027 rtx ind = XEXP (operands[0], 0);
5028 gcc_assert (REG_P (ind));
5029 emit_insn (gen_mve_vstrdq_scatter_offset_p_<supf>v2di_insn (ind, operands[1],
5035 (define_insn "mve_vstrdq_scatter_offset_p_<supf>v2di_insn"
5036 [(set (mem:BLK (scratch))
5038 [(match_operand:SI 0 "register_operand" "r")
5039 (match_operand:V2DI 1 "s_register_operand" "w")
5040 (match_operand:V2DI 2 "s_register_operand" "w")
5041 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
5044 "vpst\;vstrdt.64\t%q2, [%0, %q1]"
5045 [(set_attr "length" "8")])
5048 ;; [vstrdq_scatter_offset_s vstrdq_scatter_offset_u]
5050 (define_expand "mve_vstrdq_scatter_offset_<supf>v2di"
5051 [(match_operand:V2DI 0 "mve_scatter_memory")
5052 (match_operand:V2DI 1 "s_register_operand")
5053 (match_operand:V2DI 2 "s_register_operand")
5054 (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
5057 rtx ind = XEXP (operands[0], 0);
5058 gcc_assert (REG_P (ind));
5059 emit_insn (gen_mve_vstrdq_scatter_offset_<supf>v2di_insn (ind, operands[1],
5064 (define_insn "mve_vstrdq_scatter_offset_<supf>v2di_insn"
5065 [(set (mem:BLK (scratch))
5067 [(match_operand:SI 0 "register_operand" "r")
5068 (match_operand:V2DI 1 "s_register_operand" "w")
5069 (match_operand:V2DI 2 "s_register_operand" "w")]
5072 "vstrd.64\t%q2, [%0, %q1]"
5073 [(set_attr "length" "4")])
5076 ;; [vstrdq_scatter_shifted_offset_p_s vstrdq_scatter_shifted_offset_p_u]
5078 (define_expand "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di"
5079 [(match_operand:V2DI 0 "mve_scatter_memory")
5080 (match_operand:V2DI 1 "s_register_operand")
5081 (match_operand:V2DI 2 "s_register_operand")
5082 (match_operand:V2QI 3 "vpr_register_operand")
5083 (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
5086 rtx ind = XEXP (operands[0], 0);
5087 gcc_assert (REG_P (ind));
5089 gen_mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn (ind, operands[1],
5095 (define_insn "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn"
5096 [(set (mem:BLK (scratch))
5098 [(match_operand:SI 0 "register_operand" "r")
5099 (match_operand:V2DI 1 "s_register_operand" "w")
5100 (match_operand:V2DI 2 "s_register_operand" "w")
5101 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
5104 "vpst\;vstrdt.64\t%q2, [%0, %q1, UXTW #3]"
5105 [(set_attr "length" "8")])
5108 ;; [vstrdq_scatter_shifted_offset_s vstrdq_scatter_shifted_offset_u]
5110 (define_expand "mve_vstrdq_scatter_shifted_offset_<supf>v2di"
5111 [(match_operand:V2DI 0 "mve_scatter_memory")
5112 (match_operand:V2DI 1 "s_register_operand")
5113 (match_operand:V2DI 2 "s_register_operand")
5114 (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
5117 rtx ind = XEXP (operands[0], 0);
5118 gcc_assert (REG_P (ind));
5120 gen_mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn (ind, operands[1],
5125 (define_insn "mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn"
5126 [(set (mem:BLK (scratch))
5128 [(match_operand:SI 0 "register_operand" "r")
5129 (match_operand:V2DI 1 "s_register_operand" "w")
5130 (match_operand:V2DI 2 "s_register_operand" "w")]
5133 "vstrd.64\t%q2, [%0, %q1, UXTW #3]"
5134 [(set_attr "length" "4")])
5137 ;; [vstrhq_scatter_offset_f]
5139 (define_expand "mve_vstrhq_scatter_offset_fv8hf"
5140 [(match_operand:V8HI 0 "mve_scatter_memory")
5141 (match_operand:V8HI 1 "s_register_operand")
5142 (match_operand:V8HF 2 "s_register_operand")
5143 (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
5144 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5146 rtx ind = XEXP (operands[0], 0);
5147 gcc_assert (REG_P (ind));
5148 emit_insn (gen_mve_vstrhq_scatter_offset_fv8hf_insn (ind, operands[1],
5153 (define_insn "mve_vstrhq_scatter_offset_fv8hf_insn"
5154 [(set (mem:BLK (scratch))
5156 [(match_operand:SI 0 "register_operand" "r")
5157 (match_operand:V8HI 1 "s_register_operand" "w")
5158 (match_operand:V8HF 2 "s_register_operand" "w")]
5160 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5161 "vstrh.16\t%q2, [%0, %q1]"
5162 [(set_attr "length" "4")])
5165 ;; [vstrhq_scatter_offset_p_f]
5167 (define_expand "mve_vstrhq_scatter_offset_p_fv8hf"
5168 [(match_operand:V8HI 0 "mve_scatter_memory")
5169 (match_operand:V8HI 1 "s_register_operand")
5170 (match_operand:V8HF 2 "s_register_operand")
5171 (match_operand:V8BI 3 "vpr_register_operand")
5172 (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
5173 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5175 rtx ind = XEXP (operands[0], 0);
5176 gcc_assert (REG_P (ind));
5177 emit_insn (gen_mve_vstrhq_scatter_offset_p_fv8hf_insn (ind, operands[1],
5183 (define_insn "mve_vstrhq_scatter_offset_p_fv8hf_insn"
5184 [(set (mem:BLK (scratch))
5186 [(match_operand:SI 0 "register_operand" "r")
5187 (match_operand:V8HI 1 "s_register_operand" "w")
5188 (match_operand:V8HF 2 "s_register_operand" "w")
5189 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
5191 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5192 "vpst\;vstrht.16\t%q2, [%0, %q1]"
5193 [(set_attr "length" "8")])
5196 ;; [vstrhq_scatter_shifted_offset_f]
5198 (define_expand "mve_vstrhq_scatter_shifted_offset_fv8hf"
5199 [(match_operand:V8HI 0 "memory_operand" "=Us")
5200 (match_operand:V8HI 1 "s_register_operand" "w")
5201 (match_operand:V8HF 2 "s_register_operand" "w")
5202 (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
5203 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5205 rtx ind = XEXP (operands[0], 0);
5206 gcc_assert (REG_P (ind));
5207 emit_insn (gen_mve_vstrhq_scatter_shifted_offset_fv8hf_insn (ind, operands[1],
5212 (define_insn "mve_vstrhq_scatter_shifted_offset_fv8hf_insn"
5213 [(set (mem:BLK (scratch))
5215 [(match_operand:SI 0 "register_operand" "r")
5216 (match_operand:V8HI 1 "s_register_operand" "w")
5217 (match_operand:V8HF 2 "s_register_operand" "w")]
5219 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5220 "vstrh.16\t%q2, [%0, %q1, uxtw #1]"
5221 [(set_attr "length" "4")])
5224 ;; [vstrhq_scatter_shifted_offset_p_f]
5226 (define_expand "mve_vstrhq_scatter_shifted_offset_p_fv8hf"
5227 [(match_operand:V8HI 0 "memory_operand" "=Us")
5228 (match_operand:V8HI 1 "s_register_operand" "w")
5229 (match_operand:V8HF 2 "s_register_operand" "w")
5230 (match_operand:V8BI 3 "vpr_register_operand" "Up")
5231 (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
5232 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5234 rtx ind = XEXP (operands[0], 0);
5235 gcc_assert (REG_P (ind));
5237 gen_mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn (ind, operands[1],
5243 (define_insn "mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn"
5244 [(set (mem:BLK (scratch))
5246 [(match_operand:SI 0 "register_operand" "r")
5247 (match_operand:V8HI 1 "s_register_operand" "w")
5248 (match_operand:V8HF 2 "s_register_operand" "w")
5249 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
5251 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5252 "vpst\;vstrht.16\t%q2, [%0, %q1, uxtw #1]"
5253 [(set_attr "length" "8")])
5256 ;; [vstrwq_scatter_base_f]
5258 (define_insn "mve_vstrwq_scatter_base_fv4sf"
5259 [(set (mem:BLK (scratch))
5261 [(match_operand:V4SI 0 "s_register_operand" "w")
5262 (match_operand:SI 1 "immediate_operand" "i")
5263 (match_operand:V4SF 2 "s_register_operand" "w")]
5266 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5269 ops[0] = operands[0];
5270 ops[1] = operands[1];
5271 ops[2] = operands[2];
5272 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]",ops);
5275 [(set_attr "length" "4")])
5278 ;; [vstrwq_scatter_base_p_f]
5280 (define_insn "mve_vstrwq_scatter_base_p_fv4sf"
5281 [(set (mem:BLK (scratch))
5283 [(match_operand:V4SI 0 "s_register_operand" "w")
5284 (match_operand:SI 1 "immediate_operand" "i")
5285 (match_operand:V4SF 2 "s_register_operand" "w")
5286 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
5289 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5292 ops[0] = operands[0];
5293 ops[1] = operands[1];
5294 ops[2] = operands[2];
5295 output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
5298 [(set_attr "length" "8")])
5301 ;; [vstrwq_scatter_offset_f]
5303 (define_expand "mve_vstrwq_scatter_offset_fv4sf"
5304 [(match_operand:V4SI 0 "mve_scatter_memory")
5305 (match_operand:V4SI 1 "s_register_operand")
5306 (match_operand:V4SF 2 "s_register_operand")
5307 (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
5308 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5310 rtx ind = XEXP (operands[0], 0);
5311 gcc_assert (REG_P (ind));
5312 emit_insn (gen_mve_vstrwq_scatter_offset_fv4sf_insn (ind, operands[1],
5317 (define_insn "mve_vstrwq_scatter_offset_fv4sf_insn"
5318 [(set (mem:BLK (scratch))
5320 [(match_operand:SI 0 "register_operand" "r")
5321 (match_operand:V4SI 1 "s_register_operand" "w")
5322 (match_operand:V4SF 2 "s_register_operand" "w")]
5324 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5325 "vstrw.32\t%q2, [%0, %q1]"
5326 [(set_attr "length" "4")])
5329 ;; [vstrwq_scatter_offset_p_f]
5331 (define_expand "mve_vstrwq_scatter_offset_p_fv4sf"
5332 [(match_operand:V4SI 0 "mve_scatter_memory")
5333 (match_operand:V4SI 1 "s_register_operand")
5334 (match_operand:V4SF 2 "s_register_operand")
5335 (match_operand:V4BI 3 "vpr_register_operand")
5336 (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
5337 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5339 rtx ind = XEXP (operands[0], 0);
5340 gcc_assert (REG_P (ind));
5341 emit_insn (gen_mve_vstrwq_scatter_offset_p_fv4sf_insn (ind, operands[1],
5347 (define_insn "mve_vstrwq_scatter_offset_p_fv4sf_insn"
5348 [(set (mem:BLK (scratch))
5350 [(match_operand:SI 0 "register_operand" "r")
5351 (match_operand:V4SI 1 "s_register_operand" "w")
5352 (match_operand:V4SF 2 "s_register_operand" "w")
5353 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
5355 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5356 "vpst\;vstrwt.32\t%q2, [%0, %q1]"
5357 [(set_attr "length" "8")])
5360 ;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
5362 (define_expand "mve_vstrwq_scatter_offset_p_<supf>v4si"
5363 [(match_operand:V4SI 0 "mve_scatter_memory")
5364 (match_operand:V4SI 1 "s_register_operand")
5365 (match_operand:V4SI 2 "s_register_operand")
5366 (match_operand:V4BI 3 "vpr_register_operand")
5367 (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
5370 rtx ind = XEXP (operands[0], 0);
5371 gcc_assert (REG_P (ind));
5372 emit_insn (gen_mve_vstrwq_scatter_offset_p_<supf>v4si_insn (ind, operands[1],
5378 (define_insn "mve_vstrwq_scatter_offset_p_<supf>v4si_insn"
5379 [(set (mem:BLK (scratch))
5381 [(match_operand:SI 0 "register_operand" "r")
5382 (match_operand:V4SI 1 "s_register_operand" "w")
5383 (match_operand:V4SI 2 "s_register_operand" "w")
5384 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
5387 "vpst\;vstrwt.32\t%q2, [%0, %q1]"
5388 [(set_attr "length" "8")])
5391 ;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
5393 (define_expand "mve_vstrwq_scatter_offset_<supf>v4si"
5394 [(match_operand:V4SI 0 "mve_scatter_memory")
5395 (match_operand:V4SI 1 "s_register_operand")
5396 (match_operand:V4SI 2 "s_register_operand")
5397 (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
5400 rtx ind = XEXP (operands[0], 0);
5401 gcc_assert (REG_P (ind));
5402 emit_insn (gen_mve_vstrwq_scatter_offset_<supf>v4si_insn (ind, operands[1],
5407 (define_insn "mve_vstrwq_scatter_offset_<supf>v4si_insn"
5408 [(set (mem:BLK (scratch))
5410 [(match_operand:SI 0 "register_operand" "r")
5411 (match_operand:V4SI 1 "s_register_operand" "w")
5412 (match_operand:V4SI 2 "s_register_operand" "w")]
5415 "vstrw.32\t%q2, [%0, %q1]"
5416 [(set_attr "length" "4")])
5419 ;; [vstrwq_scatter_shifted_offset_f]
5421 (define_expand "mve_vstrwq_scatter_shifted_offset_fv4sf"
5422 [(match_operand:V4SI 0 "mve_scatter_memory")
5423 (match_operand:V4SI 1 "s_register_operand")
5424 (match_operand:V4SF 2 "s_register_operand")
5425 (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
5426 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5428 rtx ind = XEXP (operands[0], 0);
5429 gcc_assert (REG_P (ind));
5430 emit_insn (gen_mve_vstrwq_scatter_shifted_offset_fv4sf_insn (ind, operands[1],
5435 (define_insn "mve_vstrwq_scatter_shifted_offset_fv4sf_insn"
5436 [(set (mem:BLK (scratch))
5438 [(match_operand:SI 0 "register_operand" "r")
5439 (match_operand:V4SI 1 "s_register_operand" "w")
5440 (match_operand:V4SF 2 "s_register_operand" "w")]
5442 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5443 "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
5444 [(set_attr "length" "8")])
5447 ;; [vstrwq_scatter_shifted_offset_p_f]
5449 (define_expand "mve_vstrwq_scatter_shifted_offset_p_fv4sf"
5450 [(match_operand:V4SI 0 "mve_scatter_memory")
5451 (match_operand:V4SI 1 "s_register_operand")
5452 (match_operand:V4SF 2 "s_register_operand")
5453 (match_operand:V4BI 3 "vpr_register_operand")
5454 (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
5455 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5457 rtx ind = XEXP (operands[0], 0);
5458 gcc_assert (REG_P (ind));
5460 gen_mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn (ind, operands[1],
5466 (define_insn "mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn"
5467 [(set (mem:BLK (scratch))
5469 [(match_operand:SI 0 "register_operand" "r")
5470 (match_operand:V4SI 1 "s_register_operand" "w")
5471 (match_operand:V4SF 2 "s_register_operand" "w")
5472 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
5474 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5475 "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
5476 [(set_attr "length" "8")])
5479 ;; [vstrwq_scatter_shifted_offset_p_s vstrwq_scatter_shifted_offset_p_u]
5481 (define_expand "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si"
5482 [(match_operand:V4SI 0 "mve_scatter_memory")
5483 (match_operand:V4SI 1 "s_register_operand")
5484 (match_operand:V4SI 2 "s_register_operand")
5485 (match_operand:V4BI 3 "vpr_register_operand")
5486 (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
5489 rtx ind = XEXP (operands[0], 0);
5490 gcc_assert (REG_P (ind));
5492 gen_mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn (ind, operands[1],
5498 (define_insn "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn"
5499 [(set (mem:BLK (scratch))
5501 [(match_operand:SI 0 "register_operand" "r")
5502 (match_operand:V4SI 1 "s_register_operand" "w")
5503 (match_operand:V4SI 2 "s_register_operand" "w")
5504 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
5507 "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
5508 [(set_attr "length" "8")])
5511 ;; [vstrwq_scatter_shifted_offset_s vstrwq_scatter_shifted_offset_u]
5513 (define_expand "mve_vstrwq_scatter_shifted_offset_<supf>v4si"
5514 [(match_operand:V4SI 0 "mve_scatter_memory")
5515 (match_operand:V4SI 1 "s_register_operand")
5516 (match_operand:V4SI 2 "s_register_operand")
5517 (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
5520 rtx ind = XEXP (operands[0], 0);
5521 gcc_assert (REG_P (ind));
5523 gen_mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn (ind, operands[1],
5528 (define_insn "mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn"
5529 [(set (mem:BLK (scratch))
5531 [(match_operand:SI 0 "register_operand" "r")
5532 (match_operand:V4SI 1 "s_register_operand" "w")
5533 (match_operand:V4SI 2 "s_register_operand" "w")]
5536 "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
5537 [(set_attr "length" "4")])
5542 (define_expand "mve_vidupq_n_u<mode>"
5543 [(match_operand:MVE_2 0 "s_register_operand")
5544 (match_operand:SI 1 "s_register_operand")
5545 (match_operand:SI 2 "mve_imm_selective_upto_8")]
5548 rtx temp = gen_reg_rtx (SImode);
5549 emit_move_insn (temp, operands[1]);
5550 rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
5551 emit_insn (gen_mve_vidupq_u<mode>_insn (operands[0], temp, operands[1],
5559 (define_insn "mve_vidupq_u<mode>_insn"
5560 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5561 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5562 (match_operand:SI 3 "mve_imm_selective_upto_8" "Rg")]
5564 (set (match_operand:SI 1 "s_register_operand" "=Te")
5565 (plus:SI (match_dup 2)
5566 (match_operand:SI 4 "immediate_operand" "i")))]
5568 "vidup.u%#<V_sz_elem>\t%q0, %1, %3")
5573 (define_expand "mve_vidupq_m_n_u<mode>"
5574 [(match_operand:MVE_2 0 "s_register_operand")
5575 (match_operand:MVE_2 1 "s_register_operand")
5576 (match_operand:SI 2 "s_register_operand")
5577 (match_operand:SI 3 "mve_imm_selective_upto_8")
5578 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
5581 rtx temp = gen_reg_rtx (SImode);
5582 emit_move_insn (temp, operands[2]);
5583 rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
5584 emit_insn (gen_mve_vidupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
5585 operands[2], operands[3],
5591 ;; [vidupq_m_wb_u_insn])
5593 (define_insn "mve_vidupq_m_wb_u<mode>_insn"
5594 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5595 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5596 (match_operand:SI 3 "s_register_operand" "2")
5597 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
5598 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
5600 (set (match_operand:SI 2 "s_register_operand" "=Te")
5601 (plus:SI (match_dup 3)
5602 (match_operand:SI 6 "immediate_operand" "i")))]
5604 "vpst\;\tvidupt.u%#<V_sz_elem>\t%q0, %2, %4"
5605 [(set_attr "length""8")])
5610 (define_expand "mve_vddupq_n_u<mode>"
5611 [(match_operand:MVE_2 0 "s_register_operand")
5612 (match_operand:SI 1 "s_register_operand")
5613 (match_operand:SI 2 "mve_imm_selective_upto_8")]
5616 rtx temp = gen_reg_rtx (SImode);
5617 emit_move_insn (temp, operands[1]);
5618 rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
5619 emit_insn (gen_mve_vddupq_u<mode>_insn (operands[0], temp, operands[1],
5627 (define_insn "mve_vddupq_u<mode>_insn"
5628 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5629 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5630 (match_operand:SI 3 "immediate_operand" "i")]
5632 (set (match_operand:SI 1 "s_register_operand" "=Te")
5633 (minus:SI (match_dup 2)
5634 (match_operand:SI 4 "immediate_operand" "i")))]
5636 "vddup.u%#<V_sz_elem>\t%q0, %1, %3")
5641 (define_expand "mve_vddupq_m_n_u<mode>"
5642 [(match_operand:MVE_2 0 "s_register_operand")
5643 (match_operand:MVE_2 1 "s_register_operand")
5644 (match_operand:SI 2 "s_register_operand")
5645 (match_operand:SI 3 "mve_imm_selective_upto_8")
5646 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
5649 rtx temp = gen_reg_rtx (SImode);
5650 emit_move_insn (temp, operands[2]);
5651 rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
5652 emit_insn (gen_mve_vddupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
5653 operands[2], operands[3],
5659 ;; [vddupq_m_wb_u_insn])
5661 (define_insn "mve_vddupq_m_wb_u<mode>_insn"
5662 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5663 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5664 (match_operand:SI 3 "s_register_operand" "2")
5665 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
5666 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
5668 (set (match_operand:SI 2 "s_register_operand" "=Te")
5669 (minus:SI (match_dup 3)
5670 (match_operand:SI 6 "immediate_operand" "i")))]
5672 "vpst\;vddupt.u%#<V_sz_elem>\t%q0, %2, %4"
5673 [(set_attr "length""8")])
5678 (define_expand "mve_vdwdupq_n_u<mode>"
5679 [(match_operand:MVE_2 0 "s_register_operand")
5680 (match_operand:SI 1 "s_register_operand")
5681 (match_operand:DI 2 "s_register_operand")
5682 (match_operand:SI 3 "mve_imm_selective_upto_8")]
5685 rtx ignore_wb = gen_reg_rtx (SImode);
5686 emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
5687 operands[1], operands[2],
5695 (define_expand "mve_vdwdupq_wb_u<mode>"
5696 [(match_operand:SI 0 "s_register_operand")
5697 (match_operand:SI 1 "s_register_operand")
5698 (match_operand:DI 2 "s_register_operand")
5699 (match_operand:SI 3 "mve_imm_selective_upto_8")
5700 (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
5703 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5704 emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
5705 operands[1], operands[2],
5711 ;; [vdwdupq_wb_u_insn])
5713 (define_insn "mve_vdwdupq_wb_u<mode>_insn"
5714 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5715 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5716 (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
5717 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
5719 (set (match_operand:SI 1 "s_register_operand" "=Te")
5720 (unspec:SI [(match_dup 2)
5721 (subreg:SI (match_dup 3) 4)
5725 "vdwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
5731 (define_expand "mve_vdwdupq_m_n_u<mode>"
5732 [(match_operand:MVE_2 0 "s_register_operand")
5733 (match_operand:MVE_2 1 "s_register_operand")
5734 (match_operand:SI 2 "s_register_operand")
5735 (match_operand:DI 3 "s_register_operand")
5736 (match_operand:SI 4 "mve_imm_selective_upto_8")
5737 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
5740 rtx ignore_wb = gen_reg_rtx (SImode);
5741 emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
5742 operands[1], operands[2],
5743 operands[3], operands[4],
5749 ;; [vdwdupq_m_wb_u])
5751 (define_expand "mve_vdwdupq_m_wb_u<mode>"
5752 [(match_operand:SI 0 "s_register_operand")
5753 (match_operand:MVE_2 1 "s_register_operand")
5754 (match_operand:SI 2 "s_register_operand")
5755 (match_operand:DI 3 "s_register_operand")
5756 (match_operand:SI 4 "mve_imm_selective_upto_8")
5757 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
5760 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5761 emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
5762 operands[1], operands[2],
5763 operands[3], operands[4],
5769 ;; [vdwdupq_m_wb_u_insn])
5771 (define_insn "mve_vdwdupq_m_wb_u<mode>_insn"
5772 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5773 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
5774 (match_operand:SI 3 "s_register_operand" "1")
5775 (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
5776 (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
5777 (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
5779 (set (match_operand:SI 1 "s_register_operand" "=Te")
5780 (unspec:SI [(match_dup 2)
5782 (subreg:SI (match_dup 4) 4)
5788 "vpst\;vdwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
5789 [(set_attr "type" "mve_move")
5790 (set_attr "length""8")])
5795 (define_expand "mve_viwdupq_n_u<mode>"
5796 [(match_operand:MVE_2 0 "s_register_operand")
5797 (match_operand:SI 1 "s_register_operand")
5798 (match_operand:DI 2 "s_register_operand")
5799 (match_operand:SI 3 "mve_imm_selective_upto_8")]
5802 rtx ignore_wb = gen_reg_rtx (SImode);
5803 emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
5804 operands[1], operands[2],
5812 (define_expand "mve_viwdupq_wb_u<mode>"
5813 [(match_operand:SI 0 "s_register_operand")
5814 (match_operand:SI 1 "s_register_operand")
5815 (match_operand:DI 2 "s_register_operand")
5816 (match_operand:SI 3 "mve_imm_selective_upto_8")
5817 (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
5820 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5821 emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
5822 operands[1], operands[2],
5828 ;; [viwdupq_wb_u_insn])
5830 (define_insn "mve_viwdupq_wb_u<mode>_insn"
5831 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5832 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5833 (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
5834 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
5836 (set (match_operand:SI 1 "s_register_operand" "=Te")
5837 (unspec:SI [(match_dup 2)
5838 (subreg:SI (match_dup 3) 4)
5842 "viwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
5848 (define_expand "mve_viwdupq_m_n_u<mode>"
5849 [(match_operand:MVE_2 0 "s_register_operand")
5850 (match_operand:MVE_2 1 "s_register_operand")
5851 (match_operand:SI 2 "s_register_operand")
5852 (match_operand:DI 3 "s_register_operand")
5853 (match_operand:SI 4 "mve_imm_selective_upto_8")
5854 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
5857 rtx ignore_wb = gen_reg_rtx (SImode);
5858 emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
5859 operands[1], operands[2],
5860 operands[3], operands[4],
5866 ;; [viwdupq_m_wb_u])
5868 (define_expand "mve_viwdupq_m_wb_u<mode>"
5869 [(match_operand:SI 0 "s_register_operand")
5870 (match_operand:MVE_2 1 "s_register_operand")
5871 (match_operand:SI 2 "s_register_operand")
5872 (match_operand:DI 3 "s_register_operand")
5873 (match_operand:SI 4 "mve_imm_selective_upto_8")
5874 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
5877 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5878 emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
5879 operands[1], operands[2],
5880 operands[3], operands[4],
5886 ;; [viwdupq_m_wb_u_insn])
5888 (define_insn "mve_viwdupq_m_wb_u<mode>_insn"
5889 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5890 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
5891 (match_operand:SI 3 "s_register_operand" "1")
5892 (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
5893 (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
5894 (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
5896 (set (match_operand:SI 1 "s_register_operand" "=Te")
5897 (unspec:SI [(match_dup 2)
5899 (subreg:SI (match_dup 4) 4)
5905 "vpst\;\tviwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
5906 [(set_attr "type" "mve_move")
5907 (set_attr "length""8")])
5910 ;; [vstrwq_scatter_base_wb_s vstrwq_scatter_base_wb_u]
5912 (define_insn "mve_vstrwq_scatter_base_wb_<supf>v4si"
5913 [(set (mem:BLK (scratch))
5915 [(match_operand:V4SI 1 "s_register_operand" "0")
5916 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5917 (match_operand:V4SI 3 "s_register_operand" "w")]
5919 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5920 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5926 ops[0] = operands[1];
5927 ops[1] = operands[2];
5928 ops[2] = operands[3];
5929 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
5932 [(set_attr "length" "4")])
5935 ;; [vstrwq_scatter_base_wb_p_s vstrwq_scatter_base_wb_p_u]
5937 (define_insn "mve_vstrwq_scatter_base_wb_p_<supf>v4si"
5938 [(set (mem:BLK (scratch))
5940 [(match_operand:V4SI 1 "s_register_operand" "0")
5941 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5942 (match_operand:V4SI 3 "s_register_operand" "w")
5943 (match_operand:V4BI 4 "vpr_register_operand")]
5945 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5946 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5952 ops[0] = operands[1];
5953 ops[1] = operands[2];
5954 ops[2] = operands[3];
5955 output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops);
5958 [(set_attr "length" "8")])
5961 ;; [vstrwq_scatter_base_wb_f]
5963 (define_insn "mve_vstrwq_scatter_base_wb_fv4sf"
5964 [(set (mem:BLK (scratch))
5966 [(match_operand:V4SI 1 "s_register_operand" "0")
5967 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5968 (match_operand:V4SF 3 "s_register_operand" "w")]
5970 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5971 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5974 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5977 ops[0] = operands[1];
5978 ops[1] = operands[2];
5979 ops[2] = operands[3];
5980 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
5983 [(set_attr "length" "4")])
5986 ;; [vstrwq_scatter_base_wb_p_f]
5988 (define_insn "mve_vstrwq_scatter_base_wb_p_fv4sf"
5989 [(set (mem:BLK (scratch))
5991 [(match_operand:V4SI 1 "s_register_operand" "0")
5992 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5993 (match_operand:V4SF 3 "s_register_operand" "w")
5994 (match_operand:V4BI 4 "vpr_register_operand")]
5996 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5997 (unspec:V4SI [(match_dup 1) (match_dup 2)]
6000 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6003 ops[0] = operands[1];
6004 ops[1] = operands[2];
6005 ops[2] = operands[3];
6006 output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops);
6009 [(set_attr "length" "8")])
6012 ;; [vstrdq_scatter_base_wb_s vstrdq_scatter_base_wb_u]
6014 (define_insn "mve_vstrdq_scatter_base_wb_<supf>v2di"
6015 [(set (mem:BLK (scratch))
6017 [(match_operand:V2DI 1 "s_register_operand" "0")
6018 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
6019 (match_operand:V2DI 3 "s_register_operand" "w")]
6021 (set (match_operand:V2DI 0 "s_register_operand" "=&w")
6022 (unspec:V2DI [(match_dup 1) (match_dup 2)]
6028 ops[0] = operands[1];
6029 ops[1] = operands[2];
6030 ops[2] = operands[3];
6031 output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]!",ops);
6034 [(set_attr "length" "4")])
6037 ;; [vstrdq_scatter_base_wb_p_s vstrdq_scatter_base_wb_p_u]
6039 (define_insn "mve_vstrdq_scatter_base_wb_p_<supf>v2di"
6040 [(set (mem:BLK (scratch))
6042 [(match_operand:V2DI 1 "s_register_operand" "0")
6043 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
6044 (match_operand:V2DI 3 "s_register_operand" "w")
6045 (match_operand:V2QI 4 "vpr_register_operand")]
6047 (set (match_operand:V2DI 0 "s_register_operand" "=w")
6048 (unspec:V2DI [(match_dup 1) (match_dup 2)]
6054 ops[0] = operands[1];
6055 ops[1] = operands[2];
6056 ops[2] = operands[3];
6057 output_asm_insn ("vpst;vstrdt.u64\t%q2, [%q0, %1]!",ops);
6060 [(set_attr "length" "8")])
6062 (define_expand "mve_vldrwq_gather_base_wb_<supf>v4si"
6063 [(match_operand:V4SI 0 "s_register_operand")
6064 (match_operand:V4SI 1 "s_register_operand")
6065 (match_operand:SI 2 "mve_vldrd_immediate")
6066 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
6069 rtx ignore_result = gen_reg_rtx (V4SImode);
6071 gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (ignore_result, operands[0],
6072 operands[1], operands[2]));
6076 (define_expand "mve_vldrwq_gather_base_nowb_<supf>v4si"
6077 [(match_operand:V4SI 0 "s_register_operand")
6078 (match_operand:V4SI 1 "s_register_operand")
6079 (match_operand:SI 2 "mve_vldrd_immediate")
6080 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
6083 rtx ignore_wb = gen_reg_rtx (V4SImode);
6085 gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (operands[0], ignore_wb,
6086 operands[1], operands[2]));
6091 ;; [vldrwq_gather_base_wb_s vldrwq_gather_base_wb_u]
6093 (define_insn "mve_vldrwq_gather_base_wb_<supf>v4si_insn"
6094 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
6095 (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
6096 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6097 (mem:BLK (scratch))]
6099 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
6100 (unspec:V4SI [(match_dup 2) (match_dup 3)]
6106 ops[0] = operands[0];
6107 ops[1] = operands[2];
6108 ops[2] = operands[3];
6109 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
6112 [(set_attr "length" "4")])
6114 (define_expand "mve_vldrwq_gather_base_wb_z_<supf>v4si"
6115 [(match_operand:V4SI 0 "s_register_operand")
6116 (match_operand:V4SI 1 "s_register_operand")
6117 (match_operand:SI 2 "mve_vldrd_immediate")
6118 (match_operand:V4BI 3 "vpr_register_operand")
6119 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
6122 rtx ignore_result = gen_reg_rtx (V4SImode);
6124 gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (ignore_result, operands[0],
6125 operands[1], operands[2],
6129 (define_expand "mve_vldrwq_gather_base_nowb_z_<supf>v4si"
6130 [(match_operand:V4SI 0 "s_register_operand")
6131 (match_operand:V4SI 1 "s_register_operand")
6132 (match_operand:SI 2 "mve_vldrd_immediate")
6133 (match_operand:V4BI 3 "vpr_register_operand")
6134 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
6137 rtx ignore_wb = gen_reg_rtx (V4SImode);
6139 gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (operands[0], ignore_wb,
6140 operands[1], operands[2],
6146 ;; [vldrwq_gather_base_wb_z_s vldrwq_gather_base_wb_z_u]
6148 (define_insn "mve_vldrwq_gather_base_wb_z_<supf>v4si_insn"
6149 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
6150 (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
6151 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6152 (match_operand:V4BI 4 "vpr_register_operand" "Up")
6153 (mem:BLK (scratch))]
6155 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
6156 (unspec:V4SI [(match_dup 2) (match_dup 3)]
6162 ops[0] = operands[0];
6163 ops[1] = operands[2];
6164 ops[2] = operands[3];
6165 output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
6168 [(set_attr "length" "8")])
6170 (define_expand "mve_vldrwq_gather_base_wb_fv4sf"
6171 [(match_operand:V4SI 0 "s_register_operand")
6172 (match_operand:V4SI 1 "s_register_operand")
6173 (match_operand:SI 2 "mve_vldrd_immediate")
6174 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
6175 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6177 rtx ignore_result = gen_reg_rtx (V4SFmode);
6179 gen_mve_vldrwq_gather_base_wb_fv4sf_insn (ignore_result, operands[0],
6180 operands[1], operands[2]));
6184 (define_expand "mve_vldrwq_gather_base_nowb_fv4sf"
6185 [(match_operand:V4SF 0 "s_register_operand")
6186 (match_operand:V4SI 1 "s_register_operand")
6187 (match_operand:SI 2 "mve_vldrd_immediate")
6188 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
6189 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6191 rtx ignore_wb = gen_reg_rtx (V4SImode);
6193 gen_mve_vldrwq_gather_base_wb_fv4sf_insn (operands[0], ignore_wb,
6194 operands[1], operands[2]));
6199 ;; [vldrwq_gather_base_wb_f]
6201 (define_insn "mve_vldrwq_gather_base_wb_fv4sf_insn"
6202 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
6203 (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
6204 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6205 (mem:BLK (scratch))]
6207 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
6208 (unspec:V4SI [(match_dup 2) (match_dup 3)]
6211 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6214 ops[0] = operands[0];
6215 ops[1] = operands[2];
6216 ops[2] = operands[3];
6217 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
6220 [(set_attr "length" "4")])
6222 (define_expand "mve_vldrwq_gather_base_wb_z_fv4sf"
6223 [(match_operand:V4SI 0 "s_register_operand")
6224 (match_operand:V4SI 1 "s_register_operand")
6225 (match_operand:SI 2 "mve_vldrd_immediate")
6226 (match_operand:V4BI 3 "vpr_register_operand")
6227 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
6228 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6230 rtx ignore_result = gen_reg_rtx (V4SFmode);
6232 gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (ignore_result, operands[0],
6233 operands[1], operands[2],
6238 (define_expand "mve_vldrwq_gather_base_nowb_z_fv4sf"
6239 [(match_operand:V4SF 0 "s_register_operand")
6240 (match_operand:V4SI 1 "s_register_operand")
6241 (match_operand:SI 2 "mve_vldrd_immediate")
6242 (match_operand:V4BI 3 "vpr_register_operand")
6243 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
6244 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6246 rtx ignore_wb = gen_reg_rtx (V4SImode);
6248 gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (operands[0], ignore_wb,
6249 operands[1], operands[2],
6255 ;; [vldrwq_gather_base_wb_z_f]
6257 (define_insn "mve_vldrwq_gather_base_wb_z_fv4sf_insn"
6258 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
6259 (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
6260 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6261 (match_operand:V4BI 4 "vpr_register_operand" "Up")
6262 (mem:BLK (scratch))]
6264 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
6265 (unspec:V4SI [(match_dup 2) (match_dup 3)]
6268 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6271 ops[0] = operands[0];
6272 ops[1] = operands[2];
6273 ops[2] = operands[3];
6274 output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
6277 [(set_attr "length" "8")])
6279 (define_expand "mve_vldrdq_gather_base_wb_<supf>v2di"
6280 [(match_operand:V2DI 0 "s_register_operand")
6281 (match_operand:V2DI 1 "s_register_operand")
6282 (match_operand:SI 2 "mve_vldrd_immediate")
6283 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
6286 rtx ignore_result = gen_reg_rtx (V2DImode);
6288 gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (ignore_result, operands[0],
6289 operands[1], operands[2]));
6293 (define_expand "mve_vldrdq_gather_base_nowb_<supf>v2di"
6294 [(match_operand:V2DI 0 "s_register_operand")
6295 (match_operand:V2DI 1 "s_register_operand")
6296 (match_operand:SI 2 "mve_vldrd_immediate")
6297 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
6300 rtx ignore_wb = gen_reg_rtx (V2DImode);
6302 gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (operands[0], ignore_wb,
6303 operands[1], operands[2]));
6309 ;; [vldrdq_gather_base_wb_s vldrdq_gather_base_wb_u]
6311 (define_insn "mve_vldrdq_gather_base_wb_<supf>v2di_insn"
6312 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
6313 (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
6314 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6315 (mem:BLK (scratch))]
6317 (set (match_operand:V2DI 1 "s_register_operand" "=&w")
6318 (unspec:V2DI [(match_dup 2) (match_dup 3)]
6324 ops[0] = operands[0];
6325 ops[1] = operands[2];
6326 ops[2] = operands[3];
6327 output_asm_insn ("vldrd.64\t%q0, [%q1, %2]!",ops);
6330 [(set_attr "length" "4")])
6332 (define_expand "mve_vldrdq_gather_base_wb_z_<supf>v2di"
6333 [(match_operand:V2DI 0 "s_register_operand")
6334 (match_operand:V2DI 1 "s_register_operand")
6335 (match_operand:SI 2 "mve_vldrd_immediate")
6336 (match_operand:V2QI 3 "vpr_register_operand")
6337 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
6340 rtx ignore_result = gen_reg_rtx (V2DImode);
6342 gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (ignore_result, operands[0],
6343 operands[1], operands[2],
6348 (define_expand "mve_vldrdq_gather_base_nowb_z_<supf>v2di"
6349 [(match_operand:V2DI 0 "s_register_operand")
6350 (match_operand:V2DI 1 "s_register_operand")
6351 (match_operand:SI 2 "mve_vldrd_immediate")
6352 (match_operand:V2QI 3 "vpr_register_operand")
6353 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
6356 rtx ignore_wb = gen_reg_rtx (V2DImode);
6358 gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (operands[0], ignore_wb,
6359 operands[1], operands[2],
6364 (define_insn "get_fpscr_nzcvqc"
6365 [(set (match_operand:SI 0 "register_operand" "=r")
6366 (unspec:SI [(reg:SI VFPCC_REGNUM)] UNSPEC_GET_FPSCR_NZCVQC))]
6368 "vmrs\\t%0, FPSCR_nzcvqc"
6369 [(set_attr "type" "mve_move")])
6371 (define_insn "set_fpscr_nzcvqc"
6372 [(set (reg:SI VFPCC_REGNUM)
6373 (unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")]
6374 VUNSPEC_SET_FPSCR_NZCVQC))]
6376 "vmsr\\tFPSCR_nzcvqc, %0"
6377 [(set_attr "type" "mve_move")])
6380 ;; [vldrdq_gather_base_wb_z_s vldrdq_gather_base_wb_z_u]
6382 (define_insn "mve_vldrdq_gather_base_wb_z_<supf>v2di_insn"
6383 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
6384 (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
6385 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6386 (match_operand:V2QI 4 "vpr_register_operand" "Up")
6387 (mem:BLK (scratch))]
6389 (set (match_operand:V2DI 1 "s_register_operand" "=&w")
6390 (unspec:V2DI [(match_dup 2) (match_dup 3)]
6396 ops[0] = operands[0];
6397 ops[1] = operands[2];
6398 ops[2] = operands[3];
6399 output_asm_insn ("vpst\;vldrdt.u64\t%q0, [%q1, %2]!",ops);
6402 [(set_attr "length" "8")])
6404 ;; [vadciq_m_s, vadciq_m_u])
6406 (define_insn "mve_vadciq_m_<supf>v4si"
6407 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6408 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
6409 (match_operand:V4SI 2 "s_register_operand" "w")
6410 (match_operand:V4SI 3 "s_register_operand" "w")
6411 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
6413 (set (reg:SI VFPCC_REGNUM)
6414 (unspec:SI [(const_int 0)]
6418 "vpst\;vadcit.i32\t%q0, %q2, %q3"
6419 [(set_attr "type" "mve_move")
6420 (set_attr "length" "8")])
6423 ;; [vadciq_u, vadciq_s])
6425 (define_insn "mve_vadciq_<supf>v4si"
6426 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6427 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6428 (match_operand:V4SI 2 "s_register_operand" "w")]
6430 (set (reg:SI VFPCC_REGNUM)
6431 (unspec:SI [(const_int 0)]
6435 "vadci.i32\t%q0, %q1, %q2"
6436 [(set_attr "type" "mve_move")
6437 (set_attr "length" "4")])
6440 ;; [vadcq_m_s, vadcq_m_u])
6442 (define_insn "mve_vadcq_m_<supf>v4si"
6443 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6444 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
6445 (match_operand:V4SI 2 "s_register_operand" "w")
6446 (match_operand:V4SI 3 "s_register_operand" "w")
6447 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
6449 (set (reg:SI VFPCC_REGNUM)
6450 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6454 "vpst\;vadct.i32\t%q0, %q2, %q3"
6455 [(set_attr "type" "mve_move")
6456 (set_attr "length" "8")])
6459 ;; [vadcq_u, vadcq_s])
6461 (define_insn "mve_vadcq_<supf>v4si"
6462 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6463 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6464 (match_operand:V4SI 2 "s_register_operand" "w")]
6466 (set (reg:SI VFPCC_REGNUM)
6467 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6471 "vadc.i32\t%q0, %q1, %q2"
6472 [(set_attr "type" "mve_move")
6473 (set_attr "length" "4")
6474 (set_attr "conds" "set")])
6477 ;; [vsbciq_m_u, vsbciq_m_s])
6479 (define_insn "mve_vsbciq_m_<supf>v4si"
6480 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6481 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6482 (match_operand:V4SI 2 "s_register_operand" "w")
6483 (match_operand:V4SI 3 "s_register_operand" "w")
6484 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
6486 (set (reg:SI VFPCC_REGNUM)
6487 (unspec:SI [(const_int 0)]
6491 "vpst\;vsbcit.i32\t%q0, %q2, %q3"
6492 [(set_attr "type" "mve_move")
6493 (set_attr "length" "8")])
6496 ;; [vsbciq_s, vsbciq_u])
6498 (define_insn "mve_vsbciq_<supf>v4si"
6499 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6500 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6501 (match_operand:V4SI 2 "s_register_operand" "w")]
6503 (set (reg:SI VFPCC_REGNUM)
6504 (unspec:SI [(const_int 0)]
6508 "vsbci.i32\t%q0, %q1, %q2"
6509 [(set_attr "type" "mve_move")
6510 (set_attr "length" "4")])
6513 ;; [vsbcq_m_u, vsbcq_m_s])
6515 (define_insn "mve_vsbcq_m_<supf>v4si"
6516 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6517 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6518 (match_operand:V4SI 2 "s_register_operand" "w")
6519 (match_operand:V4SI 3 "s_register_operand" "w")
6520 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
6522 (set (reg:SI VFPCC_REGNUM)
6523 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6527 "vpst\;vsbct.i32\t%q0, %q2, %q3"
6528 [(set_attr "type" "mve_move")
6529 (set_attr "length" "8")])
6532 ;; [vsbcq_s, vsbcq_u])
6534 (define_insn "mve_vsbcq_<supf>v4si"
6535 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6536 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6537 (match_operand:V4SI 2 "s_register_operand" "w")]
6539 (set (reg:SI VFPCC_REGNUM)
6540 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6544 "vsbc.i32\t%q0, %q1, %q2"
6545 [(set_attr "type" "mve_move")
6546 (set_attr "length" "4")])
6551 (define_insn "mve_vst2q<mode>"
6552 [(set (match_operand:OI 0 "mve_struct_operand" "=Ug")
6553 (unspec:OI [(match_operand:OI 1 "s_register_operand" "w")
6554 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6557 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6558 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6561 int regno = REGNO (operands[1]);
6562 ops[0] = gen_rtx_REG (TImode, regno);
6563 ops[1] = gen_rtx_REG (TImode, regno + 4);
6564 rtx reg = operands[0];
6565 while (reg && !REG_P (reg))
6566 reg = XEXP (reg, 0);
6567 gcc_assert (REG_P (reg));
6569 ops[3] = operands[0];
6570 output_asm_insn ("vst20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
6571 "vst21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
6574 [(set_attr "length" "8")])
6579 (define_insn "mve_vld2q<mode>"
6580 [(set (match_operand:OI 0 "s_register_operand" "=w")
6581 (unspec:OI [(match_operand:OI 1 "mve_struct_operand" "Ug")
6582 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6585 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6586 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6589 int regno = REGNO (operands[0]);
6590 ops[0] = gen_rtx_REG (TImode, regno);
6591 ops[1] = gen_rtx_REG (TImode, regno + 4);
6592 rtx reg = operands[1];
6593 while (reg && !REG_P (reg))
6594 reg = XEXP (reg, 0);
6595 gcc_assert (REG_P (reg));
6597 ops[3] = operands[1];
6598 output_asm_insn ("vld20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
6599 "vld21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
6602 [(set_attr "length" "8")])
6607 (define_insn "mve_vld4q<mode>"
6608 [(set (match_operand:XI 0 "s_register_operand" "=w")
6609 (unspec:XI [(match_operand:XI 1 "mve_struct_operand" "Ug")
6610 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6613 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6614 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6617 int regno = REGNO (operands[0]);
6618 ops[0] = gen_rtx_REG (TImode, regno);
6619 ops[1] = gen_rtx_REG (TImode, regno+4);
6620 ops[2] = gen_rtx_REG (TImode, regno+8);
6621 ops[3] = gen_rtx_REG (TImode, regno + 12);
6622 rtx reg = operands[1];
6623 while (reg && !REG_P (reg))
6624 reg = XEXP (reg, 0);
6625 gcc_assert (REG_P (reg));
6627 ops[5] = operands[1];
6628 output_asm_insn ("vld40.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6629 "vld41.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6630 "vld42.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6631 "vld43.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, %5", ops);
6634 [(set_attr "length" "16")])
6636 ;; [vgetq_lane_u, vgetq_lane_s, vgetq_lane_f])
6638 (define_insn "mve_vec_extract<mode><V_elem_l>"
6639 [(set (match_operand:<V_elem> 0 "nonimmediate_operand" "=r")
6640 (vec_select:<V_elem>
6641 (match_operand:MVE_VLD_ST 1 "s_register_operand" "w")
6642 (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
6643 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6644 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6646 if (BYTES_BIG_ENDIAN)
6648 int elt = INTVAL (operands[2]);
6649 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6650 operands[2] = GEN_INT (elt);
6652 return "vmov.<V_extr_elem>\t%0, %q1[%c2]";
6654 [(set_attr "type" "mve_move")])
6656 (define_insn "mve_vec_extractv2didi"
6657 [(set (match_operand:DI 0 "nonimmediate_operand" "=r")
6659 (match_operand:V2DI 1 "s_register_operand" "w")
6660 (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
6663 int elt = INTVAL (operands[2]);
6664 if (BYTES_BIG_ENDIAN)
6668 return "vmov\t%Q0, %R0, %e1";
6670 return "vmov\t%Q0, %R0, %f1";
6672 [(set_attr "type" "mve_move")])
6674 (define_insn "*mve_vec_extract_sext_internal<mode>"
6675 [(set (match_operand:SI 0 "s_register_operand" "=r")
6677 (vec_select:<V_elem>
6678 (match_operand:MVE_2 1 "s_register_operand" "w")
6679 (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
6680 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6681 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6683 if (BYTES_BIG_ENDIAN)
6685 int elt = INTVAL (operands[2]);
6686 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6687 operands[2] = GEN_INT (elt);
6689 return "vmov.s<V_sz_elem>\t%0, %q1[%c2]";
6691 [(set_attr "type" "mve_move")])
6693 (define_insn "*mve_vec_extract_zext_internal<mode>"
6694 [(set (match_operand:SI 0 "s_register_operand" "=r")
6696 (vec_select:<V_elem>
6697 (match_operand:MVE_2 1 "s_register_operand" "w")
6698 (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
6699 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6700 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6702 if (BYTES_BIG_ENDIAN)
6704 int elt = INTVAL (operands[2]);
6705 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6706 operands[2] = GEN_INT (elt);
6708 return "vmov.u<V_sz_elem>\t%0, %q1[%c2]";
6710 [(set_attr "type" "mve_move")])
6713 ;; [vsetq_lane_u, vsetq_lane_s, vsetq_lane_f])
6715 (define_insn "mve_vec_set<mode>_internal"
6716 [(set (match_operand:VQ2 0 "s_register_operand" "=w")
6719 (match_operand:<V_elem> 1 "nonimmediate_operand" "r"))
6720 (match_operand:VQ2 3 "s_register_operand" "0")
6721 (match_operand:SI 2 "immediate_operand" "i")))]
6722 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6723 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6725 int elt = ffs ((int) INTVAL (operands[2])) - 1;
6726 if (BYTES_BIG_ENDIAN)
6727 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6728 operands[2] = GEN_INT (elt);
6730 return "vmov.<V_sz_elem>\t%q0[%c2], %1";
6732 [(set_attr "type" "mve_move")])
6734 (define_insn "mve_vec_setv2di_internal"
6735 [(set (match_operand:V2DI 0 "s_register_operand" "=w")
6738 (match_operand:DI 1 "nonimmediate_operand" "r"))
6739 (match_operand:V2DI 3 "s_register_operand" "0")
6740 (match_operand:SI 2 "immediate_operand" "i")))]
6743 int elt = ffs ((int) INTVAL (operands[2])) - 1;
6744 if (BYTES_BIG_ENDIAN)
6748 return "vmov\t%e0, %Q1, %R1";
6750 return "vmov\t%f0, %J1, %K1";
6752 [(set_attr "type" "mve_move")])
6757 (define_insn "mve_uqrshll_sat<supf>_di"
6758 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6759 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6760 (match_operand:SI 2 "register_operand" "r")]
6763 "uqrshll%?\\t%Q1, %R1, #<supf>, %2"
6764 [(set_attr "predicable" "yes")])
6769 (define_insn "mve_sqrshrl_sat<supf>_di"
6770 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6771 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6772 (match_operand:SI 2 "register_operand" "r")]
6775 "sqrshrl%?\\t%Q1, %R1, #<supf>, %2"
6776 [(set_attr "predicable" "yes")])
6781 (define_insn "mve_uqrshl_si"
6782 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6783 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6784 (match_operand:SI 2 "register_operand" "r")]
6788 [(set_attr "predicable" "yes")])
6793 (define_insn "mve_sqrshr_si"
6794 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6795 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6796 (match_operand:SI 2 "register_operand" "r")]
6800 [(set_attr "predicable" "yes")])
6805 (define_insn "mve_uqshll_di"
6806 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6807 (us_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
6808 (match_operand:SI 2 "immediate_operand" "Pg")))]
6810 "uqshll%?\\t%Q1, %R1, %2"
6811 [(set_attr "predicable" "yes")])
6816 (define_insn "mve_urshrl_di"
6817 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6818 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6819 (match_operand:SI 2 "immediate_operand" "Pg")]
6822 "urshrl%?\\t%Q1, %R1, %2"
6823 [(set_attr "predicable" "yes")])
6828 (define_insn "mve_uqshl_si"
6829 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6830 (us_ashift:SI (match_operand:SI 1 "arm_general_register_operand" "0")
6831 (match_operand:SI 2 "immediate_operand" "Pg")))]
6834 [(set_attr "predicable" "yes")])
6839 (define_insn "mve_urshr_si"
6840 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6841 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6842 (match_operand:SI 2 "immediate_operand" "Pg")]
6846 [(set_attr "predicable" "yes")])
6851 (define_insn "mve_sqshl_si"
6852 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6853 (ss_ashift:SI (match_operand:DI 1 "arm_general_register_operand" "0")
6854 (match_operand:SI 2 "immediate_operand" "Pg")))]
6857 [(set_attr "predicable" "yes")])
6862 (define_insn "mve_srshr_si"
6863 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6864 (unspec:SI [(match_operand:DI 1 "arm_general_register_operand" "0")
6865 (match_operand:SI 2 "immediate_operand" "Pg")]
6869 [(set_attr "predicable" "yes")])
6874 (define_insn "mve_srshrl_di"
6875 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6876 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6877 (match_operand:SI 2 "immediate_operand" "Pg")]
6880 "srshrl%?\\t%Q1, %R1, %2"
6881 [(set_attr "predicable" "yes")])
6886 (define_insn "mve_sqshll_di"
6887 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6888 (ss_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
6889 (match_operand:SI 2 "immediate_operand" "Pg")))]
6891 "sqshll%?\\t%Q1, %R1, %2"
6892 [(set_attr "predicable" "yes")])
6895 ;; [vshlcq_m_u vshlcq_m_s]
6897 (define_expand "mve_vshlcq_m_vec_<supf><mode>"
6898 [(match_operand:MVE_2 0 "s_register_operand")
6899 (match_operand:MVE_2 1 "s_register_operand")
6900 (match_operand:SI 2 "s_register_operand")
6901 (match_operand:SI 3 "mve_imm_32")
6902 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
6903 (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
6906 rtx ignore_wb = gen_reg_rtx (SImode);
6907 emit_insn (gen_mve_vshlcq_m_<supf><mode> (operands[0], ignore_wb, operands[1],
6908 operands[2], operands[3],
6913 (define_expand "mve_vshlcq_m_carry_<supf><mode>"
6914 [(match_operand:SI 0 "s_register_operand")
6915 (match_operand:MVE_2 1 "s_register_operand")
6916 (match_operand:SI 2 "s_register_operand")
6917 (match_operand:SI 3 "mve_imm_32")
6918 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
6919 (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
6922 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
6923 emit_insn (gen_mve_vshlcq_m_<supf><mode> (ignore_vec, operands[0],
6924 operands[1], operands[2],
6925 operands[3], operands[4]));
6929 (define_insn "mve_vshlcq_m_<supf><mode>"
6930 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
6931 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
6932 (match_operand:SI 3 "s_register_operand" "1")
6933 (match_operand:SI 4 "mve_imm_32" "Rf")
6934 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
6936 (set (match_operand:SI 1 "s_register_operand" "=r")
6937 (unspec:SI [(match_dup 2)
6944 "vpst\;vshlct\t%q0, %1, %4"
6945 [(set_attr "type" "mve_move")
6946 (set_attr "length" "8")])
6948 ;; CDE instructions on MVE registers.
6950 (define_insn "arm_vcx1qv16qi"
6951 [(set (match_operand:V16QI 0 "register_operand" "=t")
6952 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6953 (match_operand:SI 2 "const_int_mve_cde1_operand" "i")]
6955 "TARGET_CDE && TARGET_HAVE_MVE"
6956 "vcx1\\tp%c1, %q0, #%c2"
6957 [(set_attr "type" "coproc")]
6960 (define_insn "arm_vcx1qav16qi"
6961 [(set (match_operand:V16QI 0 "register_operand" "=t")
6962 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6963 (match_operand:V16QI 2 "register_operand" "0")
6964 (match_operand:SI 3 "const_int_mve_cde1_operand" "i")]
6966 "TARGET_CDE && TARGET_HAVE_MVE"
6967 "vcx1a\\tp%c1, %q0, #%c3"
6968 [(set_attr "type" "coproc")]
6971 (define_insn "arm_vcx2qv16qi"
6972 [(set (match_operand:V16QI 0 "register_operand" "=t")
6973 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6974 (match_operand:V16QI 2 "register_operand" "t")
6975 (match_operand:SI 3 "const_int_mve_cde2_operand" "i")]
6977 "TARGET_CDE && TARGET_HAVE_MVE"
6978 "vcx2\\tp%c1, %q0, %q2, #%c3"
6979 [(set_attr "type" "coproc")]
6982 (define_insn "arm_vcx2qav16qi"
6983 [(set (match_operand:V16QI 0 "register_operand" "=t")
6984 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6985 (match_operand:V16QI 2 "register_operand" "0")
6986 (match_operand:V16QI 3 "register_operand" "t")
6987 (match_operand:SI 4 "const_int_mve_cde2_operand" "i")]
6989 "TARGET_CDE && TARGET_HAVE_MVE"
6990 "vcx2a\\tp%c1, %q0, %q3, #%c4"
6991 [(set_attr "type" "coproc")]
6994 (define_insn "arm_vcx3qv16qi"
6995 [(set (match_operand:V16QI 0 "register_operand" "=t")
6996 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6997 (match_operand:V16QI 2 "register_operand" "t")
6998 (match_operand:V16QI 3 "register_operand" "t")
6999 (match_operand:SI 4 "const_int_mve_cde3_operand" "i")]
7001 "TARGET_CDE && TARGET_HAVE_MVE"
7002 "vcx3\\tp%c1, %q0, %q2, %q3, #%c4"
7003 [(set_attr "type" "coproc")]
7006 (define_insn "arm_vcx3qav16qi"
7007 [(set (match_operand:V16QI 0 "register_operand" "=t")
7008 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
7009 (match_operand:V16QI 2 "register_operand" "0")
7010 (match_operand:V16QI 3 "register_operand" "t")
7011 (match_operand:V16QI 4 "register_operand" "t")
7012 (match_operand:SI 5 "const_int_mve_cde3_operand" "i")]
7014 "TARGET_CDE && TARGET_HAVE_MVE"
7015 "vcx3a\\tp%c1, %q0, %q3, %q4, #%c5"
7016 [(set_attr "type" "coproc")]
7019 (define_insn "arm_vcx1q<a>_p_v16qi"
7020 [(set (match_operand:V16QI 0 "register_operand" "=t")
7021 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
7022 (match_operand:V16QI 2 "register_operand" "0")
7023 (match_operand:SI 3 "const_int_mve_cde1_operand" "i")
7024 (match_operand:V16BI 4 "vpr_register_operand" "Up")]
7026 "TARGET_CDE && TARGET_HAVE_MVE"
7027 "vpst\;vcx1<a>t\\tp%c1, %q0, #%c3"
7028 [(set_attr "type" "coproc")
7029 (set_attr "length" "8")]
7032 (define_insn "arm_vcx2q<a>_p_v16qi"
7033 [(set (match_operand:V16QI 0 "register_operand" "=t")
7034 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
7035 (match_operand:V16QI 2 "register_operand" "0")
7036 (match_operand:V16QI 3 "register_operand" "t")
7037 (match_operand:SI 4 "const_int_mve_cde2_operand" "i")
7038 (match_operand:V16BI 5 "vpr_register_operand" "Up")]
7040 "TARGET_CDE && TARGET_HAVE_MVE"
7041 "vpst\;vcx2<a>t\\tp%c1, %q0, %q3, #%c4"
7042 [(set_attr "type" "coproc")
7043 (set_attr "length" "8")]
7046 (define_insn "arm_vcx3q<a>_p_v16qi"
7047 [(set (match_operand:V16QI 0 "register_operand" "=t")
7048 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
7049 (match_operand:V16QI 2 "register_operand" "0")
7050 (match_operand:V16QI 3 "register_operand" "t")
7051 (match_operand:V16QI 4 "register_operand" "t")
7052 (match_operand:SI 5 "const_int_mve_cde3_operand" "i")
7053 (match_operand:V16BI 6 "vpr_register_operand" "Up")]
7055 "TARGET_CDE && TARGET_HAVE_MVE"
7056 "vpst\;vcx3<a>t\\tp%c1, %q0, %q3, %q4, #%c5"
7057 [(set_attr "type" "coproc")
7058 (set_attr "length" "8")]
7061 (define_insn "*movmisalign<mode>_mve_store"
7062 [(set (match_operand:MVE_VLD_ST 0 "mve_memory_operand" "=Ux")
7063 (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "s_register_operand" " w")]
7064 UNSPEC_MISALIGNED_ACCESS))]
7065 "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
7066 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
7067 && !BYTES_BIG_ENDIAN && unaligned_access"
7068 "vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0"
7069 [(set_attr "type" "mve_store")]
7073 (define_insn "*movmisalign<mode>_mve_load"
7074 [(set (match_operand:MVE_VLD_ST 0 "s_register_operand" "=w")
7075 (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "mve_memory_operand" " Ux")]
7076 UNSPEC_MISALIGNED_ACCESS))]
7077 "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
7078 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
7079 && !BYTES_BIG_ENDIAN && unaligned_access"
7080 "vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1"
7081 [(set_attr "type" "mve_load")]
7084 ;; Expander for VxBI moves
7085 (define_expand "mov<mode>"
7086 [(set (match_operand:MVE_7 0 "nonimmediate_operand")
7087 (match_operand:MVE_7 1 "general_operand"))]
7090 if (!register_operand (operands[0], <MODE>mode))
7091 operands[1] = force_reg (<MODE>mode, operands[1]);
7095 ;; Expanders for vec_cmp and vcond
7097 (define_expand "vec_cmp<mode><MVE_vpred>"
7098 [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
7099 (match_operator:<MVE_VPRED> 1 "comparison_operator"
7100 [(match_operand:MVE_VLD_ST 2 "s_register_operand")
7101 (match_operand:MVE_VLD_ST 3 "reg_or_zero_operand")]))]
7103 && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
7105 arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
7106 operands[2], operands[3], false);
7110 (define_expand "vec_cmpu<mode><MVE_vpred>"
7111 [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
7112 (match_operator:<MVE_VPRED> 1 "comparison_operator"
7113 [(match_operand:MVE_2 2 "s_register_operand")
7114 (match_operand:MVE_2 3 "reg_or_zero_operand")]))]
7117 arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
7118 operands[2], operands[3], false);
7122 (define_expand "vcond_mask_<mode><MVE_vpred>"
7123 [(set (match_operand:MVE_VLD_ST 0 "s_register_operand")
7124 (if_then_else:MVE_VLD_ST
7125 (match_operand:<MVE_VPRED> 3 "s_register_operand")
7126 (match_operand:MVE_VLD_ST 1 "s_register_operand")
7127 (match_operand:MVE_VLD_ST 2 "s_register_operand")))]
7130 switch (GET_MODE_CLASS (<MODE>mode))
7132 case MODE_VECTOR_INT:
7133 emit_insn (gen_mve_vpselq (VPSELQ_S, <MODE>mode, operands[0],
7134 operands[1], operands[2], operands[3]));
7136 case MODE_VECTOR_FLOAT:
7137 emit_insn (gen_mve_vpselq_f (<MODE>mode, operands[0],
7138 operands[1], operands[2], operands[3]));
7146 ;; Reinterpret operand 1 in operand 0's mode, without changing its contents.
7147 (define_expand "@arm_mve_reinterpret<mode>"
7148 [(set (match_operand:MVE_vecs 0 "register_operand")
7150 [(match_operand 1 "arm_any_register_operand")]
7152 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
7153 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
7155 machine_mode src_mode = GET_MODE (operands[1]);
7156 if (targetm.can_change_mode_class (<MODE>mode, src_mode, VFP_REGS))
7158 emit_move_insn (operands[0], gen_lowpart (<MODE>mode, operands[1]));