aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-04 01:51:29 +0200
committerMike Pall <mike>2011-04-04 01:51:29 +0200
commitdd4a043b78878780a4d2222cebd36a39ed051a8e (patch)
treec30be1ac0b449b7734eabf543087a27480d41a4e /src
parent0e7009ddc82c7c1e87041997de87143e6c9e46f6 (diff)
downloadluajit-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.dasc60
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: