xref: /utopia/UTPA2-700.0.x/projects/tools/lint/aeon_include/ieeefp.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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