You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
10 KiB
338 lines
10 KiB
/* 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<<FE_EX_INTYPE_SHIFT)
|
|
|
|
#define FE_EX_OUTTYPE_FLOAT (FE_EX_BASETYPE_FLOAT << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_DOUBLE (FE_EX_BASETYPE_DOUBLE << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_SHORT (FE_EX_BASETYPE_SHORT << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_USHORT (FE_EX_BASETYPE_USHORT << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_HALF (FE_EX_BASETYPE_HALF << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_INT (FE_EX_BASETYPE_INT << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_LONGLONG (FE_EX_BASETYPE_LONGLONG<<FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_UINT (FE_EX_BASETYPE_UINT << FE_EX_OUTTYPE_SHIFT)
|
|
#define FE_EX_OUTTYPE_ULONGLONG (FE_EX_BASETYPE_ULONGLONG<<FE_EX_OUTTYPE_SHIFT)
|
|
|
|
#define FE_EX_FN_ADD (1 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_SUB (2 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_MUL (3 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_DIV (4 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_REM (5 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_RND (6 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_SQRT (7 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_CVT (8 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_CMP (9 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_LOGB (10 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_SCALBN (11 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_NEXTAFTER (12 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_CVTSCALED (13 << FE_EX_FN_SHIFT)
|
|
#define FE_EX_FN_RAISE (15 << FE_EX_FN_SHIFT)
|
|
|
|
#define FE_EX_CMPRET_UNORDERED (8)
|
|
#define FE_EX_CMPRET_LESS (4)
|
|
#define FE_EX_CMPRET_EQUAL (2)
|
|
#define FE_EX_CMPRET_GREATER (1)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|
|
|