brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 3a2f5dc Raw
133 lines · plain
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#if __CLC_FPSIZE == 3210 11_CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_tanpi(__CLC_GENTYPE x) {12  __CLC_INTN ix = __CLC_AS_INTN(x);13  __CLC_INTN xsgn = ix & (__CLC_INTN)SIGNBIT_SP32;14  __CLC_INTN xnsgn = xsgn ^ (__CLC_INTN)SIGNBIT_SP32;15  ix ^= xsgn;16  __CLC_GENTYPE absx = __clc_fabs(x);17  __CLC_INTN iax = __CLC_CONVERT_INTN(absx);18  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);19  __CLC_INTN xodd = xsgn ^ __CLC_AS_INTN((iax & 0x1) != 0 ? SIGNBIT_SP32 : 0);20 21  // Initialize with return for +-Inf and NaN22  __CLC_INTN ir = QNANBITPATT_SP32;23 24  // 2^24 <= |x| < Inf, the result is always even integer25  ir = ix < PINFBITPATT_SP32 ? xsgn : ir;26 27  // 2^23 <= |x| < 2^24, the result is always integer28  ir = ix < 0x4b800000 ? xodd : ir;29 30  // 0x1.0p-7 <= |x| < 2^23, result depends on which 0.25 interval31 32  // r < 1.033  __CLC_GENTYPE a = 1.0f - r;34  __CLC_INTN e = 0;35  __CLC_INTN s = xnsgn;36 37  // r <= 0.7538  __CLC_INTN c = r <= 0.75f;39  a = c ? r - 0.5f : a;40  e = c ? 1 : e;41  s = c ? xsgn : s;42 43  // r < 0.544  c = r < 0.5f;45  a = c ? 0.5f - r : a;46  s = c ? xnsgn : s;47 48  // 0 < r <= 0.2549  c = r <= 0.25f;50  a = c ? r : a;51  e = c ? 0 : e;52  s = c ? xsgn : s;53 54  __CLC_GENTYPE t = __clc_tanf_piby4(a * M_PI_F, 0);55  __CLC_GENTYPE tr = -__clc_native_recip(t);56  __CLC_INTN jr = s ^ __CLC_AS_INTN(e != 0 ? tr : t);57 58  jr = r == 0.5f ? xodd | 0x7f800000 : jr;59 60  ir = ix < 0x4b000000 ? jr : ir;61 62  return __CLC_AS_GENTYPE(ir);63}64 65#elif __CLC_FPSIZE == 6466 67_CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE __clc_tanpi(__CLC_GENTYPE x) {68  __CLC_LONGN ix = __CLC_AS_LONGN(x);69  __CLC_LONGN xsgn = ix & (__CLC_LONGN)0x8000000000000000L;70  __CLC_LONGN xnsgn = xsgn ^ (__CLC_LONGN)0x8000000000000000L;71  ix ^= xsgn;72  __CLC_GENTYPE absx = __clc_fabs(x);73  __CLC_LONGN iax = __CLC_CONVERT_LONGN(absx);74  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);75  __CLC_LONGN xodd =76      xsgn ^ __CLC_AS_LONGN((iax & 0x1) != 0 ? 0x8000000000000000L : 0L);77 78  // Initialize with return for +-Inf and NaN79  __CLC_LONGN ir = QNANBITPATT_DP64;80 81  // 2^53 <= |x| < Inf, the result is always even integer82  ir = ix < PINFBITPATT_DP64 ? xsgn : ir;83 84  // 2^52 <= |x| < 2^53, the result is always integer85  ir = ix < 0x4340000000000000L ? xodd : ir;86 87  // 0x1.0p-14 <= |x| < 2^53, result depends on which 0.25 interval88 89  // r < 1.090  __CLC_GENTYPE a = 1.0 - r;91  __CLC_LONGN e = 0;92  __CLC_LONGN s = xnsgn;93 94  // r <= 0.7595  __CLC_LONGN c = r <= 0.75;96  __CLC_GENTYPE t = r - 0.5;97  a = c ? t : a;98  e = c ? 1 : e;99  s = c ? xsgn : s;100 101  // r < 0.5102  c = r < 0.5;103  t = 0.5 - r;104  a = c ? t : a;105  s = c ? xnsgn : s;106 107  // r <= 0.25108  c = r <= 0.25;109  a = c ? r : a;110  e = c ? 0 : e;111  s = c ? xsgn : s;112 113  __CLC_GENTYPE api = a * M_PI;114  __CLC_GENTYPE lo, hi;115  __clc_tan_piby4(api, 0.0, &lo, &hi);116  __CLC_LONGN jr = s ^ __CLC_AS_LONGN(e != 0 ? hi : lo);117 118  __CLC_LONGN si = xodd | 0x7ff0000000000000L;119  jr = r == 0.5 ? si : jr;120 121  ir = ix < 0x4330000000000000L ? jr : ir;122 123  return __CLC_AS_GENTYPE(ir);124}125 126#elif __CLC_FPSIZE == 16127 128_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_tanpi(__CLC_GENTYPE x) {129  return __CLC_CONVERT_GENTYPE(__clc_tanpi(__CLC_CONVERT_FLOATN(x)));130}131 132#endif133