| 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 */ |