comparison src/share/vm/oops/oop.inline.hpp @ 6848:8e47bac5643a

7054512: Compress class pointers after perm gen removal Summary: support of compress class pointers in the compilers. Reviewed-by: kvn, twisti
author roland
date Tue, 09 Oct 2012 10:11:38 +0200
parents 22b8d3d181d9
children e522a00b91aa 10d5f25a7c67 db9981fd3124
comparison
equal deleted inserted replaced
6847:65d07d9ee446 6848:8e47bac5643a
183 // in inner GC loops so these are separated. 183 // in inner GC loops so these are separated.
184 184
185 inline bool check_obj_alignment(oop obj) { 185 inline bool check_obj_alignment(oop obj) {
186 return (intptr_t)obj % MinObjAlignmentInBytes == 0; 186 return (intptr_t)obj % MinObjAlignmentInBytes == 0;
187 } 187 }
188 inline bool check_obj_alignment(Klass* obj) { 188 inline bool check_klass_alignment(Klass* obj) {
189 return (intptr_t)obj % MinObjAlignmentInBytes == 0; 189 return (intptr_t)obj % KlassAlignmentInBytes == 0;
190 } 190 }
191 191
192 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { 192 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
193 assert(!is_null(v), "oop value can never be zero"); 193 assert(!is_null(v), "oop value can never be zero");
194 assert(check_obj_alignment(v), "Address not aligned"); 194 assert(check_obj_alignment(v), "Address not aligned");
226 // Encoding and decoding for klass field. It is copied code, but someday 226 // Encoding and decoding for klass field. It is copied code, but someday
227 // might not be the same as oop. 227 // might not be the same as oop.
228 228
229 inline narrowOop oopDesc::encode_klass_not_null(Klass* v) { 229 inline narrowOop oopDesc::encode_klass_not_null(Klass* v) {
230 assert(!is_null(v), "oop value can never be zero"); 230 assert(!is_null(v), "oop value can never be zero");
231 assert(check_obj_alignment(v), "Address not aligned"); 231 assert(check_klass_alignment(v), "Address not aligned");
232 address base = Universe::narrow_oop_base(); 232 address base = Universe::narrow_klass_base();
233 int shift = Universe::narrow_oop_shift(); 233 int shift = Universe::narrow_klass_shift();
234 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); 234 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1));
235 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); 235 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding");
236 uint64_t result = pd >> shift; 236 uint64_t result = pd >> shift;
237 assert((result & CONST64(0xffffffff00000000)) == 0, "narrow klass pointer overflow"); 237 assert((result & CONST64(0xffffffff00000000)) == 0, "narrow klass pointer overflow");
238 assert(decode_klass(result) == v, "reversibility"); 238 assert(decode_klass(result) == v, "reversibility");
243 return (is_null(v)) ? (narrowOop)0 : encode_klass_not_null(v); 243 return (is_null(v)) ? (narrowOop)0 : encode_klass_not_null(v);
244 } 244 }
245 245
246 inline Klass* oopDesc::decode_klass_not_null(narrowOop v) { 246 inline Klass* oopDesc::decode_klass_not_null(narrowOop v) {
247 assert(!is_null(v), "narrow oop value can never be zero"); 247 assert(!is_null(v), "narrow oop value can never be zero");
248 address base = Universe::narrow_oop_base(); 248 address base = Universe::narrow_klass_base();
249 int shift = Universe::narrow_oop_shift(); 249 int shift = Universe::narrow_klass_shift();
250 Klass* result = (Klass*)(void*)((uintptr_t)base + ((uintptr_t)v << shift)); 250 Klass* result = (Klass*)(void*)((uintptr_t)base + ((uintptr_t)v << shift));
251 assert(check_obj_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result)); 251 assert(check_klass_alignment(result), err_msg("address not aligned: " PTR_FORMAT, (void*) result));
252 return result; 252 return result;
253 } 253 }
254 254
255 inline Klass* oopDesc::decode_klass(narrowOop v) { 255 inline Klass* oopDesc::decode_klass(narrowOop v) {
256 return is_null(v) ? (Klass*)NULL : decode_klass_not_null(v); 256 return is_null(v) ? (Klass*)NULL : decode_klass_not_null(v);