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