diff options
author | Mike Pall <mike> | 2009-12-28 23:45:32 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2009-12-28 23:45:32 +0100 |
commit | 8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43 (patch) | |
tree | d6be9b432e6c1194cfbd9b83213defe4d73117ba /src | |
parent | 61abf342a3242d8f667eed2fd718dd1f170da7c0 (diff) | |
download | luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.tar.gz luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.tar.bz2 luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.zip |
Define CFRAME structure for x64 interpreter.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_dispatch.c | 5 | ||||
-rw-r--r-- | src/lj_frame.h | 42 | ||||
-rw-r--r-- | src/lj_trace.c | 2 |
3 files changed, 35 insertions, 14 deletions
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index b427a06e..3ce09371 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c | |||
@@ -264,8 +264,9 @@ void lj_dispatch_ins(lua_State *L, const BCIns *pc, uint32_t nres) | |||
264 | GCproto *pt = funcproto(fn); | 264 | GCproto *pt = funcproto(fn); |
265 | BCReg slots = cur_topslot(pt, pc, nres); | 265 | BCReg slots = cur_topslot(pt, pc, nres); |
266 | global_State *g = G(L); | 266 | global_State *g = G(L); |
267 | const BCIns *oldpc = cframe_Lpc(L); | 267 | void *cf = cframe_raw(L->cframe); |
268 | cframe_Lpc(L) = pc; | 268 | const BCIns *oldpc = cframe_pc(cf); |
269 | setcframe_pc(cf, pc); | ||
269 | L->top = L->base + slots; /* Fix top. */ | 270 | L->top = L->base + slots; /* Fix top. */ |
270 | #if LJ_HASJIT | 271 | #if LJ_HASJIT |
271 | { | 272 | { |
diff --git a/src/lj_frame.h b/src/lj_frame.h index 1c03e3e1..14d640cd 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h | |||
@@ -58,12 +58,28 @@ enum { | |||
58 | 58 | ||
59 | /* These definitions must match with the arch-specific *.dasc files. */ | 59 | /* These definitions must match with the arch-specific *.dasc files. */ |
60 | #if LJ_TARGET_X86 | 60 | #if LJ_TARGET_X86 |
61 | #define CFRAME_OFS_ERRF (15*sizeof(void *)) | 61 | #define CFRAME_OFS_ERRF (15*4) |
62 | #define CFRAME_OFS_NRES (14*sizeof(void *)) | 62 | #define CFRAME_OFS_NRES (14*4) |
63 | #define CFRAME_OFS_PREV (13*sizeof(void *)) | 63 | #define CFRAME_OFS_PREV (13*4) |
64 | #define CFRAME_OFS_L (12*sizeof(void *)) | 64 | #define CFRAME_OFS_L (12*4) |
65 | #define CFRAME_OFS_PC (6*sizeof(void *)) | 65 | #define CFRAME_OFS_PC (6*4) |
66 | #define CFRAME_SIZE (12*sizeof(void *)) | 66 | #define CFRAME_SIZE (12*4) |
67 | #elif LJ_TARGET_X64 | ||
68 | #if _WIN64 | ||
69 | #define CFRAME_OFS_ERRF (23*4) | ||
70 | #define CFRAME_OFS_NRES (22*4) | ||
71 | #define CFRAME_OFS_PREV (13*8) | ||
72 | #define CFRAME_OFS_L (24*4) | ||
73 | #define CFRAME_OFS_PC (25*4) | ||
74 | #define CFRAME_SIZE (10*8) | ||
75 | #else | ||
76 | #define CFRAME_OFS_ERRF (3*4) | ||
77 | #define CFRAME_OFS_NRES (2*4) | ||
78 | #define CFRAME_OFS_PREV (4*8) | ||
79 | #define CFRAME_OFS_L (4*4) | ||
80 | #define CFRAME_OFS_PC (5*4) | ||
81 | #define CFRAME_SIZE (10*8) | ||
82 | #endif | ||
67 | #else | 83 | #else |
68 | #error "Missing CFRAME_* definitions for this architecture" | 84 | #error "Missing CFRAME_* definitions for this architecture" |
69 | #endif | 85 | #endif |
@@ -72,11 +88,15 @@ enum { | |||
72 | #define CFRAME_CANYIELD ((intptr_t)(CFRAME_RESUME)) | 88 | #define CFRAME_CANYIELD ((intptr_t)(CFRAME_RESUME)) |
73 | #define CFRAME_RAWMASK (~CFRAME_CANYIELD) | 89 | #define CFRAME_RAWMASK (~CFRAME_CANYIELD) |
74 | 90 | ||
75 | #define cframe_errfunc(cf) (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_ERRF)) | 91 | #define cframe_errfunc(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF)) |
76 | #define cframe_nres(cf) (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_NRES)) | 92 | #define cframe_nres(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES)) |
77 | #define cframe_prev(cf) (*(void **)(((char *)cf)+CFRAME_OFS_PREV)) | 93 | #define cframe_prev(cf) (*(void **)(((char *)(cf))+CFRAME_OFS_PREV)) |
78 | #define cframe_L(cf) (*(lua_State **)(((char *)cf)+CFRAME_OFS_L)) | 94 | #define cframe_L(cf) \ |
79 | #define cframe_pc(cf) (*(const BCIns **)(((char *)cf)+CFRAME_OFS_PC)) | 95 | (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th) |
96 | #define cframe_pc(cf) \ | ||
97 | (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns)) | ||
98 | #define setcframe_pc(cf, pc) \ | ||
99 | (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc))) | ||
80 | #define cframe_canyield(cf) ((intptr_t)(cf) & CFRAME_CANYIELD) | 100 | #define cframe_canyield(cf) ((intptr_t)(cf) & CFRAME_CANYIELD) |
81 | #define cframe_raw(cf) ((void *)((intptr_t)(cf) & CFRAME_RAWMASK)) | 101 | #define cframe_raw(cf) ((void *)((intptr_t)(cf) & CFRAME_RAWMASK)) |
82 | #define cframe_Lpc(L) cframe_pc(cframe_raw(L->cframe)) | 102 | #define cframe_Lpc(L) cframe_pc(cframe_raw(L->cframe)) |
diff --git a/src/lj_trace.c b/src/lj_trace.c index 37d20328..8849b65c 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
@@ -572,7 +572,7 @@ void * LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr) | |||
572 | /* Restore interpreter state. */ | 572 | /* Restore interpreter state. */ |
573 | lj_snap_restore(J, exptr); | 573 | lj_snap_restore(J, exptr); |
574 | cf = cframe_raw(L->cframe); | 574 | cf = cframe_raw(L->cframe); |
575 | cframe_pc(cf) = J->pc; | 575 | setcframe_pc(cf, J->pc); |
576 | 576 | ||
577 | lj_vmevent_send(L, TEXIT, | 577 | lj_vmevent_send(L, TEXIT, |
578 | ExitState *ex = (ExitState *)exptr; | 578 | ExitState *ex = (ExitState *)exptr; |