src/cpu/x86/vm/macroAssembler_x86.cpp

changeset 8987
9ffa0d7ed932
parent 8877
f04097176542
child 8997
f8a45a60bc6b
equal deleted inserted replaced
8986:6470230caf2a 8987:9ffa0d7ed932
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);

mercurial