1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @file 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unit tests for type conversion. 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @author Jose Fonseca <jfonseca@vmware.com> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pointer.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_init.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_type.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_const.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_conv.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_debug.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_test.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*conv_test_ptr_t)(const void *src, const void *dst); 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_tsv_header(FILE *fp) 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "result\t" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "cycles_per_channel\t" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "src_type\t" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "dst_type\n"); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fflush(fp); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_tsv_row(FILE *fp, 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type src_type, 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type dst_type, 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double cycles, 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean success) 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, "%s\t", success ? "pass" : "fail"); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, "%.1f\t", cycles / MAX2(src_type.length, dst_type.length)); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_type(fp, src_type); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, "\t"); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_type(fp, dst_type); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, "\n"); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fflush(fp); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdump_conv_types(FILE *fp, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type src_type, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type dst_type) 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, "src_type="); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_type(fp, src_type); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, " dst_type="); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_type(fp, dst_type); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(fp, " ...\n"); 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fflush(fp); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic LLVMValueRef 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_conv_test(struct gallivm_state *gallivm, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type src_type, unsigned num_srcs, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type dst_type, unsigned num_dsts) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMModuleRef module = gallivm->module; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMContextRef context = gallivm->context; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuilderRef builder = gallivm->builder; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMTypeRef args[2]; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef func; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef src_ptr; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef dst_ptr; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBasicBlockRef block; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef src[LP_MAX_VECTOR_LENGTH]; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef dst[LP_MAX_VECTOR_LENGTH]; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org args[0] = LLVMPointerType(lp_build_vec_type(gallivm, src_type), 0); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org args[1] = LLVMPointerType(lp_build_vec_type(gallivm, dst_type), 0); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = LLVMAddFunction(module, "test", 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMFunctionType(LLVMVoidTypeInContext(context), 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org args, 2, 0)); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMSetFunctionCallConv(func, LLVMCCallConv); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_ptr = LLVMGetParam(func, 0); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_ptr = LLVMGetParam(func, 1); 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org block = LLVMAppendBasicBlockInContext(context, func, "entry"); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMPositionBuilderAtEnd(builder, block); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < num_srcs; ++i) { 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index = LLVMConstInt(LLVMInt32TypeInContext(context), i, 0); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ptr = LLVMBuildGEP(builder, src_ptr, &index, 1, ""); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[i] = LLVMBuildLoad(builder, ptr, ""); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_build_conv(gallivm, src_type, dst_type, src, num_srcs, dst, num_dsts); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < num_dsts; ++i) { 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef index = LLVMConstInt(LLVMInt32TypeInContext(context), i, 0); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef ptr = LLVMBuildGEP(builder, dst_ptr, &index, 1, ""); 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildStore(builder, dst[i], ptr); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMBuildRetVoid(builder);; 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gallivm_verify_function(gallivm, func); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return func; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPIPE_ALIGN_STACK 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_one(unsigned verbose, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FILE *fp, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type src_type, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type dst_type) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gallivm_state *gallivm; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LLVMValueRef func = NULL; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conv_test_ptr_t conv_test_ptr; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean success; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = LP_TEST_NUM_SAMPLES; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t cycles[LP_TEST_NUM_SAMPLES]; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double cycles_avg = 0.0; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_srcs; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_dsts; 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double eps; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((src_type.width >= dst_type.width && src_type.length > dst_type.length) || 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (src_type.width <= dst_type.width && src_type.length < dst_type.length)) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Known failures 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - fixed point 32 -> float 32 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - float 32 -> signed normalised integer 32 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((src_type.floating && !dst_type.floating && dst_type.sign && dst_type.norm && src_type.width == dst_type.width) || 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!src_type.floating && dst_type.floating && src_type.fixed && src_type.width == dst_type.width)) { 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Known failures 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - fixed point 32 -> float 32 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - float 32 -> signed normalised integer 32 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((src_type.floating && !dst_type.floating && dst_type.sign && dst_type.norm && src_type.width == dst_type.width) || 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!src_type.floating && dst_type.floating && src_type.fixed && src_type.width == dst_type.width)) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(verbose >= 1) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_conv_types(stderr, src_type, dst_type); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src_type.length > dst_type.length) { 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_srcs = 1; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_dsts = src_type.length/dst_type.length; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (src_type.length < dst_type.length) { 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_dsts = 1; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_srcs = dst_type.length/src_type.length; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_dsts = 1; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org num_srcs = 1; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We must not loose or gain channels. Only precision */ 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src_type.length * num_srcs == dst_type.length * num_dsts); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org eps = MAX2(lp_const_eps(src_type), lp_const_eps(dst_type)); 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gallivm = gallivm_create(); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func = add_conv_test(gallivm, src_type, num_srcs, dst_type, num_dsts); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gallivm_compile_module(gallivm); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conv_test_ptr = (conv_test_ptr_t)gallivm_jit_function(gallivm, func); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = TRUE; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < n && success; ++i) { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_stride = src_type.length*src_type.width/8; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_stride = dst_type.length*dst_type.width/8; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_ALIGN_VAR(LP_MIN_VECTOR_ALIGN) uint8_t src[LP_MAX_VECTOR_LENGTH*LP_MAX_VECTOR_LENGTH]; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_ALIGN_VAR(LP_MIN_VECTOR_ALIGN) uint8_t dst[LP_MAX_VECTOR_LENGTH*LP_MAX_VECTOR_LENGTH]; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double fref[LP_MAX_VECTOR_LENGTH*LP_MAX_VECTOR_LENGTH]; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t ref[LP_MAX_VECTOR_LENGTH*LP_MAX_VECTOR_LENGTH]; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t start_counter = 0; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int64_t end_counter = 0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_srcs; ++j) { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org random_vec(src_type, src + j*src_stride); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org read_vec(src_type, src + j*src_stride, fref + j*src_type.length); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_dsts; ++j) { 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_vec(dst_type, ref + j*dst_stride, fref + j*dst_type.length); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org start_counter = rdtsc(); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conv_test_ptr(src, dst); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org end_counter = rdtsc(); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cycles[i] = end_counter - start_counter; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_dsts; ++j) { 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!compare_vec_with_eps(dst_type, dst + j*dst_stride, ref + j*dst_stride, eps)) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = FALSE; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!success || verbose >= 3) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(verbose < 1) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_conv_types(stderr, src_type, dst_type); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (success) { 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "PASS\n"); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "MISMATCH\n"); 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_srcs; ++j) { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " Src%u: ", j); 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_vec(stderr, src_type, src + j*src_stride); 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "\n"); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 1 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " Ref: "); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < src_type.length*num_srcs; ++j) 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " %f", fref[j]); 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "\n"); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_dsts; ++j) { 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " Dst%u: ", j); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_vec(stderr, dst_type, dst + j*dst_stride); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "\n"); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, " Ref%u: ", j); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dump_vec(stderr, dst_type, ref + j*dst_stride); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "\n"); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unfortunately the output of cycle counter is not very reliable as it comes 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * -- sometimes we get outliers (due IRQs perhaps?) which are 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * better removed to avoid random or biased data. 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double sum = 0.0, sum2 = 0.0; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org double avg, std; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned m; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < n; ++i) { 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sum += cycles[i]; 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sum2 += cycles[i]*cycles[i]; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org avg = sum/n; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std = sqrtf((sum2 - n*avg*avg)/n); 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = 0; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sum = 0.0; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < n; ++i) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(fabs(cycles[i] - avg) <= 4.0*std) { 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sum += cycles[i]; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++m; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cycles_avg = sum/m; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(fp) 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org write_tsv_row(fp, src_type, dst_type, cycles_avg, success); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gallivm_free_function(gallivm, func, conv_test_ptr); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gallivm_destroy(gallivm); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return success; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct lp_type conv_types[] = { 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* float, fixed, sign, norm, width, len */ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Float */ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, TRUE, TRUE, 32, 4 }, 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, TRUE, FALSE, 32, 4 }, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, FALSE, TRUE, 32, 4 }, 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, FALSE, FALSE, 32, 4 }, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, TRUE, TRUE, 32, 8 }, 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, TRUE, FALSE, 32, 8 }, 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, FALSE, TRUE, 32, 8 }, 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, FALSE, FALSE, 32, 8 }, 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Fixed */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, TRUE, TRUE, 32, 4 }, 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, TRUE, FALSE, 32, 4 }, 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, FALSE, TRUE, 32, 4 }, 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, FALSE, FALSE, 32, 4 }, 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, TRUE, TRUE, 32, 8 }, 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, TRUE, FALSE, 32, 8 }, 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, FALSE, TRUE, 32, 8 }, 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, TRUE, FALSE, FALSE, 32, 8 }, 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Integer */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, TRUE, 32, 4 }, 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, FALSE, 32, 4 }, 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 32, 4 }, 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, FALSE, 32, 4 }, 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, TRUE, 32, 8 }, 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, FALSE, 32, 8 }, 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 32, 8 }, 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, FALSE, 32, 8 }, 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, TRUE, 16, 8 }, 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, FALSE, 16, 8 }, 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 16, 8 }, 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, FALSE, 16, 8 }, 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, TRUE, 8, 16 }, 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, FALSE, 8, 16 }, 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 8, 16 }, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, FALSE, 8, 16 }, 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, TRUE, 8, 4 }, 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, TRUE, FALSE, 8, 4 }, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 8, 4 }, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, FALSE, 8, 4 }, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst unsigned num_types = sizeof(conv_types)/sizeof(conv_types[0]); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_all(unsigned verbose, FILE *fp) 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_type *src_type; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_type *dst_type; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean success = TRUE; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int error_count = 0; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(src_type = conv_types; src_type < &conv_types[num_types]; ++src_type) { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(dst_type = conv_types; dst_type < &conv_types[num_types]; ++dst_type) { 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(src_type == dst_type) 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!test_one(verbose, fp, *src_type, *dst_type)){ 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = FALSE; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++error_count; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "%d failures\n", error_count); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return success; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_some(unsigned verbose, FILE *fp, 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long n) 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_type *src_type; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_type *dst_type; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned long i; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean success = TRUE; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(i = 0; i < n; ++i) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src_type = &conv_types[rand() % num_types]; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst_type = &conv_types[rand() % num_types]; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (src_type == dst_type || src_type->norm != dst_type->norm); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!test_one(verbose, fp, *src_type, *dst_type)) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = FALSE; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return success; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtest_single(unsigned verbose, FILE *fp) 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* float, fixed, sign, norm, width, len */ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type f32x4_type = 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { TRUE, FALSE, TRUE, TRUE, 32, 4 }; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_type ub8x4_type = 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { FALSE, FALSE, FALSE, TRUE, 8, 16 }; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean success; 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = test_one(verbose, fp, f32x4_type, ub8x4_type); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return success; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 452