xref: /titanic_52/usr/src/head/fenv.h (revision 25c28e83beb90e7c80452a7c818c5e6f73a07dc8)
1*25c28e83SPiotr Jasiukajtis /*
2*25c28e83SPiotr Jasiukajtis  * CDDL HEADER START
3*25c28e83SPiotr Jasiukajtis  *
4*25c28e83SPiotr Jasiukajtis  * The contents of this file are subject to the terms of the
5*25c28e83SPiotr Jasiukajtis  * Common Development and Distribution License (the "License").
6*25c28e83SPiotr Jasiukajtis  * You may not use this file except in compliance with the License.
7*25c28e83SPiotr Jasiukajtis  *
8*25c28e83SPiotr Jasiukajtis  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*25c28e83SPiotr Jasiukajtis  * or http://www.opensolaris.org/os/licensing.
10*25c28e83SPiotr Jasiukajtis  * See the License for the specific language governing permissions
11*25c28e83SPiotr Jasiukajtis  * and limitations under the License.
12*25c28e83SPiotr Jasiukajtis  *
13*25c28e83SPiotr Jasiukajtis  * When distributing Covered Code, include this CDDL HEADER in each
14*25c28e83SPiotr Jasiukajtis  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*25c28e83SPiotr Jasiukajtis  * If applicable, add the following below this CDDL HEADER, with the
16*25c28e83SPiotr Jasiukajtis  * fields enclosed by brackets "[]" replaced with your own identifying
17*25c28e83SPiotr Jasiukajtis  * information: Portions Copyright [yyyy] [name of copyright owner]
18*25c28e83SPiotr Jasiukajtis  *
19*25c28e83SPiotr Jasiukajtis  * CDDL HEADER END
20*25c28e83SPiotr Jasiukajtis  */
21*25c28e83SPiotr Jasiukajtis /*
22*25c28e83SPiotr Jasiukajtis  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
23*25c28e83SPiotr Jasiukajtis  */
24*25c28e83SPiotr Jasiukajtis /*
25*25c28e83SPiotr Jasiukajtis  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
26*25c28e83SPiotr Jasiukajtis  * Use is subject to license terms.
27*25c28e83SPiotr Jasiukajtis  */
28*25c28e83SPiotr Jasiukajtis 
29*25c28e83SPiotr Jasiukajtis #ifndef _FENV_H
30*25c28e83SPiotr Jasiukajtis #define	_FENV_H
31*25c28e83SPiotr Jasiukajtis 
32*25c28e83SPiotr Jasiukajtis #include <sys/feature_tests.h>
33*25c28e83SPiotr Jasiukajtis 
34*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus
35*25c28e83SPiotr Jasiukajtis extern "C" {
36*25c28e83SPiotr Jasiukajtis #endif
37*25c28e83SPiotr Jasiukajtis 
38*25c28e83SPiotr Jasiukajtis #ifndef __P
39*25c28e83SPiotr Jasiukajtis #ifdef __STDC__
40*25c28e83SPiotr Jasiukajtis #define	__P(p)	p
41*25c28e83SPiotr Jasiukajtis #else
42*25c28e83SPiotr Jasiukajtis #define	__P(p)	()
43*25c28e83SPiotr Jasiukajtis #endif
44*25c28e83SPiotr Jasiukajtis #endif	/* !defined(__P) */
45*25c28e83SPiotr Jasiukajtis 
46*25c28e83SPiotr Jasiukajtis /*
47*25c28e83SPiotr Jasiukajtis  * Rounding modes
48*25c28e83SPiotr Jasiukajtis  */
49*25c28e83SPiotr Jasiukajtis #if defined(__sparc)
50*25c28e83SPiotr Jasiukajtis 
51*25c28e83SPiotr Jasiukajtis #define	FE_TONEAREST	0
52*25c28e83SPiotr Jasiukajtis #define	FE_TOWARDZERO	1
53*25c28e83SPiotr Jasiukajtis #define	FE_UPWARD	2
54*25c28e83SPiotr Jasiukajtis #define	FE_DOWNWARD	3
55*25c28e83SPiotr Jasiukajtis 
56*25c28e83SPiotr Jasiukajtis #elif defined(__i386) || defined(__amd64)
57*25c28e83SPiotr Jasiukajtis 
58*25c28e83SPiotr Jasiukajtis #define	FE_TONEAREST	0
59*25c28e83SPiotr Jasiukajtis #define	FE_DOWNWARD	1
60*25c28e83SPiotr Jasiukajtis #define	FE_UPWARD	2
61*25c28e83SPiotr Jasiukajtis #define	FE_TOWARDZERO	3
62*25c28e83SPiotr Jasiukajtis 
63*25c28e83SPiotr Jasiukajtis #endif
64*25c28e83SPiotr Jasiukajtis 
65*25c28e83SPiotr Jasiukajtis extern int fegetround __P((void));
66*25c28e83SPiotr Jasiukajtis extern int fesetround __P((int));
67*25c28e83SPiotr Jasiukajtis 
68*25c28e83SPiotr Jasiukajtis #if (defined(__i386) || defined(__amd64)) && \
69*25c28e83SPiotr Jasiukajtis 	(!defined(_STRICT_STDC) || defined(__EXTENSIONS__))
70*25c28e83SPiotr Jasiukajtis 
71*25c28e83SPiotr Jasiukajtis #define	FE_FLTPREC	0
72*25c28e83SPiotr Jasiukajtis #define	FE_DBLPREC	2
73*25c28e83SPiotr Jasiukajtis #define	FE_LDBLPREC	3
74*25c28e83SPiotr Jasiukajtis 
75*25c28e83SPiotr Jasiukajtis extern int fegetprec __P((void));
76*25c28e83SPiotr Jasiukajtis extern int fesetprec __P((int));
77*25c28e83SPiotr Jasiukajtis 
78*25c28e83SPiotr Jasiukajtis #endif
79*25c28e83SPiotr Jasiukajtis 
80*25c28e83SPiotr Jasiukajtis /*
81*25c28e83SPiotr Jasiukajtis  * Exception flags
82*25c28e83SPiotr Jasiukajtis  */
83*25c28e83SPiotr Jasiukajtis #if defined(__sparc)
84*25c28e83SPiotr Jasiukajtis 
85*25c28e83SPiotr Jasiukajtis #define	FE_INEXACT	0x01
86*25c28e83SPiotr Jasiukajtis #define	FE_DIVBYZERO	0x02
87*25c28e83SPiotr Jasiukajtis #define	FE_UNDERFLOW	0x04
88*25c28e83SPiotr Jasiukajtis #define	FE_OVERFLOW	0x08
89*25c28e83SPiotr Jasiukajtis #define	FE_INVALID	0x10
90*25c28e83SPiotr Jasiukajtis #define	FE_ALL_EXCEPT	0x1f
91*25c28e83SPiotr Jasiukajtis 
92*25c28e83SPiotr Jasiukajtis #elif defined(__i386) || defined(__amd64)
93*25c28e83SPiotr Jasiukajtis 
94*25c28e83SPiotr Jasiukajtis #define	FE_INVALID	0x01
95*25c28e83SPiotr Jasiukajtis #define	FE_DIVBYZERO	0x04
96*25c28e83SPiotr Jasiukajtis #define	FE_OVERFLOW	0x08
97*25c28e83SPiotr Jasiukajtis #define	FE_UNDERFLOW	0x10
98*25c28e83SPiotr Jasiukajtis #define	FE_INEXACT	0x20
99*25c28e83SPiotr Jasiukajtis #define	FE_ALL_EXCEPT	0x3d
100*25c28e83SPiotr Jasiukajtis 
101*25c28e83SPiotr Jasiukajtis #endif
102*25c28e83SPiotr Jasiukajtis 
103*25c28e83SPiotr Jasiukajtis typedef int fexcept_t;
104*25c28e83SPiotr Jasiukajtis 
105*25c28e83SPiotr Jasiukajtis extern int feclearexcept __P((int));
106*25c28e83SPiotr Jasiukajtis extern int feraiseexcept __P((int));
107*25c28e83SPiotr Jasiukajtis extern int fetestexcept __P((int));
108*25c28e83SPiotr Jasiukajtis extern int fegetexceptflag __P((fexcept_t *, int));
109*25c28e83SPiotr Jasiukajtis extern int fesetexceptflag __P((const fexcept_t *, int));
110*25c28e83SPiotr Jasiukajtis 
111*25c28e83SPiotr Jasiukajtis #if !defined(_STRICT_STDC) || defined(__EXTENSIONS__)
112*25c28e83SPiotr Jasiukajtis 
113*25c28e83SPiotr Jasiukajtis /*
114*25c28e83SPiotr Jasiukajtis  * Exception handling extensions
115*25c28e83SPiotr Jasiukajtis  */
116*25c28e83SPiotr Jasiukajtis #define	FEX_NOHANDLER	-1
117*25c28e83SPiotr Jasiukajtis #define	FEX_NONSTOP	0
118*25c28e83SPiotr Jasiukajtis #define	FEX_ABORT	1
119*25c28e83SPiotr Jasiukajtis #define	FEX_SIGNAL	2
120*25c28e83SPiotr Jasiukajtis #define	FEX_CUSTOM	3
121*25c28e83SPiotr Jasiukajtis 
122*25c28e83SPiotr Jasiukajtis #define	FEX_INEXACT	0x001
123*25c28e83SPiotr Jasiukajtis #define	FEX_DIVBYZERO	0x002
124*25c28e83SPiotr Jasiukajtis #define	FEX_UNDERFLOW	0x004
125*25c28e83SPiotr Jasiukajtis #define	FEX_OVERFLOW	0x008
126*25c28e83SPiotr Jasiukajtis #define	FEX_INV_ZDZ	0x010
127*25c28e83SPiotr Jasiukajtis #define	FEX_INV_IDI	0x020
128*25c28e83SPiotr Jasiukajtis #define	FEX_INV_ISI	0x040
129*25c28e83SPiotr Jasiukajtis #define	FEX_INV_ZMI	0x080
130*25c28e83SPiotr Jasiukajtis #define	FEX_INV_SQRT	0x100
131*25c28e83SPiotr Jasiukajtis #define	FEX_INV_SNAN	0x200
132*25c28e83SPiotr Jasiukajtis #define	FEX_INV_INT	0x400
133*25c28e83SPiotr Jasiukajtis #define	FEX_INV_CMP	0x800
134*25c28e83SPiotr Jasiukajtis #define	FEX_INVALID	0xff0
135*25c28e83SPiotr Jasiukajtis #define	FEX_COMMON	(FEX_INVALID | FEX_DIVBYZERO | FEX_OVERFLOW)
136*25c28e83SPiotr Jasiukajtis #define	FEX_ALL		(FEX_COMMON | FEX_UNDERFLOW | FEX_INEXACT)
137*25c28e83SPiotr Jasiukajtis #define	FEX_NONE	0
138*25c28e83SPiotr Jasiukajtis 
139*25c28e83SPiotr Jasiukajtis #define	FEX_NUM_EXC	12
140*25c28e83SPiotr Jasiukajtis 
141*25c28e83SPiotr Jasiukajtis /* structure to hold a numeric value in any format used by the FPU */
142*25c28e83SPiotr Jasiukajtis typedef struct {
143*25c28e83SPiotr Jasiukajtis 	enum fex_nt {
144*25c28e83SPiotr Jasiukajtis 		fex_nodata	= 0,
145*25c28e83SPiotr Jasiukajtis 		fex_int		= 1,
146*25c28e83SPiotr Jasiukajtis 		fex_llong	= 2,
147*25c28e83SPiotr Jasiukajtis 		fex_float	= 3,
148*25c28e83SPiotr Jasiukajtis 		fex_double	= 4,
149*25c28e83SPiotr Jasiukajtis 		fex_ldouble	= 5
150*25c28e83SPiotr Jasiukajtis 	} type;
151*25c28e83SPiotr Jasiukajtis 	union {
152*25c28e83SPiotr Jasiukajtis 		int		i;
153*25c28e83SPiotr Jasiukajtis #if !defined(_STRICT_STDC) && !defined(_NO_LONGLONG) || defined(_STDC_C99) || \
154*25c28e83SPiotr Jasiukajtis 	defined(__C99FEATURES__)
155*25c28e83SPiotr Jasiukajtis 		long long	l;
156*25c28e83SPiotr Jasiukajtis #else
157*25c28e83SPiotr Jasiukajtis 		struct {
158*25c28e83SPiotr Jasiukajtis 			int	l[2];
159*25c28e83SPiotr Jasiukajtis 		} l;
160*25c28e83SPiotr Jasiukajtis #endif
161*25c28e83SPiotr Jasiukajtis 		float		f;
162*25c28e83SPiotr Jasiukajtis 		double		d;
163*25c28e83SPiotr Jasiukajtis 		long double	q;
164*25c28e83SPiotr Jasiukajtis 	} val;
165*25c28e83SPiotr Jasiukajtis } fex_numeric_t;
166*25c28e83SPiotr Jasiukajtis 
167*25c28e83SPiotr Jasiukajtis /* structure to supply information about an exception to a custom handler */
168*25c28e83SPiotr Jasiukajtis typedef struct {
169*25c28e83SPiotr Jasiukajtis 	enum fex_op {
170*25c28e83SPiotr Jasiukajtis 		fex_add		= 0,
171*25c28e83SPiotr Jasiukajtis 		fex_sub		= 1,
172*25c28e83SPiotr Jasiukajtis 		fex_mul		= 2,
173*25c28e83SPiotr Jasiukajtis 		fex_div		= 3,
174*25c28e83SPiotr Jasiukajtis 		fex_sqrt	= 4,
175*25c28e83SPiotr Jasiukajtis 		fex_cnvt	= 5,
176*25c28e83SPiotr Jasiukajtis 		fex_cmp		= 6,
177*25c28e83SPiotr Jasiukajtis 		fex_other	= 7
178*25c28e83SPiotr Jasiukajtis 	} op;			/* operation that caused the exception */
179*25c28e83SPiotr Jasiukajtis 	int		flags;	/* flags to be set */
180*25c28e83SPiotr Jasiukajtis 	fex_numeric_t	op1, op2, res;	/* operands and result */
181*25c28e83SPiotr Jasiukajtis } fex_info_t;
182*25c28e83SPiotr Jasiukajtis 
183*25c28e83SPiotr Jasiukajtis typedef struct fex_handler_data {
184*25c28e83SPiotr Jasiukajtis 	int	__mode;
185*25c28e83SPiotr Jasiukajtis 	void	(*__handler)();
186*25c28e83SPiotr Jasiukajtis } fex_handler_t[FEX_NUM_EXC];
187*25c28e83SPiotr Jasiukajtis 
188*25c28e83SPiotr Jasiukajtis extern int fex_get_handling __P((int));
189*25c28e83SPiotr Jasiukajtis extern int fex_set_handling __P((int, int, void (*)()));
190*25c28e83SPiotr Jasiukajtis 
191*25c28e83SPiotr Jasiukajtis extern void fex_getexcepthandler __P((fex_handler_t *, int));
192*25c28e83SPiotr Jasiukajtis extern void fex_setexcepthandler __P((const fex_handler_t *, int));
193*25c28e83SPiotr Jasiukajtis 
194*25c28e83SPiotr Jasiukajtis #ifdef __STDC__
195*25c28e83SPiotr Jasiukajtis #include <stdio_tag.h>
196*25c28e83SPiotr Jasiukajtis #ifndef	_FILEDEFED
197*25c28e83SPiotr Jasiukajtis #define	_FILEDEFED
198*25c28e83SPiotr Jasiukajtis typedef	__FILE FILE;
199*25c28e83SPiotr Jasiukajtis #endif
200*25c28e83SPiotr Jasiukajtis #endif
201*25c28e83SPiotr Jasiukajtis extern FILE *fex_get_log __P((void));
202*25c28e83SPiotr Jasiukajtis extern int fex_set_log __P((FILE *));
203*25c28e83SPiotr Jasiukajtis extern int fex_get_log_depth __P((void));
204*25c28e83SPiotr Jasiukajtis extern int fex_set_log_depth __P((int));
205*25c28e83SPiotr Jasiukajtis extern void fex_log_entry __P((const char *));
206*25c28e83SPiotr Jasiukajtis 
207*25c28e83SPiotr Jasiukajtis #define	__fex_handler_t	fex_handler_t
208*25c28e83SPiotr Jasiukajtis 
209*25c28e83SPiotr Jasiukajtis #else
210*25c28e83SPiotr Jasiukajtis 
211*25c28e83SPiotr Jasiukajtis typedef struct {
212*25c28e83SPiotr Jasiukajtis 	int	__mode;
213*25c28e83SPiotr Jasiukajtis 	void	(*__handler)();
214*25c28e83SPiotr Jasiukajtis } __fex_handler_t[12];
215*25c28e83SPiotr Jasiukajtis 
216*25c28e83SPiotr Jasiukajtis #endif /* !defined(_STRICT_STDC) || defined(__EXTENSIONS__) */
217*25c28e83SPiotr Jasiukajtis 
218*25c28e83SPiotr Jasiukajtis /*
219*25c28e83SPiotr Jasiukajtis  * Environment as a whole
220*25c28e83SPiotr Jasiukajtis  */
221*25c28e83SPiotr Jasiukajtis typedef struct {
222*25c28e83SPiotr Jasiukajtis 	__fex_handler_t	__handlers;
223*25c28e83SPiotr Jasiukajtis 	unsigned long	__fsr;
224*25c28e83SPiotr Jasiukajtis } fenv_t;
225*25c28e83SPiotr Jasiukajtis 
226*25c28e83SPiotr Jasiukajtis #ifdef __STDC__
227*25c28e83SPiotr Jasiukajtis extern const fenv_t __fenv_dfl_env;
228*25c28e83SPiotr Jasiukajtis #else
229*25c28e83SPiotr Jasiukajtis extern fenv_t __fenv_dfl_env;
230*25c28e83SPiotr Jasiukajtis #endif
231*25c28e83SPiotr Jasiukajtis 
232*25c28e83SPiotr Jasiukajtis #define	FE_DFL_ENV	(&__fenv_dfl_env)
233*25c28e83SPiotr Jasiukajtis 
234*25c28e83SPiotr Jasiukajtis extern int fegetenv __P((fenv_t *));
235*25c28e83SPiotr Jasiukajtis extern int fesetenv __P((const fenv_t *));
236*25c28e83SPiotr Jasiukajtis extern int feholdexcept __P((fenv_t *));
237*25c28e83SPiotr Jasiukajtis extern int feupdateenv __P((const fenv_t *));
238*25c28e83SPiotr Jasiukajtis 
239*25c28e83SPiotr Jasiukajtis #if !defined(_STRICT_STDC) || defined(__EXTENSIONS__)
240*25c28e83SPiotr Jasiukajtis extern void fex_merge_flags __P((const fenv_t *));
241*25c28e83SPiotr Jasiukajtis #endif
242*25c28e83SPiotr Jasiukajtis 
243*25c28e83SPiotr Jasiukajtis #ifdef __cplusplus
244*25c28e83SPiotr Jasiukajtis }
245*25c28e83SPiotr Jasiukajtis #endif
246*25c28e83SPiotr Jasiukajtis 
247*25c28e83SPiotr Jasiukajtis #endif	/* _FENV_H */
248