aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-03-29 02:29:27 +0200
committerMike Pall <mike>2011-03-29 02:29:27 +0200
commitc04a252a06c74cfab5f989f748a8b63ce2ada80c (patch)
tree8997e02b3a7f187a8b1048df3f6484c9c504e422 /src
parentcff08b23159bbc67e81e982beefd360def137b91 (diff)
downloadluajit-c04a252a06c74cfab5f989f748a8b63ce2ada80c.tar.gz
luajit-c04a252a06c74cfab5f989f748a8b63ce2ada80c.tar.bz2
luajit-c04a252a06c74cfab5f989f748a8b63ce2ada80c.zip
ARM: Add support to call C functions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc30
1 files changed, 29 insertions, 1 deletions
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)
1105 1105
1106 case BC_FUNCC: 1106 case BC_FUNCC:
1107 case BC_FUNCCW: 1107 case BC_FUNCCW:
1108 | NYI 1108 | // BASE = new base, RA = BASE+framesize*8, CARG3 = CFUNC, RC = nargs*8
1109 if (op == BC_FUNCC) {
1110 | ldr CARG4, CFUNC:CARG3->f
1111 } else {
1112 | ldr CARG4, [DISPATCH, #DISPATCH_GL(wrapf)]
1113 }
1114 | add CARG2, RA, NARGS8:RC
1115 | ldr CARG1, L->maxstack
1116 | add RC, BASE, NARGS8:RC
1117 | str BASE, L->base
1118 | cmp CARG2, CARG1
1119 | str RC, L->top
1120 if (op == BC_FUNCCW) {
1121 | ldr CARG2, CFUNC:CARG3->f
1122 }
1123 | mv_vmstate CARG3, C
1124 | mov CARG1, L
1125 | bhi ->vm_growstack_c // Need to grow stack.
1126 | st_vmstate CARG3
1127 | blx CARG4 // (lua_State *L [, lua_CFunction f])
1128 | // Returns nresults.
1129 | ldr BASE, L->base
1130 | mv_vmstate CARG3, INTERP
1131 | ldr CRET2, L->top
1132 | lsl RC, CRET1, #3
1133 | st_vmstate CARG3
1134 | ldr PC, [BASE, FRAME_PC]
1135 | sub RA, CRET2, RC // RA = L->top - nresults*8
1136 | b ->vm_returnc
1109 break; 1137 break;
1110 1138
1111 /* ---------------------------------------------------------------------- */ 1139 /* ---------------------------------------------------------------------- */