altoslib: fix computation of TeleGPS battery voltage
[fw/altos] / src / math / machine / ieeefp.h
1 #ifndef __IEEE_BIG_ENDIAN
2 #ifndef __IEEE_LITTLE_ENDIAN
3
4 /* This file can define macros to choose variations of the IEEE float
5    format:
6
7    _FLT_LARGEST_EXPONENT_IS_NORMAL
8
9         Defined if the float format uses the largest exponent for finite
10         numbers rather than NaN and infinity representations.  Such a
11         format cannot represent NaNs or infinities at all, but it's FLT_MAX
12         is twice the IEEE value.
13
14    _FLT_NO_DENORMALS
15
16         Defined if the float format does not support IEEE denormals.  Every
17         float with a zero exponent is taken to be a zero representation.
18  
19    ??? At the moment, there are no equivalent macros above for doubles and
20    the macros are not fully supported by --enable-newlib-hw-fp.
21
22    __IEEE_BIG_ENDIAN
23
24         Defined if the float format is big endian.  This is mutually exclusive
25         with __IEEE_LITTLE_ENDIAN.
26
27    __IEEE_LITTLE_ENDIAN
28  
29         Defined if the float format is little endian.  This is mutually exclusive
30         with __IEEE_BIG_ENDIAN.
31
32    Note that one of __IEEE_BIG_ENDIAN or __IEEE_LITTLE_ENDIAN must be specified for a
33    platform or error will occur.
34
35    __IEEE_BYTES_LITTLE_ENDIAN
36
37         This flag is used in conjunction with __IEEE_BIG_ENDIAN to describe a situation 
38         whereby multiple words of an IEEE floating point are in big endian order, but the
39         words themselves are little endian with respect to the bytes.
40
41    _DOUBLE_IS_32BITS 
42
43         This is used on platforms that support double by using the 32-bit IEEE
44         float type.
45
46    _FLOAT_ARG
47
48         This represents what type a float arg is passed as.  It is used when the type is
49         not promoted to double.
50         
51 */
52
53 #if (defined(__arm__) || defined(__thumb__)) && !defined(__MAVERICK__)
54 /* ARM traditionally used big-endian words; and within those words the
55    byte ordering was big or little endian depending upon the target.
56    Modern floating-point formats are naturally ordered; in this case
57    __VFP_FP__ will be defined, even if soft-float.  */
58 #ifdef __VFP_FP__
59 # ifdef __ARMEL__
60 #  define __IEEE_LITTLE_ENDIAN
61 # else
62 #  define __IEEE_BIG_ENDIAN
63 # endif
64 #else
65 # define __IEEE_BIG_ENDIAN
66 # ifdef __ARMEL__
67 #  define __IEEE_BYTES_LITTLE_ENDIAN
68 # endif
69 #endif
70 #endif
71
72 #ifdef __hppa__
73 #define __IEEE_BIG_ENDIAN
74 #endif
75
76 #ifdef __SPU__
77 #define __IEEE_BIG_ENDIAN
78
79 #define isfinite(__y) \
80         (__extension__ ({int __cy; \
81                 (sizeof (__y) == sizeof (float))  ? (1) : \
82                 (__cy = fpclassify(__y)) != FP_INFINITE && __cy != FP_NAN;}))
83
84 #define isinf(__x) ((sizeof (__x) == sizeof (float))  ?  (0) : __isinfd(__x))
85 #define isnan(__x) ((sizeof (__x) == sizeof (float))  ?  (0) : __isnand(__x))
86
87 /*
88  * Macros for use in ieeefp.h. We can't just define the real ones here
89  * (like those above) as we have name space issues when this is *not*
90  * included via generic the ieeefp.h.
91  */
92 #define __ieeefp_isnanf(x)      0
93 #define __ieeefp_isinff(x)      0
94 #define __ieeefp_finitef(x)     1
95 #endif
96
97 #ifdef __sparc__
98 #ifdef __LITTLE_ENDIAN_DATA__
99 #define __IEEE_LITTLE_ENDIAN
100 #else
101 #define __IEEE_BIG_ENDIAN
102 #endif
103 #endif
104
105 #if defined(__m68k__) || defined(__mc68000__)
106 #define __IEEE_BIG_ENDIAN
107 #endif
108
109 #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__)
110 #define __IEEE_BIG_ENDIAN
111 #ifdef __HAVE_SHORT_DOUBLE__
112 # define _DOUBLE_IS_32BITS
113 #endif
114 #endif
115
116 #if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) || defined (__H8500__) || defined (__H8300SX__)
117 #define __IEEE_BIG_ENDIAN
118 #define _FLOAT_ARG float
119 #define _DOUBLE_IS_32BITS
120 #endif
121
122 #if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__)
123 #define __IEEE_LITTLE_ENDIAN
124 #define _FLOAT_ARG float
125 #define _DOUBLE_IS_32BITS
126 #endif
127
128
129 #ifdef __sh__
130 #ifdef __LITTLE_ENDIAN__
131 #define __IEEE_LITTLE_ENDIAN
132 #else
133 #define __IEEE_BIG_ENDIAN
134 #endif
135 #if defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A_SINGLE_ONLY__)
136 #define _DOUBLE_IS_32BITS
137 #endif
138 #endif
139
140 #ifdef _AM29K
141 #define __IEEE_BIG_ENDIAN
142 #endif
143
144 #ifdef _WIN32
145 #define __IEEE_LITTLE_ENDIAN
146 #endif
147
148 #ifdef __i386__
149 #define __IEEE_LITTLE_ENDIAN
150 #endif
151
152 #ifdef __i960__
153 #define __IEEE_LITTLE_ENDIAN
154 #endif
155
156 #ifdef __lm32__
157 #define __IEEE_BIG_ENDIAN
158 #endif
159
160 #ifdef __M32R__
161 #define __IEEE_BIG_ENDIAN
162 #endif
163
164 #if defined(_C4x) || defined(_C3x)
165 #define __IEEE_BIG_ENDIAN
166 #define _DOUBLE_IS_32BITS
167 #endif
168
169 #ifdef __TMS320C6X__
170 #ifdef _BIG_ENDIAN
171 #define __IEEE_BIG_ENDIAN
172 #else
173 #define __IEEE_LITTLE_ENDIAN
174 #endif
175 #endif
176
177 #ifdef __TIC80__
178 #define __IEEE_LITTLE_ENDIAN
179 #endif
180
181 #ifdef __MIPSEL__
182 #define __IEEE_LITTLE_ENDIAN
183 #endif
184 #ifdef __MIPSEB__
185 #define __IEEE_BIG_ENDIAN
186 #endif
187
188 #ifdef __MMIX__
189 #define __IEEE_BIG_ENDIAN
190 #endif
191
192 #ifdef __D30V__
193 #define __IEEE_BIG_ENDIAN
194 #endif
195
196 /* necv70 was __IEEE_LITTLE_ENDIAN. */
197
198 #ifdef __W65__
199 #define __IEEE_LITTLE_ENDIAN
200 #define _DOUBLE_IS_32BITS
201 #endif
202
203 #if defined(__Z8001__) || defined(__Z8002__)
204 #define __IEEE_BIG_ENDIAN
205 #endif
206
207 #ifdef __m88k__
208 #define __IEEE_BIG_ENDIAN
209 #endif
210
211 #ifdef __mn10300__
212 #define __IEEE_LITTLE_ENDIAN
213 #endif
214
215 #ifdef __mn10200__
216 #define __IEEE_LITTLE_ENDIAN
217 #define _DOUBLE_IS_32BITS
218 #endif
219
220 #ifdef __v800
221 #define __IEEE_LITTLE_ENDIAN
222 #endif
223
224 #ifdef __v850
225 #define __IEEE_LITTLE_ENDIAN
226 #endif
227
228 #ifdef __D10V__
229 #define __IEEE_BIG_ENDIAN
230 #if __DOUBLE__ == 32
231 #define _DOUBLE_IS_32BITS
232 #endif
233 #endif
234
235 #ifdef __PPC__
236 #if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX)
237 #define __IEEE_BIG_ENDIAN
238 #else
239 #if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(_WIN32) && _WIN32)
240 #define __IEEE_LITTLE_ENDIAN
241 #endif
242 #endif
243 #endif
244
245 #ifdef __xstormy16__
246 #define __IEEE_LITTLE_ENDIAN
247 #endif
248
249 #ifdef __arc__
250 #ifdef __big_endian__
251 #define __IEEE_BIG_ENDIAN
252 #else
253 #define __IEEE_LITTLE_ENDIAN
254 #endif
255 #endif
256
257 #ifdef __CRX__
258 #define __IEEE_LITTLE_ENDIAN
259 #endif
260
261 #ifdef __fr30__
262 #define __IEEE_BIG_ENDIAN
263 #endif
264
265 #ifdef __mcore__
266 #define __IEEE_BIG_ENDIAN
267 #endif
268
269 #ifdef __mt__
270 #define __IEEE_BIG_ENDIAN
271 #endif
272
273 #ifdef __frv__
274 #define __IEEE_BIG_ENDIAN
275 #endif
276
277 #ifdef __moxie__
278 #define __IEEE_BIG_ENDIAN
279 #endif
280
281 #ifdef __ia64__
282 #ifdef __BIG_ENDIAN__
283 #define __IEEE_BIG_ENDIAN
284 #else
285 #define __IEEE_LITTLE_ENDIAN
286 #endif
287 #endif
288
289 #ifdef __AVR__
290 #define __IEEE_LITTLE_ENDIAN
291 #define _DOUBLE_IS_32BITS
292 #endif
293
294 #if defined(__or32__) || defined(__or1k__) || defined(__or16__)
295 #define __IEEE_BIG_ENDIAN
296 #endif
297
298 #ifdef __IP2K__
299 #define __IEEE_BIG_ENDIAN
300 #define __SMALL_BITFIELDS
301 #define _DOUBLE_IS_32BITS
302 #endif
303
304 #ifdef __iq2000__
305 #define __IEEE_BIG_ENDIAN
306 #endif
307
308 #ifdef __MAVERICK__
309 #ifdef __ARMEL__
310 #  define __IEEE_LITTLE_ENDIAN
311 #else  /* must be __ARMEB__ */
312 #  define __IEEE_BIG_ENDIAN
313 #endif /* __ARMEL__ */
314 #endif /* __MAVERICK__ */
315
316 #ifdef __m32c__
317 #define __IEEE_LITTLE_ENDIAN
318 #define __SMALL_BITFIELDS
319 #endif
320
321 #ifdef __CRIS__
322 #define __IEEE_LITTLE_ENDIAN
323 #endif
324
325 #ifdef __BFIN__
326 #define __IEEE_LITTLE_ENDIAN
327 #endif
328
329 #ifdef __x86_64__
330 #define __IEEE_LITTLE_ENDIAN
331 #endif
332
333 #ifdef __mep__
334 #ifdef __LITTLE_ENDIAN__
335 #define __IEEE_LITTLE_ENDIAN
336 #else
337 #define __IEEE_BIG_ENDIAN
338 #endif
339 #endif
340
341 #ifdef __MICROBLAZE__
342 #define __IEEE_BIG_ENDIAN
343 #endif
344
345 #ifdef __RL78__
346 #define __IEEE_LITTLE_ENDIAN
347 #define __SMALL_BITFIELDS       /* 16 Bit INT */
348 #define _DOUBLE_IS_32BITS
349 #endif
350
351 #ifdef __RX__
352
353 #ifdef __RX_BIG_ENDIAN__
354 #define __IEEE_BIG_ENDIAN
355 #else
356 #define __IEEE_LITTLE_ENDIAN
357 #endif
358
359 #ifndef __RX_64BIT_DOUBLES__
360 #define _DOUBLE_IS_32BITS
361 #endif
362
363 #ifdef __RX_16BIT_INTS__
364 #define __SMALL_BITFIELDS
365 #endif
366
367 #endif
368
369 #if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__))
370 #define __IEEE_LITTLE_ENDIAN
371 #define __SMALL_BITFIELDS       /* 16 Bit INT */
372 #endif
373
374 #ifndef __IEEE_BIG_ENDIAN
375 #ifndef __IEEE_LITTLE_ENDIAN
376 #error Endianess not declared!!
377 #endif /* not __IEEE_LITTLE_ENDIAN */
378 #endif /* not __IEEE_BIG_ENDIAN */
379
380 #endif /* not __IEEE_LITTLE_ENDIAN */
381 #endif /* not __IEEE_BIG_ENDIAN */
382