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