xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/int-cmp-46.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test the use of TEST UNDER MASK for 32-bit operations.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@g = global i32 0
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Check the lowest useful TMLL value.
8*9880d681SAndroid Build Coastguard Workerdefine void @f1(i32 %a) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
10*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 1
11*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
12*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 1
15*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
16*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerstore:
19*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
20*9880d681SAndroid Build Coastguard Worker  br label %exit
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerexit:
23*9880d681SAndroid Build Coastguard Worker  ret void
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; Check the high end of the TMLL range.
27*9880d681SAndroid Build Coastguard Workerdefine void @f2(i32 %a) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
29*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 65535
30*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
31*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 65535
34*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
35*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerstore:
38*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
39*9880d681SAndroid Build Coastguard Worker  br label %exit
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerexit:
42*9880d681SAndroid Build Coastguard Worker  ret void
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; Check the lowest useful TMLH value, which is the next value up.
46*9880d681SAndroid Build Coastguard Workerdefine void @f3(i32 %a) {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
48*9880d681SAndroid Build Coastguard Worker; CHECK: tmlh %r2, 1
49*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
50*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 65536
53*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
54*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerstore:
57*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
58*9880d681SAndroid Build Coastguard Worker  br label %exit
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerexit:
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; Check the next value up again, which cannot use TM.
65*9880d681SAndroid Build Coastguard Workerdefine void @f4(i32 %a) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{tm[lh].}}
68*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
69*9880d681SAndroid Build Coastguard Workerentry:
70*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 4294901759
71*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
72*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerstore:
75*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
76*9880d681SAndroid Build Coastguard Worker  br label %exit
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerexit:
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; Check the high end of the TMLH range.
83*9880d681SAndroid Build Coastguard Workerdefine void @f5(i32 %a) {
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
85*9880d681SAndroid Build Coastguard Worker; CHECK: tmlh %r2, 65535
86*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
87*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
88*9880d681SAndroid Build Coastguard Workerentry:
89*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 4294901760
90*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 0
91*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerstore:
94*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
95*9880d681SAndroid Build Coastguard Worker  br label %exit
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerexit:
98*9880d681SAndroid Build Coastguard Worker  ret void
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for LT comparisons that are equivalent to
102*9880d681SAndroid Build Coastguard Worker; an equality comparison with zero.
103*9880d681SAndroid Build Coastguard Workerdefine void @f6(i32 %a) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
105*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 240
106*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
107*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
108*9880d681SAndroid Build Coastguard Workerentry:
109*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 240
110*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %and, 16
111*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerstore:
114*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
115*9880d681SAndroid Build Coastguard Worker  br label %exit
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerexit:
118*9880d681SAndroid Build Coastguard Worker  ret void
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker; ...same again with LE.
122*9880d681SAndroid Build Coastguard Workerdefine void @f7(i32 %a) {
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
124*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 240
125*9880d681SAndroid Build Coastguard Worker; CHECK: ber %r14
126*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
127*9880d681SAndroid Build Coastguard Workerentry:
128*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 240
129*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sle i32 %and, 15
130*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerstore:
133*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
134*9880d681SAndroid Build Coastguard Worker  br label %exit
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Workerexit:
137*9880d681SAndroid Build Coastguard Worker  ret void
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for GE comparisons that are equivalent to
141*9880d681SAndroid Build Coastguard Worker; an inequality comparison with zero.
142*9880d681SAndroid Build Coastguard Workerdefine void @f8(i32 %a) {
143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
144*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 240
145*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
146*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
147*9880d681SAndroid Build Coastguard Workerentry:
148*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 240
149*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %and, 16
150*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerstore:
153*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
154*9880d681SAndroid Build Coastguard Worker  br label %exit
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerexit:
157*9880d681SAndroid Build Coastguard Worker  ret void
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker; ...same again with GT.
161*9880d681SAndroid Build Coastguard Workerdefine void @f9(i32 %a) {
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
163*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 240
164*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
165*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
166*9880d681SAndroid Build Coastguard Workerentry:
167*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 240
168*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %and, 15
169*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerstore:
172*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
173*9880d681SAndroid Build Coastguard Worker  br label %exit
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerexit:
176*9880d681SAndroid Build Coastguard Worker  ret void
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for LT comparisons that effectively
180*9880d681SAndroid Build Coastguard Worker; test whether the top bit is clear.
181*9880d681SAndroid Build Coastguard Workerdefine void @f10(i32 %a) {
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
183*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 35
184*9880d681SAndroid Build Coastguard Worker; CHECK: bler %r14
185*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 35
188*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %and, 8
189*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerstore:
192*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
193*9880d681SAndroid Build Coastguard Worker  br label %exit
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerexit:
196*9880d681SAndroid Build Coastguard Worker  ret void
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker; ...same again with LE.
200*9880d681SAndroid Build Coastguard Workerdefine void @f11(i32 %a) {
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
202*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 35
203*9880d681SAndroid Build Coastguard Worker; CHECK: bler %r14
204*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
205*9880d681SAndroid Build Coastguard Workerentry:
206*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 35
207*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ule i32 %and, 31
208*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerstore:
211*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
212*9880d681SAndroid Build Coastguard Worker  br label %exit
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerexit:
215*9880d681SAndroid Build Coastguard Worker  ret void
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for GE comparisons that effectively test
219*9880d681SAndroid Build Coastguard Worker; whether the top bit is set.
220*9880d681SAndroid Build Coastguard Workerdefine void @f12(i32 %a) {
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
222*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 140
223*9880d681SAndroid Build Coastguard Worker; CHECK: bnler %r14
224*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 140
227*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %and, 128
228*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerstore:
231*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
232*9880d681SAndroid Build Coastguard Worker  br label %exit
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerexit:
235*9880d681SAndroid Build Coastguard Worker  ret void
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; ...same again for GT.
239*9880d681SAndroid Build Coastguard Workerdefine void @f13(i32 %a) {
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
241*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 140
242*9880d681SAndroid Build Coastguard Worker; CHECK: bnler %r14
243*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
244*9880d681SAndroid Build Coastguard Workerentry:
245*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 140
246*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %and, 126
247*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerstore:
250*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
251*9880d681SAndroid Build Coastguard Worker  br label %exit
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerexit:
254*9880d681SAndroid Build Coastguard Worker  ret void
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for equality comparisons with the mask.
258*9880d681SAndroid Build Coastguard Workerdefine void @f14(i32 %a) {
259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
260*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 101
261*9880d681SAndroid Build Coastguard Worker; CHECK: bor %r14
262*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
263*9880d681SAndroid Build Coastguard Workerentry:
264*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 101
265*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 101
266*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerstore:
269*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
270*9880d681SAndroid Build Coastguard Worker  br label %exit
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Workerexit:
273*9880d681SAndroid Build Coastguard Worker  ret void
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for inequality comparisons with the mask.
277*9880d681SAndroid Build Coastguard Workerdefine void @f15(i32 %a) {
278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
279*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 65519
280*9880d681SAndroid Build Coastguard Worker; CHECK: bnor %r14
281*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
282*9880d681SAndroid Build Coastguard Workerentry:
283*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 65519
284*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 65519
285*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Workerstore:
288*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
289*9880d681SAndroid Build Coastguard Worker  br label %exit
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerexit:
292*9880d681SAndroid Build Coastguard Worker  ret void
293*9880d681SAndroid Build Coastguard Worker}
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for LT comparisons that are equivalent
296*9880d681SAndroid Build Coastguard Worker; to inequality comparisons with the mask.
297*9880d681SAndroid Build Coastguard Workerdefine void @f16(i32 %a) {
298*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
299*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 130
300*9880d681SAndroid Build Coastguard Worker; CHECK: bnor %r14
301*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
302*9880d681SAndroid Build Coastguard Workerentry:
303*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 130
304*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %and, 129
305*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerstore:
308*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
309*9880d681SAndroid Build Coastguard Worker  br label %exit
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Workerexit:
312*9880d681SAndroid Build Coastguard Worker  ret void
313*9880d681SAndroid Build Coastguard Worker}
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker; ...same again with LE.
316*9880d681SAndroid Build Coastguard Workerdefine void @f17(i32 %a) {
317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
318*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 130
319*9880d681SAndroid Build Coastguard Worker; CHECK: bnor %r14
320*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
321*9880d681SAndroid Build Coastguard Workerentry:
322*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 130
323*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ule i32 %and, 128
324*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerstore:
327*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
328*9880d681SAndroid Build Coastguard Worker  br label %exit
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerexit:
331*9880d681SAndroid Build Coastguard Worker  ret void
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for GE comparisons that are equivalent
335*9880d681SAndroid Build Coastguard Worker; to equality comparisons with the mask.
336*9880d681SAndroid Build Coastguard Workerdefine void @f18(i32 %a) {
337*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
338*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 194
339*9880d681SAndroid Build Coastguard Worker; CHECK: bor %r14
340*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
341*9880d681SAndroid Build Coastguard Workerentry:
342*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 194
343*9880d681SAndroid Build Coastguard Worker  %cmp = icmp uge i32 %and, 193
344*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Workerstore:
347*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
348*9880d681SAndroid Build Coastguard Worker  br label %exit
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Workerexit:
351*9880d681SAndroid Build Coastguard Worker  ret void
352*9880d681SAndroid Build Coastguard Worker}
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Worker; ...same again for GT.
355*9880d681SAndroid Build Coastguard Workerdefine void @f19(i32 %a) {
356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
357*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 194
358*9880d681SAndroid Build Coastguard Worker; CHECK: bor %r14
359*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
360*9880d681SAndroid Build Coastguard Workerentry:
361*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 194
362*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %and, 192
363*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Workerstore:
366*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
367*9880d681SAndroid Build Coastguard Worker  br label %exit
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerexit:
370*9880d681SAndroid Build Coastguard Worker  ret void
371*9880d681SAndroid Build Coastguard Worker}
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for equality comparisons for the low bit
374*9880d681SAndroid Build Coastguard Worker; when the mask has two bits.
375*9880d681SAndroid Build Coastguard Workerdefine void @f20(i32 %a) {
376*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f20:
377*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 20
378*9880d681SAndroid Build Coastguard Worker; CHECK: blr %r14
379*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
380*9880d681SAndroid Build Coastguard Workerentry:
381*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 20
382*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 4
383*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerstore:
386*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
387*9880d681SAndroid Build Coastguard Worker  br label %exit
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Workerexit:
390*9880d681SAndroid Build Coastguard Worker  ret void
391*9880d681SAndroid Build Coastguard Worker}
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for inequality comparisons for the low bit
394*9880d681SAndroid Build Coastguard Worker; when the mask has two bits.
395*9880d681SAndroid Build Coastguard Workerdefine void @f21(i32 %a) {
396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f21:
397*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 20
398*9880d681SAndroid Build Coastguard Worker; CHECK: bnlr %r14
399*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
400*9880d681SAndroid Build Coastguard Workerentry:
401*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 20
402*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 4
403*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerstore:
406*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
407*9880d681SAndroid Build Coastguard Worker  br label %exit
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Workerexit:
410*9880d681SAndroid Build Coastguard Worker  ret void
411*9880d681SAndroid Build Coastguard Worker}
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for equality comparisons for the high bit
414*9880d681SAndroid Build Coastguard Worker; when the mask has two bits.
415*9880d681SAndroid Build Coastguard Workerdefine void @f22(i32 %a) {
416*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f22:
417*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 20
418*9880d681SAndroid Build Coastguard Worker; CHECK: bhr %r14
419*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
420*9880d681SAndroid Build Coastguard Workerentry:
421*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 20
422*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %and, 16
423*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Workerstore:
426*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
427*9880d681SAndroid Build Coastguard Worker  br label %exit
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Workerexit:
430*9880d681SAndroid Build Coastguard Worker  ret void
431*9880d681SAndroid Build Coastguard Worker}
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker; Check that we can use TMLL for inequality comparisons for the high bit
434*9880d681SAndroid Build Coastguard Worker; when the mask has two bits.
435*9880d681SAndroid Build Coastguard Workerdefine void @f23(i32 %a) {
436*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f23:
437*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 20
438*9880d681SAndroid Build Coastguard Worker; CHECK: bnhr %r14
439*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
440*9880d681SAndroid Build Coastguard Workerentry:
441*9880d681SAndroid Build Coastguard Worker  %and = and i32 %a, 20
442*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 16
443*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
444*9880d681SAndroid Build Coastguard Worker
445*9880d681SAndroid Build Coastguard Workerstore:
446*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
447*9880d681SAndroid Build Coastguard Worker  br label %exit
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerexit:
450*9880d681SAndroid Build Coastguard Worker  ret void
451*9880d681SAndroid Build Coastguard Worker}
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker; Check that we can fold an SHL into a TMxx mask.
454*9880d681SAndroid Build Coastguard Workerdefine void @f24(i32 %a) {
455*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f24:
456*9880d681SAndroid Build Coastguard Worker; CHECK: tmll %r2, 255
457*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
458*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
459*9880d681SAndroid Build Coastguard Workerentry:
460*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %a, 12
461*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shl, 1044480
462*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
463*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Workerstore:
466*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
467*9880d681SAndroid Build Coastguard Worker  br label %exit
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Workerexit:
470*9880d681SAndroid Build Coastguard Worker  ret void
471*9880d681SAndroid Build Coastguard Worker}
472*9880d681SAndroid Build Coastguard Worker
473*9880d681SAndroid Build Coastguard Worker; Check that we can fold an SHR into a TMxx mask.
474*9880d681SAndroid Build Coastguard Workerdefine void @f25(i32 %a) {
475*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f25:
476*9880d681SAndroid Build Coastguard Worker; CHECK: tmlh %r2, 512
477*9880d681SAndroid Build Coastguard Worker; CHECK: bner %r14
478*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
479*9880d681SAndroid Build Coastguard Workerentry:
480*9880d681SAndroid Build Coastguard Worker  %shr = lshr i32 %a, 25
481*9880d681SAndroid Build Coastguard Worker  %and = and i32 %shr, 1
482*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %and, 0
483*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Workerstore:
486*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 *@g
487*9880d681SAndroid Build Coastguard Worker  br label %exit
488*9880d681SAndroid Build Coastguard Worker
489*9880d681SAndroid Build Coastguard Workerexit:
490*9880d681SAndroid Build Coastguard Worker  ret void
491*9880d681SAndroid Build Coastguard Worker}
492