Commit Diff


commit - e54f9a4ad2f163f9455f3de4b3e5574884391790
commit + 35920e96a1bd6dcc5c803582ce9568c2f0a4fdc1
blob - 3a1f2111003ab81e6efd6b58e92e0804f0e1b70c
blob + 7d71915747724c7a40bc8274874a1b26fb1307fd
--- src/lib9/fmt/nan64.c
+++ src/lib9/fmt/nan64.c
@@ -26,11 +26,18 @@ __NaN(void)
 int
 __isNaN(double d)
 {
+	/*
+	 * Used to just say x = *(uvlong*)&d,
+	 * but gcc miscompiles that!
+	 */
+	union {
+		uvlong i;
+		double f;
+	} u;
 	uvlong x;
-	double *p;
-
-	p = &d;
-	x = *(uvlong*)p;
+	
+	u.f = d;
+	x = u.i;
 	/* IEEE 754: exponent bits 0x7FF and non-zero mantissa */
 	return (x&uvinf) == uvinf && (x&~uvneginf) != 0;
 }