xref: /llvm-project/llvm/test/CodeGen/RISCV/float-arith-strict.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
139268934SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
239268934SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \
3b271184fSCraig Topper; RUN:   -disable-strictnode-mutation -target-abi=ilp32f \
484bacb18SShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIF,RV32IF %s
539268934SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \
6b271184fSCraig Topper; RUN:   -disable-strictnode-mutation -target-abi=lp64f \
784bacb18SShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIF,RV64IF %s
839268934SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
939268934SCraig Topper; RUN:   -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s
1039268934SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
1139268934SCraig Topper; RUN:   -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s
12fe558efeSShao-Ce SUN; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \
13fe558efeSShao-Ce SUN; RUN:   -disable-strictnode-mutation -target-abi=ilp32 \
14fe558efeSShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIZFINX,RV32IZFINX %s
15fe558efeSShao-Ce SUN; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \
16fe558efeSShao-Ce SUN; RUN:   -disable-strictnode-mutation -target-abi=lp64 \
17fe558efeSShao-Ce SUN; RUN:   | FileCheck -check-prefixes=CHECKIZFINX,RV64IZFINX %s
1839268934SCraig Topper
1939268934SCraig Topperdefine float @fadd_s(float %a, float %b) nounwind strictfp {
2084bacb18SShao-Ce SUN; CHECKIF-LABEL: fadd_s:
2184bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
2284bacb18SShao-Ce SUN; CHECKIF-NEXT:    fadd.s fa0, fa0, fa1
2384bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
2439268934SCraig Topper;
2539268934SCraig Topper; RV32I-LABEL: fadd_s:
2639268934SCraig Topper; RV32I:       # %bb.0:
2739268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
2839268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
29*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
3039268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
3139268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
3239268934SCraig Topper; RV32I-NEXT:    ret
3339268934SCraig Topper;
3439268934SCraig Topper; RV64I-LABEL: fadd_s:
3539268934SCraig Topper; RV64I:       # %bb.0:
3639268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
3739268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
38*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
3939268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
4039268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
4139268934SCraig Topper; RV64I-NEXT:    ret
42fe558efeSShao-Ce SUN;
43fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fadd_s:
44fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
45fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a0, a0, a1
46fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
4739268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fadd.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
4839268934SCraig Topper  ret float %1
4939268934SCraig Topper}
5039268934SCraig Topperdeclare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
5139268934SCraig Topper
5239268934SCraig Topperdefine float @fsub_s(float %a, float %b) nounwind strictfp {
5384bacb18SShao-Ce SUN; CHECKIF-LABEL: fsub_s:
5484bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
5584bacb18SShao-Ce SUN; CHECKIF-NEXT:    fsub.s fa0, fa0, fa1
5684bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
5739268934SCraig Topper;
5839268934SCraig Topper; RV32I-LABEL: fsub_s:
5939268934SCraig Topper; RV32I:       # %bb.0:
6039268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
6139268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
62*eabaee0cSFangrui Song; RV32I-NEXT:    call __subsf3
6339268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
6439268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
6539268934SCraig Topper; RV32I-NEXT:    ret
6639268934SCraig Topper;
6739268934SCraig Topper; RV64I-LABEL: fsub_s:
6839268934SCraig Topper; RV64I:       # %bb.0:
6939268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
7039268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
71*eabaee0cSFangrui Song; RV64I-NEXT:    call __subsf3
7239268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
7339268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
7439268934SCraig Topper; RV64I-NEXT:    ret
75fe558efeSShao-Ce SUN;
76fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fsub_s:
77fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
78fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fsub.s a0, a0, a1
79fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
8039268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fsub.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
8139268934SCraig Topper  ret float %1
8239268934SCraig Topper}
8339268934SCraig Topperdeclare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata)
8439268934SCraig Topper
8539268934SCraig Topperdefine float @fmul_s(float %a, float %b) nounwind strictfp {
8684bacb18SShao-Ce SUN; CHECKIF-LABEL: fmul_s:
8784bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
8884bacb18SShao-Ce SUN; CHECKIF-NEXT:    fmul.s fa0, fa0, fa1
8984bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
9039268934SCraig Topper;
9139268934SCraig Topper; RV32I-LABEL: fmul_s:
9239268934SCraig Topper; RV32I:       # %bb.0:
9339268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
9439268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
95*eabaee0cSFangrui Song; RV32I-NEXT:    call __mulsf3
9639268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
9739268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
9839268934SCraig Topper; RV32I-NEXT:    ret
9939268934SCraig Topper;
10039268934SCraig Topper; RV64I-LABEL: fmul_s:
10139268934SCraig Topper; RV64I:       # %bb.0:
10239268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
10339268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
104*eabaee0cSFangrui Song; RV64I-NEXT:    call __mulsf3
10539268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
10639268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
10739268934SCraig Topper; RV64I-NEXT:    ret
108fe558efeSShao-Ce SUN;
109fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fmul_s:
110fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
111fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fmul.s a0, a0, a1
112fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
11339268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fmul.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
11439268934SCraig Topper  ret float %1
11539268934SCraig Topper}
11639268934SCraig Topperdeclare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata)
11739268934SCraig Topper
11839268934SCraig Topperdefine float @fdiv_s(float %a, float %b) nounwind strictfp {
11984bacb18SShao-Ce SUN; CHECKIF-LABEL: fdiv_s:
12084bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
12184bacb18SShao-Ce SUN; CHECKIF-NEXT:    fdiv.s fa0, fa0, fa1
12284bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
12339268934SCraig Topper;
12439268934SCraig Topper; RV32I-LABEL: fdiv_s:
12539268934SCraig Topper; RV32I:       # %bb.0:
12639268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
12739268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
128*eabaee0cSFangrui Song; RV32I-NEXT:    call __divsf3
12939268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
13039268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
13139268934SCraig Topper; RV32I-NEXT:    ret
13239268934SCraig Topper;
13339268934SCraig Topper; RV64I-LABEL: fdiv_s:
13439268934SCraig Topper; RV64I:       # %bb.0:
13539268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
13639268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
137*eabaee0cSFangrui Song; RV64I-NEXT:    call __divsf3
13839268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
13939268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
14039268934SCraig Topper; RV64I-NEXT:    ret
141fe558efeSShao-Ce SUN;
142fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fdiv_s:
143fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
144fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fdiv.s a0, a0, a1
145fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
14639268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fdiv.f32(float %a, float %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
14739268934SCraig Topper  ret float %1
14839268934SCraig Topper}
14939268934SCraig Topperdeclare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata)
15039268934SCraig Topper
15139268934SCraig Topperdefine float @fsqrt_s(float %a) nounwind strictfp {
15284bacb18SShao-Ce SUN; CHECKIF-LABEL: fsqrt_s:
15384bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
15484bacb18SShao-Ce SUN; CHECKIF-NEXT:    fsqrt.s fa0, fa0
15584bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
15639268934SCraig Topper;
15739268934SCraig Topper; RV32I-LABEL: fsqrt_s:
15839268934SCraig Topper; RV32I:       # %bb.0:
15939268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
16039268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
161*eabaee0cSFangrui Song; RV32I-NEXT:    call sqrtf
16239268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
16339268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
16439268934SCraig Topper; RV32I-NEXT:    ret
16539268934SCraig Topper;
16639268934SCraig Topper; RV64I-LABEL: fsqrt_s:
16739268934SCraig Topper; RV64I:       # %bb.0:
16839268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
16939268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
170*eabaee0cSFangrui Song; RV64I-NEXT:    call sqrtf
17139268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
17239268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
17339268934SCraig Topper; RV64I-NEXT:    ret
174fe558efeSShao-Ce SUN;
175fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fsqrt_s:
176fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
177fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fsqrt.s a0, a0
178fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
17939268934SCraig Topper  %1 = call float @llvm.experimental.constrained.sqrt.f32(float %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
18039268934SCraig Topper  ret float %1
18139268934SCraig Topper}
18239268934SCraig Topperdeclare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata)
18339268934SCraig Topper
18439268934SCraig Topperdefine float @fmin_s(float %a, float %b) nounwind strictfp {
18539268934SCraig Topper; RV32IF-LABEL: fmin_s:
18639268934SCraig Topper; RV32IF:       # %bb.0:
18739268934SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
18839268934SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
189*eabaee0cSFangrui Song; RV32IF-NEXT:    call fminf
19039268934SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
19139268934SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
19239268934SCraig Topper; RV32IF-NEXT:    ret
19339268934SCraig Topper;
19439268934SCraig Topper; RV64IF-LABEL: fmin_s:
19539268934SCraig Topper; RV64IF:       # %bb.0:
19639268934SCraig Topper; RV64IF-NEXT:    addi sp, sp, -16
19739268934SCraig Topper; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
198*eabaee0cSFangrui Song; RV64IF-NEXT:    call fminf
19939268934SCraig Topper; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
20039268934SCraig Topper; RV64IF-NEXT:    addi sp, sp, 16
20139268934SCraig Topper; RV64IF-NEXT:    ret
20239268934SCraig Topper;
20339268934SCraig Topper; RV32I-LABEL: fmin_s:
20439268934SCraig Topper; RV32I:       # %bb.0:
20539268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
20639268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
207*eabaee0cSFangrui Song; RV32I-NEXT:    call fminf
20839268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20939268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
21039268934SCraig Topper; RV32I-NEXT:    ret
21139268934SCraig Topper;
21239268934SCraig Topper; RV64I-LABEL: fmin_s:
21339268934SCraig Topper; RV64I:       # %bb.0:
21439268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
21539268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
216*eabaee0cSFangrui Song; RV64I-NEXT:    call fminf
21739268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
21839268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
21939268934SCraig Topper; RV64I-NEXT:    ret
220fe558efeSShao-Ce SUN;
221fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fmin_s:
222fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
223fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
224fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
225*eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call fminf
226fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
227fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
228fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
229fe558efeSShao-Ce SUN;
230fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fmin_s:
231fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
232fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    addi sp, sp, -16
233fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
234*eabaee0cSFangrui Song; RV64IZFINX-NEXT:    call fminf
235fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
236fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    addi sp, sp, 16
237fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
23839268934SCraig Topper  %1 = call float @llvm.experimental.constrained.minnum.f32(float %a, float %b, metadata !"fpexcept.strict") strictfp
23939268934SCraig Topper  ret float %1
24039268934SCraig Topper}
24139268934SCraig Topperdeclare float @llvm.experimental.constrained.minnum.f32(float, float, metadata) strictfp
24239268934SCraig Topper
24339268934SCraig Topperdefine float @fmax_s(float %a, float %b) nounwind strictfp {
24439268934SCraig Topper; RV32IF-LABEL: fmax_s:
24539268934SCraig Topper; RV32IF:       # %bb.0:
24639268934SCraig Topper; RV32IF-NEXT:    addi sp, sp, -16
24739268934SCraig Topper; RV32IF-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
248*eabaee0cSFangrui Song; RV32IF-NEXT:    call fmaxf
24939268934SCraig Topper; RV32IF-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
25039268934SCraig Topper; RV32IF-NEXT:    addi sp, sp, 16
25139268934SCraig Topper; RV32IF-NEXT:    ret
25239268934SCraig Topper;
25339268934SCraig Topper; RV64IF-LABEL: fmax_s:
25439268934SCraig Topper; RV64IF:       # %bb.0:
25539268934SCraig Topper; RV64IF-NEXT:    addi sp, sp, -16
25639268934SCraig Topper; RV64IF-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
257*eabaee0cSFangrui Song; RV64IF-NEXT:    call fmaxf
25839268934SCraig Topper; RV64IF-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
25939268934SCraig Topper; RV64IF-NEXT:    addi sp, sp, 16
26039268934SCraig Topper; RV64IF-NEXT:    ret
26139268934SCraig Topper;
26239268934SCraig Topper; RV32I-LABEL: fmax_s:
26339268934SCraig Topper; RV32I:       # %bb.0:
26439268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
26539268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
266*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaxf
26739268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
26839268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
26939268934SCraig Topper; RV32I-NEXT:    ret
27039268934SCraig Topper;
27139268934SCraig Topper; RV64I-LABEL: fmax_s:
27239268934SCraig Topper; RV64I:       # %bb.0:
27339268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
27439268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
275*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaxf
27639268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
27739268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
27839268934SCraig Topper; RV64I-NEXT:    ret
279fe558efeSShao-Ce SUN;
280fe558efeSShao-Ce SUN; RV32IZFINX-LABEL: fmax_s:
281fe558efeSShao-Ce SUN; RV32IZFINX:       # %bb.0:
282fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, -16
283fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
284*eabaee0cSFangrui Song; RV32IZFINX-NEXT:    call fmaxf
285fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
286fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    addi sp, sp, 16
287fe558efeSShao-Ce SUN; RV32IZFINX-NEXT:    ret
288fe558efeSShao-Ce SUN;
289fe558efeSShao-Ce SUN; RV64IZFINX-LABEL: fmax_s:
290fe558efeSShao-Ce SUN; RV64IZFINX:       # %bb.0:
291fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    addi sp, sp, -16
292fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
293*eabaee0cSFangrui Song; RV64IZFINX-NEXT:    call fmaxf
294fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
295fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    addi sp, sp, 16
296fe558efeSShao-Ce SUN; RV64IZFINX-NEXT:    ret
29739268934SCraig Topper  %1 = call float @llvm.experimental.constrained.maxnum.f32(float %a, float %b, metadata !"fpexcept.strict") strictfp
29839268934SCraig Topper  ret float %1
29939268934SCraig Topper}
30039268934SCraig Topperdeclare float @llvm.experimental.constrained.maxnum.f32(float, float, metadata) strictfp
30139268934SCraig Topper
30239268934SCraig Topperdefine float @fmadd_s(float %a, float %b, float %c) nounwind strictfp {
30384bacb18SShao-Ce SUN; CHECKIF-LABEL: fmadd_s:
30484bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
30584bacb18SShao-Ce SUN; CHECKIF-NEXT:    fmadd.s fa0, fa0, fa1, fa2
30684bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
30739268934SCraig Topper;
30839268934SCraig Topper; RV32I-LABEL: fmadd_s:
30939268934SCraig Topper; RV32I:       # %bb.0:
31039268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
31139268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
312*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
31339268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
31439268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
31539268934SCraig Topper; RV32I-NEXT:    ret
31639268934SCraig Topper;
31739268934SCraig Topper; RV64I-LABEL: fmadd_s:
31839268934SCraig Topper; RV64I:       # %bb.0:
31939268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -16
32039268934SCraig Topper; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
321*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
32239268934SCraig Topper; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
32339268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 16
32439268934SCraig Topper; RV64I-NEXT:    ret
325fe558efeSShao-Ce SUN;
326fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fmadd_s:
327fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
328fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fmadd.s a0, a0, a1, a2
329fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
33039268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %b, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
33139268934SCraig Topper  ret float %1
33239268934SCraig Topper}
33339268934SCraig Topperdeclare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) strictfp
33439268934SCraig Topper
33539268934SCraig Topperdefine float @fmsub_s(float %a, float %b, float %c) nounwind strictfp {
33684bacb18SShao-Ce SUN; CHECKIF-LABEL: fmsub_s:
33784bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
3387b0c4184SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
3397b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
3407b0c4184SCraig Topper; CHECKIF-NEXT:    fmsub.s fa0, fa0, fa1, fa5
34184bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
34239268934SCraig Topper;
34339268934SCraig Topper; RV32I-LABEL: fmsub_s:
34439268934SCraig Topper; RV32I:       # %bb.0:
34539268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
34639268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
34739268934SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
34839268934SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
34939268934SCraig Topper; RV32I-NEXT:    mv s0, a1
35039268934SCraig Topper; RV32I-NEXT:    mv s1, a0
35139268934SCraig Topper; RV32I-NEXT:    mv a0, a2
35239268934SCraig Topper; RV32I-NEXT:    li a1, 0
353*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
354e00e20a0SCraig Topper; RV32I-NEXT:    lui a2, 524288
355e00e20a0SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
35639268934SCraig Topper; RV32I-NEXT:    mv a0, s1
35739268934SCraig Topper; RV32I-NEXT:    mv a1, s0
358*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
35939268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
36039268934SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
36139268934SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
36239268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
36339268934SCraig Topper; RV32I-NEXT:    ret
36439268934SCraig Topper;
36539268934SCraig Topper; RV64I-LABEL: fmsub_s:
36639268934SCraig Topper; RV64I:       # %bb.0:
36739268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
36839268934SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
36939268934SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
37039268934SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
37139268934SCraig Topper; RV64I-NEXT:    mv s0, a1
37239268934SCraig Topper; RV64I-NEXT:    mv s1, a0
37339268934SCraig Topper; RV64I-NEXT:    mv a0, a2
37439268934SCraig Topper; RV64I-NEXT:    li a1, 0
375*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
376e00e20a0SCraig Topper; RV64I-NEXT:    lui a2, 524288
377e00e20a0SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
37839268934SCraig Topper; RV64I-NEXT:    mv a0, s1
37939268934SCraig Topper; RV64I-NEXT:    mv a1, s0
380*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
38139268934SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
38239268934SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
38339268934SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
38439268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
38539268934SCraig Topper; RV64I-NEXT:    ret
386fe558efeSShao-Ce SUN;
387fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fmsub_s:
388fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
389fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a2, a2, zero
390fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fmsub.s a0, a0, a1, a2
391fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
39239268934SCraig Topper  %c_ = fadd float 0.0, %c ; avoid negation using xor
39339268934SCraig Topper  %negc = fneg float %c_
39439268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %b, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
39539268934SCraig Topper  ret float %1
39639268934SCraig Topper}
39739268934SCraig Topper
39839268934SCraig Topperdefine float @fnmadd_s(float %a, float %b, float %c) nounwind strictfp {
39984bacb18SShao-Ce SUN; CHECKIF-LABEL: fnmadd_s:
40084bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
4017b0c4184SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
4027b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa0, fa5
4037b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
4047b0c4184SCraig Topper; CHECKIF-NEXT:    fnmadd.s fa0, fa4, fa1, fa5
40584bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
40639268934SCraig Topper;
40739268934SCraig Topper; RV32I-LABEL: fnmadd_s:
40839268934SCraig Topper; RV32I:       # %bb.0:
40939268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
41039268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
41139268934SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
41239268934SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
41339268934SCraig Topper; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
41439268934SCraig Topper; RV32I-NEXT:    mv s0, a2
4158def89b5Swangpc; RV32I-NEXT:    mv s1, a1
41639268934SCraig Topper; RV32I-NEXT:    li a1, 0
417*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
4188def89b5Swangpc; RV32I-NEXT:    mv s2, a0
41939268934SCraig Topper; RV32I-NEXT:    mv a0, s0
42039268934SCraig Topper; RV32I-NEXT:    li a1, 0
421*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
42239268934SCraig Topper; RV32I-NEXT:    lui a2, 524288
4238def89b5Swangpc; RV32I-NEXT:    xor a1, s2, a2
42439268934SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
42539268934SCraig Topper; RV32I-NEXT:    mv a0, a1
4268def89b5Swangpc; RV32I-NEXT:    mv a1, s1
427*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
42839268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
42939268934SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
43039268934SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
43139268934SCraig Topper; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
43239268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
43339268934SCraig Topper; RV32I-NEXT:    ret
43439268934SCraig Topper;
43539268934SCraig Topper; RV64I-LABEL: fnmadd_s:
43639268934SCraig Topper; RV64I:       # %bb.0:
43739268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
43839268934SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
43939268934SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
44039268934SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
44139268934SCraig Topper; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
44239268934SCraig Topper; RV64I-NEXT:    mv s0, a2
4438def89b5Swangpc; RV64I-NEXT:    mv s1, a1
44439268934SCraig Topper; RV64I-NEXT:    li a1, 0
445*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
4468def89b5Swangpc; RV64I-NEXT:    mv s2, a0
44739268934SCraig Topper; RV64I-NEXT:    mv a0, s0
44839268934SCraig Topper; RV64I-NEXT:    li a1, 0
449*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
45039268934SCraig Topper; RV64I-NEXT:    lui a2, 524288
4518def89b5Swangpc; RV64I-NEXT:    xor a1, s2, a2
45239268934SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
45339268934SCraig Topper; RV64I-NEXT:    mv a0, a1
4548def89b5Swangpc; RV64I-NEXT:    mv a1, s1
455*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
45639268934SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
45739268934SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
45839268934SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
45939268934SCraig Topper; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
46039268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
46139268934SCraig Topper; RV64I-NEXT:    ret
462fe558efeSShao-Ce SUN;
463fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fnmadd_s:
464fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
465fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a0, a0, zero
466fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a2, a2, zero
467fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fnmadd.s a0, a0, a1, a2
468fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
46939268934SCraig Topper  %a_ = fadd float 0.0, %a
47039268934SCraig Topper  %c_ = fadd float 0.0, %c
47139268934SCraig Topper  %nega = fneg float %a_
47239268934SCraig Topper  %negc = fneg float %c_
47339268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %nega, float %b, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
47439268934SCraig Topper  ret float %1
47539268934SCraig Topper}
47639268934SCraig Topper
47739268934SCraig Topperdefine float @fnmadd_s_2(float %a, float %b, float %c) nounwind strictfp {
47884bacb18SShao-Ce SUN; CHECKIF-LABEL: fnmadd_s_2:
47984bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
4807b0c4184SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
4817b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa4, fa1, fa5
4827b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa2, fa5
4837b0c4184SCraig Topper; CHECKIF-NEXT:    fnmadd.s fa0, fa4, fa0, fa5
48484bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
48539268934SCraig Topper;
48639268934SCraig Topper; RV32I-LABEL: fnmadd_s_2:
48739268934SCraig Topper; RV32I:       # %bb.0:
48839268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
48939268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
49039268934SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
49139268934SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
49239268934SCraig Topper; RV32I-NEXT:    sw s2, 0(sp) # 4-byte Folded Spill
49339268934SCraig Topper; RV32I-NEXT:    mv s0, a2
4948def89b5Swangpc; RV32I-NEXT:    mv s1, a0
49539268934SCraig Topper; RV32I-NEXT:    mv a0, a1
49639268934SCraig Topper; RV32I-NEXT:    li a1, 0
497*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
4988def89b5Swangpc; RV32I-NEXT:    mv s2, a0
49939268934SCraig Topper; RV32I-NEXT:    mv a0, s0
50039268934SCraig Topper; RV32I-NEXT:    li a1, 0
501*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
50239268934SCraig Topper; RV32I-NEXT:    lui a2, 524288
5038def89b5Swangpc; RV32I-NEXT:    xor a1, s2, a2
50439268934SCraig Topper; RV32I-NEXT:    xor a2, a0, a2
5058def89b5Swangpc; RV32I-NEXT:    mv a0, s1
506*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
50739268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
50839268934SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
50939268934SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
51039268934SCraig Topper; RV32I-NEXT:    lw s2, 0(sp) # 4-byte Folded Reload
51139268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
51239268934SCraig Topper; RV32I-NEXT:    ret
51339268934SCraig Topper;
51439268934SCraig Topper; RV64I-LABEL: fnmadd_s_2:
51539268934SCraig Topper; RV64I:       # %bb.0:
51639268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
51739268934SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
51839268934SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
51939268934SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
52039268934SCraig Topper; RV64I-NEXT:    sd s2, 0(sp) # 8-byte Folded Spill
52139268934SCraig Topper; RV64I-NEXT:    mv s0, a2
5228def89b5Swangpc; RV64I-NEXT:    mv s1, a0
52339268934SCraig Topper; RV64I-NEXT:    mv a0, a1
52439268934SCraig Topper; RV64I-NEXT:    li a1, 0
525*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
5268def89b5Swangpc; RV64I-NEXT:    mv s2, a0
52739268934SCraig Topper; RV64I-NEXT:    mv a0, s0
52839268934SCraig Topper; RV64I-NEXT:    li a1, 0
529*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
53039268934SCraig Topper; RV64I-NEXT:    lui a2, 524288
5318def89b5Swangpc; RV64I-NEXT:    xor a1, s2, a2
53239268934SCraig Topper; RV64I-NEXT:    xor a2, a0, a2
5338def89b5Swangpc; RV64I-NEXT:    mv a0, s1
534*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
53539268934SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
53639268934SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
53739268934SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
53839268934SCraig Topper; RV64I-NEXT:    ld s2, 0(sp) # 8-byte Folded Reload
53939268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
54039268934SCraig Topper; RV64I-NEXT:    ret
541fe558efeSShao-Ce SUN;
542fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fnmadd_s_2:
543fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
544fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a1, a1, zero
545fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a2, a2, zero
546fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fnmadd.s a0, a1, a0, a2
547fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
54839268934SCraig Topper  %b_ = fadd float 0.0, %b
54939268934SCraig Topper  %c_ = fadd float 0.0, %c
55039268934SCraig Topper  %negb = fneg float %b_
55139268934SCraig Topper  %negc = fneg float %c_
55239268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %negb, float %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
55339268934SCraig Topper  ret float %1
55439268934SCraig Topper}
55539268934SCraig Topper
55639268934SCraig Topperdefine float @fnmsub_s(float %a, float %b, float %c) nounwind strictfp {
55784bacb18SShao-Ce SUN; CHECKIF-LABEL: fnmsub_s:
55884bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
5597b0c4184SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
5607b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa0, fa5
5617b0c4184SCraig Topper; CHECKIF-NEXT:    fnmsub.s fa0, fa5, fa1, fa2
56284bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
56339268934SCraig Topper;
56439268934SCraig Topper; RV32I-LABEL: fnmsub_s:
56539268934SCraig Topper; RV32I:       # %bb.0:
56639268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
56739268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
56839268934SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
56939268934SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
57039268934SCraig Topper; RV32I-NEXT:    mv s0, a2
57139268934SCraig Topper; RV32I-NEXT:    mv s1, a1
57239268934SCraig Topper; RV32I-NEXT:    li a1, 0
573*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
57439268934SCraig Topper; RV32I-NEXT:    lui a1, 524288
57539268934SCraig Topper; RV32I-NEXT:    xor a0, a0, a1
57639268934SCraig Topper; RV32I-NEXT:    mv a1, s1
57739268934SCraig Topper; RV32I-NEXT:    mv a2, s0
578*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
57939268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
58039268934SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
58139268934SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
58239268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
58339268934SCraig Topper; RV32I-NEXT:    ret
58439268934SCraig Topper;
58539268934SCraig Topper; RV64I-LABEL: fnmsub_s:
58639268934SCraig Topper; RV64I:       # %bb.0:
58739268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
58839268934SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
58939268934SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
59039268934SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
59139268934SCraig Topper; RV64I-NEXT:    mv s0, a2
59239268934SCraig Topper; RV64I-NEXT:    mv s1, a1
59339268934SCraig Topper; RV64I-NEXT:    li a1, 0
594*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
59539268934SCraig Topper; RV64I-NEXT:    lui a1, 524288
59639268934SCraig Topper; RV64I-NEXT:    xor a0, a0, a1
59739268934SCraig Topper; RV64I-NEXT:    mv a1, s1
59839268934SCraig Topper; RV64I-NEXT:    mv a2, s0
599*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
60039268934SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
60139268934SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
60239268934SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
60339268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
60439268934SCraig Topper; RV64I-NEXT:    ret
605fe558efeSShao-Ce SUN;
606fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fnmsub_s:
607fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
608fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a0, a0, zero
609fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fnmsub.s a0, a0, a1, a2
610fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
61139268934SCraig Topper  %a_ = fadd float 0.0, %a
61239268934SCraig Topper  %nega = fneg float %a_
61339268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %nega, float %b, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
61439268934SCraig Topper  ret float %1
61539268934SCraig Topper}
61639268934SCraig Topper
61739268934SCraig Topperdefine float @fnmsub_s_2(float %a, float %b, float %c) nounwind strictfp {
61884bacb18SShao-Ce SUN; CHECKIF-LABEL: fnmsub_s_2:
61984bacb18SShao-Ce SUN; CHECKIF:       # %bb.0:
6207b0c4184SCraig Topper; CHECKIF-NEXT:    fmv.w.x fa5, zero
6217b0c4184SCraig Topper; CHECKIF-NEXT:    fadd.s fa5, fa1, fa5
6227b0c4184SCraig Topper; CHECKIF-NEXT:    fnmsub.s fa0, fa5, fa0, fa2
62384bacb18SShao-Ce SUN; CHECKIF-NEXT:    ret
62439268934SCraig Topper;
62539268934SCraig Topper; RV32I-LABEL: fnmsub_s_2:
62639268934SCraig Topper; RV32I:       # %bb.0:
62739268934SCraig Topper; RV32I-NEXT:    addi sp, sp, -16
62839268934SCraig Topper; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
62939268934SCraig Topper; RV32I-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
63039268934SCraig Topper; RV32I-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
63139268934SCraig Topper; RV32I-NEXT:    mv s0, a2
63239268934SCraig Topper; RV32I-NEXT:    mv s1, a0
63339268934SCraig Topper; RV32I-NEXT:    mv a0, a1
63439268934SCraig Topper; RV32I-NEXT:    li a1, 0
635*eabaee0cSFangrui Song; RV32I-NEXT:    call __addsf3
63639268934SCraig Topper; RV32I-NEXT:    lui a1, 524288
63739268934SCraig Topper; RV32I-NEXT:    xor a1, a0, a1
63839268934SCraig Topper; RV32I-NEXT:    mv a0, s1
63939268934SCraig Topper; RV32I-NEXT:    mv a2, s0
640*eabaee0cSFangrui Song; RV32I-NEXT:    call fmaf
64139268934SCraig Topper; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
64239268934SCraig Topper; RV32I-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
64339268934SCraig Topper; RV32I-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
64439268934SCraig Topper; RV32I-NEXT:    addi sp, sp, 16
64539268934SCraig Topper; RV32I-NEXT:    ret
64639268934SCraig Topper;
64739268934SCraig Topper; RV64I-LABEL: fnmsub_s_2:
64839268934SCraig Topper; RV64I:       # %bb.0:
64939268934SCraig Topper; RV64I-NEXT:    addi sp, sp, -32
65039268934SCraig Topper; RV64I-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
65139268934SCraig Topper; RV64I-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
65239268934SCraig Topper; RV64I-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
65339268934SCraig Topper; RV64I-NEXT:    mv s0, a2
65439268934SCraig Topper; RV64I-NEXT:    mv s1, a0
65539268934SCraig Topper; RV64I-NEXT:    mv a0, a1
65639268934SCraig Topper; RV64I-NEXT:    li a1, 0
657*eabaee0cSFangrui Song; RV64I-NEXT:    call __addsf3
65839268934SCraig Topper; RV64I-NEXT:    lui a1, 524288
65939268934SCraig Topper; RV64I-NEXT:    xor a1, a0, a1
66039268934SCraig Topper; RV64I-NEXT:    mv a0, s1
66139268934SCraig Topper; RV64I-NEXT:    mv a2, s0
662*eabaee0cSFangrui Song; RV64I-NEXT:    call fmaf
66339268934SCraig Topper; RV64I-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
66439268934SCraig Topper; RV64I-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
66539268934SCraig Topper; RV64I-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
66639268934SCraig Topper; RV64I-NEXT:    addi sp, sp, 32
66739268934SCraig Topper; RV64I-NEXT:    ret
668fe558efeSShao-Ce SUN;
669fe558efeSShao-Ce SUN; CHECKIZFINX-LABEL: fnmsub_s_2:
670fe558efeSShao-Ce SUN; CHECKIZFINX:       # %bb.0:
671fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fadd.s a1, a1, zero
672fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    fnmsub.s a0, a1, a0, a2
673fe558efeSShao-Ce SUN; CHECKIZFINX-NEXT:    ret
67439268934SCraig Topper  %b_ = fadd float 0.0, %b
67539268934SCraig Topper  %negb = fneg float %b_
67639268934SCraig Topper  %1 = call float @llvm.experimental.constrained.fma.f32(float %a, float %negb, float %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp
67739268934SCraig Topper  ret float %1
67839268934SCraig Topper}
679