2004-10-15 Jakub Jelinek <jakub@redhat.com>
[kopensolaris-gnu/glibc.git] / sysdeps / mips / ieee754.h
1 /* Copyright (C) 1992, 1995, 1996, 1999, 2002, 2003
2         Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _IEEE754_H
21
22 #define _IEEE754_H 1
23 #include <features.h>
24
25 #include <endian.h>
26
27 #include <float.h>
28
29 __BEGIN_DECLS
30
31 union ieee754_float
32   {
33     float f;
34
35     /* This is the IEEE 754 single-precision format.  */
36     struct
37       {
38 #if     __BYTE_ORDER == __BIG_ENDIAN
39         unsigned int negative:1;
40         unsigned int exponent:8;
41         unsigned int mantissa:23;
42 #endif                          /* Big endian.  */
43 #if     __BYTE_ORDER == __LITTLE_ENDIAN
44         unsigned int mantissa:23;
45         unsigned int exponent:8;
46         unsigned int negative:1;
47 #endif                          /* Little endian.  */
48       } ieee;
49
50     /* This format makes it easier to see if a NaN is a signalling NaN.  */
51     struct
52       {
53 #if     __BYTE_ORDER == __BIG_ENDIAN
54         unsigned int negative:1;
55         unsigned int exponent:8;
56         unsigned int quiet_nan:1;
57         unsigned int mantissa:22;
58 #endif                          /* Big endian.  */
59 #if     __BYTE_ORDER == __LITTLE_ENDIAN
60         unsigned int mantissa:22;
61         unsigned int quiet_nan:1;
62         unsigned int exponent:8;
63         unsigned int negative:1;
64 #endif                          /* Little endian.  */
65       } ieee_nan;
66   };
67
68 #define IEEE754_FLOAT_BIAS      0x7f /* Added to exponent.  */
69
70
71 union ieee754_double
72   {
73     double d;
74
75     /* This is the IEEE 754 double-precision format.  */
76     struct
77       {
78 #if     __BYTE_ORDER == __BIG_ENDIAN
79         unsigned int negative:1;
80         unsigned int exponent:11;
81         /* Together these comprise the mantissa.  */
82         unsigned int mantissa0:20;
83         unsigned int mantissa1:32;
84 #endif                          /* Big endian.  */
85 #if     __BYTE_ORDER == __LITTLE_ENDIAN
86 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
87         unsigned int mantissa0:20;
88         unsigned int exponent:11;
89         unsigned int negative:1;
90         unsigned int mantissa1:32;
91 # else
92         /* Together these comprise the mantissa.  */
93         unsigned int mantissa1:32;
94         unsigned int mantissa0:20;
95         unsigned int exponent:11;
96         unsigned int negative:1;
97 # endif
98 #endif                          /* Little endian.  */
99       } ieee;
100
101     /* This format makes it easier to see if a NaN is a signalling NaN.  */
102     struct
103       {
104 #if     __BYTE_ORDER == __BIG_ENDIAN
105         unsigned int negative:1;
106         unsigned int exponent:11;
107         unsigned int quiet_nan:1;
108         /* Together these comprise the mantissa.  */
109         unsigned int mantissa0:19;
110         unsigned int mantissa1:32;
111 #else
112 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
113         unsigned int mantissa0:19;
114         unsigned int quiet_nan:1;
115         unsigned int exponent:11;
116         unsigned int negative:1;
117         unsigned int mantissa1:32;
118 # else
119         /* Together these comprise the mantissa.  */
120         unsigned int mantissa1:32;
121         unsigned int mantissa0:19;
122         unsigned int quiet_nan:1;
123         unsigned int exponent:11;
124         unsigned int negative:1;
125 # endif
126 #endif
127       } ieee_nan;
128   };
129
130 #define IEEE754_DOUBLE_BIAS     0x3ff /* Added to exponent.  */
131
132 #if LDBL_MANT_DIG == 113
133
134 union ieee854_long_double
135   {
136     long double d;
137
138     /* This is the IEEE 854 quad-precision format.  */
139     struct
140       {
141 #if     __BYTE_ORDER == __BIG_ENDIAN
142         unsigned int negative:1;
143         unsigned int exponent:15;
144         /* Together these comprise the mantissa.  */
145         unsigned int mantissa0:16;
146         unsigned int mantissa1:32;
147         unsigned int mantissa2:32;
148         unsigned int mantissa3:32;
149 #endif                          /* Big endian.  */
150 #if     __BYTE_ORDER == __LITTLE_ENDIAN
151         /* Together these comprise the mantissa.  */
152         unsigned int mantissa3:32;
153         unsigned int mantissa2:32;
154         unsigned int mantissa1:32;
155         unsigned int mantissa0:16;
156         unsigned int exponent:15;
157         unsigned int negative:1;
158 #endif                          /* Little endian.  */
159       } ieee;
160
161     /* This format makes it easier to see if a NaN is a signalling NaN.  */
162     struct
163       {
164 #if     __BYTE_ORDER == __BIG_ENDIAN
165         unsigned int negative:1;
166         unsigned int exponent:15;
167         unsigned int quiet_nan:1;
168         /* Together these comprise the mantissa.  */
169         unsigned int mantissa0:15;
170         unsigned int mantissa1:32;
171         unsigned int mantissa2:32;
172         unsigned int mantissa3:32;
173 #endif                          /* Big endian.  */
174 #if     __BYTE_ORDER == __LITTLE_ENDIAN
175         /* Together these comprise the mantissa.  */
176         unsigned int mantissa3:32;
177         unsigned int mantissa2:32;
178         unsigned int mantissa1:32;
179         unsigned int mantissa0:15;
180         unsigned int quiet_nan:1;
181         unsigned int exponent:15;
182         unsigned int negative:1;
183 #endif                          /* Little endian.  */
184       } ieee_nan;
185   };
186
187 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
188
189 #elif LDBL_MANT_DIG == 64
190
191 union ieee854_long_double
192   {
193     long double d;
194
195     /* This is the IEEE 854 double-extended-precision format.  */
196     struct
197       {
198 #if     __BYTE_ORDER == __BIG_ENDIAN
199         unsigned int negative:1;
200         unsigned int exponent:15;
201         unsigned int empty:16;
202         unsigned int mantissa0:32;
203         unsigned int mantissa1:32;
204 #endif
205 #if     __BYTE_ORDER == __LITTLE_ENDIAN
206 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
207         unsigned int exponent:15;
208         unsigned int negative:1;
209         unsigned int empty:16;
210         unsigned int mantissa0:32;
211         unsigned int mantissa1:32;
212 # else
213         unsigned int mantissa1:32;
214         unsigned int mantissa0:32;
215         unsigned int exponent:15;
216         unsigned int negative:1;
217         unsigned int empty:16;
218 # endif
219 #endif
220       } ieee;
221
222     /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
223     struct
224       {
225 #if     __BYTE_ORDER == __BIG_ENDIAN
226         unsigned int negative:1;
227         unsigned int exponent:15;
228         unsigned int empty:16;
229         unsigned int one:1;
230         unsigned int quiet_nan:1;
231         unsigned int mantissa0:30;
232         unsigned int mantissa1:32;
233 #endif
234 #if     __BYTE_ORDER == __LITTLE_ENDIAN
235 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
236         unsigned int exponent:15;
237         unsigned int negative:1;
238         unsigned int empty:16;
239         unsigned int mantissa0:30;
240         unsigned int quiet_nan:1;
241         unsigned int one:1;
242         unsigned int mantissa1:32;
243 # else
244         unsigned int mantissa1:32;
245         unsigned int mantissa0:30;
246         unsigned int quiet_nan:1;
247         unsigned int one:1;
248         unsigned int exponent:15;
249         unsigned int negative:1;
250         unsigned int empty:16;
251 # endif
252 #endif
253       } ieee_nan;
254   };
255
256 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
257
258 #elif LDBL_MANT_DIG == 53
259
260 union ieee854_long_double
261   {
262     long double d;
263
264     /* This is the IEEE 754 double-precision format.  */
265     struct
266       {
267 #if     __BYTE_ORDER == __BIG_ENDIAN
268         unsigned int negative:1;
269         unsigned int exponent:11;
270         /* Together these comprise the mantissa.  */
271         unsigned int mantissa0:20;
272         unsigned int mantissa1:32;
273 #endif                          /* Big endian.  */
274 #if     __BYTE_ORDER == __LITTLE_ENDIAN
275 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
276         unsigned int mantissa0:20;
277         unsigned int exponent:11;
278         unsigned int negative:1;
279         unsigned int mantissa1:32;
280 # else
281         /* Together these comprise the mantissa.  */
282         unsigned int mantissa1:32;
283         unsigned int mantissa0:20;
284         unsigned int exponent:11;
285         unsigned int negative:1;
286 # endif
287 #endif                          /* Little endian.  */
288       } ieee;
289
290     /* This format makes it easier to see if a NaN is a signalling NaN.  */
291     struct
292       {
293 #if     __BYTE_ORDER == __BIG_ENDIAN
294         unsigned int negative:1;
295         unsigned int exponent:11;
296         unsigned int quiet_nan:1;
297         /* Together these comprise the mantissa.  */
298         unsigned int mantissa0:19;
299         unsigned int mantissa1:32;
300 #else
301 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
302         unsigned int mantissa0:19;
303         unsigned int quiet_nan:1;
304         unsigned int exponent:11;
305         unsigned int negative:1;
306         unsigned int mantissa1:32;
307 # else
308         /* Together these comprise the mantissa.  */
309         unsigned int mantissa1:32;
310         unsigned int mantissa0:19;
311         unsigned int quiet_nan:1;
312         unsigned int exponent:11;
313         unsigned int negative:1;
314 # endif
315 #endif
316       } ieee_nan;
317   };
318
319 #define IEEE854_LONG_DOUBLE_BIAS        0x3ff /* Added to exponent.  */
320
321 #endif /* LDBL_MANT_DIG == 53 */
322
323 __END_DECLS
324
325 #endif /* ieee754.h */