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