aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-06 16:17:07 +0200
committerMike Pall <mike>2010-10-06 16:17:07 +0200
commitb4f3d4525e35939865f4f0e61940a022f19b78ae (patch)
treee409699db9f3f9d5d08d4ad0e198cfd07ee1e612 /src
parent82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f (diff)
downloadluajit-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.dasc96
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 |