]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/arm/mve.md
arm: [MVE intrinsics] factorize vcmlaq
[thirdparty/gcc.git] / gcc / config / arm / mve.md
CommitLineData
63c8f7d6 1;; Arm M-profile Vector Extension Machine Description
aeee4812 2;; Copyright (C) 2019-2023 Free Software Foundation, Inc.
63c8f7d6
SP
3;;
4;; This file is part of GCC.
5;;
6;; GCC is free software; you can redistribute it and/or modify it
7;; under the terms of the GNU General Public License as published by
8;; the Free Software Foundation; either version 3, or (at your option)
9;; any later version.
10;;
11;; GCC is distributed in the hope that it will be useful, but
12;; WITHOUT ANY WARRANTY; without even the implied warranty of
13;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14;; General Public License for more details.
15;;
16;; You should have received a copy of the GNU General Public License
17;; along with GCC; see the file COPYING3. If not see
18;; <http://www.gnu.org/licenses/>.
19
63c8f7d6 20(define_insn "*mve_mov<mode>"
94018fd2
RE
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"))]
63c8f7d6
SP
23 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
24{
94018fd2 25 switch (which_alternative)
63c8f7d6 26 {
94018fd2
RE
27 case 0: /* [w,w]. */
28 return "vmov\t%q0, %q1";
63c8f7d6 29
94018fd2
RE
30 case 1: /* [w,r]. */
31 return "vmov\t%e0, %Q1, %R1 %@ <mode>\;vmov\t%f0, %J1, %K1";
63c8f7d6 32
94018fd2
RE
33 case 2: /* [r,w]. */
34 return "vmov\t%Q0, %R0, %e1 %@ <mode>\;vmov\t%J0, %K0, %f1";
63c8f7d6 35
94018fd2
RE
36 case 3: /* [w,DnDm]. */
37 {
38 int width, is_valid;
d91524d5 39
94018fd2
RE
40 is_valid = simd_immediate_valid_for_move (operands[1], <MODE>mode,
41 &operands[1], &width);
42
43 gcc_assert (is_valid);
44
45 if (width == 0)
46 return "vmov.f32\t%q0, %1 %@ <mode>";
47 else
48 {
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)
53 > templ_size)
54 abort ();
55 return templ;
56 }
57 }
58
59 case 4: /* [w,UxUi]. */
60 if (<MODE>mode == V2DFmode || <MODE>mode == V2DImode
61 || <MODE>mode == TImode)
62 return "vldrw.u32\t%q0, %E1";
d91524d5 63 else
94018fd2
RE
64 return "vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1";
65
66 case 5: /* [r,r]. */
0efe7d87 67 return output_move_quad (operands);
94018fd2
RE
68
69 case 6: /* [Ux,w]. */
70 if (<MODE>mode == V2DFmode || <MODE>mode == V2DImode
71 || <MODE>mode == TImode)
72 return "vstrw.32\t%q1, %E0";
73 else
74 return "vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0";
75
76 case 7: /* [w,Ul]. */
d91524d5 77 return output_move_neon (operands);
94018fd2 78
63c8f7d6
SP
79 default:
80 gcc_unreachable ();
81 return "";
82 }
83}
94018fd2
RE
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,*,*,*")])
63c8f7d6 88
67d56b27
AC
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")))]
63c8f7d6 93 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
67d56b27
AC
94 "vdup.<V_sz_elem>\t%q0, %1"
95 [(set_attr "length" "4")
96 (set_attr "type" "mve_move")])
14782c81
SP
97
98;;
99;; [vst4q])
100;;
101(define_insn "mve_vst4q<mode>"
4269a656 102 [(set (match_operand:XI 0 "mve_struct_operand" "=Ug")
14782c81
SP
103 (unspec:XI [(match_operand:XI 1 "s_register_operand" "w")
104 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
105 VST4Q))
106 ]
107 "TARGET_HAVE_MVE"
108{
109 rtx ops[6];
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))
117 reg = XEXP (reg, 0);
118 gcc_assert (REG_P (reg));
119 ops[4] = 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);
128 return "";
129}
130 [(set_attr "length" "16")])
a50f6abf 131
e3678b44 132;;
7734b991
CL
133;; [vrndaq_f]
134;; [vrndmq_f]
135;; [vrndnq_f]
136;; [vrndpq_f]
137;; [vrndq_f]
138;; [vrndxq_f]
e3678b44 139;;
7734b991 140(define_insn "@mve_<mve_insn>q_f<mode>"
a50f6abf
SP
141 [
142 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
143 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
7734b991 144 MVE_FP_UNARY))
a50f6abf
SP
145 ]
146 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7734b991 147 "<mve_mnemo>.f%#<V_sz_elem>\t%q0, %q1"
a50f6abf
SP
148 [(set_attr "type" "mve_move")
149])
150
151;;
152;; [vrev64q_f])
153;;
0c1eb901 154(define_insn "@mve_<mve_insn>q_f<mode>"
a50f6abf 155 [
6debbff6 156 (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
a50f6abf 157 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")]
0c1eb901 158 MVE_FP_VREV64Q_ONLY))
a50f6abf
SP
159 ]
160 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
0c1eb901 161 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
a50f6abf
SP
162 [(set_attr "type" "mve_move")
163])
164
165;;
7734b991
CL
166;; [vabsq_f]
167;; [vnegq_f]
a50f6abf 168;;
7734b991 169(define_insn "mve_v<absneg_str>q_f<mode>"
a50f6abf
SP
170 [
171 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
7734b991 172 (ABSNEG:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")))
a50f6abf
SP
173 ]
174 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7734b991 175 "v<absneg_str>.f%#<V_sz_elem>\t%q0, %q1"
a50f6abf
SP
176 [(set_attr "type" "mve_move")
177])
178
179;;
180;; [vdupq_n_f])
181;;
fc468102 182(define_insn "@mve_<mve_insn>q_n_f<mode>"
a50f6abf
SP
183 [
184 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
185 (unspec:MVE_0 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
fc468102 186 MVE_FP_N_VDUPQ_ONLY))
a50f6abf
SP
187 ]
188 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
fc468102 189 "<mve_insn>.%#<V_sz_elem>\t%q0, %1"
a50f6abf
SP
190 [(set_attr "type" "mve_move")
191])
192
a50f6abf
SP
193;;
194;; [vrev32q_f])
195;;
0c1eb901 196(define_insn "@mve_<mve_insn>q_f<mode>"
a50f6abf 197 [
0c1eb901
CL
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))
a50f6abf
SP
201 ]
202 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
0c1eb901 203 "<mve_insn>.<V_sz_elem>\t%q0, %q1"
a50f6abf
SP
204 [(set_attr "type" "mve_move")
205])
206;;
207;; [vcvttq_f32_f16])
208;;
209(define_insn "mve_vcvttq_f32_f16v4sf"
210 [
211 (set (match_operand:V4SF 0 "s_register_operand" "=w")
212 (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
213 VCVTTQ_F32_F16))
214 ]
215 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 216 "vcvtt.f32.f16\t%q0, %q1"
a50f6abf
SP
217 [(set_attr "type" "mve_move")
218])
219
220;;
221;; [vcvtbq_f32_f16])
222;;
223(define_insn "mve_vcvtbq_f32_f16v4sf"
224 [
225 (set (match_operand:V4SF 0 "s_register_operand" "=w")
226 (unspec:V4SF [(match_operand:V8HF 1 "s_register_operand" "w")]
227 VCVTBQ_F32_F16))
228 ]
229 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 230 "vcvtb.f32.f16\t%q0, %q1"
a50f6abf
SP
231 [(set_attr "type" "mve_move")
232])
233
234;;
235;; [vcvtq_to_f_s, vcvtq_to_f_u])
236;;
237(define_insn "mve_vcvtq_to_f_<supf><mode>"
238 [
239 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
240 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
241 VCVTQ_TO_F))
242 ]
243 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 244 "vcvt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q1"
a50f6abf
SP
245 [(set_attr "type" "mve_move")
246])
5db0eb95
SP
247
248;;
249;; [vrev64q_u, vrev64q_s])
250;;
0c1eb901 251(define_insn "@mve_<mve_insn>q_<supf><mode>"
5db0eb95 252 [
6debbff6 253 (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
5db0eb95
SP
254 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
255 VREV64Q))
256 ]
257 "TARGET_HAVE_MVE"
0c1eb901 258 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
5db0eb95
SP
259 [(set_attr "type" "mve_move")
260])
261
262;;
263;; [vcvtq_from_f_s, vcvtq_from_f_u])
264;;
265(define_insn "mve_vcvtq_from_f_<supf><mode>"
266 [
267 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
268 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
269 VCVTQ_FROM_F))
270 ]
271 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 272 "vcvt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
5db0eb95
SP
273 [(set_attr "type" "mve_move")
274])
6df4618c
SP
275
276;;
7734b991
CL
277;; [vabsq_s]
278;; [vnegq_s]
6df4618c 279;;
7734b991 280(define_insn "mve_v<absneg_str>q_s<mode>"
6df4618c
SP
281 [
282 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
7734b991 283 (ABSNEG:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
6df4618c
SP
284 ]
285 "TARGET_HAVE_MVE"
7734b991 286 "v<absneg_str>.s%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
287 [(set_attr "type" "mve_move")
288])
289
290;;
291;; [vmvnq_u, vmvnq_s])
292;;
fd436034 293(define_insn "mve_vmvnq_u<mode>"
6df4618c
SP
294 [
295 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
fd436034 296 (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
6df4618c
SP
297 ]
298 "TARGET_HAVE_MVE"
fd436034 299 "vmvn\t%q0, %q1"
6df4618c
SP
300 [(set_attr "type" "mve_move")
301])
fd436034
CL
302(define_expand "mve_vmvnq_s<mode>"
303 [
304 (set (match_operand:MVE_2 0 "s_register_operand")
305 (not:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
306 ]
307 "TARGET_HAVE_MVE"
308)
6df4618c
SP
309
310;;
311;; [vdupq_n_u, vdupq_n_s])
312;;
fc468102 313(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
6df4618c
SP
314 [
315 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
316 (unspec:MVE_2 [(match_operand:<V_elem> 1 "s_register_operand" "r")]
317 VDUPQ_N))
318 ]
319 "TARGET_HAVE_MVE"
fc468102 320 "<mve_insn>.%#<V_sz_elem>\t%q0, %1"
6df4618c
SP
321 [(set_attr "type" "mve_move")
322])
323
324;;
325;; [vclzq_u, vclzq_s])
326;;
7969d9c8 327(define_insn "@mve_vclzq_s<mode>"
6df4618c
SP
328 [
329 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
7969d9c8 330 (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")))
6df4618c
SP
331 ]
332 "TARGET_HAVE_MVE"
16452c63 333 "vclz.i%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
334 [(set_attr "type" "mve_move")
335])
7969d9c8
CL
336(define_expand "mve_vclzq_u<mode>"
337 [
338 (set (match_operand:MVE_2 0 "s_register_operand")
339 (clz:MVE_2 (match_operand:MVE_2 1 "s_register_operand")))
340 ]
341 "TARGET_HAVE_MVE"
342)
6df4618c
SP
343
344;;
7734b991
CL
345;; [vclsq_s]
346;; [vqabsq_s]
347;; [vqnegq_s]
6df4618c 348;;
7734b991 349(define_insn "@mve_<mve_insn>q_<supf><mode>"
6df4618c
SP
350 [
351 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
352 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")]
7734b991 353 MVE_INT_UNARY))
6df4618c
SP
354 ]
355 "TARGET_HAVE_MVE"
7734b991 356 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
357 [(set_attr "type" "mve_move")
358])
359
360;;
361;; [vaddvq_s, vaddvq_u])
362;;
eb1ded46 363(define_insn "@mve_<mve_insn>q_<supf><mode>"
6df4618c 364 [
3d537943 365 (set (match_operand:SI 0 "s_register_operand" "=Te")
6df4618c
SP
366 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")]
367 VADDVQ))
368 ]
369 "TARGET_HAVE_MVE"
eb1ded46 370 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q1"
6df4618c
SP
371 [(set_attr "type" "mve_move")
372])
373
6df4618c
SP
374;;
375;; [vrev32q_u, vrev32q_s])
376;;
0c1eb901 377(define_insn "@mve_<mve_insn>q_<supf><mode>"
6df4618c
SP
378 [
379 (set (match_operand:MVE_3 0 "s_register_operand" "=w")
380 (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "w")]
381 VREV32Q))
382 ]
383 "TARGET_HAVE_MVE"
0c1eb901 384 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
385 [(set_attr "type" "mve_move")
386])
387
388;;
51fca3e1
CL
389;; [vmovlbq_s, vmovlbq_u]
390;; [vmovltq_u, vmovltq_s]
6df4618c 391;;
51fca3e1 392(define_insn "@mve_<mve_insn>q_<supf><mode>"
6df4618c
SP
393 [
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")]
51fca3e1 396 VMOVLxQ))
6df4618c
SP
397 ]
398 "TARGET_HAVE_MVE"
51fca3e1 399 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
400 [(set_attr "type" "mve_move")
401])
402
403;;
404;; [vcvtpq_s, vcvtpq_u])
405;;
406(define_insn "mve_vcvtpq_<supf><mode>"
407 [
408 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
409 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
410 VCVTPQ))
411 ]
412 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 413 "vcvtp.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
414 [(set_attr "type" "mve_move")
415])
416
417;;
418;; [vcvtnq_s, vcvtnq_u])
419;;
420(define_insn "mve_vcvtnq_<supf><mode>"
421 [
422 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
423 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
424 VCVTNQ))
425 ]
426 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 427 "vcvtn.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
428 [(set_attr "type" "mve_move")
429])
430
431;;
432;; [vcvtmq_s, vcvtmq_u])
433;;
434(define_insn "mve_vcvtmq_<supf><mode>"
435 [
436 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
437 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
438 VCVTMQ))
439 ]
440 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 441 "vcvtm.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
442 [(set_attr "type" "mve_move")
443])
444
445;;
446;; [vcvtaq_u, vcvtaq_s])
447;;
448(define_insn "mve_vcvtaq_<supf><mode>"
449 [
450 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
451 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")]
452 VCVTAQ))
453 ]
454 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 455 "vcvta.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q1"
6df4618c
SP
456 [(set_attr "type" "mve_move")
457])
5db0eb95
SP
458
459;;
460;; [vmvnq_n_u, vmvnq_n_s])
461;;
b74d6acf 462(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
5db0eb95
SP
463 [
464 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
0d0aaea1 465 (unspec:MVE_5 [(match_operand:<V_elem> 1 "immediate_operand" "i")]
5db0eb95
SP
466 VMVNQ_N))
467 ]
468 "TARGET_HAVE_MVE"
b74d6acf 469 "<mve_insn>.i%#<V_sz_elem>\t%q0, %1"
5db0eb95
SP
470 [(set_attr "type" "mve_move")
471])
6df4618c
SP
472
473;;
474;; [vrev16q_u, vrev16q_s])
475;;
0c1eb901 476(define_insn "@mve_<mve_insn>q_<supf><mode>"
6df4618c 477 [
0c1eb901
CL
478 (set (match_operand:MVE_V16QI 0 "s_register_operand" "=w")
479 (unspec:MVE_V16QI [(match_operand:MVE_V16QI 1 "s_register_operand" "w")]
6df4618c
SP
480 VREV16Q))
481 ]
482 "TARGET_HAVE_MVE"
0c1eb901 483 "<mve_insn>.<V_sz_elem>\t%q0, %q1"
6df4618c
SP
484 [(set_attr "type" "mve_move")
485])
486
487;;
488;; [vaddlvq_s vaddlvq_u])
489;;
fa2c9dbb 490(define_insn "@mve_<mve_insn>q_<supf>v4si"
6df4618c
SP
491 [
492 (set (match_operand:DI 0 "s_register_operand" "=r")
493 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")]
494 VADDLVQ))
495 ]
496 "TARGET_HAVE_MVE"
fa2c9dbb 497 "<mve_insn>.<supf>32\t%Q0, %R0, %q1"
6df4618c
SP
498 [(set_attr "type" "mve_move")
499])
a475f153
SP
500
501;;
502;; [vctp8q vctp16q vctp32q vctp64q])
503;;
e0bc13d3 504(define_insn "mve_vctp<MVE_vctp>q<MVE_vpred>"
a475f153 505 [
e0bc13d3
AV
506 (set (match_operand:MVE_7 0 "vpr_register_operand" "=Up")
507 (unspec:MVE_7 [(match_operand:SI 1 "s_register_operand" "r")]
508 VCTP))
a475f153
SP
509 ]
510 "TARGET_HAVE_MVE"
f2dd012a 511 "vctp.<MVE_vctp>\t%1"
a475f153
SP
512 [(set_attr "type" "mve_move")
513])
514
515;;
516;; [vpnot])
517;;
e0bc13d3 518(define_insn "mve_vpnotv16bi"
a475f153 519 [
e0bc13d3
AV
520 (set (match_operand:V16BI 0 "vpr_register_operand" "=Up")
521 (unspec:V16BI [(match_operand:V16BI 1 "vpr_register_operand" "0")]
a475f153
SP
522 VPNOT))
523 ]
524 "TARGET_HAVE_MVE"
525 "vpnot"
526 [(set_attr "type" "mve_move")
527])
4be8cf77 528
4be8cf77
SP
529;;
530;; [vbrsrq_n_f])
531;;
6ff07398 532(define_insn "@mve_<mve_insn>q_n_f<mode>"
4be8cf77
SP
533 [
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")]
6ff07398 537 MVE_VBRSR_N_FP))
4be8cf77
SP
538 ]
539 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6ff07398 540 "<mve_insn>.<V_sz_elem>\t%q0, %q1, %2"
4be8cf77
SP
541 [(set_attr "type" "mve_move")
542])
543
544;;
545;; [vcvtq_n_to_f_s, vcvtq_n_to_f_u])
546;;
547(define_insn "mve_vcvtq_n_to_f_<supf><mode>"
548 [
549 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
550 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
d2ce75fe 551 (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
4be8cf77
SP
552 VCVTQ_N_TO_F))
553 ]
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")
557])
558
559;; [vcreateq_f])
560;;
dd04568f 561(define_insn "@mve_<mve_insn>q_f<mode>"
4be8cf77
SP
562 [
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")]
dd04568f 566 MVE_FP_CREATE_ONLY))
4be8cf77
SP
567 ]
568 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3f0ca7a3 569 "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
4be8cf77
SP
570 [(set_attr "type" "mve_move")
571 (set_attr "length""8")])
f166a8cd
SP
572
573;;
574;; [vcreateq_u, vcreateq_s])
575;;
dd04568f 576(define_insn "@mve_<mve_insn>q_<supf><mode>"
f166a8cd
SP
577 [
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")]
581 VCREATEQ))
582 ]
583 "TARGET_HAVE_MVE"
3f0ca7a3 584 "vmov %q0[2], %q0[0], %Q1, %Q2\;vmov %q0[3], %q0[1], %R1, %R2"
f166a8cd
SP
585 [(set_attr "type" "mve_move")
586 (set_attr "length""8")])
587
588;;
6bb8a5bd
CL
589;; [vrshrq_n_s, vrshrq_n_u]
590;; [vshrq_n_s, vshrq_n_u]
f166a8cd 591;;
bfab3550 592;; Version that takes an immediate as operand 2.
6bb8a5bd 593(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
f166a8cd
SP
594 [
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>")]
6bb8a5bd 598 MVE_VSHRQ_N))
f166a8cd
SP
599 ]
600 "TARGET_HAVE_MVE"
6bb8a5bd 601 "<mve_insn>.<supf><V_sz_elem>\t%q0, %q1, %2"
f166a8cd
SP
602 [(set_attr "type" "mve_move")
603])
604
bfab3550
CL
605;; Versions that take constant vectors as operand 2 (with all elements
606;; equal).
607(define_insn "mve_vshrq_n_s<mode>_imm"
608 [
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")))
612 ]
613 "TARGET_HAVE_MVE"
614 {
615 return neon_output_shift_immediate ("vshr", 's', &operands[2],
616 <MODE>mode,
617 VALID_NEON_QREG_MODE (<MODE>mode),
618 true);
619 }
620 [(set_attr "type" "mve_move")
621])
622(define_insn "mve_vshrq_n_u<mode>_imm"
623 [
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")))
627 ]
628 "TARGET_HAVE_MVE"
629 {
630 return neon_output_shift_immediate ("vshr", 'u', &operands[2],
631 <MODE>mode,
632 VALID_NEON_QREG_MODE (<MODE>mode),
633 true);
634 }
635 [(set_attr "type" "mve_move")
636])
637
f166a8cd
SP
638;;
639;; [vcvtq_n_from_f_s, vcvtq_n_from_f_u])
640;;
641(define_insn "mve_vcvtq_n_from_f_<supf><mode>"
642 [
643 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
644 (unspec:MVE_5 [(match_operand:<MVE_CNVT> 1 "s_register_operand" "w")
d2ce75fe 645 (match_operand:SI 2 "<MVE_pred2>" "<MVE_constraint2>")]
f166a8cd
SP
646 VCVTQ_N_FROM_F))
647 ]
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")
651])
d71dba7b
SP
652
653;;
654;; [vaddlvq_p_s])
655;;
fa2c9dbb 656(define_insn "@mve_<mve_insn>q_p_<supf>v4si"
d71dba7b
SP
657 [
658 (set (match_operand:DI 0 "s_register_operand" "=r")
659 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
c6b4ea7a 660 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
d71dba7b
SP
661 VADDLVQ_P))
662 ]
663 "TARGET_HAVE_MVE"
fa2c9dbb 664 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q1"
d71dba7b
SP
665 [(set_attr "type" "mve_move")
666 (set_attr "length""8")])
667
668;;
d083fbf7 669;; [vcmpneq_, vcmpcsq_, vcmpeqq_, vcmpgeq_, vcmpgtq_, vcmphiq_, vcmpleq_, vcmpltq_])
d71dba7b 670;;
a6eacbf1 671(define_insn "@mve_vcmp<mve_cmp_op>q_<mode>"
d71dba7b 672 [
91224cf6
CL
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")
d083fbf7
CL
675 (match_operand:MVE_2 2 "s_register_operand" "w")))
676 ]
677 "TARGET_HAVE_MVE"
1fa5a447 678 "vcmp.<mve_cmp_type>%#<V_sz_elem>\t<mve_cmp_op>, %q1, %q2"
d083fbf7
CL
679 [(set_attr "type" "mve_move")
680])
681
682;;
683;; [vcmpcsq_n_, vcmpeqq_n_, vcmpgeq_n_, vcmpgtq_n_, vcmphiq_n_, vcmpleq_n_, vcmpltq_n_, vcmpneq_n_])
684;;
6a08718a 685(define_insn "@mve_vcmp<mve_cmp_op>q_n_<mode>"
d083fbf7 686 [
e6a4aefc 687 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
ed34c3bc
AV
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"))))
d71dba7b
SP
691 ]
692 "TARGET_HAVE_MVE"
d083fbf7 693 "vcmp.<mve_cmp_type>%#<V_sz_elem> <mve_cmp_op>, %q1, %2"
d71dba7b
SP
694 [(set_attr "type" "mve_move")
695])
696
697;;
698;; [vshlq_s, vshlq_u])
7432f255 699;; See vec-common.md
33203b4c
SP
700
701;;
3fe5a244
CL
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]
707;; [vqdmulhq_s]
708;; [vqrdmulhq_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]
33203b4c 715;;
3fe5a244 716(define_insn "@mve_<mve_insn>q_<supf><mode>"
33203b4c
SP
717 [
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")]
3fe5a244 721 MVE_INT_SU_BINARY))
33203b4c
SP
722 ]
723 "TARGET_HAVE_MVE"
3fe5a244 724 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
33203b4c
SP
725 [(set_attr "type" "mve_move")
726])
727
728;;
b0b3a5e9
CL
729;; [vaddq_n_s, vaddq_n_u]
730;; [vsubq_n_s, vsubq_n_u]
731;; [vmulq_n_s, vmulq_n_u]
33203b4c 732;;
b0b3a5e9 733(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
734 [
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")]
b0b3a5e9 738 MVE_INT_N_BINARY))
33203b4c
SP
739 ]
740 "TARGET_HAVE_MVE"
b0b3a5e9 741 "<mve_insn>.i%#<V_sz_elem>\t%q0, %q1, %2"
33203b4c
SP
742 [(set_attr "type" "mve_move")
743])
744
745;;
746;; [vaddvaq_s, vaddvaq_u])
747;;
782eb6bb 748(define_insn "@mve_<mve_insn>q_<supf><mode>"
33203b4c 749 [
3d537943 750 (set (match_operand:SI 0 "s_register_operand" "=Te")
33203b4c
SP
751 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
752 (match_operand:MVE_2 2 "s_register_operand" "w")]
753 VADDVAQ))
754 ]
755 "TARGET_HAVE_MVE"
782eb6bb 756 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2"
33203b4c
SP
757 [(set_attr "type" "mve_move")
758])
759
760;;
761;; [vaddvq_p_u, vaddvq_p_s])
762;;
eb1ded46 763(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
33203b4c 764 [
3d537943 765 (set (match_operand:SI 0 "s_register_operand" "=Te")
33203b4c 766 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
724d6566 767 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
33203b4c
SP
768 VADDVQ_P))
769 ]
770 "TARGET_HAVE_MVE"
eb1ded46 771 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q1"
33203b4c
SP
772 [(set_attr "type" "mve_move")
773 (set_attr "length""8")])
774
775;;
776;; [vandq_u, vandq_s])
777;;
11a0beff
CL
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>"
33203b4c 783 [
11a0beff
CL
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")))
33203b4c
SP
787 ]
788 "TARGET_HAVE_MVE"
11a0beff
CL
789 "@
790 vand\t%q0, %q1, %q2
791 * return neon_output_logic_immediate (\"vand\", &operands[2], <MODE>mode, 1, VALID_NEON_QREG_MODE (<MODE>mode));"
33203b4c
SP
792 [(set_attr "type" "mve_move")
793])
11a0beff
CL
794(define_expand "mve_vandq_s<mode>"
795 [
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")))
799 ]
800 "TARGET_HAVE_MVE"
801)
33203b4c
SP
802
803;;
804;; [vbicq_s, vbicq_u])
805;;
5391cf07 806(define_insn "mve_vbicq_u<mode>"
33203b4c
SP
807 [
808 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
5391cf07
CL
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")))
33203b4c
SP
811 ]
812 "TARGET_HAVE_MVE"
5391cf07 813 "vbic\t%q0, %q1, %q2"
33203b4c
SP
814 [(set_attr "type" "mve_move")
815])
816
5391cf07
CL
817(define_expand "mve_vbicq_s<mode>"
818 [
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")))
822 ]
823 "TARGET_HAVE_MVE"
824)
825
33203b4c
SP
826;;
827;; [vbrsrq_n_u, vbrsrq_n_s])
828;;
6ff07398 829(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
830 [
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")]
834 VBRSRQ_N))
835 ]
836 "TARGET_HAVE_MVE"
6ff07398 837 "<mve_insn>.%#<V_sz_elem>\t%q0, %q1, %2"
33203b4c
SP
838 [(set_attr "type" "mve_move")
839])
840
841;;
b22e70e8
CL
842;; [vcaddq_rot90_s, vcadd_rot90_u]
843;; [vcaddq_rot270_s, vcadd_rot270_u]
844;; [vhcaddq_rot90_s]
845;; [vhcaddq_rot270_s]
33203b4c 846;;
b22e70e8 847(define_insn "@mve_<mve_insn>q<mve_rot>_<supf><mode>"
33203b4c 848 [
6debbff6 849 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
33203b4c
SP
850 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
851 (match_operand:MVE_2 2 "s_register_operand" "w")]
b22e70e8 852 VxCADDQ))
33203b4c
SP
853 ]
854 "TARGET_HAVE_MVE"
b22e70e8 855 "<mve_insn>.<isu>%#<V_sz_elem>\t%q0, %q1, %q2, #<rot>"
33203b4c
SP
856 [(set_attr "type" "mve_move")
857])
858
9732dc85
TC
859;; Auto vectorizer pattern for int vcadd
860(define_expand "cadd<rot><mode>3"
861 [(set (match_operand:MVE_2 0 "register_operand")
862 (unspec:MVE_2 [(match_operand:MVE_2 1 "register_operand")
863 (match_operand:MVE_2 2 "register_operand")]
864 VCADD))]
865 "TARGET_HAVE_MVE && !BYTES_BIG_ENDIAN"
866)
33203b4c 867
33203b4c
SP
868;;
869;; [veorq_u, veorq_s])
870;;
434fb3b6 871(define_insn "mve_veorq_u<mode>"
33203b4c
SP
872 [
873 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
434fb3b6
CL
874 (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
875 (match_operand:MVE_2 2 "s_register_operand" "w")))
33203b4c
SP
876 ]
877 "TARGET_HAVE_MVE"
434fb3b6 878 "veor\t%q0, %q1, %q2"
33203b4c
SP
879 [(set_attr "type" "mve_move")
880])
434fb3b6
CL
881(define_expand "mve_veorq_s<mode>"
882 [
883 (set (match_operand:MVE_2 0 "s_register_operand")
884 (xor:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
885 (match_operand:MVE_2 2 "s_register_operand")))
886 ]
887 "TARGET_HAVE_MVE"
888)
33203b4c
SP
889
890;;
111f474f
CL
891;; [vhaddq_n_u, vhaddq_n_s]
892;; [vhsubq_n_u, vhsubq_n_s]
893;; [vqaddq_n_s, vqaddq_n_u]
894;; [vqdmulhq_n_s]
895;; [vqrdmulhq_n_s]
896;; [vqsubq_n_s, vqsubq_n_u]
33203b4c 897;;
111f474f 898(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
899 [
900 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
901 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
902 (match_operand:<V_elem> 2 "s_register_operand" "r")]
111f474f 903 MVE_INT_SU_N_BINARY))
33203b4c
SP
904 ]
905 "TARGET_HAVE_MVE"
111f474f 906 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
33203b4c
SP
907 [(set_attr "type" "mve_move")
908])
909
33203b4c 910;;
dcc05862
CL
911;; [vmaxaq_s]
912;; [vminaq_s]
33203b4c 913;;
dcc05862 914(define_insn "@mve_<mve_insn>q_<supf><mode>"
33203b4c
SP
915 [
916 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
917 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
918 (match_operand:MVE_2 2 "s_register_operand" "w")]
dcc05862 919 MVE_VMAXAVMINAQ))
33203b4c
SP
920 ]
921 "TARGET_HAVE_MVE"
dcc05862 922 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q2"
33203b4c
SP
923 [(set_attr "type" "mve_move")
924])
925
33203b4c 926;;
bcf66a4d
CL
927;; [vmaxq_u, vmaxq_s]
928;; [vminq_s, vminq_u]
33203b4c 929;;
bcf66a4d 930(define_insn "mve_<max_min_su_str>q_<max_min_supf><mode>"
33203b4c
SP
931 [
932 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
bcf66a4d 933 (MAX_MIN_SU:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
76835dca 934 (match_operand:MVE_2 2 "s_register_operand" "w")))
33203b4c
SP
935 ]
936 "TARGET_HAVE_MVE"
bcf66a4d 937 "<max_min_su_str>.<max_min_supf>%#<V_sz_elem>\t%q0, %q1, %q2"
76835dca
DZ
938 [(set_attr "type" "mve_move")
939])
940
33203b4c
SP
941
942;;
16c5aca6
CL
943;; [vmaxavq_s]
944;; [vmaxvq_u, vmaxvq_s]
945;; [vminavq_s]
946;; [vminvq_u, vminvq_s]
33203b4c 947;;
16c5aca6 948(define_insn "@mve_<mve_insn>q_<supf><mode>"
33203b4c
SP
949 [
950 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
951 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
952 (match_operand:MVE_2 2 "s_register_operand" "w")]
16c5aca6 953 MVE_VMAXVQ_VMINVQ))
33203b4c
SP
954 ]
955 "TARGET_HAVE_MVE"
16c5aca6 956 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2"
33203b4c
SP
957 [(set_attr "type" "mve_move")
958])
959
33203b4c 960;;
1817749d
CL
961;; [vmladavq_u, vmladavq_s]
962;; [vmladavxq_s]
963;; [vmlsdavq_s]
964;; [vmlsdavxq_s]
33203b4c 965;;
1817749d 966(define_insn "@mve_<mve_insn>q_<supf><mode>"
33203b4c 967 [
3d537943 968 (set (match_operand:SI 0 "s_register_operand" "=Te")
33203b4c
SP
969 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
970 (match_operand:MVE_2 2 "s_register_operand" "w")]
1817749d 971 MVE_VMLxDAVQ))
33203b4c
SP
972 ]
973 "TARGET_HAVE_MVE"
1817749d 974 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
33203b4c
SP
975 [(set_attr "type" "mve_move")
976])
977
33203b4c
SP
978;;
979;; [vmullbq_int_u, vmullbq_int_s])
980;;
981(define_insn "mve_vmullbq_int_<supf><mode>"
982 [
6debbff6 983 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
33203b4c
SP
984 (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
985 (match_operand:MVE_2 2 "s_register_operand" "w")]
986 VMULLBQ_INT))
987 ]
988 "TARGET_HAVE_MVE"
989 "vmullb.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
990 [(set_attr "type" "mve_move")
991])
992
993;;
994;; [vmulltq_int_u, vmulltq_int_s])
995;;
996(define_insn "mve_vmulltq_int_<supf><mode>"
997 [
6debbff6 998 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
33203b4c
SP
999 (unspec:<V_double_width> [(match_operand:MVE_2 1 "s_register_operand" "w")
1000 (match_operand:MVE_2 2 "s_register_operand" "w")]
1001 VMULLTQ_INT))
1002 ]
1003 "TARGET_HAVE_MVE"
1004 "vmullt.<supf>%#<V_sz_elem>\t%q0, %q1, %q2"
1005 [(set_attr "type" "mve_move")
1006])
1007
1008;;
b0b3a5e9
CL
1009;; [vaddq_s, vaddq_u]
1010;; [vmulq_u, vmulq_s]
1011;; [vsubq_s, vsubq_u]
33203b4c 1012;;
b0b3a5e9 1013(define_insn "mve_<mve_addsubmul>q<mode>"
0f41b5e0
DZ
1014 [
1015 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
b0b3a5e9
CL
1016 (MVE_INT_BINARY_RTX:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w")
1017 (match_operand:MVE_2 2 "s_register_operand" "w")))
0f41b5e0
DZ
1018 ]
1019 "TARGET_HAVE_MVE"
b0b3a5e9 1020 "<mve_addsubmul>.i%#<V_sz_elem>\t%q0, %q1, %q2"
0f41b5e0
DZ
1021 [(set_attr "type" "mve_move")
1022])
1023
33203b4c
SP
1024;;
1025;; [vornq_u, vornq_s])
1026;;
250fd9fb 1027(define_insn "mve_vornq_s<mode>"
33203b4c
SP
1028 [
1029 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
250fd9fb
CL
1030 (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand" "w"))
1031 (match_operand:MVE_2 1 "s_register_operand" "w")))
33203b4c
SP
1032 ]
1033 "TARGET_HAVE_MVE"
250fd9fb 1034 "vorn\t%q0, %q1, %q2"
33203b4c
SP
1035 [(set_attr "type" "mve_move")
1036])
1037
250fd9fb
CL
1038(define_expand "mve_vornq_u<mode>"
1039 [
1040 (set (match_operand:MVE_2 0 "s_register_operand")
1041 (ior:MVE_2 (not:MVE_2 (match_operand:MVE_2 2 "s_register_operand"))
1042 (match_operand:MVE_2 1 "s_register_operand")))
1043 ]
1044 "TARGET_HAVE_MVE"
1045)
1046
33203b4c
SP
1047;;
1048;; [vorrq_s, vorrq_u])
1049;;
75de6a28
CL
1050;; signed and unsigned versions are the same: define the unsigned
1051;; insn, and use an expander for the signed one as we still reference
1052;; both names from arm_mve.h.
1053;; We use the same code as in neon.md (TODO: avoid this duplication).
1054(define_insn "mve_vorrq_s<mode>"
33203b4c 1055 [
75de6a28
CL
1056 (set (match_operand:MVE_2 0 "s_register_operand" "=w,w")
1057 (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand" "w,0")
1058 (match_operand:MVE_2 2 "neon_logic_op2" "w,Dl")))
33203b4c
SP
1059 ]
1060 "TARGET_HAVE_MVE"
75de6a28
CL
1061 "@
1062 vorr\t%q0, %q1, %q2
1063 * return neon_output_logic_immediate (\"vorr\", &operands[2], <MODE>mode, 0, VALID_NEON_QREG_MODE (<MODE>mode));"
33203b4c
SP
1064 [(set_attr "type" "mve_move")
1065])
75de6a28
CL
1066(define_expand "mve_vorrq_u<mode>"
1067 [
1068 (set (match_operand:MVE_2 0 "s_register_operand")
1069 (ior:MVE_2 (match_operand:MVE_2 1 "s_register_operand")
1070 (match_operand:MVE_2 2 "neon_logic_op2")))
1071 ]
1072 "TARGET_HAVE_MVE"
1073)
33203b4c 1074
33203b4c 1075;;
c4d4e62b
CL
1076;; [vqrshlq_n_s, vqrshlq_n_u]
1077;; [vrshlq_n_u, vrshlq_n_s]
33203b4c 1078;;
c4d4e62b 1079(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
1080 [
1081 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1082 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1083 (match_operand:SI 2 "s_register_operand" "r")]
c4d4e62b 1084 MVE_RSHIFT_N))
33203b4c
SP
1085 ]
1086 "TARGET_HAVE_MVE"
c4d4e62b 1087 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %2"
33203b4c
SP
1088 [(set_attr "type" "mve_move")
1089])
1090
33203b4c 1091;;
7e6c39a3
CL
1092;; [vqshlq_n_s, vqshlq_n_u]
1093;; [vshlq_n_u, vshlq_n_s]
33203b4c 1094;;
7e6c39a3 1095(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
1096 [
1097 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1098 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
1099 (match_operand:SI 2 "immediate_operand" "i")]
7e6c39a3 1100 MVE_SHIFT_N))
33203b4c
SP
1101 ]
1102 "TARGET_HAVE_MVE"
7e6c39a3 1103 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
33203b4c
SP
1104 [(set_attr "type" "mve_move")
1105])
1106
1107;;
7e6c39a3
CL
1108;; [vqshlq_r_u, vqshlq_r_s]
1109;; [vshlq_r_s, vshlq_r_u]
33203b4c 1110;;
7e6c39a3 1111(define_insn "@mve_<mve_insn>q_r_<supf><mode>"
33203b4c
SP
1112 [
1113 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1114 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1115 (match_operand:SI 2 "s_register_operand" "r")]
7e6c39a3 1116 MVE_SHIFT_R))
33203b4c
SP
1117 ]
1118 "TARGET_HAVE_MVE"
7e6c39a3 1119 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %2"
33203b4c
SP
1120 [(set_attr "type" "mve_move")
1121])
1122
33203b4c
SP
1123;;
1124;; [vqshluq_n_s])
1125;;
85c463f5 1126(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
33203b4c
SP
1127 [
1128 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1129 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "w")
c3fb6658 1130 (match_operand:SI 2 "<MVE_pred>" "<MVE_constraint>")]
85c463f5 1131 VQSHLUQ_N))
33203b4c
SP
1132 ]
1133 "TARGET_HAVE_MVE"
85c463f5 1134 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
33203b4c
SP
1135 [(set_attr "type" "mve_move")
1136])
1137
f9355dee 1138;;
1736f4af 1139;; [vabdq_f]
f9355dee 1140;;
1736f4af 1141(define_insn "@mve_<mve_insn>q_f<mode>"
f9355dee
SP
1142 [
1143 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1144 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1145 (match_operand:MVE_0 2 "s_register_operand" "w")]
1736f4af 1146 MVE_FP_VABDQ_ONLY))
f9355dee
SP
1147 ]
1148 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1736f4af 1149 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q1, %q2"
f9355dee
SP
1150 [(set_attr "type" "mve_move")
1151])
1152
1153;;
1154;; [vaddlvaq_s vaddlvaq_u])
1155;;
42c94cce 1156(define_insn "@mve_<mve_insn>q_<supf>v4si"
f9355dee
SP
1157 [
1158 (set (match_operand:DI 0 "s_register_operand" "=r")
1159 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
1160 (match_operand:V4SI 2 "s_register_operand" "w")]
1161 VADDLVAQ))
1162 ]
1163 "TARGET_HAVE_MVE"
42c94cce 1164 "<mve_insn>.<supf>32\t%Q0, %R0, %q2"
f9355dee
SP
1165 [(set_attr "type" "mve_move")
1166])
1167
1168;;
b0b3a5e9
CL
1169;; [vaddq_n_f]
1170;; [vsubq_n_f]
1171;; [vmulq_n_f]
f9355dee 1172;;
b0b3a5e9 1173(define_insn "@mve_<mve_insn>q_n_f<mode>"
f9355dee
SP
1174 [
1175 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1176 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1177 (match_operand:<V_elem> 2 "s_register_operand" "r")]
b0b3a5e9 1178 MVE_FP_N_BINARY))
f9355dee
SP
1179 ]
1180 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
b0b3a5e9 1181 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q1, %2"
f9355dee
SP
1182 [(set_attr "type" "mve_move")
1183])
1184
1185;;
1186;; [vandq_f])
1187;;
1188(define_insn "mve_vandq_f<mode>"
1189 [
1190 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
11a0beff
CL
1191 (and:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1192 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1193 ]
1194 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1195 "vand\t%q0, %q1, %q2"
f9355dee
SP
1196 [(set_attr "type" "mve_move")
1197])
1198
1199;;
1200;; [vbicq_f])
1201;;
1202(define_insn "mve_vbicq_f<mode>"
1203 [
1204 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
5391cf07
CL
1205 (and:MVE_0 (not:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w"))
1206 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1207 ]
1208 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1209 "vbic\t%q0, %q1, %q2"
f9355dee
SP
1210 [(set_attr "type" "mve_move")
1211])
1212
f9355dee 1213;;
b22e70e8 1214;; [vcaddq_rot90_f, vcaddq_rot270_f]
0c5ba73a 1215;; [vcmulq, vcmulq_rot90, vcmulq_rot180, vcmulq_rot270]
3cc4e183 1216;;
b22e70e8 1217(define_insn "@mve_<mve_insn>q<mve_rot>_f<mode>"
3cc4e183
TC
1218 [
1219 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
1220 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
1221 (match_operand:MVE_0 2 "s_register_operand" "w")]
0c5ba73a 1222 MVE_VCADDQ_VCMULQ))
3cc4e183
TC
1223 ]
1224 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
b22e70e8 1225 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q1, %q2, #<rot>"
f9355dee
SP
1226 [(set_attr "type" "mve_move")
1227])
1228
1229;;
902692c1 1230;; [vcmpeqq_f, vcmpgeq_f, vcmpgtq_f, vcmpleq_f, vcmpltq_f, vcmpneq_f])
f9355dee 1231;;
a6eacbf1 1232(define_insn "@mve_vcmp<mve_cmp_op>q_f<mode>"
f9355dee 1233 [
91224cf6
CL
1234 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1235 (MVE_FP_COMPARISONS:<MVE_VPRED> (match_operand:MVE_0 1 "s_register_operand" "w")
902692c1 1236 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1237 ]
1238 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
902692c1 1239 "vcmp.f%#<V_sz_elem> <mve_cmp_op>, %q1, %q2"
f9355dee
SP
1240 [(set_attr "type" "mve_move")
1241])
1242
1243;;
902692c1 1244;; [vcmpeqq_n_f, vcmpgeq_n_f, vcmpgtq_n_f, vcmpleq_n_f, vcmpltq_n_f, vcmpneq_n_f])
f9355dee 1245;;
a6eacbf1 1246(define_insn "@mve_vcmp<mve_cmp_op>q_n_f<mode>"
f9355dee 1247 [
e6a4aefc 1248 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
ed34c3bc
AV
1249 (MVE_FP_COMPARISONS:<MVE_VPRED>
1250 (match_operand:MVE_0 1 "s_register_operand" "w")
1251 (vec_duplicate:MVE_0 (match_operand:<V_elem> 2 "s_register_operand" "r"))))
f9355dee
SP
1252 ]
1253 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
902692c1 1254 "vcmp.f%#<V_sz_elem> <mve_cmp_op>, %q1, %2"
f9355dee
SP
1255 [(set_attr "type" "mve_move")
1256])
1257
f9355dee
SP
1258;;
1259;; [vctp8q_m vctp16q_m vctp32q_m vctp64q_m])
1260;;
e0bc13d3 1261(define_insn "mve_vctp<MVE_vctp>q_m<MVE_vpred>"
f9355dee 1262 [
e0bc13d3
AV
1263 (set (match_operand:MVE_7 0 "vpr_register_operand" "=Up")
1264 (unspec:MVE_7 [(match_operand:SI 1 "s_register_operand" "r")
1265 (match_operand:MVE_7 2 "vpr_register_operand" "Up")]
1266 VCTP_M))
f9355dee
SP
1267 ]
1268 "TARGET_HAVE_MVE"
f2dd012a 1269 "vpst\;vctpt.<MVE_vctp>\t%1"
f9355dee
SP
1270 [(set_attr "type" "mve_move")
1271 (set_attr "length""8")])
1272
1273;;
1274;; [vcvtbq_f16_f32])
1275;;
1276(define_insn "mve_vcvtbq_f16_f32v8hf"
1277 [
1278 (set (match_operand:V8HF 0 "s_register_operand" "=w")
1279 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1280 (match_operand:V4SF 2 "s_register_operand" "w")]
1281 VCVTBQ_F16_F32))
1282 ]
1283 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1284 "vcvtb.f16.f32\t%q0, %q2"
f9355dee
SP
1285 [(set_attr "type" "mve_move")
1286])
1287
1288;;
1289;; [vcvttq_f16_f32])
1290;;
1291(define_insn "mve_vcvttq_f16_f32v8hf"
1292 [
1293 (set (match_operand:V8HF 0 "s_register_operand" "=w")
1294 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
1295 (match_operand:V4SF 2 "s_register_operand" "w")]
1296 VCVTTQ_F16_F32))
1297 ]
1298 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1299 "vcvtt.f16.f32\t%q0, %q2"
f9355dee
SP
1300 [(set_attr "type" "mve_move")
1301])
1302
1303;;
1304;; [veorq_f])
1305;;
1306(define_insn "mve_veorq_f<mode>"
1307 [
1308 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
434fb3b6
CL
1309 (xor:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1310 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1311 ]
1312 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1313 "veor\t%q0, %q1, %q2"
f9355dee
SP
1314 [(set_attr "type" "mve_move")
1315])
1316
1317;;
26d6e02c
CL
1318;; [vmaxnmaq_f]
1319;; [vminnmaq_f]
f9355dee 1320;;
26d6e02c 1321(define_insn "@mve_<mve_insn>q_f<mode>"
f9355dee
SP
1322 [
1323 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1324 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
1325 (match_operand:MVE_0 2 "s_register_operand" "w")]
26d6e02c 1326 MVE_VMAXNMA_VMINNMAQ))
f9355dee
SP
1327 ]
1328 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
26d6e02c 1329 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q2"
f9355dee
SP
1330 [(set_attr "type" "mve_move")
1331])
1332
1333;;
d814dc9d
CL
1334;; [vmaxnmavq_f]
1335;; [vmaxnmvq_f]
1336;; [vminnmavq_f]
1337;; [vminnmvq_f]
f9355dee 1338;;
d814dc9d 1339(define_insn "@mve_<mve_insn>q_f<mode>"
f9355dee
SP
1340 [
1341 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1342 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1343 (match_operand:MVE_0 2 "s_register_operand" "w")]
d814dc9d 1344 MVE_VMAXNMxV_MINNMxVQ))
f9355dee
SP
1345 ]
1346 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
d814dc9d 1347 "<mve_insn>.f%#<V_sz_elem>\t%0, %q2"
f9355dee
SP
1348 [(set_attr "type" "mve_move")
1349])
1350
1351;;
5ea7a47c
CL
1352;; [vmaxnmq_f]
1353;; [vminnmq_f]
f9355dee 1354;;
5ea7a47c 1355(define_insn "@mve_<max_min_f_str>q_f<mode>"
f9355dee
SP
1356 [
1357 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
5ea7a47c
CL
1358 (MAX_MIN_F:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1359 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1360 ]
1361 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5ea7a47c 1362 "<max_min_f_str>.f%#<V_sz_elem> %q0, %q1, %q2"
f9355dee
SP
1363 [(set_attr "type" "mve_move")
1364])
1365
f9355dee 1366;;
c1e068e4
CL
1367;; [vmlaldavq_u, vmlaldavq_s]
1368;; [vmlaldavxq_s]
1369;; [vmlsldavq_s]
1370;; [vmlsldavxq_s]
f9355dee 1371;;
c1e068e4 1372(define_insn "@mve_<mve_insn>q_<supf><mode>"
f9355dee
SP
1373 [
1374 (set (match_operand:DI 0 "s_register_operand" "=r")
1375 (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
1376 (match_operand:MVE_5 2 "s_register_operand" "w")]
c1e068e4 1377 MVE_VMLxLDAVxQ))
f9355dee
SP
1378 ]
1379 "TARGET_HAVE_MVE"
c1e068e4 1380 "<mve_insn>.<supf>%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
f9355dee
SP
1381 [(set_attr "type" "mve_move")
1382])
1383
1384;;
7f49b4a0
CL
1385;; [vmovnbq_u, vmovnbq_s]
1386;; [vmovntq_s, vmovntq_u]
1387;; [vqmovnbq_u, vqmovnbq_s]
1388;; [vqmovntq_u, vqmovntq_s]
1389;; [vqmovunbq_s]
1390;; [vqmovuntq_s]
f9355dee 1391;;
7f49b4a0 1392(define_insn "@mve_<mve_insn>q_<supf><mode>"
f9355dee
SP
1393 [
1394 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
1395 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
1396 (match_operand:MVE_5 2 "s_register_operand" "w")]
7f49b4a0 1397 MVE_MOVN))
f9355dee
SP
1398 ]
1399 "TARGET_HAVE_MVE"
7f49b4a0 1400 "<mve_insn>.<isu>%#<V_sz_elem>\t%q0, %q2"
f9355dee
SP
1401 [(set_attr "type" "mve_move")
1402])
1403
1404;;
b0b3a5e9
CL
1405;; [vaddq_f]
1406;; [vmulq_f]
1407;; [vsubq_f]
f9355dee 1408;;
b0b3a5e9 1409(define_insn "mve_<mve_addsubmul>q_f<mode>"
f9355dee
SP
1410 [
1411 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
b0b3a5e9 1412 (MVE_INT_BINARY_RTX:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
0f41b5e0 1413 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1414 ]
1415 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
b0b3a5e9 1416 "<mve_addsubmul>.f%#<V_sz_elem>\t%q0, %q1, %q2"
f9355dee
SP
1417 [(set_attr "type" "mve_move")
1418])
1419
1420;;
1421;; [vornq_f])
1422;;
1423(define_insn "mve_vornq_f<mode>"
1424 [
1425 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
250fd9fb
CL
1426 (ior:MVE_0 (not:MVE_0 (match_operand:MVE_0 2 "s_register_operand" "w"))
1427 (match_operand:MVE_0 1 "s_register_operand" "w")))
f9355dee
SP
1428 ]
1429 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1430 "vorn\t%q0, %q1, %q2"
f9355dee
SP
1431 [(set_attr "type" "mve_move")
1432])
1433
1434;;
1435;; [vorrq_f])
1436;;
1437(define_insn "mve_vorrq_f<mode>"
1438 [
1439 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
75de6a28
CL
1440 (ior:MVE_0 (match_operand:MVE_0 1 "s_register_operand" "w")
1441 (match_operand:MVE_0 2 "s_register_operand" "w")))
f9355dee
SP
1442 ]
1443 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1444 "vorr\t%q0, %q1, %q2"
f9355dee
SP
1445 [(set_attr "type" "mve_move")
1446])
1447
1448;;
67e4e591
CL
1449;; [vbicq_n_s, vbicq_n_u]
1450;; [vorrq_n_u, vorrq_n_s]
f9355dee 1451;;
67e4e591 1452(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
f9355dee
SP
1453 [
1454 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
1455 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
1456 (match_operand:SI 2 "immediate_operand" "i")]
67e4e591 1457 MVE_INT_N_BINARY_LOGIC))
f9355dee
SP
1458 ]
1459 "TARGET_HAVE_MVE"
67e4e591 1460 "<mve_insn>.i%#<V_sz_elem> %q0, %2"
f9355dee
SP
1461 [(set_attr "type" "mve_move")
1462])
1463
1464;;
c71b5c78
CL
1465;; [vqdmullbq_n_s]
1466;; [vqdmulltq_n_s]
f9355dee 1467;;
c71b5c78 1468(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
f9355dee 1469 [
6debbff6 1470 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
f9355dee
SP
1471 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1472 (match_operand:<V_elem> 2 "s_register_operand" "r")]
c71b5c78 1473 MVE_VQDMULLxQ_N))
f9355dee
SP
1474 ]
1475 "TARGET_HAVE_MVE"
c71b5c78 1476 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q1, %2"
f9355dee
SP
1477 [(set_attr "type" "mve_move")
1478])
1479
1480;;
c71b5c78
CL
1481;; [vqdmullbq_s]
1482;; [vqdmulltq_s]
f9355dee 1483;;
c71b5c78 1484(define_insn "@mve_<mve_insn>q_<supf><mode>"
f9355dee 1485 [
6debbff6 1486 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
f9355dee
SP
1487 (unspec:<V_double_width> [(match_operand:MVE_5 1 "s_register_operand" "w")
1488 (match_operand:MVE_5 2 "s_register_operand" "w")]
c71b5c78 1489 MVE_VQDMULLxQ))
f9355dee
SP
1490 ]
1491 "TARGET_HAVE_MVE"
c71b5c78 1492 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q1, %q2"
f9355dee
SP
1493 [(set_attr "type" "mve_move")
1494])
1495
f9355dee 1496;;
e044696f
CL
1497;; [vrmlaldavhq_u vrmlaldavhq_s]
1498;; [vrmlaldavhxq_s]
1499;; [vrmlsldavhq_s]
1500;; [vrmlsldavhxq_s]
f9355dee 1501;;
e044696f 1502(define_insn "@mve_<mve_insn>q_<supf>v4si"
f9355dee
SP
1503 [
1504 (set (match_operand:DI 0 "s_register_operand" "=r")
1505 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
1506 (match_operand:V4SI 2 "s_register_operand" "w")]
e044696f 1507 MVE_VRMLxLDAVxQ))
f9355dee
SP
1508 ]
1509 "TARGET_HAVE_MVE"
e044696f 1510 "<mve_insn>.<supf>32\t%Q0, %R0, %q1, %q2"
f9355dee
SP
1511 [(set_attr "type" "mve_move")
1512])
1513
1514;;
2cc50fd9
CL
1515;; [vshllbq_n_s, vshllbq_n_u]
1516;; [vshlltq_n_u, vshlltq_n_s]
f9355dee 1517;;
2cc50fd9 1518(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
f9355dee
SP
1519 [
1520 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1521 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1522 (match_operand:SI 2 "immediate_operand" "i")]
2cc50fd9 1523 VSHLLxQ_N))
f9355dee
SP
1524 ]
1525 "TARGET_HAVE_MVE"
2cc50fd9 1526 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q1, %2"
f9355dee
SP
1527 [(set_attr "type" "mve_move")
1528])
1529
f9355dee
SP
1530;;
1531;; [vmulltq_poly_p])
1532;;
1533(define_insn "mve_vmulltq_poly_p<mode>"
1534 [
1535 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1536 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1537 (match_operand:MVE_3 2 "s_register_operand" "w")]
1538 VMULLTQ_POLY_P))
1539 ]
1540 "TARGET_HAVE_MVE"
1541 "vmullt.p%#<V_sz_elem>\t%q0, %q1, %q2"
1542 [(set_attr "type" "mve_move")
1543])
1544
1545;;
1546;; [vmullbq_poly_p])
1547;;
1548(define_insn "mve_vmullbq_poly_p<mode>"
1549 [
1550 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
1551 (unspec:<V_double_width> [(match_operand:MVE_3 1 "s_register_operand" "w")
1552 (match_operand:MVE_3 2 "s_register_operand" "w")]
1553 VMULLBQ_POLY_P))
1554 ]
1555 "TARGET_HAVE_MVE"
1556 "vmullb.p%#<V_sz_elem>\t%q0, %q1, %q2"
1557 [(set_attr "type" "mve_move")
1558])
1559
0dad5b33 1560;;
6a08718a
CL
1561;; [vcmpeqq_m_f]
1562;; [vcmpgeq_m_f]
1563;; [vcmpgtq_m_f]
1564;; [vcmpleq_m_f]
1565;; [vcmpltq_m_f]
1566;; [vcmpneq_m_f]
0dad5b33 1567;;
6a08718a 1568(define_insn "@mve_vcmp<mve_cmp_op1>q_m_f<mode>"
0dad5b33 1569 [
e6a4aefc
CL
1570 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1571 (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
0dad5b33 1572 (match_operand:MVE_0 2 "s_register_operand" "w")
e6a4aefc 1573 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
6a08718a 1574 MVE_CMP_M_F))
0dad5b33
SP
1575 ]
1576 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6a08718a 1577 "vpst\;vcmpt.f%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %q2"
0dad5b33
SP
1578 [(set_attr "type" "mve_move")
1579 (set_attr "length""8")])
1580;;
1581;; [vcvtaq_m_u, vcvtaq_m_s])
1582;;
1583(define_insn "mve_vcvtaq_m_<supf><mode>"
1584 [
1585 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
1586 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
1587 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 1588 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
0dad5b33
SP
1589 VCVTAQ_M))
1590 ]
1591 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
1592 "vpst\;vcvtat.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
1593 [(set_attr "type" "mve_move")
1594 (set_attr "length""8")])
1595;;
1596;; [vcvtq_m_to_f_s, vcvtq_m_to_f_u])
1597;;
1598(define_insn "mve_vcvtq_m_to_f_<supf><mode>"
1599 [
1600 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
1601 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
1602 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 1603 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
0dad5b33
SP
1604 VCVTQ_M_TO_F))
1605 ]
1606 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 1607 "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q2"
0dad5b33
SP
1608 [(set_attr "type" "mve_move")
1609 (set_attr "length""8")])
e2f992f7 1610
0dad5b33 1611;;
e2f992f7
CL
1612;; [vqrshrnbq_n_u, vqrshrnbq_n_s]
1613;; [vqrshrntq_n_u, vqrshrntq_n_s]
8f5b7d21
CL
1614;; [vqrshrunbq_n_s]
1615;; [vqrshruntq_n_s]
e2f992f7
CL
1616;; [vqshrnbq_n_u, vqshrnbq_n_s]
1617;; [vqshrntq_n_u, vqshrntq_n_s]
8f5b7d21
CL
1618;; [vqshrunbq_n_s]
1619;; [vqshruntq_n_s]
e2f992f7
CL
1620;; [vrshrnbq_n_s, vrshrnbq_n_u]
1621;; [vrshrntq_n_u, vrshrntq_n_s]
1622;; [vshrnbq_n_u, vshrnbq_n_s]
1623;; [vshrntq_n_s, vshrntq_n_u]
0dad5b33 1624;;
e2f992f7 1625(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
0dad5b33
SP
1626 [
1627 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
1628 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
1629 (match_operand:MVE_5 2 "s_register_operand" "w")
c3fb6658 1630 (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")]
e2f992f7 1631 MVE_SHRN_N))
0dad5b33
SP
1632 ]
1633 "TARGET_HAVE_MVE"
e2f992f7 1634 "<mve_insn>.<isu>%#<V_sz_elem>\t%q0, %q2, %3"
0dad5b33
SP
1635 [(set_attr "type" "mve_move")
1636])
e2f992f7 1637
0dad5b33 1638;;
e18f715b
CL
1639;; [vrmlaldavhaq_s vrmlaldavhaq_u]
1640;; [vrmlaldavhaxq_s]
1641;; [vrmlsldavhaq_s]
1642;; [vrmlsldavhaxq_s]
0dad5b33 1643;;
e18f715b 1644(define_insn "@mve_<mve_insn>q_<supf>v4si"
0dad5b33
SP
1645 [
1646 (set (match_operand:DI 0 "s_register_operand" "=r")
1647 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
1648 (match_operand:V4SI 2 "s_register_operand" "w")
1649 (match_operand:V4SI 3 "s_register_operand" "w")]
e18f715b 1650 MVE_VRMLxLDAVHAxQ))
0dad5b33
SP
1651 ]
1652 "TARGET_HAVE_MVE"
e18f715b 1653 "<mve_insn>.<supf>32\t%Q0, %R0, %q2, %q3"
0dad5b33
SP
1654 [(set_attr "type" "mve_move")
1655])
1656
1657;;
1658;; [vabavq_s, vabavq_u])
1659;;
1af6d1db 1660(define_insn "@mve_<mve_insn>q_<supf><mode>"
0dad5b33
SP
1661 [
1662 (set (match_operand:SI 0 "s_register_operand" "=r")
1663 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1664 (match_operand:MVE_2 2 "s_register_operand" "w")
1665 (match_operand:MVE_2 3 "s_register_operand" "w")]
1666 VABAVQ))
1667 ]
1668 "TARGET_HAVE_MVE"
1af6d1db 1669 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
0dad5b33
SP
1670 [(set_attr "type" "mve_move")
1671])
1672
1673;;
1674;; [vshlcq_u vshlcq_s]
1675;;
1676(define_expand "mve_vshlcq_vec_<supf><mode>"
1677 [(match_operand:MVE_2 0 "s_register_operand")
1678 (match_operand:MVE_2 1 "s_register_operand")
1679 (match_operand:SI 2 "s_register_operand")
1680 (match_operand:SI 3 "mve_imm_32")
1681 (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
1682 "TARGET_HAVE_MVE"
1683{
1684 rtx ignore_wb = gen_reg_rtx (SImode);
1685 emit_insn(gen_mve_vshlcq_<supf><mode>(operands[0], ignore_wb, operands[1],
8165795c 1686 operands[2], operands[3]));
0dad5b33
SP
1687 DONE;
1688})
1689
1690(define_expand "mve_vshlcq_carry_<supf><mode>"
1691 [(match_operand:SI 0 "s_register_operand")
1692 (match_operand:MVE_2 1 "s_register_operand")
1693 (match_operand:SI 2 "s_register_operand")
1694 (match_operand:SI 3 "mve_imm_32")
1695 (unspec:MVE_2 [(const_int 0)] VSHLCQ)]
1696 "TARGET_HAVE_MVE"
1697{
1698 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
1699 emit_insn(gen_mve_vshlcq_<supf><mode>(ignore_vec, operands[0], operands[1],
1700 operands[2], operands[3]));
1701 DONE;
1702})
1703
1704(define_insn "mve_vshlcq_<supf><mode>"
1705 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
1706 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
1707 (match_operand:SI 3 "s_register_operand" "1")
1708 (match_operand:SI 4 "mve_imm_32" "Rf")]
1709 VSHLCQ))
1710 (set (match_operand:SI 1 "s_register_operand" "=r")
1711 (unspec:SI [(match_dup 2)
1712 (match_dup 3)
1713 (match_dup 4)]
1714 VSHLCQ))]
1715 "TARGET_HAVE_MVE"
f2dd012a 1716 "vshlc\t%q0, %1, %4")
8165795c
SP
1717
1718;;
7734b991
CL
1719;; [vabsq_m_s]
1720;; [vclsq_m_s]
1721;; [vclzq_m_s, vclzq_m_u]
1722;; [vnegq_m_s]
1723;; [vqabsq_m_s]
1724;; [vqnegq_m_s]
8165795c 1725;;
7734b991 1726(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8165795c
SP
1727 [
1728 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1729 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1730 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1731 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7734b991 1732 MVE_INT_M_UNARY))
8165795c
SP
1733 ]
1734 "TARGET_HAVE_MVE"
7734b991 1735 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2"
8165795c
SP
1736 [(set_attr "type" "mve_move")
1737 (set_attr "length""8")])
1738
1739;;
1740;; [vaddvaq_p_u, vaddvaq_p_s])
1741;;
782eb6bb 1742(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
8165795c 1743 [
3d537943 1744 (set (match_operand:SI 0 "s_register_operand" "=Te")
8165795c
SP
1745 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1746 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1747 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8165795c
SP
1748 VADDVAQ_P))
1749 ]
1750 "TARGET_HAVE_MVE"
782eb6bb 1751 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2"
8165795c
SP
1752 [(set_attr "type" "mve_move")
1753 (set_attr "length""8")])
1754
8165795c
SP
1755;;
1756;; [vcmpcsq_m_n_u])
8165795c 1757;; [vcmpeqq_m_n_u, vcmpeqq_m_n_s])
8165795c 1758;; [vcmpgeq_m_n_s])
8165795c 1759;; [vcmpgtq_m_n_s])
8165795c 1760;; [vcmphiq_m_n_u])
8165795c 1761;; [vcmpleq_m_n_s])
8165795c 1762;; [vcmpltq_m_n_s])
8165795c
SP
1763;; [vcmpneq_m_n_u, vcmpneq_m_n_s])
1764;;
6a08718a 1765(define_insn "@mve_vcmp<mve_cmp_op1>q_m_n_<supf><mode>"
8165795c 1766 [
e6a4aefc
CL
1767 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1768 (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
8165795c 1769 (match_operand:<V_elem> 2 "s_register_operand" "r")
e6a4aefc 1770 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
6a08718a 1771 MVE_CMP_M_N))
8165795c
SP
1772 ]
1773 "TARGET_HAVE_MVE"
6a08718a 1774 "vpst\;vcmpt.<isu>%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %2"
8165795c
SP
1775 [(set_attr "type" "mve_move")
1776 (set_attr "length""8")])
1777
1778;;
6a08718a
CL
1779;; [vcmpcsq_m_u]
1780;; [vcmpeqq_m_u, vcmpeqq_m_s]
1781;; [vcmpgeq_m_s]
1782;; [vcmpgtq_m_s]
1783;; [vcmphiq_m_u]
1784;; [vcmpleq_m_s]
1785;; [vcmpltq_m_s]
1786;; [vcmpneq_m_s, vcmpneq_m_u]
8165795c 1787;;
6a08718a 1788(define_insn "@mve_vcmp<mve_cmp_op1>q_m_<supf><mode>"
8165795c 1789 [
e6a4aefc
CL
1790 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
1791 (unspec:<MVE_VPRED> [(match_operand:MVE_2 1 "s_register_operand" "w")
8165795c 1792 (match_operand:MVE_2 2 "s_register_operand" "w")
e6a4aefc 1793 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
6a08718a 1794 MVE_CMP_M))
8165795c
SP
1795 ]
1796 "TARGET_HAVE_MVE"
6a08718a 1797 "vpst\;vcmpt.<isu>%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %q2"
8165795c
SP
1798 [(set_attr "type" "mve_move")
1799 (set_attr "length""8")])
1800
1801;;
1802;; [vdupq_m_n_s, vdupq_m_n_u])
1803;;
fc468102 1804(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8165795c
SP
1805 [
1806 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1807 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1808 (match_operand:<V_elem> 2 "s_register_operand" "r")
724d6566 1809 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8165795c
SP
1810 VDUPQ_M_N))
1811 ]
1812 "TARGET_HAVE_MVE"
fc468102 1813 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %2"
8165795c
SP
1814 [(set_attr "type" "mve_move")
1815 (set_attr "length""8")])
1816
1817;;
dcc05862
CL
1818;; [vmaxaq_m_s]
1819;; [vminaq_m_s]
8165795c 1820;;
dcc05862 1821(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8165795c
SP
1822 [
1823 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1824 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1825 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1826 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
dcc05862 1827 MVE_VMAXAVMINAQ_M))
8165795c
SP
1828 ]
1829 "TARGET_HAVE_MVE"
dcc05862 1830 "vpst\;<mve_insn>t.s%#<V_sz_elem>\t%q0, %q2"
8165795c
SP
1831 [(set_attr "type" "mve_move")
1832 (set_attr "length""8")])
1833
1834;;
16c5aca6
CL
1835;; [vmaxavq_p_s]
1836;; [vmaxvq_p_u, vmaxvq_p_s]
1837;; [vminavq_p_s]
1838;; [vminvq_p_s, vminvq_p_u]
8165795c 1839;;
16c5aca6 1840(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
8165795c
SP
1841 [
1842 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
1843 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
1844 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1845 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
16c5aca6 1846 MVE_VMAXVQ_VMINVQ_P))
8165795c
SP
1847 ]
1848 "TARGET_HAVE_MVE"
16c5aca6 1849 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2"
8165795c
SP
1850 [(set_attr "type" "mve_move")
1851 (set_attr "length""8")])
1852
8165795c 1853;;
1817749d
CL
1854;; [vmladavaq_u, vmladavaq_s]
1855;; [vmladavaxq_s]
1856;; [vmlsdavaq_s]
1857;; [vmlsdavaxq_s]
8165795c 1858;;
1817749d 1859(define_insn "@mve_<mve_insn>q_<supf><mode>"
8165795c 1860 [
3d537943 1861 (set (match_operand:SI 0 "s_register_operand" "=Te")
8165795c
SP
1862 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
1863 (match_operand:MVE_2 2 "s_register_operand" "w")
1864 (match_operand:MVE_2 3 "s_register_operand" "w")]
1817749d 1865 MVE_VMLxDAVAQ))
8165795c
SP
1866 ]
1867 "TARGET_HAVE_MVE"
1817749d 1868 "<mve_insn>.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
8165795c
SP
1869 [(set_attr "type" "mve_move")
1870])
1871
1872;;
1817749d
CL
1873;; [vmladavq_p_u, vmladavq_p_s]
1874;; [vmladavxq_p_s]
1875;; [vmlsdavq_p_s]
1876;; [vmlsdavxq_p_s]
8165795c 1877;;
1817749d 1878(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
8165795c 1879 [
3d537943 1880 (set (match_operand:SI 0 "s_register_operand" "=Te")
8165795c
SP
1881 (unspec:SI [(match_operand:MVE_2 1 "s_register_operand" "w")
1882 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1883 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
1817749d 1884 MVE_VMLxDAVQ_P))
8165795c
SP
1885 ]
1886 "TARGET_HAVE_MVE"
1817749d 1887 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q1, %q2"
8165795c
SP
1888 [(set_attr "type" "mve_move")
1889 (set_attr "length""8")])
1890
1891;;
f2fd708a
CL
1892;; [vmlaq_n_u, vmlaq_n_s]
1893;; [vmlasq_n_u, vmlasq_n_s]
1894;; [vqdmlahq_n_s]
1895;; [vqdmlashq_n_s]
1896;; [vqrdmlahq_n_s]
1897;; [vqrdmlashq_n_s]
8165795c 1898;;
f2fd708a 1899(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
8165795c
SP
1900 [
1901 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1902 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1903 (match_operand:MVE_2 2 "s_register_operand" "w")
1904 (match_operand:<V_elem> 3 "s_register_operand" "r")]
f2fd708a 1905 MVE_VMLxQ_N))
8165795c
SP
1906 ]
1907 "TARGET_HAVE_MVE"
f2fd708a 1908 "<mve_insn>.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
8165795c
SP
1909 [(set_attr "type" "mve_move")
1910])
1911
8165795c
SP
1912;;
1913;; [vmvnq_m_s, vmvnq_m_u])
1914;;
b74d6acf 1915(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8165795c
SP
1916 [
1917 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1918 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1919 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 1920 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8165795c
SP
1921 VMVNQ_M))
1922 ]
1923 "TARGET_HAVE_MVE"
b74d6acf 1924 "vpst\;<mve_insn>t\t%q0, %q2"
8165795c
SP
1925 [(set_attr "type" "mve_move")
1926 (set_attr "length""8")])
1927
8165795c
SP
1928;;
1929;; [vpselq_u, vpselq_s])
1930;;
f7196b72 1931(define_insn "@mve_<mve_insn>q_<supf><mode>"
8165795c
SP
1932 [
1933 (set (match_operand:MVE_1 0 "s_register_operand" "=w")
1934 (unspec:MVE_1 [(match_operand:MVE_1 1 "s_register_operand" "w")
1935 (match_operand:MVE_1 2 "s_register_operand" "w")
91224cf6 1936 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8165795c
SP
1937 VPSELQ))
1938 ]
1939 "TARGET_HAVE_MVE"
f7196b72 1940 "<mve_insn>\t%q0, %q1, %q2"
8165795c
SP
1941 [(set_attr "type" "mve_move")
1942])
1943
8165795c 1944;;
3bf67ec9
CL
1945;; [vqdmladhq_s]
1946;; [vqdmladhxq_s]
1947;; [vqdmlsdhq_s]
1948;; [vqdmlsdhxq_s]
1949;; [vqrdmladhq_s]
1950;; [vqrdmladhxq_s]
1951;; [vqrdmlsdhq_s]
1952;; [vqrdmlsdhxq_s]
8165795c 1953;;
3bf67ec9 1954(define_insn "@mve_<mve_insn>q_<supf><mode>"
8165795c
SP
1955 [
1956 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1957 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1958 (match_operand:MVE_2 2 "s_register_operand" "w")
1959 (match_operand:MVE_2 3 "s_register_operand" "w")]
3bf67ec9 1960 MVE_VQxDMLxDHxQ_S))
8165795c
SP
1961 ]
1962 "TARGET_HAVE_MVE"
3bf67ec9 1963 "<mve_insn>.s%#<V_sz_elem>\t%q0, %q2, %q3"
8165795c
SP
1964 [(set_attr "type" "mve_move")
1965])
1966
8165795c 1967;;
c4d4e62b
CL
1968;; [vqrshlq_m_n_s, vqrshlq_m_n_u]
1969;; [vrshlq_m_n_s, vrshlq_m_n_u]
8165795c 1970;;
c4d4e62b 1971(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8165795c
SP
1972 [
1973 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1974 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1975 (match_operand:SI 2 "s_register_operand" "r")
724d6566 1976 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
c4d4e62b 1977 MVE_RSHIFT_M_N))
8165795c
SP
1978 ]
1979 "TARGET_HAVE_MVE"
c4d4e62b 1980 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %2"
8165795c
SP
1981 [(set_attr "type" "mve_move")
1982 (set_attr "length""8")])
1983
1984;;
7e6c39a3
CL
1985;; [vqshlq_m_r_u, vqshlq_m_r_s]
1986;; [vshlq_m_r_u, vshlq_m_r_s]
8165795c 1987;;
7e6c39a3 1988(define_insn "@mve_<mve_insn>q_m_r_<supf><mode>"
8165795c
SP
1989 [
1990 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
1991 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
1992 (match_operand:SI 2 "s_register_operand" "r")
724d6566 1993 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7e6c39a3 1994 MVE_SHIFT_M_R))
8165795c
SP
1995 ]
1996 "TARGET_HAVE_MVE"
7e6c39a3 1997 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %2"
8165795c
SP
1998 [(set_attr "type" "mve_move")
1999 (set_attr "length""8")])
2000
2001;;
2002;; [vrev64q_m_u, vrev64q_m_s])
2003;;
0c1eb901 2004(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8165795c 2005 [
06aa66af 2006 (set (match_operand:MVE_2 0 "s_register_operand" "=&w")
8165795c
SP
2007 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2008 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 2009 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
8165795c
SP
2010 VREV64Q_M))
2011 ]
2012 "TARGET_HAVE_MVE"
0c1eb901 2013 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
8165795c
SP
2014 [(set_attr "type" "mve_move")
2015 (set_attr "length""8")])
2016
8165795c
SP
2017;;
2018;; [vsliq_n_u, vsliq_n_s])
2019;;
3767c7fe 2020(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
8165795c
SP
2021 [
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:SI 3 "<MVE_pred>" "<MVE_constraint>")]
2026 VSLIQ_N))
2027 ]
2028 "TARGET_HAVE_MVE"
3767c7fe 2029 "<mve_insn>.%#<V_sz_elem>\t%q0, %q2, %3"
8165795c
SP
2030 [(set_attr "type" "mve_move")
2031])
2032
2033;;
2034;; [vsriq_n_u, vsriq_n_s])
2035;;
be373b54 2036(define_insn "@mve_<mve_insn>q_n_<supf><mode>"
8165795c
SP
2037 [
2038 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2039 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2040 (match_operand:MVE_2 2 "s_register_operand" "w")
c3fb6658 2041 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")]
8165795c
SP
2042 VSRIQ_N))
2043 ]
2044 "TARGET_HAVE_MVE"
be373b54 2045 "<mve_insn>.%#<V_sz_elem>\t%q0, %q2, %3"
8165795c
SP
2046 [(set_attr "type" "mve_move")
2047])
2048
e3678b44 2049;;
7734b991
CL
2050;; [vabsq_m_f]
2051;; [vnegq_m_f]
2052;; [vrndaq_m_f]
2053;; [vrndmq_m_f]
2054;; [vrndnq_m_f]
2055;; [vrndpq_m_f]
2056;; [vrndq_m_f]
2057;; [vrndxq_m_f]
e3678b44 2058;;
7734b991 2059(define_insn "@mve_<mve_insn>q_m_f<mode>"
e3678b44
SP
2060 [
2061 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2062 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2063 (match_operand:MVE_0 2 "s_register_operand" "w")
724d6566 2064 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7734b991 2065 MVE_FP_M_UNARY))
e3678b44
SP
2066 ]
2067 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
7734b991 2068 "vpst\;<mve_mnemo>t.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2069 [(set_attr "type" "mve_move")
2070 (set_attr "length""8")])
2071
2072;;
2073;; [vaddlvaq_p_s vaddlvaq_p_u])
2074;;
42c94cce 2075(define_insn "@mve_<mve_insn>q_p_<supf>v4si"
e3678b44
SP
2076 [
2077 (set (match_operand:DI 0 "s_register_operand" "=r")
2078 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2079 (match_operand:V4SI 2 "s_register_operand" "w")
c6b4ea7a 2080 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
e3678b44
SP
2081 VADDLVAQ_P))
2082 ]
2083 "TARGET_HAVE_MVE"
42c94cce 2084 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q2"
e3678b44
SP
2085 [(set_attr "type" "mve_move")
2086 (set_attr "length""8")])
2087;;
db253e8b 2088;; [vcmlaq, vcmlaq_rot90, vcmlaq_rot180, vcmlaq_rot270])
3cc4e183 2089;;
6ae2fba5 2090(define_insn "@mve_<mve_insn>q<mve_rot>_f<mode>"
3cc4e183 2091 [
db253e8b 2092 (set (match_operand:MVE_0 0 "s_register_operand" "=w,w")
389b67fe
TC
2093 (plus:MVE_0 (match_operand:MVE_0 1 "reg_or_zero_operand" "Dz,0")
2094 (unspec:MVE_0
2095 [(match_operand:MVE_0 2 "s_register_operand" "w,w")
2096 (match_operand:MVE_0 3 "s_register_operand" "w,w")]
2097 VCMLA)))
3cc4e183
TC
2098 ]
2099 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db253e8b 2100 "@
389b67fe
TC
2101 vcmul.f%#<V_sz_elem> %q0, %q2, %q3, #<rot>
2102 vcmla.f%#<V_sz_elem> %q0, %q2, %q3, #<rot>"
e3678b44
SP
2103 [(set_attr "type" "mve_move")
2104])
2105
2106;;
2107;; [vcmpeqq_m_n_f])
e3678b44 2108;; [vcmpgeq_m_n_f])
e3678b44 2109;; [vcmpgtq_m_n_f])
e3678b44 2110;; [vcmpleq_m_n_f])
e3678b44 2111;; [vcmpltq_m_n_f])
e3678b44
SP
2112;; [vcmpneq_m_n_f])
2113;;
6a08718a 2114(define_insn "@mve_vcmp<mve_cmp_op1>q_m_n_f<mode>"
e3678b44 2115 [
e6a4aefc
CL
2116 (set (match_operand:<MVE_VPRED> 0 "vpr_register_operand" "=Up")
2117 (unspec:<MVE_VPRED> [(match_operand:MVE_0 1 "s_register_operand" "w")
e3678b44 2118 (match_operand:<V_elem> 2 "s_register_operand" "r")
e6a4aefc 2119 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
6a08718a 2120 MVE_CMP_M_N_F))
e3678b44
SP
2121 ]
2122 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6a08718a 2123 "vpst\;vcmpt.f%#<V_sz_elem>\t<mve_cmp_op1>, %q1, %2"
e3678b44
SP
2124 [(set_attr "type" "mve_move")
2125 (set_attr "length""8")])
2126
2127;;
2128;; [vcvtbq_m_f16_f32])
2129;;
2130(define_insn "mve_vcvtbq_m_f16_f32v8hf"
2131 [
2132 (set (match_operand:V8HF 0 "s_register_operand" "=w")
2133 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
2134 (match_operand:V4SF 2 "s_register_operand" "w")
c6b4ea7a 2135 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2136 VCVTBQ_M_F16_F32))
2137 ]
2138 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 2139 "vpst\;vcvtbt.f16.f32\t%q0, %q2"
e3678b44
SP
2140 [(set_attr "type" "mve_move")
2141 (set_attr "length""8")])
2142
2143;;
2144;; [vcvtbq_m_f32_f16])
2145;;
2146(define_insn "mve_vcvtbq_m_f32_f16v4sf"
2147 [
2148 (set (match_operand:V4SF 0 "s_register_operand" "=w")
2149 (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
2150 (match_operand:V8HF 2 "s_register_operand" "w")
c6b4ea7a 2151 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2152 VCVTBQ_M_F32_F16))
2153 ]
2154 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 2155 "vpst\;vcvtbt.f32.f16\t%q0, %q2"
e3678b44
SP
2156 [(set_attr "type" "mve_move")
2157 (set_attr "length""8")])
2158
2159;;
2160;; [vcvttq_m_f16_f32])
2161;;
2162(define_insn "mve_vcvttq_m_f16_f32v8hf"
2163 [
2164 (set (match_operand:V8HF 0 "s_register_operand" "=w")
2165 (unspec:V8HF [(match_operand:V8HF 1 "s_register_operand" "0")
2166 (match_operand:V4SF 2 "s_register_operand" "w")
c6b4ea7a 2167 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2168 VCVTTQ_M_F16_F32))
2169 ]
2170 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 2171 "vpst\;vcvttt.f16.f32\t%q0, %q2"
e3678b44
SP
2172 [(set_attr "type" "mve_move")
2173 (set_attr "length""8")])
2174
2175;;
2176;; [vcvttq_m_f32_f16])
2177;;
2178(define_insn "mve_vcvttq_m_f32_f16v4sf"
2179 [
2180 (set (match_operand:V4SF 0 "s_register_operand" "=w")
2181 (unspec:V4SF [(match_operand:V4SF 1 "s_register_operand" "0")
2182 (match_operand:V8HF 2 "s_register_operand" "w")
c6b4ea7a 2183 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2184 VCVTTQ_M_F32_F16))
2185 ]
2186 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 2187 "vpst\;vcvttt.f32.f16\t%q0, %q2"
e3678b44
SP
2188 [(set_attr "type" "mve_move")
2189 (set_attr "length""8")])
2190
2191;;
2192;; [vdupq_m_n_f])
2193;;
fc468102 2194(define_insn "@mve_<mve_insn>q_m_n_f<mode>"
e3678b44
SP
2195 [
2196 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2197 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2198 (match_operand:<V_elem> 2 "s_register_operand" "r")
724d6566 2199 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
fc468102 2200 MVE_FP_M_N_VDUPQ_ONLY))
e3678b44
SP
2201 ]
2202 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
fc468102 2203 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %2"
e3678b44
SP
2204 [(set_attr "type" "mve_move")
2205 (set_attr "length""8")])
2206
2207;;
fbab00f0
CL
2208;; [vfmaq_f]
2209;; [vfmsq_f]
e3678b44 2210;;
fbab00f0 2211(define_insn "@mve_<mve_insn>q_f<mode>"
e3678b44
SP
2212 [
2213 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2214 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2215 (match_operand:MVE_0 2 "s_register_operand" "w")
2216 (match_operand:MVE_0 3 "s_register_operand" "w")]
fbab00f0 2217 MVE_VFMxQ_F))
e3678b44
SP
2218 ]
2219 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
fbab00f0 2220 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q2, %q3"
e3678b44
SP
2221 [(set_attr "type" "mve_move")
2222])
2223
2224;;
fbab00f0
CL
2225;; [vfmaq_n_f]
2226;; [vfmasq_n_f]
e3678b44 2227;;
fbab00f0 2228(define_insn "@mve_<mve_insn>q_n_f<mode>"
e3678b44
SP
2229 [
2230 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2231 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2232 (match_operand:MVE_0 2 "s_register_operand" "w")
2233 (match_operand:<V_elem> 3 "s_register_operand" "r")]
fbab00f0 2234 MVE_VFMAxQ_N_F))
e3678b44
SP
2235 ]
2236 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
fbab00f0 2237 "<mve_insn>.f%#<V_sz_elem>\t%q0, %q2, %3"
e3678b44
SP
2238 [(set_attr "type" "mve_move")
2239])
2240
2241;;
26d6e02c
CL
2242;; [vmaxnmaq_m_f]
2243;; [vminnmaq_m_f]
e3678b44 2244;;
26d6e02c 2245(define_insn "@mve_<mve_insn>q_m_f<mode>"
e3678b44
SP
2246 [
2247 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2248 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2249 (match_operand:MVE_0 2 "s_register_operand" "w")
724d6566 2250 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
26d6e02c 2251 MVE_VMAXNMA_VMINNMAQ_M))
e3678b44
SP
2252 ]
2253 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
26d6e02c 2254 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2255 [(set_attr "type" "mve_move")
2256 (set_attr "length""8")])
e3678b44
SP
2257
2258;;
d814dc9d
CL
2259;; [vmaxnmavq_p_f]
2260;; [vmaxnmvq_p_f]
2261;; [vminnmavq_p_f]
2262;; [vminnmvq_p_f]
e3678b44 2263;;
d814dc9d 2264(define_insn "@mve_<mve_insn>q_p_f<mode>"
e3678b44
SP
2265 [
2266 (set (match_operand:<V_elem> 0 "s_register_operand" "=r")
2267 (unspec:<V_elem> [(match_operand:<V_elem> 1 "s_register_operand" "0")
2268 (match_operand:MVE_0 2 "s_register_operand" "w")
724d6566 2269 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
d814dc9d 2270 MVE_VMAXNMxV_MINNMxVQ_P))
e3678b44
SP
2271 ]
2272 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
d814dc9d 2273 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%0, %q2"
e3678b44
SP
2274 [(set_attr "type" "mve_move")
2275 (set_attr "length""8")])
d814dc9d 2276
e3678b44 2277;;
c68ccdf2
CL
2278;; [vmlaldavaq_s, vmlaldavaq_u]
2279;; [vmlaldavaxq_s]
2280;; [vmlsldavaq_s]
2281;; [vmlsldavaxq_s]
e3678b44 2282;;
c68ccdf2 2283(define_insn "@mve_<mve_insn>q_<supf><mode>"
e3678b44
SP
2284 [
2285 (set (match_operand:DI 0 "s_register_operand" "=r")
2286 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2287 (match_operand:MVE_5 2 "s_register_operand" "w")
2288 (match_operand:MVE_5 3 "s_register_operand" "w")]
c68ccdf2 2289 MVE_VMLxLDAVAxQ))
e3678b44
SP
2290 ]
2291 "TARGET_HAVE_MVE"
c68ccdf2 2292 "<mve_insn>.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
e3678b44
SP
2293 [(set_attr "type" "mve_move")
2294])
2295
2296;;
c1e068e4
CL
2297;; [vmlaldavq_p_u, vmlaldavq_p_s]
2298;; [vmlaldavxq_p_s]
2299;; [vmlsldavq_p_s]
2300;; [vmlsldavxq_p_s]
e3678b44 2301;;
c1e068e4 2302(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
e3678b44
SP
2303 [
2304 (set (match_operand:DI 0 "s_register_operand" "=r")
2305 (unspec:DI [(match_operand:MVE_5 1 "s_register_operand" "w")
2306 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 2307 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
c1e068e4 2308 MVE_VMLxLDAVxQ_P))
e3678b44
SP
2309 ]
2310 "TARGET_HAVE_MVE"
c1e068e4 2311 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%Q0, %R0, %q1, %q2"
e3678b44
SP
2312 [(set_attr "type" "mve_move")
2313 (set_attr "length""8")])
2314
e3678b44
SP
2315;;
2316;; [vmovlbq_m_u, vmovlbq_m_s])
e3678b44
SP
2317;; [vmovltq_m_u, vmovltq_m_s])
2318;;
51fca3e1 2319(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
e3678b44
SP
2320 [
2321 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2322 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2323 (match_operand:MVE_3 2 "s_register_operand" "w")
724d6566 2324 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
51fca3e1 2325 VMOVLxQ_M))
e3678b44
SP
2326 ]
2327 "TARGET_HAVE_MVE"
51fca3e1 2328 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2329 [(set_attr "type" "mve_move")
2330 (set_attr "length""8")])
e3678b44
SP
2331
2332;;
7f49b4a0
CL
2333;; [vmovnbq_m_u, vmovnbq_m_s]
2334;; [vmovntq_m_u, vmovntq_m_s]
2335;; [vqmovnbq_m_s, vqmovnbq_m_u]
2336;; [vqmovntq_m_u, vqmovntq_m_s]
2337;; [vqmovunbq_m_s]
2338;; [vqmovuntq_m_s]
e3678b44 2339;;
7f49b4a0 2340(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
e3678b44
SP
2341 [
2342 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2343 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
2344 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 2345 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
7f49b4a0 2346 MVE_MOVN_M))
e3678b44
SP
2347 ]
2348 "TARGET_HAVE_MVE"
7f49b4a0 2349 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2350 [(set_attr "type" "mve_move")
2351 (set_attr "length""8")])
2352
2353;;
2354;; [vmvnq_m_n_u, vmvnq_m_n_s])
2355;;
b74d6acf 2356(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
e3678b44
SP
2357 [
2358 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2359 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2360 (match_operand:SI 2 "immediate_operand" "i")
724d6566 2361 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2362 VMVNQ_M_N))
2363 ]
2364 "TARGET_HAVE_MVE"
b74d6acf 2365 "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %2"
e3678b44
SP
2366 [(set_attr "type" "mve_move")
2367 (set_attr "length""8")])
e3678b44
SP
2368
2369;;
67e4e591
CL
2370;; [vbicq_m_n_s, vbicq_m_n_u]
2371;; [vorrq_m_n_s, vorrq_m_n_u]
e3678b44 2372;;
67e4e591 2373(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
e3678b44
SP
2374 [
2375 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2376 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2377 (match_operand:SI 2 "immediate_operand" "i")
724d6566 2378 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
67e4e591 2379 MVE_INT_M_N_BINARY_LOGIC))
e3678b44
SP
2380 ]
2381 "TARGET_HAVE_MVE"
f2dd012a 2382 "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %2"
e3678b44
SP
2383 [(set_attr "type" "mve_move")
2384 (set_attr "length""8")])
67e4e591 2385
e3678b44
SP
2386;;
2387;; [vpselq_f])
2388;;
f7196b72 2389(define_insn "@mve_<mve_insn>q_f<mode>"
e3678b44
SP
2390 [
2391 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2392 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "w")
2393 (match_operand:MVE_0 2 "s_register_operand" "w")
91224cf6 2394 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
f7196b72 2395 MVE_VPSELQ_F))
e3678b44
SP
2396 ]
2397 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f7196b72 2398 "<mve_insn>\t%q0, %q1, %q2"
e3678b44
SP
2399 [(set_attr "type" "mve_move")
2400])
2401
e3678b44
SP
2402;;
2403;; [vrev32q_m_f])
2404;;
0c1eb901 2405(define_insn "@mve_<mve_insn>q_m_f<mode>"
e3678b44 2406 [
0c1eb901
CL
2407 (set (match_operand:MVE_V8HF 0 "s_register_operand" "=w")
2408 (unspec:MVE_V8HF [(match_operand:MVE_V8HF 1 "s_register_operand" "0")
2409 (match_operand:MVE_V8HF 2 "s_register_operand" "w")
2410 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
2411 MVE_FP_M_VREV32Q_ONLY))
e3678b44
SP
2412 ]
2413 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
0c1eb901 2414 "vpst\;<mve_insn>t.<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2415 [(set_attr "type" "mve_move")
2416 (set_attr "length""8")])
2417
2418;;
2419;; [vrev32q_m_s, vrev32q_m_u])
2420;;
0c1eb901 2421(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
e3678b44
SP
2422 [
2423 (set (match_operand:MVE_3 0 "s_register_operand" "=w")
2424 (unspec:MVE_3 [(match_operand:MVE_3 1 "s_register_operand" "0")
2425 (match_operand:MVE_3 2 "s_register_operand" "w")
724d6566 2426 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2427 VREV32Q_M))
2428 ]
2429 "TARGET_HAVE_MVE"
0c1eb901 2430 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2431 [(set_attr "type" "mve_move")
2432 (set_attr "length""8")])
2433
2434;;
2435;; [vrev64q_m_f])
2436;;
0c1eb901 2437(define_insn "@mve_<mve_insn>q_m_f<mode>"
e3678b44 2438 [
06aa66af 2439 (set (match_operand:MVE_0 0 "s_register_operand" "=&w")
e3678b44
SP
2440 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2441 (match_operand:MVE_0 2 "s_register_operand" "w")
724d6566 2442 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
0c1eb901 2443 MVE_FP_M_VREV64Q_ONLY))
e3678b44
SP
2444 ]
2445 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
0c1eb901 2446 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2447 [(set_attr "type" "mve_move")
2448 (set_attr "length""8")])
2449
e3678b44 2450;;
e044696f
CL
2451;; [vrmlaldavhq_p_u vrmlaldavhq_p_s]
2452;; [vrmlaldavhxq_p_s]
2453;; [vrmlsldavhq_p_s]
2454;; [vrmlsldavhxq_p_s]
e3678b44 2455;;
e044696f 2456(define_insn "@mve_<mve_insn>q_p_<supf>v4si"
e3678b44
SP
2457 [
2458 (set (match_operand:DI 0 "s_register_operand" "=r")
2459 (unspec:DI [(match_operand:V4SI 1 "s_register_operand" "w")
2460 (match_operand:V4SI 2 "s_register_operand" "w")
e044696f
CL
2461 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
2462 MVE_VRMLxLDAVHxQ_P))
e3678b44
SP
2463 ]
2464 "TARGET_HAVE_MVE"
e044696f 2465 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q1, %q2"
e3678b44
SP
2466 [(set_attr "type" "mve_move")
2467 (set_attr "length""8")])
2468
e3678b44
SP
2469;;
2470;; [vcvtmq_m_s, vcvtmq_m_u])
2471;;
2472(define_insn "mve_vcvtmq_m_<supf><mode>"
2473 [
2474 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2475 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2476 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 2477 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2478 VCVTMQ_M))
2479 ]
2480 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db5db9d2 2481 "vpst\;vcvtmt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2482 [(set_attr "type" "mve_move")
2483 (set_attr "length""8")])
2484
2485;;
2486;; [vcvtpq_m_u, vcvtpq_m_s])
2487;;
2488(define_insn "mve_vcvtpq_m_<supf><mode>"
2489 [
2490 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2491 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2492 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 2493 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2494 VCVTPQ_M))
2495 ]
2496 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db5db9d2 2497 "vpst\;vcvtpt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2498 [(set_attr "type" "mve_move")
2499 (set_attr "length""8")])
2500
2501;;
2502;; [vcvtnq_m_s, vcvtnq_m_u])
2503;;
2504(define_insn "mve_vcvtnq_m_<supf><mode>"
2505 [
2506 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2507 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2508 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 2509 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2510 VCVTNQ_M))
2511 ]
2512 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db5db9d2 2513 "vpst\;vcvtnt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2514 [(set_attr "type" "mve_move")
2515 (set_attr "length""8")])
2516
2517;;
2518;; [vcvtq_m_n_from_f_s, vcvtq_m_n_from_f_u])
2519;;
2520(define_insn "mve_vcvtq_m_n_from_f_<supf><mode>"
2521 [
2522 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2523 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2524 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
d2ce75fe 2525 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
724d6566 2526 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
e3678b44
SP
2527 VCVTQ_M_N_FROM_F))
2528 ]
2529 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db5db9d2 2530 "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2, %3"
e3678b44
SP
2531 [(set_attr "type" "mve_move")
2532 (set_attr "length""8")])
2533
2534;;
2535;; [vrev16q_m_u, vrev16q_m_s])
2536;;
0c1eb901 2537(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
e3678b44 2538 [
0c1eb901
CL
2539 (set (match_operand:MVE_V16QI 0 "s_register_operand" "=w")
2540 (unspec:MVE_V16QI [(match_operand:MVE_V16QI 1 "s_register_operand" "0")
2541 (match_operand:MVE_V16QI 2 "s_register_operand" "w")
2542 (match_operand:V16BI 3 "vpr_register_operand" "Up")]
e3678b44
SP
2543 VREV16Q_M))
2544 ]
2545 "TARGET_HAVE_MVE"
0c1eb901 2546 "vpst\;<mve_insn>t.<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2547 [(set_attr "type" "mve_move")
2548 (set_attr "length""8")])
2549
2550;;
2551;; [vcvtq_m_from_f_u, vcvtq_m_from_f_s])
2552;;
2553(define_insn "mve_vcvtq_m_from_f_<supf><mode>"
2554 [
2555 (set (match_operand:MVE_5 0 "s_register_operand" "=w")
2556 (unspec:MVE_5 [(match_operand:MVE_5 1 "s_register_operand" "0")
2557 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
724d6566 2558 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
e3678b44
SP
2559 VCVTQ_M_FROM_F))
2560 ]
2561 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
db5db9d2 2562 "vpst\;vcvtt.<supf>%#<V_sz_elem>.f%#<V_sz_elem>\t%q0, %q2"
e3678b44
SP
2563 [(set_attr "type" "mve_move")
2564 (set_attr "length""8")])
2565
db5db9d2
SP
2566;;
2567;; [vabavq_p_s, vabavq_p_u])
2568;;
1af6d1db 2569(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
db5db9d2
SP
2570 [
2571 (set (match_operand:SI 0 "s_register_operand" "=r")
2572 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2573 (match_operand:MVE_2 2 "s_register_operand" "w")
2574 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2575 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
db5db9d2
SP
2576 VABAVQ_P))
2577 ]
2578 "TARGET_HAVE_MVE"
1af6d1db 2579 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
db5db9d2 2580 [(set_attr "type" "mve_move")
330d665c 2581 (set_attr "length" "8")])
db5db9d2
SP
2582
2583;;
2584;; [vqshluq_m_n_s])
2585;;
85c463f5 2586(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
db5db9d2
SP
2587 [
2588 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2589 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2590 (match_operand:MVE_2 2 "s_register_operand" "w")
c3fb6658 2591 (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
724d6566 2592 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
85c463f5 2593 VQSHLUQ_M_N))
db5db9d2
SP
2594 ]
2595 "TARGET_HAVE_MVE"
85c463f5 2596 "vpst\n\t<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
330d665c
CL
2597 [(set_attr "type" "mve_move")
2598 (set_attr "length" "8")])
db5db9d2 2599
db5db9d2
SP
2600;;
2601;; [vsriq_m_n_s, vsriq_m_n_u])
2602;;
be373b54 2603(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
db5db9d2
SP
2604 [
2605 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2606 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2607 (match_operand:MVE_2 2 "s_register_operand" "w")
c3fb6658 2608 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
724d6566 2609 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
db5db9d2
SP
2610 VSRIQ_M_N))
2611 ]
2612 "TARGET_HAVE_MVE"
be373b54 2613 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2, %3"
330d665c
CL
2614 [(set_attr "type" "mve_move")
2615 (set_attr "length" "8")])
db5db9d2 2616
db5db9d2
SP
2617;;
2618;; [vcvtq_m_n_to_f_u, vcvtq_m_n_to_f_s])
2619;;
2620(define_insn "mve_vcvtq_m_n_to_f_<supf><mode>"
2621 [
2622 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
2623 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
2624 (match_operand:<MVE_CNVT> 2 "s_register_operand" "w")
d2ce75fe 2625 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
724d6566 2626 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
db5db9d2
SP
2627 VCVTQ_M_N_TO_F))
2628 ]
2629 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
2630 "vpst\;vcvtt.f%#<V_sz_elem>.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
2631 [(set_attr "type" "mve_move")
2632 (set_attr "length""8")])
5cbe0c09 2633
8eb3b6b9 2634;;
5cbe0c09
CL
2635;; [vabdq_m_s, vabdq_m_u]
2636;; [vhaddq_m_s, vhaddq_m_u]
2637;; [vhsubq_m_s, vhsubq_m_u]
2638;; [vmaxq_m_s, vmaxq_m_u]
2639;; [vminq_m_s, vminq_m_u]
2640;; [vmulhq_m_s, vmulhq_m_u]
2641;; [vqaddq_m_u, vqaddq_m_s]
2642;; [vqdmladhq_m_s]
2643;; [vqdmladhxq_m_s]
2644;; [vqdmlsdhq_m_s]
2645;; [vqdmlsdhxq_m_s]
2646;; [vqdmulhq_m_s]
2647;; [vqrdmladhq_m_s]
2648;; [vqrdmladhxq_m_s]
2649;; [vqrdmlsdhq_m_s]
2650;; [vqrdmlsdhxq_m_s]
2651;; [vqrdmulhq_m_s]
2652;; [vqrshlq_m_u, vqrshlq_m_s]
2653;; [vqshlq_m_u, vqshlq_m_s]
2654;; [vqsubq_m_u, vqsubq_m_s]
2655;; [vrhaddq_m_u, vrhaddq_m_s]
2656;; [vrmulhq_m_u, vrmulhq_m_s]
2657;; [vrshlq_m_s, vrshlq_m_u]
2658;; [vshlq_m_s, vshlq_m_u]
8eb3b6b9 2659;;
5cbe0c09 2660(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8eb3b6b9
SP
2661 [
2662 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2663 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2664 (match_operand:MVE_2 2 "s_register_operand" "w")
2665 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2666 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
5cbe0c09 2667 MVE_INT_SU_M_BINARY))
8eb3b6b9
SP
2668 ]
2669 "TARGET_HAVE_MVE"
5cbe0c09 2670 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %q3"
8eb3b6b9
SP
2671 [(set_attr "type" "mve_move")
2672 (set_attr "length""8")])
2673
2674;;
b0b3a5e9
CL
2675;; [vaddq_m_n_s, vaddq_m_n_u]
2676;; [vsubq_m_n_s, vsubq_m_n_u]
2677;; [vmulq_m_n_s, vmulq_m_n_u]
8eb3b6b9 2678;;
b0b3a5e9 2679(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2680 [
2681 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2682 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2683 (match_operand:MVE_2 2 "s_register_operand" "w")
2684 (match_operand:<V_elem> 3 "s_register_operand" "r")
724d6566 2685 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
b0b3a5e9 2686 MVE_INT_M_N_BINARY))
8eb3b6b9
SP
2687 ]
2688 "TARGET_HAVE_MVE"
b0b3a5e9 2689 "vpst\;<mve_insn>t.i%#<V_sz_elem> %q0, %q2, %3"
8eb3b6b9
SP
2690 [(set_attr "type" "mve_move")
2691 (set_attr "length""8")])
2692
2693;;
b0b3a5e9
CL
2694;; [vaddq_m_u, vaddq_m_s]
2695;; [vsubq_m_u, vsubq_m_s]
2696;; [vmulq_m_u, vmulq_m_s]
8eb3b6b9 2697;;
b0b3a5e9 2698(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8eb3b6b9
SP
2699 [
2700 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2701 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2702 (match_operand:MVE_2 2 "s_register_operand" "w")
2703 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2704 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
b0b3a5e9 2705 MVE_INT_M_BINARY))
8eb3b6b9
SP
2706 ]
2707 "TARGET_HAVE_MVE"
f2dd012a 2708 "vpst\;<mve_insn>t.i%#<V_sz_elem>\t%q0, %q2, %q3"
8eb3b6b9
SP
2709 [(set_attr "type" "mve_move")
2710 (set_attr "length""8")])
2711
2712;;
67e4e591
CL
2713;; [vandq_m_u, vandq_m_s]
2714;; [vbicq_m_u, vbicq_m_s]
2715;; [veorq_m_u, veorq_m_s]
2716;; [vorrq_m_u, vorrq_m_s]
8eb3b6b9 2717;;
67e4e591 2718(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
8eb3b6b9
SP
2719 [
2720 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2721 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2722 (match_operand:MVE_2 2 "s_register_operand" "w")
2723 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2724 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
67e4e591 2725 MVE_INT_M_BINARY_LOGIC))
8eb3b6b9
SP
2726 ]
2727 "TARGET_HAVE_MVE"
f2dd012a 2728 "vpst\;<mve_insn>t\t%q0, %q2, %q3"
8eb3b6b9
SP
2729 [(set_attr "type" "mve_move")
2730 (set_attr "length""8")])
2731
2732;;
2733;; [vbrsrq_m_n_u, vbrsrq_m_n_s])
2734;;
6ff07398 2735(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2736 [
2737 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2738 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2739 (match_operand:MVE_2 2 "s_register_operand" "w")
2740 (match_operand:SI 3 "s_register_operand" "r")
724d6566 2741 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
8eb3b6b9
SP
2742 VBRSRQ_M_N))
2743 ]
2744 "TARGET_HAVE_MVE"
6ff07398 2745 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2, %3"
8eb3b6b9
SP
2746 [(set_attr "type" "mve_move")
2747 (set_attr "length""8")])
2748
2749;;
b22e70e8
CL
2750;; [vcaddq_rot90_m_u, vcaddq_rot90_m_s]
2751;; [vcaddq_rot270_m_u, vcaddq_rot270_m_s]
2752;; [vhcaddq_rot90_m_s]
2753;; [vhcaddq_rot270_m_s]
8eb3b6b9 2754;;
b22e70e8 2755(define_insn "@mve_<mve_insn>q<mve_rot>_m_<supf><mode>"
8eb3b6b9 2756 [
6debbff6 2757 (set (match_operand:MVE_2 0 "s_register_operand" "<earlyclobber_32>")
8eb3b6b9
SP
2758 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2759 (match_operand:MVE_2 2 "s_register_operand" "w")
2760 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2761 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
b22e70e8 2762 VxCADDQ_M))
8eb3b6b9
SP
2763 ]
2764 "TARGET_HAVE_MVE"
b22e70e8 2765 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2, %q3, #<rot>"
8eb3b6b9
SP
2766 [(set_attr "type" "mve_move")
2767 (set_attr "length""8")])
2768
8eb3b6b9 2769;;
a7cbd5f9
CL
2770;; [vhaddq_m_n_s, vhaddq_m_n_u]
2771;; [vhsubq_m_n_s, vhsubq_m_n_u]
2772;; [vmlaq_m_n_s, vmlaq_m_n_u]
2773;; [vmlasq_m_n_u, vmlasq_m_n_s]
2774;; [vqaddq_m_n_u, vqaddq_m_n_s]
2775;; [vqdmlahq_m_n_s]
2776;; [vqdmlashq_m_n_s]
2777;; [vqdmulhq_m_n_s]
2778;; [vqrdmlahq_m_n_s]
2779;; [vqrdmlashq_m_n_s]
2780;; [vqrdmulhq_m_n_s]
2781;; [vqsubq_m_n_u, vqsubq_m_n_s]
8eb3b6b9 2782;;
a7cbd5f9 2783(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2784 [
2785 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2786 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2787 (match_operand:MVE_2 2 "s_register_operand" "w")
2788 (match_operand:<V_elem> 3 "s_register_operand" "r")
724d6566 2789 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
a7cbd5f9 2790 MVE_INT_SU_M_N_BINARY))
8eb3b6b9
SP
2791 ]
2792 "TARGET_HAVE_MVE"
a7cbd5f9 2793 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
8eb3b6b9
SP
2794 [(set_attr "type" "mve_move")
2795 (set_attr "length""8")])
2796
2797;;
8eb3b6b9 2798;;
1817749d
CL
2799;; [vmladavaq_p_u, vmladavaq_p_s]
2800;; [vmladavaxq_p_s]
2801;; [vmlsdavaq_p_s]
2802;; [vmlsdavaxq_p_s]
8eb3b6b9 2803;;
1817749d 2804(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
8eb3b6b9 2805 [
3d537943 2806 (set (match_operand:SI 0 "s_register_operand" "=Te")
8eb3b6b9
SP
2807 (unspec:SI [(match_operand:SI 1 "s_register_operand" "0")
2808 (match_operand:MVE_2 2 "s_register_operand" "w")
2809 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2810 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
1817749d 2811 MVE_VMLxDAVAQ_P))
8eb3b6b9
SP
2812 ]
2813 "TARGET_HAVE_MVE"
1817749d 2814 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%0, %q2, %q3"
8eb3b6b9
SP
2815 [(set_attr "type" "mve_move")
2816 (set_attr "length""8")])
2817
8eb3b6b9
SP
2818;;
2819;; [vmullbq_int_m_u, vmullbq_int_m_s])
2820;;
2821(define_insn "mve_vmullbq_int_m_<supf><mode>"
2822 [
6debbff6 2823 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
8eb3b6b9
SP
2824 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2825 (match_operand:MVE_2 2 "s_register_operand" "w")
2826 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2827 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
8eb3b6b9
SP
2828 VMULLBQ_INT_M))
2829 ]
2830 "TARGET_HAVE_MVE"
2831 "vpst\;vmullbt.<supf>%#<V_sz_elem> %q0, %q2, %q3"
2832 [(set_attr "type" "mve_move")
2833 (set_attr "length""8")])
2834
2835;;
2836;; [vmulltq_int_m_s, vmulltq_int_m_u])
2837;;
2838(define_insn "mve_vmulltq_int_m_<supf><mode>"
2839 [
6debbff6 2840 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
8eb3b6b9
SP
2841 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2842 (match_operand:MVE_2 2 "s_register_operand" "w")
2843 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2844 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
8eb3b6b9
SP
2845 VMULLTQ_INT_M))
2846 ]
2847 "TARGET_HAVE_MVE"
2848 "vpst\;vmulltt.<supf>%#<V_sz_elem> %q0, %q2, %q3"
2849 [(set_attr "type" "mve_move")
2850 (set_attr "length""8")])
2851
8eb3b6b9
SP
2852;;
2853;; [vornq_m_u, vornq_m_s])
2854;;
2855(define_insn "mve_vornq_m_<supf><mode>"
2856 [
2857 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2858 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2859 (match_operand:MVE_2 2 "s_register_operand" "w")
2860 (match_operand:MVE_2 3 "s_register_operand" "w")
724d6566 2861 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
8eb3b6b9
SP
2862 VORNQ_M))
2863 ]
2864 "TARGET_HAVE_MVE"
f2dd012a 2865 "vpst\;vornt\t%q0, %q2, %q3"
8eb3b6b9
SP
2866 [(set_attr "type" "mve_move")
2867 (set_attr "length""8")])
2868
8eb3b6b9 2869;;
7e6c39a3
CL
2870;; [vqshlq_m_n_s, vqshlq_m_n_u]
2871;; [vshlq_m_n_s, vshlq_m_n_u]
8eb3b6b9 2872;;
7e6c39a3 2873(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2874 [
2875 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2876 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2877 (match_operand:MVE_2 2 "s_register_operand" "w")
2878 (match_operand:SI 3 "immediate_operand" "i")
724d6566 2879 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
7e6c39a3 2880 MVE_SHIFT_M_N))
8eb3b6b9
SP
2881 ]
2882 "TARGET_HAVE_MVE"
7e6c39a3 2883 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
8eb3b6b9
SP
2884 [(set_attr "type" "mve_move")
2885 (set_attr "length""8")])
2886
8eb3b6b9
SP
2887;;
2888;; [vrshrq_m_n_s, vrshrq_m_n_u])
8eb3b6b9
SP
2889;; [vshrq_m_n_s, vshrq_m_n_u])
2890;;
6bb8a5bd 2891(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2892 [
2893 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2894 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2895 (match_operand:MVE_2 2 "s_register_operand" "w")
2896 (match_operand:SI 3 "<MVE_pred2>" "<MVE_constraint2>")
724d6566 2897 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6bb8a5bd 2898 MVE_VSHRQ_M_N))
8eb3b6b9
SP
2899 ]
2900 "TARGET_HAVE_MVE"
6bb8a5bd 2901 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
8eb3b6b9
SP
2902 [(set_attr "type" "mve_move")
2903 (set_attr "length""8")])
2904
2905;;
2906;; [vsliq_m_n_u, vsliq_m_n_s])
2907;;
3767c7fe 2908(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
8eb3b6b9
SP
2909 [
2910 (set (match_operand:MVE_2 0 "s_register_operand" "=w")
2911 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
2912 (match_operand:MVE_2 2 "s_register_operand" "w")
2913 (match_operand:SI 3 "<MVE_pred>" "<MVE_constraint>")
724d6566 2914 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
8eb3b6b9
SP
2915 VSLIQ_M_N))
2916 ]
2917 "TARGET_HAVE_MVE"
3767c7fe 2918 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2, %3"
8eb3b6b9
SP
2919 [(set_attr "type" "mve_move")
2920 (set_attr "length""8")])
2921
f2170a37 2922;;
c68ccdf2
CL
2923;; [vmlaldavaq_p_u, vmlaldavaq_p_s]
2924;; [vmlaldavaxq_p_s]
2925;; [vmlsldavaq_p_s]
2926;; [vmlsldavaxq_p_s]
f2170a37 2927;;
c68ccdf2 2928(define_insn "@mve_<mve_insn>q_p_<supf><mode>"
f2170a37
SP
2929 [
2930 (set (match_operand:DI 0 "s_register_operand" "=r")
2931 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2932 (match_operand:MVE_5 2 "s_register_operand" "w")
2933 (match_operand:MVE_5 3 "s_register_operand" "w")
724d6566 2934 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
c68ccdf2 2935 MVE_VMLxLDAVAxQ_P))
f2170a37
SP
2936 ]
2937 "TARGET_HAVE_MVE"
c68ccdf2 2938 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%Q0, %R0, %q2, %q3"
f2170a37
SP
2939 [(set_attr "type" "mve_move")
2940 (set_attr "length""8")])
2941
2942;;
e2f992f7
CL
2943;; [vqrshrnbq_m_n_u, vqrshrnbq_m_n_s]
2944;; [vqrshrntq_m_n_s, vqrshrntq_m_n_u]
8f5b7d21
CL
2945;; [vqrshrunbq_m_n_s]
2946;; [vqrshruntq_m_n_s]
e2f992f7
CL
2947;; [vqshrnbq_m_n_u, vqshrnbq_m_n_s]
2948;; [vqshrntq_m_n_s, vqshrntq_m_n_u]
8f5b7d21
CL
2949;; [vqshrunbq_m_n_s]
2950;; [vqshruntq_m_n_s]
e2f992f7
CL
2951;; [vrshrnbq_m_n_u, vrshrnbq_m_n_s]
2952;; [vrshrntq_m_n_u, vrshrntq_m_n_s]
2953;; [vshrnbq_m_n_s, vshrnbq_m_n_u]
2954;; [vshrntq_m_n_s, vshrntq_m_n_u]
f2170a37 2955;;
e2f992f7 2956(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
f2170a37
SP
2957 [
2958 (set (match_operand:<V_narrow_pack> 0 "s_register_operand" "=w")
2959 (unspec:<V_narrow_pack> [(match_operand:<V_narrow_pack> 1 "s_register_operand" "0")
e2f992f7
CL
2960 (match_operand:MVE_5 2 "s_register_operand" "w")
2961 (match_operand:SI 3 "<MVE_pred3>" "<MVE_constraint3>")
2962 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2963 MVE_SHRN_M_N))
f2170a37
SP
2964 ]
2965 "TARGET_HAVE_MVE"
e2f992f7 2966 "vpst\;<mve_insn>t.<isu>%#<V_sz_elem>\t%q0, %q2, %3"
f2170a37
SP
2967 [(set_attr "type" "mve_move")
2968 (set_attr "length""8")])
2969
2970;;
e18f715b
CL
2971;; [vrmlaldavhaq_p_s, vrmlaldavhaq_p_u]
2972;; [vrmlaldavhaxq_p_s]
2973;; [vrmlsldavhaq_p_s]
2974;; [vrmlsldavhaxq_p_s]
f2170a37 2975;;
e18f715b 2976(define_insn "@mve_<mve_insn>q_p_<supf>v4si"
f2170a37
SP
2977 [
2978 (set (match_operand:DI 0 "s_register_operand" "=r")
2979 (unspec:DI [(match_operand:DI 1 "s_register_operand" "0")
2980 (match_operand:V4SI 2 "s_register_operand" "w")
2981 (match_operand:V4SI 3 "s_register_operand" "w")
e18f715b
CL
2982 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
2983 MVE_VRMLxLDAVHAxQ_P))
f2170a37
SP
2984 ]
2985 "TARGET_HAVE_MVE"
e18f715b 2986 "vpst\;<mve_insn>t.<supf>32\t%Q0, %R0, %q2, %q3"
f2170a37
SP
2987 [(set_attr "type" "mve_move")
2988 (set_attr "length""8")])
2989
f2170a37 2990;;
2cc50fd9
CL
2991;; [vshllbq_m_n_u, vshllbq_m_n_s]
2992;; [vshlltq_m_n_u, vshlltq_m_n_s]
f2170a37 2993;;
2cc50fd9 2994(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
f2170a37
SP
2995 [
2996 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
2997 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
2998 (match_operand:MVE_3 2 "s_register_operand" "w")
2999 (match_operand:SI 3 "immediate_operand" "i")
724d6566 3000 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
2cc50fd9 3001 VSHLLxQ_M_N))
f2170a37
SP
3002 ]
3003 "TARGET_HAVE_MVE"
2cc50fd9 3004 "vpst\;<mve_insn>t.<supf>%#<V_sz_elem>\t%q0, %q2, %3"
f2170a37
SP
3005 [(set_attr "type" "mve_move")
3006 (set_attr "length""8")])
f2170a37 3007
f2170a37
SP
3008;;
3009;; [vmullbq_poly_m_p])
3010;;
3011(define_insn "mve_vmullbq_poly_m_p<mode>"
3012 [
3013 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
3014 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3015 (match_operand:MVE_3 2 "s_register_operand" "w")
3016 (match_operand:MVE_3 3 "s_register_operand" "w")
724d6566 3017 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
f2170a37
SP
3018 VMULLBQ_POLY_M_P))
3019 ]
3020 "TARGET_HAVE_MVE"
3021 "vpst\;vmullbt.p%#<V_sz_elem>\t%q0, %q2, %q3"
3022 [(set_attr "type" "mve_move")
3023 (set_attr "length""8")])
3024
3025;;
3026;; [vmulltq_poly_m_p])
3027;;
3028(define_insn "mve_vmulltq_poly_m_p<mode>"
3029 [
3030 (set (match_operand:<V_double_width> 0 "s_register_operand" "=w")
3031 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3032 (match_operand:MVE_3 2 "s_register_operand" "w")
3033 (match_operand:MVE_3 3 "s_register_operand" "w")
724d6566 3034 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
f2170a37
SP
3035 VMULLTQ_POLY_M_P))
3036 ]
3037 "TARGET_HAVE_MVE"
3038 "vpst\;vmulltt.p%#<V_sz_elem>\t%q0, %q2, %q3"
3039 [(set_attr "type" "mve_move")
3040 (set_attr "length""8")])
3041
3042;;
c71b5c78
CL
3043;; [vqdmullbq_m_n_s]
3044;; [vqdmulltq_m_n_s]
f2170a37 3045;;
c71b5c78 3046(define_insn "@mve_<mve_insn>q_m_n_<supf><mode>"
f2170a37 3047 [
6debbff6 3048 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
f2170a37
SP
3049 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3050 (match_operand:MVE_5 2 "s_register_operand" "w")
3051 (match_operand:<V_elem> 3 "s_register_operand" "r")
724d6566 3052 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
c71b5c78 3053 MVE_VQDMULLxQ_M_N))
f2170a37
SP
3054 ]
3055 "TARGET_HAVE_MVE"
c71b5c78 3056 "vpst\;<mve_insn>t.s%#<V_sz_elem>\t%q0, %q2, %3"
f2170a37
SP
3057 [(set_attr "type" "mve_move")
3058 (set_attr "length""8")])
3059
3060;;
c71b5c78
CL
3061;; [vqdmullbq_m_s]
3062;; [vqdmulltq_m_s]
f2170a37 3063;;
c71b5c78 3064(define_insn "@mve_<mve_insn>q_m_<supf><mode>"
f2170a37 3065 [
6debbff6 3066 (set (match_operand:<V_double_width> 0 "s_register_operand" "<earlyclobber_32>")
f2170a37
SP
3067 (unspec:<V_double_width> [(match_operand:<V_double_width> 1 "s_register_operand" "0")
3068 (match_operand:MVE_5 2 "s_register_operand" "w")
3069 (match_operand:MVE_5 3 "s_register_operand" "w")
724d6566 3070 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
c71b5c78 3071 MVE_VQDMULLxQ_M))
f2170a37
SP
3072 ]
3073 "TARGET_HAVE_MVE"
c71b5c78 3074 "vpst\;<mve_insn>t.s%#<V_sz_elem>\t%q0, %q2, %q3"
f2170a37
SP
3075 [(set_attr "type" "mve_move")
3076 (set_attr "length""8")])
3077
532e9e24 3078;;
1736f4af 3079;; [vabdq_m_f]
b0b3a5e9 3080;; [vaddq_m_f]
fbab00f0
CL
3081;; [vfmaq_m_f]
3082;; [vfmsq_m_f]
5ea7a47c
CL
3083;; [vmaxnmq_m_f]
3084;; [vminnmq_m_f]
b0b3a5e9 3085;; [vmulq_m_f]
5ea7a47c 3086;; [vsubq_m_f]
532e9e24 3087;;
b0b3a5e9 3088(define_insn "@mve_<mve_insn>q_m_f<mode>"
532e9e24
SP
3089 [
3090 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3091 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3092 (match_operand:MVE_0 2 "s_register_operand" "w")
3093 (match_operand:MVE_0 3 "s_register_operand" "w")
724d6566 3094 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
b0b3a5e9 3095 MVE_FP_M_BINARY))
532e9e24
SP
3096 ]
3097 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
b0b3a5e9 3098 "vpst\;<mve_insn>t.f%#<V_sz_elem> %q0, %q2, %q3"
532e9e24
SP
3099 [(set_attr "type" "mve_move")
3100 (set_attr "length""8")])
3101
3102;;
b0b3a5e9
CL
3103;; [vaddq_m_n_f]
3104;; [vsubq_m_n_f]
3105;; [vmulq_m_n_f]
fbab00f0
CL
3106;; [vfmaq_m_n_f]
3107;; [vfmasq_m_n_f]
532e9e24 3108;;
b0b3a5e9 3109(define_insn "@mve_<mve_insn>q_m_n_f<mode>"
532e9e24
SP
3110 [
3111 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3112 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3113 (match_operand:MVE_0 2 "s_register_operand" "w")
3114 (match_operand:<V_elem> 3 "s_register_operand" "r")
724d6566 3115 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
b0b3a5e9 3116 MVE_FP_M_N_BINARY))
532e9e24
SP
3117 ]
3118 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
fbab00f0 3119 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%q0, %q2, %3"
532e9e24
SP
3120 [(set_attr "type" "mve_move")
3121 (set_attr "length""8")])
3122
3123;;
67e4e591
CL
3124;; [vandq_m_f]
3125;; [vbicq_m_f]
3126;; [veorq_m_f]
3127;; [vorrq_m_f]
532e9e24 3128;;
67e4e591 3129(define_insn "@mve_<mve_insn>q_m_f<mode>"
532e9e24
SP
3130 [
3131 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3132 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3133 (match_operand:MVE_0 2 "s_register_operand" "w")
3134 (match_operand:MVE_0 3 "s_register_operand" "w")
724d6566 3135 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
67e4e591 3136 MVE_FP_M_BINARY_LOGIC))
532e9e24
SP
3137 ]
3138 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 3139 "vpst\;<mve_insn>t\t%q0, %q2, %q3"
532e9e24
SP
3140 [(set_attr "type" "mve_move")
3141 (set_attr "length""8")])
3142
3143;;
3144;; [vbrsrq_m_n_f])
3145;;
6ff07398 3146(define_insn "@mve_<mve_insn>q_m_n_f<mode>"
532e9e24
SP
3147 [
3148 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3149 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3150 (match_operand:MVE_0 2 "s_register_operand" "w")
3151 (match_operand:SI 3 "s_register_operand" "r")
724d6566 3152 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6ff07398 3153 MVE_VBRSR_M_N_FP))
532e9e24
SP
3154 ]
3155 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6ff07398 3156 "vpst\;<mve_insn>t.%#<V_sz_elem>\t%q0, %q2, %3"
532e9e24
SP
3157 [(set_attr "type" "mve_move")
3158 (set_attr "length""8")])
3159
3160;;
b22e70e8
CL
3161;; [vcaddq_rot90_m_f]
3162;; [vcaddq_rot270_m_f]
0c5ba73a
CL
3163;; [vcmulq_m_f]
3164;; [vcmulq_rot90_m_f]
3165;; [vcmulq_rot180_m_f]
3166;; [vcmulq_rot270_m_f]
532e9e24 3167;;
b22e70e8 3168(define_insn "@mve_<mve_insn>q<mve_rot>_m_f<mode>"
532e9e24 3169 [
6debbff6 3170 (set (match_operand:MVE_0 0 "s_register_operand" "<earlyclobber_32>")
532e9e24
SP
3171 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3172 (match_operand:MVE_0 2 "s_register_operand" "w")
3173 (match_operand:MVE_0 3 "s_register_operand" "w")
724d6566 3174 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
0c5ba73a 3175 MVE_VCADDQ_VCMULQ_M))
532e9e24
SP
3176 ]
3177 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
b22e70e8 3178 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%q0, %q2, %q3, #<rot>"
532e9e24
SP
3179 [(set_attr "type" "mve_move")
3180 (set_attr "length""8")])
3181
3182;;
6ae2fba5
CL
3183;; [vcmlaq_m_f]
3184;; [vcmlaq_rot90_m_f]
3185;; [vcmlaq_rot180_m_f]
3186;; [vcmlaq_rot270_m_f]
532e9e24 3187;;
6ae2fba5 3188(define_insn "@mve_<mve_insn>q<mve_rot>_m_f<mode>"
532e9e24
SP
3189 [
3190 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3191 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3192 (match_operand:MVE_0 2 "s_register_operand" "w")
3193 (match_operand:MVE_0 3 "s_register_operand" "w")
724d6566 3194 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
6ae2fba5 3195 MVE_VCMLAQ_M))
532e9e24
SP
3196 ]
3197 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
6ae2fba5 3198 "vpst\;<mve_insn>t.f%#<V_sz_elem>\t%q0, %q2, %q3, #<rot>"
532e9e24
SP
3199 [(set_attr "type" "mve_move")
3200 (set_attr "length""8")])
3201
532e9e24
SP
3202;;
3203;; [vornq_m_f])
3204;;
3205(define_insn "mve_vornq_m_f<mode>"
3206 [
3207 (set (match_operand:MVE_0 0 "s_register_operand" "=w")
3208 (unspec:MVE_0 [(match_operand:MVE_0 1 "s_register_operand" "0")
3209 (match_operand:MVE_0 2 "s_register_operand" "w")
3210 (match_operand:MVE_0 3 "s_register_operand" "w")
724d6566 3211 (match_operand:<MVE_VPRED> 4 "vpr_register_operand" "Up")]
532e9e24
SP
3212 VORNQ_M_F))
3213 ]
3214 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
f2dd012a 3215 "vpst\;vornt\t%q0, %q2, %q3"
532e9e24
SP
3216 [(set_attr "type" "mve_move")
3217 (set_attr "length""8")])
3218
4ff68575
SP
3219;;
3220;; [vstrbq_s vstrbq_u]
3221;;
3222(define_insn "mve_vstrbq_<supf><mode>"
d91524d5 3223 [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
4ff68575
SP
3224 (unspec:<MVE_B_ELEM> [(match_operand:MVE_2 1 "s_register_operand" "w")]
3225 VSTRBQ))
3226 ]
3227 "TARGET_HAVE_MVE"
3228{
3229 rtx ops[2];
3230 int regno = REGNO (operands[1]);
3231 ops[1] = gen_rtx_REG (TImode, regno);
3232 ops[0] = operands[0];
3233 output_asm_insn("vstrb.<V_sz_elem>\t%q1, %E0",ops);
3234 return "";
3235}
3236 [(set_attr "length" "4")])
3237
3238;;
3239;; [vstrbq_scatter_offset_s vstrbq_scatter_offset_u]
3240;;
9a810e57
SP
3241(define_expand "mve_vstrbq_scatter_offset_<supf><mode>"
3242 [(match_operand:<MVE_B_ELEM> 0 "mve_scatter_memory")
3243 (match_operand:MVE_2 1 "s_register_operand")
3244 (match_operand:MVE_2 2 "s_register_operand")
3245 (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
4ff68575
SP
3246 "TARGET_HAVE_MVE"
3247{
9a810e57
SP
3248 rtx ind = XEXP (operands[0], 0);
3249 gcc_assert (REG_P (ind));
3250 emit_insn (gen_mve_vstrbq_scatter_offset_<supf><mode>_insn (ind, operands[1],
3251 operands[2]));
3252 DONE;
3253})
3254
3255(define_insn "mve_vstrbq_scatter_offset_<supf><mode>_insn"
3256 [(set (mem:BLK (scratch))
3257 (unspec:BLK
3258 [(match_operand:SI 0 "register_operand" "r")
3259 (match_operand:MVE_2 1 "s_register_operand" "w")
3260 (match_operand:MVE_2 2 "s_register_operand" "w")]
3261 VSTRBSOQ))]
3262 "TARGET_HAVE_MVE"
3263 "vstrb.<V_sz_elem>\t%q2, [%0, %q1]"
4ff68575
SP
3264 [(set_attr "length" "4")])
3265
3266;;
3267;; [vstrwq_scatter_base_s vstrwq_scatter_base_u]
3268;;
3269(define_insn "mve_vstrwq_scatter_base_<supf>v4si"
3270 [(set (mem:BLK (scratch))
3271 (unspec:BLK
3272 [(match_operand:V4SI 0 "s_register_operand" "w")
3273 (match_operand:SI 1 "immediate_operand" "i")
3274 (match_operand:V4SI 2 "s_register_operand" "w")]
3275 VSTRWSBQ))
3276 ]
3277 "TARGET_HAVE_MVE"
3278{
3279 rtx ops[3];
3280 ops[0] = operands[0];
3281 ops[1] = operands[1];
3282 ops[2] = operands[2];
3283 output_asm_insn("vstrw.u32\t%q2, [%q0, %1]",ops);
3284 return "";
3285}
3286 [(set_attr "length" "4")])
535a8645
SP
3287
3288;;
3289;; [vldrbq_gather_offset_s vldrbq_gather_offset_u]
3290;;
3291(define_insn "mve_vldrbq_gather_offset_<supf><mode>"
3292 [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
3293 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
3294 (match_operand:MVE_2 2 "s_register_operand" "w")]
3295 VLDRBGOQ))
3296 ]
3297 "TARGET_HAVE_MVE"
3298{
3299 rtx ops[3];
3300 ops[0] = operands[0];
3301 ops[1] = operands[1];
3302 ops[2] = operands[2];
3303 if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
3304 output_asm_insn ("vldrb.u8\t%q0, [%m1, %q2]",ops);
3305 else
3306 output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3307 return "";
3308}
3309 [(set_attr "length" "4")])
3310
3311;;
3312;; [vldrbq_s vldrbq_u]
3313;;
3314(define_insn "mve_vldrbq_<supf><mode>"
3315 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
d91524d5 3316 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")]
535a8645
SP
3317 VLDRBQ))
3318 ]
3319 "TARGET_HAVE_MVE"
3320{
3321 rtx ops[2];
3322 int regno = REGNO (operands[0]);
3323 ops[0] = gen_rtx_REG (TImode, regno);
3324 ops[1] = operands[1];
d91524d5
SP
3325 if (<V_sz_elem> == 8)
3326 output_asm_insn ("vldrb.<V_sz_elem>\t%q0, %E1",ops);
3327 else
3328 output_asm_insn ("vldrb.<supf><V_sz_elem>\t%q0, %E1",ops);
535a8645
SP
3329 return "";
3330}
3331 [(set_attr "length" "4")])
3332
3333;;
3334;; [vldrwq_gather_base_s vldrwq_gather_base_u]
3335;;
3336(define_insn "mve_vldrwq_gather_base_<supf>v4si"
3337 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
3338 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
3339 (match_operand:SI 2 "immediate_operand" "i")]
3340 VLDRWGBQ))
3341 ]
3342 "TARGET_HAVE_MVE"
3343{
3344 rtx ops[3];
3345 ops[0] = operands[0];
3346 ops[1] = operands[1];
3347 ops[2] = operands[2];
3348 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
3349 return "";
3350}
3351 [(set_attr "length" "4")])
405e918c
SP
3352
3353;;
3354;; [vstrbq_scatter_offset_p_s vstrbq_scatter_offset_p_u]
3355;;
9a810e57
SP
3356(define_expand "mve_vstrbq_scatter_offset_p_<supf><mode>"
3357 [(match_operand:<MVE_B_ELEM> 0 "mve_scatter_memory")
3358 (match_operand:MVE_2 1 "s_register_operand")
3359 (match_operand:MVE_2 2 "s_register_operand")
724d6566 3360 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
9a810e57 3361 (unspec:V4SI [(const_int 0)] VSTRBSOQ)]
405e918c
SP
3362 "TARGET_HAVE_MVE"
3363{
9a810e57
SP
3364 rtx ind = XEXP (operands[0], 0);
3365 gcc_assert (REG_P (ind));
3366 emit_insn (
3367 gen_mve_vstrbq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
3368 operands[2],
3369 operands[3]));
3370 DONE;
3371})
3372
3373(define_insn "mve_vstrbq_scatter_offset_p_<supf><mode>_insn"
3374 [(set (mem:BLK (scratch))
3375 (unspec:BLK
3376 [(match_operand:SI 0 "register_operand" "r")
3377 (match_operand:MVE_2 1 "s_register_operand" "w")
3378 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 3379 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
9a810e57
SP
3380 VSTRBSOQ))]
3381 "TARGET_HAVE_MVE"
3382 "vpst\;vstrbt.<V_sz_elem>\t%q2, [%0, %q1]"
405e918c
SP
3383 [(set_attr "length" "8")])
3384
3385;;
3386;; [vstrwq_scatter_base_p_s vstrwq_scatter_base_p_u]
3387;;
3388(define_insn "mve_vstrwq_scatter_base_p_<supf>v4si"
3389 [(set (mem:BLK (scratch))
3390 (unspec:BLK
3391 [(match_operand:V4SI 0 "s_register_operand" "w")
3392 (match_operand:SI 1 "immediate_operand" "i")
3393 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 3394 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
405e918c
SP
3395 VSTRWSBQ))
3396 ]
3397 "TARGET_HAVE_MVE"
3398{
3399 rtx ops[3];
3400 ops[0] = operands[0];
3401 ops[1] = operands[1];
3402 ops[2] = operands[2];
3403 output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
3404 return "";
3405}
3406 [(set_attr "length" "8")])
3407
405e918c 3408(define_insn "mve_vstrbq_p_<supf><mode>"
d91524d5 3409 [(set (match_operand:<MVE_B_ELEM> 0 "mve_memory_operand" "=Ux")
c1093923
AV
3410 (unspec:<MVE_B_ELEM>
3411 [(match_operand:MVE_2 1 "s_register_operand" "w")
3412 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
3413 (match_dup 0)]
3414 VSTRBQ))]
405e918c
SP
3415 "TARGET_HAVE_MVE"
3416{
3417 rtx ops[2];
3418 int regno = REGNO (operands[1]);
3419 ops[1] = gen_rtx_REG (TImode, regno);
3420 ops[0] = operands[0];
d91524d5 3421 output_asm_insn ("vpst\;vstrbt.<V_sz_elem>\t%q1, %E0",ops);
405e918c
SP
3422 return "";
3423}
3424 [(set_attr "length" "8")])
429d607b
SP
3425
3426;;
3427;; [vldrbq_gather_offset_z_s vldrbq_gather_offset_z_u]
3428;;
3429(define_insn "mve_vldrbq_gather_offset_z_<supf><mode>"
3430 [(set (match_operand:MVE_2 0 "s_register_operand" "=&w")
3431 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "memory_operand" "Us")
3432 (match_operand:MVE_2 2 "s_register_operand" "w")
724d6566 3433 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
429d607b
SP
3434 VLDRBGOQ))
3435 ]
3436 "TARGET_HAVE_MVE"
3437{
3438 rtx ops[4];
3439 ops[0] = operands[0];
3440 ops[1] = operands[1];
3441 ops[2] = operands[2];
3442 ops[3] = operands[3];
3443 if (!strcmp ("<supf>","s") && <V_sz_elem> == 8)
3444 output_asm_insn ("vpst\n\tvldrbt.u8\t%q0, [%m1, %q2]",ops);
3445 else
3446 output_asm_insn ("vpst\n\tvldrbt.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3447 return "";
3448}
3449 [(set_attr "length" "8")])
3450
3451;;
3452;; [vldrbq_z_s vldrbq_z_u]
3453;;
3454(define_insn "mve_vldrbq_z_<supf><mode>"
3455 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
d91524d5 3456 (unspec:MVE_2 [(match_operand:<MVE_B_ELEM> 1 "mve_memory_operand" "Ux")
724d6566 3457 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
429d607b
SP
3458 VLDRBQ))
3459 ]
3460 "TARGET_HAVE_MVE"
3461{
3462 rtx ops[2];
3463 int regno = REGNO (operands[0]);
3464 ops[0] = gen_rtx_REG (TImode, regno);
3465 ops[1] = operands[1];
d91524d5
SP
3466 if (<V_sz_elem> == 8)
3467 output_asm_insn ("vpst\;vldrbt.<V_sz_elem>\t%q0, %E1",ops);
3468 else
3469 output_asm_insn ("vpst\;vldrbt.<supf><V_sz_elem>\t%q0, %E1",ops);
429d607b
SP
3470 return "";
3471}
3472 [(set_attr "length" "8")])
3473
3474;;
3475;; [vldrwq_gather_base_z_s vldrwq_gather_base_z_u]
3476;;
3477(define_insn "mve_vldrwq_gather_base_z_<supf>v4si"
3478 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
3479 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
3480 (match_operand:SI 2 "immediate_operand" "i")
6a7c13a0 3481 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
429d607b
SP
3482 VLDRWGBQ))
3483 ]
3484 "TARGET_HAVE_MVE"
3485{
3486 rtx ops[3];
3487 ops[0] = operands[0];
3488 ops[1] = operands[1];
3489 ops[2] = operands[2];
3490 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
3491 return "";
3492}
3493 [(set_attr "length" "8")])
bf1e3d5a
SP
3494
3495;;
3496;; [vldrhq_f]
3497;;
3498(define_insn "mve_vldrhq_fv8hf"
3499 [(set (match_operand:V8HF 0 "s_register_operand" "=w")
d91524d5 3500 (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")]
bf1e3d5a
SP
3501 VLDRHQ_F))
3502 ]
3503 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3504{
3505 rtx ops[2];
3506 int regno = REGNO (operands[0]);
3507 ops[0] = gen_rtx_REG (TImode, regno);
3508 ops[1] = operands[1];
d91524d5 3509 output_asm_insn ("vldrh.16\t%q0, %E1",ops);
bf1e3d5a
SP
3510 return "";
3511}
3512 [(set_attr "length" "4")])
3513
3514;;
3515;; [vldrhq_gather_offset_s vldrhq_gather_offset_u]
3516;;
3517(define_insn "mve_vldrhq_gather_offset_<supf><mode>"
19fc92d8
CL
3518 [(set (match_operand:MVE_5 0 "s_register_operand" "=&w")
3519 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
3520 (match_operand:MVE_5 2 "s_register_operand" "w")]
bf1e3d5a
SP
3521 VLDRHGOQ))
3522 ]
3523 "TARGET_HAVE_MVE"
3524{
3525 rtx ops[3];
3526 ops[0] = operands[0];
3527 ops[1] = operands[1];
3528 ops[2] = operands[2];
3529 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
3530 output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2]",ops);
3531 else
3532 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3533 return "";
3534}
3535 [(set_attr "length" "4")])
3536
3537;;
3538;; [vldrhq_gather_offset_z_s vldrhq_gather_offset_z_u]
3539;;
3540(define_insn "mve_vldrhq_gather_offset_z_<supf><mode>"
19fc92d8
CL
3541 [(set (match_operand:MVE_5 0 "s_register_operand" "=&w")
3542 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
3543 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 3544 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
bf1e3d5a
SP
3545 ]VLDRHGOQ))
3546 ]
3547 "TARGET_HAVE_MVE"
3548{
3549 rtx ops[4];
3550 ops[0] = operands[0];
3551 ops[1] = operands[1];
3552 ops[2] = operands[2];
3553 ops[3] = operands[3];
3554 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
3555 output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2]",ops);
3556 else
3557 output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2]",ops);
3558 return "";
3559}
3560 [(set_attr "length" "8")])
3561
3562;;
3563;; [vldrhq_gather_shifted_offset_s vldrhq_gather_shifted_offset_u]
3564;;
3565(define_insn "mve_vldrhq_gather_shifted_offset_<supf><mode>"
19fc92d8
CL
3566 [(set (match_operand:MVE_5 0 "s_register_operand" "=&w")
3567 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
3568 (match_operand:MVE_5 2 "s_register_operand" "w")]
bf1e3d5a
SP
3569 VLDRHGSOQ))
3570 ]
3571 "TARGET_HAVE_MVE"
3572{
3573 rtx ops[3];
3574 ops[0] = operands[0];
3575 ops[1] = operands[1];
3576 ops[2] = operands[2];
3577 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
3578 output_asm_insn ("vldrh.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
3579 else
3580 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
3581 return "";
3582}
3583 [(set_attr "length" "4")])
3584
3585;;
3586;; [vldrhq_gather_shifted_offset_z_s vldrhq_gather_shited_offset_z_u]
3587;;
3588(define_insn "mve_vldrhq_gather_shifted_offset_z_<supf><mode>"
19fc92d8
CL
3589 [(set (match_operand:MVE_5 0 "s_register_operand" "=&w")
3590 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "memory_operand" "Us")
3591 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 3592 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")
bf1e3d5a
SP
3593 ]VLDRHGSOQ))
3594 ]
3595 "TARGET_HAVE_MVE"
3596{
3597 rtx ops[4];
3598 ops[0] = operands[0];
3599 ops[1] = operands[1];
3600 ops[2] = operands[2];
3601 ops[3] = operands[3];
3602 if (!strcmp ("<supf>","s") && <V_sz_elem> == 16)
3603 output_asm_insn ("vpst\n\tvldrht.u16\t%q0, [%m1, %q2, uxtw #1]",ops);
3604 else
3605 output_asm_insn ("vpst\n\tvldrht.<supf><V_sz_elem>\t%q0, [%m1, %q2, uxtw #1]",ops);
3606 return "";
3607}
3608 [(set_attr "length" "8")])
3609
bf1e3d5a
SP
3610;;
3611;; [vldrhq_s, vldrhq_u]
3612;;
3613(define_insn "mve_vldrhq_<supf><mode>"
19fc92d8
CL
3614 [(set (match_operand:MVE_5 0 "s_register_operand" "=w")
3615 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")]
bf1e3d5a
SP
3616 VLDRHQ))
3617 ]
3618 "TARGET_HAVE_MVE"
3619{
3620 rtx ops[2];
3621 int regno = REGNO (operands[0]);
3622 ops[0] = gen_rtx_REG (TImode, regno);
3623 ops[1] = operands[1];
d91524d5
SP
3624 if (<V_sz_elem> == 16)
3625 output_asm_insn ("vldrh.16\t%q0, %E1",ops);
3626 else
3627 output_asm_insn ("vldrh.<supf><V_sz_elem>\t%q0, %E1",ops);
bf1e3d5a
SP
3628 return "";
3629}
3630 [(set_attr "length" "4")])
3631
3632;;
3633;; [vldrhq_z_f]
3634;;
3635(define_insn "mve_vldrhq_z_fv8hf"
3636 [(set (match_operand:V8HF 0 "s_register_operand" "=w")
d91524d5 3637 (unspec:V8HF [(match_operand:V8HI 1 "mve_memory_operand" "Ux")
c6b4ea7a 3638 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
bf1e3d5a
SP
3639 VLDRHQ_F))
3640 ]
3641 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3642{
3643 rtx ops[2];
3644 int regno = REGNO (operands[0]);
3645 ops[0] = gen_rtx_REG (TImode, regno);
3646 ops[1] = operands[1];
d91524d5 3647 output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
bf1e3d5a
SP
3648 return "";
3649}
3650 [(set_attr "length" "8")])
3651
3652;;
3653;; [vldrhq_z_s vldrhq_z_u]
3654;;
3655(define_insn "mve_vldrhq_z_<supf><mode>"
19fc92d8
CL
3656 [(set (match_operand:MVE_5 0 "s_register_operand" "=w")
3657 (unspec:MVE_5 [(match_operand:<MVE_H_ELEM> 1 "mve_memory_operand" "Ux")
724d6566 3658 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")]
bf1e3d5a
SP
3659 VLDRHQ))
3660 ]
3661 "TARGET_HAVE_MVE"
3662{
3663 rtx ops[2];
3664 int regno = REGNO (operands[0]);
3665 ops[0] = gen_rtx_REG (TImode, regno);
3666 ops[1] = operands[1];
d91524d5
SP
3667 if (<V_sz_elem> == 16)
3668 output_asm_insn ("vpst\;vldrht.16\t%q0, %E1",ops);
3669 else
3670 output_asm_insn ("vpst\;vldrht.<supf><V_sz_elem>\t%q0, %E1",ops);
bf1e3d5a
SP
3671 return "";
3672}
3673 [(set_attr "length" "8")])
3674
3675;;
3676;; [vldrwq_f]
3677;;
3678(define_insn "mve_vldrwq_fv4sf"
3679 [(set (match_operand:V4SF 0 "s_register_operand" "=w")
5efeaa0d 3680 (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
bf1e3d5a
SP
3681 VLDRWQ_F))
3682 ]
3683 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3684{
3685 rtx ops[2];
3686 int regno = REGNO (operands[0]);
3687 ops[0] = gen_rtx_REG (TImode, regno);
3688 ops[1] = operands[1];
d91524d5 3689 output_asm_insn ("vldrw.32\t%q0, %E1",ops);
bf1e3d5a
SP
3690 return "";
3691}
3692 [(set_attr "length" "4")])
3693
3694;;
3695;; [vldrwq_s vldrwq_u]
3696;;
3697(define_insn "mve_vldrwq_<supf>v4si"
3698 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5efeaa0d 3699 (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")]
bf1e3d5a
SP
3700 VLDRWQ))
3701 ]
3702 "TARGET_HAVE_MVE"
3703{
3704 rtx ops[2];
3705 int regno = REGNO (operands[0]);
3706 ops[0] = gen_rtx_REG (TImode, regno);
3707 ops[1] = operands[1];
d91524d5 3708 output_asm_insn ("vldrw.32\t%q0, %E1",ops);
bf1e3d5a
SP
3709 return "";
3710}
3711 [(set_attr "length" "4")])
3712
3713;;
3714;; [vldrwq_z_f]
3715;;
3716(define_insn "mve_vldrwq_z_fv4sf"
3717 [(set (match_operand:V4SF 0 "s_register_operand" "=w")
5efeaa0d 3718 (unspec:V4SF [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
6a7c13a0 3719 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
bf1e3d5a
SP
3720 VLDRWQ_F))
3721 ]
3722 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3723{
3724 rtx ops[2];
3725 int regno = REGNO (operands[0]);
3726 ops[0] = gen_rtx_REG (TImode, regno);
3727 ops[1] = operands[1];
d91524d5 3728 output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
bf1e3d5a
SP
3729 return "";
3730}
3731 [(set_attr "length" "8")])
3732
3733;;
3734;; [vldrwq_z_s vldrwq_z_u]
3735;;
3736(define_insn "mve_vldrwq_z_<supf>v4si"
3737 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5efeaa0d 3738 (unspec:V4SI [(match_operand:V4SI 1 "mve_memory_operand" "Ux")
6a7c13a0 3739 (match_operand:V4BI 2 "vpr_register_operand" "Up")]
bf1e3d5a
SP
3740 VLDRWQ))
3741 ]
3742 "TARGET_HAVE_MVE"
3743{
3744 rtx ops[2];
3745 int regno = REGNO (operands[0]);
3746 ops[0] = gen_rtx_REG (TImode, regno);
3747 ops[1] = operands[1];
d91524d5 3748 output_asm_insn ("vpst\;vldrwt.32\t%q0, %E1",ops);
bf1e3d5a
SP
3749 return "";
3750}
3751 [(set_attr "length" "8")])
3752
3753(define_expand "mve_vld1q_f<mode>"
3754 [(match_operand:MVE_0 0 "s_register_operand")
d91524d5 3755 (unspec:MVE_0 [(match_operand:<MVE_CNVT> 1 "mve_memory_operand")] VLD1Q_F)
bf1e3d5a
SP
3756 ]
3757 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
3758{
3759 emit_insn (gen_mve_vldr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
3760 DONE;
3761})
3762
3763(define_expand "mve_vld1q_<supf><mode>"
3764 [(match_operand:MVE_2 0 "s_register_operand")
d91524d5 3765 (unspec:MVE_2 [(match_operand:MVE_2 1 "mve_memory_operand")] VLD1Q)
bf1e3d5a
SP
3766 ]
3767 "TARGET_HAVE_MVE"
3768{
3769 emit_insn (gen_mve_vldr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
3770 DONE;
3771})
4cc23303
SP
3772
3773;;
3774;; [vldrdq_gather_base_s vldrdq_gather_base_u]
3775;;
3776(define_insn "mve_vldrdq_gather_base_<supf>v2di"
3777 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3778 (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
3779 (match_operand:SI 2 "immediate_operand" "i")]
3780 VLDRDGBQ))
3781 ]
3782 "TARGET_HAVE_MVE"
3783{
3784 rtx ops[3];
3785 ops[0] = operands[0];
3786 ops[1] = operands[1];
3787 ops[2] = operands[2];
3788 output_asm_insn ("vldrd.64\t%q0, [%q1, %2]",ops);
3789 return "";
3790}
3791 [(set_attr "length" "4")])
3792
3793;;
3794;; [vldrdq_gather_base_z_s vldrdq_gather_base_z_u]
3795;;
3796(define_insn "mve_vldrdq_gather_base_z_<supf>v2di"
3797 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3798 (unspec:V2DI [(match_operand:V2DI 1 "s_register_operand" "w")
3799 (match_operand:SI 2 "immediate_operand" "i")
e0bc13d3 3800 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4cc23303
SP
3801 VLDRDGBQ))
3802 ]
3803 "TARGET_HAVE_MVE"
3804{
3805 rtx ops[3];
3806 ops[0] = operands[0];
3807 ops[1] = operands[1];
3808 ops[2] = operands[2];
3809 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%q1, %2]",ops);
3810 return "";
3811}
3812 [(set_attr "length" "8")])
3813
3814;;
3815;; [vldrdq_gather_offset_s vldrdq_gather_offset_u]
3816;;
3817(define_insn "mve_vldrdq_gather_offset_<supf>v2di"
3818 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3819 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
3820 (match_operand:V2DI 2 "s_register_operand" "w")]
3821 VLDRDGOQ))
3822 ]
3823 "TARGET_HAVE_MVE"
3824{
3825 rtx ops[3];
3826 ops[0] = operands[0];
3827 ops[1] = operands[1];
3828 ops[2] = operands[2];
3829 output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2]",ops);
3830 return "";
3831}
3832 [(set_attr "length" "4")])
3833
3834;;
3835;; [vldrdq_gather_offset_z_s vldrdq_gather_offset_z_u]
3836;;
3837(define_insn "mve_vldrdq_gather_offset_z_<supf>v2di"
3838 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3839 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
3840 (match_operand:V2DI 2 "s_register_operand" "w")
e0bc13d3 3841 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4cc23303
SP
3842 VLDRDGOQ))
3843 ]
3844 "TARGET_HAVE_MVE"
3845{
3846 rtx ops[3];
3847 ops[0] = operands[0];
3848 ops[1] = operands[1];
3849 ops[2] = operands[2];
3850 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2]",ops);
3851 return "";
3852}
3853 [(set_attr "length" "8")])
3854
3855;;
3856;; [vldrdq_gather_shifted_offset_s vldrdq_gather_shifted_offset_u]
3857;;
3858(define_insn "mve_vldrdq_gather_shifted_offset_<supf>v2di"
3859 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3860 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
3861 (match_operand:V2DI 2 "s_register_operand" "w")]
3862 VLDRDGSOQ))
3863 ]
3864 "TARGET_HAVE_MVE"
3865{
3866 rtx ops[3];
3867 ops[0] = operands[0];
3868 ops[1] = operands[1];
3869 ops[2] = operands[2];
3870 output_asm_insn ("vldrd.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
3871 return "";
3872}
3873 [(set_attr "length" "4")])
3874
3875;;
3876;; [vldrdq_gather_shifted_offset_z_s vldrdq_gather_shifted_offset_z_u]
3877;;
3878(define_insn "mve_vldrdq_gather_shifted_offset_z_<supf>v2di"
3879 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
3880 (unspec:V2DI [(match_operand:V2DI 1 "memory_operand" "Us")
3881 (match_operand:V2DI 2 "s_register_operand" "w")
e0bc13d3 3882 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
4cc23303
SP
3883 VLDRDGSOQ))
3884 ]
3885 "TARGET_HAVE_MVE"
3886{
3887 rtx ops[3];
3888 ops[0] = operands[0];
3889 ops[1] = operands[1];
3890 ops[2] = operands[2];
3891 output_asm_insn ("vpst\n\tvldrdt.u64\t%q0, [%m1, %q2, uxtw #3]",ops);
3892 return "";
3893}
3894 [(set_attr "length" "8")])
3895
3896;;
3897;; [vldrhq_gather_offset_f]
3898;;
3899(define_insn "mve_vldrhq_gather_offset_fv8hf"
3900 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
3901 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
3902 (match_operand:V8HI 2 "s_register_operand" "w")]
3903 VLDRHQGO_F))
3904 ]
3905 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3906{
3907 rtx ops[3];
3908 ops[0] = operands[0];
3909 ops[1] = operands[1];
3910 ops[2] = operands[2];
3911 output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2]",ops);
3912 return "";
3913}
3914 [(set_attr "length" "4")])
3915
3916;;
3917;; [vldrhq_gather_offset_z_f]
3918;;
3919(define_insn "mve_vldrhq_gather_offset_z_fv8hf"
3920 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
3921 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
3922 (match_operand:V8HI 2 "s_register_operand" "w")
6a7c13a0 3923 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
3924 VLDRHQGO_F))
3925 ]
3926 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3927{
3928 rtx ops[4];
3929 ops[0] = operands[0];
3930 ops[1] = operands[1];
3931 ops[2] = operands[2];
3932 ops[3] = operands[3];
3933 output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2]",ops);
3934 return "";
3935}
3936 [(set_attr "length" "8")])
3937
3938;;
3939;; [vldrhq_gather_shifted_offset_f]
3940;;
3941(define_insn "mve_vldrhq_gather_shifted_offset_fv8hf"
3942 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
3943 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
3944 (match_operand:V8HI 2 "s_register_operand" "w")]
3945 VLDRHQGSO_F))
3946 ]
3947 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3948{
3949 rtx ops[3];
3950 ops[0] = operands[0];
3951 ops[1] = operands[1];
3952 ops[2] = operands[2];
3953 output_asm_insn ("vldrh.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
3954 return "";
3955}
3956 [(set_attr "length" "4")])
3957
3958;;
3959;; [vldrhq_gather_shifted_offset_z_f]
3960;;
3961(define_insn "mve_vldrhq_gather_shifted_offset_z_fv8hf"
3962 [(set (match_operand:V8HF 0 "s_register_operand" "=&w")
3963 (unspec:V8HF [(match_operand:V8HI 1 "memory_operand" "Us")
3964 (match_operand:V8HI 2 "s_register_operand" "w")
6a7c13a0 3965 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
3966 VLDRHQGSO_F))
3967 ]
3968 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3969{
3970 rtx ops[4];
3971 ops[0] = operands[0];
3972 ops[1] = operands[1];
3973 ops[2] = operands[2];
3974 ops[3] = operands[3];
3975 output_asm_insn ("vpst\n\tvldrht.f16\t%q0, [%m1, %q2, uxtw #1]",ops);
3976 return "";
3977}
3978 [(set_attr "length" "8")])
3979
3980;;
3981;; [vldrwq_gather_base_f]
3982;;
3983(define_insn "mve_vldrwq_gather_base_fv4sf"
3984 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
3985 (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
3986 (match_operand:SI 2 "immediate_operand" "i")]
3987 VLDRWQGB_F))
3988 ]
3989 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
3990{
3991 rtx ops[3];
3992 ops[0] = operands[0];
3993 ops[1] = operands[1];
3994 ops[2] = operands[2];
3995 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]",ops);
3996 return "";
3997}
3998 [(set_attr "length" "4")])
3999
4000;;
4001;; [vldrwq_gather_base_z_f]
4002;;
4003(define_insn "mve_vldrwq_gather_base_z_fv4sf"
4004 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4005 (unspec:V4SF [(match_operand:V4SI 1 "s_register_operand" "w")
4006 (match_operand:SI 2 "immediate_operand" "i")
6a7c13a0 4007 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
4008 VLDRWQGB_F))
4009 ]
4010 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4011{
4012 rtx ops[3];
4013 ops[0] = operands[0];
4014 ops[1] = operands[1];
4015 ops[2] = operands[2];
4016 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%q1, %2]",ops);
4017 return "";
4018}
4019 [(set_attr "length" "8")])
4020
4021;;
4022;; [vldrwq_gather_offset_f]
4023;;
4024(define_insn "mve_vldrwq_gather_offset_fv4sf"
4025 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4026 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4027 (match_operand:V4SI 2 "s_register_operand" "w")]
4028 VLDRWQGO_F))
4029 ]
4030 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4031{
4032 rtx ops[3];
4033 ops[0] = operands[0];
4034 ops[1] = operands[1];
4035 ops[2] = operands[2];
4036 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
4037 return "";
4038}
4039 [(set_attr "length" "4")])
4040
4041;;
4042;; [vldrwq_gather_offset_s vldrwq_gather_offset_u]
4043;;
4044(define_insn "mve_vldrwq_gather_offset_<supf>v4si"
4045 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4046 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4047 (match_operand:V4SI 2 "s_register_operand" "w")]
4048 VLDRWGOQ))
4049 ]
4050 "TARGET_HAVE_MVE"
4051{
4052 rtx ops[3];
4053 ops[0] = operands[0];
4054 ops[1] = operands[1];
4055 ops[2] = operands[2];
4056 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2]",ops);
4057 return "";
4058}
4059 [(set_attr "length" "4")])
4060
4061;;
4062;; [vldrwq_gather_offset_z_f]
4063;;
4064(define_insn "mve_vldrwq_gather_offset_z_fv4sf"
4065 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4066 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4067 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 4068 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
4069 VLDRWQGO_F))
4070 ]
4071 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4072{
4073 rtx ops[4];
4074 ops[0] = operands[0];
4075 ops[1] = operands[1];
4076 ops[2] = operands[2];
4077 ops[3] = operands[3];
4078 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
4079 return "";
4080}
4081 [(set_attr "length" "8")])
4082
4083;;
4084;; [vldrwq_gather_offset_z_s vldrwq_gather_offset_z_u]
4085;;
4086(define_insn "mve_vldrwq_gather_offset_z_<supf>v4si"
4087 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4088 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4089 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 4090 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
4091 VLDRWGOQ))
4092 ]
4093 "TARGET_HAVE_MVE"
4094{
4095 rtx ops[4];
4096 ops[0] = operands[0];
4097 ops[1] = operands[1];
4098 ops[2] = operands[2];
4099 ops[3] = operands[3];
4100 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2]",ops);
4101 return "";
4102}
4103 [(set_attr "length" "8")])
4104
4105;;
4106;; [vldrwq_gather_shifted_offset_f]
4107;;
4108(define_insn "mve_vldrwq_gather_shifted_offset_fv4sf"
4109 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4110 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4111 (match_operand:V4SI 2 "s_register_operand" "w")]
4112 VLDRWQGSO_F))
4113 ]
4114 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4115{
4116 rtx ops[3];
4117 ops[0] = operands[0];
4118 ops[1] = operands[1];
4119 ops[2] = operands[2];
4120 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4121 return "";
4122}
4123 [(set_attr "length" "4")])
4124
4125;;
4126;; [vldrwq_gather_shifted_offset_s vldrwq_gather_shifted_offset_u]
4127;;
4128(define_insn "mve_vldrwq_gather_shifted_offset_<supf>v4si"
4129 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4130 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4131 (match_operand:V4SI 2 "s_register_operand" "w")]
4132 VLDRWGSOQ))
4133 ]
4134 "TARGET_HAVE_MVE"
4135{
4136 rtx ops[3];
4137 ops[0] = operands[0];
4138 ops[1] = operands[1];
4139 ops[2] = operands[2];
4140 output_asm_insn ("vldrw.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4141 return "";
4142}
4143 [(set_attr "length" "4")])
4144
4145;;
4146;; [vldrwq_gather_shifted_offset_z_f]
4147;;
4148(define_insn "mve_vldrwq_gather_shifted_offset_z_fv4sf"
4149 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
4150 (unspec:V4SF [(match_operand:V4SI 1 "memory_operand" "Us")
4151 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 4152 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
4153 VLDRWQGSO_F))
4154 ]
4155 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4156{
4157 rtx ops[4];
4158 ops[0] = operands[0];
4159 ops[1] = operands[1];
4160 ops[2] = operands[2];
4161 ops[3] = operands[3];
4162 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4163 return "";
4164}
4165 [(set_attr "length" "8")])
4166
4167;;
4168;; [vldrwq_gather_shifted_offset_z_s vldrwq_gather_shifted_offset_z_u]
4169;;
4170(define_insn "mve_vldrwq_gather_shifted_offset_z_<supf>v4si"
4171 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
4172 (unspec:V4SI [(match_operand:V4SI 1 "memory_operand" "Us")
4173 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 4174 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
4cc23303
SP
4175 VLDRWGSOQ))
4176 ]
4177 "TARGET_HAVE_MVE"
4178{
4179 rtx ops[4];
4180 ops[0] = operands[0];
4181 ops[1] = operands[1];
4182 ops[2] = operands[2];
4183 ops[3] = operands[3];
4184 output_asm_insn ("vpst\n\tvldrwt.u32\t%q0, [%m1, %q2, uxtw #2]",ops);
4185 return "";
4186}
4187 [(set_attr "length" "8")])
5cad47e0
SP
4188
4189;;
4190;; [vstrhq_f]
4191;;
4192(define_insn "mve_vstrhq_fv8hf"
d91524d5 4193 [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
5cad47e0
SP
4194 (unspec:V8HI [(match_operand:V8HF 1 "s_register_operand" "w")]
4195 VSTRHQ_F))
4196 ]
4197 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4198{
4199 rtx ops[2];
4200 int regno = REGNO (operands[1]);
4201 ops[1] = gen_rtx_REG (TImode, regno);
4202 ops[0] = operands[0];
4203 output_asm_insn ("vstrh.16\t%q1, %E0",ops);
4204 return "";
4205}
4206 [(set_attr "length" "4")])
4207
4208;;
4209;; [vstrhq_p_f]
4210;;
4211(define_insn "mve_vstrhq_p_fv8hf"
d91524d5 4212 [(set (match_operand:V8HI 0 "mve_memory_operand" "=Ux")
c1093923
AV
4213 (unspec:V8HI
4214 [(match_operand:V8HF 1 "s_register_operand" "w")
4215 (match_operand:V8BI 2 "vpr_register_operand" "Up")
4216 (match_dup 0)]
4217 VSTRHQ_F))]
5cad47e0
SP
4218 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4219{
4220 rtx ops[2];
4221 int regno = REGNO (operands[1]);
4222 ops[1] = gen_rtx_REG (TImode, regno);
4223 ops[0] = operands[0];
d91524d5 4224 output_asm_insn ("vpst\;vstrht.16\t%q1, %E0",ops);
5cad47e0
SP
4225 return "";
4226}
4227 [(set_attr "length" "8")])
4228
4229;;
4230;; [vstrhq_p_s vstrhq_p_u]
4231;;
4232(define_insn "mve_vstrhq_p_<supf><mode>"
d91524d5 4233 [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
c1093923 4234 (unspec:<MVE_H_ELEM>
19fc92d8 4235 [(match_operand:MVE_5 1 "s_register_operand" "w")
c1093923
AV
4236 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
4237 (match_dup 0)]
5cad47e0
SP
4238 VSTRHQ))
4239 ]
4240 "TARGET_HAVE_MVE"
4241{
4242 rtx ops[2];
4243 int regno = REGNO (operands[1]);
4244 ops[1] = gen_rtx_REG (TImode, regno);
4245 ops[0] = operands[0];
d91524d5 4246 output_asm_insn ("vpst\;vstrht.<V_sz_elem>\t%q1, %E0",ops);
5cad47e0
SP
4247 return "";
4248}
4249 [(set_attr "length" "8")])
4250
4251;;
4252;; [vstrhq_scatter_offset_p_s vstrhq_scatter_offset_p_u]
4253;;
9a810e57
SP
4254(define_expand "mve_vstrhq_scatter_offset_p_<supf><mode>"
4255 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
19fc92d8
CL
4256 (match_operand:MVE_5 1 "s_register_operand")
4257 (match_operand:MVE_5 2 "s_register_operand")
724d6566 4258 (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
9a810e57 4259 (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
5cad47e0
SP
4260 "TARGET_HAVE_MVE"
4261{
9a810e57
SP
4262 rtx ind = XEXP (operands[0], 0);
4263 gcc_assert (REG_P (ind));
4264 emit_insn (
4265 gen_mve_vstrhq_scatter_offset_p_<supf><mode>_insn (ind, operands[1],
4266 operands[2],
4267 operands[3]));
4268 DONE;
4269})
4270
4271(define_insn "mve_vstrhq_scatter_offset_p_<supf><mode>_insn"
4272 [(set (mem:BLK (scratch))
4273 (unspec:BLK
4274 [(match_operand:SI 0 "register_operand" "r")
19fc92d8
CL
4275 (match_operand:MVE_5 1 "s_register_operand" "w")
4276 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 4277 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
9a810e57
SP
4278 VSTRHSOQ))]
4279 "TARGET_HAVE_MVE"
4280 "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1]"
5cad47e0
SP
4281 [(set_attr "length" "8")])
4282
4283;;
4284;; [vstrhq_scatter_offset_s vstrhq_scatter_offset_u]
4285;;
9a810e57
SP
4286(define_expand "mve_vstrhq_scatter_offset_<supf><mode>"
4287 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
19fc92d8
CL
4288 (match_operand:MVE_5 1 "s_register_operand")
4289 (match_operand:MVE_5 2 "s_register_operand")
9a810e57 4290 (unspec:V4SI [(const_int 0)] VSTRHSOQ)]
5cad47e0
SP
4291 "TARGET_HAVE_MVE"
4292{
9a810e57
SP
4293 rtx ind = XEXP (operands[0], 0);
4294 gcc_assert (REG_P (ind));
4295 emit_insn (gen_mve_vstrhq_scatter_offset_<supf><mode>_insn (ind, operands[1],
4296 operands[2]));
4297 DONE;
4298})
4299
4300(define_insn "mve_vstrhq_scatter_offset_<supf><mode>_insn"
4301 [(set (mem:BLK (scratch))
4302 (unspec:BLK
4303 [(match_operand:SI 0 "register_operand" "r")
19fc92d8
CL
4304 (match_operand:MVE_5 1 "s_register_operand" "w")
4305 (match_operand:MVE_5 2 "s_register_operand" "w")]
9a810e57
SP
4306 VSTRHSOQ))]
4307 "TARGET_HAVE_MVE"
4308 "vstrh.<V_sz_elem>\t%q2, [%0, %q1]"
5cad47e0
SP
4309 [(set_attr "length" "4")])
4310
4311;;
4312;; [vstrhq_scatter_shifted_offset_p_s vstrhq_scatter_shifted_offset_p_u]
4313;;
9a810e57
SP
4314(define_expand "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>"
4315 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
19fc92d8
CL
4316 (match_operand:MVE_5 1 "s_register_operand")
4317 (match_operand:MVE_5 2 "s_register_operand")
724d6566 4318 (match_operand:<MVE_VPRED> 3 "vpr_register_operand")
9a810e57 4319 (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
5cad47e0
SP
4320 "TARGET_HAVE_MVE"
4321{
9a810e57
SP
4322 rtx ind = XEXP (operands[0], 0);
4323 gcc_assert (REG_P (ind));
4324 emit_insn (
4325 gen_mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn (ind, operands[1],
4326 operands[2],
4327 operands[3]));
4328 DONE;
4329})
4330
4331(define_insn "mve_vstrhq_scatter_shifted_offset_p_<supf><mode>_insn"
4332 [(set (mem:BLK (scratch))
4333 (unspec:BLK
4334 [(match_operand:SI 0 "register_operand" "r")
19fc92d8
CL
4335 (match_operand:MVE_5 1 "s_register_operand" "w")
4336 (match_operand:MVE_5 2 "s_register_operand" "w")
724d6566 4337 (match_operand:<MVE_VPRED> 3 "vpr_register_operand" "Up")]
9a810e57
SP
4338 VSTRHSSOQ))]
4339 "TARGET_HAVE_MVE"
4340 "vpst\;vstrht.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
5cad47e0
SP
4341 [(set_attr "length" "8")])
4342
4343;;
4344;; [vstrhq_scatter_shifted_offset_s vstrhq_scatter_shifted_offset_u]
4345;;
9a810e57
SP
4346(define_expand "mve_vstrhq_scatter_shifted_offset_<supf><mode>"
4347 [(match_operand:<MVE_H_ELEM> 0 "mve_scatter_memory")
19fc92d8
CL
4348 (match_operand:MVE_5 1 "s_register_operand")
4349 (match_operand:MVE_5 2 "s_register_operand")
9a810e57 4350 (unspec:V4SI [(const_int 0)] VSTRHSSOQ)]
5cad47e0
SP
4351 "TARGET_HAVE_MVE"
4352{
9a810e57
SP
4353 rtx ind = XEXP (operands[0], 0);
4354 gcc_assert (REG_P (ind));
4355 emit_insn (
4356 gen_mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn (ind, operands[1],
4357 operands[2]));
4358 DONE;
4359})
4360
4361(define_insn "mve_vstrhq_scatter_shifted_offset_<supf><mode>_insn"
4362 [(set (mem:BLK (scratch))
4363 (unspec:BLK
4364 [(match_operand:SI 0 "register_operand" "r")
19fc92d8
CL
4365 (match_operand:MVE_5 1 "s_register_operand" "w")
4366 (match_operand:MVE_5 2 "s_register_operand" "w")]
9a810e57
SP
4367 VSTRHSSOQ))]
4368 "TARGET_HAVE_MVE"
4369 "vstrh.<V_sz_elem>\t%q2, [%0, %q1, uxtw #1]"
5cad47e0
SP
4370 [(set_attr "length" "4")])
4371
4372;;
4373;; [vstrhq_s, vstrhq_u]
4374;;
4375(define_insn "mve_vstrhq_<supf><mode>"
d91524d5 4376 [(set (match_operand:<MVE_H_ELEM> 0 "mve_memory_operand" "=Ux")
19fc92d8 4377 (unspec:<MVE_H_ELEM> [(match_operand:MVE_5 1 "s_register_operand" "w")]
5cad47e0
SP
4378 VSTRHQ))
4379 ]
4380 "TARGET_HAVE_MVE"
4381{
4382 rtx ops[2];
4383 int regno = REGNO (operands[1]);
4384 ops[1] = gen_rtx_REG (TImode, regno);
4385 ops[0] = operands[0];
4386 output_asm_insn ("vstrh.<V_sz_elem>\t%q1, %E0",ops);
4387 return "";
4388}
4389 [(set_attr "length" "4")])
4390
4391;;
4392;; [vstrwq_f]
4393;;
4394(define_insn "mve_vstrwq_fv4sf"
5efeaa0d 4395 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
5cad47e0
SP
4396 (unspec:V4SI [(match_operand:V4SF 1 "s_register_operand" "w")]
4397 VSTRWQ_F))
4398 ]
4399 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4400{
4401 rtx ops[2];
4402 int regno = REGNO (operands[1]);
4403 ops[1] = gen_rtx_REG (TImode, regno);
4404 ops[0] = operands[0];
4405 output_asm_insn ("vstrw.32\t%q1, %E0",ops);
4406 return "";
4407}
4408 [(set_attr "length" "4")])
4409
4410;;
4411;; [vstrwq_p_f]
4412;;
4413(define_insn "mve_vstrwq_p_fv4sf"
5efeaa0d 4414 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
c1093923
AV
4415 (unspec:V4SI
4416 [(match_operand:V4SF 1 "s_register_operand" "w")
4417 (match_operand:<MVE_VPRED> 2 "vpr_register_operand" "Up")
4418 (match_dup 0)]
4419 VSTRWQ_F))]
5cad47e0
SP
4420 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4421{
4422 rtx ops[2];
4423 int regno = REGNO (operands[1]);
4424 ops[1] = gen_rtx_REG (TImode, regno);
4425 ops[0] = operands[0];
d91524d5 4426 output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
5cad47e0
SP
4427 return "";
4428}
4429 [(set_attr "length" "8")])
4430
4431;;
4432;; [vstrwq_p_s vstrwq_p_u]
4433;;
4434(define_insn "mve_vstrwq_p_<supf>v4si"
5efeaa0d 4435 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
c1093923
AV
4436 (unspec:V4SI
4437 [(match_operand:V4SI 1 "s_register_operand" "w")
4438 (match_operand:V4BI 2 "vpr_register_operand" "Up")
4439 (match_dup 0)]
4440 VSTRWQ))]
5cad47e0
SP
4441 "TARGET_HAVE_MVE"
4442{
4443 rtx ops[2];
4444 int regno = REGNO (operands[1]);
4445 ops[1] = gen_rtx_REG (TImode, regno);
4446 ops[0] = operands[0];
d91524d5 4447 output_asm_insn ("vpst\;vstrwt.32\t%q1, %E0",ops);
5cad47e0
SP
4448 return "";
4449}
4450 [(set_attr "length" "8")])
4451
4452;;
4453;; [vstrwq_s vstrwq_u]
4454;;
4455(define_insn "mve_vstrwq_<supf>v4si"
5efeaa0d 4456 [(set (match_operand:V4SI 0 "mve_memory_operand" "=Ux")
5cad47e0
SP
4457 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")]
4458 VSTRWQ))
4459 ]
4460 "TARGET_HAVE_MVE"
4461{
4462 rtx ops[2];
4463 int regno = REGNO (operands[1]);
4464 ops[1] = gen_rtx_REG (TImode, regno);
4465 ops[0] = operands[0];
4466 output_asm_insn ("vstrw.32\t%q1, %E0",ops);
4467 return "";
4468}
4469 [(set_attr "length" "4")])
4470
4471(define_expand "mve_vst1q_f<mode>"
91d206ad 4472 [(match_operand:<MVE_CNVT> 0 "mve_memory_operand")
5cad47e0
SP
4473 (unspec:<MVE_CNVT> [(match_operand:MVE_0 1 "s_register_operand")] VST1Q_F)
4474 ]
4475 "TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT"
4476{
4477 emit_insn (gen_mve_vstr<V_sz_elem1>q_f<mode>(operands[0],operands[1]));
4478 DONE;
4479})
4480
4481(define_expand "mve_vst1q_<supf><mode>"
91d206ad 4482 [(match_operand:MVE_2 0 "mve_memory_operand")
5cad47e0
SP
4483 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand")] VST1Q)
4484 ]
4485 "TARGET_HAVE_MVE"
4486{
4487 emit_insn (gen_mve_vstr<V_sz_elem1>q_<supf><mode>(operands[0],operands[1]));
4488 DONE;
4489})
7a5fffa5
SP
4490
4491;;
4492;; [vstrdq_scatter_base_p_s vstrdq_scatter_base_p_u]
4493;;
4494(define_insn "mve_vstrdq_scatter_base_p_<supf>v2di"
4495 [(set (mem:BLK (scratch))
4496 (unspec:BLK
4497 [(match_operand:V2DI 0 "s_register_operand" "w")
4498 (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
4499 (match_operand:V2DI 2 "s_register_operand" "w")
e0bc13d3 4500 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
7a5fffa5
SP
4501 VSTRDSBQ))
4502 ]
4503 "TARGET_HAVE_MVE"
4504{
4505 rtx ops[3];
4506 ops[0] = operands[0];
4507 ops[1] = operands[1];
4508 ops[2] = operands[2];
4509 output_asm_insn ("vpst\;\tvstrdt.u64\t%q2, [%q0, %1]",ops);
4510 return "";
4511}
4512 [(set_attr "length" "8")])
4513
4514;;
4515;; [vstrdq_scatter_base_s vstrdq_scatter_base_u]
4516;;
4517(define_insn "mve_vstrdq_scatter_base_<supf>v2di"
4518 [(set (mem:BLK (scratch))
4519 (unspec:BLK
4520 [(match_operand:V2DI 0 "s_register_operand" "=w")
4521 (match_operand:SI 1 "mve_vldrd_immediate" "Ri")
4522 (match_operand:V2DI 2 "s_register_operand" "w")]
4523 VSTRDSBQ))
4524 ]
4525 "TARGET_HAVE_MVE"
4526{
4527 rtx ops[3];
4528 ops[0] = operands[0];
4529 ops[1] = operands[1];
4530 ops[2] = operands[2];
4531 output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]",ops);
4532 return "";
4533}
4534 [(set_attr "length" "4")])
4535
4536;;
4537;; [vstrdq_scatter_offset_p_s vstrdq_scatter_offset_p_u]
4538;;
9a810e57
SP
4539(define_expand "mve_vstrdq_scatter_offset_p_<supf>v2di"
4540 [(match_operand:V2DI 0 "mve_scatter_memory")
4541 (match_operand:V2DI 1 "s_register_operand")
4542 (match_operand:V2DI 2 "s_register_operand")
e0bc13d3 4543 (match_operand:V2QI 3 "vpr_register_operand")
9a810e57 4544 (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
7a5fffa5
SP
4545 "TARGET_HAVE_MVE"
4546{
9a810e57
SP
4547 rtx ind = XEXP (operands[0], 0);
4548 gcc_assert (REG_P (ind));
4549 emit_insn (gen_mve_vstrdq_scatter_offset_p_<supf>v2di_insn (ind, operands[1],
4550 operands[2],
4551 operands[3]));
4552 DONE;
4553})
4554
4555(define_insn "mve_vstrdq_scatter_offset_p_<supf>v2di_insn"
4556 [(set (mem:BLK (scratch))
4557 (unspec:BLK
4558 [(match_operand:SI 0 "register_operand" "r")
4559 (match_operand:V2DI 1 "s_register_operand" "w")
4560 (match_operand:V2DI 2 "s_register_operand" "w")
e0bc13d3 4561 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4562 VSTRDSOQ))]
4563 "TARGET_HAVE_MVE"
4564 "vpst\;vstrdt.64\t%q2, [%0, %q1]"
7a5fffa5
SP
4565 [(set_attr "length" "8")])
4566
4567;;
4568;; [vstrdq_scatter_offset_s vstrdq_scatter_offset_u]
4569;;
9a810e57
SP
4570(define_expand "mve_vstrdq_scatter_offset_<supf>v2di"
4571 [(match_operand:V2DI 0 "mve_scatter_memory")
4572 (match_operand:V2DI 1 "s_register_operand")
4573 (match_operand:V2DI 2 "s_register_operand")
4574 (unspec:V4SI [(const_int 0)] VSTRDSOQ)]
7a5fffa5
SP
4575 "TARGET_HAVE_MVE"
4576{
9a810e57
SP
4577 rtx ind = XEXP (operands[0], 0);
4578 gcc_assert (REG_P (ind));
4579 emit_insn (gen_mve_vstrdq_scatter_offset_<supf>v2di_insn (ind, operands[1],
4580 operands[2]));
4581 DONE;
4582})
4583
4584(define_insn "mve_vstrdq_scatter_offset_<supf>v2di_insn"
4585 [(set (mem:BLK (scratch))
4586 (unspec:BLK
4587 [(match_operand:SI 0 "register_operand" "r")
4588 (match_operand:V2DI 1 "s_register_operand" "w")
4589 (match_operand:V2DI 2 "s_register_operand" "w")]
4590 VSTRDSOQ))]
4591 "TARGET_HAVE_MVE"
4592 "vstrd.64\t%q2, [%0, %q1]"
7a5fffa5
SP
4593 [(set_attr "length" "4")])
4594
4595;;
4596;; [vstrdq_scatter_shifted_offset_p_s vstrdq_scatter_shifted_offset_p_u]
4597;;
9a810e57
SP
4598(define_expand "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di"
4599 [(match_operand:V2DI 0 "mve_scatter_memory")
4600 (match_operand:V2DI 1 "s_register_operand")
4601 (match_operand:V2DI 2 "s_register_operand")
e0bc13d3 4602 (match_operand:V2QI 3 "vpr_register_operand")
9a810e57 4603 (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
7a5fffa5
SP
4604 "TARGET_HAVE_MVE"
4605{
9a810e57
SP
4606 rtx ind = XEXP (operands[0], 0);
4607 gcc_assert (REG_P (ind));
4608 emit_insn (
4609 gen_mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn (ind, operands[1],
4610 operands[2],
4611 operands[3]));
4612 DONE;
4613})
4614
4615(define_insn "mve_vstrdq_scatter_shifted_offset_p_<supf>v2di_insn"
4616 [(set (mem:BLK (scratch))
4617 (unspec:BLK
4618 [(match_operand:SI 0 "register_operand" "r")
4619 (match_operand:V2DI 1 "s_register_operand" "w")
4620 (match_operand:V2DI 2 "s_register_operand" "w")
e0bc13d3 4621 (match_operand:V2QI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4622 VSTRDSSOQ))]
4623 "TARGET_HAVE_MVE"
f2dd012a 4624 "vpst\;vstrdt.64\t%q2, [%0, %q1, uxtw #3]"
7a5fffa5
SP
4625 [(set_attr "length" "8")])
4626
4627;;
4628;; [vstrdq_scatter_shifted_offset_s vstrdq_scatter_shifted_offset_u]
4629;;
9a810e57
SP
4630(define_expand "mve_vstrdq_scatter_shifted_offset_<supf>v2di"
4631 [(match_operand:V2DI 0 "mve_scatter_memory")
4632 (match_operand:V2DI 1 "s_register_operand")
4633 (match_operand:V2DI 2 "s_register_operand")
4634 (unspec:V4SI [(const_int 0)] VSTRDSSOQ)]
7a5fffa5
SP
4635 "TARGET_HAVE_MVE"
4636{
9a810e57
SP
4637 rtx ind = XEXP (operands[0], 0);
4638 gcc_assert (REG_P (ind));
4639 emit_insn (
4640 gen_mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn (ind, operands[1],
4641 operands[2]));
4642 DONE;
4643})
4644
4645(define_insn "mve_vstrdq_scatter_shifted_offset_<supf>v2di_insn"
4646 [(set (mem:BLK (scratch))
4647 (unspec:BLK
4648 [(match_operand:SI 0 "register_operand" "r")
4649 (match_operand:V2DI 1 "s_register_operand" "w")
4650 (match_operand:V2DI 2 "s_register_operand" "w")]
4651 VSTRDSSOQ))]
4652 "TARGET_HAVE_MVE"
f2dd012a 4653 "vstrd.64\t%q2, [%0, %q1, uxtw #3]"
7a5fffa5
SP
4654 [(set_attr "length" "4")])
4655
4656;;
4657;; [vstrhq_scatter_offset_f]
4658;;
9a810e57
SP
4659(define_expand "mve_vstrhq_scatter_offset_fv8hf"
4660 [(match_operand:V8HI 0 "mve_scatter_memory")
4661 (match_operand:V8HI 1 "s_register_operand")
4662 (match_operand:V8HF 2 "s_register_operand")
4663 (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
7a5fffa5
SP
4664 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4665{
9a810e57
SP
4666 rtx ind = XEXP (operands[0], 0);
4667 gcc_assert (REG_P (ind));
4668 emit_insn (gen_mve_vstrhq_scatter_offset_fv8hf_insn (ind, operands[1],
4669 operands[2]));
4670 DONE;
4671})
4672
4673(define_insn "mve_vstrhq_scatter_offset_fv8hf_insn"
4674 [(set (mem:BLK (scratch))
4675 (unspec:BLK
4676 [(match_operand:SI 0 "register_operand" "r")
4677 (match_operand:V8HI 1 "s_register_operand" "w")
4678 (match_operand:V8HF 2 "s_register_operand" "w")]
4679 VSTRHQSO_F))]
4680 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4681 "vstrh.16\t%q2, [%0, %q1]"
7a5fffa5
SP
4682 [(set_attr "length" "4")])
4683
4684;;
4685;; [vstrhq_scatter_offset_p_f]
4686;;
9a810e57
SP
4687(define_expand "mve_vstrhq_scatter_offset_p_fv8hf"
4688 [(match_operand:V8HI 0 "mve_scatter_memory")
4689 (match_operand:V8HI 1 "s_register_operand")
4690 (match_operand:V8HF 2 "s_register_operand")
6a7c13a0 4691 (match_operand:V8BI 3 "vpr_register_operand")
9a810e57 4692 (unspec:V4SI [(const_int 0)] VSTRHQSO_F)]
7a5fffa5
SP
4693 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4694{
9a810e57
SP
4695 rtx ind = XEXP (operands[0], 0);
4696 gcc_assert (REG_P (ind));
4697 emit_insn (gen_mve_vstrhq_scatter_offset_p_fv8hf_insn (ind, operands[1],
4698 operands[2],
4699 operands[3]));
4700 DONE;
4701})
4702
4703(define_insn "mve_vstrhq_scatter_offset_p_fv8hf_insn"
4704 [(set (mem:BLK (scratch))
4705 (unspec:BLK
4706 [(match_operand:SI 0 "register_operand" "r")
4707 (match_operand:V8HI 1 "s_register_operand" "w")
4708 (match_operand:V8HF 2 "s_register_operand" "w")
6a7c13a0 4709 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4710 VSTRHQSO_F))]
4711 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4712 "vpst\;vstrht.16\t%q2, [%0, %q1]"
7a5fffa5
SP
4713 [(set_attr "length" "8")])
4714
4715;;
4716;; [vstrhq_scatter_shifted_offset_f]
4717;;
9a810e57
SP
4718(define_expand "mve_vstrhq_scatter_shifted_offset_fv8hf"
4719 [(match_operand:V8HI 0 "memory_operand" "=Us")
4720 (match_operand:V8HI 1 "s_register_operand" "w")
4721 (match_operand:V8HF 2 "s_register_operand" "w")
4722 (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
7a5fffa5
SP
4723 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4724{
9a810e57
SP
4725 rtx ind = XEXP (operands[0], 0);
4726 gcc_assert (REG_P (ind));
4727 emit_insn (gen_mve_vstrhq_scatter_shifted_offset_fv8hf_insn (ind, operands[1],
4728 operands[2]));
4729 DONE;
4730})
4731
4732(define_insn "mve_vstrhq_scatter_shifted_offset_fv8hf_insn"
4733 [(set (mem:BLK (scratch))
4734 (unspec:BLK
4735 [(match_operand:SI 0 "register_operand" "r")
4736 (match_operand:V8HI 1 "s_register_operand" "w")
4737 (match_operand:V8HF 2 "s_register_operand" "w")]
4738 VSTRHQSSO_F))]
4739 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4740 "vstrh.16\t%q2, [%0, %q1, uxtw #1]"
7a5fffa5
SP
4741 [(set_attr "length" "4")])
4742
4743;;
4744;; [vstrhq_scatter_shifted_offset_p_f]
4745;;
9a810e57
SP
4746(define_expand "mve_vstrhq_scatter_shifted_offset_p_fv8hf"
4747 [(match_operand:V8HI 0 "memory_operand" "=Us")
4748 (match_operand:V8HI 1 "s_register_operand" "w")
4749 (match_operand:V8HF 2 "s_register_operand" "w")
6a7c13a0 4750 (match_operand:V8BI 3 "vpr_register_operand" "Up")
9a810e57 4751 (unspec:V4SI [(const_int 0)] VSTRHQSSO_F)]
7a5fffa5
SP
4752 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4753{
9a810e57
SP
4754 rtx ind = XEXP (operands[0], 0);
4755 gcc_assert (REG_P (ind));
4756 emit_insn (
4757 gen_mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn (ind, operands[1],
4758 operands[2],
4759 operands[3]));
4760 DONE;
4761})
4762
4763(define_insn "mve_vstrhq_scatter_shifted_offset_p_fv8hf_insn"
4764 [(set (mem:BLK (scratch))
4765 (unspec:BLK
4766 [(match_operand:SI 0 "register_operand" "r")
4767 (match_operand:V8HI 1 "s_register_operand" "w")
4768 (match_operand:V8HF 2 "s_register_operand" "w")
6a7c13a0 4769 (match_operand:V8BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4770 VSTRHQSSO_F))]
4771 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4772 "vpst\;vstrht.16\t%q2, [%0, %q1, uxtw #1]"
7a5fffa5
SP
4773 [(set_attr "length" "8")])
4774
4775;;
4776;; [vstrwq_scatter_base_f]
4777;;
4778(define_insn "mve_vstrwq_scatter_base_fv4sf"
4779 [(set (mem:BLK (scratch))
4780 (unspec:BLK
4781 [(match_operand:V4SI 0 "s_register_operand" "w")
4782 (match_operand:SI 1 "immediate_operand" "i")
4783 (match_operand:V4SF 2 "s_register_operand" "w")]
4784 VSTRWQSB_F))
4785 ]
4786 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4787{
4788 rtx ops[3];
4789 ops[0] = operands[0];
4790 ops[1] = operands[1];
4791 ops[2] = operands[2];
4792 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]",ops);
4793 return "";
4794}
4795 [(set_attr "length" "4")])
4796
4797;;
4798;; [vstrwq_scatter_base_p_f]
4799;;
4800(define_insn "mve_vstrwq_scatter_base_p_fv4sf"
4801 [(set (mem:BLK (scratch))
4802 (unspec:BLK
4803 [(match_operand:V4SI 0 "s_register_operand" "w")
4804 (match_operand:SI 1 "immediate_operand" "i")
4805 (match_operand:V4SF 2 "s_register_operand" "w")
6a7c13a0 4806 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
7a5fffa5
SP
4807 VSTRWQSB_F))
4808 ]
4809 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4810{
4811 rtx ops[3];
4812 ops[0] = operands[0];
4813 ops[1] = operands[1];
4814 ops[2] = operands[2];
4815 output_asm_insn ("vpst\n\tvstrwt.u32\t%q2, [%q0, %1]",ops);
4816 return "";
4817}
4818 [(set_attr "length" "8")])
4819
4820;;
4821;; [vstrwq_scatter_offset_f]
4822;;
9a810e57
SP
4823(define_expand "mve_vstrwq_scatter_offset_fv4sf"
4824 [(match_operand:V4SI 0 "mve_scatter_memory")
4825 (match_operand:V4SI 1 "s_register_operand")
4826 (match_operand:V4SF 2 "s_register_operand")
4827 (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
7a5fffa5
SP
4828 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4829{
9a810e57
SP
4830 rtx ind = XEXP (operands[0], 0);
4831 gcc_assert (REG_P (ind));
4832 emit_insn (gen_mve_vstrwq_scatter_offset_fv4sf_insn (ind, operands[1],
4833 operands[2]));
4834 DONE;
4835})
4836
4837(define_insn "mve_vstrwq_scatter_offset_fv4sf_insn"
4838 [(set (mem:BLK (scratch))
4839 (unspec:BLK
4840 [(match_operand:SI 0 "register_operand" "r")
4841 (match_operand:V4SI 1 "s_register_operand" "w")
4842 (match_operand:V4SF 2 "s_register_operand" "w")]
4843 VSTRWQSO_F))]
4844 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4845 "vstrw.32\t%q2, [%0, %q1]"
7a5fffa5
SP
4846 [(set_attr "length" "4")])
4847
4848;;
4849;; [vstrwq_scatter_offset_p_f]
4850;;
9a810e57
SP
4851(define_expand "mve_vstrwq_scatter_offset_p_fv4sf"
4852 [(match_operand:V4SI 0 "mve_scatter_memory")
4853 (match_operand:V4SI 1 "s_register_operand")
4854 (match_operand:V4SF 2 "s_register_operand")
6a7c13a0 4855 (match_operand:V4BI 3 "vpr_register_operand")
9a810e57 4856 (unspec:V4SI [(const_int 0)] VSTRWQSO_F)]
7a5fffa5
SP
4857 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4858{
9a810e57
SP
4859 rtx ind = XEXP (operands[0], 0);
4860 gcc_assert (REG_P (ind));
4861 emit_insn (gen_mve_vstrwq_scatter_offset_p_fv4sf_insn (ind, operands[1],
4862 operands[2],
4863 operands[3]));
4864 DONE;
4865})
4866
4867(define_insn "mve_vstrwq_scatter_offset_p_fv4sf_insn"
4868 [(set (mem:BLK (scratch))
4869 (unspec:BLK
4870 [(match_operand:SI 0 "register_operand" "r")
4871 (match_operand:V4SI 1 "s_register_operand" "w")
4872 (match_operand:V4SF 2 "s_register_operand" "w")
6a7c13a0 4873 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4874 VSTRWQSO_F))]
4875 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4876 "vpst\;vstrwt.32\t%q2, [%0, %q1]"
7a5fffa5
SP
4877 [(set_attr "length" "8")])
4878
4879;;
9a810e57 4880;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
7a5fffa5 4881;;
9a810e57
SP
4882(define_expand "mve_vstrwq_scatter_offset_p_<supf>v4si"
4883 [(match_operand:V4SI 0 "mve_scatter_memory")
4884 (match_operand:V4SI 1 "s_register_operand")
4885 (match_operand:V4SI 2 "s_register_operand")
6a7c13a0 4886 (match_operand:V4BI 3 "vpr_register_operand")
9a810e57 4887 (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
7a5fffa5
SP
4888 "TARGET_HAVE_MVE"
4889{
9a810e57
SP
4890 rtx ind = XEXP (operands[0], 0);
4891 gcc_assert (REG_P (ind));
4892 emit_insn (gen_mve_vstrwq_scatter_offset_p_<supf>v4si_insn (ind, operands[1],
4893 operands[2],
4894 operands[3]));
4895 DONE;
4896})
4897
4898(define_insn "mve_vstrwq_scatter_offset_p_<supf>v4si_insn"
4899 [(set (mem:BLK (scratch))
4900 (unspec:BLK
4901 [(match_operand:SI 0 "register_operand" "r")
4902 (match_operand:V4SI 1 "s_register_operand" "w")
4903 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 4904 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4905 VSTRWSOQ))]
4906 "TARGET_HAVE_MVE"
4907 "vpst\;vstrwt.32\t%q2, [%0, %q1]"
7a5fffa5
SP
4908 [(set_attr "length" "8")])
4909
4910;;
4911;; [vstrwq_scatter_offset_s vstrwq_scatter_offset_u]
4912;;
9a810e57
SP
4913(define_expand "mve_vstrwq_scatter_offset_<supf>v4si"
4914 [(match_operand:V4SI 0 "mve_scatter_memory")
4915 (match_operand:V4SI 1 "s_register_operand")
4916 (match_operand:V4SI 2 "s_register_operand")
4917 (unspec:V4SI [(const_int 0)] VSTRWSOQ)]
7a5fffa5
SP
4918 "TARGET_HAVE_MVE"
4919{
9a810e57
SP
4920 rtx ind = XEXP (operands[0], 0);
4921 gcc_assert (REG_P (ind));
4922 emit_insn (gen_mve_vstrwq_scatter_offset_<supf>v4si_insn (ind, operands[1],
4923 operands[2]));
4924 DONE;
4925})
4926
4927(define_insn "mve_vstrwq_scatter_offset_<supf>v4si_insn"
4928 [(set (mem:BLK (scratch))
4929 (unspec:BLK
4930 [(match_operand:SI 0 "register_operand" "r")
4931 (match_operand:V4SI 1 "s_register_operand" "w")
4932 (match_operand:V4SI 2 "s_register_operand" "w")]
4933 VSTRWSOQ))]
4934 "TARGET_HAVE_MVE"
4935 "vstrw.32\t%q2, [%0, %q1]"
7a5fffa5
SP
4936 [(set_attr "length" "4")])
4937
4938;;
4939;; [vstrwq_scatter_shifted_offset_f]
4940;;
9a810e57
SP
4941(define_expand "mve_vstrwq_scatter_shifted_offset_fv4sf"
4942 [(match_operand:V4SI 0 "mve_scatter_memory")
4943 (match_operand:V4SI 1 "s_register_operand")
4944 (match_operand:V4SF 2 "s_register_operand")
4945 (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
7a5fffa5
SP
4946 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4947{
9a810e57
SP
4948 rtx ind = XEXP (operands[0], 0);
4949 gcc_assert (REG_P (ind));
4950 emit_insn (gen_mve_vstrwq_scatter_shifted_offset_fv4sf_insn (ind, operands[1],
4951 operands[2]));
4952 DONE;
4953})
4954
4955(define_insn "mve_vstrwq_scatter_shifted_offset_fv4sf_insn"
4956 [(set (mem:BLK (scratch))
4957 (unspec:BLK
4958 [(match_operand:SI 0 "register_operand" "r")
4959 (match_operand:V4SI 1 "s_register_operand" "w")
4960 (match_operand:V4SF 2 "s_register_operand" "w")]
4961 VSTRWQSSO_F))]
4962 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4963 "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
4964 [(set_attr "length" "8")])
7a5fffa5
SP
4965
4966;;
4967;; [vstrwq_scatter_shifted_offset_p_f]
4968;;
9a810e57
SP
4969(define_expand "mve_vstrwq_scatter_shifted_offset_p_fv4sf"
4970 [(match_operand:V4SI 0 "mve_scatter_memory")
4971 (match_operand:V4SI 1 "s_register_operand")
4972 (match_operand:V4SF 2 "s_register_operand")
6a7c13a0 4973 (match_operand:V4BI 3 "vpr_register_operand")
9a810e57 4974 (unspec:V4SI [(const_int 0)] VSTRWQSSO_F)]
7a5fffa5
SP
4975 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4976{
9a810e57
SP
4977 rtx ind = XEXP (operands[0], 0);
4978 gcc_assert (REG_P (ind));
4979 emit_insn (
4980 gen_mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn (ind, operands[1],
4981 operands[2],
4982 operands[3]));
4983 DONE;
4984})
4985
4986(define_insn "mve_vstrwq_scatter_shifted_offset_p_fv4sf_insn"
4987 [(set (mem:BLK (scratch))
4988 (unspec:BLK
4989 [(match_operand:SI 0 "register_operand" "r")
4990 (match_operand:V4SI 1 "s_register_operand" "w")
4991 (match_operand:V4SF 2 "s_register_operand" "w")
6a7c13a0 4992 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
4993 VSTRWQSSO_F))]
4994 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
4995 "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
7a5fffa5
SP
4996 [(set_attr "length" "8")])
4997
4998;;
4999;; [vstrwq_scatter_shifted_offset_p_s vstrwq_scatter_shifted_offset_p_u]
5000;;
9a810e57
SP
5001(define_expand "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si"
5002 [(match_operand:V4SI 0 "mve_scatter_memory")
5003 (match_operand:V4SI 1 "s_register_operand")
5004 (match_operand:V4SI 2 "s_register_operand")
6a7c13a0 5005 (match_operand:V4BI 3 "vpr_register_operand")
9a810e57 5006 (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
7a5fffa5
SP
5007 "TARGET_HAVE_MVE"
5008{
9a810e57
SP
5009 rtx ind = XEXP (operands[0], 0);
5010 gcc_assert (REG_P (ind));
5011 emit_insn (
5012 gen_mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn (ind, operands[1],
5013 operands[2],
5014 operands[3]));
5015 DONE;
5016})
5017
5018(define_insn "mve_vstrwq_scatter_shifted_offset_p_<supf>v4si_insn"
5019 [(set (mem:BLK (scratch))
5020 (unspec:BLK
5021 [(match_operand:SI 0 "register_operand" "r")
5022 (match_operand:V4SI 1 "s_register_operand" "w")
5023 (match_operand:V4SI 2 "s_register_operand" "w")
6a7c13a0 5024 (match_operand:V4BI 3 "vpr_register_operand" "Up")]
9a810e57
SP
5025 VSTRWSSOQ))]
5026 "TARGET_HAVE_MVE"
5027 "vpst\;vstrwt.32\t%q2, [%0, %q1, uxtw #2]"
7a5fffa5
SP
5028 [(set_attr "length" "8")])
5029
5030;;
5031;; [vstrwq_scatter_shifted_offset_s vstrwq_scatter_shifted_offset_u]
5032;;
9a810e57
SP
5033(define_expand "mve_vstrwq_scatter_shifted_offset_<supf>v4si"
5034 [(match_operand:V4SI 0 "mve_scatter_memory")
5035 (match_operand:V4SI 1 "s_register_operand")
5036 (match_operand:V4SI 2 "s_register_operand")
5037 (unspec:V4SI [(const_int 0)] VSTRWSSOQ)]
7a5fffa5
SP
5038 "TARGET_HAVE_MVE"
5039{
9a810e57
SP
5040 rtx ind = XEXP (operands[0], 0);
5041 gcc_assert (REG_P (ind));
5042 emit_insn (
5043 gen_mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn (ind, operands[1],
5044 operands[2]));
5045 DONE;
5046})
5047
5048(define_insn "mve_vstrwq_scatter_shifted_offset_<supf>v4si_insn"
5049 [(set (mem:BLK (scratch))
5050 (unspec:BLK
5051 [(match_operand:SI 0 "register_operand" "r")
5052 (match_operand:V4SI 1 "s_register_operand" "w")
5053 (match_operand:V4SI 2 "s_register_operand" "w")]
5054 VSTRWSSOQ))]
5055 "TARGET_HAVE_MVE"
5056 "vstrw.32\t%q2, [%0, %q1, uxtw #2]"
7a5fffa5 5057 [(set_attr "length" "4")])
3eff57aa 5058
92f80065
SP
5059;;
5060;; [vidupq_n_u])
5061;;
5062(define_expand "mve_vidupq_n_u<mode>"
5063 [(match_operand:MVE_2 0 "s_register_operand")
5064 (match_operand:SI 1 "s_register_operand")
5065 (match_operand:SI 2 "mve_imm_selective_upto_8")]
5066 "TARGET_HAVE_MVE"
5067{
5068 rtx temp = gen_reg_rtx (SImode);
5069 emit_move_insn (temp, operands[1]);
5070 rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
5071 emit_insn (gen_mve_vidupq_u<mode>_insn (operands[0], temp, operands[1],
5072 operands[2], inc));
5073 DONE;
5074})
5075
5076;;
5077;; [vidupq_u_insn])
5078;;
5079(define_insn "mve_vidupq_u<mode>_insn"
5080 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5081 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5082 (match_operand:SI 3 "mve_imm_selective_upto_8" "Rg")]
5083 VIDUPQ))
3d537943 5084 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065
SP
5085 (plus:SI (match_dup 2)
5086 (match_operand:SI 4 "immediate_operand" "i")))]
5087 "TARGET_HAVE_MVE"
5088 "vidup.u%#<V_sz_elem>\t%q0, %1, %3")
5089
5090;;
5091;; [vidupq_m_n_u])
5092;;
5093(define_expand "mve_vidupq_m_n_u<mode>"
5094 [(match_operand:MVE_2 0 "s_register_operand")
5095 (match_operand:MVE_2 1 "s_register_operand")
5096 (match_operand:SI 2 "s_register_operand")
5097 (match_operand:SI 3 "mve_imm_selective_upto_8")
724d6566 5098 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
92f80065
SP
5099 "TARGET_HAVE_MVE"
5100{
5101 rtx temp = gen_reg_rtx (SImode);
5102 emit_move_insn (temp, operands[2]);
5103 rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
5104 emit_insn (gen_mve_vidupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
5105 operands[2], operands[3],
5106 operands[4], inc));
5107 DONE;
5108})
5109
5110;;
5111;; [vidupq_m_wb_u_insn])
5112;;
5113(define_insn "mve_vidupq_m_wb_u<mode>_insn"
5114 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5115 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5116 (match_operand:SI 3 "s_register_operand" "2")
5117 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
724d6566 5118 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
92f80065 5119 VIDUPQ_M))
3d537943 5120 (set (match_operand:SI 2 "s_register_operand" "=Te")
92f80065
SP
5121 (plus:SI (match_dup 3)
5122 (match_operand:SI 6 "immediate_operand" "i")))]
5123 "TARGET_HAVE_MVE"
5124 "vpst\;\tvidupt.u%#<V_sz_elem>\t%q0, %2, %4"
5125 [(set_attr "length""8")])
5126
5127;;
5128;; [vddupq_n_u])
5129;;
5130(define_expand "mve_vddupq_n_u<mode>"
5131 [(match_operand:MVE_2 0 "s_register_operand")
5132 (match_operand:SI 1 "s_register_operand")
5133 (match_operand:SI 2 "mve_imm_selective_upto_8")]
5134 "TARGET_HAVE_MVE"
5135{
5136 rtx temp = gen_reg_rtx (SImode);
5137 emit_move_insn (temp, operands[1]);
5138 rtx inc = gen_int_mode (INTVAL(operands[2]) * <MVE_LANES>, SImode);
5139 emit_insn (gen_mve_vddupq_u<mode>_insn (operands[0], temp, operands[1],
5140 operands[2], inc));
5141 DONE;
5142})
5143
5144;;
5145;; [vddupq_u_insn])
5146;;
5147(define_insn "mve_vddupq_u<mode>_insn"
5148 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5149 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
5150 (match_operand:SI 3 "immediate_operand" "i")]
5151 VDDUPQ))
3d537943 5152 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065
SP
5153 (minus:SI (match_dup 2)
5154 (match_operand:SI 4 "immediate_operand" "i")))]
5155 "TARGET_HAVE_MVE"
f3f4295a 5156 "vddup.u%#<V_sz_elem>\t%q0, %1, %3")
92f80065
SP
5157
5158;;
5159;; [vddupq_m_n_u])
5160;;
5161(define_expand "mve_vddupq_m_n_u<mode>"
5162 [(match_operand:MVE_2 0 "s_register_operand")
5163 (match_operand:MVE_2 1 "s_register_operand")
5164 (match_operand:SI 2 "s_register_operand")
5165 (match_operand:SI 3 "mve_imm_selective_upto_8")
724d6566 5166 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")]
92f80065
SP
5167 "TARGET_HAVE_MVE"
5168{
5169 rtx temp = gen_reg_rtx (SImode);
5170 emit_move_insn (temp, operands[2]);
5171 rtx inc = gen_int_mode (INTVAL(operands[3]) * <MVE_LANES>, SImode);
5172 emit_insn (gen_mve_vddupq_m_wb_u<mode>_insn(operands[0], operands[1], temp,
5173 operands[2], operands[3],
5174 operands[4], inc));
5175 DONE;
5176})
5177
5178;;
5179;; [vddupq_m_wb_u_insn])
5180;;
5181(define_insn "mve_vddupq_m_wb_u<mode>_insn"
5182 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5183 (unspec:MVE_2 [(match_operand:MVE_2 1 "s_register_operand" "0")
5184 (match_operand:SI 3 "s_register_operand" "2")
5185 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")
724d6566 5186 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
92f80065 5187 VDDUPQ_M))
3d537943 5188 (set (match_operand:SI 2 "s_register_operand" "=Te")
92f80065
SP
5189 (minus:SI (match_dup 3)
5190 (match_operand:SI 6 "immediate_operand" "i")))]
5191 "TARGET_HAVE_MVE"
f3f4295a 5192 "vpst\;vddupt.u%#<V_sz_elem>\t%q0, %2, %4"
92f80065
SP
5193 [(set_attr "length""8")])
5194
5195;;
5196;; [vdwdupq_n_u])
5197;;
5198(define_expand "mve_vdwdupq_n_u<mode>"
5199 [(match_operand:MVE_2 0 "s_register_operand")
5200 (match_operand:SI 1 "s_register_operand")
9ce780ef 5201 (match_operand:DI 2 "s_register_operand")
92f80065
SP
5202 (match_operand:SI 3 "mve_imm_selective_upto_8")]
5203 "TARGET_HAVE_MVE"
5204{
5205 rtx ignore_wb = gen_reg_rtx (SImode);
5206 emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
5207 operands[1], operands[2],
5208 operands[3]));
5209 DONE;
5210})
5211
5212;;
5213;; [vdwdupq_wb_u])
5214;;
5215(define_expand "mve_vdwdupq_wb_u<mode>"
5216 [(match_operand:SI 0 "s_register_operand")
5217 (match_operand:SI 1 "s_register_operand")
9ce780ef 5218 (match_operand:DI 2 "s_register_operand")
92f80065
SP
5219 (match_operand:SI 3 "mve_imm_selective_upto_8")
5220 (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
5221 "TARGET_HAVE_MVE"
5222{
5223 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5224 emit_insn (gen_mve_vdwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
5225 operands[1], operands[2],
5226 operands[3]));
5227 DONE;
5228})
5229
5230;;
5231;; [vdwdupq_wb_u_insn])
5232;;
5233(define_insn "mve_vdwdupq_wb_u<mode>_insn"
5234 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5235 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
9ce780ef 5236 (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
92f80065
SP
5237 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
5238 VDWDUPQ))
3d537943 5239 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065 5240 (unspec:SI [(match_dup 2)
9ce780ef 5241 (subreg:SI (match_dup 3) 4)
92f80065
SP
5242 (match_dup 4)]
5243 VDWDUPQ))]
5244 "TARGET_HAVE_MVE"
9ce780ef 5245 "vdwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
92f80065
SP
5246)
5247
5248;;
5249;; [vdwdupq_m_n_u])
5250;;
5251(define_expand "mve_vdwdupq_m_n_u<mode>"
5252 [(match_operand:MVE_2 0 "s_register_operand")
5253 (match_operand:MVE_2 1 "s_register_operand")
5254 (match_operand:SI 2 "s_register_operand")
9ce780ef 5255 (match_operand:DI 3 "s_register_operand")
92f80065 5256 (match_operand:SI 4 "mve_imm_selective_upto_8")
724d6566 5257 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
92f80065
SP
5258 "TARGET_HAVE_MVE"
5259{
5260 rtx ignore_wb = gen_reg_rtx (SImode);
5261 emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
5262 operands[1], operands[2],
5263 operands[3], operands[4],
5264 operands[5]));
5265 DONE;
5266})
5267
5268;;
5269;; [vdwdupq_m_wb_u])
5270;;
5271(define_expand "mve_vdwdupq_m_wb_u<mode>"
5272 [(match_operand:SI 0 "s_register_operand")
5273 (match_operand:MVE_2 1 "s_register_operand")
5274 (match_operand:SI 2 "s_register_operand")
9ce780ef 5275 (match_operand:DI 3 "s_register_operand")
92f80065 5276 (match_operand:SI 4 "mve_imm_selective_upto_8")
724d6566 5277 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
92f80065
SP
5278 "TARGET_HAVE_MVE"
5279{
5280 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5281 emit_insn (gen_mve_vdwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
5282 operands[1], operands[2],
5283 operands[3], operands[4],
5284 operands[5]));
5285 DONE;
5286})
5287
5288;;
5289;; [vdwdupq_m_wb_u_insn])
5290;;
5291(define_insn "mve_vdwdupq_m_wb_u<mode>_insn"
5292 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9ce780ef 5293 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
92f80065 5294 (match_operand:SI 3 "s_register_operand" "1")
9ce780ef 5295 (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
92f80065 5296 (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
724d6566 5297 (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
92f80065 5298 VDWDUPQ_M))
3d537943 5299 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065
SP
5300 (unspec:SI [(match_dup 2)
5301 (match_dup 3)
9ce780ef 5302 (subreg:SI (match_dup 4) 4)
92f80065
SP
5303 (match_dup 5)
5304 (match_dup 6)]
5305 VDWDUPQ_M))
5306 ]
5307 "TARGET_HAVE_MVE"
d5cc5a6d 5308 "vpst\;vdwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
92f80065
SP
5309 [(set_attr "type" "mve_move")
5310 (set_attr "length""8")])
5311
5312;;
5313;; [viwdupq_n_u])
5314;;
5315(define_expand "mve_viwdupq_n_u<mode>"
5316 [(match_operand:MVE_2 0 "s_register_operand")
5317 (match_operand:SI 1 "s_register_operand")
9ce780ef 5318 (match_operand:DI 2 "s_register_operand")
92f80065
SP
5319 (match_operand:SI 3 "mve_imm_selective_upto_8")]
5320 "TARGET_HAVE_MVE"
5321{
5322 rtx ignore_wb = gen_reg_rtx (SImode);
5323 emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (operands[0], ignore_wb,
5324 operands[1], operands[2],
5325 operands[3]));
5326 DONE;
5327})
5328
5329;;
5330;; [viwdupq_wb_u])
5331;;
5332(define_expand "mve_viwdupq_wb_u<mode>"
5333 [(match_operand:SI 0 "s_register_operand")
5334 (match_operand:SI 1 "s_register_operand")
9ce780ef 5335 (match_operand:DI 2 "s_register_operand")
92f80065
SP
5336 (match_operand:SI 3 "mve_imm_selective_upto_8")
5337 (unspec:MVE_2 [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
5338 "TARGET_HAVE_MVE"
5339{
5340 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5341 emit_insn (gen_mve_viwdupq_wb_u<mode>_insn (ignore_vec, operands[0],
5342 operands[1], operands[2],
5343 operands[3]));
5344 DONE;
5345})
5346
5347;;
5348;; [viwdupq_wb_u_insn])
5349;;
5350(define_insn "mve_viwdupq_wb_u<mode>_insn"
5351 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
5352 (unspec:MVE_2 [(match_operand:SI 2 "s_register_operand" "1")
9ce780ef 5353 (subreg:SI (match_operand:DI 3 "s_register_operand" "r") 4)
92f80065
SP
5354 (match_operand:SI 4 "mve_imm_selective_upto_8" "Rg")]
5355 VIWDUPQ))
3d537943 5356 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065 5357 (unspec:SI [(match_dup 2)
9ce780ef 5358 (subreg:SI (match_dup 3) 4)
92f80065
SP
5359 (match_dup 4)]
5360 VIWDUPQ))]
5361 "TARGET_HAVE_MVE"
9ce780ef 5362 "viwdup.u%#<V_sz_elem>\t%q0, %2, %R3, %4"
92f80065
SP
5363)
5364
5365;;
5366;; [viwdupq_m_n_u])
5367;;
5368(define_expand "mve_viwdupq_m_n_u<mode>"
5369 [(match_operand:MVE_2 0 "s_register_operand")
5370 (match_operand:MVE_2 1 "s_register_operand")
5371 (match_operand:SI 2 "s_register_operand")
9ce780ef 5372 (match_operand:DI 3 "s_register_operand")
92f80065 5373 (match_operand:SI 4 "mve_imm_selective_upto_8")
724d6566 5374 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
92f80065
SP
5375 "TARGET_HAVE_MVE"
5376{
5377 rtx ignore_wb = gen_reg_rtx (SImode);
5378 emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (operands[0], ignore_wb,
5379 operands[1], operands[2],
5380 operands[3], operands[4],
5381 operands[5]));
5382 DONE;
5383})
5384
5385;;
5386;; [viwdupq_m_wb_u])
5387;;
5388(define_expand "mve_viwdupq_m_wb_u<mode>"
5389 [(match_operand:SI 0 "s_register_operand")
5390 (match_operand:MVE_2 1 "s_register_operand")
5391 (match_operand:SI 2 "s_register_operand")
9ce780ef 5392 (match_operand:DI 3 "s_register_operand")
92f80065 5393 (match_operand:SI 4 "mve_imm_selective_upto_8")
724d6566 5394 (match_operand:<MVE_VPRED> 5 "vpr_register_operand")]
92f80065
SP
5395 "TARGET_HAVE_MVE"
5396{
5397 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
5398 emit_insn (gen_mve_viwdupq_m_wb_u<mode>_insn (ignore_vec, operands[0],
5399 operands[1], operands[2],
5400 operands[3], operands[4],
5401 operands[5]));
5402 DONE;
5403})
5404
5405;;
5406;; [viwdupq_m_wb_u_insn])
5407;;
5408(define_insn "mve_viwdupq_m_wb_u<mode>_insn"
5409 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
9ce780ef 5410 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
92f80065 5411 (match_operand:SI 3 "s_register_operand" "1")
9ce780ef 5412 (subreg:SI (match_operand:DI 4 "s_register_operand" "r") 4)
92f80065 5413 (match_operand:SI 5 "mve_imm_selective_upto_8" "Rg")
724d6566 5414 (match_operand:<MVE_VPRED> 6 "vpr_register_operand" "Up")]
92f80065 5415 VIWDUPQ_M))
3d537943 5416 (set (match_operand:SI 1 "s_register_operand" "=Te")
92f80065
SP
5417 (unspec:SI [(match_dup 2)
5418 (match_dup 3)
9ce780ef 5419 (subreg:SI (match_dup 4) 4)
92f80065
SP
5420 (match_dup 5)
5421 (match_dup 6)]
5422 VIWDUPQ_M))
5423 ]
5424 "TARGET_HAVE_MVE"
9ce780ef 5425 "vpst\;\tviwdupt.u%#<V_sz_elem>\t%q2, %3, %R4, %5"
92f80065
SP
5426 [(set_attr "type" "mve_move")
5427 (set_attr "length""8")])
9ce780ef 5428
41e1a7ff 5429;;
37753588 5430;; [vstrwq_scatter_base_wb_s vstrwq_scatter_base_wb_u]
41e1a7ff 5431;;
37753588 5432(define_insn "mve_vstrwq_scatter_base_wb_<supf>v4si"
41e1a7ff
SP
5433 [(set (mem:BLK (scratch))
5434 (unspec:BLK
5435 [(match_operand:V4SI 1 "s_register_operand" "0")
5436 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5437 (match_operand:V4SI 3 "s_register_operand" "w")]
5438 VSTRWSBWBQ))
5439 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5440 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5441 VSTRWSBWBQ))
5442 ]
5443 "TARGET_HAVE_MVE"
5444{
5445 rtx ops[3];
5446 ops[0] = operands[1];
5447 ops[1] = operands[2];
5448 ops[2] = operands[3];
5449 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
5450 return "";
5451}
5452 [(set_attr "length" "4")])
5453
41e1a7ff
SP
5454;;
5455;; [vstrwq_scatter_base_wb_p_s vstrwq_scatter_base_wb_p_u]
5456;;
37753588 5457(define_insn "mve_vstrwq_scatter_base_wb_p_<supf>v4si"
41e1a7ff
SP
5458 [(set (mem:BLK (scratch))
5459 (unspec:BLK
5460 [(match_operand:V4SI 1 "s_register_operand" "0")
5461 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5462 (match_operand:V4SI 3 "s_register_operand" "w")
ae180f26 5463 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
41e1a7ff
SP
5464 VSTRWSBWBQ))
5465 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5466 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5467 VSTRWSBWBQ))
5468 ]
5469 "TARGET_HAVE_MVE"
5470{
5471 rtx ops[3];
5472 ops[0] = operands[1];
5473 ops[1] = operands[2];
5474 ops[2] = operands[3];
5475 output_asm_insn ("vpst\;\tvstrwt.u32\t%q2, [%q0, %1]!",ops);
5476 return "";
5477}
5478 [(set_attr "length" "8")])
5479
41e1a7ff
SP
5480;;
5481;; [vstrwq_scatter_base_wb_f]
5482;;
37753588 5483(define_insn "mve_vstrwq_scatter_base_wb_fv4sf"
41e1a7ff
SP
5484 [(set (mem:BLK (scratch))
5485 (unspec:BLK
5486 [(match_operand:V4SI 1 "s_register_operand" "0")
5487 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5488 (match_operand:V4SF 3 "s_register_operand" "w")]
5489 VSTRWQSBWB_F))
5490 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5491 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5492 VSTRWQSBWB_F))
5493 ]
5494 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5495{
5496 rtx ops[3];
5497 ops[0] = operands[1];
5498 ops[1] = operands[2];
5499 ops[2] = operands[3];
5500 output_asm_insn ("vstrw.u32\t%q2, [%q0, %1]!",ops);
5501 return "";
5502}
5503 [(set_attr "length" "4")])
5504
41e1a7ff
SP
5505;;
5506;; [vstrwq_scatter_base_wb_p_f]
5507;;
37753588 5508(define_insn "mve_vstrwq_scatter_base_wb_p_fv4sf"
41e1a7ff
SP
5509 [(set (mem:BLK (scratch))
5510 (unspec:BLK
5511 [(match_operand:V4SI 1 "s_register_operand" "0")
ae180f26 5512 (match_operand:SI 2 "mve_vstrw_immediate" "Rl")
41e1a7ff 5513 (match_operand:V4SF 3 "s_register_operand" "w")
ae180f26 5514 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
41e1a7ff
SP
5515 VSTRWQSBWB_F))
5516 (set (match_operand:V4SI 0 "s_register_operand" "=w")
5517 (unspec:V4SI [(match_dup 1) (match_dup 2)]
5518 VSTRWQSBWB_F))
5519 ]
5520 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5521{
5522 rtx ops[3];
5523 ops[0] = operands[1];
5524 ops[1] = operands[2];
5525 ops[2] = operands[3];
ae180f26 5526 output_asm_insn ("vpst\;vstrwt.u32\t%q2, [%q0, %1]!",ops);
41e1a7ff
SP
5527 return "";
5528}
5529 [(set_attr "length" "8")])
5530
41e1a7ff
SP
5531;;
5532;; [vstrdq_scatter_base_wb_s vstrdq_scatter_base_wb_u]
5533;;
37753588 5534(define_insn "mve_vstrdq_scatter_base_wb_<supf>v2di"
41e1a7ff
SP
5535 [(set (mem:BLK (scratch))
5536 (unspec:BLK
5537 [(match_operand:V2DI 1 "s_register_operand" "0")
5538 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5539 (match_operand:V2DI 3 "s_register_operand" "w")]
5540 VSTRDSBWBQ))
5541 (set (match_operand:V2DI 0 "s_register_operand" "=&w")
5542 (unspec:V2DI [(match_dup 1) (match_dup 2)]
5543 VSTRDSBWBQ))
5544 ]
5545 "TARGET_HAVE_MVE"
5546{
5547 rtx ops[3];
5548 ops[0] = operands[1];
5549 ops[1] = operands[2];
5550 ops[2] = operands[3];
5551 output_asm_insn ("vstrd.u64\t%q2, [%q0, %1]!",ops);
5552 return "";
5553}
5554 [(set_attr "length" "4")])
5555
41e1a7ff
SP
5556;;
5557;; [vstrdq_scatter_base_wb_p_s vstrdq_scatter_base_wb_p_u]
5558;;
37753588 5559(define_insn "mve_vstrdq_scatter_base_wb_p_<supf>v2di"
41e1a7ff
SP
5560 [(set (mem:BLK (scratch))
5561 (unspec:BLK
5562 [(match_operand:V2DI 1 "s_register_operand" "0")
5563 (match_operand:SI 2 "mve_vldrd_immediate" "Ri")
5564 (match_operand:V2DI 3 "s_register_operand" "w")
ae180f26 5565 (match_operand:V2QI 4 "vpr_register_operand" "Up")]
41e1a7ff
SP
5566 VSTRDSBWBQ))
5567 (set (match_operand:V2DI 0 "s_register_operand" "=w")
5568 (unspec:V2DI [(match_dup 1) (match_dup 2)]
5569 VSTRDSBWBQ))
5570 ]
5571 "TARGET_HAVE_MVE"
5572{
5573 rtx ops[3];
5574 ops[0] = operands[1];
5575 ops[1] = operands[2];
5576 ops[2] = operands[3];
f2dd012a 5577 output_asm_insn ("vpst\;vstrdt.u64\t%q2, [%q0, %1]!",ops);
41e1a7ff
SP
5578 return "";
5579}
5580 [(set_attr "length" "8")])
5581
5582(define_expand "mve_vldrwq_gather_base_wb_<supf>v4si"
5583 [(match_operand:V4SI 0 "s_register_operand")
5584 (match_operand:V4SI 1 "s_register_operand")
5585 (match_operand:SI 2 "mve_vldrd_immediate")
5586 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
5587 "TARGET_HAVE_MVE"
ff825b81
SP
5588{
5589 rtx ignore_result = gen_reg_rtx (V4SImode);
5590 emit_insn (
5591 gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (ignore_result, operands[0],
5592 operands[1], operands[2]));
5593 DONE;
5594})
5595
5596(define_expand "mve_vldrwq_gather_base_nowb_<supf>v4si"
5597 [(match_operand:V4SI 0 "s_register_operand")
5598 (match_operand:V4SI 1 "s_register_operand")
5599 (match_operand:SI 2 "mve_vldrd_immediate")
5600 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
5601 "TARGET_HAVE_MVE"
41e1a7ff
SP
5602{
5603 rtx ignore_wb = gen_reg_rtx (V4SImode);
5604 emit_insn (
5605 gen_mve_vldrwq_gather_base_wb_<supf>v4si_insn (operands[0], ignore_wb,
5606 operands[1], operands[2]));
5607 DONE;
5608})
5609
5610;;
5611;; [vldrwq_gather_base_wb_s vldrwq_gather_base_wb_u]
5612;;
5613(define_insn "mve_vldrwq_gather_base_wb_<supf>v4si_insn"
5614 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
5615 (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
5616 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
5617 (mem:BLK (scratch))]
5618 VLDRWGBWBQ))
5619 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
5620 (unspec:V4SI [(match_dup 2) (match_dup 3)]
5621 VLDRWGBWBQ))
5622 ]
5623 "TARGET_HAVE_MVE"
5624{
5625 rtx ops[3];
5626 ops[0] = operands[0];
5627 ops[1] = operands[2];
5628 ops[2] = operands[3];
5629 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
5630 return "";
5631}
5632 [(set_attr "length" "4")])
5633
5634(define_expand "mve_vldrwq_gather_base_wb_z_<supf>v4si"
5635 [(match_operand:V4SI 0 "s_register_operand")
5636 (match_operand:V4SI 1 "s_register_operand")
5637 (match_operand:SI 2 "mve_vldrd_immediate")
6a7c13a0 5638 (match_operand:V4BI 3 "vpr_register_operand")
41e1a7ff
SP
5639 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
5640 "TARGET_HAVE_MVE"
ff825b81
SP
5641{
5642 rtx ignore_result = gen_reg_rtx (V4SImode);
5643 emit_insn (
5644 gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (ignore_result, operands[0],
5645 operands[1], operands[2],
5646 operands[3]));
5647 DONE;
5648})
5649(define_expand "mve_vldrwq_gather_base_nowb_z_<supf>v4si"
5650 [(match_operand:V4SI 0 "s_register_operand")
5651 (match_operand:V4SI 1 "s_register_operand")
5652 (match_operand:SI 2 "mve_vldrd_immediate")
6a7c13a0 5653 (match_operand:V4BI 3 "vpr_register_operand")
ff825b81
SP
5654 (unspec:V4SI [(const_int 0)] VLDRWGBWBQ)]
5655 "TARGET_HAVE_MVE"
41e1a7ff
SP
5656{
5657 rtx ignore_wb = gen_reg_rtx (V4SImode);
5658 emit_insn (
5659 gen_mve_vldrwq_gather_base_wb_z_<supf>v4si_insn (operands[0], ignore_wb,
5660 operands[1], operands[2],
5661 operands[3]));
5662 DONE;
5663})
5664
5665;;
5666;; [vldrwq_gather_base_wb_z_s vldrwq_gather_base_wb_z_u]
5667;;
5668(define_insn "mve_vldrwq_gather_base_wb_z_<supf>v4si_insn"
5669 [(set (match_operand:V4SI 0 "s_register_operand" "=&w")
5670 (unspec:V4SI [(match_operand:V4SI 2 "s_register_operand" "1")
5671 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6a7c13a0 5672 (match_operand:V4BI 4 "vpr_register_operand" "Up")
41e1a7ff
SP
5673 (mem:BLK (scratch))]
5674 VLDRWGBWBQ))
5675 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
5676 (unspec:V4SI [(match_dup 2) (match_dup 3)]
5677 VLDRWGBWBQ))
5678 ]
5679 "TARGET_HAVE_MVE"
5680{
5681 rtx ops[3];
5682 ops[0] = operands[0];
5683 ops[1] = operands[2];
5684 ops[2] = operands[3];
ff825b81 5685 output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
41e1a7ff
SP
5686 return "";
5687}
5688 [(set_attr "length" "8")])
5689
5690(define_expand "mve_vldrwq_gather_base_wb_fv4sf"
ff825b81
SP
5691 [(match_operand:V4SI 0 "s_register_operand")
5692 (match_operand:V4SI 1 "s_register_operand")
5693 (match_operand:SI 2 "mve_vldrd_immediate")
5694 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
5695 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5696{
5697 rtx ignore_result = gen_reg_rtx (V4SFmode);
5698 emit_insn (
5699 gen_mve_vldrwq_gather_base_wb_fv4sf_insn (ignore_result, operands[0],
5700 operands[1], operands[2]));
5701 DONE;
5702})
5703
5704(define_expand "mve_vldrwq_gather_base_nowb_fv4sf"
41e1a7ff
SP
5705 [(match_operand:V4SF 0 "s_register_operand")
5706 (match_operand:V4SI 1 "s_register_operand")
5707 (match_operand:SI 2 "mve_vldrd_immediate")
5708 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
5709 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5710{
5711 rtx ignore_wb = gen_reg_rtx (V4SImode);
5712 emit_insn (
5713 gen_mve_vldrwq_gather_base_wb_fv4sf_insn (operands[0], ignore_wb,
5714 operands[1], operands[2]));
5715 DONE;
5716})
5717
5718;;
5719;; [vldrwq_gather_base_wb_f]
5720;;
5721(define_insn "mve_vldrwq_gather_base_wb_fv4sf_insn"
5722 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
5723 (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
5724 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
5725 (mem:BLK (scratch))]
5726 VLDRWQGBWB_F))
5727 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
5728 (unspec:V4SI [(match_dup 2) (match_dup 3)]
5729 VLDRWQGBWB_F))
5730 ]
5731 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5732{
5733 rtx ops[3];
5734 ops[0] = operands[0];
5735 ops[1] = operands[2];
5736 ops[2] = operands[3];
5737 output_asm_insn ("vldrw.u32\t%q0, [%q1, %2]!",ops);
5738 return "";
5739}
5740 [(set_attr "length" "4")])
5741
5742(define_expand "mve_vldrwq_gather_base_wb_z_fv4sf"
ff825b81
SP
5743 [(match_operand:V4SI 0 "s_register_operand")
5744 (match_operand:V4SI 1 "s_register_operand")
5745 (match_operand:SI 2 "mve_vldrd_immediate")
6a7c13a0 5746 (match_operand:V4BI 3 "vpr_register_operand")
ff825b81
SP
5747 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
5748 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5749{
5750 rtx ignore_result = gen_reg_rtx (V4SFmode);
5751 emit_insn (
5752 gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (ignore_result, operands[0],
5753 operands[1], operands[2],
5754 operands[3]));
5755 DONE;
5756})
5757
5758(define_expand "mve_vldrwq_gather_base_nowb_z_fv4sf"
41e1a7ff
SP
5759 [(match_operand:V4SF 0 "s_register_operand")
5760 (match_operand:V4SI 1 "s_register_operand")
5761 (match_operand:SI 2 "mve_vldrd_immediate")
6a7c13a0 5762 (match_operand:V4BI 3 "vpr_register_operand")
41e1a7ff
SP
5763 (unspec:V4SI [(const_int 0)] VLDRWQGBWB_F)]
5764 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5765{
5766 rtx ignore_wb = gen_reg_rtx (V4SImode);
5767 emit_insn (
5768 gen_mve_vldrwq_gather_base_wb_z_fv4sf_insn (operands[0], ignore_wb,
5769 operands[1], operands[2],
5770 operands[3]));
5771 DONE;
5772})
5773
5774;;
5775;; [vldrwq_gather_base_wb_z_f]
5776;;
5777(define_insn "mve_vldrwq_gather_base_wb_z_fv4sf_insn"
5778 [(set (match_operand:V4SF 0 "s_register_operand" "=&w")
5779 (unspec:V4SF [(match_operand:V4SI 2 "s_register_operand" "1")
5780 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
6a7c13a0 5781 (match_operand:V4BI 4 "vpr_register_operand" "Up")
41e1a7ff
SP
5782 (mem:BLK (scratch))]
5783 VLDRWQGBWB_F))
5784 (set (match_operand:V4SI 1 "s_register_operand" "=&w")
5785 (unspec:V4SI [(match_dup 2) (match_dup 3)]
5786 VLDRWQGBWB_F))
5787 ]
5788 "TARGET_HAVE_MVE && TARGET_HAVE_MVE_FLOAT"
5789{
5790 rtx ops[3];
5791 ops[0] = operands[0];
5792 ops[1] = operands[2];
5793 ops[2] = operands[3];
ff825b81 5794 output_asm_insn ("vpst\;vldrwt.u32\t%q0, [%q1, %2]!",ops);
41e1a7ff
SP
5795 return "";
5796}
5797 [(set_attr "length" "8")])
5798
5799(define_expand "mve_vldrdq_gather_base_wb_<supf>v2di"
5800 [(match_operand:V2DI 0 "s_register_operand")
5801 (match_operand:V2DI 1 "s_register_operand")
5802 (match_operand:SI 2 "mve_vldrd_immediate")
5803 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
5804 "TARGET_HAVE_MVE"
ff825b81
SP
5805{
5806 rtx ignore_result = gen_reg_rtx (V2DImode);
5807 emit_insn (
5808 gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (ignore_result, operands[0],
5809 operands[1], operands[2]));
5810 DONE;
5811})
5812
5813(define_expand "mve_vldrdq_gather_base_nowb_<supf>v2di"
5814 [(match_operand:V2DI 0 "s_register_operand")
5815 (match_operand:V2DI 1 "s_register_operand")
5816 (match_operand:SI 2 "mve_vldrd_immediate")
5817 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
5818 "TARGET_HAVE_MVE"
41e1a7ff
SP
5819{
5820 rtx ignore_wb = gen_reg_rtx (V2DImode);
5821 emit_insn (
5822 gen_mve_vldrdq_gather_base_wb_<supf>v2di_insn (operands[0], ignore_wb,
5823 operands[1], operands[2]));
5824 DONE;
5825})
5826
ff825b81 5827
41e1a7ff
SP
5828;;
5829;; [vldrdq_gather_base_wb_s vldrdq_gather_base_wb_u]
5830;;
5831(define_insn "mve_vldrdq_gather_base_wb_<supf>v2di_insn"
5832 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
5833 (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
5834 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
5835 (mem:BLK (scratch))]
5836 VLDRDGBWBQ))
5837 (set (match_operand:V2DI 1 "s_register_operand" "=&w")
5838 (unspec:V2DI [(match_dup 2) (match_dup 3)]
5839 VLDRDGBWBQ))
5840 ]
5841 "TARGET_HAVE_MVE"
5842{
5843 rtx ops[3];
5844 ops[0] = operands[0];
5845 ops[1] = operands[2];
5846 ops[2] = operands[3];
5847 output_asm_insn ("vldrd.64\t%q0, [%q1, %2]!",ops);
5848 return "";
5849}
5850 [(set_attr "length" "4")])
5851
5852(define_expand "mve_vldrdq_gather_base_wb_z_<supf>v2di"
5853 [(match_operand:V2DI 0 "s_register_operand")
5854 (match_operand:V2DI 1 "s_register_operand")
5855 (match_operand:SI 2 "mve_vldrd_immediate")
e0bc13d3 5856 (match_operand:V2QI 3 "vpr_register_operand")
41e1a7ff
SP
5857 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
5858 "TARGET_HAVE_MVE"
ff825b81
SP
5859{
5860 rtx ignore_result = gen_reg_rtx (V2DImode);
5861 emit_insn (
5862 gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (ignore_result, operands[0],
5863 operands[1], operands[2],
5864 operands[3]));
5865 DONE;
5866})
5867
5868(define_expand "mve_vldrdq_gather_base_nowb_z_<supf>v2di"
5869 [(match_operand:V2DI 0 "s_register_operand")
5870 (match_operand:V2DI 1 "s_register_operand")
5871 (match_operand:SI 2 "mve_vldrd_immediate")
e0bc13d3 5872 (match_operand:V2QI 3 "vpr_register_operand")
ff825b81
SP
5873 (unspec:V2DI [(const_int 0)] VLDRDGBWBQ)]
5874 "TARGET_HAVE_MVE"
41e1a7ff
SP
5875{
5876 rtx ignore_wb = gen_reg_rtx (V2DImode);
5877 emit_insn (
5878 gen_mve_vldrdq_gather_base_wb_z_<supf>v2di_insn (operands[0], ignore_wb,
5879 operands[1], operands[2],
5880 operands[3]));
5881 DONE;
5882})
5883
c3562f81
SP
5884(define_insn "get_fpscr_nzcvqc"
5885 [(set (match_operand:SI 0 "register_operand" "=r")
8eedd1e1 5886 (unspec_volatile:SI [(reg:SI VFPCC_REGNUM)] UNSPEC_GET_FPSCR_NZCVQC))]
c3562f81
SP
5887 "TARGET_HAVE_MVE"
5888 "vmrs\\t%0, FPSCR_nzcvqc"
5889 [(set_attr "type" "mve_move")])
5890
5891(define_insn "set_fpscr_nzcvqc"
5892 [(set (reg:SI VFPCC_REGNUM)
5893 (unspec_volatile:SI [(match_operand:SI 0 "register_operand" "r")]
5894 VUNSPEC_SET_FPSCR_NZCVQC))]
5895 "TARGET_HAVE_MVE"
5896 "vmsr\\tFPSCR_nzcvqc, %0"
5897 [(set_attr "type" "mve_move")])
5898
41e1a7ff
SP
5899;;
5900;; [vldrdq_gather_base_wb_z_s vldrdq_gather_base_wb_z_u]
5901;;
5902(define_insn "mve_vldrdq_gather_base_wb_z_<supf>v2di_insn"
5903 [(set (match_operand:V2DI 0 "s_register_operand" "=&w")
5904 (unspec:V2DI [(match_operand:V2DI 2 "s_register_operand" "1")
5905 (match_operand:SI 3 "mve_vldrd_immediate" "Ri")
e0bc13d3 5906 (match_operand:V2QI 4 "vpr_register_operand" "Up")
41e1a7ff
SP
5907 (mem:BLK (scratch))]
5908 VLDRDGBWBQ))
5909 (set (match_operand:V2DI 1 "s_register_operand" "=&w")
5910 (unspec:V2DI [(match_dup 2) (match_dup 3)]
5911 VLDRDGBWBQ))
5912 ]
5913 "TARGET_HAVE_MVE"
5914{
5915 rtx ops[3];
5916 ops[0] = operands[0];
5917 ops[1] = operands[2];
5918 ops[2] = operands[3];
ff825b81 5919 output_asm_insn ("vpst\;vldrdt.u64\t%q0, [%q1, %2]!",ops);
41e1a7ff
SP
5920 return "";
5921}
5922 [(set_attr "length" "8")])
c3562f81
SP
5923;;
5924;; [vadciq_m_s, vadciq_m_u])
5925;;
5926(define_insn "mve_vadciq_m_<supf>v4si"
5927 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5928 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
5929 (match_operand:V4SI 2 "s_register_operand" "w")
5930 (match_operand:V4SI 3 "s_register_operand" "w")
c6b4ea7a 5931 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
c3562f81
SP
5932 VADCIQ_M))
5933 (set (reg:SI VFPCC_REGNUM)
5934 (unspec:SI [(const_int 0)]
5935 VADCIQ_M))
5936 ]
5937 "TARGET_HAVE_MVE"
5938 "vpst\;vadcit.i32\t%q0, %q2, %q3"
5939 [(set_attr "type" "mve_move")
5940 (set_attr "length" "8")])
5941
5942;;
5943;; [vadciq_u, vadciq_s])
5944;;
5945(define_insn "mve_vadciq_<supf>v4si"
5946 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5947 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
5948 (match_operand:V4SI 2 "s_register_operand" "w")]
5949 VADCIQ))
5950 (set (reg:SI VFPCC_REGNUM)
5951 (unspec:SI [(const_int 0)]
5952 VADCIQ))
5953 ]
5954 "TARGET_HAVE_MVE"
5955 "vadci.i32\t%q0, %q1, %q2"
5956 [(set_attr "type" "mve_move")
5957 (set_attr "length" "4")])
5958
5959;;
5960;; [vadcq_m_s, vadcq_m_u])
5961;;
5962(define_insn "mve_vadcq_m_<supf>v4si"
5963 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5964 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "0")
5965 (match_operand:V4SI 2 "s_register_operand" "w")
5966 (match_operand:V4SI 3 "s_register_operand" "w")
c6b4ea7a 5967 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
c3562f81
SP
5968 VADCQ_M))
5969 (set (reg:SI VFPCC_REGNUM)
5970 (unspec:SI [(reg:SI VFPCC_REGNUM)]
5971 VADCQ_M))
5972 ]
5973 "TARGET_HAVE_MVE"
5974 "vpst\;vadct.i32\t%q0, %q2, %q3"
5975 [(set_attr "type" "mve_move")
5976 (set_attr "length" "8")])
5977
5978;;
5979;; [vadcq_u, vadcq_s])
5980;;
5981(define_insn "mve_vadcq_<supf>v4si"
5982 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
5983 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
5984 (match_operand:V4SI 2 "s_register_operand" "w")]
5985 VADCQ))
5986 (set (reg:SI VFPCC_REGNUM)
5987 (unspec:SI [(reg:SI VFPCC_REGNUM)]
5988 VADCQ))
5989 ]
5990 "TARGET_HAVE_MVE"
5991 "vadc.i32\t%q0, %q1, %q2"
5992 [(set_attr "type" "mve_move")
5993 (set_attr "length" "4")
5994 (set_attr "conds" "set")])
5995
5996;;
5997;; [vsbciq_m_u, vsbciq_m_s])
5998;;
5999(define_insn "mve_vsbciq_m_<supf>v4si"
6000 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6001 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6002 (match_operand:V4SI 2 "s_register_operand" "w")
6003 (match_operand:V4SI 3 "s_register_operand" "w")
c6b4ea7a 6004 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
c3562f81
SP
6005 VSBCIQ_M))
6006 (set (reg:SI VFPCC_REGNUM)
6007 (unspec:SI [(const_int 0)]
6008 VSBCIQ_M))
6009 ]
6010 "TARGET_HAVE_MVE"
6011 "vpst\;vsbcit.i32\t%q0, %q2, %q3"
6012 [(set_attr "type" "mve_move")
6013 (set_attr "length" "8")])
6014
6015;;
6016;; [vsbciq_s, vsbciq_u])
6017;;
6018(define_insn "mve_vsbciq_<supf>v4si"
6019 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6020 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6021 (match_operand:V4SI 2 "s_register_operand" "w")]
6022 VSBCIQ))
6023 (set (reg:SI VFPCC_REGNUM)
6024 (unspec:SI [(const_int 0)]
6025 VSBCIQ))
6026 ]
6027 "TARGET_HAVE_MVE"
6028 "vsbci.i32\t%q0, %q1, %q2"
6029 [(set_attr "type" "mve_move")
6030 (set_attr "length" "4")])
6031
6032;;
6033;; [vsbcq_m_u, vsbcq_m_s])
6034;;
6035(define_insn "mve_vsbcq_m_<supf>v4si"
6036 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6037 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6038 (match_operand:V4SI 2 "s_register_operand" "w")
6039 (match_operand:V4SI 3 "s_register_operand" "w")
c6b4ea7a 6040 (match_operand:V4BI 4 "vpr_register_operand" "Up")]
c3562f81
SP
6041 VSBCQ_M))
6042 (set (reg:SI VFPCC_REGNUM)
6043 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6044 VSBCQ_M))
6045 ]
6046 "TARGET_HAVE_MVE"
6047 "vpst\;vsbct.i32\t%q0, %q2, %q3"
6048 [(set_attr "type" "mve_move")
6049 (set_attr "length" "8")])
6050
6051;;
6052;; [vsbcq_s, vsbcq_u])
6053;;
6054(define_insn "mve_vsbcq_<supf>v4si"
6055 [(set (match_operand:V4SI 0 "s_register_operand" "=w")
6056 (unspec:V4SI [(match_operand:V4SI 1 "s_register_operand" "w")
6057 (match_operand:V4SI 2 "s_register_operand" "w")]
6058 VSBCQ))
6059 (set (reg:SI VFPCC_REGNUM)
6060 (unspec:SI [(reg:SI VFPCC_REGNUM)]
6061 VSBCQ))
6062 ]
6063 "TARGET_HAVE_MVE"
6064 "vsbc.i32\t%q0, %q1, %q2"
6065 [(set_attr "type" "mve_move")
6066 (set_attr "length" "4")])
1dfcc3b5
SP
6067
6068;;
6069;; [vst2q])
6070;;
6071(define_insn "mve_vst2q<mode>"
4269a656 6072 [(set (match_operand:OI 0 "mve_struct_operand" "=Ug")
1dfcc3b5
SP
6073 (unspec:OI [(match_operand:OI 1 "s_register_operand" "w")
6074 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6075 VST2Q))
6076 ]
6077 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6078 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6079{
6080 rtx ops[4];
6081 int regno = REGNO (operands[1]);
6082 ops[0] = gen_rtx_REG (TImode, regno);
6083 ops[1] = gen_rtx_REG (TImode, regno + 4);
6084 rtx reg = operands[0];
6085 while (reg && !REG_P (reg))
6086 reg = XEXP (reg, 0);
6087 gcc_assert (REG_P (reg));
6088 ops[2] = reg;
6089 ops[3] = operands[0];
6090 output_asm_insn ("vst20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
6091 "vst21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
6092 return "";
6093}
6094 [(set_attr "length" "8")])
6095
6096;;
6097;; [vld2q])
6098;;
6099(define_insn "mve_vld2q<mode>"
6100 [(set (match_operand:OI 0 "s_register_operand" "=w")
4269a656 6101 (unspec:OI [(match_operand:OI 1 "mve_struct_operand" "Ug")
1dfcc3b5
SP
6102 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6103 VLD2Q))
6104 ]
6105 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6106 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6107{
6108 rtx ops[4];
6109 int regno = REGNO (operands[0]);
6110 ops[0] = gen_rtx_REG (TImode, regno);
6111 ops[1] = gen_rtx_REG (TImode, regno + 4);
6112 rtx reg = operands[1];
6113 while (reg && !REG_P (reg))
6114 reg = XEXP (reg, 0);
6115 gcc_assert (REG_P (reg));
6116 ops[2] = reg;
6117 ops[3] = operands[1];
6118 output_asm_insn ("vld20.<V_sz_elem>\t{%q0, %q1}, [%2]\n\t"
6119 "vld21.<V_sz_elem>\t{%q0, %q1}, %3", ops);
6120 return "";
6121}
6122 [(set_attr "length" "8")])
6123
6124;;
6125;; [vld4q])
6126;;
6127(define_insn "mve_vld4q<mode>"
6128 [(set (match_operand:XI 0 "s_register_operand" "=w")
4269a656 6129 (unspec:XI [(match_operand:XI 1 "mve_struct_operand" "Ug")
1dfcc3b5
SP
6130 (unspec:MVE_VLD_ST [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
6131 VLD4Q))
6132 ]
6133 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6134 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6135{
6136 rtx ops[6];
6137 int regno = REGNO (operands[0]);
6138 ops[0] = gen_rtx_REG (TImode, regno);
6139 ops[1] = gen_rtx_REG (TImode, regno+4);
6140 ops[2] = gen_rtx_REG (TImode, regno+8);
6141 ops[3] = gen_rtx_REG (TImode, regno + 12);
6142 rtx reg = operands[1];
6143 while (reg && !REG_P (reg))
6144 reg = XEXP (reg, 0);
6145 gcc_assert (REG_P (reg));
6146 ops[4] = reg;
6147 ops[5] = operands[1];
6148 output_asm_insn ("vld40.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6149 "vld41.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6150 "vld42.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, [%4]\n\t"
6151 "vld43.<V_sz_elem>\t{%q0, %q1, %q2, %q3}, %5", ops);
6152 return "";
6153}
6154 [(set_attr "length" "16")])
1a5c27b1
SP
6155;;
6156;; [vgetq_lane_u, vgetq_lane_s, vgetq_lane_f])
6157;;
6158(define_insn "mve_vec_extract<mode><V_elem_l>"
302b6836 6159 [(set (match_operand:<V_elem> 0 "nonimmediate_operand" "=r")
1a5c27b1
SP
6160 (vec_select:<V_elem>
6161 (match_operand:MVE_VLD_ST 1 "s_register_operand" "w")
6162 (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
6163 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6164 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6165{
6166 if (BYTES_BIG_ENDIAN)
6167 {
6168 int elt = INTVAL (operands[2]);
6169 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6170 operands[2] = GEN_INT (elt);
6171 }
6172 return "vmov.<V_extr_elem>\t%0, %q1[%c2]";
6173}
6174 [(set_attr "type" "mve_move")])
6175
6176(define_insn "mve_vec_extractv2didi"
302b6836 6177 [(set (match_operand:DI 0 "nonimmediate_operand" "=r")
1a5c27b1
SP
6178 (vec_select:DI
6179 (match_operand:V2DI 1 "s_register_operand" "w")
6180 (parallel [(match_operand:SI 2 "immediate_operand" "i")])))]
6181 "TARGET_HAVE_MVE"
6182{
6183 int elt = INTVAL (operands[2]);
6184 if (BYTES_BIG_ENDIAN)
6185 elt = 1 - elt;
6186
6187 if (elt == 0)
6188 return "vmov\t%Q0, %R0, %e1";
6189 else
302b6836 6190 return "vmov\t%Q0, %R0, %f1";
1a5c27b1
SP
6191}
6192 [(set_attr "type" "mve_move")])
6193
6194(define_insn "*mve_vec_extract_sext_internal<mode>"
6195 [(set (match_operand:SI 0 "s_register_operand" "=r")
6196 (sign_extend:SI
6197 (vec_select:<V_elem>
6198 (match_operand:MVE_2 1 "s_register_operand" "w")
6199 (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
6200 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6201 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6202{
6203 if (BYTES_BIG_ENDIAN)
6204 {
6205 int elt = INTVAL (operands[2]);
6206 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6207 operands[2] = GEN_INT (elt);
6208 }
6209 return "vmov.s<V_sz_elem>\t%0, %q1[%c2]";
6210}
6211 [(set_attr "type" "mve_move")])
6212
6213(define_insn "*mve_vec_extract_zext_internal<mode>"
6214 [(set (match_operand:SI 0 "s_register_operand" "=r")
6215 (zero_extend:SI
6216 (vec_select:<V_elem>
6217 (match_operand:MVE_2 1 "s_register_operand" "w")
6218 (parallel [(match_operand:SI 2 "immediate_operand" "i")]))))]
6219 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6220 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6221{
6222 if (BYTES_BIG_ENDIAN)
6223 {
6224 int elt = INTVAL (operands[2]);
6225 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6226 operands[2] = GEN_INT (elt);
6227 }
6228 return "vmov.u<V_sz_elem>\t%0, %q1[%c2]";
6229}
6230 [(set_attr "type" "mve_move")])
6231
6232;;
6233;; [vsetq_lane_u, vsetq_lane_s, vsetq_lane_f])
6234;;
6235(define_insn "mve_vec_set<mode>_internal"
6236 [(set (match_operand:VQ2 0 "s_register_operand" "=w")
6237 (vec_merge:VQ2
6238 (vec_duplicate:VQ2
6239 (match_operand:<V_elem> 1 "nonimmediate_operand" "r"))
6240 (match_operand:VQ2 3 "s_register_operand" "0")
6241 (match_operand:SI 2 "immediate_operand" "i")))]
6242 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6243 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6244{
6245 int elt = ffs ((int) INTVAL (operands[2])) - 1;
6246 if (BYTES_BIG_ENDIAN)
6247 elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt;
6248 operands[2] = GEN_INT (elt);
6249
6250 return "vmov.<V_sz_elem>\t%q0[%c2], %1";
6251}
6252 [(set_attr "type" "mve_move")])
6253
6254(define_insn "mve_vec_setv2di_internal"
6255 [(set (match_operand:V2DI 0 "s_register_operand" "=w")
6256 (vec_merge:V2DI
6257 (vec_duplicate:V2DI
6258 (match_operand:DI 1 "nonimmediate_operand" "r"))
6259 (match_operand:V2DI 3 "s_register_operand" "0")
6260 (match_operand:SI 2 "immediate_operand" "i")))]
6261 "TARGET_HAVE_MVE"
6262{
6263 int elt = ffs ((int) INTVAL (operands[2])) - 1;
6264 if (BYTES_BIG_ENDIAN)
6265 elt = 1 - elt;
6266
6267 if (elt == 0)
6268 return "vmov\t%e0, %Q1, %R1";
6269 else
6270 return "vmov\t%f0, %J1, %K1";
6271}
6272 [(set_attr "type" "mve_move")])
85244449
SP
6273
6274;;
6275;; [uqrshll_di]
6276;;
6277(define_insn "mve_uqrshll_sat<supf>_di"
6af59870
SP
6278 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6279 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6280 (match_operand:SI 2 "register_operand" "r")]
85244449
SP
6281 UQRSHLLQ))]
6282 "TARGET_HAVE_MVE"
6283 "uqrshll%?\\t%Q1, %R1, #<supf>, %2"
6284 [(set_attr "predicable" "yes")])
6285
6286;;
6287;; [sqrshrl_di]
6288;;
6289(define_insn "mve_sqrshrl_sat<supf>_di"
6af59870
SP
6290 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6291 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6292 (match_operand:SI 2 "register_operand" "r")]
85244449
SP
6293 SQRSHRLQ))]
6294 "TARGET_HAVE_MVE"
6295 "sqrshrl%?\\t%Q1, %R1, #<supf>, %2"
6296 [(set_attr "predicable" "yes")])
6297
6298;;
6299;; [uqrshl_si]
6300;;
6301(define_insn "mve_uqrshl_si"
6af59870
SP
6302 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6303 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6304 (match_operand:SI 2 "register_operand" "r")]
85244449
SP
6305 UQRSHL))]
6306 "TARGET_HAVE_MVE"
6307 "uqrshl%?\\t%1, %2"
6308 [(set_attr "predicable" "yes")])
6309
6310;;
6311;; [sqrshr_si]
6312;;
6313(define_insn "mve_sqrshr_si"
6af59870
SP
6314 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6315 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6316 (match_operand:SI 2 "register_operand" "r")]
85244449
SP
6317 SQRSHR))]
6318 "TARGET_HAVE_MVE"
6319 "sqrshr%?\\t%1, %2"
6320 [(set_attr "predicable" "yes")])
6321
6322;;
6323;; [uqshll_di]
6324;;
6325(define_insn "mve_uqshll_di"
6af59870
SP
6326 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6327 (us_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
6328 (match_operand:SI 2 "immediate_operand" "Pg")))]
85244449
SP
6329 "TARGET_HAVE_MVE"
6330 "uqshll%?\\t%Q1, %R1, %2"
6331 [(set_attr "predicable" "yes")])
6332
6333;;
6334;; [urshrl_di]
6335;;
6336(define_insn "mve_urshrl_di"
6af59870
SP
6337 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6338 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6339 (match_operand:SI 2 "immediate_operand" "Pg")]
85244449
SP
6340 URSHRL))]
6341 "TARGET_HAVE_MVE"
6342 "urshrl%?\\t%Q1, %R1, %2"
6343 [(set_attr "predicable" "yes")])
6344
6345;;
6346;; [uqshl_si]
6347;;
6348(define_insn "mve_uqshl_si"
6af59870
SP
6349 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6350 (us_ashift:SI (match_operand:SI 1 "arm_general_register_operand" "0")
6351 (match_operand:SI 2 "immediate_operand" "Pg")))]
85244449
SP
6352 "TARGET_HAVE_MVE"
6353 "uqshl%?\\t%1, %2"
6354 [(set_attr "predicable" "yes")])
6355
6356;;
6357;; [urshr_si]
6358;;
6359(define_insn "mve_urshr_si"
6af59870
SP
6360 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6361 (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "0")
6362 (match_operand:SI 2 "immediate_operand" "Pg")]
85244449
SP
6363 URSHR))]
6364 "TARGET_HAVE_MVE"
6365 "urshr%?\\t%1, %2"
6366 [(set_attr "predicable" "yes")])
6367
6368;;
6369;; [sqshl_si]
6370;;
6371(define_insn "mve_sqshl_si"
6af59870
SP
6372 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6373 (ss_ashift:SI (match_operand:DI 1 "arm_general_register_operand" "0")
6374 (match_operand:SI 2 "immediate_operand" "Pg")))]
85244449
SP
6375 "TARGET_HAVE_MVE"
6376 "sqshl%?\\t%1, %2"
6377 [(set_attr "predicable" "yes")])
6378
6379;;
6380;; [srshr_si]
6381;;
6382(define_insn "mve_srshr_si"
6af59870
SP
6383 [(set (match_operand:SI 0 "arm_general_register_operand" "=r")
6384 (unspec:SI [(match_operand:DI 1 "arm_general_register_operand" "0")
6385 (match_operand:SI 2 "immediate_operand" "Pg")]
85244449
SP
6386 SRSHR))]
6387 "TARGET_HAVE_MVE"
6388 "srshr%?\\t%1, %2"
6389 [(set_attr "predicable" "yes")])
6390
6391;;
6392;; [srshrl_di]
6393;;
6394(define_insn "mve_srshrl_di"
6af59870
SP
6395 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6396 (unspec:DI [(match_operand:DI 1 "arm_low_register_operand" "0")
6397 (match_operand:SI 2 "immediate_operand" "Pg")]
85244449
SP
6398 SRSHRL))]
6399 "TARGET_HAVE_MVE"
6400 "srshrl%?\\t%Q1, %R1, %2"
6401 [(set_attr "predicable" "yes")])
6402
6403;;
6404;; [sqshll_di]
6405;;
6406(define_insn "mve_sqshll_di"
6af59870
SP
6407 [(set (match_operand:DI 0 "arm_low_register_operand" "=l")
6408 (ss_ashift:DI (match_operand:DI 1 "arm_low_register_operand" "0")
6409 (match_operand:SI 2 "immediate_operand" "Pg")))]
85244449
SP
6410 "TARGET_HAVE_MVE"
6411 "sqshll%?\\t%Q1, %R1, %2"
6412 [(set_attr "predicable" "yes")])
88c9a831
SP
6413
6414;;
6415;; [vshlcq_m_u vshlcq_m_s]
6416;;
6417(define_expand "mve_vshlcq_m_vec_<supf><mode>"
6418 [(match_operand:MVE_2 0 "s_register_operand")
6419 (match_operand:MVE_2 1 "s_register_operand")
6420 (match_operand:SI 2 "s_register_operand")
6421 (match_operand:SI 3 "mve_imm_32")
724d6566 6422 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
88c9a831
SP
6423 (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
6424 "TARGET_HAVE_MVE"
6425{
6426 rtx ignore_wb = gen_reg_rtx (SImode);
6427 emit_insn (gen_mve_vshlcq_m_<supf><mode> (operands[0], ignore_wb, operands[1],
6428 operands[2], operands[3],
6429 operands[4]));
6430 DONE;
6431})
6432
6433(define_expand "mve_vshlcq_m_carry_<supf><mode>"
6434 [(match_operand:SI 0 "s_register_operand")
6435 (match_operand:MVE_2 1 "s_register_operand")
6436 (match_operand:SI 2 "s_register_operand")
6437 (match_operand:SI 3 "mve_imm_32")
724d6566 6438 (match_operand:<MVE_VPRED> 4 "vpr_register_operand")
88c9a831
SP
6439 (unspec:MVE_2 [(const_int 0)] VSHLCQ_M)]
6440 "TARGET_HAVE_MVE"
6441{
6442 rtx ignore_vec = gen_reg_rtx (<MODE>mode);
6443 emit_insn (gen_mve_vshlcq_m_<supf><mode> (ignore_vec, operands[0],
6444 operands[1], operands[2],
6445 operands[3], operands[4]));
6446 DONE;
6447})
6448
6449(define_insn "mve_vshlcq_m_<supf><mode>"
6450 [(set (match_operand:MVE_2 0 "s_register_operand" "=w")
6451 (unspec:MVE_2 [(match_operand:MVE_2 2 "s_register_operand" "0")
6452 (match_operand:SI 3 "s_register_operand" "1")
6453 (match_operand:SI 4 "mve_imm_32" "Rf")
724d6566 6454 (match_operand:<MVE_VPRED> 5 "vpr_register_operand" "Up")]
88c9a831
SP
6455 VSHLCQ_M))
6456 (set (match_operand:SI 1 "s_register_operand" "=r")
6457 (unspec:SI [(match_dup 2)
6458 (match_dup 3)
6459 (match_dup 4)
6460 (match_dup 5)]
6461 VSHLCQ_M))
6462 ]
6463 "TARGET_HAVE_MVE"
6464 "vpst\;vshlct\t%q0, %1, %4"
6465 [(set_attr "type" "mve_move")
6466 (set_attr "length" "8")])
479ccabc 6467
78bf9163
MM
6468;; CDE instructions on MVE registers.
6469
6470(define_insn "arm_vcx1qv16qi"
6471 [(set (match_operand:V16QI 0 "register_operand" "=t")
6472 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6473 (match_operand:SI 2 "const_int_mve_cde1_operand" "i")]
6474 UNSPEC_VCDE))]
6475 "TARGET_CDE && TARGET_HAVE_MVE"
6476 "vcx1\\tp%c1, %q0, #%c2"
6477 [(set_attr "type" "coproc")]
6478)
6479
6480(define_insn "arm_vcx1qav16qi"
6481 [(set (match_operand:V16QI 0 "register_operand" "=t")
6482 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6483 (match_operand:V16QI 2 "register_operand" "0")
6484 (match_operand:SI 3 "const_int_mve_cde1_operand" "i")]
6485 UNSPEC_VCDEA))]
6486 "TARGET_CDE && TARGET_HAVE_MVE"
6487 "vcx1a\\tp%c1, %q0, #%c3"
6488 [(set_attr "type" "coproc")]
6489)
6490
6491(define_insn "arm_vcx2qv16qi"
6492 [(set (match_operand:V16QI 0 "register_operand" "=t")
6493 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6494 (match_operand:V16QI 2 "register_operand" "t")
6495 (match_operand:SI 3 "const_int_mve_cde2_operand" "i")]
6496 UNSPEC_VCDE))]
6497 "TARGET_CDE && TARGET_HAVE_MVE"
6498 "vcx2\\tp%c1, %q0, %q2, #%c3"
6499 [(set_attr "type" "coproc")]
6500)
6501
6502(define_insn "arm_vcx2qav16qi"
6503 [(set (match_operand:V16QI 0 "register_operand" "=t")
6504 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6505 (match_operand:V16QI 2 "register_operand" "0")
6506 (match_operand:V16QI 3 "register_operand" "t")
6507 (match_operand:SI 4 "const_int_mve_cde2_operand" "i")]
6508 UNSPEC_VCDEA))]
6509 "TARGET_CDE && TARGET_HAVE_MVE"
6510 "vcx2a\\tp%c1, %q0, %q3, #%c4"
6511 [(set_attr "type" "coproc")]
6512)
6513
6514(define_insn "arm_vcx3qv16qi"
6515 [(set (match_operand:V16QI 0 "register_operand" "=t")
6516 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6517 (match_operand:V16QI 2 "register_operand" "t")
6518 (match_operand:V16QI 3 "register_operand" "t")
6519 (match_operand:SI 4 "const_int_mve_cde3_operand" "i")]
6520 UNSPEC_VCDE))]
6521 "TARGET_CDE && TARGET_HAVE_MVE"
6522 "vcx3\\tp%c1, %q0, %q2, %q3, #%c4"
6523 [(set_attr "type" "coproc")]
6524)
6525
6526(define_insn "arm_vcx3qav16qi"
6527 [(set (match_operand:V16QI 0 "register_operand" "=t")
6528 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6529 (match_operand:V16QI 2 "register_operand" "0")
6530 (match_operand:V16QI 3 "register_operand" "t")
6531 (match_operand:V16QI 4 "register_operand" "t")
6532 (match_operand:SI 5 "const_int_mve_cde3_operand" "i")]
6533 UNSPEC_VCDEA))]
6534 "TARGET_CDE && TARGET_HAVE_MVE"
6535 "vcx3a\\tp%c1, %q0, %q3, %q4, #%c5"
6536 [(set_attr "type" "coproc")]
6537)
ef684c78
MM
6538
6539(define_insn "arm_vcx1q<a>_p_v16qi"
6540 [(set (match_operand:V16QI 0 "register_operand" "=t")
6541 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6542 (match_operand:V16QI 2 "register_operand" "0")
6543 (match_operand:SI 3 "const_int_mve_cde1_operand" "i")
c6b4ea7a 6544 (match_operand:V16BI 4 "vpr_register_operand" "Up")]
ef684c78
MM
6545 CDE_VCX))]
6546 "TARGET_CDE && TARGET_HAVE_MVE"
6547 "vpst\;vcx1<a>t\\tp%c1, %q0, #%c3"
6548 [(set_attr "type" "coproc")
6549 (set_attr "length" "8")]
6550)
6551
6552(define_insn "arm_vcx2q<a>_p_v16qi"
6553 [(set (match_operand:V16QI 0 "register_operand" "=t")
6554 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6555 (match_operand:V16QI 2 "register_operand" "0")
6556 (match_operand:V16QI 3 "register_operand" "t")
6557 (match_operand:SI 4 "const_int_mve_cde2_operand" "i")
c6b4ea7a 6558 (match_operand:V16BI 5 "vpr_register_operand" "Up")]
ef684c78
MM
6559 CDE_VCX))]
6560 "TARGET_CDE && TARGET_HAVE_MVE"
6561 "vpst\;vcx2<a>t\\tp%c1, %q0, %q3, #%c4"
6562 [(set_attr "type" "coproc")
6563 (set_attr "length" "8")]
6564)
6565
6566(define_insn "arm_vcx3q<a>_p_v16qi"
6567 [(set (match_operand:V16QI 0 "register_operand" "=t")
6568 (unspec:V16QI [(match_operand:SI 1 "const_int_coproc_operand" "i")
6569 (match_operand:V16QI 2 "register_operand" "0")
6570 (match_operand:V16QI 3 "register_operand" "t")
6571 (match_operand:V16QI 4 "register_operand" "t")
6572 (match_operand:SI 5 "const_int_mve_cde3_operand" "i")
c6b4ea7a 6573 (match_operand:V16BI 6 "vpr_register_operand" "Up")]
ef684c78
MM
6574 CDE_VCX))]
6575 "TARGET_CDE && TARGET_HAVE_MVE"
6576 "vpst\;vcx3<a>t\\tp%c1, %q0, %q3, %q4, #%c5"
6577 [(set_attr "type" "coproc")
6578 (set_attr "length" "8")]
6579)
25bef689
CL
6580
6581(define_insn "*movmisalign<mode>_mve_store"
6a116728 6582 [(set (match_operand:MVE_VLD_ST 0 "mve_memory_operand" "=Ux")
25bef689
CL
6583 (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "s_register_operand" " w")]
6584 UNSPEC_MISALIGNED_ACCESS))]
6585 "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6586 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
6587 && !BYTES_BIG_ENDIAN && unaligned_access"
6588 "vstr<V_sz_elem1>.<V_sz_elem>\t%q1, %E0"
6589 [(set_attr "type" "mve_store")]
6590)
6591
6592
6593(define_insn "*movmisalign<mode>_mve_load"
6594 [(set (match_operand:MVE_VLD_ST 0 "s_register_operand" "=w")
6a116728 6595 (unspec:MVE_VLD_ST [(match_operand:MVE_VLD_ST 1 "mve_memory_operand" " Ux")]
25bef689
CL
6596 UNSPEC_MISALIGNED_ACCESS))]
6597 "((TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6598 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode)))
6599 && !BYTES_BIG_ENDIAN && unaligned_access"
6600 "vldr<V_sz_elem1>.<V_sz_elem>\t%q0, %E1"
6601 [(set_attr "type" "mve_load")]
6602)
91224cf6
CL
6603
6604;; Expander for VxBI moves
6605(define_expand "mov<mode>"
6606 [(set (match_operand:MVE_7 0 "nonimmediate_operand")
6607 (match_operand:MVE_7 1 "general_operand"))]
6608 "TARGET_HAVE_MVE"
6609 {
6610 if (!register_operand (operands[0], <MODE>mode))
6611 operands[1] = force_reg (<MODE>mode, operands[1]);
6612 }
6613)
df0e57c2
CL
6614
6615;; Expanders for vec_cmp and vcond
6616
6617(define_expand "vec_cmp<mode><MVE_vpred>"
6618 [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
6619 (match_operator:<MVE_VPRED> 1 "comparison_operator"
6620 [(match_operand:MVE_VLD_ST 2 "s_register_operand")
6621 (match_operand:MVE_VLD_ST 3 "reg_or_zero_operand")]))]
6622 "TARGET_HAVE_MVE
6623 && (!<Is_float_mode> || flag_unsafe_math_optimizations)"
6624{
6625 arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
6626 operands[2], operands[3], false);
6627 DONE;
6628})
6629
6630(define_expand "vec_cmpu<mode><MVE_vpred>"
6631 [(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
6632 (match_operator:<MVE_VPRED> 1 "comparison_operator"
6633 [(match_operand:MVE_2 2 "s_register_operand")
6634 (match_operand:MVE_2 3 "reg_or_zero_operand")]))]
6635 "TARGET_HAVE_MVE"
6636{
6637 arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
6638 operands[2], operands[3], false);
6639 DONE;
6640})
6641
6642(define_expand "vcond_mask_<mode><MVE_vpred>"
6643 [(set (match_operand:MVE_VLD_ST 0 "s_register_operand")
6644 (if_then_else:MVE_VLD_ST
6645 (match_operand:<MVE_VPRED> 3 "s_register_operand")
6646 (match_operand:MVE_VLD_ST 1 "s_register_operand")
6647 (match_operand:MVE_VLD_ST 2 "s_register_operand")))]
6648 "TARGET_HAVE_MVE"
6649{
6650 switch (GET_MODE_CLASS (<MODE>mode))
6651 {
6652 case MODE_VECTOR_INT:
f7196b72
CL
6653 emit_insn (gen_mve_q (VPSELQ_S, VPSELQ_S, <MODE>mode, operands[0],
6654 operands[1], operands[2], operands[3]));
df0e57c2
CL
6655 break;
6656 case MODE_VECTOR_FLOAT:
f7196b72
CL
6657 emit_insn (gen_mve_q_f (VPSELQ_F, <MODE>mode, operands[0],
6658 operands[1], operands[2], operands[3]));
df0e57c2
CL
6659 break;
6660 default:
6661 gcc_unreachable ();
6662 }
6663 DONE;
6664})
00d97bf3
CL
6665
6666;; Reinterpret operand 1 in operand 0's mode, without changing its contents.
6667(define_expand "@arm_mve_reinterpret<mode>"
6668 [(set (match_operand:MVE_vecs 0 "register_operand")
6669 (unspec:MVE_vecs
6670 [(match_operand 1 "arm_any_register_operand")]
6671 REINTERPRET))]
6672 "(TARGET_HAVE_MVE && VALID_MVE_SI_MODE (<MODE>mode))
6673 || (TARGET_HAVE_MVE_FLOAT && VALID_MVE_SF_MODE (<MODE>mode))"
6674 {
6675 machine_mode src_mode = GET_MODE (operands[1]);
6676 if (targetm.can_change_mode_class (<MODE>mode, src_mode, VFP_REGS))
6677 {
6678 emit_move_insn (operands[0], gen_lowpart (<MODE>mode, operands[1]));
6679 DONE;
6680 }
6681 }
6682)