255 call_VM(noreg, CAST_FROM_FN_PTR(address,
256 InterpreterRuntime::build_method_counters), method);
257 ldr(mcs, Address(method, Method::method_counters_offset()));
258 cbz(mcs, skip); // No MethodCounters allocated, OutOfMemory
259 bind(has_counters);
260 }
261
262 // Load object from cpool->resolved_references(index)
263 void InterpreterMacroAssembler::load_resolved_reference_at_index(
264 Register result, Register index) {
265 assert_different_registers(result, index);
266 // convert from field index to resolved_references() index and from
267 // word index to byte offset. Since this is a java object, it can be compressed
268 Register tmp = index; // reuse
269 lslw(tmp, tmp, LogBytesPerHeapOop);
270
271 get_constant_pool(result);
272 // load pointer for resolved_references[] objArray
273 ldr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
274 ldr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
275 // JNIHandles::resolve(obj);
276 ldr(result, Address(result, 0));
277 // Add in the index
278 add(result, result, tmp);
279 load_heap_oop(result, Address(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
280 }
281
282 void InterpreterMacroAssembler::load_resolved_klass_at_offset(
283 Register cpool, Register index, Register klass, Register temp) {
284 add(temp, cpool, index, LSL, LogBytesPerWord);
285 ldrh(temp, Address(temp, sizeof(ConstantPool))); // temp = resolved_klass_index
286 ldr(klass, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes())); // klass = cpool->_resolved_klasses
287 add(klass, klass, temp, LSL, LogBytesPerWord);
288 ldr(klass, Address(klass, Array<Klass*>::base_offset_in_bytes()));
289 }
290
291 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
292 // subtype of super_klass.
293 //
294 // Args:
295 // r0: superklass
296 // Rsub_klass: subklass
|
255 call_VM(noreg, CAST_FROM_FN_PTR(address,
256 InterpreterRuntime::build_method_counters), method);
257 ldr(mcs, Address(method, Method::method_counters_offset()));
258 cbz(mcs, skip); // No MethodCounters allocated, OutOfMemory
259 bind(has_counters);
260 }
261
262 // Load object from cpool->resolved_references(index)
263 void InterpreterMacroAssembler::load_resolved_reference_at_index(
264 Register result, Register index) {
265 assert_different_registers(result, index);
266 // convert from field index to resolved_references() index and from
267 // word index to byte offset. Since this is a java object, it can be compressed
268 Register tmp = index; // reuse
269 lslw(tmp, tmp, LogBytesPerHeapOop);
270
271 get_constant_pool(result);
272 // load pointer for resolved_references[] objArray
273 ldr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
274 ldr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
275 resolve_oop_handle(result);
276 // Add in the index
277 add(result, result, tmp);
278 load_heap_oop(result, Address(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
279 }
280
281 void InterpreterMacroAssembler::load_resolved_klass_at_offset(
282 Register cpool, Register index, Register klass, Register temp) {
283 add(temp, cpool, index, LSL, LogBytesPerWord);
284 ldrh(temp, Address(temp, sizeof(ConstantPool))); // temp = resolved_klass_index
285 ldr(klass, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes())); // klass = cpool->_resolved_klasses
286 add(klass, klass, temp, LSL, LogBytesPerWord);
287 ldr(klass, Address(klass, Array<Klass*>::base_offset_in_bytes()));
288 }
289
290 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
291 // subtype of super_klass.
292 //
293 // Args:
294 // r0: superklass
295 // Rsub_klass: subklass
|