aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2010-10-05 01:41:51 +0200
committerMike Pall <mike>2010-10-05 01:41:51 +0200
commit08ac8b0c9611ce4c10b5f8c32a704e8438bbefae (patch)
tree5343f256107f678c836d8eafec901f35532003a5 /src
parent8b096c5d085bea8b1ad88189592d1a0c85457047 (diff)
downloadluajit-08ac8b0c9611ce4c10b5f8c32a704e8438bbefae.tar.gz
luajit-08ac8b0c9611ce4c10b5f8c32a704e8438bbefae.tar.bz2
luajit-08ac8b0c9611ce4c10b5f8c32a704e8438bbefae.zip
PPC: Add getmetatable(), setmetatable() and rawget() fast functions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_ppc.dasc76
1 files changed, 72 insertions, 4 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc
index ec156e86..5dad8719 100644
--- a/src/buildvm_ppc.dasc
+++ b/src/buildvm_ppc.dasc
@@ -240,6 +240,7 @@
240|.macro checkok, label; blt label; .endmacro 240|.macro checkok, label; blt label; .endmacro
241|.macro checkfail, label; bge label; .endmacro 241|.macro checkfail, label; bge label; .endmacro
242|.macro checkanyfail, label; bns label; .endmacro 242|.macro checkanyfail, label; bns label; .endmacro
243|.macro checkallok, label; bso label; .endmacro
243|.endif 244|.endif
244| 245|
245|.macro branch_RD 246|.macro branch_RD
@@ -950,13 +951,80 @@ static void build_subroutines(BuildCtx *ctx)
950 |//-- Base library: getters and setters --------------------------------- 951 |//-- Base library: getters and setters ---------------------------------
951 | 952 |
952 |.ffunc_1 getmetatable 953 |.ffunc_1 getmetatable
953 | NYI 954 | checktab CARG1
955 | evmergehi TMP1, CARG1, CARG1
956 | checkfail >6
957 |1: // Field metatable must be at same offset for GCtab and GCudata!
958 | lwz TAB:RB, TAB:CARG1->metatable
959 |2:
960 | evmr CRET1, TISNIL
961 | cmplwi TAB:RB, 0
962 | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH)
963 | beq ->fff_restv
964 | lwz TMP0, TAB:RB->hmask
965 | evmergelo CRET1, TISTAB, TAB:RB // Use metatable as default result.
966 | lwz TMP1, STR:RC->hash
967 | lwz NODE:TMP2, TAB:RB->node
968 | evmergelo STR:RC, TISSTR, STR:RC
969 | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask
970 | slwi TMP0, TMP1, 5
971 | slwi TMP1, TMP1, 3
972 | sub TMP1, TMP0, TMP1
973 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8)
974 |3: // Rearranged logic, because we expect _not_ to find the key.
975 | evldd TMP0, NODE:TMP2->key
976 | evldd TMP1, NODE:TMP2->val
977 | evcmpeq TMP0, STR:RC
978 | lwz NODE:TMP2, NODE:TMP2->next
979 | checkallok >5
980 | cmplwi NODE:TMP2, 0
981 | beq ->fff_restv // Not found, keep default result.
982 | b <3
983 |5:
984 | checknil TMP1
985 | checkok ->fff_restv // Ditto for nil value.
986 | evmr CRET1, TMP1 // Return value of mt.__metatable.
987 | b ->fff_restv
988 |
989 |6:
990 | cmpwi TMP1, LJ_TUDATA
991 | not TMP1, TMP1
992 | beq <1
993 | checknum CARG1
994 | slwi TMP1, TMP1, 2
995 | li TMP2, 4*~LJ_TNUMX
996 | isellt TMP1, TMP2, TMP1
997 | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH)
998 | lwzx TAB:RB, TMP2, TMP1
999 | b <2
954 | 1000 |
955 |.ffunc_2 setmetatable 1001 |.ffunc_2 setmetatable
956 | NYI 1002 | // Fast path: no mt for table yet and not clearing the mt.
1003 | evmergehi TMP0, TAB:CARG1, TAB:CARG2
1004 | checktab TMP0
1005 | checkanyfail ->fff_fallback
1006 | lwz TAB:TMP1, TAB:CARG1->metatable
1007 | cmplwi TAB:TMP1, 0
1008 | lbz TMP3, TAB:CARG1->marked
1009 | bne ->fff_fallback
1010 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table)
1011 | stw TAB:CARG2, TAB:CARG1->metatable
1012 | beq ->fff_restv
1013 | barrierback TAB:CARG1, TMP3, TMP0
1014 | b ->fff_restv
957 | 1015 |
958 |.ffunc_2 rawget 1016 |.ffunc rawget
959 | NYI 1017 | cmplwi NARGS8:RC, 16
1018 | evldd CARG2, 0(BASE)
1019 | blt ->fff_fallback
1020 | checktab CARG2
1021 | la CARG3, 8(BASE)
1022 | checkfail ->fff_fallback
1023 | mr CARG1, L
1024 | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key)
1025 | // Returns cTValue *.
1026 | evldd CRET1, 0(CRET1)
1027 | b ->fff_restv
960 | 1028 |
961 |//-- Base library: conversions ------------------------------------------ 1029 |//-- Base library: conversions ------------------------------------------
962 | 1030 |