recog.h (insn_data_d): Add n_generator_args.
authorRichard Sandiford <richard.sandiford@linaro.org>
Fri, 1 Apr 2011 08:16:47 +0000 (08:16 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Fri, 1 Apr 2011 08:16:47 +0000 (08:16 +0000)
gcc/
* recog.h (insn_data_d): Add n_generator_args.
* genoutput.c (data): Likewise.
(output_insn_data): Print it.
(max_opno, num_dups): Delete.
(scan_operands): Just fill in "d->operand[...]".
(gen_insn, gen_peephole, gen_expand, gen_split): Use get_pattern_stats.

From-SVN: r171822

gcc/ChangeLog
gcc/genoutput.c
gcc/recog.h

index d048013b65857b41662e3e79bbfab25c4dcda6d4..32ad1daad55e5dacc1380fa517656628e96e528b 100644 (file)
@@ -1,3 +1,12 @@
+2011-04-01  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * recog.h (insn_data_d): Add n_generator_args.
+       * genoutput.c (data): Likewise.
+       (output_insn_data): Print it.
+       (max_opno, num_dups): Delete.
+       (scan_operands): Just fill in "d->operand[...]".
+       (gen_insn, gen_peephole, gen_expand, gen_split): Use get_pattern_stats.
+
 2011-04-01  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * gensupport.h (pattern_stats): New structure.
index d03222f4b21308f535532749805d0a7b6cf9fd06..3e89cfd6df160562cefa452be8d5dd3a4ad763b4 100644 (file)
@@ -160,6 +160,7 @@ struct data
   int index_number;
   const char *filename;
   int lineno;
+  int n_generator_args;                /* Number of arguments passed to generator */
   int n_operands;              /* Number of operands this insn recognizes */
   int n_dups;                  /* Number times match_dup appears in pattern */
   int n_alternatives;          /* Number of alternatives in each constraint */
@@ -393,6 +394,7 @@ output_insn_data (void)
        printf ("    0,\n");
 
       printf ("    &operand_data[%d],\n", d->operand_number);
+      printf ("    %d,\n", d->n_generator_args);
       printf ("    %d,\n", d->n_operands);
       printf ("    %d,\n", d->n_dups);
       printf ("    %d,\n", d->n_alternatives);
@@ -417,16 +419,11 @@ output_get_insn_name (void)
 }
 
 \f
-/* Stores in max_opno the largest operand number present in `part', if
-   that is larger than the previous value of max_opno, and the rest of
-   the operand data into `d->operand[i]'.
+/* Stores the operand data into `d->operand[i]'.
 
    THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS.
    THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART.  */
 
-static int max_opno;
-static int num_dups;
-
 static void
 scan_operands (struct data *d, rtx part, int this_address_p,
               int this_strict_low)
@@ -442,9 +439,7 @@ scan_operands (struct data *d, rtx part, int this_address_p,
     {
     case MATCH_OPERAND:
       opno = XINT (part, 0);
-      if (opno > max_opno)
-       max_opno = opno;
-      if (max_opno >= MAX_MAX_OPERANDS)
+      if (opno >= MAX_MAX_OPERANDS)
        {
          error_with_line (d->lineno, "maximum number of operands exceeded");
          return;
@@ -465,9 +460,7 @@ scan_operands (struct data *d, rtx part, int this_address_p,
 
     case MATCH_SCRATCH:
       opno = XINT (part, 0);
-      if (opno > max_opno)
-       max_opno = opno;
-      if (max_opno >= MAX_MAX_OPERANDS)
+      if (opno >= MAX_MAX_OPERANDS)
        {
          error_with_line (d->lineno, "maximum number of operands exceeded");
          return;
@@ -489,9 +482,7 @@ scan_operands (struct data *d, rtx part, int this_address_p,
     case MATCH_OPERATOR:
     case MATCH_PARALLEL:
       opno = XINT (part, 0);
-      if (opno > max_opno)
-       max_opno = opno;
-      if (max_opno >= MAX_MAX_OPERANDS)
+      if (opno >= MAX_MAX_OPERANDS)
        {
          error_with_line (d->lineno, "maximum number of operands exceeded");
          return;
@@ -510,12 +501,6 @@ scan_operands (struct data *d, rtx part, int this_address_p,
        scan_operands (d, XVECEXP (part, 2, i), 0, 0);
       return;
 
-    case MATCH_DUP:
-    case MATCH_OP_DUP:
-    case MATCH_PAR_DUP:
-      ++num_dups;
-      break;
-
     case ADDRESS:
       scan_operands (d, XEXP (part, 0), 1, 0);
       return;
@@ -830,6 +815,7 @@ validate_optab_operands (struct data *d)
 static void
 gen_insn (rtx insn, int lineno)
 {
+  struct pattern_stats stats;
   struct data *d = XNEW (struct data);
   int i;
 
@@ -848,15 +834,15 @@ gen_insn (rtx insn, int lineno)
   *idata_end = d;
   idata_end = &d->next;
 
-  max_opno = -1;
-  num_dups = 0;
   memset (d->operand, 0, sizeof (d->operand));
 
   for (i = 0; i < XVECLEN (insn, 1); i++)
     scan_operands (d, XVECEXP (insn, 1, i), 0, 0);
 
-  d->n_operands = max_opno + 1;
-  d->n_dups = num_dups;
+  get_pattern_stats (&stats, XVEC (insn, 1));
+  d->n_generator_args = stats.num_generator_args;
+  d->n_operands = stats.num_insn_operands;
+  d->n_dups = stats.num_dups;
 
 #ifndef USE_MD_CONSTRAINTS
   check_constraint_len ();
@@ -875,6 +861,7 @@ gen_insn (rtx insn, int lineno)
 static void
 gen_peephole (rtx peep, int lineno)
 {
+  struct pattern_stats stats;
   struct data *d = XNEW (struct data);
   int i;
 
@@ -890,8 +877,6 @@ gen_peephole (rtx peep, int lineno)
   *idata_end = d;
   idata_end = &d->next;
 
-  max_opno = -1;
-  num_dups = 0;
   memset (d->operand, 0, sizeof (d->operand));
 
   /* Get the number of operands by scanning all the patterns of the
@@ -900,7 +885,9 @@ gen_peephole (rtx peep, int lineno)
   for (i = 0; i < XVECLEN (peep, 0); i++)
     scan_operands (d, XVECEXP (peep, 0, i), 0, 0);
 
-  d->n_operands = max_opno + 1;
+  get_pattern_stats (&stats, XVEC (peep, 0));
+  d->n_generator_args = 0;
+  d->n_operands = stats.num_insn_operands;
   d->n_dups = 0;
 
   validate_insn_alternatives (d);
@@ -914,6 +901,7 @@ gen_peephole (rtx peep, int lineno)
 static void
 gen_expand (rtx insn, int lineno)
 {
+  struct pattern_stats stats;
   struct data *d = XNEW (struct data);
   int i;
 
@@ -932,8 +920,6 @@ gen_expand (rtx insn, int lineno)
   *idata_end = d;
   idata_end = &d->next;
 
-  max_opno = -1;
-  num_dups = 0;
   memset (d->operand, 0, sizeof (d->operand));
 
   /* Scan the operands to get the specified predicates and modes,
@@ -943,8 +929,10 @@ gen_expand (rtx insn, int lineno)
     for (i = 0; i < XVECLEN (insn, 1); i++)
       scan_operands (d, XVECEXP (insn, 1, i), 0, 0);
 
-  d->n_operands = max_opno + 1;
-  d->n_dups = num_dups;
+  get_pattern_stats (&stats, XVEC (insn, 1));
+  d->n_generator_args = stats.num_generator_args;
+  d->n_operands = stats.num_insn_operands;
+  d->n_dups = stats.num_dups;
   d->template_code = 0;
   d->output_format = INSN_OUTPUT_FORMAT_NONE;
 
@@ -959,6 +947,7 @@ gen_expand (rtx insn, int lineno)
 static void
 gen_split (rtx split, int lineno)
 {
+  struct pattern_stats stats;
   struct data *d = XNEW (struct data);
   int i;
 
@@ -974,8 +963,6 @@ gen_split (rtx split, int lineno)
   *idata_end = d;
   idata_end = &d->next;
 
-  max_opno = -1;
-  num_dups = 0;
   memset (d->operand, 0, sizeof (d->operand));
 
   /* Get the number of operands by scanning all the patterns of the
@@ -984,7 +971,9 @@ gen_split (rtx split, int lineno)
   for (i = 0; i < XVECLEN (split, 0); i++)
     scan_operands (d, XVECEXP (split, 0, i), 0, 0);
 
-  d->n_operands = max_opno + 1;
+  get_pattern_stats (&stats, XVEC (split, 0));
+  d->n_generator_args = 0;
+  d->n_operands = stats.num_insn_operands;
   d->n_dups = 0;
   d->n_alternatives = 0;
   d->template_code = 0;
index 534d2c99b183e9f472ddf1dc171bed83bc1c19ff..0261bc6072d7c37a803ffd86dd4b9ed776ba6836 100644 (file)
@@ -300,6 +300,7 @@ struct insn_data_d
   const insn_gen_fn genfun;
   const struct insn_operand_data *const operand;
 
+  const char n_generator_args;
   const char n_operands;
   const char n_dups;
   const char n_alternatives;