[Mesa-dev] [PATCH 1/2] nir/constant_expressions: Pull the guts out into a helper block
Jason Ekstrand
jason at jlekstrand.net
Thu Mar 30 18:36:16 UTC 2017
On Thu, Mar 30, 2017 at 4:23 AM, Eduardo Lima Mitev <elima at igalia.com>
wrote:
> Looks good and clearer. Series is:
>
> Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>
>
Thanks! I've pushed these two and the one for float16 support.
> 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
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170330/1da0e773/attachment-0001.html>
More information about the mesa-dev
mailing list