blob: ddf3bd689d3a323d5b3af3a5ee90728ce1d28419 [file]
//===----------------------------------------------------------------------===//
//
// 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_asinh(__CLC_FLOATN x) {
__CLC_FLOATN y = __clc_fabs(x);
__CLC_INTN b = y >= 0x1.0p+64f;
__CLC_FLOATN s = b ? 0x1.0p-64f : 1.0f;
__CLC_FLOATN sy = y * s;
__CLC_EP_PAIR a =
__clc_ep_add(sy, __clc_ep_sqrt(__clc_ep_add(__clc_ep_sqr(sy), s * s)));
__CLC_FLOATN z = __clc_ep_ln_hi(a, b ? 64 : 0);
z = y < 0x1.0p-12f ? y : z;
z = y == __CLC_GENTYPE_INF ? y : z;
return __clc_copysign(z, x);
}
#elif __CLC_FPSIZE == 64
_CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_DOUBLEN __clc_asinh(__CLC_DOUBLEN x) {
__CLC_DOUBLEN y = __clc_fabs(x);
__CLC_LONGN b = y >= 0x1.0p+512;
__CLC_DOUBLEN s = b ? 0x1.0p-512 : 1.0;
__CLC_DOUBLEN sy = y * s;
__CLC_EP_PAIR a =
__clc_ep_add(sy, __clc_ep_sqrt(__clc_ep_add(__clc_ep_sqr(sy), s * s)));
__CLC_DOUBLEN z = __clc_ep_ln_hi(a, __CLC_CONVERT_INTN(b) ? 512 : 0);
z = y < 0x1.0p-27 ? y : z;
z = y == __CLC_GENTYPE_INF ? y : z;
return __clc_copysign(z, x);
}
#elif __CLC_FPSIZE == 16
_CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_HALFN __clc_asinh(__CLC_HALFN hx) {
__CLC_FLOATN x = __CLC_CONVERT_FLOATN(__clc_fabs(hx));
__CLC_FLOATN t = x + __clc_sqrt_fast(__clc_mad(x, x, 1.0f));
__CLC_HALFN ret = __clc_copysign(
__CLC_CONVERT_HALFN(__clc_log2_fast(t) * 0x1.62e430p-1f), hx);
return __clc_isfinite(hx) ? ret : hx;
}
#endif