xref: /llvm-project/llvm/test/CodeGen/Thumb/shift-and.ll (revision 1d3329c2e82166be9b60921a8a571ed3c279c028)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv6-eabi %s -o - | FileCheck %s
3
4define 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
10entry:
11  %0 = lshr i32 %x, 2
12  %shr = and i32 %0, 1023
13  ret i32 %shr
14}
15
16define 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
27entry:
28  %0 = lshr i32 %x, 2
29  %shr = and i32 %0, 1022
30  ret i32 %shr
31}
32
33define 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
39entry:
40  %0 = lshr i32 %x, 2
41  %shr = and i32 %0, 255
42  ret i32 %shr
43}
44
45define 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
51entry:
52  %0 = shl i32 %x, 4
53  %shr = and i32 %0, -128
54  ret i32 %shr
55}
56
57define 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
63entry:
64  %0 = shl i32 %x, 29
65  %shr = and i32 %0, 536870912
66  ret i32 %shr
67}
68
69define i32 @test6(i32 %x) {
70; CHECK-LABEL: test6:
71; CHECK:       @ %bb.0: @ %entry
72; CHECK-NEXT:    movs r1, #5
73; CHECK-NEXT:    ands r1, r0
74; CHECK-NEXT:    lsls r0, r1, #29
75; CHECK-NEXT:    bx lr
76entry:
77  %0 = shl i32 %x, 29
78  %shr = and i32 %0, 2684354560
79  ret i32 %shr
80}
81
82define i32 @test7(i32 %x) {
83; CHECK-LABEL: test7:
84; CHECK:       @ %bb.0: @ %entry
85; CHECK-NEXT:    lsrs r0, r0, #31
86; CHECK-NEXT:    lsls r0, r0, #2
87; CHECK-NEXT:    bx lr
88entry:
89  %0 = lshr i32 %x, 29
90  %shr = and i32 %0, 4
91  ret i32 %shr
92}
93
94define i32 @test8(i32 %x) {
95; CHECK-LABEL: test8:
96; CHECK:       @ %bb.0: @ %entry
97; CHECK-NEXT:    lsrs r1, r0, #29
98; CHECK-NEXT:    movs r0, #5
99; CHECK-NEXT:    ands r0, r1
100; CHECK-NEXT:    bx lr
101entry:
102  %0 = lshr i32 %x, 29
103  %shr = and i32 %0, 5
104  ret i32 %shr
105}
106
107define i32 @test9(i32 %x) {
108; CHECK-LABEL: test9:
109; CHECK:       @ %bb.0: @ %entry
110; CHECK-NEXT:    lsrs r0, r0, #3
111; CHECK-NEXT:    lsls r0, r0, #1
112; CHECK-NEXT:    bx lr
113entry:
114  %and = lshr i32 %x, 2
115  %shr = and i32 %and, 1073741822
116  ret i32 %shr
117}
118
119define i32 @test10(i32 %x) {
120; CHECK-LABEL: test10:
121; CHECK:       @ %bb.0: @ %entry
122; CHECK-NEXT:    lsls r0, r0, #2
123; CHECK-NEXT:    uxtb r0, r0
124; CHECK-NEXT:    bx lr
125entry:
126  %0 = shl i32 %x, 2
127  %shr = and i32 %0, 255
128  ret i32 %shr
129}
130
131define i32 @test11(i32 %x) {
132; CHECK-LABEL: test11:
133; CHECK:       @ %bb.0: @ %entry
134; CHECK-NEXT:    lsrs r0, r0, #24
135; CHECK-NEXT:    lsls r0, r0, #2
136; CHECK-NEXT:    bx lr
137entry:
138  %shl = lshr i32 %x, 22
139  %and = and i32 %shl, 1020
140  ret i32 %and
141}
142
143define i32 @test12(i32 %x) {
144; CHECK-LABEL: test12:
145; CHECK:       @ %bb.0: @ %entry
146; CHECK-NEXT:    lsrs r0, r0, #3
147; CHECK-NEXT:    lsls r0, r0, #4
148; CHECK-NEXT:    bx lr
149entry:
150  %0 = shl i32 %x, 1
151  %shr = and i32 %0, -16
152  ret i32 %shr
153}
154
155define i32 @test13(i32 %x) {
156; CHECK-LABEL: test13:
157; CHECK:       @ %bb.0: @ %entry
158; CHECK-NEXT:    lsrs r0, r0, #3
159; CHECK-NEXT:    lsls r0, r0, #4
160; CHECK-NEXT:    bx lr
161entry:
162  %shr = lshr i32 %x, 3
163  %shl = shl i32 %shr, 4
164  ret i32 %shl
165}
166
167define i32 @test14(i32 %x) {
168; CHECK-LABEL: test14:
169; CHECK:       @ %bb.0: @ %entry
170; CHECK-NEXT:    lsrs r0, r0, #6
171; CHECK-NEXT:    lsls r0, r0, #10
172; CHECK-NEXT:    bx lr
173entry:
174  %shl = shl i32 %x, 4
175  %and = and i32 %shl, -1024
176  ret i32 %and
177}
178
179define i32 @test15(i32 %x) {
180; CHECK-LABEL: test15:
181; CHECK:       @ %bb.0: @ %entry
182; CHECK-NEXT:    lsrs r0, r0, #4
183; CHECK-NEXT:    lsls r0, r0, #3
184; CHECK-NEXT:    bx lr
185entry:
186  %shr = lshr i32 %x, 4
187  %shl = shl i32 %shr, 3
188  ret i32 %shl
189}
190
191define i32 @test16(i32 %x) {
192; CHECK-LABEL: test16:
193; CHECK:       @ %bb.0: @ %entry
194; CHECK-NEXT:    lsls r0, r0, #28
195; CHECK-NEXT:    lsrs r0, r0, #26
196; CHECK-NEXT:    bx lr
197entry:
198  %0 = and i32 %x, 15
199  %shl = shl i32 %0, 2
200  ret i32 %shl
201}
202
203define ptr @test17(ptr %p, i32 %x) {
204; CHECK-LABEL: test17:
205; CHECK:       @ %bb.0: @ %entry
206; CHECK-NEXT:    lsls r1, r1, #28
207; CHECK-NEXT:    lsrs r1, r1, #26
208; CHECK-NEXT:    adds r0, r0, r1
209; CHECK-NEXT:    bx lr
210entry:
211  %0 = and i32 %x, 15
212  %shl = getelementptr i32, ptr %p, i32 %0
213  ret ptr %shl
214}
215
216define ptr @test18(ptr %p, i32 %x) {
217; CHECK-LABEL: test18:
218; CHECK:       @ %bb.0: @ %entry
219; CHECK-NEXT:    adds r1, r1, #1
220; CHECK-NEXT:    lsls r1, r1, #28
221; CHECK-NEXT:    lsrs r1, r1, #26
222; CHECK-NEXT:    adds r0, r0, r1
223; CHECK-NEXT:    bx lr
224entry:
225  %xx = add i32 %x, 1
226  %0 = and i32 %xx, 15
227  %shl = getelementptr i32, ptr %p, i32 %0
228  ret ptr %shl
229}
230
231define ptr @test19(ptr %p, i32 %x) {
232; CHECK-LABEL: test19:
233; CHECK:       @ %bb.0: @ %entry
234; CHECK-NEXT:    subs r1, r1, #1
235; CHECK-NEXT:    lsls r1, r1, #28
236; CHECK-NEXT:    lsrs r1, r1, #26
237; CHECK-NEXT:    adds r0, r0, r1
238; CHECK-NEXT:    bx lr
239entry:
240  %xx = sub i32 %x, 1
241  %0 = and i32 %xx, 15
242  %shl = getelementptr i32, ptr %p, i32 %0
243  ret ptr %shl
244}
245
246define ptr @test20(ptr %p, i32 %x) {
247; CHECK-LABEL: test20:
248; CHECK:       @ %bb.0: @ %entry
249; CHECK-NEXT:    subs r1, r1, #1
250; CHECK-NEXT:    lsls r1, r1, #28
251; CHECK-NEXT:    lsrs r1, r1, #26
252; CHECK-NEXT:    adds r0, r0, r1
253; CHECK-NEXT:    bx lr
254entry:
255  %xx = add i32 %x, 15
256  %0 = and i32 %xx, 15
257  %shl = getelementptr i32, ptr %p, i32 %0
258  ret ptr %shl
259}
260