1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+f \
3 ; RUN: -verify-machineinstrs -target-abi=ilp32f \
4 ; RUN: | FileCheck -check-prefix=RV32IF %s
5 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfinx \
6 ; RUN: -verify-machineinstrs -target-abi=ilp32 \
7 ; RUN: | FileCheck -check-prefix=RV32IZFINX %s
8 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \
9 ; RUN: -verify-machineinstrs -target-abi=ilp32f \
10 ; RUN: | FileCheck -check-prefix=RV32IF %s
11 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+f \
12 ; RUN: -verify-machineinstrs -target-abi=lp64f \
13 ; RUN: | FileCheck -check-prefix=RV64IF %s
14 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfinx \
15 ; RUN: -verify-machineinstrs -target-abi=lp64 \
16 ; RUN: | FileCheck -check-prefix=RV64IZFINX %s
17 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \
18 ; RUN: -verify-machineinstrs -target-abi=lp64d \
19 ; RUN: | FileCheck -check-prefix=RV64IF %s
20 ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 \
21 ; RUN: -verify-machineinstrs | FileCheck -check-prefix=RV32I %s
22 ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 \
23 ; RUN: -verify-machineinstrs | FileCheck -check-prefix=RV64I %s
25 declare float @llvm.sqrt.f32(float)
27 define float @sqrt_f32(float %a) nounwind {
28 ; RV32IF-LABEL: sqrt_f32:
30 ; RV32IF-NEXT: fsqrt.s fa0, fa0
33 ; RV32IZFINX-LABEL: sqrt_f32:
34 ; RV32IZFINX: # %bb.0:
35 ; RV32IZFINX-NEXT: fsqrt.s a0, a0
36 ; RV32IZFINX-NEXT: ret
38 ; RV64IF-LABEL: sqrt_f32:
40 ; RV64IF-NEXT: fsqrt.s fa0, fa0
43 ; RV64IZFINX-LABEL: sqrt_f32:
44 ; RV64IZFINX: # %bb.0:
45 ; RV64IZFINX-NEXT: fsqrt.s a0, a0
46 ; RV64IZFINX-NEXT: ret
48 ; RV32I-LABEL: sqrt_f32:
50 ; RV32I-NEXT: addi sp, sp, -16
51 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
52 ; RV32I-NEXT: call sqrtf
53 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
54 ; RV32I-NEXT: addi sp, sp, 16
57 ; RV64I-LABEL: sqrt_f32:
59 ; RV64I-NEXT: addi sp, sp, -16
60 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
61 ; RV64I-NEXT: call sqrtf
62 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
63 ; RV64I-NEXT: addi sp, sp, 16
65 %1 = call float @llvm.sqrt.f32(float %a)
69 declare float @llvm.powi.f32.i32(float, i32)
71 define float @powi_f32(float %a, i32 %b) nounwind {
72 ; RV32IF-LABEL: powi_f32:
74 ; RV32IF-NEXT: tail __powisf2
76 ; RV32IZFINX-LABEL: powi_f32:
77 ; RV32IZFINX: # %bb.0:
78 ; RV32IZFINX-NEXT: tail __powisf2
80 ; RV64IF-LABEL: powi_f32:
82 ; RV64IF-NEXT: addi sp, sp, -16
83 ; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
84 ; RV64IF-NEXT: sext.w a0, a0
85 ; RV64IF-NEXT: call __powisf2
86 ; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
87 ; RV64IF-NEXT: addi sp, sp, 16
90 ; RV64IZFINX-LABEL: powi_f32:
91 ; RV64IZFINX: # %bb.0:
92 ; RV64IZFINX-NEXT: addi sp, sp, -16
93 ; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
94 ; RV64IZFINX-NEXT: sext.w a1, a1
95 ; RV64IZFINX-NEXT: call __powisf2
96 ; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
97 ; RV64IZFINX-NEXT: addi sp, sp, 16
98 ; RV64IZFINX-NEXT: ret
100 ; RV32I-LABEL: powi_f32:
102 ; RV32I-NEXT: addi sp, sp, -16
103 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
104 ; RV32I-NEXT: call __powisf2
105 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
106 ; RV32I-NEXT: addi sp, sp, 16
109 ; RV64I-LABEL: powi_f32:
111 ; RV64I-NEXT: addi sp, sp, -16
112 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
113 ; RV64I-NEXT: sext.w a1, a1
114 ; RV64I-NEXT: call __powisf2
115 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
116 ; RV64I-NEXT: addi sp, sp, 16
118 %1 = call float @llvm.powi.f32.i32(float %a, i32 %b)
122 declare float @llvm.sin.f32(float)
124 define float @sin_f32(float %a) nounwind {
125 ; RV32IF-LABEL: sin_f32:
127 ; RV32IF-NEXT: tail sinf
129 ; RV32IZFINX-LABEL: sin_f32:
130 ; RV32IZFINX: # %bb.0:
131 ; RV32IZFINX-NEXT: tail sinf
133 ; RV64IF-LABEL: sin_f32:
135 ; RV64IF-NEXT: tail sinf
137 ; RV64IZFINX-LABEL: sin_f32:
138 ; RV64IZFINX: # %bb.0:
139 ; RV64IZFINX-NEXT: tail sinf
141 ; RV32I-LABEL: sin_f32:
143 ; RV32I-NEXT: addi sp, sp, -16
144 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
145 ; RV32I-NEXT: call sinf
146 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
147 ; RV32I-NEXT: addi sp, sp, 16
150 ; RV64I-LABEL: sin_f32:
152 ; RV64I-NEXT: addi sp, sp, -16
153 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
154 ; RV64I-NEXT: call sinf
155 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
156 ; RV64I-NEXT: addi sp, sp, 16
158 %1 = call float @llvm.sin.f32(float %a)
162 declare float @llvm.cos.f32(float)
164 define float @cos_f32(float %a) nounwind {
165 ; RV32IF-LABEL: cos_f32:
167 ; RV32IF-NEXT: tail cosf
169 ; RV32IZFINX-LABEL: cos_f32:
170 ; RV32IZFINX: # %bb.0:
171 ; RV32IZFINX-NEXT: tail cosf
173 ; RV64IF-LABEL: cos_f32:
175 ; RV64IF-NEXT: tail cosf
177 ; RV64IZFINX-LABEL: cos_f32:
178 ; RV64IZFINX: # %bb.0:
179 ; RV64IZFINX-NEXT: tail cosf
181 ; RV32I-LABEL: cos_f32:
183 ; RV32I-NEXT: addi sp, sp, -16
184 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
185 ; RV32I-NEXT: call cosf
186 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
187 ; RV32I-NEXT: addi sp, sp, 16
190 ; RV64I-LABEL: cos_f32:
192 ; RV64I-NEXT: addi sp, sp, -16
193 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
194 ; RV64I-NEXT: call cosf
195 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
196 ; RV64I-NEXT: addi sp, sp, 16
198 %1 = call float @llvm.cos.f32(float %a)
202 ; The sin+cos combination results in an FSINCOS SelectionDAG node.
203 define float @sincos_f32(float %a) nounwind {
204 ; RV32IF-LABEL: sincos_f32:
206 ; RV32IF-NEXT: addi sp, sp, -16
207 ; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
208 ; RV32IF-NEXT: fsw fs0, 8(sp) # 4-byte Folded Spill
209 ; RV32IF-NEXT: fsw fs1, 4(sp) # 4-byte Folded Spill
210 ; RV32IF-NEXT: fmv.s fs0, fa0
211 ; RV32IF-NEXT: call sinf
212 ; RV32IF-NEXT: fmv.s fs1, fa0
213 ; RV32IF-NEXT: fmv.s fa0, fs0
214 ; RV32IF-NEXT: call cosf
215 ; RV32IF-NEXT: fadd.s fa0, fs1, fa0
216 ; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
217 ; RV32IF-NEXT: flw fs0, 8(sp) # 4-byte Folded Reload
218 ; RV32IF-NEXT: flw fs1, 4(sp) # 4-byte Folded Reload
219 ; RV32IF-NEXT: addi sp, sp, 16
222 ; RV32IZFINX-LABEL: sincos_f32:
223 ; RV32IZFINX: # %bb.0:
224 ; RV32IZFINX-NEXT: addi sp, sp, -16
225 ; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
226 ; RV32IZFINX-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
227 ; RV32IZFINX-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
228 ; RV32IZFINX-NEXT: mv s0, a0
229 ; RV32IZFINX-NEXT: call sinf
230 ; RV32IZFINX-NEXT: mv s1, a0
231 ; RV32IZFINX-NEXT: mv a0, s0
232 ; RV32IZFINX-NEXT: call cosf
233 ; RV32IZFINX-NEXT: fadd.s a0, s1, a0
234 ; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
235 ; RV32IZFINX-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
236 ; RV32IZFINX-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
237 ; RV32IZFINX-NEXT: addi sp, sp, 16
238 ; RV32IZFINX-NEXT: ret
240 ; RV64IZFINX-LABEL: sincos_f32:
241 ; RV64IZFINX: # %bb.0:
242 ; RV64IZFINX-NEXT: addi sp, sp, -32
243 ; RV64IZFINX-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
244 ; RV64IZFINX-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
245 ; RV64IZFINX-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
246 ; RV64IZFINX-NEXT: mv s0, a0
247 ; RV64IZFINX-NEXT: call sinf
248 ; RV64IZFINX-NEXT: mv s1, a0
249 ; RV64IZFINX-NEXT: mv a0, s0
250 ; RV64IZFINX-NEXT: call cosf
251 ; RV64IZFINX-NEXT: fadd.s a0, s1, a0
252 ; RV64IZFINX-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
253 ; RV64IZFINX-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
254 ; RV64IZFINX-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
255 ; RV64IZFINX-NEXT: addi sp, sp, 32
256 ; RV64IZFINX-NEXT: ret
258 ; RV32I-LABEL: sincos_f32:
260 ; RV32I-NEXT: addi sp, sp, -16
261 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
262 ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
263 ; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
264 ; RV32I-NEXT: mv s0, a0
265 ; RV32I-NEXT: call sinf
266 ; RV32I-NEXT: mv s1, a0
267 ; RV32I-NEXT: mv a0, s0
268 ; RV32I-NEXT: call cosf
269 ; RV32I-NEXT: mv a1, a0
270 ; RV32I-NEXT: mv a0, s1
271 ; RV32I-NEXT: call __addsf3
272 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
273 ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
274 ; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
275 ; RV32I-NEXT: addi sp, sp, 16
278 ; RV64I-LABEL: sincos_f32:
280 ; RV64I-NEXT: addi sp, sp, -32
281 ; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
282 ; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
283 ; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
284 ; RV64I-NEXT: mv s0, a0
285 ; RV64I-NEXT: call sinf
286 ; RV64I-NEXT: mv s1, a0
287 ; RV64I-NEXT: mv a0, s0
288 ; RV64I-NEXT: call cosf
289 ; RV64I-NEXT: mv a1, a0
290 ; RV64I-NEXT: mv a0, s1
291 ; RV64I-NEXT: call __addsf3
292 ; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
293 ; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
294 ; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
295 ; RV64I-NEXT: addi sp, sp, 32
297 %1 = call float @llvm.sin.f32(float %a)
298 %2 = call float @llvm.cos.f32(float %a)
299 %3 = fadd float %1, %2
303 declare float @llvm.pow.f32(float, float)
305 define float @pow_f32(float %a, float %b) nounwind {
306 ; RV32IF-LABEL: pow_f32:
308 ; RV32IF-NEXT: tail powf
310 ; RV32IZFINX-LABEL: pow_f32:
311 ; RV32IZFINX: # %bb.0:
312 ; RV32IZFINX-NEXT: tail powf
314 ; RV64IF-LABEL: pow_f32:
316 ; RV64IF-NEXT: tail powf
318 ; RV64IZFINX-LABEL: pow_f32:
319 ; RV64IZFINX: # %bb.0:
320 ; RV64IZFINX-NEXT: tail powf
322 ; RV32I-LABEL: pow_f32:
324 ; RV32I-NEXT: addi sp, sp, -16
325 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
326 ; RV32I-NEXT: call powf
327 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
328 ; RV32I-NEXT: addi sp, sp, 16
331 ; RV64I-LABEL: pow_f32:
333 ; RV64I-NEXT: addi sp, sp, -16
334 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
335 ; RV64I-NEXT: call powf
336 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
337 ; RV64I-NEXT: addi sp, sp, 16
339 %1 = call float @llvm.pow.f32(float %a, float %b)
343 declare float @llvm.exp.f32(float)
345 define float @exp_f32(float %a) nounwind {
346 ; RV32IF-LABEL: exp_f32:
348 ; RV32IF-NEXT: tail expf
350 ; RV32IZFINX-LABEL: exp_f32:
351 ; RV32IZFINX: # %bb.0:
352 ; RV32IZFINX-NEXT: tail expf
354 ; RV64IF-LABEL: exp_f32:
356 ; RV64IF-NEXT: tail expf
358 ; RV64IZFINX-LABEL: exp_f32:
359 ; RV64IZFINX: # %bb.0:
360 ; RV64IZFINX-NEXT: tail expf
362 ; RV32I-LABEL: exp_f32:
364 ; RV32I-NEXT: addi sp, sp, -16
365 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
366 ; RV32I-NEXT: call expf
367 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
368 ; RV32I-NEXT: addi sp, sp, 16
371 ; RV64I-LABEL: exp_f32:
373 ; RV64I-NEXT: addi sp, sp, -16
374 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
375 ; RV64I-NEXT: call expf
376 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
377 ; RV64I-NEXT: addi sp, sp, 16
379 %1 = call float @llvm.exp.f32(float %a)
383 declare float @llvm.exp2.f32(float)
385 define float @exp2_f32(float %a) nounwind {
386 ; RV32IF-LABEL: exp2_f32:
388 ; RV32IF-NEXT: tail exp2f
390 ; RV32IZFINX-LABEL: exp2_f32:
391 ; RV32IZFINX: # %bb.0:
392 ; RV32IZFINX-NEXT: tail exp2f
394 ; RV64IF-LABEL: exp2_f32:
396 ; RV64IF-NEXT: tail exp2f
398 ; RV64IZFINX-LABEL: exp2_f32:
399 ; RV64IZFINX: # %bb.0:
400 ; RV64IZFINX-NEXT: tail exp2f
402 ; RV32I-LABEL: exp2_f32:
404 ; RV32I-NEXT: addi sp, sp, -16
405 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
406 ; RV32I-NEXT: call exp2f
407 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
408 ; RV32I-NEXT: addi sp, sp, 16
411 ; RV64I-LABEL: exp2_f32:
413 ; RV64I-NEXT: addi sp, sp, -16
414 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
415 ; RV64I-NEXT: call exp2f
416 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
417 ; RV64I-NEXT: addi sp, sp, 16
419 %1 = call float @llvm.exp2.f32(float %a)
423 define float @exp10_f32(float %a) nounwind {
424 ; RV32IF-LABEL: exp10_f32:
426 ; RV32IF-NEXT: tail exp10f
428 ; RV32IZFINX-LABEL: exp10_f32:
429 ; RV32IZFINX: # %bb.0:
430 ; RV32IZFINX-NEXT: tail exp10f
432 ; RV64IF-LABEL: exp10_f32:
434 ; RV64IF-NEXT: tail exp10f
436 ; RV64IZFINX-LABEL: exp10_f32:
437 ; RV64IZFINX: # %bb.0:
438 ; RV64IZFINX-NEXT: tail exp10f
440 ; RV32I-LABEL: exp10_f32:
442 ; RV32I-NEXT: addi sp, sp, -16
443 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
444 ; RV32I-NEXT: call exp10f
445 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
446 ; RV32I-NEXT: addi sp, sp, 16
449 ; RV64I-LABEL: exp10_f32:
451 ; RV64I-NEXT: addi sp, sp, -16
452 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
453 ; RV64I-NEXT: call exp10f
454 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
455 ; RV64I-NEXT: addi sp, sp, 16
457 %1 = call float @llvm.exp10.f32(float %a)
461 declare float @llvm.log.f32(float)
463 define float @log_f32(float %a) nounwind {
464 ; RV32IF-LABEL: log_f32:
466 ; RV32IF-NEXT: tail logf
468 ; RV32IZFINX-LABEL: log_f32:
469 ; RV32IZFINX: # %bb.0:
470 ; RV32IZFINX-NEXT: tail logf
472 ; RV64IF-LABEL: log_f32:
474 ; RV64IF-NEXT: tail logf
476 ; RV64IZFINX-LABEL: log_f32:
477 ; RV64IZFINX: # %bb.0:
478 ; RV64IZFINX-NEXT: tail logf
480 ; RV32I-LABEL: log_f32:
482 ; RV32I-NEXT: addi sp, sp, -16
483 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
484 ; RV32I-NEXT: call logf
485 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
486 ; RV32I-NEXT: addi sp, sp, 16
489 ; RV64I-LABEL: log_f32:
491 ; RV64I-NEXT: addi sp, sp, -16
492 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
493 ; RV64I-NEXT: call logf
494 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
495 ; RV64I-NEXT: addi sp, sp, 16
497 %1 = call float @llvm.log.f32(float %a)
501 declare float @llvm.log10.f32(float)
503 define float @log10_f32(float %a) nounwind {
504 ; RV32IF-LABEL: log10_f32:
506 ; RV32IF-NEXT: tail log10f
508 ; RV32IZFINX-LABEL: log10_f32:
509 ; RV32IZFINX: # %bb.0:
510 ; RV32IZFINX-NEXT: tail log10f
512 ; RV64IF-LABEL: log10_f32:
514 ; RV64IF-NEXT: tail log10f
516 ; RV64IZFINX-LABEL: log10_f32:
517 ; RV64IZFINX: # %bb.0:
518 ; RV64IZFINX-NEXT: tail log10f
520 ; RV32I-LABEL: log10_f32:
522 ; RV32I-NEXT: addi sp, sp, -16
523 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
524 ; RV32I-NEXT: call log10f
525 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
526 ; RV32I-NEXT: addi sp, sp, 16
529 ; RV64I-LABEL: log10_f32:
531 ; RV64I-NEXT: addi sp, sp, -16
532 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
533 ; RV64I-NEXT: call log10f
534 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
535 ; RV64I-NEXT: addi sp, sp, 16
537 %1 = call float @llvm.log10.f32(float %a)
541 declare float @llvm.log2.f32(float)
543 define float @log2_f32(float %a) nounwind {
544 ; RV32IF-LABEL: log2_f32:
546 ; RV32IF-NEXT: tail log2f
548 ; RV32IZFINX-LABEL: log2_f32:
549 ; RV32IZFINX: # %bb.0:
550 ; RV32IZFINX-NEXT: tail log2f
552 ; RV64IF-LABEL: log2_f32:
554 ; RV64IF-NEXT: tail log2f
556 ; RV64IZFINX-LABEL: log2_f32:
557 ; RV64IZFINX: # %bb.0:
558 ; RV64IZFINX-NEXT: tail log2f
560 ; RV32I-LABEL: log2_f32:
562 ; RV32I-NEXT: addi sp, sp, -16
563 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
564 ; RV32I-NEXT: call log2f
565 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
566 ; RV32I-NEXT: addi sp, sp, 16
569 ; RV64I-LABEL: log2_f32:
571 ; RV64I-NEXT: addi sp, sp, -16
572 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
573 ; RV64I-NEXT: call log2f
574 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
575 ; RV64I-NEXT: addi sp, sp, 16
577 %1 = call float @llvm.log2.f32(float %a)
581 declare float @llvm.fma.f32(float, float, float)
583 define float @fma_f32(float %a, float %b, float %c) nounwind {
584 ; RV32IF-LABEL: fma_f32:
586 ; RV32IF-NEXT: fmadd.s fa0, fa0, fa1, fa2
589 ; RV32IZFINX-LABEL: fma_f32:
590 ; RV32IZFINX: # %bb.0:
591 ; RV32IZFINX-NEXT: fmadd.s a0, a0, a1, a2
592 ; RV32IZFINX-NEXT: ret
594 ; RV64IF-LABEL: fma_f32:
596 ; RV64IF-NEXT: fmadd.s fa0, fa0, fa1, fa2
599 ; RV64IZFINX-LABEL: fma_f32:
600 ; RV64IZFINX: # %bb.0:
601 ; RV64IZFINX-NEXT: fmadd.s a0, a0, a1, a2
602 ; RV64IZFINX-NEXT: ret
604 ; RV32I-LABEL: fma_f32:
606 ; RV32I-NEXT: addi sp, sp, -16
607 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
608 ; RV32I-NEXT: call fmaf
609 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
610 ; RV32I-NEXT: addi sp, sp, 16
613 ; RV64I-LABEL: fma_f32:
615 ; RV64I-NEXT: addi sp, sp, -16
616 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
617 ; RV64I-NEXT: call fmaf
618 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
619 ; RV64I-NEXT: addi sp, sp, 16
621 %1 = call float @llvm.fma.f32(float %a, float %b, float %c)
625 declare float @llvm.fmuladd.f32(float, float, float)
627 define float @fmuladd_f32(float %a, float %b, float %c) nounwind {
628 ; RV32IF-LABEL: fmuladd_f32:
630 ; RV32IF-NEXT: fmadd.s fa0, fa0, fa1, fa2
633 ; RV32IZFINX-LABEL: fmuladd_f32:
634 ; RV32IZFINX: # %bb.0:
635 ; RV32IZFINX-NEXT: fmadd.s a0, a0, a1, a2
636 ; RV32IZFINX-NEXT: ret
638 ; RV64IF-LABEL: fmuladd_f32:
640 ; RV64IF-NEXT: fmadd.s fa0, fa0, fa1, fa2
643 ; RV64IZFINX-LABEL: fmuladd_f32:
644 ; RV64IZFINX: # %bb.0:
645 ; RV64IZFINX-NEXT: fmadd.s a0, a0, a1, a2
646 ; RV64IZFINX-NEXT: ret
648 ; RV32I-LABEL: fmuladd_f32:
650 ; RV32I-NEXT: addi sp, sp, -16
651 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
652 ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
653 ; RV32I-NEXT: mv s0, a2
654 ; RV32I-NEXT: call __mulsf3
655 ; RV32I-NEXT: mv a1, s0
656 ; RV32I-NEXT: call __addsf3
657 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
658 ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
659 ; RV32I-NEXT: addi sp, sp, 16
662 ; RV64I-LABEL: fmuladd_f32:
664 ; RV64I-NEXT: addi sp, sp, -16
665 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
666 ; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
667 ; RV64I-NEXT: mv s0, a2
668 ; RV64I-NEXT: call __mulsf3
669 ; RV64I-NEXT: mv a1, s0
670 ; RV64I-NEXT: call __addsf3
671 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
672 ; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
673 ; RV64I-NEXT: addi sp, sp, 16
675 %1 = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
679 declare float @llvm.fabs.f32(float)
681 define float @fabs_f32(float %a) nounwind {
682 ; RV32IF-LABEL: fabs_f32:
684 ; RV32IF-NEXT: fabs.s fa0, fa0
687 ; RV32IZFINX-LABEL: fabs_f32:
688 ; RV32IZFINX: # %bb.0:
689 ; RV32IZFINX-NEXT: fabs.s a0, a0
690 ; RV32IZFINX-NEXT: ret
692 ; RV64IF-LABEL: fabs_f32:
694 ; RV64IF-NEXT: fabs.s fa0, fa0
697 ; RV64IZFINX-LABEL: fabs_f32:
698 ; RV64IZFINX: # %bb.0:
699 ; RV64IZFINX-NEXT: fabs.s a0, a0
700 ; RV64IZFINX-NEXT: ret
702 ; RV32I-LABEL: fabs_f32:
704 ; RV32I-NEXT: slli a0, a0, 1
705 ; RV32I-NEXT: srli a0, a0, 1
708 ; RV64I-LABEL: fabs_f32:
710 ; RV64I-NEXT: slli a0, a0, 33
711 ; RV64I-NEXT: srli a0, a0, 33
713 %1 = call float @llvm.fabs.f32(float %a)
717 declare float @llvm.minnum.f32(float, float)
719 define float @minnum_f32(float %a, float %b) nounwind {
720 ; RV32IF-LABEL: minnum_f32:
722 ; RV32IF-NEXT: fmin.s fa0, fa0, fa1
725 ; RV32IZFINX-LABEL: minnum_f32:
726 ; RV32IZFINX: # %bb.0:
727 ; RV32IZFINX-NEXT: fmin.s a0, a0, a1
728 ; RV32IZFINX-NEXT: ret
730 ; RV64IF-LABEL: minnum_f32:
732 ; RV64IF-NEXT: fmin.s fa0, fa0, fa1
735 ; RV64IZFINX-LABEL: minnum_f32:
736 ; RV64IZFINX: # %bb.0:
737 ; RV64IZFINX-NEXT: fmin.s a0, a0, a1
738 ; RV64IZFINX-NEXT: ret
740 ; RV32I-LABEL: minnum_f32:
742 ; RV32I-NEXT: addi sp, sp, -16
743 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
744 ; RV32I-NEXT: call fminf
745 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
746 ; RV32I-NEXT: addi sp, sp, 16
749 ; RV64I-LABEL: minnum_f32:
751 ; RV64I-NEXT: addi sp, sp, -16
752 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
753 ; RV64I-NEXT: call fminf
754 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
755 ; RV64I-NEXT: addi sp, sp, 16
757 %1 = call float @llvm.minnum.f32(float %a, float %b)
761 declare float @llvm.maxnum.f32(float, float)
763 define float @maxnum_f32(float %a, float %b) nounwind {
764 ; RV32IF-LABEL: maxnum_f32:
766 ; RV32IF-NEXT: fmax.s fa0, fa0, fa1
769 ; RV32IZFINX-LABEL: maxnum_f32:
770 ; RV32IZFINX: # %bb.0:
771 ; RV32IZFINX-NEXT: fmax.s a0, a0, a1
772 ; RV32IZFINX-NEXT: ret
774 ; RV64IF-LABEL: maxnum_f32:
776 ; RV64IF-NEXT: fmax.s fa0, fa0, fa1
779 ; RV64IZFINX-LABEL: maxnum_f32:
780 ; RV64IZFINX: # %bb.0:
781 ; RV64IZFINX-NEXT: fmax.s a0, a0, a1
782 ; RV64IZFINX-NEXT: ret
784 ; RV32I-LABEL: maxnum_f32:
786 ; RV32I-NEXT: addi sp, sp, -16
787 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
788 ; RV32I-NEXT: call fmaxf
789 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
790 ; RV32I-NEXT: addi sp, sp, 16
793 ; RV64I-LABEL: maxnum_f32:
795 ; RV64I-NEXT: addi sp, sp, -16
796 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
797 ; RV64I-NEXT: call fmaxf
798 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
799 ; RV64I-NEXT: addi sp, sp, 16
801 %1 = call float @llvm.maxnum.f32(float %a, float %b)
805 ; TODO: FMINNAN and FMAXNAN aren't handled in
806 ; SelectionDAGLegalize::ExpandNode.
808 ; declare float @llvm.minimum.f32(float, float)
810 ; define float @fminimum_f32(float %a, float %b) nounwind {
811 ; %1 = call float @llvm.minimum.f32(float %a, float %b)
815 ; declare float @llvm.maximum.f32(float, float)
817 ; define float @fmaximum_f32(float %a, float %b) nounwind {
818 ; %1 = call float @llvm.maximum.f32(float %a, float %b)
822 declare float @llvm.copysign.f32(float, float)
824 define float @copysign_f32(float %a, float %b) nounwind {
825 ; RV32IF-LABEL: copysign_f32:
827 ; RV32IF-NEXT: fsgnj.s fa0, fa0, fa1
830 ; RV32IZFINX-LABEL: copysign_f32:
831 ; RV32IZFINX: # %bb.0:
832 ; RV32IZFINX-NEXT: fsgnj.s a0, a0, a1
833 ; RV32IZFINX-NEXT: ret
835 ; RV64IF-LABEL: copysign_f32:
837 ; RV64IF-NEXT: fsgnj.s fa0, fa0, fa1
840 ; RV64IZFINX-LABEL: copysign_f32:
841 ; RV64IZFINX: # %bb.0:
842 ; RV64IZFINX-NEXT: fsgnj.s a0, a0, a1
843 ; RV64IZFINX-NEXT: ret
845 ; RV32I-LABEL: copysign_f32:
847 ; RV32I-NEXT: lui a2, 524288
848 ; RV32I-NEXT: slli a0, a0, 1
849 ; RV32I-NEXT: and a1, a1, a2
850 ; RV32I-NEXT: srli a0, a0, 1
851 ; RV32I-NEXT: or a0, a0, a1
854 ; RV64I-LABEL: copysign_f32:
856 ; RV64I-NEXT: lui a2, 524288
857 ; RV64I-NEXT: slli a0, a0, 33
858 ; RV64I-NEXT: and a1, a1, a2
859 ; RV64I-NEXT: srli a0, a0, 33
860 ; RV64I-NEXT: or a0, a0, a1
862 %1 = call float @llvm.copysign.f32(float %a, float %b)
866 declare float @llvm.floor.f32(float)
868 define float @floor_f32(float %a) nounwind {
869 ; RV32IF-LABEL: floor_f32:
871 ; RV32IF-NEXT: lui a0, 307200
872 ; RV32IF-NEXT: fmv.w.x fa5, a0
873 ; RV32IF-NEXT: fabs.s fa4, fa0
874 ; RV32IF-NEXT: flt.s a0, fa4, fa5
875 ; RV32IF-NEXT: beqz a0, .LBB18_2
876 ; RV32IF-NEXT: # %bb.1:
877 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rdn
878 ; RV32IF-NEXT: fcvt.s.w fa5, a0, rdn
879 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
880 ; RV32IF-NEXT: .LBB18_2:
883 ; RV32IZFINX-LABEL: floor_f32:
884 ; RV32IZFINX: # %bb.0:
885 ; RV32IZFINX-NEXT: lui a1, 307200
886 ; RV32IZFINX-NEXT: fabs.s a2, a0
887 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
888 ; RV32IZFINX-NEXT: beqz a1, .LBB18_2
889 ; RV32IZFINX-NEXT: # %bb.1:
890 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0, rdn
891 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1, rdn
892 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
893 ; RV32IZFINX-NEXT: .LBB18_2:
894 ; RV32IZFINX-NEXT: ret
896 ; RV64IF-LABEL: floor_f32:
898 ; RV64IF-NEXT: lui a0, 307200
899 ; RV64IF-NEXT: fmv.w.x fa5, a0
900 ; RV64IF-NEXT: fabs.s fa4, fa0
901 ; RV64IF-NEXT: flt.s a0, fa4, fa5
902 ; RV64IF-NEXT: beqz a0, .LBB18_2
903 ; RV64IF-NEXT: # %bb.1:
904 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rdn
905 ; RV64IF-NEXT: fcvt.s.w fa5, a0, rdn
906 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
907 ; RV64IF-NEXT: .LBB18_2:
910 ; RV64IZFINX-LABEL: floor_f32:
911 ; RV64IZFINX: # %bb.0:
912 ; RV64IZFINX-NEXT: lui a1, 307200
913 ; RV64IZFINX-NEXT: fabs.s a2, a0
914 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
915 ; RV64IZFINX-NEXT: beqz a1, .LBB18_2
916 ; RV64IZFINX-NEXT: # %bb.1:
917 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0, rdn
918 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1, rdn
919 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
920 ; RV64IZFINX-NEXT: .LBB18_2:
921 ; RV64IZFINX-NEXT: ret
923 ; RV32I-LABEL: floor_f32:
925 ; RV32I-NEXT: addi sp, sp, -16
926 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
927 ; RV32I-NEXT: call floorf
928 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
929 ; RV32I-NEXT: addi sp, sp, 16
932 ; RV64I-LABEL: floor_f32:
934 ; RV64I-NEXT: addi sp, sp, -16
935 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
936 ; RV64I-NEXT: call floorf
937 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
938 ; RV64I-NEXT: addi sp, sp, 16
940 %1 = call float @llvm.floor.f32(float %a)
944 declare float @llvm.ceil.f32(float)
946 define float @ceil_f32(float %a) nounwind {
947 ; RV32IF-LABEL: ceil_f32:
949 ; RV32IF-NEXT: lui a0, 307200
950 ; RV32IF-NEXT: fmv.w.x fa5, a0
951 ; RV32IF-NEXT: fabs.s fa4, fa0
952 ; RV32IF-NEXT: flt.s a0, fa4, fa5
953 ; RV32IF-NEXT: beqz a0, .LBB19_2
954 ; RV32IF-NEXT: # %bb.1:
955 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rup
956 ; RV32IF-NEXT: fcvt.s.w fa5, a0, rup
957 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
958 ; RV32IF-NEXT: .LBB19_2:
961 ; RV32IZFINX-LABEL: ceil_f32:
962 ; RV32IZFINX: # %bb.0:
963 ; RV32IZFINX-NEXT: lui a1, 307200
964 ; RV32IZFINX-NEXT: fabs.s a2, a0
965 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
966 ; RV32IZFINX-NEXT: beqz a1, .LBB19_2
967 ; RV32IZFINX-NEXT: # %bb.1:
968 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0, rup
969 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1, rup
970 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
971 ; RV32IZFINX-NEXT: .LBB19_2:
972 ; RV32IZFINX-NEXT: ret
974 ; RV64IF-LABEL: ceil_f32:
976 ; RV64IF-NEXT: lui a0, 307200
977 ; RV64IF-NEXT: fmv.w.x fa5, a0
978 ; RV64IF-NEXT: fabs.s fa4, fa0
979 ; RV64IF-NEXT: flt.s a0, fa4, fa5
980 ; RV64IF-NEXT: beqz a0, .LBB19_2
981 ; RV64IF-NEXT: # %bb.1:
982 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rup
983 ; RV64IF-NEXT: fcvt.s.w fa5, a0, rup
984 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
985 ; RV64IF-NEXT: .LBB19_2:
988 ; RV64IZFINX-LABEL: ceil_f32:
989 ; RV64IZFINX: # %bb.0:
990 ; RV64IZFINX-NEXT: lui a1, 307200
991 ; RV64IZFINX-NEXT: fabs.s a2, a0
992 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
993 ; RV64IZFINX-NEXT: beqz a1, .LBB19_2
994 ; RV64IZFINX-NEXT: # %bb.1:
995 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0, rup
996 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1, rup
997 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
998 ; RV64IZFINX-NEXT: .LBB19_2:
999 ; RV64IZFINX-NEXT: ret
1001 ; RV32I-LABEL: ceil_f32:
1003 ; RV32I-NEXT: addi sp, sp, -16
1004 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1005 ; RV32I-NEXT: call ceilf
1006 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1007 ; RV32I-NEXT: addi sp, sp, 16
1010 ; RV64I-LABEL: ceil_f32:
1012 ; RV64I-NEXT: addi sp, sp, -16
1013 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1014 ; RV64I-NEXT: call ceilf
1015 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1016 ; RV64I-NEXT: addi sp, sp, 16
1018 %1 = call float @llvm.ceil.f32(float %a)
1022 declare float @llvm.trunc.f32(float)
1024 define float @trunc_f32(float %a) nounwind {
1025 ; RV32IF-LABEL: trunc_f32:
1027 ; RV32IF-NEXT: lui a0, 307200
1028 ; RV32IF-NEXT: fmv.w.x fa5, a0
1029 ; RV32IF-NEXT: fabs.s fa4, fa0
1030 ; RV32IF-NEXT: flt.s a0, fa4, fa5
1031 ; RV32IF-NEXT: beqz a0, .LBB20_2
1032 ; RV32IF-NEXT: # %bb.1:
1033 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rtz
1034 ; RV32IF-NEXT: fcvt.s.w fa5, a0, rtz
1035 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
1036 ; RV32IF-NEXT: .LBB20_2:
1039 ; RV32IZFINX-LABEL: trunc_f32:
1040 ; RV32IZFINX: # %bb.0:
1041 ; RV32IZFINX-NEXT: lui a1, 307200
1042 ; RV32IZFINX-NEXT: fabs.s a2, a0
1043 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
1044 ; RV32IZFINX-NEXT: beqz a1, .LBB20_2
1045 ; RV32IZFINX-NEXT: # %bb.1:
1046 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0, rtz
1047 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1, rtz
1048 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
1049 ; RV32IZFINX-NEXT: .LBB20_2:
1050 ; RV32IZFINX-NEXT: ret
1052 ; RV64IF-LABEL: trunc_f32:
1054 ; RV64IF-NEXT: lui a0, 307200
1055 ; RV64IF-NEXT: fmv.w.x fa5, a0
1056 ; RV64IF-NEXT: fabs.s fa4, fa0
1057 ; RV64IF-NEXT: flt.s a0, fa4, fa5
1058 ; RV64IF-NEXT: beqz a0, .LBB20_2
1059 ; RV64IF-NEXT: # %bb.1:
1060 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rtz
1061 ; RV64IF-NEXT: fcvt.s.w fa5, a0, rtz
1062 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
1063 ; RV64IF-NEXT: .LBB20_2:
1066 ; RV64IZFINX-LABEL: trunc_f32:
1067 ; RV64IZFINX: # %bb.0:
1068 ; RV64IZFINX-NEXT: lui a1, 307200
1069 ; RV64IZFINX-NEXT: fabs.s a2, a0
1070 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
1071 ; RV64IZFINX-NEXT: beqz a1, .LBB20_2
1072 ; RV64IZFINX-NEXT: # %bb.1:
1073 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0, rtz
1074 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1, rtz
1075 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
1076 ; RV64IZFINX-NEXT: .LBB20_2:
1077 ; RV64IZFINX-NEXT: ret
1079 ; RV32I-LABEL: trunc_f32:
1081 ; RV32I-NEXT: addi sp, sp, -16
1082 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1083 ; RV32I-NEXT: call truncf
1084 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1085 ; RV32I-NEXT: addi sp, sp, 16
1088 ; RV64I-LABEL: trunc_f32:
1090 ; RV64I-NEXT: addi sp, sp, -16
1091 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1092 ; RV64I-NEXT: call truncf
1093 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1094 ; RV64I-NEXT: addi sp, sp, 16
1096 %1 = call float @llvm.trunc.f32(float %a)
1100 declare float @llvm.rint.f32(float)
1102 define float @rint_f32(float %a) nounwind {
1103 ; RV32IF-LABEL: rint_f32:
1105 ; RV32IF-NEXT: lui a0, 307200
1106 ; RV32IF-NEXT: fmv.w.x fa5, a0
1107 ; RV32IF-NEXT: fabs.s fa4, fa0
1108 ; RV32IF-NEXT: flt.s a0, fa4, fa5
1109 ; RV32IF-NEXT: beqz a0, .LBB21_2
1110 ; RV32IF-NEXT: # %bb.1:
1111 ; RV32IF-NEXT: fcvt.w.s a0, fa0
1112 ; RV32IF-NEXT: fcvt.s.w fa5, a0
1113 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
1114 ; RV32IF-NEXT: .LBB21_2:
1117 ; RV32IZFINX-LABEL: rint_f32:
1118 ; RV32IZFINX: # %bb.0:
1119 ; RV32IZFINX-NEXT: lui a1, 307200
1120 ; RV32IZFINX-NEXT: fabs.s a2, a0
1121 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
1122 ; RV32IZFINX-NEXT: beqz a1, .LBB21_2
1123 ; RV32IZFINX-NEXT: # %bb.1:
1124 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0
1125 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1
1126 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
1127 ; RV32IZFINX-NEXT: .LBB21_2:
1128 ; RV32IZFINX-NEXT: ret
1130 ; RV64IF-LABEL: rint_f32:
1132 ; RV64IF-NEXT: lui a0, 307200
1133 ; RV64IF-NEXT: fmv.w.x fa5, a0
1134 ; RV64IF-NEXT: fabs.s fa4, fa0
1135 ; RV64IF-NEXT: flt.s a0, fa4, fa5
1136 ; RV64IF-NEXT: beqz a0, .LBB21_2
1137 ; RV64IF-NEXT: # %bb.1:
1138 ; RV64IF-NEXT: fcvt.w.s a0, fa0
1139 ; RV64IF-NEXT: fcvt.s.w fa5, a0
1140 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
1141 ; RV64IF-NEXT: .LBB21_2:
1144 ; RV64IZFINX-LABEL: rint_f32:
1145 ; RV64IZFINX: # %bb.0:
1146 ; RV64IZFINX-NEXT: lui a1, 307200
1147 ; RV64IZFINX-NEXT: fabs.s a2, a0
1148 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
1149 ; RV64IZFINX-NEXT: beqz a1, .LBB21_2
1150 ; RV64IZFINX-NEXT: # %bb.1:
1151 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0
1152 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1
1153 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
1154 ; RV64IZFINX-NEXT: .LBB21_2:
1155 ; RV64IZFINX-NEXT: ret
1157 ; RV32I-LABEL: rint_f32:
1159 ; RV32I-NEXT: addi sp, sp, -16
1160 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1161 ; RV32I-NEXT: call rintf
1162 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1163 ; RV32I-NEXT: addi sp, sp, 16
1166 ; RV64I-LABEL: rint_f32:
1168 ; RV64I-NEXT: addi sp, sp, -16
1169 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1170 ; RV64I-NEXT: call rintf
1171 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1172 ; RV64I-NEXT: addi sp, sp, 16
1174 %1 = call float @llvm.rint.f32(float %a)
1178 declare float @llvm.nearbyint.f32(float)
1180 define float @nearbyint_f32(float %a) nounwind {
1181 ; RV32IF-LABEL: nearbyint_f32:
1183 ; RV32IF-NEXT: tail nearbyintf
1185 ; RV32IZFINX-LABEL: nearbyint_f32:
1186 ; RV32IZFINX: # %bb.0:
1187 ; RV32IZFINX-NEXT: tail nearbyintf
1189 ; RV64IF-LABEL: nearbyint_f32:
1191 ; RV64IF-NEXT: tail nearbyintf
1193 ; RV64IZFINX-LABEL: nearbyint_f32:
1194 ; RV64IZFINX: # %bb.0:
1195 ; RV64IZFINX-NEXT: tail nearbyintf
1197 ; RV32I-LABEL: nearbyint_f32:
1199 ; RV32I-NEXT: addi sp, sp, -16
1200 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1201 ; RV32I-NEXT: call nearbyintf
1202 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1203 ; RV32I-NEXT: addi sp, sp, 16
1206 ; RV64I-LABEL: nearbyint_f32:
1208 ; RV64I-NEXT: addi sp, sp, -16
1209 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1210 ; RV64I-NEXT: call nearbyintf
1211 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1212 ; RV64I-NEXT: addi sp, sp, 16
1214 %1 = call float @llvm.nearbyint.f32(float %a)
1218 declare float @llvm.round.f32(float)
1220 define float @round_f32(float %a) nounwind {
1221 ; RV32IF-LABEL: round_f32:
1223 ; RV32IF-NEXT: lui a0, 307200
1224 ; RV32IF-NEXT: fmv.w.x fa5, a0
1225 ; RV32IF-NEXT: fabs.s fa4, fa0
1226 ; RV32IF-NEXT: flt.s a0, fa4, fa5
1227 ; RV32IF-NEXT: beqz a0, .LBB23_2
1228 ; RV32IF-NEXT: # %bb.1:
1229 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rmm
1230 ; RV32IF-NEXT: fcvt.s.w fa5, a0, rmm
1231 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
1232 ; RV32IF-NEXT: .LBB23_2:
1235 ; RV32IZFINX-LABEL: round_f32:
1236 ; RV32IZFINX: # %bb.0:
1237 ; RV32IZFINX-NEXT: lui a1, 307200
1238 ; RV32IZFINX-NEXT: fabs.s a2, a0
1239 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
1240 ; RV32IZFINX-NEXT: beqz a1, .LBB23_2
1241 ; RV32IZFINX-NEXT: # %bb.1:
1242 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0, rmm
1243 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1, rmm
1244 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
1245 ; RV32IZFINX-NEXT: .LBB23_2:
1246 ; RV32IZFINX-NEXT: ret
1248 ; RV64IF-LABEL: round_f32:
1250 ; RV64IF-NEXT: lui a0, 307200
1251 ; RV64IF-NEXT: fmv.w.x fa5, a0
1252 ; RV64IF-NEXT: fabs.s fa4, fa0
1253 ; RV64IF-NEXT: flt.s a0, fa4, fa5
1254 ; RV64IF-NEXT: beqz a0, .LBB23_2
1255 ; RV64IF-NEXT: # %bb.1:
1256 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rmm
1257 ; RV64IF-NEXT: fcvt.s.w fa5, a0, rmm
1258 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
1259 ; RV64IF-NEXT: .LBB23_2:
1262 ; RV64IZFINX-LABEL: round_f32:
1263 ; RV64IZFINX: # %bb.0:
1264 ; RV64IZFINX-NEXT: lui a1, 307200
1265 ; RV64IZFINX-NEXT: fabs.s a2, a0
1266 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
1267 ; RV64IZFINX-NEXT: beqz a1, .LBB23_2
1268 ; RV64IZFINX-NEXT: # %bb.1:
1269 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0, rmm
1270 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1, rmm
1271 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
1272 ; RV64IZFINX-NEXT: .LBB23_2:
1273 ; RV64IZFINX-NEXT: ret
1275 ; RV32I-LABEL: round_f32:
1277 ; RV32I-NEXT: addi sp, sp, -16
1278 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1279 ; RV32I-NEXT: call roundf
1280 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1281 ; RV32I-NEXT: addi sp, sp, 16
1284 ; RV64I-LABEL: round_f32:
1286 ; RV64I-NEXT: addi sp, sp, -16
1287 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1288 ; RV64I-NEXT: call roundf
1289 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1290 ; RV64I-NEXT: addi sp, sp, 16
1292 %1 = call float @llvm.round.f32(float %a)
1296 declare float @llvm.roundeven.f32(float)
1298 define float @roundeven_f32(float %a) nounwind {
1299 ; RV32IF-LABEL: roundeven_f32:
1301 ; RV32IF-NEXT: lui a0, 307200
1302 ; RV32IF-NEXT: fmv.w.x fa5, a0
1303 ; RV32IF-NEXT: fabs.s fa4, fa0
1304 ; RV32IF-NEXT: flt.s a0, fa4, fa5
1305 ; RV32IF-NEXT: beqz a0, .LBB24_2
1306 ; RV32IF-NEXT: # %bb.1:
1307 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rne
1308 ; RV32IF-NEXT: fcvt.s.w fa5, a0, rne
1309 ; RV32IF-NEXT: fsgnj.s fa0, fa5, fa0
1310 ; RV32IF-NEXT: .LBB24_2:
1313 ; RV32IZFINX-LABEL: roundeven_f32:
1314 ; RV32IZFINX: # %bb.0:
1315 ; RV32IZFINX-NEXT: lui a1, 307200
1316 ; RV32IZFINX-NEXT: fabs.s a2, a0
1317 ; RV32IZFINX-NEXT: flt.s a1, a2, a1
1318 ; RV32IZFINX-NEXT: beqz a1, .LBB24_2
1319 ; RV32IZFINX-NEXT: # %bb.1:
1320 ; RV32IZFINX-NEXT: fcvt.w.s a1, a0, rne
1321 ; RV32IZFINX-NEXT: fcvt.s.w a1, a1, rne
1322 ; RV32IZFINX-NEXT: fsgnj.s a0, a1, a0
1323 ; RV32IZFINX-NEXT: .LBB24_2:
1324 ; RV32IZFINX-NEXT: ret
1326 ; RV64IF-LABEL: roundeven_f32:
1328 ; RV64IF-NEXT: lui a0, 307200
1329 ; RV64IF-NEXT: fmv.w.x fa5, a0
1330 ; RV64IF-NEXT: fabs.s fa4, fa0
1331 ; RV64IF-NEXT: flt.s a0, fa4, fa5
1332 ; RV64IF-NEXT: beqz a0, .LBB24_2
1333 ; RV64IF-NEXT: # %bb.1:
1334 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rne
1335 ; RV64IF-NEXT: fcvt.s.w fa5, a0, rne
1336 ; RV64IF-NEXT: fsgnj.s fa0, fa5, fa0
1337 ; RV64IF-NEXT: .LBB24_2:
1340 ; RV64IZFINX-LABEL: roundeven_f32:
1341 ; RV64IZFINX: # %bb.0:
1342 ; RV64IZFINX-NEXT: lui a1, 307200
1343 ; RV64IZFINX-NEXT: fabs.s a2, a0
1344 ; RV64IZFINX-NEXT: flt.s a1, a2, a1
1345 ; RV64IZFINX-NEXT: beqz a1, .LBB24_2
1346 ; RV64IZFINX-NEXT: # %bb.1:
1347 ; RV64IZFINX-NEXT: fcvt.w.s a1, a0, rne
1348 ; RV64IZFINX-NEXT: fcvt.s.w a1, a1, rne
1349 ; RV64IZFINX-NEXT: fsgnj.s a0, a1, a0
1350 ; RV64IZFINX-NEXT: .LBB24_2:
1351 ; RV64IZFINX-NEXT: ret
1353 ; RV32I-LABEL: roundeven_f32:
1355 ; RV32I-NEXT: addi sp, sp, -16
1356 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1357 ; RV32I-NEXT: call roundevenf
1358 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1359 ; RV32I-NEXT: addi sp, sp, 16
1362 ; RV64I-LABEL: roundeven_f32:
1364 ; RV64I-NEXT: addi sp, sp, -16
1365 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1366 ; RV64I-NEXT: call roundevenf
1367 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1368 ; RV64I-NEXT: addi sp, sp, 16
1370 %1 = call float @llvm.roundeven.f32(float %a)
1374 declare iXLen @llvm.lrint.iXLen.f32(float)
1376 define iXLen @lrint_f32(float %a) nounwind {
1377 ; RV32IF-LABEL: lrint_f32:
1379 ; RV32IF-NEXT: fcvt.w.s a0, fa0
1382 ; RV32IZFINX-LABEL: lrint_f32:
1383 ; RV32IZFINX: # %bb.0:
1384 ; RV32IZFINX-NEXT: fcvt.w.s a0, a0
1385 ; RV32IZFINX-NEXT: ret
1387 ; RV64IF-LABEL: lrint_f32:
1389 ; RV64IF-NEXT: fcvt.l.s a0, fa0
1392 ; RV64IZFINX-LABEL: lrint_f32:
1393 ; RV64IZFINX: # %bb.0:
1394 ; RV64IZFINX-NEXT: fcvt.l.s a0, a0
1395 ; RV64IZFINX-NEXT: ret
1397 ; RV32I-LABEL: lrint_f32:
1399 ; RV32I-NEXT: addi sp, sp, -16
1400 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1401 ; RV32I-NEXT: call lrintf
1402 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1403 ; RV32I-NEXT: addi sp, sp, 16
1406 ; RV64I-LABEL: lrint_f32:
1408 ; RV64I-NEXT: addi sp, sp, -16
1409 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1410 ; RV64I-NEXT: call lrintf
1411 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1412 ; RV64I-NEXT: addi sp, sp, 16
1414 %1 = call iXLen @llvm.lrint.iXLen.f32(float %a)
1418 declare i32 @llvm.lround.i32.f32(float)
1419 declare i64 @llvm.lround.i64.f32(float)
1421 define iXLen @lround_f32(float %a) nounwind {
1422 ; RV32IF-LABEL: lround_f32:
1424 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rmm
1427 ; RV32IZFINX-LABEL: lround_f32:
1428 ; RV32IZFINX: # %bb.0:
1429 ; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rmm
1430 ; RV32IZFINX-NEXT: ret
1432 ; RV64IF-LABEL: lround_f32:
1434 ; RV64IF-NEXT: fcvt.l.s a0, fa0, rmm
1437 ; RV64IZFINX-LABEL: lround_f32:
1438 ; RV64IZFINX: # %bb.0:
1439 ; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rmm
1440 ; RV64IZFINX-NEXT: ret
1442 ; RV32I-LABEL: lround_f32:
1444 ; RV32I-NEXT: addi sp, sp, -16
1445 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1446 ; RV32I-NEXT: call lroundf
1447 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1448 ; RV32I-NEXT: addi sp, sp, 16
1451 ; RV64I-LABEL: lround_f32:
1453 ; RV64I-NEXT: addi sp, sp, -16
1454 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1455 ; RV64I-NEXT: call lroundf
1456 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1457 ; RV64I-NEXT: addi sp, sp, 16
1459 %1 = call iXLen @llvm.lround.iXLen.f32(float %a)
1463 ; We support i32 lround on RV64 even though long isn't 32 bits. This is needed
1465 define i32 @lround_i32_f32(float %a) nounwind {
1466 ; RV32IF-LABEL: lround_i32_f32:
1468 ; RV32IF-NEXT: fcvt.w.s a0, fa0, rmm
1471 ; RV32IZFINX-LABEL: lround_i32_f32:
1472 ; RV32IZFINX: # %bb.0:
1473 ; RV32IZFINX-NEXT: fcvt.w.s a0, a0, rmm
1474 ; RV32IZFINX-NEXT: ret
1476 ; RV64IF-LABEL: lround_i32_f32:
1478 ; RV64IF-NEXT: fcvt.w.s a0, fa0, rmm
1481 ; RV64IZFINX-LABEL: lround_i32_f32:
1482 ; RV64IZFINX: # %bb.0:
1483 ; RV64IZFINX-NEXT: fcvt.w.s a0, a0, rmm
1484 ; RV64IZFINX-NEXT: ret
1486 ; RV32I-LABEL: lround_i32_f32:
1488 ; RV32I-NEXT: addi sp, sp, -16
1489 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1490 ; RV32I-NEXT: call lroundf
1491 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1492 ; RV32I-NEXT: addi sp, sp, 16
1495 ; RV64I-LABEL: lround_i32_f32:
1497 ; RV64I-NEXT: addi sp, sp, -16
1498 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1499 ; RV64I-NEXT: call lroundf
1500 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1501 ; RV64I-NEXT: addi sp, sp, 16
1503 %1 = call i32 @llvm.lround.i32.f32(float %a)
1507 declare i64 @llvm.llrint.i64.f32(float)
1509 define i64 @llrint_f32(float %a) nounwind {
1510 ; RV32IF-LABEL: llrint_f32:
1512 ; RV32IF-NEXT: addi sp, sp, -16
1513 ; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1514 ; RV32IF-NEXT: call llrintf
1515 ; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1516 ; RV32IF-NEXT: addi sp, sp, 16
1519 ; RV32IZFINX-LABEL: llrint_f32:
1520 ; RV32IZFINX: # %bb.0:
1521 ; RV32IZFINX-NEXT: addi sp, sp, -16
1522 ; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1523 ; RV32IZFINX-NEXT: call llrintf
1524 ; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1525 ; RV32IZFINX-NEXT: addi sp, sp, 16
1526 ; RV32IZFINX-NEXT: ret
1528 ; RV64IF-LABEL: llrint_f32:
1530 ; RV64IF-NEXT: fcvt.l.s a0, fa0
1533 ; RV64IZFINX-LABEL: llrint_f32:
1534 ; RV64IZFINX: # %bb.0:
1535 ; RV64IZFINX-NEXT: fcvt.l.s a0, a0
1536 ; RV64IZFINX-NEXT: ret
1538 ; RV32I-LABEL: llrint_f32:
1540 ; RV32I-NEXT: addi sp, sp, -16
1541 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1542 ; RV32I-NEXT: call llrintf
1543 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1544 ; RV32I-NEXT: addi sp, sp, 16
1547 ; RV64I-LABEL: llrint_f32:
1549 ; RV64I-NEXT: addi sp, sp, -16
1550 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1551 ; RV64I-NEXT: call llrintf
1552 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1553 ; RV64I-NEXT: addi sp, sp, 16
1555 %1 = call i64 @llvm.llrint.i64.f32(float %a)
1559 declare i64 @llvm.llround.i64.f32(float)
1561 define i64 @llround_f32(float %a) nounwind {
1562 ; RV32IF-LABEL: llround_f32:
1564 ; RV32IF-NEXT: addi sp, sp, -16
1565 ; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1566 ; RV32IF-NEXT: call llroundf
1567 ; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1568 ; RV32IF-NEXT: addi sp, sp, 16
1571 ; RV32IZFINX-LABEL: llround_f32:
1572 ; RV32IZFINX: # %bb.0:
1573 ; RV32IZFINX-NEXT: addi sp, sp, -16
1574 ; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1575 ; RV32IZFINX-NEXT: call llroundf
1576 ; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1577 ; RV32IZFINX-NEXT: addi sp, sp, 16
1578 ; RV32IZFINX-NEXT: ret
1580 ; RV64IF-LABEL: llround_f32:
1582 ; RV64IF-NEXT: fcvt.l.s a0, fa0, rmm
1585 ; RV64IZFINX-LABEL: llround_f32:
1586 ; RV64IZFINX: # %bb.0:
1587 ; RV64IZFINX-NEXT: fcvt.l.s a0, a0, rmm
1588 ; RV64IZFINX-NEXT: ret
1590 ; RV32I-LABEL: llround_f32:
1592 ; RV32I-NEXT: addi sp, sp, -16
1593 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
1594 ; RV32I-NEXT: call llroundf
1595 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
1596 ; RV32I-NEXT: addi sp, sp, 16
1599 ; RV64I-LABEL: llround_f32:
1601 ; RV64I-NEXT: addi sp, sp, -16
1602 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
1603 ; RV64I-NEXT: call llroundf
1604 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
1605 ; RV64I-NEXT: addi sp, sp, 16
1607 %1 = call i64 @llvm.llround.i64.f32(float %a)
1611 declare i1 @llvm.is.fpclass.f32(float, i32)
1612 define i1 @fpclass(float %x) {
1613 ; RV32IF-LABEL: fpclass:
1615 ; RV32IF-NEXT: fclass.s a0, fa0
1616 ; RV32IF-NEXT: andi a0, a0, 927
1617 ; RV32IF-NEXT: snez a0, a0
1620 ; RV32IZFINX-LABEL: fpclass:
1621 ; RV32IZFINX: # %bb.0:
1622 ; RV32IZFINX-NEXT: fclass.s a0, a0
1623 ; RV32IZFINX-NEXT: andi a0, a0, 927
1624 ; RV32IZFINX-NEXT: snez a0, a0
1625 ; RV32IZFINX-NEXT: ret
1627 ; RV64IF-LABEL: fpclass:
1629 ; RV64IF-NEXT: fclass.s a0, fa0
1630 ; RV64IF-NEXT: andi a0, a0, 927
1631 ; RV64IF-NEXT: snez a0, a0
1634 ; RV64IZFINX-LABEL: fpclass:
1635 ; RV64IZFINX: # %bb.0:
1636 ; RV64IZFINX-NEXT: fclass.s a0, a0
1637 ; RV64IZFINX-NEXT: andi a0, a0, 927
1638 ; RV64IZFINX-NEXT: snez a0, a0
1639 ; RV64IZFINX-NEXT: ret
1641 ; RV32I-LABEL: fpclass:
1643 ; RV32I-NEXT: slli a1, a0, 1
1644 ; RV32I-NEXT: lui a2, 2048
1645 ; RV32I-NEXT: slti a0, a0, 0
1646 ; RV32I-NEXT: lui a3, 522240
1647 ; RV32I-NEXT: lui a4, 1046528
1648 ; RV32I-NEXT: srli a1, a1, 1
1649 ; RV32I-NEXT: addi a2, a2, -1
1650 ; RV32I-NEXT: addi a5, a1, -1
1651 ; RV32I-NEXT: sltu a2, a5, a2
1652 ; RV32I-NEXT: xor a5, a1, a3
1653 ; RV32I-NEXT: slt a3, a3, a1
1654 ; RV32I-NEXT: add a4, a1, a4
1655 ; RV32I-NEXT: seqz a1, a1
1656 ; RV32I-NEXT: seqz a5, a5
1657 ; RV32I-NEXT: srli a4, a4, 24
1658 ; RV32I-NEXT: and a2, a2, a0
1659 ; RV32I-NEXT: or a1, a1, a5
1660 ; RV32I-NEXT: sltiu a4, a4, 127
1661 ; RV32I-NEXT: or a1, a1, a2
1662 ; RV32I-NEXT: or a1, a1, a3
1663 ; RV32I-NEXT: and a0, a4, a0
1664 ; RV32I-NEXT: or a0, a1, a0
1667 ; RV64I-LABEL: fpclass:
1669 ; RV64I-NEXT: sext.w a1, a0
1670 ; RV64I-NEXT: slli a0, a0, 33
1671 ; RV64I-NEXT: lui a2, 2048
1672 ; RV64I-NEXT: lui a3, 522240
1673 ; RV64I-NEXT: lui a4, 1046528
1674 ; RV64I-NEXT: srli a0, a0, 33
1675 ; RV64I-NEXT: addiw a2, a2, -1
1676 ; RV64I-NEXT: slti a1, a1, 0
1677 ; RV64I-NEXT: addi a5, a0, -1
1678 ; RV64I-NEXT: sltu a2, a5, a2
1679 ; RV64I-NEXT: xor a5, a0, a3
1680 ; RV64I-NEXT: slt a3, a3, a0
1681 ; RV64I-NEXT: add a4, a0, a4
1682 ; RV64I-NEXT: seqz a0, a0
1683 ; RV64I-NEXT: seqz a5, a5
1684 ; RV64I-NEXT: srliw a4, a4, 24
1685 ; RV64I-NEXT: and a2, a2, a1
1686 ; RV64I-NEXT: or a0, a0, a5
1687 ; RV64I-NEXT: sltiu a4, a4, 127
1688 ; RV64I-NEXT: or a0, a0, a2
1689 ; RV64I-NEXT: or a0, a0, a3
1690 ; RV64I-NEXT: and a1, a4, a1
1691 ; RV64I-NEXT: or a0, a0, a1
1693 %cmp = call i1 @llvm.is.fpclass.f32(float %x, i32 639)
1697 define i1 @isnan_fpclass(float %x) {
1698 ; RV32IF-LABEL: isnan_fpclass:
1700 ; RV32IF-NEXT: fclass.s a0, fa0
1701 ; RV32IF-NEXT: andi a0, a0, 768
1702 ; RV32IF-NEXT: snez a0, a0
1705 ; RV32IZFINX-LABEL: isnan_fpclass:
1706 ; RV32IZFINX: # %bb.0:
1707 ; RV32IZFINX-NEXT: fclass.s a0, a0
1708 ; RV32IZFINX-NEXT: andi a0, a0, 768
1709 ; RV32IZFINX-NEXT: snez a0, a0
1710 ; RV32IZFINX-NEXT: ret
1712 ; RV64IF-LABEL: isnan_fpclass:
1714 ; RV64IF-NEXT: fclass.s a0, fa0
1715 ; RV64IF-NEXT: andi a0, a0, 768
1716 ; RV64IF-NEXT: snez a0, a0
1719 ; RV64IZFINX-LABEL: isnan_fpclass:
1720 ; RV64IZFINX: # %bb.0:
1721 ; RV64IZFINX-NEXT: fclass.s a0, a0
1722 ; RV64IZFINX-NEXT: andi a0, a0, 768
1723 ; RV64IZFINX-NEXT: snez a0, a0
1724 ; RV64IZFINX-NEXT: ret
1726 ; RV32I-LABEL: isnan_fpclass:
1728 ; RV32I-NEXT: slli a0, a0, 1
1729 ; RV32I-NEXT: srli a0, a0, 1
1730 ; RV32I-NEXT: lui a1, 522240
1731 ; RV32I-NEXT: slt a0, a1, a0
1734 ; RV64I-LABEL: isnan_fpclass:
1736 ; RV64I-NEXT: slli a0, a0, 33
1737 ; RV64I-NEXT: srli a0, a0, 33
1738 ; RV64I-NEXT: lui a1, 522240
1739 ; RV64I-NEXT: slt a0, a1, a0
1741 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 3) ; nan
1745 define i1 @isqnan_fpclass(float %x) {
1746 ; RV32IF-LABEL: isqnan_fpclass:
1748 ; RV32IF-NEXT: fclass.s a0, fa0
1749 ; RV32IF-NEXT: srli a0, a0, 9
1752 ; RV32IZFINX-LABEL: isqnan_fpclass:
1753 ; RV32IZFINX: # %bb.0:
1754 ; RV32IZFINX-NEXT: fclass.s a0, a0
1755 ; RV32IZFINX-NEXT: srli a0, a0, 9
1756 ; RV32IZFINX-NEXT: ret
1758 ; RV64IF-LABEL: isqnan_fpclass:
1760 ; RV64IF-NEXT: fclass.s a0, fa0
1761 ; RV64IF-NEXT: srli a0, a0, 9
1764 ; RV64IZFINX-LABEL: isqnan_fpclass:
1765 ; RV64IZFINX: # %bb.0:
1766 ; RV64IZFINX-NEXT: fclass.s a0, a0
1767 ; RV64IZFINX-NEXT: srli a0, a0, 9
1768 ; RV64IZFINX-NEXT: ret
1770 ; RV32I-LABEL: isqnan_fpclass:
1772 ; RV32I-NEXT: slli a0, a0, 1
1773 ; RV32I-NEXT: lui a1, 523264
1774 ; RV32I-NEXT: srli a0, a0, 1
1775 ; RV32I-NEXT: addi a1, a1, -1
1776 ; RV32I-NEXT: slt a0, a1, a0
1779 ; RV64I-LABEL: isqnan_fpclass:
1781 ; RV64I-NEXT: slli a0, a0, 33
1782 ; RV64I-NEXT: lui a1, 523264
1783 ; RV64I-NEXT: srli a0, a0, 33
1784 ; RV64I-NEXT: addiw a1, a1, -1
1785 ; RV64I-NEXT: slt a0, a1, a0
1787 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 2) ; qnan
1791 define i1 @issnan_fpclass(float %x) {
1792 ; RV32IF-LABEL: issnan_fpclass:
1794 ; RV32IF-NEXT: fclass.s a0, fa0
1795 ; RV32IF-NEXT: slli a0, a0, 23
1796 ; RV32IF-NEXT: srli a0, a0, 31
1799 ; RV32IZFINX-LABEL: issnan_fpclass:
1800 ; RV32IZFINX: # %bb.0:
1801 ; RV32IZFINX-NEXT: fclass.s a0, a0
1802 ; RV32IZFINX-NEXT: slli a0, a0, 23
1803 ; RV32IZFINX-NEXT: srli a0, a0, 31
1804 ; RV32IZFINX-NEXT: ret
1806 ; RV64IF-LABEL: issnan_fpclass:
1808 ; RV64IF-NEXT: fclass.s a0, fa0
1809 ; RV64IF-NEXT: slli a0, a0, 55
1810 ; RV64IF-NEXT: srli a0, a0, 63
1813 ; RV64IZFINX-LABEL: issnan_fpclass:
1814 ; RV64IZFINX: # %bb.0:
1815 ; RV64IZFINX-NEXT: fclass.s a0, a0
1816 ; RV64IZFINX-NEXT: slli a0, a0, 55
1817 ; RV64IZFINX-NEXT: srli a0, a0, 63
1818 ; RV64IZFINX-NEXT: ret
1820 ; RV32I-LABEL: issnan_fpclass:
1822 ; RV32I-NEXT: slli a0, a0, 1
1823 ; RV32I-NEXT: lui a1, 523264
1824 ; RV32I-NEXT: lui a2, 522240
1825 ; RV32I-NEXT: srli a0, a0, 1
1826 ; RV32I-NEXT: slt a1, a0, a1
1827 ; RV32I-NEXT: slt a0, a2, a0
1828 ; RV32I-NEXT: and a0, a0, a1
1831 ; RV64I-LABEL: issnan_fpclass:
1833 ; RV64I-NEXT: slli a0, a0, 33
1834 ; RV64I-NEXT: lui a1, 523264
1835 ; RV64I-NEXT: lui a2, 522240
1836 ; RV64I-NEXT: srli a0, a0, 33
1837 ; RV64I-NEXT: slt a1, a0, a1
1838 ; RV64I-NEXT: slt a0, a2, a0
1839 ; RV64I-NEXT: and a0, a0, a1
1841 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 1) ; snan
1845 define i1 @isinf_fpclass(float %x) {
1846 ; RV32IF-LABEL: isinf_fpclass:
1848 ; RV32IF-NEXT: fclass.s a0, fa0
1849 ; RV32IF-NEXT: andi a0, a0, 129
1850 ; RV32IF-NEXT: snez a0, a0
1853 ; RV32IZFINX-LABEL: isinf_fpclass:
1854 ; RV32IZFINX: # %bb.0:
1855 ; RV32IZFINX-NEXT: fclass.s a0, a0
1856 ; RV32IZFINX-NEXT: andi a0, a0, 129
1857 ; RV32IZFINX-NEXT: snez a0, a0
1858 ; RV32IZFINX-NEXT: ret
1860 ; RV64IF-LABEL: isinf_fpclass:
1862 ; RV64IF-NEXT: fclass.s a0, fa0
1863 ; RV64IF-NEXT: andi a0, a0, 129
1864 ; RV64IF-NEXT: snez a0, a0
1867 ; RV64IZFINX-LABEL: isinf_fpclass:
1868 ; RV64IZFINX: # %bb.0:
1869 ; RV64IZFINX-NEXT: fclass.s a0, a0
1870 ; RV64IZFINX-NEXT: andi a0, a0, 129
1871 ; RV64IZFINX-NEXT: snez a0, a0
1872 ; RV64IZFINX-NEXT: ret
1874 ; RV32I-LABEL: isinf_fpclass:
1876 ; RV32I-NEXT: slli a0, a0, 1
1877 ; RV32I-NEXT: srli a0, a0, 1
1878 ; RV32I-NEXT: lui a1, 522240
1879 ; RV32I-NEXT: xor a0, a0, a1
1880 ; RV32I-NEXT: seqz a0, a0
1883 ; RV64I-LABEL: isinf_fpclass:
1885 ; RV64I-NEXT: slli a0, a0, 33
1886 ; RV64I-NEXT: srli a0, a0, 33
1887 ; RV64I-NEXT: lui a1, 522240
1888 ; RV64I-NEXT: xor a0, a0, a1
1889 ; RV64I-NEXT: seqz a0, a0
1891 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 516) ; 0x204 = "inf"
1895 define i1 @isposinf_fpclass(float %x) {
1896 ; RV32IF-LABEL: isposinf_fpclass:
1898 ; RV32IF-NEXT: fclass.s a0, fa0
1899 ; RV32IF-NEXT: slli a0, a0, 24
1900 ; RV32IF-NEXT: srli a0, a0, 31
1903 ; RV32IZFINX-LABEL: isposinf_fpclass:
1904 ; RV32IZFINX: # %bb.0:
1905 ; RV32IZFINX-NEXT: fclass.s a0, a0
1906 ; RV32IZFINX-NEXT: slli a0, a0, 24
1907 ; RV32IZFINX-NEXT: srli a0, a0, 31
1908 ; RV32IZFINX-NEXT: ret
1910 ; RV64IF-LABEL: isposinf_fpclass:
1912 ; RV64IF-NEXT: fclass.s a0, fa0
1913 ; RV64IF-NEXT: slli a0, a0, 56
1914 ; RV64IF-NEXT: srli a0, a0, 63
1917 ; RV64IZFINX-LABEL: isposinf_fpclass:
1918 ; RV64IZFINX: # %bb.0:
1919 ; RV64IZFINX-NEXT: fclass.s a0, a0
1920 ; RV64IZFINX-NEXT: slli a0, a0, 56
1921 ; RV64IZFINX-NEXT: srli a0, a0, 63
1922 ; RV64IZFINX-NEXT: ret
1924 ; RV32I-LABEL: isposinf_fpclass:
1926 ; RV32I-NEXT: lui a1, 522240
1927 ; RV32I-NEXT: xor a0, a0, a1
1928 ; RV32I-NEXT: seqz a0, a0
1931 ; RV64I-LABEL: isposinf_fpclass:
1933 ; RV64I-NEXT: sext.w a0, a0
1934 ; RV64I-NEXT: lui a1, 522240
1935 ; RV64I-NEXT: xor a0, a0, a1
1936 ; RV64I-NEXT: seqz a0, a0
1938 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 512) ; 0x200 = "+inf"
1942 define i1 @isneginf_fpclass(float %x) {
1943 ; RV32IF-LABEL: isneginf_fpclass:
1945 ; RV32IF-NEXT: fclass.s a0, fa0
1946 ; RV32IF-NEXT: andi a0, a0, 1
1949 ; RV32IZFINX-LABEL: isneginf_fpclass:
1950 ; RV32IZFINX: # %bb.0:
1951 ; RV32IZFINX-NEXT: fclass.s a0, a0
1952 ; RV32IZFINX-NEXT: andi a0, a0, 1
1953 ; RV32IZFINX-NEXT: ret
1955 ; RV64IF-LABEL: isneginf_fpclass:
1957 ; RV64IF-NEXT: fclass.s a0, fa0
1958 ; RV64IF-NEXT: andi a0, a0, 1
1961 ; RV64IZFINX-LABEL: isneginf_fpclass:
1962 ; RV64IZFINX: # %bb.0:
1963 ; RV64IZFINX-NEXT: fclass.s a0, a0
1964 ; RV64IZFINX-NEXT: andi a0, a0, 1
1965 ; RV64IZFINX-NEXT: ret
1967 ; RV32I-LABEL: isneginf_fpclass:
1969 ; RV32I-NEXT: lui a1, 1046528
1970 ; RV32I-NEXT: xor a0, a0, a1
1971 ; RV32I-NEXT: seqz a0, a0
1974 ; RV64I-LABEL: isneginf_fpclass:
1976 ; RV64I-NEXT: sext.w a0, a0
1977 ; RV64I-NEXT: lui a1, 1046528
1978 ; RV64I-NEXT: xor a0, a0, a1
1979 ; RV64I-NEXT: seqz a0, a0
1981 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 4) ; "-inf"
1985 define i1 @isfinite_fpclass(float %x) {
1986 ; RV32IF-LABEL: isfinite_fpclass:
1988 ; RV32IF-NEXT: fclass.s a0, fa0
1989 ; RV32IF-NEXT: andi a0, a0, 126
1990 ; RV32IF-NEXT: snez a0, a0
1993 ; RV32IZFINX-LABEL: isfinite_fpclass:
1994 ; RV32IZFINX: # %bb.0:
1995 ; RV32IZFINX-NEXT: fclass.s a0, a0
1996 ; RV32IZFINX-NEXT: andi a0, a0, 126
1997 ; RV32IZFINX-NEXT: snez a0, a0
1998 ; RV32IZFINX-NEXT: ret
2000 ; RV64IF-LABEL: isfinite_fpclass:
2002 ; RV64IF-NEXT: fclass.s a0, fa0
2003 ; RV64IF-NEXT: andi a0, a0, 126
2004 ; RV64IF-NEXT: snez a0, a0
2007 ; RV64IZFINX-LABEL: isfinite_fpclass:
2008 ; RV64IZFINX: # %bb.0:
2009 ; RV64IZFINX-NEXT: fclass.s a0, a0
2010 ; RV64IZFINX-NEXT: andi a0, a0, 126
2011 ; RV64IZFINX-NEXT: snez a0, a0
2012 ; RV64IZFINX-NEXT: ret
2014 ; RV32I-LABEL: isfinite_fpclass:
2016 ; RV32I-NEXT: slli a0, a0, 1
2017 ; RV32I-NEXT: srli a0, a0, 1
2018 ; RV32I-NEXT: lui a1, 522240
2019 ; RV32I-NEXT: slt a0, a0, a1
2022 ; RV64I-LABEL: isfinite_fpclass:
2024 ; RV64I-NEXT: slli a0, a0, 33
2025 ; RV64I-NEXT: srli a0, a0, 33
2026 ; RV64I-NEXT: lui a1, 522240
2027 ; RV64I-NEXT: slt a0, a0, a1
2029 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; 0x1f8 = "finite"
2033 define i1 @isposfinite_fpclass(float %x) {
2034 ; RV32IF-LABEL: isposfinite_fpclass:
2036 ; RV32IF-NEXT: fclass.s a0, fa0
2037 ; RV32IF-NEXT: andi a0, a0, 112
2038 ; RV32IF-NEXT: snez a0, a0
2041 ; RV32IZFINX-LABEL: isposfinite_fpclass:
2042 ; RV32IZFINX: # %bb.0:
2043 ; RV32IZFINX-NEXT: fclass.s a0, a0
2044 ; RV32IZFINX-NEXT: andi a0, a0, 112
2045 ; RV32IZFINX-NEXT: snez a0, a0
2046 ; RV32IZFINX-NEXT: ret
2048 ; RV64IF-LABEL: isposfinite_fpclass:
2050 ; RV64IF-NEXT: fclass.s a0, fa0
2051 ; RV64IF-NEXT: andi a0, a0, 112
2052 ; RV64IF-NEXT: snez a0, a0
2055 ; RV64IZFINX-LABEL: isposfinite_fpclass:
2056 ; RV64IZFINX: # %bb.0:
2057 ; RV64IZFINX-NEXT: fclass.s a0, a0
2058 ; RV64IZFINX-NEXT: andi a0, a0, 112
2059 ; RV64IZFINX-NEXT: snez a0, a0
2060 ; RV64IZFINX-NEXT: ret
2062 ; RV32I-LABEL: isposfinite_fpclass:
2064 ; RV32I-NEXT: srli a0, a0, 23
2065 ; RV32I-NEXT: sltiu a0, a0, 255
2068 ; RV64I-LABEL: isposfinite_fpclass:
2070 ; RV64I-NEXT: srliw a0, a0, 23
2071 ; RV64I-NEXT: sltiu a0, a0, 255
2073 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 448) ; 0x1c0 = "+finite"
2077 define i1 @isnegfinite_fpclass(float %x) {
2078 ; RV32IF-LABEL: isnegfinite_fpclass:
2080 ; RV32IF-NEXT: fclass.s a0, fa0
2081 ; RV32IF-NEXT: andi a0, a0, 14
2082 ; RV32IF-NEXT: snez a0, a0
2085 ; RV32IZFINX-LABEL: isnegfinite_fpclass:
2086 ; RV32IZFINX: # %bb.0:
2087 ; RV32IZFINX-NEXT: fclass.s a0, a0
2088 ; RV32IZFINX-NEXT: andi a0, a0, 14
2089 ; RV32IZFINX-NEXT: snez a0, a0
2090 ; RV32IZFINX-NEXT: ret
2092 ; RV64IF-LABEL: isnegfinite_fpclass:
2094 ; RV64IF-NEXT: fclass.s a0, fa0
2095 ; RV64IF-NEXT: andi a0, a0, 14
2096 ; RV64IF-NEXT: snez a0, a0
2099 ; RV64IZFINX-LABEL: isnegfinite_fpclass:
2100 ; RV64IZFINX: # %bb.0:
2101 ; RV64IZFINX-NEXT: fclass.s a0, a0
2102 ; RV64IZFINX-NEXT: andi a0, a0, 14
2103 ; RV64IZFINX-NEXT: snez a0, a0
2104 ; RV64IZFINX-NEXT: ret
2106 ; RV32I-LABEL: isnegfinite_fpclass:
2108 ; RV32I-NEXT: slli a1, a0, 1
2109 ; RV32I-NEXT: lui a2, 522240
2110 ; RV32I-NEXT: srli a1, a1, 1
2111 ; RV32I-NEXT: slt a1, a1, a2
2112 ; RV32I-NEXT: slti a0, a0, 0
2113 ; RV32I-NEXT: and a0, a1, a0
2116 ; RV64I-LABEL: isnegfinite_fpclass:
2118 ; RV64I-NEXT: sext.w a1, a0
2119 ; RV64I-NEXT: slli a0, a0, 33
2120 ; RV64I-NEXT: lui a2, 522240
2121 ; RV64I-NEXT: srli a0, a0, 33
2122 ; RV64I-NEXT: slt a0, a0, a2
2123 ; RV64I-NEXT: slti a1, a1, 0
2124 ; RV64I-NEXT: and a0, a0, a1
2126 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 56) ; 0x38 = "-finite"
2130 define i1 @isnotfinite_fpclass(float %x) {
2131 ; RV32IF-LABEL: isnotfinite_fpclass:
2133 ; RV32IF-NEXT: fclass.s a0, fa0
2134 ; RV32IF-NEXT: andi a0, a0, 897
2135 ; RV32IF-NEXT: snez a0, a0
2138 ; RV32IZFINX-LABEL: isnotfinite_fpclass:
2139 ; RV32IZFINX: # %bb.0:
2140 ; RV32IZFINX-NEXT: fclass.s a0, a0
2141 ; RV32IZFINX-NEXT: andi a0, a0, 897
2142 ; RV32IZFINX-NEXT: snez a0, a0
2143 ; RV32IZFINX-NEXT: ret
2145 ; RV64IF-LABEL: isnotfinite_fpclass:
2147 ; RV64IF-NEXT: fclass.s a0, fa0
2148 ; RV64IF-NEXT: andi a0, a0, 897
2149 ; RV64IF-NEXT: snez a0, a0
2152 ; RV64IZFINX-LABEL: isnotfinite_fpclass:
2153 ; RV64IZFINX: # %bb.0:
2154 ; RV64IZFINX-NEXT: fclass.s a0, a0
2155 ; RV64IZFINX-NEXT: andi a0, a0, 897
2156 ; RV64IZFINX-NEXT: snez a0, a0
2157 ; RV64IZFINX-NEXT: ret
2159 ; RV32I-LABEL: isnotfinite_fpclass:
2161 ; RV32I-NEXT: slli a0, a0, 1
2162 ; RV32I-NEXT: lui a1, 522240
2163 ; RV32I-NEXT: srli a0, a0, 1
2164 ; RV32I-NEXT: addi a1, a1, -1
2165 ; RV32I-NEXT: slt a0, a1, a0
2168 ; RV64I-LABEL: isnotfinite_fpclass:
2170 ; RV64I-NEXT: slli a0, a0, 33
2171 ; RV64I-NEXT: lui a1, 522240
2172 ; RV64I-NEXT: srli a0, a0, 33
2173 ; RV64I-NEXT: addiw a1, a1, -1
2174 ; RV64I-NEXT: slt a0, a1, a0
2176 %1 = call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; ox207 = "inf|nan"
2180 define float @tan_f32(float %a) nounwind {
2181 ; RV32IF-LABEL: tan_f32:
2183 ; RV32IF-NEXT: tail tanf
2185 ; RV32IZFINX-LABEL: tan_f32:
2186 ; RV32IZFINX: # %bb.0:
2187 ; RV32IZFINX-NEXT: tail tanf
2189 ; RV64IF-LABEL: tan_f32:
2191 ; RV64IF-NEXT: tail tanf
2193 ; RV64IZFINX-LABEL: tan_f32:
2194 ; RV64IZFINX: # %bb.0:
2195 ; RV64IZFINX-NEXT: tail tanf
2197 ; RV32I-LABEL: tan_f32:
2199 ; RV32I-NEXT: addi sp, sp, -16
2200 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2201 ; RV32I-NEXT: call tanf
2202 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2203 ; RV32I-NEXT: addi sp, sp, 16
2206 ; RV64I-LABEL: tan_f32:
2208 ; RV64I-NEXT: addi sp, sp, -16
2209 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2210 ; RV64I-NEXT: call tanf
2211 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2212 ; RV64I-NEXT: addi sp, sp, 16
2214 %1 = call float @llvm.tan.f32(float %a)
2218 declare float @llvm.maximumnum.f32(float, float)
2220 define float @maximumnum_float(float %x, float %y) {
2221 ; RV32IF-LABEL: maximumnum_float:
2223 ; RV32IF-NEXT: fmax.s fa0, fa0, fa1
2226 ; RV32IZFINX-LABEL: maximumnum_float:
2227 ; RV32IZFINX: # %bb.0:
2228 ; RV32IZFINX-NEXT: fmax.s a0, a0, a1
2229 ; RV32IZFINX-NEXT: ret
2231 ; RV64IF-LABEL: maximumnum_float:
2233 ; RV64IF-NEXT: fmax.s fa0, fa0, fa1
2236 ; RV64IZFINX-LABEL: maximumnum_float:
2237 ; RV64IZFINX: # %bb.0:
2238 ; RV64IZFINX-NEXT: fmax.s a0, a0, a1
2239 ; RV64IZFINX-NEXT: ret
2241 ; RV32I-LABEL: maximumnum_float:
2243 ; RV32I-NEXT: addi sp, sp, -16
2244 ; RV32I-NEXT: .cfi_def_cfa_offset 16
2245 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2246 ; RV32I-NEXT: .cfi_offset ra, -4
2247 ; RV32I-NEXT: call fmaximum_numf
2248 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2249 ; RV32I-NEXT: .cfi_restore ra
2250 ; RV32I-NEXT: addi sp, sp, 16
2251 ; RV32I-NEXT: .cfi_def_cfa_offset 0
2254 ; RV64I-LABEL: maximumnum_float:
2256 ; RV64I-NEXT: addi sp, sp, -16
2257 ; RV64I-NEXT: .cfi_def_cfa_offset 16
2258 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2259 ; RV64I-NEXT: .cfi_offset ra, -8
2260 ; RV64I-NEXT: call fmaximum_numf
2261 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2262 ; RV64I-NEXT: .cfi_restore ra
2263 ; RV64I-NEXT: addi sp, sp, 16
2264 ; RV64I-NEXT: .cfi_def_cfa_offset 0
2266 %z = call float @llvm.maximumnum.f32(float %x, float %y)
2270 declare float @llvm.minimumnum.f32(float, float)
2272 define float @minimumnum_float(float %x, float %y) {
2273 ; RV32IF-LABEL: minimumnum_float:
2275 ; RV32IF-NEXT: fmin.s fa0, fa0, fa1
2278 ; RV32IZFINX-LABEL: minimumnum_float:
2279 ; RV32IZFINX: # %bb.0:
2280 ; RV32IZFINX-NEXT: fmin.s a0, a0, a1
2281 ; RV32IZFINX-NEXT: ret
2283 ; RV64IF-LABEL: minimumnum_float:
2285 ; RV64IF-NEXT: fmin.s fa0, fa0, fa1
2288 ; RV64IZFINX-LABEL: minimumnum_float:
2289 ; RV64IZFINX: # %bb.0:
2290 ; RV64IZFINX-NEXT: fmin.s a0, a0, a1
2291 ; RV64IZFINX-NEXT: ret
2293 ; RV32I-LABEL: minimumnum_float:
2295 ; RV32I-NEXT: addi sp, sp, -16
2296 ; RV32I-NEXT: .cfi_def_cfa_offset 16
2297 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2298 ; RV32I-NEXT: .cfi_offset ra, -4
2299 ; RV32I-NEXT: call fminimum_numf
2300 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2301 ; RV32I-NEXT: .cfi_restore ra
2302 ; RV32I-NEXT: addi sp, sp, 16
2303 ; RV32I-NEXT: .cfi_def_cfa_offset 0
2306 ; RV64I-LABEL: minimumnum_float:
2308 ; RV64I-NEXT: addi sp, sp, -16
2309 ; RV64I-NEXT: .cfi_def_cfa_offset 16
2310 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2311 ; RV64I-NEXT: .cfi_offset ra, -8
2312 ; RV64I-NEXT: call fminimum_numf
2313 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2314 ; RV64I-NEXT: .cfi_restore ra
2315 ; RV64I-NEXT: addi sp, sp, 16
2316 ; RV64I-NEXT: .cfi_def_cfa_offset 0
2318 %z = call float @llvm.minimumnum.f32(float %x, float %y)
2322 define float @ldexp_float(float %x, i32 signext %y) nounwind {
2323 ; RV32IF-LABEL: ldexp_float:
2325 ; RV32IF-NEXT: tail ldexpf
2327 ; RV32IZFINX-LABEL: ldexp_float:
2328 ; RV32IZFINX: # %bb.0:
2329 ; RV32IZFINX-NEXT: tail ldexpf
2331 ; RV64IF-LABEL: ldexp_float:
2333 ; RV64IF-NEXT: addi sp, sp, -16
2334 ; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2335 ; RV64IF-NEXT: call ldexpf
2336 ; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2337 ; RV64IF-NEXT: addi sp, sp, 16
2340 ; RV64IZFINX-LABEL: ldexp_float:
2341 ; RV64IZFINX: # %bb.0:
2342 ; RV64IZFINX-NEXT: addi sp, sp, -16
2343 ; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2344 ; RV64IZFINX-NEXT: call ldexpf
2345 ; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2346 ; RV64IZFINX-NEXT: addi sp, sp, 16
2347 ; RV64IZFINX-NEXT: ret
2349 ; RV32I-LABEL: ldexp_float:
2351 ; RV32I-NEXT: addi sp, sp, -16
2352 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2353 ; RV32I-NEXT: call ldexpf
2354 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2355 ; RV32I-NEXT: addi sp, sp, 16
2358 ; RV64I-LABEL: ldexp_float:
2360 ; RV64I-NEXT: addi sp, sp, -16
2361 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2362 ; RV64I-NEXT: call ldexpf
2363 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2364 ; RV64I-NEXT: addi sp, sp, 16
2366 %z = call float @llvm.ldexp.f32.i32(float %x, i32 %y)
2370 define {float, i32} @frexp_float(float %x) nounwind {
2371 ; RV32IF-LABEL: frexp_float:
2373 ; RV32IF-NEXT: addi sp, sp, -16
2374 ; RV32IF-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2375 ; RV32IF-NEXT: addi a0, sp, 8
2376 ; RV32IF-NEXT: call frexpf
2377 ; RV32IF-NEXT: lw a0, 8(sp)
2378 ; RV32IF-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2379 ; RV32IF-NEXT: addi sp, sp, 16
2382 ; RV32IZFINX-LABEL: frexp_float:
2383 ; RV32IZFINX: # %bb.0:
2384 ; RV32IZFINX-NEXT: addi sp, sp, -16
2385 ; RV32IZFINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2386 ; RV32IZFINX-NEXT: addi a1, sp, 8
2387 ; RV32IZFINX-NEXT: call frexpf
2388 ; RV32IZFINX-NEXT: lw a1, 8(sp)
2389 ; RV32IZFINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2390 ; RV32IZFINX-NEXT: addi sp, sp, 16
2391 ; RV32IZFINX-NEXT: ret
2393 ; RV64IF-LABEL: frexp_float:
2395 ; RV64IF-NEXT: addi sp, sp, -16
2396 ; RV64IF-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2397 ; RV64IF-NEXT: mv a0, sp
2398 ; RV64IF-NEXT: call frexpf
2399 ; RV64IF-NEXT: ld a0, 0(sp)
2400 ; RV64IF-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2401 ; RV64IF-NEXT: addi sp, sp, 16
2404 ; RV64IZFINX-LABEL: frexp_float:
2405 ; RV64IZFINX: # %bb.0:
2406 ; RV64IZFINX-NEXT: addi sp, sp, -16
2407 ; RV64IZFINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2408 ; RV64IZFINX-NEXT: mv a1, sp
2409 ; RV64IZFINX-NEXT: call frexpf
2410 ; RV64IZFINX-NEXT: ld a1, 0(sp)
2411 ; RV64IZFINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2412 ; RV64IZFINX-NEXT: addi sp, sp, 16
2413 ; RV64IZFINX-NEXT: ret
2415 ; RV32I-LABEL: frexp_float:
2417 ; RV32I-NEXT: addi sp, sp, -16
2418 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2419 ; RV32I-NEXT: addi a1, sp, 8
2420 ; RV32I-NEXT: call frexpf
2421 ; RV32I-NEXT: lw a1, 8(sp)
2422 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2423 ; RV32I-NEXT: addi sp, sp, 16
2426 ; RV64I-LABEL: frexp_float:
2428 ; RV64I-NEXT: addi sp, sp, -16
2429 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2430 ; RV64I-NEXT: addi a1, sp, 4
2431 ; RV64I-NEXT: call frexpf
2432 ; RV64I-NEXT: lw a1, 4(sp)
2433 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2434 ; RV64I-NEXT: addi sp, sp, 16
2436 %a = call {float, i32} @llvm.frexp.f32.i32(float %x)
2440 define float @asin_f32(float %a) nounwind {
2441 ; RV32IF-LABEL: asin_f32:
2443 ; RV32IF-NEXT: tail asinf
2445 ; RV32IZFINX-LABEL: asin_f32:
2446 ; RV32IZFINX: # %bb.0:
2447 ; RV32IZFINX-NEXT: tail asinf
2449 ; RV64IF-LABEL: asin_f32:
2451 ; RV64IF-NEXT: tail asinf
2453 ; RV64IZFINX-LABEL: asin_f32:
2454 ; RV64IZFINX: # %bb.0:
2455 ; RV64IZFINX-NEXT: tail asinf
2457 ; RV32I-LABEL: asin_f32:
2459 ; RV32I-NEXT: addi sp, sp, -16
2460 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2461 ; RV32I-NEXT: call asinf
2462 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2463 ; RV32I-NEXT: addi sp, sp, 16
2466 ; RV64I-LABEL: asin_f32:
2468 ; RV64I-NEXT: addi sp, sp, -16
2469 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2470 ; RV64I-NEXT: call asinf
2471 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2472 ; RV64I-NEXT: addi sp, sp, 16
2474 %1 = call float @llvm.asin.f32(float %a)
2478 define float @acos_f32(float %a) nounwind {
2479 ; RV32IF-LABEL: acos_f32:
2481 ; RV32IF-NEXT: tail acosf
2483 ; RV32IZFINX-LABEL: acos_f32:
2484 ; RV32IZFINX: # %bb.0:
2485 ; RV32IZFINX-NEXT: tail acosf
2487 ; RV64IF-LABEL: acos_f32:
2489 ; RV64IF-NEXT: tail acosf
2491 ; RV64IZFINX-LABEL: acos_f32:
2492 ; RV64IZFINX: # %bb.0:
2493 ; RV64IZFINX-NEXT: tail acosf
2495 ; RV32I-LABEL: acos_f32:
2497 ; RV32I-NEXT: addi sp, sp, -16
2498 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2499 ; RV32I-NEXT: call acosf
2500 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2501 ; RV32I-NEXT: addi sp, sp, 16
2504 ; RV64I-LABEL: acos_f32:
2506 ; RV64I-NEXT: addi sp, sp, -16
2507 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2508 ; RV64I-NEXT: call acosf
2509 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2510 ; RV64I-NEXT: addi sp, sp, 16
2512 %1 = call float @llvm.acos.f32(float %a)
2516 define float @atan_f32(float %a) nounwind {
2517 ; RV32IF-LABEL: atan_f32:
2519 ; RV32IF-NEXT: tail atanf
2521 ; RV32IZFINX-LABEL: atan_f32:
2522 ; RV32IZFINX: # %bb.0:
2523 ; RV32IZFINX-NEXT: tail atanf
2525 ; RV64IF-LABEL: atan_f32:
2527 ; RV64IF-NEXT: tail atanf
2529 ; RV64IZFINX-LABEL: atan_f32:
2530 ; RV64IZFINX: # %bb.0:
2531 ; RV64IZFINX-NEXT: tail atanf
2533 ; RV32I-LABEL: atan_f32:
2535 ; RV32I-NEXT: addi sp, sp, -16
2536 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2537 ; RV32I-NEXT: call atanf
2538 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2539 ; RV32I-NEXT: addi sp, sp, 16
2542 ; RV64I-LABEL: atan_f32:
2544 ; RV64I-NEXT: addi sp, sp, -16
2545 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2546 ; RV64I-NEXT: call atanf
2547 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2548 ; RV64I-NEXT: addi sp, sp, 16
2550 %1 = call float @llvm.atan.f32(float %a)
2554 define float @atan2_f32(float %a, float %b) nounwind {
2555 ; RV32IF-LABEL: atan2_f32:
2557 ; RV32IF-NEXT: tail atan2f
2559 ; RV32IZFINX-LABEL: atan2_f32:
2560 ; RV32IZFINX: # %bb.0:
2561 ; RV32IZFINX-NEXT: tail atan2f
2563 ; RV64IF-LABEL: atan2_f32:
2565 ; RV64IF-NEXT: tail atan2f
2567 ; RV64IZFINX-LABEL: atan2_f32:
2568 ; RV64IZFINX: # %bb.0:
2569 ; RV64IZFINX-NEXT: tail atan2f
2571 ; RV32I-LABEL: atan2_f32:
2573 ; RV32I-NEXT: addi sp, sp, -16
2574 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2575 ; RV32I-NEXT: call atan2f
2576 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2577 ; RV32I-NEXT: addi sp, sp, 16
2580 ; RV64I-LABEL: atan2_f32:
2582 ; RV64I-NEXT: addi sp, sp, -16
2583 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2584 ; RV64I-NEXT: call atan2f
2585 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2586 ; RV64I-NEXT: addi sp, sp, 16
2588 %1 = call float @llvm.atan2.f32(float %a, float %b)
2592 define float @sinh_f32(float %a) nounwind {
2593 ; RV32IF-LABEL: sinh_f32:
2595 ; RV32IF-NEXT: tail sinhf
2597 ; RV32IZFINX-LABEL: sinh_f32:
2598 ; RV32IZFINX: # %bb.0:
2599 ; RV32IZFINX-NEXT: tail sinhf
2601 ; RV64IF-LABEL: sinh_f32:
2603 ; RV64IF-NEXT: tail sinhf
2605 ; RV64IZFINX-LABEL: sinh_f32:
2606 ; RV64IZFINX: # %bb.0:
2607 ; RV64IZFINX-NEXT: tail sinhf
2609 ; RV32I-LABEL: sinh_f32:
2611 ; RV32I-NEXT: addi sp, sp, -16
2612 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2613 ; RV32I-NEXT: call sinhf
2614 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2615 ; RV32I-NEXT: addi sp, sp, 16
2618 ; RV64I-LABEL: sinh_f32:
2620 ; RV64I-NEXT: addi sp, sp, -16
2621 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2622 ; RV64I-NEXT: call sinhf
2623 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2624 ; RV64I-NEXT: addi sp, sp, 16
2626 %1 = call float @llvm.sinh.f32(float %a)
2630 define float @cosh_f32(float %a) nounwind {
2631 ; RV32IF-LABEL: cosh_f32:
2633 ; RV32IF-NEXT: tail coshf
2635 ; RV32IZFINX-LABEL: cosh_f32:
2636 ; RV32IZFINX: # %bb.0:
2637 ; RV32IZFINX-NEXT: tail coshf
2639 ; RV64IF-LABEL: cosh_f32:
2641 ; RV64IF-NEXT: tail coshf
2643 ; RV64IZFINX-LABEL: cosh_f32:
2644 ; RV64IZFINX: # %bb.0:
2645 ; RV64IZFINX-NEXT: tail coshf
2647 ; RV32I-LABEL: cosh_f32:
2649 ; RV32I-NEXT: addi sp, sp, -16
2650 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2651 ; RV32I-NEXT: call coshf
2652 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2653 ; RV32I-NEXT: addi sp, sp, 16
2656 ; RV64I-LABEL: cosh_f32:
2658 ; RV64I-NEXT: addi sp, sp, -16
2659 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2660 ; RV64I-NEXT: call coshf
2661 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2662 ; RV64I-NEXT: addi sp, sp, 16
2664 %1 = call float @llvm.cosh.f32(float %a)
2668 define float @tanh_f32(float %a) nounwind {
2669 ; RV32IF-LABEL: tanh_f32:
2671 ; RV32IF-NEXT: tail tanhf
2673 ; RV32IZFINX-LABEL: tanh_f32:
2674 ; RV32IZFINX: # %bb.0:
2675 ; RV32IZFINX-NEXT: tail tanhf
2677 ; RV64IF-LABEL: tanh_f32:
2679 ; RV64IF-NEXT: tail tanhf
2681 ; RV64IZFINX-LABEL: tanh_f32:
2682 ; RV64IZFINX: # %bb.0:
2683 ; RV64IZFINX-NEXT: tail tanhf
2685 ; RV32I-LABEL: tanh_f32:
2687 ; RV32I-NEXT: addi sp, sp, -16
2688 ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
2689 ; RV32I-NEXT: call tanhf
2690 ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
2691 ; RV32I-NEXT: addi sp, sp, 16
2694 ; RV64I-LABEL: tanh_f32:
2696 ; RV64I-NEXT: addi sp, sp, -16
2697 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
2698 ; RV64I-NEXT: call tanhf
2699 ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
2700 ; RV64I-NEXT: addi sp, sp, 16
2702 %1 = call float @llvm.tanh.f32(float %a)