mirror of
https://github.com/openjdk/jdk.git
synced 2026-06-06 10:42:45 +00:00
8385835: Shenandoah: Polish C2 pre/post barrier signatures
Reviewed-by: mdoerr, dbriemann, fyang
This commit is contained in:
parent
1b1576d055
commit
fac043a97a
@ -868,7 +868,7 @@ void ShenandoahBarrierSetAssembler::load_c2(const MachNode* node, MacroAssembler
|
||||
void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssembler* masm, Address dst, bool dst_narrow,
|
||||
Register src, bool src_narrow, Register tmp1, Register tmp2, Register tmp3, bool is_volatile) {
|
||||
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, tmp1, dst, tmp2, tmp3, dst_narrow);
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, dst, tmp1, tmp2, tmp3, dst_narrow);
|
||||
|
||||
// Do the actual store
|
||||
if (dst_narrow) {
|
||||
@ -906,7 +906,7 @@ void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, Mac
|
||||
Register oldval, Register newval, Register tmp1, Register tmp2, Register tmp3, bool exchange, bool narrow, bool weak, bool acquire) {
|
||||
Assembler::operand_size op_size = narrow ? Assembler::word : Assembler::xword;
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp1, addr, tmp2, tmp3, narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, tmp1, tmp2, tmp3, narrow);
|
||||
|
||||
// CAS!
|
||||
__ cmpxchg(addr, oldval, newval, op_size, acquire, /* release */ true, weak, exchange ? res : noreg);
|
||||
@ -924,7 +924,7 @@ void ShenandoahBarrierSetAssembler::get_and_set_c2(const MachNode* node, MacroAs
|
||||
Register newval, Register addr, Register tmp1, Register tmp2, Register tmp3, bool is_acquire) {
|
||||
bool is_narrow = node->bottom_type()->isa_narrowoop();
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp1, addr, tmp2, tmp3, is_narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, tmp1, tmp2, tmp3, is_narrow);
|
||||
|
||||
if (is_narrow) {
|
||||
if (is_acquire) {
|
||||
|
||||
@ -1115,7 +1115,7 @@ void ShenandoahBarrierSetAssembler::load_c2(const MachNode* node, MacroAssembler
|
||||
void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssembler* masm,
|
||||
Register dst, int disp, bool dst_narrow, Register src, bool src_narrow, Register tmp1, Register tmp2, Register tmp3) {
|
||||
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, tmp1, Address(dst, disp), tmp2, tmp3, dst_narrow);
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, Address(dst, disp), tmp1, tmp2, tmp3, dst_narrow);
|
||||
|
||||
if (dst_narrow && !src_narrow) {
|
||||
// Need to encode into tmp, because we cannot clobber src.
|
||||
@ -1137,7 +1137,7 @@ void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssemble
|
||||
void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, MacroAssembler* masm, Register res, Register addr,
|
||||
Register oldval, Register newval, Register tmp1, Register tmp2, bool exchange, bool narrow, bool weak, bool acquire) {
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, res, addr, tmp1, tmp2, narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, res, tmp1, tmp2, narrow);
|
||||
|
||||
Register dest_current = exchange ? res : R0;
|
||||
Label no_update;
|
||||
@ -1168,7 +1168,7 @@ void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, Mac
|
||||
void ShenandoahBarrierSetAssembler::get_and_set_c2(const MachNode* node, MacroAssembler* masm, Register preval, Register newval, Register addr, Register tmp1, Register tmp2) {
|
||||
bool is_narrow = node->bottom_type()->isa_narrowoop();
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, preval, addr, tmp1, tmp2, is_narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, preval, tmp1, tmp2, is_narrow);
|
||||
|
||||
if (is_narrow) {
|
||||
__ getandsetw(preval, newval, addr, MacroAssembler::cmpxchgx_hint_atomic_update());
|
||||
|
||||
@ -792,7 +792,7 @@ void ShenandoahBarrierSetAssembler::load_c2(const MachNode* node, MacroAssembler
|
||||
void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssembler* masm, Address dst, bool dst_narrow,
|
||||
Register src, bool src_narrow, Register tmp1, Register tmp2, Register tmp3) {
|
||||
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, tmp1, dst, tmp2, tmp3, dst_narrow);
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, dst, tmp1, tmp2, tmp3, dst_narrow);
|
||||
|
||||
// Do the actual store
|
||||
if (dst_narrow) {
|
||||
@ -820,7 +820,7 @@ void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, Mac
|
||||
const Assembler::Aqrl release = Assembler::rl;
|
||||
const Assembler::operand_size size = narrow ? Assembler::uint32 : Assembler::int64;
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp1, Address(addr), tmp2, tmp3, narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, Address(addr), tmp1, tmp2, tmp3, narrow);
|
||||
|
||||
// CAS!
|
||||
__ cmpxchg(addr, oldval, newval, size, acquire, release, /* result */ res, !exchange /* result_as_bool */);
|
||||
@ -832,7 +832,7 @@ void ShenandoahBarrierSetAssembler::get_and_set_c2(const MachNode* node, MacroAs
|
||||
Register newval, Register addr, Register tmp1, Register tmp2, Register tmp3, bool is_acquire) {
|
||||
const bool is_narrow = node->bottom_type()->isa_narrowoop();
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp1, Address(addr, 0), tmp2, tmp3, is_narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, Address(addr, 0), tmp1, tmp2, tmp3, is_narrow);
|
||||
|
||||
if (is_narrow) {
|
||||
if (is_acquire) {
|
||||
|
||||
@ -926,7 +926,7 @@ void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssemble
|
||||
Register src, bool src_narrow,
|
||||
Register tmp) {
|
||||
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, tmp, dst, noreg, noreg, dst_narrow);
|
||||
ShenandoahBarrierStubC2::store_pre(masm, node, dst, tmp, noreg, noreg, dst_narrow);
|
||||
|
||||
// Need to encode into tmp, because we cannot clobber src.
|
||||
if (dst_narrow && !src_narrow) {
|
||||
@ -961,7 +961,7 @@ void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, Mac
|
||||
assert_different_registers(oldval, tmp, addr.base(), addr.index());
|
||||
assert_different_registers(newval, tmp, addr.base(), addr.index());
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp, addr, noreg, noreg, narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, tmp, noreg, noreg, narrow);
|
||||
|
||||
// CAS!
|
||||
__ lock();
|
||||
@ -982,7 +982,7 @@ void ShenandoahBarrierSetAssembler::compare_and_set_c2(const MachNode* node, Mac
|
||||
void ShenandoahBarrierSetAssembler::get_and_set_c2(const MachNode* node, MacroAssembler* masm, Register newval, Address addr, Register tmp, bool narrow) {
|
||||
assert_different_registers(newval, tmp, addr.base(), addr.index());
|
||||
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, tmp, addr, noreg, noreg, narrow);
|
||||
ShenandoahBarrierStubC2::load_store_pre(masm, node, addr, tmp, noreg, noreg, narrow);
|
||||
|
||||
if (narrow) {
|
||||
__ xchgl(newval, addr);
|
||||
|
||||
@ -912,16 +912,16 @@ void ShenandoahBarrierStubC2::load_post(MacroAssembler* masm, const MachNode* no
|
||||
}
|
||||
}
|
||||
|
||||
void ShenandoahBarrierStubC2::store_pre(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow) {
|
||||
void ShenandoahBarrierStubC2::store_pre(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2, Register tmp3, bool narrow) {
|
||||
// Store pre-barrier: SATB, keep-alive the current memory value.
|
||||
if (needs_slow_barrier(node)) {
|
||||
assert(!needs_load_ref_barrier(node), "Should not be required for stores");
|
||||
ShenandoahBarrierStubC2* const stub = create(node, obj, addr, tmp1, tmp2, narrow, /* do_load = */ true);
|
||||
ShenandoahBarrierStubC2* const stub = create(node, tmp1, addr, tmp2, tmp3, narrow, /* do_load = */ true);
|
||||
stub->enter_if_gc_state(*masm, ShenandoahHeap::MARKING, tmp1);
|
||||
}
|
||||
}
|
||||
|
||||
void ShenandoahBarrierStubC2::load_store_pre(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow) {
|
||||
void ShenandoahBarrierStubC2::load_store_pre(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2, Register tmp3, bool narrow) {
|
||||
// Load/Store pre-barrier:
|
||||
// a. Avoids false positives from CAS encountering to-space memory values.
|
||||
// b. Satisfies the need for LRB for the CAE result.
|
||||
@ -930,7 +930,7 @@ void ShenandoahBarrierStubC2::load_store_pre(MacroAssembler* masm, const MachNod
|
||||
// (a) and (b) are covered because load barrier does memory location fixup.
|
||||
// (c) is covered by KA on the current memory value.
|
||||
if (needs_slow_barrier(node)) {
|
||||
ShenandoahBarrierStubC2* const stub = create(node, obj, addr, tmp1, tmp2, narrow, /* do_load = */ true);
|
||||
ShenandoahBarrierStubC2* const stub = create(node, tmp1, addr, tmp2, tmp3, narrow, /* do_load = */ true);
|
||||
char check = 0;
|
||||
check |= needs_keep_alive_barrier(node) ? ShenandoahHeap::MARKING : 0;
|
||||
check |= needs_load_ref_barrier(node) ? ShenandoahHeap::HAS_FORWARDED : 0;
|
||||
|
||||
@ -228,10 +228,10 @@ public:
|
||||
return needs_load_ref_barrier(node) || needs_keep_alive_barrier(node);
|
||||
}
|
||||
|
||||
static void load_post(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow);
|
||||
static void store_pre(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow);
|
||||
static void store_post(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2);
|
||||
static void load_store_pre(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow);
|
||||
static void load_post(MacroAssembler* masm, const MachNode* node, Register obj, Address addr, Register tmp1, Register tmp2, bool narrow);
|
||||
static void store_pre(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2, Register tmp3, bool narrow);
|
||||
static void store_post(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2);
|
||||
static void load_store_pre(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2, Register tmp3, bool narrow);
|
||||
static void load_store_post(MacroAssembler* masm, const MachNode* node, Address addr, Register tmp1, Register tmp2);
|
||||
|
||||
void emit_code(MacroAssembler& masm);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user