< 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 >