switch_arm64_masm.asm 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. AREA switch_arm64_masm, CODE, READONLY;
  2. GLOBAL slp_switch [FUNC]
  3. EXTERN slp_save_state_asm
  4. EXTERN slp_restore_state_asm
  5. slp_switch
  6. ; push callee saved registers to stack
  7. stp x19, x20, [sp, #-16]!
  8. stp x21, x22, [sp, #-16]!
  9. stp x23, x24, [sp, #-16]!
  10. stp x25, x26, [sp, #-16]!
  11. stp x27, x28, [sp, #-16]!
  12. stp x29, x30, [sp, #-16]!
  13. stp d8, d9, [sp, #-16]!
  14. stp d10, d11, [sp, #-16]!
  15. stp d12, d13, [sp, #-16]!
  16. stp d14, d15, [sp, #-16]!
  17. ; call slp_save_state_asm with stack pointer
  18. mov x0, sp
  19. bl slp_save_state_asm
  20. ; early return for return value of 1 and -1
  21. cmp x0, #-1
  22. b.eq RETURN
  23. cmp x0, #1
  24. b.eq RETURN
  25. ; increment stack and frame pointer
  26. add sp, sp, x0
  27. add x29, x29, x0
  28. bl slp_restore_state_asm
  29. ; store return value for successful completion of routine
  30. mov x0, #0
  31. RETURN
  32. ; pop registers from stack
  33. ldp d14, d15, [sp], #16
  34. ldp d12, d13, [sp], #16
  35. ldp d10, d11, [sp], #16
  36. ldp d8, d9, [sp], #16
  37. ldp x29, x30, [sp], #16
  38. ldp x27, x28, [sp], #16
  39. ldp x25, x26, [sp], #16
  40. ldp x23, x24, [sp], #16
  41. ldp x21, x22, [sp], #16
  42. ldp x19, x20, [sp], #16
  43. ret
  44. END