src/cpu/sparc/vm/assembler_sparc.cpp

changeset 1077
660978a2a31a
parent 1058
9adddb8c0fc8
child 1079
c517646eef23
     1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp	Wed Mar 11 14:16:13 2009 -0700
     1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp	Thu Mar 12 10:37:46 2009 -0700
     1.3 @@ -4316,7 +4316,13 @@
     1.4  
     1.5  void MacroAssembler::encode_heap_oop(Register src, Register dst) {
     1.6    assert (UseCompressedOops, "must be compressed");
     1.7 +  assert (Universe::heap() != NULL, "java heap should be initialized");
     1.8 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
     1.9    verify_oop(src);
    1.10 +  if (Universe::narrow_oop_base() == NULL) {
    1.11 +    srlx(src, LogMinObjAlignmentInBytes, dst);
    1.12 +    return;
    1.13 +  }
    1.14    Label done;
    1.15    if (src == dst) {
    1.16      // optimize for frequent case src == dst
    1.17 @@ -4338,26 +4344,39 @@
    1.18  
    1.19  void MacroAssembler::encode_heap_oop_not_null(Register r) {
    1.20    assert (UseCompressedOops, "must be compressed");
    1.21 +  assert (Universe::heap() != NULL, "java heap should be initialized");
    1.22 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.23    verify_oop(r);
    1.24 -  sub(r, G6_heapbase, r);
    1.25 +  if (Universe::narrow_oop_base() != NULL)
    1.26 +    sub(r, G6_heapbase, r);
    1.27    srlx(r, LogMinObjAlignmentInBytes, r);
    1.28  }
    1.29  
    1.30  void MacroAssembler::encode_heap_oop_not_null(Register src, Register dst) {
    1.31    assert (UseCompressedOops, "must be compressed");
    1.32 +  assert (Universe::heap() != NULL, "java heap should be initialized");
    1.33 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.34    verify_oop(src);
    1.35 -  sub(src, G6_heapbase, dst);
    1.36 -  srlx(dst, LogMinObjAlignmentInBytes, dst);
    1.37 +  if (Universe::narrow_oop_base() == NULL) {
    1.38 +    srlx(src, LogMinObjAlignmentInBytes, dst);
    1.39 +  } else {
    1.40 +    sub(src, G6_heapbase, dst);
    1.41 +    srlx(dst, LogMinObjAlignmentInBytes, dst);
    1.42 +  }
    1.43  }
    1.44  
    1.45  // Same algorithm as oops.inline.hpp decode_heap_oop.
    1.46  void  MacroAssembler::decode_heap_oop(Register src, Register dst) {
    1.47    assert (UseCompressedOops, "must be compressed");
    1.48 -  Label done;
    1.49 +  assert (Universe::heap() != NULL, "java heap should be initialized");
    1.50 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.51    sllx(src, LogMinObjAlignmentInBytes, dst);
    1.52 -  bpr(rc_nz, true, Assembler::pt, dst, done);
    1.53 -  delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken
    1.54 -  bind(done);
    1.55 +  if (Universe::narrow_oop_base() != NULL) {
    1.56 +    Label done;
    1.57 +    bpr(rc_nz, true, Assembler::pt, dst, done);
    1.58 +    delayed() -> add(dst, G6_heapbase, dst); // annuled if not taken
    1.59 +    bind(done);
    1.60 +  }
    1.61    verify_oop(dst);
    1.62  }
    1.63  
    1.64 @@ -4366,8 +4385,11 @@
    1.65    // pd_code_size_limit.
    1.66    // Also do not verify_oop as this is called by verify_oop.
    1.67    assert (UseCompressedOops, "must be compressed");
    1.68 +  assert (Universe::heap() != NULL, "java heap should be initialized");
    1.69 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.70    sllx(r, LogMinObjAlignmentInBytes, r);
    1.71 -  add(r, G6_heapbase, r);
    1.72 +  if (Universe::narrow_oop_base() != NULL)
    1.73 +    add(r, G6_heapbase, r);
    1.74  }
    1.75  
    1.76  void  MacroAssembler::decode_heap_oop_not_null(Register src, Register dst) {
    1.77 @@ -4375,14 +4397,17 @@
    1.78    // pd_code_size_limit.
    1.79    // Also do not verify_oop as this is called by verify_oop.
    1.80    assert (UseCompressedOops, "must be compressed");
    1.81 +  assert (Universe::heap() != NULL, "java heap should be initialized");
    1.82 +  assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.83    sllx(src, LogMinObjAlignmentInBytes, dst);
    1.84 -  add(dst, G6_heapbase, dst);
    1.85 +  if (Universe::narrow_oop_base() != NULL)
    1.86 +    add(dst, G6_heapbase, dst);
    1.87  }
    1.88  
    1.89  void MacroAssembler::reinit_heapbase() {
    1.90    if (UseCompressedOops) {
    1.91      // call indirectly to solve generation ordering problem
    1.92 -    Address base(G6_heapbase, (address)Universe::heap_base_addr());
    1.93 +    Address base(G6_heapbase, (address)Universe::narrow_oop_base_addr());
    1.94      load_ptr_contents(base, G6_heapbase);
    1.95    }
    1.96  }

mercurial