293
294
295 __ pop(rax);
296 __ mov(rsp, r13);
297 __ jmp(rax);
298
299 return entry_point;
300 }
301
302
303 // Abstract method entry
304 // Attempt to execute abstract method. Throw exception
305 address InterpreterGenerator::generate_abstract_entry(void) {
306 // rbx: Method*
307 // r13: sender SP
308
309 address entry_point = __ pc();
310
311 // abstract method entry
312
313 // pop return address, reset last_sp to NULL
314 __ empty_expression_stack();
315 __ restore_bcp(); // rsi must be correct for exception handler (was destroyed)
316 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
317
318 // throw exception
319 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
320 InterpreterRuntime::throw_AbstractMethodError));
321 // the call_VM checks for exception, so we should never return here.
322 __ should_not_reach_here();
323
324 return entry_point;
325 }
326
327
328 // Empty method, generate a very fast return.
329
330 address InterpreterGenerator::generate_empty_entry(void) {
331 // rbx: Method*
332 // r13: sender sp must set sp to this value on return
333
334 if (!UseFastEmptyMethods) {
335 return NULL;
336 }
|
293
294
295 __ pop(rax);
296 __ mov(rsp, r13);
297 __ jmp(rax);
298
299 return entry_point;
300 }
301
302
303 // Abstract method entry
304 // Attempt to execute abstract method. Throw exception
305 address InterpreterGenerator::generate_abstract_entry(void) {
306 // rbx: Method*
307 // r13: sender SP
308
309 address entry_point = __ pc();
310
311 // abstract method entry
312
313 #ifndef CC_INTERP
314 // pop return address, reset last_sp to NULL
315 __ empty_expression_stack();
316 __ restore_bcp(); // rsi must be correct for exception handler (was destroyed)
317 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
318 #endif
319
320 // throw exception
321 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
322 InterpreterRuntime::throw_AbstractMethodError));
323 // the call_VM checks for exception, so we should never return here.
324 __ should_not_reach_here();
325
326 return entry_point;
327 }
328
329
330 // Empty method, generate a very fast return.
331
332 address InterpreterGenerator::generate_empty_entry(void) {
333 // rbx: Method*
334 // r13: sender sp must set sp to this value on return
335
336 if (!UseFastEmptyMethods) {
337 return NULL;
338 }
|