< prev index next >

src/cpu/s390/vm/s390.ad

Print this page
rev 12487 : 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
Reviewed-by: mdoerr

*** 907,947 **** __ verify_thread(); // If this does safepoint polling, then do it here. bool need_polling = do_polling() && C->is_method_compilation(); - // Touch the polling page. - // Part 1: get the page's address. - if (need_polling) { - AddressLiteral pp(os::get_polling_page()); - __ load_const_optimized(Z_R1_scratch, pp); - } - // Pop frame, restore return_pc, and all stuff needed by interpreter. ! // Pop frame by add insted of load (a penny saved is a penny got :-). int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes); int retPC_offset = frame_size_in_bytes + _z_abi16(return_pc); if (Displacement::is_validDisp(retPC_offset)) { __ z_lg(Z_R14, retPC_offset, Z_SP); __ add2reg(Z_SP, frame_size_in_bytes); } else { __ add2reg(Z_SP, frame_size_in_bytes); __ restore_return_pc(); } ! // Touch the polling page, ! // part 2: touch the page now. if (need_polling) { // We need to mark the code position where the load from the safepoint // polling page was emitted as relocInfo::poll_return_type here. __ relocate(relocInfo::poll_return_type); __ load_from_polling_page(Z_R1_scratch); } } uint MachEpilogNode::size(PhaseRegAlloc *ra_) const { ! // variable size. determine dynamically. return MachNode::size(ra_); } int MachEpilogNode::reloc() const { // Return number of relocatable values contained in this instruction. --- 907,945 ---- __ verify_thread(); // If this does safepoint polling, then do it here. bool need_polling = do_polling() && C->is_method_compilation(); // Pop frame, restore return_pc, and all stuff needed by interpreter. ! // Pop frame by add instead of load (a penny saved is a penny got :-). int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes); int retPC_offset = frame_size_in_bytes + _z_abi16(return_pc); if (Displacement::is_validDisp(retPC_offset)) { __ z_lg(Z_R14, retPC_offset, Z_SP); __ add2reg(Z_SP, frame_size_in_bytes); } else { __ add2reg(Z_SP, frame_size_in_bytes); __ restore_return_pc(); } ! if (StackReservedPages > 0 && C->has_reserved_stack_access()) { ! __ reserved_stack_check(Z_R14); ! } ! ! // Touch the polling page. if (need_polling) { + AddressLiteral pp(os::get_polling_page()); + __ load_const_optimized(Z_R1_scratch, pp); // We need to mark the code position where the load from the safepoint // polling page was emitted as relocInfo::poll_return_type here. __ relocate(relocInfo::poll_return_type); __ load_from_polling_page(Z_R1_scratch); } } uint MachEpilogNode::size(PhaseRegAlloc *ra_) const { ! // Variable size. determine dynamically. return MachNode::size(ra_); } int MachEpilogNode::reloc() const { // Return number of relocatable values contained in this instruction.
< prev index next >