Subject: Re: pkg/34571: TME sun3 emulator doesn't consider floating point infinities t...
To: None <skrll@NetBSD.org, gnats-admin@netbsd.org, pkgsrc-bugs@netbsd.org,>
From: None <SigmFSK@aol.com>
List: pkgsrc-bugs
Date: 09/28/2006 23:05:03
The following reply was made to PR pkg/34571; it has been noted by GNATS.

From: SigmFSK@aol.com
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/34571: TME sun3 emulator doesn't consider floating point infinities t...
Date: Thu, 28 Sep 2006 19:04:42 EDT

 TME just maps the "fcmp" instruction to "fsub", which is why it doesn't  
 consider infinity equal to itself (since infinity minus infinity should not  equal 
 0.0, but infinity should equal infinity).  
 
 The following changes correct this behavior, and allow the following  
 gcc-3.3.3-testsuite tests to pass under NetBSD 3.0 in TME (as they pass on a  real 
 sun3):
 960405-1.c
 hugeval.c
 inf-1.c
 mzero2.c
 mzero3.c
 
 To fix, I did the following:
 
 modified the script that maps the  m6888x instructions to ieee754 routines so 
 that FCMP has its own routines,  distinct from FSUB, then did a make in the 
 m68k directory.
 
 # diff  m6888x-auto.sh.orig  m6888x-auto.sh
 139c139
 <            56) name=cmp ; name_ieee754=sub ; optype=DST_SRC ;; # fcmp pp  
 326
 ---
 >            56) name=cmp ; optype=DST_SRC ;;    # fcmp pp 326
 #  
 
 
 modified the script that generates the ieee754 routines to add the  cmp, then 
 did a make in the ieee754 directory (notice the last line of  difference is 
 the change to fix the fneg problem of fneg of 0.0 not being  -0.0):
 
 # diff ieee754-ops-auto.sh.orig  ieee754-ops-auto.sh
 129c129
 <            for name in add sub mul div  \
 ---
 >           for  name in add cmp sub mul div  \
 147c147
 <                add | sub | mul | div | rem | pow |  scale)
 ---
 >                add | cmp | sub | mul | div | rem | pow |  scale)
 245a246
 >                    *-cmp) op_builtin='-'  ;;
 252c253
 <                    partial-neg | unknown-neg) op0=0 ; op_builtin='-'; 
 op1=src0  ;;
 ---
 >                    partial-neg | unknown-neg) op0=-1.0 ; op_builtin='*'; 
 op1=src0  ;;
 #
 
 after generating the new ieee754-ops-auto.c, modified each of the  cmp 
 routines (which were created identically to the sub routines) to indicate  that 
 positive infinity is equal to itself, as is negative infinity equal to  itself:
 
 51,57d50
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_SINGLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_SINGLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)))
 <    tme_ieee754_single_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, 0.0);
 < else
 <  
 591,597d583
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)))
 <    tme_ieee754_double_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, 0.0);
 < else
 <  
 1135,1141d1120
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80 )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)))
 <    tme_ieee754_extended80_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, 0.0);
 < else
 <  
 1723,1729d1701
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_QUAD )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD) &
 <        (tme_float_is_negative(src0, TME_FLOAT_FORMAT_IEEE754_QUAD)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD)))
 <    tme_ieee754_quad_value_builtin_set(dst, 
 TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN,  0.0);
 < else
 < 
 2842,2848d2813
 <   if  (tme_float_is_inf(src0, TME_FLOAT_FORMAT_IEEE754_SINGLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_SINGLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)))
 <    tme_ieee754_single_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, 0.0);
 < 
 <  else
 3367,3373d3331
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)))
 <    tme_ieee754_double_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, 0.0);
 < else
 <  
 3892,3898d3849
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80 )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)))
 <    tme_ieee754_extended80_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, 0.0);
 < else
 <  
 4417,4423d4367
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_QUAD )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD) &
 <        (tme_float_is_negative(src0, TME_FLOAT_FORMAT_IEEE754_QUAD)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD)))
 <    tme_ieee754_quad_value_builtin_set(dst, 
 TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN,  0.0);
 < else
 < 
 5662,5668d5605
 <   if  (tme_float_is_inf(src0, TME_FLOAT_FORMAT_IEEE754_SINGLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_SINGLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_SINGLE)))
 <    tme_ieee754_single_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_SINGLE_BUILTIN, 0.0);
 < else
 <  
 5963,5969d5899
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_DOUBLE) ==
 <        tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_DOUBLE)))
 <    tme_ieee754_double_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_DOUBLE_BUILTIN, 0.0);
 < else
 <  
 6264,6270d6193
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80 )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  &
 <       (tme_float_is_negative(src0,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_EXTENDED80)))
 <    tme_ieee754_extended80_value_builtin_set(dst,  
 TME_FLOAT_FORMAT_IEEE754_EXTENDED80_BUILTIN, 0.0);
 < else
 <  
 6565,6571d6487
 <   if (tme_float_is_inf(src0,  TME_FLOAT_FORMAT_IEEE754_QUAD )  &
 <       tme_float_is_inf(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD) &
 <        (tme_float_is_negative(src0, TME_FLOAT_FORMAT_IEEE754_QUAD)  ==
 <       tme_float_is_negative(src1,  TME_FLOAT_FORMAT_IEEE754_QUAD)))
 <    tme_ieee754_quad_value_builtin_set(dst, 
 TME_FLOAT_FORMAT_IEEE754_QUAD_BUILTIN,  0.0);
 < else
 < 
 
 The process of hand-editing the auto  generated c file should be automated, 
 but I believe the above logic is  sound.
 /arthur