212 __ jmp(rdi);
213
214 return entry_point;
215 }
216
217
218 // Abstract method entry
219 // Attempt to execute abstract method. Throw exception
220 address InterpreterGenerator::generate_abstract_entry(void) {
221
222 // rbx,: Method*
223 // rcx: receiver (unused)
224 // rsi: previous interpreter state (C++ interpreter) must preserve
225
226 // rsi: sender SP
227
228 address entry_point = __ pc();
229
230 // abstract method entry
231
232 // pop return address, reset last_sp to NULL
233 __ empty_expression_stack();
234 __ restore_bcp(); // rsi must be correct for exception handler (was destroyed)
235 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
236
237 // throw exception
238 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
239 // the call_VM checks for exception, so we should never return here.
240 __ should_not_reach_here();
241
242 return entry_point;
243 }
244
245
246 void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) {
247
248 // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in
249 // the days we had adapter frames. When we deoptimize a situation where a
250 // compiled caller calls a compiled caller will have registers it expects
251 // to survive the call to the callee. If we deoptimize the callee the only
252 // way we can restore these registers is to have the oldest interpreter
253 // frame that we create restore these values. That is what this routine
254 // will accomplish.
255
|
212 __ jmp(rdi);
213
214 return entry_point;
215 }
216
217
218 // Abstract method entry
219 // Attempt to execute abstract method. Throw exception
220 address InterpreterGenerator::generate_abstract_entry(void) {
221
222 // rbx,: Method*
223 // rcx: receiver (unused)
224 // rsi: previous interpreter state (C++ interpreter) must preserve
225
226 // rsi: sender SP
227
228 address entry_point = __ pc();
229
230 // abstract method entry
231
232 #ifndef CC_INTERP
233 // pop return address, reset last_sp to NULL
234 __ empty_expression_stack();
235 __ restore_bcp(); // rsi must be correct for exception handler (was destroyed)
236 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
237 #endif
238
239 // throw exception
240 __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
241 // the call_VM checks for exception, so we should never return here.
242 __ should_not_reach_here();
243
244 return entry_point;
245 }
246
247
248 void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) {
249
250 // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in
251 // the days we had adapter frames. When we deoptimize a situation where a
252 // compiled caller calls a compiled caller will have registers it expects
253 // to survive the call to the callee. If we deoptimize the callee the only
254 // way we can restore these registers is to have the oldest interpreter
255 // frame that we create restore these values. That is what this routine
256 // will accomplish.
257
|