diff options
author | Mike Pall <mike> | 2021-09-19 17:38:49 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2021-09-19 17:38:49 +0200 |
commit | c6f5ef649b645db9cf3d11d1b5c63602c49c6411 (patch) | |
tree | 4d299528ff4e77c2f9059b8e24c50755ff638d2d /src/vm_ppc.dasc | |
parent | 4e0ea654a81e68b1bcd20ddc2026ff1bc9288b84 (diff) | |
download | luajit-c6f5ef649b645db9cf3d11d1b5c63602c49c6411.tar.gz luajit-c6f5ef649b645db9cf3d11d1b5c63602c49c6411.tar.bz2 luajit-c6f5ef649b645db9cf3d11d1b5c63602c49c6411.zip |
Refactor table traversal.
Sponsored by OpenResty Inc.
Diffstat (limited to 'src/vm_ppc.dasc')
-rw-r--r-- | src/vm_ppc.dasc | 49 |
1 files changed, 15 insertions, 34 deletions
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 6aa00c5b..d4133a65 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -1559,43 +1559,24 @@ static void build_subroutines(BuildCtx *ctx) | |||
1559 | | | 1559 | | |
1560 | |//-- Base library: iterators ------------------------------------------- | 1560 | |//-- Base library: iterators ------------------------------------------- |
1561 | | | 1561 | | |
1562 | |.ffunc next | 1562 | |.ffunc_1 next |
1563 | | cmplwi NARGS8:RC, 8 | ||
1564 | | lwz CARG1, 0(BASE) | ||
1565 | | lwz TAB:CARG2, 4(BASE) | ||
1566 | | blt ->fff_fallback | ||
1567 | | stwx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. | 1563 | | stwx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. |
1568 | | checktab CARG1 | 1564 | | checktab CARG3 |
1569 | | lwz PC, FRAME_PC(BASE) | 1565 | | lwz PC, FRAME_PC(BASE) |
1570 | | bne ->fff_fallback | 1566 | | bne ->fff_fallback |
1571 | | stp BASE, L->base // Add frame since C call can throw. | 1567 | | la CARG2, 8(BASE) |
1572 | | mr CARG1, L | 1568 | | la CARG3, -8(BASE) |
1573 | | stp BASE, L->top // Dummy frame length is ok. | 1569 | | bl extern lj_tab_next // (GCtab *t, cTValue *key, TValue *o) |
1574 | | la CARG3, 8(BASE) | 1570 | | // Returns 1=found, 0=end, -1=error. |
1575 | | stw PC, SAVE_PC | 1571 | | cmpwi CRET1, 0 |
1576 | | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) | ||
1577 | | // Returns 0 at end of traversal. | ||
1578 | | cmplwi CRET1, 0 | ||
1579 | | li CARG3, LJ_TNIL | ||
1580 | | beq ->fff_restv // End of traversal: return nil. | ||
1581 | | la RA, -8(BASE) | 1572 | | la RA, -8(BASE) |
1582 | |.if FPU | ||
1583 | | lfd f0, 8(BASE) // Copy key and value to results. | ||
1584 | | lfd f1, 16(BASE) | ||
1585 | | stfd f0, 0(RA) | ||
1586 | | stfd f1, 8(RA) | ||
1587 | |.else | ||
1588 | | lwz CARG1, 8(BASE) | ||
1589 | | lwz CARG2, 12(BASE) | ||
1590 | | lwz CARG3, 16(BASE) | ||
1591 | | lwz CARG4, 20(BASE) | ||
1592 | | stw CARG1, 0(RA) | ||
1593 | | stw CARG2, 4(RA) | ||
1594 | | stw CARG3, 8(RA) | ||
1595 | | stw CARG4, 12(RA) | ||
1596 | |.endif | ||
1597 | | li RD, (2+1)*8 | 1573 | | li RD, (2+1)*8 |
1598 | | b ->fff_res | 1574 | | bgt ->fff_res // Found key/value. |
1575 | | li CARG3, LJ_TNIL | ||
1576 | | beq ->fff_restv // End of traversal: return nil. | ||
1577 | | lwz CFUNC:RB, FRAME_FUNC(BASE) | ||
1578 | | li NARGS8:RC, 2*8 | ||
1579 | | b ->fff_fallback // Invalid key. | ||
1599 | | | 1580 | | |
1600 | |.ffunc_1 pairs | 1581 | |.ffunc_1 pairs |
1601 | | checktab CARG3 | 1582 | | checktab CARG3 |
@@ -5251,8 +5232,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
5251 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq | 5232 | | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq |
5252 | | add TMP3, PC, TMP0 | 5233 | | add TMP3, PC, TMP0 |
5253 | | bne cr0, >5 | 5234 | | bne cr0, >5 |
5254 | | lus TMP1, 0xfffe | 5235 | | lus TMP1, (LJ_KEYINDEX >> 16) |
5255 | | ori TMP1, TMP1, 0x7fff | 5236 | | ori TMP1, TMP1, (LJ_KEYINDEX & 0xffff) |
5256 | | stw ZERO, -4(RA) // Initialize control var. | 5237 | | stw ZERO, -4(RA) // Initialize control var. |
5257 | | stw TMP1, -8(RA) | 5238 | | stw TMP1, -8(RA) |
5258 | | addis PC, TMP3, -(BCBIAS_J*4 >> 16) | 5239 | | addis PC, TMP3, -(BCBIAS_J*4 >> 16) |