3725 // interpreter entry point and a conditional jump to it in case of a null
3726 // method.
3727 __ compareU64_and_branch(method2, (intptr_t) 0,
3728 Assembler::bcondZero, no_such_method);
3729
3730 __ profile_arguments_type(Z_tmp_1, method2, Z_tmp_2, true);
3731
3732 // Do the call.
3733 __ jump_from_interpreted(method2, Z_tmp_2);
3734 __ should_not_reach_here();
3735
3736 // exception handling code follows...
3737 // Note: Must restore interpreter registers to canonical
3738 // state for exception handling to work correctly!
3739
3740 __ bind(no_such_method);
3741
3742 // Throw exception.
3743 __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed).
3744 __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed).
3745 __ call_VM(noreg,
3746 CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
3747 // The call_VM checks for exception, so we should never return here.
3748 __ should_not_reach_here();
3749
3750 __ bind(no_such_interface);
3751
3752 // Throw exception.
3753 __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed).
3754 __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed).
3755 __ call_VM(noreg,
3756 CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError));
3757 // The call_VM checks for exception, so we should never return here.
3758 __ should_not_reach_here();
3759
3760 BLOCK_COMMENT("} invokeinterface");
3761 return;
3762 }
3763
3764 void TemplateTable::invokehandle(int byte_no) {
3765 transition(vtos, vtos);
3766
3767 const Register method = Z_tmp_2;
3768 const Register recv = Z_ARG5;
3769 const Register mtype = Z_tmp_1;
3770 prepare_invoke(byte_no,
3771 method, mtype, // Get f2 method, f1 MethodType.
3772 recv);
3773 __ verify_method_ptr(method);
3774 __ verify_oop(recv);
3775 __ null_check(recv);
3776
|
3725 // interpreter entry point and a conditional jump to it in case of a null
3726 // method.
3727 __ compareU64_and_branch(method2, (intptr_t) 0,
3728 Assembler::bcondZero, no_such_method);
3729
3730 __ profile_arguments_type(Z_tmp_1, method2, Z_tmp_2, true);
3731
3732 // Do the call.
3733 __ jump_from_interpreted(method2, Z_tmp_2);
3734 __ should_not_reach_here();
3735
3736 // exception handling code follows...
3737 // Note: Must restore interpreter registers to canonical
3738 // state for exception handling to work correctly!
3739
3740 __ bind(no_such_method);
3741
3742 // Throw exception.
3743 __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed).
3744 __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed).
3745 // Pass arguments for generating a verbose error message.
3746 __ z_lgr(Z_tmp_1, method); // Prevent register clash.
3747 __ call_VM(noreg,
3748 CAST_FROM_FN_PTR(address,
3749 InterpreterRuntime::throw_AbstractMethodErrorVerbose),
3750 klass, Z_tmp_1);
3751 // The call_VM checks for exception, so we should never return here.
3752 __ should_not_reach_here();
3753
3754 __ bind(no_such_interface);
3755
3756 // Throw exception.
3757 __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed).
3758 __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed).
3759 // Pass arguments for generating a verbose error message.
3760 __ call_VM(noreg,
3761 CAST_FROM_FN_PTR(address,
3762 InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose),
3763 klass, interface);
3764 // The call_VM checks for exception, so we should never return here.
3765 __ should_not_reach_here();
3766
3767 BLOCK_COMMENT("} invokeinterface");
3768 return;
3769 }
3770
3771 void TemplateTable::invokehandle(int byte_no) {
3772 transition(vtos, vtos);
3773
3774 const Register method = Z_tmp_2;
3775 const Register recv = Z_ARG5;
3776 const Register mtype = Z_tmp_1;
3777 prepare_invoke(byte_no,
3778 method, mtype, // Get f2 method, f1 MethodType.
3779 recv);
3780 __ verify_method_ptr(method);
3781 __ verify_oop(recv);
3782 __ null_check(recv);
3783
|