[Bug fortran/91690] Slow IEEE intrinsics

kargl at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Sep 6 19:25:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91690

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #1 from kargl at gcc dot gnu.org ---

(In reply to Rich Townsend from comment #0)
> Created attachment 46844 [details]
> Demo program
> 
> The intrinsics provided by the IEEE_ARITHMETIC module appear to be
> significantly slower than an equivalent implementation based on inspecting
> bits.
> 

The implementations are not equivalent.  -fdump-tree-original may
shield some light.

is_nan_bits() isn't worried about FPU state (ie., keeping track of 
exceptions).  is_nan_bits is reduced to something simply using simple
bit twiddling.  The following is somewhat edited to reduce length

is_nan_bits (real(kind=4) & x)
{
  integer(kind=4) expn, frac, is_nan, ix, sign;
  {
    integer(kind=8) D.3904, D.3905, D.3906, transfer.0;
    D.3904 = 4;
    D.3905 = 4;
    __builtin_memcpy ((void *) &transfer.0, (void *) x,
                      (unsigned long) MAX_EXPR <MIN_EXPR <D.3905, D.3904>, 0>);
    ix = transfer.0;
  }
  frac = NON_LVALUE_EXPR <ix> & 8388607;
  expn = ix >> 23 & 255;
  sign = (integer(kind=4)) ((unsigned int) ix >> 31);
  is_nan = expn == 255 && frac != 0;
  return is_nan;
}

is_nan_ieee is reduced to something with 2 function calls
to maintain fpu state.

is_nan_ieee (real(kind=4) & restrict x)
{
  c_char fpstate.1[33];
  logical(kind=4) is_nan;
  try
    {
      _gfortran_ieee_procedure_entry ((void *) &fpstate.1);
      is_nan = SAVE_EXPR <*x> unord SAVE_EXPR <*x>;
      return is_nan;
    }
  finally
    {
      _gfortran_ieee_procedure_exit ((void *) &fpstate.1);
    }
}

Both _entry and _exit are manipulating the FPU.


More information about the Gcc-bugs mailing list