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