From 8507db1567e3a524238f5145ed08fd1d80a2a2b2 Mon Sep 17 00:00:00 2001 From: Gui Cao Date: Mon, 6 Feb 2023 02:28:53 +0000 Subject: [PATCH] 8301628: RISC-V: c2 fix pipeline class for several instructions Reviewed-by: fjiang, fyang, luhenry --- src/hotspot/cpu/riscv/riscv.ad | 46 ++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index dc05b937f95..a7a8214e0a8 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -944,8 +944,8 @@ definitions %{ int_def IMUL_COST ( 1000, 10 * DEFAULT_COST); // imul int_def IDIVSI_COST ( 3400, 34 * DEFAULT_COST); // idivdi int_def IDIVDI_COST ( 6600, 66 * DEFAULT_COST); // idivsi - int_def FMUL_SINGLE_COST ( 500, 5 * DEFAULT_COST); // fadd, fmul, fmadd - int_def FMUL_DOUBLE_COST ( 700, 7 * DEFAULT_COST); // fadd, fmul, fmadd + int_def FMUL_SINGLE_COST ( 500, 5 * DEFAULT_COST); // fmul, fmadd + int_def FMUL_DOUBLE_COST ( 700, 7 * DEFAULT_COST); // fmul, fmadd int_def FDIV_COST ( 2000, 20 * DEFAULT_COST); // fdiv int_def FSQRT_COST ( 2500, 25 * DEFAULT_COST); // fsqrt int_def VOLATILE_REF_COST ( 1000, 10 * DEFAULT_COST); @@ -6990,7 +6990,7 @@ instruct regI_not_reg(iRegINoSp dst, iRegI src1, immI_M1 m1) %{ __ xori(as_Register($dst$$reg), as_Register($src1$$reg), -1); %} - ins_pipe(ialu_reg); + ins_pipe(ialu_reg_imm); %} instruct regL_not_reg(iRegLNoSp dst, iRegL src1, immL_M1 m1) %{ @@ -7002,7 +7002,7 @@ instruct regL_not_reg(iRegLNoSp dst, iRegL src1, immL_M1 m1) %{ __ xori(as_Register($dst$$reg), as_Register($src1$$reg), -1); %} - ins_pipe(ialu_reg); + ins_pipe(ialu_reg_imm); %} @@ -7012,7 +7012,7 @@ instruct regL_not_reg(iRegLNoSp dst, iRegL src1, immL_M1 m1) %{ instruct addF_reg_reg(fRegF dst, fRegF src1, fRegF src2) %{ match(Set dst (AddF src1 src2)); - ins_cost(FMUL_SINGLE_COST); + ins_cost(DEFAULT_COST * 5); format %{ "fadd.s $dst, $src1, $src2\t#@addF_reg_reg" %} ins_encode %{ @@ -7027,7 +7027,7 @@ instruct addF_reg_reg(fRegF dst, fRegF src1, fRegF src2) %{ instruct addD_reg_reg(fRegD dst, fRegD src1, fRegD src2) %{ match(Set dst (AddD src1 src2)); - ins_cost(FMUL_DOUBLE_COST); + ins_cost(DEFAULT_COST * 5); format %{ "fadd.d $dst, $src1, $src2\t#@addD_reg_reg" %} ins_encode %{ @@ -7042,7 +7042,7 @@ instruct addD_reg_reg(fRegD dst, fRegD src1, fRegD src2) %{ instruct subF_reg_reg(fRegF dst, fRegF src1, fRegF src2) %{ match(Set dst (SubF src1 src2)); - ins_cost(FMUL_SINGLE_COST); + ins_cost(DEFAULT_COST * 5); format %{ "fsub.s $dst, $src1, $src2\t#@subF_reg_reg" %} ins_encode %{ @@ -7057,7 +7057,7 @@ instruct subF_reg_reg(fRegF dst, fRegF src1, fRegF src2) %{ instruct subD_reg_reg(fRegD dst, fRegD src1, fRegD src2) %{ match(Set dst (SubD src1 src2)); - ins_cost(FMUL_DOUBLE_COST); + ins_cost(DEFAULT_COST * 5); format %{ "fsub.d $dst, $src1, $src2\t#@subD_reg_reg" %} ins_encode %{ @@ -7260,7 +7260,7 @@ instruct maxF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{ false /* is_double */, false /* is_min */); %} - ins_pipe(fp_dop_reg_reg_s); + ins_pipe(pipe_class_default); %} // Math.min(FF)F @@ -7276,7 +7276,7 @@ instruct minF_reg_reg(fRegF dst, fRegF src1, fRegF src2, rFlagsReg cr) %{ false /* is_double */, true /* is_min */); %} - ins_pipe(fp_dop_reg_reg_s); + ins_pipe(pipe_class_default); %} // Math.max(DD)D @@ -7292,7 +7292,7 @@ instruct maxD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{ true /* is_double */, false /* is_min */); %} - ins_pipe(fp_dop_reg_reg_d); + ins_pipe(pipe_class_default); %} // Math.min(DD)D @@ -7308,59 +7308,67 @@ instruct minD_reg_reg(fRegD dst, fRegD src1, fRegD src2, rFlagsReg cr) %{ true /* is_double */, true /* is_min */); %} - ins_pipe(fp_dop_reg_reg_d); + ins_pipe(pipe_class_default); %} // Float.isInfinite -instruct isIniniteF_reg_reg(iRegINoSp dst, fRegF src) +instruct isInfiniteF_reg_reg(iRegINoSp dst, fRegF src) %{ match(Set dst (IsInfiniteF src)); + format %{ "isInfinite $dst, $src" %} ins_encode %{ __ fclass_s(as_Register($dst$$reg), as_FloatRegister($src$$reg)); - __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b10000001); + __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b0010000001); __ slt(as_Register($dst$$reg), zr, as_Register($dst$$reg)); %} - ins_pipe(fp_dop_reg_reg_s); + + ins_pipe(pipe_class_default); %} // Double.isInfinite instruct isInfiniteD_reg_reg(iRegINoSp dst, fRegD src) %{ match(Set dst (IsInfiniteD src)); + format %{ "isInfinite $dst, $src" %} ins_encode %{ __ fclass_d(as_Register($dst$$reg), as_FloatRegister($src$$reg)); - __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b10000001); + __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b0010000001); __ slt(as_Register($dst$$reg), zr, as_Register($dst$$reg)); %} - ins_pipe(fp_dop_reg_reg_d); + + ins_pipe(pipe_class_default); %} // Float.isFinite instruct isFiniteF_reg_reg(iRegINoSp dst, fRegF src) %{ match(Set dst (IsFiniteF src)); + format %{ "isFinite $dst, $src" %} ins_encode %{ __ fclass_s(as_Register($dst$$reg), as_FloatRegister($src$$reg)); __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b0001111110); __ slt(as_Register($dst$$reg), zr, as_Register($dst$$reg)); %} - ins_pipe(fp_dop_reg_reg_s); + + ins_pipe(pipe_class_default); %} // Double.isFinite instruct isFiniteD_reg_reg(iRegINoSp dst, fRegD src) %{ match(Set dst (IsFiniteD src)); + format %{ "isFinite $dst, $src" %} ins_encode %{ __ fclass_d(as_Register($dst$$reg), as_FloatRegister($src$$reg)); __ andi(as_Register($dst$$reg), as_Register($dst$$reg), 0b0001111110); __ slt(as_Register($dst$$reg), zr, as_Register($dst$$reg)); %} - ins_pipe(fp_dop_reg_reg_d); + + ins_pipe(pipe_class_default); %} instruct divF_reg_reg(fRegF dst, fRegF src1, fRegF src2) %{