[Mesa-dev] [PATCH 1/2] nir/constant_expressions: Pull the guts out into a helper block

Eduardo Lima Mitev elima at igalia.com
Thu Mar 30 11:23:43 UTC 2017


Looks good and clearer. Series is:

Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>

On 03/14/2017 10:08 PM, Jason Ekstrand wrote:
> ---
>  src/compiler/nir/nir_constant_expressions.py | 199 ++++++++++++++-------------
>  1 file changed, 101 insertions(+), 98 deletions(-)
> 
> diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py
> index c6745f1..ad841e3 100644
> --- a/src/compiler/nir/nir_constant_expressions.py
> +++ b/src/compiler/nir/nir_constant_expressions.py
> @@ -266,116 +266,119 @@ struct bool32_vec {
>      bool w;
>  };
>  
> -% for name, op in sorted(opcodes.iteritems()):
> -static nir_const_value
> -evaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
> -                 MAYBE_UNUSED nir_const_value *_src)
> -{
> -   nir_const_value _dst_val = { {0, } };
> -
> -   switch (bit_size) {
> -   % for bit_size in op_bit_sizes(op):
> -   case ${bit_size}: {
> -      <%
> -      output_type = type_add_size(op.output_type, bit_size)
> -      input_types = [type_add_size(type_, bit_size) for type_ in op.input_types]
> -      %>
> -
> -      ## For each non-per-component input, create a variable srcN that
> -      ## contains x, y, z, and w elements which are filled in with the
> -      ## appropriately-typed values.
> -      % for j in range(op.num_inputs):
> -         % if op.input_sizes[j] == 0:
> -            <% continue %>
> -         % elif "src" + str(j) not in op.const_expr:
> -            ## Avoid unused variable warnings
> -            <% continue %>
> -         %endif
> -
> -         const struct ${input_types[j]}_vec src${j} = {
> -         % for k in range(op.input_sizes[j]):
> -            % if input_types[j] == "bool32":
> -               _src[${j}].u32[${k}] != 0,
> -            % else:
> -               _src[${j}].${get_const_field(input_types[j])}[${k}],
> -            % endif
> -         % endfor
> -         % for k in range(op.input_sizes[j], 4):
> -            0,
> -         % endfor
> -         };
> +<%def name="evaluate_op(op, bit_size)">
> +   <%
> +   output_type = type_add_size(op.output_type, bit_size)
> +   input_types = [type_add_size(type_, bit_size) for type_ in op.input_types]
> +   %>
> +
> +   ## For each non-per-component input, create a variable srcN that
> +   ## contains x, y, z, and w elements which are filled in with the
> +   ## appropriately-typed values.
> +   % for j in range(op.num_inputs):
> +      % if op.input_sizes[j] == 0:
> +         <% continue %>
> +      % elif "src" + str(j) not in op.const_expr:
> +         ## Avoid unused variable warnings
> +         <% continue %>
> +      %endif
> +
> +      const struct ${input_types[j]}_vec src${j} = {
> +      % for k in range(op.input_sizes[j]):
> +         % if input_types[j] == "bool32":
> +            _src[${j}].u32[${k}] != 0,
> +         % else:
> +            _src[${j}].${get_const_field(input_types[j])}[${k}],
> +         % endif
>        % endfor
> +      % for k in range(op.input_sizes[j], 4):
> +         0,
> +      % endfor
> +      };
> +   % endfor
>  
> -      % if op.output_size == 0:
> -         ## For per-component instructions, we need to iterate over the
> -         ## components and apply the constant expression one component
> -         ## at a time.
> -         for (unsigned _i = 0; _i < num_components; _i++) {
> -            ## For each per-component input, create a variable srcN that
> -            ## contains the value of the current (_i'th) component.
> -            % for j in range(op.num_inputs):
> -               % if op.input_sizes[j] != 0:
> -                  <% continue %>
> -               % elif "src" + str(j) not in op.const_expr:
> -                  ## Avoid unused variable warnings
> -                  <% continue %>
> -               % elif input_types[j] == "bool32":
> -                  const bool src${j} = _src[${j}].u32[_i] != 0;
> -               % else:
> -                  const ${input_types[j]}_t src${j} =
> -                     _src[${j}].${get_const_field(input_types[j])}[_i];
> -               % endif
> -            % endfor
> -
> -            ## Create an appropriately-typed variable dst and assign the
> -            ## result of the const_expr to it.  If const_expr already contains
> -            ## writes to dst, just include const_expr directly.
> -            % if "dst" in op.const_expr:
> -               ${output_type}_t dst;
> -
> -               ${op.const_expr}
> -            % else:
> -               ${output_type}_t dst = ${op.const_expr};
> -            % endif
> -
> -            ## Store the current component of the actual destination to the
> -            ## value of dst.
> -            % if output_type == "bool32":
> -               ## Sanitize the C value to a proper NIR bool
> -               _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
> +   % if op.output_size == 0:
> +      ## For per-component instructions, we need to iterate over the
> +      ## components and apply the constant expression one component
> +      ## at a time.
> +      for (unsigned _i = 0; _i < num_components; _i++) {
> +         ## For each per-component input, create a variable srcN that
> +         ## contains the value of the current (_i'th) component.
> +         % for j in range(op.num_inputs):
> +            % if op.input_sizes[j] != 0:
> +               <% continue %>
> +            % elif "src" + str(j) not in op.const_expr:
> +               ## Avoid unused variable warnings
> +               <% continue %>
> +            % elif input_types[j] == "bool32":
> +               const bool src${j} = _src[${j}].u32[_i] != 0;
>              % else:
> -               _dst_val.${get_const_field(output_type)}[_i] = dst;
> +               const ${input_types[j]}_t src${j} =
> +                  _src[${j}].${get_const_field(input_types[j])}[_i];
>              % endif
> -         }
> -      % else:
> -         ## In the non-per-component case, create a struct dst with
> -         ## appropriately-typed elements x, y, z, and w and assign the result
> -         ## of the const_expr to all components of dst, or include the
> -         ## const_expr directly if it writes to dst already.
> -         struct ${output_type}_vec dst;
> +         % endfor
>  
> +         ## Create an appropriately-typed variable dst and assign the
> +         ## result of the const_expr to it.  If const_expr already contains
> +         ## writes to dst, just include const_expr directly.
>           % if "dst" in op.const_expr:
> +            ${output_type}_t dst;
> +
>              ${op.const_expr}
>           % else:
> -            ## Splat the value to all components.  This way expressions which
> -            ## write the same value to all components don't need to explicitly
> -            ## write to dest.  One such example is fnoise which has a
> -            ## const_expr of 0.0f.
> -            dst.x = dst.y = dst.z = dst.w = ${op.const_expr};
> +            ${output_type}_t dst = ${op.const_expr};
>           % endif
>  
> -         ## For each component in the destination, copy the value of dst to
> -         ## the actual destination.
> -         % for k in range(op.output_size):
> -            % if output_type == "bool32":
> -               ## Sanitize the C value to a proper NIR bool
> -               _dst_val.u32[${k}] = dst.${"xyzw"[k]} ? NIR_TRUE : NIR_FALSE;
> -            % else:
> -               _dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]};
> -            % endif
> -         % endfor
> +         ## Store the current component of the actual destination to the
> +         ## value of dst.
> +         % if output_type == "bool32":
> +            ## Sanitize the C value to a proper NIR bool
> +            _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
> +         % else:
> +            _dst_val.${get_const_field(output_type)}[_i] = dst;
> +         % endif
> +      }
> +   % else:
> +      ## In the non-per-component case, create a struct dst with
> +      ## appropriately-typed elements x, y, z, and w and assign the result
> +      ## of the const_expr to all components of dst, or include the
> +      ## const_expr directly if it writes to dst already.
> +      struct ${output_type}_vec dst;
> +
> +      % if "dst" in op.const_expr:
> +         ${op.const_expr}
> +      % else:
> +         ## Splat the value to all components.  This way expressions which
> +         ## write the same value to all components don't need to explicitly
> +         ## write to dest.  One such example is fnoise which has a
> +         ## const_expr of 0.0f.
> +         dst.x = dst.y = dst.z = dst.w = ${op.const_expr};
>        % endif
>  
> +      ## For each component in the destination, copy the value of dst to
> +      ## the actual destination.
> +      % for k in range(op.output_size):
> +         % if output_type == "bool32":
> +            ## Sanitize the C value to a proper NIR bool
> +            _dst_val.u32[${k}] = dst.${"xyzw"[k]} ? NIR_TRUE : NIR_FALSE;
> +         % else:
> +            _dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]};
> +         % endif
> +      % endfor
> +   % endif
> +</%def>
> +
> +% for name, op in sorted(opcodes.iteritems()):
> +static nir_const_value
> +evaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
> +                 MAYBE_UNUSED nir_const_value *_src)
> +{
> +   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
> 



More information about the mesa-dev mailing list