425 } else { 426 __ mov(c_rarg2, NULL_WORD); 427 } 428 __ call_VM(r0, 429 CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), 430 c_rarg1, c_rarg2); 431 } 432 // throw exception 433 __ b(address(Interpreter::throw_exception_entry())); 434 return entry; 435 } 436 437 address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { 438 address entry = __ pc(); 439 440 // Restore stack bottom in case i2c adjusted stack 441 __ ldr(esp, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 442 // and NULL it as marker that esp is now tos until next java call 443 __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 444 445 __ restore_bcp(); 446 __ restore_locals(); 447 __ restore_constant_pool_cache(); 448 __ get_method(rmethod); 449 450 if (state == atos) { 451 Register obj = r0; 452 Register mdp = r1; 453 Register tmp = r2; 454 __ ldr(mdp, Address(rmethod, Method::method_data_offset())); 455 __ profile_return_type(mdp, obj, tmp); 456 } 457 458 // Pop N words from the stack 459 __ get_cache_and_index_at_bcp(r1, r2, 1, index_size); 460 __ ldr(r1, Address(r1, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); 461 __ andr(r1, r1, ConstantPoolCacheEntry::parameter_size_mask); 462 463 __ add(esp, esp, r1, Assembler::LSL, 3); 464 | 425 } else { 426 __ mov(c_rarg2, NULL_WORD); 427 } 428 __ call_VM(r0, 429 CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), 430 c_rarg1, c_rarg2); 431 } 432 // throw exception 433 __ b(address(Interpreter::throw_exception_entry())); 434 return entry; 435 } 436 437 address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { 438 address entry = __ pc(); 439 440 // Restore stack bottom in case i2c adjusted stack 441 __ ldr(esp, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 442 // and NULL it as marker that esp is now tos until next java call 443 __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); 444 445 if (state == atos && ValueTypeReturnedAsFields) { 446 __ store_value_type_fields_to_buf(NULL, true); 447 } 448 449 __ restore_bcp(); 450 __ restore_locals(); 451 __ restore_constant_pool_cache(); 452 __ get_method(rmethod); 453 454 if (state == atos) { 455 Register obj = r0; 456 Register mdp = r1; 457 Register tmp = r2; 458 __ ldr(mdp, Address(rmethod, Method::method_data_offset())); 459 __ profile_return_type(mdp, obj, tmp); 460 } 461 462 // Pop N words from the stack 463 __ get_cache_and_index_at_bcp(r1, r2, 1, index_size); 464 __ ldr(r1, Address(r1, ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset())); 465 __ andr(r1, r1, ConstantPoolCacheEntry::parameter_size_mask); 466 467 __ add(esp, esp, r1, Assembler::LSL, 3); 468 |