On Wed, 28 Jan 2015, Tobias Burnus wrote:

> And, looking at the handling in GCC itself (for i386), it is secured by
> 
>   if (SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH
>       && !flag_trapping_math)
> 
> Thus, using -fno-trapping-math or -fno-signaling-nans is enough - no need for
> -funsafe-math-optimizations.
> 
> But that doesn't quite answer the question, why the !flag_trapping_math is
> needed. At least testing shows that both the GCC version and glibc are
> signalling a SNaN (when trapping is enabled).

I suppose !flag_trapping_math might be about preserving "inexact" 
exceptions.

Now, TS 18661-1:2014 says that floor must not raise "inexact", so as to 
make it a correct binding for the IEEE 754-2008 operation 
roundToIntegralTowardNegative.  That operation does not raise any 
exceptions other than for signaling NaN operands (the logic being that the 
mathematical result - the floor of the floating-point argument - is always 
exactly representable in the floating-point format, so there is never any 
inexactness).  C99 and C11 Annex F leave the raising of "inexact" 
unspecified.

So for C99 and C11, given the unspecifiedness of "inexact" exceptions, the 
flag_trapping_math test seems unnecessary.  And the instruction does 
signal "invalid" for sNaN operands, so you shouldn't need to test for 
those either.  For TS 18661-1, the correct instruction variant to use 
would be the one that does not raise "inexact" (argument 9 not 1 for 
rounding mode, I think) - while that might change exceptions relative to a 
library function not following TS 18661-1, changing in the direction of 
being correct seems a good thing.

Thus: I think the relevant GCC code should include ROUND_NO_EXC (= 8) in 
the rounding mode argument when expanding calls to round / floor / ceil / 
trunc functions to use instructions such as roundsd.  But calls to rint 
should *not* use ROUND_NO_EXC (calls to nearbyint *should* use it, but it 
seems SSE4.1 expansion for nearbyint is currently missing from the x86 
back end).  And none of those need to test flag_trapping_math in the case 
of expanding to these SSE4.1 instructions.

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

Reply via email to