blob: c0d384c5975c9526eda59039b55a1d07f8b2f2c8 [file] [log] [blame]
Richard Sandifordf834ea12013-10-31 12:14:17 +00001; Test 32-bit floating-point comparison. The tests assume a z10 implementation
2; of select, using conditional branches rather than LOCGR.
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00003;
Ulrich Weigand33435c42017-07-17 17:42:48 +00004; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \
5; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s
6; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 \
7; RUN: | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s
Ulrich Weigand9e3577f2013-05-06 16:17:29 +00008
Richard Sandiforded1fab62013-07-03 10:10:02 +00009declare float @foo()
10
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000011; Check comparison with registers.
12define i64 @f1(i64 %a, i64 %b, float %f1, float %f2) {
Stephen Lind24ab202013-07-14 06:24:09 +000013; CHECK-LABEL: f1:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000014; CHECK: cebr %f0, %f2
Ulrich Weigand33435c42017-07-17 17:42:48 +000015; CHECK-SCALAR-NEXT: ber %r14
16; CHECK-SCALAR: lgr %r2, %r3
17; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000018; CHECK: br %r14
19 %cond = fcmp oeq float %f1, %f2
20 %res = select i1 %cond, i64 %a, i64 %b
21 ret i64 %res
22}
23
24; Check the low end of the CEB range.
25define i64 @f2(i64 %a, i64 %b, float %f1, float *%ptr) {
Stephen Lind24ab202013-07-14 06:24:09 +000026; CHECK-LABEL: f2:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000027; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +000028; CHECK-SCALAR-NEXT: ber %r14
29; CHECK-SCALAR: lgr %r2, %r3
30; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000031; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000032 %f2 = load float, float *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000033 %cond = fcmp oeq float %f1, %f2
34 %res = select i1 %cond, i64 %a, i64 %b
35 ret i64 %res
36}
37
38; Check the high end of the aligned CEB range.
39define i64 @f3(i64 %a, i64 %b, float %f1, float *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000040; CHECK-LABEL: f3:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000041; CHECK: ceb %f0, 4092(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +000042; CHECK-SCALAR-NEXT: ber %r14
43; CHECK-SCALAR: lgr %r2, %r3
44; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000045; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000046 %ptr = getelementptr float, float *%base, i64 1023
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000047 %f2 = load float, float *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000048 %cond = fcmp oeq float %f1, %f2
49 %res = select i1 %cond, i64 %a, i64 %b
50 ret i64 %res
51}
52
53; Check the next word up, which needs separate address logic.
54; Other sequences besides this one would be OK.
55define i64 @f4(i64 %a, i64 %b, float %f1, float *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000056; CHECK-LABEL: f4:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000057; CHECK: aghi %r4, 4096
58; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +000059; CHECK-SCALAR-NEXT: ber %r14
60; CHECK-SCALAR: lgr %r2, %r3
61; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000062; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000063 %ptr = getelementptr float, float *%base, i64 1024
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000064 %f2 = load float, float *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000065 %cond = fcmp oeq float %f1, %f2
66 %res = select i1 %cond, i64 %a, i64 %b
67 ret i64 %res
68}
69
70; Check negative displacements, which also need separate address logic.
71define i64 @f5(i64 %a, i64 %b, float %f1, float *%base) {
Stephen Lind24ab202013-07-14 06:24:09 +000072; CHECK-LABEL: f5:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000073; CHECK: aghi %r4, -4
74; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +000075; CHECK-SCALAR-NEXT: ber %r14
76; CHECK-SCALAR: lgr %r2, %r3
77; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000078; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000079 %ptr = getelementptr float, float *%base, i64 -1
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000080 %f2 = load float, float *%ptr
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000081 %cond = fcmp oeq float %f1, %f2
82 %res = select i1 %cond, i64 %a, i64 %b
83 ret i64 %res
84}
85
86; Check that CEB allows indices.
87define i64 @f6(i64 %a, i64 %b, float %f1, float *%base, i64 %index) {
Stephen Lind24ab202013-07-14 06:24:09 +000088; CHECK-LABEL: f6:
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000089; CHECK: sllg %r1, %r5, 2
90; CHECK: ceb %f0, 400(%r1,%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +000091; CHECK-SCALAR-NEXT: ber %r14
92; CHECK-SCALAR: lgr %r2, %r3
93; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000094; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +000095 %ptr1 = getelementptr float, float *%base, i64 %index
96 %ptr2 = getelementptr float, float *%ptr1, i64 100
Ulrich Weigand9dd23b82018-07-20 12:12:10 +000097 %f2 = load float, float *%ptr2
Ulrich Weigand9e3577f2013-05-06 16:17:29 +000098 %cond = fcmp oeq float %f1, %f2
99 %res = select i1 %cond, i64 %a, i64 %b
100 ret i64 %res
101}
Richard Sandiforded1fab62013-07-03 10:10:02 +0000102
103; Check that comparisons of spilled values can use CEB rather than CEBR.
104define float @f7(float *%ptr0) {
Stephen Lind24ab202013-07-14 06:24:09 +0000105; CHECK-LABEL: f7:
Richard Sandiforded1fab62013-07-03 10:10:02 +0000106; CHECK: brasl %r14, foo@PLT
Ulrich Weigand33435c42017-07-17 17:42:48 +0000107; CHECK-SCALAR: ceb {{%f[0-9]+}}, 16{{[04]}}(%r15)
Richard Sandiforded1fab62013-07-03 10:10:02 +0000108; CHECK: br %r14
David Blaikie79e6c742015-02-27 19:29:02 +0000109 %ptr1 = getelementptr float, float *%ptr0, i64 2
110 %ptr2 = getelementptr float, float *%ptr0, i64 4
111 %ptr3 = getelementptr float, float *%ptr0, i64 6
112 %ptr4 = getelementptr float, float *%ptr0, i64 8
113 %ptr5 = getelementptr float, float *%ptr0, i64 10
114 %ptr6 = getelementptr float, float *%ptr0, i64 12
115 %ptr7 = getelementptr float, float *%ptr0, i64 14
116 %ptr8 = getelementptr float, float *%ptr0, i64 16
117 %ptr9 = getelementptr float, float *%ptr0, i64 18
118 %ptr10 = getelementptr float, float *%ptr0, i64 20
Richard Sandiforded1fab62013-07-03 10:10:02 +0000119
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000120 %val0 = load float, float *%ptr0
121 %val1 = load float, float *%ptr1
122 %val2 = load float, float *%ptr2
123 %val3 = load float, float *%ptr3
124 %val4 = load float, float *%ptr4
125 %val5 = load float, float *%ptr5
126 %val6 = load float, float *%ptr6
127 %val7 = load float, float *%ptr7
128 %val8 = load float, float *%ptr8
129 %val9 = load float, float *%ptr9
130 %val10 = load float, float *%ptr10
Richard Sandiforded1fab62013-07-03 10:10:02 +0000131
132 %ret = call float @foo()
133
134 %cmp0 = fcmp olt float %ret, %val0
135 %cmp1 = fcmp olt float %ret, %val1
136 %cmp2 = fcmp olt float %ret, %val2
137 %cmp3 = fcmp olt float %ret, %val3
138 %cmp4 = fcmp olt float %ret, %val4
139 %cmp5 = fcmp olt float %ret, %val5
140 %cmp6 = fcmp olt float %ret, %val6
141 %cmp7 = fcmp olt float %ret, %val7
142 %cmp8 = fcmp olt float %ret, %val8
143 %cmp9 = fcmp olt float %ret, %val9
144 %cmp10 = fcmp olt float %ret, %val10
145
146 %sel0 = select i1 %cmp0, float %ret, float 0.0
147 %sel1 = select i1 %cmp1, float %sel0, float 1.0
148 %sel2 = select i1 %cmp2, float %sel1, float 2.0
149 %sel3 = select i1 %cmp3, float %sel2, float 3.0
150 %sel4 = select i1 %cmp4, float %sel3, float 4.0
151 %sel5 = select i1 %cmp5, float %sel4, float 5.0
152 %sel6 = select i1 %cmp6, float %sel5, float 6.0
153 %sel7 = select i1 %cmp7, float %sel6, float 7.0
154 %sel8 = select i1 %cmp8, float %sel7, float 8.0
155 %sel9 = select i1 %cmp9, float %sel8, float 9.0
156 %sel10 = select i1 %cmp10, float %sel9, float 10.0
157
158 ret float %sel10
159}
Richard Sandiford9f11bc12013-08-07 11:03:34 +0000160
161; Check comparison with zero.
162define i64 @f8(i64 %a, i64 %b, float %f) {
163; CHECK-LABEL: f8:
164; CHECK: ltebr %f0, %f0
Ulrich Weigand33435c42017-07-17 17:42:48 +0000165; CHECK-SCALAR-NEXT: ber %r14
166; CHECK-SCALAR: lgr %r2, %r3
167; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Richard Sandiford9f11bc12013-08-07 11:03:34 +0000168; CHECK: br %r14
169 %cond = fcmp oeq float %f, 0.0
170 %res = select i1 %cond, i64 %a, i64 %b
171 ret i64 %res
172}
Richard Sandiford24e597b2013-08-23 11:27:19 +0000173
174; Check the comparison can be reversed if that allows CEB to be used,
175; first with oeq.
176define i64 @f9(i64 %a, i64 %b, float %f2, float *%ptr) {
177; CHECK-LABEL: f9:
178; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000179; CHECK-SCALAR-NEXT: ber %r14
180; CHECK-SCALAR: lgr %r2, %r3
181; CHECK-VECTOR-NEXT: locgrne %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000182; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000183 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000184 %cond = fcmp oeq float %f1, %f2
185 %res = select i1 %cond, i64 %a, i64 %b
186 ret i64 %res
187}
188
189; ...then one.
190define i64 @f10(i64 %a, i64 %b, float %f2, float *%ptr) {
191; CHECK-LABEL: f10:
192; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000193; CHECK-SCALAR-NEXT: blhr %r14
194; CHECK-SCALAR: lgr %r2, %r3
195; CHECK-VECTOR-NEXT: locgrnlh %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000196; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000197 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000198 %cond = fcmp one float %f1, %f2
199 %res = select i1 %cond, i64 %a, i64 %b
200 ret i64 %res
201}
202
203; ...then olt.
204define i64 @f11(i64 %a, i64 %b, float %f2, float *%ptr) {
205; CHECK-LABEL: f11:
206; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000207; CHECK-SCALAR-NEXT: bhr %r14
208; CHECK-SCALAR: lgr %r2, %r3
209; CHECK-VECTOR-NEXT: locgrnh %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000210; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000211 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000212 %cond = fcmp olt float %f1, %f2
213 %res = select i1 %cond, i64 %a, i64 %b
214 ret i64 %res
215}
216
217; ...then ole.
218define i64 @f12(i64 %a, i64 %b, float %f2, float *%ptr) {
219; CHECK-LABEL: f12:
220; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000221; CHECK-SCALAR-NEXT: bher %r14
222; CHECK-SCALAR: lgr %r2, %r3
223; CHECK-VECTOR-NEXT: locgrnhe %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000224; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000225 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000226 %cond = fcmp ole float %f1, %f2
227 %res = select i1 %cond, i64 %a, i64 %b
228 ret i64 %res
229}
230
231; ...then oge.
232define i64 @f13(i64 %a, i64 %b, float %f2, float *%ptr) {
233; CHECK-LABEL: f13:
234; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000235; CHECK-SCALAR-NEXT: bler %r14
236; CHECK-SCALAR: lgr %r2, %r3
237; CHECK-VECTOR-NEXT: locgrnle %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000238; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000239 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000240 %cond = fcmp oge float %f1, %f2
241 %res = select i1 %cond, i64 %a, i64 %b
242 ret i64 %res
243}
244
245; ...then ogt.
246define i64 @f14(i64 %a, i64 %b, float %f2, float *%ptr) {
247; CHECK-LABEL: f14:
248; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000249; CHECK-SCALAR-NEXT: blr %r14
250; CHECK-SCALAR: lgr %r2, %r3
251; CHECK-VECTOR-NEXT: locgrnl %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000252; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000253 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000254 %cond = fcmp ogt float %f1, %f2
255 %res = select i1 %cond, i64 %a, i64 %b
256 ret i64 %res
257}
258
259; ...then ueq.
260define i64 @f15(i64 %a, i64 %b, float %f2, float *%ptr) {
261; CHECK-LABEL: f15:
262; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000263; CHECK-SCALAR-NEXT: bnlhr %r14
264; CHECK-SCALAR: lgr %r2, %r3
265; CHECK-VECTOR-NEXT: locgrlh %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000266; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000267 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000268 %cond = fcmp ueq float %f1, %f2
269 %res = select i1 %cond, i64 %a, i64 %b
270 ret i64 %res
271}
272
273; ...then une.
274define i64 @f16(i64 %a, i64 %b, float %f2, float *%ptr) {
275; CHECK-LABEL: f16:
276; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000277; CHECK-SCALAR-NEXT: bner %r14
278; CHECK-SCALAR: lgr %r2, %r3
279; CHECK-VECTOR-NEXT: locgre %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000280; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000281 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000282 %cond = fcmp une float %f1, %f2
283 %res = select i1 %cond, i64 %a, i64 %b
284 ret i64 %res
285}
286
287; ...then ult.
288define i64 @f17(i64 %a, i64 %b, float %f2, float *%ptr) {
289; CHECK-LABEL: f17:
290; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000291; CHECK-SCALAR-NEXT: bnler %r14
292; CHECK-SCALAR: lgr %r2, %r3
293; CHECK-VECTOR-NEXT: locgrle %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000294; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000295 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000296 %cond = fcmp ult float %f1, %f2
297 %res = select i1 %cond, i64 %a, i64 %b
298 ret i64 %res
299}
300
301; ...then ule.
302define i64 @f18(i64 %a, i64 %b, float %f2, float *%ptr) {
303; CHECK-LABEL: f18:
304; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000305; CHECK-SCALAR-NEXT: bnlr %r14
306; CHECK-SCALAR: lgr %r2, %r3
307; CHECK-VECTOR-NEXT: locgrl %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000308; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000309 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000310 %cond = fcmp ule float %f1, %f2
311 %res = select i1 %cond, i64 %a, i64 %b
312 ret i64 %res
313}
314
315; ...then uge.
316define i64 @f19(i64 %a, i64 %b, float %f2, float *%ptr) {
317; CHECK-LABEL: f19:
318; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000319; CHECK-SCALAR-NEXT: bnhr %r14
320; CHECK-SCALAR: lgr %r2, %r3
321; CHECK-VECTOR-NEXT: locgrh %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000322; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000323 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000324 %cond = fcmp uge float %f1, %f2
325 %res = select i1 %cond, i64 %a, i64 %b
326 ret i64 %res
327}
328
329; ...then ugt.
330define i64 @f20(i64 %a, i64 %b, float %f2, float *%ptr) {
331; CHECK-LABEL: f20:
332; CHECK: ceb %f0, 0(%r4)
Ulrich Weigand33435c42017-07-17 17:42:48 +0000333; CHECK-SCALAR-NEXT: bnher %r14
334; CHECK-SCALAR: lgr %r2, %r3
335; CHECK-VECTOR-NEXT: locgrhe %r2, %r3
Richard Sandiford24e597b2013-08-23 11:27:19 +0000336; CHECK: br %r14
Ulrich Weigand9dd23b82018-07-20 12:12:10 +0000337 %f1 = load float, float *%ptr
Richard Sandiford24e597b2013-08-23 11:27:19 +0000338 %cond = fcmp ugt float %f1, %f2
339 %res = select i1 %cond, i64 %a, i64 %b
340 ret i64 %res
341}