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 | |
| parent | 61abf342a3242d8f667eed2fd718dd1f170da7c0 (diff) | |
| download | luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.tar.gz luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.tar.bz2 luajit-8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43.zip | |
Define CFRAME structure for x64 interpreter.
| -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; |
