comparison src/share/vm/oops/oop.inline.hpp @ 845:df6caf649ff7

6700789: G1: Enable use of compressed oops with G1 heaps Summary: Modifications to G1 so as to allow the use of compressed oops. Reviewed-by: apetrusenko, coleenp, jmasa, kvn, never, phh, tonyp
author ysr
date Tue, 14 Jul 2009 15:40:39 -0700
parents e5b0439ef4ae
children c18cbe5936b8 2d127394260e
comparison
equal deleted inserted replaced
839:bb18957ad21e 845:df6caf649ff7
146 // offset from the heap base. Saving the check for null can save instructions 146 // offset from the heap base. Saving the check for null can save instructions
147 // in inner GC loops so these are separated. 147 // in inner GC loops so these are separated.
148 148
149 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) { 149 inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
150 assert(!is_null(v), "oop value can never be zero"); 150 assert(!is_null(v), "oop value can never be zero");
151 assert(Universe::heap()->is_in_reserved(v), "Address not in heap");
151 address base = Universe::narrow_oop_base(); 152 address base = Universe::narrow_oop_base();
152 int shift = Universe::narrow_oop_shift(); 153 int shift = Universe::narrow_oop_shift();
153 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1)); 154 uint64_t pd = (uint64_t)(pointer_delta((void*)v, (void*)base, 1));
154 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding"); 155 assert(OopEncodingHeapMax > pd, "change encoding max if new encoding");
155 uint64_t result = pd >> shift; 156 uint64_t result = pd >> shift;
156 assert((result & CONST64(0xffffffff00000000)) == 0, "narrow oop overflow"); 157 assert((result & CONST64(0xffffffff00000000)) == 0, "narrow oop overflow");
158 assert(decode_heap_oop(result) == v, "reversibility");
157 return (narrowOop)result; 159 return (narrowOop)result;
158 } 160 }
159 161
160 inline narrowOop oopDesc::encode_heap_oop(oop v) { 162 inline narrowOop oopDesc::encode_heap_oop(oop v) {
161 return (is_null(v)) ? (narrowOop)0 : encode_heap_oop_not_null(v); 163 return (is_null(v)) ? (narrowOop)0 : encode_heap_oop_not_null(v);
447 inline void update_barrier_set(void* p, oop v) { 449 inline void update_barrier_set(void* p, oop v) {
448 assert(oopDesc::bs() != NULL, "Uninitialized bs in oop!"); 450 assert(oopDesc::bs() != NULL, "Uninitialized bs in oop!");
449 oopDesc::bs()->write_ref_field(p, v); 451 oopDesc::bs()->write_ref_field(p, v);
450 } 452 }
451 453
452 inline void update_barrier_set_pre(void* p, oop v) { 454 template <class T> inline void update_barrier_set_pre(T* p, oop v) {
453 oopDesc::bs()->write_ref_field_pre(p, v); 455 oopDesc::bs()->write_ref_field_pre(p, v);
454 } 456 }
455 457
456 template <class T> inline void oop_store(T* p, oop v) { 458 template <class T> inline void oop_store(T* p, oop v) {
457 if (always_do_update_barrier) { 459 if (always_do_update_barrier) {
458 oop_store((volatile T*)p, v); 460 oop_store((volatile T*)p, v);
459 } else { 461 } else {
460 update_barrier_set_pre(p, v); 462 update_barrier_set_pre(p, v);
461 oopDesc::encode_store_heap_oop(p, v); 463 oopDesc::encode_store_heap_oop(p, v);
462 update_barrier_set(p, v); 464 update_barrier_set((void*)p, v); // cast away type
463 } 465 }
464 } 466 }
465 467
466 template <class T> inline void oop_store(volatile T* p, oop v) { 468 template <class T> inline void oop_store(volatile T* p, oop v) {
467 update_barrier_set_pre((void*)p, v); 469 update_barrier_set_pre((T*)p, v); // cast away volatile
468 // Used by release_obj_field_put, so use release_store_ptr. 470 // Used by release_obj_field_put, so use release_store_ptr.
469 oopDesc::release_encode_store_heap_oop(p, v); 471 oopDesc::release_encode_store_heap_oop(p, v);
470 update_barrier_set((void*)p, v); 472 update_barrier_set((void*)p, v); // cast away type
471 } 473 }
472 474
473 template <class T> inline void oop_store_without_check(T* p, oop v) { 475 template <class T> inline void oop_store_without_check(T* p, oop v) {
474 // XXX YSR FIX ME!!! 476 // XXX YSR FIX ME!!!
475 if (always_do_update_barrier) { 477 if (always_do_update_barrier) {