http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56944



--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> 2013-04-14 10:21:53 
UTC ---

Maybe in C terms:

isnan(x) -> x!=x

isinf(x) -> fabs(x)>DBL_MAX

isfinite(x) -> fabs(x)<=DBL_MAX



what I am suggesting (with -fno-trapping-math, and maybe -Os) is:

isfinite(x) -> !isnan(x-x)



but even without that, something like:

isfinite(x) -> x & mask1 != mask1 (or <) where mask1 is +inf

Since fabs(x) is implemented as x & mask2, this saves one constant, and it has

the nice advantage of forcing denormals to zero before the comparison, so the

running time of the function is the same for denormals instead of being 100

times longer. Note that writing a C program that convinces gcc to generate

exactly this code is very hard (even using intrinsics or inline asm, I

basically have to write the whole function in asm).

Reply via email to