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