1 #ifndef _IEEE_FP_H_
2 #define _IEEE_FP_H_
3 
4 #include "_ansi.h"
5 
6 #include <machine/ieeefp.h>
7 #include <float.h>
8 #include <stdint.h>
9 
10 _BEGIN_STD_C
11 
12 #ifndef _LDBL_EQ_DBL
13 
14 #ifndef LDBL_MANT_DIG
15 #error "LDBL_MANT_DIG not defined - should be found in float.h"
16 
17 #elif LDBL_MANT_DIG == DBL_MANT_DIG
18 #error "double and long double are the same size but LDBL_EQ_DBL is not defined"
19 
20 #elif LDBL_MANT_DIG == 53
21 /* This happens when doubles are 32-bits and long doubles are 64-bits.  */
22 #define	EXT_EXPBITS	11
23 #define EXT_FRACHBITS	20
24 #define	EXT_FRACLBITS	32
25 #define __ieee_ext_field_type unsigned long
26 
27 #elif LDBL_MANT_DIG == 64
28 #define	EXT_EXPBITS	15
29 #define EXT_FRACHBITS	32
30 #define	EXT_FRACLBITS	32
31 #define __ieee_ext_field_type unsigned int
32 
33 #elif LDBL_MANT_DIG == 65
34 #define	EXT_EXPBITS	15
35 #define EXT_FRACHBITS	32
36 #define	EXT_FRACLBITS	32
37 #define __ieee_ext_field_type unsigned int
38 
39 #elif LDBL_MANT_DIG == 112
40 #define	EXT_EXPBITS	15
41 #define EXT_FRACHBITS	48
42 #define	EXT_FRACLBITS	64
43 #define __ieee_ext_field_type unsigned long long
44 
45 #elif LDBL_MANT_DIG == 113
46 #define	EXT_EXPBITS	15
47 #define EXT_FRACHBITS	48
48 #define	EXT_FRACLBITS	64
49 #define __ieee_ext_field_type unsigned long long
50 
51 #else
52 #error Unsupported value for LDBL_MANT_DIG
53 #endif
54 
55 #define	EXT_EXP_INFNAN	   ((1 << EXT_EXPBITS) - 1) /* 32767 */
56 #define	EXT_EXP_BIAS	   ((1 << (EXT_EXPBITS - 1)) - 1) /* 16383 */
57 #define	EXT_FRACBITS	   (EXT_FRACLBITS + EXT_FRACHBITS)
58 
59 typedef struct ieee_ext
60 {
61   __ieee_ext_field_type	 ext_fracl : EXT_FRACLBITS;
62   __ieee_ext_field_type	 ext_frach : EXT_FRACHBITS;
63   __ieee_ext_field_type	 ext_exp   : EXT_EXPBITS;
64   __ieee_ext_field_type	 ext_sign  : 1;
65 } ieee_ext;
66 
67 typedef union ieee_ext_u
68 {
69   long double		extu_ld;
70   struct ieee_ext	extu_ext;
71 } ieee_ext_u;
72 
73 #endif /* ! _LDBL_EQ_DBL */
74 
75 
76 /* FLOATING ROUNDING */
77 
78 typedef int fp_rnd;
79 #define FP_RN 0 	/* Round to nearest 		*/
80 #define FP_RM 1		/* Round down 			*/
81 #define FP_RP 2		/* Round up 			*/
82 #define FP_RZ 3		/* Round to zero (trunate) 	*/
83 
84 fp_rnd fpgetround (void);
85 fp_rnd fpsetround (fp_rnd);
86 
87 /* EXCEPTIONS */
88 
89 typedef int fp_except;
90 #define FP_X_INV 0x10	/* Invalid operation 		*/
91 #define FP_X_DX  0x80	/* Divide by zero		*/
92 #define FP_X_OFL 0x04	/* Overflow exception		*/
93 #define FP_X_UFL 0x02	/* Underflow exception		*/
94 #define FP_X_IMP 0x01	/* imprecise exception		*/
95 
96 fp_except fpgetmask (void);
97 fp_except fpsetmask (fp_except);
98 fp_except fpgetsticky (void);
99 fp_except fpsetsticky (fp_except);
100 
101 /* INTEGER ROUNDING */
102 
103 typedef int fp_rdi;
104 #define FP_RDI_TOZ 0	/* Round to Zero 		*/
105 #define FP_RDI_RD  1	/* Follow float mode		*/
106 
107 fp_rdi fpgetroundtoi (void);
108 fp_rdi fpsetroundtoi (fp_rdi);
109 
110 #define __IEEE_DBL_EXPBIAS 1023
111 #define __IEEE_FLT_EXPBIAS 127
112 
113 #define __IEEE_DBL_EXPLEN 11
114 #define __IEEE_FLT_EXPLEN 8
115 
116 
117 #define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1))
118 #define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1))
119 
120 #define __IEEE_DBL_MAXPOWTWO	((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1))
121 #define __IEEE_FLT_MAXPOWTWO	((float)(1L << (32-8) - 1))
122 
123 #define __IEEE_DBL_NAN_EXP 0x7ff
124 #define __IEEE_FLT_NAN_EXP 0xff
125 
126 #ifdef __ieeefp_isnanf
127 #define isnanf(x)	__ieeefp_isnanf(x)
128 #endif
129 
130 #ifdef __ieeefp_isinff
131 #define isinff(x)	__ieeefp_isinff(x)
132 #endif
133 
134 #ifdef __ieeefp_finitef
135 #define finitef(x)	__ieeefp_finitef(x)
136 #endif
137 
138 #ifdef _DOUBLE_IS_32BITS
139 #undef __IEEE_DBL_EXPBIAS
140 #define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS
141 
142 #undef __IEEE_DBL_EXPLEN
143 #define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN
144 
145 #undef __IEEE_DBL_FRACLEN
146 #define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN
147 
148 #undef __IEEE_DBL_MAXPOWTWO
149 #define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO
150 
151 #undef __IEEE_DBL_NAN_EXP
152 #define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP
153 
154 #undef __ieee_double_shape_type
155 #define __ieee_double_shape_type __ieee_float_shape_type
156 
157 #endif /* _DOUBLE_IS_32BITS */
158 
159 _END_STD_C
160 
161 #endif /* _IEEE_FP_H_ */
162