diff options
author | Dave Korn <dave.korn.cygwin@gmail.com> | 2010-09-11 06:53:28 +0000 |
---|---|---|
committer | Dave Korn <dave.korn.cygwin@gmail.com> | 2010-09-11 06:53:28 +0000 |
commit | 0f81b5d4bcaa5c840031796d94df9ba6d6fae4d0 (patch) | |
tree | 167292d4f6250ddb23f2abfe2660049054117f91 /winsup/cygwin/include/fenv.h | |
parent | f7dea7f23347d847b6abd3d8b5f7e1b00f21262f (diff) | |
download | cygnal-0f81b5d4bcaa5c840031796d94df9ba6d6fae4d0.tar.gz cygnal-0f81b5d4bcaa5c840031796d94df9ba6d6fae4d0.tar.bz2 cygnal-0f81b5d4bcaa5c840031796d94df9ba6d6fae4d0.zip |
winsup/cygwin/ChangeLog:
* Makefile.in (DLL_OFILES): Add new fenv.o module.
(fenv_CFLAGS): New flags definition for fenv.o compile.
* autoload.cc (std_dll_init): Use fenv.h functions instead of direct
manipulation of x87 FPU registers.
* crt0.c (mainCRTStartup): Likewise.
* cygwin.din (feclearexcept, fegetexceptflag, feraiseexcept,
fesetexceptflag, fetestexcept, fegetround, fesetround, fegetenv,
feholdexcept, fesetenv, feupdateenv, fegetprec, fesetprec,
feenableexcept, fedisableexcept, fegetexcept, _feinitialise,
_fe_dfl_env, _fe_nomask_env): Export new functions and data items.
* fenv.cc: New file.
* posix.sgml: Update status of newly-implemented APIs.
* include/fenv.h: Likewise related header.
* include/cygwin/version.h (CYGWIN_VERSION_API_MINOR): Bump.
Diffstat (limited to 'winsup/cygwin/include/fenv.h')
-rwxr-xr-x | winsup/cygwin/include/fenv.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/winsup/cygwin/include/fenv.h b/winsup/cygwin/include/fenv.h new file mode 100755 index 000000000..89e3d48c4 --- /dev/null +++ b/winsup/cygwin/include/fenv.h @@ -0,0 +1,176 @@ +/* fenv.h + + Copyright 2010 Red Hat, Inc. + +This file is part of Cygwin. + +This software is a copyrighted work licensed under the terms of the +Cygwin license. Please consult the file "CYGWIN_LICENSE" for +details. */ + +#ifndef _FENV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Primary sources: + + The Open Group Base Specifications Issue 6: + http://www.opengroup.org/onlinepubs/000095399/basedefs/fenv.h.html + + C99 Language spec (draft n1256): + <url unknown> + + Intel® 64 and IA-32 Architectures Software Developer’s Manuals: + http://www.intel.com/products/processor/manuals/ + + GNU C library manual pages: + http://www.gnu.org/software/libc/manual/html_node/Control-Functions.html + http://www.gnu.org/software/libc/manual/html_node/Rounding.html + http://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html + http://www.gnu.org/software/libc/manual/html_node/Status-bit-operations.html + + Linux online man page(s): + http://linux.die.net/man/3/fegetexcept + + The documentation quotes these sources for reference. All definitions and + code have been developed solely based on the information from these specs. + +*/ + +/* Represents the entire floating-point environment. The floating-point + environment refers collectively to any floating-point status flags and + control modes supported by the implementation. + In this implementation, the struct contains the state information from + the fstenv/fnstenv instructions and a copy of the SSE MXCSR, since GCC + uses SSE for a lot of floating-point operations. (Cygwin assumes i686 + or above these days, as does the compiler.) */ + +typedef struct _fenv_t +{ + struct _fpu_env_info { + unsigned int _fpu_cw; /* low 16 bits only. */ + unsigned int _fpu_sw; /* low 16 bits only. */ + unsigned int _fpu_tagw; /* low 16 bits only. */ + unsigned int _fpu_ipoff; + unsigned int _fpu_ipsel; + unsigned int _fpu_opoff; + unsigned int _fpu_opsel; /* low 16 bits only. */ + } _fpu; + unsigned int _sse_mxcsr; +} fenv_t; + +/* Represents the floating-point status flags collectively, including + any status the implementation associates with the flags. A floating-point + status flag is a system variable whose value is set (but never cleared) + when a floating-point exception is raised, which occurs as a side effect + of exceptional floating-point arithmetic to provide auxiliary information. + A floating-point control mode is a system variable whose value may be + set by the user to affect the subsequent behavior of floating-point + arithmetic. */ + +typedef struct _fexcept_t +{ + unsigned short _fpu_exceptions; + unsigned short _sse_exceptions; +} fexcept_t; + +/* The <fenv.h> header shall define the following constants if and only + if the implementation supports the floating-point exception by means + of the floating-point functions feclearexcept(), fegetexceptflag(), + feraiseexcept(), fesetexceptflag(), and fetestexcept(). Each expands to + an integer constant expression with values such that bitwise-inclusive + ORs of all combinations of the constants result in distinct values. */ + +#define FE_DIVBYZERO (1 << 2) +#define FE_INEXACT (1 << 5) +#define FE_INVALID (1 << 0) +#define FE_OVERFLOW (1 << 3) +#define FE_UNDERFLOW (1 << 4) + +/* This is not defined by Posix, but since x87 supports it we provide + a definition according to the same naming scheme used above. */ +#define FE_DENORMAL (1 << 1) + +/* The <fenv.h> header shall define the following constant, which is + simply the bitwise-inclusive OR of all floating-point exception + constants defined above: */ + +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID \ + | FE_OVERFLOW | FE_UNDERFLOW | FE_DENORMAL) + +/* The <fenv.h> header shall define the following constants if and only + if the implementation supports getting and setting the represented + rounding direction by means of the fegetround() and fesetround() + functions. Each expands to an integer constant expression whose values + are distinct non-negative vales. */ + +#define FE_DOWNWARD (1) +#define FE_TONEAREST (0) +#define FE_TOWARDZERO (3) +#define FE_UPWARD (2) + +/* Precision bit values. Not defined by Posix, but follow logically. */ +#define FE_SINGLEPREC (0) +#define FE_RESERVEDPREC (1) +#define FE_DOUBLEPREC (2) +#define FE_EXTENDEDPREC (3) + +/* The <fenv.h> header shall define the following constant, which + represents the default floating-point environment (that is, the one + installed at program startup) and has type pointer to const-qualified + fenv_t. It can be used as an argument to the functions within the + <fenv.h> header that manage the floating-point environment. */ + +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV (_fe_dfl_env) + +/* Additional implementation-defined environments, with macro + definitions beginning with FE_ and an uppercase letter,and having + type "pointer to const-qualified fenv_t",may also be specified by + the implementation. */ + +#ifdef _GNU_SOURCE +/* If possible, the GNU C Library defines a macro FE_NOMASK_ENV which + represents an environment where every exception raised causes a trap + to occur. You can test for this macro using #ifdef. It is only defined + if _GNU_SOURCE is defined. */ +extern const fenv_t *_fe_nomask_env; +#define FE_NOMASK_ENV (_fe_nomask_env) +#endif /* _GNU_SOURCE */ + + +/* The following shall be declared as functions and may also be + defined as macros. Function prototypes shall be provided. */ +extern int feclearexcept (int excepts); +extern int fegetexceptflag (fexcept_t *flagp, int excepts); +extern int feraiseexcept (int excepts); +extern int fesetexceptflag (const fexcept_t *flagp, int excepts); +extern int fetestexcept (int excepts); +extern int fegetround (void); +extern int fesetround (int round); +extern int fegetenv (fenv_t *envp); +extern int feholdexcept (fenv_t *envp); +extern int fesetenv (const fenv_t *envp); +extern int feupdateenv (const fenv_t *envp); + +/* These are not defined in Posix, but make sense by obvious extension. */ +extern int fegetprec (void); +extern int fesetprec (int prec); + +/* This is Cygwin-custom, not from the standard, for use in the Cygwin CRT. */ +extern void _feinitialise (void); + +/* These are GNU extensions defined in glibc. */ +extern int feenableexcept (int excepts); +extern int fedisableexcept (int excepts); +extern int fegetexcept (void); + + +#ifdef __cplusplus +} +#endif + +#endif /* _FENV_H_ */ |