summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/utils/gchelper.h2
-rw-r--r--lib/utils/gchelper_generic.c27
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/utils/gchelper.h b/lib/utils/gchelper.h
index 4b6ead6ba..645ee837f 100644
--- a/lib/utils/gchelper.h
+++ b/lib/utils/gchelper.h
@@ -39,6 +39,8 @@ typedef uintptr_t gc_helper_regs_t[6];
typedef uintptr_t gc_helper_regs_t[4];
#elif defined(__thumb2__) || defined(__thumb__) || defined(__arm__)
typedef uintptr_t gc_helper_regs_t[10];
+#elif defined(__aarch64__)
+typedef uintptr_t gc_helper_regs_t[11]; // x19-x29
#endif
#endif
diff --git a/lib/utils/gchelper_generic.c b/lib/utils/gchelper_generic.c
index 9750e8b0c..3e7e33ab1 100644
--- a/lib/utils/gchelper_generic.c
+++ b/lib/utils/gchelper_generic.c
@@ -123,6 +123,33 @@ STATIC void gc_helper_get_regs(gc_helper_regs_t arr) {
arr[9] = r13;
}
+#elif defined(__aarch64__)
+
+STATIC void gc_helper_get_regs(gc_helper_regs_t arr) {
+ const register long x19 asm ("x19");
+ const register long x20 asm ("x20");
+ const register long x21 asm ("x21");
+ const register long x22 asm ("x22");
+ const register long x23 asm ("x23");
+ const register long x24 asm ("x24");
+ const register long x25 asm ("x25");
+ const register long x26 asm ("x26");
+ const register long x27 asm ("x27");
+ const register long x28 asm ("x28");
+ const register long x29 asm ("x29");
+ arr[0] = x19;
+ arr[1] = x20;
+ arr[2] = x21;
+ arr[3] = x22;
+ arr[4] = x23;
+ arr[5] = x24;
+ arr[6] = x25;
+ arr[7] = x26;
+ arr[8] = x27;
+ arr[9] = x28;
+ arr[10] = x29;
+}
+
#else
#error "Architecture not supported for gc_helper_get_regs. Set MICROPY_GCREGS_SETJMP to use the fallback implementation."