1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1
2
; Test the use of TEST UNDER MASK for 64-bit operations.
2
3
;
3
4
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
8
9
; Check the lowest useful TMLL value.
9
10
define void @f1 (i64 %a ) {
10
11
; CHECK-LABEL: f1:
11
- ; CHECK: tmll %r2, 1
12
- ; CHECK: ber %r14
13
- ; CHECK: br %r14
12
+ ; CHECK: # %bb.0: # %entry
13
+ ; CHECK-NEXT: tmll %r2, 1
14
+ ; CHECK-NEXT: ber %r14
15
+ ; CHECK-NEXT: .LBB0_1: # %store
16
+ ; CHECK-NEXT: lgrl %r1, g@GOT
17
+ ; CHECK-NEXT: mvhi 0(%r1), 1
18
+ ; CHECK-NEXT: br %r14
14
19
entry:
15
20
%and = and i64 %a , 1
16
21
%cmp = icmp eq i64 %and , 0
27
32
; Check the high end of the TMLL range.
28
33
define void @f2 (i64 %a ) {
29
34
; CHECK-LABEL: f2:
30
- ; CHECK: tmll %r2, 65535
31
- ; CHECK: bner %r14
32
- ; CHECK: br %r14
35
+ ; CHECK: # %bb.0: # %entry
36
+ ; CHECK-NEXT: tmll %r2, 65535
37
+ ; CHECK-NEXT: bner %r14
38
+ ; CHECK-NEXT: .LBB1_1: # %store
39
+ ; CHECK-NEXT: lgrl %r1, g@GOT
40
+ ; CHECK-NEXT: mvhi 0(%r1), 1
41
+ ; CHECK-NEXT: br %r14
33
42
entry:
34
43
%and = and i64 %a , 65535
35
44
%cmp = icmp ne i64 %and , 0
46
55
; Check the lowest useful TMLH value, which is the next value up.
47
56
define void @f3 (i64 %a ) {
48
57
; CHECK-LABEL: f3:
49
- ; CHECK: tmlh %r2, 1
50
- ; CHECK: bner %r14
51
- ; CHECK: br %r14
58
+ ; CHECK: # %bb.0: # %entry
59
+ ; CHECK-NEXT: tmlh %r2, 1
60
+ ; CHECK-NEXT: bner %r14
61
+ ; CHECK-NEXT: .LBB2_1: # %store
62
+ ; CHECK-NEXT: lgrl %r1, g@GOT
63
+ ; CHECK-NEXT: mvhi 0(%r1), 1
64
+ ; CHECK-NEXT: br %r14
52
65
entry:
53
66
%and = and i64 %a , 65536
54
67
%cmp = icmp ne i64 %and , 0
65
78
; Check the next value up again, which cannot use TM.
66
79
define void @f4 (i64 %a ) {
67
80
; CHECK-LABEL: f4:
68
- ; CHECK-NOT: {{tm[lh].}}
69
- ; CHECK: br %r14
81
+ ; CHECK: # %bb.0: # %entry
82
+ ; CHECK-NEXT: llilf %r0, 4294901759
83
+ ; CHECK-NEXT: ngr %r0, %r2
84
+ ; CHECK-NEXT: ber %r14
85
+ ; CHECK-NEXT: .LBB3_1: # %store
86
+ ; CHECK-NEXT: lgrl %r1, g@GOT
87
+ ; CHECK-NEXT: mvhi 0(%r1), 1
88
+ ; CHECK-NEXT: br %r14
70
89
entry:
71
90
%and = and i64 %a , 4294901759
72
91
%cmp = icmp eq i64 %and , 0
@@ -83,9 +102,13 @@ exit:
83
102
; Check the high end of the TMLH range.
84
103
define void @f5 (i64 %a ) {
85
104
; CHECK-LABEL: f5:
86
- ; CHECK: tmlh %r2, 65535
87
- ; CHECK: ber %r14
88
- ; CHECK: br %r14
105
+ ; CHECK: # %bb.0: # %entry
106
+ ; CHECK-NEXT: tmlh %r2, 65535
107
+ ; CHECK-NEXT: ber %r14
108
+ ; CHECK-NEXT: .LBB4_1: # %store
109
+ ; CHECK-NEXT: lgrl %r1, g@GOT
110
+ ; CHECK-NEXT: mvhi 0(%r1), 1
111
+ ; CHECK-NEXT: br %r14
89
112
entry:
90
113
%and = and i64 %a , 4294901760
91
114
%cmp = icmp eq i64 %and , 0
@@ -102,9 +125,13 @@ exit:
102
125
; Check the lowest useful TMHL value.
103
126
define void @f6 (i64 %a ) {
104
127
; CHECK-LABEL: f6:
105
- ; CHECK: tmhl %r2, 1
106
- ; CHECK: ber %r14
107
- ; CHECK: br %r14
128
+ ; CHECK: # %bb.0: # %entry
129
+ ; CHECK-NEXT: tmhl %r2, 1
130
+ ; CHECK-NEXT: ber %r14
131
+ ; CHECK-NEXT: .LBB5_1: # %store
132
+ ; CHECK-NEXT: lgrl %r1, g@GOT
133
+ ; CHECK-NEXT: mvhi 0(%r1), 1
134
+ ; CHECK-NEXT: br %r14
108
135
entry:
109
136
%and = and i64 %a , 4294967296
110
137
%cmp = icmp eq i64 %and , 0
@@ -121,8 +148,15 @@ exit:
121
148
; Check the next value up again, which cannot use TM.
122
149
define void @f7 (i64 %a ) {
123
150
; CHECK-LABEL: f7:
124
- ; CHECK-NOT: {{tm[lh].}}
125
- ; CHECK: br %r14
151
+ ; CHECK: # %bb.0: # %entry
152
+ ; CHECK-NEXT: llihl %r0, 1
153
+ ; CHECK-NEXT: oill %r0, 1
154
+ ; CHECK-NEXT: ngr %r0, %r2
155
+ ; CHECK-NEXT: blr %r14
156
+ ; CHECK-NEXT: .LBB6_1: # %store
157
+ ; CHECK-NEXT: lgrl %r1, g@GOT
158
+ ; CHECK-NEXT: mvhi 0(%r1), 1
159
+ ; CHECK-NEXT: br %r14
126
160
entry:
127
161
%and = and i64 %a , 4294967297
128
162
%cmp = icmp ne i64 %and , 0
@@ -139,9 +173,13 @@ exit:
139
173
; Check the high end of the TMHL range.
140
174
define void @f8 (i64 %a ) {
141
175
; CHECK-LABEL: f8:
142
- ; CHECK: tmhl %r2, 65535
143
- ; CHECK: bner %r14
144
- ; CHECK: br %r14
176
+ ; CHECK: # %bb.0: # %entry
177
+ ; CHECK-NEXT: tmhl %r2, 65535
178
+ ; CHECK-NEXT: bner %r14
179
+ ; CHECK-NEXT: .LBB7_1: # %store
180
+ ; CHECK-NEXT: lgrl %r1, g@GOT
181
+ ; CHECK-NEXT: mvhi 0(%r1), 1
182
+ ; CHECK-NEXT: br %r14
145
183
entry:
146
184
%and = and i64 %a , 281470681743360
147
185
%cmp = icmp ne i64 %and , 0
@@ -158,9 +196,13 @@ exit:
158
196
; Check the lowest useful TMHH value.
159
197
define void @f9 (i64 %a ) {
160
198
; CHECK-LABEL: f9:
161
- ; CHECK: tmhh %r2, 1
162
- ; CHECK: bner %r14
163
- ; CHECK: br %r14
199
+ ; CHECK: # %bb.0: # %entry
200
+ ; CHECK-NEXT: tmhh %r2, 1
201
+ ; CHECK-NEXT: bner %r14
202
+ ; CHECK-NEXT: .LBB8_1: # %store
203
+ ; CHECK-NEXT: lgrl %r1, g@GOT
204
+ ; CHECK-NEXT: mvhi 0(%r1), 1
205
+ ; CHECK-NEXT: br %r14
164
206
entry:
165
207
%and = and i64 %a , 281474976710656
166
208
%cmp = icmp ne i64 %and , 0
@@ -177,9 +219,13 @@ exit:
177
219
; Check the high end of the TMHH range.
178
220
define void @f10 (i64 %a ) {
179
221
; CHECK-LABEL: f10:
180
- ; CHECK: tmhh %r2, 65535
181
- ; CHECK: ber %r14
182
- ; CHECK: br %r14
222
+ ; CHECK: # %bb.0: # %entry
223
+ ; CHECK-NEXT: tmhh %r2, 65535
224
+ ; CHECK-NEXT: ber %r14
225
+ ; CHECK-NEXT: .LBB9_1: # %store
226
+ ; CHECK-NEXT: lgrl %r1, g@GOT
227
+ ; CHECK-NEXT: mvhi 0(%r1), 1
228
+ ; CHECK-NEXT: br %r14
183
229
entry:
184
230
%and = and i64 %a , 18446462598732840960
185
231
%cmp = icmp eq i64 %and , 0
@@ -196,9 +242,13 @@ exit:
196
242
; Check that we can fold an SHL into a TMxx mask.
197
243
define void @f11 (i64 %a ) {
198
244
; CHECK-LABEL: f11:
199
- ; CHECK: tmhl %r2, 32768
200
- ; CHECK: bner %r14
201
- ; CHECK: br %r14
245
+ ; CHECK: # %bb.0: # %entry
246
+ ; CHECK-NEXT: tmhl %r2, 32768
247
+ ; CHECK-NEXT: bner %r14
248
+ ; CHECK-NEXT: .LBB10_1: # %store
249
+ ; CHECK-NEXT: lgrl %r1, g@GOT
250
+ ; CHECK-NEXT: mvhi 0(%r1), 1
251
+ ; CHECK-NEXT: br %r14
202
252
entry:
203
253
%shl = shl i64 %a , 1
204
254
%and = and i64 %shl , 281474976710656
@@ -216,9 +266,13 @@ exit:
216
266
; Check that we can fold an SHR into a TMxx mask.
217
267
define void @f12 (i64 %a ) {
218
268
; CHECK-LABEL: f12:
219
- ; CHECK: tmhh %r2, 256
220
- ; CHECK: bner %r14
221
- ; CHECK: br %r14
269
+ ; CHECK: # %bb.0: # %entry
270
+ ; CHECK-NEXT: tmhh %r2, 256
271
+ ; CHECK-NEXT: bner %r14
272
+ ; CHECK-NEXT: .LBB11_1: # %store
273
+ ; CHECK-NEXT: lgrl %r1, g@GOT
274
+ ; CHECK-NEXT: mvhi 0(%r1), 1
275
+ ; CHECK-NEXT: br %r14
222
276
entry:
223
277
%shr = lshr i64 %a , 56
224
278
%and = and i64 %shr , 1
@@ -236,9 +290,13 @@ exit:
236
290
; Check a case where TMHH can be used to implement a ult comparison.
237
291
define void @f13 (i64 %a ) {
238
292
; CHECK-LABEL: f13:
239
- ; CHECK: tmhh %r2, 49152
240
- ; CHECK: bnor %r14
241
- ; CHECK: br %r14
293
+ ; CHECK: # %bb.0: # %entry
294
+ ; CHECK-NEXT: tmhh %r2, 49152
295
+ ; CHECK-NEXT: bnor %r14
296
+ ; CHECK-NEXT: .LBB12_1: # %store
297
+ ; CHECK-NEXT: lgrl %r1, g@GOT
298
+ ; CHECK-NEXT: mvhi 0(%r1), 1
299
+ ; CHECK-NEXT: br %r14
242
300
entry:
243
301
%cmp = icmp ult i64 %a , 13835058055282163712
244
302
br i1 %cmp , label %exit , label %store
@@ -254,9 +312,13 @@ exit:
254
312
; And again with ule.
255
313
define void @f14 (i64 %a ) {
256
314
; CHECK-LABEL: f14:
257
- ; CHECK: tmhh %r2, 49152
258
- ; CHECK: bnor %r14
259
- ; CHECK: br %r14
315
+ ; CHECK: # %bb.0: # %entry
316
+ ; CHECK-NEXT: tmhh %r2, 49152
317
+ ; CHECK-NEXT: bnor %r14
318
+ ; CHECK-NEXT: .LBB13_1: # %store
319
+ ; CHECK-NEXT: lgrl %r1, g@GOT
320
+ ; CHECK-NEXT: mvhi 0(%r1), 1
321
+ ; CHECK-NEXT: br %r14
260
322
entry:
261
323
%cmp = icmp ule i64 %a , 13835058055282163711
262
324
br i1 %cmp , label %exit , label %store
@@ -272,9 +334,13 @@ exit:
272
334
; And again with ugt.
273
335
define void @f15 (i64 %a ) {
274
336
; CHECK-LABEL: f15:
275
- ; CHECK: tmhh %r2, 49152
276
- ; CHECK: bor %r14
277
- ; CHECK: br %r14
337
+ ; CHECK: # %bb.0: # %entry
338
+ ; CHECK-NEXT: tmhh %r2, 49152
339
+ ; CHECK-NEXT: bor %r14
340
+ ; CHECK-NEXT: .LBB14_1: # %store
341
+ ; CHECK-NEXT: lgrl %r1, g@GOT
342
+ ; CHECK-NEXT: mvhi 0(%r1), 1
343
+ ; CHECK-NEXT: br %r14
278
344
entry:
279
345
%cmp = icmp ugt i64 %a , 13835058055282163711
280
346
br i1 %cmp , label %exit , label %store
@@ -290,9 +356,13 @@ exit:
290
356
; And again with uge.
291
357
define void @f16 (i64 %a ) {
292
358
; CHECK-LABEL: f16:
293
- ; CHECK: tmhh %r2, 49152
294
- ; CHECK: bor %r14
295
- ; CHECK: br %r14
359
+ ; CHECK: # %bb.0: # %entry
360
+ ; CHECK-NEXT: tmhh %r2, 49152
361
+ ; CHECK-NEXT: bor %r14
362
+ ; CHECK-NEXT: .LBB15_1: # %store
363
+ ; CHECK-NEXT: lgrl %r1, g@GOT
364
+ ; CHECK-NEXT: mvhi 0(%r1), 1
365
+ ; CHECK-NEXT: br %r14
296
366
entry:
297
367
%cmp = icmp uge i64 %a , 13835058055282163712
298
368
br i1 %cmp , label %exit , label %store
@@ -308,11 +378,14 @@ exit:
308
378
; Decrease the constant from f13 to make TMHH invalid.
309
379
define void @f17 (i64 %a ) {
310
380
; CHECK-LABEL: f17:
311
- ; CHECK-NOT: tmhh
312
- ; CHECK: srlg [[REG:%r[0-5]]], %r2, 48
313
- ; CHECK: cgfi [[REG]], 49151
314
- ; CHECK-NOT: tmhh
315
- ; CHECK: br %r14
381
+ ; CHECK: # %bb.0: # %entry
382
+ ; CHECK-NEXT: srlg %r0, %r2, 48
383
+ ; CHECK-NEXT: cgfi %r0, 49151
384
+ ; CHECK-NEXT: blr %r14
385
+ ; CHECK-NEXT: .LBB16_1: # %store
386
+ ; CHECK-NEXT: lgrl %r1, g@GOT
387
+ ; CHECK-NEXT: mvhi 0(%r1), 1
388
+ ; CHECK-NEXT: br %r14
316
389
entry:
317
390
%cmp = icmp ult i64 %a , 13834776580305453056
318
391
br i1 %cmp , label %exit , label %store
@@ -328,9 +401,12 @@ exit:
328
401
; Check that we don't use TMHH just to test the top bit.
329
402
define void @f18 (i64 %a ) {
330
403
; CHECK-LABEL: f18:
331
- ; CHECK-NOT: tmhh
332
- ; CHECK: cgibhe %r2, 0, 0(%r14)
333
- ; CHECK: br %r14
404
+ ; CHECK: # %bb.0: # %entry
405
+ ; CHECK-NEXT: cgibhe %r2, 0, 0(%r14)
406
+ ; CHECK-NEXT: .LBB17_1: # %store
407
+ ; CHECK-NEXT: lgrl %r1, g@GOT
408
+ ; CHECK-NEXT: mvhi 0(%r1), 1
409
+ ; CHECK-NEXT: br %r14
334
410
entry:
335
411
%cmp = icmp ult i64 %a , 9223372036854775808
336
412
br i1 %cmp , label %exit , label %store
@@ -347,10 +423,13 @@ exit:
347
423
; would need to be shifted out of range
348
424
define void @f19 (i64 %a ) {
349
425
; CHECK-LABEL: f19:
350
- ; CHECK-NOT: tmhh
351
- ; CHECK: srlg [[REG:%r[0-5]]], %r2, 63
352
- ; CHECK: cgibl [[REG]], 3, 0(%r14)
353
- ; CHECK: br %r14
426
+ ; CHECK: # %bb.0: # %entry
427
+ ; CHECK-NEXT: srlg %r0, %r2, 63
428
+ ; CHECK-NEXT: cgibl %r0, 3, 0(%r14)
429
+ ; CHECK-NEXT: .LBB18_1: # %store
430
+ ; CHECK-NEXT: lgrl %r1, g@GOT
431
+ ; CHECK-NEXT: mvhi 0(%r1), 1
432
+ ; CHECK-NEXT: br %r14
354
433
entry:
355
434
%shr = lshr i64 %a , 63
356
435
%cmp = icmp ult i64 %shr , 3
0 commit comments