xref: /llvm-project/llvm/test/CodeGen/SystemZ/int-usub-04.ll (revision 872276de4b8c5f13f106b79c53a27e4a6ff8ce35)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; Test 32-bit subtraction in which the second operand is constant.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6declare i32 @foo()
7
8; Check subtraction of 1.
9define zeroext i1 @f1(i32 %dummy, i32 %a, ptr %res) {
10; CHECK-LABEL: f1:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    slfi %r3, 1
13; CHECK-NEXT:    ipm %r0
14; CHECK-NEXT:    afi %r0, -536870912
15; CHECK-NEXT:    risbg %r2, %r0, 63, 191, 33
16; CHECK-NEXT:    st %r3, 0(%r4)
17; CHECK-NEXT:    br %r14
18  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)
19  %val = extractvalue {i32, i1} %t, 0
20  %obit = extractvalue {i32, i1} %t, 1
21  store i32 %val, ptr %res
22  ret i1 %obit
23}
24
25; Check the high end of the SLFI range.
26define zeroext i1 @f2(i32 %dummy, i32 %a, ptr %res) {
27; CHECK-LABEL: f2:
28; CHECK:       # %bb.0:
29; CHECK-NEXT:    slfi %r3, 4294967295
30; CHECK-NEXT:    ipm %r0
31; CHECK-NEXT:    afi %r0, -536870912
32; CHECK-NEXT:    risbg %r2, %r0, 63, 191, 33
33; CHECK-NEXT:    st %r3, 0(%r4)
34; CHECK-NEXT:    br %r14
35  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 4294967295)
36  %val = extractvalue {i32, i1} %t, 0
37  %obit = extractvalue {i32, i1} %t, 1
38  store i32 %val, ptr %res
39  ret i1 %obit
40}
41
42; Check that negative values are treated as unsigned
43define zeroext i1 @f3(i32 %dummy, i32 %a, ptr %res) {
44; CHECK-LABEL: f3:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    slfi %r3, 4294967295
47; CHECK-NEXT:    ipm %r0
48; CHECK-NEXT:    afi %r0, -536870912
49; CHECK-NEXT:    risbg %r2, %r0, 63, 191, 33
50; CHECK-NEXT:    st %r3, 0(%r4)
51; CHECK-NEXT:    br %r14
52  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -1)
53  %val = extractvalue {i32, i1} %t, 0
54  %obit = extractvalue {i32, i1} %t, 1
55  store i32 %val, ptr %res
56  ret i1 %obit
57}
58
59; Check using the overflow result for a branch.
60define void @f4(i32 %dummy, i32 %a, ptr %res) {
61; CHECK-LABEL: f4:
62; CHECK:       # %bb.0:
63; CHECK-NEXT:    slfi %r3, 1
64; CHECK-NEXT:    st %r3, 0(%r4)
65; CHECK-NEXT:    jgle foo@PLT
66; CHECK-NEXT:  .LBB3_1: # %exit
67; CHECK-NEXT:    br %r14
68  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)
69  %val = extractvalue {i32, i1} %t, 0
70  %obit = extractvalue {i32, i1} %t, 1
71  store i32 %val, ptr %res
72  br i1 %obit, label %call, label %exit
73
74call:
75  tail call i32 @foo()
76  br label %exit
77
78exit:
79  ret void
80}
81
82; ... and the same with the inverted direction.
83define void @f5(i32 %dummy, i32 %a, ptr %res) {
84; CHECK-LABEL: f5:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    slfi %r3, 1
87; CHECK-NEXT:    st %r3, 0(%r4)
88; CHECK-NEXT:    jgnle foo@PLT
89; CHECK-NEXT:  .LBB4_1: # %exit
90; CHECK-NEXT:    br %r14
91  %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)
92  %val = extractvalue {i32, i1} %t, 0
93  %obit = extractvalue {i32, i1} %t, 1
94  store i32 %val, ptr %res
95  br i1 %obit, label %exit, label %call
96
97call:
98  tail call i32 @foo()
99  br label %exit
100
101exit:
102  ret void
103}
104
105declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone
106
107