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.