@@ -2478,6 +2478,14 @@ encode %{
2478
2478
__ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
2479
2479
%}
2480
2480
2481
+ enc_class riscv_enc_moduw(iRegI dst, iRegI src1, iRegI src2) %{
2482
+ C2_MacroAssembler _masm(&cbuf);
2483
+ Register dst_reg = as_Register($dst$$reg);
2484
+ Register src1_reg = as_Register($src1$$reg);
2485
+ Register src2_reg = as_Register($src2$$reg);
2486
+ __ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ false);
2487
+ %}
2488
+
2481
2489
enc_class riscv_enc_mod(iRegI dst, iRegI src1, iRegI src2) %{
2482
2490
C2_MacroAssembler _masm(&cbuf);
2483
2491
Register dst_reg = as_Register($dst$$reg);
@@ -2486,6 +2494,14 @@ encode %{
2486
2494
__ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
2487
2495
%}
2488
2496
2497
+ enc_class riscv_enc_modu(iRegI dst, iRegI src1, iRegI src2) %{
2498
+ C2_MacroAssembler _masm(&cbuf);
2499
+ Register dst_reg = as_Register($dst$$reg);
2500
+ Register src1_reg = as_Register($src1$$reg);
2501
+ Register src2_reg = as_Register($src2$$reg);
2502
+ __ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ false);
2503
+ %}
2504
+
2489
2505
enc_class riscv_enc_tail_call(iRegP jump_target) %{
2490
2506
C2_MacroAssembler _masm(&cbuf);
2491
2507
Register target_reg = as_Register($jump_target$$reg);
@@ -6752,6 +6768,15 @@ instruct modI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
6752
6768
ins_pipe(ialu_reg_reg);
6753
6769
%}
6754
6770
6771
+ instruct UmodI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
6772
+ match(Set dst (UModI src1 src2));
6773
+ ins_cost(IDIVSI_COST);
6774
+ format %{ "remuw $dst, $src1, $src2\t#@UmodI" %}
6775
+
6776
+ ins_encode(riscv_enc_moduw(dst, src1, src2));
6777
+ ins_pipe(ialu_reg_reg);
6778
+ %}
6779
+
6755
6780
// Long Remainder
6756
6781
6757
6782
instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
@@ -6763,6 +6788,15 @@ instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
6763
6788
ins_pipe(ialu_reg_reg);
6764
6789
%}
6765
6790
6791
+ instruct UmodL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
6792
+ match(Set dst (UModL src1 src2));
6793
+ ins_cost(IDIVDI_COST);
6794
+ format %{ "remu $dst, $src1, $src2\t#@UmodL" %}
6795
+
6796
+ ins_encode(riscv_enc_modu(dst, src1, src2));
6797
+ ins_pipe(ialu_reg_reg);
6798
+ %}
6799
+
6766
6800
// Integer Shifts
6767
6801
6768
6802
// Shift Left Register
0 commit comments