# HG changeset patch # Parent f1564f9e0ff9c7fbbf0eb0b147b44bc9d8f2ad6d diff -r f1564f9e0ff9 src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Mon Jul 09 12:30:23 2018 -0400 +++ b/src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp Mon Jul 09 12:39:58 2018 -0400 @@ -266,43 +266,40 @@ } void ShenandoahBarrierSetAssembler::write_barrier_impl(MacroAssembler* masm, Register dst) { - assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "should be enabled"); - assert(dst != rscratch1, "different regs"); - assert(dst != rscratch2, "Need rscratch2"); + assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled"); + assert(dst != rscratch1, "need rscratch1"); + assert(dst != rscratch2, "need rscratch2"); Label done; Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); __ ldrb(rscratch1, gc_state); - __ membar(Assembler::LoadLoad); - // Now check if evacuation is in progress. - read_barrier_not_null(masm, dst); + // Check for heap stability + __ cbz(rscratch1, done); + // Heap is unstable, need to perform the read-barrier even if WB is inactive + if (ShenandoahWriteBarrierRB) { + __ ldr(dst, Address(dst, BrooksPointer::byte_offset())); + } + + // Check for evacuation-in-progress and jump to WB slow-path if needed __ mov(rscratch2, ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL); __ tst(rscratch1, rscratch2); __ br(Assembler::EQ, done); - __ lsr(rscratch1, dst, ShenandoahHeapRegion::region_size_bytes_shift_jint()); - __ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr()); - __ ldrb(rscratch2, Address(rscratch2, rscratch1)); - __ tst(rscratch2, 0x1); - __ br(Assembler::EQ, done); + RegSet to_save = RegSet::of(r0); + if (dst != r0) { + __ push(to_save, sp); + __ mov(r0, dst); + } - // Save possibly live regs. - RegSet live_regs = RegSet::range(r0, r4) - dst; - __ push(live_regs, sp); - __ strd(v0, __ pre(sp, 2 * -wordSize)); + __ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_wb()))); - // Call into runtime - __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahRuntime::write_barrier_IRT), dst); - - // Move result into dst reg. - __ mov(dst, r0); - - // Restore possibly live regs. - __ ldrd(v0, __ post(sp, 2 * wordSize)); - __ pop(live_regs, sp); + if (dst != r0) { + __ mov(dst, r0); + __ pop(to_save, sp); + } __ bind(done); } @@ -541,7 +538,7 @@ __ cbz(res, done); } - __ shenandoah_write_barrier(res); + write_barrier(ce->masm(), res); __ bind(done); } diff -r f1564f9e0ff9 src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Mon Jul 09 12:30:23 2018 -0400 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Mon Jul 09 12:39:58 2018 -0400 @@ -4037,48 +4037,6 @@ access_store_at(T_OBJECT, IN_HEAP, dst, noreg, noreg, noreg); } -#if INCLUDE_SHENANDOAHGC -void MacroAssembler::shenandoah_write_barrier(Register dst) { - assert(UseShenandoahGC && (ShenandoahWriteBarrier || ShenandoahStoreValEnqueueBarrier), "Should be enabled"); - assert(dst != rscratch1, "need rscratch1"); - assert(dst != rscratch2, "need rscratch2"); - - Label done; - - Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset())); - ldrb(rscratch1, gc_state); - - // Check for heap stability - cbz(rscratch1, done); - - // Heap is unstable, need to perform the read-barrier even if WB is inactive - if (ShenandoahWriteBarrierRB) { - ldr(dst, Address(dst, BrooksPointer::byte_offset())); - } - - // Check for evacuation-in-progress and jump to WB slow-path if needed - mov(rscratch2, ShenandoahHeap::EVACUATION | ShenandoahHeap::TRAVERSAL); - tst(rscratch1, rscratch2); - br(Assembler::EQ, done); - - RegSet to_save = RegSet::of(r0); - if (dst != r0) { - push(to_save, sp); - mov(r0, dst); - } - - far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_wb()))); - - if (dst != r0) { - mov(dst, r0); - pop(to_save, sp); - } - block_comment("} Shenandoah write barrier"); - - bind(done); -} -#endif // INCLUDE_SHENANDOAHGC - Address MacroAssembler::allocate_metadata_address(Metadata* obj) { assert(oop_recorder() != NULL, "this assembler needs a Recorder"); int index = oop_recorder()->allocate_metadata_index(obj); diff -r f1564f9e0ff9 src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Mon Jul 09 12:30:23 2018 -0400 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp Mon Jul 09 12:39:58 2018 -0400 @@ -795,10 +795,6 @@ void resolve_jobject(Register value, Register thread, Register tmp); -#if INCLUDE_SHENANDOAHGC - void shenandoah_write_barrier(Register dst); -#endif - // oop manipulations void load_klass(Register dst, Register src); void store_klass(Register dst, Register src);