Fix ffi calls with complex parameters.

This commit is contained in:
Michael Munday 2017-01-10 17:09:59 -05:00
parent db99c31890
commit f660d36138

View File

@ -563,11 +563,12 @@
cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \ cc->retref = !(sz == 1 || sz == 2 || sz == 4 || sz == 8); \
if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp; if (cc->retref) cc->gpr[ngpr++] = (GPRArg)dp;
#define CCALL_HANDLE_COMPLEXRET CCALL_HANDLE_STRUCTRET #define CCALL_HANDLE_COMPLEXRET \
cc->retref = 1; /* Return all complex values by reference. */ \
cc->gpr[ngpr++] = (GPRArg)dp;
#define CCALL_HANDLE_COMPLEXRET2 \ #define CCALL_HANDLE_COMPLEXRET2 \
if (!cc->retref) \ UNUSED(dp); /* Nothing to do. */
*(int64_t *)dp = *(int64_t *)sp; /* Copy complex float from GPRs. */
#define CCALL_HANDLE_STRUCTARG \ #define CCALL_HANDLE_STRUCTARG \
/* Pass structs of size 1, 2, 4 or 8 in a GPR by value. */ \ /* Pass structs of size 1, 2, 4 or 8 in a GPR by value. */ \
@ -577,11 +578,9 @@
} }
#define CCALL_HANDLE_COMPLEXARG \ #define CCALL_HANDLE_COMPLEXARG \
/* Pass complex float in a GPR and complex double by reference. */ \ /* Pass complex numbers by reference. */ \
if (sz != 2*sizeof(float)) { \
rp = cdataptr(lj_cdata_new(cts, did, sz)); \ rp = cdataptr(lj_cdata_new(cts, did, sz)); \
sz = CTSIZE_PTR; \ sz = CTSIZE_PTR; \
}
#define CCALL_HANDLE_REGARG \ #define CCALL_HANDLE_REGARG \
if (isfp) { \ if (isfp) { \