NetBSD Problem Report #34553

From www@NetBSD.org  Mon Sep 18 17:33:39 2006
Return-Path: <www@NetBSD.org>
Received: by narn.NetBSD.org (Postfix, from userid 31301)
	id 4BBD663BA82; Mon, 18 Sep 2006 17:33:39 +0000 (UTC)
Message-Id: <20060918173339.4BBD663BA82@narn.NetBSD.org>
Date: Mon, 18 Sep 2006 17:33:39 +0000 (UTC)
From: sigmfsk@aol.com
Reply-To: sigmfsk@aol.com
To: gnats-bugs@NetBSD.org
Subject: gcc -msoft-float with long double doesn't duplicate hard-float
X-Send-Pr-Version: www-1.0

>Number:         34553
>Category:       toolchain
>Synopsis:       gcc -msoft-float with long double doesn't duplicate hard-float
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    toolchain-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Sep 18 17:35:00 +0000 2006
>Last-Modified:  Sat Sep 23 03:03:46 +0000 2006
>Originator:     Arthur Townsend
>Release:        3.0
>Organization:
>Environment:
3.0 for sun3, crosscompiled on NetBSD 3.0 i386, with MKSOFTFLOAT in /etc/mk.conf and --nfp added to /usr/src/tools gcc makefile.
>Description:
when compiling with -msoft-float, floats work, and doubles work, but long doubles don't work (variables declared as long doubles and set to the same thing are shown as not equal).  The softfloat web-site: http://www.jhauser.us/arithmetic/SoftFloat.html says that "SoftFloat's code for the extended double-precision and quadruple-precision formats depends on the existence of a 64-bit integer type in C. If the C compiler used to compile SoftFloat does not support 64-bit integers, SoftFloat will be limited to single and double precisions only." but gcc 3.3.3 for netbsd sun3 has "long long" for 64-bits, so I expect that long double would produce the same results as float/double.
>How-To-Repeat:
The following code compiled with "gcc" doesn't print anything.  When compiled with "-msoft-float", it prints "NOT equal".  If "long double" is changed to float or double, then -msoft-float and regular hard-float compile produce identical results (no output).


#include <stdio.h>

int main()
{
long double a=1.1;
long double b=1.1;

 if (a != b) printf("NOT equal\n");
}

>Fix:

>Release-Note:

>Audit-Trail:
From: SigmFSK@aol.com
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: port-sun3/34553  
Date: Wed, 20 Sep 2006 15:45:59 EDT

 GCC (when built with --nfp -msoft-float) also  can't be trusted for correct 
 operation when using it to compile without  -msoft-float. 

 For example, the following code, compiled with "gcc -S"  generates the same 
 assembly code (with hardware floating point calls) when  compiled either with 
 either GCC built without -msoft-float, or GCC built with  -msoft-float. 

 But when the assembly is linked and run, it runs correctly  with GCC built 
 without -msoft-float, but with a GCC built with -msoft-float, it  generates 
 incorrect output.  GCC built without -msoft-float shows 123.456  for all types, 
 but GCC built with -msoft-float prints 126.976 for the long  double.  Since the 
 entire assembly uses hardware floating point calls  (fmove.x), it must be the 
 printf routine inside GCC that is broken.  

 #include <stdio.h> 

 float f = 123.456; 
 double d =  123.456; 
 long double ld = 123.456; 

 main() 
 { 
 printf("  f:%f\n",f); 
 printf(" d:%f\n",d); 
 printf("ld:%.4Lf\n",ld);  
 } 

 Also, GCC (built with -msoft-float) when printing, as above, a  long double 
 with a value of infinity, shows "nan", whereas GCC built without  -msoft-float 
 shows "inf".  

Responsible-Changed-From-To: port-sun3-maintainer->toolchain-manager
Responsible-Changed-By: tsutsui@netbsd.org
Responsible-Changed-When: Sat, 23 Sep 2006 12:03:46 +0900
Responsible-Changed-Why:
Not sun3 specific but toolchain issue.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.