src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot-comp Cdiff src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

Print this page

        

*** 646,682 **** // Note: we do not need to round double result; float result has the right precision // the poll sets the condition code, but no data registers AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()), relocInfo::poll_return_type); ! // NOTE: the requires that the polling page be reachable else the reloc ! // goes to the movq that loads the address and not the faulting instruction ! // which breaks the signal handler code ! ! __ test32(rax, polling_page); ! __ ret(0); } int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()), relocInfo::poll_type); ! ! if (info != NULL) { add_debug_info_for_branch(info); } else { ! ShouldNotReachHere(); } - - int offset = __ offset(); - - // NOTE: the requires that the polling page be reachable else the reloc - // goes to the movq that loads the address and not the faulting instruction - // which breaks the signal handler code - - __ test32(rax, polling_page); return offset; } void LIR_Assembler::move_regs(Register from_reg, Register to_reg) { --- 646,680 ---- // Note: we do not need to round double result; float result has the right precision // the poll sets the condition code, but no data registers AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()), relocInfo::poll_return_type); ! if (Assembler::is_polling_page_far()) { ! __ lea(rscratch1, polling_page); ! __ relocate(relocInfo::poll_return_type); ! __ testl(rax, Address(rscratch1, 0)); ! } else { ! __ testl(rax, polling_page); ! } __ ret(0); } int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()), relocInfo::poll_type); ! guarantee(info != NULL, "Shouldn't be NULL"); ! int offset = __ offset(); ! if (Assembler::is_polling_page_far()) { ! __ lea(rscratch1, polling_page); ! offset = __ offset(); add_debug_info_for_branch(info); + __ testl(rax, Address(rscratch1, 0)); } else { ! add_debug_info_for_branch(info); ! __ testl(rax, polling_page); } return offset; } void LIR_Assembler::move_regs(Register from_reg, Register to_reg) {
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File