diff options
Diffstat (limited to 'src/lj_ccall.h')
-rw-r--r-- | src/lj_ccall.h | 131 |
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 | |||
45 | typedef 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 | |||
54 | typedef 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 | |||
66 | typedef 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 | |||
106 | typedef 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. */ | ||
126 | LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc); | ||
127 | LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd); | ||
128 | |||
129 | #endif | ||
130 | |||
131 | #endif | ||