diff options
author | Mike Pall <mike> | 2011-03-29 02:29:27 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-03-29 02:29:27 +0200 |
commit | c04a252a06c74cfab5f989f748a8b63ce2ada80c (patch) | |
tree | 8997e02b3a7f187a8b1048df3f6484c9c504e422 /src | |
parent | cff08b23159bbc67e81e982beefd360def137b91 (diff) | |
download | luajit-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.dasc | 30 |
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 | /* ---------------------------------------------------------------------- */ |