summaryrefslogtreecommitdiff
path: root/src/lj_ccall.c
diff options
context:
space:
mode:
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 @@
164 } \ 164 } \
165 } 165 }
166 166
167#elif LJ_TARGET_ARM
168/* -- ARM calling conventions --------------------------------------------- */
169
170#define CCALL_HANDLE_STRUCTRET \
171 /* Return structs of size <= 4 in a GPR. */ \
172 cc->retref = !(sz <= 4); \
173 if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;
174
175#define CCALL_HANDLE_COMPLEXRET \
176 cc->retref = 1; /* Return all complex values by reference. */ \
177 cc->gpr[ngpr++] = (GPRArg)dp;
178
179#define CCALL_HANDLE_COMPLEXRET2 \
180 UNUSED(dp); /* Nothing to do. */
181
182#define CCALL_HANDLE_STRUCTARG \
183 /* Pass all structs by value in registers and/or on the stack. */
184
185#define CCALL_HANDLE_COMPLEXARG \
186 /* Pass complex by value in 2 or 4 GPRs. */
187
188/* ARM has a softfp ABI. */
189#define CCALL_HANDLE_REGARG \
190 if ((d->info & CTF_ALIGN) > CTALIGN_PTR) { \
191 if (ngpr < maxgpr) \
192 ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
193 else \
194 nsp = (nsp + 1u) & ~1u; /* Align argument on stack. */ \
195 } \
196 if (ngpr < maxgpr) { \
197 dp = &cc->gpr[ngpr]; \
198 if (ngpr + n > maxgpr) { \
199 nsp += ngpr + n - maxgpr; /* Assumes contiguous gpr/stack fields. */ \
200 if (nsp > CCALL_MAXSTACK) goto err_nyi; /* Too many arguments. */ \
201 ngpr = maxgpr; \
202 } else { \
203 ngpr += n; \
204 } \
205 goto done; \
206 }
207
167#elif LJ_TARGET_PPCSPE 208#elif LJ_TARGET_PPCSPE
168/* -- PPC/SPE calling conventions ----------------------------------------- */ 209/* -- PPC/SPE calling conventions ----------------------------------------- */
169 210