aboutsummaryrefslogtreecommitdiff
path: root/src/vm_ppc.dasc
diff options
context:
space:
mode:
authorMike Pall <mike>2021-09-19 17:38:49 +0200
committerMike Pall <mike>2021-09-19 17:38:49 +0200
commitc6f5ef649b645db9cf3d11d1b5c63602c49c6411 (patch)
tree4d299528ff4e77c2f9059b8e24c50755ff638d2d /src/vm_ppc.dasc
parent4e0ea654a81e68b1bcd20ddc2026ff1bc9288b84 (diff)
downloadluajit-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.dasc49
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)