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 | | |