aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-09-04 12:58:36 +0200
committerMike Pall <mike>2010-09-04 12:58:36 +0200
commit711e55bdf8b2481750b33cdbd9bc154830b6e4e8 (patch)
treed358234dac7a4a85f1e8e4117a2be783620ffb58 /src
parent684acbe93052c527f18c24ce9d17a017287d4cfa (diff)
downloadluajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.tar.gz
luajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.tar.bz2
luajit-711e55bdf8b2481750b33cdbd9bc154830b6e4e8.zip
PPC: Add tailcall instructions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc57
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: