Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / select-fpcc-dbl.ll
blob8d26996b86fe030bea317dfd8552bd71dcd09661
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
5 ;; Test double-precision floating-point values selection after comparison
7 define double @fcmp_false(double %a, double %b, double %x, double %y) {
8 ; LA32-LABEL: fcmp_false:
9 ; LA32:       # %bb.0:
10 ; LA32-NEXT:    fmov.d $fa0, $fa3
11 ; LA32-NEXT:    ret
13 ; LA64-LABEL: fcmp_false:
14 ; LA64:       # %bb.0:
15 ; LA64-NEXT:    fmov.d $fa0, $fa3
16 ; LA64-NEXT:    ret
17   %cmp = fcmp false double %a, %b
18   %res = select i1 %cmp, double %x, double %y
19   ret double %res
22 define double @fcmp_oeq(double %a, double %b, double %x, double %y) {
23 ; LA32-LABEL: fcmp_oeq:
24 ; LA32:       # %bb.0:
25 ; LA32-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
26 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
27 ; LA32-NEXT:    ret
29 ; LA64-LABEL: fcmp_oeq:
30 ; LA64:       # %bb.0:
31 ; LA64-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
32 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
33 ; LA64-NEXT:    ret
34   %cmp = fcmp oeq double %a, %b
35   %res = select i1 %cmp, double %x, double %y
36   ret double %res
39 define double @fcmp_ogt(double %a, double %b, double %x, double %y) {
40 ; LA32-LABEL: fcmp_ogt:
41 ; LA32:       # %bb.0:
42 ; LA32-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
43 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
44 ; LA32-NEXT:    ret
46 ; LA64-LABEL: fcmp_ogt:
47 ; LA64:       # %bb.0:
48 ; LA64-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
49 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
50 ; LA64-NEXT:    ret
51   %cmp = fcmp ogt double %a, %b
52   %res = select i1 %cmp, double %x, double %y
53   ret double %res
56 define double @fcmp_oge(double %a, double %b, double %x, double %y) {
57 ; LA32-LABEL: fcmp_oge:
58 ; LA32:       # %bb.0:
59 ; LA32-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
60 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
61 ; LA32-NEXT:    ret
63 ; LA64-LABEL: fcmp_oge:
64 ; LA64:       # %bb.0:
65 ; LA64-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
66 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
67 ; LA64-NEXT:    ret
68   %cmp = fcmp oge double %a, %b
69   %res = select i1 %cmp, double %x, double %y
70   ret double %res
73 define double @fcmp_olt(double %a, double %b, double %x, double %y) {
74 ; LA32-LABEL: fcmp_olt:
75 ; LA32:       # %bb.0:
76 ; LA32-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
77 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
78 ; LA32-NEXT:    ret
80 ; LA64-LABEL: fcmp_olt:
81 ; LA64:       # %bb.0:
82 ; LA64-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
83 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
84 ; LA64-NEXT:    ret
85   %cmp = fcmp olt double %a, %b
86   %res = select i1 %cmp, double %x, double %y
87   ret double %res
90 define double @fcmp_ole(double %a, double %b, double %x, double %y) {
91 ; LA32-LABEL: fcmp_ole:
92 ; LA32:       # %bb.0:
93 ; LA32-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
94 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
95 ; LA32-NEXT:    ret
97 ; LA64-LABEL: fcmp_ole:
98 ; LA64:       # %bb.0:
99 ; LA64-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
100 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
101 ; LA64-NEXT:    ret
102   %cmp = fcmp ole double %a, %b
103   %res = select i1 %cmp, double %x, double %y
104   ret double %res
107 define double @fcmp_one(double %a, double %b, double %x, double %y) {
108 ; LA32-LABEL: fcmp_one:
109 ; LA32:       # %bb.0:
110 ; LA32-NEXT:    fcmp.cne.d $fcc0, $fa0, $fa1
111 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
112 ; LA32-NEXT:    ret
114 ; LA64-LABEL: fcmp_one:
115 ; LA64:       # %bb.0:
116 ; LA64-NEXT:    fcmp.cne.d $fcc0, $fa0, $fa1
117 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
118 ; LA64-NEXT:    ret
119   %cmp = fcmp one double %a, %b
120   %res = select i1 %cmp, double %x, double %y
121   ret double %res
124 define double @fcmp_ord(double %a, double %b, double %x, double %y) {
125 ; LA32-LABEL: fcmp_ord:
126 ; LA32:       # %bb.0:
127 ; LA32-NEXT:    fcmp.cor.d $fcc0, $fa0, $fa1
128 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
129 ; LA32-NEXT:    ret
131 ; LA64-LABEL: fcmp_ord:
132 ; LA64:       # %bb.0:
133 ; LA64-NEXT:    fcmp.cor.d $fcc0, $fa0, $fa1
134 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
135 ; LA64-NEXT:    ret
136   %cmp = fcmp ord double %a, %b
137   %res = select i1 %cmp, double %x, double %y
138   ret double %res
141 define double @fcmp_ueq(double %a, double %b, double %x, double %y) {
142 ; LA32-LABEL: fcmp_ueq:
143 ; LA32:       # %bb.0:
144 ; LA32-NEXT:    fcmp.cueq.d $fcc0, $fa0, $fa1
145 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
146 ; LA32-NEXT:    ret
148 ; LA64-LABEL: fcmp_ueq:
149 ; LA64:       # %bb.0:
150 ; LA64-NEXT:    fcmp.cueq.d $fcc0, $fa0, $fa1
151 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
152 ; LA64-NEXT:    ret
153   %cmp = fcmp ueq double %a, %b
154   %res = select i1 %cmp, double %x, double %y
155   ret double %res
158 define double @fcmp_ugt(double %a, double %b, double %x, double %y) {
159 ; LA32-LABEL: fcmp_ugt:
160 ; LA32:       # %bb.0:
161 ; LA32-NEXT:    fcmp.cult.d $fcc0, $fa1, $fa0
162 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
163 ; LA32-NEXT:    ret
165 ; LA64-LABEL: fcmp_ugt:
166 ; LA64:       # %bb.0:
167 ; LA64-NEXT:    fcmp.cult.d $fcc0, $fa1, $fa0
168 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
169 ; LA64-NEXT:    ret
170   %cmp = fcmp ugt double %a, %b
171   %res = select i1 %cmp, double %x, double %y
172   ret double %res
175 define double @fcmp_uge(double %a, double %b, double %x, double %y) {
176 ; LA32-LABEL: fcmp_uge:
177 ; LA32:       # %bb.0:
178 ; LA32-NEXT:    fcmp.cule.d $fcc0, $fa1, $fa0
179 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
180 ; LA32-NEXT:    ret
182 ; LA64-LABEL: fcmp_uge:
183 ; LA64:       # %bb.0:
184 ; LA64-NEXT:    fcmp.cule.d $fcc0, $fa1, $fa0
185 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
186 ; LA64-NEXT:    ret
187   %cmp = fcmp uge double %a, %b
188   %res = select i1 %cmp, double %x, double %y
189   ret double %res
192 define double @fcmp_ult(double %a, double %b, double %x, double %y) {
193 ; LA32-LABEL: fcmp_ult:
194 ; LA32:       # %bb.0:
195 ; LA32-NEXT:    fcmp.cult.d $fcc0, $fa0, $fa1
196 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
197 ; LA32-NEXT:    ret
199 ; LA64-LABEL: fcmp_ult:
200 ; LA64:       # %bb.0:
201 ; LA64-NEXT:    fcmp.cult.d $fcc0, $fa0, $fa1
202 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
203 ; LA64-NEXT:    ret
204   %cmp = fcmp ult double %a, %b
205   %res = select i1 %cmp, double %x, double %y
206   ret double %res
209 define double @fcmp_ule(double %a, double %b, double %x, double %y) {
210 ; LA32-LABEL: fcmp_ule:
211 ; LA32:       # %bb.0:
212 ; LA32-NEXT:    fcmp.cule.d $fcc0, $fa0, $fa1
213 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
214 ; LA32-NEXT:    ret
216 ; LA64-LABEL: fcmp_ule:
217 ; LA64:       # %bb.0:
218 ; LA64-NEXT:    fcmp.cule.d $fcc0, $fa0, $fa1
219 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
220 ; LA64-NEXT:    ret
221   %cmp = fcmp ule double %a, %b
222   %res = select i1 %cmp, double %x, double %y
223   ret double %res
226 define double @fcmp_une(double %a, double %b, double %x, double %y) {
227 ; LA32-LABEL: fcmp_une:
228 ; LA32:       # %bb.0:
229 ; LA32-NEXT:    fcmp.cune.d $fcc0, $fa0, $fa1
230 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
231 ; LA32-NEXT:    ret
233 ; LA64-LABEL: fcmp_une:
234 ; LA64:       # %bb.0:
235 ; LA64-NEXT:    fcmp.cune.d $fcc0, $fa0, $fa1
236 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
237 ; LA64-NEXT:    ret
238   %cmp = fcmp une double %a, %b
239   %res = select i1 %cmp, double %x, double %y
240   ret double %res
243 define double @fcmp_uno(double %a, double %b, double %x, double %y) {
244 ; LA32-LABEL: fcmp_uno:
245 ; LA32:       # %bb.0:
246 ; LA32-NEXT:    fcmp.cun.d $fcc0, $fa0, $fa1
247 ; LA32-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
248 ; LA32-NEXT:    ret
250 ; LA64-LABEL: fcmp_uno:
251 ; LA64:       # %bb.0:
252 ; LA64-NEXT:    fcmp.cun.d $fcc0, $fa0, $fa1
253 ; LA64-NEXT:    fsel $fa0, $fa3, $fa2, $fcc0
254 ; LA64-NEXT:    ret
255   %cmp = fcmp uno double %a, %b
256   %res = select i1 %cmp, double %x, double %y
257   ret double %res
260 define double @fcmp_true(double %a, double %b, double %x, double %y) {
261 ; LA32-LABEL: fcmp_true:
262 ; LA32:       # %bb.0:
263 ; LA32-NEXT:    fmov.d $fa0, $fa2
264 ; LA32-NEXT:    ret
266 ; LA64-LABEL: fcmp_true:
267 ; LA64:       # %bb.0:
268 ; LA64-NEXT:    fmov.d $fa0, $fa2
269 ; LA64-NEXT:    ret
270   %cmp = fcmp true double %a, %b
271   %res = select i1 %cmp, double %x, double %y
272   ret double %res