mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
48 lines
925 B
ArmAsm
48 lines
925 B
ArmAsm
|
##
|
||
|
## This file is part of the "Coroutine" project and released under the MIT License.
|
||
|
##
|
||
|
## Created by Lars Kanis on 06/06/2019.
|
||
|
##
|
||
|
|
||
|
.text
|
||
|
|
||
|
# Using fastcall is a big win (and it's the same as how x64 works).
|
||
|
# In coroutine transfer, the arguments are passed in ecx and edx. We don't need
|
||
|
# to touch these in order to pass them to the destination coroutine.
|
||
|
|
||
|
.globl @coroutine_transfer@8
|
||
|
@coroutine_transfer@8:
|
||
|
# Save the thread information block:
|
||
|
pushl %fs:0
|
||
|
pushl %fs:4
|
||
|
pushl %fs:8
|
||
|
|
||
|
# Save caller registers:
|
||
|
pushl %ebp
|
||
|
pushl %ebx
|
||
|
pushl %edi
|
||
|
pushl %esi
|
||
|
|
||
|
# Save caller stack pointer:
|
||
|
movl %esp, (%ecx)
|
||
|
|
||
|
# Restore callee stack pointer:
|
||
|
movl (%edx), %esp
|
||
|
|
||
|
# Restore callee stack:
|
||
|
popl %esi
|
||
|
popl %edi
|
||
|
popl %ebx
|
||
|
popl %ebp
|
||
|
|
||
|
# Restore the thread information block:
|
||
|
popl %fs:8
|
||
|
popl %fs:4
|
||
|
popl %fs:0
|
||
|
|
||
|
# Save the first argument as the return value:
|
||
|
movl %ecx, %eax
|
||
|
|
||
|
# Jump to the address on the stack:
|
||
|
ret
|