/* fenv.h * * Copyright 1998 ARM Limited. All rights reserved. * * RCS $Revision: 185525 $ * Checkin $Date: 2014-05-29 12:44:48 +0100 (Thu, 29 May 2014) $ * Revising $Author: drodgman $ */ #ifndef __fenv_h #define __fenv_h #define __ARMCLIB_VERSION 5050106 /* * Depending on compiler version __int64 or __INT64_TYPE__ should be defined. */ #ifndef __int64 #ifdef __INT64_TYPE__ #define __int64 __INT64_TYPE__ #endif /* On some architectures neither of these may be defined - if so, fall through and error out if used. */ #endif #ifndef _ARMABI # define _ARMABI __declspec(__nothrow) #endif #ifdef __cplusplus extern "C" { #endif /* * Types. */ #pragma push #pragma anon_unions typedef unsigned int __ieee_edata_t; /* exception flags passed to traps */ typedef union { float __f; float __s; double __d; short __h; unsigned short __uh; int __i; unsigned int __ui; __int64 __l; unsigned __int64 __ul; #ifndef __STRICT_ANSI__ #ifndef f float f; #endif #ifndef s float s; #endif #ifndef d double d; #endif #ifndef h int h; #endif #ifndef uh unsigned int uh; #endif #ifndef i int i; #endif #ifndef ui unsigned int ui; #endif #ifndef l long long l; #endif #ifndef ul unsigned long long ul; #endif #if !defined word1 && !defined word2 && !defined str struct { int word1, word2; } str; #endif #endif /* __STRICT_ANSI__ */ struct { int __word1, __word2; } __str; } __ieee_value_t; /* in/out values passed to traps */ #ifndef __TARGET_ARCH_AARCH64 typedef __attribute__((__pcs__("aapcs"))) __ieee_value_t (*__ieee_handler_t) (__ieee_value_t, __ieee_value_t, __ieee_edata_t); #endif /* __TARGET_ARCH_AARCH64 */ typedef struct { #ifdef __STRICT_ANSI__ unsigned __statusword; #ifndef __TARGET_ARCH_AARCH64 __ieee_handler_t __invalid_handler; __ieee_handler_t __divbyzero_handler; __ieee_handler_t __overflow_handler; __ieee_handler_t __underflow_handler; __ieee_handler_t __inexact_handler; /* does not include inputdenormal */ #endif /* __TARGET_ARCH_AARCH64 */ #else union { unsigned __statusword; #ifndef statusword unsigned statusword; #endif }; #ifndef __TARGET_ARCH_AARCH64 union { __ieee_handler_t __invalid_handler; #ifndef invalid_handler __ieee_handler_t invalid_handler; #endif }; union { __ieee_handler_t __divbyzero_handler; #ifndef divbyzero_handler __ieee_handler_t divbyzero_handler; #endif }; union { __ieee_handler_t __overflow_handler; #ifndef overflow_handler __ieee_handler_t overflow_handler; #endif }; union { __ieee_handler_t __underflow_handler; #ifndef underflow_handler __ieee_handler_t underflow_handler; #endif }; union { __ieee_handler_t __inexact_handler; #ifndef inexact_handler __ieee_handler_t inexact_handler; #endif }; /* does not include inputdenormal */ #endif /* __TARGET_ARCH_AARCH64 */ #endif } fenv_t, fexcept_t; #pragma pop /* restore setting of anon_unions */ /* * Exception flags. */ #define FE_INVALID (0x01) #define FE_DIVBYZERO (0x02) #define FE_OVERFLOW (0x04) #define FE_UNDERFLOW (0x08) #define FE_INEXACT (0x10) #define FE_ALL_EXCEPT (0x1F) /* does not include INPUTDENORMAL */ /* * Rounding modes. */ #define FE_TONEAREST (0) #define FE_UPWARD (1) #define FE_DOWNWARD (2) #define FE_TOWARDZERO (3) /* * Default environment. */ extern const fenv_t __fpl_default_env; #define FE_DFL_ENV (&__fpl_default_env) /* * Exception functions. */ extern _ARMABI int fegetexceptflag(fexcept_t *, int) __attribute__((__nonnull__(1))); extern _ARMABI int fesetexceptflag(const fexcept_t *, int) __attribute__((__nonnull__(1))); extern _ARMABI int feclearexcept(int); extern _ARMABI int feraiseexcept(int); extern _ARMABI int fetestexcept(int); /* * Rounding functions. */ extern _ARMABI int fegetround(void); extern _ARMABI int fesetround(int); /* * Full environment access. */ extern _ARMABI int fegetenv(fenv_t *) __attribute__((__nonnull__(1))); extern _ARMABI int fesetenv(const fenv_t *) __attribute__((__nonnull__(1))); extern _ARMABI int feholdexcept(fenv_t *) __attribute__((__nonnull__(1))); extern _ARMABI int feupdateenv(const fenv_t *) __attribute__((__nonnull__(1))); /* * Implementation-specific: ARM's own optimal status word access * function, and the macros that go with it. */ extern _ARMABI unsigned __ieee_status(unsigned, unsigned); #define FE_IEEE_FLUSHZERO (0x01000000) #define FE_IEEE_ROUND_TONEAREST (0x00000000) #define FE_IEEE_ROUND_UPWARD (0x00400000) #define FE_IEEE_ROUND_DOWNWARD (0x00800000) #define FE_IEEE_ROUND_TOWARDZERO (0x00C00000) #define FE_IEEE_ROUND_MASK (0x00C00000) #define FE_IEEE_MASK_INVALID (0x00000100) #define FE_IEEE_MASK_DIVBYZERO (0x00000200) #define FE_IEEE_MASK_OVERFLOW (0x00000400) #define FE_IEEE_MASK_UNDERFLOW (0x00000800) #define FE_IEEE_MASK_INEXACT (0x00001000) #define FE_IEEE_MASK_INPUTDENORMAL (0x00008000) #define FE_IEEE_MASK_ALL_EXCEPT (0x00009F00) #define FE_IEEE_INVALID (0x00000001) #define FE_IEEE_DIVBYZERO (0x00000002) #define FE_IEEE_OVERFLOW (0x00000004) #define FE_IEEE_UNDERFLOW (0x00000008) #define FE_IEEE_INEXACT (0x00000010) #define FE_IEEE_INPUTDENORMAL (0x00000080) #define FE_IEEE_ALL_EXCEPT (0x0000009F) /* * The constants that define the format of __ieee_edata_t. */ #define FE_EX_RDIR (1U << 31) #define FE_EX_INPUTDENORM_SHIFT (21) #define FE_EX_INPUTDENORM (1 << FE_EX_INPUTDENORM_SHIFT) #define FE_EX_EXCEPT_SHIFT (26) #define FE_EX_EXCEPT_MASK ((0x1F << FE_EX_EXCEPT_SHIFT) \ | FE_EX_INPUTDENORM) #define FE_EX_INEXACT (0x10 << FE_EX_EXCEPT_SHIFT) #define FE_EX_UNDERFLOW (0x08 << FE_EX_EXCEPT_SHIFT) #define FE_EX_OVERFLOW (0x04 << FE_EX_EXCEPT_SHIFT) #define FE_EX_DIVBYZERO (0x02 << FE_EX_EXCEPT_SHIFT) #define FE_EX_INVALID (0x01 << FE_EX_EXCEPT_SHIFT) #define FE_EX_FLUSHZERO_SHIFT (24) #define FE_EX_FLUSHZERO (1 << FE_EX_FLUSHZERO_SHIFT) #define FE_EX_ROUND_SHIFT (22) #define FE_EX_ROUND_MASK (3 << FE_EX_ROUND_SHIFT) #define FE_EX_INTYPE_SHIFT (7) #define FE_EX_INTYPE_MASK (7 << FE_EX_INTYPE_SHIFT) #define FE_EX_OUTTYPE_SHIFT (4) #define FE_EX_OUTTYPE_MASK (7 << FE_EX_OUTTYPE_SHIFT) #define FE_EX_TYPE_SHIFT (4) #define FE_EX_TYPE_MASK (7 << FE_EX_TYPE_SHIFT) #define FE_EX_FN_SHIFT (0) #define FE_EX_FN_MASK (15 << FE_EX_FN_SHIFT) #define FE_EX_ROUND_NEAREST (0 << FE_EX_ROUND_SHIFT) #define FE_EX_ROUND_PLUSINF (1 << FE_EX_ROUND_SHIFT) #define FE_EX_ROUND_MINUSINF (2 << FE_EX_ROUND_SHIFT) #define FE_EX_ROUND_ZERO (3 << FE_EX_ROUND_SHIFT) #define FE_EX_BASETYPE_FLOAT (0) #define FE_EX_BASETYPE_DOUBLE (1) #define FE_EX_BASETYPE_FD (2) /* (float, double) */ #define FE_EX_BASETYPE_DF (3) /* (double, float) */ #define FE_EX_BASETYPE_SHORT (2) /* used only with FN_CVTSCALED */ #define FE_EX_BASETYPE_USHORT (3) /* used only with FN_CVTSCALED */ #define FE_EX_BASETYPE_HALF (2) /* used only with FN_CVT */ #define FE_EX_BASETYPE_INT (4) #define FE_EX_BASETYPE_LONGLONG (5) #define FE_EX_BASETYPE_UINT (6) #define FE_EX_BASETYPE_ULONGLONG (7) #define FE_EX_TYPE_FLOAT (FE_EX_BASETYPE_FLOAT << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_DOUBLE (FE_EX_BASETYPE_DOUBLE << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_SHORT (FE_EX_BASETYPE_SHORT << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_USHORT (FE_EX_BASETYPE_USHORT << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_HALF (FE_EX_BASETYPE_HALF << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_INT (FE_EX_BASETYPE_INT << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_LONGLONG (FE_EX_BASETYPE_LONGLONG << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_UINT (FE_EX_BASETYPE_UINT << FE_EX_TYPE_SHIFT) #define FE_EX_TYPE_ULONGLONG (FE_EX_BASETYPE_ULONGLONG << FE_EX_TYPE_SHIFT) #define FE_EX_INTYPE_FLOAT (FE_EX_BASETYPE_FLOAT << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_DOUBLE (FE_EX_BASETYPE_DOUBLE << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_FD (FE_EX_BASETYPE_FD << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_DF (FE_EX_BASETYPE_DF << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_SHORT (FE_EX_BASETYPE_SHORT << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_USHORT (FE_EX_BASETYPE_USHORT << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_HALF (FE_EX_BASETYPE_HALF << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_INT (FE_EX_BASETYPE_INT << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_LONGLONG (FE_EX_BASETYPE_LONGLONG << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_UINT (FE_EX_BASETYPE_UINT << FE_EX_INTYPE_SHIFT) #define FE_EX_INTYPE_ULONGLONG (FE_EX_BASETYPE_ULONGLONG<