xref: /llvm-project/llvm/test/CodeGen/RISCV/float-maximum-minimum.ll (revision 5a08acc1e7874a6cb4b273988b83e587e6fea605)
149429783SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
249429783SCraig Topper; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+f \
349429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=ilp32f \
449429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IF %s
549429783SCraig Topper; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfinx \
649429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=ilp32 \
749429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IZFINX %s
849429783SCraig Topper; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+d \
949429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=ilp32f \
1049429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV32IF %s
11*5a08acc1SAlex Bradbury; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 \
12*5a08acc1SAlex Bradbury; RUN:   -verify-machineinstrs -target-abi=ilp32 \
13*5a08acc1SAlex Bradbury; RUN:   | FileCheck -check-prefix=RV32I %s
1449429783SCraig Topper; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+f \
1549429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=lp64f \
1649429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV64IF %s
1749429783SCraig Topper; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfinx \
1849429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=lp64 \
1949429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV64IZFINX %s
2049429783SCraig Topper; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+d \
2149429783SCraig Topper; RUN:   -verify-machineinstrs -target-abi=lp64d \
2249429783SCraig Topper; RUN:   | FileCheck -check-prefix=RV64IF %s
23*5a08acc1SAlex Bradbury; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 \
24*5a08acc1SAlex Bradbury; RUN:   -verify-machineinstrs -target-abi=lp64 \
25*5a08acc1SAlex Bradbury; RUN:   | FileCheck -check-prefix=RV64I %s
2649429783SCraig Topper
2749429783SCraig Topperdeclare float @llvm.minimum.f32(float, float)
2849429783SCraig Topper
2949429783SCraig Topperdefine float @fminimum_f32(float %a, float %b) nounwind {
3049429783SCraig Topper; RV32IF-LABEL: fminimum_f32:
3149429783SCraig Topper; RV32IF:       # %bb.0:
3249429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa0, fa0
3349429783SCraig Topper; RV32IF-NEXT:    fmv.s fa5, fa1
3449429783SCraig Topper; RV32IF-NEXT:    beqz a0, .LBB0_3
3549429783SCraig Topper; RV32IF-NEXT:  # %bb.1:
3649429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa1, fa1
3749429783SCraig Topper; RV32IF-NEXT:    beqz a0, .LBB0_4
3849429783SCraig Topper; RV32IF-NEXT:  .LBB0_2:
3949429783SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa0, fa5
4049429783SCraig Topper; RV32IF-NEXT:    ret
4149429783SCraig Topper; RV32IF-NEXT:  .LBB0_3:
4249429783SCraig Topper; RV32IF-NEXT:    fmv.s fa5, fa0
4349429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa1, fa1
4449429783SCraig Topper; RV32IF-NEXT:    bnez a0, .LBB0_2
4549429783SCraig Topper; RV32IF-NEXT:  .LBB0_4:
4649429783SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa1, fa5
4749429783SCraig Topper; RV32IF-NEXT:    ret
4849429783SCraig Topper;
4949429783SCraig Topper; RV32IZFINX-LABEL: fminimum_f32:
5049429783SCraig Topper; RV32IZFINX:       # %bb.0:
5149429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a0, a0
5249429783SCraig Topper; RV32IZFINX-NEXT:    mv a2, a1
5349429783SCraig Topper; RV32IZFINX-NEXT:    beqz a3, .LBB0_3
5449429783SCraig Topper; RV32IZFINX-NEXT:  # %bb.1:
5549429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a1, a1
5649429783SCraig Topper; RV32IZFINX-NEXT:    beqz a3, .LBB0_4
5749429783SCraig Topper; RV32IZFINX-NEXT:  .LBB0_2:
5849429783SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a0, a2
5949429783SCraig Topper; RV32IZFINX-NEXT:    ret
6049429783SCraig Topper; RV32IZFINX-NEXT:  .LBB0_3:
6149429783SCraig Topper; RV32IZFINX-NEXT:    mv a2, a0
6249429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a1, a1
6349429783SCraig Topper; RV32IZFINX-NEXT:    bnez a3, .LBB0_2
6449429783SCraig Topper; RV32IZFINX-NEXT:  .LBB0_4:
6549429783SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a1, a2
6649429783SCraig Topper; RV32IZFINX-NEXT:    ret
6749429783SCraig Topper;
68*5a08acc1SAlex Bradbury; RV32I-LABEL: fminimum_f32:
69*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
70*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
71*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
72*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fminimumf
73*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
74*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
75*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
76*5a08acc1SAlex Bradbury;
7749429783SCraig Topper; RV64IF-LABEL: fminimum_f32:
7849429783SCraig Topper; RV64IF:       # %bb.0:
7949429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa0, fa0
8049429783SCraig Topper; RV64IF-NEXT:    fmv.s fa5, fa1
8149429783SCraig Topper; RV64IF-NEXT:    beqz a0, .LBB0_3
8249429783SCraig Topper; RV64IF-NEXT:  # %bb.1:
8349429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa1, fa1
8449429783SCraig Topper; RV64IF-NEXT:    beqz a0, .LBB0_4
8549429783SCraig Topper; RV64IF-NEXT:  .LBB0_2:
8649429783SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa0, fa5
8749429783SCraig Topper; RV64IF-NEXT:    ret
8849429783SCraig Topper; RV64IF-NEXT:  .LBB0_3:
8949429783SCraig Topper; RV64IF-NEXT:    fmv.s fa5, fa0
9049429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa1, fa1
9149429783SCraig Topper; RV64IF-NEXT:    bnez a0, .LBB0_2
9249429783SCraig Topper; RV64IF-NEXT:  .LBB0_4:
9349429783SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa1, fa5
9449429783SCraig Topper; RV64IF-NEXT:    ret
9549429783SCraig Topper;
9649429783SCraig Topper; RV64IZFINX-LABEL: fminimum_f32:
9749429783SCraig Topper; RV64IZFINX:       # %bb.0:
9849429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a0, a0
9949429783SCraig Topper; RV64IZFINX-NEXT:    mv a2, a1
10049429783SCraig Topper; RV64IZFINX-NEXT:    beqz a3, .LBB0_3
10149429783SCraig Topper; RV64IZFINX-NEXT:  # %bb.1:
10249429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a1, a1
10349429783SCraig Topper; RV64IZFINX-NEXT:    beqz a3, .LBB0_4
10449429783SCraig Topper; RV64IZFINX-NEXT:  .LBB0_2:
10549429783SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a0, a2
10649429783SCraig Topper; RV64IZFINX-NEXT:    ret
10749429783SCraig Topper; RV64IZFINX-NEXT:  .LBB0_3:
10849429783SCraig Topper; RV64IZFINX-NEXT:    mv a2, a0
10949429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a1, a1
11049429783SCraig Topper; RV64IZFINX-NEXT:    bnez a3, .LBB0_2
11149429783SCraig Topper; RV64IZFINX-NEXT:  .LBB0_4:
11249429783SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a1, a2
11349429783SCraig Topper; RV64IZFINX-NEXT:    ret
114*5a08acc1SAlex Bradbury;
115*5a08acc1SAlex Bradbury; RV64I-LABEL: fminimum_f32:
116*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
117*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
118*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
119*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fminimumf
120*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
121*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
122*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
12349429783SCraig Topper  %1 = call float @llvm.minimum.f32(float %a, float %b)
12449429783SCraig Topper  ret float %1
12549429783SCraig Topper}
12649429783SCraig Topper
12749429783SCraig Topperdeclare float @llvm.maximum.f32(float, float)
12849429783SCraig Topper
12949429783SCraig Topperdefine float @fmaximum_f32(float %a, float %b) nounwind {
13049429783SCraig Topper; RV32IF-LABEL: fmaximum_f32:
13149429783SCraig Topper; RV32IF:       # %bb.0:
13249429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa0, fa0
13349429783SCraig Topper; RV32IF-NEXT:    fmv.s fa5, fa1
13449429783SCraig Topper; RV32IF-NEXT:    beqz a0, .LBB1_3
13549429783SCraig Topper; RV32IF-NEXT:  # %bb.1:
13649429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa1, fa1
13749429783SCraig Topper; RV32IF-NEXT:    beqz a0, .LBB1_4
13849429783SCraig Topper; RV32IF-NEXT:  .LBB1_2:
13949429783SCraig Topper; RV32IF-NEXT:    fmax.s fa0, fa0, fa5
14049429783SCraig Topper; RV32IF-NEXT:    ret
14149429783SCraig Topper; RV32IF-NEXT:  .LBB1_3:
14249429783SCraig Topper; RV32IF-NEXT:    fmv.s fa5, fa0
14349429783SCraig Topper; RV32IF-NEXT:    feq.s a0, fa1, fa1
14449429783SCraig Topper; RV32IF-NEXT:    bnez a0, .LBB1_2
14549429783SCraig Topper; RV32IF-NEXT:  .LBB1_4:
14649429783SCraig Topper; RV32IF-NEXT:    fmax.s fa0, fa1, fa5
14749429783SCraig Topper; RV32IF-NEXT:    ret
14849429783SCraig Topper;
14949429783SCraig Topper; RV32IZFINX-LABEL: fmaximum_f32:
15049429783SCraig Topper; RV32IZFINX:       # %bb.0:
15149429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a0, a0
15249429783SCraig Topper; RV32IZFINX-NEXT:    mv a2, a1
15349429783SCraig Topper; RV32IZFINX-NEXT:    beqz a3, .LBB1_3
15449429783SCraig Topper; RV32IZFINX-NEXT:  # %bb.1:
15549429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a1, a1
15649429783SCraig Topper; RV32IZFINX-NEXT:    beqz a3, .LBB1_4
15749429783SCraig Topper; RV32IZFINX-NEXT:  .LBB1_2:
15849429783SCraig Topper; RV32IZFINX-NEXT:    fmax.s a0, a0, a2
15949429783SCraig Topper; RV32IZFINX-NEXT:    ret
16049429783SCraig Topper; RV32IZFINX-NEXT:  .LBB1_3:
16149429783SCraig Topper; RV32IZFINX-NEXT:    mv a2, a0
16249429783SCraig Topper; RV32IZFINX-NEXT:    feq.s a3, a1, a1
16349429783SCraig Topper; RV32IZFINX-NEXT:    bnez a3, .LBB1_2
16449429783SCraig Topper; RV32IZFINX-NEXT:  .LBB1_4:
16549429783SCraig Topper; RV32IZFINX-NEXT:    fmax.s a0, a1, a2
16649429783SCraig Topper; RV32IZFINX-NEXT:    ret
16749429783SCraig Topper;
168*5a08acc1SAlex Bradbury; RV32I-LABEL: fmaximum_f32:
169*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
170*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
171*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
172*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fmaximumf
173*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
174*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
175*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
176*5a08acc1SAlex Bradbury;
17749429783SCraig Topper; RV64IF-LABEL: fmaximum_f32:
17849429783SCraig Topper; RV64IF:       # %bb.0:
17949429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa0, fa0
18049429783SCraig Topper; RV64IF-NEXT:    fmv.s fa5, fa1
18149429783SCraig Topper; RV64IF-NEXT:    beqz a0, .LBB1_3
18249429783SCraig Topper; RV64IF-NEXT:  # %bb.1:
18349429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa1, fa1
18449429783SCraig Topper; RV64IF-NEXT:    beqz a0, .LBB1_4
18549429783SCraig Topper; RV64IF-NEXT:  .LBB1_2:
18649429783SCraig Topper; RV64IF-NEXT:    fmax.s fa0, fa0, fa5
18749429783SCraig Topper; RV64IF-NEXT:    ret
18849429783SCraig Topper; RV64IF-NEXT:  .LBB1_3:
18949429783SCraig Topper; RV64IF-NEXT:    fmv.s fa5, fa0
19049429783SCraig Topper; RV64IF-NEXT:    feq.s a0, fa1, fa1
19149429783SCraig Topper; RV64IF-NEXT:    bnez a0, .LBB1_2
19249429783SCraig Topper; RV64IF-NEXT:  .LBB1_4:
19349429783SCraig Topper; RV64IF-NEXT:    fmax.s fa0, fa1, fa5
19449429783SCraig Topper; RV64IF-NEXT:    ret
19549429783SCraig Topper;
19649429783SCraig Topper; RV64IZFINX-LABEL: fmaximum_f32:
19749429783SCraig Topper; RV64IZFINX:       # %bb.0:
19849429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a0, a0
19949429783SCraig Topper; RV64IZFINX-NEXT:    mv a2, a1
20049429783SCraig Topper; RV64IZFINX-NEXT:    beqz a3, .LBB1_3
20149429783SCraig Topper; RV64IZFINX-NEXT:  # %bb.1:
20249429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a1, a1
20349429783SCraig Topper; RV64IZFINX-NEXT:    beqz a3, .LBB1_4
20449429783SCraig Topper; RV64IZFINX-NEXT:  .LBB1_2:
20549429783SCraig Topper; RV64IZFINX-NEXT:    fmax.s a0, a0, a2
20649429783SCraig Topper; RV64IZFINX-NEXT:    ret
20749429783SCraig Topper; RV64IZFINX-NEXT:  .LBB1_3:
20849429783SCraig Topper; RV64IZFINX-NEXT:    mv a2, a0
20949429783SCraig Topper; RV64IZFINX-NEXT:    feq.s a3, a1, a1
21049429783SCraig Topper; RV64IZFINX-NEXT:    bnez a3, .LBB1_2
21149429783SCraig Topper; RV64IZFINX-NEXT:  .LBB1_4:
21249429783SCraig Topper; RV64IZFINX-NEXT:    fmax.s a0, a1, a2
21349429783SCraig Topper; RV64IZFINX-NEXT:    ret
214*5a08acc1SAlex Bradbury;
215*5a08acc1SAlex Bradbury; RV64I-LABEL: fmaximum_f32:
216*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
217*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
218*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
219*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fmaximumf
220*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
221*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
222*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
22349429783SCraig Topper  %1 = call float @llvm.maximum.f32(float %a, float %b)
22449429783SCraig Topper  ret float %1
22549429783SCraig Topper}
226048458f9SCraig Topper
227048458f9SCraig Topperdefine float @fminimum_nnan_f32(float %a, float %b) nounwind {
228048458f9SCraig Topper; RV32IF-LABEL: fminimum_nnan_f32:
229048458f9SCraig Topper; RV32IF:       # %bb.0:
230048458f9SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa0, fa1
231048458f9SCraig Topper; RV32IF-NEXT:    ret
232048458f9SCraig Topper;
233048458f9SCraig Topper; RV32IZFINX-LABEL: fminimum_nnan_f32:
234048458f9SCraig Topper; RV32IZFINX:       # %bb.0:
235048458f9SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a0, a1
236048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
237048458f9SCraig Topper;
238*5a08acc1SAlex Bradbury; RV32I-LABEL: fminimum_nnan_f32:
239*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
240*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
241*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
242*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fminimumf
243*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
244*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
245*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
246*5a08acc1SAlex Bradbury;
247048458f9SCraig Topper; RV64IF-LABEL: fminimum_nnan_f32:
248048458f9SCraig Topper; RV64IF:       # %bb.0:
249048458f9SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa0, fa1
250048458f9SCraig Topper; RV64IF-NEXT:    ret
251048458f9SCraig Topper;
252048458f9SCraig Topper; RV64IZFINX-LABEL: fminimum_nnan_f32:
253048458f9SCraig Topper; RV64IZFINX:       # %bb.0:
254048458f9SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a0, a1
255048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
256*5a08acc1SAlex Bradbury;
257*5a08acc1SAlex Bradbury; RV64I-LABEL: fminimum_nnan_f32:
258*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
259*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
260*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
261*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fminimumf
262*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
263*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
264*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
265048458f9SCraig Topper  %1 = call nnan float @llvm.minimum.f32(float %a, float %b)
266048458f9SCraig Topper  ret float %1
267048458f9SCraig Topper}
268048458f9SCraig Topper
269048458f9SCraig Topperdefine float @fmaximum_nnan_f32(float %a, float %b) nounwind {
270048458f9SCraig Topper; RV32IF-LABEL: fmaximum_nnan_f32:
271048458f9SCraig Topper; RV32IF:       # %bb.0:
272048458f9SCraig Topper; RV32IF-NEXT:    fmax.s fa0, fa0, fa1
273048458f9SCraig Topper; RV32IF-NEXT:    ret
274048458f9SCraig Topper;
275048458f9SCraig Topper; RV32IZFINX-LABEL: fmaximum_nnan_f32:
276048458f9SCraig Topper; RV32IZFINX:       # %bb.0:
277048458f9SCraig Topper; RV32IZFINX-NEXT:    fmax.s a0, a0, a1
278048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
279048458f9SCraig Topper;
280*5a08acc1SAlex Bradbury; RV32I-LABEL: fmaximum_nnan_f32:
281*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
282*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
283*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
284*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fmaximumf
285*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
286*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
287*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
288*5a08acc1SAlex Bradbury;
289048458f9SCraig Topper; RV64IF-LABEL: fmaximum_nnan_f32:
290048458f9SCraig Topper; RV64IF:       # %bb.0:
291048458f9SCraig Topper; RV64IF-NEXT:    fmax.s fa0, fa0, fa1
292048458f9SCraig Topper; RV64IF-NEXT:    ret
293048458f9SCraig Topper;
294048458f9SCraig Topper; RV64IZFINX-LABEL: fmaximum_nnan_f32:
295048458f9SCraig Topper; RV64IZFINX:       # %bb.0:
296048458f9SCraig Topper; RV64IZFINX-NEXT:    fmax.s a0, a0, a1
297048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
298*5a08acc1SAlex Bradbury;
299*5a08acc1SAlex Bradbury; RV64I-LABEL: fmaximum_nnan_f32:
300*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
301*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
302*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
303*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fmaximumf
304*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
305*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
306*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
307048458f9SCraig Topper  %1 = call nnan float @llvm.maximum.f32(float %a, float %b)
308048458f9SCraig Topper  ret float %1
309048458f9SCraig Topper}
310048458f9SCraig Topper
311048458f9SCraig Topperdefine float @fminimum_nnan_attr_f32(float %a, float %b) nounwind "no-nans-fp-math"="true" {
312048458f9SCraig Topper; RV32IF-LABEL: fminimum_nnan_attr_f32:
313048458f9SCraig Topper; RV32IF:       # %bb.0:
314048458f9SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa0, fa1
315048458f9SCraig Topper; RV32IF-NEXT:    ret
316048458f9SCraig Topper;
317048458f9SCraig Topper; RV32IZFINX-LABEL: fminimum_nnan_attr_f32:
318048458f9SCraig Topper; RV32IZFINX:       # %bb.0:
319048458f9SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a0, a1
320048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
321048458f9SCraig Topper;
322*5a08acc1SAlex Bradbury; RV32I-LABEL: fminimum_nnan_attr_f32:
323*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
324*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
325*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
326*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fminimumf
327*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
328*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
329*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
330*5a08acc1SAlex Bradbury;
331048458f9SCraig Topper; RV64IF-LABEL: fminimum_nnan_attr_f32:
332048458f9SCraig Topper; RV64IF:       # %bb.0:
333048458f9SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa0, fa1
334048458f9SCraig Topper; RV64IF-NEXT:    ret
335048458f9SCraig Topper;
336048458f9SCraig Topper; RV64IZFINX-LABEL: fminimum_nnan_attr_f32:
337048458f9SCraig Topper; RV64IZFINX:       # %bb.0:
338048458f9SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a0, a1
339048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
340*5a08acc1SAlex Bradbury;
341*5a08acc1SAlex Bradbury; RV64I-LABEL: fminimum_nnan_attr_f32:
342*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
343*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
344*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
345*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fminimumf
346*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
347*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
348*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
349048458f9SCraig Topper  %1 = call float @llvm.minimum.f32(float %a, float %b)
350048458f9SCraig Topper  ret float %1
351048458f9SCraig Topper}
352048458f9SCraig Topper
353048458f9SCraig Topperdefine float @fminimum_nnan_op_f32(float %a, float %b) nounwind {
354048458f9SCraig Topper; RV32IF-LABEL: fminimum_nnan_op_f32:
355048458f9SCraig Topper; RV32IF:       # %bb.0:
356048458f9SCraig Topper; RV32IF-NEXT:    feq.s a0, fa0, fa0
357048458f9SCraig Topper; RV32IF-NEXT:    bnez a0, .LBB5_2
358048458f9SCraig Topper; RV32IF-NEXT:  # %bb.1:
359048458f9SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa0, fa0
360048458f9SCraig Topper; RV32IF-NEXT:    ret
361048458f9SCraig Topper; RV32IF-NEXT:  .LBB5_2:
362048458f9SCraig Topper; RV32IF-NEXT:    fadd.s fa5, fa0, fa0
363048458f9SCraig Topper; RV32IF-NEXT:    fmin.s fa0, fa0, fa5
364048458f9SCraig Topper; RV32IF-NEXT:    ret
365048458f9SCraig Topper;
366048458f9SCraig Topper; RV32IZFINX-LABEL: fminimum_nnan_op_f32:
367048458f9SCraig Topper; RV32IZFINX:       # %bb.0:
368048458f9SCraig Topper; RV32IZFINX-NEXT:    feq.s a1, a0, a0
369048458f9SCraig Topper; RV32IZFINX-NEXT:    bnez a1, .LBB5_2
370048458f9SCraig Topper; RV32IZFINX-NEXT:  # %bb.1:
371048458f9SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a0, a0
372048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
373048458f9SCraig Topper; RV32IZFINX-NEXT:  .LBB5_2:
374048458f9SCraig Topper; RV32IZFINX-NEXT:    fadd.s a1, a0, a0
375048458f9SCraig Topper; RV32IZFINX-NEXT:    fmin.s a0, a0, a1
376048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
377048458f9SCraig Topper;
378*5a08acc1SAlex Bradbury; RV32I-LABEL: fminimum_nnan_op_f32:
379*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
380*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
381*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
382*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
383*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv s0, a0
384*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a1, a0
385*5a08acc1SAlex Bradbury; RV32I-NEXT:    call __addsf3
386*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a1, a0
387*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a0, s0
388*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fminimumf
389*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
390*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
391*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
392*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
393*5a08acc1SAlex Bradbury;
394048458f9SCraig Topper; RV64IF-LABEL: fminimum_nnan_op_f32:
395048458f9SCraig Topper; RV64IF:       # %bb.0:
396048458f9SCraig Topper; RV64IF-NEXT:    feq.s a0, fa0, fa0
397048458f9SCraig Topper; RV64IF-NEXT:    bnez a0, .LBB5_2
398048458f9SCraig Topper; RV64IF-NEXT:  # %bb.1:
399048458f9SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa0, fa0
400048458f9SCraig Topper; RV64IF-NEXT:    ret
401048458f9SCraig Topper; RV64IF-NEXT:  .LBB5_2:
402048458f9SCraig Topper; RV64IF-NEXT:    fadd.s fa5, fa0, fa0
403048458f9SCraig Topper; RV64IF-NEXT:    fmin.s fa0, fa0, fa5
404048458f9SCraig Topper; RV64IF-NEXT:    ret
405048458f9SCraig Topper;
406048458f9SCraig Topper; RV64IZFINX-LABEL: fminimum_nnan_op_f32:
407048458f9SCraig Topper; RV64IZFINX:       # %bb.0:
408048458f9SCraig Topper; RV64IZFINX-NEXT:    feq.s a1, a0, a0
409048458f9SCraig Topper; RV64IZFINX-NEXT:    bnez a1, .LBB5_2
410048458f9SCraig Topper; RV64IZFINX-NEXT:  # %bb.1:
411048458f9SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a0, a0
412048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
413048458f9SCraig Topper; RV64IZFINX-NEXT:  .LBB5_2:
414048458f9SCraig Topper; RV64IZFINX-NEXT:    fadd.s a1, a0, a0
415048458f9SCraig Topper; RV64IZFINX-NEXT:    fmin.s a0, a0, a1
416048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
417*5a08acc1SAlex Bradbury;
418*5a08acc1SAlex Bradbury; RV64I-LABEL: fminimum_nnan_op_f32:
419*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
420*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -16
421*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
422*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
423*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv s0, a0
424*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a1, a0
425*5a08acc1SAlex Bradbury; RV64I-NEXT:    call __addsf3
426*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a1, a0
427*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a0, s0
428*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fminimumf
429*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
430*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
431*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 16
432*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
433048458f9SCraig Topper  %c = fadd nnan float %a, %a
434048458f9SCraig Topper  %1 = call float @llvm.minimum.f32(float %a, float %c)
435048458f9SCraig Topper  ret float %1
436048458f9SCraig Topper}
437048458f9SCraig Topper
438048458f9SCraig Topperdefine float @fmaximum_nnan_op_f32(float %a, float %b) nounwind {
439048458f9SCraig Topper; RV32IF-LABEL: fmaximum_nnan_op_f32:
440048458f9SCraig Topper; RV32IF:       # %bb.0:
441048458f9SCraig Topper; RV32IF-NEXT:    fadd.s fa5, fa0, fa1
442048458f9SCraig Topper; RV32IF-NEXT:    fsub.s fa4, fa0, fa1
443048458f9SCraig Topper; RV32IF-NEXT:    fmax.s fa0, fa5, fa4
444048458f9SCraig Topper; RV32IF-NEXT:    ret
445048458f9SCraig Topper;
446048458f9SCraig Topper; RV32IZFINX-LABEL: fmaximum_nnan_op_f32:
447048458f9SCraig Topper; RV32IZFINX:       # %bb.0:
448048458f9SCraig Topper; RV32IZFINX-NEXT:    fadd.s a2, a0, a1
449048458f9SCraig Topper; RV32IZFINX-NEXT:    fsub.s a0, a0, a1
450048458f9SCraig Topper; RV32IZFINX-NEXT:    fmax.s a0, a2, a0
451048458f9SCraig Topper; RV32IZFINX-NEXT:    ret
452048458f9SCraig Topper;
453*5a08acc1SAlex Bradbury; RV32I-LABEL: fmaximum_nnan_op_f32:
454*5a08acc1SAlex Bradbury; RV32I:       # %bb.0:
455*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, -16
456*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
457*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
458*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
459*5a08acc1SAlex Bradbury; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
460*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv s0, a1
461*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv s1, a0
462*5a08acc1SAlex Bradbury; RV32I-NEXT:    call __addsf3
463*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv s2, a0
464*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a0, s1
465*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a1, s0
466*5a08acc1SAlex Bradbury; RV32I-NEXT:    call __subsf3
467*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a1, a0
468*5a08acc1SAlex Bradbury; RV32I-NEXT:    mv a0, s2
469*5a08acc1SAlex Bradbury; RV32I-NEXT:    call fmaximumf
470*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
471*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
472*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
473*5a08acc1SAlex Bradbury; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
474*5a08acc1SAlex Bradbury; RV32I-NEXT:    addi sp, sp, 16
475*5a08acc1SAlex Bradbury; RV32I-NEXT:    ret
476*5a08acc1SAlex Bradbury;
477048458f9SCraig Topper; RV64IF-LABEL: fmaximum_nnan_op_f32:
478048458f9SCraig Topper; RV64IF:       # %bb.0:
479048458f9SCraig Topper; RV64IF-NEXT:    fadd.s fa5, fa0, fa1
480048458f9SCraig Topper; RV64IF-NEXT:    fsub.s fa4, fa0, fa1
481048458f9SCraig Topper; RV64IF-NEXT:    fmax.s fa0, fa5, fa4
482048458f9SCraig Topper; RV64IF-NEXT:    ret
483048458f9SCraig Topper;
484048458f9SCraig Topper; RV64IZFINX-LABEL: fmaximum_nnan_op_f32:
485048458f9SCraig Topper; RV64IZFINX:       # %bb.0:
486048458f9SCraig Topper; RV64IZFINX-NEXT:    fadd.s a2, a0, a1
487048458f9SCraig Topper; RV64IZFINX-NEXT:    fsub.s a0, a0, a1
488048458f9SCraig Topper; RV64IZFINX-NEXT:    fmax.s a0, a2, a0
489048458f9SCraig Topper; RV64IZFINX-NEXT:    ret
490*5a08acc1SAlex Bradbury;
491*5a08acc1SAlex Bradbury; RV64I-LABEL: fmaximum_nnan_op_f32:
492*5a08acc1SAlex Bradbury; RV64I:       # %bb.0:
493*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, -32
494*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
495*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
496*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
497*5a08acc1SAlex Bradbury; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
498*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv s0, a1
499*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv s1, a0
500*5a08acc1SAlex Bradbury; RV64I-NEXT:    call __addsf3
501*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv s2, a0
502*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a0, s1
503*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a1, s0
504*5a08acc1SAlex Bradbury; RV64I-NEXT:    call __subsf3
505*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a1, a0
506*5a08acc1SAlex Bradbury; RV64I-NEXT:    mv a0, s2
507*5a08acc1SAlex Bradbury; RV64I-NEXT:    call fmaximumf
508*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
509*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
510*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
511*5a08acc1SAlex Bradbury; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
512*5a08acc1SAlex Bradbury; RV64I-NEXT:    addi sp, sp, 32
513*5a08acc1SAlex Bradbury; RV64I-NEXT:    ret
514048458f9SCraig Topper  %c = fadd nnan float %a, %b
515048458f9SCraig Topper  %d = fsub nnan float %a, %b
516048458f9SCraig Topper  %1 = call float @llvm.maximum.f32(float %c, float %d)
517048458f9SCraig Topper  ret float %1
518048458f9SCraig Topper}
519