diff options
| -rw-r--r-- | src/buildvm_ppc.dasc | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 3947cc30..76d54f42 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -579,6 +579,9 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 579 | |->vmeta_call: // Resolve and call __call metamethod. | 579 | |->vmeta_call: // Resolve and call __call metamethod. |
| 580 | | NYI | 580 | | NYI |
| 581 | | | 581 | | |
| 582 | |->vmeta_callt: // Resolve __call for BC_CALLT. | ||
| 583 | | NYI | ||
| 584 | | | ||
| 582 | |//-- Argument coercion for 'for' statement ------------------------------ | 585 | |//-- Argument coercion for 'for' statement ------------------------------ |
| 583 | | | 586 | | |
| 584 | |->vmeta_for: | 587 | |->vmeta_for: |
| @@ -1538,10 +1541,60 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 1538 | break; | 1541 | break; |
| 1539 | 1542 | ||
| 1540 | case BC_CALLMT: | 1543 | case BC_CALLMT: |
| 1541 | | NYI | 1544 | | // RA = base*8, (RB = 0,) RC = extra_nargs*8 |
| 1545 | | lwz TMP0, SAVE_MULTRES | ||
| 1546 | | add NARGS8:RC, NARGS8:RC, TMP0 | ||
| 1547 | | // Fall through. Assumes BC_CALLT follows. | ||
| 1542 | break; | 1548 | break; |
| 1543 | case BC_CALLT: | 1549 | case BC_CALLT: |
| 1544 | | NYI | 1550 | | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 |
| 1551 | | evlddx LFUNC:RB, BASE, RA | ||
| 1552 | | add RA, BASE, RA | ||
| 1553 | | lwz TMP1, FRAME_PC(BASE) | ||
| 1554 | | subi NARGS8:RC, NARGS8:RC, 8 | ||
| 1555 | | checkfunc LFUNC:RB | ||
| 1556 | | addi RA, RA, 8 | ||
| 1557 | | checkfail ->vmeta_callt | ||
| 1558 | |->BC_CALLT_Z: | ||
| 1559 | | andi. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand. | ||
| 1560 | | lbz TMP3, LFUNC:RB->ffid | ||
| 1561 | | xori TMP2, TMP1, FRAME_VARG | ||
| 1562 | | cmpwi cr1, NARGS8:RC, 0 | ||
| 1563 | | bne >7 | ||
| 1564 | |1: | ||
| 1565 | | stw LFUNC:RB, FRAME_FUNC(BASE) // Copy function down, but keep PC. | ||
| 1566 | | li TMP2, 0 | ||
| 1567 | | cmplwi cr7, TMP3, 1 // (> FF_C) Calling a fast function? | ||
| 1568 | | beq cr1, >3 | ||
| 1569 | |2: | ||
| 1570 | | addi TMP3, TMP2, 8 | ||
| 1571 | | evlddx TMP0, RA, TMP2 | ||
| 1572 | | cmpw cr1, TMP3, NARGS8:RC | ||
| 1573 | | evstddx TMP0, BASE, TMP2 | ||
| 1574 | | mr TMP2, TMP3 | ||
| 1575 | | bne cr1, <2 | ||
| 1576 | |3: | ||
| 1577 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+gt | ||
| 1578 | | beq >5 | ||
| 1579 | |4: | ||
| 1580 | | ins_callt | ||
| 1581 | | | ||
| 1582 | |5: // Tailcall to a fast function with a Lua frame below. | ||
| 1583 | | lwz INS, -4(TMP1) | ||
| 1584 | | decode_RA8 RA, INS | ||
| 1585 | | sub TMP1, BASE, RA | ||
| 1586 | | lwz LFUNC:TMP1, FRAME_FUNC(TMP1) | ||
| 1587 | | lwz TMP1, LFUNC:TMP1->pc | ||
| 1588 | | lwz KBASE, PC2PROTO(k)(TMP1) // Need to prepare KBASE. | ||
| 1589 | | b <4 | ||
| 1590 | | | ||
| 1591 | |7: // Tailcall from a vararg function. | ||
| 1592 | | andi. TMP0, TMP2, FRAME_TYPEP | ||
| 1593 | | bne <1 // Vararg frame below? | ||
| 1594 | | sub BASE, BASE, TMP2 // Relocate BASE down. | ||
| 1595 | | lwz TMP1, FRAME_PC(BASE) | ||
| 1596 | | andi. TMP0, TMP1, FRAME_TYPE | ||
| 1597 | | b <1 | ||
| 1545 | break; | 1598 | break; |
| 1546 | 1599 | ||
| 1547 | case BC_ITERC: | 1600 | case BC_ITERC: |
