aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2014-06-11 16:58:51 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2014-06-11 16:58:51 +0000
commitd9c35eee65f97e368a89148572ca8a43d0eb071c (patch)
tree3d0591f6b1eb26e1dda4162bf800619545af750e /gcc
parent3c4c42e826b61d7b99e6be965dd1187784d2228c (diff)
downloadgcc-d9c35eee65f97e368a89148572ca8a43d0eb071c.zip
gcc-d9c35eee65f97e368a89148572ca8a43d0eb071c.tar.gz
gcc-d9c35eee65f97e368a89148572ca8a43d0eb071c.tar.bz2
genpreds.c (const_int_start, [...]): New variables.
gcc/ * genpreds.c (const_int_start, const_int_end): New variables. (choose_enum_order): Output CONST_INT constraints before memory constraints. (write_tm_preds_h): Always define insn_const_int_ok_for_constraint. Add CT_CONST_INT. * ira-costs.c (record_reg_classes): Handle CT_CONST_INT. * ira.c (ira_setup_alts): Likewise. * lra-constraints.c (process_alt_operands): Likewise. * recog.c (asm_operand_ok, preprocess_constraints): Likewise. * reload.c (find_reloads): Likewise. From-SVN: r211473
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/genpreds.c21
-rw-r--r--gcc/ira-costs.c6
-rw-r--r--gcc/ira.c7
-rw-r--r--gcc/lra-constraints.c6
-rw-r--r--gcc/recog.c10
-rw-r--r--gcc/reload.c7
7 files changed, 68 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 95cc4a3..3452b6d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,18 @@
2014-06-11 Richard Sandiford <rdsandiford@googlemail.com>
+ * genpreds.c (const_int_start, const_int_end): New variables.
+ (choose_enum_order): Output CONST_INT constraints before memory
+ constraints.
+ (write_tm_preds_h): Always define insn_const_int_ok_for_constraint.
+ Add CT_CONST_INT.
+ * ira-costs.c (record_reg_classes): Handle CT_CONST_INT.
+ * ira.c (ira_setup_alts): Likewise.
+ * lra-constraints.c (process_alt_operands): Likewise.
+ * recog.c (asm_operand_ok, preprocess_constraints): Likewise.
+ * reload.c (find_reloads): Likewise.
+
+2014-06-11 Richard Sandiford <rdsandiford@googlemail.com>
+
* recog.h (operand_alternative): Remove offmem_ok, nonffmem_ok,
decmem_ok and incmem_ok. Reformat other bitfields for consistency.
* recog.c (preprocess_constraints): Update accordingly.
diff --git a/gcc/genpreds.c b/gcc/genpreds.c
index 1613d25..c50b9cd 100644
--- a/gcc/genpreds.c
+++ b/gcc/genpreds.c
@@ -690,6 +690,7 @@ static unsigned int num_constraints;
static const constraint_data **enum_order;
static unsigned int register_start, register_end;
static unsigned int satisfied_start;
+static unsigned int const_int_start, const_int_end;
static unsigned int memory_start, memory_end;
static unsigned int address_start, address_end;
@@ -931,6 +932,12 @@ choose_enum_order (void)
satisfied_start = next;
+ const_int_start = next;
+ FOR_ALL_CONSTRAINTS (c)
+ if (c->is_const_int)
+ enum_order[next++] = c;
+ const_int_end = next;
+
memory_start = next;
FOR_ALL_CONSTRAINTS (c)
if (c->is_memory)
@@ -944,7 +951,7 @@ choose_enum_order (void)
address_end = next;
FOR_ALL_CONSTRAINTS (c)
- if (!c->is_register && !c->is_memory && !c->is_address)
+ if (!c->is_register && !c->is_const_int && !c->is_memory && !c->is_address)
enum_order[next++] = c;
gcc_assert (next == num_constraints);
}
@@ -1361,6 +1368,13 @@ write_tm_preds_h (void)
"#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
" insn_const_int_ok_for_constraint (v_, "
"lookup_constraint (s_))\n");
+ else
+ puts ("static inline bool\n"
+ "insn_const_int_ok_for_constraint (HOST_WIDE_INT,"
+ " enum constraint_num)\n"
+ "{\n"
+ " return false;\n"
+ "}\n");
if (have_const_dbl_constraints)
puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n"
" constraint_satisfied_p (v_, lookup_constraint (s_))\n");
@@ -1370,6 +1384,7 @@ write_tm_preds_h (void)
puts ("enum constraint_type\n"
"{\n"
" CT_REGISTER,\n"
+ " CT_CONST_INT,\n"
" CT_MEMORY,\n"
" CT_ADDRESS,\n"
" CT_FIXED_FORM\n"
@@ -1378,7 +1393,9 @@ write_tm_preds_h (void)
"static inline enum constraint_type\n"
"get_constraint_type (enum constraint_num c)\n"
"{");
- auto_vec <std::pair <unsigned int, const char *>, 3> values;
+ auto_vec <std::pair <unsigned int, const char *>, 4> values;
+ if (const_int_start != const_int_end)
+ values.safe_push (std::make_pair (const_int_start, "CT_CONST_INT"));
if (memory_start != memory_end)
values.safe_push (std::make_pair (memory_start, "CT_MEMORY"));
if (address_start != address_end)
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index a93985b..795238f 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -763,6 +763,12 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
classes[i] = ira_reg_class_subunion[classes[i]][cl];
break;
+ case CT_CONST_INT:
+ if (CONST_INT_P (op)
+ && insn_const_int_ok_for_constraint (INTVAL (op), cn))
+ win = 1;
+ break;
+
case CT_MEMORY:
/* Every MEM can be reloaded to fit. */
insn_allows_mem[i] = allows_mem[i] = 1;
diff --git a/gcc/ira.c b/gcc/ira.c
index 2b63a99..f85ced3 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1936,6 +1936,13 @@ ira_setup_alts (rtx insn, HARD_REG_SET &alts)
goto op_success;
break;
+ case CT_CONST_INT:
+ if (CONST_INT_P (op)
+ && (insn_const_int_ok_for_constraint
+ (INTVAL (op), cn)))
+ goto op_success;
+ break;
+
case CT_ADDRESS:
case CT_MEMORY:
goto op_success;
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 8342a0a..453c578 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -2041,6 +2041,12 @@ process_alt_operands (int only_alternative)
goto reg;
break;
+ case CT_CONST_INT:
+ if (CONST_INT_P (op)
+ && insn_const_int_ok_for_constraint (INTVAL (op), cn))
+ win = true;
+ break;
+
case CT_MEMORY:
if (MEM_P (op)
&& satisfies_memory_constraint_p (op, cn))
diff --git a/gcc/recog.c b/gcc/recog.c
index 9d9fa77..2b62167 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -1920,6 +1920,13 @@ asm_operand_ok (rtx op, const char *constraint, const char **constraints)
goto reg;
break;
+ case CT_CONST_INT:
+ if (!result
+ && CONST_INT_P (op)
+ && insn_const_int_ok_for_constraint (INTVAL (op), cn))
+ result = 1;
+ break;
+
case CT_MEMORY:
/* Every memory operand can be reloaded to fit. */
result = result || memory_operand (op, VOIDmode);
@@ -2443,6 +2450,9 @@ preprocess_constraints (int n_operands, int n_alternatives,
op_alt[i].cl = reg_class_subunion[op_alt[i].cl][cl];
break;
+ case CT_CONST_INT:
+ break;
+
case CT_MEMORY:
op_alt[i].memory_ok = 1;
break;
diff --git a/gcc/reload.c b/gcc/reload.c
index e4614bb..cf2de93 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -3504,6 +3504,13 @@ find_reloads (rtx insn, int replace, int ind_levels, int live_known,
goto reg;
break;
+ case CT_CONST_INT:
+ if (CONST_INT_P (operand)
+ && (insn_const_int_ok_for_constraint
+ (INTVAL (operand), cn)))
+ win = true;
+ break;
+
case CT_MEMORY:
if (force_reload)
break;