summaryrefslogtreecommitdiff
path: root/src/lj_ccall.c
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-16 23:28:51 +0200
committerMike Pall <mike>2011-04-16 23:28:51 +0200
commitd636a3decdf8dc503e707fad8b0e2745c0cabd21 (patch)
treed23c1122b288819eca73d2b54d1008275a7de7d6 /src/lj_ccall.c
parentfc4021427964de06b6ba445172c7345a208a725d (diff)
downloadluajit2-d636a3decdf8dc503e707fad8b0e2745c0cabd21.tar.gz
ARM: Add partial support for FFI.
Diffstat (limited to 'src/lj_ccall.c')
-rw-r--r--src/lj_ccall.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/lj_ccall.c b/src/lj_ccall.c
index 85d8af9c..da7b4738 100644
--- a/src/lj_ccall.c
+++ b/src/lj_ccall.c
@@ -164,6 +164,47 @@
} \
}
+#elif LJ_TARGET_ARM
+/* -- ARM calling conventions --------------------------------------------- */
+
+#define CCALL_HANDLE_STRUCTRET \
+ /* Return structs of size <= 4 in a GPR. */ \
+ cc->retref = !(sz <= 4); \
+ if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;
+
+#define CCALL_HANDLE_COMPLEXRET \
+ cc->retref = 1; /* Return all complex values by reference. */ \
+ cc->gpr[ngpr++] = (GPRArg)dp;
+
+#define CCALL_HANDLE_COMPLEXRET2 \
+ UNUSED(dp); /* Nothing to do. */
+
+#define CCALL_HANDLE_STRUCTARG \
+ /* Pass all structs by value in registers and/or on the stack. */
+
+#define CCALL_HANDLE_COMPLEXARG \
+ /* Pass complex by value in 2 or 4 GPRs. */
+
+/* ARM has a softfp ABI. */
+#define CCALL_HANDLE_REGARG \
+ if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \
+ if (ngpr < maxgpr) \
+ ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
+ else \
+ nsp = (nsp + 1u) & ~1u; /* Align argument on stack. */ \
+ } \
+ if (ngpr < maxgpr) { \
+ dp = &cc->gpr[ngpr]; \
+ if (ngpr + n > maxgpr) { \
+ nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \
+ if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \
+ ngpr = maxgpr; \
+ } else { \
+ ngpr += n; \
+ } \
+ goto done; \
+ }
+
#elif LJ_TARGET_PPCSPE
/* -- PPC/SPE calling conventions ----------------------------------------- */