< prev index next >

src/hotspot/cpu/x86/templateTable_x86.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

*** 2082,2092 **** __ subptr(rax, Address(rcx, Method::const_offset())); // Adjust the bcp in r13 by the displacement in rdx __ addptr(rbcp, rdx); // jsr returns atos that is not an oop __ push_i(rax); ! __ dispatch_only(vtos); return; } // Normal (non-jsr) branch handling --- 2082,2092 ---- __ subptr(rax, Address(rcx, Method::const_offset())); // Adjust the bcp in r13 by the displacement in rdx __ addptr(rbcp, rdx); // jsr returns atos that is not an oop __ push_i(rax); ! __ dispatch_only(vtos, true); return; } // Normal (non-jsr) branch handling
*** 2201,2211 **** // continue with the bytecode @ target // rax: return bci for jsr's, unused otherwise // rbx: target bytecode // r13: target bcp ! __ dispatch_only(vtos); if (UseLoopCounter) { if (ProfileInterpreter) { // Out-of-line code to allocate method data oop. __ bind(profile_method); --- 2201,2211 ---- // continue with the bytecode @ target // rax: return bci for jsr's, unused otherwise // rbx: target bytecode // r13: target bcp ! __ dispatch_only(vtos, true); if (UseLoopCounter) { if (ProfileInterpreter) { // Out-of-line code to allocate method data oop. __ bind(profile_method);
*** 2330,2351 **** __ profile_ret(rbx, rcx); __ get_method(rax); __ movptr(rbcp, Address(rax, Method::const_offset())); __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); ! __ dispatch_next(vtos); } void TemplateTable::wide_ret() { transition(vtos, vtos); locals_index_wide(rbx); __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp __ profile_ret(rbx, rcx); __ get_method(rax); __ movptr(rbcp, Address(rax, Method::const_offset())); __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); ! __ dispatch_next(vtos); } void TemplateTable::tableswitch() { Label default_case, continue_execution; transition(itos, vtos); --- 2330,2351 ---- __ profile_ret(rbx, rcx); __ get_method(rax); __ movptr(rbcp, Address(rax, Method::const_offset())); __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::wide_ret() { transition(vtos, vtos); locals_index_wide(rbx); __ movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp __ profile_ret(rbx, rcx); __ get_method(rax); __ movptr(rbcp, Address(rax, Method::const_offset())); __ lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset())); ! __ dispatch_next(vtos, 0, true); } void TemplateTable::tableswitch() { Label default_case, continue_execution; transition(itos, vtos);
*** 2371,2381 **** __ bind(continue_execution); __ bswapl(rdx); LP64_ONLY(__ movl2ptr(rdx, rdx)); __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); __ addptr(rbcp, rdx); ! __ dispatch_only(vtos); // handle default __ bind(default_case); __ profile_switch_default(rax); __ movl(rdx, Address(rbx, 0)); __ jmp(continue_execution); --- 2371,2381 ---- __ bind(continue_execution); __ bswapl(rdx); LP64_ONLY(__ movl2ptr(rdx, rdx)); __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); __ addptr(rbcp, rdx); ! __ dispatch_only(vtos, true); // handle default __ bind(default_case); __ profile_switch_default(rax); __ movl(rdx, Address(rbx, 0)); __ jmp(continue_execution);
*** 2419,2429 **** __ bind(continue_execution); __ bswapl(rdx); __ movl2ptr(rdx, rdx); __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); __ addptr(rbcp, rdx); ! __ dispatch_only(vtos); } void TemplateTable::fast_binaryswitch() { transition(itos, vtos); // Implementation using the following core algorithm: --- 2419,2429 ---- __ bind(continue_execution); __ bswapl(rdx); __ movl2ptr(rdx, rdx); __ load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1)); __ addptr(rbcp, rdx); ! __ dispatch_only(vtos, true); } void TemplateTable::fast_binaryswitch() { transition(itos, vtos); // Implementation using the following core algorithm:
*** 2523,2533 **** NOT_LP64(__ restore_bcp()); NOT_LP64(__ restore_locals()); // restore rdi __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); __ addptr(rbcp, j); ! __ dispatch_only(vtos); // default case -> j = default offset __ bind(default_case); __ profile_switch_default(i); __ movl(j, Address(array, -2 * BytesPerInt)); --- 2523,2533 ---- NOT_LP64(__ restore_bcp()); NOT_LP64(__ restore_locals()); // restore rdi __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); __ addptr(rbcp, j); ! __ dispatch_only(vtos, true); // default case -> j = default offset __ bind(default_case); __ profile_switch_default(i); __ movl(j, Address(array, -2 * BytesPerInt));
*** 2537,2552 **** NOT_LP64(__ restore_bcp()); NOT_LP64(__ restore_locals()); __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); __ addptr(rbcp, j); ! __ dispatch_only(vtos); } void TemplateTable::_return(TosState state) { transition(state, state); assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state"); --- 2537,2566 ---- NOT_LP64(__ restore_bcp()); NOT_LP64(__ restore_locals()); __ load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1)); __ addptr(rbcp, j); ! __ dispatch_only(vtos, true); } void TemplateTable::_return(TosState state) { transition(state, state); + #ifdef _LP64 + if (SafepointMechanism::uses_thread_local_poll()) { + Label no_safepoint; + NOT_PRODUCT(__ block_comment("Thread-local Safepoint poll")); + __ testb(Address(r15_thread, Thread::polling_page_offset()), SafepointMechanism::poll_bit()); + __ jcc(Assembler::zero, no_safepoint); + __ push(state); + __ call_VM(noreg, CAST_FROM_FN_PTR(address, + InterpreterRuntime::at_safepoint)); + __ pop(state); + __ bind(no_safepoint); + } + #endif + assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation if (_desc->bytecode() == Bytecodes::_return_register_finalizer) { assert(state == vtos, "only valid state");
< prev index next >