nir: Let nir_opt_algebraic rules contain unsigned constants > INT_MAX.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 20 Jan 2016 01:34:24 +0000 (17:34 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 20 Jan 2016 02:10:30 +0000 (18:10 -0800)
struct.pack('i', val) interprets `val` as a signed integer, and dies
if `val` > INT_MAX.  For larger constants, we need to use 'I' which
interprets it as an unsigned value.

This patch makes us use 'I' for all values >= 0, and 'i' for negative
values.  This should work in all cases.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/nir/nir_algebraic.py

index a30652f2afdb8d16309614c7437fe8514c7e07be..14c0e822ad819eb3d173209eecaf0457afa3c3d3 100644 (file)
@@ -108,7 +108,7 @@ class Constant(Value):
       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(struct.unpack('I', struct.pack('i' if self.value < 0 else 'I', self.value))[0])
       elif isinstance(self.value, float):
          return hex(struct.unpack('I', struct.pack('f', self.value))[0])
       else: