[Mesa-dev] [PATCH 38/56] glsl: Generate code for constant ir_binop_ldexp expressions

Ian Romanick idr at freedesktop.org
Tue Jul 19 19:24:57 UTC 2016


From: Ian Romanick <ian.d.romanick at intel.com>

ldexp is weird because its two operands have different types.  Add
support for directly specifying the exact signatures of all the possible
variations of an operation.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/compiler/glsl/ir_expression_operation.py | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py
index 2351dcf..de9c7b7 100644
--- a/src/compiler/glsl/ir_expression_operation.py
+++ b/src/compiler/glsl/ir_expression_operation.py
@@ -202,7 +202,7 @@ types_identical_operation = "identical"
 non_assign_operation = "nonassign"
 
 class operation(object):
-   def __init__(self, name, num_operands, printable_name = None, source_types = None, dest_type = None, c_expression = None, flags = None):
+   def __init__(self, name, num_operands, printable_name = None, source_types = None, dest_type = None, c_expression = None, flags = None, all_signatures = None):
       self.name = name
       self.num_operands = num_operands
 
@@ -211,7 +211,13 @@ class operation(object):
       else:
          self.printable_name = printable_name
 
-      self.source_types = source_types
+      self.all_signatures = all_signatures
+
+      if source_types is None:
+         self.source_types = ()
+      else:
+         self.source_types = source_types
+
       self.dest_type = dest_type
 
       if c_expression is None:
@@ -261,6 +267,8 @@ class operation(object):
             return constant_template0.render(op=self)
          elif self.dest_type is not None:
             return constant_template5.render(op=self)
+         else:
+            return constant_template3.render(op=self)
 
       return None
 
@@ -276,7 +284,10 @@ class operation(object):
 
 
    def signatures(self):
-      return type_signature_iter(self.dest_type, self.source_types, self.num_operands)
+      if self.all_signatures is not None:
+         return self.all_signatures
+      else:
+         return type_signature_iter(self.dest_type, self.source_types, self.num_operands)
 
 
 ir_expression_operation = [
@@ -469,7 +480,11 @@ ir_expression_operation = [
    operation("ubo_load", 2),
 
    # Multiplies a number by two to a power, part of ARB_gpu_shader5.
-   operation("ldexp", 2),
+   operation("ldexp", 2,
+             all_signatures=((float_type, (float_type, int_type)),
+                             (double_type, (double_type, int_type))),
+             c_expression={'f': "ldexpf_flush_subnormal({src0}, {src1})",
+                           'd': "ldexp_flush_subnormal({src0}, {src1})"}),
 
    # Extract a scalar from a vector
    #
-- 
2.5.5



More information about the mesa-dev mailing list