xref: /aosp_15_r20/external/llvm/test/CodeGen/SystemZ/fp-cmp-04.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test that floating-point compares are omitted if CC already has the
2*9880d681SAndroid Build Coastguard Worker; right value.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -no-integrated-as | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float %f)
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Test addition followed by EQ, which can use the CC result of the addition.
9*9880d681SAndroid Build Coastguard Workerdefine float @f1(float %a, float %b, float *%dest) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1:
11*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14
13*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %res = fadd float %a, %b
16*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %res, 0.0
17*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerstore:
20*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
21*9880d681SAndroid Build Coastguard Worker  br label %exit
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerexit:
24*9880d681SAndroid Build Coastguard Worker  ret float %res
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; ...and again with LT.
28*9880d681SAndroid Build Coastguard Workerdefine float @f2(float %a, float %b, float *%dest) {
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2:
30*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
32*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker  %res = fadd float %a, %b
35*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %res, 0.0
36*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerstore:
39*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
40*9880d681SAndroid Build Coastguard Worker  br label %exit
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerexit:
43*9880d681SAndroid Build Coastguard Worker  ret float %res
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; ...and again with GT.
47*9880d681SAndroid Build Coastguard Workerdefine float @f3(float %a, float %b, float *%dest) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3:
49*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
51*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
52*9880d681SAndroid Build Coastguard Workerentry:
53*9880d681SAndroid Build Coastguard Worker  %res = fadd float %a, %b
54*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %res, 0.0
55*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerstore:
58*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
59*9880d681SAndroid Build Coastguard Worker  br label %exit
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerexit:
62*9880d681SAndroid Build Coastguard Worker  ret float %res
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; ...and again with UEQ.
66*9880d681SAndroid Build Coastguard Workerdefine float @f4(float %a, float %b, float *%dest) {
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4:
68*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bnlhr %r14
70*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker  %res = fadd float %a, %b
73*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %res, 0.0
74*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerstore:
77*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
78*9880d681SAndroid Build Coastguard Worker  br label %exit
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerexit:
81*9880d681SAndroid Build Coastguard Worker  ret float %res
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; Subtraction also provides a zero-based CC value.
85*9880d681SAndroid Build Coastguard Workerdefine float @f5(float %a, float %b, float *%dest) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5:
87*9880d681SAndroid Build Coastguard Worker; CHECK: seb %f0, 0(%r2)
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bnher %r14
89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  %cur = load float , float *%dest
92*9880d681SAndroid Build Coastguard Worker  %res = fsub float %a, %cur
93*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ult float %res, 0.0
94*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerstore:
97*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
98*9880d681SAndroid Build Coastguard Worker  br label %exit
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerexit:
101*9880d681SAndroid Build Coastguard Worker  ret float %res
102*9880d681SAndroid Build Coastguard Worker}
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; Test the result of LOAD POSITIVE.
105*9880d681SAndroid Build Coastguard Workerdefine float @f6(float %dummy, float %a, float *%dest) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6:
107*9880d681SAndroid Build Coastguard Worker; CHECK: lpebr %f0, %f2
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bhr %r14
109*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
110*9880d681SAndroid Build Coastguard Workerentry:
111*9880d681SAndroid Build Coastguard Worker  %res = call float @llvm.fabs.f32(float %a)
112*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %res, 0.0
113*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerstore:
116*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dest
117*9880d681SAndroid Build Coastguard Worker  br label %exit
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerexit:
120*9880d681SAndroid Build Coastguard Worker  ret float %res
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; Test the result of LOAD NEGATIVE.
124*9880d681SAndroid Build Coastguard Workerdefine float @f7(float %dummy, float %a, float *%dest) {
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7:
126*9880d681SAndroid Build Coastguard Worker; CHECK: lnebr %f0, %f2
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
128*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker  %abs = call float @llvm.fabs.f32(float %a)
131*9880d681SAndroid Build Coastguard Worker  %res = fsub float -0.0, %abs
132*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %res, 0.0
133*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerstore:
136*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dest
137*9880d681SAndroid Build Coastguard Worker  br label %exit
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerexit:
140*9880d681SAndroid Build Coastguard Worker  ret float %res
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; Test the result of LOAD COMPLEMENT.
144*9880d681SAndroid Build Coastguard Workerdefine float @f8(float %dummy, float %a, float *%dest) {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8:
146*9880d681SAndroid Build Coastguard Worker; CHECK: lcebr %f0, %f2
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14
148*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
149*9880d681SAndroid Build Coastguard Workerentry:
150*9880d681SAndroid Build Coastguard Worker  %res = fsub float -0.0, %a
151*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ole float %res, 0.0
152*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerstore:
155*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dest
156*9880d681SAndroid Build Coastguard Worker  br label %exit
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerexit:
159*9880d681SAndroid Build Coastguard Worker  ret float %res
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker; Multiplication (for example) does not modify CC.
163*9880d681SAndroid Build Coastguard Workerdefine float @f9(float %a, float %b, float *%dest) {
164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9:
165*9880d681SAndroid Build Coastguard Worker; CHECK: meebr %f0, %f2
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ltebr %f0, %f0
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blhr %r14
168*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
169*9880d681SAndroid Build Coastguard Workerentry:
170*9880d681SAndroid Build Coastguard Worker  %res = fmul float %a, %b
171*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %res, 0.0
172*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerstore:
175*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
176*9880d681SAndroid Build Coastguard Worker  br label %exit
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerexit:
179*9880d681SAndroid Build Coastguard Worker  ret float %res
180*9880d681SAndroid Build Coastguard Worker}
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker; Test a combination involving a CC-setting instruction followed by
183*9880d681SAndroid Build Coastguard Worker; a non-CC-setting instruction.
184*9880d681SAndroid Build Coastguard Workerdefine float @f10(float %a, float %b, float %c, float *%dest) {
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10:
186*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: debr %f0, %f4
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ltebr %f0, %f0
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bner %r14
190*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
191*9880d681SAndroid Build Coastguard Workerentry:
192*9880d681SAndroid Build Coastguard Worker  %add = fadd float %a, %b
193*9880d681SAndroid Build Coastguard Worker  %res = fdiv float %add, %c
194*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %res, 0.0
195*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerstore:
198*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
199*9880d681SAndroid Build Coastguard Worker  br label %exit
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerexit:
202*9880d681SAndroid Build Coastguard Worker  ret float %res
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; Test a case where CC is set based on a different register from the
206*9880d681SAndroid Build Coastguard Worker; compare input.
207*9880d681SAndroid Build Coastguard Workerdefine float @f11(float %a, float %b, float %c, float *%dest1, float *%dest2) {
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11:
209*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sebr %f4, %f0
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ste %f4, 0(%r2)
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ltebr %f0, %f0
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ber %r14
214*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
215*9880d681SAndroid Build Coastguard Workerentry:
216*9880d681SAndroid Build Coastguard Worker  %add = fadd float %a, %b
217*9880d681SAndroid Build Coastguard Worker  %sub = fsub float %c, %add
218*9880d681SAndroid Build Coastguard Worker  store float %sub, float *%dest1
219*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %add, 0.0
220*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerstore:
223*9880d681SAndroid Build Coastguard Worker  store float %sub, float *%dest2
224*9880d681SAndroid Build Coastguard Worker  br label %exit
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerexit:
227*9880d681SAndroid Build Coastguard Worker  ret float %add
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; Test that LER gets converted to LTEBR where useful.
231*9880d681SAndroid Build Coastguard Workerdefine float @f12(float %dummy, float %val, float *%dest) {
232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12:
233*9880d681SAndroid Build Coastguard Worker; CHECK: ltebr %f0, %f2
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %f0
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
238*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
239*9880d681SAndroid Build Coastguard Workerentry:
240*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{f0}"(float %val)
241*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %val, 0.0
242*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerstore:
245*9880d681SAndroid Build Coastguard Worker  store float %val, float *%dest
246*9880d681SAndroid Build Coastguard Worker  br label %exit
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerexit:
249*9880d681SAndroid Build Coastguard Worker  ret float %val
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker; Test that LDR gets converted to LTDBR where useful.
253*9880d681SAndroid Build Coastguard Workerdefine double @f13(double %dummy, double %val, double *%dest) {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13:
255*9880d681SAndroid Build Coastguard Worker; CHECK: ltdbr %f0, %f2
256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
257*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %f0
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
260*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
261*9880d681SAndroid Build Coastguard Workerentry:
262*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{f0}"(double %val)
263*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt double %val, 0.0
264*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerstore:
267*9880d681SAndroid Build Coastguard Worker  store double %val, double *%dest
268*9880d681SAndroid Build Coastguard Worker  br label %exit
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Workerexit:
271*9880d681SAndroid Build Coastguard Worker  ret double %val
272*9880d681SAndroid Build Coastguard Worker}
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker; Test that LXR gets converted to LTXBR where useful.
275*9880d681SAndroid Build Coastguard Workerdefine void @f14(fp128 *%ptr1, fp128 *%ptr2) {
276*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14:
277*9880d681SAndroid Build Coastguard Worker; CHECK: ltxbr
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dxbr
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: std
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: std
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mxbr
282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: std
283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: std
284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
285*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
286*9880d681SAndroid Build Coastguard Workerentry:
287*9880d681SAndroid Build Coastguard Worker  %val1 = load fp128 , fp128 *%ptr1
288*9880d681SAndroid Build Coastguard Worker  %val2 = load fp128 , fp128 *%ptr2
289*9880d681SAndroid Build Coastguard Worker  %div = fdiv fp128 %val1, %val2
290*9880d681SAndroid Build Coastguard Worker  store fp128 %div, fp128 *%ptr1
291*9880d681SAndroid Build Coastguard Worker  %mul = fmul fp128 %val1, %val2
292*9880d681SAndroid Build Coastguard Worker  store fp128 %mul, fp128 *%ptr2
293*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt fp128 %val1, 0xL00000000000000000000000000000000
294*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerstore:
297*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah", ""()
298*9880d681SAndroid Build Coastguard Worker  br label %exit
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerexit:
301*9880d681SAndroid Build Coastguard Worker  ret void
302*9880d681SAndroid Build Coastguard Worker}
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LER that
305*9880d681SAndroid Build Coastguard Worker; we need.
306*9880d681SAndroid Build Coastguard Workerdefine float @f15(float %val, float %dummy, float *%dest) {
307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f15:
308*9880d681SAndroid Build Coastguard Worker; CHECK: ltebr %f2, %f0
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %f2
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
313*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
314*9880d681SAndroid Build Coastguard Workerentry:
315*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{f2}"(float %val)
316*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %val, 0.0
317*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerstore:
320*9880d681SAndroid Build Coastguard Worker  store float %val, float *%dest
321*9880d681SAndroid Build Coastguard Worker  br label %exit
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerexit:
324*9880d681SAndroid Build Coastguard Worker  ret float %val
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker; Test a case where it is the source rather than destination of LDR that
328*9880d681SAndroid Build Coastguard Worker; we need.
329*9880d681SAndroid Build Coastguard Workerdefine double @f16(double %val, double %dummy, double *%dest) {
330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f16:
331*9880d681SAndroid Build Coastguard Worker; CHECK: ltdbr %f2, %f0
332*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #APP
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blah %f2
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: #NO_APP
335*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
336*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
337*9880d681SAndroid Build Coastguard Workerentry:
338*9880d681SAndroid Build Coastguard Worker  call void asm sideeffect "blah $0", "{f2}"(double %val)
339*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt double %val, 0.0
340*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerstore:
343*9880d681SAndroid Build Coastguard Worker  store double %val, double *%dest
344*9880d681SAndroid Build Coastguard Worker  br label %exit
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Workerexit:
347*9880d681SAndroid Build Coastguard Worker  ret double %val
348*9880d681SAndroid Build Coastguard Worker}
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker; Repeat f2 with a comparison against -0.
351*9880d681SAndroid Build Coastguard Workerdefine float @f17(float %a, float %b, float *%dest) {
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f17:
353*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f2
354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
355*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
356*9880d681SAndroid Build Coastguard Workerentry:
357*9880d681SAndroid Build Coastguard Worker  %res = fadd float %a, %b
358*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %res, -0.0
359*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerstore:
362*9880d681SAndroid Build Coastguard Worker  store float %b, float *%dest
363*9880d681SAndroid Build Coastguard Worker  br label %exit
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Workerexit:
366*9880d681SAndroid Build Coastguard Worker  ret float %res
367*9880d681SAndroid Build Coastguard Worker}
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker; Test another form of f7 in which the condition is based on the unnegated
370*9880d681SAndroid Build Coastguard Worker; result.  This is what InstCombine would produce.
371*9880d681SAndroid Build Coastguard Workerdefine float @f18(float %dummy, float %a, float *%dest) {
372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f18:
373*9880d681SAndroid Build Coastguard Worker; CHECK: lnebr %f0, %f2
374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr %r14
375*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
376*9880d681SAndroid Build Coastguard Workerentry:
377*9880d681SAndroid Build Coastguard Worker  %abs = call float @llvm.fabs.f32(float %a)
378*9880d681SAndroid Build Coastguard Worker  %res = fsub float -0.0, %abs
379*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %abs, 0.0
380*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Workerstore:
383*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dest
384*9880d681SAndroid Build Coastguard Worker  br label %exit
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Workerexit:
387*9880d681SAndroid Build Coastguard Worker  ret float %res
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; Similarly for f8.
391*9880d681SAndroid Build Coastguard Workerdefine float @f19(float %dummy, float %a, float *%dest) {
392*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f19:
393*9880d681SAndroid Build Coastguard Worker; CHECK: lcebr %f0, %f2
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bler %r14
395*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14
396*9880d681SAndroid Build Coastguard Workerentry:
397*9880d681SAndroid Build Coastguard Worker  %res = fsub float -0.0, %a
398*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oge float %a, 0.0
399*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %store
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Workerstore:
402*9880d681SAndroid Build Coastguard Worker  store float %res, float *%dest
403*9880d681SAndroid Build Coastguard Worker  br label %exit
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerexit:
406*9880d681SAndroid Build Coastguard Worker  ret float %res
407*9880d681SAndroid Build Coastguard Worker}
408