On Apr 12, 2016 1:06 AM, "Samuel Iglesias Gonsálvez" <sigles...@igalia.com> wrote: > > Some instructions (like flrp in i965) cannot be lowered depending on the > bit size because it doesn't support all bit sizes. > > If the bit size field is defined in nir_opt_algebraic.py, take it into > account.
I'm sorry I keep punting on this patch. I've never really like tacking yet another argument on to the end of the expression but for a long time i couldn't cone up with anything better. How about this: Add a bit_size field to nir_search_value and allow you to write 'flrp@64' to indicate a 64-bit destination on an ALU op, 'x@64' to indicate a 64-bit "variable", and '1.0@64' to indicate a 64-bit constant. Then it could be used both to check for a particular bit-size in the search expression and to allow you to specify a bit-size when constructing a value in case it's ambiguous. If you're amenable to the idea, I'll hack on it a bit on Monday. I've been meaning to add a bit-size validator to nir_algebraic.py for some time now anyway. --Jason > Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> > --- > src/compiler/nir/nir_algebraic.py | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py > index 53a7907..f3630e0 100644 > --- a/src/compiler/nir/nir_algebraic.py > +++ b/src/compiler/nir/nir_algebraic.py > @@ -180,6 +180,11 @@ class SearchAndReplace(object): > else: > self.condition = 'true' > > + if len(transform) > 3: > + self.bit_size = transform[3] > + else: > + self.bit_size = 0 > + > if self.condition not in condition_list: > condition_list.append(self.condition) > self.condition_index = condition_list.index(self.condition) > @@ -208,6 +213,7 @@ struct transform { > const nir_search_expression *search; > const nir_search_value *replace; > unsigned condition_offset; > + unsigned bit_size; > }; > > struct opt_state { > @@ -226,7 +232,7 @@ struct opt_state { > > static const struct transform ${pass_name}_${opcode}_xforms[] = { > % for xform in xform_list: > - { &${xform.search.name}, ${xform.replace.c_ptr}, ${xform.condition_index} }, > + { &${xform.search.name}, ${xform.replace.c_ptr}, ${xform.condition_index}, ${xform.bit_size}}, > % endfor > }; > % endfor > @@ -249,6 +255,9 @@ ${pass_name}_block(nir_block *block, void *void_state) > case nir_op_${opcode}: > for (unsigned i = 0; i < ARRAY_SIZE(${pass_name}_${opcode}_xforms); i++) { > const struct transform *xform = &${pass_name}_${opcode}_xforms[i]; > + if (xform->bit_size != 0 && > + alu->dest.dest.ssa.bit_size != xform->bit_size) > + continue; > if (state->condition_flags[xform->condition_offset] && > nir_replace_instr(alu, xform->search, xform->replace, > state->mem_ctx)) { > -- > 2.5.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev