This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/7] Support >26 operands in generation code.


Alan Hayward <Alan.Hayward@arm.com> writes:
> This patch adds support for CLOBBER_HIGH in the generation code.
>
> An aarch64 will require 31 clobber high expressions, plus two
> clobbers.
>
> The exisiting gen code restricts to 26 vector operands by virtue
> of using the operators [a-z]. This patch extends this to 52 by
> supporting [a-zA-Z].

Although the main CLOBBER_HIGH patch will obviously need to wait
until GCC 9 now, we can work around it for GCC 8 by making the
tlsdesc pattern clobber all vector and predicate registers for SVE.
We'll still need the support for more than 26 operands in order
to do that though.

> 2017-11-16  Alan Hayward  <alan.hayward@arm.com>
>
>[...]
> 	* genextract.c (push_pathstr_operand): New function to
> 	support [a-zA-Z].
> 	(walk_rtx): Call push_pathstr_operand.
> 	(print_path): Support [a-zA-Z].
>[...]
> diff --git a/gcc/genextract.c b/gcc/genextract.c
> index 258d234d2729bf16b152b90bb1833a37a6eb0bdc..e1fb716e459b9bd219e89cf36c30556d520305a2 100644
> --- a/gcc/genextract.c
> +++ b/gcc/genextract.c
> @@ -33,9 +33,10 @@ along with GCC; see the file COPYING3.  If not see
>
>     The string for each operand describes that path to the operand and
>     contains `0' through `9' when going into an expression and `a' through
> -   `z' when going into a vector.  We assume here that only the first operand
> -   of an rtl expression is a vector.  genrecog.c makes the same assumption
> -   (and uses the same representation) and it is currently true.  */
> +   `z' then 'A' through to 'Z' when going into a vector.  We assume here that
> +   only the first operand of an rtl expression is a vector.  genrecog.c makes
> +   the same assumption (and uses the same representation) and it is currently
> +   true.  */
>
>  typedef char *locstr;
>
> @@ -80,6 +81,22 @@ struct accum_extract
>  /* Forward declarations.  */
>  static void walk_rtx (md_rtx_info *, rtx, struct accum_extract *);
>
> +#define UPPER_OFFSET ('A' - ('z' - 'a' + 1))
> +
> +/* Convert OPERAND into a character - either into [a-zA-Z] for vector operands
> +   or [0-9] for integer operands - and push onto the end of the path ACC.  */
> +static void
> +push_pathstr_operand (int operand, bool is_vector,
> +		     struct accum_extract *acc)
> +{
> +  if (is_vector && 'a' + operand > 'z')
> +    acc->pathstr.safe_push (operand + UPPER_OFFSET);
> +  else if (is_vector)
> +    acc->pathstr.safe_push (operand + 'a');
> +  else
> +    acc->pathstr.safe_push (operand + '0');
> +}
> +
>  static void
>  gen_insn (md_rtx_info *info)
>  {
> @@ -98,7 +115,7 @@ gen_insn (md_rtx_info *info)
>    else
>      for (i = XVECLEN (insn, 1) - 1; i >= 0; i--)
>        {
> -	acc.pathstr.safe_push ('a' + i);
> +	push_pathstr_operand (i, true, &acc);
>  	walk_rtx (info, XVECEXP (insn, 1, i), &acc);
>  	acc.pathstr.pop ();
>        }
> @@ -208,7 +225,7 @@ static void
>  walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc)
>  {
>    RTX_CODE code;
> -  int i, len, base;
> +  int i, len;
>    const char *fmt;
>
>    if (x == 0)
> @@ -234,10 +251,9 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc)
>        VEC_safe_set_locstr (info, &acc->oplocs, XINT (x, 0),
>  			   VEC_char_to_string (acc->pathstr));
>
> -      base = (code == MATCH_OPERATOR ? '0' : 'a');
>        for (i = XVECLEN (x, 2) - 1; i >= 0; i--)
>  	{
> -	  acc->pathstr.safe_push (base + i);
> +	  push_pathstr_operand (i, code != MATCH_OPERATOR, acc);
>  	  walk_rtx (info, XVECEXP (x, 2, i), acc);
>  	  acc->pathstr.pop ();
>          }
> @@ -252,10 +268,9 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc)
>        if (code == MATCH_DUP)
>  	break;
>
> -      base = (code == MATCH_OP_DUP ? '0' : 'a');
>        for (i = XVECLEN (x, 1) - 1; i >= 0; i--)
>          {
> -	  acc->pathstr.safe_push (base + i);
> +	  push_pathstr_operand (i, code != MATCH_OP_DUP, acc);
>  	  walk_rtx (info, XVECEXP (x, 1, i), acc);
>  	  acc->pathstr.pop ();
>          }
> @@ -271,7 +286,7 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc)
>      {
>        if (fmt[i] == 'e' || fmt[i] == 'u')
>  	{
> -	  acc->pathstr.safe_push ('0' + i);
> +	  push_pathstr_operand (i, false, acc);
>  	  walk_rtx (info, XEXP (x, i), acc);
>  	  acc->pathstr.pop ();
>  	}
> @@ -280,7 +295,7 @@ walk_rtx (md_rtx_info *info, rtx x, struct accum_extract *acc)
>  	  int j;
>  	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
>  	    {
> -	      acc->pathstr.safe_push ('a' + j);
> +	      push_pathstr_operand (j, true, acc);
>  	      walk_rtx (info, XVECEXP (x, i, j), acc);
>  	      acc->pathstr.pop ();
>  	    }
> @@ -311,7 +326,7 @@ print_path (const char *path)
>
>    for (i = len - 1; i >= 0 ; i--)
>      {
> -      if (ISLOWER (path[i]))
> +      if (ISLOWER (path[i]) || ISUPPER (path[i]))
>  	fputs ("XVECEXP (", stdout);
>        else if (ISDIGIT (path[i]))
>  	fputs ("XEXP (", stdout);
> @@ -323,7 +338,9 @@ print_path (const char *path)
>
>    for (i = 0; i < len; i++)
>      {
> -      if (ISLOWER (path[i]))
> +      if (ISUPPER (path[i]))
> +	printf (", 0, %d)", path[i] - UPPER_OFFSET);
> +      else if (ISLOWER (path[i]))
>  	printf (", 0, %d)", path[i] - 'a');
>        else if (ISDIGIT (path[i]))
>  	printf (", %d)", path[i] - '0');

This part is OK, thanks.  Could you test it independently of the
rest and commit?

Richard


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]