summaryrefslogtreecommitdiff
path: root/src/ChezScheme/c/fasl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ChezScheme/c/fasl.c')
-rw-r--r--src/ChezScheme/c/fasl.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/ChezScheme/c/fasl.c b/src/ChezScheme/c/fasl.c
index a82e852213..02e162f14e 100644
--- a/src/ChezScheme/c/fasl.c
+++ b/src/ChezScheme/c/fasl.c
@@ -235,6 +235,10 @@ static uptr arm32_get_abs PROTO((void *address));
static void arm32_set_jump PROTO((void *address, uptr item, IBOOL callp));
static uptr arm32_get_jump PROTO((void *address));
#endif /* ARMV6 */
+#ifdef AARCH64
+static void arm64_set_abs PROTO((void *address, uptr item));
+static uptr arm64_get_abs PROTO((void *address));
+#endif /* AARCH64 */
#ifdef PPC32
static void ppc32_set_abs PROTO((void *address, uptr item));
static uptr ppc32_get_abs PROTO((void *address));
@@ -843,7 +847,7 @@ static void faslin(ptr tc, ptr *x, ptr t, ptr *pstrbuf, faslFile f) {
break;
case eq_hashtable_subtype_ephemeron:
default:
- keyval = S_cons_in(space_ephemeron, 0, FIX(0), FIX(0));
+ keyval = S_ephemeron_cons_in(0, FIX(0), FIX(0));
break;
}
faslin(tc, &INITCAR(keyval), t, pstrbuf, f);
@@ -966,7 +970,7 @@ static void faslin(ptr tc, ptr *x, ptr t, ptr *pstrbuf, faslFile f) {
faslin(tc, &INITCDR(*x), t, pstrbuf, f);
return;
case fasl_type_ephemeron:
- *x = S_cons_in(space_ephemeron, 0, FIX(0), FIX(0));
+ *x = S_ephemeron_cons_in(0, FIX(0), FIX(0));
faslin(tc, &INITCAR(*x), t, pstrbuf, f);
faslin(tc, &INITCDR(*x), t, pstrbuf, f);
return;
@@ -1297,6 +1301,13 @@ void S_set_code_obj(who, typ, p, n, x, o) char *who; IFASLCODE typ; iptr n, o; p
arm32_set_jump(address, item, 1);
break;
#endif /* ARMV6 */
+#ifdef AARCH64
+ case reloc_arm64_abs:
+ case reloc_arm64_jump:
+ case reloc_arm64_call:
+ arm64_set_abs(address, item);
+ break;
+#endif /* AARCH64 */
#ifdef PPC32
case reloc_ppc32_abs:
ppc32_set_abs(address, item);
@@ -1375,6 +1386,13 @@ ptr S_get_code_obj(typ, p, n, o) IFASLCODE typ; iptr n, o; ptr p; {
item = arm32_get_jump(address);
break;
#endif /* ARMV6 */
+#ifdef AARCH64
+ case reloc_arm64_abs:
+ case reloc_arm64_jump:
+ case reloc_arm64_call:
+ item = arm64_get_abs(address);
+ break;
+#endif /* AARCH64 */
#ifdef PPC32
case reloc_ppc32_abs:
item = ppc32_get_abs(address);
@@ -1482,6 +1500,28 @@ static uptr arm32_get_jump(void *address) {
}
#endif /* ARMV6 */
+#ifdef AARCH64
+
+/* Address pieces in a movz,movk,movk,movk sequence are at its 5-20 */
+#define ADDRESS_BITS_SHIFT 5
+#define ADDRESS_BITS_MASK ((U32)0x1fffe0)
+
+static void arm64_set_abs(void *address, uptr item) {
+ ((U32 *)address)[0] = ((((U32 *)address)[0] & ~ADDRESS_BITS_MASK) | ((item & 0xFFFF) << ADDRESS_BITS_SHIFT));
+ ((U32 *)address)[1] = ((((U32 *)address)[1] & ~ADDRESS_BITS_MASK) | (((item >> 16) & 0xFFFF) << ADDRESS_BITS_SHIFT));
+ ((U32 *)address)[2] = ((((U32 *)address)[2] & ~ADDRESS_BITS_MASK) | (((item >> 32) & 0xFFFF) << ADDRESS_BITS_SHIFT));
+ ((U32 *)address)[3] = ((((U32 *)address)[3] & ~ADDRESS_BITS_MASK) | (((item >> 48) & 0xFFFF) << ADDRESS_BITS_SHIFT));
+}
+
+static uptr arm64_get_abs(void *address) {
+ return ((uptr)((((U32 *)address)[0] & ADDRESS_BITS_MASK) >> ADDRESS_BITS_SHIFT)
+ | ((uptr)((((U32 *)address)[1] & ADDRESS_BITS_MASK) >> ADDRESS_BITS_SHIFT) << 16)
+ | ((uptr)((((U32 *)address)[2] & ADDRESS_BITS_MASK) >> ADDRESS_BITS_SHIFT) << 32)
+ | ((uptr)((((U32 *)address)[3] & ADDRESS_BITS_MASK) >> ADDRESS_BITS_SHIFT) << 48));
+}
+
+#endif /* AARCH64 */
+
#ifdef PPC32
#define UPDATE_ADDIS(item, instr) (((instr) & ~0xFFFF) | (((item) >> 16) & 0xFFFF))