| 1 | /** |
| 2 | * This file has no copyright assigned and is placed in the Public Domain. |
| 3 | * This file is part of the mingw-w64 runtime package. |
| 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| 5 | */ |
| 6 | #define __CRT__NO_INLINE |
| 7 | #include <math.h> |
| 8 | |
| 9 | /* 'fxam' sets FPU flags C3,C2,C0 'fstsw' stores: |
| 10 | FP_NAN			001		0x0100 |
| 11 | FP_NORMAL		010		0x0400 |
| 12 | FP_INFINITE		011		0x0500 |
| 13 | FP_ZERO		100		0x4000 |
| 14 | FP_SUBNORMAL		110		0x4400 |
| 15 | |
| 16 | and sets C1 flag (signbit) if neg */ |
| 17 | |
| 18 | int __fpclassify (double _x) |
| 19 | { |
| 20 | __mingw_dbl_type_t hlp; |
| 21 | unsigned int l, h; |
| 22 | |
| 23 | hlp.x = _x; |
| 24 | h = hlp.lh.high; |
| 25 | l = hlp.lh.low | (h & 0xfffff); |
| 26 | h &= 0x7ff00000; |
| 27 | if ((h | l) == 0) |
| 28 | return FP_ZERO; |
| 29 | if (!h) |
| 30 | return FP_SUBNORMAL; |
| 31 | if (h == 0x7ff00000) |
| 32 | return (l ? FP_NAN : FP_INFINITE); |
| 33 | return FP_NORMAL; |
| 34 | } |