summaryrefslogtreecommitdiffstats
path: root/src/backend/switchstack_gcc_32_linux_mac.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/switchstack_gcc_32_linux_mac.s')
-rw-r--r--src/backend/switchstack_gcc_32_linux_mac.s41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/backend/switchstack_gcc_32_linux_mac.s b/src/backend/switchstack_gcc_32_linux_mac.s
new file mode 100644
index 0000000..e4eac63
--- /dev/null
+++ b/src/backend/switchstack_gcc_32_linux_mac.s
@@ -0,0 +1,41 @@
+.text
+.globl _switchStackInternal
+
+_switchStackInternal:
+ // save callee-saved registers
+ push %ebp
+ movl %esp, %ebp
+ push %ebx
+ push %esi
+ push %edi
+
+ // store SIMD floating point control word
+ sub $4, %esp
+ stmxcsr (%esp)
+
+ // store floating point control bytes
+ sub $4, %esp
+ fstcw (%esp)
+
+ // save the old stack pointer
+ movl 0xc(%ebp), %edx
+ movl %esp, (%edx)
+ // set the new stack pointer
+ movl 0x8(%ebp), %esp
+
+ // restore floating point control bytes
+ fnclex
+ fldcw (%esp)
+ add $4, %esp
+
+ // restore SIMD floating point control word
+ ldmxcsr (%esp)
+ add $4, %esp
+
+ // pop callee-saved registers
+ pop %edi
+ pop %esi
+ pop %ebx
+ pop %ebp
+
+ ret