summaryrefslogtreecommitdiffstats
path: root/library/fibers/switchstack_gcc_64_win.s
diff options
context:
space:
mode:
Diffstat (limited to 'library/fibers/switchstack_gcc_64_win.s')
-rw-r--r--library/fibers/switchstack_gcc_64_win.s93
1 files changed, 93 insertions, 0 deletions
diff --git a/library/fibers/switchstack_gcc_64_win.s b/library/fibers/switchstack_gcc_64_win.s
new file mode 100644
index 0000000..f75c53c
--- /dev/null
+++ b/library/fibers/switchstack_gcc_64_win.s
@@ -0,0 +1,93 @@
+.global _switchStackInternal
+.section .text
+.def _switchStackInternal ; .scl 2 ; .type 32 ; .endef
+
+_switchStackInternal:
+ // save callee-saved registers
+ push %rbp
+ movq %rsp, %rbp
+ push %rbx
+ push %r12
+ push %r13
+ push %r14
+ push %r15
+
+ push %rsi
+ push %rdi
+
+ sub $0x10, %rsp
+ movupd %xmm6, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm7, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm8, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm9, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm10, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm11, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm12, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm13, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm14, (%rsp)
+ sub $0x10, %rsp
+ movupd %xmm15, (%rsp)
+
+ // store SIMD floating point control word
+ sub $4, %rsp
+ stmxcsr (%rsp)
+
+ // store floating point control bytes
+ sub $4, %rsp
+ fstcw (%rsp)
+
+ // save the old stack pointer (second arg in rsi)
+ movq %rsp, (%rsi)
+ // set the new stack pointer (first arg in rdi)
+ movq %rdi, %rsp
+
+ // restore floating point control bytes
+ fnclex
+ fldcw (%rsp)
+ add $4, %rsp
+
+ // restore SIMD floating point control word
+ ldmxcsr (%rsp)
+ add $4, %rsp
+
+ // pop callee-saved registers
+ movupd (%rsp), %xmm15
+ add $0x10, %rsp
+ movupd (%rsp), %xmm14
+ add $0x10, %rsp
+ movupd (%rsp), %xmm13
+ add $0x10, %rsp
+ movupd (%rsp), %xmm12
+ add $0x10, %rsp
+ movupd (%rsp), %xmm11
+ add $0x10, %rsp
+ movupd (%rsp), %xmm10
+ add $0x10, %rsp
+ movupd (%rsp), %xmm9
+ add $0x10, %rsp
+ movupd (%rsp), %xmm8
+ add $0x10, %rsp
+ movupd (%rsp), %xmm7
+ add $0x10, %rsp
+ movupd (%rsp), %xmm6
+ add $0x10, %rsp
+
+ pop %rdi
+ pop %rsi
+
+ pop %r15
+ pop %r14
+ pop %r13
+ pop %r12
+ pop %rbx
+ pop %rbp
+
+ retq