ref: e945ea00f4c0374dc61918499d8e997927b7dbcc
parent: 327ed4da378d55750598882e3273ae6e73a0a6bd
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Feb 11 01:06:35 EST 2025
defined FWD_BIT for forwarding during GC Don't interfere with potentially already tagged pointers. At least on supported hardware with arm64 cpu, the top byte may be used for that - use 55th bit instead.
--- a/src/flisp.h
+++ b/src/flisp.h
@@ -41,7 +41,7 @@
typedef uintptr_t value_t;
-#ifdef BITS64
+#if defined(BITS64)
typedef int64_t fixnum_t;
#define FIXNUM_BITS 62
#define TOP_BIT (1ULL<<63)
@@ -55,6 +55,10 @@
#define PRIdFIXNUM PRId32
#endif
+#if !defined(FWD_BIT)
+#define FWD_BIT TOP_BIT
+#endif
+
typedef struct {
value_t car;
value_t cdr;
@@ -119,11 +123,11 @@
#define mark_cons(c) bitvector_set(FL(consflags), cons_index(c))
#define unmark_cons(c) bitvector_reset(FL(consflags), cons_index(c))
-#define isforwarded(v) (*(value_t*)ptr(v) & TOP_BIT)
-#define forwardloc(v) (*(value_t*)ptr(v) ^ TOP_BIT)
+#define isforwarded(v) (*(value_t*)ptr(v) & FWD_BIT)
+#define forwardloc(v) (*(value_t*)ptr(v) ^ FWD_BIT)
#define forward(v, to) \
do{ \
- *(value_t*)ptr(v) = (value_t)(to) | TOP_BIT; \
+ *(value_t*)ptr(v) = (value_t)(to) | FWD_BIT; \
}while(0)
#define vector_size(v) (((size_t*)ptr(v))[0]>>2)
--- a/src/posix/platform.h
+++ b/src/posix/platform.h
@@ -52,10 +52,13 @@
extern char *os_version;
#define __os_version__ os_version
-#ifndef __SIZEOF_POINTER__
+#if !defined(__SIZEOF_POINTER__)
#error pointer size unknown
#elif __SIZEOF_POINTER__ == 8
#define BITS64
+#if defined(__aarch64__)
+#define FWD_BIT (1ULL<<55)
+#endif
#endif
#define nil NULL
--
⑨