--- old/src/hotspot/cpu/sparc/interp_masm_sparc.cpp 2017-10-11 15:25:11.611300848 +0200 +++ new/src/hotspot/cpu/sparc/interp_masm_sparc.cpp 2017-10-11 15:25:11.368290414 +0200 @@ -36,6 +36,7 @@ #include "prims/jvmtiThreadState.hpp" #include "runtime/basicLock.hpp" #include "runtime/biasedLocking.hpp" +#include "runtime/safepointMechanism.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/thread.inline.hpp" #include "utilities/align.hpp" @@ -268,8 +269,27 @@ if (verify) interp_verify_oop(Otos_i, state, __FILE__, __LINE__); // dispatch table to use AddressLiteral tbl(table); - sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize + Label dispatch; + + if (SafepointMechanism::uses_thread_local_poll()) { + AddressLiteral sfpt_tbl(Interpreter::safept_table(state)); + Label no_safepoint; + + if (tbl.value() != sfpt_tbl.value()) { + ldx(Address(G2_thread, Thread::polling_page_offset()), G3_scratch, 0); + // Armed page has poll_bit set, if poll bit is cleared just continue. + and3(G3_scratch, SafepointMechanism::poll_bit(), G3_scratch); + + br_null_short(G3_scratch, Assembler::pt, no_safepoint); + set(sfpt_tbl, G3_scratch); + ba_short(dispatch); + } + bind(no_safepoint); + } + set(tbl, G3_scratch); // compute addr of table + bind(dispatch); + sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize ld_ptr(G3_scratch, Lbyte_code, G3_scratch); // get entry addr jmp( G3_scratch, 0 ); if (bcp_incr != 0) delayed()->inc(Lbcp, bcp_incr);