//===----------------------------------------------------------------------===// // // 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