aboutsummaryrefslogtreecommitdiff
path: root/gcc/genpreds.c
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-06-11 16:58:35 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-06-11 16:58:35 +0000
commit777e635f1a6cab5d2c6837b1ea903ed0bcbe87d3 (patch)
tree923092a0e7d4f3ea66962e54661707bc328d5327 /gcc/genpreds.c
parent9e6b7874141cf74a8eb0786d7265296f671feac4 (diff)
downloadgcc-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.c73
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 */");