summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2015-05-12 17:18:47 +0000
committerTom Stellard <thomas.stellard@amd.com>2015-05-12 17:18:47 +0000
commit538329dc54b1c80fb836277763af56a77769ea4b (patch)
tree7a35176e18e173d2e50fad0f222acf1703b16818
parent6657f6da7f8508146c64b031a1478db056b15c94 (diff)
Implement sin for double types
This implementation was ported from the AMD builtin library and has been tested with piglit, OpenCV, and the ocl conformance tests. git-svn-id: https://llvm.org/svn/llvm-project/libclc/trunk@237155 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--generic/lib/math/sin.cl23
1 files changed, 16 insertions, 7 deletions
diff --git a/generic/lib/math/sin.cl b/generic/lib/math/sin.cl
index 50684e4..3a40749 100644
--- a/generic/lib/math/sin.cl
+++ b/generic/lib/math/sin.cl
@@ -55,14 +55,23 @@ _CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, sin, float);
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-#define __CLC_FUNCTION __clc_sin_intrinsic
-#define __CLC_INTRINSIC "llvm.sin"
-#include <clc/math/unary_intrin.inc>
-#undef __CLC_FUNCTION
-#undef __CLC_INTRINSIC
-
_CLC_OVERLOAD _CLC_DEF double sin(double x) {
- return __clc_sin_intrinsic(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);