newlib/winsup/mingw/mingwex/fesetexceptflag.c
Danny Smith f34428eb35 Support SSE float environment in fenv.h functions.
* cpu_features.c: New file.
	* cpu_features.h: New file.
	* crt1.c: Include "cpu_features.h".
	(__mingw_CRTStartup): Call cpu_features_init().
	* Makefile.in (MING_OBJS): Add cpu_features.c.
	(SRCDIST_FILES): Add cpu_features.c, cpu_features.h.
	* include/fenv,h ( fenv_t;): Append  __mxcsr field.
	(__MXCSR_EXCEPT_FLAG_SHIFT): New define.
	(__MXCSR_EXCEPT_MASK_SHIFT): New define.
	(__MXCSR_ROUND_FLAG_SHIFT): New define.
	* mingwex/feclearexcept.c: Include "cpu_features.h".
	Handle SSE environment.
	* mingwex/fegetenv.c: Likewise.
	* mingwex/feholdexcept.c: Likewise.
	* mingwex/fesetenv.c: Likewise.
	* mingwex/fesetexceptflag.c: Likewise.
	* mingwex/fesetround.c: Likewise.
	* mingwex/fetestexcept.c: Likewise.
	* mingwex/feupdateenv.c: Likewise.
	* mingwex/fegetround.c: Add comment.
2006-07-03 10:32:58 +00:00

34 lines
1.0 KiB
C

#include <fenv.h>
#include "cpu_features.h"
/* 7.6.2.4
The fesetexceptflag function sets the complete status for those
exception flags indicated by the argument excepts, according to the
representation in the object pointed to by flagp. The value of
*flagp shall have been set by a previous call to fegetexceptflag
whose second argument represented at least those exceptions
represented by the argument excepts. This function does not raise
exceptions, but only sets the state of the flags. */
int fesetexceptflag (const fexcept_t * flagp, int excepts)
{
fenv_t _env;
excepts &= FE_ALL_EXCEPT;
__asm__ volatile ("fnstenv %0;" : "=m" (_env));
_env.__status_word &= ~excepts;
_env.__status_word |= (*flagp & excepts);
__asm__ volatile ("fldenv %0;" : : "m" (_env));
if (__HAS_SSE)
{
unsigned int _csr;
__asm__ __volatile__("stmxcsr %0" : "=m" (_csr));
_csr &= ~excepts;
_csr |= *flagp & excepts;
__asm__ volatile ("ldmxcsr %0" : : "m" (_csr));
}
return 0;
}