@@ -2443,31 +2443,47 @@ encode %{
24432443 Register dst_reg = as_Register($dst$$reg);
24442444 Register src1_reg = as_Register($src1$$reg);
24452445 Register src2_reg = as_Register($src2$$reg);
2446- __ corrected_idivl(dst_reg, src1_reg, src2_reg, false);
2446+ __ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ false, /* is_signed */ true);
2447+ %}
2448+
2449+ enc_class riscv_enc_divuw(iRegI dst, iRegI src1, iRegI src2) %{
2450+ C2_MacroAssembler _masm(&cbuf);
2451+ Register dst_reg = as_Register($dst$$reg);
2452+ Register src1_reg = as_Register($src1$$reg);
2453+ Register src2_reg = as_Register($src2$$reg);
2454+ __ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ false, /* is_signed */ false);
24472455 %}
24482456
24492457 enc_class riscv_enc_div(iRegI dst, iRegI src1, iRegI src2) %{
24502458 C2_MacroAssembler _masm(&cbuf);
24512459 Register dst_reg = as_Register($dst$$reg);
24522460 Register src1_reg = as_Register($src1$$reg);
24532461 Register src2_reg = as_Register($src2$$reg);
2454- __ corrected_idivq(dst_reg, src1_reg, src2_reg, false);
2462+ __ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ false, /* is_signed */ true);
2463+ %}
2464+
2465+ enc_class riscv_enc_divu(iRegI dst, iRegI src1, iRegI src2) %{
2466+ C2_MacroAssembler _masm(&cbuf);
2467+ Register dst_reg = as_Register($dst$$reg);
2468+ Register src1_reg = as_Register($src1$$reg);
2469+ Register src2_reg = as_Register($src2$$reg);
2470+ __ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ false, /* is_signed */ false);
24552471 %}
24562472
24572473 enc_class riscv_enc_modw(iRegI dst, iRegI src1, iRegI src2) %{
24582474 C2_MacroAssembler _masm(&cbuf);
24592475 Register dst_reg = as_Register($dst$$reg);
24602476 Register src1_reg = as_Register($src1$$reg);
24612477 Register src2_reg = as_Register($src2$$reg);
2462- __ corrected_idivl(dst_reg, src1_reg, src2_reg, true);
2478+ __ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
24632479 %}
24642480
24652481 enc_class riscv_enc_mod(iRegI dst, iRegI src1, iRegI src2) %{
24662482 C2_MacroAssembler _masm(&cbuf);
24672483 Register dst_reg = as_Register($dst$$reg);
24682484 Register src1_reg = as_Register($src1$$reg);
24692485 Register src2_reg = as_Register($src2$$reg);
2470- __ corrected_idivq(dst_reg, src1_reg, src2_reg, true);
2486+ __ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
24712487 %}
24722488
24732489 enc_class riscv_enc_tail_call(iRegP jump_target) %{
@@ -6673,6 +6689,15 @@ instruct divI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
66736689 ins_pipe(idiv_reg_reg);
66746690%}
66756691
6692+ instruct UdivI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
6693+ match(Set dst (UDivI src1 src2));
6694+ ins_cost(IDIVSI_COST);
6695+ format %{ "divuw $dst, $src1, $src2\t#@UdivI"%}
6696+
6697+ ins_encode(riscv_enc_divuw(dst, src1, src2));
6698+ ins_pipe(idiv_reg_reg);
6699+ %}
6700+
66766701instruct signExtract(iRegINoSp dst, iRegIorL2I src1, immI_31 div1, immI_31 div2) %{
66776702 match(Set dst (URShiftI (RShiftI src1 div1) div2));
66786703 ins_cost(ALU_COST);
@@ -6695,6 +6720,16 @@ instruct divL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
66956720 ins_pipe(ldiv_reg_reg);
66966721%}
66976722
6723+ instruct UdivL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
6724+ match(Set dst (UDivL src1 src2));
6725+ ins_cost(IDIVDI_COST);
6726+
6727+ format %{ "divu $dst, $src1, $src2\t#@UdivL" %}
6728+
6729+ ins_encode(riscv_enc_divu(dst, src1, src2));
6730+ ins_pipe(ldiv_reg_reg);
6731+ %}
6732+
66986733instruct signExtractL(iRegLNoSp dst, iRegL src1, immI_63 div1, immI_63 div2) %{
66996734 match(Set dst (URShiftL (RShiftL src1 div1) div2));
67006735 ins_cost(ALU_COST);
0 commit comments