1 ; Test the use of TEST UNDER MASK for 64-bit operations.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
7 ; Check the lowest useful TMLL value.
8 define void @f1(i64 %a) {
15 %cmp = icmp eq i64 %and, 0
16 br i1 %cmp, label %exit, label %store
26 ; Check the high end of the TMLL range.
27 define void @f2(i64 %a) {
29 ; CHECK: tmll %r2, 65535
30 ; CHECK: jne {{\.L.*}}
33 %and = and i64 %a, 65535
34 %cmp = icmp ne i64 %and, 0
35 br i1 %cmp, label %exit, label %store
45 ; Check the lowest useful TMLH value, which is the next value up.
46 define void @f3(i64 %a) {
49 ; CHECK: jne {{\.L.*}}
52 %and = and i64 %a, 65536
53 %cmp = icmp ne i64 %and, 0
54 br i1 %cmp, label %exit, label %store
64 ; Check the next value up again, which cannot use TM.
65 define void @f4(i64 %a) {
67 ; CHECK-NOT: {{tm[lh].}}
70 %and = and i64 %a, 4294901759
71 %cmp = icmp eq i64 %and, 0
72 br i1 %cmp, label %exit, label %store
82 ; Check the high end of the TMLH range.
83 define void @f5(i64 %a) {
85 ; CHECK: tmlh %r2, 65535
89 %and = and i64 %a, 4294901760
90 %cmp = icmp eq i64 %and, 0
91 br i1 %cmp, label %exit, label %store
101 ; Check the lowest useful TMHL value.
102 define void @f6(i64 %a) {
105 ; CHECK: je {{\.L.*}}
108 %and = and i64 %a, 4294967296
109 %cmp = icmp eq i64 %and, 0
110 br i1 %cmp, label %exit, label %store
120 ; Check the next value up again, which cannot use TM.
121 define void @f7(i64 %a) {
123 ; CHECK-NOT: {{tm[lh].}}
126 %and = and i64 %a, 4294967297
127 %cmp = icmp ne i64 %and, 0
128 br i1 %cmp, label %exit, label %store
138 ; Check the high end of the TMHL range.
139 define void @f8(i64 %a) {
141 ; CHECK: tmhl %r2, 65535
142 ; CHECK: jne {{\.L.*}}
145 %and = and i64 %a, 281470681743360
146 %cmp = icmp ne i64 %and, 0
147 br i1 %cmp, label %exit, label %store
157 ; Check the lowest useful TMHH value.
158 define void @f9(i64 %a) {
161 ; CHECK: jne {{\.L.*}}
164 %and = and i64 %a, 281474976710656
165 %cmp = icmp ne i64 %and, 0
166 br i1 %cmp, label %exit, label %store
176 ; Check the high end of the TMHH range.
177 define void @f10(i64 %a) {
179 ; CHECK: tmhh %r2, 65535
180 ; CHECK: je {{\.L.*}}
183 %and = and i64 %a, 18446462598732840960
184 %cmp = icmp eq i64 %and, 0
185 br i1 %cmp, label %exit, label %store
195 ; Check that we can fold an SHL into a TMxx mask.
196 define void @f11(i64 %a) {
198 ; CHECK: tmhl %r2, 32768
199 ; CHECK: jne {{\.L.*}}
203 %and = and i64 %shl, 281474976710656
204 %cmp = icmp ne i64 %and, 0
205 br i1 %cmp, label %exit, label %store
215 ; Check that we can fold an SHR into a TMxx mask.
216 define void @f12(i64 %a) {
218 ; CHECK: tmhh %r2, 256
219 ; CHECK: jne {{\.L.*}}
222 %shr = lshr i64 %a, 56
223 %and = and i64 %shr, 1
224 %cmp = icmp ne i64 %and, 0
225 br i1 %cmp, label %exit, label %store