diff options
author | Mike Pall <mike> | 2011-04-04 01:47:23 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-04-04 01:47:23 +0200 |
commit | 81fa9e34cd5df0a4367f24a717cf6c428be56667 (patch) | |
tree | 977c5e04453d0be0b84ac00a6c6a1e584a53d59f /src | |
parent | 85fff386ef3fcbc50978ab6f79da3f13fece11c1 (diff) | |
download | luajit-81fa9e34cd5df0a4367f24a717cf6c428be56667.tar.gz luajit-81fa9e34cd5df0a4367f24a717cf6c428be56667.tar.bz2 luajit-81fa9e34cd5df0a4367f24a717cf6c428be56667.zip |
ARM: Add call and iterator call instructions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_arm.dasc | 124 |
1 files changed, 118 insertions, 6 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index e4672157..8b345f8f 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
@@ -1223,10 +1223,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1223 | /* -- Calls and vararg handling ----------------------------------------- */ | 1223 | /* -- Calls and vararg handling ----------------------------------------- */ |
1224 | 1224 | ||
1225 | case BC_CALLM: | 1225 | case BC_CALLM: |
1226 | | NYI | 1226 | | // RA = base*8, (RB = nresults+1,) RC = extra_nargs |
1227 | | ldr CARG1, SAVE_MULTRES | ||
1228 | | decode_RC8 NARGS8:RC, INS | ||
1229 | | add NARGS8:RC, NARGS8:RC, CARG1 | ||
1230 | | b ->BC_CALL_Z | ||
1227 | break; | 1231 | break; |
1228 | case BC_CALL: | 1232 | case BC_CALL: |
1229 | | NYI | 1233 | | // RA = base*8, (RB = nresults+1,) RC = nargs+1 |
1234 | | decode_RC8 NARGS8:RC, INS | ||
1235 | |->BC_CALL_Z: | ||
1236 | | mov RB, BASE // Save old BASE for vmeta_call. | ||
1237 | | ldrd CARG34, [BASE, RA]! | ||
1238 | | sub NARGS8:RC, NARGS8:RC, #8 | ||
1239 | | add BASE, BASE, #8 | ||
1240 | | checkfunc CARG4, ->vmeta_call | ||
1241 | | ins_call | ||
1230 | break; | 1242 | break; |
1231 | 1243 | ||
1232 | case BC_CALLMT: | 1244 | case BC_CALLMT: |
@@ -1237,15 +1249,104 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1237 | break; | 1249 | break; |
1238 | 1250 | ||
1239 | case BC_ITERC: | 1251 | case BC_ITERC: |
1240 | | NYI | 1252 | | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1)) |
1253 | | add RA, BASE, RA | ||
1254 | | mov RB, BASE // Save old BASE for vmeta_call. | ||
1255 | | ldrd CARG34, [RA, #-16] | ||
1256 | | ldrd CARG12, [RA, #-8] | ||
1257 | | add BASE, RA, #8 | ||
1258 | | strd CARG34, [RA, #8] // Copy state. | ||
1259 | | strd CARG12, [RA, #16] // Copy control var. | ||
1260 | | // STALL: locked CARG34. | ||
1261 | | ldrd LFUNC:CARG34, [RA, #-24] | ||
1262 | | mov NARGS8:RC, #16 // Iterators get 2 arguments. | ||
1263 | | // STALL: load CARG34. | ||
1264 | | strd LFUNC:CARG34, [RA] // Copy callable. | ||
1265 | | checkfunc CARG4, ->vmeta_call | ||
1266 | | ins_call | ||
1241 | break; | 1267 | break; |
1242 | 1268 | ||
1243 | case BC_ITERN: | 1269 | case BC_ITERN: |
1244 | | NYI | 1270 | | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1)) |
1271 | #if LJ_HASJIT | ||
1272 | | // NYI: add hotloop, record BC_ITERN. | ||
1273 | #endif | ||
1274 | | add RA, BASE, RA | ||
1275 | | ldr TAB:RB, [RA, #-16] | ||
1276 | | ldr CARG1, [RA, #-8] // Get index from control var. | ||
1277 | | ldr INS, TAB:RB->asize | ||
1278 | | ldr CARG2, TAB:RB->array | ||
1279 | | add PC, PC, #4 | ||
1280 | |1: // Traverse array part. | ||
1281 | | subs RC, CARG1, INS | ||
1282 | | add CARG3, CARG2, CARG1, lsl #3 | ||
1283 | | bhs >5 // Index points after array part? | ||
1284 | | ldrd CARG34, [CARG3] | ||
1285 | | checktp CARG4, LJ_TNIL | ||
1286 | | addeq CARG1, CARG1, #1 // Skip holes in array part. | ||
1287 | | beq <1 | ||
1288 | | ldrh RC, [PC, #-2] | ||
1289 | | mvn CARG2, #~LJ_TISNUM | ||
1290 | | strd CARG34, [RA, #8] | ||
1291 | | add RC, PC, RC, lsl #2 | ||
1292 | | add RB, CARG1, #1 | ||
1293 | | strd CARG12, [RA] | ||
1294 | | sub PC, RC, #0x20000 | ||
1295 | | str RB, [RA, #-8] // Update control var. | ||
1296 | |3: | ||
1297 | | ins_next | ||
1298 | | | ||
1299 | |5: // Traverse hash part. | ||
1300 | | ldr CARG4, TAB:RB->hmask | ||
1301 | | ldr NODE:RB, TAB:RB->node | ||
1302 | |6: | ||
1303 | | add CARG1, RC, RC, lsl #1 | ||
1304 | | cmp RC, CARG4 // End of iteration? Branch to ITERL+1. | ||
1305 | | add NODE:CARG3, NODE:RB, CARG1, lsl #3 // node = tab->node + idx*3*8 | ||
1306 | | bhi <3 | ||
1307 | | ldrd CARG12, NODE:CARG3->val | ||
1308 | | checktp CARG2, LJ_TNIL | ||
1309 | | add RC, RC, #1 | ||
1310 | | beq <6 // Skip holes in hash part. | ||
1311 | | ldrh RB, [PC, #-2] | ||
1312 | | add RC, RC, INS | ||
1313 | | ldrd CARG34, NODE:CARG3->key | ||
1314 | | str RC, [RA, #-8] // Update control var. | ||
1315 | | strd CARG12, [RA, #8] | ||
1316 | | add RC, PC, RB, lsl #2 | ||
1317 | | sub PC, RC, #0x20000 | ||
1318 | | strd CARG34, [RA] | ||
1319 | | b <3 | ||
1245 | break; | 1320 | break; |
1246 | 1321 | ||
1247 | case BC_ISNEXT: | 1322 | case BC_ISNEXT: |
1248 | | NYI | 1323 | | // RA = base*8, RD = target (points to ITERN) |
1324 | | add RA, BASE, RA | ||
1325 | | add RC, PC, RC, lsl #2 | ||
1326 | | ldrd CFUNC:CARG12, [RA, #-24] | ||
1327 | | ldr CARG3, [RA, #-12] | ||
1328 | | ldr CARG4, [RA, #-4] | ||
1329 | | checktp CARG2, LJ_TFUNC | ||
1330 | | ldrbeq CARG1, CFUNC:CARG1->ffid | ||
1331 | | checktpeq CARG3, LJ_TTAB | ||
1332 | | checktpeq CARG4, LJ_TNIL | ||
1333 | | cmpeq CARG1, #FF_next_N | ||
1334 | | subeq PC, RC, #0x20000 | ||
1335 | | bne >5 | ||
1336 | | ins_next1 | ||
1337 | | ins_next2 | ||
1338 | | mov CARG1, #0 | ||
1339 | | str CARG1, [RA, #-8] // Initialize control var. | ||
1340 | |1: | ||
1341 | | ins_next3 | ||
1342 | |5: // Despecialize bytecode if any of the checks fail. | ||
1343 | | mov CARG1, #BC_JMP | ||
1344 | | mov OP, #BC_ITERC | ||
1345 | | strb CARG1, [PC, #-4] | ||
1346 | | sub PC, RC, #0x20000 | ||
1347 | | strb OP, [PC] // Subsumes ins_next1. | ||
1348 | | ins_next2 | ||
1349 | | b <1 | ||
1249 | break; | 1350 | break; |
1250 | 1351 | ||
1251 | case BC_VARG: | 1352 | case BC_VARG: |
@@ -1490,7 +1591,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
1490 | break; | 1591 | break; |
1491 | #endif | 1592 | #endif |
1492 | case BC_IITERL: | 1593 | case BC_IITERL: |
1493 | | NYI | 1594 | | // RA = base*8, RC = target |
1595 | | ldrd CARG12, [RA, BASE]! | ||
1596 | if (op == BC_JITERL) { | ||
1597 | | NYI | ||
1598 | } else { | ||
1599 | | add RC, PC, RC, lsl #2 | ||
1600 | | // STALL: load CARG12. | ||
1601 | | cmn CARG2, #-LJ_TNIL // Stop if iterator returned nil. | ||
1602 | | subne PC, RC, #0x20000 // Otherwise save control var + branch. | ||
1603 | | strdne CARG12, [RA, #-8] | ||
1604 | } | ||
1605 | | ins_next | ||
1494 | break; | 1606 | break; |
1495 | 1607 | ||
1496 | case BC_LOOP: | 1608 | case BC_LOOP: |