gallivm: Fixed erroneous optimisation in lp_build_min/max.
authorJames Benton <jbenton@vmware.com>
Fri, 18 May 2012 15:06:44 +0000 (16:06 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Mon, 21 May 2012 19:24:47 +0000 (20:24 +0100)
Previously assumed normalised was 0 to 1, but it can be -1 to 1
if type is signed.
Tested with lp_test_conv and lp_test_format, reduced errors.

Signed-off-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_arit.c

index d112f1a59b4d1f7dd7f00be3ffae834ef5a22dcb..9fc57629822ccca561c38fe241432cfcc0de10e5 100644 (file)
@@ -763,9 +763,12 @@ lp_build_min(struct lp_build_context *bld,
    if(a == b)
       return a;
 
    if(a == b)
       return a;
 
-   if(bld->type.norm) {
-      if(a == bld->zero || b == bld->zero)
-         return bld->zero;
+   if (bld->type.norm) {
+      if (!bld->type.sign) {
+         if (a == bld->zero || b == bld->zero) {
+            return bld->zero;
+         }
+      }
       if(a == bld->one)
          return b;
       if(b == bld->one)
       if(a == bld->one)
          return b;
       if(b == bld->one)
@@ -797,10 +800,14 @@ lp_build_max(struct lp_build_context *bld,
    if(bld->type.norm) {
       if(a == bld->one || b == bld->one)
          return bld->one;
    if(bld->type.norm) {
       if(a == bld->one || b == bld->one)
          return bld->one;
-      if(a == bld->zero)
-         return b;
-      if(b == bld->zero)
-         return a;
+      if (!bld->type.sign) {
+         if (a == bld->zero) {
+            return b;
+         }
+         if (b == bld->zero) {
+            return a;
+         }
+      }
    }
 
    return lp_build_max_simple(bld, a, b);
    }
 
    return lp_build_max_simple(bld, a, b);