aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2009-12-28 23:45:32 +0100
committerMike Pall <mike>2009-12-28 23:45:32 +0100
commit8a9cfa4b4592e50be1903b83d28c8ea2fbc4aa43 (patch)
treed6be9b432e6c1194cfbd9b83213defe4d73117ba /src
parent61abf342a3242d8f667eed2fd718dd1f170da7c0 (diff)
downloadluajit-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.c5
-rw-r--r--src/lj_frame.h42
-rw-r--r--src/lj_trace.c2
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;