Mercurial > hg > graal-jvmci-8
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) { |