713 // skip past the header
714 add(tmp, in_bytes(ConstantPoolCache::base_offset()), tmp);
715 // construct pointer to cache entry
716 add(LcpoolCache, tmp, cache);
717 }
718
719
720 // Load object from cpool->resolved_references(index)
721 void InterpreterMacroAssembler::load_resolved_reference_at_index(
722 Register result, Register index) {
723 assert_different_registers(result, index);
724 assert_not_delayed();
725 // convert from field index to resolved_references() index and from
726 // word index to byte offset. Since this is a java object, it can be compressed
727 Register tmp = index; // reuse
728 sll(index, LogBytesPerHeapOop, tmp);
729 get_constant_pool(result);
730 // load pointer for resolved_references[] objArray
731 ld_ptr(result, ConstantPool::cache_offset_in_bytes(), result);
732 ld_ptr(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
733 // JNIHandles::resolve(result)
734 ld_ptr(result, 0, result);
735 // Add in the index
736 add(result, tmp, result);
737 load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
738 }
739
740
741 // load cpool->resolved_klass_at(index)
742 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool,
743 Register Roffset, Register Rklass) {
744 // int value = *this_cp->int_at_addr(which);
745 // int resolved_klass_index = extract_low_short_from_int(value);
746 //
747 // Because SPARC is big-endian, the low_short is at (cpool->int_at_addr(which) + 2 bytes)
748 add(Roffset, Rcpool, Roffset);
749 lduh(Roffset, sizeof(ConstantPool) + 2, Roffset); // Roffset = resolved_klass_index
750
751 Register Rresolved_klasses = Rklass;
752 ld_ptr(Rcpool, ConstantPool::resolved_klasses_offset_in_bytes(), Rresolved_klasses);
753 sll(Roffset, LogBytesPerWord, Roffset);
754 add(Roffset, Array<Klass*>::base_offset_in_bytes(), Roffset);
|
713 // skip past the header
714 add(tmp, in_bytes(ConstantPoolCache::base_offset()), tmp);
715 // construct pointer to cache entry
716 add(LcpoolCache, tmp, cache);
717 }
718
719
720 // Load object from cpool->resolved_references(index)
721 void InterpreterMacroAssembler::load_resolved_reference_at_index(
722 Register result, Register index) {
723 assert_different_registers(result, index);
724 assert_not_delayed();
725 // convert from field index to resolved_references() index and from
726 // word index to byte offset. Since this is a java object, it can be compressed
727 Register tmp = index; // reuse
728 sll(index, LogBytesPerHeapOop, tmp);
729 get_constant_pool(result);
730 // load pointer for resolved_references[] objArray
731 ld_ptr(result, ConstantPool::cache_offset_in_bytes(), result);
732 ld_ptr(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
733 resolve_oop_handle(result);
734 // Add in the index
735 add(result, tmp, result);
736 load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
737 }
738
739
740 // load cpool->resolved_klass_at(index)
741 void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool,
742 Register Roffset, Register Rklass) {
743 // int value = *this_cp->int_at_addr(which);
744 // int resolved_klass_index = extract_low_short_from_int(value);
745 //
746 // Because SPARC is big-endian, the low_short is at (cpool->int_at_addr(which) + 2 bytes)
747 add(Roffset, Rcpool, Roffset);
748 lduh(Roffset, sizeof(ConstantPool) + 2, Roffset); // Roffset = resolved_klass_index
749
750 Register Rresolved_klasses = Rklass;
751 ld_ptr(Rcpool, ConstantPool::resolved_klasses_offset_in_bytes(), Rresolved_klasses);
752 sll(Roffset, LogBytesPerWord, Roffset);
753 add(Roffset, Array<Klass*>::base_offset_in_bytes(), Roffset);
|