diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2014-06-11 16:58:51 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2014-06-11 16:58:51 +0000 |
commit | d9c35eee65f97e368a89148572ca8a43d0eb071c (patch) | |
tree | 3d0591f6b1eb26e1dda4162bf800619545af750e | |
parent | 3c4c42e826b61d7b99e6be965dd1187784d2228c (diff) | |
download | gcc-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
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/genpreds.c | 21 | ||||
-rw-r--r-- | gcc/ira-costs.c | 6 | ||||
-rw-r--r-- | gcc/ira.c | 7 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 6 | ||||
-rw-r--r-- | gcc/recog.c | 10 | ||||
-rw-r--r-- | gcc/reload.c | 7 |
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; @@ -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; |