< prev index next >
src/cpu/sparc/vm/interp_masm_sparc.cpp
Print this page
@@ -753,19 +753,38 @@
// word index to byte offset. Since this is a java object, it can be compressed
Register tmp = index; // reuse
sll(index, LogBytesPerHeapOop, tmp);
get_constant_pool(result);
// load pointer for resolved_references[] objArray
- ld_ptr(result, ConstantPool::resolved_references_offset_in_bytes(), result);
+ ld_ptr(result, ConstantPool::cache_offset_in_bytes(), result);
+ ld_ptr(result, ConstantPoolCache::resolved_references_offset_in_bytes(), result);
// JNIHandles::resolve(result)
ld_ptr(result, 0, result);
// Add in the index
add(result, tmp, result);
load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
}
+// load cpool->resolved_klass_at(index)
+void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool,
+ Register Roffset, Register Rklass) {
+ // int value = *this_cp->int_at_addr(which);
+ // int resolved_klass_index = extract_low_short_from_int(value);
+ //
+ // Because SPARC is big-endian, the low_short is at (cpool->int_at_addr(which) + 2 bytes)
+ add(Roffset, Rcpool, Roffset);
+ lduh(Roffset, sizeof(ConstantPool) + 2, Roffset); // Roffset = resolved_klass_index
+
+ Register Rresolved_klasses = Rklass;
+ ld_ptr(Rcpool, ConstantPool::resolved_klasses_offset_in_bytes(), Rresolved_klasses);
+ sll(Roffset, LogBytesPerWord, Roffset);
+ add(Roffset, Array<Klass*>::base_offset_in_bytes(), Roffset);
+ ld_ptr(Rresolved_klasses, Roffset, Rklass);
+}
+
+
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
// a subtype of super_klass. Blows registers Rsuper_klass, Rsub_klass, tmp1, tmp2.
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
Register Rsuper_klass,
Register Rtmp1,
< prev index next >