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 /src | |
| parent | b4f3d4525e35939865f4f0e61940a022f19b78ae (diff) | |
| download | luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.gz luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.tar.bz2 luajit-9f14e03d6e17ea2ad6185666987e590658fb1ce4.zip | |
PPC: Add string.sub() fast function.
Diffstat (limited to 'src')
| -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 |
