diff options
| author | John Hawthorn <john@hawthorn.email> | 2026-01-20 10:47:21 -0800 |
|---|---|---|
| committer | John Hawthorn <john@hawthorn.email> | 2026-01-30 19:42:26 -0800 |
| commit | 6327f59307d8cd62438ed1fee80058b8c7cc5fab (patch) | |
| tree | 0644d05ce403c226b6e3fe00ae101a25b892e341 | |
| parent | 737809bf25e1c8babd3c8280a5fac162354f906b (diff) | |
Use bit plane for age bits
Previously we used two adjacent bits in the same word to store the
object's age. This changes that to instead store the age in the same bit
position across two adjacent words. This makes age use the exact same
bit positions as the other bitmaps (just across two words).
| -rw-r--r-- | gc/default/default.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/gc/default/default.c b/gc/default/default.c index a6572b6f4d..60e5d624c9 100644 --- a/gc/default/default.c +++ b/gc/default/default.c @@ -858,15 +858,15 @@ heap_page_in_global_empty_pages_pool(rb_objspace_t *objspace, struct heap_page * #define GET_HEAP_WB_UNPROTECTED_BITS(x) (&GET_HEAP_PAGE(x)->wb_unprotected_bits[0]) #define GET_HEAP_MARKING_BITS(x) (&GET_HEAP_PAGE(x)->marking_bits[0]) - -#define RVALUE_AGE_BITMAP_INDEX(n) (NUM_IN_PAGE(n) / (BITS_BITLENGTH / RVALUE_AGE_BIT_COUNT)) -#define RVALUE_AGE_BITMAP_OFFSET(n) ((NUM_IN_PAGE(n) % (BITS_BITLENGTH / RVALUE_AGE_BIT_COUNT)) * RVALUE_AGE_BIT_COUNT) - static int RVALUE_AGE_GET(VALUE obj) { bits_t *age_bits = GET_HEAP_PAGE(obj)->age_bits; - return (int)(age_bits[RVALUE_AGE_BITMAP_INDEX(obj)] >> RVALUE_AGE_BITMAP_OFFSET(obj)) & RVALUE_AGE_BIT_MASK; + int idx = BITMAP_INDEX(obj) * 2; + int shift = BITMAP_OFFSET(obj); + int lo = (age_bits[idx] >> shift) & 1; + int hi = (age_bits[idx + 1] >> shift) & 1; + return lo | (hi << 1); } static void @@ -874,10 +874,12 @@ RVALUE_AGE_SET_BITMAP(VALUE obj, int age) { RUBY_ASSERT(age <= RVALUE_OLD_AGE); bits_t *age_bits = GET_HEAP_PAGE(obj)->age_bits; - // clear the bits - age_bits[RVALUE_AGE_BITMAP_INDEX(obj)] &= ~(RVALUE_AGE_BIT_MASK << (RVALUE_AGE_BITMAP_OFFSET(obj))); - // shift the correct value in - age_bits[RVALUE_AGE_BITMAP_INDEX(obj)] |= ((bits_t)age << RVALUE_AGE_BITMAP_OFFSET(obj)); + int idx = BITMAP_INDEX(obj) * 2; + int shift = BITMAP_OFFSET(obj); + bits_t mask = (bits_t)1 << shift; + + age_bits[idx] = (age_bits[idx] & ~mask) | ((bits_t)(age & 1) << shift); + age_bits[idx + 1] = (age_bits[idx + 1] & ~mask) | ((bits_t)((age >> 1) & 1) << shift); } static void |
