]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
genpreds.c (const_int_start, [...]): New variables.
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 11 Jun 2014 16:58:51 +0000 (16:58 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 11 Jun 2014 16:58:51 +0000 (16:58 +0000)
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

gcc/ChangeLog
gcc/genpreds.c
gcc/ira-costs.c
gcc/ira.c
gcc/lra-constraints.c
gcc/recog.c
gcc/reload.c

index 95cc4a3588d406395aa23f7ce83788c4e8b0c655..3452b6df469b356e72c7d33d9738198f9848d3a6 100644 (file)
@@ -1,3 +1,16 @@
+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,
index 1613d25f3aa968fe284c13e329f76a37cab1125c..c50b9cda38a22e3cc31e025a767a411cdaa33b31 100644 (file)
@@ -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)
index a93985b185593b44b3155c7c3378d3fb2fc91501..795238f75f6fb443ff8f3e104be8415bbc25048c 100644 (file)
@@ -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;
index 2b63a999d217fe21496dbc631368d59818c85ae3..f85ced33a8bd5311e18fc01a8c3097d6c22603bd 100644 (file)
--- 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;
index 8342a0a3e3c304348a8040d1197c31516bcd0996..453c578f72a9f65a327b6ca4b2df8d2f697709a6 100644 (file)
@@ -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))
index 9d9fa778a146faa4d22000030123ae402ab0df23..2b62167c4f69068da7bc178e80a1ab5e60cda1e9 100644 (file)
@@ -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;
index e4614bb3210a9ff4e78368e6aa941fc74b61499d..cf2de93a0ea7448f14a785297c304b508a4fcf07 100644 (file)
@@ -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;