1*53ee8cc1Swenshuai.xi #ifndef _IEEE_FP_H_ 2*53ee8cc1Swenshuai.xi #define _IEEE_FP_H_ 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi #include "_ansi.h" 5*53ee8cc1Swenshuai.xi 6*53ee8cc1Swenshuai.xi #include <machine/ieeefp.h> 7*53ee8cc1Swenshuai.xi 8*53ee8cc1Swenshuai.xi _BEGIN_STD_C 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xi /* FIXME FIXME FIXME: 11*53ee8cc1Swenshuai.xi Neither of __ieee_{float,double}_shape_tape seem to be used anywhere 12*53ee8cc1Swenshuai.xi except in libm/test. If that is the case, please delete these from here. 13*53ee8cc1Swenshuai.xi If that is not the case, please insert documentation here describing why 14*53ee8cc1Swenshuai.xi they're needed. */ 15*53ee8cc1Swenshuai.xi 16*53ee8cc1Swenshuai.xi #ifdef __IEEE_BIG_ENDIAN 17*53ee8cc1Swenshuai.xi 18*53ee8cc1Swenshuai.xi typedef union 19*53ee8cc1Swenshuai.xi { 20*53ee8cc1Swenshuai.xi double value; 21*53ee8cc1Swenshuai.xi struct 22*53ee8cc1Swenshuai.xi { 23*53ee8cc1Swenshuai.xi unsigned int sign : 1; 24*53ee8cc1Swenshuai.xi unsigned int exponent: 11; 25*53ee8cc1Swenshuai.xi unsigned int fraction0:4; 26*53ee8cc1Swenshuai.xi unsigned int fraction1:16; 27*53ee8cc1Swenshuai.xi unsigned int fraction2:16; 28*53ee8cc1Swenshuai.xi unsigned int fraction3:16; 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi } number; 31*53ee8cc1Swenshuai.xi struct 32*53ee8cc1Swenshuai.xi { 33*53ee8cc1Swenshuai.xi unsigned int sign : 1; 34*53ee8cc1Swenshuai.xi unsigned int exponent: 11; 35*53ee8cc1Swenshuai.xi unsigned int quiet:1; 36*53ee8cc1Swenshuai.xi unsigned int function0:3; 37*53ee8cc1Swenshuai.xi unsigned int function1:16; 38*53ee8cc1Swenshuai.xi unsigned int function2:16; 39*53ee8cc1Swenshuai.xi unsigned int function3:16; 40*53ee8cc1Swenshuai.xi } nan; 41*53ee8cc1Swenshuai.xi struct 42*53ee8cc1Swenshuai.xi { 43*53ee8cc1Swenshuai.xi unsigned long msw; 44*53ee8cc1Swenshuai.xi unsigned long lsw; 45*53ee8cc1Swenshuai.xi } parts; 46*53ee8cc1Swenshuai.xi long aslong[2]; 47*53ee8cc1Swenshuai.xi } __ieee_double_shape_type; 48*53ee8cc1Swenshuai.xi 49*53ee8cc1Swenshuai.xi #endif 50*53ee8cc1Swenshuai.xi 51*53ee8cc1Swenshuai.xi #ifdef __IEEE_LITTLE_ENDIAN 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi typedef union 54*53ee8cc1Swenshuai.xi { 55*53ee8cc1Swenshuai.xi double value; 56*53ee8cc1Swenshuai.xi struct 57*53ee8cc1Swenshuai.xi { 58*53ee8cc1Swenshuai.xi #ifdef __SMALL_BITFIELDS 59*53ee8cc1Swenshuai.xi unsigned int fraction3:16; 60*53ee8cc1Swenshuai.xi unsigned int fraction2:16; 61*53ee8cc1Swenshuai.xi unsigned int fraction1:16; 62*53ee8cc1Swenshuai.xi unsigned int fraction0: 4; 63*53ee8cc1Swenshuai.xi #else 64*53ee8cc1Swenshuai.xi unsigned int fraction1:32; 65*53ee8cc1Swenshuai.xi unsigned int fraction0:20; 66*53ee8cc1Swenshuai.xi #endif 67*53ee8cc1Swenshuai.xi unsigned int exponent :11; 68*53ee8cc1Swenshuai.xi unsigned int sign : 1; 69*53ee8cc1Swenshuai.xi } number; 70*53ee8cc1Swenshuai.xi struct 71*53ee8cc1Swenshuai.xi { 72*53ee8cc1Swenshuai.xi #ifdef __SMALL_BITFIELDS 73*53ee8cc1Swenshuai.xi unsigned int function3:16; 74*53ee8cc1Swenshuai.xi unsigned int function2:16; 75*53ee8cc1Swenshuai.xi unsigned int function1:16; 76*53ee8cc1Swenshuai.xi unsigned int function0:3; 77*53ee8cc1Swenshuai.xi #else 78*53ee8cc1Swenshuai.xi unsigned int function1:32; 79*53ee8cc1Swenshuai.xi unsigned int function0:19; 80*53ee8cc1Swenshuai.xi #endif 81*53ee8cc1Swenshuai.xi unsigned int quiet:1; 82*53ee8cc1Swenshuai.xi unsigned int exponent: 11; 83*53ee8cc1Swenshuai.xi unsigned int sign : 1; 84*53ee8cc1Swenshuai.xi } nan; 85*53ee8cc1Swenshuai.xi struct 86*53ee8cc1Swenshuai.xi { 87*53ee8cc1Swenshuai.xi unsigned long lsw; 88*53ee8cc1Swenshuai.xi unsigned long msw; 89*53ee8cc1Swenshuai.xi } parts; 90*53ee8cc1Swenshuai.xi 91*53ee8cc1Swenshuai.xi long aslong[2]; 92*53ee8cc1Swenshuai.xi 93*53ee8cc1Swenshuai.xi } __ieee_double_shape_type; 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi #endif 96*53ee8cc1Swenshuai.xi 97*53ee8cc1Swenshuai.xi #ifdef __IEEE_BIG_ENDIAN 98*53ee8cc1Swenshuai.xi 99*53ee8cc1Swenshuai.xi typedef union 100*53ee8cc1Swenshuai.xi { 101*53ee8cc1Swenshuai.xi float value; 102*53ee8cc1Swenshuai.xi struct 103*53ee8cc1Swenshuai.xi { 104*53ee8cc1Swenshuai.xi unsigned int sign : 1; 105*53ee8cc1Swenshuai.xi unsigned int exponent: 8; 106*53ee8cc1Swenshuai.xi unsigned int fraction0: 7; 107*53ee8cc1Swenshuai.xi unsigned int fraction1: 16; 108*53ee8cc1Swenshuai.xi } number; 109*53ee8cc1Swenshuai.xi struct 110*53ee8cc1Swenshuai.xi { 111*53ee8cc1Swenshuai.xi unsigned int sign:1; 112*53ee8cc1Swenshuai.xi unsigned int exponent:8; 113*53ee8cc1Swenshuai.xi unsigned int quiet:1; 114*53ee8cc1Swenshuai.xi unsigned int function0:6; 115*53ee8cc1Swenshuai.xi unsigned int function1:16; 116*53ee8cc1Swenshuai.xi } nan; 117*53ee8cc1Swenshuai.xi long p1; 118*53ee8cc1Swenshuai.xi 119*53ee8cc1Swenshuai.xi } __ieee_float_shape_type; 120*53ee8cc1Swenshuai.xi 121*53ee8cc1Swenshuai.xi #endif 122*53ee8cc1Swenshuai.xi 123*53ee8cc1Swenshuai.xi #ifdef __IEEE_LITTLE_ENDIAN 124*53ee8cc1Swenshuai.xi 125*53ee8cc1Swenshuai.xi typedef union 126*53ee8cc1Swenshuai.xi { 127*53ee8cc1Swenshuai.xi float value; 128*53ee8cc1Swenshuai.xi struct 129*53ee8cc1Swenshuai.xi { 130*53ee8cc1Swenshuai.xi unsigned int fraction0: 7; 131*53ee8cc1Swenshuai.xi unsigned int fraction1: 16; 132*53ee8cc1Swenshuai.xi unsigned int exponent: 8; 133*53ee8cc1Swenshuai.xi unsigned int sign : 1; 134*53ee8cc1Swenshuai.xi } number; 135*53ee8cc1Swenshuai.xi struct 136*53ee8cc1Swenshuai.xi { 137*53ee8cc1Swenshuai.xi unsigned int function1:16; 138*53ee8cc1Swenshuai.xi unsigned int function0:6; 139*53ee8cc1Swenshuai.xi unsigned int quiet:1; 140*53ee8cc1Swenshuai.xi unsigned int exponent:8; 141*53ee8cc1Swenshuai.xi unsigned int sign:1; 142*53ee8cc1Swenshuai.xi } nan; 143*53ee8cc1Swenshuai.xi long p1; 144*53ee8cc1Swenshuai.xi 145*53ee8cc1Swenshuai.xi } __ieee_float_shape_type; 146*53ee8cc1Swenshuai.xi 147*53ee8cc1Swenshuai.xi #endif 148*53ee8cc1Swenshuai.xi 149*53ee8cc1Swenshuai.xi 150*53ee8cc1Swenshuai.xi 151*53ee8cc1Swenshuai.xi 152*53ee8cc1Swenshuai.xi 153*53ee8cc1Swenshuai.xi /* FLOATING ROUNDING */ 154*53ee8cc1Swenshuai.xi 155*53ee8cc1Swenshuai.xi typedef int fp_rnd; 156*53ee8cc1Swenshuai.xi #define FP_RN 0 /* Round to nearest */ 157*53ee8cc1Swenshuai.xi #define FP_RM 1 /* Round down */ 158*53ee8cc1Swenshuai.xi #define FP_RP 2 /* Round up */ 159*53ee8cc1Swenshuai.xi #define FP_RZ 3 /* Round to zero (trunate) */ 160*53ee8cc1Swenshuai.xi 161*53ee8cc1Swenshuai.xi fp_rnd _EXFUN(fpgetround,(void)); 162*53ee8cc1Swenshuai.xi fp_rnd _EXFUN(fpsetround, (fp_rnd)); 163*53ee8cc1Swenshuai.xi 164*53ee8cc1Swenshuai.xi /* EXCEPTIONS */ 165*53ee8cc1Swenshuai.xi 166*53ee8cc1Swenshuai.xi typedef int fp_except; 167*53ee8cc1Swenshuai.xi #define FP_X_INV 0x10 /* Invalid operation */ 168*53ee8cc1Swenshuai.xi #define FP_X_DX 0x80 /* Divide by zero */ 169*53ee8cc1Swenshuai.xi #define FP_X_OFL 0x04 /* Overflow exception */ 170*53ee8cc1Swenshuai.xi #define FP_X_UFL 0x02 /* Underflow exception */ 171*53ee8cc1Swenshuai.xi #define FP_X_IMP 0x01 /* imprecise exception */ 172*53ee8cc1Swenshuai.xi 173*53ee8cc1Swenshuai.xi fp_except _EXFUN(fpgetmask,(void)); 174*53ee8cc1Swenshuai.xi fp_except _EXFUN(fpsetmask,(fp_except)); 175*53ee8cc1Swenshuai.xi fp_except _EXFUN(fpgetsticky,(void)); 176*53ee8cc1Swenshuai.xi fp_except _EXFUN(fpsetsticky, (fp_except)); 177*53ee8cc1Swenshuai.xi 178*53ee8cc1Swenshuai.xi /* INTEGER ROUNDING */ 179*53ee8cc1Swenshuai.xi 180*53ee8cc1Swenshuai.xi typedef int fp_rdi; 181*53ee8cc1Swenshuai.xi #define FP_RDI_TOZ 0 /* Round to Zero */ 182*53ee8cc1Swenshuai.xi #define FP_RDI_RD 1 /* Follow float mode */ 183*53ee8cc1Swenshuai.xi 184*53ee8cc1Swenshuai.xi fp_rdi _EXFUN(fpgetroundtoi,(void)); 185*53ee8cc1Swenshuai.xi fp_rdi _EXFUN(fpsetroundtoi,(fp_rdi)); 186*53ee8cc1Swenshuai.xi 187*53ee8cc1Swenshuai.xi int _EXFUN(isnan, (double)); 188*53ee8cc1Swenshuai.xi int _EXFUN(isinf, (double)); 189*53ee8cc1Swenshuai.xi int _EXFUN(finite, (double)); 190*53ee8cc1Swenshuai.xi 191*53ee8cc1Swenshuai.xi 192*53ee8cc1Swenshuai.xi 193*53ee8cc1Swenshuai.xi int _EXFUN(isnanf, (float)); 194*53ee8cc1Swenshuai.xi int _EXFUN(isinff, (float)); 195*53ee8cc1Swenshuai.xi int _EXFUN(finitef, (float)); 196*53ee8cc1Swenshuai.xi 197*53ee8cc1Swenshuai.xi #define __IEEE_DBL_EXPBIAS 1023 198*53ee8cc1Swenshuai.xi #define __IEEE_FLT_EXPBIAS 127 199*53ee8cc1Swenshuai.xi 200*53ee8cc1Swenshuai.xi #define __IEEE_DBL_EXPLEN 11 201*53ee8cc1Swenshuai.xi #define __IEEE_FLT_EXPLEN 8 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi 204*53ee8cc1Swenshuai.xi #define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1)) 205*53ee8cc1Swenshuai.xi #define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1)) 206*53ee8cc1Swenshuai.xi 207*53ee8cc1Swenshuai.xi #define __IEEE_DBL_MAXPOWTWO ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1)) 208*53ee8cc1Swenshuai.xi #define __IEEE_FLT_MAXPOWTWO ((float)(1L << (32-8) - 1)) 209*53ee8cc1Swenshuai.xi 210*53ee8cc1Swenshuai.xi #define __IEEE_DBL_NAN_EXP 0x7ff 211*53ee8cc1Swenshuai.xi #define __IEEE_FLT_NAN_EXP 0xff 212*53ee8cc1Swenshuai.xi 213*53ee8cc1Swenshuai.xi 214*53ee8cc1Swenshuai.xi #define isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ 215*53ee8cc1Swenshuai.xi ((*(long *)&(x) & 0x007fffffL)!=0000000000L)) 216*53ee8cc1Swenshuai.xi 217*53ee8cc1Swenshuai.xi #define isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \ 218*53ee8cc1Swenshuai.xi ((*(long *)&(x) & 0x007fffffL)==0000000000L)) 219*53ee8cc1Swenshuai.xi 220*53ee8cc1Swenshuai.xi #define finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L)) 221*53ee8cc1Swenshuai.xi 222*53ee8cc1Swenshuai.xi #ifdef _DOUBLE_IS_32BITS 223*53ee8cc1Swenshuai.xi #undef __IEEE_DBL_EXPBIAS 224*53ee8cc1Swenshuai.xi #define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS 225*53ee8cc1Swenshuai.xi 226*53ee8cc1Swenshuai.xi #undef __IEEE_DBL_EXPLEN 227*53ee8cc1Swenshuai.xi #define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN 228*53ee8cc1Swenshuai.xi 229*53ee8cc1Swenshuai.xi #undef __IEEE_DBL_FRACLEN 230*53ee8cc1Swenshuai.xi #define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN 231*53ee8cc1Swenshuai.xi 232*53ee8cc1Swenshuai.xi #undef __IEEE_DBL_MAXPOWTWO 233*53ee8cc1Swenshuai.xi #define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO 234*53ee8cc1Swenshuai.xi 235*53ee8cc1Swenshuai.xi #undef __IEEE_DBL_NAN_EXP 236*53ee8cc1Swenshuai.xi #define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP 237*53ee8cc1Swenshuai.xi 238*53ee8cc1Swenshuai.xi #undef __ieee_double_shape_type 239*53ee8cc1Swenshuai.xi #define __ieee_double_shape_type __ieee_float_shape_type 240*53ee8cc1Swenshuai.xi 241*53ee8cc1Swenshuai.xi #endif /* _DOUBLE_IS_32BITS */ 242*53ee8cc1Swenshuai.xi 243*53ee8cc1Swenshuai.xi _END_STD_C 244*53ee8cc1Swenshuai.xi 245*53ee8cc1Swenshuai.xi #endif /* _IEEE_FP_H_ */ 246