blob: 9ebcbfe525babda2c9fb5cd2a6113e6e7bc57a3c [file] [log] [blame]
Richard Sandiford35b9be22013-08-28 10:31:43 +00001; Test the use of TEST UNDER MASK for 64-bit operations.
2;
Richard Sandifordf03789c2013-11-22 17:28:28 +00003; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
Richard Sandiford35b9be22013-08-28 10:31:43 +00004; 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}
Richard Sandiford030c1652013-09-13 09:09:50 +0000195
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}