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 * Shared testing code.
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_cpu_detect.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_const.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_init.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.orgvoid
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdump_type(FILE *fp,
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          struct lp_type type)
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fprintf(fp, "%s%s%u%sx%u",
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           type.sign ? (type.floating || type.fixed ? "" : "s") : "u",
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           type.floating ? "f" : (type.fixed ? "h" : "i"),
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           type.width,
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           type.norm ? "n" : "",
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           type.length);
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdouble
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgread_elem(struct lp_type type, const void *src, unsigned index)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double scale = lp_const_scale(type);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double value;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(index < type.length);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (type.floating) {
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch(type.width) {
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 32:
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         value = *((const float *)src + index);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 64:
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         value =  *((const double *)src + index);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0.0;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(type.sign) {
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch(type.width) {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 8:
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const int8_t *)src + index);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 16:
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const int16_t *)src + index);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 32:
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const int32_t *)src + index);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 64:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const int64_t *)src + index);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(0);
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0.0;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch(type.width) {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 8:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const uint8_t *)src + index);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 16:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const uint16_t *)src + index);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 32:
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const uint32_t *)src + index);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 64:
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const uint64_t *)src + index);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(0);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 0.0;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return value/scale;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_elem(struct lp_type type, void *dst, unsigned index, double value)
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(index < type.length);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!type.sign && value < 0.0)
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      value = 0.0;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(type.norm && value < -1.0)
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      value = -1.0;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(type.norm && value > 1.0)
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      value = 1.0;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (type.floating) {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch(type.width) {
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 32:
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *((float *)dst + index) = (float)(value);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 64:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          *((double *)dst + index) = value;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      double scale = lp_const_scale(type);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      value = round(value*scale);
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(type.sign) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         long long lvalue = (long long)value;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lvalue = MIN2(lvalue, ((long long)1 << (type.width - 1)) - 1);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch(type.width) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 8:
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((int8_t *)dst + index) = (int8_t)lvalue;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 16:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((int16_t *)dst + index) = (int16_t)lvalue;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 32:
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((int32_t *)dst + index) = (int32_t)lvalue;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 64:
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((int64_t *)dst + index) = (int64_t)lvalue;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(0);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned long long lvalue = (long long)value;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lvalue = MIN2(lvalue, ((unsigned long long)1 << type.width) - 1);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch(type.width) {
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 8:
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((uint8_t *)dst + index) = (uint8_t)lvalue;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 16:
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((uint16_t *)dst + index) = (uint16_t)lvalue;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 32:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((uint32_t *)dst + index) = (uint32_t)lvalue;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 64:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            *((uint64_t *)dst + index) = (uint64_t)lvalue;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(0);
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrandom_elem(struct lp_type type, void *dst, unsigned index)
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double value;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(index < type.length);
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   value = (double)rand()/(double)RAND_MAX;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!type.norm) {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (type.floating) {
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         value *= 2.0;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned long long mask;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (type.fixed)
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mask = ((unsigned long long)1 << (type.width / 2)) - 1;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (type.sign)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mask = ((unsigned long long)1 << (type.width - 1)) - 1;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mask = ((unsigned long long)1 << type.width) - 1;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         value += (double)(mask & rand());
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!type.sign)
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(rand() & 1)
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         value = -value;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   write_elem(type, dst, index, value);
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgread_vec(struct lp_type type, const void *src, double *dst)
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < type.length; ++i)
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst[i] = read_elem(type, src, i);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwrite_vec(struct lp_type type, void *dst, const double *src)
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < type.length; ++i)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_elem(type, dst, i, src[i]);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfloat
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrandom_float(void)
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return (float)((double)rand()/(double)RAND_MAX);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrandom_vec(struct lp_type type, void *dst)
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < type.length; ++i)
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      random_elem(type, dst, i);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompare_vec_with_eps(struct lp_type type, const void *res, const void *ref, double eps)
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eps *= type.floating ? 8.0 : 2.0;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < type.length; ++i) {
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      double res_elem = read_elem(type, res, i);
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      double ref_elem = read_elem(type, ref, i);
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      double delta = res_elem - ref_elem;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ref_elem < -1.0 || ref_elem > 1.0) {
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 delta /= ref_elem;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delta = fabs(delta);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (delta >= eps) {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompare_vec(struct lp_type type, const void *res, const void *ref)
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   double eps = lp_const_eps(type);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return compare_vec_with_eps(type, res, ref, eps);
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdump_vec(FILE *fp, struct lp_type type, const void *src)
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < type.length; ++i) {
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(i)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fprintf(fp, " ");
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (type.floating) {
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         double value;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch(type.width) {
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 32:
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const float *)src + i);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 64:
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = *((const double *)src + i);
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            assert(0);
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            value = 0.0;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fprintf(fp, "%f", value);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if(type.sign && !type.norm) {
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            long long value;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const char *format;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            switch(type.width) {
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 8:
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const int8_t *)src + i);
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "%3lli";
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 16:
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const int16_t *)src + i);
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "%5lli";
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 32:
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const int32_t *)src + i);
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "%10lli";
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 64:
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const int64_t *)src + i);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "%20lli";
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               assert(0);
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = 0.0;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "?";
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fprintf(fp, format, value);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned long long value;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const char *format;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            switch(type.width) {
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 8:
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const uint8_t *)src + i);
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = type.norm ? "%2x" : "%4llu";
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 16:
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const uint16_t *)src + i);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = type.norm ? "%4x" : "%6llx";
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 32:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const uint32_t *)src + i);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = type.norm ? "%8x" : "%11llx";
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            case 64:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = *((const uint64_t *)src + i);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = type.norm ? "%16x" : "%21llx";
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            default:
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               assert(0);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               value = 0.0;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               format = "?";
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            fprintf(fp, format, value);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint main(int argc, char **argv)
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned verbose = 0;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FILE *fp = NULL;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned long n = 1000;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean success;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean single = FALSE;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for(i = 1; i < argc; ++i) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(strcmp(argv[i], "-v") == 0)
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++verbose;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(strcmp(argv[i], "-s") == 0)
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         single = TRUE;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if(strcmp(argv[i], "-o") == 0)
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fp = fopen(argv[++i], "wt");
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         n = atoi(argv[i]);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   lp_build_init();
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (verbose >= 2) {
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gallivm_debug |= GALLIVM_DEBUG_IR;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      gallivm_debug |= GALLIVM_DEBUG_ASM;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   util_cpu_detect();
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(fp) {
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Warm up the caches */
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      test_some(0, NULL, 100);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      write_tsv_header(fp);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (single)
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = test_single(verbose, fp);
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (n)
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = test_some(verbose, fp, n);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      success = test_all(verbose, fp);
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(fp)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fclose(fp);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return success ? 0 : 1;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
415