summaryrefslogtreecommitdiff
path: root/src/lj_ccall.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_ccall.h')
-rw-r--r--src/lj_ccall.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/lj_ccall.h b/src/lj_ccall.h
new file mode 100644
index 00000000..a0737d04
--- /dev/null
+++ b/src/lj_ccall.h
@@ -0,0 +1,131 @@
1/*
2** FFI C call handling.
3** Copyright (C) 2005-2010 Mike Pall. See Copyright Notice in luajit.h
4*/
5
6#ifndef _LJ_CCALL_H
7#define _LJ_CCALL_H
8
9#include "lj_obj.h"
10
11#if LJ_HASFFI
12
13/* -- C calling conventions ----------------------------------------------- */
14
15#if LJ_TARGET_X86ORX64
16
17#if LJ_TARGET_X86
18#define CCALL_NARG_GPR 2 /* For fastcall arguments. */
19#define CCALL_NARG_FPR 0
20#define CCALL_NRET_GPR 2
21#define CCALL_NRET_FPR 1 /* For FP results on x87 stack. */
22#define CCALL_STRUCT_RETREF 1 /* Return structs by reference. */
23#define CCALL_COMPLEX_RETREF 1 /* Return complex by reference. */
24#define CCALL_COMPLEXF_RETREF 0 /* Return complex float by value. */
25#define CCALL_ALIGN_STACKARG 0 /* Don't align argument on stack. */
26#elif LJ_ABI_WIN
27#define CCALL_NARG_GPR 4
28#define CCALL_NARG_FPR 4
29#define CCALL_NRET_GPR 1
30#define CCALL_NRET_FPR 1
31#define CCALL_SPS_EXTRA 4
32#define CCALL_COMPLEX_ARGREF 1 /* Pass complex by reference. */
33#define CCALL_COMPLEX_RETREF 1 /* Return complex by reference. */
34#define CCALL_COMPLEXF_RETREF 0 /* Return complex float by value. */
35#else
36#define CCALL_NARG_GPR 6
37#define CCALL_NARG_FPR 8
38#define CCALL_NRET_GPR 2
39#define CCALL_NRET_FPR 2
40#define CCALL_VECTOR_REG 1 /* Pass vectors in registers. */
41#endif
42
43#define CCALL_SPS_FREE 1
44
45typedef LJ_ALIGN(16) union FPRArg {
46 double d[2];
47 float f[4];
48 uint8_t b[16];
49 uint16_t s[8];
50 int i[4];
51 int64_t l[2];
52} FPRArg;
53
54typedef intptr_t GPRArg;
55
56#elif LJ_TARGET_PPCSPE
57
58#define CCALL_NARG_GPR 8
59#define CCALL_NARG_FPR 0
60#define CCALL_NRET_GPR 4 /* For softfp complex double. */
61#define CCALL_NRET_FPR 0
62#define CCALL_SPS_FREE 0 /* NYI */
63#define CCALL_STRUCT_ARGREF 1 /* Pass structs by reference. */
64#define CCALL_STRUCT_RETREF 1 /* Return structs by reference. */
65
66typedef intptr_t GPRArg;
67
68#else
69#error "missing calling convention definitions for this architecture"
70#endif
71
72#ifndef CCALL_SPS_EXTRA
73#define CCALL_SPS_EXTRA 0
74#endif
75#ifndef CCALL_STRUCT_ARGREF
76#define CCALL_STRUCT_ARGREF 0
77#endif
78#ifndef CCALL_STRUCT_RETREF
79#define CCALL_STRUCT_RETREF 0
80#endif
81#ifndef CCALL_COMPLEX_ARGREF
82#define CCALL_COMPLEX_ARGREF 0
83#endif
84#ifndef CCALL_COMPLEX_RETREF
85#define CCALL_COMPLEX_RETREF 0
86#endif
87#ifndef CCALL_COMPLEXF_RETREF
88#define CCALL_COMPLEXF_RETREF CCALL_COMPLEX_RETREF
89#endif
90#ifndef CCALL_VECTOR_REG
91#define CCALL_VECTOR_REG 0
92#endif
93#ifndef CCALL_ALIGN_STACKARG
94#define CCALL_ALIGN_STACKARG 1
95#endif
96
97#define CCALL_NUM_GPR \
98 (CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR)
99#define CCALL_NUM_FPR \
100 (CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR)
101
102#define CCALL_MAXSTACK 32
103
104/* -- C call state -------------------------------------------------------- */
105
106typedef struct CCallState {
107 void (*func)(void); /* Pointer to called function. */
108 uint32_t spadj; /* Stack pointer adjustment. */
109 uint8_t nsp; /* Number of stack slots. */
110 uint8_t retref; /* Return value by reference. */
111#if LJ_TARGET_X64
112 uint8_t nfpr; /* Number of arguments in FPRs. */
113#elif LJ_TARGET_X86
114 uint8_t resx87; /* Result on x87 stack: 1:float, 2:double. */
115#endif
116 GPRArg gpr[CCALL_NUM_GPR]; /* Arguments/results in GPRs. */
117#if CCALL_NUM_FPR
118 FPRArg fpr[CCALL_NUM_FPR]; /* Arguments/results in FPRs. */
119#endif
120 GPRArg stack[CCALL_MAXSTACK]; /* Stack slots. */
121} CCallState;
122
123/* -- C call handling ----------------------------------------------------- */
124
125/* Really belongs to lj_vm.h. */
126LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc);
127LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd);
128
129#endif
130
131#endif