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