1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve -force-streaming-compatible-sve < %s | FileCheck %s
3 ; RUN: llc -mattr=+sme -force-streaming-compatible-sve < %s | FileCheck %s
5 target triple = "aarch64-unknown-linux-gnu"
11 define <4 x i8> @ashr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
12 ; CHECK-LABEL: ashr_v4i8:
14 ; CHECK-NEXT: ptrue p0.h, vl4
15 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
16 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
17 ; CHECK-NEXT: and z1.h, z1.h, #0xff
18 ; CHECK-NEXT: sxtb z0.h, p0/m, z0.h
19 ; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h
20 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
22 %res = ashr <4 x i8> %op1, %op2
26 define <8 x i8> @ashr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
27 ; CHECK-LABEL: ashr_v8i8:
29 ; CHECK-NEXT: ptrue p0.b, vl8
30 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
31 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
32 ; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b
33 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
35 %res = ashr <8 x i8> %op1, %op2
39 define <16 x i8> @ashr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
40 ; CHECK-LABEL: ashr_v16i8:
42 ; CHECK-NEXT: ptrue p0.b, vl16
43 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
44 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
45 ; CHECK-NEXT: asr z0.b, p0/m, z0.b, z1.b
46 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
48 %res = ashr <16 x i8> %op1, %op2
52 define void @ashr_v32i8(ptr %a, ptr %b) {
53 ; CHECK-LABEL: ashr_v32i8:
55 ; CHECK-NEXT: ptrue p0.b, vl16
56 ; CHECK-NEXT: ldp q0, q3, [x1]
57 ; CHECK-NEXT: ldp q1, q2, [x0]
58 ; CHECK-NEXT: asrr z0.b, p0/m, z0.b, z1.b
59 ; CHECK-NEXT: movprfx z1, z2
60 ; CHECK-NEXT: asr z1.b, p0/m, z1.b, z3.b
61 ; CHECK-NEXT: stp q0, q1, [x0]
63 %op1 = load <32 x i8>, ptr %a
64 %op2 = load <32 x i8>, ptr %b
65 %res = ashr <32 x i8> %op1, %op2
66 store <32 x i8> %res, ptr %a
70 define <2 x i16> @ashr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
71 ; CHECK-LABEL: ashr_v2i16:
73 ; CHECK-NEXT: ptrue p0.s, vl2
74 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
75 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
76 ; CHECK-NEXT: and z1.s, z1.s, #0xffff
77 ; CHECK-NEXT: sxth z0.s, p0/m, z0.s
78 ; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s
79 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
81 %res = ashr <2 x i16> %op1, %op2
85 define <4 x i16> @ashr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
86 ; CHECK-LABEL: ashr_v4i16:
88 ; CHECK-NEXT: ptrue p0.h, vl4
89 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
90 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
91 ; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h
92 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
94 %res = ashr <4 x i16> %op1, %op2
98 define <8 x i16> @ashr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
99 ; CHECK-LABEL: ashr_v8i16:
101 ; CHECK-NEXT: ptrue p0.h, vl8
102 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
103 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
104 ; CHECK-NEXT: asr z0.h, p0/m, z0.h, z1.h
105 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
107 %res = ashr <8 x i16> %op1, %op2
111 define void @ashr_v16i16(ptr %a, ptr %b) {
112 ; CHECK-LABEL: ashr_v16i16:
114 ; CHECK-NEXT: ptrue p0.h, vl8
115 ; CHECK-NEXT: ldp q0, q3, [x1]
116 ; CHECK-NEXT: ldp q1, q2, [x0]
117 ; CHECK-NEXT: asrr z0.h, p0/m, z0.h, z1.h
118 ; CHECK-NEXT: movprfx z1, z2
119 ; CHECK-NEXT: asr z1.h, p0/m, z1.h, z3.h
120 ; CHECK-NEXT: stp q0, q1, [x0]
122 %op1 = load <16 x i16>, ptr %a
123 %op2 = load <16 x i16>, ptr %b
124 %res = ashr <16 x i16> %op1, %op2
125 store <16 x i16> %res, ptr %a
129 define <2 x i32> @ashr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
130 ; CHECK-LABEL: ashr_v2i32:
132 ; CHECK-NEXT: ptrue p0.s, vl2
133 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
134 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
135 ; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s
136 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
138 %res = ashr <2 x i32> %op1, %op2
142 define <4 x i32> @ashr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
143 ; CHECK-LABEL: ashr_v4i32:
145 ; CHECK-NEXT: ptrue p0.s, vl4
146 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
147 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
148 ; CHECK-NEXT: asr z0.s, p0/m, z0.s, z1.s
149 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
151 %res = ashr <4 x i32> %op1, %op2
155 define void @ashr_v8i32(ptr %a, ptr %b) {
156 ; CHECK-LABEL: ashr_v8i32:
158 ; CHECK-NEXT: ptrue p0.s, vl4
159 ; CHECK-NEXT: ldp q0, q3, [x1]
160 ; CHECK-NEXT: ldp q1, q2, [x0]
161 ; CHECK-NEXT: asrr z0.s, p0/m, z0.s, z1.s
162 ; CHECK-NEXT: movprfx z1, z2
163 ; CHECK-NEXT: asr z1.s, p0/m, z1.s, z3.s
164 ; CHECK-NEXT: stp q0, q1, [x0]
166 %op1 = load <8 x i32>, ptr %a
167 %op2 = load <8 x i32>, ptr %b
168 %res = ashr <8 x i32> %op1, %op2
169 store <8 x i32> %res, ptr %a
173 define <1 x i64> @ashr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
174 ; CHECK-LABEL: ashr_v1i64:
176 ; CHECK-NEXT: ptrue p0.d, vl1
177 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
178 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
179 ; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d
180 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
182 %res = ashr <1 x i64> %op1, %op2
186 define <2 x i64> @ashr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
187 ; CHECK-LABEL: ashr_v2i64:
189 ; CHECK-NEXT: ptrue p0.d, vl2
190 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
191 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
192 ; CHECK-NEXT: asr z0.d, p0/m, z0.d, z1.d
193 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
195 %res = ashr <2 x i64> %op1, %op2
199 define void @ashr_v4i64(ptr %a, ptr %b) {
200 ; CHECK-LABEL: ashr_v4i64:
202 ; CHECK-NEXT: ptrue p0.d, vl2
203 ; CHECK-NEXT: ldp q0, q3, [x1]
204 ; CHECK-NEXT: ldp q1, q2, [x0]
205 ; CHECK-NEXT: asrr z0.d, p0/m, z0.d, z1.d
206 ; CHECK-NEXT: movprfx z1, z2
207 ; CHECK-NEXT: asr z1.d, p0/m, z1.d, z3.d
208 ; CHECK-NEXT: stp q0, q1, [x0]
210 %op1 = load <4 x i64>, ptr %a
211 %op2 = load <4 x i64>, ptr %b
212 %res = ashr <4 x i64> %op1, %op2
213 store <4 x i64> %res, ptr %a
221 define <4 x i8> @lshr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
222 ; CHECK-LABEL: lshr_v4i8:
224 ; CHECK-NEXT: ptrue p0.h, vl4
225 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
226 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
227 ; CHECK-NEXT: and z1.h, z1.h, #0xff
228 ; CHECK-NEXT: and z0.h, z0.h, #0xff
229 ; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h
230 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
232 %res = lshr <4 x i8> %op1, %op2
236 define <8 x i8> @lshr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
237 ; CHECK-LABEL: lshr_v8i8:
239 ; CHECK-NEXT: ptrue p0.b, vl8
240 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
241 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
242 ; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b
243 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
245 %res = lshr <8 x i8> %op1, %op2
249 define <16 x i8> @lshr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
250 ; CHECK-LABEL: lshr_v16i8:
252 ; CHECK-NEXT: ptrue p0.b, vl16
253 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
254 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
255 ; CHECK-NEXT: lsr z0.b, p0/m, z0.b, z1.b
256 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
258 %res = lshr <16 x i8> %op1, %op2
262 define void @lshr_v32i8(ptr %a, ptr %b) {
263 ; CHECK-LABEL: lshr_v32i8:
265 ; CHECK-NEXT: ptrue p0.b, vl16
266 ; CHECK-NEXT: ldp q0, q3, [x1]
267 ; CHECK-NEXT: ldp q1, q2, [x0]
268 ; CHECK-NEXT: lsrr z0.b, p0/m, z0.b, z1.b
269 ; CHECK-NEXT: movprfx z1, z2
270 ; CHECK-NEXT: lsr z1.b, p0/m, z1.b, z3.b
271 ; CHECK-NEXT: stp q0, q1, [x0]
273 %op1 = load <32 x i8>, ptr %a
274 %op2 = load <32 x i8>, ptr %b
275 %res = lshr <32 x i8> %op1, %op2
276 store <32 x i8> %res, ptr %a
280 define <2 x i16> @lshr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
281 ; CHECK-LABEL: lshr_v2i16:
283 ; CHECK-NEXT: ptrue p0.s, vl2
284 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
285 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
286 ; CHECK-NEXT: and z1.s, z1.s, #0xffff
287 ; CHECK-NEXT: and z0.s, z0.s, #0xffff
288 ; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s
289 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
291 %res = lshr <2 x i16> %op1, %op2
295 define <4 x i16> @lshr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
296 ; CHECK-LABEL: lshr_v4i16:
298 ; CHECK-NEXT: ptrue p0.h, vl4
299 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
300 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
301 ; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h
302 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
304 %res = lshr <4 x i16> %op1, %op2
308 define <8 x i16> @lshr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
309 ; CHECK-LABEL: lshr_v8i16:
311 ; CHECK-NEXT: ptrue p0.h, vl8
312 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
313 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
314 ; CHECK-NEXT: lsr z0.h, p0/m, z0.h, z1.h
315 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
317 %res = lshr <8 x i16> %op1, %op2
321 define void @lshr_v16i16(ptr %a, ptr %b) {
322 ; CHECK-LABEL: lshr_v16i16:
324 ; CHECK-NEXT: ptrue p0.h, vl8
325 ; CHECK-NEXT: ldp q0, q3, [x1]
326 ; CHECK-NEXT: ldp q1, q2, [x0]
327 ; CHECK-NEXT: lsrr z0.h, p0/m, z0.h, z1.h
328 ; CHECK-NEXT: movprfx z1, z2
329 ; CHECK-NEXT: lsr z1.h, p0/m, z1.h, z3.h
330 ; CHECK-NEXT: stp q0, q1, [x0]
332 %op1 = load <16 x i16>, ptr %a
333 %op2 = load <16 x i16>, ptr %b
334 %res = lshr <16 x i16> %op1, %op2
335 store <16 x i16> %res, ptr %a
339 define <2 x i32> @lshr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
340 ; CHECK-LABEL: lshr_v2i32:
342 ; CHECK-NEXT: ptrue p0.s, vl2
343 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
344 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
345 ; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s
346 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
348 %res = lshr <2 x i32> %op1, %op2
352 define <4 x i32> @lshr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
353 ; CHECK-LABEL: lshr_v4i32:
355 ; CHECK-NEXT: ptrue p0.s, vl4
356 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
357 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
358 ; CHECK-NEXT: lsr z0.s, p0/m, z0.s, z1.s
359 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
361 %res = lshr <4 x i32> %op1, %op2
365 define void @lshr_v8i32(ptr %a, ptr %b) {
366 ; CHECK-LABEL: lshr_v8i32:
368 ; CHECK-NEXT: ptrue p0.s, vl4
369 ; CHECK-NEXT: ldp q0, q3, [x1]
370 ; CHECK-NEXT: ldp q1, q2, [x0]
371 ; CHECK-NEXT: lsrr z0.s, p0/m, z0.s, z1.s
372 ; CHECK-NEXT: movprfx z1, z2
373 ; CHECK-NEXT: lsr z1.s, p0/m, z1.s, z3.s
374 ; CHECK-NEXT: stp q0, q1, [x0]
376 %op1 = load <8 x i32>, ptr %a
377 %op2 = load <8 x i32>, ptr %b
378 %res = lshr <8 x i32> %op1, %op2
379 store <8 x i32> %res, ptr %a
383 define <1 x i64> @lshr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
384 ; CHECK-LABEL: lshr_v1i64:
386 ; CHECK-NEXT: ptrue p0.d, vl1
387 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
388 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
389 ; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d
390 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
392 %res = lshr <1 x i64> %op1, %op2
396 define <2 x i64> @lshr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
397 ; CHECK-LABEL: lshr_v2i64:
399 ; CHECK-NEXT: ptrue p0.d, vl2
400 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
401 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
402 ; CHECK-NEXT: lsr z0.d, p0/m, z0.d, z1.d
403 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
405 %res = lshr <2 x i64> %op1, %op2
409 define void @lshr_v4i64(ptr %a, ptr %b) {
410 ; CHECK-LABEL: lshr_v4i64:
412 ; CHECK-NEXT: ptrue p0.d, vl2
413 ; CHECK-NEXT: ldp q0, q3, [x1]
414 ; CHECK-NEXT: ldp q1, q2, [x0]
415 ; CHECK-NEXT: lsrr z0.d, p0/m, z0.d, z1.d
416 ; CHECK-NEXT: movprfx z1, z2
417 ; CHECK-NEXT: lsr z1.d, p0/m, z1.d, z3.d
418 ; CHECK-NEXT: stp q0, q1, [x0]
420 %op1 = load <4 x i64>, ptr %a
421 %op2 = load <4 x i64>, ptr %b
422 %res = lshr <4 x i64> %op1, %op2
423 store <4 x i64> %res, ptr %a
431 define <2 x i8> @shl_v2i8(<2 x i8> %op1, <2 x i8> %op2) {
432 ; CHECK-LABEL: shl_v2i8:
434 ; CHECK-NEXT: ptrue p0.s, vl2
435 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
436 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
437 ; CHECK-NEXT: and z1.s, z1.s, #0xff
438 ; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s
439 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
441 %res = shl <2 x i8> %op1, %op2
445 define <4 x i8> @shl_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
446 ; CHECK-LABEL: shl_v4i8:
448 ; CHECK-NEXT: ptrue p0.h, vl4
449 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
450 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
451 ; CHECK-NEXT: and z1.h, z1.h, #0xff
452 ; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h
453 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
455 %res = shl <4 x i8> %op1, %op2
459 define <8 x i8> @shl_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
460 ; CHECK-LABEL: shl_v8i8:
462 ; CHECK-NEXT: ptrue p0.b, vl8
463 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
464 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
465 ; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b
466 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
468 %res = shl <8 x i8> %op1, %op2
472 define <16 x i8> @shl_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
473 ; CHECK-LABEL: shl_v16i8:
475 ; CHECK-NEXT: ptrue p0.b, vl16
476 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
477 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
478 ; CHECK-NEXT: lsl z0.b, p0/m, z0.b, z1.b
479 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
481 %res = shl <16 x i8> %op1, %op2
485 define void @shl_v32i8(ptr %a, ptr %b) {
486 ; CHECK-LABEL: shl_v32i8:
488 ; CHECK-NEXT: ptrue p0.b, vl16
489 ; CHECK-NEXT: ldp q0, q3, [x1]
490 ; CHECK-NEXT: ldp q1, q2, [x0]
491 ; CHECK-NEXT: lslr z0.b, p0/m, z0.b, z1.b
492 ; CHECK-NEXT: movprfx z1, z2
493 ; CHECK-NEXT: lsl z1.b, p0/m, z1.b, z3.b
494 ; CHECK-NEXT: stp q0, q1, [x0]
496 %op1 = load <32 x i8>, ptr %a
497 %op2 = load <32 x i8>, ptr %b
498 %res = shl <32 x i8> %op1, %op2
499 store <32 x i8> %res, ptr %a
503 define <4 x i16> @shl_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
504 ; CHECK-LABEL: shl_v4i16:
506 ; CHECK-NEXT: ptrue p0.h, vl4
507 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
508 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
509 ; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h
510 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
512 %res = shl <4 x i16> %op1, %op2
516 define <8 x i16> @shl_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
517 ; CHECK-LABEL: shl_v8i16:
519 ; CHECK-NEXT: ptrue p0.h, vl8
520 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
521 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
522 ; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h
523 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
525 %res = shl <8 x i16> %op1, %op2
529 define void @shl_v16i16(ptr %a, ptr %b) {
530 ; CHECK-LABEL: shl_v16i16:
532 ; CHECK-NEXT: ptrue p0.h, vl8
533 ; CHECK-NEXT: ldp q0, q3, [x1]
534 ; CHECK-NEXT: ldp q1, q2, [x0]
535 ; CHECK-NEXT: lslr z0.h, p0/m, z0.h, z1.h
536 ; CHECK-NEXT: movprfx z1, z2
537 ; CHECK-NEXT: lsl z1.h, p0/m, z1.h, z3.h
538 ; CHECK-NEXT: stp q0, q1, [x0]
540 %op1 = load <16 x i16>, ptr %a
541 %op2 = load <16 x i16>, ptr %b
542 %res = shl <16 x i16> %op1, %op2
543 store <16 x i16> %res, ptr %a
547 define <2 x i32> @shl_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
548 ; CHECK-LABEL: shl_v2i32:
550 ; CHECK-NEXT: ptrue p0.s, vl2
551 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
552 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
553 ; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s
554 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
556 %res = shl <2 x i32> %op1, %op2
560 define <4 x i32> @shl_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
561 ; CHECK-LABEL: shl_v4i32:
563 ; CHECK-NEXT: ptrue p0.s, vl4
564 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
565 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
566 ; CHECK-NEXT: lsl z0.s, p0/m, z0.s, z1.s
567 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
569 %res = shl <4 x i32> %op1, %op2
573 define void @shl_v8i32(ptr %a, ptr %b) {
574 ; CHECK-LABEL: shl_v8i32:
576 ; CHECK-NEXT: ptrue p0.s, vl4
577 ; CHECK-NEXT: ldp q0, q3, [x1]
578 ; CHECK-NEXT: ldp q1, q2, [x0]
579 ; CHECK-NEXT: lslr z0.s, p0/m, z0.s, z1.s
580 ; CHECK-NEXT: movprfx z1, z2
581 ; CHECK-NEXT: lsl z1.s, p0/m, z1.s, z3.s
582 ; CHECK-NEXT: stp q0, q1, [x0]
584 %op1 = load <8 x i32>, ptr %a
585 %op2 = load <8 x i32>, ptr %b
586 %res = shl <8 x i32> %op1, %op2
587 store <8 x i32> %res, ptr %a
591 define <1 x i64> @shl_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
592 ; CHECK-LABEL: shl_v1i64:
594 ; CHECK-NEXT: ptrue p0.d, vl1
595 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
596 ; CHECK-NEXT: // kill: def $d1 killed $d1 def $z1
597 ; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d
598 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
600 %res = shl <1 x i64> %op1, %op2
604 define <2 x i64> @shl_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
605 ; CHECK-LABEL: shl_v2i64:
607 ; CHECK-NEXT: ptrue p0.d, vl2
608 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
609 ; CHECK-NEXT: // kill: def $q1 killed $q1 def $z1
610 ; CHECK-NEXT: lsl z0.d, p0/m, z0.d, z1.d
611 ; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0
613 %res = shl <2 x i64> %op1, %op2
617 define void @shl_v4i64(ptr %a, ptr %b) {
618 ; CHECK-LABEL: shl_v4i64:
620 ; CHECK-NEXT: ptrue p0.d, vl2
621 ; CHECK-NEXT: ldp q0, q3, [x1]
622 ; CHECK-NEXT: ldp q1, q2, [x0]
623 ; CHECK-NEXT: lslr z0.d, p0/m, z0.d, z1.d
624 ; CHECK-NEXT: movprfx z1, z2
625 ; CHECK-NEXT: lsl z1.d, p0/m, z1.d, z3.d
626 ; CHECK-NEXT: stp q0, q1, [x0]
628 %op1 = load <4 x i64>, ptr %a
629 %op2 = load <4 x i64>, ptr %b
630 %res = shl <4 x i64> %op1, %op2
631 store <4 x i64> %res, ptr %a