[Xtensa] Implement Windowed Register Option. (#124656)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / shift.ll
blob066928687cc02d3e8d1702676a69d2ef3d8d1f24
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:
7 ; CHECK-SD:       // %bb.0:
8 ; CHECK-SD-NEXT:    and w0, w0, #0x1
9 ; CHECK-SD-NEXT:    ret
11 ; CHECK-GI-LABEL: shl_i1:
12 ; CHECK-GI:       // %bb.0:
13 ; CHECK-GI-NEXT:    and w8, w1, #0x1
14 ; CHECK-GI-NEXT:    lsl w8, w0, w8
15 ; CHECK-GI-NEXT:    and w0, w8, #0x1
16 ; CHECK-GI-NEXT:    ret
17     %3 = shl i1 %0, %1
18     ret i1 %3
21 define i8 @shl_i8(i8 %0, i8 %1){
22 ; CHECK-SD-LABEL: shl_i8:
23 ; CHECK-SD:       // %bb.0:
24 ; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
25 ; CHECK-SD-NEXT:    lsl w0, w0, w1
26 ; CHECK-SD-NEXT:    ret
28 ; CHECK-GI-LABEL: shl_i8:
29 ; CHECK-GI:       // %bb.0:
30 ; CHECK-GI-NEXT:    and w8, w1, #0xff
31 ; CHECK-GI-NEXT:    lsl w0, w0, w8
32 ; CHECK-GI-NEXT:    ret
33     %3 = shl i8 %0, %1
34     ret i8 %3
37 define i16 @shl_i16(i16 %0, i16 %1){
38 ; CHECK-SD-LABEL: shl_i16:
39 ; CHECK-SD:       // %bb.0:
40 ; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
41 ; CHECK-SD-NEXT:    lsl w0, w0, w1
42 ; CHECK-SD-NEXT:    ret
44 ; CHECK-GI-LABEL: shl_i16:
45 ; CHECK-GI:       // %bb.0:
46 ; CHECK-GI-NEXT:    and w8, w1, #0xffff
47 ; CHECK-GI-NEXT:    lsl w0, w0, w8
48 ; CHECK-GI-NEXT:    ret
49     %3 = shl i16 %0, %1
50     ret i16 %3
53 define i32 @shl_i32(i32 %0, i32 %1){
54 ; CHECK-LABEL: shl_i32:
55 ; CHECK:       // %bb.0:
56 ; CHECK-NEXT:    lsl w0, w0, w1
57 ; CHECK-NEXT:    ret
58     %3 = shl i32 %0, %1
59     ret i32 %3
62 define i64 @shl_i64(i64 %0, i64 %1){
63 ; CHECK-LABEL: shl_i64:
64 ; CHECK:       // %bb.0:
65 ; CHECK-NEXT:    lsl x0, x0, x1
66 ; CHECK-NEXT:    ret
67     %3 = shl i64 %0, %1
68     ret i64 %3
71 define i128 @shl_i128(i128 %0, i128 %1){
72 ; CHECK-SD-LABEL: shl_i128:
73 ; CHECK-SD:       // %bb.0:
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
83 ; CHECK-SD-NEXT:    ret
85 ; CHECK-GI-LABEL: shl_i128:
86 ; CHECK-GI:       // %bb.0:
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
100 ; CHECK-GI-NEXT:    ret
101     %3 = shl i128 %0, %1
102     ret i128 %3
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
109 ; CHECK-SD-NEXT:    ret
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
117 ; CHECK-GI-NEXT:    ret
118     %3 = ashr i1 %0, %1
119     ret i1 %3
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
128 ; CHECK-SD-NEXT:    ret
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
135 ; CHECK-GI-NEXT:    ret
136     %3 = ashr i8 %0, %1
137     ret i8 %3
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
146 ; CHECK-SD-NEXT:    ret
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
153 ; CHECK-GI-NEXT:    ret
154     %3 = ashr i16 %0, %1
155     ret i16 %3
158 define i32 @ashr_i32(i32 %0, i32 %1){
159 ; CHECK-LABEL: ashr_i32:
160 ; CHECK:       // %bb.0:
161 ; CHECK-NEXT:    asr w0, w0, w1
162 ; CHECK-NEXT:    ret
163     %3 = ashr i32 %0, %1
164     ret i32 %3
167 define i64 @ashr_i64(i64 %0, i64 %1){
168 ; CHECK-LABEL: ashr_i64:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    asr x0, x0, x1
171 ; CHECK-NEXT:    ret
172     %3 = ashr i64 %0, %1
173     ret i64 %3
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
189 ; CHECK-SD-NEXT:    ret
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
208 ; CHECK-GI-NEXT:    ret
209     %3 = ashr i128 %0, %1
210     ret i128 %3
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
217 ; CHECK-SD-NEXT:    ret
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
224 ; CHECK-GI-NEXT:    ret
225     %3 = lshr i1 %0, %1
226     ret i1 %3
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
235 ; CHECK-SD-NEXT:    ret
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
242 ; CHECK-GI-NEXT:    ret
243     %3 = lshr i8 %0, %1
244     ret i8 %3
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
253 ; CHECK-SD-NEXT:    ret
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
260 ; CHECK-GI-NEXT:    ret
261     %3 = lshr i16 %0, %1
262     ret i16 %3
265 define i32 @lshr_i32(i32 %0, i32 %1){
266 ; CHECK-LABEL: lshr_i32:
267 ; CHECK:       // %bb.0:
268 ; CHECK-NEXT:    lsr w0, w0, w1
269 ; CHECK-NEXT:    ret
270     %3 = lshr i32 %0, %1
271     ret i32 %3
274 define i64 @lshr_i64(i64 %0, i64 %1){
275 ; CHECK-LABEL: lshr_i64:
276 ; CHECK:       // %bb.0:
277 ; CHECK-NEXT:    lsr x0, x0, x1
278 ; CHECK-NEXT:    ret
279     %3 = lshr i64 %0, %1
280     ret i64 %3
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
295 ; CHECK-SD-NEXT:    ret
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
313 ; CHECK-GI-NEXT:    ret
314     %3 = lshr i128 %0, %1
315     ret i128 %3
318 ; ===== Legal Vector Type =====
320 define <8 x i8> @shl_v8i8(<8 x i8> %0, <8 x i8> %1){
321 ; CHECK-LABEL: shl_v8i8:
322 ; CHECK:       // %bb.0:
323 ; CHECK-NEXT:    ushl v0.8b, v0.8b, v1.8b
324 ; CHECK-NEXT:    ret
325     %3 = shl <8 x i8> %0, %1
326     ret <8 x i8> %3
329 define <16 x i8> @shl_v16i8(<16 x i8> %0, <16 x i8> %1){
330 ; CHECK-LABEL: shl_v16i8:
331 ; CHECK:       // %bb.0:
332 ; CHECK-NEXT:    ushl v0.16b, v0.16b, v1.16b
333 ; CHECK-NEXT:    ret
334     %3 = shl <16 x i8> %0, %1
335     ret <16 x i8> %3
338 define <4 x i16> @shl_v4i16(<4 x i16> %0, <4 x i16> %1){
339 ; CHECK-LABEL: shl_v4i16:
340 ; CHECK:       // %bb.0:
341 ; CHECK-NEXT:    ushl v0.4h, v0.4h, v1.4h
342 ; CHECK-NEXT:    ret
343     %3 = shl <4 x i16> %0, %1
344     ret <4 x i16> %3
347 define <8 x i16> @shl_v8i16(<8 x i16> %0, <8 x i16> %1){
348 ; CHECK-LABEL: shl_v8i16:
349 ; CHECK:       // %bb.0:
350 ; CHECK-NEXT:    ushl v0.8h, v0.8h, v1.8h
351 ; CHECK-NEXT:    ret
352     %3 = shl <8 x i16> %0, %1
353     ret <8 x i16> %3
356 define <2 x i32> @shl_v2i32(<2 x i32> %0, <2 x i32> %1){
357 ; CHECK-LABEL: shl_v2i32:
358 ; CHECK:       // %bb.0:
359 ; CHECK-NEXT:    ushl v0.2s, v0.2s, v1.2s
360 ; CHECK-NEXT:    ret
361     %3 = shl <2 x i32> %0, %1
362     ret <2 x i32> %3
365 define <4 x i32> @shl_v4i32(<4 x i32> %0, <4 x i32> %1){
366 ; CHECK-LABEL: shl_v4i32:
367 ; CHECK:       // %bb.0:
368 ; CHECK-NEXT:    ushl v0.4s, v0.4s, v1.4s
369 ; CHECK-NEXT:    ret
370     %3 = shl <4 x i32> %0, %1
371     ret <4 x i32> %3
374 define <2 x i64> @shl_v2i64(<2 x i64> %0, <2 x i64> %1){
375 ; CHECK-LABEL: shl_v2i64:
376 ; CHECK:       // %bb.0:
377 ; CHECK-NEXT:    ushl v0.2d, v0.2d, v1.2d
378 ; CHECK-NEXT:    ret
379     %3 = shl <2 x i64> %0, %1
380     ret <2 x i64> %3
383 define <8 x i8> @ashr_v8i8(<8 x i8> %0, <8 x i8> %1){
384 ; CHECK-LABEL: ashr_v8i8:
385 ; CHECK:       // %bb.0:
386 ; CHECK-NEXT:    neg v1.8b, v1.8b
387 ; CHECK-NEXT:    sshl v0.8b, v0.8b, v1.8b
388 ; CHECK-NEXT:    ret
389     %3 = ashr <8 x i8> %0, %1
390     ret <8 x i8> %3
393 define <16 x i8> @ashr_v16i8(<16 x i8> %0, <16 x i8> %1){
394 ; CHECK-LABEL: ashr_v16i8:
395 ; CHECK:       // %bb.0:
396 ; CHECK-NEXT:    neg v1.16b, v1.16b
397 ; CHECK-NEXT:    sshl v0.16b, v0.16b, v1.16b
398 ; CHECK-NEXT:    ret
399     %3 = ashr <16 x i8> %0, %1
400     ret <16 x i8> %3
403 define <4 x i16> @ashr_v4i16(<4 x i16> %0, <4 x i16> %1){
404 ; CHECK-LABEL: ashr_v4i16:
405 ; CHECK:       // %bb.0:
406 ; CHECK-NEXT:    neg v1.4h, v1.4h
407 ; CHECK-NEXT:    sshl v0.4h, v0.4h, v1.4h
408 ; CHECK-NEXT:    ret
409     %3 = ashr <4 x i16> %0, %1
410     ret <4 x i16> %3
413 define <8 x i16> @ashr_v8i16(<8 x i16> %0, <8 x i16> %1){
414 ; CHECK-LABEL: ashr_v8i16:
415 ; CHECK:       // %bb.0:
416 ; CHECK-NEXT:    neg v1.8h, v1.8h
417 ; CHECK-NEXT:    sshl v0.8h, v0.8h, v1.8h
418 ; CHECK-NEXT:    ret
419     %3 = ashr <8 x i16> %0, %1
420     ret <8 x i16> %3
423 define <2 x i32> @ashr_v2i32(<2 x i32> %0, <2 x i32> %1){
424 ; CHECK-LABEL: ashr_v2i32:
425 ; CHECK:       // %bb.0:
426 ; CHECK-NEXT:    neg v1.2s, v1.2s
427 ; CHECK-NEXT:    sshl v0.2s, v0.2s, v1.2s
428 ; CHECK-NEXT:    ret
429     %3 = ashr <2 x i32> %0, %1
430     ret <2 x i32> %3
433 define <4 x i32> @ashr_v4i32(<4 x i32> %0, <4 x i32> %1){
434 ; CHECK-LABEL: ashr_v4i32:
435 ; CHECK:       // %bb.0:
436 ; CHECK-NEXT:    neg v1.4s, v1.4s
437 ; CHECK-NEXT:    sshl v0.4s, v0.4s, v1.4s
438 ; CHECK-NEXT:    ret
439     %3 = ashr <4 x i32> %0, %1
440     ret <4 x i32> %3
443 define <2 x i64> @ashr_v2i64(<2 x i64> %0, <2 x i64> %1){
444 ; CHECK-LABEL: ashr_v2i64:
445 ; CHECK:       // %bb.0:
446 ; CHECK-NEXT:    neg v1.2d, v1.2d
447 ; CHECK-NEXT:    sshl v0.2d, v0.2d, v1.2d
448 ; CHECK-NEXT:    ret
449     %3 = ashr <2 x i64> %0, %1
450     ret <2 x i64> %3
453 define <8 x i8> @lshr_v8i8(<8 x i8> %0, <8 x i8> %1){
454 ; CHECK-LABEL: lshr_v8i8:
455 ; CHECK:       // %bb.0:
456 ; CHECK-NEXT:    neg v1.8b, v1.8b
457 ; CHECK-NEXT:    ushl v0.8b, v0.8b, v1.8b
458 ; CHECK-NEXT:    ret
459     %3 = lshr <8 x i8> %0, %1
460     ret <8 x i8> %3
463 define <16 x i8> @lshr_v16i8(<16 x i8> %0, <16 x i8> %1){
464 ; CHECK-LABEL: lshr_v16i8:
465 ; CHECK:       // %bb.0:
466 ; CHECK-NEXT:    neg v1.16b, v1.16b
467 ; CHECK-NEXT:    ushl v0.16b, v0.16b, v1.16b
468 ; CHECK-NEXT:    ret
469     %3 = lshr <16 x i8> %0, %1
470     ret <16 x i8> %3
473 define <4 x i16> @lshr_v4i16(<4 x i16> %0, <4 x i16> %1){
474 ; CHECK-LABEL: lshr_v4i16:
475 ; CHECK:       // %bb.0:
476 ; CHECK-NEXT:    neg v1.4h, v1.4h
477 ; CHECK-NEXT:    ushl v0.4h, v0.4h, v1.4h
478 ; CHECK-NEXT:    ret
479     %3 = lshr <4 x i16> %0, %1
480     ret <4 x i16> %3
483 define <8 x i16> @lshr_v8i16(<8 x i16> %0, <8 x i16> %1){
484 ; CHECK-LABEL: lshr_v8i16:
485 ; CHECK:       // %bb.0:
486 ; CHECK-NEXT:    neg v1.8h, v1.8h
487 ; CHECK-NEXT:    ushl v0.8h, v0.8h, v1.8h
488 ; CHECK-NEXT:    ret
489     %3 = lshr <8 x i16> %0, %1
490     ret <8 x i16> %3
493 define <2 x i32> @lshr_v2i32(<2 x i32> %0, <2 x i32> %1){
494 ; CHECK-LABEL: lshr_v2i32:
495 ; CHECK:       // %bb.0:
496 ; CHECK-NEXT:    neg v1.2s, v1.2s
497 ; CHECK-NEXT:    ushl v0.2s, v0.2s, v1.2s
498 ; CHECK-NEXT:    ret
499     %3 = lshr <2 x i32> %0, %1
500     ret <2 x i32> %3
503 define <4 x i32> @lshr_v4i32(<4 x i32> %0, <4 x i32> %1){
504 ; CHECK-LABEL: lshr_v4i32:
505 ; CHECK:       // %bb.0:
506 ; CHECK-NEXT:    neg v1.4s, v1.4s
507 ; CHECK-NEXT:    ushl v0.4s, v0.4s, v1.4s
508 ; CHECK-NEXT:    ret
509     %3 = lshr <4 x i32> %0, %1
510     ret <4 x i32> %3
513 define <2 x i64> @lshr_v2i64(<2 x i64> %0, <2 x i64> %1){
514 ; CHECK-LABEL: lshr_v2i64:
515 ; CHECK:       // %bb.0:
516 ; CHECK-NEXT:    neg v1.2d, v1.2d
517 ; CHECK-NEXT:    ushl v0.2d, v0.2d, v1.2d
518 ; CHECK-NEXT:    ret
519     %3 = lshr <2 x i64> %0, %1
520     ret <2 x i64> %3
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
530 ; CHECK-SD-NEXT:    ret
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
539 ; CHECK-GI-NEXT:    ret
540     %3 = shl <4 x i8> %0, %1
541     ret <4 x i8> %3
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
549 ; CHECK-SD-NEXT:    ret
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
555 ; CHECK-GI-NEXT:    ret
556     %3 = shl <32 x i8> %0, %1
557     ret <32 x i8> %3
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
566 ; CHECK-SD-NEXT:    ret
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
575 ; CHECK-GI-NEXT:    ret
576     %3 = shl <2 x i16> %0, %1
577     ret <2 x i16> %3
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
585 ; CHECK-SD-NEXT:    ret
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
591 ; CHECK-GI-NEXT:    ret
592     %3 = shl <16 x i16> %0, %1
593     ret <16 x i16> %3
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
600 ; CHECK-SD-NEXT:    ret
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
609 ; CHECK-GI-NEXT:    ret
610     %3 = shl <1 x i32> %0, %1
611     ret <1 x i32> %3
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
619 ; CHECK-SD-NEXT:    ret
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
625 ; CHECK-GI-NEXT:    ret
626     %3 = shl <8 x i32> %0, %1
627     ret <8 x i32> %3
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
635 ; CHECK-SD-NEXT:    ret
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
641 ; CHECK-GI-NEXT:    ret
642     %3 = shl <4 x i64> %0, %1
643     ret <4 x i64> %3
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
667 ; CHECK-SD-NEXT:    ret
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
696 ; CHECK-GI-NEXT:    ret
697     %3 = shl <2 x i128> %0, %1
698     ret <2 x i128> %3
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
709 ; CHECK-SD-NEXT:    ret
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
719 ; CHECK-GI-NEXT:    ret
720     %3 = ashr <4 x i8> %0, %1
721     ret <4 x i8> %3
724 define <32 x i8> @ashr_v32i8(<32 x i8> %0, <32 x i8> %1){
725 ; CHECK-LABEL: ashr_v32i8:
726 ; CHECK:       // %bb.0:
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
731 ; CHECK-NEXT:    ret
732     %3 = ashr <32 x i8> %0, %1
733     ret <32 x i8> %3
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
745 ; CHECK-SD-NEXT:    ret
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
755 ; CHECK-GI-NEXT:    ret
756     %3 = ashr <2 x i16> %0, %1
757     ret <2 x i16> %3
760 define <16 x i16> @ashr_v16i16(<16 x i16> %0, <16 x i16> %1){
761 ; CHECK-LABEL: ashr_v16i16:
762 ; CHECK:       // %bb.0:
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
767 ; CHECK-NEXT:    ret
768     %3 = ashr <16 x i16> %0, %1
769     ret <16 x i16> %3
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
777 ; CHECK-SD-NEXT:    ret
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
786 ; CHECK-GI-NEXT:    ret
787     %3 = ashr <1 x i32> %0, %1
788     ret <1 x i32> %3
791 define <8 x i32> @ashr_v8i32(<8 x i32> %0, <8 x i32> %1){
792 ; CHECK-LABEL: ashr_v8i32:
793 ; CHECK:       // %bb.0:
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
798 ; CHECK-NEXT:    ret
799     %3 = ashr <8 x i32> %0, %1
800     ret <8 x i32> %3
803 define <4 x i64> @ashr_v4i64(<4 x i64> %0, <4 x i64> %1){
804 ; CHECK-LABEL: ashr_v4i64:
805 ; CHECK:       // %bb.0:
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
810 ; CHECK-NEXT:    ret
811     %3 = ashr <4 x i64> %0, %1
812     ret <4 x i64> %3
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
838 ; CHECK-SD-NEXT:    ret
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
871 ; CHECK-GI-NEXT:    ret
872     %3 = ashr <2 x i128> %0, %1
873     ret <2 x i128> %3
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
883 ; CHECK-SD-NEXT:    ret
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
893 ; CHECK-GI-NEXT:    ret
894     %3 = lshr <4 x i8> %0, %1
895     ret <4 x i8> %3
898 define <32 x i8> @lshr_v32i8(<32 x i8> %0, <32 x i8> %1){
899 ; CHECK-LABEL: lshr_v32i8:
900 ; CHECK:       // %bb.0:
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
905 ; CHECK-NEXT:    ret
906     %3 = lshr <32 x i8> %0, %1
907     ret <32 x i8> %3
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
918 ; CHECK-SD-NEXT:    ret
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
928 ; CHECK-GI-NEXT:    ret
929     %3 = lshr <2 x i16> %0, %1
930     ret <2 x i16> %3
933 define <16 x i16> @lshr_v16i16(<16 x i16> %0, <16 x i16> %1){
934 ; CHECK-LABEL: lshr_v16i16:
935 ; CHECK:       // %bb.0:
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
940 ; CHECK-NEXT:    ret
941     %3 = lshr <16 x i16> %0, %1
942     ret <16 x i16> %3
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
950 ; CHECK-SD-NEXT:    ret
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
959 ; CHECK-GI-NEXT:    ret
960     %3 = lshr <1 x i32> %0, %1
961     ret <1 x i32> %3
964 define <8 x i32> @lshr_v8i32(<8 x i32> %0, <8 x i32> %1){
965 ; CHECK-LABEL: lshr_v8i32:
966 ; CHECK:       // %bb.0:
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
971 ; CHECK-NEXT:    ret
972     %3 = lshr <8 x i32> %0, %1
973     ret <8 x i32> %3
976 define <4 x i64> @lshr_v4i64(<4 x i64> %0, <4 x i64> %1){
977 ; CHECK-LABEL: lshr_v4i64:
978 ; CHECK:       // %bb.0:
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
983 ; CHECK-NEXT:    ret
984     %3 = lshr <4 x i64> %0, %1
985     ret <4 x i64> %3
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
1042     ret <2 x i128> %3
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
1077     ret <3 x i8> %3
1080 define <7 x i8> @shl_v7i8(<7 x i8> %0, <7 x i8> %1){
1081 ; CHECK-LABEL: shl_v7i8:
1082 ; CHECK:       // %bb.0:
1083 ; CHECK-NEXT:    ushl v0.8b, v0.8b, v1.8b
1084 ; CHECK-NEXT:    ret
1085     %3 = shl <7 x i8> %0, %1
1086     ret <7 x i8> %3
1089 define <3 x i16> @shl_v3i16(<3 x i16> %0, <3 x i16> %1){
1090 ; CHECK-LABEL: shl_v3i16:
1091 ; CHECK:       // %bb.0:
1092 ; CHECK-NEXT:    ushl v0.4h, v0.4h, v1.4h
1093 ; CHECK-NEXT:    ret
1094     %3 = shl <3 x i16> %0, %1
1095     ret <3 x i16> %3
1098 define <7 x i16> @shl_v7i16(<7 x i16> %0, <7 x i16> %1){
1099 ; CHECK-LABEL: shl_v7i16:
1100 ; CHECK:       // %bb.0:
1101 ; CHECK-NEXT:    ushl v0.8h, v0.8h, v1.8h
1102 ; CHECK-NEXT:    ret
1103     %3 = shl <7 x i16> %0, %1
1104     ret <7 x i16> %3
1107 define <3 x i32> @shl_v3i32(<3 x i32> %0, <3 x i32> %1){
1108 ; CHECK-LABEL: shl_v3i32:
1109 ; CHECK:       // %bb.0:
1110 ; CHECK-NEXT:    ushl v0.4s, v0.4s, v1.4s
1111 ; CHECK-NEXT:    ret
1112     %3 = shl <3 x i32> %0, %1
1113     ret <3 x i32> %3
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
1150     ret <3 x i8> %3
1153 define <7 x i8> @ashr_v7i8(<7 x i8> %0, <7 x i8> %1){
1154 ; CHECK-LABEL: ashr_v7i8:
1155 ; CHECK:       // %bb.0:
1156 ; CHECK-NEXT:    neg v1.8b, v1.8b
1157 ; CHECK-NEXT:    sshl v0.8b, v0.8b, v1.8b
1158 ; CHECK-NEXT:    ret
1159     %3 = ashr <7 x i8> %0, %1
1160     ret <7 x i8> %3
1163 define <3 x i16> @ashr_v3i16(<3 x i16> %0, <3 x i16> %1){
1164 ; CHECK-LABEL: ashr_v3i16:
1165 ; CHECK:       // %bb.0:
1166 ; CHECK-NEXT:    neg v1.4h, v1.4h
1167 ; CHECK-NEXT:    sshl v0.4h, v0.4h, v1.4h
1168 ; CHECK-NEXT:    ret
1169     %3 = ashr <3 x i16> %0, %1
1170     ret <3 x i16> %3
1173 define <7 x i16> @ashr_v7i16(<7 x i16> %0, <7 x i16> %1){
1174 ; CHECK-LABEL: ashr_v7i16:
1175 ; CHECK:       // %bb.0:
1176 ; CHECK-NEXT:    neg v1.8h, v1.8h
1177 ; CHECK-NEXT:    sshl v0.8h, v0.8h, v1.8h
1178 ; CHECK-NEXT:    ret
1179     %3 = ashr <7 x i16> %0, %1
1180     ret <7 x i16> %3
1183 define <3 x i32> @ashr_v3i32(<3 x i32> %0, <3 x i32> %1){
1184 ; CHECK-LABEL: ashr_v3i32:
1185 ; CHECK:       // %bb.0:
1186 ; CHECK-NEXT:    neg v1.4s, v1.4s
1187 ; CHECK-NEXT:    sshl v0.4s, v0.4s, v1.4s
1188 ; CHECK-NEXT:    ret
1189     %3 = ashr <3 x i32> %0, %1
1190     ret <3 x i32> %3
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
1226     ret <3 x i8> %3
1229 define <7 x i8> @lshr_v7i8(<7 x i8> %0, <7 x i8> %1){
1230 ; CHECK-LABEL: lshr_v7i8:
1231 ; CHECK:       // %bb.0:
1232 ; CHECK-NEXT:    neg v1.8b, v1.8b
1233 ; CHECK-NEXT:    ushl v0.8b, v0.8b, v1.8b
1234 ; CHECK-NEXT:    ret
1235     %3 = lshr <7 x i8> %0, %1
1236     ret <7 x i8> %3
1239 define <3 x i16> @lshr_v3i16(<3 x i16> %0, <3 x i16> %1){
1240 ; CHECK-LABEL: lshr_v3i16:
1241 ; CHECK:       // %bb.0:
1242 ; CHECK-NEXT:    neg v1.4h, v1.4h
1243 ; CHECK-NEXT:    ushl v0.4h, v0.4h, v1.4h
1244 ; CHECK-NEXT:    ret
1245     %3 = lshr <3 x i16> %0, %1
1246     ret <3 x i16> %3
1249 define <7 x i16> @lshr_v7i16(<7 x i16> %0, <7 x i16> %1){
1250 ; CHECK-LABEL: lshr_v7i16:
1251 ; CHECK:       // %bb.0:
1252 ; CHECK-NEXT:    neg v1.8h, v1.8h
1253 ; CHECK-NEXT:    ushl v0.8h, v0.8h, v1.8h
1254 ; CHECK-NEXT:    ret
1255     %3 = lshr <7 x i16> %0, %1
1256     ret <7 x i16> %3
1259 define <3 x i32> @lshr_v3i32(<3 x i32> %0, <3 x i32> %1){
1260 ; CHECK-LABEL: lshr_v3i32:
1261 ; CHECK:       // %bb.0:
1262 ; CHECK-NEXT:    neg v1.4s, v1.4s
1263 ; CHECK-NEXT:    ushl v0.4s, v0.4s, v1.4s
1264 ; CHECK-NEXT:    ret
1265     %3 = lshr <3 x i32> %0, %1
1266     ret <3 x i32> %3
1269 ; TODO:
1270 ; ===== Vector with Odd Element Sizes =====