]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
ARM: Add support to call C functions.
authorMike Pall <mike>
Tue, 29 Mar 2011 00:29:27 +0000 (02:29 +0200)
committerMike Pall <mike>
Tue, 29 Mar 2011 00:29:27 +0000 (02:29 +0200)
src/buildvm_arm.dasc

index fc2f017bac94ff49ff2f1fdeaf57a73ece83c770..9814e93e915dee7e6f20c9d235fac7f9c5ec55b9 100644 (file)
@@ -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;
 
   /* ---------------------------------------------------------------------- */