< prev index next >
src/hotspot/cpu/sparc/interp_masm_sparc.cpp
Print this page
rev 47591 : Add Thread Local handshakes and thread local polling
rev 47596 : imported patch Interpreter-Poll-7
*** 34,43 ****
--- 34,44 ----
#include "oops/methodCounters.hpp"
#include "prims/jvmtiExport.hpp"
#include "prims/jvmtiThreadState.hpp"
#include "runtime/basicLock.hpp"
#include "runtime/biasedLocking.hpp"
+ #include "runtime/safepointMechanism.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/thread.inline.hpp"
#include "utilities/align.hpp"
// Implementation of InterpreterMacroAssembler
*** 93,108 ****
jmp( IdispatchAddress, 0 );
if (bcp_incr != 0) delayed()->inc(Lbcp, bcp_incr);
else delayed()->nop();
}
!
! void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr) {
// %%%% consider branching to a single shared dispatch stub (for each bcp_incr)
assert_not_delayed();
ldub( Lbcp, bcp_incr, Lbyte_code); // load next bytecode
! dispatch_Lbyte_code(state, Interpreter::dispatch_table(state), bcp_incr);
}
void InterpreterMacroAssembler::dispatch_next_noverify_oop(TosState state, int bcp_incr) {
// %%%% consider branching to a single shared dispatch stub (for each bcp_incr)
--- 94,108 ----
jmp( IdispatchAddress, 0 );
if (bcp_incr != 0) delayed()->inc(Lbcp, bcp_incr);
else delayed()->nop();
}
! void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr, bool generate_poll) {
// %%%% consider branching to a single shared dispatch stub (for each bcp_incr)
assert_not_delayed();
ldub( Lbcp, bcp_incr, Lbyte_code); // load next bytecode
! dispatch_Lbyte_code(state, Interpreter::dispatch_table(state), bcp_incr, true, generate_poll);
}
void InterpreterMacroAssembler::dispatch_next_noverify_oop(TosState state, int bcp_incr) {
// %%%% consider branching to a single shared dispatch stub (for each bcp_incr)
*** 259,277 ****
// common code to dispatch and dispatch_only
// dispatch value in Lbyte_code and increment Lbcp
! void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, address* table, int bcp_incr, bool verify) {
verify_FPU(1, state);
// %%%%% maybe implement +VerifyActivationFrameSize here
//verify_thread(); //too slow; we will just verify on method entry & exit
if (verify) interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
// dispatch table to use
AddressLiteral tbl(table);
! sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
set(tbl, G3_scratch); // compute addr of table
ld_ptr(G3_scratch, Lbyte_code, G3_scratch); // get entry addr
jmp( G3_scratch, 0 );
if (bcp_incr != 0) delayed()->inc(Lbcp, bcp_incr);
else delayed()->nop();
}
--- 259,296 ----
// common code to dispatch and dispatch_only
// dispatch value in Lbyte_code and increment Lbcp
! void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, address* table, int bcp_incr, bool verify, bool generate_poll) {
verify_FPU(1, state);
// %%%%% maybe implement +VerifyActivationFrameSize here
//verify_thread(); //too slow; we will just verify on method entry & exit
if (verify) interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
// dispatch table to use
AddressLiteral tbl(table);
! Label dispatch;
!
! if (SafepointMechanism::uses_thread_local_poll() && generate_poll) {
! AddressLiteral sfpt_tbl(Interpreter::safept_table(state));
! Label no_safepoint;
!
! if (tbl.value() != sfpt_tbl.value()) {
! ldx(Address(G2_thread, Thread::polling_page_offset()), G3_scratch, 0);
! // Armed page has poll_bit set, if poll bit is cleared just continue.
! and3(G3_scratch, SafepointMechanism::poll_bit(), G3_scratch);
!
! br_null_short(G3_scratch, Assembler::pt, no_safepoint);
! set(sfpt_tbl, G3_scratch);
! ba_short(dispatch);
! }
! bind(no_safepoint);
! }
!
set(tbl, G3_scratch); // compute addr of table
+ bind(dispatch);
+ sll(Lbyte_code, LogBytesPerWord, Lbyte_code); // multiply by wordSize
ld_ptr(G3_scratch, Lbyte_code, G3_scratch); // get entry addr
jmp( G3_scratch, 0 );
if (bcp_incr != 0) delayed()->inc(Lbcp, bcp_incr);
else delayed()->nop();
}
< prev index next >