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