629 __ empty_expression_stack(); 630 631 __ load_const_optimized(R4_ARG2, (address) name, R11_scratch1); 632 if (pass_oop) { 633 __ mr(R5_ARG3, Rexception); 634 __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), false); 635 } else { 636 __ load_const_optimized(R5_ARG3, (address) message, R11_scratch1); 637 __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), false); 638 } 639 640 // Throw exception. 641 __ mr(R3_ARG1, Rexception); 642 __ load_const_optimized(R11_scratch1, Interpreter::throw_exception_entry(), R12_scratch2); 643 __ mtctr(R11_scratch1); 644 __ bctr(); 645 646 return entry; 647 } 648 649 address TemplateInterpreterGenerator::generate_continuation_for(TosState state) { 650 address entry = __ pc(); 651 __ unimplemented("generate_continuation_for"); 652 return entry; 653 } 654 655 // This entry is returned to when a call returns to the interpreter. 656 // When we arrive here, we expect that the callee stack frame is already popped. 657 address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { 658 address entry = __ pc(); 659 660 // Move the value out of the return register back to the TOS cache of current frame. 661 switch (state) { 662 case ltos: 663 case btos: 664 case ztos: 665 case ctos: 666 case stos: 667 case atos: 668 case itos: __ mr(R17_tos, R3_RET); break; // RET -> TOS cache 669 case ftos: 670 case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET 671 case vtos: break; // Nothing to do, this was a void return. 672 default : ShouldNotReachHere(); 673 } 674 | 629 __ empty_expression_stack(); 630 631 __ load_const_optimized(R4_ARG2, (address) name, R11_scratch1); 632 if (pass_oop) { 633 __ mr(R5_ARG3, Rexception); 634 __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), false); 635 } else { 636 __ load_const_optimized(R5_ARG3, (address) message, R11_scratch1); 637 __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), false); 638 } 639 640 // Throw exception. 641 __ mr(R3_ARG1, Rexception); 642 __ load_const_optimized(R11_scratch1, Interpreter::throw_exception_entry(), R12_scratch2); 643 __ mtctr(R11_scratch1); 644 __ bctr(); 645 646 return entry; 647 } 648 649 // This entry is returned to when a call returns to the interpreter. 650 // When we arrive here, we expect that the callee stack frame is already popped. 651 address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) { 652 address entry = __ pc(); 653 654 // Move the value out of the return register back to the TOS cache of current frame. 655 switch (state) { 656 case ltos: 657 case btos: 658 case ztos: 659 case ctos: 660 case stos: 661 case atos: 662 case itos: __ mr(R17_tos, R3_RET); break; // RET -> TOS cache 663 case ftos: 664 case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET 665 case vtos: break; // Nothing to do, this was a void return. 666 default : ShouldNotReachHere(); 667 } 668 |