128 // away with. If you add code here, bump the code stub size
129 // returned by pd_code_size_limit!
130 const int code_length = VtableStub::pd_code_size_limit(false);
131 VtableStub* s = new(code_length) VtableStub(false, itable_index);
132 ResourceMark rm;
133 CodeBuffer cb(s->entry_point(), code_length);
134 MacroAssembler* masm = new MacroAssembler(&cb);
135
136 #ifndef PRODUCT
137 if (CountCompiledCalls) {
138 __ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
139 __ incrementw(Address(r10));
140 }
141 #endif
142
143 // Entry arguments:
144 // rscratch2: CompiledICHolder
145 // j_rarg0: Receiver
146
147
148 // Most registers are in use; we'll use r0, rmethod, r10, r11
149 const Register recv_klass_reg = r10;
150 const Register holder_klass_reg = r0; // declaring interface klass (DECC)
151 const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
152 const Register temp_reg = r11;
153 const Register icholder_reg = rscratch2;
154
155 Label L_no_such_interface;
156
157 __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset()));
158 __ ldr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset()));
159
160 // get receiver (need to skip return address on top of stack)
161 assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
162 // get receiver klass (also an implicit null-check)
163 address npe_addr = __ pc();
164 __ load_klass(recv_klass_reg, j_rarg0);
165
166 // Receiver subtype check against REFC.
167 // Destroys recv_klass_reg value.
168 __ lookup_interface_method(// inputs: rec. class, interface
169 recv_klass_reg, resolved_klass_reg, noreg,
170 // outputs: scan temp. reg1, scan temp. reg2
|
128 // away with. If you add code here, bump the code stub size
129 // returned by pd_code_size_limit!
130 const int code_length = VtableStub::pd_code_size_limit(false);
131 VtableStub* s = new(code_length) VtableStub(false, itable_index);
132 ResourceMark rm;
133 CodeBuffer cb(s->entry_point(), code_length);
134 MacroAssembler* masm = new MacroAssembler(&cb);
135
136 #ifndef PRODUCT
137 if (CountCompiledCalls) {
138 __ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
139 __ incrementw(Address(r10));
140 }
141 #endif
142
143 // Entry arguments:
144 // rscratch2: CompiledICHolder
145 // j_rarg0: Receiver
146
147
148 // Most registers are in use; we'll use r19, rmethod, r10, r11
149 const Register recv_klass_reg = r10;
150 const Register holder_klass_reg = r19; // declaring interface klass (DECC)
151 const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
152 const Register temp_reg = r11;
153 const Register icholder_reg = rscratch2;
154
155 Label L_no_such_interface;
156
157 __ ldr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset()));
158 __ ldr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset()));
159
160 // get receiver (need to skip return address on top of stack)
161 assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0");
162 // get receiver klass (also an implicit null-check)
163 address npe_addr = __ pc();
164 __ load_klass(recv_klass_reg, j_rarg0);
165
166 // Receiver subtype check against REFC.
167 // Destroys recv_klass_reg value.
168 __ lookup_interface_method(// inputs: rec. class, interface
169 recv_klass_reg, resolved_klass_reg, noreg,
170 // outputs: scan temp. reg1, scan temp. reg2
|