brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 264609a Raw
115 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_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sinpi(__CLC_GENTYPE x) {12  __CLC_INTN ix = __CLC_AS_INTN(x);13  __CLC_INTN xsgn = ix & (__CLC_INTN)0x80000000;14  ix ^= xsgn;15  __CLC_GENTYPE absx = __clc_fabs(x);16  __CLC_INTN iax = __CLC_CONVERT_INTN(absx);17  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);18  __CLC_INTN xodd =19      xsgn ^ ((iax & 0x1) != 0 ? (__CLC_INTN)0x80000000 : (__CLC_INTN)0);20 21  // Initialize with return for +-Inf and NaN22  __CLC_INTN ir = QNANBITPATT_SP32;23 24  // 2^23 <= |x| < Inf, the result is always integer25  ir = ix < PINFBITPATT_SP32 ? xsgn : ir;26 27  // 0x1.0p-7 <= |x| < 2^23, result depends on which 0.25 interval28 29  // r < 1.030  __CLC_GENTYPE a = 1.0f - r;31  __CLC_INTN e = 0;32 33  // r <= 0.7534  __CLC_INTN c = r <= 0.75f;35  a = c ? r - 0.5f : a;36  e = c ? 1 : e;37 38  // r < 0.539  c = r < 0.5f;40  a = c ? 0.5f - r : a;41 42  // 0 < r <= 0.2543  c = r <= 0.25f;44  a = c ? r : a;45  e = c ? 0 : e;46 47  __CLC_GENTYPE sinval, cosval;48  __clc_sincos_piby4(a * M_PI_F, &sinval, &cosval);49  __CLC_INTN jr = xodd ^ __CLC_AS_INTN(e != 0 ? cosval : sinval);50 51  ir = ix < 0x4b000000 ? jr : ir;52 53  return __CLC_AS_GENTYPE(ir);54}55 56#elif __CLC_FPSIZE == 6457 58_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sinpi(__CLC_GENTYPE x) {59  __CLC_LONGN ix = __CLC_AS_LONGN(x);60  __CLC_LONGN xsgn = ix & (__CLC_LONGN)0x8000000000000000L;61  ix ^= xsgn;62  __CLC_GENTYPE absx = __clc_fabs(x);63  __CLC_LONGN iax = __CLC_CONVERT_LONGN(absx);64  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);65  __CLC_LONGN xodd =66      xsgn ^67      ((iax & 0x1L) != 0 ? (__CLC_LONGN)0x8000000000000000L : (__CLC_LONGN)0L);68 69  // Initialize with return for +-Inf and NaN70  __CLC_LONGN ir = QNANBITPATT_DP64;71 72  // 2^23 <= |x| < Inf, the result is always integer73  ir = ix < PINFBITPATT_DP64 ? xsgn : ir;74 75  // 0x1.0p-7 <= |x| < 2^23, result depends on which 0.25 interval76 77  // r < 1.078  __CLC_GENTYPE a = 1.0 - r;79  __CLC_LONGN e = 0;80 81  //  r <= 0.7582  __CLC_LONGN c = r <= 0.75;83  __CLC_GENTYPE t = r - 0.5;84  a = c ? t : a;85  e = c ? 1 : e;86 87  // r < 0.588  c = r < 0.5;89  t = 0.5 - r;90  a = c ? t : a;91 92  // r <= 0.2593  c = r <= 0.25;94  a = c ? r : a;95  e = c ? 0 : e;96 97  __CLC_GENTYPE api = a * M_PI;98 99  __CLC_GENTYPE sinval, cosval;100  __clc_sincos_piby4(api, 0.0, &sinval, &cosval);101  __CLC_LONGN jr = xodd ^ __CLC_AS_LONGN(e != 0 ? cosval : sinval);102 103  ir = absx < 0x1.0p+52 ? jr : ir;104 105  return __CLC_AS_GENTYPE(ir);106}107 108#elif __CLC_FPSIZE == 16109 110_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_sinpi(__CLC_GENTYPE x) {111  return __CLC_CONVERT_GENTYPE(__clc_sinpi(__CLC_CONVERT_FLOATN(x)));112}113 114#endif115