blob: 650e8991e7b030e7fc4e4124b17aa890433e1df3 [file] [edit]
// RUN: %libclc-compile
// RUN: %libclc-run --kernel cos_f32 --threads-x 1 %t
// RUN: %libclc-run --kernel cos_f64 --threads-x 1 %t
// RUN: %libclc-run --kernel cos_f16 --threads-x 1 %t
#include "conformance.h"
// OpenCL C v3.0.19, Sec. 7.4, Table 65: cos() is allowed 4 ULP. The arguments
// cover the argument reduction paths.
__kernel void cos_f32(void) {
CHECK_ULP_F32(cos(TEST_INPUT(float, 1.0f)), 0x1.14a28p-1f, 4);
// Nearest float to pi/2, where the result all but cancels.
CHECK_ULP_F32(cos(TEST_INPUT(float, 0x1.921fb6p+0f)), -0x1.777a5cp-25f, 4);
// Nearest float to pi.
CHECK_ULP_F32(cos(TEST_INPUT(float, 0x1.921fb6p+1f)), -0x1p+0f, 4);
CHECK_ULP_F32(cos(TEST_INPUT(float, 100.0f)), 0x1.b981dcp-1f, 4);
// Needs more bits of 2/pi than a double holds.
CHECK_ULP_F32(cos(TEST_INPUT(float, 0x1.0p+64f)), -0x1.ffdb8p-1f, 4);
CHECK_ULP_F32(cos(TEST_INPUT(float, 0x1.fffffep+127f)), 0x1.b4bf2cp-1f, 4);
// Not correctly rounded, so the bound is exercised.
CHECK_ULP_F32(cos(TEST_INPUT(float, 0x1.0c158cp+0f)), 0x1.fffe96p-2f, 4);
CHECK_EQ(cos(TEST_INPUT(float, 0.0f)), 1.0f);
CHECK_EQ(cos(TEST_INPUT(float, -0.0f)), 1.0f);
CHECK(isnan(cos(TEST_INPUT(float, INFINITY))));
CHECK(isnan(cos(TEST_INPUT(float, -INFINITY))));
CHECK(isnan(cos(TEST_INPUT(float, NAN))));
}
// OpenCL C v3.0.19, Sec. 7.4, Table 68: cos() is allowed 4 ULP.
__kernel void cos_f64(void) {
#ifdef __opencl_c_fp64
CHECK_ULP_F64(cos(TEST_INPUT(double, 1.0)), 0x1.14a280fb5068cp-1, 4);
// Nearest double to pi/2, then to pi.
CHECK_ULP_F64(cos(TEST_INPUT(double, 0x1.921fb54442d18p+0)),
0x1.1a62633145c07p-54, 4);
CHECK_ULP_F64(cos(TEST_INPUT(double, 0x1.921fb54442d18p+1)), -0x1p+0, 4);
CHECK_ULP_F64(cos(TEST_INPUT(double, 100.0)), 0x1.b981dbf665fdfp-1, 4);
CHECK_ULP_F64(cos(TEST_INPUT(double, 0x1.0p+64)), -0x1.ffdb7fa3fe34dp-1, 4);
CHECK_ULP_F64(cos(TEST_INPUT(double, 0x1.fffffffffffffp+1023)),
-0x1.fffe62ecfab75p-1, 4);
// Not correctly rounded, so the bound is exercised.
CHECK_ULP_F64(cos(TEST_INPUT(double, 0x1.0cf7ef9db22d1p+9)),
-0x1.7f59309b88661p-1, 4);
CHECK_EQ(cos(TEST_INPUT(double, 0.0)), 1.0);
CHECK_EQ(cos(TEST_INPUT(double, -0.0)), 1.0);
CHECK(isnan(cos(TEST_INPUT(double, (double)INFINITY))));
CHECK(isnan(cos(TEST_INPUT(double, -(double)INFINITY))));
CHECK(isnan(cos(TEST_INPUT(double, (double)NAN))));
#endif
}
// OpenCL C v3.0.19, Sec. 7.4, Table 69 (Full Profile): half cos() is allowed
// 2 ULP.
__kernel void cos_f16(void) {
#ifdef cl_khr_fp16
CHECK_ULP_F16(cos(TEST_INPUT(half, 1.0h)), 0x1.14cp-1h, 2);
// Nearest half to pi/2, then to pi.
CHECK_ULP_F16(cos(TEST_INPUT(half, 0x1.92p+0h)), 0x1.fb4p-12h, 2);
CHECK_ULP_F16(cos(TEST_INPUT(half, 0x1.92p+1h)), -0x1p+0h, 2);
// Widest argument needing reduction.
CHECK_ULP_F16(cos(TEST_INPUT(half, 0x1.ffcp+15h)), -0x1.c3cp-3h, 2);
// Not correctly rounded, so the bound is exercised.
CHECK_ULP_F16(cos(TEST_INPUT(half, 0x1.8acp-4h)), 0x1.fd8p-1h, 2);
// Smallest subnormal, where the result rounds to one.
CHECK_ULP_F16(cos(TEST_INPUT(half, 0x1.0p-24h)), 0x1p+0h, 2);
CHECK_EQ(cos(TEST_INPUT(half, 0.0h)), 1.0h);
CHECK_EQ(cos(TEST_INPUT(half, -0.0h)), 1.0h);
CHECK(isnan(cos(TEST_INPUT(half, (half)INFINITY))));
CHECK(isnan(cos(TEST_INPUT(half, (half)-INFINITY))));
CHECK(isnan(cos(TEST_INPUT(half, (half)NAN))));
#endif
}