Fix some portability issues with the JIT compiler.
This commit is contained in:
33
src/lj_jit.h
33
src/lj_jit.h
@@ -27,7 +27,8 @@
|
||||
#define JIT_F_CPU_FIRST JIT_F_CMOV
|
||||
#define JIT_F_CPUSTRING "\4CMOV\4SSE2\4SSE3\6SSE4.1\2P4\3AMD\2K8\4ATOM"
|
||||
#else
|
||||
#error "Missing CPU-specific JIT engine flags"
|
||||
#define JIT_F_CPU_FIRST 0
|
||||
#define JIT_F_CPUSTRING ""
|
||||
#endif
|
||||
|
||||
/* Optimization flags. */
|
||||
@@ -118,7 +119,11 @@ typedef enum {
|
||||
} PostProc;
|
||||
|
||||
/* Machine code type. */
|
||||
#if LJ_TARGET_X86ORX64
|
||||
typedef uint8_t MCode;
|
||||
#else
|
||||
typedef uint32_t MCode;
|
||||
#endif
|
||||
|
||||
/* Stack snapshot header. */
|
||||
typedef struct SnapShot {
|
||||
@@ -252,6 +257,13 @@ enum {
|
||||
#define lj_resetsplit(J) UNUSED(J)
|
||||
#endif
|
||||
|
||||
/* Exit stubs. */
|
||||
#if LJ_TARGET_X86ORX64
|
||||
/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */
|
||||
#define EXITSTUB_SPACING (2+2)
|
||||
#define EXITSTUBS_PER_GROUP 32
|
||||
#endif
|
||||
|
||||
/* Fold state is used to fold instructions on-the-fly. */
|
||||
typedef struct FoldState {
|
||||
IRIns ins; /* Currently emitted instruction. */
|
||||
@@ -318,7 +330,9 @@ typedef struct jit_State {
|
||||
|
||||
int32_t param[JIT_P__MAX]; /* JIT engine parameters. */
|
||||
|
||||
#if LJ_TARGET_X86ORX64
|
||||
MCode *exitstubgroup[LJ_MAX_EXITSTUBGR]; /* Exit stub group addresses. */
|
||||
#endif
|
||||
|
||||
HotPenalty penalty[PENALTY_SLOTS]; /* Penalty slots. */
|
||||
uint32_t penaltyslot; /* Round-robin index into penalty slots. */
|
||||
@@ -344,7 +358,7 @@ typedef struct jit_State {
|
||||
size_t szallmcarea; /* Total size of all allocated mcode areas. */
|
||||
|
||||
TValue errinfo; /* Additional info element for trace errors. */
|
||||
} jit_State;
|
||||
} LJ_ALIGN(16) jit_State;
|
||||
|
||||
/* Trivial PRNG e.g. used for penalty randomization. */
|
||||
static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits)
|
||||
@@ -354,21 +368,14 @@ static LJ_AINLINE uint32_t LJ_PRNG_BITS(jit_State *J, int bits)
|
||||
return J->prngstate >> (32-bits);
|
||||
}
|
||||
|
||||
/* Exit stubs. */
|
||||
#if LJ_TARGET_X86ORX64
|
||||
/* Limited by the range of a short fwd jump (127): (2+2)*(32-1)-2 = 122. */
|
||||
#define EXITSTUB_SPACING (2+2)
|
||||
#define EXITSTUBS_PER_GROUP 32
|
||||
#else
|
||||
#error "Missing CPU-specific exit stub definitions"
|
||||
#endif
|
||||
|
||||
#ifdef EXITSTUBS_PER_GROUP
|
||||
/* Return the address of an exit stub. */
|
||||
static LJ_AINLINE MCode *exitstub_addr(jit_State *J, ExitNo exitno)
|
||||
{
|
||||
lua_assert(J->exitstubgroup[exitno / EXITSTUBS_PER_GROUP] != NULL);
|
||||
return J->exitstubgroup[exitno / EXITSTUBS_PER_GROUP] +
|
||||
EXITSTUB_SPACING*(exitno % EXITSTUBS_PER_GROUP);
|
||||
return (MCode *)((char *)J->exitstubgroup[exitno / EXITSTUBS_PER_GROUP] +
|
||||
EXITSTUB_SPACING*(exitno % EXITSTUBS_PER_GROUP));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user