diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_ccallback.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index 846827b1..03494a7a 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c | |||
@@ -419,6 +419,23 @@ void lj_ccallback_mcode_free(CTState *cts) | |||
419 | 419 | ||
420 | #elif LJ_TARGET_PPC | 420 | #elif LJ_TARGET_PPC |
421 | 421 | ||
422 | #define CALLBACK_HANDLE_GPR \ | ||
423 | if (n > 1) { \ | ||
424 | lua_assert(((LJ_ABI_SOFTFP && ctype_isnum(cta->info)) || /* double. */ \ | ||
425 | ctype_isinteger(cta->info)) && n == 2); /* int64_t. */ \ | ||
426 | ngpr = (ngpr + 1u) & ~1u; /* Align int64_t to regpair. */ \ | ||
427 | } \ | ||
428 | if (ngpr + n <= maxgpr) { \ | ||
429 | sp = &cts->cb.gpr[ngpr]; \ | ||
430 | ngpr += n; \ | ||
431 | goto done; \ | ||
432 | } | ||
433 | |||
434 | #if LJ_ABI_SOFTFP | ||
435 | #define CALLBACK_HANDLE_REGARG \ | ||
436 | CALLBACK_HANDLE_GPR \ | ||
437 | UNUSED(isfp); | ||
438 | #else | ||
422 | #define CALLBACK_HANDLE_REGARG \ | 439 | #define CALLBACK_HANDLE_REGARG \ |
423 | if (isfp) { \ | 440 | if (isfp) { \ |
424 | if (nfpr + 1 <= CCALL_NARG_FPR) { \ | 441 | if (nfpr + 1 <= CCALL_NARG_FPR) { \ |
@@ -427,20 +444,15 @@ void lj_ccallback_mcode_free(CTState *cts) | |||
427 | goto done; \ | 444 | goto done; \ |
428 | } \ | 445 | } \ |
429 | } else { /* Try to pass argument in GPRs. */ \ | 446 | } else { /* Try to pass argument in GPRs. */ \ |
430 | if (n > 1) { \ | 447 | CALLBACK_HANDLE_GPR \ |
431 | lua_assert(ctype_isinteger(cta->info) && n == 2); /* int64_t. */ \ | ||
432 | ngpr = (ngpr + 1u) & ~1u; /* Align int64_t to regpair. */ \ | ||
433 | } \ | ||
434 | if (ngpr + n <= maxgpr) { \ | ||
435 | sp = &cts->cb.gpr[ngpr]; \ | ||
436 | ngpr += n; \ | ||
437 | goto done; \ | ||
438 | } \ | ||
439 | } | 448 | } |
449 | #endif | ||
440 | 450 | ||
451 | #if !LJ_ABI_SOFTFP | ||
441 | #define CALLBACK_HANDLE_RET \ | 452 | #define CALLBACK_HANDLE_RET \ |
442 | if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ | 453 | if (ctype_isfp(ctr->info) && ctr->size == sizeof(float)) \ |
443 | *(double *)dp = *(float *)dp; /* FPRs always hold doubles. */ | 454 | *(double *)dp = *(float *)dp; /* FPRs always hold doubles. */ |
455 | #endif | ||
444 | 456 | ||
445 | #elif LJ_TARGET_MIPS32 | 457 | #elif LJ_TARGET_MIPS32 |
446 | 458 | ||