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