< prev index next >

src/hotspot/cpu/sparc/templateInterpreterGenerator_sparc.cpp

Print this page
rev 47415 : Add Thread Local handshakes and thread local polling

*** 910,923 **** 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); // 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 --- 910,921 ---- if (UseCRC32Intrinsics) { address entry = __ pc(); Label L_slow_path; // If we need a safepoint check, generate full interpreter entry. ! __ 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,967 **** 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); // 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 --- 952,964 ---- if (UseCRC32Intrinsics) { address entry = __ pc(); Label L_slow_path; // If we need a safepoint check, generate full interpreter entry. ! ! __ 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,1405 **** // 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. --- 1392,1401 ----
*** 1418,1432 **** // 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); __ 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 --- 1414,1426 ---- // offset to write to within the page. This minimizes bus traffic // due to cache line collision. __ serialize_memory(G2_thread, G1_scratch, G3_scratch); } } Label 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 >