[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / Thumb / shift-and.ll
blobb8e3416adbb865abdf789b831da8c40542c78b6d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s
4 define i32 @test1(i32 %x) {
5 ; CHECK-LABEL: test1:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    lsls r0, r0, #20
8 ; CHECK-NEXT:    lsrs r0, r0, #22
9 ; CHECK-NEXT:    bx lr
10 entry:
11   %0 = lshr i32 %x, 2
12   %shr = and i32 %0, 1023
13   ret i32 %shr
16 define i32 @test2(i32 %x) {
17 ; CHECK-LABEL: test2:
18 ; CHECK:       @ %bb.0: @ %entry
19 ; CHECK-NEXT:    lsrs r1, r0, #2
20 ; CHECK-NEXT:    ldr r0, .LCPI1_0
21 ; CHECK-NEXT:    ands r0, r1
22 ; CHECK-NEXT:    bx lr
23 ; CHECK-NEXT:    .p2align 2
24 ; CHECK-NEXT:  @ %bb.1:
25 ; CHECK-NEXT:  .LCPI1_0:
26 ; CHECK-NEXT:    .long 1022 @ 0x3fe
27 entry:
28   %0 = lshr i32 %x, 2
29   %shr = and i32 %0, 1022
30   ret i32 %shr
33 define i32 @test3(i32 %x) {
34 ; CHECK-LABEL: test3:
35 ; CHECK:       @ %bb.0: @ %entry
36 ; CHECK-NEXT:    lsrs r0, r0, #2
37 ; CHECK-NEXT:    uxtb r0, r0
38 ; CHECK-NEXT:    bx lr
39 entry:
40   %0 = lshr i32 %x, 2
41   %shr = and i32 %0, 255
42   ret i32 %shr
45 define i32 @test4(i32 %x) {
46 ; CHECK-LABEL: test4:
47 ; CHECK:       @ %bb.0: @ %entry
48 ; CHECK-NEXT:    lsrs r0, r0, #3
49 ; CHECK-NEXT:    lsls r0, r0, #7
50 ; CHECK-NEXT:    bx lr
51 entry:
52   %0 = shl i32 %x, 4
53   %shr = and i32 %0, -128
54   ret i32 %shr
57 define i32 @test5(i32 %x) {
58 ; CHECK-LABEL: test5:
59 ; CHECK:       @ %bb.0: @ %entry
60 ; CHECK-NEXT:    lsls r0, r0, #31
61 ; CHECK-NEXT:    lsrs r0, r0, #2
62 ; CHECK-NEXT:    bx lr
63 entry:
64   %0 = shl i32 %x, 29
65   %shr = and i32 %0, 536870912
66   ret i32 %shr
69 define i32 @test6(i32 %x) {
70 ; CHECK-LABEL: test6:
71 ; CHECK:       @ %bb.0: @ %entry
72 ; CHECK-NEXT:    movs r1, #5
73 ; CHECK-NEXT:    lsls r1, r1, #29
74 ; CHECK-NEXT:    lsls r0, r0, #29
75 ; CHECK-NEXT:    ands r0, r1
76 ; CHECK-NEXT:    bx lr
77 entry:
78   %0 = shl i32 %x, 29
79   %shr = and i32 %0, 2684354560
80   ret i32 %shr
83 define i32 @test7(i32 %x) {
84 ; CHECK-LABEL: test7:
85 ; CHECK:       @ %bb.0: @ %entry
86 ; CHECK-NEXT:    lsrs r0, r0, #31
87 ; CHECK-NEXT:    lsls r0, r0, #2
88 ; CHECK-NEXT:    bx lr
89 entry:
90   %0 = lshr i32 %x, 29
91   %shr = and i32 %0, 4
92   ret i32 %shr
95 define i32 @test8(i32 %x) {
96 ; CHECK-LABEL: test8:
97 ; CHECK:       @ %bb.0: @ %entry
98 ; CHECK-NEXT:    lsrs r1, r0, #29
99 ; CHECK-NEXT:    movs r0, #5
100 ; CHECK-NEXT:    ands r0, r1
101 ; CHECK-NEXT:    bx lr
102 entry:
103   %0 = lshr i32 %x, 29
104   %shr = and i32 %0, 5
105   ret i32 %shr
108 define i32 @test9(i32 %x) {
109 ; CHECK-LABEL: test9:
110 ; CHECK:       @ %bb.0: @ %entry
111 ; CHECK-NEXT:    lsrs r0, r0, #3
112 ; CHECK-NEXT:    lsls r0, r0, #1
113 ; CHECK-NEXT:    bx lr
114 entry:
115   %and = lshr i32 %x, 2
116   %shr = and i32 %and, 1073741822
117   ret i32 %shr
120 define i32 @test10(i32 %x) {
121 ; CHECK-LABEL: test10:
122 ; CHECK:       @ %bb.0: @ %entry
123 ; CHECK-NEXT:    lsls r0, r0, #2
124 ; CHECK-NEXT:    uxtb r0, r0
125 ; CHECK-NEXT:    bx lr
126 entry:
127   %0 = shl i32 %x, 2
128   %shr = and i32 %0, 255
129   ret i32 %shr
132 define i32 @test11(i32 %x) {
133 ; CHECK-LABEL: test11:
134 ; CHECK:       @ %bb.0: @ %entry
135 ; CHECK-NEXT:    lsrs r0, r0, #24
136 ; CHECK-NEXT:    lsls r0, r0, #2
137 ; CHECK-NEXT:    bx lr
138 entry:
139   %shl = lshr i32 %x, 22
140   %and = and i32 %shl, 1020
141   ret i32 %and
144 define i32 @test12(i32 %x) {
145 ; CHECK-LABEL: test12:
146 ; CHECK:       @ %bb.0: @ %entry
147 ; CHECK-NEXT:    lsrs r0, r0, #3
148 ; CHECK-NEXT:    lsls r0, r0, #4
149 ; CHECK-NEXT:    bx lr
150 entry:
151   %0 = shl i32 %x, 1
152   %shr = and i32 %0, -16
153   ret i32 %shr
156 define i32 @test13(i32 %x) {
157 ; CHECK-LABEL: test13:
158 ; CHECK:       @ %bb.0: @ %entry
159 ; CHECK-NEXT:    lsrs r0, r0, #3
160 ; CHECK-NEXT:    lsls r0, r0, #4
161 ; CHECK-NEXT:    bx lr
162 entry:
163   %shr = lshr i32 %x, 3
164   %shl = shl i32 %shr, 4
165   ret i32 %shl
168 define i32 @test14(i32 %x) {
169 ; CHECK-LABEL: test14:
170 ; CHECK:       @ %bb.0: @ %entry
171 ; CHECK-NEXT:    lsrs r0, r0, #6
172 ; CHECK-NEXT:    lsls r0, r0, #10
173 ; CHECK-NEXT:    bx lr
174 entry:
175   %shl = shl i32 %x, 4
176   %and = and i32 %shl, -1024
177   ret i32 %and
180 define i32 @test15(i32 %x) {
181 ; CHECK-LABEL: test15:
182 ; CHECK:       @ %bb.0: @ %entry
183 ; CHECK-NEXT:    lsrs r0, r0, #4
184 ; CHECK-NEXT:    lsls r0, r0, #3
185 ; CHECK-NEXT:    bx lr
186 entry:
187   %shr = lshr i32 %x, 4
188   %shl = shl i32 %shr, 3
189   ret i32 %shl
192 define i32 @test16(i32 %x) {
193 ; CHECK-LABEL: test16:
194 ; CHECK:       @ %bb.0: @ %entry
195 ; CHECK-NEXT:    lsls r0, r0, #28
196 ; CHECK-NEXT:    lsrs r0, r0, #26
197 ; CHECK-NEXT:    bx lr
198 entry:
199   %0 = and i32 %x, 15
200   %shl = shl i32 %0, 2
201   ret i32 %shl
204 define i32* @test17(i32* %p, i32 %x) {
205 ; CHECK-LABEL: test17:
206 ; CHECK:       @ %bb.0: @ %entry
207 ; CHECK-NEXT:    lsls r1, r1, #28
208 ; CHECK-NEXT:    lsrs r1, r1, #26
209 ; CHECK-NEXT:    adds r0, r0, r1
210 ; CHECK-NEXT:    bx lr
211 entry:
212   %0 = and i32 %x, 15
213   %shl = getelementptr i32, i32* %p, i32 %0
214   ret i32* %shl
217 define i32* @test18(i32* %p, i32 %x) {
218 ; CHECK-LABEL: test18:
219 ; CHECK:       @ %bb.0: @ %entry
220 ; CHECK-NEXT:    adds r1, r1, #1
221 ; CHECK-NEXT:    lsls r1, r1, #28
222 ; CHECK-NEXT:    lsrs r1, r1, #26
223 ; CHECK-NEXT:    adds r0, r0, r1
224 ; CHECK-NEXT:    bx lr
225 entry:
226   %xx = add i32 %x, 1
227   %0 = and i32 %xx, 15
228   %shl = getelementptr i32, i32* %p, i32 %0
229   ret i32* %shl
232 define i32* @test19(i32* %p, i32 %x) {
233 ; CHECK-LABEL: test19:
234 ; CHECK:       @ %bb.0: @ %entry
235 ; CHECK-NEXT:    subs r1, r1, #1
236 ; CHECK-NEXT:    lsls r1, r1, #28
237 ; CHECK-NEXT:    lsrs r1, r1, #26
238 ; CHECK-NEXT:    adds r0, r0, r1
239 ; CHECK-NEXT:    bx lr
240 entry:
241   %xx = sub i32 %x, 1
242   %0 = and i32 %xx, 15
243   %shl = getelementptr i32, i32* %p, i32 %0
244   ret i32* %shl
247 define i32* @test20(i32* %p, i32 %x) {
248 ; CHECK-LABEL: test20:
249 ; CHECK:       @ %bb.0: @ %entry
250 ; CHECK-NEXT:    subs r1, r1, #1
251 ; CHECK-NEXT:    lsls r1, r1, #28
252 ; CHECK-NEXT:    lsrs r1, r1, #26
253 ; CHECK-NEXT:    adds r0, r0, r1
254 ; CHECK-NEXT:    bx lr
255 entry:
256   %xx = add i32 %x, 15
257   %0 = and i32 %xx, 15
258   %shl = getelementptr i32, i32* %p, i32 %0
259   ret i32* %shl