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