wingo pushed a commit to branch wip-whippet
in repository guile.

commit e4048b5296b70f2fd161add55298c41911b98d2d
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Fri Jan 10 15:42:25 2025 +0100

    Add offset to field-logging fast path
---
 api/bdw-attrs.h  | 3 +++
 api/gc-api.h     | 5 +++--
 api/gc-attrs.h   | 1 +
 api/mmc-attrs.h  | 4 ++++
 api/pcc-attrs.h  | 3 +++
 api/semi-attrs.h | 3 +++
 6 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/api/bdw-attrs.h b/api/bdw-attrs.h
index 05f7e4cb7..938356a5e 100644
--- a/api/bdw-attrs.h
+++ b/api/bdw-attrs.h
@@ -59,6 +59,9 @@ static inline size_t gc_write_barrier_card_size(void) {
 static inline size_t gc_write_barrier_field_table_alignment(void) {
   GC_CRASH();
 }
+static inline ptrdiff_t gc_write_barrier_field_table_offset(void) {
+  GC_CRASH();
+}
 static inline size_t gc_write_barrier_field_fields_per_byte(void) {
   GC_CRASH();
 }
diff --git a/api/gc-api.h b/api/gc-api.h
index 4b23bb543..ff1a20927 100644
--- a/api/gc-api.h
+++ b/api/gc-api.h
@@ -214,7 +214,7 @@ static inline int gc_object_is_old_generation(struct 
gc_mutator *mut,
     uintptr_t high_addr = gc_small_object_nursery_high_address(heap);
     uintptr_t size = high_addr - low_addr;
     uintptr_t addr = gc_ref_value(obj);
-    return addr - low_addr < size;
+    return addr - low_addr >= size;
   }
   case GC_OLD_GENERATION_CHECK_SLOW:
     return gc_object_is_old_generation_slow(mut, obj);
@@ -252,13 +252,14 @@ static inline int gc_write_barrier_fast(struct gc_mutator 
*mut, struct gc_ref ob
     size_t field_table_alignment = gc_write_barrier_field_table_alignment();
     size_t fields_per_byte = gc_write_barrier_field_fields_per_byte();
     uint8_t first_bit_pattern = gc_write_barrier_field_first_bit_pattern();
+    ssize_t table_offset = gc_write_barrier_field_table_offset();
 
     uintptr_t addr = gc_edge_address(edge);
     uintptr_t base = addr & ~(field_table_alignment - 1);
     uintptr_t field = (addr & (field_table_alignment - 1)) / sizeof(uintptr_t);
     uintptr_t log_byte = field / fields_per_byte;
     uint8_t log_bit = first_bit_pattern << (field % fields_per_byte);
-    uint8_t *byte_loc = (uint8_t*)(base + log_byte);
+    uint8_t *byte_loc = (uint8_t*)(base + table_offset + log_byte);
     uint8_t byte = atomic_load_explicit(byte_loc, memory_order_relaxed);
     return !(byte & log_bit);
   }
diff --git a/api/gc-attrs.h b/api/gc-attrs.h
index 344c24c27..f0a6e94e6 100644
--- a/api/gc-attrs.h
+++ b/api/gc-attrs.h
@@ -49,6 +49,7 @@ static inline enum gc_write_barrier_kind 
gc_write_barrier_kind(size_t obj_size)
 static inline size_t gc_write_barrier_card_table_alignment(void) 
GC_ALWAYS_INLINE;
 static inline size_t gc_write_barrier_card_size(void) GC_ALWAYS_INLINE;
 static inline size_t gc_write_barrier_field_table_alignment(void) 
GC_ALWAYS_INLINE;
+static inline ptrdiff_t gc_write_barrier_field_table_offset(void) 
GC_ALWAYS_INLINE;
 static inline size_t gc_write_barrier_field_fields_per_byte(void) 
GC_ALWAYS_INLINE;
 static inline uint8_t gc_write_barrier_field_first_bit_pattern(void) 
GC_ALWAYS_INLINE;
 
diff --git a/api/mmc-attrs.h b/api/mmc-attrs.h
index 5d4dcb490..65cb434c9 100644
--- a/api/mmc-attrs.h
+++ b/api/mmc-attrs.h
@@ -73,6 +73,10 @@ static inline size_t 
gc_write_barrier_field_table_alignment(void) {
   GC_ASSERT(GC_GENERATIONAL);
   return gc_allocator_alloc_table_alignment();
 }
+static inline ptrdiff_t gc_write_barrier_field_table_offset(void) {
+  GC_ASSERT(GC_GENERATIONAL);
+  return 0;
+}
 static inline size_t gc_write_barrier_field_fields_per_byte(void) {
   GC_ASSERT(GC_GENERATIONAL);
   return 2;
diff --git a/api/pcc-attrs.h b/api/pcc-attrs.h
index c86d79471..c3c928f54 100644
--- a/api/pcc-attrs.h
+++ b/api/pcc-attrs.h
@@ -62,6 +62,9 @@ static inline size_t gc_write_barrier_card_size(void) {
 static inline size_t gc_write_barrier_field_table_alignment(void) {
   GC_CRASH();
 }
+static inline ptrdiff_t gc_write_barrier_field_table_offset(void) {
+  GC_CRASH();
+}
 static inline size_t gc_write_barrier_field_fields_per_byte(void) {
   GC_CRASH();
 }
diff --git a/api/semi-attrs.h b/api/semi-attrs.h
index 997b031ee..69a87560e 100644
--- a/api/semi-attrs.h
+++ b/api/semi-attrs.h
@@ -61,6 +61,9 @@ static inline size_t gc_write_barrier_card_size(void) {
 static inline size_t gc_write_barrier_field_table_alignment(void) {
   GC_CRASH();
 }
+static inline ptrdiff_t gc_write_barrier_field_table_offset(void) {
+  GC_CRASH();
+}
 static inline size_t gc_write_barrier_field_fields_per_byte(void) {
   GC_CRASH();
 }

Reply via email to