summaryrefslogtreecommitdiff
path: root/src/buildvm_ppc.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r--src/buildvm_ppc.dasc18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 55270280..f96168df 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -540,7 +540,7 @@ static void build_subroutines(BuildCtx *ctx)
540 | 540 |
541 |->vm_call_dispatch_f: 541 |->vm_call_dispatch_f:
542 | ins_call 542 | ins_call
543 | // BASE = new base, RC = nargs*8 543 | // BASE = new base, RB = func, RC = nargs*8, PC = caller PC
544 | 544 |
545 |->vm_cpcall: // Setup protected C frame, call C. 545 |->vm_cpcall: // Setup protected C frame, call C.
546 | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp) 546 | // (lua_State *L, lua_CFunction func, void *ud, lua_CPFunction cp)
@@ -581,8 +581,10 @@ static void build_subroutines(BuildCtx *ctx)
581 | mr RB, BASE 581 | mr RB, BASE
582 | mr BASE, TMP2 // Restore caller BASE. 582 | mr BASE, TMP2 // Restore caller BASE.
583 | lwz LFUNC:TMP1, FRAME_FUNC(TMP2) 583 | lwz LFUNC:TMP1, FRAME_FUNC(TMP2)
584 | cmplwi TMP0, 0
585 | lwz PC, -16(RB) // Restore PC from [cont|PC].
586 | beq >1
584 | subi TMP2, RD, 8 587 | subi TMP2, RD, 8
585 | lwz PC, -16(RB) // Restore PC from [cont|PC].
586 | lwz TMP1, LFUNC:TMP1->pc 588 | lwz TMP1, LFUNC:TMP1->pc
587 | evstddx TISNIL, RA, TMP2 // Ensure one valid arg. 589 | evstddx TISNIL, RA, TMP2 // Ensure one valid arg.
588 | lwz KBASE, PC2PROTO(k)(TMP1) 590 | lwz KBASE, PC2PROTO(k)(TMP1)
@@ -590,6 +592,11 @@ static void build_subroutines(BuildCtx *ctx)
590 | mtctr TMP0 592 | mtctr TMP0
591 | bctr // Jump to continuation. 593 | bctr // Jump to continuation.
592 | 594 |
595 |1: // Tail call from C function.
596 | subi TMP1, RB, 16
597 | sub RC, TMP1, BASE
598 | b ->vm_call_tail
599 |
593 |->cont_cat: // RA = resultptr, RB = meta base 600 |->cont_cat: // RA = resultptr, RB = meta base
594 | lwz INS, -4(PC) 601 | lwz INS, -4(PC)
595 | subi CARG2, RB, 16 602 | subi CARG2, RB, 16
@@ -845,7 +852,7 @@ static void build_subroutines(BuildCtx *ctx)
845 | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) 852 | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top)
846 | lwz TMP1, FRAME_PC(BASE) 853 | lwz TMP1, FRAME_PC(BASE)
847 | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. 854 | addi NARGS8:RC, SAVE0, 8 // Got one more argument now.
848 | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. 855 | lwz LFUNC:RB, FRAME_FUNC(RA) // Guaranteed to be a function here.
849 | b ->BC_CALLT_Z 856 | b ->BC_CALLT_Z
850 | 857 |
851 |//-- Argument coercion for 'for' statement ------------------------------ 858 |//-- Argument coercion for 'for' statement ------------------------------
@@ -1797,10 +1804,11 @@ static void build_subroutines(BuildCtx *ctx)
1797 | lwz TMP0, L->top 1804 | lwz TMP0, L->top
1798 | lwz LFUNC:RB, FRAME_FUNC(BASE) 1805 | lwz LFUNC:RB, FRAME_FUNC(BASE)
1799 | sub NARGS8:RC, TMP0, BASE 1806 | sub NARGS8:RC, TMP0, BASE
1800 | bne >2 // Returned -1? 1807 | bne ->vm_call_tail // Returned -1?
1801 | ins_callt // Returned 0: retry fast path. 1808 | ins_callt // Returned 0: retry fast path.
1802 | 1809 |
1803 |2: // Reconstruct previous base for vmeta_call during tailcall. 1810 |// Reconstruct previous base for vmeta_call during tailcall.
1811 |->vm_call_tail:
1804 | andi. TMP0, PC, FRAME_TYPE 1812 | andi. TMP0, PC, FRAME_TYPE
1805 | rlwinm TMP1, PC, 0, 0, 28 1813 | rlwinm TMP1, PC, 0, 0, 28
1806 | bne >3 1814 | bne >3