< prev index next >

src/cpu/x86/vm/interp_masm_x86.cpp

Print this page

        

@@ -932,11 +932,12 @@
 void InterpreterMacroAssembler::remove_activation(
         TosState state,
         Register ret_addr,
         bool throw_monitor_exception,
         bool install_monitor_exception,
-        bool notify_jvmdi) {
+        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,10 +1101,19 @@
                    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 >