Home | History | Annotate | Download | only in include
      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__)
     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__)
     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 */
    154