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