[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / float-fcmp.ll
blobc19013fce4b082f91332f6a26ce7885c7fd8b7e6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefix=RV32IF %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefix=RV64IF %s
7 define i32 @fcmp_false(float %a, float %b) nounwind {
8 ; RV32IF-LABEL: fcmp_false:
9 ; RV32IF:       # %bb.0:
10 ; RV32IF-NEXT:    mv a0, zero
11 ; RV32IF-NEXT:    ret
13 ; RV64IF-LABEL: fcmp_false:
14 ; RV64IF:       # %bb.0:
15 ; RV64IF-NEXT:    mv a0, zero
16 ; RV64IF-NEXT:    ret
17   %1 = fcmp false float %a, %b
18   %2 = zext i1 %1 to i32
19   ret i32 %2
22 define i32 @fcmp_oeq(float %a, float %b) nounwind {
23 ; RV32IF-LABEL: fcmp_oeq:
24 ; RV32IF:       # %bb.0:
25 ; RV32IF-NEXT:    fmv.w.x ft0, a1
26 ; RV32IF-NEXT:    fmv.w.x ft1, a0
27 ; RV32IF-NEXT:    feq.s a0, ft1, ft0
28 ; RV32IF-NEXT:    ret
30 ; RV64IF-LABEL: fcmp_oeq:
31 ; RV64IF:       # %bb.0:
32 ; RV64IF-NEXT:    fmv.w.x ft0, a1
33 ; RV64IF-NEXT:    fmv.w.x ft1, a0
34 ; RV64IF-NEXT:    feq.s a0, ft1, ft0
35 ; RV64IF-NEXT:    ret
36   %1 = fcmp oeq float %a, %b
37   %2 = zext i1 %1 to i32
38   ret i32 %2
41 define i32 @fcmp_ogt(float %a, float %b) nounwind {
42 ; RV32IF-LABEL: fcmp_ogt:
43 ; RV32IF:       # %bb.0:
44 ; RV32IF-NEXT:    fmv.w.x ft0, a0
45 ; RV32IF-NEXT:    fmv.w.x ft1, a1
46 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
47 ; RV32IF-NEXT:    ret
49 ; RV64IF-LABEL: fcmp_ogt:
50 ; RV64IF:       # %bb.0:
51 ; RV64IF-NEXT:    fmv.w.x ft0, a0
52 ; RV64IF-NEXT:    fmv.w.x ft1, a1
53 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
54 ; RV64IF-NEXT:    ret
55   %1 = fcmp ogt float %a, %b
56   %2 = zext i1 %1 to i32
57   ret i32 %2
60 define i32 @fcmp_oge(float %a, float %b) nounwind {
61 ; RV32IF-LABEL: fcmp_oge:
62 ; RV32IF:       # %bb.0:
63 ; RV32IF-NEXT:    fmv.w.x ft0, a0
64 ; RV32IF-NEXT:    fmv.w.x ft1, a1
65 ; RV32IF-NEXT:    fle.s a0, ft1, ft0
66 ; RV32IF-NEXT:    ret
68 ; RV64IF-LABEL: fcmp_oge:
69 ; RV64IF:       # %bb.0:
70 ; RV64IF-NEXT:    fmv.w.x ft0, a0
71 ; RV64IF-NEXT:    fmv.w.x ft1, a1
72 ; RV64IF-NEXT:    fle.s a0, ft1, ft0
73 ; RV64IF-NEXT:    ret
74   %1 = fcmp oge float %a, %b
75   %2 = zext i1 %1 to i32
76   ret i32 %2
79 define i32 @fcmp_olt(float %a, float %b) nounwind {
80 ; RV32IF-LABEL: fcmp_olt:
81 ; RV32IF:       # %bb.0:
82 ; RV32IF-NEXT:    fmv.w.x ft0, a1
83 ; RV32IF-NEXT:    fmv.w.x ft1, a0
84 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
85 ; RV32IF-NEXT:    ret
87 ; RV64IF-LABEL: fcmp_olt:
88 ; RV64IF:       # %bb.0:
89 ; RV64IF-NEXT:    fmv.w.x ft0, a1
90 ; RV64IF-NEXT:    fmv.w.x ft1, a0
91 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
92 ; RV64IF-NEXT:    ret
93   %1 = fcmp olt float %a, %b
94   %2 = zext i1 %1 to i32
95   ret i32 %2
98 define i32 @fcmp_ole(float %a, float %b) nounwind {
99 ; RV32IF-LABEL: fcmp_ole:
100 ; RV32IF:       # %bb.0:
101 ; RV32IF-NEXT:    fmv.w.x ft0, a1
102 ; RV32IF-NEXT:    fmv.w.x ft1, a0
103 ; RV32IF-NEXT:    fle.s a0, ft1, ft0
104 ; RV32IF-NEXT:    ret
106 ; RV64IF-LABEL: fcmp_ole:
107 ; RV64IF:       # %bb.0:
108 ; RV64IF-NEXT:    fmv.w.x ft0, a1
109 ; RV64IF-NEXT:    fmv.w.x ft1, a0
110 ; RV64IF-NEXT:    fle.s a0, ft1, ft0
111 ; RV64IF-NEXT:    ret
112   %1 = fcmp ole float %a, %b
113   %2 = zext i1 %1 to i32
114   ret i32 %2
117 define i32 @fcmp_one(float %a, float %b) nounwind {
118 ; RV32IF-LABEL: fcmp_one:
119 ; RV32IF:       # %bb.0:
120 ; RV32IF-NEXT:    fmv.w.x ft0, a1
121 ; RV32IF-NEXT:    fmv.w.x ft1, a0
122 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
123 ; RV32IF-NEXT:    flt.s a1, ft0, ft1
124 ; RV32IF-NEXT:    or a0, a1, a0
125 ; RV32IF-NEXT:    ret
127 ; RV64IF-LABEL: fcmp_one:
128 ; RV64IF:       # %bb.0:
129 ; RV64IF-NEXT:    fmv.w.x ft0, a1
130 ; RV64IF-NEXT:    fmv.w.x ft1, a0
131 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
132 ; RV64IF-NEXT:    flt.s a1, ft0, ft1
133 ; RV64IF-NEXT:    or a0, a1, a0
134 ; RV64IF-NEXT:    ret
135   %1 = fcmp one float %a, %b
136   %2 = zext i1 %1 to i32
137   ret i32 %2
140 define i32 @fcmp_ord(float %a, float %b) nounwind {
141 ; RV32IF-LABEL: fcmp_ord:
142 ; RV32IF:       # %bb.0:
143 ; RV32IF-NEXT:    fmv.w.x ft0, a0
144 ; RV32IF-NEXT:    fmv.w.x ft1, a1
145 ; RV32IF-NEXT:    feq.s a0, ft1, ft1
146 ; RV32IF-NEXT:    feq.s a1, ft0, ft0
147 ; RV32IF-NEXT:    and a0, a1, a0
148 ; RV32IF-NEXT:    ret
150 ; RV64IF-LABEL: fcmp_ord:
151 ; RV64IF:       # %bb.0:
152 ; RV64IF-NEXT:    fmv.w.x ft0, a0
153 ; RV64IF-NEXT:    fmv.w.x ft1, a1
154 ; RV64IF-NEXT:    feq.s a0, ft1, ft1
155 ; RV64IF-NEXT:    feq.s a1, ft0, ft0
156 ; RV64IF-NEXT:    and a0, a1, a0
157 ; RV64IF-NEXT:    ret
158   %1 = fcmp ord float %a, %b
159   %2 = zext i1 %1 to i32
160   ret i32 %2
163 define i32 @fcmp_ueq(float %a, float %b) nounwind {
164 ; RV32IF-LABEL: fcmp_ueq:
165 ; RV32IF:       # %bb.0:
166 ; RV32IF-NEXT:    fmv.w.x ft0, a1
167 ; RV32IF-NEXT:    fmv.w.x ft1, a0
168 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
169 ; RV32IF-NEXT:    flt.s a1, ft0, ft1
170 ; RV32IF-NEXT:    or a0, a1, a0
171 ; RV32IF-NEXT:    xori a0, a0, 1
172 ; RV32IF-NEXT:    ret
174 ; RV64IF-LABEL: fcmp_ueq:
175 ; RV64IF:       # %bb.0:
176 ; RV64IF-NEXT:    fmv.w.x ft0, a1
177 ; RV64IF-NEXT:    fmv.w.x ft1, a0
178 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
179 ; RV64IF-NEXT:    flt.s a1, ft0, ft1
180 ; RV64IF-NEXT:    or a0, a1, a0
181 ; RV64IF-NEXT:    xori a0, a0, 1
182 ; RV64IF-NEXT:    ret
183   %1 = fcmp ueq float %a, %b
184   %2 = zext i1 %1 to i32
185   ret i32 %2
188 define i32 @fcmp_ugt(float %a, float %b) nounwind {
189 ; RV32IF-LABEL: fcmp_ugt:
190 ; RV32IF:       # %bb.0:
191 ; RV32IF-NEXT:    fmv.w.x ft0, a1
192 ; RV32IF-NEXT:    fmv.w.x ft1, a0
193 ; RV32IF-NEXT:    fle.s a0, ft1, ft0
194 ; RV32IF-NEXT:    xori a0, a0, 1
195 ; RV32IF-NEXT:    ret
197 ; RV64IF-LABEL: fcmp_ugt:
198 ; RV64IF:       # %bb.0:
199 ; RV64IF-NEXT:    fmv.w.x ft0, a1
200 ; RV64IF-NEXT:    fmv.w.x ft1, a0
201 ; RV64IF-NEXT:    fle.s a0, ft1, ft0
202 ; RV64IF-NEXT:    xori a0, a0, 1
203 ; RV64IF-NEXT:    ret
204   %1 = fcmp ugt float %a, %b
205   %2 = zext i1 %1 to i32
206   ret i32 %2
209 define i32 @fcmp_uge(float %a, float %b) nounwind {
210 ; RV32IF-LABEL: fcmp_uge:
211 ; RV32IF:       # %bb.0:
212 ; RV32IF-NEXT:    fmv.w.x ft0, a1
213 ; RV32IF-NEXT:    fmv.w.x ft1, a0
214 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
215 ; RV32IF-NEXT:    xori a0, a0, 1
216 ; RV32IF-NEXT:    ret
218 ; RV64IF-LABEL: fcmp_uge:
219 ; RV64IF:       # %bb.0:
220 ; RV64IF-NEXT:    fmv.w.x ft0, a1
221 ; RV64IF-NEXT:    fmv.w.x ft1, a0
222 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
223 ; RV64IF-NEXT:    xori a0, a0, 1
224 ; RV64IF-NEXT:    ret
225   %1 = fcmp uge float %a, %b
226   %2 = zext i1 %1 to i32
227   ret i32 %2
230 define i32 @fcmp_ult(float %a, float %b) nounwind {
231 ; RV32IF-LABEL: fcmp_ult:
232 ; RV32IF:       # %bb.0:
233 ; RV32IF-NEXT:    fmv.w.x ft0, a0
234 ; RV32IF-NEXT:    fmv.w.x ft1, a1
235 ; RV32IF-NEXT:    fle.s a0, ft1, ft0
236 ; RV32IF-NEXT:    xori a0, a0, 1
237 ; RV32IF-NEXT:    ret
239 ; RV64IF-LABEL: fcmp_ult:
240 ; RV64IF:       # %bb.0:
241 ; RV64IF-NEXT:    fmv.w.x ft0, a0
242 ; RV64IF-NEXT:    fmv.w.x ft1, a1
243 ; RV64IF-NEXT:    fle.s a0, ft1, ft0
244 ; RV64IF-NEXT:    xori a0, a0, 1
245 ; RV64IF-NEXT:    ret
246   %1 = fcmp ult float %a, %b
247   %2 = zext i1 %1 to i32
248   ret i32 %2
251 define i32 @fcmp_ule(float %a, float %b) nounwind {
252 ; RV32IF-LABEL: fcmp_ule:
253 ; RV32IF:       # %bb.0:
254 ; RV32IF-NEXT:    fmv.w.x ft0, a0
255 ; RV32IF-NEXT:    fmv.w.x ft1, a1
256 ; RV32IF-NEXT:    flt.s a0, ft1, ft0
257 ; RV32IF-NEXT:    xori a0, a0, 1
258 ; RV32IF-NEXT:    ret
260 ; RV64IF-LABEL: fcmp_ule:
261 ; RV64IF:       # %bb.0:
262 ; RV64IF-NEXT:    fmv.w.x ft0, a0
263 ; RV64IF-NEXT:    fmv.w.x ft1, a1
264 ; RV64IF-NEXT:    flt.s a0, ft1, ft0
265 ; RV64IF-NEXT:    xori a0, a0, 1
266 ; RV64IF-NEXT:    ret
267   %1 = fcmp ule float %a, %b
268   %2 = zext i1 %1 to i32
269   ret i32 %2
272 define i32 @fcmp_une(float %a, float %b) nounwind {
273 ; RV32IF-LABEL: fcmp_une:
274 ; RV32IF:       # %bb.0:
275 ; RV32IF-NEXT:    fmv.w.x ft0, a1
276 ; RV32IF-NEXT:    fmv.w.x ft1, a0
277 ; RV32IF-NEXT:    feq.s a0, ft1, ft0
278 ; RV32IF-NEXT:    xori a0, a0, 1
279 ; RV32IF-NEXT:    ret
281 ; RV64IF-LABEL: fcmp_une:
282 ; RV64IF:       # %bb.0:
283 ; RV64IF-NEXT:    fmv.w.x ft0, a1
284 ; RV64IF-NEXT:    fmv.w.x ft1, a0
285 ; RV64IF-NEXT:    feq.s a0, ft1, ft0
286 ; RV64IF-NEXT:    xori a0, a0, 1
287 ; RV64IF-NEXT:    ret
288   %1 = fcmp une float %a, %b
289   %2 = zext i1 %1 to i32
290   ret i32 %2
293 define i32 @fcmp_uno(float %a, float %b) nounwind {
294 ; RV32IF-LABEL: fcmp_uno:
295 ; RV32IF:       # %bb.0:
296 ; RV32IF-NEXT:    fmv.w.x ft0, a0
297 ; RV32IF-NEXT:    fmv.w.x ft1, a1
298 ; RV32IF-NEXT:    feq.s a0, ft1, ft1
299 ; RV32IF-NEXT:    feq.s a1, ft0, ft0
300 ; RV32IF-NEXT:    and a0, a1, a0
301 ; RV32IF-NEXT:    xori a0, a0, 1
302 ; RV32IF-NEXT:    ret
304 ; RV64IF-LABEL: fcmp_uno:
305 ; RV64IF:       # %bb.0:
306 ; RV64IF-NEXT:    fmv.w.x ft0, a0
307 ; RV64IF-NEXT:    fmv.w.x ft1, a1
308 ; RV64IF-NEXT:    feq.s a0, ft1, ft1
309 ; RV64IF-NEXT:    feq.s a1, ft0, ft0
310 ; RV64IF-NEXT:    and a0, a1, a0
311 ; RV64IF-NEXT:    xori a0, a0, 1
312 ; RV64IF-NEXT:    ret
313   %1 = fcmp uno float %a, %b
314   %2 = zext i1 %1 to i32
315   ret i32 %2
318 define i32 @fcmp_true(float %a, float %b) nounwind {
319 ; RV32IF-LABEL: fcmp_true:
320 ; RV32IF:       # %bb.0:
321 ; RV32IF-NEXT:    addi a0, zero, 1
322 ; RV32IF-NEXT:    ret
324 ; RV64IF-LABEL: fcmp_true:
325 ; RV64IF:       # %bb.0:
326 ; RV64IF-NEXT:    addi a0, zero, 1
327 ; RV64IF-NEXT:    ret
328   %1 = fcmp true float %a, %b
329   %2 = zext i1 %1 to i32
330   ret i32 %2