| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #if __CLC_FPSIZE == 32 |
| |
| _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_FLOATN __clc_atanh(__CLC_FLOATN x) { |
| __CLC_FLOATN y = __clc_fabs(x); |
| __CLC_EP_PAIR a = |
| __clc_ep_fast_div(__clc_ep_fast_add(1.0f, y), __clc_ep_fast_sub(1.0f, y)); |
| __CLC_FLOATN z = 0.5f * __clc_ep_ln_hi(a, 0); |
| z = y < 0x1.0p-12f ? y : z; |
| |
| z = y > 1.0f ? FLT_NAN : z; |
| z = y == 1.0f ? __CLC_GENTYPE_INF : z; |
| return __clc_copysign(z, x); |
| } |
| |
| #elif __CLC_FPSIZE == 64 |
| |
| _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_DOUBLEN __clc_atanh(__CLC_DOUBLEN x) { |
| __CLC_DOUBLEN y = __clc_fabs(x); |
| __CLC_EP_PAIR a = |
| __clc_ep_fast_div(__clc_ep_fast_add(1.0, y), __clc_ep_fast_sub(1.0, y)); |
| __CLC_DOUBLEN z = 0.5 * __clc_ep_ln_hi(a, 0); |
| z = y < 0x1.0p-27 ? y : z; |
| |
| z = y > 1.0 ? DBL_NAN : z; |
| z = y == 1.0 ? __CLC_GENTYPE_INF : z; |
| |
| return __clc_copysign(z, x); |
| } |
| |
| #elif __CLC_FPSIZE == 16 |
| |
| _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_HALFN __clc_atanh(__CLC_HALFN x) { |
| __CLC_HALFN absx = __clc_fabs(x); |
| __CLC_FLOATN absxf = __CLC_CONVERT_FLOATN(absx); |
| __CLC_FLOATN t = (1.0f + absxf) * __clc_recip_fast(1.0f - absxf); |
| __CLC_HALFN ret = __CLC_CONVERT_HALFN(__clc_log2_fast(t) * 0x1.62e430p-2f); |
| ret = absx < 0x1.0p-7h ? absx : ret; |
| |
| ret = absx == 1.0h ? __CLC_GENTYPE_INF : ret; |
| ret = (absx > 1.0h) || __clc_isnan(absx) ? HALF_NAN : ret; |
| |
| return __clc_copysign(ret, x); |
| } |
| |
| #endif |