aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-06 16:18:24 +0200
committerMike Pall <mike>2010-10-06 16:18:24 +0200
commit9f14e03d6e17ea2ad6185666987e590658fb1ce4 (patch)
treecd6e6c3a05da53ddd7b261476d33fc96f6375c34
parentb4f3d4525e35939865f4f0e61940a022f19b78ae (diff)
downloadluajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.gz
luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.bz2
luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.zip
PPC: Add string.sub() fast function.
-rw-r--r--src/buildvm_ppc.dasc46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index 09bb1d36..b393b75c 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -1429,7 +1429,51 @@ static void build_subroutines(BuildCtx *ctx)
1429 | b ->fff_restv 1429 | b ->fff_restv
1430 | 1430 |
1431 |.ffunc string_sub 1431 |.ffunc string_sub
1432 | NYI 1432 | ffgccheck
1433 | cmplwi NARGS8:RC, 16
1434 | evldd CARG3, 16(BASE)
1435 | evldd STR:CARG1, 0(BASE)
1436 | blt ->fff_fallback
1437 | evldd CARG2, 8(BASE)
1438 | li TMP2, -1
1439 | beq >1
1440 | checknum CARG3
1441 | checkfail ->fff_fallback
1442 | efdctsiz TMP2, CARG3
1443 |1:
1444 | checknum CARG2
1445 | checkfail ->fff_fallback
1446 | checkstr STR:CARG1
1447 | efdctsiz TMP1, CARG2
1448 | checkfail ->fff_fallback
1449 | lwz TMP0, STR:CARG1->len
1450 | cmplw TMP0, TMP2 // len < end? (unsigned compare)
1451 | add TMP3, TMP2, TMP0
1452 | blt >5
1453 |2:
1454 | cmpwi TMP1, 0 // start <= 0?
1455 | add TMP3, TMP1, TMP0
1456 | ble >7
1457 |3:
1458 | sub. CARG3, TMP2, TMP1
1459 | addi CARG2, STR:CARG1, #STR-1
1460 | addi CARG3, CARG3, 1
1461 | add CARG2, CARG2, TMP1
1462 | isellt CARG3, r0, CARG3
1463 | b ->fff_newstr
1464 |
1465 |5: // Negative end or overflow.
1466 | cmpw TMP0, TMP2
1467 | addi TMP3, TMP3, 1
1468 | iselgt TMP2, TMP3, TMP0 // end = end > len ? len : end+len+1
1469 | b <2
1470 |
1471 |7: // Negative start or underflow.
1472 | cmpwi cr1, TMP3, 0
1473 | iseleq TMP1, r0, TMP3
1474 | isel TMP1, r0, TMP1, 4*cr1+lt
1475 | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0)
1476 | b <3
1433 | 1477 |
1434 |.ffunc string_rep // Only handle the 1-char case inline. 1478 |.ffunc string_rep // Only handle the 1-char case inline.
1435 | ffgccheck 1479 | ffgccheck