From 5578146600d4ace17878e3b010aa09efdb202fb4 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 1 Aug 2010 22:01:50 -0300 Subject: [PATCH] Skip non-scanneable words in chunks --- rt/gc/cdgc/gc.d | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/rt/gc/cdgc/gc.d b/rt/gc/cdgc/gc.d index f2d2f6e..c008177 100644 --- a/rt/gc/cdgc/gc.d +++ b/rt/gc/cdgc/gc.d @@ -615,12 +615,25 @@ void mark(void *pbot, void *ptop, size_t* pm_bitmask) size_t type_size = pm_bitmask[0]; size_t* pm_bits = pm_bitmask + 1; + bool has_type_info = type_size != 1 || pm_bits[0] != 1 || pm_bits[1] != 0; //printf("marking range: %p -> %p\n", pbot, ptop); for (; p1 + type_size <= p2; p1 += type_size) { - for (size_t n = 0; n < type_size; n++) { + size_t n = 0; + if (has_type_info) { + while (n < type_size && pm_bits[n / BITS_PER_WORD] == 0) + n += BITS_PER_WORD; + if (n < type_size && (pm_bits[n / BITS_PER_WORD] & + ((1 << (BITS_PER_WORD / 2)) - 1)) == 0) + n += BITS_PER_WORD / 2; + else if (n < type_size && (pm_bits[n / BITS_PER_WORD] & + ((1 << (BITS_PER_WORD / 4)) - 1)) == 0) + n += BITS_PER_WORD / 4; + } + for (; n < type_size; n++) { // scan bit set for this word - if (!(pm_bits[n / BITS_PER_WORD] & (1 << (n % BITS_PER_WORD)))) + if (has_type_info && + !(pm_bits[n / BITS_PER_WORD] & (1 << (n % BITS_PER_WORD)))) continue; void* p = *(p1 + n); -- 2.43.0