? aa.patch Index: src/common/gc_block.h =================================================================== RCS file: /runtime/gcv5/src/common/gc_block.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- src/common/gc_block.h 31 Dec 2007 16:53:01 -0000 1.31 +++ src/common/gc_block.h 18 Jan 2008 17:03:25 -0000 1.32 @@ -214,6 +214,7 @@ if( obj_is_marked_in_vt(cur_obj)) return cur_obj; cur_obj = obj_end(cur_obj); + PREFETCH( ((POINTER_SIZE_INT) cur_obj) + 64); } return NULL; Index: src/common/gc_common.cpp =================================================================== RCS file: /runtime/gcv5/src/common/gc_common.cpp,v retrieving revision 1.64 retrieving revision 1.65 diff -u -r1.64 -r1.65 --- src/common/gc_common.cpp 12 Jan 2008 20:51:48 -0000 1.64 +++ src/common/gc_common.cpp 18 Jan 2008 17:03:25 -0000 1.65 @@ -328,7 +328,7 @@ #if defined(ALLOC_ZEROING) && defined(ALLOC_PREFETCH) if(is_property_set("gc.prefetch",VM_PROPERTIES) ==1) { - PREFETCH_ENABLED=get_boolean_property("gc.prefetch"); + PREFETCH_ENABLED = get_boolean_property("gc.prefetch"); } if(is_property_set("gc.prefetch_distance",VM_PROPERTIES)==1) { @@ -347,12 +347,15 @@ if(is_property_set("gc.zeroing_size",VM_PROPERTIES)==1) { ZEROING_SIZE = get_size_property("gc.zeroing_size"); - if(!PREFETCH_ENABLED) { - WARN2("gc.zeroing_size","Warning: Zeroing size set with Prefetch disabled!"); - } } #endif +#ifdef PREFETCH_SUPPORTED + if(is_property_set("gc.mark_prefetch",VM_PROPERTIES) ==1) { + mark_prefetch = get_boolean_property("gc.mark_prefetch"); + } +#endif + return; } Index: src/common/gc_platform.h =================================================================== RCS file: /runtime/gcv5/src/common/gc_platform.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- src/common/gc_platform.h 11 Jan 2008 14:44:21 -0000 1.27 +++ src/common/gc_platform.h 18 Jan 2008 17:03:25 -0000 1.28 @@ -53,14 +53,34 @@ #endif //_DEBUG +#ifndef _IPF_ +#define PREFETCH_SUPPORTED +#endif + #ifdef _WINDOWS_ #define FORCE_INLINE __forceinline + +#ifdef PREFETCH_SUPPORTED +#include +#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA ) +#endif /*ALLOC_PREFETCH*/ + #elif defined (__linux__) #define FORCE_INLINE inline __attribute__((always_inline)) + +#ifdef PREFETCH_SUPPORTED +#define prefetchnta(pref_addr) __asm__ ("prefetchnta (%0)"::"r"(pref_addr)) +#endif /*PREFETCH_SUPPORTED*/ #else #define FORCE_INLINE inline #endif /* _WINDOWS_ */ +#ifdef PREFETCH_SUPPORTED +#define PREFETCH prefetchnta +#else +#define PREFETCH(x) +#endif + #define ABS_DIFF(x, y) (((x)>(y))?((x)-(y)):((y)-(x))) #define USEC_PER_SEC INT64_C(1000000) Index: src/thread/gc_thread.h =================================================================== RCS file: /runtime/gcv5/src/thread/gc_thread.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- src/thread/gc_thread.h 3 Jan 2008 07:36:17 -0000 1.22 +++ src/thread/gc_thread.h 18 Jan 2008 17:03:25 -0000 1.23 @@ -33,14 +33,6 @@ #ifdef ALLOC_ZEROING /* ----------------- */ #ifdef ALLOC_PREFETCH /* vvvvvvvvvvvvvvvv */ - -#ifdef _WINDOWS_ -#include -#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA ) -#else /* _WINDOWS_ */ -#define prefetchnta(pref_addr) __asm__ ("prefetchnta (%0)"::"r"(pref_addr)) -#endif /* !_WINDOWS_ */ - extern POINTER_SIZE_INT PREFETCH_DISTANCE; extern POINTER_SIZE_INT ZEROING_SIZE; extern POINTER_SIZE_INT PREFETCH_STRIDE; Index: src/trace_forward/fspace.cpp =================================================================== RCS file: /runtime/gcv5/src/trace_forward/fspace.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- src/trace_forward/fspace.cpp 18 Jan 2008 10:59:09 -0000 1.27 +++ src/trace_forward/fspace.cpp 18 Jan 2008 17:03:25 -0000 1.28 @@ -21,6 +21,10 @@ #include "fspace.h" +#ifdef PREFETCH_SUPPORTED +Boolean mark_prefetch = FALSE; +#endif + Boolean NOS_PARTIAL_FORWARD = FALSE; Boolean forward_first_half; Index: src/trace_forward/fspace.h =================================================================== RCS file: /runtime/gcv5/src/trace_forward/fspace.h,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- src/trace_forward/fspace.h 27 Dec 2007 21:51:40 -0000 1.13 +++ src/trace_forward/fspace.h 18 Jan 2008 17:03:25 -0000 1.14 @@ -29,6 +29,9 @@ * In our Gen GC, not all live objects are copied to tspace space, the newer baby will * still be preserved in fspace, that means to give them time to die. */ +#ifdef PREFETCH_SUPPORTED +extern Boolean mark_prefetch; +#endif extern Boolean forward_first_half; /* boundary splitting fspace into forwarding part and remaining part */ Index: src/trace_forward/fspace_gen_forward_pool.cpp =================================================================== RCS file: /runtime/gcv5/src/trace_forward/fspace_gen_forward_pool.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- src/trace_forward/fspace_gen_forward_pool.cpp 20 Dec 2007 20:41:35 -0000 1.27 +++ src/trace_forward/fspace_gen_forward_pool.cpp 18 Jan 2008 17:03:25 -0000 1.28 @@ -211,6 +211,15 @@ Vector_Block* trace_stack = (Vector_Block*)collector->trace_stack; while( !vector_stack_is_empty(trace_stack)){ p_ref = (REF *)vector_stack_pop(trace_stack); +#ifdef PREFETCH_SUPPORTED + /* DO PREFETCH */ + if(mark_prefetch) { + if(!vector_stack_is_empty(trace_stack)) { + REF *pref = (REF*)vector_stack_read(trace_stack, 0); + PREFETCH( read_slot(pref) ); + } + } +#endif forward_object(collector, p_ref); trace_stack = (Vector_Block*)collector->trace_stack; } @@ -278,6 +287,15 @@ while(!vector_block_iterator_end(trace_task,iter)){ REF *p_ref = (REF *)*iter; iter = vector_block_iterator_advance(trace_task,iter); +#ifdef PREFETCH_SUPPORTED + /* DO PREFETCH */ + if( mark_prefetch ) { + if(!vector_block_iterator_end(trace_task, iter)) { + REF *pref= (REF*) *iter; + PREFETCH( read_slot(pref)); + } + } +#endif assert(*p_ref); /* a task can't be NULL, it was checked before put into the task stack */ /* in sequential version, we only trace same object once, but we were using a local hashset for that, which couldn't catch the repetition between multiple collectors. This is subject to more study. */ Index: src/trace_forward/fspace_nongen_forward_pool.cpp =================================================================== RCS file: /runtime/gcv5/src/trace_forward/fspace_nongen_forward_pool.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- src/trace_forward/fspace_nongen_forward_pool.cpp 25 Dec 2007 14:01:11 -0000 1.27 +++ src/trace_forward/fspace_nongen_forward_pool.cpp 18 Jan 2008 17:03:25 -0000 1.28 @@ -182,6 +182,15 @@ Vector_Block* trace_stack = (Vector_Block*)collector->trace_stack; while( !vector_stack_is_empty(trace_stack)){ p_ref = (REF *)vector_stack_pop(trace_stack); +#ifdef PREFETCH_SUPPORTED + /* DO PREFETCH */ + if(mark_prefetch) { + if(!vector_stack_is_empty(trace_stack)) { + REF *pref = (REF*)vector_stack_read(trace_stack, 0); + PREFETCH( read_slot(pref) ); + } + } +#endif forward_object(collector, p_ref); trace_stack = (Vector_Block*)collector->trace_stack; } @@ -245,6 +254,15 @@ while(!vector_block_iterator_end(trace_task,iter)){ REF *p_ref = (REF *)*iter; iter = vector_block_iterator_advance(trace_task, iter); +#ifdef PREFETCH_SUPPORTED + /* DO PREFETCH */ + if( mark_prefetch ) { + if(!vector_block_iterator_end(trace_task, iter)) { + REF *pref= (REF*) *iter; + PREFETCH( read_slot(pref)); + } + } +#endif trace_object(collector, p_ref); if(collector->result == FALSE) break; /* force return */ Index: src/utils/vector_block.h =================================================================== RCS file: /runtime/gcv5/src/utils/vector_block.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- src/utils/vector_block.h 20 Dec 2007 22:07:06 -0000 1.17 +++ src/utils/vector_block.h 18 Jan 2008 17:03:25 -0000 1.18 @@ -245,6 +245,11 @@ return value; } +inline POINTER_SIZE_INT vector_stack_read(Vector_Block* block, int idx) +{ + return block->head[idx]; +} + inline void vector_block_integrity_check(Vector_Block* block) { POINTER_SIZE_INT* iter = vector_block_iterator_init(block);