diff options
Diffstat (limited to 'src/lj_ccall.h')
-rw-r--r-- | src/lj_ccall.h | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/src/lj_ccall.h b/src/lj_ccall.h index 5f6d5101..8b3abdf9 100644 --- a/src/lj_ccall.h +++ b/src/lj_ccall.h | |||
@@ -68,35 +68,56 @@ typedef union FPRArg { | |||
68 | float f[2]; | 68 | float f[2]; |
69 | } FPRArg; | 69 | } FPRArg; |
70 | 70 | ||
71 | #elif LJ_TARGET_PPC | 71 | #elif LJ_TARGET_ARM64 |
72 | 72 | ||
73 | #define CCALL_NARG_GPR 8 | 73 | #define CCALL_NARG_GPR 8 |
74 | #define CCALL_NRET_GPR 2 | ||
74 | #define CCALL_NARG_FPR 8 | 75 | #define CCALL_NARG_FPR 8 |
76 | #define CCALL_NRET_FPR 4 | ||
77 | #define CCALL_SPS_FREE 0 | ||
78 | |||
79 | typedef intptr_t GPRArg; | ||
80 | typedef union FPRArg { | ||
81 | double d; | ||
82 | struct { LJ_ENDIAN_LOHI(float f; , float g;) }; | ||
83 | struct { LJ_ENDIAN_LOHI(uint32_t lo; , uint32_t hi;) }; | ||
84 | } FPRArg; | ||
85 | |||
86 | #elif LJ_TARGET_PPC | ||
87 | |||
88 | #define CCALL_NARG_GPR 8 | ||
89 | #define CCALL_NARG_FPR (LJ_ABI_SOFTFP ? 0 : 8) | ||
75 | #define CCALL_NRET_GPR 4 /* For complex double. */ | 90 | #define CCALL_NRET_GPR 4 /* For complex double. */ |
76 | #define CCALL_NRET_FPR 1 | 91 | #define CCALL_NRET_FPR (LJ_ABI_SOFTFP ? 0 : 1) |
77 | #define CCALL_SPS_EXTRA 4 | 92 | #define CCALL_SPS_EXTRA 4 |
78 | #define CCALL_SPS_FREE 0 | 93 | #define CCALL_SPS_FREE 0 |
79 | 94 | ||
80 | typedef intptr_t GPRArg; | 95 | typedef intptr_t GPRArg; |
81 | typedef double FPRArg; | 96 | typedef double FPRArg; |
82 | 97 | ||
83 | #elif LJ_TARGET_PPCSPE | 98 | #elif LJ_TARGET_MIPS32 |
84 | 99 | ||
85 | #define CCALL_NARG_GPR 8 | 100 | #define CCALL_NARG_GPR 4 |
86 | #define CCALL_NARG_FPR 0 | 101 | #define CCALL_NARG_FPR (LJ_ABI_SOFTFP ? 0 : 2) |
87 | #define CCALL_NRET_GPR 4 /* For softfp complex double. */ | 102 | #define CCALL_NRET_GPR (LJ_ABI_SOFTFP ? 4 : 2) |
88 | #define CCALL_NRET_FPR 0 | 103 | #define CCALL_NRET_FPR (LJ_ABI_SOFTFP ? 0 : 2) |
89 | #define CCALL_SPS_FREE 0 /* NYI */ | 104 | #define CCALL_SPS_EXTRA 7 |
105 | #define CCALL_SPS_FREE 1 | ||
90 | 106 | ||
91 | typedef intptr_t GPRArg; | 107 | typedef intptr_t GPRArg; |
108 | typedef union FPRArg { | ||
109 | double d; | ||
110 | struct { LJ_ENDIAN_LOHI(float f; , float g;) }; | ||
111 | } FPRArg; | ||
92 | 112 | ||
93 | #elif LJ_TARGET_MIPS | 113 | #elif LJ_TARGET_MIPS64 |
94 | 114 | ||
95 | #define CCALL_NARG_GPR 4 | 115 | /* FP args are positional and overlay the GPR array. */ |
96 | #define CCALL_NARG_FPR 2 | 116 | #define CCALL_NARG_GPR 8 |
117 | #define CCALL_NARG_FPR 0 | ||
97 | #define CCALL_NRET_GPR 2 | 118 | #define CCALL_NRET_GPR 2 |
98 | #define CCALL_NRET_FPR 2 | 119 | #define CCALL_NRET_FPR (LJ_ABI_SOFTFP ? 0 : 2) |
99 | #define CCALL_SPS_EXTRA 7 | 120 | #define CCALL_SPS_EXTRA 3 |
100 | #define CCALL_SPS_FREE 1 | 121 | #define CCALL_SPS_FREE 1 |
101 | 122 | ||
102 | typedef intptr_t GPRArg; | 123 | typedef intptr_t GPRArg; |
@@ -145,6 +166,8 @@ typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState { | |||
145 | uint8_t nfpr; /* Number of arguments in FPRs. */ | 166 | uint8_t nfpr; /* Number of arguments in FPRs. */ |
146 | #elif LJ_TARGET_X86 | 167 | #elif LJ_TARGET_X86 |
147 | uint8_t resx87; /* Result on x87 stack: 1:float, 2:double. */ | 168 | uint8_t resx87; /* Result on x87 stack: 1:float, 2:double. */ |
169 | #elif LJ_TARGET_ARM64 | ||
170 | void *retp; /* Aggregate return pointer in x8. */ | ||
148 | #elif LJ_TARGET_PPC | 171 | #elif LJ_TARGET_PPC |
149 | uint8_t nfpr; /* Number of arguments in FPRs. */ | 172 | uint8_t nfpr; /* Number of arguments in FPRs. */ |
150 | #endif | 173 | #endif |