summaryrefslogtreecommitdiff
path: root/src/lj_ccall.h
diff options
context:
space:
mode:
authorMike Pall <mike>2012-07-30 19:00:52 +0200
committerMike Pall <mike>2012-07-30 19:00:52 +0200
commit4b0af611d05fc15ccc57a050dead055546a3f485 (patch)
tree87af0ad7b6e78ecebb731c6df1e40f5a83f38c76 /src/lj_ccall.h
parenta373fddbd3b129f3f95474533e74f0a52744ff8c (diff)
downloadluajit2-4b0af611d05fc15ccc57a050dead055546a3f485.tar.gz
ARM: Add hard-float ABI support to the FFI (interpreter).
Diffstat (limited to 'src/lj_ccall.h')
-rw-r--r--src/lj_ccall.h15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/lj_ccall.h b/src/lj_ccall.h
index 5985c4a9..62f963e1 100644
--- a/src/lj_ccall.h
+++ b/src/lj_ccall.h
@@ -51,12 +51,21 @@ typedef intptr_t GPRArg;
#elif LJ_TARGET_ARM
#define CCALL_NARG_GPR 4
-#define CCALL_NARG_FPR 0
#define CCALL_NRET_GPR 2 /* For softfp double. */
+#if LJ_ABI_SOFTFP
+#define CCALL_NARG_FPR 0
#define CCALL_NRET_FPR 0
+#else
+#define CCALL_NARG_FPR 8
+#define CCALL_NRET_FPR 4
+#endif
#define CCALL_SPS_FREE 0
typedef intptr_t GPRArg;
+typedef union FPRArg {
+ double d;
+ float f[2];
+} FPRArg;
#elif LJ_TARGET_PPC
@@ -122,7 +131,7 @@ LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR);
/* -- C call state -------------------------------------------------------- */
-typedef struct CCallState {
+typedef LJ_ALIGN(8) struct CCallState {
void (*func)(void); /* Pointer to called function. */
uint32_t spadj; /* Stack pointer adjustment. */
uint8_t nsp; /* Number of stack slots. */
@@ -135,10 +144,10 @@ typedef struct CCallState {
#elif LJ_TARGET_PPC
uint8_t nfpr; /* Number of arguments in FPRs. */
#endif
-#if CCALL_NUM_FPR
#if LJ_32
int32_t align1;
#endif
+#if CCALL_NUM_FPR
FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */
#endif
GPRArg gpr[CCALL_NUM_GPR]; /* Arguments/results in GPRs. */