< 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 >