mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Add coroutine context switch for i386-mingw32
It's essentially a translation of Context.asm from Intel to AT&T syntax.
This commit is contained in:
parent
a13636e756
commit
68e5804022
2 changed files with 50 additions and 0 deletions
|
@ -2273,6 +2273,9 @@ AS_CASE(["$rb_cv_fiber_coroutine"], [yes|''], [
|
|||
[x64-mingw32], [
|
||||
rb_cv_fiber_coroutine=win64
|
||||
],
|
||||
[*86-mingw32], [
|
||||
rb_cv_fiber_coroutine=win32
|
||||
],
|
||||
[armv7*-linux-*], [
|
||||
rb_cv_fiber_coroutine=ucontext
|
||||
],
|
||||
|
|
47
coroutine/win32/Context.S
Normal file
47
coroutine/win32/Context.S
Normal file
|
@ -0,0 +1,47 @@
|
|||
##
|
||||
## 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
|
Loading…
Add table
Reference in a new issue