diff options
Diffstat (limited to 'lib/libc/arch/x86_64/gen/fpsetmask.S')
-rw-r--r-- | lib/libc/arch/x86_64/gen/fpsetmask.S | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/libc/arch/x86_64/gen/fpsetmask.S b/lib/libc/arch/x86_64/gen/fpsetmask.S new file mode 100644 index 00000000000..665d55e8e47 --- /dev/null +++ b/lib/libc/arch/x86_64/gen/fpsetmask.S @@ -0,0 +1,42 @@ +/* $OpenBSD: fpsetmask.S,v 1.1 2004/01/28 01:44:45 mickey Exp $ */ +/* $NetBSD: fpsetmask.S,v 1.3 2002/06/12 19:17:22 fvdl Exp $ */ + +/* + * Written by Frank van der Linden at Wasabi Systems for NetBSD. + * Public domain. + */ + +#include <machine/asm.h> + +/* + * XXX set both the x87 control 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(fpsetmask, _fpsetmask) +ENTRY(_fpsetmask) +#else +ENTRY(fpsetmask) +#endif + fnstcw -4(%rsp) + stmxcsr -8(%rsp) + andl $63,%edi + notl %edi + + movl -4(%rsp),%edx + movl %edx,%eax + andl %edi,%edx + movl %edx,-4(%rsp) + + movl -8(%rsp),%edx + roll $7,%edi + andl %edi,%edx + movl %edx,-8(%rsp) + + fldcw -4(%rsp) + ldmxcsr -8(%rsp) + andl $63,%eax + ret |