[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / fast-isel-shift.ll
blob95891db80bc4edfddb61367caeba029801ca5e90
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -fast-isel -fast-isel-abort=1 -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
4 define zeroext i16 @asr_zext_i1_i16(i1 %b) {
5 ; CHECK-LABEL: asr_zext_i1_i16:
6 ; CHECK:       ; %bb.0:
7 ; CHECK-NEXT:    uxth w0, wzr
8 ; CHECK-NEXT:    ret
9   %1 = zext i1 %b to i16
10   %2 = ashr i16 %1, 1
11   ret i16 %2
14 define signext i16 @asr_sext_i1_i16(i1 %b) {
15 ; CHECK-LABEL: asr_sext_i1_i16:
16 ; CHECK:       ; %bb.0:
17 ; CHECK-NEXT:    sbfx w8, w0, #0, #1
18 ; CHECK-NEXT:    sxth w0, w8
19 ; CHECK-NEXT:    ret
20   %1 = sext i1 %b to i16
21   %2 = ashr i16 %1, 1
22   ret i16 %2
25 define i32 @asr_zext_i1_i32(i1 %b) {
26 ; CHECK-LABEL: asr_zext_i1_i32:
27 ; CHECK:       ; %bb.0:
28 ; CHECK-NEXT:    mov w0, wzr
29 ; CHECK-NEXT:    ret
30   %1 = zext i1 %b to i32
31   %2 = ashr i32 %1, 1
32   ret i32 %2
35 define i32 @asr_sext_i1_i32(i1 %b) {
36 ; CHECK-LABEL: asr_sext_i1_i32:
37 ; CHECK:       ; %bb.0:
38 ; CHECK-NEXT:    sbfx w0, w0, #0, #1
39 ; CHECK-NEXT:    ret
40   %1 = sext i1 %b to i32
41   %2 = ashr i32 %1, 1
42   ret i32 %2
45 define i64 @asr_zext_i1_i64(i1 %b) {
46 ; CHECK-LABEL: asr_zext_i1_i64:
47 ; CHECK:       ; %bb.0:
48 ; CHECK-NEXT:    mov x0, xzr
49 ; CHECK-NEXT:    ret
50   %1 = zext i1 %b to i64
51   %2 = ashr i64 %1, 1
52   ret i64 %2
55 define i64 @asr_sext_i1_i64(i1 %b) {
56 ; CHECK-LABEL: asr_sext_i1_i64:
57 ; CHECK:       ; %bb.0:
58 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
59 ; CHECK-NEXT:    sbfx x0, x0, #0, #1
60 ; CHECK-NEXT:    ret
61   %1 = sext i1 %b to i64
62   %2 = ashr i64 %1, 1
63   ret i64 %2
66 define zeroext i16 @lsr_zext_i1_i16(i1 %b) {
67 ; CHECK-LABEL: lsr_zext_i1_i16:
68 ; CHECK:       ; %bb.0:
69 ; CHECK-NEXT:    uxth w0, wzr
70 ; CHECK-NEXT:    ret
71   %1 = zext i1 %b to i16
72   %2 = lshr i16 %1, 1
73   ret i16 %2
76 define signext i16 @lsr_sext_i1_i16(i1 %b) {
77 ; CHECK-LABEL: lsr_sext_i1_i16:
78 ; CHECK:       ; %bb.0:
79 ; CHECK-NEXT:    sbfx w8, w0, #0, #1
80 ; CHECK-NEXT:    ubfx w8, w8, #1, #15
81 ; CHECK-NEXT:    sxth w0, w8
82 ; CHECK-NEXT:    ret
83   %1 = sext i1 %b to i16
84   %2 = lshr i16 %1, 1
85   ret i16 %2
88 define i32 @lsr_zext_i1_i32(i1 %b) {
89 ; CHECK-LABEL: lsr_zext_i1_i32:
90 ; CHECK:       ; %bb.0:
91 ; CHECK-NEXT:    mov w0, wzr
92 ; CHECK-NEXT:    ret
93   %1 = zext i1 %b to i32
94   %2 = lshr i32 %1, 1
95   ret i32 %2
98 define i32 @lsr_sext_i1_i32(i1 %b) {
99 ; CHECK-LABEL: lsr_sext_i1_i32:
100 ; CHECK:       ; %bb.0:
101 ; CHECK-NEXT:    sbfx w8, w0, #0, #1
102 ; CHECK-NEXT:    lsr w0, w8, #1
103 ; CHECK-NEXT:    ret
104   %1 = sext i1 %b to i32
105   %2 = lshr i32 %1, 1
106   ret i32 %2
109 define i64 @lsr_zext_i1_i64(i1 %b) {
110 ; CHECK-LABEL: lsr_zext_i1_i64:
111 ; CHECK:       ; %bb.0:
112 ; CHECK-NEXT:    mov x0, xzr
113 ; CHECK-NEXT:    ret
114   %1 = zext i1 %b to i64
115   %2 = lshr i64 %1, 1
116   ret i64 %2
119 define zeroext i16 @lsl_zext_i1_i16(i1 %b) {
120 ; CHECK-LABEL: lsl_zext_i1_i16:
121 ; CHECK:       ; %bb.0:
122 ; CHECK-NEXT:    ubfiz w8, w0, #4, #1
123 ; CHECK-NEXT:    uxth w0, w8
124 ; CHECK-NEXT:    ret
125   %1 = zext i1 %b to i16
126   %2 = shl i16 %1, 4
127   ret i16 %2
130 define signext i16 @lsl_sext_i1_i16(i1 %b) {
131 ; CHECK-LABEL: lsl_sext_i1_i16:
132 ; CHECK:       ; %bb.0:
133 ; CHECK-NEXT:    sbfiz w8, w0, #4, #1
134 ; CHECK-NEXT:    sxth w0, w8
135 ; CHECK-NEXT:    ret
136   %1 = sext i1 %b to i16
137   %2 = shl i16 %1, 4
138   ret i16 %2
141 define i32 @lsl_zext_i1_i32(i1 %b) {
142 ; CHECK-LABEL: lsl_zext_i1_i32:
143 ; CHECK:       ; %bb.0:
144 ; CHECK-NEXT:    ubfiz w0, w0, #4, #1
145 ; CHECK-NEXT:    ret
146   %1 = zext i1 %b to i32
147   %2 = shl i32 %1, 4
148   ret i32 %2
151 define i32 @lsl_sext_i1_i32(i1 %b) {
152 ; CHECK-LABEL: lsl_sext_i1_i32:
153 ; CHECK:       ; %bb.0:
154 ; CHECK-NEXT:    sbfiz w0, w0, #4, #1
155 ; CHECK-NEXT:    ret
156   %1 = sext i1 %b to i32
157   %2 = shl i32 %1, 4
158   ret i32 %2
161 define i64 @lsl_zext_i1_i64(i1 %b) {
162 ; CHECK-LABEL: lsl_zext_i1_i64:
163 ; CHECK:       ; %bb.0:
164 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
165 ; CHECK-NEXT:    ubfiz x0, x0, #4, #1
166 ; CHECK-NEXT:    ret
167   %1 = zext i1 %b to i64
168   %2 = shl i64 %1, 4
169   ret i64 %2
172 define i64 @lsl_sext_i1_i64(i1 %b) {
173 ; CHECK-LABEL: lsl_sext_i1_i64:
174 ; CHECK:       ; %bb.0:
175 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
176 ; CHECK-NEXT:    sbfiz x0, x0, #4, #1
177 ; CHECK-NEXT:    ret
178   %1 = sext i1 %b to i64
179   %2 = shl i64 %1, 4
180   ret i64 %2
183 define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
184 ; CHECK-LABEL: lslv_i8:
185 ; CHECK:       ; %bb.0:
186 ; CHECK-NEXT:    and w8, w1, #0xff
187 ; CHECK-NEXT:    lsl w8, w0, w8
188 ; CHECK-NEXT:    and w8, w8, #0xff
189 ; CHECK-NEXT:    uxtb w0, w8
190 ; CHECK-NEXT:    ret
191   %1 = shl i8 %a, %b
192   ret i8 %1
195 define zeroext i8 @lsl_i8(i8 %a) {
196 ; CHECK-LABEL: lsl_i8:
197 ; CHECK:       ; %bb.0:
198 ; CHECK-NEXT:    ubfiz w8, w0, #4, #4
199 ; CHECK-NEXT:    uxtb w0, w8
200 ; CHECK-NEXT:    ret
201   %1 = shl i8 %a, 4
202   ret i8 %1
205 define zeroext i16 @lsl_zext_i8_i16(i8 %b) {
206 ; CHECK-LABEL: lsl_zext_i8_i16:
207 ; CHECK:       ; %bb.0:
208 ; CHECK-NEXT:    ubfiz w8, w0, #4, #8
209 ; CHECK-NEXT:    uxth w0, w8
210 ; CHECK-NEXT:    ret
211   %1 = zext i8 %b to i16
212   %2 = shl i16 %1, 4
213   ret i16 %2
216 define signext i16 @lsl_sext_i8_i16(i8 %b) {
217 ; CHECK-LABEL: lsl_sext_i8_i16:
218 ; CHECK:       ; %bb.0:
219 ; CHECK-NEXT:    sbfiz w8, w0, #4, #8
220 ; CHECK-NEXT:    sxth w0, w8
221 ; CHECK-NEXT:    ret
222   %1 = sext i8 %b to i16
223   %2 = shl i16 %1, 4
224   ret i16 %2
227 define i32 @lsl_zext_i8_i32(i8 %b) {
228 ; CHECK-LABEL: lsl_zext_i8_i32:
229 ; CHECK:       ; %bb.0:
230 ; CHECK-NEXT:    ubfiz w0, w0, #4, #8
231 ; CHECK-NEXT:    ret
232   %1 = zext i8 %b to i32
233   %2 = shl i32 %1, 4
234   ret i32 %2
237 define i32 @lsl_sext_i8_i32(i8 %b) {
238 ; CHECK-LABEL: lsl_sext_i8_i32:
239 ; CHECK:       ; %bb.0:
240 ; CHECK-NEXT:    sbfiz w0, w0, #4, #8
241 ; CHECK-NEXT:    ret
242   %1 = sext i8 %b to i32
243   %2 = shl i32 %1, 4
244   ret i32 %2
247 define i64 @lsl_zext_i8_i64(i8 %b) {
248 ; CHECK-LABEL: lsl_zext_i8_i64:
249 ; CHECK:       ; %bb.0:
250 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
251 ; CHECK-NEXT:    ubfiz x0, x0, #4, #8
252 ; CHECK-NEXT:    ret
253   %1 = zext i8 %b to i64
254   %2 = shl i64 %1, 4
255   ret i64 %2
258 define i64 @lsl_sext_i8_i64(i8 %b) {
259 ; CHECK-LABEL: lsl_sext_i8_i64:
260 ; CHECK:       ; %bb.0:
261 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
262 ; CHECK-NEXT:    sbfiz x0, x0, #4, #8
263 ; CHECK-NEXT:    ret
264   %1 = sext i8 %b to i64
265   %2 = shl i64 %1, 4
266   ret i64 %2
269 define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
270 ; CHECK-LABEL: lslv_i16:
271 ; CHECK:       ; %bb.0:
272 ; CHECK-NEXT:    and w8, w1, #0xffff
273 ; CHECK-NEXT:    lsl w8, w0, w8
274 ; CHECK-NEXT:    and w8, w8, #0xffff
275 ; CHECK-NEXT:    uxth w0, w8
276 ; CHECK-NEXT:    ret
277   %1 = shl i16 %a, %b
278   ret i16 %1
281 define zeroext i16 @lsl_i16(i16 %a) {
282 ; CHECK-LABEL: lsl_i16:
283 ; CHECK:       ; %bb.0:
284 ; CHECK-NEXT:    ubfiz w8, w0, #8, #8
285 ; CHECK-NEXT:    uxth w0, w8
286 ; CHECK-NEXT:    ret
287   %1 = shl i16 %a, 8
288   ret i16 %1
291 define i32 @lsl_zext_i16_i32(i16 %b) {
292 ; CHECK-LABEL: lsl_zext_i16_i32:
293 ; CHECK:       ; %bb.0:
294 ; CHECK-NEXT:    ubfiz w0, w0, #8, #16
295 ; CHECK-NEXT:    ret
296   %1 = zext i16 %b to i32
297   %2 = shl i32 %1, 8
298   ret i32 %2
301 define i32 @lsl_sext_i16_i32(i16 %b) {
302 ; CHECK-LABEL: lsl_sext_i16_i32:
303 ; CHECK:       ; %bb.0:
304 ; CHECK-NEXT:    sbfiz w0, w0, #8, #16
305 ; CHECK-NEXT:    ret
306   %1 = sext i16 %b to i32
307   %2 = shl i32 %1, 8
308   ret i32 %2
311 define i64 @lsl_zext_i16_i64(i16 %b) {
312 ; CHECK-LABEL: lsl_zext_i16_i64:
313 ; CHECK:       ; %bb.0:
314 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
315 ; CHECK-NEXT:    ubfiz x0, x0, #8, #16
316 ; CHECK-NEXT:    ret
317   %1 = zext i16 %b to i64
318   %2 = shl i64 %1, 8
319   ret i64 %2
322 define i64 @lsl_sext_i16_i64(i16 %b) {
323 ; CHECK-LABEL: lsl_sext_i16_i64:
324 ; CHECK:       ; %bb.0:
325 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
326 ; CHECK-NEXT:    sbfiz x0, x0, #8, #16
327 ; CHECK-NEXT:    ret
328   %1 = sext i16 %b to i64
329   %2 = shl i64 %1, 8
330   ret i64 %2
333 define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
334 ; CHECK-LABEL: lslv_i32:
335 ; CHECK:       ; %bb.0:
336 ; CHECK-NEXT:    lsl w0, w0, w1
337 ; CHECK-NEXT:    ret
338   %1 = shl i32 %a, %b
339   ret i32 %1
342 define zeroext i32 @lsl_i32(i32 %a) {
343 ; CHECK-LABEL: lsl_i32:
344 ; CHECK:       ; %bb.0:
345 ; CHECK-NEXT:    lsl w0, w0, #16
346 ; CHECK-NEXT:    ret
347   %1 = shl i32 %a, 16
348   ret i32 %1
351 define i64 @lsl_zext_i32_i64(i32 %b) {
352 ; CHECK-LABEL: lsl_zext_i32_i64:
353 ; CHECK:       ; %bb.0:
354 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
355 ; CHECK-NEXT:    ubfiz x0, x0, #16, #32
356 ; CHECK-NEXT:    ret
357   %1 = zext i32 %b to i64
358   %2 = shl i64 %1, 16
359   ret i64 %2
362 define i64 @lsl_sext_i32_i64(i32 %b) {
363 ; CHECK-LABEL: lsl_sext_i32_i64:
364 ; CHECK:       ; %bb.0:
365 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
366 ; CHECK-NEXT:    sbfiz x0, x0, #16, #32
367 ; CHECK-NEXT:    ret
368   %1 = sext i32 %b to i64
369   %2 = shl i64 %1, 16
370   ret i64 %2
373 define i64 @lslv_i64(i64 %a, i64 %b) {
374 ; CHECK-LABEL: lslv_i64:
375 ; CHECK:       ; %bb.0:
376 ; CHECK-NEXT:    lsl x0, x0, x1
377 ; CHECK-NEXT:    ret
378   %1 = shl i64 %a, %b
379   ret i64 %1
382 define i64 @lsl_i64(i64 %a) {
383 ; CHECK-LABEL: lsl_i64:
384 ; CHECK:       ; %bb.0:
385 ; CHECK-NEXT:    lsl x0, x0, #32
386 ; CHECK-NEXT:    ret
387   %1 = shl i64 %a, 32
388   ret i64 %1
391 define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
392 ; CHECK-LABEL: lsrv_i8:
393 ; CHECK:       ; %bb.0:
394 ; CHECK-NEXT:    and w8, w0, #0xff
395 ; CHECK-NEXT:    and w9, w1, #0xff
396 ; CHECK-NEXT:    lsr w8, w8, w9
397 ; CHECK-NEXT:    and w8, w8, #0xff
398 ; CHECK-NEXT:    uxtb w0, w8
399 ; CHECK-NEXT:    ret
400   %1 = lshr i8 %a, %b
401   ret i8 %1
404 define zeroext i8 @lsr_i8(i8 %a) {
405 ; CHECK-LABEL: lsr_i8:
406 ; CHECK:       ; %bb.0:
407 ; CHECK-NEXT:    ubfx w8, w0, #4, #4
408 ; CHECK-NEXT:    uxtb w0, w8
409 ; CHECK-NEXT:    ret
410   %1 = lshr i8 %a, 4
411   ret i8 %1
414 define zeroext i16 @lsr_zext_i8_i16(i8 %b) {
415 ; CHECK-LABEL: lsr_zext_i8_i16:
416 ; CHECK:       ; %bb.0:
417 ; CHECK-NEXT:    ubfx w8, w0, #4, #4
418 ; CHECK-NEXT:    uxth w0, w8
419 ; CHECK-NEXT:    ret
420   %1 = zext i8 %b to i16
421   %2 = lshr i16 %1, 4
422   ret i16 %2
425 define signext i16 @lsr_sext_i8_i16(i8 %b) {
426 ; CHECK-LABEL: lsr_sext_i8_i16:
427 ; CHECK:       ; %bb.0:
428 ; CHECK-NEXT:    sxtb w8, w0
429 ; CHECK-NEXT:    ubfx w8, w8, #4, #12
430 ; CHECK-NEXT:    sxth w0, w8
431 ; CHECK-NEXT:    ret
432   %1 = sext i8 %b to i16
433   %2 = lshr i16 %1, 4
434   ret i16 %2
437 define i32 @lsr_zext_i8_i32(i8 %b) {
438 ; CHECK-LABEL: lsr_zext_i8_i32:
439 ; CHECK:       ; %bb.0:
440 ; CHECK-NEXT:    ubfx w0, w0, #4, #4
441 ; CHECK-NEXT:    ret
442   %1 = zext i8 %b to i32
443   %2 = lshr i32 %1, 4
444   ret i32 %2
447 define i32 @lsr_sext_i8_i32(i8 %b) {
448 ; CHECK-LABEL: lsr_sext_i8_i32:
449 ; CHECK:       ; %bb.0:
450 ; CHECK-NEXT:    sxtb w8, w0
451 ; CHECK-NEXT:    lsr w0, w8, #4
452 ; CHECK-NEXT:    ret
453   %1 = sext i8 %b to i32
454   %2 = lshr i32 %1, 4
455   ret i32 %2
458 define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
459 ; CHECK-LABEL: lsrv_i16:
460 ; CHECK:       ; %bb.0:
461 ; CHECK-NEXT:    and w8, w0, #0xffff
462 ; CHECK-NEXT:    and w9, w1, #0xffff
463 ; CHECK-NEXT:    lsr w8, w8, w9
464 ; CHECK-NEXT:    and w8, w8, #0xffff
465 ; CHECK-NEXT:    uxth w0, w8
466 ; CHECK-NEXT:    ret
467   %1 = lshr i16 %a, %b
468   ret i16 %1
471 define zeroext i16 @lsr_i16(i16 %a) {
472 ; CHECK-LABEL: lsr_i16:
473 ; CHECK:       ; %bb.0:
474 ; CHECK-NEXT:    ubfx w8, w0, #8, #8
475 ; CHECK-NEXT:    uxth w0, w8
476 ; CHECK-NEXT:    ret
477   %1 = lshr i16 %a, 8
478   ret i16 %1
481 define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
482 ; CHECK-LABEL: lsrv_i32:
483 ; CHECK:       ; %bb.0:
484 ; CHECK-NEXT:    lsr w0, w0, w1
485 ; CHECK-NEXT:    ret
486   %1 = lshr i32 %a, %b
487   ret i32 %1
490 define zeroext i32 @lsr_i32(i32 %a) {
491 ; CHECK-LABEL: lsr_i32:
492 ; CHECK:       ; %bb.0:
493 ; CHECK-NEXT:    lsr w0, w0, #16
494 ; CHECK-NEXT:    ret
495   %1 = lshr i32 %a, 16
496   ret i32 %1
499 define i64 @lsrv_i64(i64 %a, i64 %b) {
500 ; CHECK-LABEL: lsrv_i64:
501 ; CHECK:       ; %bb.0:
502 ; CHECK-NEXT:    lsr x0, x0, x1
503 ; CHECK-NEXT:    ret
504   %1 = lshr i64 %a, %b
505   ret i64 %1
508 define i64 @lsr_i64(i64 %a) {
509 ; CHECK-LABEL: lsr_i64:
510 ; CHECK:       ; %bb.0:
511 ; CHECK-NEXT:    lsr x0, x0, #32
512 ; CHECK-NEXT:    ret
513   %1 = lshr i64 %a, 32
514   ret i64 %1
517 define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
518 ; CHECK-LABEL: asrv_i8:
519 ; CHECK:       ; %bb.0:
520 ; CHECK-NEXT:    sxtb w8, w0
521 ; CHECK-NEXT:    and w9, w1, #0xff
522 ; CHECK-NEXT:    asr w8, w8, w9
523 ; CHECK-NEXT:    and w8, w8, #0xff
524 ; CHECK-NEXT:    uxtb w0, w8
525 ; CHECK-NEXT:    ret
526   %1 = ashr i8 %a, %b
527   ret i8 %1
530 define zeroext i8 @asr_i8(i8 %a) {
531 ; CHECK-LABEL: asr_i8:
532 ; CHECK:       ; %bb.0:
533 ; CHECK-NEXT:    sbfx w8, w0, #4, #4
534 ; CHECK-NEXT:    uxtb w0, w8
535 ; CHECK-NEXT:    ret
536   %1 = ashr i8 %a, 4
537   ret i8 %1
540 define zeroext i16 @asr_zext_i8_i16(i8 %b) {
541 ; CHECK-LABEL: asr_zext_i8_i16:
542 ; CHECK:       ; %bb.0:
543 ; CHECK-NEXT:    ubfx w8, w0, #4, #4
544 ; CHECK-NEXT:    uxth w0, w8
545 ; CHECK-NEXT:    ret
546   %1 = zext i8 %b to i16
547   %2 = ashr i16 %1, 4
548   ret i16 %2
551 define signext i16 @asr_sext_i8_i16(i8 %b) {
552 ; CHECK-LABEL: asr_sext_i8_i16:
553 ; CHECK:       ; %bb.0:
554 ; CHECK-NEXT:    sbfx w8, w0, #4, #4
555 ; CHECK-NEXT:    sxth w0, w8
556 ; CHECK-NEXT:    ret
557   %1 = sext i8 %b to i16
558   %2 = ashr i16 %1, 4
559   ret i16 %2
562 define i32 @asr_zext_i8_i32(i8 %b) {
563 ; CHECK-LABEL: asr_zext_i8_i32:
564 ; CHECK:       ; %bb.0:
565 ; CHECK-NEXT:    ubfx w0, w0, #4, #4
566 ; CHECK-NEXT:    ret
567   %1 = zext i8 %b to i32
568   %2 = ashr i32 %1, 4
569   ret i32 %2
572 define i32 @asr_sext_i8_i32(i8 %b) {
573 ; CHECK-LABEL: asr_sext_i8_i32:
574 ; CHECK:       ; %bb.0:
575 ; CHECK-NEXT:    sbfx w0, w0, #4, #4
576 ; CHECK-NEXT:    ret
577   %1 = sext i8 %b to i32
578   %2 = ashr i32 %1, 4
579   ret i32 %2
582 define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
583 ; CHECK-LABEL: asrv_i16:
584 ; CHECK:       ; %bb.0:
585 ; CHECK-NEXT:    sxth w8, w0
586 ; CHECK-NEXT:    and w9, w1, #0xffff
587 ; CHECK-NEXT:    asr w8, w8, w9
588 ; CHECK-NEXT:    and w8, w8, #0xffff
589 ; CHECK-NEXT:    uxth w0, w8
590 ; CHECK-NEXT:    ret
591   %1 = ashr i16 %a, %b
592   ret i16 %1
595 define zeroext i16 @asr_i16(i16 %a) {
596 ; CHECK-LABEL: asr_i16:
597 ; CHECK:       ; %bb.0:
598 ; CHECK-NEXT:    sbfx w8, w0, #8, #8
599 ; CHECK-NEXT:    uxth w0, w8
600 ; CHECK-NEXT:    ret
601   %1 = ashr i16 %a, 8
602   ret i16 %1
605 define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
606 ; CHECK-LABEL: asrv_i32:
607 ; CHECK:       ; %bb.0:
608 ; CHECK-NEXT:    asr w0, w0, w1
609 ; CHECK-NEXT:    ret
610   %1 = ashr i32 %a, %b
611   ret i32 %1
614 define zeroext i32 @asr_i32(i32 %a) {
615 ; CHECK-LABEL: asr_i32:
616 ; CHECK:       ; %bb.0:
617 ; CHECK-NEXT:    asr w0, w0, #16
618 ; CHECK-NEXT:    ret
619   %1 = ashr i32 %a, 16
620   ret i32 %1
623 define i64 @asrv_i64(i64 %a, i64 %b) {
624 ; CHECK-LABEL: asrv_i64:
625 ; CHECK:       ; %bb.0:
626 ; CHECK-NEXT:    asr x0, x0, x1
627 ; CHECK-NEXT:    ret
628   %1 = ashr i64 %a, %b
629   ret i64 %1
632 define i64 @asr_i64(i64 %a) {
633 ; CHECK-LABEL: asr_i64:
634 ; CHECK:       ; %bb.0:
635 ; CHECK-NEXT:    asr x0, x0, #32
636 ; CHECK-NEXT:    ret
637   %1 = ashr i64 %a, 32
638   ret i64 %1
641 define i32 @shift_test1(i8 %a) {
642 ; CHECK-LABEL: shift_test1:
643 ; CHECK:       ; %bb.0:
644 ; CHECK-NEXT:    ubfiz w8, w0, #4, #4
645 ; CHECK-NEXT:    sbfx w8, w8, #4, #4
646 ; CHECK-NEXT:    sxtb w0, w8
647 ; CHECK-NEXT:    ret
648   %1 = shl i8 %a, 4
649   %2 = ashr i8 %1, 4
650   %3 = sext i8 %2 to i32
651   ret i32 %3
654 ; Test zero shifts
656 define i32 @shl_zero(i32 %a) {
657 ; CHECK-LABEL: shl_zero:
658 ; CHECK:       ; %bb.0:
659 ; CHECK-NEXT:    ret
660   %1 = shl i32 %a, 0
661   ret i32 %1
664 define i32 @lshr_zero(i32 %a) {
665 ; CHECK-LABEL: lshr_zero:
666 ; CHECK:       ; %bb.0:
667 ; CHECK-NEXT:    ret
668   %1 = lshr i32 %a, 0
669   ret i32 %1
672 define i32 @ashr_zero(i32 %a) {
673 ; CHECK-LABEL: ashr_zero:
674 ; CHECK:       ; %bb.0:
675 ; CHECK-NEXT:    ret
676   %1 = ashr i32 %a, 0
677   ret i32 %1
680 define i64 @shl_zext_zero(i32 %a) {
681 ; CHECK-LABEL: shl_zext_zero:
682 ; CHECK:       ; %bb.0:
683 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
684 ; CHECK-NEXT:    ubfx x0, x0, #0, #32
685 ; CHECK-NEXT:    ret
686   %1 = zext i32 %a to i64
687   %2 = shl i64 %1, 0
688   ret i64 %2
691 define i64 @lshr_zext_zero(i32 %a) {
692 ; CHECK-LABEL: lshr_zext_zero:
693 ; CHECK:       ; %bb.0:
694 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
695 ; CHECK-NEXT:    ubfx x0, x0, #0, #32
696 ; CHECK-NEXT:    ret
697   %1 = zext i32 %a to i64
698   %2 = lshr i64 %1, 0
699   ret i64 %2
702 define i64 @ashr_zext_zero(i32 %a) {
703 ; CHECK-LABEL: ashr_zext_zero:
704 ; CHECK:       ; %bb.0:
705 ; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0
706 ; CHECK-NEXT:    ubfx x0, x0, #0, #32
707 ; CHECK-NEXT:    ret
708   %1 = zext i32 %a to i64
709   %2 = ashr i64 %1, 0
710   ret i64 %2