diff options
| -rw-r--r-- | src/buildvm_arm.dasc | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 136b4c06..e4672157 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -1255,7 +1255,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 1255 | /* -- Returns ----------------------------------------------------------- */ | 1255 | /* -- Returns ----------------------------------------------------------- */ |
| 1256 | 1256 | ||
| 1257 | case BC_RETM: | 1257 | case BC_RETM: |
| 1258 | | NYI | 1258 | | // RA = results*8, RC = extra results |
| 1259 | | ldr CARG1, SAVE_MULTRES | ||
| 1260 | | ldr PC, [BASE, FRAME_PC] | ||
| 1261 | | add RA, BASE, RA | ||
| 1262 | | add RC, CARG1, RC, lsl #3 | ||
| 1263 | | b ->BC_RETM_Z | ||
| 1259 | break; | 1264 | break; |
| 1260 | 1265 | ||
| 1261 | case BC_RET: | 1266 | case BC_RET: |
| @@ -1263,16 +1268,45 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 1263 | | ldr PC, [BASE, FRAME_PC] | 1268 | | ldr PC, [BASE, FRAME_PC] |
| 1264 | | lsl RC, RC, #3 | 1269 | | lsl RC, RC, #3 |
| 1265 | | add RA, BASE, RA | 1270 | | add RA, BASE, RA |
| 1271 | |->BC_RETM_Z: | ||
| 1266 | | str RC, SAVE_MULTRES | 1272 | | str RC, SAVE_MULTRES |
| 1267 | |1: | 1273 | |1: |
| 1268 | | ands CARG1, PC, #FRAME_TYPE | 1274 | | ands CARG1, PC, #FRAME_TYPE |
| 1269 | | eor CARG2, PC, #FRAME_VARG | 1275 | | eor CARG2, PC, #FRAME_VARG |
| 1270 | | ldreq INS, [PC, #-4] | ||
| 1271 | | bne ->BC_RETV2_Z | 1276 | | bne ->BC_RETV2_Z |
| 1272 | | | 1277 | | |
| 1273 | |->BC_RET_Z: | 1278 | |->BC_RET_Z: |
| 1274 | | // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return | 1279 | | // BASE = base, RA = resultptr, RC = (nresults+1)*8, PC = return |
| 1275 | | NYI | 1280 | | ldr INS, [PC, #-4] |
| 1281 | | subs CARG4, RC, #8 | ||
| 1282 | | sub CARG3, BASE, #8 | ||
| 1283 | | beq >3 | ||
| 1284 | |2: | ||
| 1285 | | ldrd CARG12, [RA], #8 | ||
| 1286 | | add BASE, BASE, #8 | ||
| 1287 | | subs CARG4, CARG4, #8 | ||
| 1288 | | strd CARG12, [BASE, #-16] | ||
| 1289 | | bne <2 | ||
| 1290 | |3: | ||
| 1291 | | decode_RA8 RA, INS | ||
| 1292 | | sub BASE, CARG3, RA | ||
| 1293 | | decode_RB8 RB, INS | ||
| 1294 | | ldr LFUNC:CARG1, [BASE, FRAME_FUNC] | ||
| 1295 | |5: | ||
| 1296 | | cmp RB, RC // More results expected? | ||
| 1297 | | bhi >6 | ||
| 1298 | | ldr CARG2, LFUNC:CARG1->field_pc | ||
| 1299 | | ins_next1 | ||
| 1300 | | ins_next2 | ||
| 1301 | | ldr KBASE, [CARG2, #PC2PROTO(k)] | ||
| 1302 | | ins_next3 | ||
| 1303 | | | ||
| 1304 | |6: // Fill up results with nil. | ||
| 1305 | | mvn CARG2, #~LJ_TNIL | ||
| 1306 | | sub BASE, BASE, #8 | ||
| 1307 | | add RC, RC, #8 | ||
| 1308 | | str CARG2, [BASE, #-12] | ||
| 1309 | | b <5 | ||
| 1276 | | | 1310 | | |
| 1277 | |->BC_RETV1_Z: // Non-standard return case. | 1311 | |->BC_RETV1_Z: // Non-standard return case. |
| 1278 | | add RA, BASE, RA | 1312 | | add RA, BASE, RA |
