1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2 ; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 define i1 @shl_i1(i1 %0, i1 %1){
6 ; CHECK-SD-LABEL: shl_i1:
8 ; CHECK-SD-NEXT: and w0, w0, #0x1
11 ; CHECK-GI-LABEL: shl_i1:
13 ; CHECK-GI-NEXT: and w8, w1, #0x1
14 ; CHECK-GI-NEXT: lsl w8, w0, w8
15 ; CHECK-GI-NEXT: and w0, w8, #0x1
21 define i8 @shl_i8(i8 %0, i8 %1){
22 ; CHECK-SD-LABEL: shl_i8:
24 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
25 ; CHECK-SD-NEXT: lsl w0, w0, w1
28 ; CHECK-GI-LABEL: shl_i8:
30 ; CHECK-GI-NEXT: and w8, w1, #0xff
31 ; CHECK-GI-NEXT: lsl w0, w0, w8
37 define i16 @shl_i16(i16 %0, i16 %1){
38 ; CHECK-SD-LABEL: shl_i16:
40 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
41 ; CHECK-SD-NEXT: lsl w0, w0, w1
44 ; CHECK-GI-LABEL: shl_i16:
46 ; CHECK-GI-NEXT: and w8, w1, #0xffff
47 ; CHECK-GI-NEXT: lsl w0, w0, w8
53 define i32 @shl_i32(i32 %0, i32 %1){
54 ; CHECK-LABEL: shl_i32:
56 ; CHECK-NEXT: lsl w0, w0, w1
62 define i64 @shl_i64(i64 %0, i64 %1){
63 ; CHECK-LABEL: shl_i64:
65 ; CHECK-NEXT: lsl x0, x0, x1
71 define i128 @shl_i128(i128 %0, i128 %1){
72 ; CHECK-SD-LABEL: shl_i128:
74 ; CHECK-SD-NEXT: lsr x8, x0, #1
75 ; CHECK-SD-NEXT: mvn w9, w2
76 ; CHECK-SD-NEXT: lsl x10, x1, x2
77 ; CHECK-SD-NEXT: tst x2, #0x40
78 ; CHECK-SD-NEXT: lsr x8, x8, x9
79 ; CHECK-SD-NEXT: lsl x9, x0, x2
80 ; CHECK-SD-NEXT: orr x8, x10, x8
81 ; CHECK-SD-NEXT: csel x0, xzr, x9, ne
82 ; CHECK-SD-NEXT: csel x1, x9, x8, ne
85 ; CHECK-GI-LABEL: shl_i128:
87 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
88 ; CHECK-GI-NEXT: sub x9, x2, #64
89 ; CHECK-GI-NEXT: lsl x10, x1, x2
90 ; CHECK-GI-NEXT: sub x8, x8, x2
91 ; CHECK-GI-NEXT: lsl x11, x0, x2
92 ; CHECK-GI-NEXT: lsl x9, x0, x9
93 ; CHECK-GI-NEXT: lsr x8, x0, x8
94 ; CHECK-GI-NEXT: cmp x2, #64
95 ; CHECK-GI-NEXT: csel x0, x11, xzr, lo
96 ; CHECK-GI-NEXT: orr x8, x8, x10
97 ; CHECK-GI-NEXT: csel x8, x8, x9, lo
98 ; CHECK-GI-NEXT: cmp x2, #0
99 ; CHECK-GI-NEXT: csel x1, x1, x8, eq
105 define i1 @ashr_i1(i1 %0, i1 %1){
106 ; CHECK-SD-LABEL: ashr_i1:
107 ; CHECK-SD: // %bb.0:
108 ; CHECK-SD-NEXT: and w0, w0, #0x1
111 ; CHECK-GI-LABEL: ashr_i1:
112 ; CHECK-GI: // %bb.0:
113 ; CHECK-GI-NEXT: sbfx w8, w0, #0, #1
114 ; CHECK-GI-NEXT: and w9, w1, #0x1
115 ; CHECK-GI-NEXT: asr w8, w8, w9
116 ; CHECK-GI-NEXT: and w0, w8, #0x1
122 define i8 @ashr_i8(i8 %0, i8 %1){
123 ; CHECK-SD-LABEL: ashr_i8:
124 ; CHECK-SD: // %bb.0:
125 ; CHECK-SD-NEXT: sxtb w8, w0
126 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
127 ; CHECK-SD-NEXT: asr w0, w8, w1
130 ; CHECK-GI-LABEL: ashr_i8:
131 ; CHECK-GI: // %bb.0:
132 ; CHECK-GI-NEXT: sxtb w8, w0
133 ; CHECK-GI-NEXT: and w9, w1, #0xff
134 ; CHECK-GI-NEXT: asr w0, w8, w9
140 define i16 @ashr_i16(i16 %0, i16 %1){
141 ; CHECK-SD-LABEL: ashr_i16:
142 ; CHECK-SD: // %bb.0:
143 ; CHECK-SD-NEXT: sxth w8, w0
144 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
145 ; CHECK-SD-NEXT: asr w0, w8, w1
148 ; CHECK-GI-LABEL: ashr_i16:
149 ; CHECK-GI: // %bb.0:
150 ; CHECK-GI-NEXT: sxth w8, w0
151 ; CHECK-GI-NEXT: and w9, w1, #0xffff
152 ; CHECK-GI-NEXT: asr w0, w8, w9
158 define i32 @ashr_i32(i32 %0, i32 %1){
159 ; CHECK-LABEL: ashr_i32:
161 ; CHECK-NEXT: asr w0, w0, w1
167 define i64 @ashr_i64(i64 %0, i64 %1){
168 ; CHECK-LABEL: ashr_i64:
170 ; CHECK-NEXT: asr x0, x0, x1
176 define i128 @ashr_i128(i128 %0, i128 %1){
177 ; CHECK-SD-LABEL: ashr_i128:
178 ; CHECK-SD: // %bb.0:
179 ; CHECK-SD-NEXT: lsl x8, x1, #1
180 ; CHECK-SD-NEXT: mvn w9, w2
181 ; CHECK-SD-NEXT: lsr x10, x0, x2
182 ; CHECK-SD-NEXT: asr x11, x1, #63
183 ; CHECK-SD-NEXT: tst x2, #0x40
184 ; CHECK-SD-NEXT: lsl x8, x8, x9
185 ; CHECK-SD-NEXT: asr x9, x1, x2
186 ; CHECK-SD-NEXT: orr x8, x8, x10
187 ; CHECK-SD-NEXT: csel x1, x11, x9, ne
188 ; CHECK-SD-NEXT: csel x0, x9, x8, ne
191 ; CHECK-GI-LABEL: ashr_i128:
192 ; CHECK-GI: // %bb.0:
193 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
194 ; CHECK-GI-NEXT: sub x9, x2, #64
195 ; CHECK-GI-NEXT: lsr x10, x0, x2
196 ; CHECK-GI-NEXT: sub x8, x8, x2
197 ; CHECK-GI-NEXT: asr x9, x1, x9
198 ; CHECK-GI-NEXT: cmp x2, #64
199 ; CHECK-GI-NEXT: lsl x8, x1, x8
200 ; CHECK-GI-NEXT: asr x11, x1, x2
201 ; CHECK-GI-NEXT: orr x8, x10, x8
202 ; CHECK-GI-NEXT: asr x10, x1, #63
203 ; CHECK-GI-NEXT: csel x8, x8, x9, lo
204 ; CHECK-GI-NEXT: cmp x2, #0
205 ; CHECK-GI-NEXT: csel x0, x0, x8, eq
206 ; CHECK-GI-NEXT: cmp x2, #64
207 ; CHECK-GI-NEXT: csel x1, x11, x10, lo
209 %3 = ashr i128 %0, %1
213 define i1 @lshr_i1(i1 %0, i1 %1){
214 ; CHECK-SD-LABEL: lshr_i1:
215 ; CHECK-SD: // %bb.0:
216 ; CHECK-SD-NEXT: and w0, w0, #0x1
219 ; CHECK-GI-LABEL: lshr_i1:
220 ; CHECK-GI: // %bb.0:
221 ; CHECK-GI-NEXT: and w8, w1, #0x1
222 ; CHECK-GI-NEXT: and w9, w0, #0x1
223 ; CHECK-GI-NEXT: lsr w0, w9, w8
229 define i8 @lshr_i8(i8 %0, i8 %1){
230 ; CHECK-SD-LABEL: lshr_i8:
231 ; CHECK-SD: // %bb.0:
232 ; CHECK-SD-NEXT: and w8, w0, #0xff
233 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
234 ; CHECK-SD-NEXT: lsr w0, w8, w1
237 ; CHECK-GI-LABEL: lshr_i8:
238 ; CHECK-GI: // %bb.0:
239 ; CHECK-GI-NEXT: and w8, w1, #0xff
240 ; CHECK-GI-NEXT: and w9, w0, #0xff
241 ; CHECK-GI-NEXT: lsr w0, w9, w8
247 define i16 @lshr_i16(i16 %0, i16 %1){
248 ; CHECK-SD-LABEL: lshr_i16:
249 ; CHECK-SD: // %bb.0:
250 ; CHECK-SD-NEXT: and w8, w0, #0xffff
251 ; CHECK-SD-NEXT: // kill: def $w1 killed $w1 def $x1
252 ; CHECK-SD-NEXT: lsr w0, w8, w1
255 ; CHECK-GI-LABEL: lshr_i16:
256 ; CHECK-GI: // %bb.0:
257 ; CHECK-GI-NEXT: and w8, w1, #0xffff
258 ; CHECK-GI-NEXT: and w9, w0, #0xffff
259 ; CHECK-GI-NEXT: lsr w0, w9, w8
265 define i32 @lshr_i32(i32 %0, i32 %1){
266 ; CHECK-LABEL: lshr_i32:
268 ; CHECK-NEXT: lsr w0, w0, w1
274 define i64 @lshr_i64(i64 %0, i64 %1){
275 ; CHECK-LABEL: lshr_i64:
277 ; CHECK-NEXT: lsr x0, x0, x1
283 define i128 @lshr_i128(i128 %0, i128 %1){
284 ; CHECK-SD-LABEL: lshr_i128:
285 ; CHECK-SD: // %bb.0:
286 ; CHECK-SD-NEXT: lsl x8, x1, #1
287 ; CHECK-SD-NEXT: mvn w9, w2
288 ; CHECK-SD-NEXT: lsr x10, x0, x2
289 ; CHECK-SD-NEXT: tst x2, #0x40
290 ; CHECK-SD-NEXT: lsl x8, x8, x9
291 ; CHECK-SD-NEXT: lsr x9, x1, x2
292 ; CHECK-SD-NEXT: orr x8, x8, x10
293 ; CHECK-SD-NEXT: csel x1, xzr, x9, ne
294 ; CHECK-SD-NEXT: csel x0, x9, x8, ne
297 ; CHECK-GI-LABEL: lshr_i128:
298 ; CHECK-GI: // %bb.0:
299 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
300 ; CHECK-GI-NEXT: sub x9, x2, #64
301 ; CHECK-GI-NEXT: lsr x10, x0, x2
302 ; CHECK-GI-NEXT: sub x8, x8, x2
303 ; CHECK-GI-NEXT: lsr x9, x1, x9
304 ; CHECK-GI-NEXT: cmp x2, #64
305 ; CHECK-GI-NEXT: lsl x8, x1, x8
306 ; CHECK-GI-NEXT: orr x8, x10, x8
307 ; CHECK-GI-NEXT: lsr x10, x1, x2
308 ; CHECK-GI-NEXT: csel x8, x8, x9, lo
309 ; CHECK-GI-NEXT: cmp x2, #0
310 ; CHECK-GI-NEXT: csel x0, x0, x8, eq
311 ; CHECK-GI-NEXT: cmp x2, #64
312 ; CHECK-GI-NEXT: csel x1, x10, xzr, lo
314 %3 = lshr i128 %0, %1
318 ; ===== Legal Vector Type =====
320 define <8 x i8> @shl_v8i8(<8 x i8> %0, <8 x i8> %1){
321 ; CHECK-LABEL: shl_v8i8:
323 ; CHECK-NEXT: ushl v0.8b, v0.8b, v1.8b
325 %3 = shl <8 x i8> %0, %1
329 define <16 x i8> @shl_v16i8(<16 x i8> %0, <16 x i8> %1){
330 ; CHECK-LABEL: shl_v16i8:
332 ; CHECK-NEXT: ushl v0.16b, v0.16b, v1.16b
334 %3 = shl <16 x i8> %0, %1
338 define <4 x i16> @shl_v4i16(<4 x i16> %0, <4 x i16> %1){
339 ; CHECK-LABEL: shl_v4i16:
341 ; CHECK-NEXT: ushl v0.4h, v0.4h, v1.4h
343 %3 = shl <4 x i16> %0, %1
347 define <8 x i16> @shl_v8i16(<8 x i16> %0, <8 x i16> %1){
348 ; CHECK-LABEL: shl_v8i16:
350 ; CHECK-NEXT: ushl v0.8h, v0.8h, v1.8h
352 %3 = shl <8 x i16> %0, %1
356 define <2 x i32> @shl_v2i32(<2 x i32> %0, <2 x i32> %1){
357 ; CHECK-LABEL: shl_v2i32:
359 ; CHECK-NEXT: ushl v0.2s, v0.2s, v1.2s
361 %3 = shl <2 x i32> %0, %1
365 define <4 x i32> @shl_v4i32(<4 x i32> %0, <4 x i32> %1){
366 ; CHECK-LABEL: shl_v4i32:
368 ; CHECK-NEXT: ushl v0.4s, v0.4s, v1.4s
370 %3 = shl <4 x i32> %0, %1
374 define <2 x i64> @shl_v2i64(<2 x i64> %0, <2 x i64> %1){
375 ; CHECK-LABEL: shl_v2i64:
377 ; CHECK-NEXT: ushl v0.2d, v0.2d, v1.2d
379 %3 = shl <2 x i64> %0, %1
383 define <8 x i8> @ashr_v8i8(<8 x i8> %0, <8 x i8> %1){
384 ; CHECK-LABEL: ashr_v8i8:
386 ; CHECK-NEXT: neg v1.8b, v1.8b
387 ; CHECK-NEXT: sshl v0.8b, v0.8b, v1.8b
389 %3 = ashr <8 x i8> %0, %1
393 define <16 x i8> @ashr_v16i8(<16 x i8> %0, <16 x i8> %1){
394 ; CHECK-LABEL: ashr_v16i8:
396 ; CHECK-NEXT: neg v1.16b, v1.16b
397 ; CHECK-NEXT: sshl v0.16b, v0.16b, v1.16b
399 %3 = ashr <16 x i8> %0, %1
403 define <4 x i16> @ashr_v4i16(<4 x i16> %0, <4 x i16> %1){
404 ; CHECK-LABEL: ashr_v4i16:
406 ; CHECK-NEXT: neg v1.4h, v1.4h
407 ; CHECK-NEXT: sshl v0.4h, v0.4h, v1.4h
409 %3 = ashr <4 x i16> %0, %1
413 define <8 x i16> @ashr_v8i16(<8 x i16> %0, <8 x i16> %1){
414 ; CHECK-LABEL: ashr_v8i16:
416 ; CHECK-NEXT: neg v1.8h, v1.8h
417 ; CHECK-NEXT: sshl v0.8h, v0.8h, v1.8h
419 %3 = ashr <8 x i16> %0, %1
423 define <2 x i32> @ashr_v2i32(<2 x i32> %0, <2 x i32> %1){
424 ; CHECK-LABEL: ashr_v2i32:
426 ; CHECK-NEXT: neg v1.2s, v1.2s
427 ; CHECK-NEXT: sshl v0.2s, v0.2s, v1.2s
429 %3 = ashr <2 x i32> %0, %1
433 define <4 x i32> @ashr_v4i32(<4 x i32> %0, <4 x i32> %1){
434 ; CHECK-LABEL: ashr_v4i32:
436 ; CHECK-NEXT: neg v1.4s, v1.4s
437 ; CHECK-NEXT: sshl v0.4s, v0.4s, v1.4s
439 %3 = ashr <4 x i32> %0, %1
443 define <2 x i64> @ashr_v2i64(<2 x i64> %0, <2 x i64> %1){
444 ; CHECK-LABEL: ashr_v2i64:
446 ; CHECK-NEXT: neg v1.2d, v1.2d
447 ; CHECK-NEXT: sshl v0.2d, v0.2d, v1.2d
449 %3 = ashr <2 x i64> %0, %1
453 define <8 x i8> @lshr_v8i8(<8 x i8> %0, <8 x i8> %1){
454 ; CHECK-LABEL: lshr_v8i8:
456 ; CHECK-NEXT: neg v1.8b, v1.8b
457 ; CHECK-NEXT: ushl v0.8b, v0.8b, v1.8b
459 %3 = lshr <8 x i8> %0, %1
463 define <16 x i8> @lshr_v16i8(<16 x i8> %0, <16 x i8> %1){
464 ; CHECK-LABEL: lshr_v16i8:
466 ; CHECK-NEXT: neg v1.16b, v1.16b
467 ; CHECK-NEXT: ushl v0.16b, v0.16b, v1.16b
469 %3 = lshr <16 x i8> %0, %1
473 define <4 x i16> @lshr_v4i16(<4 x i16> %0, <4 x i16> %1){
474 ; CHECK-LABEL: lshr_v4i16:
476 ; CHECK-NEXT: neg v1.4h, v1.4h
477 ; CHECK-NEXT: ushl v0.4h, v0.4h, v1.4h
479 %3 = lshr <4 x i16> %0, %1
483 define <8 x i16> @lshr_v8i16(<8 x i16> %0, <8 x i16> %1){
484 ; CHECK-LABEL: lshr_v8i16:
486 ; CHECK-NEXT: neg v1.8h, v1.8h
487 ; CHECK-NEXT: ushl v0.8h, v0.8h, v1.8h
489 %3 = lshr <8 x i16> %0, %1
493 define <2 x i32> @lshr_v2i32(<2 x i32> %0, <2 x i32> %1){
494 ; CHECK-LABEL: lshr_v2i32:
496 ; CHECK-NEXT: neg v1.2s, v1.2s
497 ; CHECK-NEXT: ushl v0.2s, v0.2s, v1.2s
499 %3 = lshr <2 x i32> %0, %1
503 define <4 x i32> @lshr_v4i32(<4 x i32> %0, <4 x i32> %1){
504 ; CHECK-LABEL: lshr_v4i32:
506 ; CHECK-NEXT: neg v1.4s, v1.4s
507 ; CHECK-NEXT: ushl v0.4s, v0.4s, v1.4s
509 %3 = lshr <4 x i32> %0, %1
513 define <2 x i64> @lshr_v2i64(<2 x i64> %0, <2 x i64> %1){
514 ; CHECK-LABEL: lshr_v2i64:
516 ; CHECK-NEXT: neg v1.2d, v1.2d
517 ; CHECK-NEXT: ushl v0.2d, v0.2d, v1.2d
519 %3 = lshr <2 x i64> %0, %1
523 ; ===== Vector Larger/Smaller than Legal =====
525 define <4 x i8> @shl_v4i8(<4 x i8> %0, <4 x i8> %1){
526 ; CHECK-SD-LABEL: shl_v4i8:
527 ; CHECK-SD: // %bb.0:
528 ; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8
529 ; CHECK-SD-NEXT: ushl v0.4h, v0.4h, v1.4h
532 ; CHECK-GI-LABEL: shl_v4i8:
533 ; CHECK-GI: // %bb.0:
534 ; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
535 ; CHECK-GI-NEXT: uzp1 v1.8b, v1.8b, v0.8b
536 ; CHECK-GI-NEXT: ushl v0.8b, v0.8b, v1.8b
537 ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
538 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
540 %3 = shl <4 x i8> %0, %1
544 define <32 x i8> @shl_v32i8(<32 x i8> %0, <32 x i8> %1){
545 ; CHECK-SD-LABEL: shl_v32i8:
546 ; CHECK-SD: // %bb.0:
547 ; CHECK-SD-NEXT: ushl v1.16b, v1.16b, v3.16b
548 ; CHECK-SD-NEXT: ushl v0.16b, v0.16b, v2.16b
551 ; CHECK-GI-LABEL: shl_v32i8:
552 ; CHECK-GI: // %bb.0:
553 ; CHECK-GI-NEXT: ushl v0.16b, v0.16b, v2.16b
554 ; CHECK-GI-NEXT: ushl v1.16b, v1.16b, v3.16b
556 %3 = shl <32 x i8> %0, %1
560 define <2 x i16> @shl_v2i16(<2 x i16> %0, <2 x i16> %1){
561 ; CHECK-SD-LABEL: shl_v2i16:
562 ; CHECK-SD: // %bb.0:
563 ; CHECK-SD-NEXT: movi d2, #0x00ffff0000ffff
564 ; CHECK-SD-NEXT: and v1.8b, v1.8b, v2.8b
565 ; CHECK-SD-NEXT: ushl v0.2s, v0.2s, v1.2s
568 ; CHECK-GI-LABEL: shl_v2i16:
569 ; CHECK-GI: // %bb.0:
570 ; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
571 ; CHECK-GI-NEXT: uzp1 v1.4h, v1.4h, v0.4h
572 ; CHECK-GI-NEXT: ushl v0.4h, v0.4h, v1.4h
573 ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
574 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
576 %3 = shl <2 x i16> %0, %1
580 define <16 x i16> @shl_v16i16(<16 x i16> %0, <16 x i16> %1){
581 ; CHECK-SD-LABEL: shl_v16i16:
582 ; CHECK-SD: // %bb.0:
583 ; CHECK-SD-NEXT: ushl v1.8h, v1.8h, v3.8h
584 ; CHECK-SD-NEXT: ushl v0.8h, v0.8h, v2.8h
587 ; CHECK-GI-LABEL: shl_v16i16:
588 ; CHECK-GI: // %bb.0:
589 ; CHECK-GI-NEXT: ushl v0.8h, v0.8h, v2.8h
590 ; CHECK-GI-NEXT: ushl v1.8h, v1.8h, v3.8h
592 %3 = shl <16 x i16> %0, %1
596 define <1 x i32> @shl_v1i32(<1 x i32> %0, <1 x i32> %1){
597 ; CHECK-SD-LABEL: shl_v1i32:
598 ; CHECK-SD: // %bb.0:
599 ; CHECK-SD-NEXT: ushl v0.2s, v0.2s, v1.2s
602 ; CHECK-GI-LABEL: shl_v1i32:
603 ; CHECK-GI: // %bb.0:
604 ; CHECK-GI-NEXT: fmov w8, s0
605 ; CHECK-GI-NEXT: fmov w9, s1
606 ; CHECK-GI-NEXT: lsl w8, w8, w9
607 ; CHECK-GI-NEXT: mov v0.s[0], w8
608 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
610 %3 = shl <1 x i32> %0, %1
614 define <8 x i32> @shl_v8i32(<8 x i32> %0, <8 x i32> %1){
615 ; CHECK-SD-LABEL: shl_v8i32:
616 ; CHECK-SD: // %bb.0:
617 ; CHECK-SD-NEXT: ushl v1.4s, v1.4s, v3.4s
618 ; CHECK-SD-NEXT: ushl v0.4s, v0.4s, v2.4s
621 ; CHECK-GI-LABEL: shl_v8i32:
622 ; CHECK-GI: // %bb.0:
623 ; CHECK-GI-NEXT: ushl v0.4s, v0.4s, v2.4s
624 ; CHECK-GI-NEXT: ushl v1.4s, v1.4s, v3.4s
626 %3 = shl <8 x i32> %0, %1
630 define <4 x i64> @shl_v4i64(<4 x i64> %0, <4 x i64> %1){
631 ; CHECK-SD-LABEL: shl_v4i64:
632 ; CHECK-SD: // %bb.0:
633 ; CHECK-SD-NEXT: ushl v1.2d, v1.2d, v3.2d
634 ; CHECK-SD-NEXT: ushl v0.2d, v0.2d, v2.2d
637 ; CHECK-GI-LABEL: shl_v4i64:
638 ; CHECK-GI: // %bb.0:
639 ; CHECK-GI-NEXT: ushl v0.2d, v0.2d, v2.2d
640 ; CHECK-GI-NEXT: ushl v1.2d, v1.2d, v3.2d
642 %3 = shl <4 x i64> %0, %1
646 define <2 x i128> @shl_v2i128(<2 x i128> %0, <2 x i128> %1){
647 ; CHECK-SD-LABEL: shl_v2i128:
648 ; CHECK-SD: // %bb.0:
649 ; CHECK-SD-NEXT: lsr x8, x0, #1
650 ; CHECK-SD-NEXT: mvn w9, w4
651 ; CHECK-SD-NEXT: lsl x10, x1, x4
652 ; CHECK-SD-NEXT: mvn w12, w6
653 ; CHECK-SD-NEXT: lsl x11, x0, x4
654 ; CHECK-SD-NEXT: lsl x13, x3, x6
655 ; CHECK-SD-NEXT: lsr x8, x8, x9
656 ; CHECK-SD-NEXT: lsr x9, x2, #1
657 ; CHECK-SD-NEXT: tst x4, #0x40
658 ; CHECK-SD-NEXT: csel x0, xzr, x11, ne
659 ; CHECK-SD-NEXT: lsr x9, x9, x12
660 ; CHECK-SD-NEXT: orr x8, x10, x8
661 ; CHECK-SD-NEXT: lsl x10, x2, x6
662 ; CHECK-SD-NEXT: csel x1, x11, x8, ne
663 ; CHECK-SD-NEXT: tst x6, #0x40
664 ; CHECK-SD-NEXT: orr x8, x13, x9
665 ; CHECK-SD-NEXT: csel x2, xzr, x10, ne
666 ; CHECK-SD-NEXT: csel x3, x10, x8, ne
669 ; CHECK-GI-LABEL: shl_v2i128:
670 ; CHECK-GI: // %bb.0:
671 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
672 ; CHECK-GI-NEXT: sub x10, x4, #64
673 ; CHECK-GI-NEXT: lsl x11, x1, x4
674 ; CHECK-GI-NEXT: sub x9, x8, x4
675 ; CHECK-GI-NEXT: lsl x10, x0, x10
676 ; CHECK-GI-NEXT: lsl x12, x0, x4
677 ; CHECK-GI-NEXT: lsr x9, x0, x9
678 ; CHECK-GI-NEXT: cmp x4, #64
679 ; CHECK-GI-NEXT: sub x8, x8, x6
680 ; CHECK-GI-NEXT: lsr x8, x2, x8
681 ; CHECK-GI-NEXT: csel x0, x12, xzr, lo
682 ; CHECK-GI-NEXT: lsl x12, x2, x6
683 ; CHECK-GI-NEXT: orr x9, x9, x11
684 ; CHECK-GI-NEXT: lsl x11, x3, x6
685 ; CHECK-GI-NEXT: csel x9, x9, x10, lo
686 ; CHECK-GI-NEXT: sub x10, x6, #64
687 ; CHECK-GI-NEXT: cmp x4, #0
688 ; CHECK-GI-NEXT: lsl x10, x2, x10
689 ; CHECK-GI-NEXT: csel x1, x1, x9, eq
690 ; CHECK-GI-NEXT: orr x8, x8, x11
691 ; CHECK-GI-NEXT: cmp x6, #64
692 ; CHECK-GI-NEXT: csel x2, x12, xzr, lo
693 ; CHECK-GI-NEXT: csel x8, x8, x10, lo
694 ; CHECK-GI-NEXT: cmp x6, #0
695 ; CHECK-GI-NEXT: csel x3, x3, x8, eq
697 %3 = shl <2 x i128> %0, %1
701 define <4 x i8> @ashr_v4i8(<4 x i8> %0, <4 x i8> %1){
702 ; CHECK-SD-LABEL: ashr_v4i8:
703 ; CHECK-SD: // %bb.0:
704 ; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8
705 ; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8
706 ; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8
707 ; CHECK-SD-NEXT: neg v1.4h, v1.4h
708 ; CHECK-SD-NEXT: sshl v0.4h, v0.4h, v1.4h
711 ; CHECK-GI-LABEL: ashr_v4i8:
712 ; CHECK-GI: // %bb.0:
713 ; CHECK-GI-NEXT: uzp1 v1.8b, v1.8b, v0.8b
714 ; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
715 ; CHECK-GI-NEXT: neg v1.8b, v1.8b
716 ; CHECK-GI-NEXT: sshl v0.8b, v0.8b, v1.8b
717 ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
718 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
720 %3 = ashr <4 x i8> %0, %1
724 define <32 x i8> @ashr_v32i8(<32 x i8> %0, <32 x i8> %1){
725 ; CHECK-LABEL: ashr_v32i8:
727 ; CHECK-NEXT: neg v2.16b, v2.16b
728 ; CHECK-NEXT: neg v3.16b, v3.16b
729 ; CHECK-NEXT: sshl v0.16b, v0.16b, v2.16b
730 ; CHECK-NEXT: sshl v1.16b, v1.16b, v3.16b
732 %3 = ashr <32 x i8> %0, %1
736 define <2 x i16> @ashr_v2i16(<2 x i16> %0, <2 x i16> %1){
737 ; CHECK-SD-LABEL: ashr_v2i16:
738 ; CHECK-SD: // %bb.0:
739 ; CHECK-SD-NEXT: movi d2, #0x00ffff0000ffff
740 ; CHECK-SD-NEXT: shl v0.2s, v0.2s, #16
741 ; CHECK-SD-NEXT: sshr v0.2s, v0.2s, #16
742 ; CHECK-SD-NEXT: and v1.8b, v1.8b, v2.8b
743 ; CHECK-SD-NEXT: neg v1.2s, v1.2s
744 ; CHECK-SD-NEXT: sshl v0.2s, v0.2s, v1.2s
747 ; CHECK-GI-LABEL: ashr_v2i16:
748 ; CHECK-GI: // %bb.0:
749 ; CHECK-GI-NEXT: uzp1 v1.4h, v1.4h, v0.4h
750 ; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
751 ; CHECK-GI-NEXT: neg v1.4h, v1.4h
752 ; CHECK-GI-NEXT: sshl v0.4h, v0.4h, v1.4h
753 ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
754 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
756 %3 = ashr <2 x i16> %0, %1
760 define <16 x i16> @ashr_v16i16(<16 x i16> %0, <16 x i16> %1){
761 ; CHECK-LABEL: ashr_v16i16:
763 ; CHECK-NEXT: neg v2.8h, v2.8h
764 ; CHECK-NEXT: neg v3.8h, v3.8h
765 ; CHECK-NEXT: sshl v0.8h, v0.8h, v2.8h
766 ; CHECK-NEXT: sshl v1.8h, v1.8h, v3.8h
768 %3 = ashr <16 x i16> %0, %1
772 define <1 x i32> @ashr_v1i32(<1 x i32> %0, <1 x i32> %1){
773 ; CHECK-SD-LABEL: ashr_v1i32:
774 ; CHECK-SD: // %bb.0:
775 ; CHECK-SD-NEXT: neg v1.2s, v1.2s
776 ; CHECK-SD-NEXT: sshl v0.2s, v0.2s, v1.2s
779 ; CHECK-GI-LABEL: ashr_v1i32:
780 ; CHECK-GI: // %bb.0:
781 ; CHECK-GI-NEXT: fmov w8, s0
782 ; CHECK-GI-NEXT: fmov w9, s1
783 ; CHECK-GI-NEXT: asr w8, w8, w9
784 ; CHECK-GI-NEXT: mov v0.s[0], w8
785 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
787 %3 = ashr <1 x i32> %0, %1
791 define <8 x i32> @ashr_v8i32(<8 x i32> %0, <8 x i32> %1){
792 ; CHECK-LABEL: ashr_v8i32:
794 ; CHECK-NEXT: neg v2.4s, v2.4s
795 ; CHECK-NEXT: neg v3.4s, v3.4s
796 ; CHECK-NEXT: sshl v0.4s, v0.4s, v2.4s
797 ; CHECK-NEXT: sshl v1.4s, v1.4s, v3.4s
799 %3 = ashr <8 x i32> %0, %1
803 define <4 x i64> @ashr_v4i64(<4 x i64> %0, <4 x i64> %1){
804 ; CHECK-LABEL: ashr_v4i64:
806 ; CHECK-NEXT: neg v2.2d, v2.2d
807 ; CHECK-NEXT: neg v3.2d, v3.2d
808 ; CHECK-NEXT: sshl v0.2d, v0.2d, v2.2d
809 ; CHECK-NEXT: sshl v1.2d, v1.2d, v3.2d
811 %3 = ashr <4 x i64> %0, %1
815 define <2 x i128> @ashr_v2i128(<2 x i128> %0, <2 x i128> %1){
816 ; CHECK-SD-LABEL: ashr_v2i128:
817 ; CHECK-SD: // %bb.0:
818 ; CHECK-SD-NEXT: lsl x8, x1, #1
819 ; CHECK-SD-NEXT: mvn w9, w4
820 ; CHECK-SD-NEXT: lsl x10, x3, #1
821 ; CHECK-SD-NEXT: lsr x11, x0, x4
822 ; CHECK-SD-NEXT: lsr x12, x2, x6
823 ; CHECK-SD-NEXT: asr x13, x1, #63
824 ; CHECK-SD-NEXT: lsl x8, x8, x9
825 ; CHECK-SD-NEXT: mvn w9, w6
826 ; CHECK-SD-NEXT: tst x4, #0x40
827 ; CHECK-SD-NEXT: lsl x9, x10, x9
828 ; CHECK-SD-NEXT: asr x10, x1, x4
829 ; CHECK-SD-NEXT: asr x14, x3, #63
830 ; CHECK-SD-NEXT: orr x8, x8, x11
831 ; CHECK-SD-NEXT: asr x11, x3, x6
832 ; CHECK-SD-NEXT: csel x0, x10, x8, ne
833 ; CHECK-SD-NEXT: orr x8, x9, x12
834 ; CHECK-SD-NEXT: csel x1, x13, x10, ne
835 ; CHECK-SD-NEXT: tst x6, #0x40
836 ; CHECK-SD-NEXT: csel x2, x11, x8, ne
837 ; CHECK-SD-NEXT: csel x3, x14, x11, ne
840 ; CHECK-GI-LABEL: ashr_v2i128:
841 ; CHECK-GI: // %bb.0:
842 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
843 ; CHECK-GI-NEXT: sub x10, x4, #64
844 ; CHECK-GI-NEXT: lsr x11, x0, x4
845 ; CHECK-GI-NEXT: sub x9, x8, x4
846 ; CHECK-GI-NEXT: asr x10, x1, x10
847 ; CHECK-GI-NEXT: cmp x4, #64
848 ; CHECK-GI-NEXT: lsl x9, x1, x9
849 ; CHECK-GI-NEXT: sub x8, x8, x6
850 ; CHECK-GI-NEXT: asr x12, x1, x4
851 ; CHECK-GI-NEXT: lsl x8, x3, x8
852 ; CHECK-GI-NEXT: orr x9, x11, x9
853 ; CHECK-GI-NEXT: asr x11, x1, #63
854 ; CHECK-GI-NEXT: csel x9, x9, x10, lo
855 ; CHECK-GI-NEXT: cmp x4, #0
856 ; CHECK-GI-NEXT: lsr x10, x2, x6
857 ; CHECK-GI-NEXT: csel x0, x0, x9, eq
858 ; CHECK-GI-NEXT: sub x9, x6, #64
859 ; CHECK-GI-NEXT: cmp x4, #64
860 ; CHECK-GI-NEXT: asr x9, x3, x9
861 ; CHECK-GI-NEXT: csel x1, x12, x11, lo
862 ; CHECK-GI-NEXT: orr x8, x10, x8
863 ; CHECK-GI-NEXT: cmp x6, #64
864 ; CHECK-GI-NEXT: asr x11, x3, x6
865 ; CHECK-GI-NEXT: asr x10, x3, #63
866 ; CHECK-GI-NEXT: csel x8, x8, x9, lo
867 ; CHECK-GI-NEXT: cmp x6, #0
868 ; CHECK-GI-NEXT: csel x2, x2, x8, eq
869 ; CHECK-GI-NEXT: cmp x6, #64
870 ; CHECK-GI-NEXT: csel x3, x11, x10, lo
872 %3 = ashr <2 x i128> %0, %1
876 define <4 x i8> @lshr_v4i8(<4 x i8> %0, <4 x i8> %1){
877 ; CHECK-SD-LABEL: lshr_v4i8:
878 ; CHECK-SD: // %bb.0:
879 ; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8
880 ; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8
881 ; CHECK-SD-NEXT: neg v1.4h, v1.4h
882 ; CHECK-SD-NEXT: ushl v0.4h, v0.4h, v1.4h
885 ; CHECK-GI-LABEL: lshr_v4i8:
886 ; CHECK-GI: // %bb.0:
887 ; CHECK-GI-NEXT: uzp1 v1.8b, v1.8b, v0.8b
888 ; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
889 ; CHECK-GI-NEXT: neg v1.8b, v1.8b
890 ; CHECK-GI-NEXT: ushl v0.8b, v0.8b, v1.8b
891 ; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
892 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
894 %3 = lshr <4 x i8> %0, %1
898 define <32 x i8> @lshr_v32i8(<32 x i8> %0, <32 x i8> %1){
899 ; CHECK-LABEL: lshr_v32i8:
901 ; CHECK-NEXT: neg v2.16b, v2.16b
902 ; CHECK-NEXT: neg v3.16b, v3.16b
903 ; CHECK-NEXT: ushl v0.16b, v0.16b, v2.16b
904 ; CHECK-NEXT: ushl v1.16b, v1.16b, v3.16b
906 %3 = lshr <32 x i8> %0, %1
910 define <2 x i16> @lshr_v2i16(<2 x i16> %0, <2 x i16> %1){
911 ; CHECK-SD-LABEL: lshr_v2i16:
912 ; CHECK-SD: // %bb.0:
913 ; CHECK-SD-NEXT: movi d2, #0x00ffff0000ffff
914 ; CHECK-SD-NEXT: and v1.8b, v1.8b, v2.8b
915 ; CHECK-SD-NEXT: and v0.8b, v0.8b, v2.8b
916 ; CHECK-SD-NEXT: neg v1.2s, v1.2s
917 ; CHECK-SD-NEXT: ushl v0.2s, v0.2s, v1.2s
920 ; CHECK-GI-LABEL: lshr_v2i16:
921 ; CHECK-GI: // %bb.0:
922 ; CHECK-GI-NEXT: uzp1 v1.4h, v1.4h, v0.4h
923 ; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
924 ; CHECK-GI-NEXT: neg v1.4h, v1.4h
925 ; CHECK-GI-NEXT: ushl v0.4h, v0.4h, v1.4h
926 ; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
927 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
929 %3 = lshr <2 x i16> %0, %1
933 define <16 x i16> @lshr_v16i16(<16 x i16> %0, <16 x i16> %1){
934 ; CHECK-LABEL: lshr_v16i16:
936 ; CHECK-NEXT: neg v2.8h, v2.8h
937 ; CHECK-NEXT: neg v3.8h, v3.8h
938 ; CHECK-NEXT: ushl v0.8h, v0.8h, v2.8h
939 ; CHECK-NEXT: ushl v1.8h, v1.8h, v3.8h
941 %3 = lshr <16 x i16> %0, %1
945 define <1 x i32> @lshr_v1i32(<1 x i32> %0, <1 x i32> %1){
946 ; CHECK-SD-LABEL: lshr_v1i32:
947 ; CHECK-SD: // %bb.0:
948 ; CHECK-SD-NEXT: neg v1.2s, v1.2s
949 ; CHECK-SD-NEXT: ushl v0.2s, v0.2s, v1.2s
952 ; CHECK-GI-LABEL: lshr_v1i32:
953 ; CHECK-GI: // %bb.0:
954 ; CHECK-GI-NEXT: fmov w8, s0
955 ; CHECK-GI-NEXT: fmov w9, s1
956 ; CHECK-GI-NEXT: lsr w8, w8, w9
957 ; CHECK-GI-NEXT: mov v0.s[0], w8
958 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
960 %3 = lshr <1 x i32> %0, %1
964 define <8 x i32> @lshr_v8i32(<8 x i32> %0, <8 x i32> %1){
965 ; CHECK-LABEL: lshr_v8i32:
967 ; CHECK-NEXT: neg v2.4s, v2.4s
968 ; CHECK-NEXT: neg v3.4s, v3.4s
969 ; CHECK-NEXT: ushl v0.4s, v0.4s, v2.4s
970 ; CHECK-NEXT: ushl v1.4s, v1.4s, v3.4s
972 %3 = lshr <8 x i32> %0, %1
976 define <4 x i64> @lshr_v4i64(<4 x i64> %0, <4 x i64> %1){
977 ; CHECK-LABEL: lshr_v4i64:
979 ; CHECK-NEXT: neg v2.2d, v2.2d
980 ; CHECK-NEXT: neg v3.2d, v3.2d
981 ; CHECK-NEXT: ushl v0.2d, v0.2d, v2.2d
982 ; CHECK-NEXT: ushl v1.2d, v1.2d, v3.2d
984 %3 = lshr <4 x i64> %0, %1
988 define <2 x i128> @lshr_v2i128(<2 x i128> %0, <2 x i128> %1){
989 ; CHECK-SD-LABEL: lshr_v2i128:
990 ; CHECK-SD: // %bb.0:
991 ; CHECK-SD-NEXT: lsl x8, x1, #1
992 ; CHECK-SD-NEXT: mvn w9, w4
993 ; CHECK-SD-NEXT: lsr x10, x0, x4
994 ; CHECK-SD-NEXT: mvn w12, w6
995 ; CHECK-SD-NEXT: lsr x11, x1, x4
996 ; CHECK-SD-NEXT: lsr x13, x2, x6
997 ; CHECK-SD-NEXT: lsl x8, x8, x9
998 ; CHECK-SD-NEXT: lsl x9, x3, #1
999 ; CHECK-SD-NEXT: tst x4, #0x40
1000 ; CHECK-SD-NEXT: csel x1, xzr, x11, ne
1001 ; CHECK-SD-NEXT: lsl x9, x9, x12
1002 ; CHECK-SD-NEXT: orr x8, x8, x10
1003 ; CHECK-SD-NEXT: lsr x10, x3, x6
1004 ; CHECK-SD-NEXT: csel x0, x11, x8, ne
1005 ; CHECK-SD-NEXT: tst x6, #0x40
1006 ; CHECK-SD-NEXT: orr x8, x9, x13
1007 ; CHECK-SD-NEXT: csel x3, xzr, x10, ne
1008 ; CHECK-SD-NEXT: csel x2, x10, x8, ne
1009 ; CHECK-SD-NEXT: ret
1011 ; CHECK-GI-LABEL: lshr_v2i128:
1012 ; CHECK-GI: // %bb.0:
1013 ; CHECK-GI-NEXT: mov w8, #64 // =0x40
1014 ; CHECK-GI-NEXT: sub x10, x4, #64
1015 ; CHECK-GI-NEXT: lsr x11, x0, x4
1016 ; CHECK-GI-NEXT: sub x9, x8, x4
1017 ; CHECK-GI-NEXT: lsr x10, x1, x10
1018 ; CHECK-GI-NEXT: cmp x4, #64
1019 ; CHECK-GI-NEXT: lsl x9, x1, x9
1020 ; CHECK-GI-NEXT: sub x8, x8, x6
1021 ; CHECK-GI-NEXT: lsr x12, x1, x4
1022 ; CHECK-GI-NEXT: lsl x8, x3, x8
1023 ; CHECK-GI-NEXT: orr x9, x11, x9
1024 ; CHECK-GI-NEXT: lsr x11, x2, x6
1025 ; CHECK-GI-NEXT: csel x9, x9, x10, lo
1026 ; CHECK-GI-NEXT: cmp x4, #0
1027 ; CHECK-GI-NEXT: sub x10, x6, #64
1028 ; CHECK-GI-NEXT: csel x0, x0, x9, eq
1029 ; CHECK-GI-NEXT: cmp x4, #64
1030 ; CHECK-GI-NEXT: lsr x9, x3, x10
1031 ; CHECK-GI-NEXT: csel x1, x12, xzr, lo
1032 ; CHECK-GI-NEXT: orr x8, x11, x8
1033 ; CHECK-GI-NEXT: cmp x6, #64
1034 ; CHECK-GI-NEXT: lsr x10, x3, x6
1035 ; CHECK-GI-NEXT: csel x8, x8, x9, lo
1036 ; CHECK-GI-NEXT: cmp x6, #0
1037 ; CHECK-GI-NEXT: csel x2, x2, x8, eq
1038 ; CHECK-GI-NEXT: cmp x6, #64
1039 ; CHECK-GI-NEXT: csel x3, x10, xzr, lo
1040 ; CHECK-GI-NEXT: ret
1041 %3 = lshr <2 x i128> %0, %1
1045 ; ===== Vector with Non-Pow 2 Width =====
1047 define <3 x i8> @shl_v3i8(<3 x i8> %0, <3 x i8> %1){
1048 ; CHECK-SD-LABEL: shl_v3i8:
1049 ; CHECK-SD: // %bb.0:
1050 ; CHECK-SD-NEXT: fmov s0, w3
1051 ; CHECK-SD-NEXT: fmov s1, w0
1052 ; CHECK-SD-NEXT: mov v0.h[1], w4
1053 ; CHECK-SD-NEXT: mov v1.h[1], w1
1054 ; CHECK-SD-NEXT: mov v0.h[2], w5
1055 ; CHECK-SD-NEXT: mov v1.h[2], w2
1056 ; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8
1057 ; CHECK-SD-NEXT: ushl v0.4h, v1.4h, v0.4h
1058 ; CHECK-SD-NEXT: umov w0, v0.h[0]
1059 ; CHECK-SD-NEXT: umov w1, v0.h[1]
1060 ; CHECK-SD-NEXT: umov w2, v0.h[2]
1061 ; CHECK-SD-NEXT: ret
1063 ; CHECK-GI-LABEL: shl_v3i8:
1064 ; CHECK-GI: // %bb.0:
1065 ; CHECK-GI-NEXT: fmov s0, w0
1066 ; CHECK-GI-NEXT: fmov s1, w3
1067 ; CHECK-GI-NEXT: mov v0.b[1], w1
1068 ; CHECK-GI-NEXT: mov v1.b[1], w4
1069 ; CHECK-GI-NEXT: mov v0.b[2], w2
1070 ; CHECK-GI-NEXT: mov v1.b[2], w5
1071 ; CHECK-GI-NEXT: ushl v0.8b, v0.8b, v1.8b
1072 ; CHECK-GI-NEXT: umov w0, v0.b[0]
1073 ; CHECK-GI-NEXT: umov w1, v0.b[1]
1074 ; CHECK-GI-NEXT: umov w2, v0.b[2]
1075 ; CHECK-GI-NEXT: ret
1076 %3 = shl <3 x i8> %0, %1
1080 define <7 x i8> @shl_v7i8(<7 x i8> %0, <7 x i8> %1){
1081 ; CHECK-LABEL: shl_v7i8:
1083 ; CHECK-NEXT: ushl v0.8b, v0.8b, v1.8b
1085 %3 = shl <7 x i8> %0, %1
1089 define <3 x i16> @shl_v3i16(<3 x i16> %0, <3 x i16> %1){
1090 ; CHECK-LABEL: shl_v3i16:
1092 ; CHECK-NEXT: ushl v0.4h, v0.4h, v1.4h
1094 %3 = shl <3 x i16> %0, %1
1098 define <7 x i16> @shl_v7i16(<7 x i16> %0, <7 x i16> %1){
1099 ; CHECK-LABEL: shl_v7i16:
1101 ; CHECK-NEXT: ushl v0.8h, v0.8h, v1.8h
1103 %3 = shl <7 x i16> %0, %1
1107 define <3 x i32> @shl_v3i32(<3 x i32> %0, <3 x i32> %1){
1108 ; CHECK-LABEL: shl_v3i32:
1110 ; CHECK-NEXT: ushl v0.4s, v0.4s, v1.4s
1112 %3 = shl <3 x i32> %0, %1
1116 define <3 x i8> @ashr_v3i8(<3 x i8> %0, <3 x i8> %1){
1117 ; CHECK-SD-LABEL: ashr_v3i8:
1118 ; CHECK-SD: // %bb.0:
1119 ; CHECK-SD-NEXT: fmov s0, w0
1120 ; CHECK-SD-NEXT: fmov s1, w3
1121 ; CHECK-SD-NEXT: mov v0.h[1], w1
1122 ; CHECK-SD-NEXT: mov v1.h[1], w4
1123 ; CHECK-SD-NEXT: mov v0.h[2], w2
1124 ; CHECK-SD-NEXT: mov v1.h[2], w5
1125 ; CHECK-SD-NEXT: shl v0.4h, v0.4h, #8
1126 ; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8
1127 ; CHECK-SD-NEXT: sshr v0.4h, v0.4h, #8
1128 ; CHECK-SD-NEXT: neg v1.4h, v1.4h
1129 ; CHECK-SD-NEXT: sshl v0.4h, v0.4h, v1.4h
1130 ; CHECK-SD-NEXT: umov w0, v0.h[0]
1131 ; CHECK-SD-NEXT: umov w1, v0.h[1]
1132 ; CHECK-SD-NEXT: umov w2, v0.h[2]
1133 ; CHECK-SD-NEXT: ret
1135 ; CHECK-GI-LABEL: ashr_v3i8:
1136 ; CHECK-GI: // %bb.0:
1137 ; CHECK-GI-NEXT: fmov s0, w3
1138 ; CHECK-GI-NEXT: fmov s1, w0
1139 ; CHECK-GI-NEXT: mov v0.b[1], w4
1140 ; CHECK-GI-NEXT: mov v1.b[1], w1
1141 ; CHECK-GI-NEXT: mov v0.b[2], w5
1142 ; CHECK-GI-NEXT: mov v1.b[2], w2
1143 ; CHECK-GI-NEXT: neg v0.8b, v0.8b
1144 ; CHECK-GI-NEXT: sshl v0.8b, v1.8b, v0.8b
1145 ; CHECK-GI-NEXT: umov w0, v0.b[0]
1146 ; CHECK-GI-NEXT: umov w1, v0.b[1]
1147 ; CHECK-GI-NEXT: umov w2, v0.b[2]
1148 ; CHECK-GI-NEXT: ret
1149 %3 = ashr <3 x i8> %0, %1
1153 define <7 x i8> @ashr_v7i8(<7 x i8> %0, <7 x i8> %1){
1154 ; CHECK-LABEL: ashr_v7i8:
1156 ; CHECK-NEXT: neg v1.8b, v1.8b
1157 ; CHECK-NEXT: sshl v0.8b, v0.8b, v1.8b
1159 %3 = ashr <7 x i8> %0, %1
1163 define <3 x i16> @ashr_v3i16(<3 x i16> %0, <3 x i16> %1){
1164 ; CHECK-LABEL: ashr_v3i16:
1166 ; CHECK-NEXT: neg v1.4h, v1.4h
1167 ; CHECK-NEXT: sshl v0.4h, v0.4h, v1.4h
1169 %3 = ashr <3 x i16> %0, %1
1173 define <7 x i16> @ashr_v7i16(<7 x i16> %0, <7 x i16> %1){
1174 ; CHECK-LABEL: ashr_v7i16:
1176 ; CHECK-NEXT: neg v1.8h, v1.8h
1177 ; CHECK-NEXT: sshl v0.8h, v0.8h, v1.8h
1179 %3 = ashr <7 x i16> %0, %1
1183 define <3 x i32> @ashr_v3i32(<3 x i32> %0, <3 x i32> %1){
1184 ; CHECK-LABEL: ashr_v3i32:
1186 ; CHECK-NEXT: neg v1.4s, v1.4s
1187 ; CHECK-NEXT: sshl v0.4s, v0.4s, v1.4s
1189 %3 = ashr <3 x i32> %0, %1
1193 define <3 x i8> @lshr_v3i8(<3 x i8> %0, <3 x i8> %1){
1194 ; CHECK-SD-LABEL: lshr_v3i8:
1195 ; CHECK-SD: // %bb.0:
1196 ; CHECK-SD-NEXT: fmov s0, w3
1197 ; CHECK-SD-NEXT: fmov s1, w0
1198 ; CHECK-SD-NEXT: mov v0.h[1], w4
1199 ; CHECK-SD-NEXT: mov v1.h[1], w1
1200 ; CHECK-SD-NEXT: mov v0.h[2], w5
1201 ; CHECK-SD-NEXT: mov v1.h[2], w2
1202 ; CHECK-SD-NEXT: bic v0.4h, #255, lsl #8
1203 ; CHECK-SD-NEXT: bic v1.4h, #255, lsl #8
1204 ; CHECK-SD-NEXT: neg v0.4h, v0.4h
1205 ; CHECK-SD-NEXT: ushl v0.4h, v1.4h, v0.4h
1206 ; CHECK-SD-NEXT: umov w0, v0.h[0]
1207 ; CHECK-SD-NEXT: umov w1, v0.h[1]
1208 ; CHECK-SD-NEXT: umov w2, v0.h[2]
1209 ; CHECK-SD-NEXT: ret
1211 ; CHECK-GI-LABEL: lshr_v3i8:
1212 ; CHECK-GI: // %bb.0:
1213 ; CHECK-GI-NEXT: fmov s0, w3
1214 ; CHECK-GI-NEXT: fmov s1, w0
1215 ; CHECK-GI-NEXT: mov v0.b[1], w4
1216 ; CHECK-GI-NEXT: mov v1.b[1], w1
1217 ; CHECK-GI-NEXT: mov v0.b[2], w5
1218 ; CHECK-GI-NEXT: mov v1.b[2], w2
1219 ; CHECK-GI-NEXT: neg v0.8b, v0.8b
1220 ; CHECK-GI-NEXT: ushl v0.8b, v1.8b, v0.8b
1221 ; CHECK-GI-NEXT: umov w0, v0.b[0]
1222 ; CHECK-GI-NEXT: umov w1, v0.b[1]
1223 ; CHECK-GI-NEXT: umov w2, v0.b[2]
1224 ; CHECK-GI-NEXT: ret
1225 %3 = lshr <3 x i8> %0, %1
1229 define <7 x i8> @lshr_v7i8(<7 x i8> %0, <7 x i8> %1){
1230 ; CHECK-LABEL: lshr_v7i8:
1232 ; CHECK-NEXT: neg v1.8b, v1.8b
1233 ; CHECK-NEXT: ushl v0.8b, v0.8b, v1.8b
1235 %3 = lshr <7 x i8> %0, %1
1239 define <3 x i16> @lshr_v3i16(<3 x i16> %0, <3 x i16> %1){
1240 ; CHECK-LABEL: lshr_v3i16:
1242 ; CHECK-NEXT: neg v1.4h, v1.4h
1243 ; CHECK-NEXT: ushl v0.4h, v0.4h, v1.4h
1245 %3 = lshr <3 x i16> %0, %1
1249 define <7 x i16> @lshr_v7i16(<7 x i16> %0, <7 x i16> %1){
1250 ; CHECK-LABEL: lshr_v7i16:
1252 ; CHECK-NEXT: neg v1.8h, v1.8h
1253 ; CHECK-NEXT: ushl v0.8h, v0.8h, v1.8h
1255 %3 = lshr <7 x i16> %0, %1
1259 define <3 x i32> @lshr_v3i32(<3 x i32> %0, <3 x i32> %1){
1260 ; CHECK-LABEL: lshr_v3i32:
1262 ; CHECK-NEXT: neg v1.4s, v1.4s
1263 ; CHECK-NEXT: ushl v0.4s, v0.4s, v1.4s
1265 %3 = lshr <3 x i32> %0, %1
1270 ; ===== Vector with Odd Element Sizes =====