diff options
Diffstat (limited to 'src/lj_ccallback.c')
-rw-r--r-- | src/lj_ccallback.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index 065c329f..539c9e3d 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c | |||
@@ -427,6 +427,15 @@ void lj_ccallback_mcode_free(CTState *cts) | |||
427 | 427 | ||
428 | #elif LJ_TARGET_MIPS | 428 | #elif LJ_TARGET_MIPS |
429 | 429 | ||
430 | #define CALLBACK_HANDLE_GPR \ | ||
431 | if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ | ||
432 | if (ngpr + n <= maxgpr) { \ | ||
433 | sp = &cts->cb.gpr[ngpr]; \ | ||
434 | ngpr += n; \ | ||
435 | goto done; \ | ||
436 | } | ||
437 | |||
438 | #if !LJ_ABI_SOFTFP /* MIPS32 hard-float */ | ||
430 | #define CALLBACK_HANDLE_REGARG \ | 439 | #define CALLBACK_HANDLE_REGARG \ |
431 | if (isfp && nfpr < CCALL_NARG_FPR) { /* Try to pass argument in FPRs. */ \ | 440 | if (isfp && nfpr < CCALL_NARG_FPR) { /* Try to pass argument in FPRs. */ \ |
432 | sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \ | 441 | sp = (void *)((uint8_t *)&cts->cb.fpr[nfpr] + ((LJ_BE && n==1) ? 4 : 0)); \ |
@@ -434,13 +443,13 @@ void lj_ccallback_mcode_free(CTState *cts) | |||
434 | goto done; \ | 443 | goto done; \ |
435 | } else { /* Try to pass argument in GPRs. */ \ | 444 | } else { /* Try to pass argument in GPRs. */ \ |
436 | nfpr = CCALL_NARG_FPR; \ | 445 | nfpr = CCALL_NARG_FPR; \ |
437 | if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \ | 446 | CALLBACK_HANDLE_GPR \ |
438 | if (ngpr + n <= maxgpr) { \ | ||
439 | sp = &cts->cb.gpr[ngpr]; \ | ||
440 | ngpr += n; \ | ||
441 | goto done; \ | ||
442 | } \ | ||
443 | } | 447 | } |
448 | #else /* MIPS32 soft-float */ | ||
449 | #define CALLBACK_HANDLE_REGARG \ | ||
450 | CALLBACK_HANDLE_GPR \ | ||
451 | UNUSED(isfp); | ||
452 | #endif | ||
444 | 453 | ||
445 | #define CALLBACK_HANDLE_RET \ | 454 | #define CALLBACK_HANDLE_RET \ |
446 | if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ | 455 | if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ |