diff options
author | Mike Pall <mike> | 2010-09-04 12:58:36 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-04 12:58:36 +0200 |
commit | 711e55bdf8b2481750b33cdbd9bc154830b6e4e8 (patch) | |
tree | d358234dac7a4a85f1e8e4117a2be783620ffb58 /src | |
parent | 684acbe93052c527f18c24ce9d17a017287d4cfa (diff) | |
download | luajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.tar.gz luajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.tar.bz2 luajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.zip |
PPC: Add tailcall instructions.
Diffstat (limited to 'src')
-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: |