On Wed, 6 Nov 2013, FX wrote:

> GCC has a number of floating-point-related type-generic built-ins, which 
> are great and which we largely rely on in the gfortran runtime library 
> (rather than depending on the possibly poor-quality target math 
> library).
> 
> However, I have not been able to find a way to test for a signaling NaN 
> using the existing built-ins? __builtin_fpclassify() and 
> __builtin_isnan() both return the same thing for quite and signaling 
> NaNs. We have a __builtin_nans() function to generate a signaling NaN, 
> but nothing to find one.
> 
> Am I missing something? Would it be hard to implement such a built-in?

All the usual caveats about floating-point exception and rounding mode 
support in GCC (that optimizations may not reliably respect exceptions and 
rounding modes even when the selected command-line options indicate that 
they should, that operations may not raise the right exceptions, etc.) 
apply here, but to a greater extent - even with -fsignaling-nans, 
signaling NaNs may well not work reliably (whether "reliably" means in 
accordance with the old WG14 proposal from which the __SUPPORT_SNAN__ 
macro was taken, the more recent C bindings in draft TS 18661-1, or 
something else).  I don't know if the existing type-generic built-ins 
properly handle signaling NaNs (this means, for example, that 
__builtin_isnan and other classification built-ins should not raise 
INVALID even for signaling NaN operands, at least if -fsignaling-nans is 
used).

You could certainly implement __builtin_issignaling - but you'd probably 
run into similar issue to those found when adding the issignaling macro 
from draft TS 18661-1 to glibc, that signaling NaNs can get turned into 
quiet NaNs (with INVALID raised) on loads (on 32-bit x86 at least).  See 
bugs 56831 and 58416, at least (the latter shows there's a wrong-code bug 
even for code that never uses NaNs directly at all and so shouldn't even 
need -fsignaling-nans).

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to