diff options
author | Jason Ekstrand <[email protected]> | 2017-03-14 10:31:21 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-03-30 11:34:45 -0700 |
commit | 28e41506a6ee0631cf6ca04891dcb3adeff82f60 (patch) | |
tree | f66cedb05253861b48e97deeb935faf5ad15c950 | |
parent | b69b44d22203d9370ee8d750279e955d066a2bf3 (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.py | 37 |
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; } |