Skip to content

Commit cd7de11

Browse files
DingliZhangRealFYang
authored andcommitted
8296435: RISC-V: Small refactoring for increment/decrement
Reviewed-by: fjiang, fyang Backport-of: 4c80dff2cab8bc0fcfeca8d21754a28e31e92325
1 parent e92cf80 commit cd7de11

File tree

3 files changed

+34
-36
lines changed

3 files changed

+34
-36
lines changed

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3482,60 +3482,60 @@ address MacroAssembler::emit_trampoline_stub(int insts_call_instruction_offset,
34823482
return stub_start_addr;
34833483
}
34843484

3485-
Address MacroAssembler::add_memory_helper(const Address dst) {
3485+
Address MacroAssembler::add_memory_helper(const Address dst, Register tmp) {
34863486
switch (dst.getMode()) {
34873487
case Address::base_plus_offset:
34883488
// This is the expected mode, although we allow all the other
34893489
// forms below.
3490-
return form_address(t1, dst.base(), dst.offset());
3490+
return form_address(tmp, dst.base(), dst.offset());
34913491
default:
3492-
la(t1, dst);
3493-
return Address(t1);
3492+
la(tmp, dst);
3493+
return Address(tmp);
34943494
}
34953495
}
34963496

3497-
void MacroAssembler::increment(const Address dst, int64_t value) {
3497+
void MacroAssembler::increment(const Address dst, int64_t value, Register tmp1, Register tmp2) {
34983498
assert(((dst.getMode() == Address::base_plus_offset &&
34993499
is_offset_in_range(dst.offset(), 12)) || is_imm_in_range(value, 12, 0)),
35003500
"invalid value and address mode combination");
3501-
Address adr = add_memory_helper(dst);
3502-
assert(!adr.uses(t0), "invalid dst for address increment");
3503-
ld(t0, adr);
3504-
add(t0, t0, value, t1);
3505-
sd(t0, adr);
3501+
Address adr = add_memory_helper(dst, tmp2);
3502+
assert(!adr.uses(tmp1), "invalid dst for address increment");
3503+
ld(tmp1, adr);
3504+
add(tmp1, tmp1, value, tmp2);
3505+
sd(tmp1, adr);
35063506
}
35073507

3508-
void MacroAssembler::incrementw(const Address dst, int32_t value) {
3508+
void MacroAssembler::incrementw(const Address dst, int32_t value, Register tmp1, Register tmp2) {
35093509
assert(((dst.getMode() == Address::base_plus_offset &&
35103510
is_offset_in_range(dst.offset(), 12)) || is_imm_in_range(value, 12, 0)),
35113511
"invalid value and address mode combination");
3512-
Address adr = add_memory_helper(dst);
3513-
assert(!adr.uses(t0), "invalid dst for address increment");
3514-
lwu(t0, adr);
3515-
addw(t0, t0, value, t1);
3516-
sw(t0, adr);
3512+
Address adr = add_memory_helper(dst, tmp2);
3513+
assert(!adr.uses(tmp1), "invalid dst for address increment");
3514+
lwu(tmp1, adr);
3515+
addw(tmp1, tmp1, value, tmp2);
3516+
sw(tmp1, adr);
35173517
}
35183518

3519-
void MacroAssembler::decrement(const Address dst, int64_t value) {
3519+
void MacroAssembler::decrement(const Address dst, int64_t value, Register tmp1, Register tmp2) {
35203520
assert(((dst.getMode() == Address::base_plus_offset &&
35213521
is_offset_in_range(dst.offset(), 12)) || is_imm_in_range(value, 12, 0)),
35223522
"invalid value and address mode combination");
3523-
Address adr = add_memory_helper(dst);
3524-
assert(!adr.uses(t0), "invalid dst for address decrement");
3525-
ld(t0, adr);
3526-
sub(t0, t0, value, t1);
3527-
sd(t0, adr);
3523+
Address adr = add_memory_helper(dst, tmp2);
3524+
assert(!adr.uses(tmp1), "invalid dst for address decrement");
3525+
ld(tmp1, adr);
3526+
sub(tmp1, tmp1, value, tmp2);
3527+
sd(tmp1, adr);
35283528
}
35293529

3530-
void MacroAssembler::decrementw(const Address dst, int32_t value) {
3530+
void MacroAssembler::decrementw(const Address dst, int32_t value, Register tmp1, Register tmp2) {
35313531
assert(((dst.getMode() == Address::base_plus_offset &&
35323532
is_offset_in_range(dst.offset(), 12)) || is_imm_in_range(value, 12, 0)),
35333533
"invalid value and address mode combination");
3534-
Address adr = add_memory_helper(dst);
3535-
assert(!adr.uses(t0), "invalid dst for address decrement");
3536-
lwu(t0, adr);
3537-
subw(t0, t0, value, t1);
3538-
sw(t0, adr);
3534+
Address adr = add_memory_helper(dst, tmp2);
3535+
assert(!adr.uses(tmp1), "invalid dst for address decrement");
3536+
lwu(tmp1, adr);
3537+
subw(tmp1, tmp1, value, tmp2);
3538+
sw(tmp1, adr);
35393539
}
35403540

35413541
void MacroAssembler::cmpptr(Register src1, Address src2, Label& equal) {

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -984,11 +984,11 @@ class MacroAssembler: public Assembler {
984984
// to use a 2nd scratch register to hold the constant. so, an address
985985
// increment/decrement may trash both t0 and t1.
986986

987-
void increment(const Address dst, int64_t value = 1);
988-
void incrementw(const Address dst, int32_t value = 1);
987+
void increment(const Address dst, int64_t value = 1, Register tmp1 = t0, Register tmp2 = t1);
988+
void incrementw(const Address dst, int32_t value = 1, Register tmp1 = t0, Register tmp2 = t1);
989989

990-
void decrement(const Address dst, int64_t value = 1);
991-
void decrementw(const Address dst, int32_t value = 1);
990+
void decrement(const Address dst, int64_t value = 1, Register tmp1 = t0, Register tmp2 = t1);
991+
void decrementw(const Address dst, int32_t value = 1, Register tmp1 = t0, Register tmp2 = t1);
992992

993993
void cmpptr(Register src1, Address src2, Label& equal);
994994

@@ -1184,7 +1184,7 @@ class MacroAssembler: public Assembler {
11841184
}
11851185

11861186
int bitset_to_regs(unsigned int bitset, unsigned char* regs);
1187-
Address add_memory_helper(const Address dst);
1187+
Address add_memory_helper(const Address dst, Register tmp);
11881188

11891189
void load_reserved(Register addr, enum operand_size size, Assembler::Aqrl acquire);
11901190
void store_conditional(Register addr, Register new_val, enum operand_size size, Assembler::Aqrl release);

src/hotspot/cpu/riscv/riscv.ad

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2388,9 +2388,7 @@ encode %{
23882388

23892389
// Recursive lock case
23902390
__ mv(flag, zr);
2391-
__ ld(tmp, Address(disp_hdr, ObjectMonitor::recursions_offset_in_bytes() - markWord::monitor_value));
2392-
__ add(tmp, tmp, 1u);
2393-
__ sd(tmp, Address(disp_hdr, ObjectMonitor::recursions_offset_in_bytes() - markWord::monitor_value));
2391+
__ increment(Address(disp_hdr, ObjectMonitor::recursions_offset_in_bytes() - markWord::monitor_value), 1, t0, tmp);
23942392

23952393
__ bind(cont);
23962394
%}

0 commit comments

Comments
 (0)