aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2013-08-28 13:06:19 +0200
committerMike Pall <mike>2013-08-30 23:38:17 +0200
commit517500ba48a290699d5a2ec7465bf76a5109c49f (patch)
treeb780b0919bd2b79db462d0f392158d4b1ee6339c /src/vm_ppc.dasc
parent5120240b77e4544b9b7405b4849a6cc63cdbbe1e (diff)
downloadluajit-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.
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r--src/vm_ppc.dasc28
1 files changed, 16 insertions, 12 deletions
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