Skip to content

Commit

Permalink
Update (2025.02.20, 2nd)
Browse files Browse the repository at this point in the history
35595: LA port of 8343957: Rename ObjectMonitor::owner_from() and JavaThread::_lock_id
30872: LA port of 8337511: Implement JEP 404: Generational Shenandoah (Experimental)
  • Loading branch information
loongson-jvm authored Feb 20, 2025
1 parent 6eb2f12 commit f5fc626
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 11 deletions.
8 changes: 4 additions & 4 deletions src/hotspot/cpu/loongarch/c2_MacroAssembler_loongarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ void C2_MacroAssembler::fast_lock_c2(Register oop, Register box,
// Handle existing monitor.
bind(object_has_monitor);

// Try to CAS owner (no owner => current thread's _lock_id).
// Try to CAS owner (no owner => current thread's _monitor_owner_id).
Register tid = tmp2;
ld_d(tid, Address(TREG, JavaThread::lock_id_offset()));
ld_d(tid, Address(TREG, JavaThread::monitor_owner_id_offset()));
move(AT, R0);
addi_d(tmp, disp_hdr, in_bytes(ObjectMonitor::owner_offset()) - markWord::monitor_value);
cmpxchg(Address(tmp, 0), AT, tid, flag, true, true /* acquire */);
Expand Down Expand Up @@ -359,9 +359,9 @@ void C2_MacroAssembler::fast_lock_lightweight(Register obj, Register box,
// Compute owner address.
lea(tmp2_owner_addr, owner_address);

// Try to CAS owner (no owner => current thread's _lock_id).
// Try to CAS owner (no owner => current thread's _monitor_owner_id).
Register tid = tmp4;
ld_d(tid, Address(TREG, JavaThread::lock_id_offset()));
ld_d(tid, Address(TREG, JavaThread::monitor_owner_id_offset()));
move(tmp3_owner, R0);
cmpxchg(Address(tmp2_owner_addr, 0), tmp3_owner, tid, flag, true, true /* acquire */);
bnez(flag, locked);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018, 2021, Red Hat, Inc. All rights reserved.
* Copyright (c) 2022, 2024, Loongson Technology. All rights reserved.
* Copyright (c) 2022, 2025, Loongson Technology. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -91,9 +91,14 @@ LIR_Opr ShenandoahBarrierSetC1::atomic_cmpxchg_at_resolved(LIRAccess& access, LI
}

__ append(new LIR_OpShenandoahCompareAndSwap(addr, cmp_value.result(), new_value.result(), t1, t2, result));

if (ShenandoahCardBarrier) {
post_barrier(access, access.resolved_addr(), new_value.result());
}
return result;
}
}

return BarrierSetC1::atomic_cmpxchg_at_resolved(access, cmp_value, new_value);
}

Expand All @@ -118,6 +123,9 @@ LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRIt
pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
result /* pre_val */);
}
if (ShenandoahCardBarrier) {
post_barrier(access, access.resolved_addr(), result);
}
}

return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "gc/shenandoah/shenandoahRuntime.hpp"
#include "gc/shenandoah/shenandoahThreadLocalData.hpp"
#include "gc/shenandoah/heuristics/shenandoahHeuristics.hpp"
#include "gc/shenandoah/mode/shenandoahMode.hpp"
#include "interpreter/interpreter.hpp"
#include "interpreter/interp_masm.hpp"
#include "runtime/sharedRuntime.hpp"
Expand Down Expand Up @@ -77,6 +78,13 @@ void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, Dec
}
}

void ShenandoahBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
Register start, Register count, Register tmp, RegSet saved_regs) {
if (ShenandoahCardBarrier && is_oop) {
gen_write_ref_array_post_barrier(masm, decorators, start, count, tmp, saved_regs);
}
}

void ShenandoahBarrierSetAssembler::shenandoah_write_barrier_pre(MacroAssembler* masm,
Register obj,
Register pre_val,
Expand Down Expand Up @@ -373,6 +381,27 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
}
}

void ShenandoahBarrierSetAssembler::store_check(MacroAssembler* masm, Register obj, Register tmp) {
assert(ShenandoahCardBarrier, "Did you mean to enable ShenandoahCardBarrier?");

__ srli_d(obj, obj, CardTable::card_shift());

assert(CardTable::dirty_card_val() == 0, "must be");

__ load_byte_map_base(SCR1);
__ add_d(SCR1, obj, SCR1);

if (UseCondCardMark) {
Label L_already_dirty;
__ ld_bu(tmp, SCR1, 0);
__ beqz(tmp, L_already_dirty);
__ st_b(R0, SCR1, 0);
__ bind(L_already_dirty);
} else {
__ st_b(R0, SCR1, 0);
}
}

void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) {
bool on_oop = is_reference_type(type);
Expand All @@ -398,10 +427,12 @@ void ShenandoahBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet
val != noreg /* tosca_live */,
false /* expand_call */);

if (val == noreg) {
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), noreg, noreg, noreg, noreg);
} else {
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), val, noreg, noreg, noreg);
BarrierSetAssembler::store_at(masm, decorators, type, Address(tmp3, 0), val, noreg, noreg, noreg);

bool in_heap = (decorators & IN_HEAP) != 0;
bool needs_post_barrier = (val != noreg) && in_heap && ShenandoahCardBarrier;
if (needs_post_barrier) {
store_check(masm, tmp3, tmp1);
}
}

Expand Down Expand Up @@ -599,6 +630,37 @@ void ShenandoahBarrierSetAssembler::cmpxchg_oop(MacroAssembler* masm,
__ move(result, tmp2);
}

void ShenandoahBarrierSetAssembler::gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators,
Register start, Register count, Register tmp, RegSet saved_regs) {
assert(ShenandoahCardBarrier, "Did you mean to enable ShenandoahCardBarrier?");

Label L_loop, L_done;
const Register end = count;

// Zero count? Nothing to do.
__ beqz(count, L_done);

// end = start + count << LogBytesPerHeapOop
// last element address to make inclusive
__ alsl_d(end, count, start, LogBytesPerHeapOop-1);
__ addi_d(end, end, -BytesPerHeapOop);
__ srli_d(start, start, CardTable::card_shift());
__ srli_d(end, end, CardTable::card_shift());

// number of bytes to copy
__ sub_d(count, end, start);

__ load_byte_map_base(tmp);
__ add_d(start, start, tmp);

__ bind(L_loop);
__ add_d(tmp, start, count);
__ st_b(R0, tmp, 0);
__ addi_d(count, count, -1);
__ bge(count, R0, L_loop);
__ bind(L_done);
}

#undef __

#ifdef COMPILER1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2018, 2021, Red Hat, Inc. All rights reserved.
* Copyright (c) 2022, 2024, Loongson Technology. All rights reserved.
* Copyright (c) 2022, 2025, Loongson Technology. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -56,10 +56,16 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
bool tosca_live,
bool expand_call);

void store_check(MacroAssembler* masm, Register obj, Register tmp);

void resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp = noreg);
void resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp = noreg);
void load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, DecoratorSet decorators);

void gen_write_ref_array_post_barrier(MacroAssembler* masm, DecoratorSet decorators,
Register start, Register count,
Register tmp, RegSet saved_regs);

public:
virtual NMethodPatchingType nmethod_patching_type() { return NMethodPatchingType::conc_data_patch; }

Expand All @@ -72,6 +78,8 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {

virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
Register src, Register dst, Register count, RegSet saved_regs);
virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
Register start, Register count, Register tmp, RegSet saved_regs);
virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Register dst, Address src, Register tmp1, Register tmp2);
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@
*
*/

/*
* This file has been modified by Loongson Technology in 2025. These
* modifications are Copyright (c) 2025, Loongson Technology, and are made
* available on the same license terms set forth above.
*/

#include "precompiled.hpp"
#include "gc/shenandoah/heuristics/shenandoahYoungHeuristics.hpp"
#include "gc/shenandoah/heuristics/shenandoahHeuristics.hpp"
Expand All @@ -32,7 +38,7 @@

void ShenandoahGenerationalMode::initialize_flags() const {

#if !(defined AARCH64 || defined AMD64 || defined IA32 || defined PPC64 || defined RISCV64)
#if !(defined AARCH64 || defined AMD64 || defined IA32 || defined PPC64 || defined RISCV64 || defined LOONGARCH64)
vm_exit_during_initialization("Shenandoah Generational GC is not supported on this platform.");
#endif

Expand Down

0 comments on commit f5fc626

Please sign in to comment.