--- old/src/cpu/sparc/vm/interp_masm_sparc.cpp 2017-04-16 02:30:25.172823701 -0700 +++ new/src/cpu/sparc/vm/interp_masm_sparc.cpp 2017-04-16 02:30:24.980816502 -0700 @@ -755,7 +755,8 @@ 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 @@ -764,6 +765,24 @@ } +// 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::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,