diff options
Diffstat (limited to 'lib/libc/arch/x86_64/gen/fpsetsticky.S')
-rw-r--r-- | lib/libc/arch/x86_64/gen/fpsetsticky.S | 43 |
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 |