gensupport.h (pred_data): Add a "num_codes" field.
authorRichard Sandiford <rsandifo@nildram.co.uk>
Thu, 8 May 2008 21:28:27 +0000 (21:28 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 8 May 2008 21:28:27 +0000 (21:28 +0000)
gcc/
* gensupport.h (pred_data): Add a "num_codes" field.
(add_predicate_code): Declare.
* gensupport.c (add_predicate_code): New function.
(std_pred_table): Add an "allows_const_p" field.
(std_preds): Set this field for predicates that allow RTX_CONST_OBJs.
Remove the (incomplete) list of such codes from the codes field.
(init_predicate_table): Use add_predicate_code.  Add all
RTX_CONST_OBJs if allows_const_p is true.
* genrecog.c (process_define_predicate): Use add_predicate_code.

From-SVN: r135090

gcc/ChangeLog
gcc/genrecog.c
gcc/gensupport.c
gcc/gensupport.h

index ae8d7a9d19716a0277bb55326602b3deab1ee587..7a53d5d62b554a64d0d91eff17c489f38455ec9c 100644 (file)
@@ -1,3 +1,15 @@
+2008-05-08  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       * gensupport.h (pred_data): Add a "num_codes" field.
+       (add_predicate_code): Declare.
+       * gensupport.c (add_predicate_code): New function.
+       (std_pred_table): Add an "allows_const_p" field.
+       (std_preds): Set this field for predicates that allow RTX_CONST_OBJs.
+       Remove the (incomplete) list of such codes from the codes field.
+       (init_predicate_table): Use add_predicate_code.  Add all
+       RTX_CONST_OBJs if allows_const_p is true.
+       * genrecog.c (process_define_predicate): Use add_predicate_code.
+
 2008-05-08  David Daney  <ddaney@avtrex.com>
            Richard Sandiford  <rsandifo@nildram.co.uk>
        
index 8564b5cc1f13675e3575d24ddd35b73889ec4316..43afa7f449ce1bbf467391561db7dd022d1e9664 100644 (file)
@@ -368,7 +368,6 @@ process_define_predicate (rtx desc)
 {
   struct pred_data *pred = xcalloc (sizeof (struct pred_data), 1);
   char codes[NUM_RTX_CODE];
-  bool seen_one = false;
   int i;
 
   pred->name = XSTR (desc, 0);
@@ -379,26 +378,8 @@ process_define_predicate (rtx desc)
 
   for (i = 0; i < NUM_RTX_CODE; i++)
     if (codes[i] != N)
-      {
-       pred->codes[i] = true;
-       if (GET_RTX_CLASS (i) != RTX_CONST_OBJ)
-         pred->allows_non_const = true;
-       if (i != REG
-           && i != SUBREG
-           && i != MEM
-           && i != CONCAT
-           && i != PARALLEL
-           && i != STRICT_LOW_PART)
-         pred->allows_non_lvalue = true;
-
-       if (seen_one)
-         pred->singleton = UNKNOWN;
-       else
-         {
-           pred->singleton = i;
-           seen_one = true;
-         }
-      }
+      add_predicate_code (pred, i);
+
   add_predicate (pred);
 }
 #undef I
index 7cacfa4540b5551a46170c195942be6e25e0c02e..f455eb9726003ac75338db6fa68cea5b81b64d43 100644 (file)
@@ -1299,6 +1299,34 @@ lookup_predicate (const char *name)
   return (struct pred_data *) htab_find (predicate_table, &key);
 }
 
+/* Record that predicate PRED can accept CODE.  */
+
+void
+add_predicate_code (struct pred_data *pred, enum rtx_code code)
+{
+  if (!pred->codes[code])
+    {
+      pred->num_codes++;
+      pred->codes[code] = true;
+
+      if (GET_RTX_CLASS (code) != RTX_CONST_OBJ)
+       pred->allows_non_const = true;
+
+      if (code != REG
+         && code != SUBREG
+         && code != MEM
+         && code != CONCAT
+         && code != PARALLEL
+         && code != STRICT_LOW_PART)
+       pred->allows_non_lvalue = true;
+
+      if (pred->num_codes == 1)
+       pred->singleton = code;
+      else if (pred->num_codes == 2)
+       pred->singleton = UNKNOWN;
+    }
+}
+
 void
 add_predicate (struct pred_data *pred)
 {
@@ -1320,32 +1348,31 @@ struct std_pred_table
 {
   const char *name;
   bool special;
+  bool allows_const_p;
   RTX_CODE codes[NUM_RTX_CODE];
 };
 
 static const struct std_pred_table std_preds[] = {
-  {"general_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
-                             LABEL_REF, SUBREG, REG, MEM }},
-  {"address_operand", true, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
-                            LABEL_REF, SUBREG, REG, MEM,
-                            PLUS, MINUS, MULT}},
-  {"register_operand", false, {SUBREG, REG}},
-  {"pmode_register_operand", true, {SUBREG, REG}},
-  {"scratch_operand", false, {SCRATCH, REG}},
-  {"immediate_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
-                               LABEL_REF}},
-  {"const_int_operand", false, {CONST_INT}},
-  {"const_double_operand", false, {CONST_INT, CONST_DOUBLE}},
-  {"nonimmediate_operand", false, {SUBREG, REG, MEM}},
-  {"nonmemory_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
-                               LABEL_REF, SUBREG, REG}},
-  {"push_operand", false, {MEM}},
-  {"pop_operand", false, {MEM}},
-  {"memory_operand", false, {SUBREG, MEM}},
-  {"indirect_operand", false, {SUBREG, MEM}},
-  {"comparison_operator", false, {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU,
-                                 UNORDERED, ORDERED, UNEQ, UNGE, UNGT, UNLE,
-                                 UNLT, LTGT}}
+  {"general_operand", false, true, {SUBREG, REG, MEM}},
+  {"address_operand", true, true, {SUBREG, REG, MEM, PLUS, MINUS, MULT}},
+  {"register_operand", false, false, {SUBREG, REG}},
+  {"pmode_register_operand", true, false, {SUBREG, REG}},
+  {"scratch_operand", false, false, {SCRATCH, REG}},
+  {"immediate_operand", false, true, {0}},
+  {"const_int_operand", false, false, {CONST_INT}},
+  {"const_double_operand", false, false, {CONST_INT, CONST_DOUBLE}},
+  {"nonimmediate_operand", false, false, {SUBREG, REG, MEM}},
+  {"nonmemory_operand", false, true, {SUBREG, REG}},
+  {"push_operand", false, false, {MEM}},
+  {"pop_operand", false, false, {MEM}},
+  {"memory_operand", false, false, {SUBREG, MEM}},
+  {"indirect_operand", false, false, {SUBREG, MEM}},
+  {"comparison_operator", false, false, {EQ, NE,
+                                        LE, LT, GE, GT,
+                                        LEU, LTU, GEU, GTU,
+                                        UNORDERED, ORDERED,
+                                        UNEQ, UNGE, UNGT,
+                                        UNLE, UNLT, LTGT}}
 };
 #define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds)
 
@@ -1369,22 +1396,12 @@ init_predicate_table (void)
       pred->special = std_preds[i].special;
 
       for (j = 0; std_preds[i].codes[j] != 0; j++)
-       {
-         enum rtx_code code = std_preds[i].codes[j];
-
-         pred->codes[code] = true;
-         if (GET_RTX_CLASS (code) != RTX_CONST_OBJ)
-           pred->allows_non_const = true;
-         if (code != REG
-             && code != SUBREG
-             && code != MEM
-             && code != CONCAT
-             && code != PARALLEL
-             && code != STRICT_LOW_PART)
-           pred->allows_non_lvalue = true;
-       }
-      if (j == 1)
-       pred->singleton = std_preds[i].codes[0];
+       add_predicate_code (pred, std_preds[i].codes[j]);
+
+      if (std_preds[i].allows_const_p)
+       for (j = 0; j < NUM_RTX_CODE; j++)
+         if (GET_RTX_CLASS (j) == RTX_CONST_OBJ)
+           add_predicate_code (pred, j);
       
       add_predicate (pred);
     }
index f604bd0be0eb4a721eb1025b95d25e36536f14f5..effd4a4b397ad72e7b67247fa09c1d91e81219e5 100644 (file)
@@ -76,6 +76,7 @@ struct pred_data
 
   /* data used primarily by genrecog.c */
   enum rtx_code singleton;     /* if pred takes only one code, that code */
+  int num_codes;               /* number of codes accepted */
   bool allows_non_lvalue;      /* if pred allows non-lvalue expressions */
   bool allows_non_const;       /* if pred allows non-const expressions */
   bool codes[NUM_RTX_CODE];    /* set of codes accepted */
@@ -83,6 +84,7 @@ struct pred_data
 
 extern struct pred_data *first_predicate;
 extern struct pred_data *lookup_predicate (const char *);
+extern void add_predicate_code (struct pred_data *, enum rtx_code);
 extern void add_predicate (struct pred_data *);
 
 #define FOR_ALL_PREDICATES(p) for (p = first_predicate; p; p = p->next)