1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp Wed May 21 10:45:07 2008 -0700 1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp Wed May 21 13:46:23 2008 -0700 1.3 @@ -1523,6 +1523,21 @@ 1.4 return Address(d, address(obj), oop_Relocation::spec(oop_index)); 1.5 } 1.6 1.7 +void MacroAssembler::set_narrow_oop(jobject obj, Register d) { 1.8 + assert(oop_recorder() != NULL, "this assembler needs an OopRecorder"); 1.9 + int oop_index = oop_recorder()->find_index(obj); 1.10 + RelocationHolder rspec = oop_Relocation::spec(oop_index); 1.11 + 1.12 + assert_not_delayed(); 1.13 + // Relocation with special format (see relocInfo_sparc.hpp). 1.14 + relocate(rspec, 1); 1.15 + // Assembler::sethi(0x3fffff, d); 1.16 + emit_long( op(branch_op) | rd(d) | op2(sethi_op2) | hi22(0x3fffff) ); 1.17 + // Don't add relocation for 'add'. Do patching during 'sethi' processing. 1.18 + add(d, 0x3ff, d); 1.19 + 1.20 +} 1.21 + 1.22 1.23 void MacroAssembler::align(int modulus) { 1.24 while (offset() % modulus != 0) nop(); 1.25 @@ -3537,28 +3552,26 @@ 1.26 } 1.27 } 1.28 1.29 -void MacroAssembler::load_klass(Register s, Register d) { 1.30 +void MacroAssembler::load_klass(Register src_oop, Register klass) { 1.31 // The number of bytes in this code is used by 1.32 // MachCallDynamicJavaNode::ret_addr_offset() 1.33 // if this changes, change that. 1.34 if (UseCompressedOops) { 1.35 - lduw(s, oopDesc::klass_offset_in_bytes(), d); 1.36 - decode_heap_oop_not_null(d); 1.37 + lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass); 1.38 + decode_heap_oop_not_null(klass); 1.39 } else { 1.40 - ld_ptr(s, oopDesc::klass_offset_in_bytes(), d); 1.41 + ld_ptr(src_oop, oopDesc::klass_offset_in_bytes(), klass); 1.42 } 1.43 } 1.44 1.45 -// ??? figure out src vs. dst! 1.46 -void MacroAssembler::store_klass(Register d, Register s1) { 1.47 +void MacroAssembler::store_klass(Register klass, Register dst_oop) { 1.48 if (UseCompressedOops) { 1.49 - assert(s1 != d, "not enough registers"); 1.50 - encode_heap_oop_not_null(d); 1.51 - // Zero out entire klass field first. 1.52 - st_ptr(G0, s1, oopDesc::klass_offset_in_bytes()); 1.53 - st(d, s1, oopDesc::klass_offset_in_bytes()); 1.54 + assert(dst_oop != klass, "not enough registers"); 1.55 + encode_heap_oop_not_null(klass); 1.56 + sllx(klass, BitsPerInt, klass); 1.57 + stx(klass, dst_oop, oopDesc::klass_offset_in_bytes()); 1.58 } else { 1.59 - st_ptr(d, s1, oopDesc::klass_offset_in_bytes()); 1.60 + st_ptr(klass, dst_oop, oopDesc::klass_offset_in_bytes()); 1.61 } 1.62 } 1.63