527 // Note: we do not need to round double result; float result has the right precision |
527 // Note: we do not need to round double result; float result has the right precision |
528 // the poll sets the condition code, but no data registers |
528 // the poll sets the condition code, but no data registers |
529 |
529 |
530 if (SafepointMechanism::uses_thread_local_poll()) { |
530 if (SafepointMechanism::uses_thread_local_poll()) { |
531 #ifdef _LP64 |
531 #ifdef _LP64 |
532 __ movptr(rscratch1, Address(r15_thread, Thread::polling_page_offset())); |
532 const Register poll_addr = rscratch1; |
|
533 __ movptr(poll_addr, Address(r15_thread, Thread::polling_page_offset())); |
|
534 #else |
|
535 const Register poll_addr = rbx; |
|
536 assert(FrameMap::is_caller_save_register(poll_addr), "will overwrite"); |
|
537 __ get_thread(poll_addr); |
|
538 __ movptr(poll_addr, Address(poll_addr, Thread::polling_page_offset())); |
|
539 #endif |
533 __ relocate(relocInfo::poll_return_type); |
540 __ relocate(relocInfo::poll_return_type); |
534 __ testl(rax, Address(rscratch1, 0)); |
541 __ testl(rax, Address(poll_addr, 0)); |
535 #else |
|
536 ShouldNotReachHere(); |
|
537 #endif |
|
538 } else { |
542 } else { |
539 AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_return_type); |
543 AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_return_type); |
540 |
544 |
541 if (Assembler::is_polling_page_far()) { |
545 if (Assembler::is_polling_page_far()) { |
542 __ lea(rscratch1, polling_page); |
546 __ lea(rscratch1, polling_page); |
553 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { |
557 int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) { |
554 guarantee(info != NULL, "Shouldn't be NULL"); |
558 guarantee(info != NULL, "Shouldn't be NULL"); |
555 int offset = __ offset(); |
559 int offset = __ offset(); |
556 if (SafepointMechanism::uses_thread_local_poll()) { |
560 if (SafepointMechanism::uses_thread_local_poll()) { |
557 #ifdef _LP64 |
561 #ifdef _LP64 |
558 __ movptr(rscratch1, Address(r15_thread, Thread::polling_page_offset())); |
562 const Register poll_addr = rscratch1; |
|
563 __ movptr(poll_addr, Address(r15_thread, Thread::polling_page_offset())); |
|
564 #else |
|
565 assert(tmp->is_cpu_register(), "needed"); |
|
566 const Register poll_addr = tmp->as_register(); |
|
567 __ get_thread(poll_addr); |
|
568 __ movptr(poll_addr, Address(poll_addr, in_bytes(Thread::polling_page_offset()))); |
|
569 #endif |
559 add_debug_info_for_branch(info); |
570 add_debug_info_for_branch(info); |
560 __ relocate(relocInfo::poll_type); |
571 __ relocate(relocInfo::poll_type); |
561 address pre_pc = __ pc(); |
572 address pre_pc = __ pc(); |
562 __ testl(rax, Address(rscratch1, 0)); |
573 __ testl(rax, Address(poll_addr, 0)); |
563 address post_pc = __ pc(); |
574 address post_pc = __ pc(); |
564 guarantee(pointer_delta(post_pc, pre_pc, 1) == 3, "must be exact length"); |
575 guarantee(pointer_delta(post_pc, pre_pc, 1) == 2 LP64_ONLY(+1), "must be exact length"); |
565 #else |
|
566 ShouldNotReachHere(); |
|
567 #endif |
|
568 } else { |
576 } else { |
569 AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_type); |
577 AddressLiteral polling_page(os::get_polling_page(), relocInfo::poll_type); |
570 if (Assembler::is_polling_page_far()) { |
578 if (Assembler::is_polling_page_far()) { |
571 __ lea(rscratch1, polling_page); |
579 __ lea(rscratch1, polling_page); |
572 offset = __ offset(); |
580 offset = __ offset(); |