< prev index next >

src/hotspot/cpu/x86/interp_masm_x86.cpp

Print this page

        

*** 1077,1089 **** notify_method_exit(state, NotifyJVMTI); // preserve TOSCA } else { notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA } ! Label vtbuffer_slow, vtbuffer_done; const Register thread1 = NOT_LP64(rcx) LP64_ONLY(r15_thread); const uintptr_t chunk_mask = VTBufferChunk::chunk_mask(); 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); --- 1077,1125 ---- notify_method_exit(state, NotifyJVMTI); // preserve TOSCA } else { notify_method_exit(state, SkipNotifyJVMTI); // preserve TOSCA } ! 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,1133 **** 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)); 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 --- 1130,1150 ---- 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); ! 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 (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 >