summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2026-01-20 10:47:21 -0800
committerJohn Hawthorn <john@hawthorn.email>2026-01-30 19:42:26 -0800
commit6327f59307d8cd62438ed1fee80058b8c7cc5fab (patch)
tree0644d05ce403c226b6e3fe00ae101a25b892e341
parent737809bf25e1c8babd3c8280a5fac162354f906b (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.c20
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