
The LIT test cases were migrated with the script provided by Nikita Popov. No manual changes were made. Committed without review since no functional changes, after consultation with uweigand.
492 lines
8.5 KiB
LLVM
492 lines
8.5 KiB
LLVM
; Test the use of TEST UNDER MASK for 32-bit operations.
|
|
;
|
|
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
|
|
|
|
@g = global i32 0
|
|
|
|
; Check the lowest useful TMLL value.
|
|
define void @f1(i32 %a) {
|
|
; CHECK-LABEL: f1:
|
|
; CHECK: tmll %r2, 1
|
|
; CHECK: ber %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 1
|
|
%cmp = icmp eq i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check the high end of the TMLL range.
|
|
define void @f2(i32 %a) {
|
|
; CHECK-LABEL: f2:
|
|
; CHECK: tmll %r2, 65535
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 65535
|
|
%cmp = icmp ne i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check the lowest useful TMLH value, which is the next value up.
|
|
define void @f3(i32 %a) {
|
|
; CHECK-LABEL: f3:
|
|
; CHECK: tmlh %r2, 1
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 65536
|
|
%cmp = icmp ne i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check the next value up again, which cannot use TM.
|
|
define void @f4(i32 %a) {
|
|
; CHECK-LABEL: f4:
|
|
; CHECK-NOT: {{tm[lh].}}
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 4294901759
|
|
%cmp = icmp eq i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check the high end of the TMLH range.
|
|
define void @f5(i32 %a) {
|
|
; CHECK-LABEL: f5:
|
|
; CHECK: tmlh %r2, 65535
|
|
; CHECK: ber %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 4294901760
|
|
%cmp = icmp eq i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for LT comparisons that are equivalent to
|
|
; an equality comparison with zero.
|
|
define void @f6(i32 %a) {
|
|
; CHECK-LABEL: f6:
|
|
; CHECK: tmll %r2, 240
|
|
; CHECK: ber %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 240
|
|
%cmp = icmp slt i32 %and, 16
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again with LE.
|
|
define void @f7(i32 %a) {
|
|
; CHECK-LABEL: f7:
|
|
; CHECK: tmll %r2, 240
|
|
; CHECK: ber %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 240
|
|
%cmp = icmp sle i32 %and, 15
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for GE comparisons that are equivalent to
|
|
; an inequality comparison with zero.
|
|
define void @f8(i32 %a) {
|
|
; CHECK-LABEL: f8:
|
|
; CHECK: tmll %r2, 240
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 240
|
|
%cmp = icmp uge i32 %and, 16
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again with GT.
|
|
define void @f9(i32 %a) {
|
|
; CHECK-LABEL: f9:
|
|
; CHECK: tmll %r2, 240
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 240
|
|
%cmp = icmp ugt i32 %and, 15
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for LT comparisons that effectively
|
|
; test whether the top bit is clear.
|
|
define void @f10(i32 %a) {
|
|
; CHECK-LABEL: f10:
|
|
; CHECK: tmll %r2, 35
|
|
; CHECK: bler %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 35
|
|
%cmp = icmp ult i32 %and, 8
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again with LE.
|
|
define void @f11(i32 %a) {
|
|
; CHECK-LABEL: f11:
|
|
; CHECK: tmll %r2, 35
|
|
; CHECK: bler %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 35
|
|
%cmp = icmp ule i32 %and, 31
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for GE comparisons that effectively test
|
|
; whether the top bit is set.
|
|
define void @f12(i32 %a) {
|
|
; CHECK-LABEL: f12:
|
|
; CHECK: tmll %r2, 140
|
|
; CHECK: bnler %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 140
|
|
%cmp = icmp uge i32 %and, 128
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again for GT.
|
|
define void @f13(i32 %a) {
|
|
; CHECK-LABEL: f13:
|
|
; CHECK: tmll %r2, 140
|
|
; CHECK: bnler %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 140
|
|
%cmp = icmp ugt i32 %and, 126
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for equality comparisons with the mask.
|
|
define void @f14(i32 %a) {
|
|
; CHECK-LABEL: f14:
|
|
; CHECK: tmll %r2, 101
|
|
; CHECK: bor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 101
|
|
%cmp = icmp eq i32 %and, 101
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for inequality comparisons with the mask.
|
|
define void @f15(i32 %a) {
|
|
; CHECK-LABEL: f15:
|
|
; CHECK: tmll %r2, 65519
|
|
; CHECK: bnor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 65519
|
|
%cmp = icmp ne i32 %and, 65519
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for LT comparisons that are equivalent
|
|
; to inequality comparisons with the mask.
|
|
define void @f16(i32 %a) {
|
|
; CHECK-LABEL: f16:
|
|
; CHECK: tmll %r2, 130
|
|
; CHECK: bnor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 130
|
|
%cmp = icmp ult i32 %and, 129
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again with LE.
|
|
define void @f17(i32 %a) {
|
|
; CHECK-LABEL: f17:
|
|
; CHECK: tmll %r2, 130
|
|
; CHECK: bnor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 130
|
|
%cmp = icmp ule i32 %and, 128
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for GE comparisons that are equivalent
|
|
; to equality comparisons with the mask.
|
|
define void @f18(i32 %a) {
|
|
; CHECK-LABEL: f18:
|
|
; CHECK: tmll %r2, 194
|
|
; CHECK: bor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 194
|
|
%cmp = icmp uge i32 %and, 193
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; ...same again for GT.
|
|
define void @f19(i32 %a) {
|
|
; CHECK-LABEL: f19:
|
|
; CHECK: tmll %r2, 194
|
|
; CHECK: bor %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 194
|
|
%cmp = icmp ugt i32 %and, 192
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for equality comparisons for the low bit
|
|
; when the mask has two bits.
|
|
define void @f20(i32 %a) {
|
|
; CHECK-LABEL: f20:
|
|
; CHECK: tmll %r2, 20
|
|
; CHECK: blr %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 20
|
|
%cmp = icmp eq i32 %and, 4
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for inequality comparisons for the low bit
|
|
; when the mask has two bits.
|
|
define void @f21(i32 %a) {
|
|
; CHECK-LABEL: f21:
|
|
; CHECK: tmll %r2, 20
|
|
; CHECK: bnlr %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 20
|
|
%cmp = icmp ne i32 %and, 4
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for equality comparisons for the high bit
|
|
; when the mask has two bits.
|
|
define void @f22(i32 %a) {
|
|
; CHECK-LABEL: f22:
|
|
; CHECK: tmll %r2, 20
|
|
; CHECK: bhr %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 20
|
|
%cmp = icmp eq i32 %and, 16
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can use TMLL for inequality comparisons for the high bit
|
|
; when the mask has two bits.
|
|
define void @f23(i32 %a) {
|
|
; CHECK-LABEL: f23:
|
|
; CHECK: tmll %r2, 20
|
|
; CHECK: bnhr %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%and = and i32 %a, 20
|
|
%cmp = icmp ne i32 %and, 16
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can fold an SHL into a TMxx mask.
|
|
define void @f24(i32 %a) {
|
|
; CHECK-LABEL: f24:
|
|
; CHECK: tmll %r2, 255
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%shl = shl i32 %a, 12
|
|
%and = and i32 %shl, 1044480
|
|
%cmp = icmp ne i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Check that we can fold an SHR into a TMxx mask.
|
|
define void @f25(i32 %a) {
|
|
; CHECK-LABEL: f25:
|
|
; CHECK: tmlh %r2, 512
|
|
; CHECK: bner %r14
|
|
; CHECK: br %r14
|
|
entry:
|
|
%shr = lshr i32 %a, 25
|
|
%and = and i32 %shr, 1
|
|
%cmp = icmp ne i32 %and, 0
|
|
br i1 %cmp, label %exit, label %store
|
|
|
|
store:
|
|
store i32 1, ptr@g
|
|
br label %exit
|
|
|
|
exit:
|
|
ret void
|
|
}
|