RFR: 8367066: RISC-V: refine register selection in MacroAssembler:: decode_klass_not_null
Hamlin Li
mli at openjdk.org
Mon Sep 8 12:52:10 UTC 2025
On Mon, 8 Sep 2025 11:30:46 GMT, Fei Yang <fyang at openjdk.org> wrote:
> Hi, seems we can further eliminate the use of `t0` replacing it with `tmp`. How about we go like this?
>
> ```
> diff --git a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> index 1436bc02113..89e615b1cbb 100644
> --- a/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> +++ b/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp
> @@ -3402,6 +3402,8 @@ void MacroAssembler::decode_klass_not_null(Register r, Register tmp) {
>
> void MacroAssembler::decode_klass_not_null(Register dst, Register src, Register tmp) {
> assert(UseCompressedClassPointers, "should only be used for compressed headers");
> + assert_different_registers(src, tmp);
> + assert_different_registers(dst, tmp);
>
> if (CompressedKlassPointers::base() == nullptr) {
> if (CompressedKlassPointers::shift() != 0) {
> @@ -3421,7 +3423,7 @@ void MacroAssembler::decode_klass_not_null(Register dst, Register src, Register
> mv(xbase, (uintptr_t)CompressedKlassPointers::base());
>
> if (CompressedKlassPointers::shift() != 0) {
> - Register t = src == dst ? dst : t0;
> + Register t = dst == xbase ? tmp : dst;
> assert_different_registers(t, xbase);
> shadd(dst, src, xbase, t, CompressedKlassPointers::shift());
> } else {
> ```
I applied your suggested patch, and it trigger an assert at `assert_different_registers(dst, tmp);`,
assert(regs[i] != regs[j]) failed: regs[0] and regs[1] are both: t2
-------------
PR Comment: https://git.openjdk.org/jdk/pull/27138#issuecomment-3266152717
More information about the hotspot-dev
mailing list