From f1194dc07ec347f4f9d785e7647983da61441c0e Mon Sep 17 00:00:00 2001 From: Fei Yang Date: Wed, 18 Jan 2023 01:14:47 +0000 Subject: [PATCH] 8300109: RISC-V: Improve code generation for MinI/MaxI nodes Reviewed-by: fjiang, luhenry, shade --- src/hotspot/cpu/riscv/riscv.ad | 94 +++++++++++++++++++++++++++++++++- 1 file changed, 92 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/riscv/riscv.ad b/src/hotspot/cpu/riscv/riscv.ad index c8c581eb671..7197a6061fb 100644 --- a/src/hotspot/cpu/riscv/riscv.ad +++ b/src/hotspot/cpu/riscv/riscv.ad @@ -8657,6 +8657,96 @@ instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegIorL2I op, immI0 zero) // ============================================================================ // Max and Min +instruct minI_reg_reg(iRegINoSp dst, iRegI src) +%{ + match(Set dst (MinI dst src)); + + ins_cost(BRANCH_COST + ALU_COST); + format %{ + "ble $dst, $src, skip\t#@minI_reg_reg\n\t" + "mv $dst, $src\n\t" + "skip:" + %} + + ins_encode %{ + Label Lskip; + __ ble(as_Register($dst$$reg), as_Register($src$$reg), Lskip); + __ mv(as_Register($dst$$reg), as_Register($src$$reg)); + __ bind(Lskip); + %} + + ins_pipe(pipe_class_compare); +%} + +instruct maxI_reg_reg(iRegINoSp dst, iRegI src) +%{ + match(Set dst (MaxI dst src)); + + ins_cost(BRANCH_COST + ALU_COST); + format %{ + "bge $dst, $src, skip\t#@maxI_reg_reg\n\t" + "mv $dst, $src\n\t" + "skip:" + %} + + ins_encode %{ + Label Lskip; + __ bge(as_Register($dst$$reg), as_Register($src$$reg), Lskip); + __ mv(as_Register($dst$$reg), as_Register($src$$reg)); + __ bind(Lskip); + %} + + ins_pipe(pipe_class_compare); +%} + +// special case for comparing with zero +// n.b. this is selected in preference to the rule above because it +// avoids loading constant 0 into a source register + +instruct minI_reg_zero(iRegINoSp dst, immI0 zero) +%{ + match(Set dst (MinI dst zero)); + match(Set dst (MinI zero dst)); + + ins_cost(BRANCH_COST + ALU_COST); + format %{ + "blez $dst, skip\t#@minI_reg_zero\n\t" + "mv $dst, zr\n\t" + "skip:" + %} + + ins_encode %{ + Label Lskip; + __ blez(as_Register($dst$$reg), Lskip); + __ mv(as_Register($dst$$reg), zr); + __ bind(Lskip); + %} + + ins_pipe(pipe_class_compare); +%} + +instruct maxI_reg_zero(iRegINoSp dst, immI0 zero) +%{ + match(Set dst (MaxI dst zero)); + match(Set dst (MaxI zero dst)); + + ins_cost(BRANCH_COST + ALU_COST); + format %{ + "bgez $dst, skip\t#@maxI_reg_zero\n\t" + "mv $dst, zr\n\t" + "skip:" + %} + + ins_encode %{ + Label Lskip; + __ bgez(as_Register($dst$$reg), Lskip); + __ mv(as_Register($dst$$reg), zr); + __ bind(Lskip); + %} + + ins_pipe(pipe_class_compare); +%} + instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2) %{ match(Set dst (MinI src1 src2)); @@ -8683,7 +8773,7 @@ instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2) __ bind(Ldone); %} - ins_pipe(ialu_reg_reg); + ins_pipe(pipe_class_compare); %} instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2) @@ -8713,7 +8803,7 @@ instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2) %} - ins_pipe(ialu_reg_reg); + ins_pipe(pipe_class_compare); %} // ============================================================================