- int i, q_size;
-
- printf ("#define INSN_SCHEDULING\n\n");
- printf ("extern int result_ready_cost (rtx);\n");
- printf ("extern int function_units_used (rtx);\n\n");
- printf ("extern const struct function_unit_desc\n");
- printf ("{\n");
- printf (" const char *const name;\n");
- printf (" const int bitmask;\n");
- printf (" const int multiplicity;\n");
- printf (" const int simultaneity;\n");
- printf (" const int default_cost;\n");
- printf (" const int max_issue_delay;\n");
- printf (" int (*const ready_cost_function) (rtx);\n");
- printf (" int (*const conflict_cost_function) (rtx, rtx);\n");
- printf (" const int max_blockage;\n");
- printf (" unsigned int (*const blockage_range_function) (rtx);\n");
- printf (" int (*const blockage_function) (rtx, rtx);\n");
- printf ("} function_units[];\n\n");
- printf ("#define FUNCTION_UNITS_SIZE %d\n", num_units);
- printf ("#define MIN_MULTIPLICITY %d\n", multiplicity->min);
- printf ("#define MAX_MULTIPLICITY %d\n", multiplicity->max);
- printf ("#define MIN_SIMULTANEITY %d\n", simultaneity->min);
- printf ("#define MAX_SIMULTANEITY %d\n", simultaneity->max);
- printf ("#define MIN_READY_COST %d\n", ready_cost->min);
- printf ("#define MAX_READY_COST %d\n", ready_cost->max);
- printf ("#define MIN_ISSUE_DELAY %d\n", issue_delay->min);
- printf ("#define MAX_ISSUE_DELAY %d\n", issue_delay->max);
- printf ("#define MIN_BLOCKAGE %d\n", blockage->min);
- printf ("#define MAX_BLOCKAGE %d\n", blockage->max);
- for (i = 0; (1 << i) < blockage->max; i++)
- ;
- printf ("#define BLOCKAGE_BITS %d\n", i + 1);
-
- /* INSN_QUEUE_SIZE is a power of two larger than MAX_BLOCKAGE and
- MAX_READY_COST. This is the longest time an isnsn may be queued. */
- i = MAX (blockage->max, ready_cost->max);
- for (q_size = 1; q_size <= i; q_size <<= 1)
- ;
- printf ("#define INSN_QUEUE_SIZE %d\n", q_size);
+ switch (GET_CODE (exp))
+ {
+ case AND:
+ if (check_tune_attr (name, XEXP (exp, 0)))
+ return true;
+ return check_tune_attr (name, XEXP (exp, 1));
+
+ case IOR:
+ return (check_tune_attr (name, XEXP (exp, 0))
+ && check_tune_attr (name, XEXP (exp, 1)));
+
+ case EQ_ATTR:
+ return strcmp (XSTR (exp, 0), name) == 0;
+
+ default:
+ return false;
+ }
+}
+
+/* Try to find a const attribute (usually cpu or tune) that is used
+ in all define_insn_reservation conditions. */
+static bool
+find_tune_attr (rtx exp)
+{
+ unsigned int i;
+ rtx attr;
+
+ switch (GET_CODE (exp))
+ {
+ case AND:
+ case IOR:
+ if (find_tune_attr (XEXP (exp, 0)))
+ return true;
+ return find_tune_attr (XEXP (exp, 1));
+
+ case EQ_ATTR:
+ if (strcmp (XSTR (exp, 0), "alternative") == 0)
+ return false;
+
+ FOR_EACH_VEC_ELT (rtx, const_attrs, i, attr)
+ if (strcmp (XSTR (attr, 0), XSTR (exp, 0)) == 0)
+ {
+ unsigned int j;
+ rtx resv;
+
+ FOR_EACH_VEC_ELT (rtx, reservations, j, resv)
+ if (! check_tune_attr (XSTR (attr, 0), XEXP (resv, 2)))
+ return false;
+ return true;
+ }
+ return false;
+
+ default:
+ return false;
+ }