diff options
author | Szabolcs Nagy <nsz@port70.net> | 2013-09-02 00:38:51 +0000 |
---|---|---|
committer | Szabolcs Nagy <nsz@port70.net> | 2013-09-05 11:30:07 +0000 |
commit | af5f6d9556441487e5c66a7a4cfeddf4ed354aa7 (patch) | |
tree | 34a31a68753c2851628109713a3462cb4742ef44 /src/math/__fpclassifyl.c | |
parent | ff4d6020d1c8aaab4f05e561789d6dad3d7ef083 (diff) | |
download | musl-af5f6d9556441487e5c66a7a4cfeddf4ed354aa7.tar.gz musl-af5f6d9556441487e5c66a7a4cfeddf4ed354aa7.tar.bz2 musl-af5f6d9556441487e5c66a7a4cfeddf4ed354aa7.tar.xz musl-af5f6d9556441487e5c66a7a4cfeddf4ed354aa7.zip |
long double cleanup, initial commit
new ldshape union, ld128 support is kept, code that used the old
ldshape union was rewritten (IEEEl2bits union of freebsd libm is
not touched yet)
ld80 __fpclassifyl no longer tries to handle invalid representation
Diffstat (limited to 'src/math/__fpclassifyl.c')
-rw-r--r-- | src/math/__fpclassifyl.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/math/__fpclassifyl.c b/src/math/__fpclassifyl.c index e4d231b5..6365c588 100644 --- a/src/math/__fpclassifyl.c +++ b/src/math/__fpclassifyl.c @@ -3,28 +3,28 @@ #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 #elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 +/* invalid representations (top bit of u.i.m is wrong) are not handled */ int __fpclassifyl(long double x) { - union ldshape u = { x }; - int e = u.bits.exp; - if (!e) { - if (u.bits.m >> 63) return FP_NAN; - else if (u.bits.m) return FP_SUBNORMAL; - else return FP_ZERO; - } + union ldshape u = {x}; + int e = u.i.se & 0x7fff; + if (!e) + return u.i.m ? FP_SUBNORMAL : FP_ZERO; if (e == 0x7fff) - return u.bits.m & (uint64_t)-1>>1 ? FP_NAN : FP_INFINITE; - return u.bits.m & (uint64_t)1<<63 ? FP_NORMAL : FP_NAN; + 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.bits.exp; + union ldshape u = {x}; + int e = u.i.se & 0x7fff; if (!e) - return u.bits.mlo | u.bits.mhi ? FP_SUBNORMAL : FP_ZERO; - if (e == 0x7fff) - return u.bits.mlo | u.bits.mhi ? FP_NAN : FP_INFINITE; + 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 |