ruby/coroutine/win32/Context.S

48 строки
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