1 /* Generate code from machine description to compute values of attributes.
2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* This program handles insn attributes and the DEFINE_DELAY and
24 DEFINE_INSN_RESERVATION definitions.
26 It produces a series of functions named `get_attr_...', one for each insn
27 attribute. Each of these is given the rtx for an insn and returns a member
28 of the enum for the attribute.
30 These subroutines have the form of a `switch' on the INSN_CODE (via
31 `recog_memoized'). Each case either returns a constant attribute value
32 or a value that depends on tests on other attributes, the form of
33 operands, or some random C expression (encoded with a SYMBOL_REF
36 If the attribute `alternative', or a random C expression is present,
37 `constrain_operands' is called. If either of these cases of a reference to
38 an operand is found, `extract_insn' is called.
40 The special attribute `length' is also recognized. For this operand,
41 expressions involving the address of an operand or the current insn,
42 (address (pc)), are valid. In this case, an initial pass is made to
43 set all lengths that do not depend on address. Those that do are set to
44 the maximum length. Then each insn that depends on an address is checked
45 and possibly has its length changed. The process repeats until no further
46 changed are made. The resulting lengths are saved for use by
49 A special form of DEFINE_ATTR, where the expression for default value is a
50 CONST expression, indicates an attribute that is constant for a given run
51 of the compiler. The subroutine generated for these attributes has no
52 parameters as it does not depend on any particular insn. Constant
53 attributes are typically used to specify which variety of processor is
56 Internal attributes are defined to handle DEFINE_DELAY and
57 DEFINE_INSN_RESERVATION. Special routines are output for these cases.
59 This program works by keeping a list of possible values for each attribute.
60 These include the basic attribute choices, default values for attribute, and
61 all derived quantities.
63 As the description file is read, the definition for each insn is saved in a
64 `struct insn_def'. When the file reading is complete, a `struct insn_ent'
65 is created for each insn and chained to the corresponding attribute value,
66 either that specified, or the default.
68 An optimization phase is then run. This simplifies expressions for each
69 insn. EQ_ATTR tests are resolved, whenever possible, to a test that
70 indicates when the attribute has the specified value for the insn. This
71 avoids recursive calls during compilation.
73 The strategy used when processing DEFINE_DELAY definitions is to create
74 arbitrarily complex expressions and have the optimization simplify them.
76 Once optimization is complete, any required routines and definitions
79 An optimization that is not yet implemented is to hoist the constant
80 expressions entirely out of the routines and definitions that are written.
81 A way to do this is to iterate over all possible combinations of values
82 for constant attributes and generate a set of functions for that given
83 combination. An initialization function would be written that evaluates
84 the attributes and installs the corresponding set of routines and
85 definitions (each would be accessed through a pointer).
87 We use the flags in an RTX as follows:
88 `unchanging' (ATTR_IND_SIMPLIFIED_P): This rtx is fully simplified
89 independent of the insn code.
90 `in_struct' (ATTR_CURR_SIMPLIFIED_P): This rtx is fully simplified
91 for the insn code currently being processed (see optimize_attrs).
92 `return_val' (ATTR_PERMANENT_P): This rtx is permanent and unique
95 #define ATTR_IND_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), unchanging))
96 #define ATTR_CURR_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), in_struct))
97 #define ATTR_PERMANENT_P(RTX) (RTX_FLAG((RTX), return_val))
100 #define strcmp_check(S1, S2) ((S1) == (S2) \
102 : (gcc_assert (strcmp ((S1), (S2))), 1))
104 #define strcmp_check(S1, S2) ((S1) != (S2))
109 #include "coretypes.h"
115 #include "gensupport.h"
117 /* Flags for make_internal_attr's `special' parameter. */
119 #define ATTR_SPECIAL (1 << 0)
121 static struct obstack obstack1, obstack2;
122 static struct obstack *hash_obstack = &obstack1;
123 static struct obstack *temp_obstack = &obstack2;
125 /* enough space to reserve for printing out ints */
126 #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
128 /* Define structures used to record attributes and values. */
130 /* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is
131 encountered, we store all the relevant information into a
132 `struct insn_def'. This is done to allow attribute definitions to occur
133 anywhere in the file. */
137 struct insn_def *next; /* Next insn in chain. */
138 rtx def; /* The DEFINE_... */
139 int insn_code; /* Instruction number. */
140 int insn_index; /* Expression number in file, for errors. */
141 int lineno; /* Line number. */
142 int num_alternatives; /* Number of alternatives. */
143 int vec_idx; /* Index of attribute vector in `def'. */
146 /* Once everything has been read in, we store in each attribute value a list
147 of insn codes that have that value. Here is the structure used for the
152 struct insn_ent *next; /* Next in chain. */
153 struct insn_def *def; /* Instruction definition. */
156 /* Each value of an attribute (either constant or computed) is assigned a
157 structure which is used as the listhead of the insns that have that
162 rtx value; /* Value of attribute. */
163 struct attr_value *next; /* Next attribute value in chain. */
164 struct insn_ent *first_insn; /* First insn with this value. */
165 int num_insns; /* Number of insns with this value. */
166 int has_asm_insn; /* True if this value used for `asm' insns */
169 /* Structure for each attribute. */
173 char *name; /* Name of attribute. */
174 struct attr_desc *next; /* Next attribute. */
175 struct attr_value *first_value; /* First value of this attribute. */
176 struct attr_value *default_val; /* Default value for this attribute. */
177 int lineno : 24; /* Line number. */
178 unsigned is_numeric : 1; /* Values of this attribute are numeric. */
179 unsigned is_const : 1; /* Attribute value constant for each run. */
180 unsigned is_special : 1; /* Don't call `write_attr_set'. */
183 /* Structure for each DEFINE_DELAY. */
187 rtx def; /* DEFINE_DELAY expression. */
188 struct delay_desc *next; /* Next DEFINE_DELAY. */
189 int num; /* Number of DEFINE_DELAY, starting at 1. */
190 int lineno; /* Line number. */
193 struct attr_value_list
195 struct attr_value *av;
197 struct attr_desc *attr;
198 struct attr_value_list *next;
201 /* Listheads of above structures. */
203 /* This one is indexed by the first character of the attribute name. */
204 #define MAX_ATTRS_INDEX 256
205 static struct attr_desc *attrs[MAX_ATTRS_INDEX];
206 static struct insn_def *defs;
207 static struct delay_desc *delays;
208 struct attr_value_list **insn_code_values;
210 /* Other variables. */
212 static int insn_code_number;
213 static int insn_index_number;
214 static int got_define_asm_attributes;
215 static int must_extract;
216 static int must_constrain;
217 static int address_used;
218 static int length_used;
219 static int num_delays;
220 static int have_annul_true, have_annul_false;
221 static int num_insn_ents;
223 /* Stores, for each insn code, the number of constraint alternatives. */
225 static int *insn_n_alternatives;
227 /* Stores, for each insn code, a bitmap that has bits on for each possible
230 static int *insn_alternatives;
232 /* Used to simplify expressions. */
234 static rtx true_rtx, false_rtx;
236 /* Used to reduce calls to `strcmp' */
238 static const char *alternative_name;
239 static const char *length_str;
240 static const char *delay_type_str;
241 static const char *delay_1_0_str;
242 static const char *num_delay_slots_str;
244 /* Simplify an expression. Only call the routine if there is something to
246 #define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX) \
247 (ATTR_IND_SIMPLIFIED_P (EXP) || ATTR_CURR_SIMPLIFIED_P (EXP) ? (EXP) \
248 : simplify_test_exp (EXP, INSN_CODE, INSN_INDEX))
250 #define DEF_ATTR_STRING(S) (attr_string ((S), strlen (S)))
252 /* Forward declarations of functions used before their definitions, only. */
253 static char *attr_string (const char *, int);
254 static char *attr_printf (unsigned int, const char *, ...)
256 static rtx make_numeric_value (int);
257 static struct attr_desc *find_attr (const char **, int);
258 static rtx mk_attr_alt (int);
259 static char *next_comma_elt (const char **);
260 static rtx insert_right_side (enum rtx_code, rtx, rtx, int, int);
261 static rtx copy_boolean (rtx);
262 static int compares_alternatives_p (rtx);
263 static void make_internal_attr (const char *, rtx, int);
264 static void insert_insn_ent (struct attr_value *, struct insn_ent *);
265 static void walk_attr_value (rtx);
266 static int max_attr_value (rtx, int*);
267 static int min_attr_value (rtx, int*);
268 static int or_attr_value (rtx, int*);
269 static rtx simplify_test_exp (rtx, int, int);
270 static rtx simplify_test_exp_in_temp (rtx, int, int);
271 static rtx copy_rtx_unchanging (rtx);
272 static bool attr_alt_subset_p (rtx, rtx);
273 static bool attr_alt_subset_of_compl_p (rtx, rtx);
274 static void clear_struct_flag (rtx);
275 static void write_attr_valueq (struct attr_desc *, const char *);
276 static struct attr_value *find_most_used (struct attr_desc *);
277 static void write_attr_set (struct attr_desc *, int, rtx,
278 const char *, const char *, rtx,
280 static void write_attr_case (struct attr_desc *, struct attr_value *,
281 int, const char *, const char *, int, rtx);
282 static void write_attr_value (struct attr_desc *, rtx);
283 static void write_upcase (const char *);
284 static void write_indent (int);
285 static rtx identity_fn (rtx);
286 static rtx zero_fn (rtx);
287 static rtx one_fn (rtx);
288 static rtx max_fn (rtx);
289 static rtx min_fn (rtx);
291 #define oballoc(T) XOBNEW (hash_obstack, T)
292 #define oballocvec(T, N) XOBNEWVEC (hash_obstack, T, (N))
294 /* Hash table for sharing RTL and strings. */
296 /* Each hash table slot is a bucket containing a chain of these structures.
297 Strings are given negative hash codes; RTL expressions are given positive
302 struct attr_hash *next; /* Next structure in the bucket. */
303 int hashcode; /* Hash code of this rtx or string. */
306 char *str; /* The string (negative hash codes) */
307 rtx rtl; /* or the RTL recorded here. */
311 /* Now here is the hash table. When recording an RTL, it is added to
312 the slot whose index is the hash code mod the table size. Note
313 that the hash table is used for several kinds of RTL (see attr_rtx)
314 and for strings. While all these live in the same table, they are
315 completely independent, and the hash code is computed differently
318 #define RTL_HASH_SIZE 4093
319 static struct attr_hash *attr_hash_table[RTL_HASH_SIZE];
321 /* Here is how primitive or already-shared RTL's hash
323 #define RTL_HASH(RTL) ((intptr_t) (RTL) & 0777777)
325 /* Add an entry to the hash table for RTL with hash code HASHCODE. */
328 attr_hash_add_rtx (int hashcode, rtx rtl)
332 h = XOBNEW (hash_obstack, struct attr_hash);
333 h->hashcode = hashcode;
335 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
336 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
339 /* Add an entry to the hash table for STRING with hash code HASHCODE. */
342 attr_hash_add_string (int hashcode, char *str)
346 h = XOBNEW (hash_obstack, struct attr_hash);
347 h->hashcode = -hashcode;
349 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
350 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
353 /* Generate an RTL expression, but avoid duplicates.
354 Set the ATTR_PERMANENT_P flag for these permanent objects.
356 In some cases we cannot uniquify; then we return an ordinary
357 impermanent rtx with ATTR_PERMANENT_P clear.
361 rtx attr_rtx (code, [element1, ..., elementn]) */
364 attr_rtx_1 (enum rtx_code code, va_list p)
366 rtx rt_val = NULL_RTX;/* RTX to return to caller... */
369 struct obstack *old_obstack = rtl_obstack;
371 /* For each of several cases, search the hash table for an existing entry.
372 Use that entry if one is found; otherwise create a new RTL and add it
375 if (GET_RTX_CLASS (code) == RTX_UNARY)
377 rtx arg0 = va_arg (p, rtx);
379 /* A permanent object cannot point to impermanent ones. */
380 if (! ATTR_PERMANENT_P (arg0))
382 rt_val = rtx_alloc (code);
383 XEXP (rt_val, 0) = arg0;
387 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
388 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
389 if (h->hashcode == hashcode
390 && GET_CODE (h->u.rtl) == code
391 && XEXP (h->u.rtl, 0) == arg0)
396 rtl_obstack = hash_obstack;
397 rt_val = rtx_alloc (code);
398 XEXP (rt_val, 0) = arg0;
401 else if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
402 || GET_RTX_CLASS (code) == RTX_COMM_ARITH
403 || GET_RTX_CLASS (code) == RTX_COMPARE
404 || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
406 rtx arg0 = va_arg (p, rtx);
407 rtx arg1 = va_arg (p, rtx);
409 /* A permanent object cannot point to impermanent ones. */
410 if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1))
412 rt_val = rtx_alloc (code);
413 XEXP (rt_val, 0) = arg0;
414 XEXP (rt_val, 1) = arg1;
418 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
419 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
420 if (h->hashcode == hashcode
421 && GET_CODE (h->u.rtl) == code
422 && XEXP (h->u.rtl, 0) == arg0
423 && XEXP (h->u.rtl, 1) == arg1)
428 rtl_obstack = hash_obstack;
429 rt_val = rtx_alloc (code);
430 XEXP (rt_val, 0) = arg0;
431 XEXP (rt_val, 1) = arg1;
434 else if (GET_RTX_LENGTH (code) == 1
435 && GET_RTX_FORMAT (code)[0] == 's')
437 char *arg0 = va_arg (p, char *);
439 arg0 = DEF_ATTR_STRING (arg0);
441 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
442 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
443 if (h->hashcode == hashcode
444 && GET_CODE (h->u.rtl) == code
445 && XSTR (h->u.rtl, 0) == arg0)
450 rtl_obstack = hash_obstack;
451 rt_val = rtx_alloc (code);
452 XSTR (rt_val, 0) = arg0;
455 else if (GET_RTX_LENGTH (code) == 2
456 && GET_RTX_FORMAT (code)[0] == 's'
457 && GET_RTX_FORMAT (code)[1] == 's')
459 char *arg0 = va_arg (p, char *);
460 char *arg1 = va_arg (p, char *);
462 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
463 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
464 if (h->hashcode == hashcode
465 && GET_CODE (h->u.rtl) == code
466 && XSTR (h->u.rtl, 0) == arg0
467 && XSTR (h->u.rtl, 1) == arg1)
472 rtl_obstack = hash_obstack;
473 rt_val = rtx_alloc (code);
474 XSTR (rt_val, 0) = arg0;
475 XSTR (rt_val, 1) = arg1;
478 else if (code == CONST_INT)
480 HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
490 int i; /* Array indices... */
491 const char *fmt; /* Current rtx's format... */
493 rt_val = rtx_alloc (code); /* Allocate the storage space. */
495 fmt = GET_RTX_FORMAT (code); /* Find the right format... */
496 for (i = 0; i < GET_RTX_LENGTH (code); i++)
500 case '0': /* Unused field. */
503 case 'i': /* An integer? */
504 XINT (rt_val, i) = va_arg (p, int);
507 case 'w': /* A wide integer? */
508 XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
511 case 's': /* A string? */
512 XSTR (rt_val, i) = va_arg (p, char *);
515 case 'e': /* An expression? */
516 case 'u': /* An insn? Same except when printing. */
517 XEXP (rt_val, i) = va_arg (p, rtx);
520 case 'E': /* An RTX vector? */
521 XVEC (rt_val, i) = va_arg (p, rtvec);
531 rtl_obstack = old_obstack;
532 attr_hash_add_rtx (hashcode, rt_val);
533 ATTR_PERMANENT_P (rt_val) = 1;
538 attr_rtx (enum rtx_code code, ...)
544 result = attr_rtx_1 (code, p);
549 /* Create a new string printed with the printf line arguments into a space
550 of at most LEN bytes:
552 rtx attr_printf (len, format, [arg1, ..., argn]) */
555 attr_printf (unsigned int len, const char *fmt, ...)
562 gcc_assert (len < sizeof str); /* Leave room for \0. */
564 vsprintf (str, fmt, p);
567 return DEF_ATTR_STRING (str);
571 attr_eq (const char *name, const char *value)
573 return attr_rtx (EQ_ATTR, DEF_ATTR_STRING (name), DEF_ATTR_STRING (value));
579 return XSTR (make_numeric_value (n), 0);
582 /* Return a permanent (possibly shared) copy of a string STR (not assumed
583 to be null terminated) with LEN bytes. */
586 attr_string (const char *str, int len)
593 /* Compute the hash code. */
594 hashcode = (len + 1) * 613 + (unsigned) str[0];
595 for (i = 1; i < len; i += 2)
596 hashcode = ((hashcode * 613) + (unsigned) str[i]);
598 hashcode = -hashcode;
600 /* Search the table for the string. */
601 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
602 if (h->hashcode == -hashcode && h->u.str[0] == str[0]
603 && !strncmp (h->u.str, str, len))
604 return h->u.str; /* <-- return if found. */
606 /* Not found; create a permanent copy and add it to the hash table. */
607 new_str = XOBNEWVAR (hash_obstack, char, len + 1);
608 memcpy (new_str, str, len);
610 attr_hash_add_string (hashcode, new_str);
612 return new_str; /* Return the new string. */
615 /* Check two rtx's for equality of contents,
616 taking advantage of the fact that if both are hashed
617 then they can't be equal unless they are the same object. */
620 attr_equal_p (rtx x, rtx y)
622 return (x == y || (! (ATTR_PERMANENT_P (x) && ATTR_PERMANENT_P (y))
623 && rtx_equal_p (x, y)));
626 /* Copy an attribute value expression,
627 descending to all depths, but not copying any
628 permanent hashed subexpressions. */
631 attr_copy_rtx (rtx orig)
636 const char *format_ptr;
638 /* No need to copy a permanent object. */
639 if (ATTR_PERMANENT_P (orig))
642 code = GET_CODE (orig);
660 copy = rtx_alloc (code);
661 PUT_MODE (copy, GET_MODE (orig));
662 ATTR_IND_SIMPLIFIED_P (copy) = ATTR_IND_SIMPLIFIED_P (orig);
663 ATTR_CURR_SIMPLIFIED_P (copy) = ATTR_CURR_SIMPLIFIED_P (orig);
664 ATTR_PERMANENT_P (copy) = ATTR_PERMANENT_P (orig);
666 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
668 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
670 switch (*format_ptr++)
673 XEXP (copy, i) = XEXP (orig, i);
674 if (XEXP (orig, i) != NULL)
675 XEXP (copy, i) = attr_copy_rtx (XEXP (orig, i));
680 XVEC (copy, i) = XVEC (orig, i);
681 if (XVEC (orig, i) != NULL)
683 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
684 for (j = 0; j < XVECLEN (copy, i); j++)
685 XVECEXP (copy, i, j) = attr_copy_rtx (XVECEXP (orig, i, j));
691 XINT (copy, i) = XINT (orig, i);
695 XWINT (copy, i) = XWINT (orig, i);
700 XSTR (copy, i) = XSTR (orig, i);
710 /* Given a test expression for an attribute, ensure it is validly formed.
711 IS_CONST indicates whether the expression is constant for each compiler
712 run (a constant expression may not test any particular insn).
714 Convert (eq_attr "att" "a1,a2") to (ior (eq_attr ... ) (eq_attrq ..))
715 and (eq_attr "att" "!a1") to (not (eq_attr "att" "a1")). Do the latter
716 test first so that (eq_attr "att" "!a1,a2,a3") works as expected.
718 Update the string address in EQ_ATTR expression to be the same used
719 in the attribute (or `alternative_name') to speed up subsequent
720 `find_attr' calls and eliminate most `strcmp' calls.
722 Return the new expression, if any. */
725 check_attr_test (rtx exp, int is_const, int lineno)
727 struct attr_desc *attr;
728 struct attr_value *av;
729 const char *name_ptr, *p;
732 switch (GET_CODE (exp))
735 /* Handle negation test. */
736 if (XSTR (exp, 1)[0] == '!')
737 return check_attr_test (attr_rtx (NOT,
738 attr_eq (XSTR (exp, 0),
742 else if (n_comma_elts (XSTR (exp, 1)) == 1)
744 attr = find_attr (&XSTR (exp, 0), 0);
747 if (! strcmp (XSTR (exp, 0), "alternative"))
748 return mk_attr_alt (1 << atoi (XSTR (exp, 1)));
750 fatal ("unknown attribute `%s' in EQ_ATTR", XSTR (exp, 0));
753 if (is_const && ! attr->is_const)
754 fatal ("constant expression uses insn attribute `%s' in EQ_ATTR",
757 /* Copy this just to make it permanent,
758 so expressions using it can be permanent too. */
759 exp = attr_eq (XSTR (exp, 0), XSTR (exp, 1));
761 /* It shouldn't be possible to simplify the value given to a
762 constant attribute, so don't expand this until it's time to
763 write the test expression. */
765 ATTR_IND_SIMPLIFIED_P (exp) = 1;
767 if (attr->is_numeric)
769 for (p = XSTR (exp, 1); *p; p++)
771 fatal ("attribute `%s' takes only numeric values",
776 for (av = attr->first_value; av; av = av->next)
777 if (GET_CODE (av->value) == CONST_STRING
778 && ! strcmp (XSTR (exp, 1), XSTR (av->value, 0)))
782 fatal ("unknown value `%s' for `%s' attribute",
783 XSTR (exp, 1), XSTR (exp, 0));
788 if (! strcmp (XSTR (exp, 0), "alternative"))
792 name_ptr = XSTR (exp, 1);
793 while ((p = next_comma_elt (&name_ptr)) != NULL)
794 set |= 1 << atoi (p);
796 return mk_attr_alt (set);
800 /* Make an IOR tree of the possible values. */
802 name_ptr = XSTR (exp, 1);
803 while ((p = next_comma_elt (&name_ptr)) != NULL)
805 newexp = attr_eq (XSTR (exp, 0), p);
806 orexp = insert_right_side (IOR, orexp, newexp, -2, -2);
809 return check_attr_test (orexp, is_const, lineno);
818 /* Either TRUE or FALSE. */
826 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
827 XEXP (exp, 1) = check_attr_test (XEXP (exp, 1), is_const, lineno);
831 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
836 fatal ("RTL operator \"%s\" not valid in constant attribute test",
837 GET_RTX_NAME (GET_CODE (exp)));
838 /* These cases can't be simplified. */
839 ATTR_IND_SIMPLIFIED_P (exp) = 1;
842 case LE: case LT: case GT: case GE:
843 case LEU: case LTU: case GTU: case GEU:
845 if (GET_CODE (XEXP (exp, 0)) == SYMBOL_REF
846 && GET_CODE (XEXP (exp, 1)) == SYMBOL_REF)
847 exp = attr_rtx (GET_CODE (exp),
848 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 0), 0)),
849 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 1), 0)));
850 /* These cases can't be simplified. */
851 ATTR_IND_SIMPLIFIED_P (exp) = 1;
857 /* These cases are valid for constant attributes, but can't be
859 exp = attr_rtx (SYMBOL_REF, XSTR (exp, 0));
860 ATTR_IND_SIMPLIFIED_P (exp) = 1;
864 fatal ("RTL operator \"%s\" not valid in attribute test",
865 GET_RTX_NAME (GET_CODE (exp)));
871 /* Given an expression, ensure that it is validly formed and that all named
872 attribute values are valid for the given attribute. Issue a fatal error
873 if not. If no attribute is specified, assume a numeric attribute.
875 Return a perhaps modified replacement expression for the value. */
878 check_attr_value (rtx exp, struct attr_desc *attr)
880 struct attr_value *av;
884 switch (GET_CODE (exp))
887 if (attr && ! attr->is_numeric)
889 error_with_line (attr->lineno,
890 "CONST_INT not valid for non-numeric attribute %s",
895 if (INTVAL (exp) < 0)
897 error_with_line (attr->lineno,
898 "negative numeric value specified for attribute %s",
905 if (! strcmp (XSTR (exp, 0), "*"))
908 if (attr == 0 || attr->is_numeric)
914 error_with_line (attr ? attr->lineno : 0,
915 "non-numeric value for numeric attribute %s",
916 attr ? attr->name : "internal");
922 for (av = attr->first_value; av; av = av->next)
923 if (GET_CODE (av->value) == CONST_STRING
924 && ! strcmp (XSTR (av->value, 0), XSTR (exp, 0)))
928 error_with_line (attr->lineno,
929 "unknown value `%s' for `%s' attribute",
930 XSTR (exp, 0), attr ? attr->name : "internal");
934 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0),
935 attr ? attr->is_const : 0,
936 attr ? attr->lineno : 0);
937 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
938 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
946 if (attr && !attr->is_numeric)
948 error_with_line (attr->lineno,
949 "invalid operation `%s' for non-numeric"
950 " attribute value", GET_RTX_NAME (GET_CODE (exp)));
957 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
958 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
967 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
971 if (XVECLEN (exp, 0) % 2 != 0)
973 error_with_line (attr->lineno,
974 "first operand of COND must have even length");
978 for (i = 0; i < XVECLEN (exp, 0); i += 2)
980 XVECEXP (exp, 0, i) = check_attr_test (XVECEXP (exp, 0, i),
981 attr ? attr->is_const : 0,
982 attr ? attr->lineno : 0);
983 XVECEXP (exp, 0, i + 1)
984 = check_attr_value (XVECEXP (exp, 0, i + 1), attr);
987 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
992 struct attr_desc *attr2 = find_attr (&XSTR (exp, 0), 0);
994 error_with_line (attr ? attr->lineno : 0,
995 "unknown attribute `%s' in ATTR",
997 else if (attr && attr->is_const && ! attr2->is_const)
998 error_with_line (attr->lineno,
999 "non-constant attribute `%s' referenced from `%s'",
1000 XSTR (exp, 0), attr->name);
1002 && attr->is_numeric != attr2->is_numeric)
1003 error_with_line (attr->lineno,
1004 "numeric attribute mismatch calling `%s' from `%s'",
1005 XSTR (exp, 0), attr->name);
1010 /* A constant SYMBOL_REF is valid as a constant attribute test and
1011 is expanded later by make_canonical into a COND. In a non-constant
1012 attribute test, it is left be. */
1013 return attr_rtx (SYMBOL_REF, XSTR (exp, 0));
1016 error_with_line (attr ? attr->lineno : 0,
1017 "invalid operation `%s' for attribute value",
1018 GET_RTX_NAME (GET_CODE (exp)));
1025 /* Given an SET_ATTR_ALTERNATIVE expression, convert to the canonical SET.
1026 It becomes a COND with each test being (eq_attr "alternative" "n") */
1029 convert_set_attr_alternative (rtx exp, struct insn_def *id)
1031 int num_alt = id->num_alternatives;
1035 if (XVECLEN (exp, 1) != num_alt)
1037 error_with_line (id->lineno,
1038 "bad number of entries in SET_ATTR_ALTERNATIVE");
1042 /* Make a COND with all tests but the last. Select the last value via the
1044 condexp = rtx_alloc (COND);
1045 XVEC (condexp, 0) = rtvec_alloc ((num_alt - 1) * 2);
1047 for (i = 0; i < num_alt - 1; i++)
1050 p = attr_numeral (i);
1052 XVECEXP (condexp, 0, 2 * i) = attr_eq (alternative_name, p);
1053 XVECEXP (condexp, 0, 2 * i + 1) = XVECEXP (exp, 1, i);
1056 XEXP (condexp, 1) = XVECEXP (exp, 1, i);
1058 return attr_rtx (SET, attr_rtx (ATTR, XSTR (exp, 0)), condexp);
1061 /* Given a SET_ATTR, convert to the appropriate SET. If a comma-separated
1062 list of values is given, convert to SET_ATTR_ALTERNATIVE first. */
1065 convert_set_attr (rtx exp, struct insn_def *id)
1068 const char *name_ptr;
1072 /* See how many alternative specified. */
1073 n = n_comma_elts (XSTR (exp, 1));
1075 return attr_rtx (SET,
1076 attr_rtx (ATTR, XSTR (exp, 0)),
1077 attr_rtx (CONST_STRING, XSTR (exp, 1)));
1079 newexp = rtx_alloc (SET_ATTR_ALTERNATIVE);
1080 XSTR (newexp, 0) = XSTR (exp, 0);
1081 XVEC (newexp, 1) = rtvec_alloc (n);
1083 /* Process each comma-separated name. */
1084 name_ptr = XSTR (exp, 1);
1086 while ((p = next_comma_elt (&name_ptr)) != NULL)
1087 XVECEXP (newexp, 1, n++) = attr_rtx (CONST_STRING, p);
1089 return convert_set_attr_alternative (newexp, id);
1092 /* Scan all definitions, checking for validity. Also, convert any SET_ATTR
1093 and SET_ATTR_ALTERNATIVE expressions to the corresponding SET
1099 struct insn_def *id;
1100 struct attr_desc *attr;
1104 for (id = defs; id; id = id->next)
1106 if (XVEC (id->def, id->vec_idx) == NULL)
1109 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1111 value = XVECEXP (id->def, id->vec_idx, i);
1112 switch (GET_CODE (value))
1115 if (GET_CODE (XEXP (value, 0)) != ATTR)
1117 error_with_line (id->lineno, "bad attribute set");
1122 case SET_ATTR_ALTERNATIVE:
1123 value = convert_set_attr_alternative (value, id);
1127 value = convert_set_attr (value, id);
1131 error_with_line (id->lineno, "invalid attribute code %s",
1132 GET_RTX_NAME (GET_CODE (value)));
1135 if (value == NULL_RTX)
1138 if ((attr = find_attr (&XSTR (XEXP (value, 0), 0), 0)) == NULL)
1140 error_with_line (id->lineno, "unknown attribute %s",
1141 XSTR (XEXP (value, 0), 0));
1145 XVECEXP (id->def, id->vec_idx, i) = value;
1146 XEXP (value, 1) = check_attr_value (XEXP (value, 1), attr);
1151 /* Given a valid expression for an attribute value, remove any IF_THEN_ELSE
1152 expressions by converting them into a COND. This removes cases from this
1153 program. Also, replace an attribute value of "*" with the default attribute
1157 make_canonical (struct attr_desc *attr, rtx exp)
1162 switch (GET_CODE (exp))
1165 exp = make_numeric_value (INTVAL (exp));
1169 if (! strcmp (XSTR (exp, 0), "*"))
1171 if (attr == 0 || attr->default_val == 0)
1172 fatal ("(attr_value \"*\") used in invalid context");
1173 exp = attr->default_val->value;
1176 XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1181 if (!attr->is_const || ATTR_IND_SIMPLIFIED_P (exp))
1183 /* The SYMBOL_REF is constant for a given run, so mark it as unchanging.
1184 This makes the COND something that won't be considered an arbitrary
1185 expression by walk_attr_value. */
1186 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1187 exp = check_attr_value (exp, attr);
1191 newexp = rtx_alloc (COND);
1192 XVEC (newexp, 0) = rtvec_alloc (2);
1193 XVECEXP (newexp, 0, 0) = XEXP (exp, 0);
1194 XVECEXP (newexp, 0, 1) = XEXP (exp, 1);
1196 XEXP (newexp, 1) = XEXP (exp, 2);
1199 /* Fall through to COND case since this is now a COND. */
1206 /* First, check for degenerate COND. */
1207 if (XVECLEN (exp, 0) == 0)
1208 return make_canonical (attr, XEXP (exp, 1));
1209 defval = XEXP (exp, 1) = make_canonical (attr, XEXP (exp, 1));
1211 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1213 XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
1214 XVECEXP (exp, 0, i + 1)
1215 = make_canonical (attr, XVECEXP (exp, 0, i + 1));
1216 if (! rtx_equal_p (XVECEXP (exp, 0, i + 1), defval))
1232 copy_boolean (rtx exp)
1234 if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
1235 return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
1236 copy_boolean (XEXP (exp, 1)));
1237 if (GET_CODE (exp) == MATCH_OPERAND)
1239 XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1240 XSTR (exp, 2) = DEF_ATTR_STRING (XSTR (exp, 2));
1242 else if (GET_CODE (exp) == EQ_ATTR)
1244 XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1245 XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1251 /* Given a value and an attribute description, return a `struct attr_value *'
1252 that represents that value. This is either an existing structure, if the
1253 value has been previously encountered, or a newly-created structure.
1255 `insn_code' is the code of an insn whose attribute has the specified
1256 value (-2 if not processing an insn). We ensure that all insns for
1257 a given value have the same number of alternatives if the value checks
1260 static struct attr_value *
1261 get_attr_value (rtx value, struct attr_desc *attr, int insn_code)
1263 struct attr_value *av;
1266 value = make_canonical (attr, value);
1267 if (compares_alternatives_p (value))
1269 if (insn_code < 0 || insn_alternatives == NULL)
1270 fatal ("(eq_attr \"alternatives\" ...) used in non-insn context");
1272 num_alt = insn_alternatives[insn_code];
1275 for (av = attr->first_value; av; av = av->next)
1276 if (rtx_equal_p (value, av->value)
1277 && (num_alt == 0 || av->first_insn == NULL
1278 || insn_alternatives[av->first_insn->def->insn_code]))
1281 av = oballoc (struct attr_value);
1283 av->next = attr->first_value;
1284 attr->first_value = av;
1285 av->first_insn = NULL;
1287 av->has_asm_insn = 0;
1292 /* After all DEFINE_DELAYs have been read in, create internal attributes
1293 to generate the required routines.
1295 First, we compute the number of delay slots for each insn (as a COND of
1296 each of the test expressions in DEFINE_DELAYs). Then, if more than one
1297 delay type is specified, we compute a similar function giving the
1298 DEFINE_DELAY ordinal for each insn.
1300 Finally, for each [DEFINE_DELAY, slot #] pair, we compute an attribute that
1301 tells whether a given insn can be in that delay slot.
1303 Normal attribute filling and optimization expands these to contain the
1304 information needed to handle delay slots. */
1307 expand_delays (void)
1309 struct delay_desc *delay;
1315 /* First, generate data for `num_delay_slots' function. */
1317 condexp = rtx_alloc (COND);
1318 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1319 XEXP (condexp, 1) = make_numeric_value (0);
1321 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1323 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1324 XVECEXP (condexp, 0, i + 1)
1325 = make_numeric_value (XVECLEN (delay->def, 1) / 3);
1328 make_internal_attr (num_delay_slots_str, condexp, ATTR_NONE);
1330 /* If more than one delay type, do the same for computing the delay type. */
1333 condexp = rtx_alloc (COND);
1334 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1335 XEXP (condexp, 1) = make_numeric_value (0);
1337 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1339 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1340 XVECEXP (condexp, 0, i + 1) = make_numeric_value (delay->num);
1343 make_internal_attr (delay_type_str, condexp, ATTR_SPECIAL);
1346 /* For each delay possibility and delay slot, compute an eligibility
1347 attribute for non-annulled insns and for each type of annulled (annul
1348 if true and annul if false). */
1349 for (delay = delays; delay; delay = delay->next)
1351 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
1353 condexp = XVECEXP (delay->def, 1, i);
1355 condexp = false_rtx;
1356 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1357 make_numeric_value (1), make_numeric_value (0));
1359 p = attr_printf (sizeof "*delay__" + MAX_DIGITS * 2,
1360 "*delay_%d_%d", delay->num, i / 3);
1361 make_internal_attr (p, newexp, ATTR_SPECIAL);
1363 if (have_annul_true)
1365 condexp = XVECEXP (delay->def, 1, i + 1);
1366 if (condexp == 0) condexp = false_rtx;
1367 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1368 make_numeric_value (1),
1369 make_numeric_value (0));
1370 p = attr_printf (sizeof "*annul_true__" + MAX_DIGITS * 2,
1371 "*annul_true_%d_%d", delay->num, i / 3);
1372 make_internal_attr (p, newexp, ATTR_SPECIAL);
1375 if (have_annul_false)
1377 condexp = XVECEXP (delay->def, 1, i + 2);
1378 if (condexp == 0) condexp = false_rtx;
1379 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1380 make_numeric_value (1),
1381 make_numeric_value (0));
1382 p = attr_printf (sizeof "*annul_false__" + MAX_DIGITS * 2,
1383 "*annul_false_%d_%d", delay->num, i / 3);
1384 make_internal_attr (p, newexp, ATTR_SPECIAL);
1390 /* Once all attributes and insns have been read and checked, we construct for
1391 each attribute value a list of all the insns that have that value for
1395 fill_attr (struct attr_desc *attr)
1397 struct attr_value *av;
1398 struct insn_ent *ie;
1399 struct insn_def *id;
1403 /* Don't fill constant attributes. The value is independent of
1404 any particular insn. */
1408 for (id = defs; id; id = id->next)
1410 /* If no value is specified for this insn for this attribute, use the
1413 if (XVEC (id->def, id->vec_idx))
1414 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1415 if (! strcmp_check (XSTR (XEXP (XVECEXP (id->def, id->vec_idx, i), 0), 0),
1417 value = XEXP (XVECEXP (id->def, id->vec_idx, i), 1);
1420 av = attr->default_val;
1422 av = get_attr_value (value, attr, id->insn_code);
1424 ie = oballoc (struct insn_ent);
1426 insert_insn_ent (av, ie);
1430 /* Given an expression EXP, see if it is a COND or IF_THEN_ELSE that has a
1431 test that checks relative positions of insns (uses MATCH_DUP or PC).
1432 If so, replace it with what is obtained by passing the expression to
1433 ADDRESS_FN. If not but it is a COND or IF_THEN_ELSE, call this routine
1434 recursively on each value (including the default value). Otherwise,
1435 return the value returned by NO_ADDRESS_FN applied to EXP. */
1438 substitute_address (rtx exp, rtx (*no_address_fn) (rtx),
1439 rtx (*address_fn) (rtx))
1444 if (GET_CODE (exp) == COND)
1446 /* See if any tests use addresses. */
1448 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1449 walk_attr_value (XVECEXP (exp, 0, i));
1452 return (*address_fn) (exp);
1454 /* Make a new copy of this COND, replacing each element. */
1455 newexp = rtx_alloc (COND);
1456 XVEC (newexp, 0) = rtvec_alloc (XVECLEN (exp, 0));
1457 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1459 XVECEXP (newexp, 0, i) = XVECEXP (exp, 0, i);
1460 XVECEXP (newexp, 0, i + 1)
1461 = substitute_address (XVECEXP (exp, 0, i + 1),
1462 no_address_fn, address_fn);
1465 XEXP (newexp, 1) = substitute_address (XEXP (exp, 1),
1466 no_address_fn, address_fn);
1471 else if (GET_CODE (exp) == IF_THEN_ELSE)
1474 walk_attr_value (XEXP (exp, 0));
1476 return (*address_fn) (exp);
1478 return attr_rtx (IF_THEN_ELSE,
1479 substitute_address (XEXP (exp, 0),
1480 no_address_fn, address_fn),
1481 substitute_address (XEXP (exp, 1),
1482 no_address_fn, address_fn),
1483 substitute_address (XEXP (exp, 2),
1484 no_address_fn, address_fn));
1487 return (*no_address_fn) (exp);
1490 /* Make new attributes from the `length' attribute. The following are made,
1491 each corresponding to a function called from `shorten_branches' or
1494 *insn_default_length This is the length of the insn to be returned
1495 by `get_attr_length' before `shorten_branches'
1496 has been called. In each case where the length
1497 depends on relative addresses, the largest
1498 possible is used. This routine is also used
1499 to compute the initial size of the insn.
1501 *insn_variable_length_p This returns 1 if the insn's length depends
1502 on relative addresses, zero otherwise.
1504 *insn_current_length This is only called when it is known that the
1505 insn has a variable length and returns the
1506 current length, based on relative addresses.
1510 make_length_attrs (void)
1512 static const char *new_names[] =
1514 "*insn_default_length",
1516 "*insn_variable_length_p",
1517 "*insn_current_length"
1519 static rtx (*const no_address_fn[]) (rtx)
1520 = {identity_fn,identity_fn, zero_fn, zero_fn};
1521 static rtx (*const address_fn[]) (rtx)
1522 = {max_fn, min_fn, one_fn, identity_fn};
1524 struct attr_desc *length_attr, *new_attr;
1525 struct attr_value *av, *new_av;
1526 struct insn_ent *ie, *new_ie;
1528 /* See if length attribute is defined. If so, it must be numeric. Make
1529 it special so we don't output anything for it. */
1530 length_attr = find_attr (&length_str, 0);
1531 if (length_attr == 0)
1534 if (! length_attr->is_numeric)
1535 fatal ("length attribute must be numeric");
1537 length_attr->is_const = 0;
1538 length_attr->is_special = 1;
1540 /* Make each new attribute, in turn. */
1541 for (i = 0; i < ARRAY_SIZE (new_names); i++)
1543 make_internal_attr (new_names[i],
1544 substitute_address (length_attr->default_val->value,
1545 no_address_fn[i], address_fn[i]),
1547 new_attr = find_attr (&new_names[i], 0);
1548 for (av = length_attr->first_value; av; av = av->next)
1549 for (ie = av->first_insn; ie; ie = ie->next)
1551 new_av = get_attr_value (substitute_address (av->value,
1554 new_attr, ie->def->insn_code);
1555 new_ie = oballoc (struct insn_ent);
1556 new_ie->def = ie->def;
1557 insert_insn_ent (new_av, new_ie);
1562 /* Utility functions called from above routine. */
1565 identity_fn (rtx exp)
1571 zero_fn (rtx exp ATTRIBUTE_UNUSED)
1573 return make_numeric_value (0);
1577 one_fn (rtx exp ATTRIBUTE_UNUSED)
1579 return make_numeric_value (1);
1586 return make_numeric_value (max_attr_value (exp, &unknown));
1593 return make_numeric_value (min_attr_value (exp, &unknown));
1597 write_length_unit_log (void)
1599 struct attr_desc *length_attr = find_attr (&length_str, 0);
1600 struct attr_value *av;
1601 struct insn_ent *ie;
1602 unsigned int length_unit_log, length_or;
1605 if (length_attr == 0)
1607 length_or = or_attr_value (length_attr->default_val->value, &unknown);
1608 for (av = length_attr->first_value; av; av = av->next)
1609 for (ie = av->first_insn; ie; ie = ie->next)
1610 length_or |= or_attr_value (av->value, &unknown);
1613 length_unit_log = 0;
1616 length_or = ~length_or;
1617 for (length_unit_log = 0; length_or & 1; length_or >>= 1)
1620 printf ("EXPORTED_CONST int length_unit_log = %u;\n", length_unit_log);
1623 /* Take a COND expression and see if any of the conditions in it can be
1624 simplified. If any are known true or known false for the particular insn
1625 code, the COND can be further simplified.
1627 Also call ourselves on any COND operations that are values of this COND.
1629 We do not modify EXP; rather, we make and return a new rtx. */
1632 simplify_cond (rtx exp, int insn_code, int insn_index)
1635 /* We store the desired contents here,
1636 then build a new expression if they don't match EXP. */
1637 rtx defval = XEXP (exp, 1);
1638 rtx new_defval = XEXP (exp, 1);
1639 int len = XVECLEN (exp, 0);
1640 rtx *tests = XNEWVEC (rtx, len);
1644 /* This lets us free all storage allocated below, if appropriate. */
1645 obstack_finish (rtl_obstack);
1647 memcpy (tests, XVEC (exp, 0)->elem, len * sizeof (rtx));
1649 /* See if default value needs simplification. */
1650 if (GET_CODE (defval) == COND)
1651 new_defval = simplify_cond (defval, insn_code, insn_index);
1653 /* Simplify the subexpressions, and see what tests we can get rid of. */
1655 for (i = 0; i < len; i += 2)
1657 rtx newtest, newval;
1659 /* Simplify this test. */
1660 newtest = simplify_test_exp_in_temp (tests[i], insn_code, insn_index);
1663 newval = tests[i + 1];
1664 /* See if this value may need simplification. */
1665 if (GET_CODE (newval) == COND)
1666 newval = simplify_cond (newval, insn_code, insn_index);
1668 /* Look for ways to delete or combine this test. */
1669 if (newtest == true_rtx)
1671 /* If test is true, make this value the default
1672 and discard this + any following tests. */
1674 defval = tests[i + 1];
1675 new_defval = newval;
1678 else if (newtest == false_rtx)
1680 /* If test is false, discard it and its value. */
1681 for (j = i; j < len - 2; j++)
1682 tests[j] = tests[j + 2];
1687 else if (i > 0 && attr_equal_p (newval, tests[i - 1]))
1689 /* If this value and the value for the prev test are the same,
1693 = insert_right_side (IOR, tests[i - 2], newtest,
1694 insn_code, insn_index);
1696 /* Delete this test/value. */
1697 for (j = i; j < len - 2; j++)
1698 tests[j] = tests[j + 2];
1704 tests[i + 1] = newval;
1707 /* If the last test in a COND has the same value
1708 as the default value, that test isn't needed. */
1710 while (len > 0 && attr_equal_p (tests[len - 1], new_defval))
1713 /* See if we changed anything. */
1714 if (len != XVECLEN (exp, 0) || new_defval != XEXP (exp, 1))
1717 for (i = 0; i < len; i++)
1718 if (! attr_equal_p (tests[i], XVECEXP (exp, 0, i)))
1726 if (GET_CODE (defval) == COND)
1727 ret = simplify_cond (defval, insn_code, insn_index);
1735 rtx newexp = rtx_alloc (COND);
1737 XVEC (newexp, 0) = rtvec_alloc (len);
1738 memcpy (XVEC (newexp, 0)->elem, tests, len * sizeof (rtx));
1739 XEXP (newexp, 1) = new_defval;
1746 /* Remove an insn entry from an attribute value. */
1749 remove_insn_ent (struct attr_value *av, struct insn_ent *ie)
1751 struct insn_ent *previe;
1753 if (av->first_insn == ie)
1754 av->first_insn = ie->next;
1757 for (previe = av->first_insn; previe->next != ie; previe = previe->next)
1759 previe->next = ie->next;
1763 if (ie->def->insn_code == -1)
1764 av->has_asm_insn = 0;
1769 /* Insert an insn entry in an attribute value list. */
1772 insert_insn_ent (struct attr_value *av, struct insn_ent *ie)
1774 ie->next = av->first_insn;
1775 av->first_insn = ie;
1777 if (ie->def->insn_code == -1)
1778 av->has_asm_insn = 1;
1783 /* This is a utility routine to take an expression that is a tree of either
1784 AND or IOR expressions and insert a new term. The new term will be
1785 inserted at the right side of the first node whose code does not match
1786 the root. A new node will be created with the root's code. Its left
1787 side will be the old right side and its right side will be the new
1790 If the `term' is itself a tree, all its leaves will be inserted. */
1793 insert_right_side (enum rtx_code code, rtx exp, rtx term, int insn_code, int insn_index)
1797 /* Avoid consing in some special cases. */
1798 if (code == AND && term == true_rtx)
1800 if (code == AND && term == false_rtx)
1802 if (code == AND && exp == true_rtx)
1804 if (code == AND && exp == false_rtx)
1806 if (code == IOR && term == true_rtx)
1808 if (code == IOR && term == false_rtx)
1810 if (code == IOR && exp == true_rtx)
1812 if (code == IOR && exp == false_rtx)
1814 if (attr_equal_p (exp, term))
1817 if (GET_CODE (term) == code)
1819 exp = insert_right_side (code, exp, XEXP (term, 0),
1820 insn_code, insn_index);
1821 exp = insert_right_side (code, exp, XEXP (term, 1),
1822 insn_code, insn_index);
1827 if (GET_CODE (exp) == code)
1829 rtx new_rtx = insert_right_side (code, XEXP (exp, 1),
1830 term, insn_code, insn_index);
1831 if (new_rtx != XEXP (exp, 1))
1832 /* Make a copy of this expression and call recursively. */
1833 newexp = attr_rtx (code, XEXP (exp, 0), new_rtx);
1839 /* Insert the new term. */
1840 newexp = attr_rtx (code, exp, term);
1843 return simplify_test_exp_in_temp (newexp, insn_code, insn_index);
1846 /* If we have an expression which AND's a bunch of
1847 (not (eq_attrq "alternative" "n"))
1848 terms, we may have covered all or all but one of the possible alternatives.
1849 If so, we can optimize. Similarly for IOR's of EQ_ATTR.
1851 This routine is passed an expression and either AND or IOR. It returns a
1852 bitmask indicating which alternatives are mentioned within EXP. */
1855 compute_alternative_mask (rtx exp, enum rtx_code code)
1858 if (GET_CODE (exp) == code)
1859 return compute_alternative_mask (XEXP (exp, 0), code)
1860 | compute_alternative_mask (XEXP (exp, 1), code);
1862 else if (code == AND && GET_CODE (exp) == NOT
1863 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
1864 && XSTR (XEXP (exp, 0), 0) == alternative_name)
1865 string = XSTR (XEXP (exp, 0), 1);
1867 else if (code == IOR && GET_CODE (exp) == EQ_ATTR
1868 && XSTR (exp, 0) == alternative_name)
1869 string = XSTR (exp, 1);
1871 else if (GET_CODE (exp) == EQ_ATTR_ALT)
1873 if (code == AND && XINT (exp, 1))
1874 return XINT (exp, 0);
1876 if (code == IOR && !XINT (exp, 1))
1877 return XINT (exp, 0);
1885 return 1 << (string[0] - '0');
1886 return 1 << atoi (string);
1889 /* Given I, a single-bit mask, return RTX to compare the `alternative'
1890 attribute with the value represented by that bit. */
1893 make_alternative_compare (int mask)
1895 return mk_attr_alt (mask);
1898 /* If we are processing an (eq_attr "attr" "value") test, we find the value
1899 of "attr" for this insn code. From that value, we can compute a test
1900 showing when the EQ_ATTR will be true. This routine performs that
1901 computation. If a test condition involves an address, we leave the EQ_ATTR
1902 intact because addresses are only valid for the `length' attribute.
1904 EXP is the EQ_ATTR expression and VALUE is the value of that attribute
1905 for the insn corresponding to INSN_CODE and INSN_INDEX. */
1908 evaluate_eq_attr (rtx exp, rtx value, int insn_code, int insn_index)
1915 switch (GET_CODE (value))
1918 if (! strcmp_check (XSTR (value, 0), XSTR (exp, 1)))
1929 gcc_assert (GET_CODE (exp) == EQ_ATTR);
1930 gcc_assert (strlen (XSTR (exp, 0)) + strlen (XSTR (exp, 1)) + 2
1933 strcpy (string, XSTR (exp, 0));
1934 strcat (string, "_");
1935 strcat (string, XSTR (exp, 1));
1936 for (p = string; *p; p++)
1939 newexp = attr_rtx (EQ, value,
1940 attr_rtx (SYMBOL_REF,
1941 DEF_ATTR_STRING (string)));
1946 /* We construct an IOR of all the cases for which the
1947 requested attribute value is present. Since we start with
1948 FALSE, if it is not present, FALSE will be returned.
1950 Each case is the AND of the NOT's of the previous conditions with the
1951 current condition; in the default case the current condition is TRUE.
1953 For each possible COND value, call ourselves recursively.
1955 The extra TRUE and FALSE expressions will be eliminated by another
1956 call to the simplification routine. */
1961 for (i = 0; i < XVECLEN (value, 0); i += 2)
1963 rtx this_cond = simplify_test_exp_in_temp (XVECEXP (value, 0, i),
1964 insn_code, insn_index);
1966 right = insert_right_side (AND, andexp, this_cond,
1967 insn_code, insn_index);
1968 right = insert_right_side (AND, right,
1969 evaluate_eq_attr (exp,
1972 insn_code, insn_index),
1973 insn_code, insn_index);
1974 orexp = insert_right_side (IOR, orexp, right,
1975 insn_code, insn_index);
1977 /* Add this condition into the AND expression. */
1978 newexp = attr_rtx (NOT, this_cond);
1979 andexp = insert_right_side (AND, andexp, newexp,
1980 insn_code, insn_index);
1983 /* Handle the default case. */
1984 right = insert_right_side (AND, andexp,
1985 evaluate_eq_attr (exp, XEXP (value, 1),
1986 insn_code, insn_index),
1987 insn_code, insn_index);
1988 newexp = insert_right_side (IOR, orexp, right, insn_code, insn_index);
1995 /* If uses an address, must return original expression. But set the
1996 ATTR_IND_SIMPLIFIED_P bit so we don't try to simplify it again. */
1999 walk_attr_value (newexp);
2003 if (! ATTR_IND_SIMPLIFIED_P (exp))
2004 return copy_rtx_unchanging (exp);
2011 /* This routine is called when an AND of a term with a tree of AND's is
2012 encountered. If the term or its complement is present in the tree, it
2013 can be replaced with TRUE or FALSE, respectively.
2015 Note that (eq_attr "att" "v1") and (eq_attr "att" "v2") cannot both
2016 be true and hence are complementary.
2018 There is one special case: If we see
2019 (and (not (eq_attr "att" "v1"))
2020 (eq_attr "att" "v2"))
2021 this can be replaced by (eq_attr "att" "v2"). To do this we need to
2022 replace the term, not anything in the AND tree. So we pass a pointer to
2026 simplify_and_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2031 int left_eliminates_term, right_eliminates_term;
2033 if (GET_CODE (exp) == AND)
2035 left = simplify_and_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2036 right = simplify_and_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2037 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2039 newexp = attr_rtx (AND, left, right);
2041 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2045 else if (GET_CODE (exp) == IOR)
2047 /* For the IOR case, we do the same as above, except that we can
2048 only eliminate `term' if both sides of the IOR would do so. */
2050 left = simplify_and_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2051 left_eliminates_term = (temp == true_rtx);
2054 right = simplify_and_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2055 right_eliminates_term = (temp == true_rtx);
2057 if (left_eliminates_term && right_eliminates_term)
2060 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2062 newexp = attr_rtx (IOR, left, right);
2064 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2068 /* Check for simplifications. Do some extra checking here since this
2069 routine is called so many times. */
2074 else if (GET_CODE (exp) == NOT && XEXP (exp, 0) == *pterm)
2077 else if (GET_CODE (*pterm) == NOT && exp == XEXP (*pterm, 0))
2080 else if (GET_CODE (exp) == EQ_ATTR_ALT && GET_CODE (*pterm) == EQ_ATTR_ALT)
2082 if (attr_alt_subset_p (*pterm, exp))
2085 if (attr_alt_subset_of_compl_p (*pterm, exp))
2088 if (attr_alt_subset_p (exp, *pterm))
2094 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == EQ_ATTR)
2096 if (XSTR (exp, 0) != XSTR (*pterm, 0))
2099 if (! strcmp_check (XSTR (exp, 1), XSTR (*pterm, 1)))
2105 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2106 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
2108 if (XSTR (*pterm, 0) != XSTR (XEXP (exp, 0), 0))
2111 if (! strcmp_check (XSTR (*pterm, 1), XSTR (XEXP (exp, 0), 1)))
2117 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2118 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR)
2120 if (XSTR (exp, 0) != XSTR (XEXP (*pterm, 0), 0))
2123 if (! strcmp_check (XSTR (exp, 1), XSTR (XEXP (*pterm, 0), 1)))
2129 else if (GET_CODE (exp) == NOT && GET_CODE (*pterm) == NOT)
2131 if (attr_equal_p (XEXP (exp, 0), XEXP (*pterm, 0)))
2135 else if (GET_CODE (exp) == NOT)
2137 if (attr_equal_p (XEXP (exp, 0), *pterm))
2141 else if (GET_CODE (*pterm) == NOT)
2143 if (attr_equal_p (XEXP (*pterm, 0), exp))
2147 else if (attr_equal_p (exp, *pterm))
2153 /* Similar to `simplify_and_tree', but for IOR trees. */
2156 simplify_or_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2161 int left_eliminates_term, right_eliminates_term;
2163 if (GET_CODE (exp) == IOR)
2165 left = simplify_or_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2166 right = simplify_or_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2167 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2169 newexp = attr_rtx (GET_CODE (exp), left, right);
2171 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2175 else if (GET_CODE (exp) == AND)
2177 /* For the AND case, we do the same as above, except that we can
2178 only eliminate `term' if both sides of the AND would do so. */
2180 left = simplify_or_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2181 left_eliminates_term = (temp == false_rtx);
2184 right = simplify_or_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2185 right_eliminates_term = (temp == false_rtx);
2187 if (left_eliminates_term && right_eliminates_term)
2190 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2192 newexp = attr_rtx (GET_CODE (exp), left, right);
2194 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2198 if (attr_equal_p (exp, *pterm))
2201 else if (GET_CODE (exp) == NOT && attr_equal_p (XEXP (exp, 0), *pterm))
2204 else if (GET_CODE (*pterm) == NOT && attr_equal_p (XEXP (*pterm, 0), exp))
2207 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2208 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
2209 && XSTR (*pterm, 0) == XSTR (XEXP (exp, 0), 0))
2212 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2213 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR
2214 && XSTR (exp, 0) == XSTR (XEXP (*pterm, 0), 0))
2220 /* Compute approximate cost of the expression. Used to decide whether
2221 expression is cheap enough for inline. */
2223 attr_rtx_cost (rtx x)
2229 code = GET_CODE (x);
2242 /* Alternatives don't result into function call. */
2243 if (!strcmp_check (XSTR (x, 0), alternative_name))
2250 const char *fmt = GET_RTX_FORMAT (code);
2251 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2257 for (j = 0; j < XVECLEN (x, i); j++)
2258 cost += attr_rtx_cost (XVECEXP (x, i, j));
2261 cost += attr_rtx_cost (XEXP (x, i));
2271 /* Simplify test expression and use temporary obstack in order to avoid
2272 memory bloat. Use ATTR_IND_SIMPLIFIED to avoid unnecessary simplifications
2273 and avoid unnecessary copying if possible. */
2276 simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
2279 struct obstack *old;
2280 if (ATTR_IND_SIMPLIFIED_P (exp))
2283 rtl_obstack = temp_obstack;
2284 x = simplify_test_exp (exp, insn_code, insn_index);
2286 if (x == exp || rtl_obstack == temp_obstack)
2288 return attr_copy_rtx (x);
2291 /* Returns true if S1 is a subset of S2. */
2294 attr_alt_subset_p (rtx s1, rtx s2)
2296 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2299 return !(XINT (s1, 0) &~ XINT (s2, 0));
2302 return !(XINT (s1, 0) & XINT (s2, 0));
2308 return !(XINT (s2, 0) &~ XINT (s1, 0));
2315 /* Returns true if S1 is a subset of complement of S2. */
2318 attr_alt_subset_of_compl_p (rtx s1, rtx s2)
2320 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2323 return !(XINT (s1, 0) & XINT (s2, 0));
2326 return !(XINT (s1, 0) & ~XINT (s2, 0));
2329 return !(XINT (s2, 0) &~ XINT (s1, 0));
2339 /* Return EQ_ATTR_ALT expression representing intersection of S1 and S2. */
2342 attr_alt_intersection (rtx s1, rtx s2)
2344 rtx result = rtx_alloc (EQ_ATTR_ALT);
2346 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2349 XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2352 XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2355 XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2358 XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2363 XINT (result, 1) = XINT (s1, 1) & XINT (s2, 1);
2368 /* Return EQ_ATTR_ALT expression representing union of S1 and S2. */
2371 attr_alt_union (rtx s1, rtx s2)
2373 rtx result = rtx_alloc (EQ_ATTR_ALT);
2375 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2378 XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2381 XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2384 XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2387 XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2393 XINT (result, 1) = XINT (s1, 1) | XINT (s2, 1);
2397 /* Return EQ_ATTR_ALT expression representing complement of S. */
2400 attr_alt_complement (rtx s)
2402 rtx result = rtx_alloc (EQ_ATTR_ALT);
2404 XINT (result, 0) = XINT (s, 0);
2405 XINT (result, 1) = 1 - XINT (s, 1);
2410 /* Return EQ_ATTR_ALT expression representing set containing elements set
2416 rtx result = rtx_alloc (EQ_ATTR_ALT);
2418 XINT (result, 0) = e;
2419 XINT (result, 1) = 0;
2424 /* Given an expression, see if it can be simplified for a particular insn
2425 code based on the values of other attributes being tested. This can
2426 eliminate nested get_attr_... calls.
2428 Note that if an endless recursion is specified in the patterns, the
2429 optimization will loop. However, it will do so in precisely the cases where
2430 an infinite recursion loop could occur during compilation. It's better that
2434 simplify_test_exp (rtx exp, int insn_code, int insn_index)
2437 struct attr_desc *attr;
2438 struct attr_value *av;
2439 struct insn_ent *ie;
2440 struct attr_value_list *iv;
2443 bool left_alt, right_alt;
2445 /* Don't re-simplify something we already simplified. */
2446 if (ATTR_IND_SIMPLIFIED_P (exp) || ATTR_CURR_SIMPLIFIED_P (exp))
2449 switch (GET_CODE (exp))
2452 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2453 if (left == false_rtx)
2455 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2456 if (right == false_rtx)
2459 if (GET_CODE (left) == EQ_ATTR_ALT
2460 && GET_CODE (right) == EQ_ATTR_ALT)
2462 exp = attr_alt_intersection (left, right);
2463 return simplify_test_exp (exp, insn_code, insn_index);
2466 /* If either side is an IOR and we have (eq_attr "alternative" ..")
2467 present on both sides, apply the distributive law since this will
2468 yield simplifications. */
2469 if ((GET_CODE (left) == IOR || GET_CODE (right) == IOR)
2470 && compute_alternative_mask (left, IOR)
2471 && compute_alternative_mask (right, IOR))
2473 if (GET_CODE (left) == IOR)
2480 newexp = attr_rtx (IOR,
2481 attr_rtx (AND, left, XEXP (right, 0)),
2482 attr_rtx (AND, left, XEXP (right, 1)));
2484 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2487 /* Try with the term on both sides. */
2488 right = simplify_and_tree (right, &left, insn_code, insn_index);
2489 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2490 left = simplify_and_tree (left, &right, insn_code, insn_index);
2492 if (left == false_rtx || right == false_rtx)
2494 else if (left == true_rtx)
2498 else if (right == true_rtx)
2502 /* See if all or all but one of the insn's alternatives are specified
2503 in this tree. Optimize if so. */
2505 if (GET_CODE (left) == NOT)
2506 left_alt = (GET_CODE (XEXP (left, 0)) == EQ_ATTR
2507 && XSTR (XEXP (left, 0), 0) == alternative_name);
2509 left_alt = (GET_CODE (left) == EQ_ATTR_ALT
2512 if (GET_CODE (right) == NOT)
2513 right_alt = (GET_CODE (XEXP (right, 0)) == EQ_ATTR
2514 && XSTR (XEXP (right, 0), 0) == alternative_name);
2516 right_alt = (GET_CODE (right) == EQ_ATTR_ALT
2517 && XINT (right, 1));
2520 && (GET_CODE (left) == AND
2522 || GET_CODE (right) == AND
2525 i = compute_alternative_mask (exp, AND);
2526 if (i & ~insn_alternatives[insn_code])
2527 fatal ("invalid alternative specified for pattern number %d",
2530 /* If all alternatives are excluded, this is false. */
2531 i ^= insn_alternatives[insn_code];
2534 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2536 /* If just one excluded, AND a comparison with that one to the
2537 front of the tree. The others will be eliminated by
2538 optimization. We do not want to do this if the insn has one
2539 alternative and we have tested none of them! */
2540 left = make_alternative_compare (i);
2541 right = simplify_and_tree (exp, &left, insn_code, insn_index);
2542 newexp = attr_rtx (AND, left, right);
2544 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2548 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2550 newexp = attr_rtx (AND, left, right);
2551 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2556 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2557 if (left == true_rtx)
2559 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2560 if (right == true_rtx)
2563 if (GET_CODE (left) == EQ_ATTR_ALT
2564 && GET_CODE (right) == EQ_ATTR_ALT)
2566 exp = attr_alt_union (left, right);
2567 return simplify_test_exp (exp, insn_code, insn_index);
2570 right = simplify_or_tree (right, &left, insn_code, insn_index);
2571 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2572 left = simplify_or_tree (left, &right, insn_code, insn_index);
2574 if (right == true_rtx || left == true_rtx)
2576 else if (left == false_rtx)
2580 else if (right == false_rtx)
2585 /* Test for simple cases where the distributive law is useful. I.e.,
2586 convert (ior (and (x) (y))
2592 else if (GET_CODE (left) == AND && GET_CODE (right) == AND
2593 && attr_equal_p (XEXP (left, 0), XEXP (right, 0)))
2595 newexp = attr_rtx (IOR, XEXP (left, 1), XEXP (right, 1));
2597 left = XEXP (left, 0);
2599 newexp = attr_rtx (AND, left, right);
2600 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2603 /* See if all or all but one of the insn's alternatives are specified
2604 in this tree. Optimize if so. */
2606 else if (insn_code >= 0
2607 && (GET_CODE (left) == IOR
2608 || (GET_CODE (left) == EQ_ATTR_ALT
2610 || (GET_CODE (left) == EQ_ATTR
2611 && XSTR (left, 0) == alternative_name)
2612 || GET_CODE (right) == IOR
2613 || (GET_CODE (right) == EQ_ATTR_ALT
2614 && !XINT (right, 1))
2615 || (GET_CODE (right) == EQ_ATTR
2616 && XSTR (right, 0) == alternative_name)))
2618 i = compute_alternative_mask (exp, IOR);
2619 if (i & ~insn_alternatives[insn_code])
2620 fatal ("invalid alternative specified for pattern number %d",
2623 /* If all alternatives are included, this is true. */
2624 i ^= insn_alternatives[insn_code];
2627 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2629 /* If just one excluded, IOR a comparison with that one to the
2630 front of the tree. The others will be eliminated by
2631 optimization. We do not want to do this if the insn has one
2632 alternative and we have tested none of them! */
2633 left = make_alternative_compare (i);
2634 right = simplify_and_tree (exp, &left, insn_code, insn_index);
2635 newexp = attr_rtx (IOR, attr_rtx (NOT, left), right);
2637 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2641 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2643 newexp = attr_rtx (IOR, left, right);
2644 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2649 if (GET_CODE (XEXP (exp, 0)) == NOT)
2651 left = SIMPLIFY_TEST_EXP (XEXP (XEXP (exp, 0), 0),
2652 insn_code, insn_index);
2656 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2657 if (GET_CODE (left) == NOT)
2658 return XEXP (left, 0);
2660 if (left == false_rtx)
2662 if (left == true_rtx)
2665 if (GET_CODE (left) == EQ_ATTR_ALT)
2667 exp = attr_alt_complement (left);
2668 return simplify_test_exp (exp, insn_code, insn_index);
2671 /* Try to apply De`Morgan's laws. */
2672 if (GET_CODE (left) == IOR)
2674 newexp = attr_rtx (AND,
2675 attr_rtx (NOT, XEXP (left, 0)),
2676 attr_rtx (NOT, XEXP (left, 1)));
2678 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2680 else if (GET_CODE (left) == AND)
2682 newexp = attr_rtx (IOR,
2683 attr_rtx (NOT, XEXP (left, 0)),
2684 attr_rtx (NOT, XEXP (left, 1)));
2686 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2688 else if (left != XEXP (exp, 0))
2690 newexp = attr_rtx (NOT, left);
2696 return XINT (exp, 1) ? true_rtx : false_rtx;
2700 if (XSTR (exp, 0) == alternative_name)
2702 newexp = mk_attr_alt (1 << atoi (XSTR (exp, 1)));
2706 /* Look at the value for this insn code in the specified attribute.
2707 We normally can replace this comparison with the condition that
2708 would give this insn the values being tested for. */
2710 && (attr = find_attr (&XSTR (exp, 0), 0)) != NULL)
2715 if (insn_code_values)
2717 for (iv = insn_code_values[insn_code]; iv; iv = iv->next)
2718 if (iv->attr == attr)
2726 for (av = attr->first_value; av; av = av->next)
2727 for (ie = av->first_insn; ie; ie = ie->next)
2728 if (ie->def->insn_code == insn_code)
2735 x = evaluate_eq_attr (exp, av->value, insn_code, insn_index);
2736 x = SIMPLIFY_TEST_EXP (x, insn_code, insn_index);
2737 if (attr_rtx_cost(x) < 20)
2747 /* We have already simplified this expression. Simplifying it again
2748 won't buy anything unless we weren't given a valid insn code
2749 to process (i.e., we are canonicalizing something.). */
2751 && ! ATTR_IND_SIMPLIFIED_P (newexp))
2752 return copy_rtx_unchanging (newexp);
2757 /* Optimize the attribute lists by seeing if we can determine conditional
2758 values from the known values of other attributes. This will save subroutine
2759 calls during the compilation. */
2762 optimize_attrs (void)
2764 struct attr_desc *attr;
2765 struct attr_value *av;
2766 struct insn_ent *ie;
2769 struct attr_value_list *ivbuf;
2770 struct attr_value_list *iv;
2772 /* For each insn code, make a list of all the insn_ent's for it,
2773 for all values for all attributes. */
2775 if (num_insn_ents == 0)
2778 /* Make 2 extra elements, for "code" values -2 and -1. */
2779 insn_code_values = XCNEWVEC (struct attr_value_list *, insn_code_number + 2);
2781 /* Offset the table address so we can index by -2 or -1. */
2782 insn_code_values += 2;
2784 iv = ivbuf = XNEWVEC (struct attr_value_list, num_insn_ents);
2786 for (i = 0; i < MAX_ATTRS_INDEX; i++)
2787 for (attr = attrs[i]; attr; attr = attr->next)
2788 for (av = attr->first_value; av; av = av->next)
2789 for (ie = av->first_insn; ie; ie = ie->next)
2794 iv->next = insn_code_values[ie->def->insn_code];
2795 insn_code_values[ie->def->insn_code] = iv;
2799 /* Sanity check on num_insn_ents. */
2800 gcc_assert (iv == ivbuf + num_insn_ents);
2802 /* Process one insn code at a time. */
2803 for (i = -2; i < insn_code_number; i++)
2805 /* Clear the ATTR_CURR_SIMPLIFIED_P flag everywhere relevant.
2806 We use it to mean "already simplified for this insn". */
2807 for (iv = insn_code_values[i]; iv; iv = iv->next)
2808 clear_struct_flag (iv->av->value);
2810 for (iv = insn_code_values[i]; iv; iv = iv->next)
2812 struct obstack *old = rtl_obstack;
2817 if (GET_CODE (av->value) != COND)
2820 rtl_obstack = temp_obstack;
2822 while (GET_CODE (newexp) == COND)
2824 rtx newexp2 = simplify_cond (newexp, ie->def->insn_code,
2825 ie->def->insn_index);
2826 if (newexp2 == newexp)
2832 if (newexp != av->value)
2834 newexp = attr_copy_rtx (newexp);
2835 remove_insn_ent (av, ie);
2836 av = get_attr_value (newexp, attr, ie->def->insn_code);
2838 insert_insn_ent (av, ie);
2844 free (insn_code_values - 2);
2845 insn_code_values = NULL;
2848 /* Clear the ATTR_CURR_SIMPLIFIED_P flag in EXP and its subexpressions. */
2851 clear_struct_flag (rtx x)
2858 ATTR_CURR_SIMPLIFIED_P (x) = 0;
2859 if (ATTR_IND_SIMPLIFIED_P (x))
2862 code = GET_CODE (x);
2882 /* Compare the elements. If any pair of corresponding elements
2883 fail to match, return 0 for the whole things. */
2885 fmt = GET_RTX_FORMAT (code);
2886 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2892 for (j = 0; j < XVECLEN (x, i); j++)
2893 clear_struct_flag (XVECEXP (x, i, j));
2897 clear_struct_flag (XEXP (x, i));
2903 /* Create table entries for DEFINE_ATTR. */
2906 gen_attr (rtx exp, int lineno)
2908 struct attr_desc *attr;
2909 struct attr_value *av;
2910 const char *name_ptr;
2913 /* Make a new attribute structure. Check for duplicate by looking at
2914 attr->default_val, since it is initialized by this routine. */
2915 attr = find_attr (&XSTR (exp, 0), 1);
2916 if (attr->default_val)
2918 error_with_line (lineno, "duplicate definition for attribute %s",
2920 message_with_line (attr->lineno, "previous definition");
2923 attr->lineno = lineno;
2925 if (*XSTR (exp, 1) == '\0')
2926 attr->is_numeric = 1;
2929 name_ptr = XSTR (exp, 1);
2930 while ((p = next_comma_elt (&name_ptr)) != NULL)
2932 av = oballoc (struct attr_value);
2933 av->value = attr_rtx (CONST_STRING, p);
2934 av->next = attr->first_value;
2935 attr->first_value = av;
2936 av->first_insn = NULL;
2938 av->has_asm_insn = 0;
2942 if (GET_CODE (XEXP (exp, 2)) == CONST)
2945 if (attr->is_numeric)
2946 error_with_line (lineno,
2947 "constant attributes may not take numeric values");
2949 /* Get rid of the CONST node. It is allowed only at top-level. */
2950 XEXP (exp, 2) = XEXP (XEXP (exp, 2), 0);
2953 if (! strcmp_check (attr->name, length_str) && ! attr->is_numeric)
2954 error_with_line (lineno, "`length' attribute must take numeric values");
2956 /* Set up the default value. */
2957 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
2958 attr->default_val = get_attr_value (XEXP (exp, 2), attr, -2);
2961 /* Given a pattern for DEFINE_PEEPHOLE or DEFINE_INSN, return the number of
2962 alternatives in the constraints. Assume all MATCH_OPERANDs have the same
2963 number of alternatives as this should be checked elsewhere. */
2966 count_alternatives (rtx exp)
2971 if (GET_CODE (exp) == MATCH_OPERAND)
2972 return n_comma_elts (XSTR (exp, 2));
2974 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
2975 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
2980 n = count_alternatives (XEXP (exp, i));
2987 if (XVEC (exp, i) != NULL)
2988 for (j = 0; j < XVECLEN (exp, i); j++)
2990 n = count_alternatives (XVECEXP (exp, i, j));
2999 /* Returns nonzero if the given expression contains an EQ_ATTR with the
3000 `alternative' attribute. */
3003 compares_alternatives_p (rtx exp)
3008 if (GET_CODE (exp) == EQ_ATTR && XSTR (exp, 0) == alternative_name)
3011 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3012 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3017 if (compares_alternatives_p (XEXP (exp, i)))
3022 for (j = 0; j < XVECLEN (exp, i); j++)
3023 if (compares_alternatives_p (XVECEXP (exp, i, j)))
3031 /* Process DEFINE_PEEPHOLE, DEFINE_INSN, and DEFINE_ASM_ATTRIBUTES. */
3034 gen_insn (rtx exp, int lineno)
3036 struct insn_def *id;
3038 id = oballoc (struct insn_def);
3042 id->lineno = lineno;
3044 switch (GET_CODE (exp))
3047 id->insn_code = insn_code_number;
3048 id->insn_index = insn_index_number;
3049 id->num_alternatives = count_alternatives (exp);
3050 if (id->num_alternatives == 0)
3051 id->num_alternatives = 1;
3055 case DEFINE_PEEPHOLE:
3056 id->insn_code = insn_code_number;
3057 id->insn_index = insn_index_number;
3058 id->num_alternatives = count_alternatives (exp);
3059 if (id->num_alternatives == 0)
3060 id->num_alternatives = 1;
3064 case DEFINE_ASM_ATTRIBUTES:
3066 id->insn_index = -1;
3067 id->num_alternatives = 1;
3069 got_define_asm_attributes = 1;
3077 /* Process a DEFINE_DELAY. Validate the vector length, check if annul
3078 true or annul false is specified, and make a `struct delay_desc'. */
3081 gen_delay (rtx def, int lineno)
3083 struct delay_desc *delay;
3086 if (XVECLEN (def, 1) % 3 != 0)
3088 error_with_line (lineno,
3089 "number of elements in DEFINE_DELAY must"
3090 " be multiple of three");
3094 for (i = 0; i < XVECLEN (def, 1); i += 3)
3096 if (XVECEXP (def, 1, i + 1))
3097 have_annul_true = 1;
3098 if (XVECEXP (def, 1, i + 2))
3099 have_annul_false = 1;
3102 delay = oballoc (struct delay_desc);
3104 delay->num = ++num_delays;
3105 delay->next = delays;
3106 delay->lineno = lineno;
3110 /* Given a piece of RTX, print a C expression to test its truth value.
3111 We use AND and IOR both for logical and bit-wise operations, so
3112 interpret them as logical unless they are inside a comparison expression.
3113 The first bit of FLAGS will be nonzero in that case.
3115 Set the second bit of FLAGS to make references to attribute values use
3116 a cached local variable instead of calling a function. */
3119 write_test_expr (rtx exp, int flags)
3121 int comparison_operator = 0;
3123 struct attr_desc *attr;
3125 /* In order not to worry about operator precedence, surround our part of
3126 the expression with parentheses. */
3129 code = GET_CODE (exp);
3132 /* Binary operators. */
3135 printf ("(unsigned) ");
3141 comparison_operator = 1;
3143 case PLUS: case MINUS: case MULT: case DIV: case MOD:
3144 case AND: case IOR: case XOR:
3145 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3146 write_test_expr (XEXP (exp, 0), flags | comparison_operator);
3162 printf (" >= (unsigned) ");
3165 printf (" > (unsigned) ");
3174 printf (" <= (unsigned) ");
3177 printf (" < (unsigned) ");
3220 write_test_expr (XEXP (exp, 1), flags | comparison_operator);
3224 /* Special-case (not (eq_attrq "alternative" "x")) */
3225 if (! (flags & 1) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
3226 && XSTR (XEXP (exp, 0), 0) == alternative_name)
3228 printf ("which_alternative != %s", XSTR (XEXP (exp, 0), 1));
3232 /* Otherwise, fall through to normal unary operator. */
3234 /* Unary operators. */
3254 write_test_expr (XEXP (exp, 0), flags);
3259 int set = XINT (exp, 0), bit = 0;
3262 fatal ("EQ_ATTR_ALT not valid inside comparison");
3265 fatal ("Empty EQ_ATTR_ALT should be optimized out");
3267 if (!(set & (set - 1)))
3269 if (!(set & 0xffff))
3292 printf ("which_alternative %s= %d",
3293 XINT (exp, 1) ? "!" : "=", bit);
3297 printf ("%s((1 << which_alternative) & %#x)",
3298 XINT (exp, 1) ? "!" : "", set);
3303 /* Comparison test of an attribute with a value. Most of these will
3304 have been removed by optimization. Handle "alternative"
3305 specially and give error if EQ_ATTR present inside a comparison. */
3308 fatal ("EQ_ATTR not valid inside comparison");
3310 if (XSTR (exp, 0) == alternative_name)
3312 printf ("which_alternative == %s", XSTR (exp, 1));
3316 attr = find_attr (&XSTR (exp, 0), 0);
3319 /* Now is the time to expand the value of a constant attribute. */
3322 write_test_expr (evaluate_eq_attr (exp, attr->default_val->value,
3329 printf ("attr_%s", attr->name);
3331 printf ("get_attr_%s (insn)", attr->name);
3333 write_attr_valueq (attr, XSTR (exp, 1));
3337 /* Comparison test of flags for define_delays. */
3340 fatal ("ATTR_FLAG not valid inside comparison");
3341 printf ("(flags & ATTR_FLAG_%s) != 0", XSTR (exp, 0));
3344 /* See if an operand matches a predicate. */
3346 /* If only a mode is given, just ensure the mode matches the operand.
3347 If neither a mode nor predicate is given, error. */
3348 if (XSTR (exp, 1) == NULL || *XSTR (exp, 1) == '\0')
3350 if (GET_MODE (exp) == VOIDmode)
3351 fatal ("null MATCH_OPERAND specified as test");
3353 printf ("GET_MODE (operands[%d]) == %smode",
3354 XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3357 printf ("%s (operands[%d], %smode)",
3358 XSTR (exp, 1), XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3361 /* Constant integer. */
3363 printf (HOST_WIDE_INT_PRINT_DEC, XWINT (exp, 0));
3366 /* A random C expression. */
3368 print_c_condition (XSTR (exp, 0));
3371 /* The address of the branch target. */
3373 printf ("INSN_ADDRESSES_SET_P () ? INSN_ADDRESSES (INSN_UID (GET_CODE (operands[%d]) == LABEL_REF ? XEXP (operands[%d], 0) : operands[%d])) : 0",
3374 XINT (exp, 0), XINT (exp, 0), XINT (exp, 0));
3378 /* The address of the current insn. We implement this actually as the
3379 address of the current insn for backward branches, but the last
3380 address of the next insn for forward branches, and both with
3381 adjustments that account for the worst-case possible stretching of
3382 intervening alignments between this insn and its destination. */
3383 printf ("insn_current_reference_address (insn)");
3387 printf ("%s", XSTR (exp, 0));
3391 write_test_expr (XEXP (exp, 0), flags & 2);
3393 write_test_expr (XEXP (exp, 1), flags | 1);
3395 write_test_expr (XEXP (exp, 2), flags | 1);
3399 fatal ("bad RTX code `%s' in attribute calculation\n",
3400 GET_RTX_NAME (code));
3406 /* Given an attribute value, return the maximum CONST_STRING argument
3407 encountered. Set *UNKNOWNP and return INT_MAX if the value is unknown. */
3410 max_attr_value (rtx exp, int *unknownp)
3415 switch (GET_CODE (exp))
3418 current_max = atoi (XSTR (exp, 0));
3422 current_max = max_attr_value (XEXP (exp, 1), unknownp);
3423 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3425 n = max_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3426 if (n > current_max)
3432 current_max = max_attr_value (XEXP (exp, 1), unknownp);
3433 n = max_attr_value (XEXP (exp, 2), unknownp);
3434 if (n > current_max)
3440 current_max = INT_MAX;
3447 /* Given an attribute value, return the minimum CONST_STRING argument
3448 encountered. Set *UNKNOWNP and return 0 if the value is unknown. */
3451 min_attr_value (rtx exp, int *unknownp)
3456 switch (GET_CODE (exp))
3459 current_min = atoi (XSTR (exp, 0));
3463 current_min = min_attr_value (XEXP (exp, 1), unknownp);
3464 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3466 n = min_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3467 if (n < current_min)
3473 current_min = min_attr_value (XEXP (exp, 1), unknownp);
3474 n = min_attr_value (XEXP (exp, 2), unknownp);
3475 if (n < current_min)
3481 current_min = INT_MAX;
3488 /* Given an attribute value, return the result of ORing together all
3489 CONST_STRING arguments encountered. Set *UNKNOWNP and return -1
3490 if the numeric value is not known. */
3493 or_attr_value (rtx exp, int *unknownp)
3498 switch (GET_CODE (exp))
3501 current_or = atoi (XSTR (exp, 0));
3505 current_or = or_attr_value (XEXP (exp, 1), unknownp);
3506 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3507 current_or |= or_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3511 current_or = or_attr_value (XEXP (exp, 1), unknownp);
3512 current_or |= or_attr_value (XEXP (exp, 2), unknownp);
3524 /* Scan an attribute value, possibly a conditional, and record what actions
3525 will be required to do any conditional tests in it.
3528 `must_extract' if we need to extract the insn operands
3529 `must_constrain' if we must compute `which_alternative'
3530 `address_used' if an address expression was used
3531 `length_used' if an (eq_attr "length" ...) was used
3535 walk_attr_value (rtx exp)
3544 code = GET_CODE (exp);
3548 if (! ATTR_IND_SIMPLIFIED_P (exp))
3549 /* Since this is an arbitrary expression, it can look at anything.
3550 However, constant expressions do not depend on any particular
3552 must_extract = must_constrain = 1;
3560 must_extract = must_constrain = 1;
3564 if (XSTR (exp, 0) == alternative_name)
3565 must_extract = must_constrain = 1;
3566 else if (strcmp_check (XSTR (exp, 0), length_str) == 0)
3586 for (i = 0, fmt = GET_RTX_FORMAT (code); i < GET_RTX_LENGTH (code); i++)
3591 walk_attr_value (XEXP (exp, i));
3595 if (XVEC (exp, i) != NULL)
3596 for (j = 0; j < XVECLEN (exp, i); j++)
3597 walk_attr_value (XVECEXP (exp, i, j));
3602 /* Write out a function to obtain the attribute for a given INSN. */
3605 write_attr_get (struct attr_desc *attr)
3607 struct attr_value *av, *common_av;
3609 /* Find the most used attribute value. Handle that as the `default' of the
3610 switch we will generate. */
3611 common_av = find_most_used (attr);
3613 /* Write out start of function, then all values with explicit `case' lines,
3614 then a `default', then the value with the most uses. */
3615 if (!attr->is_numeric)
3616 printf ("enum attr_%s\n", attr->name);
3620 /* If the attribute name starts with a star, the remainder is the name of
3621 the subroutine to use, instead of `get_attr_...'. */
3622 if (attr->name[0] == '*')
3623 printf ("%s (rtx insn ATTRIBUTE_UNUSED)\n", &attr->name[1]);
3624 else if (attr->is_const == 0)
3625 printf ("get_attr_%s (rtx insn ATTRIBUTE_UNUSED)\n", attr->name);
3628 printf ("get_attr_%s (void)\n", attr->name);
3631 for (av = attr->first_value; av; av = av->next)
3632 if (av->num_insns == 1)
3633 write_attr_set (attr, 2, av->value, "return", ";",
3634 true_rtx, av->first_insn->def->insn_code,
3635 av->first_insn->def->insn_index);
3636 else if (av->num_insns != 0)
3637 write_attr_set (attr, 2, av->value, "return", ";",
3645 printf (" switch (recog_memoized (insn))\n");
3648 for (av = attr->first_value; av; av = av->next)
3649 if (av != common_av)
3650 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
3652 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
3653 printf (" }\n}\n\n");
3656 /* Given an AND tree of known true terms (because we are inside an `if' with
3657 that as the condition or are in an `else' clause) and an expression,
3658 replace any known true terms with TRUE. Use `simplify_and_tree' to do
3659 the bulk of the work. */
3662 eliminate_known_true (rtx known_true, rtx exp, int insn_code, int insn_index)
3666 known_true = SIMPLIFY_TEST_EXP (known_true, insn_code, insn_index);
3668 if (GET_CODE (known_true) == AND)
3670 exp = eliminate_known_true (XEXP (known_true, 0), exp,
3671 insn_code, insn_index);
3672 exp = eliminate_known_true (XEXP (known_true, 1), exp,
3673 insn_code, insn_index);
3678 exp = simplify_and_tree (exp, &term, insn_code, insn_index);
3684 /* Write out a series of tests and assignment statements to perform tests and
3685 sets of an attribute value. We are passed an indentation amount and prefix
3686 and suffix strings to write around each attribute value (e.g., "return"
3690 write_attr_set (struct attr_desc *attr, int indent, rtx value,
3691 const char *prefix, const char *suffix, rtx known_true,
3692 int insn_code, int insn_index)
3694 if (GET_CODE (value) == COND)
3696 /* Assume the default value will be the default of the COND unless we
3697 find an always true expression. */
3698 rtx default_val = XEXP (value, 1);
3699 rtx our_known_true = known_true;
3704 for (i = 0; i < XVECLEN (value, 0); i += 2)
3709 testexp = eliminate_known_true (our_known_true,
3710 XVECEXP (value, 0, i),
3711 insn_code, insn_index);
3712 newexp = attr_rtx (NOT, testexp);
3713 newexp = insert_right_side (AND, our_known_true, newexp,
3714 insn_code, insn_index);
3716 /* If the test expression is always true or if the next `known_true'
3717 expression is always false, this is the last case, so break
3718 out and let this value be the `else' case. */
3719 if (testexp == true_rtx || newexp == false_rtx)
3721 default_val = XVECEXP (value, 0, i + 1);
3725 /* Compute the expression to pass to our recursive call as being
3727 inner_true = insert_right_side (AND, our_known_true,
3728 testexp, insn_code, insn_index);
3730 /* If this is always false, skip it. */
3731 if (inner_true == false_rtx)
3734 write_indent (indent);
3735 printf ("%sif ", first_if ? "" : "else ");
3737 write_test_expr (testexp, 0);
3739 write_indent (indent + 2);
3742 write_attr_set (attr, indent + 4,
3743 XVECEXP (value, 0, i + 1), prefix, suffix,
3744 inner_true, insn_code, insn_index);
3745 write_indent (indent + 2);
3747 our_known_true = newexp;
3752 write_indent (indent);
3754 write_indent (indent + 2);
3758 write_attr_set (attr, first_if ? indent : indent + 4, default_val,
3759 prefix, suffix, our_known_true, insn_code, insn_index);
3763 write_indent (indent + 2);
3769 write_indent (indent);
3770 printf ("%s ", prefix);
3771 write_attr_value (attr, value);
3772 printf ("%s\n", suffix);
3776 /* Write a series of case statements for every instruction in list IE.
3777 INDENT is the amount of indentation to write before each case. */
3780 write_insn_cases (struct insn_ent *ie, int indent)
3782 for (; ie != 0; ie = ie->next)
3783 if (ie->def->insn_code != -1)
3785 write_indent (indent);
3786 if (GET_CODE (ie->def->def) == DEFINE_PEEPHOLE)
3787 printf ("case %d: /* define_peephole, line %d */\n",
3788 ie->def->insn_code, ie->def->lineno);
3790 printf ("case %d: /* %s */\n",
3791 ie->def->insn_code, XSTR (ie->def->def, 0));
3795 /* Write out the computation for one attribute value. */
3798 write_attr_case (struct attr_desc *attr, struct attr_value *av,
3799 int write_case_lines, const char *prefix, const char *suffix,
3800 int indent, rtx known_true)
3802 if (av->num_insns == 0)
3805 if (av->has_asm_insn)
3807 write_indent (indent);
3808 printf ("case -1:\n");
3809 write_indent (indent + 2);
3810 printf ("if (GET_CODE (PATTERN (insn)) != ASM_INPUT\n");
3811 write_indent (indent + 2);
3812 printf (" && asm_noperands (PATTERN (insn)) < 0)\n");
3813 write_indent (indent + 2);
3814 printf (" fatal_insn_not_found (insn);\n");
3817 if (write_case_lines)
3818 write_insn_cases (av->first_insn, indent);
3821 write_indent (indent);
3822 printf ("default:\n");
3825 /* See what we have to do to output this value. */
3826 must_extract = must_constrain = address_used = 0;
3827 walk_attr_value (av->value);
3831 write_indent (indent + 2);
3832 printf ("extract_constrain_insn_cached (insn);\n");
3834 else if (must_extract)
3836 write_indent (indent + 2);
3837 printf ("extract_insn_cached (insn);\n");
3840 if (av->num_insns == 1)
3841 write_attr_set (attr, indent + 2, av->value, prefix, suffix,
3842 known_true, av->first_insn->def->insn_code,
3843 av->first_insn->def->insn_index);
3845 write_attr_set (attr, indent + 2, av->value, prefix, suffix,
3848 if (strncmp (prefix, "return", 6))
3850 write_indent (indent + 2);
3851 printf ("break;\n");
3856 /* Utilities to write in various forms. */
3859 write_attr_valueq (struct attr_desc *attr, const char *s)
3861 if (attr->is_numeric)
3867 if (num > 9 || num < 0)
3868 printf (" /* %#x */", num);
3872 write_upcase (attr->name);
3879 write_attr_value (struct attr_desc *attr, rtx value)
3883 switch (GET_CODE (value))
3886 write_attr_valueq (attr, XSTR (value, 0));
3890 printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (value));
3894 print_c_condition (XSTR (value, 0));
3899 struct attr_desc *attr2 = find_attr (&XSTR (value, 0), 0);
3900 printf ("get_attr_%s (%s)", attr2->name,
3901 (attr2->is_const ? "" : "insn"));
3922 write_attr_value (attr, XEXP (value, 0));
3926 write_attr_value (attr, XEXP (value, 1));
3935 write_upcase (const char *str)
3939 /* The argument of TOUPPER should not have side effects. */
3940 putchar (TOUPPER(*str));
3946 write_indent (int indent)
3948 for (; indent > 8; indent -= 8)
3951 for (; indent; indent--)
3955 /* Write a subroutine that is given an insn that requires a delay slot, a
3956 delay slot ordinal, and a candidate insn. It returns nonzero if the
3957 candidate can be placed in the specified delay slot of the insn.
3959 We can write as many as three subroutines. `eligible_for_delay'
3960 handles normal delay slots, `eligible_for_annul_true' indicates that
3961 the specified insn can be annulled if the branch is true, and likewise
3962 for `eligible_for_annul_false'.
3964 KIND is a string distinguishing these three cases ("delay", "annul_true",
3965 or "annul_false"). */
3968 write_eligible_delay (const char *kind)
3970 struct delay_desc *delay;
3974 struct attr_desc *attr;
3975 struct attr_value *av, *common_av;
3978 /* Compute the maximum number of delay slots required. We use the delay
3979 ordinal times this number plus one, plus the slot number as an index into
3980 the appropriate predicate to test. */
3982 for (delay = delays, max_slots = 0; delay; delay = delay->next)
3983 if (XVECLEN (delay->def, 1) / 3 > max_slots)
3984 max_slots = XVECLEN (delay->def, 1) / 3;
3986 /* Write function prelude. */
3989 printf ("eligible_for_%s (rtx delay_insn ATTRIBUTE_UNUSED, int slot, rtx candidate_insn, int flags ATTRIBUTE_UNUSED)\n",
3992 printf (" rtx insn;\n");
3994 printf (" gcc_assert (slot < %d);\n", max_slots);
3996 /* Allow dbr_schedule to pass labels, etc. This can happen if try_split
3997 converts a compound instruction into a loop. */
3998 printf (" if (!INSN_P (candidate_insn))\n");
3999 printf (" return 0;\n");
4002 /* If more than one delay type, find out which type the delay insn is. */
4006 attr = find_attr (&delay_type_str, 0);
4008 common_av = find_most_used (attr);
4010 printf (" insn = delay_insn;\n");
4011 printf (" switch (recog_memoized (insn))\n");
4014 sprintf (str, " * %d;\n break;", max_slots);
4015 for (av = attr->first_value; av; av = av->next)
4016 if (av != common_av)
4017 write_attr_case (attr, av, 1, "slot +=", str, 4, true_rtx);
4019 write_attr_case (attr, common_av, 0, "slot +=", str, 4, true_rtx);
4022 /* Ensure matched. Otherwise, shouldn't have been called. */
4023 printf (" gcc_assert (slot >= %d);\n\n", max_slots);
4026 /* If just one type of delay slot, write simple switch. */
4027 if (num_delays == 1 && max_slots == 1)
4029 printf (" insn = candidate_insn;\n");
4030 printf (" switch (recog_memoized (insn))\n");
4033 attr = find_attr (&delay_1_0_str, 0);
4035 common_av = find_most_used (attr);
4037 for (av = attr->first_value; av; av = av->next)
4038 if (av != common_av)
4039 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
4041 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
4047 /* Write a nested CASE. The first indicates which condition we need to
4048 test, and the inner CASE tests the condition. */
4049 printf (" insn = candidate_insn;\n");
4050 printf (" switch (slot)\n");
4053 for (delay = delays; delay; delay = delay->next)
4054 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
4056 printf (" case %d:\n",
4057 (i / 3) + (num_delays == 1 ? 0 : delay->num * max_slots));
4058 printf (" switch (recog_memoized (insn))\n");
4061 sprintf (str, "*%s_%d_%d", kind, delay->num, i / 3);
4063 attr = find_attr (&pstr, 0);
4065 common_av = find_most_used (attr);
4067 for (av = attr->first_value; av; av = av->next)
4068 if (av != common_av)
4069 write_attr_case (attr, av, 1, "return", ";", 8, true_rtx);
4071 write_attr_case (attr, common_av, 0, "return", ";", 8, true_rtx);
4075 printf (" default:\n");
4076 printf (" gcc_unreachable ();\n");
4083 /* This page contains miscellaneous utility routines. */
4085 /* Given a pointer to a (char *), return a malloc'ed string containing the
4086 next comma-separated element. Advance the pointer to after the string
4087 scanned, or the end-of-string. Return NULL if at end of string. */
4090 next_comma_elt (const char **pstr)
4094 start = scan_comma_elt (pstr);
4099 return attr_string (start, *pstr - start);
4102 /* Return a `struct attr_desc' pointer for a given named attribute. If CREATE
4103 is nonzero, build a new attribute, if one does not exist. *NAME_P is
4104 replaced by a pointer to a canonical copy of the string. */
4106 static struct attr_desc *
4107 find_attr (const char **name_p, int create)
4109 struct attr_desc *attr;
4111 const char *name = *name_p;
4113 /* Before we resort to using `strcmp', see if the string address matches
4114 anywhere. In most cases, it should have been canonicalized to do so. */
4115 if (name == alternative_name)
4118 index = name[0] & (MAX_ATTRS_INDEX - 1);
4119 for (attr = attrs[index]; attr; attr = attr->next)
4120 if (name == attr->name)
4123 /* Otherwise, do it the slow way. */
4124 for (attr = attrs[index]; attr; attr = attr->next)
4125 if (name[0] == attr->name[0] && ! strcmp (name, attr->name))
4127 *name_p = attr->name;
4134 attr = oballoc (struct attr_desc);
4135 attr->name = DEF_ATTR_STRING (name);
4136 attr->first_value = attr->default_val = NULL;
4137 attr->is_numeric = attr->is_const = attr->is_special = 0;
4138 attr->next = attrs[index];
4139 attrs[index] = attr;
4141 *name_p = attr->name;
4146 /* Create internal attribute with the given default value. */
4149 make_internal_attr (const char *name, rtx value, int special)
4151 struct attr_desc *attr;
4153 attr = find_attr (&name, 1);
4154 gcc_assert (!attr->default_val);
4156 attr->is_numeric = 1;
4158 attr->is_special = (special & ATTR_SPECIAL) != 0;
4159 attr->default_val = get_attr_value (value, attr, -2);
4162 /* Find the most used value of an attribute. */
4164 static struct attr_value *
4165 find_most_used (struct attr_desc *attr)
4167 struct attr_value *av;
4168 struct attr_value *most_used;
4174 for (av = attr->first_value; av; av = av->next)
4175 if (av->num_insns > nuses)
4176 nuses = av->num_insns, most_used = av;
4181 /* Return (attr_value "n") */
4184 make_numeric_value (int n)
4186 static rtx int_values[20];
4190 gcc_assert (n >= 0);
4192 if (n < 20 && int_values[n])
4193 return int_values[n];
4195 p = attr_printf (MAX_DIGITS, "%d", n);
4196 exp = attr_rtx (CONST_STRING, p);
4199 int_values[n] = exp;
4205 copy_rtx_unchanging (rtx orig)
4207 if (ATTR_IND_SIMPLIFIED_P (orig) || ATTR_CURR_SIMPLIFIED_P (orig))
4210 ATTR_CURR_SIMPLIFIED_P (orig) = 1;
4214 /* Determine if an insn has a constant number of delay slots, i.e., the
4215 number of delay slots is not a function of the length of the insn. */
4218 write_const_num_delay_slots (void)
4220 struct attr_desc *attr = find_attr (&num_delay_slots_str, 0);
4221 struct attr_value *av;
4225 printf ("int\nconst_num_delay_slots (rtx insn)\n");
4227 printf (" switch (recog_memoized (insn))\n");
4230 for (av = attr->first_value; av; av = av->next)
4233 walk_attr_value (av->value);
4235 write_insn_cases (av->first_insn, 4);
4238 printf (" default:\n");
4239 printf (" return 1;\n");
4240 printf (" }\n}\n\n");
4244 /* Synthetic attributes used by insn-automata.c and the scheduler.
4245 These are primarily concerned with (define_insn_reservation)
4250 struct insn_reserv *next;
4253 int default_latency;
4256 /* Sequence number of this insn. */
4259 /* Whether a (define_bypass) construct names this insn in its
4264 static struct insn_reserv *all_insn_reservs = 0;
4265 static struct insn_reserv **last_insn_reserv_p = &all_insn_reservs;
4266 static size_t n_insn_reservs;
4268 /* Store information from a DEFINE_INSN_RESERVATION for future
4269 attribute generation. */
4271 gen_insn_reserv (rtx def)
4273 struct insn_reserv *decl = oballoc (struct insn_reserv);
4275 decl->name = DEF_ATTR_STRING (XSTR (def, 0));
4276 decl->default_latency = XINT (def, 1);
4277 decl->condexp = check_attr_test (XEXP (def, 2), 0, 0);
4278 decl->insn_num = n_insn_reservs;
4279 decl->bypassed = false;
4282 *last_insn_reserv_p = decl;
4283 last_insn_reserv_p = &decl->next;
4287 /* Store information from a DEFINE_BYPASS for future attribute
4288 generation. The only thing we care about is the list of output
4289 insns, which will later be used to tag reservation structures with
4290 a 'bypassed' bit. */
4294 struct bypass_list *next;
4298 static struct bypass_list *all_bypasses;
4299 static size_t n_bypasses;
4302 gen_bypass_1 (const char *s, size_t len)
4304 struct bypass_list *b;
4309 s = attr_string (s, len);
4310 for (b = all_bypasses; b; b = b->next)
4312 return; /* already got that one */
4314 b = oballoc (struct bypass_list);
4316 b->next = all_bypasses;
4322 gen_bypass (rtx def)
4324 const char *p, *base;
4326 for (p = base = XSTR (def, 1); *p; p++)
4329 gen_bypass_1 (base, p - base);
4332 while (ISSPACE (*p));
4335 gen_bypass_1 (base, p - base);
4338 /* Find and mark all of the bypassed insns. */
4340 process_bypasses (void)
4342 struct bypass_list *b;
4343 struct insn_reserv *r;
4345 /* The reservation list is likely to be much longer than the bypass
4347 for (r = all_insn_reservs; r; r = r->next)
4348 for (b = all_bypasses; b; b = b->next)
4349 if (r->name == b->insn)
4353 /* Create all of the attributes that describe automaton properties. */
4355 make_automaton_attrs (void)
4358 struct insn_reserv *decl;
4359 rtx code_exp, lats_exp, byps_exp;
4361 if (n_insn_reservs == 0)
4364 code_exp = rtx_alloc (COND);
4365 lats_exp = rtx_alloc (COND);
4367 XVEC (code_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
4368 XVEC (lats_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
4370 XEXP (code_exp, 1) = make_numeric_value (n_insn_reservs + 1);
4371 XEXP (lats_exp, 1) = make_numeric_value (0);
4373 for (decl = all_insn_reservs, i = 0;
4375 decl = decl->next, i += 2)
4377 XVECEXP (code_exp, 0, i) = decl->condexp;
4378 XVECEXP (lats_exp, 0, i) = decl->condexp;
4380 XVECEXP (code_exp, 0, i+1) = make_numeric_value (decl->insn_num);
4381 XVECEXP (lats_exp, 0, i+1) = make_numeric_value (decl->default_latency);
4384 if (n_bypasses == 0)
4385 byps_exp = make_numeric_value (0);
4388 process_bypasses ();
4390 byps_exp = rtx_alloc (COND);
4391 XVEC (byps_exp, 0) = rtvec_alloc (n_bypasses * 2);
4392 XEXP (byps_exp, 1) = make_numeric_value (0);
4393 for (decl = all_insn_reservs, i = 0;
4398 XVECEXP (byps_exp, 0, i) = decl->condexp;
4399 XVECEXP (byps_exp, 0, i+1) = make_numeric_value (1);
4404 make_internal_attr ("*internal_dfa_insn_code", code_exp, ATTR_NONE);
4405 make_internal_attr ("*insn_default_latency", lats_exp, ATTR_NONE);
4406 make_internal_attr ("*bypass_p", byps_exp, ATTR_NONE);
4410 main (int argc, char **argv)
4413 struct attr_desc *attr;
4414 struct insn_def *id;
4418 progname = "genattrtab";
4420 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
4421 return (FATAL_EXIT_CODE);
4423 obstack_init (hash_obstack);
4424 obstack_init (temp_obstack);
4426 /* Set up true and false rtx's */
4427 true_rtx = rtx_alloc (CONST_INT);
4428 XWINT (true_rtx, 0) = 1;
4429 false_rtx = rtx_alloc (CONST_INT);
4430 XWINT (false_rtx, 0) = 0;
4431 ATTR_IND_SIMPLIFIED_P (true_rtx) = ATTR_IND_SIMPLIFIED_P (false_rtx) = 1;
4432 ATTR_PERMANENT_P (true_rtx) = ATTR_PERMANENT_P (false_rtx) = 1;
4434 alternative_name = DEF_ATTR_STRING ("alternative");
4435 length_str = DEF_ATTR_STRING ("length");
4436 delay_type_str = DEF_ATTR_STRING ("*delay_type");
4437 delay_1_0_str = DEF_ATTR_STRING ("*delay_1_0");
4438 num_delay_slots_str = DEF_ATTR_STRING ("*num_delay_slots");
4440 printf ("/* Generated automatically by the program `genattrtab'\n\
4441 from the machine description file `md'. */\n\n");
4443 /* Read the machine description. */
4449 desc = read_md_rtx (&lineno, &insn_code_number);
4453 switch (GET_CODE (desc))
4456 case DEFINE_PEEPHOLE:
4457 case DEFINE_ASM_ATTRIBUTES:
4458 gen_insn (desc, lineno);
4462 gen_attr (desc, lineno);
4466 gen_delay (desc, lineno);
4469 case DEFINE_INSN_RESERVATION:
4470 gen_insn_reserv (desc);
4480 if (GET_CODE (desc) != DEFINE_ASM_ATTRIBUTES)
4481 insn_index_number++;
4485 return FATAL_EXIT_CODE;
4489 /* If we didn't have a DEFINE_ASM_ATTRIBUTES, make a null one. */
4490 if (! got_define_asm_attributes)
4492 tem = rtx_alloc (DEFINE_ASM_ATTRIBUTES);
4493 XVEC (tem, 0) = rtvec_alloc (0);
4497 /* Expand DEFINE_DELAY information into new attribute. */
4501 printf ("#include \"config.h\"\n");
4502 printf ("#include \"system.h\"\n");
4503 printf ("#include \"coretypes.h\"\n");
4504 printf ("#include \"tm.h\"\n");
4505 printf ("#include \"rtl.h\"\n");
4506 printf ("#include \"insn-attr.h\"\n");
4507 printf ("#include \"tm_p.h\"\n");
4508 printf ("#include \"insn-config.h\"\n");
4509 printf ("#include \"recog.h\"\n");
4510 printf ("#include \"regs.h\"\n");
4511 printf ("#include \"output.h\"\n");
4512 printf ("#include \"toplev.h\"\n");
4513 printf ("#include \"flags.h\"\n");
4514 printf ("#include \"function.h\"\n");
4516 printf ("#define operands recog_data.operand\n\n");
4518 /* Make `insn_alternatives'. */
4519 insn_alternatives = oballocvec (int, insn_code_number);
4520 for (id = defs; id; id = id->next)
4521 if (id->insn_code >= 0)
4522 insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1;
4524 /* Make `insn_n_alternatives'. */
4525 insn_n_alternatives = oballocvec (int, insn_code_number);
4526 for (id = defs; id; id = id->next)
4527 if (id->insn_code >= 0)
4528 insn_n_alternatives[id->insn_code] = id->num_alternatives;
4530 /* Construct extra attributes for automata. */
4531 make_automaton_attrs ();
4533 /* Prepare to write out attribute subroutines by checking everything stored
4534 away and building the attribute cases. */
4538 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4539 for (attr = attrs[i]; attr; attr = attr->next)
4540 attr->default_val->value
4541 = check_attr_value (attr->default_val->value, attr);
4544 return FATAL_EXIT_CODE;
4546 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4547 for (attr = attrs[i]; attr; attr = attr->next)
4550 /* Construct extra attributes for `length'. */
4551 make_length_attrs ();
4553 /* Perform any possible optimizations to speed up compilation. */
4556 /* Now write out all the `gen_attr_...' routines. Do these before the
4557 special routines so that they get defined before they are used. */
4559 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4560 for (attr = attrs[i]; attr; attr = attr->next)
4562 if (! attr->is_special && ! attr->is_const)
4563 write_attr_get (attr);
4566 /* Write out delay eligibility information, if DEFINE_DELAY present.
4567 (The function to compute the number of delay slots will be written
4571 write_eligible_delay ("delay");
4572 if (have_annul_true)
4573 write_eligible_delay ("annul_true");
4574 if (have_annul_false)
4575 write_eligible_delay ("annul_false");
4578 /* Write out constant delay slot info. */
4579 write_const_num_delay_slots ();
4581 write_length_unit_log ();
4584 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);