From 495dffba430a530649c89fb220492ad42ee803bc Mon Sep 17 00:00:00 2001 From: samuel Date: Tue, 20 Nov 2018 10:18:16 +0000 Subject: GAS style assembly for win64 (mingw). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65876 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- coroutine/amd64/Context.s | 5 ++- coroutine/win64/Context.s | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 coroutine/win64/Context.s (limited to 'coroutine') diff --git a/coroutine/amd64/Context.s b/coroutine/amd64/Context.s index 0c4296035e..641bd016ab 100644 --- a/coroutine/amd64/Context.s +++ b/coroutine/amd64/Context.s @@ -7,13 +7,12 @@ .text -.globl coroutine_transfer -coroutine_transfer: - # For older linkers .globl _coroutine_transfer _coroutine_transfer: +.globl coroutine_transfer +coroutine_transfer: # Save caller state pushq %rbp pushq %rbx diff --git a/coroutine/win64/Context.s b/coroutine/win64/Context.s new file mode 100644 index 0000000000..04d97d1aaf --- /dev/null +++ b/coroutine/win64/Context.s @@ -0,0 +1,77 @@ +## +## This file is part of the "Coroutine" project and released under the MIT License. +## +## Created by Samuel Williams on 4/11/2018. +## Copyright, 2018, by Samuel Williams. All rights reserved. +## + +.text + +.globl coroutine_transfer +coroutine_transfer: + # Save the thread information block: + pushq %gs:8 + pushq %gs:16 + + # Save caller registers: + pushq %rbp + pushq %rbx + pushq %rdi + pushq %rsi + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + + movaps -24(%rsp), %xmm6 + movaps -40(%rsp), %xmm7 + movaps -56(%rsp), %xmm8 + movaps -72(%rsp), %xmm9 + movaps -88(%rsp), %xmm10 + movaps -104(%rsp), %xmm11 + movaps -120(%rsp), %xmm12 + movaps -136(%rsp), %xmm13 + movaps -152(%rsp), %xmm14 + movaps -168(%rsp), %xmm15 + + # Save caller stack pointer: + mov %rsp, (%rcx) + + # Restore callee stack pointer: + mov (%rdx), %rsp + + movaps %xmm15, -168(%rsp) + movaps %xmm14, -152(%rsp) + movaps %xmm13, -136(%rsp) + movaps %xmm12, -120(%rsp) + movaps %xmm11, -104(%rsp) + movaps %xmm10, -88(%rsp) + movaps %xmm9, -72(%rsp) + movaps %xmm8, -56(%rsp) + movaps %xmm7, -40(%rsp) + movaps %xmm6, -24(%rsp) + + # Restore callee stack: + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rsi + popq %rdi + popq %rbx + popq %rbp + + # Restore the thread information block: + popq %gs:16 + popq %gs:8 + + # Put the first argument into the return value: + mov %rcx, %rax + + # We pop the return address and jump to it: + ret + +.globl coroutine_trampoline +coroutine_trampoline: + # Do not remove this. This forces 16-byte alignment when entering the coroutine. + ret -- cgit v1.2.3