aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_asm.c2
-rw-r--r--src/lj_asm_arm.h8
-rw-r--r--src/lj_asm_mips.h2
-rw-r--r--src/lj_asm_ppc.h2
-rw-r--r--src/lj_asm_x86.h2
-rw-r--r--src/lj_ccallback.c2
-rw-r--r--src/lj_dispatch.c1
-rw-r--r--src/lj_err.c10
-rw-r--r--src/lj_gc.c2
-rw-r--r--src/lj_obj.h2
-rw-r--r--src/lj_state.c7
-rw-r--r--src/vm_arm.dasc26
-rw-r--r--src/vm_mips.dasc34
-rw-r--r--src/vm_ppc.dasc28
-rw-r--r--src/vm_x86.dasc28
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. */
2065static void asm_head_lreg(ASMState *as) 2065static 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. */
697int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps) 697int 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)
281void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L) 282void 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