Skip to content

Commit 1ec0d02

Browse files
author
Hamlin Li
committedOct 28, 2023
8318225: RISC-V: C2 UModI
8318226: RISC-V: C2 UModL Reviewed-by: luhenry, rehn, fyang
1 parent 96bec35 commit 1ec0d02

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed
 

‎src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -2408,7 +2408,12 @@ int MacroAssembler::corrected_idivl(Register result, Register rs1, Register rs2,
24082408
divuw(result, rs1, rs2);
24092409
}
24102410
} else {
2411-
remw(result, rs1, rs2); // result = rs1 % rs2;
2411+
// result = rs1 % rs2;
2412+
if (is_signed) {
2413+
remw(result, rs1, rs2);
2414+
} else {
2415+
remuw(result, rs1, rs2);
2416+
}
24122417
}
24132418
return idivl_offset;
24142419
}
@@ -2435,7 +2440,12 @@ int MacroAssembler::corrected_idivq(Register result, Register rs1, Register rs2,
24352440
divu(result, rs1, rs2);
24362441
}
24372442
} else {
2438-
rem(result, rs1, rs2); // result = rs1 % rs2;
2443+
// result = rs1 % rs2;
2444+
if (is_signed) {
2445+
rem(result, rs1, rs2);
2446+
} else {
2447+
remu(result, rs1, rs2);
2448+
}
24392449
}
24402450
return idivq_offset;
24412451
}

‎src/hotspot/cpu/riscv/riscv.ad

+34
Original file line numberDiff line numberDiff line change
@@ -2478,6 +2478,14 @@ encode %{
24782478
__ corrected_idivl(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
24792479
%}
24802480

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+
24812489
enc_class riscv_enc_mod(iRegI dst, iRegI src1, iRegI src2) %{
24822490
C2_MacroAssembler _masm(&cbuf);
24832491
Register dst_reg = as_Register($dst$$reg);
@@ -2486,6 +2494,14 @@ encode %{
24862494
__ corrected_idivq(dst_reg, src1_reg, src2_reg, /* want_remainder */ true, /* is_signed */ true);
24872495
%}
24882496

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+
24892505
enc_class riscv_enc_tail_call(iRegP jump_target) %{
24902506
C2_MacroAssembler _masm(&cbuf);
24912507
Register target_reg = as_Register($jump_target$$reg);
@@ -6752,6 +6768,15 @@ instruct modI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
67526768
ins_pipe(ialu_reg_reg);
67536769
%}
67546770

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+
67556780
// Long Remainder
67566781

67576782
instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
@@ -6763,6 +6788,15 @@ instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
67636788
ins_pipe(ialu_reg_reg);
67646789
%}
67656790

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+
67666800
// Integer Shifts
67676801

67686802
// Shift Left Register

0 commit comments

Comments
 (0)