On Thu, 2017-03-09 at 14:05 -0800, Jason Ekstrand wrote: > Apart from avoiding some unneeded size cases, this shouldn't have any > actual functional impact. > --- > src/compiler/nir/nir_constant_expressions.py | 51 +++++++++++++++--- > ---------- > 1 file changed, 27 insertions(+), 24 deletions(-) > > diff --git a/src/compiler/nir/nir_constant_expressions.py > b/src/compiler/nir/nir_constant_expressions.py > index 273d6ce..aecca8b 100644 > --- a/src/compiler/nir/nir_constant_expressions.py > +++ b/src/compiler/nir/nir_constant_expressions.py > @@ -1,17 +1,19 @@ > #! /usr/bin/python2 > > +import re > + > +type_split_re = re.compile(r'(?P<type>[a-z]+)(?P<bits>\d+)') > + > def type_has_size(type_): > return type_[-1:].isdigit() > > +def type_size(type_): > + assert type_has_size(type_) > + return int(type_split_re.match(type_).group('bits')) > + > def type_sizes(type_): > - if type_.endswith("8"): > - return [8] > - elif type_.endswith("16"): > - return [16] > - elif type_.endswith("32"): > - return [32] > - elif type_.endswith("64"): > - return [64] > + if type_has_size(type_): > + return [type_size(type_)] > else: > return [32, 64] > > @@ -20,23 +22,23 @@ def type_add_size(type_, size): > return type_ > return type_ + str(size) > > +def op_bit_sizes(op): > + sizes = set([8, 16, 32, 64]) > + if not type_has_size(op.output_type): > + sizes = sizes.intersection(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)))
I guess that if sizes is empty after this something is very wrong, maybe add an assert? Either way: Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> > + return sorted(list(sizes)) > + > def get_const_field(type_): > - if type_ == "int32": > - return "i32" > - if type_ == "uint32": > - return "u32" > - if type_ == "int64": > - return "i64" > - if type_ == "uint64": > - return "u64" > if type_ == "bool32": > return "u32" > - if type_ == "float32": > - return "f32" > - if type_ == "float64": > - return "f64" > - raise Exception(str(type_)) > - assert(0) > + else: > + m = type_split_re.match(type_) > + if not m: > + raise Exception(str(type_)) > + return m.group('type')[0] + m.group('bits') > > template = """\ > /* > @@ -248,7 +250,7 @@ typedef float float32_t; > typedef double float64_t; > typedef bool bool32_t; > % for type in ["float", "int", "uint"]: > -% for width in [32, 64]: > +% for width in type_sizes(type): > struct ${type}${width}_vec { > ${type}${width}_t x; > ${type}${width}_t y; > @@ -273,7 +275,7 @@ evaluate_${name}(MAYBE_UNUSED unsigned > num_components, unsigned bit_size, > nir_const_value _dst_val = { {0, } }; > > switch (bit_size) { > - % for bit_size in [32, 64]: > + % for bit_size in op_bit_sizes(op): > case ${bit_size}: { > <% > output_type = type_add_size(op.output_type, bit_size) > @@ -407,4 +409,5 @@ from mako.template import Template > print Template(template).render(opcodes=opcodes, > type_sizes=type_sizes, > type_has_size=type_has_size, > type_add_size=type_add_size, > + op_bit_sizes=op_bit_sizes, > get_const_field=get_const_field) _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev