diff options
| author | Mike Pall <mike> | 2010-10-06 16:17:07 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2010-10-06 16:17:07 +0200 |
| commit | b4f3d4525e35939865f4f0e61940a022f19b78ae (patch) | |
| tree | e409699db9f3f9d5d08d4ad0e198cfd07ee1e612 /src | |
| parent | 82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f (diff) | |
| download | luajit-b4f3d4525e35939865f4f0e61940a022f19b78ae.tar.gz luajit-b4f3d4525e35939865f4f0e61940a022f19b78ae.tar.bz2 luajit-b4f3d4525e35939865f4f0e61940a022f19b78ae.zip | |
PPC: Add string.rep/reverse/lower/upper() fast functions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_ppc.dasc | 96 |
1 files changed, 84 insertions, 12 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index e7ca7fc4..09bb1d36 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
| @@ -1431,22 +1431,94 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 1431 | |.ffunc string_sub | 1431 | |.ffunc string_sub |
| 1432 | | NYI | 1432 | | NYI |
| 1433 | | | 1433 | | |
| 1434 | |->fff_emptystr: // Range underflow. | 1434 | |.ffunc string_rep // Only handle the 1-char case inline. |
| 1435 | | NYI | 1435 | | ffgccheck |
| 1436 | | | 1436 | | cmplwi NARGS8:RC, 16 |
| 1437 | |.ffunc_2 string_rep // Only handle the 1-char case inline. | 1437 | | evldd CARG1, 0(BASE) |
| 1438 | | NYI | 1438 | | evldd CARG2, 8(BASE) |
| 1439 | | blt ->fff_fallback | ||
| 1440 | | checknum CARG2 | ||
| 1441 | | checkfail ->fff_fallback | ||
| 1442 | | checkstr STR:CARG1 | ||
| 1443 | | efdctsiz CARG3, CARG2 | ||
| 1444 | | checkfail ->fff_fallback | ||
| 1445 | | lwz TMP0, STR:CARG1->len | ||
| 1446 | | cmpwi CARG3, 0 | ||
| 1447 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | ||
| 1448 | | ble >2 // Count <= 0? (or non-int) | ||
| 1449 | | cmplwi TMP0, 1 | ||
| 1450 | | subi TMP2, CARG3, 1 | ||
| 1451 | | blt >2 // Zero length string? | ||
| 1452 | | cmplw cr1, TMP1, CARG3 | ||
| 1453 | | bne ->fff_fallback // Fallback for > 1-char strings. | ||
| 1454 | | lbz TMP0, STR:CARG1[1] | ||
| 1455 | | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
| 1456 | | blt cr1, ->fff_fallback | ||
| 1457 | |1: // Fill buffer with char. Yes, this is suboptimal code (do you care?). | ||
| 1458 | | cmplwi TMP2, 0 | ||
| 1459 | | stbx TMP0, CARG2, TMP2 | ||
| 1460 | | subi TMP2, TMP2, 1 | ||
| 1461 | | bne <1 | ||
| 1462 | | b ->fff_newstr | ||
| 1463 | |2: // Return empty string. | ||
| 1464 | | la STR:CRET1, DISPATCH_GL(strempty)(DISPATCH) | ||
| 1465 | | evmergelo CRET1, TISSTR, STR:CRET1 | ||
| 1466 | | b ->fff_restv | ||
| 1439 | | | 1467 | | |
| 1440 | |.ffunc_1 string_reverse | 1468 | |.ffunc string_reverse |
| 1441 | | NYI | 1469 | | ffgccheck |
| 1470 | | cmplwi NARGS8:RC, 8 | ||
| 1471 | | evldd CARG1, 0(BASE) | ||
| 1472 | | blt ->fff_fallback | ||
| 1473 | | checkstr STR:CARG1 | ||
| 1474 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | ||
| 1475 | | checkfail ->fff_fallback | ||
| 1476 | | lwz CARG3, STR:CARG1->len | ||
| 1477 | | la CARG1, #STR(STR:CARG1) | ||
| 1478 | | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
| 1479 | | li TMP2, 0 | ||
| 1480 | | cmplw TMP1, CARG3 | ||
| 1481 | | subi TMP3, CARG3, 1 | ||
| 1482 | | blt ->fff_fallback | ||
| 1483 | |1: // Reverse string copy. | ||
| 1484 | | cmpwi TMP3, 0 | ||
| 1485 | | lbzx TMP1, CARG1, TMP2 | ||
| 1486 | | blt ->fff_newstr | ||
| 1487 | | stbx TMP1, CARG2, TMP3 | ||
| 1488 | | subi TMP3, TMP3, 1 | ||
| 1489 | | addi TMP2, TMP2, 1 | ||
| 1490 | | b <1 | ||
| 1442 | | | 1491 | | |
| 1443 | |.macro ffstring_case, name, lo, hi | 1492 | |.macro ffstring_case, name, lo |
| 1444 | | .ffunc_1 name | 1493 | | .ffunc name |
| 1445 | | NYI | 1494 | | ffgccheck |
| 1495 | | cmplwi NARGS8:RC, 8 | ||
| 1496 | | evldd CARG1, 0(BASE) | ||
| 1497 | | blt ->fff_fallback | ||
| 1498 | | checkstr STR:CARG1 | ||
| 1499 | | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) | ||
| 1500 | | checkfail ->fff_fallback | ||
| 1501 | | lwz CARG3, STR:CARG1->len | ||
| 1502 | | la CARG1, #STR(STR:CARG1) | ||
| 1503 | | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) | ||
| 1504 | | cmplw TMP1, CARG3 | ||
| 1505 | | li TMP2, 0 | ||
| 1506 | | blt ->fff_fallback | ||
| 1507 | |1: // ASCII case conversion. | ||
| 1508 | | cmplw TMP2, CARG3 | ||
| 1509 | | lbzx TMP1, CARG1, TMP2 | ||
| 1510 | | bge ->fff_newstr | ||
| 1511 | | subi TMP0, TMP1, lo | ||
| 1512 | | xori TMP3, TMP1, 0x20 | ||
| 1513 | | cmplwi TMP0, 26 | ||
| 1514 | | isellt TMP1, TMP3, TMP1 | ||
| 1515 | | stbx TMP1, CARG2, TMP2 | ||
| 1516 | | addi TMP2, TMP2, 1 | ||
| 1517 | | b <1 | ||
| 1446 | |.endmacro | 1518 | |.endmacro |
| 1447 | | | 1519 | | |
| 1448 | |ffstring_case string_lower, 0x41, 0x5a | 1520 | |ffstring_case string_lower, 0x41 |
| 1449 | |ffstring_case string_upper, 0x61, 0x7a | 1521 | |ffstring_case string_upper, 0x61 |
| 1450 | | | 1522 | | |
| 1451 | |//-- Table library ------------------------------------------------------ | 1523 | |//-- Table library ------------------------------------------------------ |
| 1452 | | | 1524 | | |
