From c04a252a06c74cfab5f989f748a8b63ce2ada80c Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 29 Mar 2011 02:29:27 +0200 Subject: [PATCH] ARM: Add support to call C functions. --- src/buildvm_arm.dasc | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index fc2f017b..9814e93e 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc @@ -1105,7 +1105,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_FUNCC: case BC_FUNCCW: - | NYI + | // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8 + if (op == BC_FUNCC) { + | ldr CARG4, CFUNC:CARG3->f + } else { + | ldr CARG4, [DISPATCH, #DISPATCH_GL(wrapf)] + } + | add CARG2, RA, NARGS8:RC + | ldr CARG1, L->maxstack + | add RC, BASE, NARGS8:RC + | str BASE, L->base + | cmp CARG2, CARG1 + | str RC, L->top + if (op == BC_FUNCCW) { + | ldr CARG2, CFUNC:CARG3->f + } + | mv_vmstate CARG3, C + | mov CARG1, L + | bhi ->vm_growstack_c // Need to grow stack. + | st_vmstate CARG3 + | blx CARG4 // (lua_State *L [, lua_CFunction f]) + | // Returns nresults. + | ldr BASE, L->base + | mv_vmstate CARG3, INTERP + | ldr CRET2, L->top + | lsl RC, CRET1, #3 + | st_vmstate CARG3 + | ldr PC, [BASE, FRAME_PC] + | sub RA, CRET2, RC // RA = L->top - nresults*8 + | b ->vm_returnc break; /* ---------------------------------------------------------------------- */