comparison src/cpu/sparc/vm/templateInterpreter_sparc.cpp @ 16941:4e3b63e7a9f6

Fixing relock on interpreter when entering synchronized methods.
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Mon, 25 Aug 2014 11:32:04 -0700
parents 4062efea018b
children 52b4284cb496
comparison
equal deleted inserted replaced
16940:c01648e41410 16941:4e3b63e7a9f6
197 197
198 198
199 address InterpreterGenerator::generate_deopt_entry_for(TosState state, int step) { 199 address InterpreterGenerator::generate_deopt_entry_for(TosState state, int step) {
200 address entry = __ pc(); 200 address entry = __ pc();
201 __ get_constant_pool_cache(LcpoolCache); // load LcpoolCache 201 __ get_constant_pool_cache(LcpoolCache); // load LcpoolCache
202 #ifdef GRAAL
203 // Check if we need to take lock at entry of synchronized method.
204 {
205 Label L;
206
207 //__ cmp(, 0);
208 Address pending_monitor_enter_addr(G2_thread, Thread::pending_monitorenter_offset());
209 __ ldbool(pending_monitor_enter_addr, Gtemp); // Load if pending monitor enter
210 __ cmp_and_br_short(Gtemp, G0, Assembler::equal, Assembler::pn, L);
211 // Clear flag.
212 __ stbool(G0, pending_monitor_enter_addr);
213 // Take lock.
214 lock_method();
215 __ bind(L);
216 }
217 #endif
202 { Label L; 218 { Label L;
203 Address exception_addr(G2_thread, Thread::pending_exception_offset()); 219 Address exception_addr(G2_thread, Thread::pending_exception_offset());
204 __ ld_ptr(exception_addr, Gtemp); // Load pending exception. 220 __ ld_ptr(exception_addr, Gtemp); // Load pending exception.
205 __ br_null_short(Gtemp, Assembler::pt, L); 221 __ br_null_short(Gtemp, Assembler::pt, L);
206 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception)); 222 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_pending_exception));
1687 if (TraceDeoptimization) { 1703 if (TraceDeoptimization) {
1688 if (caller->is_entry_frame()) { 1704 if (caller->is_entry_frame()) {
1689 // make sure I5_savedSP and the entry frames notion of saved SP 1705 // make sure I5_savedSP and the entry frames notion of saved SP
1690 // agree. This assertion duplicate a check in entry frame code 1706 // agree. This assertion duplicate a check in entry frame code
1691 // but catches the failure earlier. 1707 // but catches the failure earlier.
1692 assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP), 1708 /*
1709 * Sanzinger: This does not make sense to me, since when we call stub_call -> i2c, the i2c may change the
1710 * sp, which then is not in sync with Lscratch anymore.
1711 */
1712 /**assert(*caller->register_addr(Lscratch) == *interpreter_frame->register_addr(I5_savedSP),
1693 "would change callers SP"); 1713 "would change callers SP");
1714 */
1694 } 1715 }
1695 if (caller->is_entry_frame()) { 1716 if (caller->is_entry_frame()) {
1696 tty->print("entry "); 1717 tty->print("entry ");
1697 } 1718 }
1698 if (caller->is_compiled_frame()) { 1719 if (caller->is_compiled_frame()) {