276 __ blrt(rscratch1, gpargs, fpargs, rtype);
277 }
278
279 // Abstract method entry
280 // Attempt to execute abstract method. Throw exception
281 address TemplateInterpreterGenerator::generate_abstract_entry(void) {
282 // rmethod: Method*
283 // r13: sender SP
284
285 address entry_point = __ pc();
286
287 // abstract method entry
288
289 // pop return address, reset last_sp to NULL
290 __ empty_expression_stack();
291 __ restore_bcp(); // bcp must be correct for exception handler (was destroyed)
292 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
293
294 // throw exception
295 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
296 InterpreterRuntime::throw_AbstractMethodError));
297 // the call_VM checks for exception, so we should never return here.
298 __ should_not_reach_here();
299
300 return entry_point;
301 }
302
303 address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
304 address entry = __ pc();
305
306 #ifdef ASSERT
307 {
308 Label L;
309 __ ldr(rscratch1, Address(rfp,
310 frame::interpreter_frame_monitor_block_top_offset *
311 wordSize));
312 __ mov(rscratch2, sp);
313 __ cmp(rscratch1, rscratch2); // maximal rsp for current rfp (stack
314 // grows negative)
315 __ br(Assembler::HS, L); // check if frame is complete
316 __ stop ("interpreter frame not set up");
|
276 __ blrt(rscratch1, gpargs, fpargs, rtype);
277 }
278
279 // Abstract method entry
280 // Attempt to execute abstract method. Throw exception
281 address TemplateInterpreterGenerator::generate_abstract_entry(void) {
282 // rmethod: Method*
283 // r13: sender SP
284
285 address entry_point = __ pc();
286
287 // abstract method entry
288
289 // pop return address, reset last_sp to NULL
290 __ empty_expression_stack();
291 __ restore_bcp(); // bcp must be correct for exception handler (was destroyed)
292 __ restore_locals(); // make sure locals pointer is correct as well (was destroyed)
293
294 // throw exception
295 __ call_VM(noreg, CAST_FROM_FN_PTR(address,
296 InterpreterRuntime::throw_AbstractMethodErrorWithMethod),
297 rmethod);
298 // the call_VM checks for exception, so we should never return here.
299 __ should_not_reach_here();
300
301 return entry_point;
302 }
303
304 address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
305 address entry = __ pc();
306
307 #ifdef ASSERT
308 {
309 Label L;
310 __ ldr(rscratch1, Address(rfp,
311 frame::interpreter_frame_monitor_block_top_offset *
312 wordSize));
313 __ mov(rscratch2, sp);
314 __ cmp(rscratch1, rscratch2); // maximal rsp for current rfp (stack
315 // grows negative)
316 __ br(Assembler::HS, L); // check if frame is complete
317 __ stop ("interpreter frame not set up");
|