[MLIR] Prevent invalid IR from being passed outside of RemoveDeadValues (#121079)
[llvm-project.git] / llvm / test / CodeGen / RISCV / GlobalISel / float-fcmp.ll
blob475b67bda9ae93154657ba0703f755c7adc3b0fb
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -global-isel -mattr=+f -verify-machineinstrs < %s \
3 ; RUN:   -target-abi=ilp32f | FileCheck -check-prefix=CHECKIF %s
4 ; RUN: llc -mtriple=riscv64 -global-isel -mattr=+f -verify-machineinstrs < %s \
5 ; RUN:   -target-abi=lp64f | FileCheck -check-prefix=CHECKIF %s
6 ; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \
7 ; RUN:   | FileCheck -check-prefix=RV32I %s
8 ; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \
9 ; RUN:   | FileCheck -check-prefix=RV64I %s
11 define i32 @fcmp_false(float %a, float %b) nounwind {
12 ; CHECKIF-LABEL: fcmp_false:
13 ; CHECKIF:       # %bb.0:
14 ; CHECKIF-NEXT:    li a0, 0
15 ; CHECKIF-NEXT:    ret
17 ; RV32I-LABEL: fcmp_false:
18 ; RV32I:       # %bb.0:
19 ; RV32I-NEXT:    li a0, 0
20 ; RV32I-NEXT:    ret
22 ; RV64I-LABEL: fcmp_false:
23 ; RV64I:       # %bb.0:
24 ; RV64I-NEXT:    li a0, 0
25 ; RV64I-NEXT:    ret
26   %1 = fcmp false float %a, %b
27   %2 = zext i1 %1 to i32
28   ret i32 %2
31 ; FIXME: slli+srli on RV64 are unnecessary
32 define i32 @fcmp_oeq(float %a, float %b) nounwind {
33 ; CHECKIF-LABEL: fcmp_oeq:
34 ; CHECKIF:       # %bb.0:
35 ; CHECKIF-NEXT:    feq.s a0, fa0, fa1
36 ; CHECKIF-NEXT:    ret
38 ; RV32I-LABEL: fcmp_oeq:
39 ; RV32I:       # %bb.0:
40 ; RV32I-NEXT:    addi sp, sp, -16
41 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
42 ; RV32I-NEXT:    call __eqsf2
43 ; RV32I-NEXT:    seqz a0, a0
44 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
45 ; RV32I-NEXT:    addi sp, sp, 16
46 ; RV32I-NEXT:    ret
48 ; RV64I-LABEL: fcmp_oeq:
49 ; RV64I:       # %bb.0:
50 ; RV64I-NEXT:    addi sp, sp, -16
51 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
52 ; RV64I-NEXT:    call __eqsf2
53 ; RV64I-NEXT:    sext.w a0, a0
54 ; RV64I-NEXT:    seqz a0, a0
55 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
56 ; RV64I-NEXT:    addi sp, sp, 16
57 ; RV64I-NEXT:    ret
58   %1 = fcmp oeq float %a, %b
59   %2 = zext i1 %1 to i32
60   ret i32 %2
63 ; FIXME: sext.w on RV64 is unnecessary
64 define i32 @fcmp_ogt(float %a, float %b) nounwind {
65 ; CHECKIF-LABEL: fcmp_ogt:
66 ; CHECKIF:       # %bb.0:
67 ; CHECKIF-NEXT:    flt.s a0, fa1, fa0
68 ; CHECKIF-NEXT:    ret
70 ; RV32I-LABEL: fcmp_ogt:
71 ; RV32I:       # %bb.0:
72 ; RV32I-NEXT:    addi sp, sp, -16
73 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
74 ; RV32I-NEXT:    call __gtsf2
75 ; RV32I-NEXT:    sgtz a0, a0
76 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
77 ; RV32I-NEXT:    addi sp, sp, 16
78 ; RV32I-NEXT:    ret
80 ; RV64I-LABEL: fcmp_ogt:
81 ; RV64I:       # %bb.0:
82 ; RV64I-NEXT:    addi sp, sp, -16
83 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
84 ; RV64I-NEXT:    call __gtsf2
85 ; RV64I-NEXT:    sext.w a0, a0
86 ; RV64I-NEXT:    sgtz a0, a0
87 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
88 ; RV64I-NEXT:    addi sp, sp, 16
89 ; RV64I-NEXT:    ret
90   %1 = fcmp ogt float %a, %b
91   %2 = zext i1 %1 to i32
92   ret i32 %2
95 ; FIXME: sext.w on RV64 is unnecessary
96 define i32 @fcmp_oge(float %a, float %b) nounwind {
97 ; CHECKIF-LABEL: fcmp_oge:
98 ; CHECKIF:       # %bb.0:
99 ; CHECKIF-NEXT:    fle.s a0, fa1, fa0
100 ; CHECKIF-NEXT:    ret
102 ; RV32I-LABEL: fcmp_oge:
103 ; RV32I:       # %bb.0:
104 ; RV32I-NEXT:    addi sp, sp, -16
105 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
106 ; RV32I-NEXT:    call __gesf2
107 ; RV32I-NEXT:    slti a0, a0, 0
108 ; RV32I-NEXT:    xori a0, a0, 1
109 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
110 ; RV32I-NEXT:    addi sp, sp, 16
111 ; RV32I-NEXT:    ret
113 ; RV64I-LABEL: fcmp_oge:
114 ; RV64I:       # %bb.0:
115 ; RV64I-NEXT:    addi sp, sp, -16
116 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
117 ; RV64I-NEXT:    call __gesf2
118 ; RV64I-NEXT:    sext.w a0, a0
119 ; RV64I-NEXT:    slti a0, a0, 0
120 ; RV64I-NEXT:    xori a0, a0, 1
121 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
122 ; RV64I-NEXT:    addi sp, sp, 16
123 ; RV64I-NEXT:    ret
124   %1 = fcmp oge float %a, %b
125   %2 = zext i1 %1 to i32
126   ret i32 %2
129 ; FIXME: sext.w on RV64 is unnecessary
130 define i32 @fcmp_olt(float %a, float %b) nounwind {
131 ; CHECKIF-LABEL: fcmp_olt:
132 ; CHECKIF:       # %bb.0:
133 ; CHECKIF-NEXT:    flt.s a0, fa0, fa1
134 ; CHECKIF-NEXT:    ret
136 ; RV32I-LABEL: fcmp_olt:
137 ; RV32I:       # %bb.0:
138 ; RV32I-NEXT:    addi sp, sp, -16
139 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
140 ; RV32I-NEXT:    call __ltsf2
141 ; RV32I-NEXT:    slti a0, a0, 0
142 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
143 ; RV32I-NEXT:    addi sp, sp, 16
144 ; RV32I-NEXT:    ret
146 ; RV64I-LABEL: fcmp_olt:
147 ; RV64I:       # %bb.0:
148 ; RV64I-NEXT:    addi sp, sp, -16
149 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
150 ; RV64I-NEXT:    call __ltsf2
151 ; RV64I-NEXT:    sext.w a0, a0
152 ; RV64I-NEXT:    slti a0, a0, 0
153 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
154 ; RV64I-NEXT:    addi sp, sp, 16
155 ; RV64I-NEXT:    ret
156   %1 = fcmp olt float %a, %b
157   %2 = zext i1 %1 to i32
158   ret i32 %2
161 ; FIXME: sext.w on RV64 is unnecessary
162 ; FIXME: sgtz+xori can be slti a0, a0, 1
163 define i32 @fcmp_ole(float %a, float %b) nounwind {
164 ; CHECKIF-LABEL: fcmp_ole:
165 ; CHECKIF:       # %bb.0:
166 ; CHECKIF-NEXT:    fle.s a0, fa0, fa1
167 ; CHECKIF-NEXT:    ret
169 ; RV32I-LABEL: fcmp_ole:
170 ; RV32I:       # %bb.0:
171 ; RV32I-NEXT:    addi sp, sp, -16
172 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
173 ; RV32I-NEXT:    call __lesf2
174 ; RV32I-NEXT:    sgtz a0, a0
175 ; RV32I-NEXT:    xori a0, a0, 1
176 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
177 ; RV32I-NEXT:    addi sp, sp, 16
178 ; RV32I-NEXT:    ret
180 ; RV64I-LABEL: fcmp_ole:
181 ; RV64I:       # %bb.0:
182 ; RV64I-NEXT:    addi sp, sp, -16
183 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
184 ; RV64I-NEXT:    call __lesf2
185 ; RV64I-NEXT:    sext.w a0, a0
186 ; RV64I-NEXT:    sgtz a0, a0
187 ; RV64I-NEXT:    xori a0, a0, 1
188 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
189 ; RV64I-NEXT:    addi sp, sp, 16
190 ; RV64I-NEXT:    ret
191   %1 = fcmp ole float %a, %b
192   %2 = zext i1 %1 to i32
193   ret i32 %2
196 ; FIXME: slli+srli on RV64 are unnecessary
197 define i32 @fcmp_one(float %a, float %b) nounwind {
198 ; CHECKIF-LABEL: fcmp_one:
199 ; CHECKIF:       # %bb.0:
200 ; CHECKIF-NEXT:    flt.s a0, fa0, fa1
201 ; CHECKIF-NEXT:    flt.s a1, fa1, fa0
202 ; CHECKIF-NEXT:    or a0, a0, a1
203 ; CHECKIF-NEXT:    ret
205 ; RV32I-LABEL: fcmp_one:
206 ; RV32I:       # %bb.0:
207 ; RV32I-NEXT:    addi sp, sp, -16
208 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
209 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
210 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
211 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
212 ; RV32I-NEXT:    mv s0, a0
213 ; RV32I-NEXT:    mv s1, a1
214 ; RV32I-NEXT:    call __eqsf2
215 ; RV32I-NEXT:    snez s2, a0
216 ; RV32I-NEXT:    mv a0, s0
217 ; RV32I-NEXT:    mv a1, s1
218 ; RV32I-NEXT:    call __unordsf2
219 ; RV32I-NEXT:    seqz a0, a0
220 ; RV32I-NEXT:    and a0, s2, a0
221 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
222 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
223 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
224 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
225 ; RV32I-NEXT:    addi sp, sp, 16
226 ; RV32I-NEXT:    ret
228 ; RV64I-LABEL: fcmp_one:
229 ; RV64I:       # %bb.0:
230 ; RV64I-NEXT:    addi sp, sp, -32
231 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
232 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
233 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
234 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
235 ; RV64I-NEXT:    mv s0, a0
236 ; RV64I-NEXT:    mv s1, a1
237 ; RV64I-NEXT:    call __eqsf2
238 ; RV64I-NEXT:    sext.w a0, a0
239 ; RV64I-NEXT:    snez s2, a0
240 ; RV64I-NEXT:    mv a0, s0
241 ; RV64I-NEXT:    mv a1, s1
242 ; RV64I-NEXT:    call __unordsf2
243 ; RV64I-NEXT:    sext.w a0, a0
244 ; RV64I-NEXT:    seqz a0, a0
245 ; RV64I-NEXT:    and a0, s2, a0
246 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
247 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
248 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
249 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
250 ; RV64I-NEXT:    addi sp, sp, 32
251 ; RV64I-NEXT:    ret
252   %1 = fcmp one float %a, %b
253   %2 = zext i1 %1 to i32
254   ret i32 %2
257 ; FIXME: slli+srli on RV64 are unnecessary
258 define i32 @fcmp_ord(float %a, float %b) nounwind {
259 ; CHECKIF-LABEL: fcmp_ord:
260 ; CHECKIF:       # %bb.0:
261 ; CHECKIF-NEXT:    feq.s a0, fa0, fa0
262 ; CHECKIF-NEXT:    feq.s a1, fa1, fa1
263 ; CHECKIF-NEXT:    and a0, a0, a1
264 ; CHECKIF-NEXT:    ret
266 ; RV32I-LABEL: fcmp_ord:
267 ; RV32I:       # %bb.0:
268 ; RV32I-NEXT:    addi sp, sp, -16
269 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
270 ; RV32I-NEXT:    call __unordsf2
271 ; RV32I-NEXT:    seqz a0, a0
272 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
273 ; RV32I-NEXT:    addi sp, sp, 16
274 ; RV32I-NEXT:    ret
276 ; RV64I-LABEL: fcmp_ord:
277 ; RV64I:       # %bb.0:
278 ; RV64I-NEXT:    addi sp, sp, -16
279 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
280 ; RV64I-NEXT:    call __unordsf2
281 ; RV64I-NEXT:    sext.w a0, a0
282 ; RV64I-NEXT:    seqz a0, a0
283 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
284 ; RV64I-NEXT:    addi sp, sp, 16
285 ; RV64I-NEXT:    ret
286   %1 = fcmp ord float %a, %b
287   %2 = zext i1 %1 to i32
288   ret i32 %2
291 ; FIXME: slli+srli on RV64 are unnecessary
292 define i32 @fcmp_ueq(float %a, float %b) nounwind {
293 ; CHECKIF-LABEL: fcmp_ueq:
294 ; CHECKIF:       # %bb.0:
295 ; CHECKIF-NEXT:    flt.s a0, fa0, fa1
296 ; CHECKIF-NEXT:    flt.s a1, fa1, fa0
297 ; CHECKIF-NEXT:    or a0, a0, a1
298 ; CHECKIF-NEXT:    xori a0, a0, 1
299 ; CHECKIF-NEXT:    ret
301 ; RV32I-LABEL: fcmp_ueq:
302 ; RV32I:       # %bb.0:
303 ; RV32I-NEXT:    addi sp, sp, -16
304 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
305 ; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
306 ; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
307 ; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
308 ; RV32I-NEXT:    mv s0, a0
309 ; RV32I-NEXT:    mv s1, a1
310 ; RV32I-NEXT:    call __eqsf2
311 ; RV32I-NEXT:    seqz s2, a0
312 ; RV32I-NEXT:    mv a0, s0
313 ; RV32I-NEXT:    mv a1, s1
314 ; RV32I-NEXT:    call __unordsf2
315 ; RV32I-NEXT:    snez a0, a0
316 ; RV32I-NEXT:    or a0, s2, a0
317 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
318 ; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
319 ; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
320 ; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
321 ; RV32I-NEXT:    addi sp, sp, 16
322 ; RV32I-NEXT:    ret
324 ; RV64I-LABEL: fcmp_ueq:
325 ; RV64I:       # %bb.0:
326 ; RV64I-NEXT:    addi sp, sp, -32
327 ; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
328 ; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
329 ; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
330 ; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
331 ; RV64I-NEXT:    mv s0, a0
332 ; RV64I-NEXT:    mv s1, a1
333 ; RV64I-NEXT:    call __eqsf2
334 ; RV64I-NEXT:    sext.w a0, a0
335 ; RV64I-NEXT:    seqz s2, a0
336 ; RV64I-NEXT:    mv a0, s0
337 ; RV64I-NEXT:    mv a1, s1
338 ; RV64I-NEXT:    call __unordsf2
339 ; RV64I-NEXT:    sext.w a0, a0
340 ; RV64I-NEXT:    snez a0, a0
341 ; RV64I-NEXT:    or a0, s2, a0
342 ; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
343 ; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
344 ; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
345 ; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
346 ; RV64I-NEXT:    addi sp, sp, 32
347 ; RV64I-NEXT:    ret
348   %1 = fcmp ueq float %a, %b
349   %2 = zext i1 %1 to i32
350   ret i32 %2
353 ; FIXME: sext.w on RV64 is unnecessary
354 define i32 @fcmp_ugt(float %a, float %b) nounwind {
355 ; CHECKIF-LABEL: fcmp_ugt:
356 ; CHECKIF:       # %bb.0:
357 ; CHECKIF-NEXT:    fle.s a0, fa0, fa1
358 ; CHECKIF-NEXT:    xori a0, a0, 1
359 ; CHECKIF-NEXT:    ret
361 ; RV32I-LABEL: fcmp_ugt:
362 ; RV32I:       # %bb.0:
363 ; RV32I-NEXT:    addi sp, sp, -16
364 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
365 ; RV32I-NEXT:    call __lesf2
366 ; RV32I-NEXT:    sgtz a0, a0
367 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
368 ; RV32I-NEXT:    addi sp, sp, 16
369 ; RV32I-NEXT:    ret
371 ; RV64I-LABEL: fcmp_ugt:
372 ; RV64I:       # %bb.0:
373 ; RV64I-NEXT:    addi sp, sp, -16
374 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
375 ; RV64I-NEXT:    call __lesf2
376 ; RV64I-NEXT:    sext.w a0, a0
377 ; RV64I-NEXT:    sgtz a0, a0
378 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
379 ; RV64I-NEXT:    addi sp, sp, 16
380 ; RV64I-NEXT:    ret
381   %1 = fcmp ugt float %a, %b
382   %2 = zext i1 %1 to i32
383   ret i32 %2
386 ; FIXME: sext.w on RV64 is unnecessary
387 define i32 @fcmp_uge(float %a, float %b) nounwind {
388 ; CHECKIF-LABEL: fcmp_uge:
389 ; CHECKIF:       # %bb.0:
390 ; CHECKIF-NEXT:    flt.s a0, fa0, fa1
391 ; CHECKIF-NEXT:    xori a0, a0, 1
392 ; CHECKIF-NEXT:    ret
394 ; RV32I-LABEL: fcmp_uge:
395 ; RV32I:       # %bb.0:
396 ; RV32I-NEXT:    addi sp, sp, -16
397 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
398 ; RV32I-NEXT:    call __ltsf2
399 ; RV32I-NEXT:    slti a0, a0, 0
400 ; RV32I-NEXT:    xori a0, a0, 1
401 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
402 ; RV32I-NEXT:    addi sp, sp, 16
403 ; RV32I-NEXT:    ret
405 ; RV64I-LABEL: fcmp_uge:
406 ; RV64I:       # %bb.0:
407 ; RV64I-NEXT:    addi sp, sp, -16
408 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
409 ; RV64I-NEXT:    call __ltsf2
410 ; RV64I-NEXT:    sext.w a0, a0
411 ; RV64I-NEXT:    slti a0, a0, 0
412 ; RV64I-NEXT:    xori a0, a0, 1
413 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
414 ; RV64I-NEXT:    addi sp, sp, 16
415 ; RV64I-NEXT:    ret
416   %1 = fcmp uge float %a, %b
417   %2 = zext i1 %1 to i32
418   ret i32 %2
421 ; FIXME: sext.w on RV64 is unnecessary
422 define i32 @fcmp_ult(float %a, float %b) nounwind {
423 ; CHECKIF-LABEL: fcmp_ult:
424 ; CHECKIF:       # %bb.0:
425 ; CHECKIF-NEXT:    fle.s a0, fa1, fa0
426 ; CHECKIF-NEXT:    xori a0, a0, 1
427 ; CHECKIF-NEXT:    ret
429 ; RV32I-LABEL: fcmp_ult:
430 ; RV32I:       # %bb.0:
431 ; RV32I-NEXT:    addi sp, sp, -16
432 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
433 ; RV32I-NEXT:    call __gesf2
434 ; RV32I-NEXT:    slti a0, a0, 0
435 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
436 ; RV32I-NEXT:    addi sp, sp, 16
437 ; RV32I-NEXT:    ret
439 ; RV64I-LABEL: fcmp_ult:
440 ; RV64I:       # %bb.0:
441 ; RV64I-NEXT:    addi sp, sp, -16
442 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
443 ; RV64I-NEXT:    call __gesf2
444 ; RV64I-NEXT:    sext.w a0, a0
445 ; RV64I-NEXT:    slti a0, a0, 0
446 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
447 ; RV64I-NEXT:    addi sp, sp, 16
448 ; RV64I-NEXT:    ret
449   %1 = fcmp ult float %a, %b
450   %2 = zext i1 %1 to i32
451   ret i32 %2
454 ; FIXME: sext.w on RV64 is unnecessary
455 ; FIXME: sgtz+xori can be slti a0, a0, 1
456 define i32 @fcmp_ule(float %a, float %b) nounwind {
457 ; CHECKIF-LABEL: fcmp_ule:
458 ; CHECKIF:       # %bb.0:
459 ; CHECKIF-NEXT:    flt.s a0, fa1, fa0
460 ; CHECKIF-NEXT:    xori a0, a0, 1
461 ; CHECKIF-NEXT:    ret
463 ; RV32I-LABEL: fcmp_ule:
464 ; RV32I:       # %bb.0:
465 ; RV32I-NEXT:    addi sp, sp, -16
466 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
467 ; RV32I-NEXT:    call __gtsf2
468 ; RV32I-NEXT:    sgtz a0, a0
469 ; RV32I-NEXT:    xori a0, a0, 1
470 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
471 ; RV32I-NEXT:    addi sp, sp, 16
472 ; RV32I-NEXT:    ret
474 ; RV64I-LABEL: fcmp_ule:
475 ; RV64I:       # %bb.0:
476 ; RV64I-NEXT:    addi sp, sp, -16
477 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
478 ; RV64I-NEXT:    call __gtsf2
479 ; RV64I-NEXT:    sext.w a0, a0
480 ; RV64I-NEXT:    sgtz a0, a0
481 ; RV64I-NEXT:    xori a0, a0, 1
482 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
483 ; RV64I-NEXT:    addi sp, sp, 16
484 ; RV64I-NEXT:    ret
485   %1 = fcmp ule float %a, %b
486   %2 = zext i1 %1 to i32
487   ret i32 %2
490 ; FIXME: slli+srli on RV64 are unnecessary
491 define i32 @fcmp_une(float %a, float %b) nounwind {
492 ; CHECKIF-LABEL: fcmp_une:
493 ; CHECKIF:       # %bb.0:
494 ; CHECKIF-NEXT:    feq.s a0, fa0, fa1
495 ; CHECKIF-NEXT:    xori a0, a0, 1
496 ; CHECKIF-NEXT:    ret
498 ; RV32I-LABEL: fcmp_une:
499 ; RV32I:       # %bb.0:
500 ; RV32I-NEXT:    addi sp, sp, -16
501 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
502 ; RV32I-NEXT:    call __nesf2
503 ; RV32I-NEXT:    snez a0, a0
504 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
505 ; RV32I-NEXT:    addi sp, sp, 16
506 ; RV32I-NEXT:    ret
508 ; RV64I-LABEL: fcmp_une:
509 ; RV64I:       # %bb.0:
510 ; RV64I-NEXT:    addi sp, sp, -16
511 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
512 ; RV64I-NEXT:    call __nesf2
513 ; RV64I-NEXT:    sext.w a0, a0
514 ; RV64I-NEXT:    snez a0, a0
515 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
516 ; RV64I-NEXT:    addi sp, sp, 16
517 ; RV64I-NEXT:    ret
518   %1 = fcmp une float %a, %b
519   %2 = zext i1 %1 to i32
520   ret i32 %2
523 ; FIXME: slli+srli on RV64 are unnecessary
524 define i32 @fcmp_uno(float %a, float %b) nounwind {
525 ; CHECKIF-LABEL: fcmp_uno:
526 ; CHECKIF:       # %bb.0:
527 ; CHECKIF-NEXT:    feq.s a0, fa0, fa0
528 ; CHECKIF-NEXT:    feq.s a1, fa1, fa1
529 ; CHECKIF-NEXT:    and a0, a0, a1
530 ; CHECKIF-NEXT:    xori a0, a0, 1
531 ; CHECKIF-NEXT:    ret
533 ; RV32I-LABEL: fcmp_uno:
534 ; RV32I:       # %bb.0:
535 ; RV32I-NEXT:    addi sp, sp, -16
536 ; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
537 ; RV32I-NEXT:    call __unordsf2
538 ; RV32I-NEXT:    snez a0, a0
539 ; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
540 ; RV32I-NEXT:    addi sp, sp, 16
541 ; RV32I-NEXT:    ret
543 ; RV64I-LABEL: fcmp_uno:
544 ; RV64I:       # %bb.0:
545 ; RV64I-NEXT:    addi sp, sp, -16
546 ; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
547 ; RV64I-NEXT:    call __unordsf2
548 ; RV64I-NEXT:    sext.w a0, a0
549 ; RV64I-NEXT:    snez a0, a0
550 ; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
551 ; RV64I-NEXT:    addi sp, sp, 16
552 ; RV64I-NEXT:    ret
553   %1 = fcmp uno float %a, %b
554   %2 = zext i1 %1 to i32
555   ret i32 %2
558 define i32 @fcmp_true(float %a, float %b) nounwind {
559 ; CHECKIF-LABEL: fcmp_true:
560 ; CHECKIF:       # %bb.0:
561 ; CHECKIF-NEXT:    li a0, 1
562 ; CHECKIF-NEXT:    ret
564 ; RV32I-LABEL: fcmp_true:
565 ; RV32I:       # %bb.0:
566 ; RV32I-NEXT:    li a0, 1
567 ; RV32I-NEXT:    ret
569 ; RV64I-LABEL: fcmp_true:
570 ; RV64I:       # %bb.0:
571 ; RV64I-NEXT:    li a0, 1
572 ; RV64I-NEXT:    ret
573   %1 = fcmp true float %a, %b
574   %2 = zext i1 %1 to i32
575   ret i32 %2