1791 } |
1791 } |
1792 |
1792 |
1793 // reset handle block |
1793 // reset handle block |
1794 __ movptr(rcx, Address(thread, JavaThread::active_handles_offset())); |
1794 __ movptr(rcx, Address(thread, JavaThread::active_handles_offset())); |
1795 |
1795 |
1796 __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); |
1796 __ movptr(Address(rcx, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); |
1797 |
1797 |
1798 // Any exception pending? |
1798 // Any exception pending? |
1799 __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); |
1799 __ cmpptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); |
1800 __ jcc(Assembler::notEqual, exception_pending); |
1800 __ jcc(Assembler::notEqual, exception_pending); |
1801 |
1801 |
1863 save_native_result(masm, ret_type, stack_slots); |
1863 save_native_result(masm, ret_type, stack_slots); |
1864 } |
1864 } |
1865 // Save pending exception around call to VM (which contains an EXCEPTION_MARK) |
1865 // Save pending exception around call to VM (which contains an EXCEPTION_MARK) |
1866 |
1866 |
1867 __ pushptr(Address(thread, in_bytes(Thread::pending_exception_offset()))); |
1867 __ pushptr(Address(thread, in_bytes(Thread::pending_exception_offset()))); |
1868 __ movptr(Address(thread, in_bytes(Thread::pending_exception_offset())), (int32_t)NULL_WORD); |
1868 __ movptr(Address(thread, in_bytes(Thread::pending_exception_offset())), NULL_WORD); |
1869 |
1869 |
1870 |
1870 |
1871 // should be a peal |
1871 // should be a peal |
1872 // +wordSize because of the push above |
1872 // +wordSize because of the push above |
1873 __ lea(rax, Address(rbp, lock_slot_rbp_offset)); |
1873 __ lea(rax, Address(rbp, lock_slot_rbp_offset)); |
2429 // load throwing pc from JavaThread and patch it as the return address |
2429 // load throwing pc from JavaThread and patch it as the return address |
2430 // of the current frame. Then clear the field in JavaThread |
2430 // of the current frame. Then clear the field in JavaThread |
2431 __ get_thread(rdi); |
2431 __ get_thread(rdi); |
2432 __ movptr(rdx, Address(rdi, JavaThread::exception_pc_offset())); |
2432 __ movptr(rdx, Address(rdi, JavaThread::exception_pc_offset())); |
2433 __ movptr(Address(rbp, wordSize), rdx); |
2433 __ movptr(Address(rbp, wordSize), rdx); |
2434 __ movptr(Address(rdi, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); |
2434 __ movptr(Address(rdi, JavaThread::exception_pc_offset()), NULL_WORD); |
2435 |
2435 |
2436 #ifdef ASSERT |
2436 #ifdef ASSERT |
2437 // verify that there is really an exception oop in JavaThread |
2437 // verify that there is really an exception oop in JavaThread |
2438 __ movptr(rax, Address(rdi, JavaThread::exception_oop_offset())); |
2438 __ movptr(rax, Address(rdi, JavaThread::exception_oop_offset())); |
2439 __ verify_oop(rax); |
2439 __ verify_oop(rax); |
2487 Label noException; |
2487 Label noException; |
2488 __ cmpl(rax, Deoptimization::Unpack_exception); // Was exception pending? |
2488 __ cmpl(rax, Deoptimization::Unpack_exception); // Was exception pending? |
2489 __ jcc(Assembler::notEqual, noException); |
2489 __ jcc(Assembler::notEqual, noException); |
2490 __ movptr(rax, Address(rcx, JavaThread::exception_oop_offset())); |
2490 __ movptr(rax, Address(rcx, JavaThread::exception_oop_offset())); |
2491 __ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset())); |
2491 __ movptr(rdx, Address(rcx, JavaThread::exception_pc_offset())); |
2492 __ movptr(Address(rcx, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD); |
2492 __ movptr(Address(rcx, JavaThread::exception_oop_offset()), NULL_WORD); |
2493 __ movptr(Address(rcx, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD); |
2493 __ movptr(Address(rcx, JavaThread::exception_pc_offset()), NULL_WORD); |
2494 |
2494 |
2495 __ verify_oop(rax); |
2495 __ verify_oop(rax); |
2496 |
2496 |
2497 // Overwrite the result registers with the exception results. |
2497 // Overwrite the result registers with the exception results. |
2498 __ movptr(Address(rsp, RegisterSaver::raxOffset()*wordSize), rax); |
2498 __ movptr(Address(rsp, RegisterSaver::raxOffset()*wordSize), rax); |
2580 __ movptr(Address(rbp, |
2580 __ movptr(Address(rbp, |
2581 -(sizeof(BytecodeInterpreter)) + in_bytes(byte_offset_of(BytecodeInterpreter, _sender_sp))), |
2581 -(sizeof(BytecodeInterpreter)) + in_bytes(byte_offset_of(BytecodeInterpreter, _sender_sp))), |
2582 rbx); // Make it walkable |
2582 rbx); // Make it walkable |
2583 #else /* CC_INTERP */ |
2583 #else /* CC_INTERP */ |
2584 // This value is corrected by layout_activation_impl |
2584 // This value is corrected by layout_activation_impl |
2585 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD ); |
2585 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
2586 __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable |
2586 __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable |
2587 #endif /* CC_INTERP */ |
2587 #endif /* CC_INTERP */ |
2588 __ movptr(sp_temp, rsp); // pass to next frame |
2588 __ movptr(sp_temp, rsp); // pass to next frame |
2589 __ addptr(rsi, wordSize); // Bump array pointer (sizes) |
2589 __ addptr(rsi, wordSize); // Bump array pointer (sizes) |
2590 __ addptr(rcx, wordSize); // Bump array pointer (pcs) |
2590 __ addptr(rcx, wordSize); // Bump array pointer (pcs) |
2800 __ movptr(Address(rbp, |
2800 __ movptr(Address(rbp, |
2801 -(sizeof(BytecodeInterpreter)) + in_bytes(byte_offset_of(BytecodeInterpreter, _sender_sp))), |
2801 -(sizeof(BytecodeInterpreter)) + in_bytes(byte_offset_of(BytecodeInterpreter, _sender_sp))), |
2802 rbx); // Make it walkable |
2802 rbx); // Make it walkable |
2803 #else /* CC_INTERP */ |
2803 #else /* CC_INTERP */ |
2804 // This value is corrected by layout_activation_impl |
2804 // This value is corrected by layout_activation_impl |
2805 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD ); |
2805 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD ); |
2806 __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable |
2806 __ movptr(Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize), rbx); // Make it walkable |
2807 #endif /* CC_INTERP */ |
2807 #endif /* CC_INTERP */ |
2808 __ movptr(sp_temp, rsp); // pass to next frame |
2808 __ movptr(sp_temp, rsp); // pass to next frame |
2809 __ addptr(rsi, wordSize); // Bump array pointer (sizes) |
2809 __ addptr(rsi, wordSize); // Bump array pointer (sizes) |
2810 __ addptr(rcx, wordSize); // Bump array pointer (pcs) |
2810 __ addptr(rcx, wordSize); // Bump array pointer (pcs) |
3018 RegisterSaver::restore_live_registers(masm); |
3018 RegisterSaver::restore_live_registers(masm); |
3019 |
3019 |
3020 // exception pending => remove activation and forward to exception handler |
3020 // exception pending => remove activation and forward to exception handler |
3021 |
3021 |
3022 __ get_thread(thread); |
3022 __ get_thread(thread); |
3023 __ movptr(Address(thread, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); |
3023 __ movptr(Address(thread, JavaThread::vm_result_offset()), NULL_WORD); |
3024 __ movptr(rax, Address(thread, Thread::pending_exception_offset())); |
3024 __ movptr(rax, Address(thread, Thread::pending_exception_offset())); |
3025 __ jump(RuntimeAddress(StubRoutines::forward_exception_entry())); |
3025 __ jump(RuntimeAddress(StubRoutines::forward_exception_entry())); |
3026 |
3026 |
3027 // ------------- |
3027 // ------------- |
3028 // make sure all code is generated |
3028 // make sure all code is generated |