Mesa (master): gallivm: Compensate for lp_const_offset in lp_build_conv.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Tue May 22 09:28:35 UTC 2012


Module: Mesa
Branch: master
Commit: fdeb0394cbc737cefa36c6bf99cbd255d8899a9f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fdeb0394cbc737cefa36c6bf99cbd255d8899a9f

Author: James Benton <jbenton at vmware.com>
Date:   Fri May 18 16:04:49 2012 +0100

gallivm: Compensate for lp_const_offset in lp_build_conv.

Fixing a /*FIXME*/ to remove errors in integer conversion in lp_build_conv.
Tested using lp_test_conv and lp_test_format, reduced errors.

Signed-off-by: José Fonseca <jfonseca at vmware.com>

---

 src/gallium/auxiliary/gallivm/lp_bld_conv.c |   35 +++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_conv.c b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
index f0ef516..9c78460 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_conv.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
@@ -473,8 +473,23 @@ lp_build_conv(struct gallivm_state *gallivm,
    else {
       unsigned src_shift = lp_const_shift(src_type);
       unsigned dst_shift = lp_const_shift(dst_type);
+      unsigned src_offset = lp_const_offset(src_type);
+      unsigned dst_offset = lp_const_offset(dst_type);
+
+      /* Compensate for different offsets */
+      if (dst_offset > src_offset && src_type.width > dst_type.width) {
+         for (i = 0; i < num_tmps; ++i) {
+            LLVMValueRef shifted;
+            LLVMValueRef shift = lp_build_const_int_vec(gallivm, tmp_type, src_shift - 1);
+            if(src_type.sign)
+               shifted = LLVMBuildAShr(builder, tmp[i], shift, "");
+            else
+               shifted = LLVMBuildLShr(builder, tmp[i], shift, "");
+
+            tmp[i] = LLVMBuildSub(builder, tmp[i], shifted, "");
+         }
+      }
 
-      /* FIXME: compensate different offsets too */
       if(src_shift > dst_shift) {
          LLVMValueRef shift = lp_build_const_int_vec(gallivm, tmp_type,
                                                      src_shift - dst_shift);
@@ -554,12 +569,24 @@ lp_build_conv(struct gallivm_state *gallivm,
     else {
        unsigned src_shift = lp_const_shift(src_type);
        unsigned dst_shift = lp_const_shift(dst_type);
+       unsigned src_offset = lp_const_offset(src_type);
+       unsigned dst_offset = lp_const_offset(dst_type);
 
-       /* FIXME: compensate different offsets too */
-       if(src_shift < dst_shift) {
+       if (src_shift < dst_shift) {
+          LLVMValueRef pre_shift[LP_MAX_VECTOR_LENGTH];
           LLVMValueRef shift = lp_build_const_int_vec(gallivm, tmp_type, dst_shift - src_shift);
-          for(i = 0; i < num_tmps; ++i)
+
+          for (i = 0; i < num_tmps; ++i) {
+             pre_shift[i] = tmp[i];
              tmp[i] = LLVMBuildShl(builder, tmp[i], shift, "");
+          }
+
+          /* Compensate for different offsets */
+          if (dst_offset > src_offset) {
+             for (i = 0; i < num_tmps; ++i) {
+                tmp[i] = LLVMBuildSub(builder, tmp[i], pre_shift[i], "");
+             }
+          }
        }
     }
 




More information about the mesa-commit mailing list