blob: bf206ed9db60d5fc640d6c1cad89aa3c93efebad [file] [log] [blame]
Richard Sandiford35b9be22013-08-28 10:31:43 +00001; 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}