[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / AArch64 / shift_minsize.ll
blobd1b95e87577b6e55ce01ce3dcb2ef6d8f42a98ce
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s
4 define i64 @f0(i64 %val, i64 %amt) minsize optsize {
5 ; CHECK-LABEL: f0:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    lsl x0, x0, x1
8 ; CHECK-NEXT:    ret
9   %res = shl i64 %val, %amt
10   ret i64 %res
13 define i32 @f1(i64 %x, i64 %y) minsize optsize {
14 ; CHECK-LABEL: f1:
15 ; CHECK:       // %bb.0:
16 ; CHECK-NEXT:    lsl x0, x0, x1
17 ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0
18 ; CHECK-NEXT:    ret
19         %a = shl i64 %x, %y
20         %b = trunc i64 %a to i32
21         ret i32 %b
24 define i32 @f2(i64 %x, i64 %y) minsize optsize {
25 ; CHECK-LABEL: f2:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    asr x0, x0, x1
28 ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0
29 ; CHECK-NEXT:    ret
30         %a = ashr i64 %x, %y
31         %b = trunc i64 %a to i32
32         ret i32 %b
35 define i32 @f3(i64 %x, i64 %y) minsize optsize {
36 ; CHECK-LABEL: f3:
37 ; CHECK:       // %bb.0:
38 ; CHECK-NEXT:    lsr x0, x0, x1
39 ; CHECK-NEXT:    // kill: def $w0 killed $w0 killed $x0
40 ; CHECK-NEXT:    ret
41         %a = lshr i64 %x, %y
42         %b = trunc i64 %a to i32
43         ret i32 %b
46 define dso_local { i64, i64 } @shl128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {
47 ; CHECK-LABEL: shl128:
48 ; CHECK:       // %bb.0: // %entry
49 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
50 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
51 ; CHECK-NEXT:    .cfi_offset w30, -16
52 ; CHECK-NEXT:    // kill: def $w2 killed $w2 def $x2
53 ; CHECK-NEXT:    bl __ashlti3
54 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
55 ; CHECK-NEXT:    ret
56 entry:
57   %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128
58   %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64
59   %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128
60   %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext
61   %conv = sext i8 %y to i32
62   %sh_prom = zext i32 %conv to i128
63   %shl = shl i128 %x.sroa.0.0.insert.insert, %sh_prom
64   %retval.sroa.0.0.extract.trunc = trunc i128 %shl to i64
65   %retval.sroa.2.0.extract.shift = lshr i128 %shl, 64
66   %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64
67   %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0
68   %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1
69   ret { i64, i64 } %.fca.1.insert
72 define dso_local { i64, i64 } @ashr128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {
73 ; CHECK-LABEL: ashr128:
74 ; CHECK:       // %bb.0: // %entry
75 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
76 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
77 ; CHECK-NEXT:    .cfi_offset w30, -16
78 ; CHECK-NEXT:    // kill: def $w2 killed $w2 def $x2
79 ; CHECK-NEXT:    bl __ashrti3
80 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
81 ; CHECK-NEXT:    ret
82 entry:
83   %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128
84   %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64
85   %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128
86   %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext
87   %conv = sext i8 %y to i32
88   %sh_prom = zext i32 %conv to i128
89   %shr = ashr i128 %x.sroa.0.0.insert.insert, %sh_prom
90   %retval.sroa.0.0.extract.trunc = trunc i128 %shr to i64
91   %retval.sroa.2.0.extract.shift = lshr i128 %shr, 64
92   %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64
93   %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0
94   %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1
95   ret { i64, i64 } %.fca.1.insert
98 define dso_local { i64, i64 } @lshr128(i64 %x.coerce0, i64 %x.coerce1, i8 signext %y) minsize optsize {
99 ; CHECK-LABEL: lshr128:
100 ; CHECK:       // %bb.0: // %entry
101 ; CHECK-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
102 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
103 ; CHECK-NEXT:    .cfi_offset w30, -16
104 ; CHECK-NEXT:    // kill: def $w2 killed $w2 def $x2
105 ; CHECK-NEXT:    bl __lshrti3
106 ; CHECK-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
107 ; CHECK-NEXT:    ret
108 entry:
109   %x.sroa.2.0.insert.ext = zext i64 %x.coerce1 to i128
110   %x.sroa.2.0.insert.shift = shl nuw i128 %x.sroa.2.0.insert.ext, 64
111   %x.sroa.0.0.insert.ext = zext i64 %x.coerce0 to i128
112   %x.sroa.0.0.insert.insert = or i128 %x.sroa.2.0.insert.shift, %x.sroa.0.0.insert.ext
113   %conv = sext i8 %y to i32
114   %sh_prom = zext i32 %conv to i128
115   %shr = lshr i128 %x.sroa.0.0.insert.insert, %sh_prom
116   %retval.sroa.0.0.extract.trunc = trunc i128 %shr to i64
117   %retval.sroa.2.0.extract.shift = lshr i128 %shr, 64
118   %retval.sroa.2.0.extract.trunc = trunc i128 %retval.sroa.2.0.extract.shift to i64
119   %.fca.0.insert = insertvalue { i64, i64 } undef, i64 %retval.sroa.0.0.extract.trunc, 0
120   %.fca.1.insert = insertvalue { i64, i64 } %.fca.0.insert, i64 %retval.sroa.2.0.extract.trunc, 1
121   ret { i64, i64 } %.fca.1.insert