llvmpipe: Specify lp_test_arit's target precision per function.

This commit is contained in:
José Fonseca 2012-02-17 16:10:22 +00:00
parent fc79c4fbd4
commit b5941e33d0

View file

@ -80,6 +80,11 @@ struct unary_test_t
*/ */
const float *values; const float *values;
unsigned num_values; unsigned num_values;
/*
* Required precision in bits.
*/
double precision;
}; };
@ -167,15 +172,16 @@ const float sincos_values[] = {
* Unary test cases. * Unary test cases.
*/ */
static const struct unary_test_t unary_tests[] = { static const struct unary_test_t
{"neg", &lp_build_negate, &negf, exp2_values, Elements(exp2_values)}, unary_tests[] = {
{"exp2", &lp_build_exp2, &exp2f, exp2_values, Elements(exp2_values)}, {"neg", &lp_build_negate, &negf, exp2_values, Elements(exp2_values), 20.0 },
{"log2", &lp_build_log2, &log2f, log2_values, Elements(log2_values)}, {"exp2", &lp_build_exp2, &exp2f, exp2_values, Elements(exp2_values), 20.0 },
{"exp", &lp_build_exp, &expf, exp2_values, Elements(exp2_values)}, {"log2", &lp_build_log2, &log2f, log2_values, Elements(log2_values), 10.0 }, // FIXME
{"log", &lp_build_log, &logf, log2_values, Elements(log2_values)}, {"exp", &lp_build_exp, &expf, exp2_values, Elements(exp2_values), 18.0 },
{"rsqrt", &lp_build_rsqrt, &rsqrtf, rsqrt_values, Elements(rsqrt_values)}, {"log", &lp_build_log, &logf, log2_values, Elements(log2_values), 10.0 }, // FIXME
{"sin", &lp_build_sin, &sinf, sincos_values, Elements(sincos_values)}, {"rsqrt", &lp_build_rsqrt, &rsqrtf, rsqrt_values, Elements(rsqrt_values), 20.0 },
{"cos", &lp_build_cos, &cosf, sincos_values, Elements(sincos_values)}, {"sin", &lp_build_sin, &sinf, sincos_values, Elements(sincos_values), 20.0 },
{"cos", &lp_build_cos, &cosf, sincos_values, Elements(sincos_values), 20.0 },
}; };
@ -254,7 +260,7 @@ test_unary(struct gallivm_state *gallivm, unsigned verbose, FILE *fp, const stru
double error = fabs(src - ref); double error = fabs(src - ref);
double precision = error ? -log2(error/fabs(ref)) : FLT_MANT_DIG; double precision = error ? -log2(error/fabs(ref)) : FLT_MANT_DIG;
bool pass = precision >= 20.0; bool pass = precision >= test->precision;
if (isnan(ref)) { if (isnan(ref)) {
continue; continue;