[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / SystemZ / int-cmp-11.ll
blob8fd9d8c3d47934b28fceae255592687740a4c26e
1 ; Test 64-bit signed comparisons in which the second operand is a constant.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 ; Check comparisons with 0.
6 define double @f1(double %a, double %b, i64 %i1) {
7 ; CHECK-LABEL: f1:
8 ; CHECK: cgijl %r2, 0
9 ; CHECK: ldr %f0, %f2
10 ; CHECK: br %r14
11   %cond = icmp slt i64 %i1, 0
12   %tmp = select i1 %cond, double %a, double %b
13   %res = fadd double %tmp, 1.0
14   ret double %res
17 ; Check comparisons with 1.
18 define double @f2(double %a, double %b, i64 %i1) {
19 ; CHECK-LABEL: f2:
20 ; CHECK: cgijle %r2, 0
21 ; CHECK: ldr %f0, %f2
22 ; CHECK: br %r14
23   %cond = icmp slt i64 %i1, 1
24   %tmp = select i1 %cond, double %a, double %b
25   %res = fadd double %tmp, 1.0
26   ret double %res
29 ; Check the high end of the CGIJ range.
30 define double @f3(double %a, double %b, i64 %i1) {
31 ; CHECK-LABEL: f3:
32 ; CHECK: cgijl %r2, 127
33 ; CHECK: ldr %f0, %f2
34 ; CHECK: br %r14
35   %cond = icmp slt i64 %i1, 127
36   %tmp = select i1 %cond, double %a, double %b
37   %res = fadd double %tmp, 1.0
38   ret double %res
41 ; Check the next value up, which must use CGHI instead.
42 define double @f4(double %a, double %b, i64 %i1) {
43 ; CHECK-LABEL: f4:
44 ; CHECK: cghi %r2, 128
45 ; CHECK-NEXT: jl
46 ; CHECK: ldr %f0, %f2
47 ; CHECK: br %r14
48   %cond = icmp slt i64 %i1, 128
49   %tmp = select i1 %cond, double %a, double %b
50   %res = fadd double %tmp, 1.0
51   ret double %res
54 ; Check the high end of the CGHI range.
55 define double @f5(double %a, double %b, i64 %i1) {
56 ; CHECK-LABEL: f5:
57 ; CHECK: cghi %r2, 32767
58 ; CHECK-NEXT: jl
59 ; CHECK: ldr %f0, %f2
60 ; CHECK: br %r14
61   %cond = icmp slt i64 %i1, 32767
62   %tmp = select i1 %cond, double %a, double %b
63   %res = fadd double %tmp, 1.0
64   ret double %res
67 ; Check the next value up, which must use CGFI.
68 define double @f6(double %a, double %b, i64 %i1) {
69 ; CHECK-LABEL: f6:
70 ; CHECK: cgfi %r2, 32768
71 ; CHECK-NEXT: jl
72 ; CHECK: ldr %f0, %f2
73 ; CHECK: br %r14
74   %cond = icmp slt i64 %i1, 32768
75   %tmp = select i1 %cond, double %a, double %b
76   %res = fadd double %tmp, 1.0
77   ret double %res
80 ; Check the high end of the CGFI range.
81 define double @f7(double %a, double %b, i64 %i1) {
82 ; CHECK-LABEL: f7:
83 ; CHECK: cgfi %r2, 2147483647
84 ; CHECK-NEXT: jl
85 ; CHECK: ldr %f0, %f2
86 ; CHECK: br %r14
87   %cond = icmp slt i64 %i1, 2147483647
88   %tmp = select i1 %cond, double %a, double %b
89   %res = fadd double %tmp, 1.0
90   ret double %res
93 ; Check the next value up, which must use register comparison.
94 define double @f8(double %a, double %b, i64 %i1) {
95 ; CHECK-LABEL: f8:
96 ; CHECK: cgrjl
97 ; CHECK: ldr %f0, %f2
98 ; CHECK: br %r14
99   %cond = icmp slt i64 %i1, 2147483648
100   %tmp = select i1 %cond, double %a, double %b
101   %res = fadd double %tmp, 1.0
102   ret double %res
105 ; Check the high end of the negative CGIJ range.
106 define double @f9(double %a, double %b, i64 %i1) {
107 ; CHECK-LABEL: f9:
108 ; CHECK: cgijl %r2, -1
109 ; CHECK: ldr %f0, %f2
110 ; CHECK: br %r14
111   %cond = icmp slt i64 %i1, -1
112   %tmp = select i1 %cond, double %a, double %b
113   %res = fadd double %tmp, 1.0
114   ret double %res
117 ; Check the low end of the CGIJ range.
118 define double @f10(double %a, double %b, i64 %i1) {
119 ; CHECK-LABEL: f10:
120 ; CHECK: cgijl %r2, -128
121 ; CHECK: ldr %f0, %f2
122 ; CHECK: br %r14
123   %cond = icmp slt i64 %i1, -128
124   %tmp = select i1 %cond, double %a, double %b
125   %res = fadd double %tmp, 1.0
126   ret double %res
129 ; Check the next value down, which must use CGHI instead.
130 define double @f11(double %a, double %b, i64 %i1) {
131 ; CHECK-LABEL: f11:
132 ; CHECK: cghi %r2, -129
133 ; CHECK-NEXT: jl
134 ; CHECK: ldr %f0, %f2
135 ; CHECK: br %r14
136   %cond = icmp slt i64 %i1, -129
137   %tmp = select i1 %cond, double %a, double %b
138   %res = fadd double %tmp, 1.0
139   ret double %res
142 ; Check the low end of the CGHI range.
143 define double @f12(double %a, double %b, i64 %i1) {
144 ; CHECK-LABEL: f12:
145 ; CHECK: cghi %r2, -32768
146 ; CHECK-NEXT: jl
147 ; CHECK: ldr %f0, %f2
148 ; CHECK: br %r14
149   %cond = icmp slt i64 %i1, -32768
150   %tmp = select i1 %cond, double %a, double %b
151   %res = fadd double %tmp, 1.0
152   ret double %res
155 ; Check the next value down, which must use CGFI instead.
156 define double @f13(double %a, double %b, i64 %i1) {
157 ; CHECK-LABEL: f13:
158 ; CHECK: cgfi %r2, -32769
159 ; CHECK-NEXT: jl
160 ; CHECK: ldr %f0, %f2
161 ; CHECK: br %r14
162   %cond = icmp slt i64 %i1, -32769
163   %tmp = select i1 %cond, double %a, double %b
164   %res = fadd double %tmp, 1.0
165   ret double %res
168 ; Check the low end of the CGFI range.
169 define double @f14(double %a, double %b, i64 %i1) {
170 ; CHECK-LABEL: f14:
171 ; CHECK: cgfi %r2, -2147483648
172 ; CHECK-NEXT: jl
173 ; CHECK: ldr %f0, %f2
174 ; CHECK: br %r14
175   %cond = icmp slt i64 %i1, -2147483648
176   %tmp = select i1 %cond, double %a, double %b
177   %res = fadd double %tmp, 1.0
178   ret double %res
181 ; Check the next value down, which must use register comparison.
182 define double @f15(double %a, double %b, i64 %i1) {
183 ; CHECK-LABEL: f15:
184 ; CHECK: cgrjl
185 ; CHECK: ldr %f0, %f2
186 ; CHECK: br %r14
187   %cond = icmp slt i64 %i1, -2147483649
188   %tmp = select i1 %cond, double %a, double %b
189   %res = fadd double %tmp, 1.0
190   ret double %res