summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-03-14 10:31:21 -0700
committerJason Ekstrand <[email protected]>2017-03-30 11:34:45 -0700
commit28e41506a6ee0631cf6ca04891dcb3adeff82f60 (patch)
treef66cedb05253861b48e97deeb935faf5ad15c950
parentb69b44d22203d9370ee8d750279e955d066a2bf3 (diff)
nir/constant_expressions: Don't switch on bit size when not needed
For opcodes such as the nir_op_pack_64_2x32 for which all sources and destinations have explicit sizes, the bit_size parameter to the evaluate function is pointless and *should* do nothing. Previously, we were always switching on the bit_size and asserting if it isn't one of the sizes in the list. This generates way more code than needed and is a bit cruel because it doesn't let us have a bit_size of zero on an ALU op which shouldn't need a bit_size. Reviewed-by: Eduardo Lima Mitev <[email protected]>
-rw-r--r--src/compiler/nir/nir_constant_expressions.py37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py
index ad841e3d311..0ff8dfbf6c7 100644
--- a/src/compiler/nir/nir_constant_expressions.py
+++ b/src/compiler/nir/nir_constant_expressions.py
@@ -22,13 +22,18 @@ def type_add_size(type_, size):
return type_ + str(size)
def op_bit_sizes(op):
- sizes = set([8, 16, 32, 64])
+ sizes = None
if not type_has_size(op.output_type):
- sizes = sizes.intersection(set(type_sizes(op.output_type)))
+ sizes = set(type_sizes(op.output_type))
+
for input_type in op.input_types:
if not type_has_size(input_type):
- sizes = sizes.intersection(set(type_sizes(input_type)))
- return sorted(list(sizes))
+ if sizes is None:
+ sizes = set(type_sizes(input_type))
+ else:
+ sizes = sizes.intersection(set(type_sizes(input_type)))
+
+ return sorted(list(sizes)) if sizes is not None else None
def get_const_field(type_):
if type_ == "bool32":
@@ -375,17 +380,21 @@ evaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
{
nir_const_value _dst_val = { {0, } };
- switch (bit_size) {
- % for bit_size in op_bit_sizes(op):
- case ${bit_size}: {
- ${evaluate_op(op, bit_size)}
- break;
- }
- % endfor
+ % if op_bit_sizes(op) is not None:
+ switch (bit_size) {
+ % for bit_size in op_bit_sizes(op):
+ case ${bit_size}: {
+ ${evaluate_op(op, bit_size)}
+ break;
+ }
+ % endfor
- default:
- unreachable("unknown bit width");
- }
+ default:
+ unreachable("unknown bit width");
+ }
+ % else:
+ ${evaluate_op(op, 0)}
+ % endif
return _dst_val;
}