aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-06 16:11:02 +0200
committerMike Pall <mike>2010-10-06 16:11:02 +0200
commit82b2f6156a0fc15029ae9c65a7751c5b4f7ff29f (patch)
tree54f36c0427699f47194338f5646d0b473445ae00 /src
parent443d28bc9ab50a7e1659f6de5c0cbd645e3614a0 (diff)
downloadluajit-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.dasc47
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