aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.dasc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm_arm.dasc')
-rw-r--r--src/vm_arm.dasc37
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!