gensupport.h (pred_data): Add a "num_codes" field.

gcc/
	* gensupport.h (pred_data): Add a "num_codes" field.
	(add_predicate_code): Declare.
	* gensupport.c (add_predicate_code): New function.
	(std_pred_table): Add an "allows_const_p" field.
	(std_preds): Set this field for predicates that allow RTX_CONST_OBJs.
	Remove the (incomplete) list of such codes from the codes field.
	(init_predicate_table): Use add_predicate_code.  Add all
	RTX_CONST_OBJs if allows_const_p is true.
	* genrecog.c (process_define_predicate): Use add_predicate_code.

From-SVN: r135090
This commit is contained in:
Richard Sandiford 2008-05-08 21:28:27 +00:00 committed by Richard Sandiford
parent 977502ff84
commit e663da80d4
4 changed files with 69 additions and 57 deletions

View File

@ -1,3 +1,15 @@
2008-05-08 Richard Sandiford <rsandifo@nildram.co.uk>
* gensupport.h (pred_data): Add a "num_codes" field.
(add_predicate_code): Declare.
* gensupport.c (add_predicate_code): New function.
(std_pred_table): Add an "allows_const_p" field.
(std_preds): Set this field for predicates that allow RTX_CONST_OBJs.
Remove the (incomplete) list of such codes from the codes field.
(init_predicate_table): Use add_predicate_code. Add all
RTX_CONST_OBJs if allows_const_p is true.
* genrecog.c (process_define_predicate): Use add_predicate_code.
2008-05-08 David Daney <ddaney@avtrex.com>
Richard Sandiford <rsandifo@nildram.co.uk>

View File

@ -368,7 +368,6 @@ process_define_predicate (rtx desc)
{
struct pred_data *pred = xcalloc (sizeof (struct pred_data), 1);
char codes[NUM_RTX_CODE];
bool seen_one = false;
int i;
pred->name = XSTR (desc, 0);
@ -379,26 +378,8 @@ process_define_predicate (rtx desc)
for (i = 0; i < NUM_RTX_CODE; i++)
if (codes[i] != N)
{
pred->codes[i] = true;
if (GET_RTX_CLASS (i) != RTX_CONST_OBJ)
pred->allows_non_const = true;
if (i != REG
&& i != SUBREG
&& i != MEM
&& i != CONCAT
&& i != PARALLEL
&& i != STRICT_LOW_PART)
pred->allows_non_lvalue = true;
add_predicate_code (pred, i);
if (seen_one)
pred->singleton = UNKNOWN;
else
{
pred->singleton = i;
seen_one = true;
}
}
add_predicate (pred);
}
#undef I

View File

@ -1299,6 +1299,34 @@ lookup_predicate (const char *name)
return (struct pred_data *) htab_find (predicate_table, &key);
}
/* Record that predicate PRED can accept CODE. */
void
add_predicate_code (struct pred_data *pred, enum rtx_code code)
{
if (!pred->codes[code])
{
pred->num_codes++;
pred->codes[code] = true;
if (GET_RTX_CLASS (code) != RTX_CONST_OBJ)
pred->allows_non_const = true;
if (code != REG
&& code != SUBREG
&& code != MEM
&& code != CONCAT
&& code != PARALLEL
&& code != STRICT_LOW_PART)
pred->allows_non_lvalue = true;
if (pred->num_codes == 1)
pred->singleton = code;
else if (pred->num_codes == 2)
pred->singleton = UNKNOWN;
}
}
void
add_predicate (struct pred_data *pred)
{
@ -1320,32 +1348,31 @@ struct std_pred_table
{
const char *name;
bool special;
bool allows_const_p;
RTX_CODE codes[NUM_RTX_CODE];
};
static const struct std_pred_table std_preds[] = {
{"general_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
LABEL_REF, SUBREG, REG, MEM }},
{"address_operand", true, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
LABEL_REF, SUBREG, REG, MEM,
PLUS, MINUS, MULT}},
{"register_operand", false, {SUBREG, REG}},
{"pmode_register_operand", true, {SUBREG, REG}},
{"scratch_operand", false, {SCRATCH, REG}},
{"immediate_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
LABEL_REF}},
{"const_int_operand", false, {CONST_INT}},
{"const_double_operand", false, {CONST_INT, CONST_DOUBLE}},
{"nonimmediate_operand", false, {SUBREG, REG, MEM}},
{"nonmemory_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
LABEL_REF, SUBREG, REG}},
{"push_operand", false, {MEM}},
{"pop_operand", false, {MEM}},
{"memory_operand", false, {SUBREG, MEM}},
{"indirect_operand", false, {SUBREG, MEM}},
{"comparison_operator", false, {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU,
UNORDERED, ORDERED, UNEQ, UNGE, UNGT, UNLE,
UNLT, LTGT}}
{"general_operand", false, true, {SUBREG, REG, MEM}},
{"address_operand", true, true, {SUBREG, REG, MEM, PLUS, MINUS, MULT}},
{"register_operand", false, false, {SUBREG, REG}},
{"pmode_register_operand", true, false, {SUBREG, REG}},
{"scratch_operand", false, false, {SCRATCH, REG}},
{"immediate_operand", false, true, {0}},
{"const_int_operand", false, false, {CONST_INT}},
{"const_double_operand", false, false, {CONST_INT, CONST_DOUBLE}},
{"nonimmediate_operand", false, false, {SUBREG, REG, MEM}},
{"nonmemory_operand", false, true, {SUBREG, REG}},
{"push_operand", false, false, {MEM}},
{"pop_operand", false, false, {MEM}},
{"memory_operand", false, false, {SUBREG, MEM}},
{"indirect_operand", false, false, {SUBREG, MEM}},
{"comparison_operator", false, false, {EQ, NE,
LE, LT, GE, GT,
LEU, LTU, GEU, GTU,
UNORDERED, ORDERED,
UNEQ, UNGE, UNGT,
UNLE, UNLT, LTGT}}
};
#define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds)
@ -1369,22 +1396,12 @@ init_predicate_table (void)
pred->special = std_preds[i].special;
for (j = 0; std_preds[i].codes[j] != 0; j++)
{
enum rtx_code code = std_preds[i].codes[j];
add_predicate_code (pred, std_preds[i].codes[j]);
pred->codes[code] = true;
if (GET_RTX_CLASS (code) != RTX_CONST_OBJ)
pred->allows_non_const = true;
if (code != REG
&& code != SUBREG
&& code != MEM
&& code != CONCAT
&& code != PARALLEL
&& code != STRICT_LOW_PART)
pred->allows_non_lvalue = true;
}
if (j == 1)
pred->singleton = std_preds[i].codes[0];
if (std_preds[i].allows_const_p)
for (j = 0; j < NUM_RTX_CODE; j++)
if (GET_RTX_CLASS (j) == RTX_CONST_OBJ)
add_predicate_code (pred, j);
add_predicate (pred);
}

View File

@ -76,6 +76,7 @@ struct pred_data
/* data used primarily by genrecog.c */
enum rtx_code singleton; /* if pred takes only one code, that code */
int num_codes; /* number of codes accepted */
bool allows_non_lvalue; /* if pred allows non-lvalue expressions */
bool allows_non_const; /* if pred allows non-const expressions */
bool codes[NUM_RTX_CODE]; /* set of codes accepted */
@ -83,6 +84,7 @@ struct pred_data
extern struct pred_data *first_predicate;
extern struct pred_data *lookup_predicate (const char *);
extern void add_predicate_code (struct pred_data *, enum rtx_code);
extern void add_predicate (struct pred_data *);
#define FOR_ALL_PREDICATES(p) for (p = first_predicate; p; p = p->next)