< prev index next >
src/cpu/x86/vm/interp_masm_x86.cpp
Print this page
*** 932,942 ****
void InterpreterMacroAssembler::remove_activation(
TosState state,
Register ret_addr,
bool throw_monitor_exception,
bool install_monitor_exception,
! bool notify_jvmdi) {
// Note: Registers rdx xmm0 may be in use for the
// result check if synchronized method
Label unlocked, unlock, no_unlock;
const Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
--- 932,943 ----
void InterpreterMacroAssembler::remove_activation(
TosState state,
Register ret_addr,
bool throw_monitor_exception,
bool install_monitor_exception,
! bool notify_jvmdi,
! bool load_values) {
// Note: Registers rdx xmm0 may be in use for the
// result check if synchronized method
Label unlocked, unlock, no_unlock;
const Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
*** 1100,1109 ****
--- 1101,1119 ----
InterpreterRuntime::throw_delayed_StackOverflowError));
should_not_reach_here();
bind(no_reserved_zone_enabling);
}
+ if (load_values) {
+ // We are returning a value type, load its fields into registers
+
+ super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
+
+ // call above kills the value in rbx. Reload it.
+ movptr(rbx,
+ Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
+ }
leave(); // remove frame anchor
pop(ret_addr); // get return address
mov(rsp, rbx); // set sp to sender sp
}
< prev index next >