diff options
Diffstat (limited to 'src/lj_ccallback.c')
-rw-r--r-- | src/lj_ccallback.c | 42 |
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) { |