Skip to content

Commit f1194dc

Browse files
committed
8300109: RISC-V: Improve code generation for MinI/MaxI nodes
Reviewed-by: fjiang, luhenry, shade
1 parent 89a032d commit f1194dc

File tree

1 file changed

+92
-2
lines changed

1 file changed

+92
-2
lines changed

src/hotspot/cpu/riscv/riscv.ad

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8657,6 +8657,96 @@ instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegIorL2I op, immI0 zero)
86578657
// ============================================================================
86588658
// Max and Min
86598659

8660+
instruct minI_reg_reg(iRegINoSp dst, iRegI src)
8661+
%{
8662+
match(Set dst (MinI dst src));
8663+
8664+
ins_cost(BRANCH_COST + ALU_COST);
8665+
format %{
8666+
"ble $dst, $src, skip\t#@minI_reg_reg\n\t"
8667+
"mv $dst, $src\n\t"
8668+
"skip:"
8669+
%}
8670+
8671+
ins_encode %{
8672+
Label Lskip;
8673+
__ ble(as_Register($dst$$reg), as_Register($src$$reg), Lskip);
8674+
__ mv(as_Register($dst$$reg), as_Register($src$$reg));
8675+
__ bind(Lskip);
8676+
%}
8677+
8678+
ins_pipe(pipe_class_compare);
8679+
%}
8680+
8681+
instruct maxI_reg_reg(iRegINoSp dst, iRegI src)
8682+
%{
8683+
match(Set dst (MaxI dst src));
8684+
8685+
ins_cost(BRANCH_COST + ALU_COST);
8686+
format %{
8687+
"bge $dst, $src, skip\t#@maxI_reg_reg\n\t"
8688+
"mv $dst, $src\n\t"
8689+
"skip:"
8690+
%}
8691+
8692+
ins_encode %{
8693+
Label Lskip;
8694+
__ bge(as_Register($dst$$reg), as_Register($src$$reg), Lskip);
8695+
__ mv(as_Register($dst$$reg), as_Register($src$$reg));
8696+
__ bind(Lskip);
8697+
%}
8698+
8699+
ins_pipe(pipe_class_compare);
8700+
%}
8701+
8702+
// special case for comparing with zero
8703+
// n.b. this is selected in preference to the rule above because it
8704+
// avoids loading constant 0 into a source register
8705+
8706+
instruct minI_reg_zero(iRegINoSp dst, immI0 zero)
8707+
%{
8708+
match(Set dst (MinI dst zero));
8709+
match(Set dst (MinI zero dst));
8710+
8711+
ins_cost(BRANCH_COST + ALU_COST);
8712+
format %{
8713+
"blez $dst, skip\t#@minI_reg_zero\n\t"
8714+
"mv $dst, zr\n\t"
8715+
"skip:"
8716+
%}
8717+
8718+
ins_encode %{
8719+
Label Lskip;
8720+
__ blez(as_Register($dst$$reg), Lskip);
8721+
__ mv(as_Register($dst$$reg), zr);
8722+
__ bind(Lskip);
8723+
%}
8724+
8725+
ins_pipe(pipe_class_compare);
8726+
%}
8727+
8728+
instruct maxI_reg_zero(iRegINoSp dst, immI0 zero)
8729+
%{
8730+
match(Set dst (MaxI dst zero));
8731+
match(Set dst (MaxI zero dst));
8732+
8733+
ins_cost(BRANCH_COST + ALU_COST);
8734+
format %{
8735+
"bgez $dst, skip\t#@maxI_reg_zero\n\t"
8736+
"mv $dst, zr\n\t"
8737+
"skip:"
8738+
%}
8739+
8740+
ins_encode %{
8741+
Label Lskip;
8742+
__ bgez(as_Register($dst$$reg), Lskip);
8743+
__ mv(as_Register($dst$$reg), zr);
8744+
__ bind(Lskip);
8745+
%}
8746+
8747+
ins_pipe(pipe_class_compare);
8748+
%}
8749+
86608750
instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
86618751
%{
86628752
match(Set dst (MinI src1 src2));
@@ -8683,7 +8773,7 @@ instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
86838773
__ bind(Ldone);
86848774
%}
86858775

8686-
ins_pipe(ialu_reg_reg);
8776+
ins_pipe(pipe_class_compare);
86878777
%}
86888778

86898779
instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
@@ -8713,7 +8803,7 @@ instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
87138803

87148804
%}
87158805

8716-
ins_pipe(ialu_reg_reg);
8806+
ins_pipe(pipe_class_compare);
87178807
%}
87188808

87198809
// ============================================================================

0 commit comments

Comments
 (0)