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

--- Comment #13 from dave.anglin at bell dot net ---
On 2026-07-17 7:53 p.m., kargl at gcc dot gnu.org wrote:
> 1. The patch is comment #5 is wrong.  sind(0, cosd(), ... are
> functions where the argument has an unit of degree.  These functions
> are part of Fortran 2023, and have nothing to do with decimal
> arithmetic.

But the functions result in calls to atanl, etc.

I think now it would be better to implement atanl even if the implemention
was a gross hack.
> 2. Your comment #3 shows a program from Harald that uses atand().
> 
>    program test
>      real(16) :: x = 1
>      print *, atand(x)
>    end
> 
> and your reply shows
> 
>    test.f90.006t.original:      D.1079 = __builtin_atanl (x)*
>    5.72957795130823208767981548141051722660080813268252612005e+1;
> 
> which is the correct result in that atanl() has units of radian
> and the constant multiplier converts that to degree.  So, you're
> chasing how does gcc translate __builtin_atanl().

In subsequent tree dumps, the call to __builtin_atanl is changed to a
call to atanl.

I believe gfortran is responsible for the call to __builtin_atanl and the
conversion to degrees.

On HPUX,
> are long double math functions magically translated into libquadmath
> references?  That is, __builtin_atanl(x) somehow ends up as
> atanq((__float128)x)?  

I wish but no.

The above could be used to implement atanl on hppa-hpux:

#if defined(HAVE_ATAN) && !defined(HAVE_ATANL)
#define HAVE_ATANL 1
long double atanl(long double);

long double
atanl(long double x)
{
   return ((long double)atanq((__float128)x));
}
#endif

Casting to/from long double from __float128 works on hppa-hpux.

I think configure could be modified to define USE_LIBQUADMATH when libquadmath
support isn't disabled.
 > Does
> 
>   #include <math.h>
> 
>   long double
>   foo(long double x)
>   {
>      long double y;
>      y = atanl(x);
>      return (y);
>   }
> 
> generate __builtin_atanl(x)  and if you compile to assembly
> is there a reference to atanl or atanq?

No and there is a reference to atanl.

1) math.h doesn't declare atanl.  To get program to compile, I need to declare
atanl.

2) If atanl is declared, the program calls atanl.  It does not generate
__builtin_atanl.

3) If atanl is changed to __builtin_atanl in the above, atanl is still called
in the .s
file.  I believe __builtin_atanl only handles a few special cases where the
call to atanl
can be eliminated.

Reply via email to