[Mesa-dev] [PATCH 8/9] llvmpipe: Test more vector lengths.
Tom Stellard
tom at stellard.net
Mon Apr 18 15:30:32 UTC 2016
On Mon, Apr 18, 2016 at 10:14:35AM +0100, Jose Fonseca wrote:
> All power of two of up native vector length.
>
> There is actually a bug in lp_build_round for v2, whereby it doesn't
> round to nearest. Fixing is left to the future, but the test is now
> able to expect it to fail.
> ---
> src/gallium/drivers/llvmpipe/lp_test_arit.c | 43 ++++++++++++++++++++---------
> 1 file changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/src/gallium/drivers/llvmpipe/lp_test_arit.c b/src/gallium/drivers/llvmpipe/lp_test_arit.c
> index ba831f3..f3ba5a1 100644
> --- a/src/gallium/drivers/llvmpipe/lp_test_arit.c
> +++ b/src/gallium/drivers/llvmpipe/lp_test_arit.c
> @@ -297,14 +297,16 @@ unary_tests[] = {
> */
> static LLVMValueRef
> build_unary_test_func(struct gallivm_state *gallivm,
> - const struct unary_test_t *test)
> + const struct unary_test_t *test,
> + unsigned length,
> + const char *test_name)
> {
> - struct lp_type type = lp_type_float_vec(32, lp_native_vector_width);
> + struct lp_type type = lp_type_float_vec(32, length * 32);
> LLVMContextRef context = gallivm->context;
> LLVMModuleRef module = gallivm->module;
> LLVMTypeRef vf32t = lp_build_vec_type(gallivm, type);
> LLVMTypeRef args[2] = { LLVMPointerType(vf32t, 0), LLVMPointerType(vf32t, 0) };
> - LLVMValueRef func = LLVMAddFunction(module, test->name,
> + LLVMValueRef func = LLVMAddFunction(module, test_name,
> LLVMFunctionType(LLVMVoidTypeInContext(context),
> args, Elements(args), 0));
> LLVMValueRef arg0 = LLVMGetParam(func, 0);
> @@ -371,14 +373,15 @@ flush_denorm_to_zero(float val)
> * Test one LLVM unary arithmetic builder function.
> */
> static boolean
> -test_unary(unsigned verbose, FILE *fp, const struct unary_test_t *test)
> +test_unary(unsigned verbose, FILE *fp, const struct unary_test_t *test, unsigned length)
> {
> + char test_name[128];
> + util_snprintf(test_name, sizeof test_name, "%s.v%u", test->name, length);
> struct gallivm_state *gallivm;
> LLVMValueRef test_func;
> unary_func_t test_func_jit;
> boolean success = TRUE;
> int i, j;
> - int length = lp_native_vector_width / 32;
> float *in, *out;
>
> in = align_malloc(length * 4, length * 4);
> @@ -391,7 +394,7 @@ test_unary(unsigned verbose, FILE *fp, const struct unary_test_t *test)
>
> gallivm = gallivm_create("test_module", LLVMGetGlobalContext());
This is not related to this patch, but the c++ equivalent of
LLVMGetGlobalContext() has been removed from LLVM, and I think the C
API may be removed at some point in the future, so these tests should
be migrated to use LLVMCreateContext().
-Tom
>
> - test_func = build_unary_test_func(gallivm, test);
> + test_func = build_unary_test_func(gallivm, test, length, test_name);
>
> gallivm_compile_module(gallivm);
>
> @@ -411,6 +414,7 @@ test_unary(unsigned verbose, FILE *fp, const struct unary_test_t *test)
> for (i = 0; i < num_vals; ++i) {
> float testval, ref;
> double error, precision;
> + boolean expected_pass = TRUE;
> bool pass;
>
> testval = flush_denorm_to_zero(in[i]);
> @@ -429,14 +433,23 @@ test_unary(unsigned verbose, FILE *fp, const struct unary_test_t *test)
> continue;
> }
>
> - if (!pass || verbose) {
> - printf("%s(%.9g): ref = %.9g, out = %.9g, precision = %f bits, %s\n",
> - test->name, in[i], ref, out[i], precision,
> - pass ? "PASS" : "FAIL");
> + if (test->ref == &nearbyintf && length == 2 &&
> + ref != roundf(testval)) {
> + /* FIXME: The generic (non SSE) path in lp_build_iround, which is
> + * always taken for length==2 regardless of native round support,
> + * does not round to even. */
> + expected_pass = FALSE;
> + }
> +
> + if (pass != expected_pass || verbose) {
> + printf("%s(%.9g): ref = %.9g, out = %.9g, precision = %f bits, %s%s\n",
> + test_name, in[i], ref, out[i], precision,
> + pass ? "PASS" : "FAIL",
> + !expected_pass ? (pass ? " (unexpected)" : " (expected)" ): "");
> fflush(stdout);
> }
>
> - if (!pass) {
> + if (pass != expected_pass) {
> success = FALSE;
> }
> }
> @@ -458,8 +471,12 @@ test_all(unsigned verbose, FILE *fp)
> int i;
>
> for (i = 0; i < Elements(unary_tests); ++i) {
> - if (!test_unary(verbose, fp, &unary_tests[i])) {
> - success = FALSE;
> + unsigned max_length = lp_native_vector_width / 32;
> + unsigned length;
> + for (length = 1; length <= max_length; length *= 2) {
> + if (!test_unary(verbose, fp, &unary_tests[i], length)) {
> + success = FALSE;
> + }
> }
> }
>
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list