llvmpipe: Several fixes of the conversion test.

This commit is contained in:
José Fonseca 2009-08-21 07:34:15 +01:00
parent d07b038366
commit 33ce51bc0d
4 changed files with 55 additions and 34 deletions

View file

@ -33,6 +33,7 @@
* @author Jose Fonseca <jfonseca@vmware.com>
*/
#include <float.h>
#include "util/u_debug.h"
@ -92,6 +93,27 @@ lp_const_scale(union lp_type type)
}
double
lp_const_eps(union lp_type type)
{
if (type.floating) {
switch(type.width) {
case 32:
return FLT_EPSILON;
case 64:
return DBL_EPSILON;
default:
assert(0);
return 0.0;
}
}
else {
double scale = lp_const_scale(type);
return 1.0/scale;
}
}
LLVMValueRef
lp_build_undef(union lp_type type)
{

View file

@ -57,6 +57,10 @@ double
lp_const_scale(union lp_type type);
double
lp_const_eps(union lp_type type);
LLVMValueRef
lp_build_undef(union lp_type type);

View file

@ -35,6 +35,7 @@
#include "lp_bld_type.h"
#include "lp_bld_const.h"
#include "lp_bld_conv.h"
#include "lp_bld_debug.h"
#include "lp_test.h"
@ -160,6 +161,7 @@ test_one(unsigned verbose,
double cycles_avg = 0.0;
unsigned num_srcs;
unsigned num_dsts;
double eps;
unsigned i, j;
if(verbose >= 1)
@ -179,6 +181,8 @@ test_one(unsigned verbose,
/* We must not loose or gain channels. Only precision */
assert(src_type.length * num_srcs == dst_type.length * num_dsts);
eps = MAX2(lp_const_eps(src_type), lp_const_eps(dst_type));
module = LLVMModuleCreateWithName("test");
func = add_conv_test(module, src_type, num_srcs, dst_type, num_dsts);
@ -248,7 +252,7 @@ test_one(unsigned verbose,
cycles[i] = end_counter - start_counter;
for(j = 0; j < num_dsts; ++j) {
if(!compare_vec(dst_type, dst + j*dst_stride, ref + j*dst_stride))
if(!compare_vec_with_eps(dst_type, dst + j*dst_stride, ref + j*dst_stride, eps))
success = FALSE;
}
@ -263,8 +267,8 @@ test_one(unsigned verbose,
fprintf(stderr, "\n");
}
#if 0
fprintf(stderr, " Ref: ", j);
#if 1
fprintf(stderr, " Ref: ");
for(j = 0; j < src_type.length*num_srcs; ++j)
fprintf(stderr, " %f", fref[j]);
fprintf(stderr, "\n");

View file

@ -120,6 +120,8 @@ write_elem(union lp_type type, void *dst, unsigned index, double value)
assert(index < type.length);
if(!type.sign && value < 0.0)
value = 0.0;
if(type.norm && value < -1.0)
value = -1.0;
if(type.norm && value > 1.0)
value = 1.0;
if (type.floating) {
@ -136,9 +138,10 @@ write_elem(union lp_type type, void *dst, unsigned index, double value)
}
else {
double scale = lp_const_scale(type);
long long lvalue = (long long)round(value*scale);
value = round(value*scale);
if(type.sign) {
lvalue = MIN2(lvalue, (1 << (type.width - 1)) - 1);
long long lvalue = (long long)value;
lvalue = MIN2(lvalue, ((long long)1 << (type.width - 1)) - 1);
switch(type.width) {
case 8:
*((int8_t *)dst + index) = (int8_t)lvalue;
@ -150,14 +153,15 @@ write_elem(union lp_type type, void *dst, unsigned index, double value)
*((int32_t *)dst + index) = (int32_t)lvalue;
break;
case 64:
*((int64_t *)dst + index) = (int32_t)lvalue;
*((int64_t *)dst + index) = (int64_t)lvalue;
break;
default:
assert(0);
}
}
else {
lvalue = MIN2(lvalue, (1 << type.width) - 1);
unsigned long long lvalue = (long long)value;
lvalue = MIN2(lvalue, ((unsigned long long)1 << type.width) - 1);
switch(type.width) {
case 8:
*((uint8_t *)dst + index) = (uint8_t)lvalue;
@ -239,30 +243,9 @@ random_vec(union lp_type type, void *dst)
boolean
compare_vec(union lp_type type, const void *res, const void *ref)
compare_vec_with_eps(union lp_type type, const void *res, const void *ref, double eps)
{
double eps;
unsigned i;
if (type.floating) {
switch(type.width) {
case 32:
eps = FLT_EPSILON;
break;
case 64:
eps = DBL_EPSILON;
break;
default:
assert(0);
eps = 0.0;
break;
}
}
else {
double scale = lp_const_scale(type);
eps = 1.0/scale;
}
for (i = 0; i < type.length; ++i) {
double res_elem = read_elem(type, res, i);
double ref_elem = read_elem(type, ref, i);
@ -275,6 +258,14 @@ compare_vec(union lp_type type, const void *res, const void *ref)
}
boolean
compare_vec(union lp_type type, const void *res, const void *ref)
{
double eps = lp_const_eps(type);
return compare_vec_with_eps(type, res, ref, eps);
}
void
dump_vec(FILE *fp, union lp_type type, const void *src)
{
@ -298,7 +289,7 @@ dump_vec(FILE *fp, union lp_type type, const void *src)
fprintf(fp, "%f", value);
}
else {
if(type.sign) {
if(type.sign && !type.norm) {
long long value;
const char *format;
switch(type.width) {
@ -331,19 +322,19 @@ dump_vec(FILE *fp, union lp_type type, const void *src)
switch(type.width) {
case 8:
value = *((const uint8_t *)src + i);
format = "%4llu";
format = type.norm ? "%2x" : "%4llu";
break;
case 16:
value = *((const uint16_t *)src + i);
format = "%6llu";
format = type.norm ? "%4x" : "%6llx";
break;
case 32:
value = *((const uint32_t *)src + i);
format = "%11llu";
format = type.norm ? "%8x" : "%11llx";
break;
case 64:
value = *((const uint64_t *)src + i);
format = "%21llu";
format = type.norm ? "%16x" : "%21llx";
break;
default:
assert(0);