< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page
rev 48494 : 8195112: x86 (32 bit): implementation for Thread-local handshakes
Reviewed-by:

@@ -826,17 +826,16 @@
     bind(L);
   }
   if (verifyoop) {
     verify_oop(rax, state);
   }
-#ifdef _LP64
 
-  Label no_safepoint, dispatch;
   address* const safepoint_table = Interpreter::safept_table(state);
+#ifdef _LP64
+  Label no_safepoint, dispatch;
   if (SafepointMechanism::uses_thread_local_poll() && table != safepoint_table && generate_poll) {
     NOT_PRODUCT(block_comment("Thread-local Safepoint poll"));
-
     testb(Address(r15_thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit());
 
     jccb(Assembler::zero, no_safepoint);
     lea(rscratch1, ExternalAddress((address)safepoint_table));
     jmpb(dispatch);

@@ -847,13 +846,27 @@
   bind(dispatch);
   jmp(Address(rscratch1, rbx, Address::times_8));
 
 #else
   Address index(noreg, rbx, Address::times_ptr);
-  ExternalAddress tbl((address)table);
-  ArrayAddress dispatch(tbl, index);
-  jump(dispatch);
+  if (SafepointMechanism::uses_thread_local_poll() && table != safepoint_table && generate_poll) {
+    NOT_PRODUCT(block_comment("Thread-local Safepoint poll"));
+    Label no_safepoint;
+    const Register thread = rcx;
+    get_thread(thread);
+    testb(Address(thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit());
+
+    jccb(Assembler::zero, no_safepoint);
+    ArrayAddress dispatch_addr(ExternalAddress((address)safepoint_table), index);
+    jump(dispatch_addr);
+    bind(no_safepoint);
+  }
+
+  {
+    ArrayAddress dispatch_addr(ExternalAddress((address)table), index);
+    jump(dispatch_addr);
+  }
 #endif // _LP64
 }
 
 void InterpreterMacroAssembler::dispatch_only(TosState state, bool generate_poll) {
   dispatch_base(state, Interpreter::dispatch_table(state), true, generate_poll);
< prev index next >