< prev index next >
src/hotspot/cpu/sparc/templateInterpreterGenerator_sparc.cpp
Print this page
rev 47415 : Add Thread Local handshakes and thread local polling
@@ -910,14 +910,12 @@
if (UseCRC32Intrinsics) {
address entry = __ pc();
Label L_slow_path;
// If we need a safepoint check, generate full interpreter entry.
- ExternalAddress state(SafepointSynchronize::address_of_state());
- __ set(ExternalAddress(SafepointSynchronize::address_of_state()), O2);
- __ set(SafepointSynchronize::_not_synchronized, O3);
- __ cmp_and_br_short(O2, O3, Assembler::notEqual, Assembler::pt, L_slow_path);
+ __ safepoint_poll(L_slow_path, false, G2_thread, O2);
+ __ delayed()->nop();
// Load parameters
const Register crc = O0; // initial crc
const Register val = O1; // byte to update with
const Register table = O2; // address of 256-entry lookup table
@@ -954,14 +952,13 @@
if (UseCRC32Intrinsics) {
address entry = __ pc();
Label L_slow_path;
// If we need a safepoint check, generate full interpreter entry.
- ExternalAddress state(SafepointSynchronize::address_of_state());
- __ set(ExternalAddress(SafepointSynchronize::address_of_state()), O2);
- __ set(SafepointSynchronize::_not_synchronized, O3);
- __ cmp_and_br_short(O2, O3, Assembler::notEqual, Assembler::pt, L_slow_path);
+
+ __ safepoint_poll(L_slow_path, false, G2_thread, O2);
+ __ delayed()->nop();
// Load parameters from the stack
const Register crc = O0; // initial crc
const Register buf = O1; // source java byte array address
const Register len = O2; // len
@@ -1395,11 +1392,10 @@
// must we block?
// Block, if necessary, before resuming in _thread_in_Java state.
// In order for GC to work, don't clear the last_Java_sp until after blocking.
{ Label no_block;
- AddressLiteral sync_state(SafepointSynchronize::address_of_state());
// Switch thread to "native transition" state before reading the synchronization state.
// This additional state is necessary because reading and testing the synchronization
// state is not atomic w.r.t. GC, as this scenario demonstrates:
// Java thread A, in _thread_in_native state, loads _not_synchronized and is preempted.
@@ -1418,15 +1414,13 @@
// offset to write to within the page. This minimizes bus traffic
// due to cache line collision.
__ serialize_memory(G2_thread, G1_scratch, G3_scratch);
}
}
- __ load_contents(sync_state, G3_scratch);
- __ cmp(G3_scratch, SafepointSynchronize::_not_synchronized);
Label L;
- __ br(Assembler::notEqual, false, Assembler::pn, L);
+ __ safepoint_poll(L, false, G2_thread, G3_scratch);
__ delayed()->ld(G2_thread, JavaThread::suspend_flags_offset(), G3_scratch);
__ cmp_and_br_short(G3_scratch, 0, Assembler::equal, Assembler::pt, no_block);
__ bind(L);
// Block. Save any potential method result value before the operation and
< prev index next >