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 /* 23*25c28e83SPiotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 24*25c28e83SPiotr Jasiukajtis */ 25*25c28e83SPiotr Jasiukajtis /* 26*25c28e83SPiotr Jasiukajtis * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 27*25c28e83SPiotr Jasiukajtis * Use is subject to license terms. 28*25c28e83SPiotr Jasiukajtis */ 29*25c28e83SPiotr Jasiukajtis 30*25c28e83SPiotr Jasiukajtis #pragma weak feclearexcept = __feclearexcept 31*25c28e83SPiotr Jasiukajtis #pragma weak feraiseexcept = __feraiseexcept 32*25c28e83SPiotr Jasiukajtis #pragma weak fetestexcept = __fetestexcept 33*25c28e83SPiotr Jasiukajtis #pragma weak fegetexceptflag = __fegetexceptflag 34*25c28e83SPiotr Jasiukajtis #pragma weak fesetexceptflag = __fesetexceptflag 35*25c28e83SPiotr Jasiukajtis 36*25c28e83SPiotr Jasiukajtis #pragma weak feclearexcept96 = __feclearexcept 37*25c28e83SPiotr Jasiukajtis #pragma weak feraiseexcept96 = __feraiseexcept 38*25c28e83SPiotr Jasiukajtis #pragma weak fetestexcept96 = __fetestexcept 39*25c28e83SPiotr Jasiukajtis #pragma weak fegetexceptflag96 = __fegetexceptflag 40*25c28e83SPiotr Jasiukajtis #pragma weak fesetexceptflag96 = __fesetexceptflag 41*25c28e83SPiotr Jasiukajtis 42*25c28e83SPiotr Jasiukajtis #include "fenv_synonyms.h" 43*25c28e83SPiotr Jasiukajtis #include <fenv.h> 44*25c28e83SPiotr Jasiukajtis #include <sys/ieeefp.h> 45*25c28e83SPiotr Jasiukajtis #include <ucontext.h> 46*25c28e83SPiotr Jasiukajtis #include <thread.h> 47*25c28e83SPiotr Jasiukajtis #include "fex_handler.h" 48*25c28e83SPiotr Jasiukajtis #include "fenv_inlines.h" 49*25c28e83SPiotr Jasiukajtis 50*25c28e83SPiotr Jasiukajtis 51*25c28e83SPiotr Jasiukajtis int feclearexcept(int e) 52*25c28e83SPiotr Jasiukajtis { 53*25c28e83SPiotr Jasiukajtis unsigned long fsr; 54*25c28e83SPiotr Jasiukajtis 55*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 56*25c28e83SPiotr Jasiukajtis __fenv_set_ex(fsr, __fenv_get_ex(fsr) & ~e); 57*25c28e83SPiotr Jasiukajtis __fenv_setfsr(&fsr); 58*25c28e83SPiotr Jasiukajtis if (fex_get_log()) 59*25c28e83SPiotr Jasiukajtis __fex_update_te(); 60*25c28e83SPiotr Jasiukajtis return 0; 61*25c28e83SPiotr Jasiukajtis } 62*25c28e83SPiotr Jasiukajtis 63*25c28e83SPiotr Jasiukajtis /* 64*25c28e83SPiotr Jasiukajtis * note - __fex_hdlr depends on fetestexcept following feraiseexcept 65*25c28e83SPiotr Jasiukajtis */ 66*25c28e83SPiotr Jasiukajtis int feraiseexcept(int e) 67*25c28e83SPiotr Jasiukajtis { 68*25c28e83SPiotr Jasiukajtis volatile double t; 69*25c28e83SPiotr Jasiukajtis unsigned long fsr; 70*25c28e83SPiotr Jasiukajtis 71*25c28e83SPiotr Jasiukajtis if (e & FE_INVALID) { 72*25c28e83SPiotr Jasiukajtis t = 0.0; 73*25c28e83SPiotr Jasiukajtis t /= 0.0; 74*25c28e83SPiotr Jasiukajtis } 75*25c28e83SPiotr Jasiukajtis if (e & FE_DIVBYZERO) { 76*25c28e83SPiotr Jasiukajtis t = 1.0e300; 77*25c28e83SPiotr Jasiukajtis t /= 0.0; 78*25c28e83SPiotr Jasiukajtis } 79*25c28e83SPiotr Jasiukajtis if (e & FE_OVERFLOW) { 80*25c28e83SPiotr Jasiukajtis /* if overflow is not trapped, avoid raising inexact */ 81*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 82*25c28e83SPiotr Jasiukajtis if (!(__fenv_get_te(fsr) & (1 << fp_trap_overflow))) { 83*25c28e83SPiotr Jasiukajtis __fenv_set_ex(fsr, __fenv_get_ex(fsr) | FE_OVERFLOW); 84*25c28e83SPiotr Jasiukajtis __fenv_setfsr(&fsr); 85*25c28e83SPiotr Jasiukajtis } 86*25c28e83SPiotr Jasiukajtis else { 87*25c28e83SPiotr Jasiukajtis t = 1.0e300; 88*25c28e83SPiotr Jasiukajtis t *= 1.0e300; 89*25c28e83SPiotr Jasiukajtis } 90*25c28e83SPiotr Jasiukajtis } 91*25c28e83SPiotr Jasiukajtis if (e & FE_UNDERFLOW) { 92*25c28e83SPiotr Jasiukajtis /* if underflow is not trapped, avoid raising inexact */ 93*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 94*25c28e83SPiotr Jasiukajtis if (!(__fenv_get_te(fsr) & (1 << fp_trap_underflow))) { 95*25c28e83SPiotr Jasiukajtis __fenv_set_ex(fsr, __fenv_get_ex(fsr) | FE_UNDERFLOW); 96*25c28e83SPiotr Jasiukajtis __fenv_setfsr(&fsr); 97*25c28e83SPiotr Jasiukajtis } 98*25c28e83SPiotr Jasiukajtis else { 99*25c28e83SPiotr Jasiukajtis t = 1.0e-307; 100*25c28e83SPiotr Jasiukajtis t -= 1.001e-307; 101*25c28e83SPiotr Jasiukajtis } 102*25c28e83SPiotr Jasiukajtis } 103*25c28e83SPiotr Jasiukajtis if (e & FE_INEXACT) { 104*25c28e83SPiotr Jasiukajtis t = 1.0e300; 105*25c28e83SPiotr Jasiukajtis t += 1.0e-307; 106*25c28e83SPiotr Jasiukajtis } 107*25c28e83SPiotr Jasiukajtis return 0; 108*25c28e83SPiotr Jasiukajtis } 109*25c28e83SPiotr Jasiukajtis 110*25c28e83SPiotr Jasiukajtis int fetestexcept(int e) 111*25c28e83SPiotr Jasiukajtis { 112*25c28e83SPiotr Jasiukajtis unsigned long fsr; 113*25c28e83SPiotr Jasiukajtis 114*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 115*25c28e83SPiotr Jasiukajtis return (int)__fenv_get_ex(fsr) & e; 116*25c28e83SPiotr Jasiukajtis } 117*25c28e83SPiotr Jasiukajtis 118*25c28e83SPiotr Jasiukajtis int fegetexceptflag(fexcept_t *p, int e) 119*25c28e83SPiotr Jasiukajtis { 120*25c28e83SPiotr Jasiukajtis unsigned long fsr; 121*25c28e83SPiotr Jasiukajtis 122*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 123*25c28e83SPiotr Jasiukajtis *p = (int)__fenv_get_ex(fsr) & e; 124*25c28e83SPiotr Jasiukajtis return 0; 125*25c28e83SPiotr Jasiukajtis } 126*25c28e83SPiotr Jasiukajtis 127*25c28e83SPiotr Jasiukajtis int fesetexceptflag(const fexcept_t *p, int e) 128*25c28e83SPiotr Jasiukajtis { 129*25c28e83SPiotr Jasiukajtis unsigned long fsr; 130*25c28e83SPiotr Jasiukajtis 131*25c28e83SPiotr Jasiukajtis __fenv_getfsr(&fsr); 132*25c28e83SPiotr Jasiukajtis __fenv_set_ex(fsr, (((int)__fenv_get_ex(fsr) & ~e) | (*p & e)) & 133*25c28e83SPiotr Jasiukajtis FE_ALL_EXCEPT); 134*25c28e83SPiotr Jasiukajtis __fenv_setfsr(&fsr); 135*25c28e83SPiotr Jasiukajtis if (fex_get_log()) 136*25c28e83SPiotr Jasiukajtis __fex_update_te(); 137*25c28e83SPiotr Jasiukajtis return 0; 138*25c28e83SPiotr Jasiukajtis } 139