< prev index next >
src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp
Print this page
rev 48251 : 8193257: PPC64, s390 implementation for Thread-local handshakes
Reviewed-by:
@@ -1533,27 +1533,21 @@
// the callers registers right this moment.
// Acquire isn't strictly necessary here because of the fence, but
// sync_state is declared to be volatile, so we do it anyway
// (cmp-br-isync on one path, release (same as acquire on PPC64) on the other path).
- int sync_state_offs = __ load_const_optimized(sync_state_addr, SafepointSynchronize::address_of_state(), /*temp*/R0, true);
- // TODO PPC port assert(4 == SafepointSynchronize::sz_state(), "unexpected field size");
- __ lwz(sync_state, sync_state_offs, sync_state_addr);
+ Label do_safepoint, sync_check_done;
+ // No synchronization in progress nor yet synchronized.
+ __ safepoint_poll(do_safepoint, sync_state);
+ // Not suspended.
// TODO PPC port assert(4 == Thread::sz_suspend_flags(), "unexpected field size");
__ lwz(suspend_flags, thread_(suspend_flags));
-
- Label sync_check_done;
- Label do_safepoint;
- // No synchronization in progress nor yet synchronized.
- __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized);
- // Not suspended.
__ cmpwi(CCR1, suspend_flags, 0);
-
- __ bne(CCR0, do_safepoint);
__ beq(CCR1, sync_check_done);
+
__ bind(do_safepoint);
__ isync();
// Block. We do the call directly and leave the current
// last_Java_frame setup undisturbed. We must save any possible
// native result across the call. No oop is present.
@@ -1590,11 +1584,11 @@
// We use release_store_fence to update values like the thread state, where
// we don't want the current thread to continue until all our prior memory
// accesses (including the new thread state) are visible to other threads.
__ li(R0/*thread_state*/, _thread_in_Java);
- __ release();
+ __ lwsync(); // Acquire safepoint and suspend state, release thread state.
__ stw(R0/*thread_state*/, thread_(thread_state));
if (CheckJNICalls) {
// clear_pending_jni_exception_check
__ load_const_optimized(R0, 0L);
@@ -1856,14 +1850,11 @@
address start = __ pc(); // Remember stub start address (is rtn value).
Label slow_path;
// Safepoint check
const Register sync_state = R11_scratch1;
- int sync_state_offs = __ load_const_optimized(sync_state, SafepointSynchronize::address_of_state(), /*temp*/R0, true);
- __ lwz(sync_state, sync_state_offs, sync_state);
- __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized);
- __ bne(CCR0, slow_path);
+ __ safepoint_poll(slow_path, sync_state);
// We don't generate local frame and don't align stack because
// we not even call stub code (we generate the code inline)
// and there is no safepoint on this path.
@@ -1916,14 +1907,11 @@
address start = __ pc(); // Remember stub start address (is rtn value).
Label slow_path;
// Safepoint check
const Register sync_state = R11_scratch1;
- int sync_state_offs = __ load_const_optimized(sync_state, SafepointSynchronize::address_of_state(), /*temp*/R0, true);
- __ lwz(sync_state, sync_state_offs, sync_state);
- __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized);
- __ bne(CCR0, slow_path);
+ __ safepoint_poll(slow_path, sync_state);
// We don't generate local frame and don't align stack because
// we not even call stub code (we generate the code inline)
// and there is no safepoint on this path.
< prev index next >