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