mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-28 14:24:43 +08:00
recog.h (insn_data_d): Add n_generator_args.
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
This commit is contained in:
parent
e792559ab3
commit
b29387eec6
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user