src/cpu/x86/vm/templateInterpreter_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File hotspot-dvm Cdiff src/cpu/x86/vm/templateInterpreter_x86_64.cpp

src/cpu/x86/vm/templateInterpreter_x86_64.cpp

Print this page
rev 423 : imported patch indy.patch

*** 174,184 **** return entry; } address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, ! int step) { // amd64 doesn't need to do anything special about compiled returns // to the interpreter so the code that exists on x86 to place a sentinel // here and the specialized cleanup code is not needed here. --- 174,194 ---- return entry; } address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, ! int step, ! bool unbox) { ! TosState incoming_state = state; ! if (InvokeDynamic) { ! if (unbox) { ! incoming_state = atos; ! } ! Unimplemented(); ! } else { ! assert(!unbox, "old behavior"); ! } // amd64 doesn't need to do anything special about compiled returns // to the interpreter so the code that exists on x86 to place a sentinel // here and the specialized cleanup code is not needed here.
*** 189,207 **** // and NULL it as marker that esp is now tos until next java call __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); __ restore_bcp(); __ restore_locals(); ! __ get_cache_and_index_at_bcp(rbx, rcx, 1); __ movl(rbx, Address(rbx, rcx, Address::times_8, in_bytes(constantPoolCacheOopDesc::base_offset()) + 3 * wordSize)); __ andl(rbx, 0xFF); if (TaggedStackInterpreter) __ shll(rbx, 1); // 2 slots per parameter. __ lea(rsp, Address(rsp, rbx, Address::times_8)); __ dispatch_next(state, step); return entry; } address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, --- 199,230 ---- // and NULL it as marker that esp is now tos until next java call __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); __ restore_bcp(); __ restore_locals(); ! ! Label L_got_cache, L_giant_index; ! if (InvokeDynamic) { ! __ cmpb(Address(r13, 0), Bytecodes::_invokedynamic); ! __ jcc(Assembler::equal, L_giant_index); ! } ! __ get_cache_and_index_at_bcp(rbx, rcx, 1, false); ! __ bind(L_got_cache); __ movl(rbx, Address(rbx, rcx, Address::times_8, in_bytes(constantPoolCacheOopDesc::base_offset()) + 3 * wordSize)); __ andl(rbx, 0xFF); if (TaggedStackInterpreter) __ shll(rbx, 1); // 2 slots per parameter. __ lea(rsp, Address(rsp, rbx, Address::times_8)); __ dispatch_next(state, step); + + if (InvokeDynamic) { + __ get_cache_and_index_at_bcp(rbx, rcx, 1, true); + __ jmp(L_got_cache); + } + return entry; } address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state,
src/cpu/x86/vm/templateInterpreter_x86_64.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File