| 1 | /** | 
 
 
 
 
 | 2 | * This file has no copyright assigned and is placed in the Public Domain. | 
 
 
 
 
 | 3 | * This file is part of the mingw-w64 runtime package. | 
 
 
 
 
 | 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. | 
 
 
 
 
 | 5 | */ | 
 
 
 
 
 | 6 | #ifndef _FENV_H_ | 
 
 
 
 
 | 7 | #define _FENV_H_ | 
 
 
 
 
 | 8 |  | 
 
 
 
 
 | 9 | #include <crtdefs.h> | 
 
 
 
 
 | 10 |  | 
 
 
 
 
 | 11 | #if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) | 
 
 
 
 
 | 12 |  | 
 
 
 
 
 | 13 | /* FPU status word exception flags */ | 
 
 
 
 
 | 14 | #define FE_INVALID      0x01 | 
 
 
 
 
 | 15 | #define FE_DIVBYZERO    0x02 | 
 
 
 
 
 | 16 | #define FE_OVERFLOW     0x04 | 
 
 
 
 
 | 17 | #define FE_UNDERFLOW    0x08 | 
 
 
 
 
 | 18 | #define FE_INEXACT      0x10 | 
 
 
 
 
 | 19 | #define FE_ALL_EXCEPT   (FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) | 
 
 
 
 
 | 20 |  | 
 
 
 
 
 | 21 | /* FPU control word rounding flags */ | 
 
 
 
 
 | 22 | #define FE_TONEAREST    0x00000000 | 
 
 
 
 
 | 23 | #define FE_UPWARD       0x00400000 | 
 
 
 
 
 | 24 | #define FE_DOWNWARD     0x00800000 | 
 
 
 
 
 | 25 | #define FE_TOWARDZERO   0x00c00000 | 
 
 
 
 
 | 26 |  | 
 
 
 
 
 | 27 | /* Amount to shift by to convert an exception to a mask bit.  */ | 
 
 
 
 
 | 28 | #define FE_EXCEPT_SHIFT 0x08 | 
 
 
 
 
 | 29 |  | 
 
 
 
 
 | 30 | #else | 
 
 
 
 
 | 31 |  | 
 
 
 
 
 | 32 | #define FE_INVALID      0x01 | 
 
 
 
 
 | 33 | #define FE_DENORMAL     0x02 | 
 
 
 
 
 | 34 | #define FE_DIVBYZERO    0x04 | 
 
 
 
 
 | 35 | #define FE_OVERFLOW     0x08 | 
 
 
 
 
 | 36 | #define FE_UNDERFLOW    0x10 | 
 
 
 
 
 | 37 | #define FE_INEXACT      0x20 | 
 
 
 
 
 | 38 | #define FE_ALL_EXCEPT (FE_INVALID | FE_DENORMAL | FE_DIVBYZERO \ | 
 
 
 
 
 | 39 | | FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) | 
 
 
 
 
 | 40 |  | 
 
 
 
 
 | 41 | /* FPU control word rounding flags */ | 
 
 
 
 
 | 42 | #define FE_TONEAREST    0x0000 | 
 
 
 
 
 | 43 | #define FE_DOWNWARD     0x0400 | 
 
 
 
 
 | 44 | #define FE_UPWARD       0x0800 | 
 
 
 
 
 | 45 | #define FE_TOWARDZERO   0x0c00 | 
 
 
 
 
 | 46 |  | 
 
 
 
 
 | 47 | /* The MXCSR exception flags are the same as the | 
 
 
 
 
 | 48 | FE flags. */ | 
 
 
 
 
 | 49 | #define __MXCSR_EXCEPT_FLAG_SHIFT 0 | 
 
 
 
 
 | 50 |  | 
 
 
 
 
 | 51 | /* How much to shift FE status word exception flags | 
 
 
 
 
 | 52 | to get the MXCSR exeptions masks,  */ | 
 
 
 
 
 | 53 | #define __MXCSR_EXCEPT_MASK_SHIFT 7 | 
 
 
 
 
 | 54 |  | 
 
 
 
 
 | 55 | /* How much to shift FE status word exception flags | 
 
 
 
 
 | 56 | to get MXCSR rounding flags,  */ | 
 
 
 
 
 | 57 | #define __MXCSR_ROUND_FLAG_SHIFT 3 | 
 
 
 
 
 | 58 |  | 
 
 
 
 
 | 59 | #endif /* defined(_ARM_) || defined(__arm__) */ | 
 
 
 
 
 | 60 |  | 
 
 
 
 
 | 61 | #ifndef RC_INVOKED | 
 
 
 
 
 | 62 |  | 
 
 
 
 
 | 63 | #if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) | 
 
 
 
 
 | 64 |  | 
 
 
 
 
 | 65 | /* Type representing exception flags. */ | 
 
 
 
 
 | 66 | typedef unsigned int fexcept_t; | 
 
 
 
 
 | 67 |  | 
 
 
 
 
 | 68 | /* Type representing floating-point environment.  */ | 
 
 
 
 
 | 69 | typedef struct | 
 
 
 
 
 | 70 | { | 
 
 
 
 
 | 71 | unsigned int __cw; | 
 
 
 
 
 | 72 | } fenv_t; | 
 
 
 
 
 | 73 |  | 
 
 
 
 
 | 74 | /* If the default argument is used we use this value.  */ | 
 
 
 
 
 | 75 | #define FE_DFL_ENV  ((const fenv_t *) -1l) | 
 
 
 
 
 | 76 |  | 
 
 
 
 
 | 77 | #else | 
 
 
 
 
 | 78 |  | 
 
 
 
 
 | 79 | /* | 
 
 
 
 
 | 80 | For now, support only for the basic abstraction of flags that are | 
 
 
 
 
 | 81 | either set or clear. fexcept_t could be  structure that holds more | 
 
 
 
 
 | 82 | info about the fp environment. | 
 
 
 
 
 | 83 | */ | 
 
 
 
 
 | 84 | typedef unsigned short fexcept_t; | 
 
 
 
 
 | 85 |  | 
 
 
 
 
 | 86 | /* This 32-byte struct represents the entire floating point | 
 
 
 
 
 | 87 | environment as stored by fnstenv or fstenv, augmented by | 
 
 
 
 
 | 88 | the  contents of the MXCSR register, as stored by stmxcsr | 
 
 
 
 
 | 89 | (if CPU supports it). */ | 
 
 
 
 
 | 90 | typedef struct | 
 
 
 
 
 | 91 | { | 
 
 
 
 
 | 92 | unsigned short __control_word; | 
 
 
 
 
 | 93 | unsigned short __unused0; | 
 
 
 
 
 | 94 | unsigned short __status_word; | 
 
 
 
 
 | 95 | unsigned short __unused1; | 
 
 
 
 
 | 96 | unsigned short __tag_word; | 
 
 
 
 
 | 97 | unsigned short __unused2; | 
 
 
 
 
 | 98 | unsigned int   __ip_offset;    /* instruction pointer offset */ | 
 
 
 
 
 | 99 | unsigned short __ip_selector; | 
 
 
 
 
 | 100 | unsigned short __opcode; | 
 
 
 
 
 | 101 | unsigned int   __data_offset; | 
 
 
 
 
 | 102 | unsigned short __data_selector; | 
 
 
 
 
 | 103 | unsigned short __unused3; | 
 
 
 
 
 | 104 | unsigned int   __mxcsr; /* contents of the MXCSR register  */ | 
 
 
 
 
 | 105 | } fenv_t; | 
 
 
 
 
 | 106 |  | 
 
 
 
 
 | 107 |  | 
 
 
 
 
 | 108 | /*The C99 standard (7.6.9) allows us to define implementation-specific macros for | 
 
 
 
 
 | 109 | different fp environments */ | 
 
 
 
 
 | 110 |  | 
 
 
 
 
 | 111 | /* The default Intel x87 floating point environment (64-bit mantissa) */ | 
 
 
 
 
 | 112 | #define FE_PC64_ENV ((const fenv_t *)-1) | 
 
 
 
 
 | 113 |  | 
 
 
 
 
 | 114 | /* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */ | 
 
 
 
 
 | 115 | #define FE_PC53_ENV ((const fenv_t *)-2) | 
 
 
 
 
 | 116 |  | 
 
 
 
 
 | 117 | /* The FE_DFL_ENV macro is required by standard. | 
 
 
 
 
 | 118 | fesetenv will use the environment set at app startup.*/ | 
 
 
 
 
 | 119 | #define FE_DFL_ENV ((const fenv_t *) 0) | 
 
 
 
 
 | 120 |  | 
 
 
 
 
 | 121 | #endif /* defined(_ARM_) || defined(__arm__) */ | 
 
 
 
 
 | 122 |  | 
 
 
 
 
 | 123 | #ifdef __cplusplus | 
 
 
 
 
 | 124 | extern "C" { | 
 
 
 
 
 | 125 | #endif | 
 
 
 
 
 | 126 |  | 
 
 
 
 
 | 127 | /*TODO: Some of these could be inlined */ | 
 
 
 
 
 | 128 | /* 7.6.2 Exception */ | 
 
 
 
 
 | 129 |  | 
 
 
 
 
 | 130 | extern int __cdecl feclearexcept (int); | 
 
 
 
 
 | 131 | extern int __cdecl fegetexceptflag (fexcept_t * flagp, int excepts); | 
 
 
 
 
 | 132 | extern int __cdecl feraiseexcept (int excepts ); | 
 
 
 
 
 | 133 | extern int __cdecl fesetexceptflag (const fexcept_t *, int); | 
 
 
 
 
 | 134 | extern int __cdecl fetestexcept (int excepts); | 
 
 
 
 
 | 135 |  | 
 
 
 
 
 | 136 | /* 7.6.3 Rounding */ | 
 
 
 
 
 | 137 |  | 
 
 
 
 
 | 138 | extern int __cdecl fegetround (void); | 
 
 
 
 
 | 139 | extern int __cdecl fesetround (int mode); | 
 
 
 
 
 | 140 |  | 
 
 
 
 
 | 141 | /* 7.6.4 Environment */ | 
 
 
 
 
 | 142 |  | 
 
 
 
 
 | 143 | extern int __cdecl fegetenv(fenv_t * envp); | 
 
 
 
 
 | 144 | extern int __cdecl fesetenv(const fenv_t * ); | 
 
 
 
 
 | 145 | extern int __cdecl feupdateenv(const fenv_t *); | 
 
 
 
 
 | 146 | extern int __cdecl feholdexcept(fenv_t *); | 
 
 
 
 
 | 147 |  | 
 
 
 
 
 | 148 | #ifdef __cplusplus | 
 
 
 
 
 | 149 | } | 
 
 
 
 
 | 150 | #endif | 
 
 
 
 
 | 151 | #endif  /* Not RC_INVOKED */ | 
 
 
 
 
 | 152 |  | 
 
 
 
 
 | 153 | #endif /* ndef _FENV_H */ |