diff options
author | Mike Pall <mike> | 2010-10-06 16:18:24 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-06 16:18:24 +0200 |
commit | 9f14e03d6e17ea2ad6185666987e590658fb1ce4 (patch) | |
tree | cd6e6c3a05da53ddd7b261476d33fc96f6375c34 | |
parent | b4f3d4525e35939865f4f0e61940a022f19b78ae (diff) | |
download | luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.gz luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.bz2 luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.zip |
PPC: Add string.sub() fast function.
-rw-r--r-- | src/buildvm_ppc.dasc | 46 |
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 |