summaryrefslogtreecommitdiff
path: root/lib/libc/arch/x86_64/gen/fpsetsticky.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/arch/x86_64/gen/fpsetsticky.S')
-rw-r--r--lib/libc/arch/x86_64/gen/fpsetsticky.S43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/libc/arch/x86_64/gen/fpsetsticky.S b/lib/libc/arch/x86_64/gen/fpsetsticky.S
new file mode 100644
index 00000000000..c8e61101a12
--- /dev/null
+++ b/lib/libc/arch/x86_64/gen/fpsetsticky.S
@@ -0,0 +1,43 @@
+/* $OpenBSD: fpsetsticky.S,v 1.1 2004/01/28 01:44:45 mickey Exp $ */
+/* $NetBSD: fpsetsticky.S,v 1.3 2002/06/12 19:17:23 fvdl Exp $ */
+
+/*
+ * Written by Frank van der Linden at Wasabi Systems for NetBSD
+ * Public domain.
+ */
+
+#include <machine/asm.h>
+
+/*
+ * XXX set both the x87 status word and the SSE mxcsr register.
+ * Applications should only set exception and round flags
+ * via the fp*() interface, otherwise the status words
+ * will get our of sync.
+ */
+
+
+#ifdef WEAK_ALIAS
+WEAK_ALIAS(fpsetsticky, _fpsetsticky)
+ENTRY(_fpsetsticky)
+#else
+ENTRY(fpsetsticky)
+#endif
+ fnstenv -28(%rsp)
+ stmxcsr -32(%rsp)
+
+ andl $63,%edi
+
+ movl -24(%rsp),%eax
+ movl %eax,%edx
+ andl $63,%eax
+
+ orl %edi,%edx
+ movl %edx,-24(%rsp)
+
+ movl -32(%rsp),%edx
+ orl %edi,%edx
+ movl %edx,-32(%rsp)
+
+ ldmxcsr -32(%rsp)
+ fldenv -28(%rsp)
+ ret