@@ -3666,15 +3666,15 @@ void TemplateTable::prepare_invoke(Register Rcache, Register recv) {
36663666 // load receiver if needed (after extra argument is pushed so parameter size is correct)
36673667 if (load_receiver) {
36683668 __ ldrh (recv, Address (Rcache, in_bytes (ResolvedMethodEntry::num_parameters_offset ())));
3669- Address recv_addr = __ receiver_argument_address (Rstack_top, Rtemp, recv);
3670- __ ldr (recv, recv_addr );
3669+ __ add (recv, Rstack_top, AsmOperand ( recv, lsl, Interpreter::logStackElementSize) );
3670+ __ ldr (recv, Address (recv, -Interpreter::stackElementSize) );
36713671 __ verify_oop (recv);
36723672 }
36733673
36743674 // load return address
36753675 { const address table = (address) Interpreter::invoke_return_entry_table_for (code);
3676- __ mov_slow (Rtemp , table);
3677- __ ldr (LR, Address::indexed_ptr (Rtemp , ret_type));
3676+ __ mov_slow (LR , table);
3677+ __ ldr (LR, Address::indexed_ptr (LR , ret_type));
36783678 }
36793679}
36803680
@@ -3744,10 +3744,13 @@ void TemplateTable::invokevirtual(int byte_no) {
37443744void TemplateTable::invokespecial (int byte_no) {
37453745 transition (vtos, vtos);
37463746 assert (byte_no == f1_byte, " use this argument" );
3747+
37473748 const Register Rrecv = R2_tmp;
3748- load_resolved_method_entry_special_or_static (R2_tmp, // ResolvedMethodEntry*
3749+ const Register Rflags = R3_tmp;
3750+
3751+ load_resolved_method_entry_special_or_static (Rrecv, // ResolvedMethodEntry*
37493752 Rmethod, // Method*
3750- R3_tmp ); // Flags
3753+ Rflags ); // Flags
37513754 prepare_invoke (Rrecv, Rrecv);
37523755 __ verify_oop (Rrecv);
37533756 __ null_check (Rrecv, Rtemp);
@@ -3760,12 +3763,16 @@ void TemplateTable::invokespecial(int byte_no) {
37603763void TemplateTable::invokestatic (int byte_no) {
37613764 transition (vtos, vtos);
37623765 assert (byte_no == f1_byte, " use this argument" );
3763- load_resolved_method_entry_special_or_static (R2_tmp, // ResolvedMethodEntry*
3766+
3767+ const Register Rrecv = R2_tmp;
3768+ const Register Rflags = R3_tmp;
3769+
3770+ load_resolved_method_entry_special_or_static (Rrecv, // ResolvedMethodEntry*
37643771 Rmethod, // Method*
3765- R3_tmp ); // Flags
3766- prepare_invoke (R2_tmp, R2_tmp );
3772+ Rflags ); // Flags
3773+ prepare_invoke (Rrecv, Rrecv );
37673774 // do the call
3768- __ profile_call (R2_tmp );
3775+ __ profile_call (Rrecv );
37693776 __ jump_from_interpreted (Rmethod);
37703777}
37713778
@@ -3788,10 +3795,10 @@ void TemplateTable::invokeinterface(int byte_no) {
37883795 const Register Rflags = R3_tmp;
37893796 const Register Rklass = R2_tmp; // Note! Same register with Rrecv
37903797
3791- load_resolved_method_entry_interface (R2_tmp, // ResolvedMethodEntry*
3792- R1_tmp, // Klass*
3798+ load_resolved_method_entry_interface (Rrecv, // ResolvedMethodEntry*
3799+ Rinterf, // Klass*
37933800 Rmethod, // Method* or itable/vtable index
3794- R3_tmp ); // Flags
3801+ Rflags ); // Flags
37953802 prepare_invoke (Rrecv, Rrecv);
37963803
37973804 // First check for Object case, then private interface method,
0 commit comments