| 1 | #ifndef _FENV_H_ | 
 
 
 
 
 | 2 | #define _FENV_H_ | 
 
 
 
 
 | 3 |  | 
 
 
 
 
 | 4 | #include <_mingw.h> | 
 
 
 
 
 | 5 |  | 
 
 
 
 
 | 6 | /* FPU status word exception flags */ | 
 
 
 
 
 | 7 | #define FE_INVALID      0x01 | 
 
 
 
 
 | 8 | #define FE_DENORMAL     0x02 | 
 
 
 
 
 | 9 | #define FE_DIVBYZERO    0x04 | 
 
 
 
 
 | 10 | #define FE_OVERFLOW     0x08 | 
 
 
 
 
 | 11 | #define FE_UNDERFLOW    0x10 | 
 
 
 
 
 | 12 | #define FE_INEXACT      0x20 | 
 
 
 
 
 | 13 | #define FE_ALL_EXCEPT (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO \ | 
 
 
 
 
 | 14 | | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) | 
 
 
 
 
 | 15 |  | 
 
 
 
 
 | 16 | /* FPU control word rounding flags */ | 
 
 
 
 
 | 17 | #define FE_TONEAREST    0x0000 | 
 
 
 
 
 | 18 | #define FE_DOWNWARD     0x0400 | 
 
 
 
 
 | 19 | #define FE_UPWARD       0x0800 | 
 
 
 
 
 | 20 | #define FE_TOWARDZERO   0x0c00 | 
 
 
 
 
 | 21 |  | 
 
 
 
 
 | 22 | /* The MXCSR exception flags are the same as the | 
 
 
 
 
 | 23 | FE flags. */ | 
 
 
 
 
 | 24 | #define __MXCSR_EXCEPT_FLAG_SHIFT 0 | 
 
 
 
 
 | 25 |  | 
 
 
 
 
 | 26 | /* How much to shift FE status word exception flags | 
 
 
 
 
 | 27 | to get the MXCSR exeptions masks,  */ | 
 
 
 
 
 | 28 | #define __MXCSR_EXCEPT_MASK_SHIFT 7 | 
 
 
 
 
 | 29 |  | 
 
 
 
 
 | 30 | /* How much to shift FE control word rounding flags | 
 
 
 
 
 | 31 | to get MXCSR rounding flags,  */ | 
 
 
 
 
 | 32 | #define __MXCSR_ROUND_FLAG_SHIFT 3 | 
 
 
 
 
 | 33 |  | 
 
 
 
 
 | 34 | #ifndef RC_INVOKED | 
 
 
 
 
 | 35 | /* | 
 
 
 
 
 | 36 | For now, support only for the basic abstraction of flags that are | 
 
 
 
 
 | 37 | either set or clear. fexcept_t could be  structure that holds more | 
 
 
 
 
 | 38 | info about the fp environment. | 
 
 
 
 
 | 39 | */ | 
 
 
 
 
 | 40 | typedef unsigned short fexcept_t; | 
 
 
 
 
 | 41 |  | 
 
 
 
 
 | 42 | /* This 32-byte struct represents the entire floating point | 
 
 
 
 
 | 43 | environment as stored by fnstenv or fstenv, augmented by | 
 
 
 
 
 | 44 | the  contents of the MXCSR register, as stored by stmxcsr | 
 
 
 
 
 | 45 | (if CPU supports it). */ | 
 
 
 
 
 | 46 | typedef struct | 
 
 
 
 
 | 47 | { | 
 
 
 
 
 | 48 | unsigned short __control_word; | 
 
 
 
 
 | 49 | unsigned short __unused0; | 
 
 
 
 
 | 50 | unsigned short __status_word; | 
 
 
 
 
 | 51 | unsigned short __unused1; | 
 
 
 
 
 | 52 | unsigned short __tag_word; | 
 
 
 
 
 | 53 | unsigned short __unused2; | 
 
 
 
 
 | 54 | unsigned int   __ip_offset;    /* instruction pointer offset */ | 
 
 
 
 
 | 55 | unsigned short __ip_selector; | 
 
 
 
 
 | 56 | unsigned short __opcode; | 
 
 
 
 
 | 57 | unsigned int   __data_offset; | 
 
 
 
 
 | 58 | unsigned short __data_selector; | 
 
 
 
 
 | 59 | unsigned short  __unused3; | 
 
 
 
 
 | 60 | unsigned int __mxcsr; /* contents of the MXCSR register  */ | 
 
 
 
 
 | 61 | } fenv_t; | 
 
 
 
 
 | 62 |  | 
 
 
 
 
 | 63 |  | 
 
 
 
 
 | 64 | /*The C99 standard (7.6.9) allows us to define implementation-specific macros for | 
 
 
 
 
 | 65 | different fp environments */ | 
 
 
 
 
 | 66 |  | 
 
 
 
 
 | 67 | /* The default Intel x87 floating point environment (64-bit mantissa) */ | 
 
 
 
 
 | 68 | #define FE_PC64_ENV ((const fenv_t *)-1) | 
 
 
 
 
 | 69 |  | 
 
 
 
 
 | 70 | /* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ | 
 
 
 
 
 | 71 | #define FE_PC53_ENV ((const fenv_t *)-2) | 
 
 
 
 
 | 72 |  | 
 
 
 
 
 | 73 | /* The FE_DFL_ENV macro is required by standard. | 
 
 
 
 
 | 74 | fesetenv will use the environment set at app startup.*/ | 
 
 
 
 
 | 75 | #define FE_DFL_ENV ((const fenv_t *) 0) | 
 
 
 
 
 | 76 |  | 
 
 
 
 
 | 77 | #ifdef __cplusplus | 
 
 
 
 
 | 78 | extern "C" { | 
 
 
 
 
 | 79 | #endif | 
 
 
 
 
 | 80 |  | 
 
 
 
 
 | 81 | /*TODO: Some of these could be inlined */ | 
 
 
 
 
 | 82 | /* 7.6.2 Exception */ | 
 
 
 
 
 | 83 |  | 
 
 
 
 
 | 84 | extern int __cdecl __MINGW_NOTHROW feclearexcept (int); | 
 
 
 
 
 | 85 | extern int __cdecl __MINGW_NOTHROW fegetexceptflag (fexcept_t * flagp, int excepts); | 
 
 
 
 
 | 86 | extern int __cdecl __MINGW_NOTHROW feraiseexcept (int excepts ); | 
 
 
 
 
 | 87 | extern int __cdecl __MINGW_NOTHROW fesetexceptflag (const fexcept_t *, int); | 
 
 
 
 
 | 88 | extern int __cdecl __MINGW_NOTHROW fetestexcept (int excepts); | 
 
 
 
 
 | 89 |  | 
 
 
 
 
 | 90 | /* 7.6.3 Rounding */ | 
 
 
 
 
 | 91 |  | 
 
 
 
 
 | 92 | extern int __cdecl __MINGW_NOTHROW fegetround (void); | 
 
 
 
 
 | 93 | extern int __cdecl __MINGW_NOTHROW fesetround (int mode); | 
 
 
 
 
 | 94 |  | 
 
 
 
 
 | 95 | /* 7.6.4 Environment */ | 
 
 
 
 
 | 96 |  | 
 
 
 
 
 | 97 | extern int __cdecl __MINGW_NOTHROW fegetenv (fenv_t * envp); | 
 
 
 
 
 | 98 | extern int __cdecl __MINGW_NOTHROW fesetenv (const fenv_t * ); | 
 
 
 
 
 | 99 | extern int __cdecl __MINGW_NOTHROW feupdateenv (const fenv_t *); | 
 
 
 
 
 | 100 | extern int __cdecl __MINGW_NOTHROW feholdexcept (fenv_t *); | 
 
 
 
 
 | 101 |  | 
 
 
 
 
 | 102 | #ifdef __cplusplus | 
 
 
 
 
 | 103 | } | 
 
 
 
 
 | 104 | #endif | 
 
 
 
 
 | 105 | #endif  /* Not RC_INVOKED */ | 
 
 
 
 
 | 106 |  | 
 
 
 
 
 | 107 | #endif /* ndef _FENV_H */ |