src/hotspot/cpu/x86/c1_LIRAssembler_x86.cpp
changeset 49027 8dc742d9bbab
parent 48856 c866eaca24cb
child 49449 ef5d5d343e2a
equal deleted inserted replaced
49026:844bf1deff1a 49027:8dc742d9bbab
   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();