aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-01 23:45:56 +0200
committerMike Pall <mike>2010-10-01 23:45:56 +0200
commit05099f07642874dd9375259cb7c7e87ba68a4581 (patch)
tree7a1e4be52fc124351e0a469cd77d756fcaeb3205
parent61d498be87c548142473e471abc6943bcf38d03e (diff)
downloadluajit-05099f07642874dd9375259cb7c7e87ba68a4581.tar.gz
luajit-05099f07642874dd9375259cb7c7e87ba68a4581.tar.bz2
luajit-05099f07642874dd9375259cb7c7e87ba68a4581.zip
PPC: Add ipairs() fast function and its iterator.
-rw-r--r--src/buildvm_ppc.dasc56
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 |