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_arm.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_arm.dasc')
-rw-r--r-- | src/vm_arm.dasc | 28 |
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 |