mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-04 08:30:27 +01:00
llvmpipe: Several fixes of the conversion test.
This commit is contained in:
parent
d07b038366
commit
33ce51bc0d
4 changed files with 55 additions and 34 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue