One Level Up
Top Level
src/lj_ccall.h - luajit-2.0-src
Global variables defined
Data types defined
Macros defined
Source code
- #ifndef _LJ_CCALL_H
- #define _LJ_CCALL_H
- #include "lj_obj.h"
- #include "lj_ctype.h"
- #if LJ_HASFFI
- #if LJ_TARGET_X86ORX64
- #if LJ_TARGET_X86
- #define CCALL_NARG_GPR 2
- #define CCALL_NARG_FPR 0
- #define CCALL_NRET_GPR 2
- #define CCALL_NRET_FPR 1
- #define CCALL_ALIGN_STACKARG 0
- #elif LJ_ABI_WIN
- #define CCALL_NARG_GPR 4
- #define CCALL_NARG_FPR 4
- #define CCALL_NRET_GPR 1
- #define CCALL_NRET_FPR 1
- #define CCALL_SPS_EXTRA 4
- #else
- #define CCALL_NARG_GPR 6
- #define CCALL_NARG_FPR 8
- #define CCALL_NRET_GPR 2
- #define CCALL_NRET_FPR 2
- #define CCALL_VECTOR_REG 1
- #endif
- #define CCALL_SPS_FREE 1
- #define CCALL_ALIGN_CALLSTATE 16
- typedef LJ_ALIGN(16) union FPRArg {
- double d[2];
- float f[4];
- uint8_t b[16];
- uint16_t s[8];
- int i[4];
- int64_t l[2];
- } FPRArg;
- typedef intptr_t GPRArg;
- #elif LJ_TARGET_ARM
- #define CCALL_NARG_GPR 4
- #define CCALL_NRET_GPR 2
- #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_ARM64
- #define CCALL_NARG_GPR 8
- #define CCALL_NRET_GPR 2
- #define CCALL_NARG_FPR 8
- #define CCALL_NRET_FPR 4
- #define CCALL_SPS_FREE 0
- typedef intptr_t GPRArg;
- typedef union FPRArg {
- double d;
- float f;
- uint32_t u32;
- } FPRArg;
- #elif LJ_TARGET_PPC
- #define CCALL_NARG_GPR 8
- #define CCALL_NARG_FPR 8
- #define CCALL_NRET_GPR 4
- #define CCALL_NRET_FPR 1
- #define CCALL_SPS_EXTRA 4
- #define CCALL_SPS_FREE 0
- typedef intptr_t GPRArg;
- typedef double FPRArg;
- #elif LJ_TARGET_MIPS
- #define CCALL_NARG_GPR 4
- #define CCALL_NARG_FPR 2
- #define CCALL_NRET_GPR 2
- #define CCALL_NRET_FPR 2
- #define CCALL_SPS_EXTRA 7
- #define CCALL_SPS_FREE 1
- typedef intptr_t GPRArg;
- typedef union FPRArg {
- double d;
- struct { LJ_ENDIAN_LOHI(float f; , float g;) };
- } FPRArg;
- #else
- #error "Missing calling convention definitions for this architecture"
- #endif
- #ifndef CCALL_SPS_EXTRA
- #define CCALL_SPS_EXTRA 0
- #endif
- #ifndef CCALL_VECTOR_REG
- #define CCALL_VECTOR_REG 0
- #endif
- #ifndef CCALL_ALIGN_STACKARG
- #define CCALL_ALIGN_STACKARG 1
- #endif
- #ifndef CCALL_ALIGN_CALLSTATE
- #define CCALL_ALIGN_CALLSTATE 8
- #endif
- #define CCALL_NUM_GPR \
- (CCALL_NARG_GPR > CCALL_NRET_GPR ? CCALL_NARG_GPR : CCALL_NRET_GPR)
- #define CCALL_NUM_FPR \
- (CCALL_NARG_FPR > CCALL_NRET_FPR ? CCALL_NARG_FPR : CCALL_NRET_FPR)
- LJ_STATIC_ASSERT(CCALL_NUM_GPR <= CCALL_MAX_GPR);
- LJ_STATIC_ASSERT(CCALL_NUM_FPR <= CCALL_MAX_FPR);
- #define CCALL_MAXSTACK 32
- typedef LJ_ALIGN(CCALL_ALIGN_CALLSTATE) struct CCallState {
- void (*func)(void);
- uint32_t spadj;
- uint8_t nsp;
- uint8_t retref;
- #if LJ_TARGET_X64
- uint8_t ngpr;
- uint8_t nfpr;
- #elif LJ_TARGET_X86
- uint8_t resx87;
- #elif LJ_TARGET_ARM64
- void *retp;
- #elif LJ_TARGET_PPC
- uint8_t nfpr;
- #endif
- #if LJ_32
- int32_t align1;
- #endif
- #if CCALL_NUM_FPR
- FPRArg fpr[CCALL_NUM_FPR];
- #endif
- GPRArg gpr[CCALL_NUM_GPR];
- GPRArg stack[CCALL_MAXSTACK];
- } CCallState;
- LJ_ASMF void LJ_FASTCALL lj_vm_ffi_call(CCallState *cc);
- LJ_FUNC CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o);
- LJ_FUNC int lj_ccall_func(lua_State *L, GCcdata *cd);
- #endif
- #endif
One Level Up
Top Level