diff options
author | Mike Pall <mike> | 2015-12-18 21:38:03 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2015-12-18 21:38:03 +0100 |
commit | 0345f361531c756367257eb2f147c707e1710218 (patch) | |
tree | 65dfb35f899caab0dc1f21eed8a0988e1ff2dcab /src/lj_ccallback.c | |
parent | 3f5c72421e282a2a4d8614064f13097678b80be1 (diff) | |
download | luajit-0345f361531c756367257eb2f147c707e1710218.tar.gz luajit-0345f361531c756367257eb2f147c707e1710218.tar.bz2 luajit-0345f361531c756367257eb2f147c707e1710218.zip |
MIPS soft-float, part 2: Add soft-float FFI support.
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)) \ |