Commit 16a26e42 by Richard Sandiford Committed by Richard Sandiford

genpreds.c (write_lookup_constraint): Rename to...

gcc/
	* genpreds.c (write_lookup_constraint): Rename to...
	(write_lookup_constraint_1): ...this.
	(write_lookup_constraint_array): New function.
	(write_tm_preds_h): Define lookup_constraint as an inline function
	that uses write_lookup_constraint_array where possible.
	(write_insn_preds_c): Update for the changes above.

From-SVN: r211469
parent 2aeedf58
2014-06-11 Richard Sandiford <rdsandiford@googlemail.com> 2014-06-11 Richard Sandiford <rdsandiford@googlemail.com>
* genpreds.c (write_lookup_constraint): Rename to...
(write_lookup_constraint_1): ...this.
(write_lookup_constraint_array): New function.
(write_tm_preds_h): Define lookup_constraint as an inline function
that uses write_lookup_constraint_array where possible.
(write_insn_preds_c): Update for the changes above.
2014-06-11 Richard Sandiford <rdsandiford@googlemail.com>
* doc/md.texi (regclass_for_constraint): Rename to... * doc/md.texi (regclass_for_constraint): Rename to...
(reg_class_for_constraint): ...this. (reg_class_for_constraint): ...this.
* genpreds.c (num_constraints, enum_order, register_start) * genpreds.c (num_constraints, enum_order, register_start)
......
...@@ -966,11 +966,11 @@ write_enum_constraint_num (void) ...@@ -966,11 +966,11 @@ write_enum_constraint_num (void)
/* Write out a function which looks at a string and determines what /* Write out a function which looks at a string and determines what
constraint name, if any, it begins with. */ constraint name, if any, it begins with. */
static void static void
write_lookup_constraint (void) write_lookup_constraint_1 (void)
{ {
unsigned int i; unsigned int i;
puts ("enum constraint_num\n" puts ("enum constraint_num\n"
"lookup_constraint (const char *str)\n" "lookup_constraint_1 (const char *str)\n"
"{\n" "{\n"
" switch (str[0])\n" " switch (str[0])\n"
" {"); " {");
...@@ -1005,6 +1005,29 @@ write_lookup_constraint (void) ...@@ -1005,6 +1005,29 @@ write_lookup_constraint (void)
"}\n"); "}\n");
} }
/* Write out an array that maps single-letter characters to their
constraints (if that fits in a character) or 255 if lookup_constraint_1
must be called. */
static void
write_lookup_constraint_array (void)
{
unsigned int i;
printf ("const unsigned char lookup_constraint_array[] = {\n ");
for (i = 0; i < ARRAY_SIZE (constraints_by_letter_table); i++)
{
if (i != 0)
printf (",\n ");
struct constraint_data *c = constraints_by_letter_table[i];
if (!c)
printf ("CONSTRAINT__UNKNOWN");
else if (c->namelen == 1)
printf ("MIN ((int) CONSTRAINT_%s, (int) UCHAR_MAX)", c->c_name);
else
printf ("UCHAR_MAX");
}
printf ("\n};\n\n");
}
/* Write out a function which looks at a string and determines what /* Write out a function which looks at a string and determines what
the constraint name length is. */ the constraint name length is. */
static void static void
...@@ -1245,7 +1268,22 @@ write_tm_preds_h (void) ...@@ -1245,7 +1268,22 @@ write_tm_preds_h (void)
if (constraint_max_namelen > 0) if (constraint_max_namelen > 0)
{ {
write_enum_constraint_num (); write_enum_constraint_num ();
puts ("extern enum constraint_num lookup_constraint (const char *);"); puts ("extern enum constraint_num lookup_constraint_1 (const char *);\n"
"extern const unsigned char lookup_constraint_array[];\n"
"\n"
"/* Return the constraint at the beginning of P, or"
" CONSTRAINT__UNKNOWN if it\n"
" isn't recognized. */\n"
"\n"
"static inline enum constraint_num\n"
"lookup_constraint (const char *p)\n"
"{\n"
" unsigned int index = lookup_constraint_array"
"[(unsigned char) *p];\n"
" return (index == UCHAR_MAX\n"
" ? lookup_constraint_1 (p)\n"
" : (enum constraint_num) index);\n"
"}\n");
if (satisfied_start == num_constraints) if (satisfied_start == num_constraints)
puts ("/* Return true if X satisfies constraint C. */\n" puts ("/* Return true if X satisfies constraint C. */\n"
"\n" "\n"
...@@ -1383,7 +1421,8 @@ write_insn_preds_c (void) ...@@ -1383,7 +1421,8 @@ write_insn_preds_c (void)
if (constraint_max_namelen > 0) if (constraint_max_namelen > 0)
{ {
write_lookup_constraint (); write_lookup_constraint_1 ();
write_lookup_constraint_array ();
if (have_register_constraints) if (have_register_constraints)
write_reg_class_for_constraint_1 (); write_reg_class_for_constraint_1 ();
write_constraint_satisfied_p_1 (); write_constraint_satisfied_p_1 ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment