newlib/winsup/mingw/mingwex/fetestexcept.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

28 lines
759 B
C

#include <fenv.h>
#include "cpu_features.h"
/* 7.6.2.5
The fetestexcept function determines which of a specified subset of
the exception flags are currently set. The excepts argument
specifies the exception flags to be queried.
The fetestexcept function returns the value of the bitwise OR of the
exception macros corresponding to the currently set exceptions
included in excepts. */
int fetestexcept (int excepts)
{
unsigned int _res;
__asm__ ("fnstsw %%ax" : "=a" (_res));
/* If SSE supported, return the union of the FPU and SSE flags. */
if (__HAS_SSE)
{
unsigned int _csr;
__asm__ volatile("stmxcsr %0" : "=m" (_csr));
_res |= _csr;
}
return (_res & excepts & FE_ALL_EXCEPT);
}