diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td @@ -233,15 +233,15 @@ class PatFpr64Fpr64 : Pat<(OpNode FPR64:$rs1, FPR64:$rs2), (Inst $rs1, $rs2)>; -class PatFpr64Fpr64DynFrm - : Pat<(OpNode FPR64:$rs1, FPR64:$rs2), (Inst $rs1, $rs2, 0b111)>; +class PatFpr64Fpr64DefFrm + : Pat<(OpNode FPR64:$rs1, FPR64:$rs2), (Inst $rs1, $rs2, 0b000)>; let Predicates = [HasStdExtD] in { /// Float conversion operations // f64 -> f32, f32 -> f64 -def : Pat<(fpround FPR64:$rs1), (FCVT_S_D FPR64:$rs1, 0b111)>; +def : Pat<(fpround FPR64:$rs1), (FCVT_S_D FPR64:$rs1, 0b000)>; def : Pat<(fpextend FPR32:$rs1), (FCVT_D_S FPR32:$rs1)>; // [u]int<->double conversion patterns must be gated on IsRV32 or IsRV64, so @@ -249,12 +249,12 @@ /// Float arithmetic operations -def : PatFpr64Fpr64DynFrm; -def : PatFpr64Fpr64DynFrm; -def : PatFpr64Fpr64DynFrm; -def : PatFpr64Fpr64DynFrm; +def : PatFpr64Fpr64DefFrm; +def : PatFpr64Fpr64DefFrm; +def : PatFpr64Fpr64DefFrm; +def : PatFpr64Fpr64DefFrm; -def : Pat<(fsqrt FPR64:$rs1), (FSQRT_D FPR64:$rs1, 0b111)>; +def : Pat<(fsqrt FPR64:$rs1), (FSQRT_D FPR64:$rs1, 0b000)>; def : Pat<(fneg FPR64:$rs1), (FSGNJN_D $rs1, $rs1)>; def : Pat<(fabs FPR64:$rs1), (FSGNJX_D $rs1, $rs1)>; @@ -263,23 +263,23 @@ def : Pat<(fcopysign FPR64:$rs1, (fneg FPR64:$rs2)), (FSGNJN_D $rs1, $rs2)>; def : Pat<(fcopysign FPR64:$rs1, FPR32:$rs2), (FSGNJ_D $rs1, (FCVT_D_S $rs2))>; def : Pat<(fcopysign FPR32:$rs1, FPR64:$rs2), (FSGNJ_S $rs1, (FCVT_S_D $rs2, - 0b111))>; + 0b000))>; // fmadd: rs1 * rs2 + rs3 def : Pat<(fma FPR64:$rs1, FPR64:$rs2, FPR64:$rs3), - (FMADD_D $rs1, $rs2, $rs3, 0b111)>; + (FMADD_D $rs1, $rs2, $rs3, 0b000)>; // fmsub: rs1 * rs2 - rs3 def : Pat<(fma FPR64:$rs1, FPR64:$rs2, (fneg FPR64:$rs3)), - (FMSUB_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b111)>; + (FMSUB_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b000)>; // fnmsub: -rs1 * rs2 + rs3 def : Pat<(fma (fneg FPR64:$rs1), FPR64:$rs2, FPR64:$rs3), - (FNMSUB_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b111)>; + (FNMSUB_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b000)>; // fnmadd: -rs1 * rs2 - rs3 def : Pat<(fma (fneg FPR64:$rs1), FPR64:$rs2, (fneg FPR64:$rs3)), - (FNMADD_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b111)>; + (FNMADD_D FPR64:$rs1, FPR64:$rs2, FPR64:$rs3, 0b000)>; // The RISC-V 2.2 user-level ISA spec defines fmin and fmax as returning the // canonical NaN when giving a signaling NaN. This doesn't match the LLVM @@ -362,7 +362,7 @@ def : Pat<(fp_to_sint FPR64:$rs1), (FCVT_L_D FPR64:$rs1, 0b001)>; def : Pat<(fp_to_uint FPR64:$rs1), (FCVT_LU_D FPR64:$rs1, 0b001)>; -// [u]int64->fp. Match GCC and default to using dynamic rounding mode. -def : Pat<(sint_to_fp GPR:$rs1), (FCVT_D_L GPR:$rs1, 0b111)>; -def : Pat<(uint_to_fp GPR:$rs1), (FCVT_D_LU GPR:$rs1, 0b111)>; +// [u]int64->fp. Match GCC and default to using rounding mode to nearest even. +def : Pat<(sint_to_fp GPR:$rs1), (FCVT_D_L GPR:$rs1, 0b000)>; +def : Pat<(uint_to_fp GPR:$rs1), (FCVT_D_LU GPR:$rs1, 0b000)>; } // Predicates = [HasStdExtD, IsRV64] diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -293,8 +293,8 @@ class PatFpr32Fpr32 : Pat<(OpNode FPR32:$rs1, FPR32:$rs2), (Inst $rs1, $rs2)>; -class PatFpr32Fpr32DynFrm - : Pat<(OpNode FPR32:$rs1, FPR32:$rs2), (Inst $rs1, $rs2, 0b111)>; +class PatFpr32Fpr32DefFrm + : Pat<(OpNode FPR32:$rs1, FPR32:$rs2), (Inst $rs1, $rs2, 0b000)>; let Predicates = [HasStdExtF] in { @@ -308,12 +308,12 @@ /// Float arithmetic operations -def : PatFpr32Fpr32DynFrm; -def : PatFpr32Fpr32DynFrm; -def : PatFpr32Fpr32DynFrm; -def : PatFpr32Fpr32DynFrm; +def : PatFpr32Fpr32DefFrm; +def : PatFpr32Fpr32DefFrm; +def : PatFpr32Fpr32DefFrm; +def : PatFpr32Fpr32DefFrm; -def : Pat<(fsqrt FPR32:$rs1), (FSQRT_S FPR32:$rs1, 0b111)>; +def : Pat<(fsqrt FPR32:$rs1), (FSQRT_S FPR32:$rs1, 0b000)>; def : Pat<(fneg FPR32:$rs1), (FSGNJN_S $rs1, $rs1)>; def : Pat<(fabs FPR32:$rs1), (FSGNJX_S $rs1, $rs1)>; @@ -323,19 +323,19 @@ // fmadd: rs1 * rs2 + rs3 def : Pat<(fma FPR32:$rs1, FPR32:$rs2, FPR32:$rs3), - (FMADD_S $rs1, $rs2, $rs3, 0b111)>; + (FMADD_S $rs1, $rs2, $rs3, 0b000)>; // fmsub: rs1 * rs2 - rs3 def : Pat<(fma FPR32:$rs1, FPR32:$rs2, (fneg FPR32:$rs3)), - (FMSUB_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b111)>; + (FMSUB_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b000)>; // fnmsub: -rs1 * rs2 + rs3 def : Pat<(fma (fneg FPR32:$rs1), FPR32:$rs2, FPR32:$rs3), - (FNMSUB_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b111)>; + (FNMSUB_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b000)>; // fnmadd: -rs1 * rs2 - rs3 def : Pat<(fma (fneg FPR32:$rs1), FPR32:$rs2, (fneg FPR32:$rs3)), - (FNMADD_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b111)>; + (FNMADD_S FPR32:$rs1, FPR32:$rs2, FPR32:$rs3, 0b000)>; // The RISC-V 2.2 user-level ISA spec defines fmin and fmax as returning the // canonical NaN when given a signaling NaN. This doesn't match the LLVM @@ -376,9 +376,9 @@ def : Pat<(fp_to_sint FPR32:$rs1), (FCVT_W_S $rs1, 0b001)>; def : Pat<(fp_to_uint FPR32:$rs1), (FCVT_WU_S $rs1, 0b001)>; -// [u]int->float. Match GCC and default to using dynamic rounding mode. -def : Pat<(sint_to_fp GPR:$rs1), (FCVT_S_W $rs1, 0b111)>; -def : Pat<(uint_to_fp GPR:$rs1), (FCVT_S_WU $rs1, 0b111)>; +// [u]int->float. Match GCC and default to using rounding mode to nearest even. +def : Pat<(sint_to_fp GPR:$rs1), (FCVT_S_W $rs1, 0b000)>; +def : Pat<(uint_to_fp GPR:$rs1), (FCVT_S_WU $rs1, 0b000)>; } // Predicates = [HasStdExtF, IsRV32] let Predicates = [HasStdExtF, IsRV64] in { @@ -399,9 +399,9 @@ def : Pat<(fp_to_sint FPR32:$rs1), (FCVT_L_S $rs1, 0b001)>; def : Pat<(fp_to_uint FPR32:$rs1), (FCVT_LU_S $rs1, 0b001)>; -// [u]int->fp. Match GCC and default to using dynamic rounding mode. -def : Pat<(sint_to_fp (sexti32 GPR:$rs1)), (FCVT_S_W $rs1, 0b111)>; -def : Pat<(uint_to_fp (zexti32 GPR:$rs1)), (FCVT_S_WU $rs1, 0b111)>; -def : Pat<(sint_to_fp GPR:$rs1), (FCVT_S_L $rs1, 0b111)>; -def : Pat<(uint_to_fp GPR:$rs1), (FCVT_S_LU $rs1, 0b111)>; +// [u]int->fp. Match GCC and default to using rounding mode to nearest even. +def : Pat<(sint_to_fp (sexti32 GPR:$rs1)), (FCVT_S_W $rs1, 0b000)>; +def : Pat<(uint_to_fp (zexti32 GPR:$rs1)), (FCVT_S_WU $rs1, 0b000)>; +def : Pat<(sint_to_fp GPR:$rs1), (FCVT_S_L $rs1, 0b000)>; +def : Pat<(uint_to_fp GPR:$rs1), (FCVT_S_LU $rs1, 0b000)>; } // Predicates = [HasStdExtF, IsRV64] diff --git a/llvm/test/CodeGen/RISCV/double-arith.ll b/llvm/test/CodeGen/RISCV/double-arith.ll --- a/llvm/test/CodeGen/RISCV/double-arith.ll +++ b/llvm/test/CodeGen/RISCV/double-arith.ll @@ -18,7 +18,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) -; RV32IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -29,7 +29,7 @@ ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a1 ; RV64IFD-NEXT: fmv.d.x ft1, a0 -; RV64IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fadd double %a, %b @@ -46,7 +46,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) -; RV32IFD-NEXT: fsub.d ft0, ft1, ft0 +; RV32IFD-NEXT: fsub.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -57,7 +57,7 @@ ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a1 ; RV64IFD-NEXT: fmv.d.x ft1, a0 -; RV64IFD-NEXT: fsub.d ft0, ft1, ft0 +; RV64IFD-NEXT: fsub.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fsub double %a, %b @@ -74,7 +74,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) -; RV32IFD-NEXT: fmul.d ft0, ft1, ft0 +; RV32IFD-NEXT: fmul.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -85,7 +85,7 @@ ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a1 ; RV64IFD-NEXT: fmv.d.x ft1, a0 -; RV64IFD-NEXT: fmul.d ft0, ft1, ft0 +; RV64IFD-NEXT: fmul.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fmul double %a, %b @@ -102,7 +102,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) -; RV32IFD-NEXT: fdiv.d ft0, ft1, ft0 +; RV32IFD-NEXT: fdiv.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -113,7 +113,7 @@ ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a1 ; RV64IFD-NEXT: fmv.d.x ft1, a0 -; RV64IFD-NEXT: fdiv.d ft0, ft1, ft0 +; RV64IFD-NEXT: fdiv.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fdiv double %a, %b @@ -129,7 +129,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft0, 8(sp) -; RV32IFD-NEXT: fsqrt.d ft0, ft0 +; RV32IFD-NEXT: fsqrt.d ft0, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -139,7 +139,7 @@ ; RV64IFD-LABEL: fsqrt_d: ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a0 -; RV64IFD-NEXT: fsqrt.d ft0, ft0 +; RV64IFD-NEXT: fsqrt.d ft0, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = call double @llvm.sqrt.f64(double %a) @@ -185,7 +185,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft0, 8(sp) -; RV32IFD-NEXT: fadd.d ft0, ft0, ft0 +; RV32IFD-NEXT: fadd.d ft0, ft0, ft0, rne ; RV32IFD-NEXT: fneg.d ft1, ft0 ; RV32IFD-NEXT: feq.d a0, ft0, ft1 ; RV32IFD-NEXT: addi sp, sp, 16 @@ -194,7 +194,7 @@ ; RV64IFD-LABEL: fneg_d: ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a0 -; RV64IFD-NEXT: fadd.d ft0, ft0, ft0 +; RV64IFD-NEXT: fadd.d ft0, ft0, ft0, rne ; RV64IFD-NEXT: fneg.d ft1, ft0 ; RV64IFD-NEXT: feq.d a0, ft0, ft1 ; RV64IFD-NEXT: ret @@ -254,9 +254,9 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft1, 8(sp) -; RV32IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fabs.d ft1, ft0 -; RV32IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -267,9 +267,9 @@ ; RV64IFD: # %bb.0: ; RV64IFD-NEXT: fmv.d.x ft0, a1 ; RV64IFD-NEXT: fmv.d.x ft1, a0 -; RV64IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fabs.d ft1, ft0 -; RV64IFD-NEXT: fadd.d ft0, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft0, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fadd double %a, %b @@ -428,7 +428,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) -; RV32IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -440,7 +440,7 @@ ; RV64IFD-NEXT: fmv.d.x ft0, a2 ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft2, a0 -; RV64IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = call double @llvm.fma.f64(double %a, double %b, double %c) @@ -461,8 +461,8 @@ ; RV32IFD-NEXT: sw a5, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -475,8 +475,8 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a0 ; RV64IFD-NEXT: fmv.d.x ft2, a2 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %c_ = fadd double 0.0, %c ; avoid negation using xor @@ -499,9 +499,9 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -514,9 +514,9 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a2 ; RV64IFD-NEXT: fmv.d.x ft2, a0 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %a_ = fadd double 0.0, %a @@ -541,9 +541,9 @@ ; RV32IFD-NEXT: sw a3, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -556,9 +556,9 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a2 ; RV64IFD-NEXT: fmv.d.x ft2, a1 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft0, ft1, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %b_ = fadd double 0.0, %b @@ -583,8 +583,8 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -597,8 +597,8 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft2, a0 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %a_ = fadd double 0.0, %a @@ -621,8 +621,8 @@ ; RV32IFD-NEXT: sw a3, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -635,8 +635,8 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a0 ; RV64IFD-NEXT: fmv.d.x ft2, a1 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %b_ = fadd double 0.0, %b @@ -658,7 +658,7 @@ ; RV32IFD-NEXT: sw a0, 8(sp) ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) -; RV32IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -670,7 +670,7 @@ ; RV64IFD-NEXT: fmv.d.x ft0, a2 ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft2, a0 -; RV64IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fmadd.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %1 = fmul contract double %a, %b @@ -692,8 +692,8 @@ ; RV32IFD-NEXT: sw a5, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -706,8 +706,8 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a0 ; RV64IFD-NEXT: fmv.d.x ft2, a2 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fmsub.d ft0, ft1, ft0, ft2, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %c_ = fadd double 0.0, %c ; avoid negation using xor @@ -730,10 +730,10 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV32IFD-NEXT: fadd.d ft0, ft0, ft3 -; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV32IFD-NEXT: fadd.d ft0, ft0, ft3, rne +; RV32IFD-NEXT: fnmadd.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -746,10 +746,10 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft2, a0 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV64IFD-NEXT: fadd.d ft0, ft0, ft3 -; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV64IFD-NEXT: fadd.d ft0, ft0, ft3, rne +; RV64IFD-NEXT: fnmadd.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %a_ = fadd double 0.0, %a ; avoid negation using xor @@ -775,9 +775,9 @@ ; RV32IFD-NEXT: sw a1, 12(sp) ; RV32IFD-NEXT: fld ft2, 8(sp) ; RV32IFD-NEXT: fcvt.d.w ft3, zero -; RV32IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV32IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV32IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV32IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV32IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV32IFD-NEXT: fsd ft0, 8(sp) ; RV32IFD-NEXT: lw a0, 8(sp) ; RV32IFD-NEXT: lw a1, 12(sp) @@ -790,9 +790,9 @@ ; RV64IFD-NEXT: fmv.d.x ft1, a1 ; RV64IFD-NEXT: fmv.d.x ft2, a0 ; RV64IFD-NEXT: fmv.d.x ft3, zero -; RV64IFD-NEXT: fadd.d ft2, ft2, ft3 -; RV64IFD-NEXT: fadd.d ft1, ft1, ft3 -; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0 +; RV64IFD-NEXT: fadd.d ft2, ft2, ft3, rne +; RV64IFD-NEXT: fadd.d ft1, ft1, ft3, rne +; RV64IFD-NEXT: fnmsub.d ft0, ft2, ft1, ft0, rne ; RV64IFD-NEXT: fmv.x.d a0, ft0 ; RV64IFD-NEXT: ret %a_ = fadd double 0.0, %a ; avoid negation using xor diff --git a/llvm/test/CodeGen/RISCV/float-arith.ll b/llvm/test/CodeGen/RISCV/float-arith.ll --- a/llvm/test/CodeGen/RISCV/float-arith.ll +++ b/llvm/test/CodeGen/RISCV/float-arith.ll @@ -13,7 +13,7 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fadd.s ft0, ft1, ft0 +; RV32IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -21,7 +21,7 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fadd.s ft0, ft1, ft0 +; RV64IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fadd float %a, %b @@ -33,7 +33,7 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fsub.s ft0, ft1, ft0 +; RV32IF-NEXT: fsub.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -41,7 +41,7 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fsub.s ft0, ft1, ft0 +; RV64IF-NEXT: fsub.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fsub float %a, %b @@ -53,7 +53,7 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fmul.s ft0, ft1, ft0 +; RV32IF-NEXT: fmul.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -61,7 +61,7 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fmul.s ft0, ft1, ft0 +; RV64IF-NEXT: fmul.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fmul float %a, %b @@ -73,7 +73,7 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fdiv.s ft0, ft1, ft0 +; RV32IF-NEXT: fdiv.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -81,7 +81,7 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fdiv.s ft0, ft1, ft0 +; RV64IF-NEXT: fdiv.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fdiv float %a, %b @@ -94,14 +94,14 @@ ; RV32IF-LABEL: fsqrt_s: ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a0 -; RV32IF-NEXT: fsqrt.s ft0, ft0 +; RV32IF-NEXT: fsqrt.s ft0, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; ; RV64IF-LABEL: fsqrt_s: ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a0 -; RV64IF-NEXT: fsqrt.s ft0, ft0 +; RV64IF-NEXT: fsqrt.s ft0, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = call float @llvm.sqrt.f32(float %a) @@ -136,7 +136,7 @@ ; RV32IF-LABEL: fneg_s: ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a0 -; RV32IF-NEXT: fadd.s ft0, ft0, ft0 +; RV32IF-NEXT: fadd.s ft0, ft0, ft0, rne ; RV32IF-NEXT: fneg.s ft1, ft0 ; RV32IF-NEXT: feq.s a0, ft0, ft1 ; RV32IF-NEXT: ret @@ -144,7 +144,7 @@ ; RV64IF-LABEL: fneg_s: ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a0 -; RV64IF-NEXT: fadd.s ft0, ft0, ft0 +; RV64IF-NEXT: fadd.s ft0, ft0, ft0, rne ; RV64IF-NEXT: fneg.s ft1, ft0 ; RV64IF-NEXT: feq.s a0, ft0, ft1 ; RV64IF-NEXT: ret @@ -162,7 +162,7 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fadd.s ft0, ft1, ft0 +; RV32IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fsgnjn.s ft0, ft1, ft0 ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret @@ -171,7 +171,7 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fadd.s ft0, ft1, ft0 +; RV64IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fsgnjn.s ft0, ft1, ft0 ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret @@ -190,9 +190,9 @@ ; RV32IF: # %bb.0: ; RV32IF-NEXT: fmv.w.x ft0, a1 ; RV32IF-NEXT: fmv.w.x ft1, a0 -; RV32IF-NEXT: fadd.s ft0, ft1, ft0 +; RV32IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fabs.s ft1, ft0 -; RV32IF-NEXT: fadd.s ft0, ft1, ft0 +; RV32IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -200,9 +200,9 @@ ; RV64IF: # %bb.0: ; RV64IF-NEXT: fmv.w.x ft0, a1 ; RV64IF-NEXT: fmv.w.x ft1, a0 -; RV64IF-NEXT: fadd.s ft0, ft1, ft0 +; RV64IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fabs.s ft1, ft0 -; RV64IF-NEXT: fadd.s ft0, ft1, ft0 +; RV64IF-NEXT: fadd.s ft0, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fadd float %a, %b @@ -320,7 +320,7 @@ ; RV32IF-NEXT: fmv.w.x ft0, a2 ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft2, a0 -; RV32IF-NEXT: fmadd.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fmadd.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -329,7 +329,7 @@ ; RV64IF-NEXT: fmv.w.x ft0, a2 ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft2, a0 -; RV64IF-NEXT: fmadd.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fmadd.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = call float @llvm.fma.f32(float %a, float %b, float %c) @@ -343,8 +343,8 @@ ; RV32IF-NEXT: fmv.w.x ft1, a0 ; RV32IF-NEXT: fmv.w.x ft2, a2 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fmsub.s ft0, ft1, ft0, ft2 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fmsub.s ft0, ft1, ft0, ft2, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -354,8 +354,8 @@ ; RV64IF-NEXT: fmv.w.x ft1, a0 ; RV64IF-NEXT: fmv.w.x ft2, a2 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fmsub.s ft0, ft1, ft0, ft2 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fmsub.s ft0, ft1, ft0, ft2, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %c_ = fadd float 0.0, %c ; avoid negation using xor @@ -371,9 +371,9 @@ ; RV32IF-NEXT: fmv.w.x ft1, a2 ; RV32IF-NEXT: fmv.w.x ft2, a0 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fadd.s ft1, ft1, ft3 -; RV32IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV32IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -383,9 +383,9 @@ ; RV64IF-NEXT: fmv.w.x ft1, a2 ; RV64IF-NEXT: fmv.w.x ft2, a0 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fadd.s ft1, ft1, ft3 -; RV64IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV64IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %a_ = fadd float 0.0, %a @@ -403,9 +403,9 @@ ; RV32IF-NEXT: fmv.w.x ft1, a2 ; RV32IF-NEXT: fmv.w.x ft2, a1 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fadd.s ft1, ft1, ft3 -; RV32IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV32IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -415,9 +415,9 @@ ; RV64IF-NEXT: fmv.w.x ft1, a2 ; RV64IF-NEXT: fmv.w.x ft2, a1 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fadd.s ft1, ft1, ft3 -; RV64IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV64IF-NEXT: fnmadd.s ft0, ft2, ft0, ft1, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %b_ = fadd float 0.0, %b @@ -435,8 +435,8 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft2, a0 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -446,8 +446,8 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft2, a0 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %a_ = fadd float 0.0, %a @@ -463,8 +463,8 @@ ; RV32IF-NEXT: fmv.w.x ft1, a0 ; RV32IF-NEXT: fmv.w.x ft2, a1 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -474,8 +474,8 @@ ; RV64IF-NEXT: fmv.w.x ft1, a0 ; RV64IF-NEXT: fmv.w.x ft2, a1 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %b_ = fadd float 0.0, %b @@ -490,7 +490,7 @@ ; RV32IF-NEXT: fmv.w.x ft0, a2 ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft2, a0 -; RV32IF-NEXT: fmadd.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fmadd.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -499,7 +499,7 @@ ; RV64IF-NEXT: fmv.w.x ft0, a2 ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft2, a0 -; RV64IF-NEXT: fmadd.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fmadd.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %1 = fmul contract float %a, %b @@ -514,8 +514,8 @@ ; RV32IF-NEXT: fmv.w.x ft1, a0 ; RV32IF-NEXT: fmv.w.x ft2, a2 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fmsub.s ft0, ft1, ft0, ft2 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fmsub.s ft0, ft1, ft0, ft2, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -525,8 +525,8 @@ ; RV64IF-NEXT: fmv.w.x ft1, a0 ; RV64IF-NEXT: fmv.w.x ft2, a2 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fmsub.s ft0, ft1, ft0, ft2 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fmsub.s ft0, ft1, ft0, ft2, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %c_ = fadd float 0.0, %c ; avoid negation using xor @@ -542,10 +542,10 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft2, a0 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fadd.s ft1, ft1, ft3 -; RV32IF-NEXT: fadd.s ft0, ft0, ft3 -; RV32IF-NEXT: fnmadd.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV32IF-NEXT: fadd.s ft0, ft0, ft3, rne +; RV32IF-NEXT: fnmadd.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -555,10 +555,10 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft2, a0 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fadd.s ft1, ft1, ft3 -; RV64IF-NEXT: fadd.s ft0, ft0, ft3 -; RV64IF-NEXT: fnmadd.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV64IF-NEXT: fadd.s ft0, ft0, ft3, rne +; RV64IF-NEXT: fnmadd.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %a_ = fadd float 0.0, %a ; avoid negation using xor @@ -577,9 +577,9 @@ ; RV32IF-NEXT: fmv.w.x ft1, a1 ; RV32IF-NEXT: fmv.w.x ft2, a0 ; RV32IF-NEXT: fmv.w.x ft3, zero -; RV32IF-NEXT: fadd.s ft2, ft2, ft3 -; RV32IF-NEXT: fadd.s ft1, ft1, ft3 -; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV32IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV32IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV32IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV32IF-NEXT: fmv.x.w a0, ft0 ; RV32IF-NEXT: ret ; @@ -589,9 +589,9 @@ ; RV64IF-NEXT: fmv.w.x ft1, a1 ; RV64IF-NEXT: fmv.w.x ft2, a0 ; RV64IF-NEXT: fmv.w.x ft3, zero -; RV64IF-NEXT: fadd.s ft2, ft2, ft3 -; RV64IF-NEXT: fadd.s ft1, ft1, ft3 -; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0 +; RV64IF-NEXT: fadd.s ft2, ft2, ft3, rne +; RV64IF-NEXT: fadd.s ft1, ft1, ft3, rne +; RV64IF-NEXT: fnmsub.s ft0, ft2, ft1, ft0, rne ; RV64IF-NEXT: fmv.x.w a0, ft0 ; RV64IF-NEXT: ret %a_ = fadd float 0.0, %a ; avoid negation using xor