Andrea Corallo <andrea.cora...@arm.com> writes:
> From: Richard Sandiford <richard.sandif...@arm.com>
>
> Hi all,
>
> this is to add support to the new compact pattern syntax for the case
> where the constraints do appear unsorted like:
>
> (define_insn "*<optab>si3_insn_uxtw"
>   [(set (match_operand:DI 0 "register_operand")
>         (zero_extend:DI (SHIFT_no_rotate:SI
>          (match_operand:SI 1 "register_operand")
>          (match_operand:QI 2 "aarch64_reg_or_shift_imm_si"))))]
>   ""
>   {@ [cons: =0, 2,   1]
>      [      r,  Uss, r] <shift>\\t%w0, %w1, %2
>      [      r,  r,   r] <shift>\\t%w0, %w1, %w2
>   }
>   [(set_attr "type" "bfx,shift_reg")]
> )
>
> Best Regards
>
>   Andrea
>
> gcc/Changelog
>
> 2023-09-20  Richard Sandiford  <richard.sandif...@arm.com>
>
>       * gensupport.cc (convert_syntax): Updated to support unordered
>       constraints in compact syntax.

Thanks for picking this up.  OK for trunk.

Richard

> ---
>  gcc/gensupport.cc | 32 ++++++++++++++++----------------
>  1 file changed, 16 insertions(+), 16 deletions(-)
>
> diff --git a/gcc/gensupport.cc b/gcc/gensupport.cc
> index f7164b3214d..7e125e3d8db 100644
> --- a/gcc/gensupport.cc
> +++ b/gcc/gensupport.cc
> @@ -896,19 +896,6 @@ convert_syntax (rtx x, file_location loc)
>  
>    parse_section_layout (loc, &templ, "cons:", tconvec, true);
>  
> -  /* Check for any duplicate cons entries and sort based on i.  */
> -  for (auto e : tconvec)
> -    {
> -      unsigned idx = e.idx;
> -      if (idx >= convec.size ())
> -     convec.resize (idx + 1);
> -
> -      if (convec[idx].idx >= 0)
> -     fatal_at (loc, "duplicate cons number found: %d", idx);
> -      convec[idx] = e;
> -    }
> -  tconvec.clear ();
> -
>    if (*templ != ']')
>      {
>        if (*templ == ';')
> @@ -951,13 +938,13 @@ convert_syntax (rtx x, file_location loc)
>         new_templ += '\n';
>         new_templ.append (buffer);
>         /* Parse the constraint list, then the attribute list.  */
> -       if (convec.size () > 0)
> -         parse_section (&templ, convec.size (), alt_no, convec, loc,
> +       if (tconvec.size () > 0)
> +         parse_section (&templ, tconvec.size (), alt_no, tconvec, loc,
>                          "constraint");
>  
>         if (attrvec.size () > 0)
>           {
> -           if (convec.size () > 0 && !expect_char (&templ, ';'))
> +           if (tconvec.size () > 0 && !expect_char (&templ, ';'))
>               fatal_at (loc, "expected `;' to separate constraints "
>                              "and attributes in alternative %d", alt_no);
>  
> @@ -1027,6 +1014,19 @@ convert_syntax (rtx x, file_location loc)
>        ++alt_no;
>      }
>  
> +  /* Check for any duplicate cons entries and sort based on i.  */
> +  for (auto e : tconvec)
> +    {
> +      unsigned idx = e.idx;
> +      if (idx >= convec.size ())
> +     convec.resize (idx + 1);
> +
> +      if (convec[idx].idx >= 0)
> +     fatal_at (loc, "duplicate cons number found: %d", idx);
> +      convec[idx] = e;
> +    }
> +  tconvec.clear ();
> +
>    /* Write the constraints and attributes into their proper places.  */
>    if (convec.size () > 0)
>      add_constraints (x, loc, convec);

Reply via email to