about summary refs log tree commit diff
path: root/src/math/__fpclassifyl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/math/__fpclassifyl.c')
-rw-r--r--src/math/__fpclassifyl.c28
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