From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8925 Path: news.gmane.org!not-for-mail From: Szabolcs Nagy Newsgroups: gmane.linux.lib.musl.general Subject: Re: for information, gcc-4.2.3 miscompiles musl math Date: Sat, 21 Nov 2015 22:54:38 +0100 Message-ID: <20151121215438.GI23362@port70.net> References: <20151121172417.GU26951@example.net> <20151121192548.GD3818@brightrain.aerifal.cx> <20151121194132.GF23362@port70.net> <20151121195144.GF3818@brightrain.aerifal.cx> <20151121200341.GH23362@port70.net> <20151121201551.GG3818@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="hHWLQfXTYDoKhP50" X-Trace: ger.gmane.org 1448142897 16677 80.91.229.3 (21 Nov 2015 21:54:57 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 21 Nov 2015 21:54:57 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-8938-gllmg-musl=m.gmane.org@lists.openwall.com Sat Nov 21 22:54:53 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1a0G7Q-0003Uu-MU for gllmg-musl@m.gmane.org; Sat, 21 Nov 2015 22:54:52 +0100 Original-Received: (qmail 32165 invoked by uid 550); 21 Nov 2015 21:54:50 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 32147 invoked from network); 21 Nov 2015 21:54:50 -0000 Mail-Followup-To: musl@lists.openwall.com Content-Disposition: inline In-Reply-To: <20151121201551.GG3818@brightrain.aerifal.cx> User-Agent: Mutt/1.5.24 (2015-08-30) Xref: news.gmane.org gmane.linux.lib.musl.general:8925 Archived-At: --hHWLQfXTYDoKhP50 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Rich Felker [2015-11-21 15:15:51 -0500]: > I just tested with 4.2.1 binaries from Aboriginal Linux and (1) was > able to reproduce the bug, and (2) made it go away with your patch. > Not only did the bogus out-of-range result go away; the new result is > a bit-exact match for modern gcc. > > Conceptually, it seems to me that for code that explicitly uses > float_t and double_t in expressions and only converts down to float or > double with stores, -ffloat-store should be just as good (albeit > overly pessimizing) as -fexcess-precision=standard. So IMO this looks > like a really good solution, and might come in handy as hardening > against mistakes in new compilers too. IIRC firm used to do this wrong > and I would not be at all surprised if pcc gets it wrong. > i did the changes where i think it was necessary (hypot has asm implementation on i386 though). (in most cases the code already uses float_t, double_t where this would matter.) --hHWLQfXTYDoKhP50 Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="0001-math-make-ffloat-store-work-on-i386.patch" >From c4cf94d37e2c556a2f77b1debe2fe9ec269fdb3e Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sat, 21 Nov 2015 21:23:30 +0000 Subject: [PATCH] math: make -ffloat-store work on i386 old i386 toolchains don't support -fexcess-precision=standard and then musl configure defaults to -ffloat-store to avoid problems because of excess precision. however there are cases when excess precision must not be rounded away so -ffloat-store breaks the code. this patch adds (double_t) casts to double precision arithmetics when the excess precision is required for correct results. (without -ffloat-store or on non-i386 targets the generated code is not changed.) --- src/math/__rem_pio2.c | 2 +- src/math/__rem_pio2f.c | 2 +- src/math/hypot.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/math/__rem_pio2.c b/src/math/__rem_pio2.c index a40db9f..d403f81 100644 --- a/src/math/__rem_pio2.c +++ b/src/math/__rem_pio2.c @@ -118,7 +118,7 @@ int __rem_pio2(double x, double *y) if (ix < 0x413921fb) { /* |x| ~< 2^20*(pi/2), medium size */ medium: /* rint(x/(pi/2)), Assume round-to-nearest. */ - fn = x*invpio2 + toint - toint; + fn = (double_t)x*invpio2 + toint - toint; n = (int32_t)fn; r = x - fn*pio2_1; w = fn*pio2_1t; /* 1st round, good to 85 bits */ diff --git a/src/math/__rem_pio2f.c b/src/math/__rem_pio2f.c index f516385..4473c1c 100644 --- a/src/math/__rem_pio2f.c +++ b/src/math/__rem_pio2f.c @@ -51,7 +51,7 @@ int __rem_pio2f(float x, double *y) /* 25+53 bit pi is good enough for medium size */ if (ix < 0x4dc90fdb) { /* |x| ~< 2^28*(pi/2), medium size */ /* Use a specialized rint() to get fn. Assume round-to-nearest. */ - fn = x*invpio2 + toint - toint; + fn = (double_t)x*invpio2 + toint - toint; n = (int32_t)fn; *y = x - fn*pio2_1 - fn*pio2_1t; return n; diff --git a/src/math/hypot.c b/src/math/hypot.c index 29ec6a4..6071bf1 100644 --- a/src/math/hypot.c +++ b/src/math/hypot.c @@ -12,10 +12,10 @@ static void sq(double_t *hi, double_t *lo, double x) { double_t xh, xl, xc; - xc = x*SPLIT; + xc = (double_t)x*SPLIT; xh = x - xc + xc; xl = x - xh; - *hi = x*x; + *hi = (double_t)x*x; *lo = xh*xh - *hi + 2*xh*xl + xl*xl; } -- 2.4.1 --hHWLQfXTYDoKhP50--