61 CodeBuffer cb(s->entry_point(), aarch64_code_length); |
61 CodeBuffer cb(s->entry_point(), aarch64_code_length); |
62 MacroAssembler* masm = new MacroAssembler(&cb); |
62 MacroAssembler* masm = new MacroAssembler(&cb); |
63 |
63 |
64 #ifndef PRODUCT |
64 #ifndef PRODUCT |
65 if (CountCompiledCalls) { |
65 if (CountCompiledCalls) { |
66 __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); |
66 __ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); |
67 __ incrementw(Address(r19)); |
67 __ incrementw(Address(r16)); |
68 } |
68 } |
69 #endif |
69 #endif |
70 |
70 |
71 // get receiver (need to skip return address on top of stack) |
71 // get receiver (need to skip return address on top of stack) |
72 assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); |
72 assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); |
73 |
73 |
74 // get receiver klass |
74 // get receiver klass |
75 address npe_addr = __ pc(); |
75 address npe_addr = __ pc(); |
76 __ load_klass(r19, j_rarg0); |
76 __ load_klass(r16, j_rarg0); |
77 |
77 |
78 #ifndef PRODUCT |
78 #ifndef PRODUCT |
79 if (DebugVtables) { |
79 if (DebugVtables) { |
80 Label L; |
80 Label L; |
81 // check offset vs vtable length |
81 // check offset vs vtable length |
82 __ ldrw(rscratch1, Address(r19, Klass::vtable_length_offset())); |
82 __ ldrw(rscratch1, Address(r16, Klass::vtable_length_offset())); |
83 __ cmpw(rscratch1, vtable_index * vtableEntry::size()); |
83 __ cmpw(rscratch1, vtable_index * vtableEntry::size()); |
84 __ br(Assembler::GT, L); |
84 __ br(Assembler::GT, L); |
85 __ enter(); |
85 __ enter(); |
86 __ mov(r2, vtable_index); |
86 __ mov(r2, vtable_index); |
87 __ call_VM(noreg, |
87 __ call_VM(noreg, |
143 // Entry arguments: |
143 // Entry arguments: |
144 // rscratch2: CompiledICHolder |
144 // rscratch2: CompiledICHolder |
145 // j_rarg0: Receiver |
145 // j_rarg0: Receiver |
146 |
146 |
147 |
147 |
148 // Most registers are in use; we'll use r0, rmethod, r10, r11 |
148 // Most registers are in use; we'll use r16, rmethod, r10, r11 |
149 const Register recv_klass_reg = r10; |
149 const Register recv_klass_reg = r10; |
150 const Register holder_klass_reg = r0; // declaring interface klass (DECC) |
150 const Register holder_klass_reg = r16; // declaring interface klass (DECC) |
151 const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) |
151 const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) |
152 const Register temp_reg = r11; |
152 const Register temp_reg = r11; |
153 const Register icholder_reg = rscratch2; |
153 const Register icholder_reg = rscratch2; |
154 |
154 |
155 Label L_no_such_interface; |
155 Label L_no_such_interface; |