diff options
Diffstat (limited to 'src/buildvm_ppc.dasc')
-rw-r--r-- | src/buildvm_ppc.dasc | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index c257de45..4e316883 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -818,13 +818,23 @@ static void build_subroutines(BuildCtx *ctx) | |||
818 | | b ->vm_call_dispatch | 818 | | b ->vm_call_dispatch |
819 | | | 819 | | |
820 | |->vmeta_len: | 820 | |->vmeta_len: |
821 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | ||
822 | | mr SAVE0, CARG1 | ||
823 | #endif | ||
821 | | add CARG2, BASE, RD | 824 | | add CARG2, BASE, RD |
822 | | stw BASE, L->base | 825 | | stw BASE, L->base |
823 | | mr CARG1, L | 826 | | mr CARG1, L |
824 | | stw PC, SAVE_PC | 827 | | stw PC, SAVE_PC |
825 | | bl extern lj_meta_len // (lua_State *L, TValue *o) | 828 | | bl extern lj_meta_len // (lua_State *L, TValue *o) |
826 | | // Returns TValue * (metamethod base). | 829 | | // Returns NULL (retry) or TValue * (metamethod base). |
830 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | ||
831 | | cmplwi CRET1, 0 | ||
832 | | bne ->vmeta_binop // Binop call for compatibility. | ||
833 | | mr CARG1, SAVE0 | ||
834 | | b ->BC_LEN_Z | ||
835 | #else | ||
827 | | b ->vmeta_binop // Binop call for compatibility. | 836 | | b ->vmeta_binop // Binop call for compatibility. |
837 | #endif | ||
828 | | | 838 | | |
829 | |//-- Call metamethod ---------------------------------------------------- | 839 | |//-- Call metamethod ---------------------------------------------------- |
830 | | | 840 | | |
@@ -2337,9 +2347,23 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2337 | |2: | 2347 | |2: |
2338 | | checktab CARG1 | 2348 | | checktab CARG1 |
2339 | | checkfail ->vmeta_len | 2349 | | checkfail ->vmeta_len |
2350 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | ||
2351 | | lwz TAB:TMP2, TAB:CARG1->metatable | ||
2352 | | cmplwi TAB:TMP2, 0 | ||
2353 | | bne >9 | ||
2354 | |3: | ||
2355 | #endif | ||
2356 | |->BC_LEN_Z: | ||
2340 | | bl extern lj_tab_len // (GCtab *t) | 2357 | | bl extern lj_tab_len // (GCtab *t) |
2341 | | // Returns uint32_t (but less than 2^31). | 2358 | | // Returns uint32_t (but less than 2^31). |
2342 | | b <1 | 2359 | | b <1 |
2360 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | ||
2361 | |9: | ||
2362 | | lbz TMP0, TAB:TMP2->nomm | ||
2363 | | andi. TMP0, TMP0, 1<<MM_len | ||
2364 | | bne <3 // 'no __len' flag set: done. | ||
2365 | | b ->vmeta_len | ||
2366 | #endif | ||
2343 | break; | 2367 | break; |
2344 | 2368 | ||
2345 | /* -- Binary ops -------------------------------------------------------- */ | 2369 | /* -- Binary ops -------------------------------------------------------- */ |