Mercurial > hg > truffle
diff src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a61af66fc99e |
children | d1605aabd0a1 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp Sun Apr 13 17:43:42 2008 -0400 @@ -33,8 +33,8 @@ class PrefetchQueue : public CHeapObj { private: - oop* _prefetch_queue[PREFETCH_QUEUE_SIZE]; - unsigned int _prefetch_index; + void* _prefetch_queue[PREFETCH_QUEUE_SIZE]; + uint _prefetch_index; public: int length() { return PREFETCH_QUEUE_SIZE; } @@ -46,20 +46,21 @@ _prefetch_index = 0; } - inline oop* push_and_pop(oop* p) { - Prefetch::write((*p)->mark_addr(), 0); + template <class T> inline void* push_and_pop(T* p) { + oop o = oopDesc::load_decode_heap_oop_not_null(p); + Prefetch::write(o->mark_addr(), 0); // This prefetch is intended to make sure the size field of array // oops is in cache. It assumes the the object layout is // mark -> klass -> size, and that mark and klass are heapword // sized. If this should change, this prefetch will need updating! - Prefetch::write((*p)->mark_addr() + (HeapWordSize*2), 0); + Prefetch::write(o->mark_addr() + (HeapWordSize*2), 0); _prefetch_queue[_prefetch_index++] = p; _prefetch_index &= (PREFETCH_QUEUE_SIZE-1); return _prefetch_queue[_prefetch_index]; } // Stores a NULL pointer in the pop'd location. - inline oop* pop() { + inline void* pop() { _prefetch_queue[_prefetch_index++] = NULL; _prefetch_index &= (PREFETCH_QUEUE_SIZE-1); return _prefetch_queue[_prefetch_index];