< prev index next >

src/cpu/aarch64/vm/shenandoahBarrierSet_aarch64.cpp

Print this page
rev 10555 : [backport] Micro-optimize AArch64 assembly write-barriers
rev 10557 : [backport] Assembler write barriers should consistently check for forwarded objects

*** 55,70 **** Label done; Address gc_state(rthread, in_bytes(JavaThread::gc_state_offset())); __ ldrb(rscratch1, gc_state); - __ membar(Assembler::LoadLoad); ! // Now check if evacuation is in progress. ! interpreter_read_barrier_not_null(masm, dst); ! __ tbz(rscratch1, ShenandoahHeap::EVACUATION_BITPOS, 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); --- 55,79 ---- Label done; Address gc_state(rthread, in_bytes(JavaThread::gc_state_offset())); __ ldrb(rscratch1, gc_state); ! // Check for heap stability ! __ mov(rscratch2, ShenandoahHeap::HAS_FORWARDED | ShenandoahHeap::EVACUATION); ! __ tst(rscratch1, rscratch2); ! __ br(Assembler::EQ, 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); ! __ 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);
< prev index next >