> On 6 Feb 2018, at 17:03, Richard Sandiford <richard.sandif...@linaro.org> 
> wrote:
> 
> Alan Hayward <alan.hayw...@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.hayw...@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?
> 

Tested by adding all 32 aarch64 vector regs as clobbers to the one of the 
patterns
in arch64.md. Compiled and ran tests. Committed genextract.c as requested.

Thanks,
Alan.

Reply via email to