Mercurial > hg > graal-compiler
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()) { |