xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-fcmp-opt.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -mcpu=cyclone -aarch64-neon-syntax=apple | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; rdar://10263824
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_float1(float %a) nounwind ssp {
5*9880d681SAndroid Build Coastguard Workerentry:
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_float1
7*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, #0.0
8*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne
9*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %a, 0.000000e+00
10*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_float2(float %a, float %b) nounwind ssp {
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_float2
16*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
17*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne
18*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %a, %b
19*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_double1(double %a) nounwind ssp {
23*9880d681SAndroid Build Coastguard Workerentry:
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_double1
25*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp d0, #0.0
26*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne
27*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une double %a, 0.000000e+00
28*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i1 @fcmp_double2(double %a, double %b) nounwind ssp {
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_double2
34*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp d0, d1
35*9880d681SAndroid Build Coastguard Worker; CHECK: cset w0, ne
36*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une double %a, %b
37*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; Check each fcmp condition
41*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_oeq(float %a, float %b) nounwind ssp {
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_oeq
43*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
44*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
46*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], eq
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
49*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
50*9880d681SAndroid Build Coastguard Worker  ret float %conv
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ogt(float %a, float %b) nounwind ssp {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ogt
55*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
56*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
57*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
58*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], gt
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %a, %b
61*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
62*9880d681SAndroid Build Coastguard Worker  ret float %conv
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_oge(float %a, float %b) nounwind ssp {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_oge
67*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
68*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
69*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
70*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ge
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oge float %a, %b
73*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
74*9880d681SAndroid Build Coastguard Worker  ret float %conv
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_olt(float %a, float %b) nounwind ssp {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_olt
79*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
80*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
81*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
82*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], mi
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp olt float %a, %b
85*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
86*9880d681SAndroid Build Coastguard Worker  ret float %conv
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ole(float %a, float %b) nounwind ssp {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ole
91*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
92*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
93*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
94*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ls
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ole float %a, %b
97*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
98*9880d681SAndroid Build Coastguard Worker  ret float %conv
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ord(float %a, float %b) nounwind ssp {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ord
103*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
104*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
105*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
106*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], vc
107*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ord float %a, %b
108*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
109*9880d681SAndroid Build Coastguard Worker  ret float %conv
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_uno(float %a, float %b) nounwind ssp {
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_uno
114*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
115*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
116*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
117*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], vs
118*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp uno float %a, %b
119*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
120*9880d681SAndroid Build Coastguard Worker  ret float %conv
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ugt(float %a, float %b) nounwind ssp {
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ugt
125*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
126*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
127*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
128*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], hi
129*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ugt float %a, %b
130*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
131*9880d681SAndroid Build Coastguard Worker  ret float %conv
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_uge(float %a, float %b) nounwind ssp {
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_uge
136*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
137*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
138*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
139*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], pl
140*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp uge float %a, %b
141*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
142*9880d681SAndroid Build Coastguard Worker  ret float %conv
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ult(float %a, float %b) nounwind ssp {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ult
147*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
148*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
149*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
150*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], lt
151*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ult float %a, %b
152*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
153*9880d681SAndroid Build Coastguard Worker  ret float %conv
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ule(float %a, float %b) nounwind ssp {
157*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ule
158*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
159*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
160*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
161*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], le
162*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ule float %a, %b
163*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
164*9880d681SAndroid Build Coastguard Worker  ret float %conv
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_une(float %a, float %b) nounwind ssp {
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_une
169*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
170*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
171*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
172*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], s[[ZERO]], ne
173*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %a, %b
174*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
175*9880d681SAndroid Build Coastguard Worker  ret float %conv
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker; Possible opportunity for improvement.  See comment in
179*9880d681SAndroid Build Coastguard Worker; ARM64TargetLowering::LowerSETCC()
180*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_one(float %a, float %b) nounwind ssp {
181*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_one
182*9880d681SAndroid Build Coastguard Worker;	fcmp	s0, s1
183*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
184*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
185*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel [[TMP:s[0-9]+]], s[[ONE]], s[[ZERO]], mi
186*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], [[TMP]], gt
187*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %a, %b
188*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
189*9880d681SAndroid Build Coastguard Worker  ret float %conv
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; Possible opportunity for improvement.  See comment in
193*9880d681SAndroid Build Coastguard Worker; ARM64TargetLowering::LowerSETCC()
194*9880d681SAndroid Build Coastguard Workerdefine float @fcmp_ueq(float %a, float %b) nounwind ssp {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fcmp_ueq
196*9880d681SAndroid Build Coastguard Worker; CHECK: fcmp s0, s1
197*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: movi.2d v[[ZERO:[0-9]+]], #0
198*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov s[[ONE:[0-9]+]], #1.0
199*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel [[TMP:s[0-9]+]], s[[ONE]], s[[ZERO]], eq
200*9880d681SAndroid Build Coastguard Worker; CHECK: fcsel s0, s[[ONE]], [[TMP]], vs
201*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ueq float %a, %b
202*9880d681SAndroid Build Coastguard Worker  %conv = uitofp i1 %cmp to float
203*9880d681SAndroid Build Coastguard Worker  ret float %conv
204*9880d681SAndroid Build Coastguard Worker}
205