< prev index next >
src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp
Print this page
rev 55922 : 8228369: Shenandoah: Refactor LRB C1 stubs
rev 55923 : imported patch JDK-8228369-01.patch
*** 490,520 ****
} else {
__ cset(result, Assembler::EQ);
}
}
- // Generate cset check. If obj is not in cset, branch to done label, otherwise fall through
- // obj: Register holding the oop, preserved
- // tmp1, tmp2: temp registers, trashed
- void ShenandoahBarrierSetAssembler::gen_cset_check(MacroAssembler* masm, Register obj, Register tmp1, Register tmp2, Label& done) {
- __ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
- __ lsr(tmp1, obj, ShenandoahHeapRegion::region_size_bytes_shift_jint());
- __ ldrb(tmp2, Address(tmp2, tmp1));
- __ tbz(tmp2, 0, done);
- }
-
- // Generate check if object is resolved. Branch to not_resolved label, if not. Otherwise return resolved
- // object in obj register.
- // obj: object, resolved object on normal return
- // tmp1, tmp2: temp registers, trashed
- void ShenandoahBarrierSetAssembler::gen_resolved_check(MacroAssembler* masm, Register obj, Register tmp1, Register tmp2, Label& resolved) {
- __ mov(tmp2, obj);
- resolve_forward_pointer_not_null(masm, obj, tmp1);
- __ cmp(tmp2, obj);
- __ br(Assembler::EQ, resolved);
- }
-
#undef __
#ifdef COMPILER1
#define __ ce->masm()->
--- 490,499 ----
*** 548,570 ****
Register obj = stub->obj()->as_register();
Register res = stub->result()->as_register();
Register tmp1 = stub->tmp1()->as_register();
Register tmp2 = stub->tmp2()->as_register();
- Label slow_path;
-
assert(res == r0, "result must arrive in r0");
if (res != obj) {
__ mov(res, obj);
}
// Check for null.
__ cbz(res, *stub->continuation());
! gen_cset_check(ce->masm(), res, tmp1, tmp2, *stub->continuation());
! gen_resolved_check(ce->masm(), res, tmp1, tmp2, slow_path);
__ b(*stub->continuation());
__ bind(slow_path);
ce->store_parameter(res, 0);
__ far_call(RuntimeAddress(bs->load_reference_barrier_rt_code_blob()->code_begin()));
--- 527,561 ----
Register obj = stub->obj()->as_register();
Register res = stub->result()->as_register();
Register tmp1 = stub->tmp1()->as_register();
Register tmp2 = stub->tmp2()->as_register();
assert(res == r0, "result must arrive in r0");
if (res != obj) {
__ mov(res, obj);
}
// Check for null.
__ cbz(res, *stub->continuation());
! // Check for object in cset.
! __ mov(tmp2, ShenandoahHeap::in_cset_fast_test_addr());
! __ lsr(tmp1, res, ShenandoahHeapRegion::region_size_bytes_shift_jint());
! __ ldrb(tmp2, Address(tmp2, tmp1));
! __ cbz(tmp2, *stub->continuation());
!
! // Check if object is already forwarded.
! Label slow_path;
! __ ldr(tmp1, Address(res, oopDesc::mark_offset_in_bytes()));
! __ eon(tmp1, tmp1, zr);
! __ ands(zr, tmp1, markOopDesc::lock_mask_in_place);
! __ br(Assembler::NE, slow_path);
!
! // Decode forwarded object.
! __ orr(tmp1, tmp1, markOopDesc::marked_value);
! __ eon(res, tmp1, zr);
__ b(*stub->continuation());
__ bind(slow_path);
ce->store_parameter(res, 0);
__ far_call(RuntimeAddress(bs->load_reference_barrier_rt_code_blob()->code_begin()));
*** 661,676 ****
__ align(6);
StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
address start = __ pc();
! Label done, call_rt;
! gen_cset_check(cgen->assembler(), r0, rscratch1, rscratch2, done);
! gen_resolved_check(cgen->assembler(), r0, rscratch1, rscratch2, call_rt);
__ ret(lr);
! __ bind(call_rt);
__ enter(); // required for proper stackwalking of RuntimeStub frame
__ push_call_clobbered_registers();
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
--- 652,681 ----
__ align(6);
StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
address start = __ pc();
! Label work, done;
! __ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
! __ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
! __ ldrb(rscratch2, Address(rscratch2, rscratch1));
! __ tbnz(rscratch2, 0, work);
! __ ret(lr);
! __ bind(work);
!
! Label slow_path;
! __ ldr(rscratch1, Address(r0, oopDesc::mark_offset_in_bytes()));
! __ eon(rscratch1, rscratch1, zr);
! __ ands(zr, rscratch1, markOopDesc::lock_mask_in_place);
! __ br(Assembler::NE, slow_path);
!
! // Decode forwarded object.
! __ orr(rscratch1, rscratch1, markOopDesc::marked_value);
! __ eon(r0, rscratch1, zr);
__ ret(lr);
! __ bind(slow_path);
__ enter(); // required for proper stackwalking of RuntimeStub frame
__ push_call_clobbered_registers();
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
*** 678,688 ****
__ mov(rscratch1, r0);
__ pop_call_clobbered_registers();
__ mov(r0, rscratch1);
__ leave(); // required for proper stackwalking of RuntimeStub frame
-
__ bind(done);
__ ret(lr);
return start;
}
--- 683,692 ----
< prev index next >