mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
Add the half ulps values for embedded profile (#2265)
This change adds the half ulps values for embedded profile. https://github.com/KhronosGroup/OpenCL-CTS/issues/1685
This commit is contained in:
@@ -29,31 +29,32 @@
|
||||
// Only use ulps information in spir test
|
||||
#ifdef FUNCTION_LIST_ULPS_ONLY
|
||||
|
||||
#define ENTRY(_name, _ulp, _embedded_ulp, _half_ulp, _rmode, _type) \
|
||||
#define ENTRY(_name, _ulp, _embedded_ulp, _half_ulp, _half_embedded_ulp, \
|
||||
_rmode, _type) \
|
||||
{ \
|
||||
STRINGIFY(_name), STRINGIFY(_name), { NULL }, { NULL }, { NULL }, \
|
||||
_ulp, _ulp, _half_ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, \
|
||||
RELAXED_OFF, _type \
|
||||
_ulp, _ulp, _half_ulp, _half_embedded_ulp, _embedded_ulp, \
|
||||
INFINITY, INFINITY, _rmode, RELAXED_OFF, _type \
|
||||
}
|
||||
#define ENTRY_EXT(_name, _ulp, _embedded_ulp, _half_ulp, _relaxed_ulp, _rmode, \
|
||||
_type, _relaxed_embedded_ulp) \
|
||||
#define ENTRY_EXT(_name, _ulp, _embedded_ulp, _half_ulp, _half_embedded_ulp, \
|
||||
_relaxed_ulp, _rmode, _type, _relaxed_embedded_ulp) \
|
||||
{ \
|
||||
STRINGIFY(_name), STRINGIFY(_name), { NULL }, { NULL }, { NULL }, \
|
||||
_ulp, _ulp, _half_ulp, _embedded_ulp, _relaxed_ulp, \
|
||||
_relaxed_embedded_ulp, _rmode, RELAXED_ON, _type \
|
||||
_ulp, _ulp, _half_ulp, _half_embedded_ulp, _embedded_ulp, \
|
||||
_relaxed_ulp, _relaxed_embedded_ulp, _rmode, RELAXED_ON, _type \
|
||||
}
|
||||
#define HALF_ENTRY(_name, _ulp, _embedded_ulp, _rmode, _type) \
|
||||
{ \
|
||||
"half_" STRINGIFY(_name), "half_" STRINGIFY(_name), { NULL }, \
|
||||
{ NULL }, { NULL }, _ulp, _ulp, _ulp, _embedded_ulp, INFINITY, \
|
||||
INFINITY, _rmode, RELAXED_OFF, _type \
|
||||
{ NULL }, { NULL }, _ulp, _ulp, _ulp, _ulp, _embedded_ulp, \
|
||||
INFINITY, INFINITY, _rmode, RELAXED_OFF, _type \
|
||||
}
|
||||
#define OPERATOR_ENTRY(_name, _operator, _ulp, _embedded_ulp, _half_ulp, \
|
||||
_rmode, _type) \
|
||||
_half_embedded_ulp, _rmode, _type) \
|
||||
{ \
|
||||
STRINGIFY(_name), _operator, { NULL }, { NULL }, { NULL }, _ulp, _ulp, \
|
||||
_half_ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, RELAXED_OFF, \
|
||||
_type \
|
||||
_half_ulp, _half_embedded_ulp, _embedded_ulp, INFINITY, INFINITY, \
|
||||
_rmode, RELAXED_OFF, _type \
|
||||
}
|
||||
|
||||
#define unaryF NULL
|
||||
@@ -88,35 +89,37 @@
|
||||
|
||||
#else // FUNCTION_LIST_ULPS_ONLY
|
||||
|
||||
#define ENTRY(_name, _ulp, _embedded_ulp, _half_ulp, _rmode, _type) \
|
||||
#define ENTRY(_name, _ulp, _embedded_ulp, _half_ulp, _half_embedded_ulp, \
|
||||
_rmode, _type) \
|
||||
{ \
|
||||
STRINGIFY(_name), STRINGIFY(_name), { (void*)reference_##_name }, \
|
||||
{ (void*)reference_##_name##l }, { (void*)reference_##_name }, \
|
||||
_ulp, _ulp, _half_ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, \
|
||||
RELAXED_OFF, _type \
|
||||
_ulp, _ulp, _half_ulp, _half_embedded_ulp, _embedded_ulp, \
|
||||
INFINITY, INFINITY, _rmode, RELAXED_OFF, _type \
|
||||
}
|
||||
#define ENTRY_EXT(_name, _ulp, _embedded_ulp, _half_ulp, _relaxed_ulp, _rmode, \
|
||||
_type, _relaxed_embedded_ulp) \
|
||||
#define ENTRY_EXT(_name, _ulp, _embedded_ulp, _half_ulp, _half_embedded_ulp, \
|
||||
_relaxed_ulp, _rmode, _type, _relaxed_embedded_ulp) \
|
||||
{ \
|
||||
STRINGIFY(_name), STRINGIFY(_name), { (void*)reference_##_name }, \
|
||||
{ (void*)reference_##_name##l }, \
|
||||
{ (void*)reference_##relaxed_##_name }, _ulp, _ulp, _half_ulp, \
|
||||
_embedded_ulp, _relaxed_ulp, _relaxed_embedded_ulp, _rmode, \
|
||||
RELAXED_ON, _type \
|
||||
_half_embedded_ulp, _embedded_ulp, _relaxed_ulp, \
|
||||
_relaxed_embedded_ulp, _rmode, RELAXED_ON, _type \
|
||||
}
|
||||
#define HALF_ENTRY(_name, _ulp, _embedded_ulp, _rmode, _type) \
|
||||
{ \
|
||||
"half_" STRINGIFY(_name), "half_" STRINGIFY(_name), \
|
||||
{ (void*)reference_##_name }, { NULL }, { NULL }, _ulp, _ulp, \
|
||||
_ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, RELAXED_OFF, \
|
||||
_type \
|
||||
_ulp, _ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, \
|
||||
RELAXED_OFF, _type \
|
||||
}
|
||||
#define OPERATOR_ENTRY(_name, _operator, _ulp, _embedded_ulp, _half_ulp, \
|
||||
_rmode, _type) \
|
||||
_half_embedded_ulp, _rmode, _type) \
|
||||
{ \
|
||||
STRINGIFY(_name), _operator, { (void*)reference_##_name }, \
|
||||
{ (void*)reference_##_name##l }, { NULL }, _ulp, _ulp, _half_ulp, \
|
||||
_embedded_ulp, INFINITY, INFINITY, _rmode, RELAXED_OFF, _type \
|
||||
_half_embedded_ulp, _embedded_ulp, INFINITY, INFINITY, _rmode, \
|
||||
RELAXED_OFF, _type \
|
||||
}
|
||||
|
||||
static constexpr vtbl _unary = {
|
||||
@@ -252,19 +255,19 @@ static constexpr vtbl _mad_tbl = {
|
||||
|
||||
// clang-format off
|
||||
const Func functionList[] = {
|
||||
ENTRY_EXT(acos, 4.0f, 4.0f, 2.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(acosh, 4.0f, 4.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(acospi, 5.0f, 5.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(asin, 4.0f, 4.0f, 2.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(asinh, 4.0f, 4.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(asinpi, 5.0f, 5.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(atan, 5.0f, 5.0f, 2.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(atanh, 5.0f, 5.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(atanpi, 5.0f, 5.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(atan2, 6.0f, 6.0f, 2.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(atan2pi, 6.0f, 6.0f, 2.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(cbrt, 2.0f, 4.0f, 2.f, FTZ_OFF, unaryF),
|
||||
ENTRY(ceil, 0.0f, 0.0f, 0.f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(acos, 4.0f, 4.0f, 2.0f, 3.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(acosh, 4.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(acospi, 5.0f, 5.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(asin, 4.0f, 4.0f, 2.0f, 3.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(asinh, 4.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(asinpi, 5.0f, 5.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(atan, 5.0f, 5.0f, 2.0f, 3.0f, 4096.0f, FTZ_OFF, unaryF, 4096.0f),
|
||||
ENTRY(atanh, 5.0f, 5.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(atanpi, 5.0f, 5.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(atan2, 6.0f, 6.0f, 2.0f, 3.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(atan2pi, 6.0f, 6.0f, 2.0f, 3.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(cbrt, 2.0f, 4.0f, 2.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(ceil, 0.0f, 0.0f, 0.f, 0.f, FTZ_OFF, unaryF),
|
||||
{ "copysign",
|
||||
"copysign",
|
||||
{ (void*)reference_copysignf },
|
||||
@@ -274,96 +277,97 @@ const Func functionList[] = {
|
||||
0.0f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
FTZ_OFF,
|
||||
RELAXED_OFF,
|
||||
binaryF },
|
||||
ENTRY_EXT(cos, 4.0f, 4.0f, 2.f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
ENTRY_EXT(cos, 4.0f, 4.0f, 2.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
0.00048828125f), // relaxed ulp 2^-11
|
||||
ENTRY(cosh, 4.0f, 4.0f, 2.f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(cospi, 4.0f, 4.0f, 2.f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
ENTRY(cosh, 4.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(cospi, 4.0f, 4.0f, 2.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
0.00048828125f), // relaxed ulp 2^-11
|
||||
ENTRY(erfc, 16.0f, 16.0f, 4.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(erf, 16.0f, 16.0f, 4.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(erfc, 16.0f, 16.0f, 4.0f, 4.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(erf, 16.0f, 16.0f, 4.0f, 4.0f, FTZ_OFF, unaryF),
|
||||
|
||||
// relaxed error is overwritten in unary.c as it is 3+floor(fabs(2*x))
|
||||
ENTRY_EXT(exp, 3.0f, 4.0f, 2.f, 3.0f, FTZ_OFF, unaryF, 4.0f),
|
||||
ENTRY_EXT(exp, 3.0f, 4.0f, 2.0f, 3.0f, 3.0f, FTZ_OFF, unaryF, 4.0f),
|
||||
|
||||
// relaxed error is overwritten in unary.c as it is 3+floor(fabs(2*x))
|
||||
ENTRY_EXT(exp2, 3.0f, 4.0f, 2.f, 3.0f, FTZ_OFF, unaryF, 4.0f),
|
||||
ENTRY_EXT(exp2, 3.0f, 4.0f, 2.0f, 3.0f, 3.0f, FTZ_OFF, unaryF, 4.0f),
|
||||
|
||||
// relaxed error is overwritten in unary.c as it is 3+floor(fabs(2*x)) in derived mode;
|
||||
// in non-derived mode it uses the ulp error for half_exp10.
|
||||
ENTRY_EXT(exp10, 3.0f, 4.0f, 2.f, 8192.0f, FTZ_OFF, unaryF, 8192.0f),
|
||||
ENTRY_EXT(exp10, 3.0f, 4.0f, 2.0f, 3.0f, 8192.0f, FTZ_OFF, unaryF, 8192.0f),
|
||||
|
||||
ENTRY(expm1, 3.0f, 4.0f, 2.f, FTZ_OFF, unaryF),
|
||||
ENTRY(fabs, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(fdim, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(floor, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(fma, 0.0f, 0.0f, 0.0f, FTZ_OFF, ternaryF),
|
||||
ENTRY(fmax, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fmin, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fmod, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fract, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results),
|
||||
ENTRY(frexp, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results_i),
|
||||
ENTRY(hypot, 4.0f, 4.0f, 2.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(ilogb, 0.0f, 0.0f, 0.0f, FTZ_OFF, i_unaryF),
|
||||
ENTRY(isequal, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isfinite, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isgreater, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isgreaterequal, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isinf, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isless, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(islessequal, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(islessgreater, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isnan, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isnormal, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isnotequal, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isordered, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isunordered, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(ldexp, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(lgamma, INFINITY, INFINITY, INFINITY, FTZ_OFF, unaryF),
|
||||
ENTRY(lgamma_r, INFINITY, INFINITY, INFINITY, FTZ_OFF,
|
||||
ENTRY(expm1, 3.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(fabs, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(fdim, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(floor, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(fma, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, ternaryF),
|
||||
ENTRY(fmax, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fmin, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fmod, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(fract, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results),
|
||||
ENTRY(frexp, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results_i),
|
||||
ENTRY(hypot, 4.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(ilogb, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, i_unaryF),
|
||||
ENTRY(isequal, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isfinite, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isgreater, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isgreaterequal, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isinf, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isless, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(islessequal, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(islessgreater, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isnan, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isnormal, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY(isnotequal, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isordered, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(isunordered, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_binaryF),
|
||||
ENTRY(ldexp, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(lgamma, INFINITY, INFINITY, INFINITY, INFINITY, FTZ_OFF, unaryF),
|
||||
ENTRY(lgamma_r, INFINITY, INFINITY, INFINITY, INFINITY, FTZ_OFF,
|
||||
unaryF_two_results_i),
|
||||
ENTRY_EXT(log, 3.0f, 4.0f, 2.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
ENTRY_EXT(log, 3.0f, 4.0f, 2.0f, 3.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
4.76837158203125e-7f), // relaxed ulp 2^-21
|
||||
ENTRY_EXT(log2, 3.0f, 4.0f, 2.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
ENTRY_EXT(log2, 3.0f, 4.0f, 2.0f, 3.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
4.76837158203125e-7f), // relaxed ulp 2^-21
|
||||
ENTRY_EXT(log10, 3.0f, 4.0f, 2.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
ENTRY_EXT(log10, 3.0f, 4.0f, 2.0f, 3.0f, 4.76837158203125e-7f, FTZ_OFF, unaryF,
|
||||
4.76837158203125e-7f), // relaxed ulp 2^-21
|
||||
ENTRY(log1p, 2.0f, 4.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(logb, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(log1p, 2.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(logb, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
|
||||
// In fast-relaxed-math mode it has to be either exactly rounded fma or exactly rounded a*b+c
|
||||
ENTRY_EXT(mad, INFINITY, INFINITY, INFINITY, INFINITY, FTZ_OFF, mad_function, INFINITY),
|
||||
ENTRY_EXT(mad, INFINITY, INFINITY, INFINITY, INFINITY, INFINITY, FTZ_OFF, mad_function, INFINITY),
|
||||
|
||||
ENTRY(maxmag, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(minmag, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(modf, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results),
|
||||
ENTRY(nan, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_u),
|
||||
ENTRY(nextafter, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_nextafter),
|
||||
ENTRY(maxmag, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(minmag, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(modf, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_two_results),
|
||||
ENTRY(nan, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF_u),
|
||||
ENTRY(nextafter, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_nextafter),
|
||||
|
||||
// In derived mode the ulp error is calculated as exp2(y*log2(x)).
|
||||
// In non-derived it is the same as half_pow.
|
||||
ENTRY_EXT(pow, 16.0f, 16.0f, 4.0f, 8192.0f, FTZ_OFF, binaryF, 8192.0f),
|
||||
ENTRY_EXT(pow, 16.0f, 16.0f, 4.0f, 5.0f, 8192.0f, FTZ_OFF, binaryF, 8192.0f),
|
||||
|
||||
ENTRY(pown, 16.0f, 16.0f, 4.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(powr, 16.0f, 16.0f, 4.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(remainder, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(remquo, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_two_results_i),
|
||||
ENTRY(rint, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(rootn, 16.0f, 16.0f, 4.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(round, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(rsqrt, 2.0f, 4.0f, 1.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(signbit, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY_EXT(sin, 4.0f, 4.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
ENTRY(pown, 16.0f, 16.0f, 4.0f, 5.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(powr, 16.0f, 16.0f, 4.0f, 5.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(remainder, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF),
|
||||
ENTRY(remquo, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryF_two_results_i),
|
||||
ENTRY(rint, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(rootn, 16.0f, 16.0f, 4.0f, 5.0f, FTZ_OFF, binaryF_i),
|
||||
ENTRY(round, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(rsqrt, 2.0f, 4.0f, 1.0f, 1.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(signbit, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
ENTRY_EXT(sin, 4.0f, 4.0f, 2.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
0.00048828125f), // relaxed ulp 2^-11
|
||||
ENTRY_EXT(sincos, 4.0f, 4.0f, 2.0f, 0.00048828125f, FTZ_OFF,
|
||||
ENTRY_EXT(sincos, 4.0f, 4.0f, 2.0f, 2.0f, 0.00048828125f, FTZ_OFF,
|
||||
unaryF_two_results,
|
||||
0.00048828125f), // relaxed ulp 2^-11
|
||||
ENTRY(sinh, 4.0f, 4.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(sinpi, 4.0f, 4.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
ENTRY(sinh, 4.0f, 4.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY_EXT(sinpi, 4.0f, 4.0f, 2.0f, 2.0f, 0.00048828125f, FTZ_OFF, unaryF,
|
||||
0.00048828125f), // relaxed ulp 2^-11
|
||||
{ "sqrt",
|
||||
"sqrt",
|
||||
@@ -373,6 +377,7 @@ const Func functionList[] = {
|
||||
3.0f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
1.0f,
|
||||
4.0f,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
@@ -390,18 +395,19 @@ const Func functionList[] = {
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
FTZ_OFF,
|
||||
RELAXED_OFF,
|
||||
unaryOF /* only for single precision */ },
|
||||
|
||||
// In derived mode it the ulp error is calculated as sin/cos.
|
||||
// In non-derived mode it is the same as half_tan.
|
||||
ENTRY_EXT(tan, 5.0f, 5.0f, 2.0f, 8192.0f, FTZ_OFF, unaryF, 8192.0f),
|
||||
ENTRY_EXT(tan, 5.0f, 5.0f, 2.0f, 3.0f, 8192.0f, FTZ_OFF, unaryF, 8192.0f),
|
||||
|
||||
ENTRY(tanh, 5.0f, 5.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(tanpi, 6.0f, 6.0f, 2.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(tanh, 5.0f, 5.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(tanpi, 6.0f, 6.0f, 2.0f, 3.0f, FTZ_OFF, unaryF),
|
||||
//ENTRY(tgamma, 16.0f, 16.0f, FTZ_OFF, unaryF), Commented this out until we can be sure this requirement is realistic
|
||||
ENTRY(trunc, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
ENTRY(trunc, 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, unaryF),
|
||||
|
||||
HALF_ENTRY(cos, 8192.0f, 8192.0f, FTZ_ON, unaryOF),
|
||||
HALF_ENTRY(divide, 8192.0f, 8192.0f, FTZ_ON, binaryOF),
|
||||
@@ -419,8 +425,8 @@ const Func functionList[] = {
|
||||
HALF_ENTRY(tan, 8192.0f, 8192.0f, FTZ_ON, unaryOF),
|
||||
|
||||
// basic operations
|
||||
OPERATOR_ENTRY(add, "+", 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
OPERATOR_ENTRY(subtract, "-", 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
OPERATOR_ENTRY(add, "+", 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
OPERATOR_ENTRY(subtract, "-", 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
//ENTRY(reciprocal, 1.0f, 1.0f, FTZ_OFF, unaryF),
|
||||
{ "reciprocal",
|
||||
"/",
|
||||
@@ -430,6 +436,7 @@ const Func functionList[] = {
|
||||
2.5f,
|
||||
0.0f,
|
||||
0.0f,
|
||||
1.0f,
|
||||
3.0f,
|
||||
2.5f,
|
||||
INFINITY,
|
||||
@@ -444,6 +451,7 @@ const Func functionList[] = {
|
||||
2.5f,
|
||||
0.0f,
|
||||
1.0f,
|
||||
1.0f,
|
||||
3.0f,
|
||||
2.5f,
|
||||
INFINITY,
|
||||
@@ -461,13 +469,14 @@ const Func functionList[] = {
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
INFINITY,
|
||||
FTZ_OFF,
|
||||
RELAXED_OFF,
|
||||
binaryOperatorOF /* only for single precision */ },
|
||||
OPERATOR_ENTRY(multiply, "*", 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
OPERATOR_ENTRY(assignment, "", 0.0f, 0.0f, 0.0f, FTZ_OFF,
|
||||
OPERATOR_ENTRY(multiply, "*", 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, binaryOperatorF),
|
||||
OPERATOR_ENTRY(assignment, "", 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF,
|
||||
unaryF), // A simple copy operation
|
||||
OPERATOR_ENTRY(not, "!", 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
OPERATOR_ENTRY(not, "!", 0.0f, 0.0f, 0.0f, 0.0f, FTZ_OFF, macro_unaryF),
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ struct Func
|
||||
float float_ulps;
|
||||
float double_ulps;
|
||||
float half_ulps;
|
||||
float half_embedded_ulps;
|
||||
float float_embedded_ulps;
|
||||
float relaxed_error;
|
||||
float relaxed_embedded_error;
|
||||
|
||||
@@ -195,8 +195,14 @@ float getAllowedUlpError(const Func *f, Type t, const bool relaxed)
|
||||
// TODO: distinguish between embedded and full profile.
|
||||
return f->double_ulps;
|
||||
case khalf:
|
||||
// TODO: distinguish between embedded and full profile.
|
||||
return f->half_ulps;
|
||||
if (gIsEmbedded)
|
||||
{
|
||||
return f->half_embedded_ulps;
|
||||
}
|
||||
else
|
||||
{
|
||||
return f->half_ulps;
|
||||
}
|
||||
default:
|
||||
assert(false && "unsupported type in getAllowedUlpError");
|
||||
// Return a negative value which will make any test fail.
|
||||
|
||||
Reference in New Issue
Block a user