summaryrefslogtreecommitdiff
path: root/usr/src/libm/inc/fenv.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/libm/inc/fenv.h')
-rw-r--r--usr/src/libm/inc/fenv.h246
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 */