diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-06-11 16:58:35 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-06-11 16:58:35 +0000 |
commit | 777e635f1a6cab5d2c6837b1ea903ed0bcbe87d3 (patch) | |
tree | 923092a0e7d4f3ea66962e54661707bc328d5327 /gcc/genpreds.c | |
parent | 9e6b7874141cf74a8eb0786d7265296f671feac4 (diff) | |
download | gcc-777e635f1a6cab5d2c6837b1ea903ed0bcbe87d3.zip gcc-777e635f1a6cab5d2c6837b1ea903ed0bcbe87d3.tar.gz gcc-777e635f1a6cab5d2c6837b1ea903ed0bcbe87d3.tar.bz2 |
system.h (REG_CLASS_FROM_CONSTRAINT): Poison.
gcc/
* system.h (REG_CLASS_FROM_CONSTRAINT): Poison.
(REG_CLASS_FOR_CONSTRAINT, EXTRA_CONSTRAINT_STR): Likewise.
(EXTRA_MEMORY_CONSTRAINT, EXTRA_ADDRESS_CONSTRAINT): Likewise.
* genpreds.c (print_type_tree): New function.
(write_tm_preds_h): Remove REG_CLASS_FROM_CONSTRAINT,
REG_CLASS_FOR_CONSTRAINT, EXTRA_MEMORY_CONSTRAINT,
EXTRA_ADDRESS_CONSTRAINT and EXTRA_CONSTRAINT_STR.
Write out enum constraint_type and get_constraint_type.
* lra-constraints.c (satisfies_memory_constraint_p): Take a
constraint_num rather than a constraint string.
(satisfies_address_constraint_p): Likewise.
(reg_class_from_constraints): Avoid old constraint macros.
(process_alt_operands, process_address_1): Likewise.
(curr_insn_transform): Likewise.
* ira-costs.c (record_reg_classes): Likewise.
(record_operand_costs): Likewise.
* ira-lives.c (single_reg_class): Likewise.
(ira_implicitly_set_insn_hard_regs): Likewise.
* ira.c (ira_setup_alts, ira_get_dup_out_num): Likewise.
* postreload.c (reload_cse_simplify_operands): Likewise.
* recog.c (asm_operand_ok, preprocess_constraints): Likewise.
(constrain_operands, peep2_find_free_register): Likewise.
* reload.c (push_secondary_reload, scratch_reload_class): Likewise.
(find_reloads, alternative_allows_const_pool_ref): Likewise.
* reload1.c (maybe_fix_stack_asms): Likewise.
* stmt.c (parse_output_constraint, parse_input_constraint): Likewise.
* targhooks.c (default_secondary_reload): Likewise.
* config/m32c/m32c.c (m32c_matches_constraint_p): Avoid reference
to EXTRA_CONSTRAINT_STR.
* config/sparc/constraints.md (U): Likewise REG_CLASS_FROM_CONSTRAINT.
From-SVN: r211471
Diffstat (limited to 'gcc/genpreds.c')
-rw-r--r-- | gcc/genpreds.c | 73 |
1 files changed, 50 insertions, 23 deletions
diff --git a/gcc/genpreds.c b/gcc/genpreds.c index e5ffb38..1613d25 100644 --- a/gcc/genpreds.c +++ b/gcc/genpreds.c @@ -1232,6 +1232,33 @@ write_range_function (const char *name, unsigned int start, unsigned int end) "}\n\n", name); } +/* VEC is a list of key/value pairs, with the keys being lower bounds + of a range. Output a decision tree that handles the keys covered by + [VEC[START], VEC[END]), returning FALLBACK for keys lower then VEC[START]'s. + INDENT is the number of spaces to indent the code. */ +static void +print_type_tree (const vec <std::pair <unsigned int, const char *> > &vec, + unsigned int start, unsigned int end, const char *fallback, + unsigned int indent) +{ + while (start < end) + { + unsigned int mid = (start + end) / 2; + printf ("%*sif (c >= CONSTRAINT_%s)\n", + indent, "", enum_order[vec[mid].first]->c_name); + if (mid + 1 == end) + print_type_tree (vec, mid + 1, end, vec[mid].second, indent + 2); + else + { + printf ("%*s{\n", indent + 2, ""); + print_type_tree (vec, mid + 1, end, vec[mid].second, indent + 4); + printf ("%*s}\n", indent + 2, ""); + } + end = mid; + } + printf ("%*sreturn %s;\n", indent, "", fallback); +} + /* Write tm-preds.h. Unfortunately, it is impossible to forward-declare an enumeration in portable C, so we have to condition all these prototypes on HAVE_MACHINE_MODES. */ @@ -1321,21 +1348,13 @@ write_tm_preds_h (void) " if (insn_extra_register_constraint (c))\n" " return reg_class_for_constraint_1 (c);\n" " return NO_REGS;\n" - "}\n" - "\n" - "#define REG_CLASS_FROM_CONSTRAINT(c_,s_) \\\n" - " reg_class_for_constraint (lookup_constraint (s_))\n" - "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n" - " reg_class_for_constraint (x_)\n"); + "}\n"); else puts ("static inline enum reg_class\n" "reg_class_for_constraint (enum constraint_num)\n" "{\n" " return NO_REGS;\n" - "}\n\n" - "#define REG_CLASS_FROM_CONSTRAINT(c_,s_) NO_REGS\n" - "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n" - " NO_REGS\n"); + "}\n"); if (have_const_int_constraints) puts ("extern bool insn_const_int_ok_for_constraint " "(HOST_WIDE_INT, enum constraint_num);\n" @@ -1347,19 +1366,27 @@ write_tm_preds_h (void) " constraint_satisfied_p (v_, lookup_constraint (s_))\n"); else puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) 0\n"); - if (have_extra_constraints) - puts ("#define EXTRA_CONSTRAINT_STR(v_,c_,s_) \\\n" - " constraint_satisfied_p (v_, lookup_constraint (s_))\n"); - if (have_memory_constraints) - puts ("#define EXTRA_MEMORY_CONSTRAINT(c_,s_) " - "insn_extra_memory_constraint (lookup_constraint (s_))\n"); - else - puts ("#define EXTRA_MEMORY_CONSTRAINT(c_,s_) false\n"); - if (have_address_constraints) - puts ("#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) " - "insn_extra_address_constraint (lookup_constraint (s_))\n"); - else - puts ("#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) false\n"); + + puts ("enum constraint_type\n" + "{\n" + " CT_REGISTER,\n" + " CT_MEMORY,\n" + " CT_ADDRESS,\n" + " CT_FIXED_FORM\n" + "};\n" + "\n" + "static inline enum constraint_type\n" + "get_constraint_type (enum constraint_num c)\n" + "{"); + auto_vec <std::pair <unsigned int, const char *>, 3> values; + if (memory_start != memory_end) + values.safe_push (std::make_pair (memory_start, "CT_MEMORY")); + if (address_start != address_end) + values.safe_push (std::make_pair (address_start, "CT_ADDRESS")); + if (address_end != num_constraints) + values.safe_push (std::make_pair (address_end, "CT_FIXED_FORM")); + print_type_tree (values, 0, values.length (), "CT_REGISTER", 2); + puts ("}"); } puts ("#endif /* tm-preds.h */"); |