previously the external definitions of these functions were omitted on archs where long double is the same as double, since the code paths in the math.h macros which would call them are unreachable. however, even if they are unreachable, the definitions are still mandatory. omitting them is invalid C, and in the case of a non-optimizing compiler, will result in a link error.
36 lines
771 B
C
36 lines
771 B
C
#include "libm.h"
|
|
|
|
#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
|
|
int __fpclassifyl(long double x)
|
|
{
|
|
return __fpclassify(x);
|
|
}
|
|
#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
|
|
int __fpclassifyl(long double x)
|
|
{
|
|
union ldshape u = {x};
|
|
int e = u.i.se & 0x7fff;
|
|
int msb = u.i.m>>63;
|
|
if (!e && !msb)
|
|
return u.i.m ? FP_SUBNORMAL : FP_ZERO;
|
|
if (!msb)
|
|
return FP_NAN;
|
|
if (e == 0x7fff)
|
|
return u.i.m << 1 ? FP_NAN : FP_INFINITE;
|
|
return FP_NORMAL;
|
|
}
|
|
#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
|
|
int __fpclassifyl(long double x)
|
|
{
|
|
union ldshape u = {x};
|
|
int e = u.i.se & 0x7fff;
|
|
if (!e)
|
|
return u.i2.lo | u.i2.hi ? FP_SUBNORMAL : FP_ZERO;
|
|
if (e == 0x7fff) {
|
|
u.i.se = 0;
|
|
return u.i2.lo | u.i2.hi ? FP_NAN : FP_INFINITE;
|
|
}
|
|
return FP_NORMAL;
|
|
}
|
|
#endif
|