blob: 59f55e02f7826e3fb718aa81deeee4352a0b042b [file] [log] [blame]
/**
* 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 defined(__x86_64__) || defined(_AMD64_)
__mingw_fp_types_t hlp;
unsigned int e;
hlp.ld = &_x;
e = hlp.ldt->lh.sign_exponent & 0x7fff;
if (!e)
{
unsigned int h = hlp.ldt->lh.high;
if (!(hlp.ldt->lh.low | h))
return FP_ZERO;
else if (!(h & 0x80000000))
return FP_SUBNORMAL;
}
else if (e == 0x7fff)
return (((hlp.ldt->lh.high & 0x7fffffff) | hlp.ldt->lh.low) == 0 ?
FP_INFINITE : FP_NAN);
return FP_NORMAL;
#elif defined(__arm__) || defined(_ARM_)
return __fpclassify(_x);
#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
}