blob: f776805ad1cdb43411ab017db750060e6790b8e0 [file] [log] [blame] [edit]
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "sincos_helpers.h"
#include <clc/clc.h>
#include <clc/clc_convert.h>
#include <clc/clcmacro.h>
#include <clc/math/clc_fabs.h>
#include <clc/math/clc_sincos_helpers.h>
#include <clc/math/math.h>
#include <clc/relational/clc_isinf.h>
#include <clc/relational/clc_isnan.h>
#include <clc/relational/clc_select.h>
// FP32 and FP16 versions.
#define __CLC_BODY <sin.inc>
#include <clc/math/gentype.inc>
#ifdef cl_khr_fp64
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
_CLC_OVERLOAD _CLC_DEF double sin(double x) {
double y = fabs(x);
double r, rr;
int regn;
if (y < 0x1.0p+47)
__clc_remainder_piby2_medium(y, &r, &rr, &regn);
else
__clc_remainder_piby2_large(y, &r, &rr, &regn);
double2 sc = __clc_sincos_piby4(r, rr);
int2 s = as_int2(regn & 1 ? sc.hi : sc.lo);
s.hi ^= ((regn > 1) << 31) ^ ((x < 0.0) << 31);
return isinf(x) | isnan(x) ? as_double(QNANBITPATT_DP64) : as_double(s);
}
_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, sin, double);
#endif