src/cpu/x86/vm/assembler_x86.cpp

changeset 4164
d804e148cff8
parent 4145
bacdc1d5c21c
parent 4159
8e47bac5643a
child 4205
a3ecd773a7b9
     1.1 --- a/src/cpu/x86/vm/assembler_x86.cpp	Tue Oct 09 10:09:34 2012 -0700
     1.2 +++ b/src/cpu/x86/vm/assembler_x86.cpp	Fri Oct 12 09:22:52 2012 -0700
     1.3 @@ -6916,7 +6916,7 @@
     1.4  #ifdef ASSERT
     1.5    // TraceBytecodes does not use r12 but saves it over the call, so don't verify
     1.6    // r12 is the heapbase.
     1.7 -  LP64_ONLY(if (UseCompressedOops && !TraceBytecodes) verify_heapbase("call_VM_base");)
     1.8 +  LP64_ONLY(if ((UseCompressedOops || UseCompressedKlassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");)
     1.9  #endif // ASSERT
    1.10  
    1.11    assert(java_thread != oop_result  , "cannot use the same register for java_thread & oop_result");
    1.12 @@ -10016,7 +10016,7 @@
    1.13  #ifdef _LP64
    1.14    if (UseCompressedKlassPointers) {
    1.15      movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
    1.16 -    decode_heap_oop_not_null(dst);
    1.17 +    decode_klass_not_null(dst);
    1.18    } else
    1.19  #endif
    1.20      movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
    1.21 @@ -10027,15 +10027,10 @@
    1.22    if (UseCompressedKlassPointers) {
    1.23      assert (Universe::heap() != NULL, "java heap should be initialized");
    1.24      movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
    1.25 -    if (Universe::narrow_oop_shift() != 0) {
    1.26 -      assert(LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
    1.27 -      if (LogMinObjAlignmentInBytes == Address::times_8) {
    1.28 -        movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset()));
    1.29 -      } else {
    1.30 -        // OK to use shift since we don't need to preserve flags.
    1.31 -        shlq(dst, LogMinObjAlignmentInBytes);
    1.32 -        movq(dst, Address(r12_heapbase, dst, Address::times_1, Klass::prototype_header_offset()));
    1.33 -      }
    1.34 +    if (Universe::narrow_klass_shift() != 0) {
    1.35 +      assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
    1.36 +      assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
    1.37 +      movq(dst, Address(r12_heapbase, dst, Address::times_8, Klass::prototype_header_offset()));
    1.38      } else {
    1.39        movq(dst, Address(dst, Klass::prototype_header_offset()));
    1.40      }
    1.41 @@ -10050,7 +10045,7 @@
    1.42  void MacroAssembler::store_klass(Register dst, Register src) {
    1.43  #ifdef _LP64
    1.44    if (UseCompressedKlassPointers) {
    1.45 -    encode_heap_oop_not_null(src);
    1.46 +    encode_klass_not_null(src);
    1.47      movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
    1.48    } else
    1.49  #endif
    1.50 @@ -10132,12 +10127,12 @@
    1.51  
    1.52  #ifdef ASSERT
    1.53  void MacroAssembler::verify_heapbase(const char* msg) {
    1.54 -  assert (UseCompressedOops, "should be compressed");
    1.55 +  assert (UseCompressedOops || UseCompressedKlassPointers, "should be compressed");
    1.56    assert (Universe::heap() != NULL, "java heap should be initialized");
    1.57    if (CheckCompressedOops) {
    1.58      Label ok;
    1.59      push(rscratch1); // cmpptr trashes rscratch1
    1.60 -    cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
    1.61 +    cmpptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
    1.62      jcc(Assembler::equal, ok);
    1.63      STOP(msg);
    1.64      bind(ok);
    1.65 @@ -10275,6 +10270,74 @@
    1.66    }
    1.67  }
    1.68  
    1.69 +void MacroAssembler::encode_klass_not_null(Register r) {
    1.70 +  assert(Metaspace::is_initialized(), "metaspace should be initialized");
    1.71 +#ifdef ASSERT
    1.72 +  verify_heapbase("MacroAssembler::encode_klass_not_null: heap base corrupted?");
    1.73 +#endif
    1.74 +  if (Universe::narrow_klass_base() != NULL) {
    1.75 +    subq(r, r12_heapbase);
    1.76 +  }
    1.77 +  if (Universe::narrow_klass_shift() != 0) {
    1.78 +    assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
    1.79 +    shrq(r, LogKlassAlignmentInBytes);
    1.80 +  }
    1.81 +}
    1.82 +
    1.83 +void MacroAssembler::encode_klass_not_null(Register dst, Register src) {
    1.84 +  assert(Metaspace::is_initialized(), "metaspace should be initialized");
    1.85 +#ifdef ASSERT
    1.86 +  verify_heapbase("MacroAssembler::encode_klass_not_null2: heap base corrupted?");
    1.87 +#endif
    1.88 +  if (dst != src) {
    1.89 +    movq(dst, src);
    1.90 +  }
    1.91 +  if (Universe::narrow_klass_base() != NULL) {
    1.92 +    subq(dst, r12_heapbase);
    1.93 +  }
    1.94 +  if (Universe::narrow_klass_shift() != 0) {
    1.95 +    assert (LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
    1.96 +    shrq(dst, LogKlassAlignmentInBytes);
    1.97 +  }
    1.98 +}
    1.99 +
   1.100 +void  MacroAssembler::decode_klass_not_null(Register r) {
   1.101 +  assert(Metaspace::is_initialized(), "metaspace should be initialized");
   1.102 +  // Note: it will change flags
   1.103 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.104 +  // Cannot assert, unverified entry point counts instructions (see .ad file)
   1.105 +  // vtableStubs also counts instructions in pd_code_size_limit.
   1.106 +  // Also do not verify_oop as this is called by verify_oop.
   1.107 +  if (Universe::narrow_klass_shift() != 0) {
   1.108 +    assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
   1.109 +    shlq(r, LogKlassAlignmentInBytes);
   1.110 +    if (Universe::narrow_klass_base() != NULL) {
   1.111 +      addq(r, r12_heapbase);
   1.112 +    }
   1.113 +  } else {
   1.114 +    assert (Universe::narrow_klass_base() == NULL, "sanity");
   1.115 +  }
   1.116 +}
   1.117 +
   1.118 +void  MacroAssembler::decode_klass_not_null(Register dst, Register src) {
   1.119 +  assert(Metaspace::is_initialized(), "metaspace should be initialized");
   1.120 +  // Note: it will change flags
   1.121 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.122 +  // Cannot assert, unverified entry point counts instructions (see .ad file)
   1.123 +  // vtableStubs also counts instructions in pd_code_size_limit.
   1.124 +  // Also do not verify_oop as this is called by verify_oop.
   1.125 +  if (Universe::narrow_klass_shift() != 0) {
   1.126 +    assert(LogKlassAlignmentInBytes == Universe::narrow_klass_shift(), "decode alg wrong");
   1.127 +    assert(LogKlassAlignmentInBytes == Address::times_8, "klass not aligned on 64bits?");
   1.128 +    leaq(dst, Address(r12_heapbase, src, Address::times_8, 0));
   1.129 +  } else {
   1.130 +    assert (Universe::narrow_klass_base() == NULL, "sanity");
   1.131 +    if (dst != src) {
   1.132 +      movq(dst, src);
   1.133 +    }
   1.134 +  }
   1.135 +}
   1.136 +
   1.137  void  MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
   1.138    assert (UseCompressedOops, "should only be used for compressed headers");
   1.139    assert (Universe::heap() != NULL, "java heap should be initialized");
   1.140 @@ -10293,6 +10356,22 @@
   1.141    mov_narrow_oop(dst, oop_index, rspec);
   1.142  }
   1.143  
   1.144 +void  MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
   1.145 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.146 +  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
   1.147 +  int klass_index = oop_recorder()->find_index(k);
   1.148 +  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
   1.149 +  mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
   1.150 +}
   1.151 +
   1.152 +void  MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
   1.153 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.154 +  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
   1.155 +  int klass_index = oop_recorder()->find_index(k);
   1.156 +  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
   1.157 +  mov_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
   1.158 +}
   1.159 +
   1.160  void  MacroAssembler::cmp_narrow_oop(Register dst, jobject obj) {
   1.161    assert (UseCompressedOops, "should only be used for compressed headers");
   1.162    assert (Universe::heap() != NULL, "java heap should be initialized");
   1.163 @@ -10311,9 +10390,25 @@
   1.164    Assembler::cmp_narrow_oop(dst, oop_index, rspec);
   1.165  }
   1.166  
   1.167 +void  MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) {
   1.168 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.169 +  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
   1.170 +  int klass_index = oop_recorder()->find_index(k);
   1.171 +  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
   1.172 +  Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
   1.173 +}
   1.174 +
   1.175 +void  MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
   1.176 +  assert (UseCompressedKlassPointers, "should only be used for compressed headers");
   1.177 +  assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
   1.178 +  int klass_index = oop_recorder()->find_index(k);
   1.179 +  RelocationHolder rspec = metadata_Relocation::spec(klass_index);
   1.180 +  Assembler::cmp_narrow_oop(dst, oopDesc::encode_klass(k), rspec);
   1.181 +}
   1.182 +
   1.183  void MacroAssembler::reinit_heapbase() {
   1.184 -  if (UseCompressedOops) {
   1.185 -    movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_oop_base_addr()));
   1.186 +  if (UseCompressedOops || UseCompressedKlassPointers) {
   1.187 +    movptr(r12_heapbase, ExternalAddress((address)Universe::narrow_ptrs_base_addr()));
   1.188    }
   1.189  }
   1.190  #endif // _LP64

mercurial