aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-04 01:47:23 +0200
committerMike Pall <mike>2011-04-04 01:47:23 +0200
commit81fa9e34cd5df0a4367f24a717cf6c428be56667 (patch)
tree977c5e04453d0be0b84ac00a6c6a1e584a53d59f /src
parent85fff386ef3fcbc50978ab6f79da3f13fece11c1 (diff)
downloadluajit-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.dasc124
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: