aboutsummaryrefslogtreecommitdiffstats
path: root/coroutine
diff options
context:
space:
mode:
authorLars Kanis <lars@greiz-reinsdorf.de>2019-07-06 14:32:39 +0200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2019-07-07 21:33:47 +1200
commit68e580402272cea7f98145c3c562cab565a37046 (patch)
tree8e8df649d383f3de1c37c82b9aca565486cf0dcf /coroutine
parenta13636e756662e563e4c4dc802c6fa21cb6d7b52 (diff)
downloadruby-68e580402272cea7f98145c3c562cab565a37046.tar.gz
Add coroutine context switch for i386-mingw32
It's essentially a translation of Context.asm from Intel to AT&T syntax.
Diffstat (limited to 'coroutine')
-rw-r--r--coroutine/win32/Context.S47
1 files changed, 47 insertions, 0 deletions
diff --git a/coroutine/win32/Context.S b/coroutine/win32/Context.S
new file mode 100644
index 0000000000..d14bf435e8
--- /dev/null
+++ b/coroutine/win32/Context.S
@@ -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