diff options
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r-- | src/buildvm_ppc.dasc | 18 |
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 |