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



The following reply was made to PR port-m68k/59616; it has been noted by GNATS.

From: Nat Sloss <nathanialsloss%yahoo.com.au@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: port-m68k-maintainer%netbsd.org@localhost,
 gnats-admin%netbsd.org@localhost,
 netbsd-bugs%netbsd.org@localhost
Subject: Re: port-m68k/59616: m68k softfloat nans and infs have to be preserved when changing sizes
Date: Sat, 30 Aug 2025 05:24:07 +1000

 --Boundary-00=_Y5fsoPBYBycPeiF
 Content-Type: Text/Plain;
   charset="iso-8859-15"
 Content-Transfer-Encoding: 7bit
 
 Opps accidently sent the wrong patch :(
 
 Here's the ammended patch which resuts in 38 failures 1 expected failure.
 
 Best regards,
 
 Nat
 
 --Boundary-00=_Y5fsoPBYBycPeiF
 Content-Type: text/x-patch;
   charset="ISO-8859-1";
   name="m68k-soffloat-ints-nans-v4-final.diff"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
 	filename="m68k-soffloat-ints-nans-v4-final.diff"
 
 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;
 
 --Boundary-00=_Y5fsoPBYBycPeiF--
 


Home | Main Index | Thread Index | Old Index