1; Test the use of TEST UNDER MASK for 64-bit operations.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
4
5@g = global i32 0
6
7; Check the lowest useful TMLL value.
8define void @f1(i64 %a) {
9; CHECK-LABEL: f1:
10; CHECK: tmll %r2, 1
11; CHECK: je {{\.L.*}}
12; CHECK: br %r14
13entry:
14  %and = and i64 %a, 1
15  %cmp = icmp eq i64 %and, 0
16  br i1 %cmp, label %exit, label %store
17
18store:
19  store i32 1, i32 *@g
20  br label %exit
21
22exit:
23  ret void
24}
25
26; Check the high end of the TMLL range.
27define void @f2(i64 %a) {
28; CHECK-LABEL: f2:
29; CHECK: tmll %r2, 65535
30; CHECK: jne {{\.L.*}}
31; CHECK: br %r14
32entry:
33  %and = and i64 %a, 65535
34  %cmp = icmp ne i64 %and, 0
35  br i1 %cmp, label %exit, label %store
36
37store:
38  store i32 1, i32 *@g
39  br label %exit
40
41exit:
42  ret void
43}
44
45; Check the lowest useful TMLH value, which is the next value up.
46define void @f3(i64 %a) {
47; CHECK-LABEL: f3:
48; CHECK: tmlh %r2, 1
49; CHECK: jne {{\.L.*}}
50; CHECK: br %r14
51entry:
52  %and = and i64 %a, 65536
53  %cmp = icmp ne i64 %and, 0
54  br i1 %cmp, label %exit, label %store
55
56store:
57  store i32 1, i32 *@g
58  br label %exit
59
60exit:
61  ret void
62}
63
64; Check the next value up again, which cannot use TM.
65define void @f4(i64 %a) {
66; CHECK-LABEL: f4:
67; CHECK-NOT: {{tm[lh].}}
68; CHECK: br %r14
69entry:
70  %and = and i64 %a, 4294901759
71  %cmp = icmp eq i64 %and, 0
72  br i1 %cmp, label %exit, label %store
73
74store:
75  store i32 1, i32 *@g
76  br label %exit
77
78exit:
79  ret void
80}
81
82; Check the high end of the TMLH range.
83define void @f5(i64 %a) {
84; CHECK-LABEL: f5:
85; CHECK: tmlh %r2, 65535
86; CHECK: je {{\.L.*}}
87; CHECK: br %r14
88entry:
89  %and = and i64 %a, 4294901760
90  %cmp = icmp eq i64 %and, 0
91  br i1 %cmp, label %exit, label %store
92
93store:
94  store i32 1, i32 *@g
95  br label %exit
96
97exit:
98  ret void
99}
100
101; Check the lowest useful TMHL value.
102define void @f6(i64 %a) {
103; CHECK-LABEL: f6:
104; CHECK: tmhl %r2, 1
105; CHECK: je {{\.L.*}}
106; CHECK: br %r14
107entry:
108  %and = and i64 %a, 4294967296
109  %cmp = icmp eq i64 %and, 0
110  br i1 %cmp, label %exit, label %store
111
112store:
113  store i32 1, i32 *@g
114  br label %exit
115
116exit:
117  ret void
118}
119
120; Check the next value up again, which cannot use TM.
121define void @f7(i64 %a) {
122; CHECK-LABEL: f7:
123; CHECK-NOT: {{tm[lh].}}
124; CHECK: br %r14
125entry:
126  %and = and i64 %a, 4294967297
127  %cmp = icmp ne i64 %and, 0
128  br i1 %cmp, label %exit, label %store
129
130store:
131  store i32 1, i32 *@g
132  br label %exit
133
134exit:
135  ret void
136}
137
138; Check the high end of the TMHL range.
139define void @f8(i64 %a) {
140; CHECK-LABEL: f8:
141; CHECK: tmhl %r2, 65535
142; CHECK: jne {{\.L.*}}
143; CHECK: br %r14
144entry:
145  %and = and i64 %a, 281470681743360
146  %cmp = icmp ne i64 %and, 0
147  br i1 %cmp, label %exit, label %store
148
149store:
150  store i32 1, i32 *@g
151  br label %exit
152
153exit:
154  ret void
155}
156
157; Check the lowest useful TMHH value.
158define void @f9(i64 %a) {
159; CHECK-LABEL: f9:
160; CHECK: tmhh %r2, 1
161; CHECK: jne {{\.L.*}}
162; CHECK: br %r14
163entry:
164  %and = and i64 %a, 281474976710656
165  %cmp = icmp ne i64 %and, 0
166  br i1 %cmp, label %exit, label %store
167
168store:
169  store i32 1, i32 *@g
170  br label %exit
171
172exit:
173  ret void
174}
175
176; Check the high end of the TMHH range.
177define void @f10(i64 %a) {
178; CHECK-LABEL: f10:
179; CHECK: tmhh %r2, 65535
180; CHECK: je {{\.L.*}}
181; CHECK: br %r14
182entry:
183  %and = and i64 %a, 18446462598732840960
184  %cmp = icmp eq i64 %and, 0
185  br i1 %cmp, label %exit, label %store
186
187store:
188  store i32 1, i32 *@g
189  br label %exit
190
191exit:
192  ret void
193}
194