diff options
author | Mike Pall <mike> | 2010-10-01 23:45:56 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-01 23:45:56 +0200 |
commit | 05099f07642874dd9375259cb7c7e87ba68a4581 (patch) | |
tree | 7a1e4be52fc124351e0a469cd77d756fcaeb3205 | |
parent | 61d498be87c548142473e471abc6943bcf38d03e (diff) | |
download | luajit-05099f07642874dd9375259cb7c7e87ba68a4581.tar.gz luajit-05099f07642874dd9375259cb7c7e87ba68a4581.tar.bz2 luajit-05099f07642874dd9375259cb7c7e87ba68a4581.zip |
PPC: Add ipairs() fast function and its iterator.
-rw-r--r-- | src/buildvm_ppc.dasc | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 4195ce12..2fbd181f 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -977,14 +977,58 @@ static void build_subroutines(BuildCtx *ctx) | |||
977 | | evstdd CFUNC:TMP0, 0(RA) | 977 | | evstdd CFUNC:TMP0, 0(RA) |
978 | | b ->fff_res | 978 | | b ->fff_res |
979 | | | 979 | | |
980 | |.ffunc_1 ipairs_aux | 980 | |.ffunc_2 ipairs_aux |
981 | | NYI | 981 | | checktab TAB:CARG1 |
982 | | | 982 | | lwz PC, FRAME_PC(BASE) |
983 | |->fff_res0: | 983 | | checkfail ->fff_fallback |
984 | | NYI | 984 | | checknum CARG2 |
985 | | lus TMP3, 0x3ff0 | ||
986 | | checkfail ->fff_fallback | ||
987 | | efdctsi TMP2, CARG2 | ||
988 | | lwz TMP0, TAB:CARG1->asize | ||
989 | | evmergelo TMP3, TMP3, ZERO | ||
990 | | lwz TMP1, TAB:CARG1->array | ||
991 | | efdadd CARG2, CARG2, TMP3 | ||
992 | | addi TMP2, TMP2, 1 | ||
993 | | la RA, -8(BASE) | ||
994 | | cmplw TMP0, TMP2 | ||
995 | | slwi TMP3, TMP2, 3 | ||
996 | | ble >2 // Not in array part? | ||
997 | | evlddx TMP1, TMP1, TMP3 | ||
998 | |1: | ||
999 | | checknil TMP1 | ||
1000 | | li RD, (0+1)*8 | ||
1001 | | checkok ->fff_res // End of iteration, return 0 results. | ||
1002 | | evstdd CARG2, 0(RA) | ||
1003 | | li RD, (2+1)*8 | ||
1004 | | evstdd TMP1, 8(RA) | ||
1005 | | b ->fff_res | ||
1006 | |2: // Check for empty hash part first. Otherwise call C function. | ||
1007 | | lwz TMP0, TAB:CARG1->hmask | ||
1008 | | cmplwi TMP0, 0 | ||
1009 | | li RD, (0+1)*8 | ||
1010 | | beq ->fff_res | ||
1011 | | mr CARG2, TMP2 | ||
1012 | | bl extern lj_tab_getinth // (GCtab *t, int32_t key) | ||
1013 | | // Returns cTValue * or NULL. | ||
1014 | | cmplwi CRET1, 0 | ||
1015 | | li RD, (0+1)*8 | ||
1016 | | beq ->fff_res | ||
1017 | | evldd TMP1, 0(CRET1) | ||
1018 | | b <1 | ||
985 | | | 1019 | | |
986 | |.ffunc_1 ipairs | 1020 | |.ffunc_1 ipairs |
987 | | NYI | 1021 | | checktab TAB:CARG1 |
1022 | | lwz PC, FRAME_PC(BASE) | ||
1023 | | checkfail ->fff_fallback | ||
1024 | | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] | ||
1025 | | la RA, -8(BASE) | ||
1026 | | evsplati TMP1, 0 | ||
1027 | | evstdd TAB:CARG1, 0(BASE) | ||
1028 | | evstdd TMP1, 8(BASE) | ||
1029 | | li RD, (3+1)*8 | ||
1030 | | evstdd CFUNC:TMP0, 0(RA) | ||
1031 | | b ->fff_res | ||
988 | | | 1032 | | |
989 | |//-- Base library: catch errors ---------------------------------------- | 1033 | |//-- Base library: catch errors ---------------------------------------- |
990 | | | 1034 | | |