Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / RISCV / double-select-fcmp.ll
blob926bb92a297757a2b4a44d8f79a3f70dc276fd84
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32d | FileCheck %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64d | FileCheck %s
7 define double @select_fcmp_false(double %a, double %b) nounwind {
8 ; CHECK-LABEL: select_fcmp_false:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    fmv.d fa0, fa1
11 ; CHECK-NEXT:    ret
12   %1 = fcmp false double %a, %b
13   %2 = select i1 %1, double %a, double %b
14   ret double %2
17 define double @select_fcmp_oeq(double %a, double %b) nounwind {
18 ; CHECK-LABEL: select_fcmp_oeq:
19 ; CHECK:       # %bb.0:
20 ; CHECK-NEXT:    feq.d a0, fa0, fa1
21 ; CHECK-NEXT:    bnez a0, .LBB1_2
22 ; CHECK-NEXT:  # %bb.1:
23 ; CHECK-NEXT:    fmv.d fa0, fa1
24 ; CHECK-NEXT:  .LBB1_2:
25 ; CHECK-NEXT:    ret
26   %1 = fcmp oeq double %a, %b
27   %2 = select i1 %1, double %a, double %b
28   ret double %2
31 define double @select_fcmp_ogt(double %a, double %b) nounwind {
32 ; CHECK-LABEL: select_fcmp_ogt:
33 ; CHECK:       # %bb.0:
34 ; CHECK-NEXT:    flt.d a0, fa1, fa0
35 ; CHECK-NEXT:    bnez a0, .LBB2_2
36 ; CHECK-NEXT:  # %bb.1:
37 ; CHECK-NEXT:    fmv.d fa0, fa1
38 ; CHECK-NEXT:  .LBB2_2:
39 ; CHECK-NEXT:    ret
40   %1 = fcmp ogt double %a, %b
41   %2 = select i1 %1, double %a, double %b
42   ret double %2
45 define double @select_fcmp_oge(double %a, double %b) nounwind {
46 ; CHECK-LABEL: select_fcmp_oge:
47 ; CHECK:       # %bb.0:
48 ; CHECK-NEXT:    fle.d a0, fa1, fa0
49 ; CHECK-NEXT:    bnez a0, .LBB3_2
50 ; CHECK-NEXT:  # %bb.1:
51 ; CHECK-NEXT:    fmv.d fa0, fa1
52 ; CHECK-NEXT:  .LBB3_2:
53 ; CHECK-NEXT:    ret
54   %1 = fcmp oge double %a, %b
55   %2 = select i1 %1, double %a, double %b
56   ret double %2
59 define double @select_fcmp_olt(double %a, double %b) nounwind {
60 ; CHECK-LABEL: select_fcmp_olt:
61 ; CHECK:       # %bb.0:
62 ; CHECK-NEXT:    flt.d a0, fa0, fa1
63 ; CHECK-NEXT:    bnez a0, .LBB4_2
64 ; CHECK-NEXT:  # %bb.1:
65 ; CHECK-NEXT:    fmv.d fa0, fa1
66 ; CHECK-NEXT:  .LBB4_2:
67 ; CHECK-NEXT:    ret
68   %1 = fcmp olt double %a, %b
69   %2 = select i1 %1, double %a, double %b
70   ret double %2
73 define double @select_fcmp_ole(double %a, double %b) nounwind {
74 ; CHECK-LABEL: select_fcmp_ole:
75 ; CHECK:       # %bb.0:
76 ; CHECK-NEXT:    fle.d a0, fa0, fa1
77 ; CHECK-NEXT:    bnez a0, .LBB5_2
78 ; CHECK-NEXT:  # %bb.1:
79 ; CHECK-NEXT:    fmv.d fa0, fa1
80 ; CHECK-NEXT:  .LBB5_2:
81 ; CHECK-NEXT:    ret
82   %1 = fcmp ole double %a, %b
83   %2 = select i1 %1, double %a, double %b
84   ret double %2
87 define double @select_fcmp_one(double %a, double %b) nounwind {
88 ; CHECK-LABEL: select_fcmp_one:
89 ; CHECK:       # %bb.0:
90 ; CHECK-NEXT:    flt.d a0, fa0, fa1
91 ; CHECK-NEXT:    flt.d a1, fa1, fa0
92 ; CHECK-NEXT:    or a0, a1, a0
93 ; CHECK-NEXT:    bnez a0, .LBB6_2
94 ; CHECK-NEXT:  # %bb.1:
95 ; CHECK-NEXT:    fmv.d fa0, fa1
96 ; CHECK-NEXT:  .LBB6_2:
97 ; CHECK-NEXT:    ret
98   %1 = fcmp one double %a, %b
99   %2 = select i1 %1, double %a, double %b
100   ret double %2
103 define double @select_fcmp_ord(double %a, double %b) nounwind {
104 ; CHECK-LABEL: select_fcmp_ord:
105 ; CHECK:       # %bb.0:
106 ; CHECK-NEXT:    feq.d a0, fa1, fa1
107 ; CHECK-NEXT:    feq.d a1, fa0, fa0
108 ; CHECK-NEXT:    and a0, a1, a0
109 ; CHECK-NEXT:    bnez a0, .LBB7_2
110 ; CHECK-NEXT:  # %bb.1:
111 ; CHECK-NEXT:    fmv.d fa0, fa1
112 ; CHECK-NEXT:  .LBB7_2:
113 ; CHECK-NEXT:    ret
114   %1 = fcmp ord double %a, %b
115   %2 = select i1 %1, double %a, double %b
116   ret double %2
119 define double @select_fcmp_ueq(double %a, double %b) nounwind {
120 ; CHECK-LABEL: select_fcmp_ueq:
121 ; CHECK:       # %bb.0:
122 ; CHECK-NEXT:    flt.d a0, fa0, fa1
123 ; CHECK-NEXT:    flt.d a1, fa1, fa0
124 ; CHECK-NEXT:    or a0, a1, a0
125 ; CHECK-NEXT:    beqz a0, .LBB8_2
126 ; CHECK-NEXT:  # %bb.1:
127 ; CHECK-NEXT:    fmv.d fa0, fa1
128 ; CHECK-NEXT:  .LBB8_2:
129 ; CHECK-NEXT:    ret
130   %1 = fcmp ueq double %a, %b
131   %2 = select i1 %1, double %a, double %b
132   ret double %2
135 define double @select_fcmp_ugt(double %a, double %b) nounwind {
136 ; CHECK-LABEL: select_fcmp_ugt:
137 ; CHECK:       # %bb.0:
138 ; CHECK-NEXT:    fle.d a0, fa0, fa1
139 ; CHECK-NEXT:    beqz a0, .LBB9_2
140 ; CHECK-NEXT:  # %bb.1:
141 ; CHECK-NEXT:    fmv.d fa0, fa1
142 ; CHECK-NEXT:  .LBB9_2:
143 ; CHECK-NEXT:    ret
144   %1 = fcmp ugt double %a, %b
145   %2 = select i1 %1, double %a, double %b
146   ret double %2
149 define double @select_fcmp_uge(double %a, double %b) nounwind {
150 ; CHECK-LABEL: select_fcmp_uge:
151 ; CHECK:       # %bb.0:
152 ; CHECK-NEXT:    flt.d a0, fa0, fa1
153 ; CHECK-NEXT:    beqz a0, .LBB10_2
154 ; CHECK-NEXT:  # %bb.1:
155 ; CHECK-NEXT:    fmv.d fa0, fa1
156 ; CHECK-NEXT:  .LBB10_2:
157 ; CHECK-NEXT:    ret
158   %1 = fcmp uge double %a, %b
159   %2 = select i1 %1, double %a, double %b
160   ret double %2
163 define double @select_fcmp_ult(double %a, double %b) nounwind {
164 ; CHECK-LABEL: select_fcmp_ult:
165 ; CHECK:       # %bb.0:
166 ; CHECK-NEXT:    fle.d a0, fa1, fa0
167 ; CHECK-NEXT:    beqz a0, .LBB11_2
168 ; CHECK-NEXT:  # %bb.1:
169 ; CHECK-NEXT:    fmv.d fa0, fa1
170 ; CHECK-NEXT:  .LBB11_2:
171 ; CHECK-NEXT:    ret
172   %1 = fcmp ult double %a, %b
173   %2 = select i1 %1, double %a, double %b
174   ret double %2
177 define double @select_fcmp_ule(double %a, double %b) nounwind {
178 ; CHECK-LABEL: select_fcmp_ule:
179 ; CHECK:       # %bb.0:
180 ; CHECK-NEXT:    flt.d a0, fa1, fa0
181 ; CHECK-NEXT:    beqz a0, .LBB12_2
182 ; CHECK-NEXT:  # %bb.1:
183 ; CHECK-NEXT:    fmv.d fa0, fa1
184 ; CHECK-NEXT:  .LBB12_2:
185 ; CHECK-NEXT:    ret
186   %1 = fcmp ule double %a, %b
187   %2 = select i1 %1, double %a, double %b
188   ret double %2
191 define double @select_fcmp_une(double %a, double %b) nounwind {
192 ; CHECK-LABEL: select_fcmp_une:
193 ; CHECK:       # %bb.0:
194 ; CHECK-NEXT:    feq.d a0, fa0, fa1
195 ; CHECK-NEXT:    beqz a0, .LBB13_2
196 ; CHECK-NEXT:  # %bb.1:
197 ; CHECK-NEXT:    fmv.d fa0, fa1
198 ; CHECK-NEXT:  .LBB13_2:
199 ; CHECK-NEXT:    ret
200   %1 = fcmp une double %a, %b
201   %2 = select i1 %1, double %a, double %b
202   ret double %2
205 define double @select_fcmp_uno(double %a, double %b) nounwind {
206 ; CHECK-LABEL: select_fcmp_uno:
207 ; CHECK:       # %bb.0:
208 ; CHECK-NEXT:    feq.d a0, fa1, fa1
209 ; CHECK-NEXT:    feq.d a1, fa0, fa0
210 ; CHECK-NEXT:    and a0, a1, a0
211 ; CHECK-NEXT:    beqz a0, .LBB14_2
212 ; CHECK-NEXT:  # %bb.1:
213 ; CHECK-NEXT:    fmv.d fa0, fa1
214 ; CHECK-NEXT:  .LBB14_2:
215 ; CHECK-NEXT:    ret
216   %1 = fcmp uno double %a, %b
217   %2 = select i1 %1, double %a, double %b
218   ret double %2
221 define double @select_fcmp_true(double %a, double %b) nounwind {
222 ; CHECK-LABEL: select_fcmp_true:
223 ; CHECK:       # %bb.0:
224 ; CHECK-NEXT:    ret
225   %1 = fcmp true double %a, %b
226   %2 = select i1 %1, double %a, double %b
227   ret double %2
230 ; Ensure that ISel succeeds for a select+fcmp that has an i32 result type.
231 define i32 @i32_select_fcmp_oeq(double %a, double %b, i32 %c, i32 %d) nounwind {
232 ; CHECK-LABEL: i32_select_fcmp_oeq:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    feq.d a2, fa0, fa1
235 ; CHECK-NEXT:    bnez a2, .LBB16_2
236 ; CHECK-NEXT:  # %bb.1:
237 ; CHECK-NEXT:    mv a0, a1
238 ; CHECK-NEXT:  .LBB16_2:
239 ; CHECK-NEXT:    ret
240   %1 = fcmp oeq double %a, %b
241   %2 = select i1 %1, i32 %c, i32 %d
242   ret i32 %2