From e15e4c4d95944da45092b4499b5f0e4d63f6bd01 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 11 Sep 2010 01:46:11 +0200 Subject: PPC: Add metamethod handlers for call instructions. --- src/buildvm_ppc.dasc | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 66ae819c..6a13cace 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc @@ -573,14 +573,32 @@ static void build_subroutines(BuildCtx *ctx) | |//-- Call metamethod ---------------------------------------------------- | - |->vmeta_call_ra: - | NYI - | |->vmeta_call: // Resolve and call __call metamethod. - | NYI + | // TMP2 = old base, BASE = new base, RC = nargs*8 + | mr CARG1, L + | stw TMP2, L->base // This is the callers base! + | subi CARG2, BASE, 8 + | stw PC, SAVE_PC + | add CARG3, BASE, RC + | mr SAVE0, NARGS8:RC + | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) + | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. + | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. + | ins_call | |->vmeta_callt: // Resolve __call for BC_CALLT. - | NYI + | // BASE = old base, RA = new base, RC = nargs*8 + | mr CARG1, L + | stw BASE, L->base + | subi CARG2, RA, 8 + | stw PC, SAVE_PC + | add CARG3, RA, RC + | mr SAVE0, NARGS8:RC + | bl extern lj_meta_call // (lua_State *L, TValue *func, TValue *top) + | lwz TMP1, FRAME_PC(BASE) + | addi NARGS8:RC, SAVE0, 8 // Got one more argument now. + | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. + | b ->BC_CALLT_Z | |//-- Argument coercion for 'for' statement ------------------------------ | -- cgit v1.2.3-55-g6feb