From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10670 invoked by alias); 16 Nov 2010 10:54:52 -0000 Received: (qmail 10659 invoked by uid 22791); 16 Nov 2010 10:54:51 -0000 X-SWARE-Spam-Status: No, hits=-2.8 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from localhost (HELO gcc.gnu.org) (127.0.0.1) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 16 Nov 2010 10:54:45 +0000 From: "jakub at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug target/46080] [4.4/4.5/4.6 Regression] incorrect precision of sqrtf builtin for x87 arithmetic (-mfpmath=387) X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: target X-Bugzilla-Keywords: wrong-code X-Bugzilla-Severity: normal X-Bugzilla-Who: jakub at gcc dot gnu.org X-Bugzilla-Status: RESOLVED X-Bugzilla-Priority: P2 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: 4.4.6 X-Bugzilla-Changed-Fields: Status Resolution Message-ID: In-Reply-To: References: X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated Content-Type: text/plain; charset="UTF-8" MIME-Version: 1.0 Date: Tue, 16 Nov 2010 10:56:00 -0000 Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2010-11/txt/msg02029.txt.bz2 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46080 Jakub Jelinek changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID --- Comment #13 from Jakub Jelinek 2010-11-16 10:54:36 UTC --- Even if we add code to hardcode EDOM value for Linux targets and teach gcc that errno is *__errno_location (), the first sqrtf could still be rounded to float precision (because there is an optional __errno_location () call after it and according to the ABI it might clobber %st(0)) while the remaining two could very well be kept in extended precision and just rounded down to double precision for varargs passing. So I'm afraid there is nothing we can do about this in GCC and there is no GCC bug, but simply the unpredictability of excess precision arithmetics. Use -ffloat-store/-fexcess-precision=standard/volatile float to ensure it works as expected if you care about it.