Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 May 2017 05:14:53 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Dimitry Andric <dimitry@andric.com>
Cc:        sgk@troutmask.apl.washington.edu, freebsd-hackers@freebsd.org,  numerics@freebsd.org
Subject:   Re: catrig[fl].c and inexact
Message-ID:  <20170514043645.G2059@besplex.bde.org>
In-Reply-To: <FB138623-DF5B-4DBD-94FE-29E21FF7FDC6@andric.com>
References:  <20170512215654.GA82545@troutmask.apl.washington.edu> <20170513103208.M845@besplex.bde.org> <20170513060803.GA84399@troutmask.apl.washington.edu> <F5F8736B-D7E1-48AD-BC6C-8C74AF0A3272@andric.com> <20170513162153.GB88653@troutmask.apl.washington.edu> <FB138623-DF5B-4DBD-94FE-29E21FF7FDC6@andric.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, 13 May 2017, Dimitry Andric wrote:

> On 13 May 2017, at 18:21, Steve Kargl <sgk@troutmask.apl.washington.edu> wrote:
>>
>> On Sat, May 13, 2017 at 03:08:26PM +0200, Dimitry Andric wrote:
> ...
>>
>>> Using the full catrig.c and -O3, I tried gcc 4.2.1, 4.7.4, 4.8.5, 4.9.4,
>>> 5.4.0, 6.3.0 and 7.0.1, in addition to clang 3.4.1, 3.8.0, 3.9.1, 4.0.0
>>> and 5.0.0.
>>
>> Thanks for checking.  I reduced catrig.c to a small self-contained
>> program and indeed I was getting the desired addition of 1 + tiny
>> to raise FE_INEXACT.  I suppose that I'll need to add an appropriate
>> -Wno-foo to my CFLAGS line to suppress the spurious warning, which
>> might be tricky because -Wunused is one option I'ld like to have.
>
> The following also gets rid of the warnings:
>
> Index: lib/msun/src/catrig.c
> ===================================================================
> --- lib/msun/src/catrig.c	(revision 318032)
> +++ lib/msun/src/catrig.c	(working copy)
> @@ -37,7 +37,7 @@
> #define isinf(x)	(fabs(x) == INFINITY)
> #undef isnan
> #define isnan(x)	((x) != (x))
> -#define	raise_inexact()	do { volatile float junk = 1 + tiny; } while(0)
> +#define	raise_inexact()	do { volatile float junk __unused = 1 + tiny; } while(0)
> #undef signbit
> #define signbit(x)	(__builtin_signbit(x))
> ...
>
> If you are OK with that, I will commit it later today.

It is what I said was best yeseterday :-).

Except, __unused is an obfuscation meaning __used.  I couldn't get __used
to work today either.  It works with static variables, but for auto variables
it generates "'__used__' attribute ignored" for both clang-3.9.0 and
gcc-4.2.1, even without any -W flags to ask for excessive warnings.

Today I looked at the macro used(expr), which would be used like used(1
+ tiny) for inexact, used(huge * huge) for overflow, and used(tiny *
tiny) for underflow.  The difficulty is to declare the variable to
hold the result, especially since we don't want this variable to be in
memory.  Also in some cases, we would like to return the result.  For
overflow, we can do either:

 	({ volatile float junk __unused = huge * huge; INFINITY; })

or

 	({ __typeof(huge) r;  STRICT_ASSIGN(..., huge * huge); r; })

with different tradoffs (the second is broken if r is not used and there
is no volatile hidden in STRICT_ASSIGN()),

or better, only load huge once (float t = huge; junk = t * t;).

Bruce



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