| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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
|