108 __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), rax, rbx); |
108 __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), rax, rbx); |
109 } else { |
109 } else { |
110 if (message != NULL) { |
110 if (message != NULL) { |
111 __ lea(rbx, ExternalAddress((address)message)); |
111 __ lea(rbx, ExternalAddress((address)message)); |
112 } else { |
112 } else { |
113 __ movptr(rbx, (int32_t)NULL_WORD); |
113 __ movptr(rbx, NULL_WORD); |
114 } |
114 } |
115 __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), rax, rbx); |
115 __ call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), rax, rbx); |
116 } |
116 } |
117 // throw exception |
117 // throw exception |
118 __ jump(ExternalAddress(Interpreter::throw_exception_entry())); |
118 __ jump(ExternalAddress(Interpreter::throw_exception_entry())); |
121 |
121 |
122 |
122 |
123 address TemplateInterpreterGenerator::generate_continuation_for(TosState state) { |
123 address TemplateInterpreterGenerator::generate_continuation_for(TosState state) { |
124 address entry = __ pc(); |
124 address entry = __ pc(); |
125 // NULL last_sp until next java call |
125 // NULL last_sp until next java call |
126 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); |
126 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
127 __ dispatch_next(state); |
127 __ dispatch_next(state); |
128 return entry; |
128 return entry; |
129 } |
129 } |
130 |
130 |
131 |
131 |
174 __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_return_entry_for in interpreter"); |
174 __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_return_entry_for in interpreter"); |
175 |
175 |
176 // Restore stack bottom in case i2c adjusted stack |
176 // Restore stack bottom in case i2c adjusted stack |
177 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
177 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
178 // and NULL it as marker that rsp is now tos until next java call |
178 // and NULL it as marker that rsp is now tos until next java call |
179 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); |
179 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
180 |
180 |
181 __ restore_bcp(); |
181 __ restore_bcp(); |
182 __ restore_locals(); |
182 __ restore_locals(); |
183 __ get_cache_and_index_at_bcp(rbx, rcx, 1); |
183 __ get_cache_and_index_at_bcp(rbx, rcx, 1); |
184 __ movl(rbx, Address(rbx, rcx, |
184 __ movl(rbx, Address(rbx, rcx, |
209 |
209 |
210 __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_deopt_entry_for in interpreter"); |
210 __ MacroAssembler::verify_FPU(state == ftos || state == dtos ? 1 : 0, "generate_deopt_entry_for in interpreter"); |
211 |
211 |
212 // The stack is not extended by deopt but we must NULL last_sp as this |
212 // The stack is not extended by deopt but we must NULL last_sp as this |
213 // entry is like a "return". |
213 // entry is like a "return". |
214 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); |
214 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
215 __ restore_bcp(); |
215 __ restore_bcp(); |
216 __ restore_locals(); |
216 __ restore_locals(); |
217 // handle exceptions |
217 // handle exceptions |
218 { Label L; |
218 { Label L; |
219 const Register thread = rcx; |
219 const Register thread = rcx; |
1026 |
1026 |
1027 __ reset_last_Java_frame(thread, true, true); |
1027 __ reset_last_Java_frame(thread, true, true); |
1028 |
1028 |
1029 // reset handle block |
1029 // reset handle block |
1030 __ movptr(t, Address(thread, JavaThread::active_handles_offset())); |
1030 __ movptr(t, Address(thread, JavaThread::active_handles_offset())); |
1031 __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), (int32_t)NULL_WORD); |
1031 __ movptr(Address(t, JNIHandleBlock::top_offset_in_bytes()), NULL_WORD); |
1032 |
1032 |
1033 // If result was an oop then unbox and save it in the frame |
1033 // If result was an oop then unbox and save it in the frame |
1034 { Label L; |
1034 { Label L; |
1035 Label no_oop, store_result; |
1035 Label no_oop, store_result; |
1036 ExternalAddress handler(AbstractInterpreter::result_handler(T_OBJECT)); |
1036 ExternalAddress handler(AbstractInterpreter::result_handler(T_OBJECT)); |
1486 // Entry point in previous activation (i.e., if the caller was interpreted) |
1486 // Entry point in previous activation (i.e., if the caller was interpreted) |
1487 Interpreter::_rethrow_exception_entry = __ pc(); |
1487 Interpreter::_rethrow_exception_entry = __ pc(); |
1488 |
1488 |
1489 // Restore sp to interpreter_frame_last_sp even though we are going |
1489 // Restore sp to interpreter_frame_last_sp even though we are going |
1490 // to empty the expression stack for the exception processing. |
1490 // to empty the expression stack for the exception processing. |
1491 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); |
1491 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
1492 // rax,: exception |
1492 // rax,: exception |
1493 // rdx: return address/pc that threw exception |
1493 // rdx: return address/pc that threw exception |
1494 __ restore_bcp(); // rsi points to call/send |
1494 __ restore_bcp(); // rsi points to call/send |
1495 __ restore_locals(); |
1495 __ restore_locals(); |
1496 |
1496 |
1606 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), rcx, rax, rbx); |
1606 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::popframe_move_outgoing_args), rcx, rax, rbx); |
1607 __ get_thread(rcx); |
1607 __ get_thread(rcx); |
1608 __ reset_last_Java_frame(rcx, true, true); |
1608 __ reset_last_Java_frame(rcx, true, true); |
1609 // Restore the last_sp and null it out |
1609 // Restore the last_sp and null it out |
1610 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
1610 __ movptr(rsp, Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize)); |
1611 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); |
1611 __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), NULL_WORD); |
1612 |
1612 |
1613 __ restore_bcp(); |
1613 __ restore_bcp(); |
1614 __ restore_locals(); |
1614 __ restore_locals(); |
1615 // The method data pointer was incremented already during |
1615 // The method data pointer was incremented already during |
1616 // call profiling. We have to restore the mdp for the current bcp. |
1616 // call profiling. We have to restore the mdp for the current bcp. |
1634 // remove the activation (without doing throws on illegalMonitorExceptions) |
1634 // remove the activation (without doing throws on illegalMonitorExceptions) |
1635 __ remove_activation(vtos, rdx, false, true, false); |
1635 __ remove_activation(vtos, rdx, false, true, false); |
1636 // restore exception |
1636 // restore exception |
1637 __ get_thread(rcx); |
1637 __ get_thread(rcx); |
1638 __ movptr(rax, Address(rcx, JavaThread::vm_result_offset())); |
1638 __ movptr(rax, Address(rcx, JavaThread::vm_result_offset())); |
1639 __ movptr(Address(rcx, JavaThread::vm_result_offset()), (int32_t)NULL_WORD); |
1639 __ movptr(Address(rcx, JavaThread::vm_result_offset()), NULL_WORD); |
1640 __ verify_oop(rax); |
1640 __ verify_oop(rax); |
1641 |
1641 |
1642 // Inbetween activations - previous activation type unknown yet |
1642 // Inbetween activations - previous activation type unknown yet |
1643 // compute continuation point - the continuation point expects |
1643 // compute continuation point - the continuation point expects |
1644 // the following registers set up: |
1644 // the following registers set up: |