diff options
Diffstat (limited to 'src/vm_arm.dasc')
-rw-r--r-- | src/vm_arm.dasc | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index 26f97aa3..355a53e6 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc | |||
@@ -2414,8 +2414,19 @@ static void build_subroutines(BuildCtx *ctx) | |||
2414 | |.type CTSTATE, CTState, PC | 2414 | |.type CTSTATE, CTState, PC |
2415 | | ldr CTSTATE, GL:r12->ctype_state | 2415 | | ldr CTSTATE, GL:r12->ctype_state |
2416 | | add DISPATCH, r12, #GG_G2DISP | 2416 | | add DISPATCH, r12, #GG_G2DISP |
2417 | | strd CARG12, CTSTATE->cb.gpr[0] | 2417 | |.if FPU |
2418 | | str r4, SAVE_R4 | ||
2419 | | add r4, sp, CFRAME_SPACE+4+8*8 | ||
2420 | | vstmdb r4!, {d8-d15} | ||
2421 | |.endif | ||
2422 | |.if HFABI | ||
2423 | | add r12, CTSTATE, #offsetof(CTState, cb.fpr[8]) | ||
2424 | |.endif | ||
2418 | | strd CARG34, CTSTATE->cb.gpr[2] | 2425 | | strd CARG34, CTSTATE->cb.gpr[2] |
2426 | | strd CARG12, CTSTATE->cb.gpr[0] | ||
2427 | |.if HFABI | ||
2428 | | vstmdb r12!, {d0-d7} | ||
2429 | |.endif | ||
2419 | | ldr CARG4, [sp] | 2430 | | ldr CARG4, [sp] |
2420 | | add CARG3, sp, #CFRAME_SIZE | 2431 | | add CARG3, sp, #CFRAME_SIZE |
2421 | | mov CARG1, CTSTATE | 2432 | | mov CARG1, CTSTATE |
@@ -2448,6 +2459,9 @@ static void build_subroutines(BuildCtx *ctx) | |||
2448 | | mov CARG2, RA | 2459 | | mov CARG2, RA |
2449 | | bl extern lj_ccallback_leave // (CTState *cts, TValue *o) | 2460 | | bl extern lj_ccallback_leave // (CTState *cts, TValue *o) |
2450 | | ldrd CARG12, CTSTATE->cb.gpr[0] | 2461 | | ldrd CARG12, CTSTATE->cb.gpr[0] |
2462 | |.if HFABI | ||
2463 | | vldr d0, CTSTATE->cb.fpr[0] | ||
2464 | |.endif | ||
2451 | | b ->vm_leave_unw | 2465 | | b ->vm_leave_unw |
2452 | |.endif | 2466 | |.endif |
2453 | | | 2467 | | |
@@ -2460,9 +2474,15 @@ static void build_subroutines(BuildCtx *ctx) | |||
2460 | | ldr CARG1, CCSTATE:CARG1->spadj | 2474 | | ldr CARG1, CCSTATE:CARG1->spadj |
2461 | | ldrb CARG2, CCSTATE->nsp | 2475 | | ldrb CARG2, CCSTATE->nsp |
2462 | | add CARG3, CCSTATE, #offsetof(CCallState, stack) | 2476 | | add CARG3, CCSTATE, #offsetof(CCallState, stack) |
2477 | |.if HFABI | ||
2478 | | add RB, CCSTATE, #offsetof(CCallState, fpr[0]) | ||
2479 | |.endif | ||
2463 | | mov r11, sp | 2480 | | mov r11, sp |
2464 | | sub sp, sp, CARG1 // Readjust stack. | 2481 | | sub sp, sp, CARG1 // Readjust stack. |
2465 | | subs CARG2, CARG2, #1 | 2482 | | subs CARG2, CARG2, #1 |
2483 | |.if HFABI | ||
2484 | | vldm RB, {d0-d7} | ||
2485 | |.endif | ||
2466 | | ldr RB, CCSTATE->func | 2486 | | ldr RB, CCSTATE->func |
2467 | | bmi >2 | 2487 | | bmi >2 |
2468 | |1: // Copy stack slots. | 2488 | |1: // Copy stack slots. |
@@ -2471,14 +2491,17 @@ static void build_subroutines(BuildCtx *ctx) | |||
2471 | | subs CARG2, CARG2, #1 | 2491 | | subs CARG2, CARG2, #1 |
2472 | | bpl <1 | 2492 | | bpl <1 |
2473 | |2: | 2493 | |2: |
2474 | | ldr CARG1, CCSTATE->gpr[0] | 2494 | | ldrd CARG12, CCSTATE->gpr[0] |
2475 | | ldr CARG2, CCSTATE->gpr[1] | 2495 | | ldrd CARG34, CCSTATE->gpr[2] |
2476 | | ldr CARG3, CCSTATE->gpr[2] | ||
2477 | | ldr CARG4, CCSTATE->gpr[3] | ||
2478 | | blx RB | 2496 | | blx RB |
2479 | | mov sp, r11 | 2497 | | mov sp, r11 |
2480 | | str CRET1, CCSTATE->gpr[0] | 2498 | |.if HFABI |
2481 | | str CRET2, CCSTATE->gpr[1] | 2499 | | add r12, CCSTATE, #offsetof(CCallState, fpr[4]) |
2500 | |.endif | ||
2501 | | strd CRET1, CCSTATE->gpr[0] | ||
2502 | |.if HFABI | ||
2503 | | vstmdb r12!, {d0-d3} | ||
2504 | |.endif | ||
2482 | | pop {CCSTATE, r5, r11, pc} | 2505 | | pop {CCSTATE, r5, r11, pc} |
2483 | |.endif | 2506 | |.endif |
2484 | |// Note: vm_ffi_call must be the last function in this object file! | 2507 | |// Note: vm_ffi_call must be the last function in this object file! |