From 68e580402272cea7f98145c3c562cab565a37046 Mon Sep 17 00:00:00 2001 From: Lars Kanis Date: Sat, 6 Jul 2019 14:32:39 +0200 Subject: Add coroutine context switch for i386-mingw32 It's essentially a translation of Context.asm from Intel to AT&T syntax. --- configure.ac | 3 +++ coroutine/win32/Context.S | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 coroutine/win32/Context.S diff --git a/configure.ac b/configure.ac index ce2630dd9d..bc678cdc2d 100644 --- a/configure.ac +++ b/configure.ac @@ -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 ], 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 -- cgit v1.2.1