ARM: Add hard-float ABI support to the FFI (interpreter).
This commit is contained in:
@@ -310,22 +310,53 @@ void lj_ccallback_mcode_free(CTState *cts)
|
||||
|
||||
#elif LJ_TARGET_ARM
|
||||
|
||||
#if LJ_ABI_SOFTFP
|
||||
|
||||
#define CALLBACK_HANDLE_REGARG_FP1 UNUSED(isfp);
|
||||
#define CALLBACK_HANDLE_REGARG_FP2
|
||||
|
||||
#else
|
||||
|
||||
#define CALLBACK_HANDLE_REGARG_FP1 \
|
||||
if (isfp) { \
|
||||
if (n == 1) { \
|
||||
if (fprodd) { \
|
||||
sp = &cts->cb.fpr[fprodd-1]; \
|
||||
fprodd = 0; \
|
||||
goto done; \
|
||||
} else if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
||||
sp = &cts->cb.fpr[nfpr++]; \
|
||||
fprodd = nfpr; \
|
||||
goto done; \
|
||||
} \
|
||||
} else { \
|
||||
if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
||||
sp = &cts->cb.fpr[nfpr++]; \
|
||||
goto done; \
|
||||
} \
|
||||
} \
|
||||
fprodd = 0; /* No reordering after the first FP value is on stack. */ \
|
||||
} else {
|
||||
|
||||
#define CALLBACK_HANDLE_REGARG_FP2 }
|
||||
|
||||
#endif
|
||||
|
||||
#define CALLBACK_HANDLE_REGARG \
|
||||
UNUSED(isfp); \
|
||||
CALLBACK_HANDLE_REGARG_FP1 \
|
||||
if (n > 1) ngpr = (ngpr + 1u) & ~1u; /* Align to regpair. */ \
|
||||
if (ngpr + n <= maxgpr) { \
|
||||
sp = &cts->cb.gpr[ngpr]; \
|
||||
ngpr += n; \
|
||||
goto done; \
|
||||
}
|
||||
} CALLBACK_HANDLE_REGARG_FP2
|
||||
|
||||
#elif LJ_TARGET_PPC
|
||||
|
||||
#define CALLBACK_HANDLE_REGARG \
|
||||
if (isfp) { \
|
||||
if (nfpr + 1 <= CCALL_NARG_FPR) { \
|
||||
sp = &cts->cb.fpr[nfpr]; \
|
||||
nfpr += 1; \
|
||||
sp = &cts->cb.fpr[nfpr++]; \
|
||||
cta = ctype_get(cts, CTID_DOUBLE); /* FPRs always hold doubles. */ \
|
||||
goto done; \
|
||||
} \
|
||||
@@ -382,6 +413,9 @@ static void callback_conv_args(CTState *cts, lua_State *L)
|
||||
MSize ngpr = 0, nsp = 0, maxgpr = CCALL_NARG_GPR;
|
||||
#if CCALL_NARG_FPR
|
||||
MSize nfpr = 0;
|
||||
#if LJ_TARGET_ARM
|
||||
MSize fprodd = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (slot < cts->cb.sizeid && (id = cts->cb.cbid[slot]) != 0) {
|
||||
|
||||
Reference in New Issue
Block a user