< prev index next >
src/hotspot/cpu/x86/macroAssembler_x86.cpp
Print this page
rev 47415 : Add Thread Local handshakes and thread local polling
@@ -36,10 +36,12 @@
#include "prims/methodHandles.hpp"
#include "runtime/biasedLocking.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/objectMonitor.hpp"
#include "runtime/os.hpp"
+#include "runtime/safepoint.hpp"
+#include "runtime/safepointMechanism.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/stubRoutines.hpp"
#include "runtime/thread.hpp"
#include "utilities/macros.hpp"
#if INCLUDE_ALL_GCS
@@ -3742,10 +3744,29 @@
// Size of store must match masking code above
movl(as_Address(ArrayAddress(page, index)), tmp);
}
+#ifdef _LP64
+void MacroAssembler::safepoint_poll(Label& slow_path, Register thread_reg, Register temp_reg) {
+ if (SafepointMechanism::uses_thread_local_poll()) {
+ testb(Address(r15_thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit());
+ jcc(Assembler::notZero, slow_path); // handshake bit set implies poll
+ } else {
+ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
+ SafepointSynchronize::_not_synchronized);
+ jcc(Assembler::notEqual, slow_path);
+ }
+}
+#else
+void MacroAssembler::safepoint_poll(Label& slow_path) {
+ cmp32(ExternalAddress(SafepointSynchronize::address_of_state()),
+ SafepointSynchronize::_not_synchronized);
+ jcc(Assembler::notEqual, slow_path);
+}
+#endif
+
// Calls to C land
//
// When entering C land, the rbp, & rsp of the last Java frame have to be recorded
// in the (thread-local) JavaThread object. When leaving C land, the last Java fp
// has to be reset to 0. This is required to allow proper stack traversal.
< prev index next >