diff options
Diffstat (limited to 'coroutine/win64/Context.asm')
| -rw-r--r-- | coroutine/win64/Context.asm | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/coroutine/win64/Context.asm b/coroutine/win64/Context.asm index 6f64547d80..8c4dea1c93 100644 --- a/coroutine/win64/Context.asm +++ b/coroutine/win64/Context.asm @@ -2,12 +2,17 @@ ;; This file is part of the "Coroutine" project and released under the MIT License. ;; ;; Created by Samuel Williams on 10/5/2018. -;; Copyright, 2018, by Samuel Williams. All rights reserved. +;; Copyright, 2018, by Samuel Williams. ;; .code coroutine_transfer proc + ; Save the thread information block: + push qword ptr gs:[8] + push qword ptr gs:[16] + + ; Save caller registers: push rbp push rbx push rdi @@ -16,14 +21,36 @@ coroutine_transfer proc push r13 push r14 push r15 - - ; Save caller stack pointer - mov [rcx], rsp - - ; Restore callee stack pointer + + movaps [rsp - 24], xmm6 + movaps [rsp - 40], xmm7 + movaps [rsp - 56], xmm8 + movaps [rsp - 72], xmm9 + movaps [rsp - 88], xmm10 + movaps [rsp - 104], xmm11 + movaps [rsp - 120], xmm12 + movaps [rsp - 136], xmm13 + movaps [rsp - 152], xmm14 + movaps [rsp - 168], xmm15 + + ; Save caller stack pointer: + mov [rcx], rsp + + ; Restore callee stack pointer: mov rsp, [rdx] - ; Restore callee stack + movaps xmm15, [rsp - 168] + movaps xmm14, [rsp - 152] + movaps xmm13, [rsp - 136] + movaps xmm12, [rsp - 120] + movaps xmm11, [rsp - 104] + movaps xmm10, [rsp - 88] + movaps xmm9, [rsp - 72] + movaps xmm8, [rsp - 56] + movaps xmm7, [rsp - 40] + movaps xmm6, [rsp - 24] + + ; Restore callee stack: pop r15 pop r14 pop r13 @@ -33,11 +60,20 @@ coroutine_transfer proc pop rbx pop rbp - ; Put the first argument into the return value + ; Restore the thread information block: + pop qword ptr gs:[16] + pop qword ptr gs:[8] + + ; Put the first argument into the return value: mov rax, rcx - ; We pop the return address and jump to it + ; We pop the return address and jump to it: ret coroutine_transfer endp +coroutine_trampoline proc + ; Do not remove this. This forces 16-byte alignment when entering the coroutine. + ret +coroutine_trampoline endp + end |
