diff options
author | Mike Pall <mike> | 2010-10-06 16:11:02 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-06 16:11:02 +0200 |
commit | 82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f (patch) | |
tree | 54f36c0427699f47194338f5646d0b473445ae00 /src | |
parent | 443d28bc9ab50a7e1659f6de5c0cbd645e3614a0 (diff) | |
download | luajit-82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f.tar.gz luajit-82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f.tar.bz2 luajit-82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f.zip |
PPC: Add string.len/byte/char() fast functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index f7a9bee3..e7ca7fc4 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -907,6 +907,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
907 | | checkanyfail ->fff_fallback | 907 | | checkanyfail ->fff_fallback |
908 | |.endmacro | 908 | |.endmacro |
909 | | | 909 | | |
910 | |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1. | ||
910 | |.macro ffgccheck | 911 | |.macro ffgccheck |
911 | | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) | 912 | | lwz TMP0, DISPATCH_GL(gc.total)(DISPATCH) |
912 | | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) | 913 | | lwz TMP1, DISPATCH_GL(gc.threshold)(DISPATCH) |
@@ -1380,16 +1381,52 @@ static void build_subroutines(BuildCtx *ctx) | |||
1380 | |//-- String library ----------------------------------------------------- | 1381 | |//-- String library ----------------------------------------------------- |
1381 | | | 1382 | | |
1382 | |.ffunc_1 string_len | 1383 | |.ffunc_1 string_len |
1383 | | NYI | 1384 | | checkstr STR:CARG1 |
1385 | | checkfail ->fff_fallback | ||
1386 | | lwz TMP0, STR:CARG1->len | ||
1387 | | efdcfsi CRET1, TMP0 | ||
1388 | | b ->fff_restv | ||
1384 | | | 1389 | | |
1385 | |.ffunc string_byte // Only handle the 1-arg case here. | 1390 | |.ffunc string_byte // Only handle the 1-arg case here. |
1386 | | NYI | 1391 | | cmplwi NARGS8:RC, 8 |
1392 | | evldd STR:CARG1, 0(BASE) | ||
1393 | | bne ->fff_fallback // Need exactly 1 argument. | ||
1394 | | checkstr STR:CARG1 | ||
1395 | | la RA, -8(BASE) | ||
1396 | | checkfail ->fff_fallback | ||
1397 | | lwz TMP0, STR:CARG1->len | ||
1398 | | li RD, (0+1)*8 | ||
1399 | | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). | ||
1400 | | li TMP2, (1+1)*8 | ||
1401 | | cmplwi TMP0, 0 | ||
1402 | | lwz PC, FRAME_PC(BASE) | ||
1403 | | efdcfsi CRET1, TMP1 | ||
1404 | | iseleq RD, RD, TMP2 | ||
1405 | | evstdd CRET1, 0(RA) | ||
1406 | | b ->fff_res | ||
1387 | | | 1407 | | |
1388 | |.ffunc string_char // Only handle the 1-arg case here. | 1408 | |.ffunc string_char // Only handle the 1-arg case here. |
1389 | | NYI | 1409 | | ffgccheck |
1390 | | | 1410 | | cmplwi NARGS8:RC, 8 |
1411 | | evldd CARG1, 0(BASE) | ||
1412 | | bne ->fff_fallback // Exactly 1 argument. | ||
1413 | | checknum CARG1 | ||
1414 | | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) | ||
1415 | | checkfail ->fff_fallback | ||
1416 | | efdctsiz TMP0, CARG1 | ||
1417 | | li CARG3, 1 | ||
1418 | | cmplwi TMP0, 255 | ||
1419 | | stb TMP0, 0(CARG2) | ||
1420 | | bgt ->fff_fallback | ||
1391 | |->fff_newstr: | 1421 | |->fff_newstr: |
1392 | | NYI | 1422 | | mr CARG1, L |
1423 | | stw BASE, L->base | ||
1424 | | stw PC, SAVE_PC | ||
1425 | | bl extern lj_str_new // (lua_State *L, char *str, size_t l) | ||
1426 | | // Returns GCstr *. | ||
1427 | | lwz BASE, L->base | ||
1428 | | evmergelo STR:CRET1, TISSTR, STR:CRET1 | ||
1429 | | b ->fff_restv | ||
1393 | | | 1430 | | |
1394 | |.ffunc string_sub | 1431 | |.ffunc string_sub |
1395 | | NYI | 1432 | | NYI |