139268934SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 239268934SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \ 3b271184fSCraig Topper; RUN: -disable-strictnode-mutation -target-abi=ilp32d \ 484bacb18SShao-Ce SUN; RUN: | FileCheck -check-prefixes=CHECKIFD,RV32IFD %s 539268934SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \ 6b271184fSCraig Topper; RUN: -disable-strictnode-mutation -target-abi=lp64d \ 784bacb18SShao-Ce SUN; RUN: | FileCheck -check-prefixes=CHECKIFD,RV64IFD %s 88b90f8e0SShao-Ce SUN; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \ 98b90f8e0SShao-Ce SUN; RUN: -disable-strictnode-mutation -target-abi=ilp32 \ 108b90f8e0SShao-Ce SUN; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s 112dc0fa05SShao-Ce SUN; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \ 122dc0fa05SShao-Ce SUN; RUN: -disable-strictnode-mutation -target-abi=lp64 \ 132dc0fa05SShao-Ce SUN; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s 1439268934SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 1539268934SCraig Topper; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s 1639268934SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 1739268934SCraig Topper; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s 1839268934SCraig Topper 1939268934SCraig Topperdefine double @fadd_d(double %a, double %b) nounwind strictfp { 2084bacb18SShao-Ce SUN; CHECKIFD-LABEL: fadd_d: 2184bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 2284bacb18SShao-Ce SUN; CHECKIFD-NEXT: fadd.d fa0, fa0, fa1 2384bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 2439268934SCraig Topper; 258b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fadd_d: 268b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 278b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a2 288b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 298b90f8e0SShao-Ce SUN; 302dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fadd_d: 312dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 322dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, a1 332dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 342dc0fa05SShao-Ce SUN; 3539268934SCraig Topper; RV32I-LABEL: fadd_d: 3639268934SCraig Topper; RV32I: # %bb.0: 3739268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 3839268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 39*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 4039268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 4139268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 4239268934SCraig Topper; RV32I-NEXT: ret 4339268934SCraig Topper; 4439268934SCraig Topper; RV64I-LABEL: fadd_d: 4539268934SCraig Topper; RV64I: # %bb.0: 4639268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 4739268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 48*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 4939268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 5039268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 5139268934SCraig Topper; RV64I-NEXT: ret 5239268934SCraig Topper %1 = call double @llvm.experimental.constrained.fadd.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 5339268934SCraig Topper ret double %1 5439268934SCraig Topper} 5539268934SCraig Topperdeclare double @llvm.experimental.constrained.fadd.f64(double, double, metadata, metadata) 5639268934SCraig Topper 5739268934SCraig Topperdefine double @fsub_d(double %a, double %b) nounwind strictfp { 5884bacb18SShao-Ce SUN; CHECKIFD-LABEL: fsub_d: 5984bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 6084bacb18SShao-Ce SUN; CHECKIFD-NEXT: fsub.d fa0, fa0, fa1 6184bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 6239268934SCraig Topper; 638b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fsub_d: 648b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 658b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fsub.d a0, a0, a2 668b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 678b90f8e0SShao-Ce SUN; 682dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fsub_d: 692dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 702dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fsub.d a0, a0, a1 712dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 722dc0fa05SShao-Ce SUN; 7339268934SCraig Topper; RV32I-LABEL: fsub_d: 7439268934SCraig Topper; RV32I: # %bb.0: 7539268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 7639268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 77*eabaee0cSFangrui Song; RV32I-NEXT: call __subdf3 7839268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 7939268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 8039268934SCraig Topper; RV32I-NEXT: ret 8139268934SCraig Topper; 8239268934SCraig Topper; RV64I-LABEL: fsub_d: 8339268934SCraig Topper; RV64I: # %bb.0: 8439268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 8539268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 86*eabaee0cSFangrui Song; RV64I-NEXT: call __subdf3 8739268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 8839268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 8939268934SCraig Topper; RV64I-NEXT: ret 9039268934SCraig Topper %1 = call double @llvm.experimental.constrained.fsub.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 9139268934SCraig Topper ret double %1 9239268934SCraig Topper} 9339268934SCraig Topperdeclare double @llvm.experimental.constrained.fsub.f64(double, double, metadata, metadata) 9439268934SCraig Topper 9539268934SCraig Topperdefine double @fmul_d(double %a, double %b) nounwind strictfp { 9684bacb18SShao-Ce SUN; CHECKIFD-LABEL: fmul_d: 9784bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 9884bacb18SShao-Ce SUN; CHECKIFD-NEXT: fmul.d fa0, fa0, fa1 9984bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 10039268934SCraig Topper; 1018b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fmul_d: 1028b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 1038b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fmul.d a0, a0, a2 1048b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 1058b90f8e0SShao-Ce SUN; 1062dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fmul_d: 1072dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 1082dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fmul.d a0, a0, a1 1092dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 1102dc0fa05SShao-Ce SUN; 11139268934SCraig Topper; RV32I-LABEL: fmul_d: 11239268934SCraig Topper; RV32I: # %bb.0: 11339268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 11439268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 115*eabaee0cSFangrui Song; RV32I-NEXT: call __muldf3 11639268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 11739268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 11839268934SCraig Topper; RV32I-NEXT: ret 11939268934SCraig Topper; 12039268934SCraig Topper; RV64I-LABEL: fmul_d: 12139268934SCraig Topper; RV64I: # %bb.0: 12239268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 12339268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 124*eabaee0cSFangrui Song; RV64I-NEXT: call __muldf3 12539268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 12639268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 12739268934SCraig Topper; RV64I-NEXT: ret 12839268934SCraig Topper %1 = call double @llvm.experimental.constrained.fmul.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 12939268934SCraig Topper ret double %1 13039268934SCraig Topper} 13139268934SCraig Topperdeclare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata) 13239268934SCraig Topper 13339268934SCraig Topperdefine double @fdiv_d(double %a, double %b) nounwind strictfp { 13484bacb18SShao-Ce SUN; CHECKIFD-LABEL: fdiv_d: 13584bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 13684bacb18SShao-Ce SUN; CHECKIFD-NEXT: fdiv.d fa0, fa0, fa1 13784bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 13839268934SCraig Topper; 1398b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fdiv_d: 1408b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 1418b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fdiv.d a0, a0, a2 1428b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 1438b90f8e0SShao-Ce SUN; 1442dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fdiv_d: 1452dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 1462dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fdiv.d a0, a0, a1 1472dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 1482dc0fa05SShao-Ce SUN; 14939268934SCraig Topper; RV32I-LABEL: fdiv_d: 15039268934SCraig Topper; RV32I: # %bb.0: 15139268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 15239268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 153*eabaee0cSFangrui Song; RV32I-NEXT: call __divdf3 15439268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 15539268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 15639268934SCraig Topper; RV32I-NEXT: ret 15739268934SCraig Topper; 15839268934SCraig Topper; RV64I-LABEL: fdiv_d: 15939268934SCraig Topper; RV64I: # %bb.0: 16039268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 16139268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 162*eabaee0cSFangrui Song; RV64I-NEXT: call __divdf3 16339268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 16439268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 16539268934SCraig Topper; RV64I-NEXT: ret 16639268934SCraig Topper %1 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %b, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 16739268934SCraig Topper ret double %1 16839268934SCraig Topper} 16939268934SCraig Topperdeclare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata) 17039268934SCraig Topper 17139268934SCraig Topperdefine double @fsqrt_d(double %a) nounwind strictfp { 17284bacb18SShao-Ce SUN; CHECKIFD-LABEL: fsqrt_d: 17384bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 17484bacb18SShao-Ce SUN; CHECKIFD-NEXT: fsqrt.d fa0, fa0 17584bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 17639268934SCraig Topper; 1778b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fsqrt_d: 1788b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 1798b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fsqrt.d a0, a0 1808b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 1818b90f8e0SShao-Ce SUN; 1822dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fsqrt_d: 1832dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 1842dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fsqrt.d a0, a0 1852dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 1862dc0fa05SShao-Ce SUN; 18739268934SCraig Topper; RV32I-LABEL: fsqrt_d: 18839268934SCraig Topper; RV32I: # %bb.0: 18939268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 19039268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 191*eabaee0cSFangrui Song; RV32I-NEXT: call sqrt 19239268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 19339268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 19439268934SCraig Topper; RV32I-NEXT: ret 19539268934SCraig Topper; 19639268934SCraig Topper; RV64I-LABEL: fsqrt_d: 19739268934SCraig Topper; RV64I: # %bb.0: 19839268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 19939268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 200*eabaee0cSFangrui Song; RV64I-NEXT: call sqrt 20139268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 20239268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 20339268934SCraig Topper; RV64I-NEXT: ret 20439268934SCraig Topper %1 = call double @llvm.experimental.constrained.sqrt.f64(double %a, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 20539268934SCraig Topper ret double %1 20639268934SCraig Topper} 20739268934SCraig Topperdeclare double @llvm.experimental.constrained.sqrt.f64(double, metadata, metadata) 20839268934SCraig Topper 20939268934SCraig Topperdefine double @fmin_d(double %a, double %b) nounwind strictfp { 21039268934SCraig Topper; RV32IFD-LABEL: fmin_d: 21139268934SCraig Topper; RV32IFD: # %bb.0: 21239268934SCraig Topper; RV32IFD-NEXT: addi sp, sp, -16 21339268934SCraig Topper; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 214*eabaee0cSFangrui Song; RV32IFD-NEXT: call fmin 21539268934SCraig Topper; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 21639268934SCraig Topper; RV32IFD-NEXT: addi sp, sp, 16 21739268934SCraig Topper; RV32IFD-NEXT: ret 21839268934SCraig Topper; 21939268934SCraig Topper; RV64IFD-LABEL: fmin_d: 22039268934SCraig Topper; RV64IFD: # %bb.0: 22139268934SCraig Topper; RV64IFD-NEXT: addi sp, sp, -16 22239268934SCraig Topper; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 223*eabaee0cSFangrui Song; RV64IFD-NEXT: call fmin 22439268934SCraig Topper; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 22539268934SCraig Topper; RV64IFD-NEXT: addi sp, sp, 16 22639268934SCraig Topper; RV64IFD-NEXT: ret 22739268934SCraig Topper; 2288b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fmin_d: 2298b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 2308b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 2318b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 232*eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT: call fmin 2338b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2348b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 2358b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 2368b90f8e0SShao-Ce SUN; 2372dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fmin_d: 2382dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 2392dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 2402dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 241*eabaee0cSFangrui Song; RV64IZFINXZDINX-NEXT: call fmin 2422dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 2432dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 2442dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 2452dc0fa05SShao-Ce SUN; 24639268934SCraig Topper; RV32I-LABEL: fmin_d: 24739268934SCraig Topper; RV32I: # %bb.0: 24839268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 24939268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 250*eabaee0cSFangrui Song; RV32I-NEXT: call fmin 25139268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 25239268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 25339268934SCraig Topper; RV32I-NEXT: ret 25439268934SCraig Topper; 25539268934SCraig Topper; RV64I-LABEL: fmin_d: 25639268934SCraig Topper; RV64I: # %bb.0: 25739268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 25839268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 259*eabaee0cSFangrui Song; RV64I-NEXT: call fmin 26039268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 26139268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 26239268934SCraig Topper; RV64I-NEXT: ret 26339268934SCraig Topper %1 = call double @llvm.experimental.constrained.minnum.f64(double %a, double %b, metadata !"fpexcept.strict") strictfp 26439268934SCraig Topper ret double %1 26539268934SCraig Topper} 26639268934SCraig Topperdeclare double @llvm.experimental.constrained.minnum.f64(double, double, metadata) strictfp 26739268934SCraig Topper 26839268934SCraig Topperdefine double @fmax_d(double %a, double %b) nounwind strictfp { 26939268934SCraig Topper; RV32IFD-LABEL: fmax_d: 27039268934SCraig Topper; RV32IFD: # %bb.0: 27139268934SCraig Topper; RV32IFD-NEXT: addi sp, sp, -16 27239268934SCraig Topper; RV32IFD-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 273*eabaee0cSFangrui Song; RV32IFD-NEXT: call fmax 27439268934SCraig Topper; RV32IFD-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 27539268934SCraig Topper; RV32IFD-NEXT: addi sp, sp, 16 27639268934SCraig Topper; RV32IFD-NEXT: ret 27739268934SCraig Topper; 27839268934SCraig Topper; RV64IFD-LABEL: fmax_d: 27939268934SCraig Topper; RV64IFD: # %bb.0: 28039268934SCraig Topper; RV64IFD-NEXT: addi sp, sp, -16 28139268934SCraig Topper; RV64IFD-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 282*eabaee0cSFangrui Song; RV64IFD-NEXT: call fmax 28339268934SCraig Topper; RV64IFD-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 28439268934SCraig Topper; RV64IFD-NEXT: addi sp, sp, 16 28539268934SCraig Topper; RV64IFD-NEXT: ret 28639268934SCraig Topper; 2878b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fmax_d: 2888b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 2898b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: addi sp, sp, -16 2908b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 291*eabaee0cSFangrui Song; RV32IZFINXZDINX-NEXT: call fmax 2928b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 2938b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: addi sp, sp, 16 2948b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 2958b90f8e0SShao-Ce SUN; 2962dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fmax_d: 2972dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 2982dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: addi sp, sp, -16 2992dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 300*eabaee0cSFangrui Song; RV64IZFINXZDINX-NEXT: call fmax 3012dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 3022dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: addi sp, sp, 16 3032dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 3042dc0fa05SShao-Ce SUN; 30539268934SCraig Topper; RV32I-LABEL: fmax_d: 30639268934SCraig Topper; RV32I: # %bb.0: 30739268934SCraig Topper; RV32I-NEXT: addi sp, sp, -16 30839268934SCraig Topper; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 309*eabaee0cSFangrui Song; RV32I-NEXT: call fmax 31039268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 31139268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 31239268934SCraig Topper; RV32I-NEXT: ret 31339268934SCraig Topper; 31439268934SCraig Topper; RV64I-LABEL: fmax_d: 31539268934SCraig Topper; RV64I: # %bb.0: 31639268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 31739268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 318*eabaee0cSFangrui Song; RV64I-NEXT: call fmax 31939268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 32039268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 32139268934SCraig Topper; RV64I-NEXT: ret 32239268934SCraig Topper %1 = call double @llvm.experimental.constrained.maxnum.f64(double %a, double %b, metadata !"fpexcept.strict") strictfp 32339268934SCraig Topper ret double %1 32439268934SCraig Topper} 32539268934SCraig Topperdeclare double @llvm.experimental.constrained.maxnum.f64(double, double, metadata) strictfp 32639268934SCraig Topper 32739268934SCraig Topperdefine double @fmadd_d(double %a, double %b, double %c) nounwind strictfp { 32884bacb18SShao-Ce SUN; CHECKIFD-LABEL: fmadd_d: 32984bacb18SShao-Ce SUN; CHECKIFD: # %bb.0: 33084bacb18SShao-Ce SUN; CHECKIFD-NEXT: fmadd.d fa0, fa0, fa1, fa2 33184bacb18SShao-Ce SUN; CHECKIFD-NEXT: ret 33239268934SCraig Topper; 3338b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fmadd_d: 3348b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 3358b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fmadd.d a0, a0, a2, a4 3368b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 3378b90f8e0SShao-Ce SUN; 3382dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fmadd_d: 3392dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 3402dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fmadd.d a0, a0, a1, a2 3412dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 3422dc0fa05SShao-Ce SUN; 34339268934SCraig Topper; RV32I-LABEL: fmadd_d: 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 347*eabaee0cSFangrui Song; RV32I-NEXT: call fma 34839268934SCraig Topper; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 34939268934SCraig Topper; RV32I-NEXT: addi sp, sp, 16 35039268934SCraig Topper; RV32I-NEXT: ret 35139268934SCraig Topper; 35239268934SCraig Topper; RV64I-LABEL: fmadd_d: 35339268934SCraig Topper; RV64I: # %bb.0: 35439268934SCraig Topper; RV64I-NEXT: addi sp, sp, -16 35539268934SCraig Topper; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 356*eabaee0cSFangrui Song; RV64I-NEXT: call fma 35739268934SCraig Topper; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 35839268934SCraig Topper; RV64I-NEXT: addi sp, sp, 16 35939268934SCraig Topper; RV64I-NEXT: ret 36039268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %b, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 36139268934SCraig Topper ret double %1 36239268934SCraig Topper} 36339268934SCraig Topperdeclare double @llvm.experimental.constrained.fma.f64(double, double, double, metadata, metadata) strictfp 36439268934SCraig Topper 36539268934SCraig Topperdefine double @fmsub_d(double %a, double %b, double %c) nounwind strictfp { 36639268934SCraig Topper; RV32IFD-LABEL: fmsub_d: 36739268934SCraig Topper; RV32IFD: # %bb.0: 3687b0c4184SCraig Topper; RV32IFD-NEXT: fcvt.d.w fa5, zero 3697b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa5, fa2, fa5 3707b0c4184SCraig Topper; RV32IFD-NEXT: fmsub.d fa0, fa0, fa1, fa5 37139268934SCraig Topper; RV32IFD-NEXT: ret 37239268934SCraig Topper; 37339268934SCraig Topper; RV64IFD-LABEL: fmsub_d: 37439268934SCraig Topper; RV64IFD: # %bb.0: 3757b0c4184SCraig Topper; RV64IFD-NEXT: fmv.d.x fa5, zero 3767b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa5, fa2, fa5 3777b0c4184SCraig Topper; RV64IFD-NEXT: fmsub.d fa0, fa0, fa1, fa5 37839268934SCraig Topper; RV64IFD-NEXT: ret 37939268934SCraig Topper; 3808b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fmsub_d: 3818b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 3828b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fcvt.d.w a6, zero 3838b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, a6 3848b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fmsub.d a0, a0, a2, a4 3858b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 3868b90f8e0SShao-Ce SUN; 3872dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fmsub_d: 3882dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 3892dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero 3902dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fmsub.d a0, a0, a1, a2 3912dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 3922dc0fa05SShao-Ce SUN; 39339268934SCraig Topper; RV32I-LABEL: fmsub_d: 39439268934SCraig Topper; RV32I: # %bb.0: 39539268934SCraig Topper; RV32I-NEXT: addi sp, sp, -32 39639268934SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 39739268934SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 39839268934SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 39939268934SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 40039268934SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 4018def89b5Swangpc; RV32I-NEXT: mv s0, a3 4028def89b5Swangpc; RV32I-NEXT: mv s1, a2 4038def89b5Swangpc; RV32I-NEXT: mv s2, a1 4048def89b5Swangpc; RV32I-NEXT: mv s3, a0 40539268934SCraig Topper; RV32I-NEXT: mv a0, a4 40639268934SCraig Topper; RV32I-NEXT: mv a1, a5 40739268934SCraig Topper; RV32I-NEXT: li a2, 0 40839268934SCraig Topper; RV32I-NEXT: li a3, 0 409*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 41039268934SCraig Topper; RV32I-NEXT: mv a4, a0 411e00e20a0SCraig Topper; RV32I-NEXT: lui a5, 524288 412e00e20a0SCraig Topper; RV32I-NEXT: xor a5, a1, a5 4138def89b5Swangpc; RV32I-NEXT: mv a0, s3 4148def89b5Swangpc; RV32I-NEXT: mv a1, s2 4158def89b5Swangpc; RV32I-NEXT: mv a2, s1 4168def89b5Swangpc; RV32I-NEXT: mv a3, s0 417*eabaee0cSFangrui Song; RV32I-NEXT: call fma 41839268934SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 41939268934SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 42039268934SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 42139268934SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 42239268934SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 42339268934SCraig Topper; RV32I-NEXT: addi sp, sp, 32 42439268934SCraig Topper; RV32I-NEXT: ret 42539268934SCraig Topper; 42639268934SCraig Topper; RV64I-LABEL: fmsub_d: 42739268934SCraig Topper; RV64I: # %bb.0: 42839268934SCraig Topper; RV64I-NEXT: addi sp, sp, -32 42939268934SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 43039268934SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 43139268934SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 43239268934SCraig Topper; RV64I-NEXT: mv s0, a1 43339268934SCraig Topper; RV64I-NEXT: mv s1, a0 43439268934SCraig Topper; RV64I-NEXT: mv a0, a2 43539268934SCraig Topper; RV64I-NEXT: li a1, 0 436*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 43739268934SCraig Topper; RV64I-NEXT: li a1, -1 43839268934SCraig Topper; RV64I-NEXT: slli a1, a1, 63 43939268934SCraig Topper; RV64I-NEXT: xor a2, a0, a1 44039268934SCraig Topper; RV64I-NEXT: mv a0, s1 44139268934SCraig Topper; RV64I-NEXT: mv a1, s0 442*eabaee0cSFangrui Song; RV64I-NEXT: call fma 44339268934SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 44439268934SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 44539268934SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 44639268934SCraig Topper; RV64I-NEXT: addi sp, sp, 32 44739268934SCraig Topper; RV64I-NEXT: ret 44839268934SCraig Topper %c_ = fadd double 0.0, %c ; avoid negation using xor 44939268934SCraig Topper %negc = fneg double %c_ 45039268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %b, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 45139268934SCraig Topper ret double %1 45239268934SCraig Topper} 45339268934SCraig Topper 45439268934SCraig Topperdefine double @fnmadd_d(double %a, double %b, double %c) nounwind strictfp { 45539268934SCraig Topper; RV32IFD-LABEL: fnmadd_d: 45639268934SCraig Topper; RV32IFD: # %bb.0: 4577b0c4184SCraig Topper; RV32IFD-NEXT: fcvt.d.w fa5, zero 4587b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa4, fa0, fa5 4597b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa5, fa2, fa5 4607b0c4184SCraig Topper; RV32IFD-NEXT: fnmadd.d fa0, fa4, fa1, fa5 46139268934SCraig Topper; RV32IFD-NEXT: ret 46239268934SCraig Topper; 46339268934SCraig Topper; RV64IFD-LABEL: fnmadd_d: 46439268934SCraig Topper; RV64IFD: # %bb.0: 4657b0c4184SCraig Topper; RV64IFD-NEXT: fmv.d.x fa5, zero 4667b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa4, fa0, fa5 4677b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa5, fa2, fa5 4687b0c4184SCraig Topper; RV64IFD-NEXT: fnmadd.d fa0, fa4, fa1, fa5 46939268934SCraig Topper; RV64IFD-NEXT: ret 47039268934SCraig Topper; 4718b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fnmadd_d: 4728b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 4738b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fcvt.d.w a6, zero 4748b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a6 4758b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, a6 4768b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fnmadd.d a0, a0, a2, a4 4778b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 4788b90f8e0SShao-Ce SUN; 4792dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fnmadd_d: 4802dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 4812dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, zero 4822dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero 4832dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fnmadd.d a0, a0, a1, a2 4842dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 4852dc0fa05SShao-Ce SUN; 48639268934SCraig Topper; RV32I-LABEL: fnmadd_d: 48739268934SCraig Topper; RV32I: # %bb.0: 48839268934SCraig Topper; RV32I-NEXT: addi sp, sp, -32 48939268934SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 49039268934SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 49139268934SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 49239268934SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 49339268934SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 49439268934SCraig Topper; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 49539268934SCraig Topper; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill 4968def89b5Swangpc; RV32I-NEXT: mv s0, a5 4978def89b5Swangpc; RV32I-NEXT: mv s1, a4 49839268934SCraig Topper; RV32I-NEXT: mv s2, a3 49939268934SCraig Topper; RV32I-NEXT: mv s3, a2 50039268934SCraig Topper; RV32I-NEXT: li a2, 0 50139268934SCraig Topper; RV32I-NEXT: li a3, 0 502*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 5038def89b5Swangpc; RV32I-NEXT: mv s4, a0 5048def89b5Swangpc; RV32I-NEXT: mv s5, a1 5058def89b5Swangpc; RV32I-NEXT: mv a0, s1 5068def89b5Swangpc; RV32I-NEXT: mv a1, s0 50739268934SCraig Topper; RV32I-NEXT: li a2, 0 50839268934SCraig Topper; RV32I-NEXT: li a3, 0 509*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 51039268934SCraig Topper; RV32I-NEXT: mv a4, a0 511e00e20a0SCraig Topper; RV32I-NEXT: lui a5, 524288 512e00e20a0SCraig Topper; RV32I-NEXT: xor a2, s5, a5 513e00e20a0SCraig Topper; RV32I-NEXT: xor a5, a1, a5 5148def89b5Swangpc; RV32I-NEXT: mv a0, s4 51539268934SCraig Topper; RV32I-NEXT: mv a1, a2 51639268934SCraig Topper; RV32I-NEXT: mv a2, s3 51739268934SCraig Topper; RV32I-NEXT: mv a3, s2 518*eabaee0cSFangrui Song; RV32I-NEXT: call fma 51939268934SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 52039268934SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 52139268934SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 52239268934SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 52339268934SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 52439268934SCraig Topper; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 52539268934SCraig Topper; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload 52639268934SCraig Topper; RV32I-NEXT: addi sp, sp, 32 52739268934SCraig Topper; RV32I-NEXT: ret 52839268934SCraig Topper; 52939268934SCraig Topper; RV64I-LABEL: fnmadd_d: 53039268934SCraig Topper; RV64I: # %bb.0: 53139268934SCraig Topper; RV64I-NEXT: addi sp, sp, -32 53239268934SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 53339268934SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 53439268934SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 53539268934SCraig Topper; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 53639268934SCraig Topper; RV64I-NEXT: mv s0, a2 5378def89b5Swangpc; RV64I-NEXT: mv s1, a1 53839268934SCraig Topper; RV64I-NEXT: li a1, 0 539*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 5408def89b5Swangpc; RV64I-NEXT: mv s2, a0 54139268934SCraig Topper; RV64I-NEXT: mv a0, s0 54239268934SCraig Topper; RV64I-NEXT: li a1, 0 543*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 54439268934SCraig Topper; RV64I-NEXT: li a1, -1 54539268934SCraig Topper; RV64I-NEXT: slli a2, a1, 63 5468def89b5Swangpc; RV64I-NEXT: xor a1, s2, a2 54739268934SCraig Topper; RV64I-NEXT: xor a2, a0, a2 54839268934SCraig Topper; RV64I-NEXT: mv a0, a1 5498def89b5Swangpc; RV64I-NEXT: mv a1, s1 550*eabaee0cSFangrui Song; RV64I-NEXT: call fma 55139268934SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 55239268934SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 55339268934SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 55439268934SCraig Topper; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload 55539268934SCraig Topper; RV64I-NEXT: addi sp, sp, 32 55639268934SCraig Topper; RV64I-NEXT: ret 55739268934SCraig Topper %a_ = fadd double 0.0, %a 55839268934SCraig Topper %c_ = fadd double 0.0, %c 55939268934SCraig Topper %nega = fneg double %a_ 56039268934SCraig Topper %negc = fneg double %c_ 56139268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %nega, double %b, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 56239268934SCraig Topper ret double %1 56339268934SCraig Topper} 56439268934SCraig Topper 56539268934SCraig Topperdefine double @fnmadd_d_2(double %a, double %b, double %c) nounwind strictfp { 56639268934SCraig Topper; RV32IFD-LABEL: fnmadd_d_2: 56739268934SCraig Topper; RV32IFD: # %bb.0: 5687b0c4184SCraig Topper; RV32IFD-NEXT: fcvt.d.w fa5, zero 5697b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa4, fa1, fa5 5707b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa5, fa2, fa5 5717b0c4184SCraig Topper; RV32IFD-NEXT: fnmadd.d fa0, fa4, fa0, fa5 57239268934SCraig Topper; RV32IFD-NEXT: ret 57339268934SCraig Topper; 57439268934SCraig Topper; RV64IFD-LABEL: fnmadd_d_2: 57539268934SCraig Topper; RV64IFD: # %bb.0: 5767b0c4184SCraig Topper; RV64IFD-NEXT: fmv.d.x fa5, zero 5777b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa4, fa1, fa5 5787b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa5, fa2, fa5 5797b0c4184SCraig Topper; RV64IFD-NEXT: fnmadd.d fa0, fa4, fa0, fa5 58039268934SCraig Topper; RV64IFD-NEXT: ret 58139268934SCraig Topper; 5828b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fnmadd_d_2: 5838b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 5848b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fcvt.d.w a6, zero 5858b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a2, a2, a6 5868b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a4, a4, a6 5878b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fnmadd.d a0, a2, a0, a4 5888b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 5898b90f8e0SShao-Ce SUN; 5902dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fnmadd_d_2: 5912dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 5922dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a1, a1, zero 5932dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a2, a2, zero 5942dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fnmadd.d a0, a1, a0, a2 5952dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 5962dc0fa05SShao-Ce SUN; 59739268934SCraig Topper; RV32I-LABEL: fnmadd_d_2: 59839268934SCraig Topper; RV32I: # %bb.0: 59939268934SCraig Topper; RV32I-NEXT: addi sp, sp, -32 60039268934SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 60139268934SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 60239268934SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 60339268934SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 60439268934SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 60539268934SCraig Topper; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 60639268934SCraig Topper; RV32I-NEXT: sw s5, 4(sp) # 4-byte Folded Spill 6078def89b5Swangpc; RV32I-NEXT: mv s0, a5 60839268934SCraig Topper; RV32I-NEXT: mv s1, a4 60939268934SCraig Topper; RV32I-NEXT: mv s2, a1 61039268934SCraig Topper; RV32I-NEXT: mv s3, a0 61139268934SCraig Topper; RV32I-NEXT: mv a0, a2 61239268934SCraig Topper; RV32I-NEXT: mv a1, a3 61339268934SCraig Topper; RV32I-NEXT: li a2, 0 61439268934SCraig Topper; RV32I-NEXT: li a3, 0 615*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 6168def89b5Swangpc; RV32I-NEXT: mv s4, a0 6178def89b5Swangpc; RV32I-NEXT: mv s5, a1 61839268934SCraig Topper; RV32I-NEXT: mv a0, s1 6198def89b5Swangpc; RV32I-NEXT: mv a1, s0 62039268934SCraig Topper; RV32I-NEXT: li a2, 0 62139268934SCraig Topper; RV32I-NEXT: li a3, 0 622*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 62339268934SCraig Topper; RV32I-NEXT: mv a4, a0 624e00e20a0SCraig Topper; RV32I-NEXT: lui a5, 524288 625e00e20a0SCraig Topper; RV32I-NEXT: xor a3, s5, a5 626e00e20a0SCraig Topper; RV32I-NEXT: xor a5, a1, a5 62739268934SCraig Topper; RV32I-NEXT: mv a0, s3 62839268934SCraig Topper; RV32I-NEXT: mv a1, s2 6298def89b5Swangpc; RV32I-NEXT: mv a2, s4 630*eabaee0cSFangrui Song; RV32I-NEXT: call fma 63139268934SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 63239268934SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 63339268934SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 63439268934SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 63539268934SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 63639268934SCraig Topper; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 63739268934SCraig Topper; RV32I-NEXT: lw s5, 4(sp) # 4-byte Folded Reload 63839268934SCraig Topper; RV32I-NEXT: addi sp, sp, 32 63939268934SCraig Topper; RV32I-NEXT: ret 64039268934SCraig Topper; 64139268934SCraig Topper; RV64I-LABEL: fnmadd_d_2: 64239268934SCraig Topper; RV64I: # %bb.0: 64339268934SCraig Topper; RV64I-NEXT: addi sp, sp, -32 64439268934SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 64539268934SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 64639268934SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 64739268934SCraig Topper; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill 64839268934SCraig Topper; RV64I-NEXT: mv s0, a2 6498def89b5Swangpc; RV64I-NEXT: mv s1, a0 65039268934SCraig Topper; RV64I-NEXT: mv a0, a1 65139268934SCraig Topper; RV64I-NEXT: li a1, 0 652*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 6538def89b5Swangpc; RV64I-NEXT: mv s2, a0 65439268934SCraig Topper; RV64I-NEXT: mv a0, s0 65539268934SCraig Topper; RV64I-NEXT: li a1, 0 656*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 65739268934SCraig Topper; RV64I-NEXT: li a1, -1 65839268934SCraig Topper; RV64I-NEXT: slli a2, a1, 63 6598def89b5Swangpc; RV64I-NEXT: xor a1, s2, a2 66039268934SCraig Topper; RV64I-NEXT: xor a2, a0, a2 6618def89b5Swangpc; RV64I-NEXT: mv a0, s1 662*eabaee0cSFangrui Song; RV64I-NEXT: call fma 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: ld s2, 0(sp) # 8-byte Folded Reload 66739268934SCraig Topper; RV64I-NEXT: addi sp, sp, 32 66839268934SCraig Topper; RV64I-NEXT: ret 66939268934SCraig Topper %b_ = fadd double 0.0, %b 67039268934SCraig Topper %c_ = fadd double 0.0, %c 67139268934SCraig Topper %negb = fneg double %b_ 67239268934SCraig Topper %negc = fneg double %c_ 67339268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %negb, double %negc, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 67439268934SCraig Topper ret double %1 67539268934SCraig Topper} 67639268934SCraig Topper 67739268934SCraig Topperdefine double @fnmsub_d(double %a, double %b, double %c) nounwind strictfp { 67839268934SCraig Topper; RV32IFD-LABEL: fnmsub_d: 67939268934SCraig Topper; RV32IFD: # %bb.0: 6807b0c4184SCraig Topper; RV32IFD-NEXT: fcvt.d.w fa5, zero 6817b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa5, fa0, fa5 6827b0c4184SCraig Topper; RV32IFD-NEXT: fnmsub.d fa0, fa5, fa1, fa2 68339268934SCraig Topper; RV32IFD-NEXT: ret 68439268934SCraig Topper; 68539268934SCraig Topper; RV64IFD-LABEL: fnmsub_d: 68639268934SCraig Topper; RV64IFD: # %bb.0: 6877b0c4184SCraig Topper; RV64IFD-NEXT: fmv.d.x fa5, zero 6887b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa5, fa0, fa5 6897b0c4184SCraig Topper; RV64IFD-NEXT: fnmsub.d fa0, fa5, fa1, fa2 69039268934SCraig Topper; RV64IFD-NEXT: ret 69139268934SCraig Topper; 6928b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fnmsub_d: 6938b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 6948b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fcvt.d.w a6, zero 6958b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a0, a0, a6 6968b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fnmsub.d a0, a0, a2, a4 6978b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 6988b90f8e0SShao-Ce SUN; 6992dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fnmsub_d: 7002dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 7012dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a0, a0, zero 7022dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fnmsub.d a0, a0, a1, a2 7032dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 7042dc0fa05SShao-Ce SUN; 70539268934SCraig Topper; RV32I-LABEL: fnmsub_d: 70639268934SCraig Topper; RV32I: # %bb.0: 70739268934SCraig Topper; RV32I-NEXT: addi sp, sp, -32 70839268934SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 70939268934SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 71039268934SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 71139268934SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 71239268934SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 7138def89b5Swangpc; RV32I-NEXT: mv s0, a5 7148def89b5Swangpc; RV32I-NEXT: mv s1, a4 7158def89b5Swangpc; RV32I-NEXT: mv s2, a3 7168def89b5Swangpc; RV32I-NEXT: mv s3, a2 71739268934SCraig Topper; RV32I-NEXT: li a2, 0 71839268934SCraig Topper; RV32I-NEXT: li a3, 0 719*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 72039268934SCraig Topper; RV32I-NEXT: lui a2, 524288 72139268934SCraig Topper; RV32I-NEXT: xor a1, a1, a2 7228def89b5Swangpc; RV32I-NEXT: mv a2, s3 7238def89b5Swangpc; RV32I-NEXT: mv a3, s2 7248def89b5Swangpc; RV32I-NEXT: mv a4, s1 7258def89b5Swangpc; RV32I-NEXT: mv a5, s0 726*eabaee0cSFangrui Song; RV32I-NEXT: call fma 72739268934SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 72839268934SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 72939268934SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 73039268934SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 73139268934SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 73239268934SCraig Topper; RV32I-NEXT: addi sp, sp, 32 73339268934SCraig Topper; RV32I-NEXT: ret 73439268934SCraig Topper; 73539268934SCraig Topper; RV64I-LABEL: fnmsub_d: 73639268934SCraig Topper; RV64I: # %bb.0: 73739268934SCraig Topper; RV64I-NEXT: addi sp, sp, -32 73839268934SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 73939268934SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 74039268934SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 74139268934SCraig Topper; RV64I-NEXT: mv s0, a2 74239268934SCraig Topper; RV64I-NEXT: mv s1, a1 74339268934SCraig Topper; RV64I-NEXT: li a1, 0 744*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 74539268934SCraig Topper; RV64I-NEXT: li a1, -1 74639268934SCraig Topper; RV64I-NEXT: slli a1, a1, 63 74739268934SCraig Topper; RV64I-NEXT: xor a0, a0, a1 74839268934SCraig Topper; RV64I-NEXT: mv a1, s1 74939268934SCraig Topper; RV64I-NEXT: mv a2, s0 750*eabaee0cSFangrui Song; RV64I-NEXT: call fma 75139268934SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 75239268934SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 75339268934SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 75439268934SCraig Topper; RV64I-NEXT: addi sp, sp, 32 75539268934SCraig Topper; RV64I-NEXT: ret 75639268934SCraig Topper %a_ = fadd double 0.0, %a 75739268934SCraig Topper %nega = fneg double %a_ 75839268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %nega, double %b, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 75939268934SCraig Topper ret double %1 76039268934SCraig Topper} 76139268934SCraig Topper 76239268934SCraig Topperdefine double @fnmsub_d_2(double %a, double %b, double %c) nounwind strictfp { 76339268934SCraig Topper; RV32IFD-LABEL: fnmsub_d_2: 76439268934SCraig Topper; RV32IFD: # %bb.0: 7657b0c4184SCraig Topper; RV32IFD-NEXT: fcvt.d.w fa5, zero 7667b0c4184SCraig Topper; RV32IFD-NEXT: fadd.d fa5, fa1, fa5 7677b0c4184SCraig Topper; RV32IFD-NEXT: fnmsub.d fa0, fa5, fa0, fa2 76839268934SCraig Topper; RV32IFD-NEXT: ret 76939268934SCraig Topper; 77039268934SCraig Topper; RV64IFD-LABEL: fnmsub_d_2: 77139268934SCraig Topper; RV64IFD: # %bb.0: 7727b0c4184SCraig Topper; RV64IFD-NEXT: fmv.d.x fa5, zero 7737b0c4184SCraig Topper; RV64IFD-NEXT: fadd.d fa5, fa1, fa5 7747b0c4184SCraig Topper; RV64IFD-NEXT: fnmsub.d fa0, fa5, fa0, fa2 77539268934SCraig Topper; RV64IFD-NEXT: ret 77639268934SCraig Topper; 7778b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-LABEL: fnmsub_d_2: 7788b90f8e0SShao-Ce SUN; RV32IZFINXZDINX: # %bb.0: 7798b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fcvt.d.w a6, zero 7808b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fadd.d a2, a2, a6 7818b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: fnmsub.d a0, a2, a0, a4 7828b90f8e0SShao-Ce SUN; RV32IZFINXZDINX-NEXT: ret 7838b90f8e0SShao-Ce SUN; 7842dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-LABEL: fnmsub_d_2: 7852dc0fa05SShao-Ce SUN; RV64IZFINXZDINX: # %bb.0: 7862dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fadd.d a1, a1, zero 7872dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: fnmsub.d a0, a1, a0, a2 7882dc0fa05SShao-Ce SUN; RV64IZFINXZDINX-NEXT: ret 7892dc0fa05SShao-Ce SUN; 79039268934SCraig Topper; RV32I-LABEL: fnmsub_d_2: 79139268934SCraig Topper; RV32I: # %bb.0: 79239268934SCraig Topper; RV32I-NEXT: addi sp, sp, -32 79339268934SCraig Topper; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 79439268934SCraig Topper; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 79539268934SCraig Topper; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 79639268934SCraig Topper; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 79739268934SCraig Topper; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 7988def89b5Swangpc; RV32I-NEXT: mv s0, a5 7998def89b5Swangpc; RV32I-NEXT: mv s1, a4 8008def89b5Swangpc; RV32I-NEXT: mv s2, a1 8018def89b5Swangpc; RV32I-NEXT: mv s3, a0 80239268934SCraig Topper; RV32I-NEXT: mv a0, a2 80339268934SCraig Topper; RV32I-NEXT: mv a1, a3 80439268934SCraig Topper; RV32I-NEXT: li a2, 0 80539268934SCraig Topper; RV32I-NEXT: li a3, 0 806*eabaee0cSFangrui Song; RV32I-NEXT: call __adddf3 80739268934SCraig Topper; RV32I-NEXT: mv a2, a0 808e00e20a0SCraig Topper; RV32I-NEXT: lui a3, 524288 809e00e20a0SCraig Topper; RV32I-NEXT: xor a3, a1, a3 8108def89b5Swangpc; RV32I-NEXT: mv a0, s3 8118def89b5Swangpc; RV32I-NEXT: mv a1, s2 8128def89b5Swangpc; RV32I-NEXT: mv a4, s1 8138def89b5Swangpc; RV32I-NEXT: mv a5, s0 814*eabaee0cSFangrui Song; RV32I-NEXT: call fma 81539268934SCraig Topper; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 81639268934SCraig Topper; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 81739268934SCraig Topper; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 81839268934SCraig Topper; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 81939268934SCraig Topper; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 82039268934SCraig Topper; RV32I-NEXT: addi sp, sp, 32 82139268934SCraig Topper; RV32I-NEXT: ret 82239268934SCraig Topper; 82339268934SCraig Topper; RV64I-LABEL: fnmsub_d_2: 82439268934SCraig Topper; RV64I: # %bb.0: 82539268934SCraig Topper; RV64I-NEXT: addi sp, sp, -32 82639268934SCraig Topper; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 82739268934SCraig Topper; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 82839268934SCraig Topper; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill 82939268934SCraig Topper; RV64I-NEXT: mv s0, a2 83039268934SCraig Topper; RV64I-NEXT: mv s1, a0 83139268934SCraig Topper; RV64I-NEXT: mv a0, a1 83239268934SCraig Topper; RV64I-NEXT: li a1, 0 833*eabaee0cSFangrui Song; RV64I-NEXT: call __adddf3 83439268934SCraig Topper; RV64I-NEXT: li a1, -1 83539268934SCraig Topper; RV64I-NEXT: slli a1, a1, 63 83639268934SCraig Topper; RV64I-NEXT: xor a1, a0, a1 83739268934SCraig Topper; RV64I-NEXT: mv a0, s1 83839268934SCraig Topper; RV64I-NEXT: mv a2, s0 839*eabaee0cSFangrui Song; RV64I-NEXT: call fma 84039268934SCraig Topper; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 84139268934SCraig Topper; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 84239268934SCraig Topper; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload 84339268934SCraig Topper; RV64I-NEXT: addi sp, sp, 32 84439268934SCraig Topper; RV64I-NEXT: ret 84539268934SCraig Topper %b_ = fadd double 0.0, %b 84639268934SCraig Topper %negb = fneg double %b_ 84739268934SCraig Topper %1 = call double @llvm.experimental.constrained.fma.f64(double %a, double %negb, double %c, metadata !"round.dynamic", metadata !"fpexcept.strict") strictfp 84839268934SCraig Topper ret double %1 84939268934SCraig Topper} 850