1; Test 32-bit signed comparison in which the second operand is constant.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5; Check comparisons with 0.
6define double @f1(double %a, double %b, i32 %i1) {
7; CHECK-LABEL: f1:
8; CHECK: cijl %r2, 0
9; CHECK: ldr %f0, %f2
10; CHECK: br %r14
11  %cond = icmp slt i32 %i1, 0
12  %res = select i1 %cond, double %a, double %b
13  ret double %res
14}
15
16; Check comparisons with 2.
17define double @f2(double %a, double %b, i32 %i1) {
18; CHECK-LABEL: f2:
19; CHECK: cijl %r2, 2
20; CHECK: ldr %f0, %f2
21; CHECK: br %r14
22  %cond = icmp slt i32 %i1, 2
23  %res = select i1 %cond, double %a, double %b
24  ret double %res
25}
26
27; Check the high end of the CIJ range.
28define double @f3(double %a, double %b, i32 %i1) {
29; CHECK-LABEL: f3:
30; CHECK: cijl %r2, 127
31; CHECK: ldr %f0, %f2
32; CHECK: br %r14
33  %cond = icmp slt i32 %i1, 127
34  %res = select i1 %cond, double %a, double %b
35  ret double %res
36}
37
38; Check the next value up, which must use CHI instead.
39define double @f4(double %a, double %b, i32 %i1) {
40; CHECK-LABEL: f4:
41; CHECK: chi %r2, 128
42; CHECK-NEXT: jl
43; CHECK: ldr %f0, %f2
44; CHECK: br %r14
45  %cond = icmp slt i32 %i1, 128
46  %res = select i1 %cond, double %a, double %b
47  ret double %res
48}
49
50; Check the high end of the CHI range.
51define double @f5(double %a, double %b, i32 %i1) {
52; CHECK-LABEL: f5:
53; CHECK: chi %r2, 32767
54; CHECK-NEXT: jl
55; CHECK: ldr %f0, %f2
56; CHECK: br %r14
57  %cond = icmp slt i32 %i1, 32767
58  %res = select i1 %cond, double %a, double %b
59  ret double %res
60}
61
62; Check the next value up, which must use CFI.
63define double @f6(double %a, double %b, i32 %i1) {
64; CHECK-LABEL: f6:
65; CHECK: cfi %r2, 32768
66; CHECK-NEXT: jl
67; CHECK: ldr %f0, %f2
68; CHECK: br %r14
69  %cond = icmp slt i32 %i1, 32768
70  %res = select i1 %cond, double %a, double %b
71  ret double %res
72}
73
74; Check the high end of the signed 32-bit range.
75define double @f7(double %a, double %b, i32 %i1) {
76; CHECK-LABEL: f7:
77; CHECK: cfi %r2, 2147483647
78; CHECK-NEXT: je
79; CHECK: ldr %f0, %f2
80; CHECK: br %r14
81  %cond = icmp eq i32 %i1, 2147483647
82  %res = select i1 %cond, double %a, double %b
83  ret double %res
84}
85
86; Check the next value up, which should be treated as a negative value.
87define double @f8(double %a, double %b, i32 %i1) {
88; CHECK-LABEL: f8:
89; CHECK: cfi %r2, -2147483648
90; CHECK-NEXT: je
91; CHECK: ldr %f0, %f2
92; CHECK: br %r14
93  %cond = icmp eq i32 %i1, 2147483648
94  %res = select i1 %cond, double %a, double %b
95  ret double %res
96}
97
98; Check the high end of the negative CIJ range.
99define double @f9(double %a, double %b, i32 %i1) {
100; CHECK-LABEL: f9:
101; CHECK: cijl %r2, -1
102; CHECK: ldr %f0, %f2
103; CHECK: br %r14
104  %cond = icmp slt i32 %i1, -1
105  %res = select i1 %cond, double %a, double %b
106  ret double %res
107}
108
109; Check the low end of the CIJ range.
110define double @f10(double %a, double %b, i32 %i1) {
111; CHECK-LABEL: f10:
112; CHECK: cijl %r2, -128
113; CHECK: ldr %f0, %f2
114; CHECK: br %r14
115  %cond = icmp slt i32 %i1, -128
116  %res = select i1 %cond, double %a, double %b
117  ret double %res
118}
119
120; Check the next value down, which must use CHI instead.
121define double @f11(double %a, double %b, i32 %i1) {
122; CHECK-LABEL: f11:
123; CHECK: chi %r2, -129
124; CHECK-NEXT: jl
125; CHECK: ldr %f0, %f2
126; CHECK: br %r14
127  %cond = icmp slt i32 %i1, -129
128  %res = select i1 %cond, double %a, double %b
129  ret double %res
130}
131
132; Check the low end of the CHI range.
133define double @f12(double %a, double %b, i32 %i1) {
134; CHECK-LABEL: f12:
135; CHECK: chi %r2, -32768
136; CHECK-NEXT: jl
137; CHECK: ldr %f0, %f2
138; CHECK: br %r14
139  %cond = icmp slt i32 %i1, -32768
140  %res = select i1 %cond, double %a, double %b
141  ret double %res
142}
143
144; Check the next value down, which must use CFI instead.
145define double @f13(double %a, double %b, i32 %i1) {
146; CHECK-LABEL: f13:
147; CHECK: cfi %r2, -32769
148; CHECK-NEXT: jl
149; CHECK: ldr %f0, %f2
150; CHECK: br %r14
151  %cond = icmp slt i32 %i1, -32769
152  %res = select i1 %cond, double %a, double %b
153  ret double %res
154}
155
156; Check the low end of the signed 32-bit range.
157define double @f14(double %a, double %b, i32 %i1) {
158; CHECK-LABEL: f14:
159; CHECK: cfi %r2, -2147483648
160; CHECK-NEXT: je
161; CHECK: ldr %f0, %f2
162; CHECK: br %r14
163  %cond = icmp eq i32 %i1, -2147483648
164  %res = select i1 %cond, double %a, double %b
165  ret double %res
166}
167
168; Check the next value down, which should be treated as a positive value.
169define double @f15(double %a, double %b, i32 %i1) {
170; CHECK-LABEL: f15:
171; CHECK: cfi %r2, 2147483647
172; CHECK-NEXT: je
173; CHECK: ldr %f0, %f2
174; CHECK: br %r14
175  %cond = icmp eq i32 %i1, -2147483649
176  %res = select i1 %cond, double %a, double %b
177  ret double %res
178}
179
180; Check that < 1 becomes <= 0.
181define double @f16(double %a, double %b, i32 %i1) {
182; CHECK-LABEL: f16:
183; CHECK: cijle %r2, 0
184; CHECK: ldr %f0, %f2
185; CHECK: br %r14
186  %cond = icmp slt i32 %i1, 1
187  %res = select i1 %cond, double %a, double %b
188  ret double %res
189}
190
191; Check that >= 1 becomes > 0.
192define double @f17(double %a, double %b, i32 %i1) {
193; CHECK-LABEL: f17:
194; CHECK: cijh %r2, 0
195; CHECK: ldr %f0, %f2
196; CHECK: br %r14
197  %cond = icmp sge i32 %i1, 1
198  %res = select i1 %cond, double %a, double %b
199  ret double %res
200}
201
202; Check that > -1 becomes >= 0.
203define double @f18(double %a, double %b, i32 %i1) {
204; CHECK-LABEL: f18:
205; CHECK: cijhe %r2, 0
206; CHECK: ldr %f0, %f2
207; CHECK: br %r14
208  %cond = icmp sgt i32 %i1, -1
209  %res = select i1 %cond, double %a, double %b
210  ret double %res
211}
212
213; Check that <= -1 becomes < 0.
214define double @f19(double %a, double %b, i32 %i1) {
215; CHECK-LABEL: f19:
216; CHECK: cijl %r2, 0
217; CHECK: ldr %f0, %f2
218; CHECK: br %r14
219  %cond = icmp sle i32 %i1, -1
220  %res = select i1 %cond, double %a, double %b
221  ret double %res
222}
223