diff options
Diffstat (limited to 'mark.c')
-rw-r--r-- | mark.c | 26 |
1 files changed, 12 insertions, 14 deletions
@@ -712,11 +712,11 @@ GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack, # endif /* ENABLE_TRACE */ descr &= ~GC_DS_TAGS; credit -= WORDS_TO_BYTES(WORDSZ/2); /* guess */ - while (descr != 0) { - if ((descr & SIGNB) != 0) { - current = *(word *)current_p; - FIXUP_POINTER(current); - if (current >= (word)least_ha && current < (word)greatest_ha) { + for (; descr != 0; descr <<= 1, current_p += sizeof(word)) { + if ((descr & SIGNB) == 0) continue; + LOAD_WORD_OR_CONTINUE(current, current_p); + FIXUP_POINTER(current); + if (current >= (word)least_ha && current < (word)greatest_ha) { PREFETCH((ptr_t)current); # ifdef ENABLE_TRACE if (GC_trace_addr == current_p) { @@ -727,10 +727,7 @@ GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack, # endif /* ENABLE_TRACE */ PUSH_CONTENTS((ptr_t)current, mark_stack_top, mark_stack_limit, current_p); - } } - descr <<= 1; - current_p += sizeof(word); } continue; case GC_DS_PROC: @@ -803,7 +800,8 @@ GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack, { # define PREF_DIST 4 -# ifndef SMALL_CONFIG +# if !defined(SMALL_CONFIG) && !defined(E2K) + /* TODO: enable prefetching for E2K? */ word deferred; /* Try to prefetch the next pointer to be examined ASAP. */ @@ -836,11 +834,11 @@ GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack, } # endif - while ((word)current_p <= (word)limit) { + for (; (word)current_p <= (word)limit; current_p += ALIGNMENT) { /* Empirically, unrolling this loop doesn't help a lot. */ /* Since PUSH_CONTENTS expands to a lot of code, */ /* we don't. */ - current = *(word *)current_p; + LOAD_WORD_OR_CONTINUE(current, current_p); FIXUP_POINTER(current); PREFETCH(current_p + PREF_DIST*CACHE_LINE_SIZE); if (current >= (word)least_ha && current < (word)greatest_ha) { @@ -857,10 +855,9 @@ GC_INNER mse * GC_mark_from(mse *mark_stack_top, mse *mark_stack, PUSH_CONTENTS((ptr_t)current, mark_stack_top, mark_stack_limit, current_p); } - current_p += ALIGNMENT; } -# ifndef SMALL_CONFIG +# if !defined(SMALL_CONFIG) && !defined(E2K) /* We still need to mark the entry we previously prefetched. */ /* We already know that it passes the preliminary pointer */ /* validity test. */ @@ -1582,8 +1579,9 @@ GC_API void GC_CALL GC_push_all_eager(void *bottom, void *top) lim = (word *)(((word)top) & ~(ALIGNMENT-1)) - 1; for (current_p = (ptr_t)(((word)bottom + ALIGNMENT-1) & ~(ALIGNMENT-1)); (word)current_p <= (word)lim; current_p += ALIGNMENT) { - REGISTER word q = *(word *)current_p; + REGISTER word q; + LOAD_WORD_OR_CONTINUE(q, current_p); GC_PUSH_ONE_STACK(q, current_p); } # undef GC_greatest_plausible_heap_addr |