Mesa (master): nir: Handle large unsigned values in opt_algebraic.

Matt Turner mattst88 at kemper.freedesktop.org
Tue Feb 9 05:19:11 UTC 2016


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

Author: Matt Turner <mattst88 at gmail.com>
Date:   Mon Feb  1 16:35:41 2016 -0800

nir: Handle large unsigned values in opt_algebraic.

The next patch adds an algebraic rule that uses the constant 0xff00ff00.

Without this change, the build fails with

   return hex(struct.unpack('I', struct.pack('i', self.value))[0])
   struct.error: 'i' format requires -2147483648 <= number <= 2147483647

The hex() function handles integers of any size, and assigning a
negative value to an unsigned does what we want in C. The pack/unpack is
unnecessary (and as we see, buggy).

Reviewed-by: Dylan Baker <baker.dylan.c at gmail.com>

---

 src/compiler/nir/nir_algebraic.py | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py
index 77ad35e..2357b57 100644
--- a/src/compiler/nir/nir_algebraic.py
+++ b/src/compiler/nir/nir_algebraic.py
@@ -102,13 +102,10 @@ class Constant(Value):
       self.value = val
 
    def __hex__(self):
-      # Even if it's an integer, we still need to unpack as an unsigned
-      # int.  This is because, without C99, we can only assign to the first
-      # element of a union in an initializer.
       if isinstance(self.value, (bool)):
          return 'NIR_TRUE' if self.value else 'NIR_FALSE'
       if isinstance(self.value, (int, long)):
-         return hex(struct.unpack('I', struct.pack('i', self.value))[0])
+         return hex(self.value)
       elif isinstance(self.value, float):
          return hex(struct.unpack('I', struct.pack('f', self.value))[0])
       else:




More information about the mesa-commit mailing list