diff options
| author | Mike Pall <mike> | 2013-08-28 13:06:19 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2013-08-30 23:38:17 +0200 |
| commit | 517500ba48a290699d5a2ec7465bf76a5109c49f (patch) | |
| tree | b780b0919bd2b79db462d0f392158d4b1ee6339c | |
| parent | 5120240b77e4544b9b7405b4849a6cc63cdbbe1e (diff) | |
| download | luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.tar.gz luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.tar.bz2 luajit-517500ba48a290699d5a2ec7465bf76a5109c49f.zip | |
Save currently executing lua_State in g->cur_L.
This is only a good approximation due to deficiencies in the design of
the Lua/C API. It indicates _some_ valid state that is/was executing.
Also reorder L->cframe stores to achieve a synchronously consistent state.
| -rw-r--r-- | src/lj_asm.c | 2 | ||||
| -rw-r--r-- | src/lj_asm_arm.h | 8 | ||||
| -rw-r--r-- | src/lj_asm_mips.h | 2 | ||||
| -rw-r--r-- | src/lj_asm_ppc.h | 2 | ||||
| -rw-r--r-- | src/lj_asm_x86.h | 2 | ||||
| -rw-r--r-- | src/lj_ccallback.c | 2 | ||||
| -rw-r--r-- | src/lj_dispatch.c | 1 | ||||
| -rw-r--r-- | src/lj_err.c | 10 | ||||
| -rw-r--r-- | src/lj_gc.c | 2 | ||||
| -rw-r--r-- | src/lj_obj.h | 2 | ||||
| -rw-r--r-- | src/lj_state.c | 7 | ||||
| -rw-r--r-- | src/vm_arm.dasc | 26 | ||||
| -rw-r--r-- | src/vm_mips.dasc | 34 | ||||
| -rw-r--r-- | src/vm_ppc.dasc | 28 | ||||
| -rw-r--r-- | src/vm_x86.dasc | 28 |
15 files changed, 89 insertions, 67 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index a80d6adf..ee1cc5b5 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -342,7 +342,7 @@ static Reg ra_rematk(ASMState *as, IRRef ref) | |||
| 342 | emit_getgl(as, r, jit_base); | 342 | emit_getgl(as, r, jit_base); |
| 343 | } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) { | 343 | } else if (emit_canremat(ASMREF_L) && ir->o == IR_KPRI) { |
| 344 | lua_assert(irt_isnil(ir->t)); /* REF_NIL stores ASMREF_L register. */ | 344 | lua_assert(irt_isnil(ir->t)); /* REF_NIL stores ASMREF_L register. */ |
| 345 | emit_getgl(as, r, jit_L); | 345 | emit_getgl(as, r, cur_L); |
| 346 | #if LJ_64 | 346 | #if LJ_64 |
| 347 | } else if (ir->o == IR_KINT64) { | 347 | } else if (ir->o == IR_KINT64) { |
| 348 | emit_loadu64(as, r, ir_kint64(ir)->u64); | 348 | emit_loadu64(as, r, ir_kint64(ir)->u64); |
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 00d87aeb..497a5692 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
| @@ -1944,7 +1944,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot, | |||
| 1944 | emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, | 1944 | emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, |
| 1945 | (int32_t)offsetof(lua_State, maxstack)); | 1945 | (int32_t)offsetof(lua_State, maxstack)); |
| 1946 | if (irp) { /* Must not spill arbitrary registers in head of side trace. */ | 1946 | if (irp) { /* Must not spill arbitrary registers in head of side trace. */ |
| 1947 | int32_t i = i32ptr(&J2G(as->J)->jit_L); | 1947 | int32_t i = i32ptr(&J2G(as->J)->cur_L); |
| 1948 | if (ra_hasspill(irp->s)) | 1948 | if (ra_hasspill(irp->s)) |
| 1949 | emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s)); | 1949 | emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s)); |
| 1950 | emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095)); | 1950 | emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095)); |
| @@ -1952,7 +1952,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot, | |||
| 1952 | emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */ | 1952 | emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */ |
| 1953 | emit_loadi(as, RID_TMP, (i & ~4095)); | 1953 | emit_loadi(as, RID_TMP, (i & ~4095)); |
| 1954 | } else { | 1954 | } else { |
| 1955 | emit_getgl(as, RID_TMP, jit_L); | 1955 | emit_getgl(as, RID_TMP, cur_L); |
| 1956 | } | 1956 | } |
| 1957 | } | 1957 | } |
| 1958 | 1958 | ||
| @@ -2061,13 +2061,13 @@ static void asm_loop_fixup(ASMState *as) | |||
| 2061 | 2061 | ||
| 2062 | /* -- Head of trace ------------------------------------------------------- */ | 2062 | /* -- Head of trace ------------------------------------------------------- */ |
| 2063 | 2063 | ||
| 2064 | /* Reload L register from g->jit_L. */ | 2064 | /* Reload L register from g->cur_L. */ |
| 2065 | static void asm_head_lreg(ASMState *as) | 2065 | static void asm_head_lreg(ASMState *as) |
| 2066 | { | 2066 | { |
| 2067 | IRIns *ir = IR(ASMREF_L); | 2067 | IRIns *ir = IR(ASMREF_L); |
| 2068 | if (ra_used(ir)) { | 2068 | if (ra_used(ir)) { |
| 2069 | Reg r = ra_dest(as, ir, RSET_GPR); | 2069 | Reg r = ra_dest(as, ir, RSET_GPR); |
| 2070 | emit_getgl(as, r, jit_L); | 2070 | emit_getgl(as, r, cur_L); |
| 2071 | ra_evictk(as); | 2071 | ra_evictk(as); |
| 2072 | } | 2072 | } |
| 2073 | } | 2073 | } |
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index 3d061eb4..74eff10b 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h | |||
| @@ -1586,7 +1586,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot, | |||
| 1586 | emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack)); | 1586 | emit_tsi(as, MIPSI_LW, tmp, tmp, offsetof(lua_State, maxstack)); |
| 1587 | if (pbase == RID_TMP) | 1587 | if (pbase == RID_TMP) |
| 1588 | emit_getgl(as, RID_TMP, jit_base); | 1588 | emit_getgl(as, RID_TMP, jit_base); |
| 1589 | emit_getgl(as, tmp, jit_L); | 1589 | emit_getgl(as, tmp, cur_L); |
| 1590 | if (allow == RSET_EMPTY) /* Spill temp. register. */ | 1590 | if (allow == RSET_EMPTY) /* Spill temp. register. */ |
| 1591 | emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0); | 1591 | emit_tsi(as, MIPSI_SW, tmp, RID_SP, 0); |
| 1592 | } | 1592 | } |
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index 10cd79dd..652dcca0 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h | |||
| @@ -1759,7 +1759,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot, | |||
| 1759 | emit_tai(as, PPCI_LWZ, tmp, tmp, offsetof(lua_State, maxstack)); | 1759 | emit_tai(as, PPCI_LWZ, tmp, tmp, offsetof(lua_State, maxstack)); |
| 1760 | if (pbase == RID_TMP) | 1760 | if (pbase == RID_TMP) |
| 1761 | emit_getgl(as, RID_TMP, jit_base); | 1761 | emit_getgl(as, RID_TMP, jit_base); |
| 1762 | emit_getgl(as, tmp, jit_L); | 1762 | emit_getgl(as, tmp, cur_L); |
| 1763 | if (allow == RSET_EMPTY) /* Spill temp. register. */ | 1763 | if (allow == RSET_EMPTY) /* Spill temp. register. */ |
| 1764 | emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPW); | 1764 | emit_tai(as, PPCI_STW, tmp, RID_SP, SPOFS_TMPW); |
| 1765 | } | 1765 | } |
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index f2f8157d..82517600 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
| @@ -2369,7 +2369,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot, | |||
| 2369 | emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE, | 2369 | emit_rmro(as, XO_ARITH(XOg_SUB), r, RID_NONE, |
| 2370 | ptr2addr(&J2G(as->J)->jit_base)); | 2370 | ptr2addr(&J2G(as->J)->jit_base)); |
| 2371 | emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack)); | 2371 | emit_rmro(as, XO_MOV, r, r, offsetof(lua_State, maxstack)); |
| 2372 | emit_getgl(as, r, jit_L); | 2372 | emit_getgl(as, r, cur_L); |
| 2373 | if (allow == RSET_EMPTY) /* Spill temp. register. */ | 2373 | if (allow == RSET_EMPTY) /* Spill temp. register. */ |
| 2374 | emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0); | 2374 | emit_rmro(as, XO_MOVto, r|REX_64, RID_ESP, 0); |
| 2375 | } | 2375 | } |
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c index 37f45bf5..9805d265 100644 --- a/src/lj_ccallback.c +++ b/src/lj_ccallback.c | |||
| @@ -562,9 +562,9 @@ void LJ_FASTCALL lj_ccallback_leave(CTState *cts, TValue *o) | |||
| 562 | } | 562 | } |
| 563 | callback_conv_result(cts, L, o); | 563 | callback_conv_result(cts, L, o); |
| 564 | /* Finally drop C frame and continuation frame. */ | 564 | /* Finally drop C frame and continuation frame. */ |
| 565 | L->cframe = cframe_prev(L->cframe); | ||
| 566 | L->top -= 2; | 565 | L->top -= 2; |
| 567 | L->base = obase; | 566 | L->base = obase; |
| 567 | L->cframe = cframe_prev(L->cframe); | ||
| 568 | cts->cb.slot = 0; /* Blacklist C function that called the callback. */ | 568 | cts->cb.slot = 0; /* Blacklist C function that called the callback. */ |
| 569 | } | 569 | } |
| 570 | 570 | ||
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index a78075a7..d76dda41 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c | |||
| @@ -357,6 +357,7 @@ static void callhook(lua_State *L, int event, BCLine line) | |||
| 357 | hook_enter(g); | 357 | hook_enter(g); |
| 358 | hookf(L, &ar); | 358 | hookf(L, &ar); |
| 359 | lua_assert(hook_active(g)); | 359 | lua_assert(hook_active(g)); |
| 360 | setgcref(g->cur_L, obj2gco(L)); | ||
| 360 | hook_leave(g); | 361 | hook_leave(g); |
| 361 | } | 362 | } |
| 362 | } | 363 | } |
diff --git a/src/lj_err.c b/src/lj_err.c index 3b44c984..007d9d9f 100644 --- a/src/lj_err.c +++ b/src/lj_err.c | |||
| @@ -99,8 +99,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 99 | TValue *top = restorestack(L, -nres); | 99 | TValue *top = restorestack(L, -nres); |
| 100 | if (frame < top) { /* Frame reached? */ | 100 | if (frame < top) { /* Frame reached? */ |
| 101 | if (errcode) { | 101 | if (errcode) { |
| 102 | L->cframe = cframe_prev(cf); | ||
| 103 | L->base = frame+1; | 102 | L->base = frame+1; |
| 103 | L->cframe = cframe_prev(cf); | ||
| 104 | unwindstack(L, top); | 104 | unwindstack(L, top); |
| 105 | } | 105 | } |
| 106 | return cf; | 106 | return cf; |
| @@ -119,8 +119,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 119 | #endif | 119 | #endif |
| 120 | #if LJ_UNWIND_EXT | 120 | #if LJ_UNWIND_EXT |
| 121 | if (errcode) { | 121 | if (errcode) { |
| 122 | L->cframe = cframe_prev(cf); | ||
| 123 | L->base = frame_prevd(frame) + 1; | 122 | L->base = frame_prevd(frame) + 1; |
| 123 | L->cframe = cframe_prev(cf); | ||
| 124 | unwindstack(L, frame); | 124 | unwindstack(L, frame); |
| 125 | } else if (cf != stopcf) { | 125 | } else if (cf != stopcf) { |
| 126 | cf = cframe_prev(cf); | 126 | cf = cframe_prev(cf); |
| @@ -144,8 +144,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 144 | return cf; | 144 | return cf; |
| 145 | } | 145 | } |
| 146 | if (errcode) { | 146 | if (errcode) { |
| 147 | L->cframe = cframe_prev(cf); | ||
| 148 | L->base = frame_prevd(frame) + 1; | 147 | L->base = frame_prevd(frame) + 1; |
| 148 | L->cframe = cframe_prev(cf); | ||
| 149 | unwindstack(L, frame); | 149 | unwindstack(L, frame); |
| 150 | } | 150 | } |
| 151 | return cf; | 151 | return cf; |
| @@ -166,8 +166,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 166 | } | 166 | } |
| 167 | if (frame_typep(frame) == FRAME_PCALL) | 167 | if (frame_typep(frame) == FRAME_PCALL) |
| 168 | hook_leave(G(L)); | 168 | hook_leave(G(L)); |
| 169 | L->cframe = cf; | ||
| 170 | L->base = frame_prevd(frame) + 1; | 169 | L->base = frame_prevd(frame) + 1; |
| 170 | L->cframe = cf; | ||
| 171 | unwindstack(L, L->base); | 171 | unwindstack(L, L->base); |
| 172 | } | 172 | } |
| 173 | return (void *)((intptr_t)cf | CFRAME_UNWIND_FF); | 173 | return (void *)((intptr_t)cf | CFRAME_UNWIND_FF); |
| @@ -175,8 +175,8 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode) | |||
| 175 | } | 175 | } |
| 176 | /* No C frame. */ | 176 | /* No C frame. */ |
| 177 | if (errcode) { | 177 | if (errcode) { |
| 178 | L->cframe = NULL; | ||
| 179 | L->base = tvref(L->stack)+1; | 178 | L->base = tvref(L->stack)+1; |
| 179 | L->cframe = NULL; | ||
| 180 | unwindstack(L, L->base); | 180 | unwindstack(L, L->base); |
| 181 | if (G(L)->panic) | 181 | if (G(L)->panic) |
| 182 | G(L)->panic(L); | 182 | G(L)->panic(L); |
diff --git a/src/lj_gc.c b/src/lj_gc.c index 8dbf2090..bc10822f 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c | |||
| @@ -696,7 +696,7 @@ void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L) | |||
| 696 | /* Perform multiple GC steps. Called from JIT-compiled code. */ | 696 | /* Perform multiple GC steps. Called from JIT-compiled code. */ |
| 697 | int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps) | 697 | int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps) |
| 698 | { | 698 | { |
| 699 | lua_State *L = gco2th(gcref(g->jit_L)); | 699 | lua_State *L = gco2th(gcref(g->cur_L)); |
| 700 | L->base = tvref(G(L)->jit_base); | 700 | L->base = tvref(G(L)->jit_base); |
| 701 | L->top = curr_topL(L); | 701 | L->top = curr_topL(L); |
| 702 | while (steps-- > 0 && lj_gc_step(L) == 0) | 702 | while (steps-- > 0 && lj_gc_step(L) == 0) |
diff --git a/src/lj_obj.h b/src/lj_obj.h index e97acef0..846c290f 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h | |||
| @@ -536,7 +536,7 @@ typedef struct global_State { | |||
| 536 | lua_CFunction panic; /* Called as a last resort for errors. */ | 536 | lua_CFunction panic; /* Called as a last resort for errors. */ |
| 537 | BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */ | 537 | BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */ |
| 538 | BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */ | 538 | BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */ |
| 539 | GCRef jit_L; /* Current JIT code lua_State. */ | 539 | GCRef cur_L; /* Currently executing lua_State. */ |
| 540 | MRef jit_base; /* Current JIT code L->base or NULL. */ | 540 | MRef jit_base; /* Current JIT code L->base or NULL. */ |
| 541 | MRef ctype_state; /* Pointer to C type state. */ | 541 | MRef ctype_state; /* Pointer to C type state. */ |
| 542 | GCRef gcroot[GCROOT_MAX]; /* GC roots. */ | 542 | GCRef gcroot[GCROOT_MAX]; /* GC roots. */ |
diff --git a/src/lj_state.c b/src/lj_state.c index 486e66e3..f11467fe 100644 --- a/src/lj_state.c +++ b/src/lj_state.c | |||
| @@ -91,7 +91,7 @@ void lj_state_shrinkstack(lua_State *L, MSize used) | |||
| 91 | if (4*used < L->stacksize && | 91 | if (4*used < L->stacksize && |
| 92 | 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && | 92 | 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && |
| 93 | /* Don't shrink stack of live trace. */ | 93 | /* Don't shrink stack of live trace. */ |
| 94 | (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->jit_L))) | 94 | (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->cur_L))) |
| 95 | resizestack(L, L->stacksize >> 1); | 95 | resizestack(L, L->stacksize >> 1); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| @@ -237,6 +237,7 @@ LUA_API void lua_close(lua_State *L) | |||
| 237 | { | 237 | { |
| 238 | global_State *g = G(L); | 238 | global_State *g = G(L); |
| 239 | int i; | 239 | int i; |
| 240 | setgcrefnull(g->cur_L); | ||
| 240 | L = mainthread(g); /* Only the main thread can be closed. */ | 241 | L = mainthread(g); /* Only the main thread can be closed. */ |
| 241 | lj_func_closeuv(L, tvref(L->stack)); | 242 | lj_func_closeuv(L, tvref(L->stack)); |
| 242 | lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */ | 243 | lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */ |
| @@ -248,8 +249,8 @@ LUA_API void lua_close(lua_State *L) | |||
| 248 | for (i = 0;;) { | 249 | for (i = 0;;) { |
| 249 | hook_enter(g); | 250 | hook_enter(g); |
| 250 | L->status = 0; | 251 | L->status = 0; |
| 251 | L->cframe = NULL; | ||
| 252 | L->base = L->top = tvref(L->stack) + 1; | 252 | L->base = L->top = tvref(L->stack) + 1; |
| 253 | L->cframe = NULL; | ||
| 253 | if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { | 254 | if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) { |
| 254 | if (++i >= 10) break; | 255 | if (++i >= 10) break; |
| 255 | lj_gc_separateudata(g, 1); /* Separate udata again. */ | 256 | lj_gc_separateudata(g, 1); /* Separate udata again. */ |
| @@ -281,6 +282,8 @@ lua_State *lj_state_new(lua_State *L) | |||
| 281 | void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) | 282 | void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) |
| 282 | { | 283 | { |
| 283 | lua_assert(L != mainthread(g)); | 284 | lua_assert(L != mainthread(g)); |
| 285 | if (obj2gco(L) == gcref(g->cur_L)) | ||
| 286 | setgcrefnull(g->cur_L); | ||
| 284 | lj_func_closeuv(L, tvref(L->stack)); | 287 | lj_func_closeuv(L, tvref(L->stack)); |
| 285 | lua_assert(gcref(L->openupval) == NULL); | 288 | lua_assert(gcref(L->openupval) == NULL); |
| 286 | lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); | 289 | lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue); |
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index b235967f..dd39052c 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc | |||
| @@ -419,13 +419,14 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 419 | | add CARG2, sp, #CFRAME_RESUME | 419 | | add CARG2, sp, #CFRAME_RESUME |
| 420 | | ldrb CARG1, L->status | 420 | | ldrb CARG1, L->status |
| 421 | | str CARG3, SAVE_ERRF | 421 | | str CARG3, SAVE_ERRF |
| 422 | | str CARG2, L->cframe | 422 | | str L, SAVE_PC // Any value outside of bytecode is ok. |
| 423 | | str CARG3, SAVE_CFRAME | 423 | | str CARG3, SAVE_CFRAME |
| 424 | | cmp CARG1, #0 | 424 | | cmp CARG1, #0 |
| 425 | | str L, SAVE_PC // Any value outside of bytecode is ok. | 425 | | str CARG2, L->cframe |
| 426 | | beq >3 | 426 | | beq >3 |
| 427 | | | 427 | | |
| 428 | | // Resume after yield (like a return). | 428 | | // Resume after yield (like a return). |
| 429 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
| 429 | | mov RA, BASE | 430 | | mov RA, BASE |
| 430 | | ldr BASE, L->base | 431 | | ldr BASE, L->base |
| 431 | | ldr CARG1, L->top | 432 | | ldr CARG1, L->top |
| @@ -459,14 +460,15 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 459 | | str CARG3, SAVE_NRES | 460 | | str CARG3, SAVE_NRES |
| 460 | | mov L, CARG1 | 461 | | mov L, CARG1 |
| 461 | | str CARG1, SAVE_L | 462 | | str CARG1, SAVE_L |
| 462 | | mov BASE, CARG2 | ||
| 463 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
| 464 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | 463 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. |
| 464 | | mov BASE, CARG2 | ||
| 465 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. | 465 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 466 | | str RC, SAVE_CFRAME | 466 | | str RC, SAVE_CFRAME |
| 467 | | add DISPATCH, DISPATCH, #GG_G2DISP | 467 | | add DISPATCH, DISPATCH, #GG_G2DISP |
| 468 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
| 468 | | | 469 | | |
| 469 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 470 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
| 471 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
| 470 | | ldr RB, L->base // RB = old base (for vmeta_call). | 472 | | ldr RB, L->base // RB = old base (for vmeta_call). |
| 471 | | ldr CARG1, L->top | 473 | | ldr CARG1, L->top |
| 472 | | mov MASKR8, #255 | 474 | | mov MASKR8, #255 |
| @@ -492,20 +494,21 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 492 | | mov L, CARG1 | 494 | | mov L, CARG1 |
| 493 | | ldr RA, L:CARG1->stack | 495 | | ldr RA, L:CARG1->stack |
| 494 | | str CARG1, SAVE_L | 496 | | str CARG1, SAVE_L |
| 497 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | ||
| 495 | | ldr RB, L->top | 498 | | ldr RB, L->top |
| 496 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. | 499 | | str CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 497 | | ldr RC, L->cframe | 500 | | ldr RC, L->cframe |
| 501 | | add DISPATCH, DISPATCH, #GG_G2DISP | ||
| 498 | | sub RA, RA, RB // Compute -savestack(L, L->top). | 502 | | sub RA, RA, RB // Compute -savestack(L, L->top). |
| 499 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
| 500 | | mov RB, #0 | 503 | | mov RB, #0 |
| 501 | | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. | 504 | | str RA, SAVE_NRES // Neg. delta means cframe w/o frame. |
| 502 | | str RB, SAVE_ERRF // No error function. | 505 | | str RB, SAVE_ERRF // No error function. |
| 503 | | str RC, SAVE_CFRAME | 506 | | str RC, SAVE_CFRAME |
| 507 | | str sp, L->cframe // Add our C frame to cframe chain. | ||
| 508 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
| 504 | | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) | 509 | | blx CARG4 // (lua_State *L, lua_CFunction func, void *ud) |
| 505 | | ldr DISPATCH, L->glref // Setup pointer to dispatch table. | ||
| 506 | | movs BASE, CRET1 | 510 | | movs BASE, CRET1 |
| 507 | | mov PC, #FRAME_CP | 511 | | mov PC, #FRAME_CP |
| 508 | | add DISPATCH, DISPATCH, #GG_G2DISP | ||
| 509 | | bne <3 // Else continue with the call. | 512 | | bne <3 // Else continue with the call. |
| 510 | | b ->vm_leave_cp // No base? Just remove C frame. | 513 | | b ->vm_leave_cp // No base? Just remove C frame. |
| 511 | | | 514 | | |
| @@ -1262,9 +1265,10 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1262 | | ldr CARG3, L:RA->base | 1265 | | ldr CARG3, L:RA->base |
| 1263 | | mv_vmstate CARG2, INTERP | 1266 | | mv_vmstate CARG2, INTERP |
| 1264 | | ldr CARG4, L:RA->top | 1267 | | ldr CARG4, L:RA->top |
| 1265 | | st_vmstate CARG2 | ||
| 1266 | | cmp CRET1, #LUA_YIELD | 1268 | | cmp CRET1, #LUA_YIELD |
| 1267 | | ldr BASE, L->base | 1269 | | ldr BASE, L->base |
| 1270 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
| 1271 | | st_vmstate CARG2 | ||
| 1268 | | bhi >8 | 1272 | | bhi >8 |
| 1269 | | subs RC, CARG4, CARG3 | 1273 | | subs RC, CARG4, CARG3 |
| 1270 | | ldr CARG1, L->maxstack | 1274 | | ldr CARG1, L->maxstack |
| @@ -2102,7 +2106,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2102 | | add CARG1, CARG1, CARG2, asr #6 | 2106 | | add CARG1, CARG1, CARG2, asr #6 |
| 2103 | | ldr CARG2, [lr, #4] // Load exit stub group offset. | 2107 | | ldr CARG2, [lr, #4] // Load exit stub group offset. |
| 2104 | | sub CARG1, CARG1, lr | 2108 | | sub CARG1, CARG1, lr |
| 2105 | | ldr L, [DISPATCH, #DISPATCH_GL(jit_L)] | 2109 | | ldr L, [DISPATCH, #DISPATCH_GL(cur_L)] |
| 2106 | | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. | 2110 | | add CARG1, CARG2, CARG1, lsr #2 // Compute exit number. |
| 2107 | | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] | 2111 | | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] |
| 2108 | | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] | 2112 | | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] |
| @@ -4285,7 +4289,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 4285 | | st_vmstate CARG2 | 4289 | | st_vmstate CARG2 |
| 4286 | | ldr RA, TRACE:RC->mcode | 4290 | | ldr RA, TRACE:RC->mcode |
| 4287 | | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] | 4291 | | str BASE, [DISPATCH, #DISPATCH_GL(jit_base)] |
| 4288 | | str L, [DISPATCH, #DISPATCH_GL(jit_L)] | ||
| 4289 | | str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)] | 4292 | | str L, [DISPATCH, #DISPATCH_GL(tmpbuf.L)] |
| 4290 | | bx RA | 4293 | | bx RA |
| 4291 | |.endif | 4294 | |.endif |
| @@ -4404,6 +4407,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 4404 | | ldr BASE, L->base | 4407 | | ldr BASE, L->base |
| 4405 | | mv_vmstate CARG3, INTERP | 4408 | | mv_vmstate CARG3, INTERP |
| 4406 | | ldr CRET2, L->top | 4409 | | ldr CRET2, L->top |
| 4410 | | str L, [DISPATCH, #DISPATCH_GL(cur_L)] | ||
| 4407 | | lsl RC, CRET1, #3 | 4411 | | lsl RC, CRET1, #3 |
| 4408 | | st_vmstate CARG3 | 4412 | | st_vmstate CARG3 |
| 4409 | | ldr PC, [BASE, FRAME_PC] | 4413 | | ldr PC, [BASE, FRAME_PC] |
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index aad4fccf..39d1521d 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
| @@ -487,12 +487,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 487 | | addiu DISPATCH, DISPATCH, GG_G2DISP | 487 | | addiu DISPATCH, DISPATCH, GG_G2DISP |
| 488 | | sw r0, SAVE_NRES | 488 | | sw r0, SAVE_NRES |
| 489 | | sw r0, SAVE_ERRF | 489 | | sw r0, SAVE_ERRF |
| 490 | | sw TMP0, L->cframe | 490 | | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 491 | | sw r0, SAVE_CFRAME | 491 | | sw r0, SAVE_CFRAME |
| 492 | | beqz TMP1, >3 | 492 | | beqz TMP1, >3 |
| 493 | |. sw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 493 | |. sw TMP0, L->cframe |
| 494 | | | 494 | | |
| 495 | | // Resume after yield (like a return). | 495 | | // Resume after yield (like a return). |
| 496 | | sw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 496 | | move RA, BASE | 497 | | move RA, BASE |
| 497 | | lw BASE, L->base | 498 | | lw BASE, L->base |
| 498 | | lw TMP1, L->top | 499 | | lw TMP1, L->top |
| @@ -526,17 +527,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 526 | | | 527 | | |
| 527 | |1: // Entry point for vm_pcall above (PC = ftype). | 528 | |1: // Entry point for vm_pcall above (PC = ftype). |
| 528 | | lw TMP1, L:CARG1->cframe | 529 | | lw TMP1, L:CARG1->cframe |
| 529 | | sw CARG3, SAVE_NRES | ||
| 530 | | move L, CARG1 | 530 | | move L, CARG1 |
| 531 | | sw CARG1, SAVE_L | 531 | | sw CARG3, SAVE_NRES |
| 532 | | move BASE, CARG2 | ||
| 533 | | sw sp, L->cframe // Add our C frame to cframe chain. | ||
| 534 | | lw DISPATCH, L->glref // Setup pointer to dispatch table. | 532 | | lw DISPATCH, L->glref // Setup pointer to dispatch table. |
| 533 | | sw CARG1, SAVE_L | ||
| 534 | | move BASE, CARG2 | ||
| 535 | | addiu DISPATCH, DISPATCH, GG_G2DISP | ||
| 535 | | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 536 | | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 536 | | sw TMP1, SAVE_CFRAME | 537 | | sw TMP1, SAVE_CFRAME |
| 537 | | addiu DISPATCH, DISPATCH, GG_G2DISP | 538 | | sw sp, L->cframe // Add our C frame to cframe chain. |
| 538 | | | 539 | | |
| 539 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 540 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
| 541 | | sw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 540 | | lw TMP2, L->base // TMP2 = old base (used in vmeta_call). | 542 | | lw TMP2, L->base // TMP2 = old base (used in vmeta_call). |
| 541 | | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | 543 | | lui TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). |
| 542 | | lw TMP1, L->top | 544 | | lw TMP1, L->top |
| @@ -567,20 +569,21 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 567 | | lw TMP0, L:CARG1->stack | 569 | | lw TMP0, L:CARG1->stack |
| 568 | | sw CARG1, SAVE_L | 570 | | sw CARG1, SAVE_L |
| 569 | | lw TMP1, L->top | 571 | | lw TMP1, L->top |
| 572 | | lw DISPATCH, L->glref // Setup pointer to dispatch table. | ||
| 570 | | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 573 | | sw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 571 | | subu TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). | 574 | | subu TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). |
| 572 | | lw TMP1, L->cframe | 575 | | lw TMP1, L->cframe |
| 573 | | sw sp, L->cframe // Add our C frame to cframe chain. | 576 | | addiu DISPATCH, DISPATCH, GG_G2DISP |
| 574 | | sw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. | 577 | | sw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. |
| 575 | | sw r0, SAVE_ERRF // No error function. | 578 | | sw r0, SAVE_ERRF // No error function. |
| 576 | | move CFUNCADDR, CARG4 | 579 | | sw TMP1, SAVE_CFRAME |
| 580 | | sw sp, L->cframe // Add our C frame to cframe chain. | ||
| 581 | | sw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 577 | | jalr CARG4 // (lua_State *L, lua_CFunction func, void *ud) | 582 | | jalr CARG4 // (lua_State *L, lua_CFunction func, void *ud) |
| 578 | |. sw TMP1, SAVE_CFRAME | 583 | |. move CFUNCADDR, CARG4 |
| 579 | | move BASE, CRET1 | 584 | | move BASE, CRET1 |
| 580 | | lw DISPATCH, L->glref // Setup pointer to dispatch table. | ||
| 581 | | li PC, FRAME_CP | ||
| 582 | | bnez CRET1, <3 // Else continue with the call. | 585 | | bnez CRET1, <3 // Else continue with the call. |
| 583 | |. addiu DISPATCH, DISPATCH, GG_G2DISP | 586 | |. li PC, FRAME_CP |
| 584 | | b ->vm_leave_cp // No base? Just remove C frame. | 587 | | b ->vm_leave_cp // No base? Just remove C frame. |
| 585 | |. nop | 588 | |. nop |
| 586 | | | 589 | | |
| @@ -1364,6 +1367,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1364 | | lw TMP3, L:RA->top | 1367 | | lw TMP3, L:RA->top |
| 1365 | | li_vmstate INTERP | 1368 | | li_vmstate INTERP |
| 1366 | | lw BASE, L->base | 1369 | | lw BASE, L->base |
| 1370 | | sw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 1367 | | st_vmstate | 1371 | | st_vmstate |
| 1368 | | beqz AT, >8 | 1372 | | beqz AT, >8 |
| 1369 | |. subu RD, TMP3, TMP2 | 1373 | |. subu RD, TMP3, TMP2 |
| @@ -2045,7 +2049,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2045 | | lw TMP1, 0(TMP2) // Load exit number. | 2049 | | lw TMP1, 0(TMP2) // Load exit number. |
| 2046 | | st_vmstate | 2050 | | st_vmstate |
| 2047 | | sw TMP2, 16+32*8+29*4(sp) // Store sp in RID_SP. | 2051 | | sw TMP2, 16+32*8+29*4(sp) // Store sp in RID_SP. |
| 2048 | | lw L, DISPATCH_GL(jit_L)(DISPATCH) | 2052 | | lw L, DISPATCH_GL(cur_L)(DISPATCH) |
| 2049 | | lw BASE, DISPATCH_GL(jit_base)(DISPATCH) | 2053 | | lw BASE, DISPATCH_GL(jit_base)(DISPATCH) |
| 2050 | | load_got lj_trace_exit | 2054 | | load_got lj_trace_exit |
| 2051 | | sw L, DISPATCH_J(L)(DISPATCH) | 2055 | | sw L, DISPATCH_J(L)(DISPATCH) |
| @@ -3980,7 +3984,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 3980 | | sw AT, DISPATCH_GL(vmstate)(DISPATCH) | 3984 | | sw AT, DISPATCH_GL(vmstate)(DISPATCH) |
| 3981 | | lw TRACE:TMP2, 0(TMP1) | 3985 | | lw TRACE:TMP2, 0(TMP1) |
| 3982 | | sw BASE, DISPATCH_GL(jit_base)(DISPATCH) | 3986 | | sw BASE, DISPATCH_GL(jit_base)(DISPATCH) |
| 3983 | | sw L, DISPATCH_GL(jit_L)(DISPATCH) | ||
| 3984 | | lw TMP2, TRACE:TMP2->mcode | 3987 | | lw TMP2, TRACE:TMP2->mcode |
| 3985 | | sw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) | 3988 | | sw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) |
| 3986 | | jr TMP2 | 3989 | | jr TMP2 |
| @@ -4108,6 +4111,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 4108 | | li_vmstate INTERP | 4111 | | li_vmstate INTERP |
| 4109 | | lw PC, FRAME_PC(BASE) // Fetch PC of caller. | 4112 | | lw PC, FRAME_PC(BASE) // Fetch PC of caller. |
| 4110 | | subu RA, TMP1, RD // RA = L->top - nresults*8 | 4113 | | subu RA, TMP1, RD // RA = L->top - nresults*8 |
| 4114 | | sw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 4111 | | b ->vm_returnc | 4115 | | b ->vm_returnc |
| 4112 | |. st_vmstate | 4116 | |. st_vmstate |
| 4113 | break; | 4117 | break; |
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index d009d005..d9186c44 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
| @@ -662,12 +662,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 662 | | stw CARG3, SAVE_NRES | 662 | | stw CARG3, SAVE_NRES |
| 663 | | cmplwi TMP1, 0 | 663 | | cmplwi TMP1, 0 |
| 664 | | stw CARG3, SAVE_ERRF | 664 | | stw CARG3, SAVE_ERRF |
| 665 | | stp TMP0, L->cframe | ||
| 666 | | stp CARG3, SAVE_CFRAME | 665 | | stp CARG3, SAVE_CFRAME |
| 667 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 666 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 667 | | stp TMP0, L->cframe | ||
| 668 | | beq >3 | 668 | | beq >3 |
| 669 | | | 669 | | |
| 670 | | // Resume after yield (like a return). | 670 | | // Resume after yield (like a return). |
| 671 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 671 | | mr RA, BASE | 672 | | mr RA, BASE |
| 672 | | lp BASE, L->base | 673 | | lp BASE, L->base |
| 673 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 674 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
| @@ -707,17 +708,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 707 | | | 708 | | |
| 708 | |1: // Entry point for vm_pcall above (PC = ftype). | 709 | |1: // Entry point for vm_pcall above (PC = ftype). |
| 709 | | lp TMP1, L:CARG1->cframe | 710 | | lp TMP1, L:CARG1->cframe |
| 710 | | stw CARG3, SAVE_NRES | ||
| 711 | | mr L, CARG1 | 711 | | mr L, CARG1 |
| 712 | | stw CARG1, SAVE_L | 712 | | stw CARG3, SAVE_NRES |
| 713 | | mr BASE, CARG2 | ||
| 714 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
| 715 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 713 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. |
| 714 | | stw CARG1, SAVE_L | ||
| 715 | | mr BASE, CARG2 | ||
| 716 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
| 716 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 717 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 717 | | stp TMP1, SAVE_CFRAME | 718 | | stp TMP1, SAVE_CFRAME |
| 718 | | addi DISPATCH, DISPATCH, GG_G2DISP | 719 | | stp sp, L->cframe // Add our C frame to cframe chain. |
| 719 | | | 720 | | |
| 720 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | 721 | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). |
| 722 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 721 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). | 723 | | lp TMP2, L->base // TMP2 = old base (used in vmeta_call). |
| 722 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. | 724 | | li TISNUM, LJ_TISNUM // Setup type comparison constants. |
| 723 | | lp TMP1, L->top | 725 | | lp TMP1, L->top |
| @@ -754,15 +756,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 754 | | lwz TMP0, L:CARG1->stack | 756 | | lwz TMP0, L:CARG1->stack |
| 755 | | stw CARG1, SAVE_L | 757 | | stw CARG1, SAVE_L |
| 756 | | lp TMP1, L->top | 758 | | lp TMP1, L->top |
| 759 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | ||
| 757 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. | 760 | | stw CARG1, SAVE_PC // Any value outside of bytecode is ok. |
| 758 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). | 761 | | sub TMP0, TMP0, TMP1 // Compute -savestack(L, L->top). |
| 759 | | lp TMP1, L->cframe | 762 | | lp TMP1, L->cframe |
| 760 | | stp sp, L->cframe // Add our C frame to cframe chain. | 763 | | addi DISPATCH, DISPATCH, GG_G2DISP |
| 761 | | .toc lp CARG4, 0(CARG4) | 764 | | .toc lp CARG4, 0(CARG4) |
| 762 | | li TMP2, 0 | 765 | | li TMP2, 0 |
| 763 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. | 766 | | stw TMP0, SAVE_NRES // Neg. delta means cframe w/o frame. |
| 764 | | stw TMP2, SAVE_ERRF // No error function. | 767 | | stw TMP2, SAVE_ERRF // No error function. |
| 765 | | stp TMP1, SAVE_CFRAME | 768 | | stp TMP1, SAVE_CFRAME |
| 769 | | stp sp, L->cframe // Add our C frame to cframe chain. | ||
| 770 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 766 | | mtctr CARG4 | 771 | | mtctr CARG4 |
| 767 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) | 772 | | bctrl // (lua_State *L, lua_CFunction func, void *ud) |
| 768 | |.if PPE | 773 | |.if PPE |
| @@ -771,9 +776,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 771 | |.else | 776 | |.else |
| 772 | | mr. BASE, CRET1 | 777 | | mr. BASE, CRET1 |
| 773 | |.endif | 778 | |.endif |
| 774 | | lwz DISPATCH, L->glref // Setup pointer to dispatch table. | 779 | | li PC, FRAME_CP |
| 775 | | li PC, FRAME_CP | ||
| 776 | | addi DISPATCH, DISPATCH, GG_G2DISP | ||
| 777 | | bne <3 // Else continue with the call. | 780 | | bne <3 // Else continue with the call. |
| 778 | | b ->vm_leave_cp // No base? Just remove C frame. | 781 | | b ->vm_leave_cp // No base? Just remove C frame. |
| 779 | | | 782 | | |
| @@ -1629,6 +1632,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1629 | | lp TMP3, L:SAVE0->top | 1632 | | lp TMP3, L:SAVE0->top |
| 1630 | | li_vmstate INTERP | 1633 | | li_vmstate INTERP |
| 1631 | | lp BASE, L->base | 1634 | | lp BASE, L->base |
| 1635 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 1632 | | st_vmstate | 1636 | | st_vmstate |
| 1633 | | bgt >8 | 1637 | | bgt >8 |
| 1634 | | sub RD, TMP3, TMP2 | 1638 | | sub RD, TMP3, TMP2 |
| @@ -2535,7 +2539,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2535 | | savex_ 20,21,22,23 | 2539 | | savex_ 20,21,22,23 |
| 2536 | | lhz CARG4, 2(CARG3) // Load trace number. | 2540 | | lhz CARG4, 2(CARG3) // Load trace number. |
| 2537 | | savex_ 24,25,26,27 | 2541 | | savex_ 24,25,26,27 |
| 2538 | | lwz L, DISPATCH_GL(jit_L)(DISPATCH) | 2542 | | lwz L, DISPATCH_GL(cur_L)(DISPATCH) |
| 2539 | | savex_ 28,29,30,31 | 2543 | | savex_ 28,29,30,31 |
| 2540 | | sub CARG3, TMP0, CARG3 // Compute exit number. | 2544 | | sub CARG3, TMP0, CARG3 // Compute exit number. |
| 2541 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) | 2545 | | lp BASE, DISPATCH_GL(jit_base)(DISPATCH) |
| @@ -4852,7 +4856,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 4852 | | lp TMP2, TRACE:TMP2->mcode | 4856 | | lp TMP2, TRACE:TMP2->mcode |
| 4853 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) | 4857 | | stw BASE, DISPATCH_GL(jit_base)(DISPATCH) |
| 4854 | | mtctr TMP2 | 4858 | | mtctr TMP2 |
| 4855 | | stw L, DISPATCH_GL(jit_L)(DISPATCH) | ||
| 4856 | | addi JGL, DISPATCH, GG_DISP2G+32768 | 4859 | | addi JGL, DISPATCH, GG_DISP2G+32768 |
| 4857 | | stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) | 4860 | | stw L, DISPATCH_GL(tmpbuf.L)(DISPATCH) |
| 4858 | | bctr | 4861 | | bctr |
| @@ -4989,6 +4992,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 4989 | | lp TMP1, L->top | 4992 | | lp TMP1, L->top |
| 4990 | | li_vmstate INTERP | 4993 | | li_vmstate INTERP |
| 4991 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. | 4994 | | lwz PC, FRAME_PC(BASE) // Fetch PC of caller. |
| 4995 | | stw L, DISPATCH_GL(cur_L)(DISPATCH) | ||
| 4992 | | sub RA, TMP1, RD // RA = L->top - nresults*8 | 4996 | | sub RA, TMP1, RD // RA = L->top - nresults*8 |
| 4993 | | st_vmstate | 4997 | | st_vmstate |
| 4994 | | b ->vm_returnc | 4998 | | b ->vm_returnc |
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index b8f1c449..7fe891b1 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc | |||
| @@ -630,17 +630,18 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 630 | | lea KBASEa, [esp+CFRAME_RESUME] | 630 | | lea KBASEa, [esp+CFRAME_RESUME] |
| 631 | | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. | 631 | | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. |
| 632 | | add DISPATCH, GG_G2DISP | 632 | | add DISPATCH, GG_G2DISP |
| 633 | | mov L:RB->cframe, KBASEa | ||
| 634 | | mov SAVE_PC, RD // Any value outside of bytecode is ok. | 633 | | mov SAVE_PC, RD // Any value outside of bytecode is ok. |
| 635 | | mov SAVE_CFRAME, RDa | 634 | | mov SAVE_CFRAME, RDa |
| 636 | |.if X64 | 635 | |.if X64 |
| 637 | | mov SAVE_NRES, RD | 636 | | mov SAVE_NRES, RD |
| 638 | | mov SAVE_ERRF, RD | 637 | | mov SAVE_ERRF, RD |
| 639 | |.endif | 638 | |.endif |
| 639 | | mov L:RB->cframe, KBASEa | ||
| 640 | | cmp byte L:RB->status, RDL | 640 | | cmp byte L:RB->status, RDL |
| 641 | | je >3 // Initial resume (like a call). | 641 | | je >2 // Initial resume (like a call). |
| 642 | | | 642 | | |
| 643 | | // Resume after yield (like a return). | 643 | | // Resume after yield (like a return). |
| 644 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB | ||
| 644 | | set_vmstate INTERP | 645 | | set_vmstate INTERP |
| 645 | | mov byte L:RB->status, RDL | 646 | | mov byte L:RB->status, RDL |
| 646 | | mov BASE, L:RB->base | 647 | | mov BASE, L:RB->base |
| @@ -680,20 +681,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 680 | | mov RA, INARG_BASE // Caveat: overlaps SAVE_CFRAME! | 681 | | mov RA, INARG_BASE // Caveat: overlaps SAVE_CFRAME! |
| 681 | |.endif | 682 | |.endif |
| 682 | | | 683 | | |
| 684 | | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. | ||
| 683 | | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. | 685 | | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. |
| 684 | | mov SAVE_CFRAME, KBASEa | 686 | | mov SAVE_CFRAME, KBASEa |
| 685 | | mov SAVE_PC, L:RB // Any value outside of bytecode is ok. | 687 | | mov SAVE_PC, L:RB // Any value outside of bytecode is ok. |
| 688 | | add DISPATCH, GG_G2DISP | ||
| 686 | |.if X64 | 689 | |.if X64 |
| 687 | | mov L:RB->cframe, rsp | 690 | | mov L:RB->cframe, rsp |
| 688 | |.else | 691 | |.else |
| 689 | | mov L:RB->cframe, esp | 692 | | mov L:RB->cframe, esp |
| 690 | |.endif | 693 | |.endif |
| 691 | | | 694 | | |
| 692 | |2: // Entry point for vm_cpcall below (RA = base, RB = L, PC = ftype). | 695 | |2: // Entry point for vm_resume/vm_cpcall (RA = base, RB = L, PC = ftype). |
| 693 | | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. | 696 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB |
| 694 | | add DISPATCH, GG_G2DISP | ||
| 695 | | | ||
| 696 | |3: // Entry point for vm_resume above (RA = base, RB = L, PC = ftype). | ||
| 697 | | set_vmstate INTERP | 697 | | set_vmstate INTERP |
| 698 | | mov BASE, L:RB->base // BASE = old base (used in vmeta_call). | 698 | | mov BASE, L:RB->base // BASE = old base (used in vmeta_call). |
| 699 | | add PC, RA | 699 | | add PC, RA |
| @@ -731,14 +731,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 731 | | | 731 | | |
| 732 | | mov KBASE, L:RB->stack // Compute -savestack(L, L->top). | 732 | | mov KBASE, L:RB->stack // Compute -savestack(L, L->top). |
| 733 | | sub KBASE, L:RB->top | 733 | | sub KBASE, L:RB->top |
| 734 | | mov DISPATCH, L:RB->glref // Setup pointer to dispatch table. | ||
| 734 | | mov SAVE_ERRF, 0 // No error function. | 735 | | mov SAVE_ERRF, 0 // No error function. |
| 735 | | mov SAVE_NRES, KBASE // Neg. delta means cframe w/o frame. | 736 | | mov SAVE_NRES, KBASE // Neg. delta means cframe w/o frame. |
| 737 | | add DISPATCH, GG_G2DISP | ||
| 736 | | // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe). | 738 | | // Handler may change cframe_nres(L->cframe) or cframe_errfunc(L->cframe). |
| 737 | | | 739 | | |
| 738 | |.if X64 | 740 | |.if X64 |
| 739 | | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. | 741 | | mov KBASEa, L:RB->cframe // Add our C frame to cframe chain. |
| 740 | | mov SAVE_CFRAME, KBASEa | 742 | | mov SAVE_CFRAME, KBASEa |
| 741 | | mov L:RB->cframe, rsp | 743 | | mov L:RB->cframe, rsp |
| 744 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB | ||
| 742 | | | 745 | | |
| 743 | | call CARG4 // (lua_State *L, lua_CFunction func, void *ud) | 746 | | call CARG4 // (lua_State *L, lua_CFunction func, void *ud) |
| 744 | |.else | 747 | |.else |
| @@ -749,6 +752,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 749 | | mov KBASE, L:RB->cframe // Add our C frame to cframe chain. | 752 | | mov KBASE, L:RB->cframe // Add our C frame to cframe chain. |
| 750 | | mov SAVE_CFRAME, KBASE | 753 | | mov SAVE_CFRAME, KBASE |
| 751 | | mov L:RB->cframe, esp | 754 | | mov L:RB->cframe, esp |
| 755 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB | ||
| 752 | | | 756 | | |
| 753 | | call BASE // (lua_State *L, lua_CFunction func, void *ud) | 757 | | call BASE // (lua_State *L, lua_CFunction func, void *ud) |
| 754 | |.endif | 758 | |.endif |
| @@ -1840,7 +1844,6 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1840 | | mov ARG3, RA | 1844 | | mov ARG3, RA |
| 1841 | |.endif | 1845 | |.endif |
| 1842 | | call ->vm_resume // (lua_State *L, TValue *base, 0, 0) | 1846 | | call ->vm_resume // (lua_State *L, TValue *base, 0, 0) |
| 1843 | | set_vmstate INTERP | ||
| 1844 | | | 1847 | | |
| 1845 | | mov L:RB, SAVE_L | 1848 | | mov L:RB, SAVE_L |
| 1846 | |.if X64 | 1849 | |.if X64 |
| @@ -1849,6 +1852,9 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1849 | | mov L:PC, ARG1 // The callee doesn't modify SAVE_L. | 1852 | | mov L:PC, ARG1 // The callee doesn't modify SAVE_L. |
| 1850 | |.endif | 1853 | |.endif |
| 1851 | | mov BASE, L:RB->base | 1854 | | mov BASE, L:RB->base |
| 1855 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB | ||
| 1856 | | set_vmstate INTERP | ||
| 1857 | | | ||
| 1852 | | cmp eax, LUA_YIELD | 1858 | | cmp eax, LUA_YIELD |
| 1853 | | ja >8 | 1859 | | ja >8 |
| 1854 | |4: | 1860 | |4: |
| @@ -2705,7 +2711,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 2705 | | movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0 | 2711 | | movsd qword [ebp-88], xmm1; movsd qword [ebp-96], xmm0 |
| 2706 | |.endif | 2712 | |.endif |
| 2707 | | // Caveat: RB is ebp. | 2713 | | // Caveat: RB is ebp. |
| 2708 | | mov L:RB, [DISPATCH+DISPATCH_GL(jit_L)] | 2714 | | mov L:RB, [DISPATCH+DISPATCH_GL(cur_L)] |
| 2709 | | mov BASE, [DISPATCH+DISPATCH_GL(jit_base)] | 2715 | | mov BASE, [DISPATCH+DISPATCH_GL(jit_base)] |
| 2710 | | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa | 2716 | | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa |
| 2711 | | mov L:RB->base, BASE | 2717 | | mov L:RB->base, BASE |
| @@ -5382,7 +5388,6 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 5382 | | mov RDa, TRACE:RD->mcode | 5388 | | mov RDa, TRACE:RD->mcode |
| 5383 | | mov L:RB, SAVE_L | 5389 | | mov L:RB, SAVE_L |
| 5384 | | mov [DISPATCH+DISPATCH_GL(jit_base)], BASE | 5390 | | mov [DISPATCH+DISPATCH_GL(jit_base)], BASE |
| 5385 | | mov [DISPATCH+DISPATCH_GL(jit_L)], L:RB | ||
| 5386 | | mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB | 5391 | | mov [DISPATCH+DISPATCH_GL(tmpbuf.L)], L:RB |
| 5387 | | // Save additional callee-save registers only used in compiled code. | 5392 | | // Save additional callee-save registers only used in compiled code. |
| 5388 | |.if X64WIN | 5393 | |.if X64WIN |
| @@ -5550,9 +5555,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 5550 | | // (lua_State *L, lua_CFunction f) | 5555 | | // (lua_State *L, lua_CFunction f) |
| 5551 | | call aword [DISPATCH+DISPATCH_GL(wrapf)] | 5556 | | call aword [DISPATCH+DISPATCH_GL(wrapf)] |
| 5552 | } | 5557 | } |
| 5553 | | set_vmstate INTERP | ||
| 5554 | | // nresults returned in eax (RD). | 5558 | | // nresults returned in eax (RD). |
| 5555 | | mov BASE, L:RB->base | 5559 | | mov BASE, L:RB->base |
| 5560 | | mov [DISPATCH+DISPATCH_GL(cur_L)], L:RB | ||
| 5561 | | set_vmstate INTERP | ||
| 5556 | | lea RA, [BASE+RD*8] | 5562 | | lea RA, [BASE+RD*8] |
| 5557 | | neg RA | 5563 | | neg RA |
| 5558 | | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 | 5564 | | add RA, L:RB->top // RA = (L->top-(L->base+nresults))*8 |
