746 } else { |
746 } else { |
747 pushq(Address(rscratch1, 0)); |
747 pushq(Address(rscratch1, 0)); |
748 } |
748 } |
749 } |
749 } |
750 |
750 |
751 void MacroAssembler::reset_last_Java_frame(bool clear_fp, |
751 void MacroAssembler::reset_last_Java_frame(bool clear_fp) { |
752 bool clear_pc) { |
|
753 // we must set sp to zero to clear frame |
752 // we must set sp to zero to clear frame |
754 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); |
753 movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); |
755 // must clear fp, so that compiled frames are not confused; it is |
754 // must clear fp, so that compiled frames are not confused; it is |
756 // possible that we need it only for debugging |
755 // possible that we need it only for debugging |
757 if (clear_fp) { |
756 if (clear_fp) { |
758 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); |
757 movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); |
759 } |
758 } |
760 |
759 |
761 if (clear_pc) { |
760 // Always clear the pc because it could have been set by make_walkable() |
762 movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); |
761 movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); |
763 } |
|
764 } |
762 } |
765 |
763 |
766 void MacroAssembler::set_last_Java_frame(Register last_java_sp, |
764 void MacroAssembler::set_last_Java_frame(Register last_java_sp, |
767 Register last_java_fp, |
765 Register last_java_fp, |
768 address last_java_pc) { |
766 address last_java_pc) { |
2559 } else { |
2557 } else { |
2560 get_thread(java_thread); |
2558 get_thread(java_thread); |
2561 } |
2559 } |
2562 // reset last Java frame |
2560 // reset last Java frame |
2563 // Only interpreter should have to clear fp |
2561 // Only interpreter should have to clear fp |
2564 reset_last_Java_frame(java_thread, true, false); |
2562 reset_last_Java_frame(java_thread, true); |
2565 |
2563 |
2566 #ifndef CC_INTERP |
2564 #ifndef CC_INTERP |
2567 // C++ interp handles this in the interpreter |
2565 // C++ interp handles this in the interpreter |
2568 check_and_handle_popframe(java_thread); |
2566 check_and_handle_popframe(java_thread); |
2569 check_and_handle_earlyret(java_thread); |
2567 check_and_handle_earlyret(java_thread); |
3806 // Make sure rsp stays 16-byte aligned |
3804 // Make sure rsp stays 16-byte aligned |
3807 LP64_ONLY(subq(rsp, 8)); |
3805 LP64_ONLY(subq(rsp, 8)); |
3808 pusha(); |
3806 pusha(); |
3809 } |
3807 } |
3810 |
3808 |
3811 void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp, bool clear_pc) { |
3809 void MacroAssembler::reset_last_Java_frame(Register java_thread, bool clear_fp) { |
3812 // determine java_thread register |
3810 // determine java_thread register |
3813 if (!java_thread->is_valid()) { |
3811 if (!java_thread->is_valid()) { |
3814 java_thread = rdi; |
3812 java_thread = rdi; |
3815 get_thread(java_thread); |
3813 get_thread(java_thread); |
3816 } |
3814 } |
3818 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); |
3816 movptr(Address(java_thread, JavaThread::last_Java_sp_offset()), NULL_WORD); |
3819 if (clear_fp) { |
3817 if (clear_fp) { |
3820 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); |
3818 movptr(Address(java_thread, JavaThread::last_Java_fp_offset()), NULL_WORD); |
3821 } |
3819 } |
3822 |
3820 |
3823 if (clear_pc) |
3821 // Always clear the pc because it could have been set by make_walkable() |
3824 movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); |
3822 movptr(Address(java_thread, JavaThread::last_Java_pc_offset()), NULL_WORD); |
3825 |
3823 |
3826 } |
3824 } |
3827 |
3825 |
3828 void MacroAssembler::restore_rax(Register tmp) { |
3826 void MacroAssembler::restore_rax(Register tmp) { |
3829 if (tmp == noreg) pop(rax); |
3827 if (tmp == noreg) pop(rax); |