brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · b037f82 Raw
117 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_cospi(__CLC_GENTYPE x) {12  __CLC_GENTYPE absx = __clc_fabs(x);13  __CLC_INTN ix = __CLC_AS_INTN(absx);14  __CLC_INTN iax = __CLC_CONVERT_INTN(absx);15  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);16  __CLC_INTN xodd = (iax & 0x1) != 0 ? (__CLC_INTN)0x80000000 : (__CLC_INTN)0;17 18  // Initialize with return for +-Inf and NaN19  __CLC_INTN ir = QNANBITPATT_SP32;20 21  // 2^24 <= |x| < Inf, the result is always even integer22  ir = ix < PINFBITPATT_SP32 ? 0x3f800000 : ir;23 24  // 2^23 <= |x| < 2^24, the result is always integer25  ir = ix < 0x4b800000 ? xodd | 0x3f800000 : 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 = 1;32  __CLC_INTN s = xodd ^ (__CLC_INTN)0x80000000;33 34  // r <= 0.7535  __CLC_INTN c = r <= 0.75f;36  a = c ? r - 0.5f : a;37  e = c ? 0 : e;38 39  // r < 0.540  c = r < 0.5f;41  a = c ? 0.5f - r : a;42  s = c ? xodd : s;43 44  // r <= 0.2545  c = r <= 0.25f;46  a = c ? r : a;47  e = c ? 1 : e;48 49  __CLC_GENTYPE sinval, cosval;50  __clc_sincos_piby4(a * M_PI_F, &sinval, &cosval);51  __CLC_INTN jr = s ^ __CLC_AS_INTN(e != 0 ? cosval : sinval);52 53  ir = ix < 0x4b000000 ? jr : ir;54 55  return __CLC_AS_GENTYPE(ir);56}57 58#elif __CLC_FPSIZE == 6459 60_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cospi(__CLC_GENTYPE x) {61  __CLC_GENTYPE absx = __clc_fabs(x);62  __CLC_LONGN ix = __CLC_AS_LONGN(absx);63  __CLC_LONGN iax = __CLC_CONVERT_LONGN(absx);64  __CLC_GENTYPE r = absx - __CLC_CONVERT_GENTYPE(iax);65  __CLC_LONGN xodd =66      (iax & 0x1L) != 0 ? (__CLC_LONGN)0x8000000000000000L : (__CLC_LONGN)0L;67 68  // Initialize with return for +-Inf and NaN69  __CLC_LONGN ir = QNANBITPATT_DP64;70 71  // 2^53 <= |x| < Inf, the result is always even integer72  ir = ix < PINFBITPATT_DP64 ? 0x3ff0000000000000L : ir;73 74  // 2^52 <= |x| < 2^53, the result is always integer75  ir = absx < 0x1.0p+53 ? xodd | 0x3ff0000000000000L : ir;76 77  // 0x1.0p-7 <= |x| < 2^52, result depends on which 0.25 interval78 79  // r < 1.080  __CLC_GENTYPE a = 1.0 - r;81  __CLC_LONGN e = 1;82  __CLC_LONGN s = xodd ^ (__CLC_LONGN)0x8000000000000000L;83 84  // r <= 0.7585  __CLC_LONGN c = r <= 0.75;86  __CLC_GENTYPE t = r - 0.5;87  a = c ? t : a;88  e = c ? 0 : e;89 90  // r < 0.591  c = r < 0.5;92  t = 0.5 - r;93  a = c ? t : a;94  s = c ? xodd : s;95 96  // r <= 0.2597  c = r <= 0.25;98  a = c ? r : a;99  e = c ? 1 : e;100 101  __CLC_GENTYPE sinval, cosval;102  __clc_sincos_piby4(a * M_PI, 0.0, &sinval, &cosval);103  __CLC_LONGN jr = s ^ __CLC_AS_LONGN(e != 0 ? cosval : sinval);104 105  ir = absx < 0x1.0p+52 ? jr : ir;106 107  return __CLC_AS_GENTYPE(ir);108}109 110#elif __CLC_FPSIZE == 16111 112_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_cospi(__CLC_GENTYPE x) {113  return __CLC_CONVERT_GENTYPE(__clc_cospi(__CLC_CONVERT_FLOATN(x)));114}115 116#endif117