NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-m68k/59616: m68k softfloat nans and infs have to be preserved when changing sizes



Opps accidently sent the wrong patch :(

Here's the ammended patch which resuts in 38 failures 1 expected failure.

Best regards,

Nat
diff -r 5ad0dfe2fd93 external/gpl3/gcc/dist/libgcc/config/m68k/fpgnulib.c
--- a/external/gpl3/gcc/dist/libgcc/config/m68k/fpgnulib.c	Sun Aug 24 21:39:00 2025 +0000
+++ b/external/gpl3/gcc/dist/libgcc/config/m68k/fpgnulib.c	Sat Aug 30 04:26:38 2025 +1000
@@ -63,7 +63,7 @@
 #define HIDDEND		(1L << 20L)
 #define EXPDBITS	11
 #define EXPDMASK	0x7FFL
-#define EXPD(fp)	(((fp.l.upper) >> 20L) & 0x7FFL)
+#define EXPD(fp)	(((fp.l.upper) >> 20L) & EXPDMASK)
 #define SIGND(fp)	((fp.l.upper) & SIGNBIT)
 #define MANTD(fp)	(((((fp.l.upper) & 0xFFFFF) | HIDDEND) << 10) | \
 				(fp.l.lower >> 22))
@@ -78,6 +78,9 @@
 #define SIGNX(fp)	((fp.l.upper) & SIGNBIT)
 #define MANTXMASK	0x7FFFFFFFL /* mask of upper part */
 
+#define QUIET_NaN	0xFFFFFFFF
+#define POSS_INF_or_NaN	0x7FFFFFFF
+
 union double_long 
 {
   double d;
@@ -242,6 +245,21 @@ double
   fl1.f = a1;
 
   dl.l.upper = SIGN (fl1.l);
+
+  /* special case for inf. */
+  if ((fl1.l & POSS_INF_or_NaN) == 0x7F800000) {
+	dl.l.upper |= 0x7FF00000;
+	dl.l.lower = 0;
+	return dl.d;
+  }
+
+  /* expand the right value for nan */
+  if ((fl1.l & QUIET_NaN) == QUIET_NaN) {
+	dl.l.upper = QUIET_NaN;
+	dl.l.lower = QUIET_NaN;
+	return dl.d;
+  }
+
   if ((fl1.l & ~SIGNBIT) == 0)
     {
       dl.l.lower = 0;
@@ -282,6 +300,20 @@ float
 
   dl1.d = a1;
 
+  /* special case for inf. */
+  if ((dl1.l.upper & POSS_INF_or_NaN) == 0x7FF00000 &&
+      dl1.l.lower == 0) {
+	fl.l = 0x7F800000 | SIGND(dl1);
+	return fl.f;
+  }
+
+  /* special case for nan. */
+  if ((dl1.l.upper & QUIET_NaN) == QUIET_NaN &&
+      dl1.l.lower == QUIET_NaN) {
+	fl.l = QUIET_NaN;
+	return fl.f;
+  }
+
   if ((dl1.l.upper & ~SIGNBIT) == 0 && !dl1.l.lower)
     {
       fl.l = SIGND(dl1);
@@ -425,6 +457,25 @@ long double
   /*printf ("dfxf in: %g\n", d);*/
 
   ldl.l.upper = SIGND (dl);
+
+  /* special case for inf. */
+  if ((dl.l.upper & POSS_INF_or_NaN) == 0x7FF00000 &&
+      dl.l.lower == 0) {
+	ldl.l.upper |= 0x7FFF0000;
+	ldl.l.middle = 0;
+	ldl.l.lower = 0;
+	return ldl.ld;
+  }
+
+  /* special case for nan */
+  if ((dl.l.upper  & QUIET_NaN) == QUIET_NaN &&
+       dl.l.lower == QUIET_NaN) {
+	ldl.l.upper = 0xFFFF0000;
+	ldl.l.middle = QUIET_NaN;
+	ldl.l.lower = QUIET_NaN;
+	return ldl.ld;
+  }
+
   if ((dl.l.upper & ~SIGNBIT) == 0 && !dl.l.lower)
     {
       ldl.l.middle = 0;
@@ -458,6 +509,23 @@ double
   /*printf ("xfdf in: %s\n", dumpxf (ld));*/
 
   dl.l.upper = SIGNX (ldl);
+
+  /* special case for inf. */
+  if ((ldl.l.upper & 0x7FFF0000) == 0x7FFF0000 &&
+      (ldl.l.middle | ldl.l.lower) == 0) {
+	dl.l.upper |= 0x7FF00000;
+	dl.l.lower = 0;
+	return dl.d;
+  }
+
+  /* special case for nan */
+  if ((ldl.l.upper & 0xFFFF0000) == 0xFFFF0000 && ldl.l.middle == QUIET_NaN &&
+      ldl.l.lower == QUIET_NaN) {
+	dl.l.upper = QUIET_NaN;
+	dl.l.lower = QUIET_NaN;
+	return dl.d;
+  }
+
   if ((ldl.l.upper & ~SIGNBIT) == 0 && !ldl.l.middle && !ldl.l.lower)
     {
       dl.l.lower = 0;


Home | Main Index | Thread Index | Old Index