summaryrefslogtreecommitdiff
path: root/gcc/genoutput.c
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-01 08:16:47 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-01 08:16:47 +0000
commitcf85f8357f4f331a8cc0c33c7482a00d658244cf (patch)
tree00a468eaf00b3f8137d8112cf7254fe104b988c2 /gcc/genoutput.c
parent22add764ced7691b99368a28c7b194cd0b2e13e2 (diff)
downloadgcc-cf85f8357f4f331a8cc0c33c7482a00d658244cf.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171822 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genoutput.c')
-rw-r--r--gcc/genoutput.c59
1 files changed, 24 insertions, 35 deletions
diff --git a/gcc/genoutput.c b/gcc/genoutput.c
index d03222f4b21..3e89cfd6df1 100644
--- a/gcc/genoutput.c
+++ b/gcc/genoutput.c
@@ -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)
}
-/* 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;