494 shll(tmp, 2 + LogBytesPerWord);
495 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));
496 // skip past the header
497 addptr(cache, in_bytes(ConstantPoolCache::base_offset()));
498 addptr(cache, tmp); // construct pointer to cache entry
499 }
500
501 // Load object from cpool->resolved_references(index)
502 void InterpreterMacroAssembler::load_resolved_reference_at_index(
503 Register result, Register index) {
504 assert_different_registers(result, index);
505 // convert from field index to resolved_references() index and from
506 // word index to byte offset. Since this is a java object, it can be compressed
507 Register tmp = index; // reuse
508 shll(tmp, LogBytesPerHeapOop);
509
510 get_constant_pool(result);
511 // load pointer for resolved_references[] objArray
512 movptr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
513 movptr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
514 // JNIHandles::resolve(obj);
515 movptr(result, Address(result, 0));
516 // Add in the index
517 addptr(result, tmp);
518 load_heap_oop(result, Address(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
519 }
520
521 // load cpool->resolved_klass_at(index)
522 void InterpreterMacroAssembler::load_resolved_klass_at_index(Register cpool,
523 Register index, Register klass) {
524 movw(index, Address(cpool, index, Address::times_ptr, sizeof(ConstantPool)));
525 Register resolved_klasses = cpool;
526 movptr(resolved_klasses, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes()));
527 movptr(klass, Address(resolved_klasses, index, Address::times_ptr, Array<Klass*>::base_offset_in_bytes()));
528 }
529
530 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
531 // subtype of super_klass.
532 //
533 // Args:
534 // rax: superklass
535 // Rsub_klass: subklass
|
494 shll(tmp, 2 + LogBytesPerWord);
495 movptr(cache, Address(rbp, frame::interpreter_frame_cache_offset * wordSize));
496 // skip past the header
497 addptr(cache, in_bytes(ConstantPoolCache::base_offset()));
498 addptr(cache, tmp); // construct pointer to cache entry
499 }
500
501 // Load object from cpool->resolved_references(index)
502 void InterpreterMacroAssembler::load_resolved_reference_at_index(
503 Register result, Register index) {
504 assert_different_registers(result, index);
505 // convert from field index to resolved_references() index and from
506 // word index to byte offset. Since this is a java object, it can be compressed
507 Register tmp = index; // reuse
508 shll(tmp, LogBytesPerHeapOop);
509
510 get_constant_pool(result);
511 // load pointer for resolved_references[] objArray
512 movptr(result, Address(result, ConstantPool::cache_offset_in_bytes()));
513 movptr(result, Address(result, ConstantPoolCache::resolved_references_offset_in_bytes()));
514 resolve_oop_handle(result);
515 // Add in the index
516 addptr(result, tmp);
517 load_heap_oop(result, Address(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
518 }
519
520 // load cpool->resolved_klass_at(index)
521 void InterpreterMacroAssembler::load_resolved_klass_at_index(Register cpool,
522 Register index, Register klass) {
523 movw(index, Address(cpool, index, Address::times_ptr, sizeof(ConstantPool)));
524 Register resolved_klasses = cpool;
525 movptr(resolved_klasses, Address(cpool, ConstantPool::resolved_klasses_offset_in_bytes()));
526 movptr(klass, Address(resolved_klasses, index, Address::times_ptr, Array<Klass*>::base_offset_in_bytes()));
527 }
528
529 // Generate a subtype check: branch to ok_is_subtype if sub_klass is a
530 // subtype of super_klass.
531 //
532 // Args:
533 // rax: superklass
534 // Rsub_klass: subklass
|