diff options
| -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 | /* ---------------------------------------------------------------------- */ |
