shithub: femtolisp

Download patch

ref: 305ad9c2c8c62668bd3df2133494801b99b99a67
parent: 3d4b32c3af3e12ce408536464a1afa67748f9eac
author: Sigrid Solveig Haflínudóttir <[email protected]>
date: Thu Apr 13 12:53:30 EDT 2023

use manual byte swapping on SPARC to avoid unaligned access

--- a/flisp.c
+++ b/flisp.c
@@ -1816,8 +1816,22 @@
 #if BYTE_ORDER == BIG_ENDIAN
 #undef SWAP_INT32
 #undef SWAP_INT16
+#if defined(__sparc__)
+#define SWAP_INT32(a) \
+	do{ \
+		uint8_t *x = (void*)a, y; \
+		y = x[0]; x[0] = x[3]; x[3] = y; \
+		y = x[1]; x[1] = x[2]; x[2] = y; \
+	}while(0)
+#define SWAP_INT16(a) \
+	do{ \
+		uint8_t *x = (void*)a, y; \
+		y = x[0]; x[0] = x[1]; x[1] = y; \
+	}while(0)
+#else
 #define SWAP_INT32(a) (*(int32_t*)(a) = bswap_32(*(int32_t*)(a)))
 #define SWAP_INT16(a) (*(int16_t*)(a) = bswap_16(*(int16_t*)(a)))
+#endif
 #define compute_maxstack compute_maxstack_swap
 #include "maxstack.inc"
 #undef compute_maxstack