summaryrefslogtreecommitdiff
path: root/src/lj_ccallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_ccallback.c')
-rw-r--r--src/lj_ccallback.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index a9567bc5..430643ee 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -310,22 +310,53 @@ void lj_ccallback_mcode_free(CTState *cts)
310 310
311#elif LJ_TARGET_ARM 311#elif LJ_TARGET_ARM
312 312
313#if LJ_ABI_SOFTFP
314
315#define CALLBACK_HANDLE_REGARG_FP1 UNUSED(isfp);
316#define CALLBACK_HANDLE_REGARG_FP2
317
318#else
319
320#define CALLBACK_HANDLE_REGARG_FP1 \
321 if (isfp) { \
322 if (n == 1) { \
323 if (fprodd) { \
324 sp = &cts->cb.fpr[fprodd-1]; \
325 fprodd = 0; \
326 goto done; \
327 } else if (nfpr + 1 <= CCALL_NARG_FPR) { \
328 sp = &cts->cb.fpr[nfpr++]; \
329 fprodd = nfpr; \
330 goto done; \
331 } \
332 } else { \
333 if (nfpr + 1 <= CCALL_NARG_FPR) { \
334 sp = &cts->cb.fpr[nfpr++]; \
335 goto done; \
336 } \
337 } \
338 fprodd = 0; /* No reordering after the first FP value is on stack. */ \
339 } else {
340
341#define CALLBACK_HANDLE_REGARG_FP2 }
342
343#endif
344
313#define CALLBACK_HANDLE_REGARG \ 345#define CALLBACK_HANDLE_REGARG \
314 UNUSED(isfp); \ 346 CALLBACK_HANDLE_REGARG_FP1 \
315 if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ 347 if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
316 if (ngpr + n <= maxgpr) { \ 348 if (ngpr + n <= maxgpr) { \
317 sp = &cts->cb.gpr[ngpr]; \ 349 sp = &cts->cb.gpr[ngpr]; \
318 ngpr += n; \ 350 ngpr += n; \
319 goto done; \ 351 goto done; \
320 } 352 } CALLBACK_HANDLE_REGARG_FP2
321 353
322#elif LJ_TARGET_PPC 354#elif LJ_TARGET_PPC
323 355
324#define CALLBACK_HANDLE_REGARG \ 356#define CALLBACK_HANDLE_REGARG \
325 if (isfp) { \ 357 if (isfp) { \
326 if (nfpr + 1 <= CCALL_NARG_FPR) { \ 358 if (nfpr + 1 <= CCALL_NARG_FPR) { \
327 sp = &cts->cb.fpr[nfpr]; \ 359 sp = &cts->cb.fpr[nfpr++]; \
328 nfpr += 1; \
329 cta = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \ 360 cta = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \
330 goto done; \ 361 goto done; \
331 } \ 362 } \
@@ -382,6 +413,9 @@ static void callback_conv_args(CTState *cts, lua_State *L)
382 MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR; 413 MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;
383#if CCALL_NARG_FPR 414#if CCALL_NARG_FPR
384 MSize nfpr = 0; 415 MSize nfpr = 0;
416#if LJ_TARGET_ARM
417 MSize fprodd = 0;
418#endif
385#endif 419#endif
386 420
387 if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) { 421 if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) {