src/cpu/sparc/vm/assembler_sparc.cpp

changeset 599
c436414a719e
parent 559
b130b98db9cf
child 602
feeb96a45707
     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  

mercurial