diff options
-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 |