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

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 ---
This should be closed with WONTFIX.  gcc/gfortran already provides at
least three options to get the requested behavior; namely, -ffast-math,
-Ofast, and -funsafe-math-optimization.  In addition, gfortran maps mod()
to __builtin_fmod() for REAL arguments.  It is trivial to show that gfortran
compiled Fortran code matches gcc compiled C code.

% cat u.f90
function mymod(x,y)
   real mymod
   real, intent(in), value :: x, y
   mymod = mod(x,y)
end function mymod

% cat u.c
#include <math.h>
float
mymod(float x, float y)
{
    return (fmodf(x,y));
}

% gfortran -O3 -S u.f90
% cat u.s
...
   .cfi_startproc
   jmp   fmodf
   .cfi_endproc
...

% gcc -O3 -S u.f90
% cat u.s
...
   .cfi_startproc
   jmp   fmodf
   .cfi_endproc
...

% gfortran -O3 -S -ffast-math u.f90
% cat u.s
...
   .cfi_startproc
   pushq   %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq    %rsp, %rbp
   .cfi_def_cfa_register 6
   movss   %xmm0, -4(%rbp)
   movss   %xmm1, -8(%rbp)
   flds    -8(%rbp)
   flds    -4(%rbp)
.L2:
   fprem
   fnstsw  %ax
   testb   $4, %ah
   jne     .L2
   fstp    %st(1)
   fstps   -4(%rbp)
   movss   -4(%rbp), %xmm0
   popq    %rbp
   .cfi_def_cfa 7, 8
   .ret
   .cfi_endproc
...


% gcc -O3 -S -ffast-math u.f90
   .cfi_startproc
   pushq   %rbp
   .cfi_def_cfa_offset 16
   .cfi_offset 6, -16
   movq    %rsp, %rbp
   .cfi_def_cfa_register 6
   movss   %xmm0, -4(%rbp)
   movss   %xmm1, -8(%rbp)
   flds    -8(%rbp)
   flds    -4(%rbp)
.L2:
   fprem
   fnstsw  %ax
   testb   $4, %ah
   jne     .L2
   fstp    %st(1)
   fstps   -4(%rbp)
   movss   -4(%rbp), %xmm0
   popq    %rbp
   .cfi_def_cfa 7, 8
   ret
   .cfi_endproc


Now, let's look at trans-intrinsic.cc.  One finds the following comment

/* Remainder function MOD(A, P) = A - INT(A / P) * P
                      MODULO(A, P) = A - FLOOR (A / P) * P

   The obvious algorithms above are numerically instable for large
   arguments, hence these intrinsics are instead implemented via calls
   to the fmod family of functions.  It is the responsibility of the
   user to ensure that the second argument is non-zero.  */

In infinite precision arithmetic the above equations could use
a straightforward naive in-lined implementation.  Unfortunately,
computers tend to use finite precision arithmetic, so numerical
algorithms must be appropriately considered (See Goldberg).

Reply via email to