diff options
Diffstat (limited to 'usr/src/libm/inc/fenv.h')
-rw-r--r-- | usr/src/libm/inc/fenv.h | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/usr/src/libm/inc/fenv.h b/usr/src/libm/inc/fenv.h new file mode 100644 index 0000000..511fea5 --- /dev/null +++ b/usr/src/libm/inc/fenv.h @@ -0,0 +1,246 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _FENV_H +#define _FENV_H + +#pragma ident "@(#)fenv.h 1.10 05/10/06 SMI" + +#include <sys/feature_tests.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __P +#ifdef __STDC__ +#define __P(p) p +#else +#define __P(p) () +#endif +#endif /* !defined(__P) */ + +/* + * Rounding modes + */ +#if defined(__sparc) + +#define FE_TONEAREST 0 +#define FE_TOWARDZERO 1 +#define FE_UPWARD 2 +#define FE_DOWNWARD 3 + +#elif defined(__i386) || defined(__amd64) + +#define FE_TONEAREST 0 +#define FE_DOWNWARD 1 +#define FE_UPWARD 2 +#define FE_TOWARDZERO 3 + +#endif + +extern int fegetround __P((void)); +extern int fesetround __P((int)); + +#if (defined(__i386) || defined(__amd64)) && \ + (!defined(_STRICT_STDC) || defined(__EXTENSIONS__)) + +#define FE_FLTPREC 0 +#define FE_DBLPREC 2 +#define FE_LDBLPREC 3 + +extern int fegetprec __P((void)); +extern int fesetprec __P((int)); + +#endif + +/* + * Exception flags + */ +#if defined(__sparc) + +#define FE_INEXACT 0x01 +#define FE_DIVBYZERO 0x02 +#define FE_UNDERFLOW 0x04 +#define FE_OVERFLOW 0x08 +#define FE_INVALID 0x10 +#define FE_ALL_EXCEPT 0x1f + +#elif defined(__i386) || defined(__amd64) + +#define FE_INVALID 0x01 +#define FE_DIVBYZERO 0x04 +#define FE_OVERFLOW 0x08 +#define FE_UNDERFLOW 0x10 +#define FE_INEXACT 0x20 +#define FE_ALL_EXCEPT 0x3d + +#endif + +typedef int fexcept_t; + +extern int feclearexcept __P((int)); +extern int feraiseexcept __P((int)); +extern int fetestexcept __P((int)); +extern int fegetexceptflag __P((fexcept_t *, int)); +extern int fesetexceptflag __P((const fexcept_t *, int)); + +#if !defined(_STRICT_STDC) || defined(__EXTENSIONS__) + +/* + * Exception handling extensions + */ +#define FEX_NOHANDLER -1 +#define FEX_NONSTOP 0 +#define FEX_ABORT 1 +#define FEX_SIGNAL 2 +#define FEX_CUSTOM 3 + +#define FEX_INEXACT 0x001 +#define FEX_DIVBYZERO 0x002 +#define FEX_UNDERFLOW 0x004 +#define FEX_OVERFLOW 0x008 +#define FEX_INV_ZDZ 0x010 +#define FEX_INV_IDI 0x020 +#define FEX_INV_ISI 0x040 +#define FEX_INV_ZMI 0x080 +#define FEX_INV_SQRT 0x100 +#define FEX_INV_SNAN 0x200 +#define FEX_INV_INT 0x400 +#define FEX_INV_CMP 0x800 +#define FEX_INVALID 0xff0 +#define FEX_COMMON (FEX_INVALID | FEX_DIVBYZERO | FEX_OVERFLOW) +#define FEX_ALL (FEX_COMMON | FEX_UNDERFLOW | FEX_INEXACT) +#define FEX_NONE 0 + +#define FEX_NUM_EXC 12 + +/* structure to hold a numeric value in any format used by the FPU */ +typedef struct { + enum fex_nt { + fex_nodata = 0, + fex_int = 1, + fex_llong = 2, + fex_float = 3, + fex_double = 4, + fex_ldouble = 5 + } type; + union { + int i; +#if !defined(_STRICT_STDC) && !defined(_NO_LONGLONG) || defined(_STDC_C99) || \ + defined(__C99FEATURES__) + long long l; +#else + struct { + int l[2]; + } l; +#endif + float f; + double d; + long double q; + } val; +} fex_numeric_t; + +/* structure to supply information about an exception to a custom handler */ +typedef struct { + enum fex_op { + fex_add = 0, + fex_sub = 1, + fex_mul = 2, + fex_div = 3, + fex_sqrt = 4, + fex_cnvt = 5, + fex_cmp = 6, + fex_other = 7 + } op; /* operation that caused the exception */ + int flags; /* flags to be set */ + fex_numeric_t op1, op2, res; /* operands and result */ +} fex_info_t; + +typedef struct fex_handler_data { + int __mode; + void (*__handler)(); +} fex_handler_t[FEX_NUM_EXC]; + +extern int fex_get_handling __P((int)); +extern int fex_set_handling __P((int, int, void (*)())); + +extern void fex_getexcepthandler __P((fex_handler_t *, int)); +extern void fex_setexcepthandler __P((const fex_handler_t *, int)); + +#ifdef __STDC__ +#include <stdio_tag.h> +#ifndef _FILEDEFED +#define _FILEDEFED +typedef __FILE FILE; +#endif +#endif +extern FILE *fex_get_log __P((void)); +extern int fex_set_log __P((FILE *)); +extern int fex_get_log_depth __P((void)); +extern int fex_set_log_depth __P((int)); +extern void fex_log_entry __P((const char *)); + +#define __fex_handler_t fex_handler_t + +#else + +typedef struct { + int __mode; + void (*__handler)(); +} __fex_handler_t[12]; + +#endif /* !defined(_STRICT_STDC) || defined(__EXTENSIONS__) */ + +/* + * Environment as a whole + */ +typedef struct { + __fex_handler_t __handlers; + unsigned long __fsr; +} fenv_t; + +#ifdef __STDC__ +extern const fenv_t __fenv_dfl_env; +#else +extern fenv_t __fenv_dfl_env; +#endif + +#define FE_DFL_ENV (&__fenv_dfl_env) + +extern int fegetenv __P((fenv_t *)); +extern int fesetenv __P((const fenv_t *)); +extern int feholdexcept __P((fenv_t *)); +extern int feupdateenv __P((const fenv_t *)); + +#if !defined(_STRICT_STDC) || defined(__EXTENSIONS__) +extern void fex_merge_flags __P((const fenv_t *)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _FENV_H */ |