< prev index next >
src/hotspot/cpu/ppc/interp_masm_ppc_64.cpp
Print this page
rev 48251 : 8193257: PPC64, s390 implementation for Thread-local handshakes
Reviewed-by:
*** 27,36 ****
--- 27,37 ----
#include "precompiled.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "interp_masm_ppc.hpp"
#include "interpreter/interpreterRuntime.hpp"
#include "prims/jvmtiThreadState.hpp"
+ #include "runtime/safepointMechanism.hpp"
#include "runtime/sharedRuntime.hpp"
#ifdef PRODUCT
#define BLOCK_COMMENT(str) // nothing
#else
*** 51,69 ****
mtctr(Rscratch);
bctr();
}
}
! void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr) {
Register bytecode = R12_scratch2;
if (bcp_incr != 0) {
lbzu(bytecode, bcp_incr, R14_bcp);
} else {
lbz(bytecode, 0, R14_bcp);
}
! dispatch_Lbyte_code(state, bytecode, Interpreter::dispatch_table(state));
}
void InterpreterMacroAssembler::dispatch_via(TosState state, address* table) {
// Load current bytecode.
Register bytecode = R12_scratch2;
--- 52,70 ----
mtctr(Rscratch);
bctr();
}
}
! void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr, bool generate_poll) {
Register bytecode = R12_scratch2;
if (bcp_incr != 0) {
lbzu(bytecode, bcp_incr, R14_bcp);
} else {
lbz(bytecode, 0, R14_bcp);
}
! dispatch_Lbyte_code(state, bytecode, Interpreter::dispatch_table(state), generate_poll);
}
void InterpreterMacroAssembler::dispatch_via(TosState state, address* table) {
// Load current bytecode.
Register bytecode = R12_scratch2;
*** 201,220 ****
load_const_optimized(dst, table, R0);
}
}
void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, Register bytecode,
! address* table, bool verify) {
! if (verify) {
! unimplemented("dispatch_Lbyte_code: verify"); // See Sparc Implementation to implement this
! }
!
assert_different_registers(bytecode, R11_scratch1);
// Calc dispatch table address.
load_dispatch_table(R11_scratch1, table);
sldi(R12_scratch2, bytecode, LogBytesPerWord);
ldx(R11_scratch1, R11_scratch1, R12_scratch2);
// Jump off!
mtctr(R11_scratch1);
--- 202,231 ----
load_const_optimized(dst, table, R0);
}
}
void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, Register bytecode,
! address* table, bool generate_poll) {
assert_different_registers(bytecode, R11_scratch1);
// Calc dispatch table address.
load_dispatch_table(R11_scratch1, table);
+ if (SafepointMechanism::uses_thread_local_poll() && generate_poll) {
+ address *sfpt_tbl = Interpreter::safept_table(state);
+ if (table != sfpt_tbl) {
+ Label dispatch;
+ ld(R0, in_bytes(Thread::polling_page_offset()), R16_thread);
+ // Armed page has poll_bit set, if poll bit is cleared just continue.
+ andi_(R0, R0, SafepointMechanism::poll_bit());
+ beq(CCR0, dispatch);
+ load_dispatch_table(R11_scratch1, sfpt_tbl);
+ align(32, 16);
+ bind(dispatch);
+ }
+ }
+
sldi(R12_scratch2, bytecode, LogBytesPerWord);
ldx(R11_scratch1, R11_scratch1, R12_scratch2);
// Jump off!
mtctr(R11_scratch1);
< prev index next >