src/cpu/x86/vm/macroAssembler_x86.cpp

changeset 6029
209aa13ab8c0
parent 5860
69944b868a32
child 6072
be525e91f65b
     1.1 --- a/src/cpu/x86/vm/macroAssembler_x86.cpp	Fri Oct 25 11:13:11 2013 -0400
     1.2 +++ b/src/cpu/x86/vm/macroAssembler_x86.cpp	Fri Oct 25 15:19:29 2013 -0400
     1.3 @@ -5049,25 +5049,32 @@
     1.4  }
     1.5  
     1.6  void MacroAssembler::encode_klass_not_null(Register r) {
     1.7 -  assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
     1.8 -  // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
     1.9 -  assert(r != r12_heapbase, "Encoding a klass in r12");
    1.10 -  mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
    1.11 -  subq(r, r12_heapbase);
    1.12 +  if (Universe::narrow_klass_base() != NULL) {
    1.13 +    // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
    1.14 +    assert(r != r12_heapbase, "Encoding a klass in r12");
    1.15 +    mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
    1.16 +    subq(r, r12_heapbase);
    1.17 +  }
    1.18    if (Universe::narrow_klass_shift() != 0) {
    1.19      assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
    1.20      shrq(r, LogKlassAlignmentInBytes);
    1.21    }
    1.22 -  reinit_heapbase();
    1.23 +  if (Universe::narrow_klass_base() != NULL) {
    1.24 +    reinit_heapbase();
    1.25 +  }
    1.26  }
    1.27  
    1.28  void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
    1.29    if (dst == src) {
    1.30      encode_klass_not_null(src);
    1.31    } else {
    1.32 -    mov64(dst, (int64_t)Universe::narrow_klass_base());
    1.33 -    negq(dst);
    1.34 -    addq(dst, src);
    1.35 +    if (Universe::narrow_klass_base() != NULL) {
    1.36 +      mov64(dst, (int64_t)Universe::narrow_klass_base());
    1.37 +      negq(dst);
    1.38 +      addq(dst, src);
    1.39 +    } else {
    1.40 +      movptr(dst, src);
    1.41 +    }
    1.42      if (Universe::narrow_klass_shift() != 0) {
    1.43        assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
    1.44        shrq(dst, LogKlassAlignmentInBytes);
    1.45 @@ -5081,15 +5088,19 @@
    1.46  // generate change, then this method needs to be updated.
    1.47  int MacroAssembler::instr_size_for_decode_klass_not_null() {
    1.48    assert (UseCompressedClassPointers, "only for compressed klass ptrs");
    1.49 -  // mov64 + addq + shlq? + mov64  (for reinit_heapbase()).
    1.50 -  return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
    1.51 +  if (Universe::narrow_klass_base() != NULL) {
    1.52 +    // mov64 + addq + shlq? + mov64  (for reinit_heapbase()).
    1.53 +    return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
    1.54 +  } else {
    1.55 +    // longest load decode klass function, mov64, leaq
    1.56 +    return 16;
    1.57 +  }
    1.58  }
    1.59  
    1.60  // !!! If the instructions that get generated here change then function
    1.61  // instr_size_for_decode_klass_not_null() needs to get updated.
    1.62  void  MacroAssembler::decode_klass_not_null(Register r) {
    1.63    // Note: it will change flags
    1.64 -  assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
    1.65    assert (UseCompressedClassPointers, "should only be used for compressed headers");
    1.66    assert(r != r12_heapbase, "Decoding a klass in r12");
    1.67    // Cannot assert, unverified entry point counts instructions (see .ad file)
    1.68 @@ -5100,14 +5111,15 @@
    1.69      shlq(r, LogKlassAlignmentInBytes);
    1.70    }
    1.71    // Use r12 as a scratch register in which to temporarily load the narrow_klass_base.
    1.72 -  mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
    1.73 -  addq(r, r12_heapbase);
    1.74 -  reinit_heapbase();
    1.75 +  if (Universe::narrow_klass_base() != NULL) {
    1.76 +    mov64(r12_heapbase, (int64_t)Universe::narrow_klass_base());
    1.77 +    addq(r, r12_heapbase);
    1.78 +    reinit_heapbase();
    1.79 +  }
    1.80  }
    1.81  
    1.82  void  MacroAssembler::decode_klass_not_null(Register dst, Register src) {
    1.83    // Note: it will change flags
    1.84 -  assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
    1.85    assert (UseCompressedClassPointers, "should only be used for compressed headers");
    1.86    if (dst == src) {
    1.87      decode_klass_not_null(dst);
    1.88 @@ -5115,7 +5127,6 @@
    1.89      // Cannot assert, unverified entry point counts instructions (see .ad file)
    1.90      // vtableStubs also counts instructions in pd_code_size_limit.
    1.91      // Also do not verify_oop as this is called by verify_oop.
    1.92 -
    1.93      mov64(dst, (int64_t)Universe::narrow_klass_base());
    1.94      if (Universe::narrow_klass_shift() != 0) {
    1.95        assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");

mercurial