diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-06-11 16:58:17 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-06-11 16:58:17 +0000 |
commit | 16a26e426bf720dcc95a89b6657fd7b09dda8d6c (patch) | |
tree | 24cd7aa199e416d4f78acbf681440483b5b8c318 | |
parent | 2aeedf58e0dc23cc6b6167f4ed747d637c8c0803 (diff) | |
download | gcc-16a26e426bf720dcc95a89b6657fd7b09dda8d6c.zip gcc-16a26e426bf720dcc95a89b6657fd7b09dda8d6c.tar.gz gcc-16a26e426bf720dcc95a89b6657fd7b09dda8d6c.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/genpreds.c | 47 |
2 files changed, 52 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ff93bc8..0c2e7b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 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... (reg_class_for_constraint): ...this. * genpreds.c (num_constraints, enum_order, register_start) diff --git a/gcc/genpreds.c b/gcc/genpreds.c index 3edd233..3f52b87 100644 --- a/gcc/genpreds.c +++ b/gcc/genpreds.c @@ -966,11 +966,11 @@ write_enum_constraint_num (void) /* Write out a function which looks at a string and determines what constraint name, if any, it begins with. */ static void -write_lookup_constraint (void) +write_lookup_constraint_1 (void) { unsigned int i; puts ("enum constraint_num\n" - "lookup_constraint (const char *str)\n" + "lookup_constraint_1 (const char *str)\n" "{\n" " switch (str[0])\n" " {"); @@ -1005,6 +1005,29 @@ write_lookup_constraint (void) "}\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 the constraint name length is. */ static void @@ -1245,7 +1268,22 @@ write_tm_preds_h (void) if (constraint_max_namelen > 0) { 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) puts ("/* Return true if X satisfies constraint C. */\n" "\n" @@ -1383,7 +1421,8 @@ write_insn_preds_c (void) if (constraint_max_namelen > 0) { - write_lookup_constraint (); + write_lookup_constraint_1 (); + write_lookup_constraint_array (); if (have_register_constraints) write_reg_class_for_constraint_1 (); write_constraint_satisfied_p_1 (); |