]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Define CFRAME structure for x64 interpreter.
authorMike Pall <mike>
Mon, 28 Dec 2009 22:45:32 +0000 (23:45 +0100)
committerMike Pall <mike>
Mon, 28 Dec 2009 22:45:32 +0000 (23:45 +0100)
src/lj_dispatch.c
src/lj_frame.h
src/lj_trace.c

index b427a06e1d48f73938a71520bf52df36a8b31b6f..3ce093718d7e90ca776c5055473432f978d91179 100644 (file)
@@ -264,8 +264,9 @@ void lj_dispatch_ins(lua_State *L, const BCIns *pc, uint32_t nres)
   GCproto *pt = funcproto(fn);
   BCReg slots = cur_topslot(pt, pc, nres);
   global_State *g = G(L);
-  const BCIns *oldpc = cframe_Lpc(L);
-  cframe_Lpc(L) = pc;
+  void *cf = cframe_raw(L->cframe);
+  const BCIns *oldpc = cframe_pc(cf);
+  setcframe_pc(cf, pc);
   L->top = L->base + slots;  /* Fix top. */
 #if LJ_HASJIT
   {
index 1c03e3e1116131f0a02fc04b20af2b3f164e86e9..14d640cd75282bde161707053a25ee4a857f297d 100644 (file)
@@ -58,12 +58,28 @@ enum {
 
 /* These definitions must match with the arch-specific *.dasc files. */
 #if LJ_TARGET_X86
-#define CFRAME_OFS_ERRF                (15*sizeof(void *))
-#define CFRAME_OFS_NRES                (14*sizeof(void *))
-#define CFRAME_OFS_PREV                (13*sizeof(void *))
-#define CFRAME_OFS_L           (12*sizeof(void *))
-#define CFRAME_OFS_PC          (6*sizeof(void *))
-#define CFRAME_SIZE            (12*sizeof(void *))
+#define CFRAME_OFS_ERRF                (15*4)
+#define CFRAME_OFS_NRES                (14*4)
+#define CFRAME_OFS_PREV                (13*4)
+#define CFRAME_OFS_L           (12*4)
+#define CFRAME_OFS_PC          (6*4)
+#define CFRAME_SIZE            (12*4)
+#elif LJ_TARGET_X64
+#if _WIN64
+#define CFRAME_OFS_ERRF                (23*4)
+#define CFRAME_OFS_NRES                (22*4)
+#define CFRAME_OFS_PREV                (13*8)
+#define CFRAME_OFS_L           (24*4)
+#define CFRAME_OFS_PC          (25*4)
+#define CFRAME_SIZE            (10*8)
+#else
+#define CFRAME_OFS_ERRF                (3*4)
+#define CFRAME_OFS_NRES                (2*4)
+#define CFRAME_OFS_PREV                (4*8)
+#define CFRAME_OFS_L           (4*4)
+#define CFRAME_OFS_PC          (5*4)
+#define CFRAME_SIZE            (10*8)
+#endif
 #else
 #error "Missing CFRAME_* definitions for this architecture"
 #endif
@@ -72,11 +88,15 @@ enum {
 #define CFRAME_CANYIELD                ((intptr_t)(CFRAME_RESUME))
 #define CFRAME_RAWMASK         (~CFRAME_CANYIELD)
 
-#define cframe_errfunc(cf)     (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_ERRF))
-#define cframe_nres(cf)                (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_NRES))
-#define cframe_prev(cf)                (*(void **)(((char *)cf)+CFRAME_OFS_PREV))
-#define cframe_L(cf)           (*(lua_State **)(((char *)cf)+CFRAME_OFS_L))
-#define cframe_pc(cf)          (*(const BCIns **)(((char *)cf)+CFRAME_OFS_PC))
+#define cframe_errfunc(cf)     (*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF))
+#define cframe_nres(cf)                (*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES))
+#define cframe_prev(cf)                (*(void **)(((char *)(cf))+CFRAME_OFS_PREV))
+#define cframe_L(cf) \
+  (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th)
+#define cframe_pc(cf) \
+  (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns))
+#define setcframe_pc(cf, pc) \
+  (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc)))
 #define cframe_canyield(cf)    ((intptr_t)(cf) & CFRAME_CANYIELD)
 #define cframe_raw(cf)         ((void *)((intptr_t)(cf) & CFRAME_RAWMASK))
 #define cframe_Lpc(L)          cframe_pc(cframe_raw(L->cframe))
index 37d20328e9ed7e4f21aaee4d4da108ef772a5303..8849b65c2407ffb0b3ee25c8db1decb9e67ae40d 100644 (file)
@@ -572,7 +572,7 @@ void * LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
   /* Restore interpreter state. */
   lj_snap_restore(J, exptr);
   cf = cframe_raw(L->cframe);
-  cframe_pc(cf) = J->pc;
+  setcframe_pc(cf, J->pc);
 
   lj_vmevent_send(L, TEXIT,
     ExitState *ex = (ExitState *)exptr;