< prev index next >

src/hotspot/cpu/sparc/templateTable_sparc.cpp

Print this page
rev 47596 : imported patch Interpreter-Poll-7
rev 47597 : imported patch Interpreter-Poll-Wide_Ret-8
rev 47598 : imported patch Interpreter-Poll-Switch-10
rev 47599 : imported patch Interpreter-Poll-Ret-11

*** 1497,1507 **** // Bump Lbcp to target of JSR __ add(Lbcp, O1_disp, Lbcp); // Push returnAddress for "ret" on stack __ push_ptr(Otos_i); // And away we go! ! __ dispatch_next(vtos); return; } // Normal (non-jsr) branch handling --- 1497,1507 ---- // Bump Lbcp to target of JSR __ add(Lbcp, O1_disp, Lbcp); // Push returnAddress for "ret" on stack __ push_ptr(Otos_i); // And away we go! ! __ dispatch_next(vtos, 0, true); return; } // Normal (non-jsr) branch handling
*** 1605,1615 **** __ add( O1_disp, Lbcp, Lbcp );// add to bc addr // continue with bytecode @ target // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above, // %%%%% and changing dispatch_next to dispatch_only ! __ dispatch_next(vtos); } // Note Condition in argument is TemplateTable::Condition // arg scope is within class scope --- 1605,1615 ---- __ add( O1_disp, Lbcp, Lbcp );// add to bc addr // continue with bytecode @ target // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above, // %%%%% and changing dispatch_next to dispatch_only ! __ dispatch_next(vtos, 0, true); } // Note Condition in argument is TemplateTable::Condition // arg scope is within class scope
*** 1674,1684 **** __ profile_ret(vtos, Otos_i, G4_scratch); __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch); __ add(G3_scratch, Otos_i, G3_scratch); __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp); ! __ dispatch_next(vtos); } void TemplateTable::wide_ret() { transition(vtos, vtos); --- 1674,1684 ---- __ profile_ret(vtos, Otos_i, G4_scratch); __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch); __ add(G3_scratch, Otos_i, G3_scratch); __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::wide_ret() { transition(vtos, vtos);
*** 1689,1699 **** __ profile_ret(vtos, Otos_i, G4_scratch); __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch); __ add(G3_scratch, Otos_i, G3_scratch); __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp); ! __ dispatch_next(vtos); } void TemplateTable::tableswitch() { transition(itos, vtos); --- 1689,1699 ---- __ profile_ret(vtos, Otos_i, G4_scratch); __ ld_ptr(Lmethod, Method::const_offset(), G3_scratch); __ add(G3_scratch, Otos_i, G3_scratch); __ add(G3_scratch, in_bytes(ConstMethod::codes_offset()), Lbcp); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::tableswitch() { transition(itos, vtos);
*** 1725,1735 **** __ profile_switch_default(O3); __ ld(O1, 0, O2); // get default offset // continue execution __ bind(continue_execution); __ add(Lbcp, O2, Lbcp); ! __ dispatch_next(vtos); } void TemplateTable::lookupswitch() { transition(itos, itos); --- 1725,1735 ---- __ profile_switch_default(O3); __ ld(O1, 0, O2); // get default offset // continue execution __ bind(continue_execution); __ add(Lbcp, O2, Lbcp); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::lookupswitch() { transition(itos, itos);
*** 1777,1787 **** __ profile_switch_case(O3, O1, O2, G3_scratch); __ bind(continue_execution); } __ add(Lbcp, O4, Lbcp); ! __ dispatch_next(vtos); } void TemplateTable::fast_binaryswitch() { transition(itos, vtos); --- 1777,1787 ---- __ profile_switch_case(O3, O1, O2, G3_scratch); __ bind(continue_execution); } __ add(Lbcp, O4, Lbcp); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::fast_binaryswitch() { transition(itos, vtos);
*** 1886,1903 **** __ bind(default_case); // fall through (if not profiling) __ profile_switch_default(Ri); __ bind(continue_execution); __ add( Lbcp, Rj, Lbcp ); ! __ dispatch_next( vtos ); } void TemplateTable::_return(TosState state) { transition(state, state); assert(_desc->calls_vm(), "inconsistent calls_vm information"); if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state"); __ mov(G0, G3_scratch); __ access_local_ptr(G3_scratch, Otos_i); __ load_klass(Otos_i, O2); --- 1886,1915 ---- __ bind(default_case); // fall through (if not profiling) __ profile_switch_default(Ri); __ bind(continue_execution); __ add( Lbcp, Rj, Lbcp ); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::_return(TosState state) { transition(state, state); assert(_desc->calls_vm(), "inconsistent calls_vm information"); + if (SafepointMechanism::uses_thread_local_poll()) { + Label no_safepoint; + __ ldx(Address(G2_thread, Thread::polling_page_offset()), G3_scratch, 0); + __ btst(SafepointMechanism::poll_bit(), G3_scratch); + __ br(Assembler::zero, false, Assembler::pt, no_safepoint); + __ delayed()->nop(); + __ push(state); //? + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::at_safepoint)); + __ pop(state); //? + __ bind(no_safepoint); + } + if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state"); __ mov(G0, G3_scratch); __ access_local_ptr(G3_scratch, Otos_i); __ load_klass(Otos_i, O2);
< prev index next >