shithub: sl

Download patch

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
--