src/cpu/x86/vm/templateInterpreter_x86_32.cpp

Print this page




1903   __ set_last_Java_frame(thread, noreg, rbp, __ pc());
1904   __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), thread, rax, rbx);
1905   __ get_thread(thread);
1906   __ reset_last_Java_frame(thread, true, true);
1907   // Restore the last_sp and null it out
1908   __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize));
1909   __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD);
1910 
1911   __ restore_bcp();
1912   __ restore_locals();
1913   // The method data pointer was incremented already during
1914   // call profiling. We have to restore the mdp for the current bcp.
1915   if (ProfileInterpreter) {
1916     __ set_method_data_pointer_for_bcp();
1917   }
1918 
1919   // Clear the popframe condition flag
1920   __ get_thread(thread);
1921   __ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive);
1922 























1923   __ dispatch_next(vtos);
1924   // end of PopFrame support
1925 
1926   Interpreter::_remove_activation_entry = __ pc();
1927 
1928   // preserve exception over this code sequence
1929   __ pop_ptr(rax);
1930   __ get_thread(thread);
1931   __ movptr(Address(thread, JavaThread::vm_result_offset()), rax);
1932   // remove the activation (without doing throws on illegalMonitorExceptions)
1933   __ remove_activation(vtos, rdx, false, true, false);
1934   // restore exception
1935   __ get_thread(thread);
1936   __ get_vm_result(rax, thread);
1937 
1938   // Inbetween activations - previous activation type unknown yet
1939   // compute continuation point - the continuation point expects
1940   // the following registers set up:
1941   //
1942   // rax: exception




1903   __ set_last_Java_frame(thread, noreg, rbp, __ pc());
1904   __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), thread, rax, rbx);
1905   __ get_thread(thread);
1906   __ reset_last_Java_frame(thread, true, true);
1907   // Restore the last_sp and null it out
1908   __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize));
1909   __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD);
1910 
1911   __ restore_bcp();
1912   __ restore_locals();
1913   // The method data pointer was incremented already during
1914   // call profiling. We have to restore the mdp for the current bcp.
1915   if (ProfileInterpreter) {
1916     __ set_method_data_pointer_for_bcp();
1917   }
1918 
1919   // Clear the popframe condition flag
1920   __ get_thread(thread);
1921   __ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive);
1922 
1923 #if INCLUDE_JVMTI
1924   if (EnableInvokeDynamic) {
1925     Label L_done;
1926     const Register local0 = rdi;
1927 
1928     __ cmpb(Address(rsi, 0), Bytecodes::_invokestatic);
1929     __ jcc(Assembler::notEqual, L_done);
1930 
1931     // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
1932     // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
1933 
1934     __ get_method(rdx);
1935     __ movptr(rax, Address(local0, 0));
1936     __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), rax, rdx, rsi);
1937 
1938     __ testptr(rax, rax);
1939     __ jcc(Assembler::zero, L_done);
1940 
1941     __ movptr(Address(rbx, 0), rax);
1942     __ bind(L_done);
1943   }
1944 #endif // INCLUDE_JVMTI
1945 
1946   __ dispatch_next(vtos);
1947   // end of PopFrame support
1948 
1949   Interpreter::_remove_activation_entry = __ pc();
1950 
1951   // preserve exception over this code sequence
1952   __ pop_ptr(rax);
1953   __ get_thread(thread);
1954   __ movptr(Address(thread, JavaThread::vm_result_offset()), rax);
1955   // remove the activation (without doing throws on illegalMonitorExceptions)
1956   __ remove_activation(vtos, rdx, false, true, false);
1957   // restore exception
1958   __ get_thread(thread);
1959   __ get_vm_result(rax, thread);
1960 
1961   // Inbetween activations - previous activation type unknown yet
1962   // compute continuation point - the continuation point expects
1963   // the following registers set up:
1964   //
1965   // rax: exception