diff options
author | Mike Pall <mike> | 2010-09-03 21:02:55 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-09-03 21:02:55 +0200 |
commit | 684acbe93052c527f18c24ce9d17a017287d4cfa (patch) | |
tree | 809f5e9665e9d0735695ff597bc6144837e919f2 /src | |
parent | b4c8b05ad58364291ff6c210dd4e85bb1b5eb973 (diff) | |
download | luajit-684acbe93052c527f18c24ce9d17a017287d4cfa.tar.gz luajit-684acbe93052c527f18c24ce9d17a017287d4cfa.tar.bz2 luajit-684acbe93052c527f18c24ce9d17a017287d4cfa.zip |
PPC: Add call and iterator call instructions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 647fe387..3947cc30 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -1520,10 +1520,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1520 | /* -- Calls and vararg handling ----------------------------------------- */ | 1520 | /* -- Calls and vararg handling ----------------------------------------- */ |
1521 | 1521 | ||
1522 | case BC_CALLM: | 1522 | case BC_CALLM: |
1523 | | NYI | 1523 | | // RA = base*8, (RB = (nresults+1)*8,) RC = extra_nargs*8 |
1524 | | lwz TMP0, SAVE_MULTRES | ||
1525 | | add NARGS8:RC, NARGS8:RC, TMP0 | ||
1526 | | // Fall through. Assumes BC_CALL follows. | ||
1524 | break; | 1527 | break; |
1525 | case BC_CALL: | 1528 | case BC_CALL: |
1526 | | NYI | 1529 | | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 |
1530 | | evlddx LFUNC:RB, BASE, RA | ||
1531 | | mr TMP2, BASE | ||
1532 | | add BASE, BASE, RA | ||
1533 | | subi NARGS8:RC, NARGS8:RC, 8 | ||
1534 | | checkfunc LFUNC:RB | ||
1535 | | addi BASE, BASE, 8 | ||
1536 | | checkfail ->vmeta_call | ||
1537 | | ins_call | ||
1527 | break; | 1538 | break; |
1528 | 1539 | ||
1529 | case BC_CALLMT: | 1540 | case BC_CALLMT: |
@@ -1534,7 +1545,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1534 | break; | 1545 | break; |
1535 | 1546 | ||
1536 | case BC_ITERC: | 1547 | case BC_ITERC: |
1537 | | NYI | 1548 | | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 ((2+1)*8) |
1549 | | subi RA, RA, 24 // evldd doesn't support neg. offsets. | ||
1550 | | mr TMP2, BASE | ||
1551 | | evlddx LFUNC:RB, BASE, RA | ||
1552 | | add BASE, BASE, RA | ||
1553 | | evldd TMP0, 8(BASE) | ||
1554 | | evldd TMP1, 16(BASE) | ||
1555 | | evstdd LFUNC:RB, 24(BASE) // Copy callable. | ||
1556 | | checkfunc LFUNC:RB | ||
1557 | | evstdd TMP0, 32(BASE) // Copy state. | ||
1558 | | li NARGS8:RC, 16 // Iterators get 2 arguments. | ||
1559 | | evstdd TMP1, 40(BASE) // Copy control var. | ||
1560 | | addi BASE, BASE, 32 | ||
1561 | | checkfail ->vmeta_call | ||
1562 | | ins_call | ||
1538 | break; | 1563 | break; |
1539 | 1564 | ||
1540 | case BC_VARG: | 1565 | case BC_VARG: |