[Bug target/88502] Inline built-in asinh, acosh, atanh for -ffast-math
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Dec 15 10:28:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88502
--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Joseph S. Myers from comment #0)
> GCC should support inline code generation for asinh, acosh, atanh functions,
> under appropriate fast-math conditions.
>
> glibc's bits/mathinline.h, for 32-bit non-SSE fast-math x86 only, has:
>
> /* The argument range of the inline version of asinhl is slightly reduced.
> */
> __inline_mathcodeNP (asinh, __x, \
> register long double __y = __fabsl (__x); \
> return (log1pl (__y * __y / (__libc_sqrtl (__y * __y + 1.0) + 1.0) + __y)
> \
> * __sgn1l (__x)))
>
> __inline_mathcodeNP (acosh, __x, \
> return logl (__x + __libc_sqrtl (__x - 1.0) * __libc_sqrtl (__x + 1.0)))
>
> __inline_mathcodeNP (atanh, __x, \
> register long double __y = __fabsl (__x); \
> return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))
>
> We're moving away from such inlines in glibc, preferring to leave it to the
> compiler to inline standard functions under appropriate conditions. This
> inlining probably only makes sense when logl / log1pl are themselves
> expanded inline (but in principle it's otherwise generic; note this x86 code
> uses long double, so avoiding reducing the argument range for built-in
> functions for narrower types). (__sgn1l is another inline function, copying
> the sign of x to the value 1.0L.)
Can you please advise, which would be appropirate conditions? I think that they
should be similar to hypot conditions - flag_finite_math_only and
flag_unsafe_math_optimizations. The x87 expansion is valid for float and double
functions, we should leave out long double variant, even with
flag_unsafe_math_optimizations.
More information about the Gcc-bugs
mailing list