< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page

        

@@ -1077,13 +1077,49 @@
     notify_method_exit(state, NotifyJVMTI);    // preserve TOSCA
   } else {
     notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA
   }
 
-  Label vtbuffer_slow, vtbuffer_done;
+  if (StackReservedPages > 0) {
+    movptr(rbx,
+               Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
+    // testing if reserved zone needs to be re-enabled
+    Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
+    Label no_reserved_zone_enabling;
+
+    NOT_LP64(get_thread(rthread);)
+
+    cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
+    jcc(Assembler::equal, no_reserved_zone_enabling);
+
+    cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
+    jcc(Assembler::lessEqual, no_reserved_zone_enabling);
+
+    call_VM_leaf(
+      CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
+    call_VM(noreg, CAST_FROM_FN_PTR(address,
+                   InterpreterRuntime::throw_delayed_StackOverflowError));
+    should_not_reach_here();
+
+    bind(no_reserved_zone_enabling);
+  }
+
+  // Code below is taking care of recycling TLVB memory, no safepoint should
+  // occur between this point and the end of the remove_activation() method
+  Label vtbuffer_slow, vtbuffer_done, no_buffered_value_returned;
   const Register thread1 = NOT_LP64(rcx) LP64_ONLY(r15_thread);
   const uintptr_t chunk_mask = VTBufferChunk::chunk_mask();
+  NOT_LP64(get_thread(thread1));
+  cmpptr(Address(thread1, JavaThread::return_buffered_value_offset()), (intptr_t)NULL_WORD);
+  jcc(Assembler::equal, no_buffered_value_returned);
+  movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
+  call_VM_leaf(CAST_FROM_FN_PTR(address,
+                                  InterpreterRuntime::return_value_step2), rax, rbx);
+  NOT_LP64(get_thread(thread1));
+  get_vm_result(rax, thread1);
+  jmp(vtbuffer_done);
+  bind(no_buffered_value_returned);
   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
   NOT_LP64(get_thread(thread1));
   movptr(rcx, Address(thread1, JavaThread::vt_alloc_ptr_offset()));
   cmpptr(rbx, rcx);
   jcc(Assembler::equal, vtbuffer_done);

@@ -1094,40 +1130,21 @@
   movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
   movptr(Address(thread1, JavaThread::vt_alloc_ptr_offset()), rbx);
   jmp(vtbuffer_done);
   bind(vtbuffer_slow);
   push(state);
-  call_VM(noreg, CAST_FROM_FN_PTR(address,
-                                  InterpreterRuntime::recycle_vtbuffer));
+  movptr(rbx, Address(rbp, frame::interpreter_frame_vt_alloc_ptr_offset * wordSize));
+  call_VM_leaf(CAST_FROM_FN_PTR(address,
+                                  InterpreterRuntime::recycle_vtbuffer), rbx);
   pop(state);
   bind(vtbuffer_done);
 
   // remove activation
   // get sender sp
   movptr(rbx,
          Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize));
-  if (StackReservedPages > 0) {
-    // testing if reserved zone needs to be re-enabled
-    Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
-    Label no_reserved_zone_enabling;
-
-    NOT_LP64(get_thread(rthread);)
 
-    cmpl(Address(rthread, JavaThread::stack_guard_state_offset()), JavaThread::stack_guard_enabled);
-    jcc(Assembler::equal, no_reserved_zone_enabling);
-
-    cmpptr(rbx, Address(rthread, JavaThread::reserved_stack_activation_offset()));
-    jcc(Assembler::lessEqual, no_reserved_zone_enabling);
-
-    call_VM_leaf(
-      CAST_FROM_FN_PTR(address, SharedRuntime::enable_stack_reserved_zone), rthread);
-    call_VM(noreg, CAST_FROM_FN_PTR(address,
-                   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
 #ifndef _LP64
     super_call_VM_leaf(StubRoutines::load_value_type_fields_in_regs());
 #else
< prev index next >