< prev index next >

src/hotspot/cpu/aarch64/aarch64.ad

Print this page
rev 58823 : [mq]: aarch64-jdk-nmethod-barriers-3.patch

*** 1633,1642 **** --- 1633,1656 ---- st->print("stp lr, rfp, [sp, #%d]!\n\t", -(2 * wordSize)); if (PreserveFramePointer) st->print("mov rfp, sp\n\t"); st->print("mov rscratch1, #%d\n\t", framesize - 2 * wordSize); st->print("sub sp, sp, rscratch1"); } + if (C->stub_function() == NULL && BarrierSet::barrier_set()->barrier_set_nmethod() != NULL) { + st->print("\n\t"); + st->print("ldr rscratch1, [guard]\n\t"); + st->print("dmb ishld\n\t"); + st->print("ldr rscratch2, [rthread, #thread_disarmed_offset]\n\t"); + st->print("cmp rscratch1, rscratch2\n\t"); + st->print("b.eq skip"); + st->print("\n\t"); + st->print("blr #nmethod_entry_barrier_stub\n\t"); + st->print("b skip\n\t"); + st->print("guard: int\n\t"); + st->print("\n\t"); + st->print("skip:\n\t"); + } } #endif void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const { Compile* C = ra_->C;
*** 1665,1674 **** --- 1679,1693 ---- if (C->output()->need_stack_bang(bangsize) && UseStackBanging) __ generate_stack_overflow_check(bangsize); __ build_frame(framesize); + if (C->stub_function() == NULL) { + BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler(); + bs->nmethod_entry_barrier(&_masm); + } + if (VerifyStackAtCalls) { Unimplemented(); } C->output()->set_frame_complete(cbuf.insts_size());
< prev index next >