aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.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_arm.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_arm.dasc')
-rw-r--r--src/vm_arm.dasc28
1 files changed, 11 insertions, 17 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index 35ba0e36..0e80bf00 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -1111,24 +1111,18 @@ static void build_subroutines(BuildCtx *ctx)
1111 | checktab CARG2, ->fff_fallback 1111 | checktab CARG2, ->fff_fallback
1112 | strd CARG34, [BASE, NARGS8:RC] // Set missing 2nd arg to nil. 1112 | strd CARG34, [BASE, NARGS8:RC] // Set missing 2nd arg to nil.
1113 | ldr PC, [BASE, FRAME_PC] 1113 | ldr PC, [BASE, FRAME_PC]
1114 | mov CARG2, CARG1 1114 | add CARG2, BASE, #8
1115 | str BASE, L->base // Add frame since C call can throw. 1115 | sub CARG3, BASE, #8
1116 | mov CARG1, L 1116 | bl extern lj_tab_next // (GCtab *t, cTValue *key, TValue *o)
1117 | str BASE, L->top // Dummy frame length is ok. 1117 | // Returns 1=found, 0=end, -1=error.
1118 | add CARG3, BASE, #8
1119 | str PC, SAVE_PC
1120 | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key)
1121 | // Returns 0 at end of traversal.
1122 | .IOS ldr BASE, L->base 1118 | .IOS ldr BASE, L->base
1123 | cmp CRET1, #0 1119 | cmp CRET1, #0
1124 | mvneq CRET2, #~LJ_TNIL 1120 | mov RC, #(2+1)*8
1125 | beq ->fff_restv // End of traversal: return nil. 1121 | bgt ->fff_res // Found key/value.
1126 | ldrd CARG12, [BASE, #8] // Copy key and value to results. 1122 | bmi ->fff_fallback // Invalid key.
1127 | ldrd CARG34, [BASE, #16] 1123 | // End of traversal: return nil.
1128 | mov RC, #(2+1)*8 1124 | mvn CRET2, #~LJ_TNIL
1129 | strd CARG12, [BASE, #-8] 1125 | b ->fff_restv
1130 | strd CARG34, [BASE]
1131 | b ->fff_res
1132 | 1126 |
1133 |.ffunc_1 pairs 1127 |.ffunc_1 pairs
1134 | checktab CARG2, ->fff_fallback 1128 | checktab CARG2, ->fff_fallback
@@ -3989,7 +3983,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3989 | ins_next1 3983 | ins_next1
3990 | ins_next2 3984 | ins_next2
3991 | mov CARG1, #0 3985 | mov CARG1, #0
3992 | mvn CARG2, #0x00018000 3986 | mvn CARG2, #~LJ_KEYINDEX
3993 | strd CARG1, [RA, #-8] // Initialize control var. 3987 | strd CARG1, [RA, #-8] // Initialize control var.
3994 |1: 3988 |1:
3995 | ins_next3 3989 | ins_next3