This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 2/7] Support >26 operands in generation code.
- From: Richard Sandiford <richard dot sandiford at linaro dot org>
- To: Alan Hayward <Alan dot Hayward at arm dot com>
- Cc: "gcc-patches\@gcc.gnu.org" <gcc-patches at gcc dot gnu dot org>, nd <nd at arm dot com>
- Date: Tue, 06 Feb 2018 17:03:21 +0000
- Subject: Re: [PATCH 2/7] Support >26 operands in generation code.
- Authentication-results: sourceware.org; auth=none
- References: <E08103E8-D6DE-40D5-88E1-506D48DD99C5@arm.com>
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