Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 Jan 2010 02:20:30 +1100 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        gavin@freebsd.org
Cc:        das@freebsd.org, freebsd-standards@freebsd.org, freebsd-amd64@freebsd.org
Subject:   Re: standards/143358: nearbyint raises spurious inexact exception
Message-ID:  <20100131014341.J78095@delplex.bde.org>
In-Reply-To: <201001301251.o0UCpSEP077706@freefall.freebsd.org>
References:  <201001301251.o0UCpSEP077706@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 30 Jan 2010 gavin@freebsd.org wrote:

> Synopsis: nearbyint raises spurious inexact exception

> Note that a comment in the function itself in lib/msun/src/s_nearbyint.c
> does also suggest that this PR is valid, "We save and restore the
> floating-point environment to avoid raising an inexact exception."  I've
> also verified Solaris 10, Linux and FreeBSD 7.2 show the expected behaviour.

This seems to be a bug in gcc-4.2, or perhaps a bug in the inline asms.
gcc-4.2 still works with -O0, but with -O it removes the entire fesetenv()
in nearbyint().  The fegetenv() isn't removed though its result is never
used.  I didn't get anywhere good trying to fix this, but I got to the
following worse place of interest: after replacing the fesetenv(&env) by
fesetenv(&xenv) where xenv is an invalidly initialized global variable
(all 0's), the fegetenv(&env) corrupted the current environment (looks
a bit like xenv was used to initialize the current environment).

Removing fesetenv() in other contexts would give larger bugs.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100131014341.J78095>