< 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 >