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:
parent
977502ff84
commit
e663da80d4
4 changed files with 69 additions and 57 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue