diff options
author | Mike Pall <mike> | 2011-04-04 01:51:29 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-04 01:51:29 +0200 |
commit | dd4a043b78878780a4d2222cebd36a39ed051a8e (patch) | |
tree | c30be1ac0b449b7734eabf543087a27480d41a4e /src | |
parent | 0e7009ddc82c7c1e87041997de87143e6c9e46f6 (diff) | |
download | luajit-dd4a043b78878780a4d2222cebd36a39ed051a8e.tar.gz luajit-dd4a043b78878780a4d2222cebd36a39ed051a8e.tar.bz2 luajit-dd4a043b78878780a4d2222cebd36a39ed051a8e.zip |
ARM: Add table indexing with string keys. Add get global.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_arm.dasc | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 3723eeb9..cb054328 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
@@ -1226,15 +1226,70 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1226 | break; | 1226 | break; |
1227 | 1227 | ||
1228 | case BC_GGET: | 1228 | case BC_GGET: |
1229 | | // RA = dst*8, RC = str_const (~) | ||
1229 | case BC_GSET: | 1230 | case BC_GSET: |
1230 | | NYI | 1231 | | // RA = dst*8, RC = str_const (~) |
1232 | | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] | ||
1233 | | mvn RC, RC | ||
1234 | | ldr TAB:CARG1, LFUNC:CARG2->env | ||
1235 | | ldr STR:RC, [KBASE, RC, lsl #2] | ||
1236 | if (op == BC_GGET) { | ||
1237 | | b ->BC_TGETS_Z | ||
1238 | } else { | ||
1239 | | b ->BC_TSETS_Z | ||
1240 | } | ||
1231 | break; | 1241 | break; |
1232 | 1242 | ||
1233 | case BC_TGETV: | 1243 | case BC_TGETV: |
1234 | | NYI | 1244 | | NYI |
1235 | break; | 1245 | break; |
1236 | case BC_TGETS: | 1246 | case BC_TGETS: |
1237 | | NYI | 1247 | | decode_RB8 RB, INS |
1248 | | and RC, RC, #255 | ||
1249 | | // RA = dst*8, RB = table*8, RC = str_const (~) | ||
1250 | | ldrd CARG12, [BASE, RB] | ||
1251 | | mvn RC, RC | ||
1252 | | ldr STR:RC, [KBASE, RC, lsl #2] // STALL: early RC. | ||
1253 | | checktab CARG2, ->vmeta_tgets | ||
1254 | |->BC_TGETS_Z: | ||
1255 | | // (TAB:RB =) TAB:CARG1 = GCtab *, STR:RC = GCstr *, RA = dst*8 | ||
1256 | | ldr CARG3, TAB:CARG1->hmask | ||
1257 | | ldr CARG4, STR:RC->hash | ||
1258 | | ldr NODE:INS, TAB:CARG1->node | ||
1259 | | mov TAB:RB, TAB:CARG1 | ||
1260 | | and CARG3, CARG3, CARG4 // idx = str->hash & tab->hmask | ||
1261 | | add CARG3, CARG3, CARG3, lsl #1 | ||
1262 | | add NODE:INS, NODE:INS, CARG3, lsl #3 // node = tab->node + idx*3*8 | ||
1263 | |1: | ||
1264 | | ldrd CARG12, NODE:INS->key // STALL: early NODE:INS. | ||
1265 | | ldrd CARG34, NODE:INS->val | ||
1266 | | ldr NODE:INS, NODE:INS->next | ||
1267 | | cmp CARG1, STR:RC | ||
1268 | | checktpeq CARG2, LJ_TSTR | ||
1269 | | bne >4 | ||
1270 | | checktp CARG4, LJ_TNIL | ||
1271 | | beq >5 | ||
1272 | |3: | ||
1273 | | ins_next1 | ||
1274 | | ins_next2 | ||
1275 | | strd CARG34, [BASE, RA] | ||
1276 | | ins_next3 | ||
1277 | | | ||
1278 | |4: // Follow hash chain. | ||
1279 | | cmp NODE:INS, #0 | ||
1280 | | bne <1 | ||
1281 | | // End of hash chain: key not found, nil result. | ||
1282 | | | ||
1283 | |5: // Check for __index if table value is nil. | ||
1284 | | ldr TAB:CARG1, TAB:RB->metatable | ||
1285 | | mov CARG3, #0 // Optional clear of undef. value (during load stall). | ||
1286 | | mvn CARG4, #~LJ_TNIL | ||
1287 | | cmp TAB:CARG1, #0 | ||
1288 | | beq <3 // No metatable: done. | ||
1289 | | ldrb CARG2, TAB:CARG1->nomm | ||
1290 | | tst CARG2, #1<<MM_index | ||
1291 | | bne <3 // 'no __index' flag set: done. | ||
1292 | | b ->vmeta_tgets | ||
1238 | break; | 1293 | break; |
1239 | case BC_TGETB: | 1294 | case BC_TGETB: |
1240 | | NYI | 1295 | | NYI |
@@ -1244,6 +1299,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1244 | | NYI | 1299 | | NYI |
1245 | break; | 1300 | break; |
1246 | case BC_TSETS: | 1301 | case BC_TSETS: |
1302 | |->BC_TSETS_Z: | ||
1247 | | NYI | 1303 | | NYI |
1248 | break; | 1304 | break; |
1249 | case BC_TSETB: | 1305 | case BC_TSETB: |