| /** | |
| * This file is part of the mingw-w64 runtime package. | |
| * No warranty is given; refer to the file DISCLAIMER within this package. | |
| */ | |
| #define __CRT__NO_INLINE | |
| #include <math.h> | |
| int __fpclassifyl (long double _x){ | |
| #if __SIZEOF_LONG_DOUBLE__ == __SIZEOF_DOUBLE__ | |
| return __fpclassify(_x); | |
| #elif defined(_AMD64_) || defined(__x86_64__) | |
| __mingw_ldbl_type_t hlp; | |
| unsigned int e; | |
| hlp.x = _x; | |
| e = hlp.lh.sign_exponent & 0x7fff; | |
| if (!e) | |
| { | |
| unsigned int h = hlp.lh.high; | |
| if (!(hlp.lh.low | h)) | |
| return FP_ZERO; | |
| else if (!(h & 0x80000000)) | |
| return FP_SUBNORMAL; | |
| } | |
| else if (e == 0x7fff) | |
| return (((hlp.lh.high & 0x7fffffff) | hlp.lh.low) == 0 ? | |
| FP_INFINITE : FP_NAN); | |
| return FP_NORMAL; | |
| #elif defined(__i386__) || defined(_X86_) | |
| unsigned short sw; | |
| __asm__ __volatile__ ( | |
| "fxam; fstsw %%ax;" | |
| : "=a" (sw) | |
| : "t" (_x) | |
| ); | |
| return sw & (FP_NAN | FP_NORMAL | FP_ZERO ); | |
| #endif | |
| } |