[Mesa-dev] [PATCH 1/2] nir/constant_expressions: Refactor helper functions

Iago Toral itoral at igalia.com
Fri Mar 10 09:28:31 UTC 2017


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 <itoral at 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)


More information about the mesa-dev mailing list