summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2016-07-12 10:53:11 -0700
committerIan Romanick <[email protected]>2016-08-30 16:28:02 -0700
commit90da8bf5477cb65b9f2e5148c05ef621a09b704f (patch)
tree8968fcdd24299f783560053059a38c743ccf0fcc /src
parent0f87c54d1c6ae022c9884283052a7de9d6eec710 (diff)
glsl: Generate code for constant ir_binop_ldexp expressions
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. v2: Use tuple() instead of () for clarity. Suggested by Dylan. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Matt Turner <[email protected]> Acked-by: Dylan Baker <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/glsl/ir_expression_operation.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/compiler/glsl/ir_expression_operation.py b/src/compiler/glsl/ir_expression_operation.py
index 394626b503f..b3f60a47c7f 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 = tuple()
+ 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
#