[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-int-shifts.ll
blobc7fa0e8ad5e4ad2709ade188c9a620ca4273ce99
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"
8 ; ASHR
11 define <4 x i8> @ashr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
12 ; CHECK-LABEL: ashr_v4i8:
13 ; CHECK:       // %bb.0:
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
21 ; CHECK-NEXT:    ret
22   %res = ashr <4 x i8> %op1, %op2
23   ret <4 x i8> %res
26 define <8 x i8> @ashr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
27 ; CHECK-LABEL: ashr_v8i8:
28 ; CHECK:       // %bb.0:
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
34 ; CHECK-NEXT:    ret
35   %res = ashr <8 x i8> %op1, %op2
36   ret <8 x i8> %res
39 define <16 x i8> @ashr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
40 ; CHECK-LABEL: ashr_v16i8:
41 ; CHECK:       // %bb.0:
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
47 ; CHECK-NEXT:    ret
48   %res = ashr <16 x i8> %op1, %op2
49   ret <16 x i8> %res
52 define void @ashr_v32i8(ptr %a, ptr %b) {
53 ; CHECK-LABEL: ashr_v32i8:
54 ; CHECK:       // %bb.0:
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]
62 ; CHECK-NEXT:    ret
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
67   ret void
70 define <2 x i16> @ashr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
71 ; CHECK-LABEL: ashr_v2i16:
72 ; CHECK:       // %bb.0:
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
80 ; CHECK-NEXT:    ret
81   %res = ashr <2 x i16> %op1, %op2
82   ret <2 x i16> %res
85 define <4 x i16> @ashr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
86 ; CHECK-LABEL: ashr_v4i16:
87 ; CHECK:       // %bb.0:
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
93 ; CHECK-NEXT:    ret
94   %res = ashr <4 x i16> %op1, %op2
95   ret <4 x i16> %res
98 define <8 x i16> @ashr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
99 ; CHECK-LABEL: ashr_v8i16:
100 ; CHECK:       // %bb.0:
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
106 ; CHECK-NEXT:    ret
107   %res = ashr <8 x i16> %op1, %op2
108   ret <8 x i16> %res
111 define void @ashr_v16i16(ptr %a, ptr %b) {
112 ; CHECK-LABEL: ashr_v16i16:
113 ; CHECK:       // %bb.0:
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]
121 ; CHECK-NEXT:    ret
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
126   ret void
129 define <2 x i32> @ashr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
130 ; CHECK-LABEL: ashr_v2i32:
131 ; CHECK:       // %bb.0:
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
137 ; CHECK-NEXT:    ret
138   %res = ashr <2 x i32> %op1, %op2
139   ret <2 x i32> %res
142 define <4 x i32> @ashr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
143 ; CHECK-LABEL: ashr_v4i32:
144 ; CHECK:       // %bb.0:
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
150 ; CHECK-NEXT:    ret
151   %res = ashr <4 x i32> %op1, %op2
152   ret <4 x i32> %res
155 define void @ashr_v8i32(ptr %a, ptr %b) {
156 ; CHECK-LABEL: ashr_v8i32:
157 ; CHECK:       // %bb.0:
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]
165 ; CHECK-NEXT:    ret
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
170   ret void
173 define <1 x i64> @ashr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
174 ; CHECK-LABEL: ashr_v1i64:
175 ; CHECK:       // %bb.0:
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
181 ; CHECK-NEXT:    ret
182   %res = ashr <1 x i64> %op1, %op2
183   ret <1 x i64> %res
186 define <2 x i64> @ashr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
187 ; CHECK-LABEL: ashr_v2i64:
188 ; CHECK:       // %bb.0:
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
194 ; CHECK-NEXT:    ret
195   %res = ashr <2 x i64> %op1, %op2
196   ret <2 x i64> %res
199 define void @ashr_v4i64(ptr %a, ptr %b) {
200 ; CHECK-LABEL: ashr_v4i64:
201 ; CHECK:       // %bb.0:
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]
209 ; CHECK-NEXT:    ret
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
214   ret void
218 ; LSHR
221 define <4 x i8> @lshr_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
222 ; CHECK-LABEL: lshr_v4i8:
223 ; CHECK:       // %bb.0:
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
231 ; CHECK-NEXT:    ret
232   %res = lshr <4 x i8> %op1, %op2
233   ret <4 x i8> %res
236 define <8 x i8> @lshr_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
237 ; CHECK-LABEL: lshr_v8i8:
238 ; CHECK:       // %bb.0:
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
244 ; CHECK-NEXT:    ret
245   %res = lshr <8 x i8> %op1, %op2
246   ret <8 x i8> %res
249 define <16 x i8> @lshr_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
250 ; CHECK-LABEL: lshr_v16i8:
251 ; CHECK:       // %bb.0:
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
257 ; CHECK-NEXT:    ret
258   %res = lshr <16 x i8> %op1, %op2
259   ret <16 x i8> %res
262 define void @lshr_v32i8(ptr %a, ptr %b) {
263 ; CHECK-LABEL: lshr_v32i8:
264 ; CHECK:       // %bb.0:
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]
272 ; CHECK-NEXT:    ret
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
277   ret void
280 define <2 x i16> @lshr_v2i16(<2 x i16> %op1, <2 x i16> %op2) {
281 ; CHECK-LABEL: lshr_v2i16:
282 ; CHECK:       // %bb.0:
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
290 ; CHECK-NEXT:    ret
291   %res = lshr <2 x i16> %op1, %op2
292   ret <2 x i16> %res
295 define <4 x i16> @lshr_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
296 ; CHECK-LABEL: lshr_v4i16:
297 ; CHECK:       // %bb.0:
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
303 ; CHECK-NEXT:    ret
304   %res = lshr <4 x i16> %op1, %op2
305   ret <4 x i16> %res
308 define <8 x i16> @lshr_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
309 ; CHECK-LABEL: lshr_v8i16:
310 ; CHECK:       // %bb.0:
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
316 ; CHECK-NEXT:    ret
317   %res = lshr <8 x i16> %op1, %op2
318   ret <8 x i16> %res
321 define void @lshr_v16i16(ptr %a, ptr %b) {
322 ; CHECK-LABEL: lshr_v16i16:
323 ; CHECK:       // %bb.0:
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]
331 ; CHECK-NEXT:    ret
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
336   ret void
339 define <2 x i32> @lshr_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
340 ; CHECK-LABEL: lshr_v2i32:
341 ; CHECK:       // %bb.0:
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
347 ; CHECK-NEXT:    ret
348   %res = lshr <2 x i32> %op1, %op2
349   ret <2 x i32> %res
352 define <4 x i32> @lshr_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
353 ; CHECK-LABEL: lshr_v4i32:
354 ; CHECK:       // %bb.0:
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
360 ; CHECK-NEXT:    ret
361   %res = lshr <4 x i32> %op1, %op2
362   ret <4 x i32> %res
365 define void @lshr_v8i32(ptr %a, ptr %b) {
366 ; CHECK-LABEL: lshr_v8i32:
367 ; CHECK:       // %bb.0:
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]
375 ; CHECK-NEXT:    ret
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
380   ret void
383 define <1 x i64> @lshr_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
384 ; CHECK-LABEL: lshr_v1i64:
385 ; CHECK:       // %bb.0:
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
391 ; CHECK-NEXT:    ret
392   %res = lshr <1 x i64> %op1, %op2
393   ret <1 x i64> %res
396 define <2 x i64> @lshr_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
397 ; CHECK-LABEL: lshr_v2i64:
398 ; CHECK:       // %bb.0:
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
404 ; CHECK-NEXT:    ret
405   %res = lshr <2 x i64> %op1, %op2
406   ret <2 x i64> %res
409 define void @lshr_v4i64(ptr %a, ptr %b) {
410 ; CHECK-LABEL: lshr_v4i64:
411 ; CHECK:       // %bb.0:
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]
419 ; CHECK-NEXT:    ret
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
424   ret void
428 ; SHL
431 define <2 x i8> @shl_v2i8(<2 x i8> %op1, <2 x i8> %op2) {
432 ; CHECK-LABEL: shl_v2i8:
433 ; CHECK:       // %bb.0:
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
440 ; CHECK-NEXT:    ret
441   %res = shl <2 x i8> %op1, %op2
442   ret <2 x i8> %res
445 define <4 x i8> @shl_v4i8(<4 x i8> %op1, <4 x i8> %op2) {
446 ; CHECK-LABEL: shl_v4i8:
447 ; CHECK:       // %bb.0:
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
454 ; CHECK-NEXT:    ret
455   %res = shl <4 x i8> %op1, %op2
456   ret <4 x i8> %res
459 define <8 x i8> @shl_v8i8(<8 x i8> %op1, <8 x i8> %op2) {
460 ; CHECK-LABEL: shl_v8i8:
461 ; CHECK:       // %bb.0:
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
467 ; CHECK-NEXT:    ret
468   %res = shl <8 x i8> %op1, %op2
469   ret <8 x i8> %res
472 define <16 x i8> @shl_v16i8(<16 x i8> %op1, <16 x i8> %op2) {
473 ; CHECK-LABEL: shl_v16i8:
474 ; CHECK:       // %bb.0:
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
480 ; CHECK-NEXT:    ret
481   %res = shl <16 x i8> %op1, %op2
482   ret <16 x i8> %res
485 define void @shl_v32i8(ptr %a, ptr %b) {
486 ; CHECK-LABEL: shl_v32i8:
487 ; CHECK:       // %bb.0:
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]
495 ; CHECK-NEXT:    ret
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
500   ret void
503 define <4 x i16> @shl_v4i16(<4 x i16> %op1, <4 x i16> %op2) {
504 ; CHECK-LABEL: shl_v4i16:
505 ; CHECK:       // %bb.0:
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
511 ; CHECK-NEXT:    ret
512   %res = shl <4 x i16> %op1, %op2
513   ret <4 x i16> %res
516 define <8 x i16> @shl_v8i16(<8 x i16> %op1, <8 x i16> %op2) {
517 ; CHECK-LABEL: shl_v8i16:
518 ; CHECK:       // %bb.0:
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
524 ; CHECK-NEXT:    ret
525   %res = shl <8 x i16> %op1, %op2
526   ret <8 x i16> %res
529 define void @shl_v16i16(ptr %a, ptr %b) {
530 ; CHECK-LABEL: shl_v16i16:
531 ; CHECK:       // %bb.0:
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]
539 ; CHECK-NEXT:    ret
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
544   ret void
547 define <2 x i32> @shl_v2i32(<2 x i32> %op1, <2 x i32> %op2) {
548 ; CHECK-LABEL: shl_v2i32:
549 ; CHECK:       // %bb.0:
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
555 ; CHECK-NEXT:    ret
556   %res = shl <2 x i32> %op1, %op2
557   ret <2 x i32> %res
560 define <4 x i32> @shl_v4i32(<4 x i32> %op1, <4 x i32> %op2) {
561 ; CHECK-LABEL: shl_v4i32:
562 ; CHECK:       // %bb.0:
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
568 ; CHECK-NEXT:    ret
569   %res = shl <4 x i32> %op1, %op2
570   ret <4 x i32> %res
573 define void @shl_v8i32(ptr %a, ptr %b) {
574 ; CHECK-LABEL: shl_v8i32:
575 ; CHECK:       // %bb.0:
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]
583 ; CHECK-NEXT:    ret
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
588   ret void
591 define <1 x i64> @shl_v1i64(<1 x i64> %op1, <1 x i64> %op2) {
592 ; CHECK-LABEL: shl_v1i64:
593 ; CHECK:       // %bb.0:
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
599 ; CHECK-NEXT:    ret
600   %res = shl <1 x i64> %op1, %op2
601   ret <1 x i64> %res
604 define <2 x i64> @shl_v2i64(<2 x i64> %op1, <2 x i64> %op2) {
605 ; CHECK-LABEL: shl_v2i64:
606 ; CHECK:       // %bb.0:
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
612 ; CHECK-NEXT:    ret
613   %res = shl <2 x i64> %op1, %op2
614   ret <2 x i64> %res
617 define void @shl_v4i64(ptr %a, ptr %b) {
618 ; CHECK-LABEL: shl_v4i64:
619 ; CHECK:       // %bb.0:
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]
627 ; CHECK-NEXT:    ret
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
632   ret void