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 <float.h>
 10
 11
 12/* FPU status word exception flags */
 13#define FE_INEXACT     _SW_INEXACT
 14#define FE_UNDERFLOW   _SW_UNDERFLOW
 15#define FE_OVERFLOW    _SW_OVERFLOW
 16#define FE_DIVBYZERO   _SW_ZERODIVIDE
 17#define FE_INVALID     _SW_INVALID
 18#define FE_ALL_EXCEPT  (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)
 19
 20/* FPU control word rounding flags */
 21#define FE_TONEAREST   _RC_NEAR
 22#define FE_UPWARD      _RC_UP
 23#define FE_DOWNWARD    _RC_DOWN
 24#define FE_TOWARDZERO  _RC_CHOP
 25
 26#if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)
 27
 28/* Amount to shift by to convert an exception to a mask bit.  */
 29#define FE_EXCEPT_SHIFT 0x08
 30
 31#else
 32
 33/* The MXCSR exception flags are the same as the
 34   FE flags. */
 35#define __MXCSR_EXCEPT_FLAG_SHIFT 0
 36
 37/* How much to shift FE status word exception flags
 38   to get the MXCSR exeptions masks,  */
 39#define __MXCSR_EXCEPT_MASK_SHIFT 7
 40
 41/* How much to shift FE status word exception flags
 42   to get MXCSR rounding flags,  */
 43#define __MXCSR_ROUND_FLAG_SHIFT 3
 44
 45#endif /* defined(_ARM_) || defined(__arm__) */
 46
 47#ifndef RC_INVOKED
 48
 49typedef struct
 50{
 51    unsigned long _Fe_ctl;
 52    unsigned long _Fe_stat;
 53} fenv_t;
 54
 55/* Type representing exception flags. */
 56typedef unsigned long fexcept_t;
 57
 58#ifdef __cplusplus
 59extern "C" {
 60#endif
 61
 62/* The FE_DFL_ENV macro is required by standard.
 63   fesetenv will use the environment set at app startup.*/
 64extern const fenv_t __mingw_fe_dfl_env;
 65#define FE_DFL_ENV (&__mingw_fe_dfl_env)
 66
 67/* The C99 standard (7.6.9) allows us to define implementation-specific macros for
 68   different fp environments */
 69#if defined(__i386__) || defined(__x86_64__)
 70
 71/* The default Intel x87 floating point environment (64-bit mantissa) */
 72extern const fenv_t __mingw_fe_pc64_env;
 73#define FE_PC64_ENV (&__mingw_fe_pc64_env)
 74
 75/* The floating point environment set by MSVCRT _fpreset (53-bit mantissa) */
 76extern const fenv_t __mingw_fe_pc53_env;
 77#define FE_PC53_ENV (&__mingw_fe_pc53_env)
 78
 79#endif
 80
 81/*TODO: Some of these could be inlined */
 82/* 7.6.2 Exception */
 83
 84extern int __cdecl feclearexcept (int);
 85extern int __cdecl fegetexceptflag (fexcept_t * flagp, int excepts);
 86extern int __cdecl feraiseexcept (int excepts );
 87extern int __cdecl fesetexceptflag (const fexcept_t *, int);
 88extern int __cdecl fetestexcept (int excepts);
 89
 90/* 7.6.3 Rounding */
 91
 92extern int __cdecl fegetround (void);
 93extern int __cdecl fesetround (int mode);
 94
 95/* 7.6.4 Environment */
 96
 97extern int __cdecl fegetenv(fenv_t * envp);
 98extern int __cdecl fesetenv(const fenv_t * );
 99extern int __cdecl feupdateenv(const fenv_t *);
100extern int __cdecl feholdexcept(fenv_t *);
101
102#ifdef __cplusplus
103}
104#endif
105#endif	/* Not RC_INVOKED */
106
107#endif /* ndef _FENV_H */