This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: c++/6914: -O2 and -O give different results for the same validFP code
- From: Michael Veksler <veksler at il dot ibm dot com>
- To: gcc-gnats at gcc dot gnu dot org, gcc-prs at gcc dot gnu dot org, veksler at il dot ibm dot com, gcc-bugs at gcc dot gnu dot org
- Date: Mon, 03 Jun 2002 16:09:30 +0300
- Subject: Re: c++/6914: -O2 and -O give different results for the same validFP code
- Reply-to: veksler at il dot ibm dot com
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6914
So here are my conclusions (after reading the assembly, and running gdb
on it):
Floating point on x86 is done on 80 bit registers (IEEE's double
extended type).
GCC generates code to exploit all 80 bits during divide. It then spills
the result
to memory.
The second divide is not spilled to memory, and the comparison is done
between truncated value (which lost accuracy), and a completely accurate
80 bit
value.
According to http://www.validlab.com/goldberg/paper.ps this does not
seem right.
According to this paper, gcc should operate on double precision (64
bit), or at
least give the impression that it does so (to the outside viewer). But
gcc operates
on a mixed 80/64 bit setting, and that seems contradictory to IEEE spirit
(and, probably, agains ISO C rules).
You can read the section about optimization.