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