54 lines
1.2 KiB
NASM
54 lines
1.2 KiB
NASM
AREA switch_arm64_masm, CODE, READONLY;
|
|
GLOBAL slp_switch [FUNC]
|
|
EXTERN slp_save_state_asm
|
|
EXTERN slp_restore_state_asm
|
|
|
|
slp_switch
|
|
; push callee saved registers to stack
|
|
stp x19, x20, [sp, #-16]!
|
|
stp x21, x22, [sp, #-16]!
|
|
stp x23, x24, [sp, #-16]!
|
|
stp x25, x26, [sp, #-16]!
|
|
stp x27, x28, [sp, #-16]!
|
|
stp x29, x30, [sp, #-16]!
|
|
stp d8, d9, [sp, #-16]!
|
|
stp d10, d11, [sp, #-16]!
|
|
stp d12, d13, [sp, #-16]!
|
|
stp d14, d15, [sp, #-16]!
|
|
|
|
; call slp_save_state_asm with stack pointer
|
|
mov x0, sp
|
|
bl slp_save_state_asm
|
|
|
|
; early return for return value of 1 and -1
|
|
cmp x0, #-1
|
|
b.eq RETURN
|
|
cmp x0, #1
|
|
b.eq RETURN
|
|
|
|
; increment stack and frame pointer
|
|
add sp, sp, x0
|
|
add x29, x29, x0
|
|
|
|
bl slp_restore_state_asm
|
|
|
|
; store return value for successful completion of routine
|
|
mov x0, #0
|
|
|
|
RETURN
|
|
; pop registers from stack
|
|
ldp d14, d15, [sp], #16
|
|
ldp d12, d13, [sp], #16
|
|
ldp d10, d11, [sp], #16
|
|
ldp d8, d9, [sp], #16
|
|
ldp x29, x30, [sp], #16
|
|
ldp x27, x28, [sp], #16
|
|
ldp x25, x26, [sp], #16
|
|
ldp x23, x24, [sp], #16
|
|
ldp x21, x22, [sp], #16
|
|
ldp x19, x20, [sp], #16
|
|
|
|
ret
|
|
|
|
END
|