OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / genattrtab.c
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, 2010
4    Free Software Foundation, Inc.
5    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6
7 This file is part of GCC.
8
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
12 version.
13
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
17 for more details.
18
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/>.  */
22
23 /* This program handles insn attributes and the DEFINE_DELAY and
24    DEFINE_INSN_RESERVATION definitions.
25
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.
29
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
34    expression).
35
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.
39
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
47    `get_attr_length'.
48
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
54    used.
55
56    Internal attributes are defined to handle DEFINE_DELAY and
57    DEFINE_INSN_RESERVATION.  Special routines are output for these cases.
58
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.
62
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.
67
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.
72
73    The strategy used when processing DEFINE_DELAY definitions is to create
74    arbitrarily complex expressions and have the optimization simplify them.
75
76    Once optimization is complete, any required routines and definitions
77    will be written.
78
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).
86
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
93       (see attr_rtx).  */
94
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))
98
99 #if 0
100 #define strcmp_check(S1, S2) ((S1) == (S2)              \
101                               ? 0                       \
102                               : (gcc_assert (strcmp ((S1), (S2))), 1))
103 #else
104 #define strcmp_check(S1, S2) ((S1) != (S2))
105 #endif
106
107 #include "bconfig.h"
108 #include "system.h"
109 #include "coretypes.h"
110 #include "tm.h"
111 #include "rtl.h"
112 #include "obstack.h"
113 #include "errors.h"
114 #include "read-md.h"
115 #include "gensupport.h"
116 #include "vecprim.h"
117 #include "fnmatch.h"
118
119 /* Flags for make_internal_attr's `special' parameter.  */
120 #define ATTR_NONE               0
121 #define ATTR_SPECIAL            (1 << 0)
122
123 static struct obstack obstack1, obstack2;
124 static struct obstack *hash_obstack = &obstack1;
125 static struct obstack *temp_obstack = &obstack2;
126
127 /* enough space to reserve for printing out ints */
128 #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
129
130 /* Define structures used to record attributes and values.  */
131
132 /* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is
133    encountered, we store all the relevant information into a
134    `struct insn_def'.  This is done to allow attribute definitions to occur
135    anywhere in the file.  */
136
137 struct insn_def
138 {
139   struct insn_def *next;        /* Next insn in chain.  */
140   rtx def;                      /* The DEFINE_...  */
141   int insn_code;                /* Instruction number.  */
142   int insn_index;               /* Expression number in file, for errors.  */
143   int lineno;                   /* Line number.  */
144   int num_alternatives;         /* Number of alternatives.  */
145   int vec_idx;                  /* Index of attribute vector in `def'.  */
146 };
147
148 /* Once everything has been read in, we store in each attribute value a list
149    of insn codes that have that value.  Here is the structure used for the
150    list.  */
151
152 struct insn_ent
153 {
154   struct insn_ent *next;        /* Next in chain.  */
155   struct insn_def *def;         /* Instruction definition.  */
156 };
157
158 /* Each value of an attribute (either constant or computed) is assigned a
159    structure which is used as the listhead of the insns that have that
160    value.  */
161
162 struct attr_value
163 {
164   rtx value;                    /* Value of attribute.  */
165   struct attr_value *next;      /* Next attribute value in chain.  */
166   struct insn_ent *first_insn;  /* First insn with this value.  */
167   int num_insns;                /* Number of insns with this value.  */
168   int has_asm_insn;             /* True if this value used for `asm' insns */
169 };
170
171 /* Structure for each attribute.  */
172
173 struct attr_desc
174 {
175   char *name;                   /* Name of attribute.  */
176   const char *enum_name;        /* Enum name for DEFINE_ENUM_NAME.  */
177   struct attr_desc *next;       /* Next attribute.  */
178   struct attr_value *first_value; /* First value of this attribute.  */
179   struct attr_value *default_val; /* Default value for this attribute.  */
180   int lineno : 24;              /* Line number.  */
181   unsigned is_numeric   : 1;    /* Values of this attribute are numeric.  */
182   unsigned is_const     : 1;    /* Attribute value constant for each run.  */
183   unsigned is_special   : 1;    /* Don't call `write_attr_set'.  */
184 };
185
186 /* Structure for each DEFINE_DELAY.  */
187
188 struct delay_desc
189 {
190   rtx def;                      /* DEFINE_DELAY expression.  */
191   struct delay_desc *next;      /* Next DEFINE_DELAY.  */
192   int num;                      /* Number of DEFINE_DELAY, starting at 1.  */
193   int lineno;                   /* Line number.  */
194 };
195
196 struct attr_value_list
197 {
198   struct attr_value *av;
199   struct insn_ent *ie;
200   struct attr_desc *attr;
201   struct attr_value_list *next;
202 };
203
204 /* Listheads of above structures.  */
205
206 /* This one is indexed by the first character of the attribute name.  */
207 #define MAX_ATTRS_INDEX 256
208 static struct attr_desc *attrs[MAX_ATTRS_INDEX];
209 static struct insn_def *defs;
210 static struct delay_desc *delays;
211 struct attr_value_list **insn_code_values;
212
213 /* Other variables.  */
214
215 static int insn_code_number;
216 static int insn_index_number;
217 static int got_define_asm_attributes;
218 static int must_extract;
219 static int must_constrain;
220 static int address_used;
221 static int length_used;
222 static int num_delays;
223 static int have_annul_true, have_annul_false;
224 static int num_insn_ents;
225
226 /* Stores, for each insn code, the number of constraint alternatives.  */
227
228 static int *insn_n_alternatives;
229
230 /* Stores, for each insn code, a bitmap that has bits on for each possible
231    alternative.  */
232
233 static int *insn_alternatives;
234
235 /* Used to simplify expressions.  */
236
237 static rtx true_rtx, false_rtx;
238
239 /* Used to reduce calls to `strcmp' */
240
241 static const char *alternative_name;
242 static const char *length_str;
243 static const char *delay_type_str;
244 static const char *delay_1_0_str;
245 static const char *num_delay_slots_str;
246
247 /* Simplify an expression.  Only call the routine if there is something to
248    simplify.  */
249 #define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX)     \
250   (ATTR_IND_SIMPLIFIED_P (EXP) || ATTR_CURR_SIMPLIFIED_P (EXP) ? (EXP)  \
251    : simplify_test_exp (EXP, INSN_CODE, INSN_INDEX))
252
253 #define DEF_ATTR_STRING(S) (attr_string ((S), strlen (S)))
254
255 /* Forward declarations of functions used before their definitions, only.  */
256 static char *attr_string           (const char *, int);
257 static char *attr_printf           (unsigned int, const char *, ...)
258   ATTRIBUTE_PRINTF_2;
259 static rtx make_numeric_value      (int);
260 static struct attr_desc *find_attr (const char **, int);
261 static rtx mk_attr_alt             (int);
262 static char *next_comma_elt        (const char **);
263 static rtx insert_right_side       (enum rtx_code, rtx, rtx, int, int);
264 static rtx copy_boolean            (rtx);
265 static int compares_alternatives_p (rtx);
266 static void make_internal_attr     (const char *, rtx, int);
267 static void insert_insn_ent        (struct attr_value *, struct insn_ent *);
268 static void walk_attr_value        (rtx);
269 static int max_attr_value          (rtx, int*);
270 static int min_attr_value          (rtx, int*);
271 static int or_attr_value           (rtx, int*);
272 static rtx simplify_test_exp       (rtx, int, int);
273 static rtx simplify_test_exp_in_temp (rtx, int, int);
274 static rtx copy_rtx_unchanging     (rtx);
275 static bool attr_alt_subset_p      (rtx, rtx);
276 static bool attr_alt_subset_of_compl_p (rtx, rtx);
277 static void clear_struct_flag      (rtx);
278 static void write_attr_valueq      (struct attr_desc *, const char *);
279 static struct attr_value *find_most_used  (struct attr_desc *);
280 static void write_attr_set         (struct attr_desc *, int, rtx,
281                                     const char *, const char *, rtx,
282                                     int, int, unsigned int);
283 static void write_attr_case        (struct attr_desc *, struct attr_value *,
284                                     int, const char *, const char *, int, rtx);
285 static void write_attr_value       (struct attr_desc *, rtx);
286 static void write_upcase           (const char *);
287 static void write_indent           (int);
288 static rtx identity_fn             (rtx);
289 static rtx zero_fn                 (rtx);
290 static rtx one_fn                  (rtx);
291 static rtx max_fn                  (rtx);
292 static rtx min_fn                  (rtx);
293
294 #define oballoc(T) XOBNEW (hash_obstack, T)
295 #define oballocvec(T, N) XOBNEWVEC (hash_obstack, T, (N))
296
297 /* Hash table for sharing RTL and strings.  */
298
299 /* Each hash table slot is a bucket containing a chain of these structures.
300    Strings are given negative hash codes; RTL expressions are given positive
301    hash codes.  */
302
303 struct attr_hash
304 {
305   struct attr_hash *next;       /* Next structure in the bucket.  */
306   int hashcode;                 /* Hash code of this rtx or string.  */
307   union
308     {
309       char *str;                /* The string (negative hash codes) */
310       rtx rtl;                  /* or the RTL recorded here.  */
311     } u;
312 };
313
314 /* Now here is the hash table.  When recording an RTL, it is added to
315    the slot whose index is the hash code mod the table size.  Note
316    that the hash table is used for several kinds of RTL (see attr_rtx)
317    and for strings.  While all these live in the same table, they are
318    completely independent, and the hash code is computed differently
319    for each.  */
320
321 #define RTL_HASH_SIZE 4093
322 static struct attr_hash *attr_hash_table[RTL_HASH_SIZE];
323
324 /* Here is how primitive or already-shared RTL's hash
325    codes are made.  */
326 #define RTL_HASH(RTL) ((intptr_t) (RTL) & 0777777)
327
328 /* Add an entry to the hash table for RTL with hash code HASHCODE.  */
329
330 static void
331 attr_hash_add_rtx (int hashcode, rtx rtl)
332 {
333   struct attr_hash *h;
334
335   h = XOBNEW (hash_obstack, struct attr_hash);
336   h->hashcode = hashcode;
337   h->u.rtl = rtl;
338   h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
339   attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
340 }
341
342 /* Add an entry to the hash table for STRING with hash code HASHCODE.  */
343
344 static void
345 attr_hash_add_string (int hashcode, char *str)
346 {
347   struct attr_hash *h;
348
349   h = XOBNEW (hash_obstack, struct attr_hash);
350   h->hashcode = -hashcode;
351   h->u.str = str;
352   h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
353   attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
354 }
355
356 /* Generate an RTL expression, but avoid duplicates.
357    Set the ATTR_PERMANENT_P flag for these permanent objects.
358
359    In some cases we cannot uniquify; then we return an ordinary
360    impermanent rtx with ATTR_PERMANENT_P clear.
361
362    Args are as follows:
363
364    rtx attr_rtx (code, [element1, ..., elementn])  */
365
366 static rtx
367 attr_rtx_1 (enum rtx_code code, va_list p)
368 {
369   rtx rt_val = NULL_RTX;/* RTX to return to caller...           */
370   int hashcode;
371   struct attr_hash *h;
372   struct obstack *old_obstack = rtl_obstack;
373
374   /* For each of several cases, search the hash table for an existing entry.
375      Use that entry if one is found; otherwise create a new RTL and add it
376      to the table.  */
377
378   if (GET_RTX_CLASS (code) == RTX_UNARY)
379     {
380       rtx arg0 = va_arg (p, rtx);
381
382       /* A permanent object cannot point to impermanent ones.  */
383       if (! ATTR_PERMANENT_P (arg0))
384         {
385           rt_val = rtx_alloc (code);
386           XEXP (rt_val, 0) = arg0;
387           return rt_val;
388         }
389
390       hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
391       for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
392         if (h->hashcode == hashcode
393             && GET_CODE (h->u.rtl) == code
394             && XEXP (h->u.rtl, 0) == arg0)
395           return h->u.rtl;
396
397       if (h == 0)
398         {
399           rtl_obstack = hash_obstack;
400           rt_val = rtx_alloc (code);
401           XEXP (rt_val, 0) = arg0;
402         }
403     }
404   else if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
405            || GET_RTX_CLASS (code) == RTX_COMM_ARITH
406            || GET_RTX_CLASS (code) == RTX_COMPARE
407            || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
408     {
409       rtx arg0 = va_arg (p, rtx);
410       rtx arg1 = va_arg (p, rtx);
411
412       /* A permanent object cannot point to impermanent ones.  */
413       if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1))
414         {
415           rt_val = rtx_alloc (code);
416           XEXP (rt_val, 0) = arg0;
417           XEXP (rt_val, 1) = arg1;
418           return rt_val;
419         }
420
421       hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
422       for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
423         if (h->hashcode == hashcode
424             && GET_CODE (h->u.rtl) == code
425             && XEXP (h->u.rtl, 0) == arg0
426             && XEXP (h->u.rtl, 1) == arg1)
427           return h->u.rtl;
428
429       if (h == 0)
430         {
431           rtl_obstack = hash_obstack;
432           rt_val = rtx_alloc (code);
433           XEXP (rt_val, 0) = arg0;
434           XEXP (rt_val, 1) = arg1;
435         }
436     }
437   else if (code == SYMBOL_REF
438            || (GET_RTX_LENGTH (code) == 1
439                && GET_RTX_FORMAT (code)[0] == 's'))
440     {
441       char *arg0 = va_arg (p, char *);
442
443       arg0 = DEF_ATTR_STRING (arg0);
444
445       hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
446       for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
447         if (h->hashcode == hashcode
448             && GET_CODE (h->u.rtl) == code
449             && XSTR (h->u.rtl, 0) == arg0)
450           return h->u.rtl;
451
452       if (h == 0)
453         {
454           rtl_obstack = hash_obstack;
455           rt_val = rtx_alloc (code);
456           XSTR (rt_val, 0) = arg0;
457           if (code == SYMBOL_REF)
458             {
459               X0EXP (rt_val, 1) = NULL_RTX;
460               X0EXP (rt_val, 2) = NULL_RTX;
461             }
462         }
463     }
464   else if (GET_RTX_LENGTH (code) == 2
465            && GET_RTX_FORMAT (code)[0] == 's'
466            && GET_RTX_FORMAT (code)[1] == 's')
467     {
468       char *arg0 = va_arg (p, char *);
469       char *arg1 = va_arg (p, char *);
470
471       hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
472       for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
473         if (h->hashcode == hashcode
474             && GET_CODE (h->u.rtl) == code
475             && XSTR (h->u.rtl, 0) == arg0
476             && XSTR (h->u.rtl, 1) == arg1)
477           return h->u.rtl;
478
479       if (h == 0)
480         {
481           rtl_obstack = hash_obstack;
482           rt_val = rtx_alloc (code);
483           XSTR (rt_val, 0) = arg0;
484           XSTR (rt_val, 1) = arg1;
485         }
486     }
487   else if (code == CONST_INT)
488     {
489       HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
490       if (arg0 == 0)
491         return false_rtx;
492       else if (arg0 == 1)
493         return true_rtx;
494       else
495         goto nohash;
496     }
497   else
498     {
499       int i;            /* Array indices...                     */
500       const char *fmt;  /* Current rtx's format...              */
501     nohash:
502       rt_val = rtx_alloc (code);        /* Allocate the storage space.  */
503
504       fmt = GET_RTX_FORMAT (code);      /* Find the right format...  */
505       for (i = 0; i < GET_RTX_LENGTH (code); i++)
506         {
507           switch (*fmt++)
508             {
509             case '0':           /* Unused field.  */
510               break;
511
512             case 'i':           /* An integer?  */
513               XINT (rt_val, i) = va_arg (p, int);
514               break;
515
516             case 'w':           /* A wide integer? */
517               XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
518               break;
519
520             case 's':           /* A string?  */
521               XSTR (rt_val, i) = va_arg (p, char *);
522               break;
523
524             case 'e':           /* An expression?  */
525             case 'u':           /* An insn?  Same except when printing.  */
526               XEXP (rt_val, i) = va_arg (p, rtx);
527               break;
528
529             case 'E':           /* An RTX vector?  */
530               XVEC (rt_val, i) = va_arg (p, rtvec);
531               break;
532
533             default:
534               gcc_unreachable ();
535             }
536         }
537       return rt_val;
538     }
539
540   rtl_obstack = old_obstack;
541   attr_hash_add_rtx (hashcode, rt_val);
542   ATTR_PERMANENT_P (rt_val) = 1;
543   return rt_val;
544 }
545
546 static rtx
547 attr_rtx (enum rtx_code code, ...)
548 {
549   rtx result;
550   va_list p;
551
552   va_start (p, code);
553   result = attr_rtx_1 (code, p);
554   va_end (p);
555   return result;
556 }
557
558 /* Create a new string printed with the printf line arguments into a space
559    of at most LEN bytes:
560
561    rtx attr_printf (len, format, [arg1, ..., argn])  */
562
563 static char *
564 attr_printf (unsigned int len, const char *fmt, ...)
565 {
566   char str[256];
567   va_list p;
568
569   va_start (p, fmt);
570
571   gcc_assert (len < sizeof str); /* Leave room for \0.  */
572
573   vsprintf (str, fmt, p);
574   va_end (p);
575
576   return DEF_ATTR_STRING (str);
577 }
578
579 static rtx
580 attr_eq (const char *name, const char *value)
581 {
582   return attr_rtx (EQ_ATTR, DEF_ATTR_STRING (name), DEF_ATTR_STRING (value));
583 }
584
585 static const char *
586 attr_numeral (int n)
587 {
588   return XSTR (make_numeric_value (n), 0);
589 }
590
591 /* Return a permanent (possibly shared) copy of a string STR (not assumed
592    to be null terminated) with LEN bytes.  */
593
594 static char *
595 attr_string (const char *str, int len)
596 {
597   struct attr_hash *h;
598   int hashcode;
599   int i;
600   char *new_str;
601
602   /* Compute the hash code.  */
603   hashcode = (len + 1) * 613 + (unsigned) str[0];
604   for (i = 1; i < len; i += 2)
605     hashcode = ((hashcode * 613) + (unsigned) str[i]);
606   if (hashcode < 0)
607     hashcode = -hashcode;
608
609   /* Search the table for the string.  */
610   for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
611     if (h->hashcode == -hashcode && h->u.str[0] == str[0]
612         && !strncmp (h->u.str, str, len))
613       return h->u.str;                  /* <-- return if found.  */
614
615   /* Not found; create a permanent copy and add it to the hash table.  */
616   new_str = XOBNEWVAR (hash_obstack, char, len + 1);
617   memcpy (new_str, str, len);
618   new_str[len] = '\0';
619   attr_hash_add_string (hashcode, new_str);
620   copy_md_ptr_loc (new_str, str);
621
622   return new_str;                       /* Return the new string.  */
623 }
624
625 /* Check two rtx's for equality of contents,
626    taking advantage of the fact that if both are hashed
627    then they can't be equal unless they are the same object.  */
628
629 static int
630 attr_equal_p (rtx x, rtx y)
631 {
632   return (x == y || (! (ATTR_PERMANENT_P (x) && ATTR_PERMANENT_P (y))
633                      && rtx_equal_p (x, y)));
634 }
635
636 /* Copy an attribute value expression,
637    descending to all depths, but not copying any
638    permanent hashed subexpressions.  */
639
640 static rtx
641 attr_copy_rtx (rtx orig)
642 {
643   rtx copy;
644   int i, j;
645   RTX_CODE code;
646   const char *format_ptr;
647
648   /* No need to copy a permanent object.  */
649   if (ATTR_PERMANENT_P (orig))
650     return orig;
651
652   code = GET_CODE (orig);
653
654   switch (code)
655     {
656     case REG:
657     case CONST_INT:
658     case CONST_DOUBLE:
659     case CONST_VECTOR:
660     case SYMBOL_REF:
661     case MATCH_TEST:
662     case CODE_LABEL:
663     case PC:
664     case CC0:
665       return orig;
666
667     default:
668       break;
669     }
670
671   copy = rtx_alloc (code);
672   PUT_MODE (copy, GET_MODE (orig));
673   ATTR_IND_SIMPLIFIED_P (copy) = ATTR_IND_SIMPLIFIED_P (orig);
674   ATTR_CURR_SIMPLIFIED_P (copy) = ATTR_CURR_SIMPLIFIED_P (orig);
675   ATTR_PERMANENT_P (copy) = ATTR_PERMANENT_P (orig);
676
677   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
678
679   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
680     {
681       switch (*format_ptr++)
682         {
683         case 'e':
684           XEXP (copy, i) = XEXP (orig, i);
685           if (XEXP (orig, i) != NULL)
686             XEXP (copy, i) = attr_copy_rtx (XEXP (orig, i));
687           break;
688
689         case 'E':
690         case 'V':
691           XVEC (copy, i) = XVEC (orig, i);
692           if (XVEC (orig, i) != NULL)
693             {
694               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
695               for (j = 0; j < XVECLEN (copy, i); j++)
696                 XVECEXP (copy, i, j) = attr_copy_rtx (XVECEXP (orig, i, j));
697             }
698           break;
699
700         case 'n':
701         case 'i':
702           XINT (copy, i) = XINT (orig, i);
703           break;
704
705         case 'w':
706           XWINT (copy, i) = XWINT (orig, i);
707           break;
708
709         case 's':
710         case 'S':
711           XSTR (copy, i) = XSTR (orig, i);
712           break;
713
714         default:
715           gcc_unreachable ();
716         }
717     }
718   return copy;
719 }
720
721 /* Given a test expression for an attribute, ensure it is validly formed.
722    IS_CONST indicates whether the expression is constant for each compiler
723    run (a constant expression may not test any particular insn).
724
725    Convert (eq_attr "att" "a1,a2") to (ior (eq_attr ... ) (eq_attrq ..))
726    and (eq_attr "att" "!a1") to (not (eq_attr "att" "a1")).  Do the latter
727    test first so that (eq_attr "att" "!a1,a2,a3") works as expected.
728
729    Update the string address in EQ_ATTR expression to be the same used
730    in the attribute (or `alternative_name') to speed up subsequent
731    `find_attr' calls and eliminate most `strcmp' calls.
732
733    Return the new expression, if any.  */
734
735 static rtx
736 check_attr_test (rtx exp, int is_const, int lineno)
737 {
738   struct attr_desc *attr;
739   struct attr_value *av;
740   const char *name_ptr, *p;
741   rtx orexp, newexp;
742
743   switch (GET_CODE (exp))
744     {
745     case EQ_ATTR:
746       /* Handle negation test.  */
747       if (XSTR (exp, 1)[0] == '!')
748         return check_attr_test (attr_rtx (NOT,
749                                           attr_eq (XSTR (exp, 0),
750                                                    &XSTR (exp, 1)[1])),
751                                 is_const, lineno);
752
753       else if (n_comma_elts (XSTR (exp, 1)) == 1)
754         {
755           attr = find_attr (&XSTR (exp, 0), 0);
756           if (attr == NULL)
757             {
758               if (! strcmp (XSTR (exp, 0), "alternative"))
759                 return mk_attr_alt (1 << atoi (XSTR (exp, 1)));
760               else
761                 fatal ("unknown attribute `%s' in EQ_ATTR", XSTR (exp, 0));
762             }
763
764           if (is_const && ! attr->is_const)
765             fatal ("constant expression uses insn attribute `%s' in EQ_ATTR",
766                    XSTR (exp, 0));
767
768           /* Copy this just to make it permanent,
769              so expressions using it can be permanent too.  */
770           exp = attr_eq (XSTR (exp, 0), XSTR (exp, 1));
771
772           /* It shouldn't be possible to simplify the value given to a
773              constant attribute, so don't expand this until it's time to
774              write the test expression.  */
775           if (attr->is_const)
776             ATTR_IND_SIMPLIFIED_P (exp) = 1;
777
778           if (attr->is_numeric)
779             {
780               for (p = XSTR (exp, 1); *p; p++)
781                 if (! ISDIGIT (*p))
782                   fatal ("attribute `%s' takes only numeric values",
783                          XSTR (exp, 0));
784             }
785           else
786             {
787               for (av = attr->first_value; av; av = av->next)
788                 if (GET_CODE (av->value) == CONST_STRING
789                     && ! strcmp (XSTR (exp, 1), XSTR (av->value, 0)))
790                   break;
791
792               if (av == NULL)
793                 fatal ("unknown value `%s' for `%s' attribute",
794                        XSTR (exp, 1), XSTR (exp, 0));
795             }
796         }
797       else
798         {
799           if (! strcmp (XSTR (exp, 0), "alternative"))
800             {
801               int set = 0;
802
803               name_ptr = XSTR (exp, 1);
804               while ((p = next_comma_elt (&name_ptr)) != NULL)
805                 set |= 1 << atoi (p);
806
807               return mk_attr_alt (set);
808             }
809           else
810             {
811               /* Make an IOR tree of the possible values.  */
812               orexp = false_rtx;
813               name_ptr = XSTR (exp, 1);
814               while ((p = next_comma_elt (&name_ptr)) != NULL)
815                 {
816                   newexp = attr_eq (XSTR (exp, 0), p);
817                   orexp = insert_right_side (IOR, orexp, newexp, -2, -2);
818                 }
819
820               return check_attr_test (orexp, is_const, lineno);
821             }
822         }
823       break;
824
825     case ATTR_FLAG:
826       break;
827
828     case CONST_INT:
829       /* Either TRUE or FALSE.  */
830       if (XWINT (exp, 0))
831         return true_rtx;
832       else
833         return false_rtx;
834
835     case IOR:
836     case AND:
837       XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
838       XEXP (exp, 1) = check_attr_test (XEXP (exp, 1), is_const, lineno);
839       break;
840
841     case NOT:
842       XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
843       break;
844
845     case MATCH_TEST:
846       exp = attr_rtx (MATCH_TEST, XSTR (exp, 0));
847       ATTR_IND_SIMPLIFIED_P (exp) = 1;
848       break;
849
850     case MATCH_OPERAND:
851       if (is_const)
852         fatal ("RTL operator \"%s\" not valid in constant attribute test",
853                GET_RTX_NAME (GET_CODE (exp)));
854       /* These cases can't be simplified.  */
855       ATTR_IND_SIMPLIFIED_P (exp) = 1;
856       break;
857
858     case LE:  case LT:  case GT:  case GE:
859     case LEU: case LTU: case GTU: case GEU:
860     case NE:  case EQ:
861       if (GET_CODE (XEXP (exp, 0)) == SYMBOL_REF
862           && GET_CODE (XEXP (exp, 1)) == SYMBOL_REF)
863         exp = attr_rtx (GET_CODE (exp),
864                         attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 0), 0)),
865                         attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 1), 0)));
866       /* These cases can't be simplified.  */
867       ATTR_IND_SIMPLIFIED_P (exp) = 1;
868       break;
869
870     case SYMBOL_REF:
871       if (is_const)
872         {
873           /* These cases are valid for constant attributes, but can't be
874              simplified.  */
875           exp = attr_rtx (SYMBOL_REF, XSTR (exp, 0));
876           ATTR_IND_SIMPLIFIED_P (exp) = 1;
877           break;
878         }
879     default:
880       fatal ("RTL operator \"%s\" not valid in attribute test",
881              GET_RTX_NAME (GET_CODE (exp)));
882     }
883
884   return exp;
885 }
886
887 /* Given an expression, ensure that it is validly formed and that all named
888    attribute values are valid for the given attribute.  Issue a fatal error
889    if not.  If no attribute is specified, assume a numeric attribute.
890
891    Return a perhaps modified replacement expression for the value.  */
892
893 static rtx
894 check_attr_value (rtx exp, struct attr_desc *attr)
895 {
896   struct attr_value *av;
897   const char *p;
898   int i;
899
900   switch (GET_CODE (exp))
901     {
902     case CONST_INT:
903       if (attr && ! attr->is_numeric)
904         {
905           error_with_line (attr->lineno,
906                            "CONST_INT not valid for non-numeric attribute %s",
907                            attr->name);
908           break;
909         }
910
911       if (INTVAL (exp) < 0)
912         {
913           error_with_line (attr->lineno,
914                            "negative numeric value specified for attribute %s",
915                            attr->name);
916           break;
917         }
918       break;
919
920     case CONST_STRING:
921       if (! strcmp (XSTR (exp, 0), "*"))
922         break;
923
924       if (attr == 0 || attr->is_numeric)
925         {
926           p = XSTR (exp, 0);
927           for (; *p; p++)
928             if (! ISDIGIT (*p))
929               {
930                 error_with_line (attr ? attr->lineno : 0,
931                                  "non-numeric value for numeric attribute %s",
932                                  attr ? attr->name : "internal");
933                 break;
934               }
935           break;
936         }
937
938       for (av = attr->first_value; av; av = av->next)
939         if (GET_CODE (av->value) == CONST_STRING
940             && ! strcmp (XSTR (av->value, 0), XSTR (exp, 0)))
941           break;
942
943       if (av == NULL)
944         error_with_line (attr->lineno,
945                          "unknown value `%s' for `%s' attribute",
946                          XSTR (exp, 0), attr ? attr->name : "internal");
947       break;
948
949     case IF_THEN_ELSE:
950       XEXP (exp, 0) = check_attr_test (XEXP (exp, 0),
951                                        attr ? attr->is_const : 0,
952                                        attr ? attr->lineno : 0);
953       XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
954       XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
955       break;
956
957     case PLUS:
958     case MINUS:
959     case MULT:
960     case DIV:
961     case MOD:
962       if (attr && !attr->is_numeric)
963         {
964           error_with_line (attr->lineno,
965                            "invalid operation `%s' for non-numeric"
966                            " attribute value", GET_RTX_NAME (GET_CODE (exp)));
967           break;
968         }
969       /* Fall through.  */
970
971     case IOR:
972     case AND:
973       XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
974       XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
975       break;
976
977     case FFS:
978     case CLZ:
979     case CTZ:
980     case POPCOUNT:
981     case PARITY:
982     case BSWAP:
983       XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
984       break;
985
986     case COND:
987       if (XVECLEN (exp, 0) % 2 != 0)
988         {
989           error_with_line (attr->lineno,
990                            "first operand of COND must have even length");
991           break;
992         }
993
994       for (i = 0; i < XVECLEN (exp, 0); i += 2)
995         {
996           XVECEXP (exp, 0, i) = check_attr_test (XVECEXP (exp, 0, i),
997                                                  attr ? attr->is_const : 0,
998                                                  attr ? attr->lineno : 0);
999           XVECEXP (exp, 0, i + 1)
1000             = check_attr_value (XVECEXP (exp, 0, i + 1), attr);
1001         }
1002
1003       XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1004       break;
1005
1006     case ATTR:
1007       {
1008         struct attr_desc *attr2 = find_attr (&XSTR (exp, 0), 0);
1009         if (attr2 == NULL)
1010           error_with_line (attr ? attr->lineno : 0,
1011                            "unknown attribute `%s' in ATTR",
1012                            XSTR (exp, 0));
1013         else if (attr && attr->is_const && ! attr2->is_const)
1014           error_with_line (attr->lineno,
1015                            "non-constant attribute `%s' referenced from `%s'",
1016                            XSTR (exp, 0), attr->name);
1017         else if (attr
1018                  && attr->is_numeric != attr2->is_numeric)
1019           error_with_line (attr->lineno,
1020                            "numeric attribute mismatch calling `%s' from `%s'",
1021                            XSTR (exp, 0), attr->name);
1022       }
1023       break;
1024
1025     case SYMBOL_REF:
1026       /* A constant SYMBOL_REF is valid as a constant attribute test and
1027          is expanded later by make_canonical into a COND.  In a non-constant
1028          attribute test, it is left be.  */
1029       return attr_rtx (SYMBOL_REF, XSTR (exp, 0));
1030
1031     default:
1032       error_with_line (attr ? attr->lineno : 0,
1033                        "invalid operation `%s' for attribute value",
1034                        GET_RTX_NAME (GET_CODE (exp)));
1035       break;
1036     }
1037
1038   return exp;
1039 }
1040
1041 /* Given an SET_ATTR_ALTERNATIVE expression, convert to the canonical SET.
1042    It becomes a COND with each test being (eq_attr "alternative" "n") */
1043
1044 static rtx
1045 convert_set_attr_alternative (rtx exp, struct insn_def *id)
1046 {
1047   int num_alt = id->num_alternatives;
1048   rtx condexp;
1049   int i;
1050
1051   if (XVECLEN (exp, 1) != num_alt)
1052     {
1053       error_with_line (id->lineno,
1054                        "bad number of entries in SET_ATTR_ALTERNATIVE");
1055       return NULL_RTX;
1056     }
1057
1058   /* Make a COND with all tests but the last.  Select the last value via the
1059      default.  */
1060   condexp = rtx_alloc (COND);
1061   XVEC (condexp, 0) = rtvec_alloc ((num_alt - 1) * 2);
1062
1063   for (i = 0; i < num_alt - 1; i++)
1064     {
1065       const char *p;
1066       p = attr_numeral (i);
1067
1068       XVECEXP (condexp, 0, 2 * i) = attr_eq (alternative_name, p);
1069       XVECEXP (condexp, 0, 2 * i + 1) = XVECEXP (exp, 1, i);
1070     }
1071
1072   XEXP (condexp, 1) = XVECEXP (exp, 1, i);
1073
1074   return attr_rtx (SET, attr_rtx (ATTR, XSTR (exp, 0)), condexp);
1075 }
1076
1077 /* Given a SET_ATTR, convert to the appropriate SET.  If a comma-separated
1078    list of values is given, convert to SET_ATTR_ALTERNATIVE first.  */
1079
1080 static rtx
1081 convert_set_attr (rtx exp, struct insn_def *id)
1082 {
1083   rtx newexp;
1084   const char *name_ptr;
1085   char *p;
1086   int n;
1087
1088   /* See how many alternative specified.  */
1089   n = n_comma_elts (XSTR (exp, 1));
1090   if (n == 1)
1091     return attr_rtx (SET,
1092                      attr_rtx (ATTR, XSTR (exp, 0)),
1093                      attr_rtx (CONST_STRING, XSTR (exp, 1)));
1094
1095   newexp = rtx_alloc (SET_ATTR_ALTERNATIVE);
1096   XSTR (newexp, 0) = XSTR (exp, 0);
1097   XVEC (newexp, 1) = rtvec_alloc (n);
1098
1099   /* Process each comma-separated name.  */
1100   name_ptr = XSTR (exp, 1);
1101   n = 0;
1102   while ((p = next_comma_elt (&name_ptr)) != NULL)
1103     XVECEXP (newexp, 1, n++) = attr_rtx (CONST_STRING, p);
1104
1105   return convert_set_attr_alternative (newexp, id);
1106 }
1107
1108 /* Scan all definitions, checking for validity.  Also, convert any SET_ATTR
1109    and SET_ATTR_ALTERNATIVE expressions to the corresponding SET
1110    expressions.  */
1111
1112 static void
1113 check_defs (void)
1114 {
1115   struct insn_def *id;
1116   struct attr_desc *attr;
1117   int i;
1118   rtx value;
1119
1120   for (id = defs; id; id = id->next)
1121     {
1122       if (XVEC (id->def, id->vec_idx) == NULL)
1123         continue;
1124
1125       for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1126         {
1127           value = XVECEXP (id->def, id->vec_idx, i);
1128           switch (GET_CODE (value))
1129             {
1130             case SET:
1131               if (GET_CODE (XEXP (value, 0)) != ATTR)
1132                 {
1133                   error_with_line (id->lineno, "bad attribute set");
1134                   value = NULL_RTX;
1135                 }
1136               break;
1137
1138             case SET_ATTR_ALTERNATIVE:
1139               value = convert_set_attr_alternative (value, id);
1140               break;
1141
1142             case SET_ATTR:
1143               value = convert_set_attr (value, id);
1144               break;
1145
1146             default:
1147               error_with_line (id->lineno, "invalid attribute code %s",
1148                                GET_RTX_NAME (GET_CODE (value)));
1149               value = NULL_RTX;
1150             }
1151           if (value == NULL_RTX)
1152             continue;
1153
1154           if ((attr = find_attr (&XSTR (XEXP (value, 0), 0), 0)) == NULL)
1155             {
1156               error_with_line (id->lineno, "unknown attribute %s",
1157                                XSTR (XEXP (value, 0), 0));
1158               continue;
1159             }
1160
1161           XVECEXP (id->def, id->vec_idx, i) = value;
1162           XEXP (value, 1) = check_attr_value (XEXP (value, 1), attr);
1163         }
1164     }
1165 }
1166
1167 /* Given a valid expression for an attribute value, remove any IF_THEN_ELSE
1168    expressions by converting them into a COND.  This removes cases from this
1169    program.  Also, replace an attribute value of "*" with the default attribute
1170    value.  */
1171
1172 static rtx
1173 make_canonical (struct attr_desc *attr, rtx exp)
1174 {
1175   int i;
1176   rtx newexp;
1177
1178   switch (GET_CODE (exp))
1179     {
1180     case CONST_INT:
1181       exp = make_numeric_value (INTVAL (exp));
1182       break;
1183
1184     case CONST_STRING:
1185       if (! strcmp (XSTR (exp, 0), "*"))
1186         {
1187           if (attr == 0 || attr->default_val == 0)
1188             fatal ("(attr_value \"*\") used in invalid context");
1189           exp = attr->default_val->value;
1190         }
1191       else
1192         XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1193
1194       break;
1195
1196     case SYMBOL_REF:
1197       if (!attr->is_const || ATTR_IND_SIMPLIFIED_P (exp))
1198         break;
1199       /* The SYMBOL_REF is constant for a given run, so mark it as unchanging.
1200          This makes the COND something that won't be considered an arbitrary
1201          expression by walk_attr_value.  */
1202       ATTR_IND_SIMPLIFIED_P (exp) = 1;
1203       exp = check_attr_value (exp, attr);
1204       break;
1205
1206     case IF_THEN_ELSE:
1207       newexp = rtx_alloc (COND);
1208       XVEC (newexp, 0) = rtvec_alloc (2);
1209       XVECEXP (newexp, 0, 0) = XEXP (exp, 0);
1210       XVECEXP (newexp, 0, 1) = XEXP (exp, 1);
1211
1212       XEXP (newexp, 1) = XEXP (exp, 2);
1213
1214       exp = newexp;
1215       /* Fall through to COND case since this is now a COND.  */
1216
1217     case COND:
1218       {
1219         int allsame = 1;
1220         rtx defval;
1221
1222         /* First, check for degenerate COND.  */
1223         if (XVECLEN (exp, 0) == 0)
1224           return make_canonical (attr, XEXP (exp, 1));
1225         defval = XEXP (exp, 1) = make_canonical (attr, XEXP (exp, 1));
1226
1227         for (i = 0; i < XVECLEN (exp, 0); i += 2)
1228           {
1229             XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
1230             XVECEXP (exp, 0, i + 1)
1231               = make_canonical (attr, XVECEXP (exp, 0, i + 1));
1232             if (! rtx_equal_p (XVECEXP (exp, 0, i + 1), defval))
1233               allsame = 0;
1234           }
1235         if (allsame)
1236           return defval;
1237       }
1238       break;
1239
1240     default:
1241       break;
1242     }
1243
1244   return exp;
1245 }
1246
1247 static rtx
1248 copy_boolean (rtx exp)
1249 {
1250   if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
1251     return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
1252                      copy_boolean (XEXP (exp, 1)));
1253   if (GET_CODE (exp) == MATCH_OPERAND)
1254     {
1255       XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1256       XSTR (exp, 2) = DEF_ATTR_STRING (XSTR (exp, 2));
1257     }
1258   else if (GET_CODE (exp) == EQ_ATTR)
1259     {
1260       XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1261       XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1262     }
1263
1264   return exp;
1265 }
1266
1267 /* Given a value and an attribute description, return a `struct attr_value *'
1268    that represents that value.  This is either an existing structure, if the
1269    value has been previously encountered, or a newly-created structure.
1270
1271    `insn_code' is the code of an insn whose attribute has the specified
1272    value (-2 if not processing an insn).  We ensure that all insns for
1273    a given value have the same number of alternatives if the value checks
1274    alternatives.  */
1275
1276 static struct attr_value *
1277 get_attr_value (rtx value, struct attr_desc *attr, int insn_code)
1278 {
1279   struct attr_value *av;
1280   int num_alt = 0;
1281
1282   value = make_canonical (attr, value);
1283   if (compares_alternatives_p (value))
1284     {
1285       if (insn_code < 0 || insn_alternatives == NULL)
1286         fatal ("(eq_attr \"alternatives\" ...) used in non-insn context");
1287       else
1288         num_alt = insn_alternatives[insn_code];
1289     }
1290
1291   for (av = attr->first_value; av; av = av->next)
1292     if (rtx_equal_p (value, av->value)
1293         && (num_alt == 0 || av->first_insn == NULL
1294             || insn_alternatives[av->first_insn->def->insn_code]))
1295       return av;
1296
1297   av = oballoc (struct attr_value);
1298   av->value = value;
1299   av->next = attr->first_value;
1300   attr->first_value = av;
1301   av->first_insn = NULL;
1302   av->num_insns = 0;
1303   av->has_asm_insn = 0;
1304
1305   return av;
1306 }
1307
1308 /* After all DEFINE_DELAYs have been read in, create internal attributes
1309    to generate the required routines.
1310
1311    First, we compute the number of delay slots for each insn (as a COND of
1312    each of the test expressions in DEFINE_DELAYs).  Then, if more than one
1313    delay type is specified, we compute a similar function giving the
1314    DEFINE_DELAY ordinal for each insn.
1315
1316    Finally, for each [DEFINE_DELAY, slot #] pair, we compute an attribute that
1317    tells whether a given insn can be in that delay slot.
1318
1319    Normal attribute filling and optimization expands these to contain the
1320    information needed to handle delay slots.  */
1321
1322 static void
1323 expand_delays (void)
1324 {
1325   struct delay_desc *delay;
1326   rtx condexp;
1327   rtx newexp;
1328   int i;
1329   char *p;
1330
1331   /* First, generate data for `num_delay_slots' function.  */
1332
1333   condexp = rtx_alloc (COND);
1334   XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1335   XEXP (condexp, 1) = make_numeric_value (0);
1336
1337   for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1338     {
1339       XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1340       XVECEXP (condexp, 0, i + 1)
1341         = make_numeric_value (XVECLEN (delay->def, 1) / 3);
1342     }
1343
1344   make_internal_attr (num_delay_slots_str, condexp, ATTR_NONE);
1345
1346   /* If more than one delay type, do the same for computing the delay type.  */
1347   if (num_delays > 1)
1348     {
1349       condexp = rtx_alloc (COND);
1350       XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1351       XEXP (condexp, 1) = make_numeric_value (0);
1352
1353       for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1354         {
1355           XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1356           XVECEXP (condexp, 0, i + 1) = make_numeric_value (delay->num);
1357         }
1358
1359       make_internal_attr (delay_type_str, condexp, ATTR_SPECIAL);
1360     }
1361
1362   /* For each delay possibility and delay slot, compute an eligibility
1363      attribute for non-annulled insns and for each type of annulled (annul
1364      if true and annul if false).  */
1365   for (delay = delays; delay; delay = delay->next)
1366     {
1367       for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
1368         {
1369           condexp = XVECEXP (delay->def, 1, i);
1370           if (condexp == 0)
1371             condexp = false_rtx;
1372           newexp = attr_rtx (IF_THEN_ELSE, condexp,
1373                              make_numeric_value (1), make_numeric_value (0));
1374
1375           p = attr_printf (sizeof "*delay__" + MAX_DIGITS * 2,
1376                            "*delay_%d_%d", delay->num, i / 3);
1377           make_internal_attr (p, newexp, ATTR_SPECIAL);
1378
1379           if (have_annul_true)
1380             {
1381               condexp = XVECEXP (delay->def, 1, i + 1);
1382               if (condexp == 0) condexp = false_rtx;
1383               newexp = attr_rtx (IF_THEN_ELSE, condexp,
1384                                  make_numeric_value (1),
1385                                  make_numeric_value (0));
1386               p = attr_printf (sizeof "*annul_true__" + MAX_DIGITS * 2,
1387                                "*annul_true_%d_%d", delay->num, i / 3);
1388               make_internal_attr (p, newexp, ATTR_SPECIAL);
1389             }
1390
1391           if (have_annul_false)
1392             {
1393               condexp = XVECEXP (delay->def, 1, i + 2);
1394               if (condexp == 0) condexp = false_rtx;
1395               newexp = attr_rtx (IF_THEN_ELSE, condexp,
1396                                  make_numeric_value (1),
1397                                  make_numeric_value (0));
1398               p = attr_printf (sizeof "*annul_false__" + MAX_DIGITS * 2,
1399                                "*annul_false_%d_%d", delay->num, i / 3);
1400               make_internal_attr (p, newexp, ATTR_SPECIAL);
1401             }
1402         }
1403     }
1404 }
1405
1406 /* Once all attributes and insns have been read and checked, we construct for
1407    each attribute value a list of all the insns that have that value for
1408    the attribute.  */
1409
1410 static void
1411 fill_attr (struct attr_desc *attr)
1412 {
1413   struct attr_value *av;
1414   struct insn_ent *ie;
1415   struct insn_def *id;
1416   int i;
1417   rtx value;
1418
1419   /* Don't fill constant attributes.  The value is independent of
1420      any particular insn.  */
1421   if (attr->is_const)
1422     return;
1423
1424   for (id = defs; id; id = id->next)
1425     {
1426       /* If no value is specified for this insn for this attribute, use the
1427          default.  */
1428       value = NULL;
1429       if (XVEC (id->def, id->vec_idx))
1430         for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1431           if (! strcmp_check (XSTR (XEXP (XVECEXP (id->def, id->vec_idx, i), 0), 0),
1432                               attr->name))
1433             value = XEXP (XVECEXP (id->def, id->vec_idx, i), 1);
1434
1435       if (value == NULL)
1436         av = attr->default_val;
1437       else
1438         av = get_attr_value (value, attr, id->insn_code);
1439
1440       ie = oballoc (struct insn_ent);
1441       ie->def = id;
1442       insert_insn_ent (av, ie);
1443     }
1444 }
1445
1446 /* Given an expression EXP, see if it is a COND or IF_THEN_ELSE that has a
1447    test that checks relative positions of insns (uses MATCH_DUP or PC).
1448    If so, replace it with what is obtained by passing the expression to
1449    ADDRESS_FN.  If not but it is a COND or IF_THEN_ELSE, call this routine
1450    recursively on each value (including the default value).  Otherwise,
1451    return the value returned by NO_ADDRESS_FN applied to EXP.  */
1452
1453 static rtx
1454 substitute_address (rtx exp, rtx (*no_address_fn) (rtx),
1455                     rtx (*address_fn) (rtx))
1456 {
1457   int i;
1458   rtx newexp;
1459
1460   if (GET_CODE (exp) == COND)
1461     {
1462       /* See if any tests use addresses.  */
1463       address_used = 0;
1464       for (i = 0; i < XVECLEN (exp, 0); i += 2)
1465         walk_attr_value (XVECEXP (exp, 0, i));
1466
1467       if (address_used)
1468         return (*address_fn) (exp);
1469
1470       /* Make a new copy of this COND, replacing each element.  */
1471       newexp = rtx_alloc (COND);
1472       XVEC (newexp, 0) = rtvec_alloc (XVECLEN (exp, 0));
1473       for (i = 0; i < XVECLEN (exp, 0); i += 2)
1474         {
1475           XVECEXP (newexp, 0, i) = XVECEXP (exp, 0, i);
1476           XVECEXP (newexp, 0, i + 1)
1477             = substitute_address (XVECEXP (exp, 0, i + 1),
1478                                   no_address_fn, address_fn);
1479         }
1480
1481       XEXP (newexp, 1) = substitute_address (XEXP (exp, 1),
1482                                              no_address_fn, address_fn);
1483
1484       return newexp;
1485     }
1486
1487   else if (GET_CODE (exp) == IF_THEN_ELSE)
1488     {
1489       address_used = 0;
1490       walk_attr_value (XEXP (exp, 0));
1491       if (address_used)
1492         return (*address_fn) (exp);
1493
1494       return attr_rtx (IF_THEN_ELSE,
1495                        substitute_address (XEXP (exp, 0),
1496                                            no_address_fn, address_fn),
1497                        substitute_address (XEXP (exp, 1),
1498                                            no_address_fn, address_fn),
1499                        substitute_address (XEXP (exp, 2),
1500                                            no_address_fn, address_fn));
1501     }
1502
1503   return (*no_address_fn) (exp);
1504 }
1505
1506 /* Make new attributes from the `length' attribute.  The following are made,
1507    each corresponding to a function called from `shorten_branches' or
1508    `get_attr_length':
1509
1510    *insn_default_length         This is the length of the insn to be returned
1511                                 by `get_attr_length' before `shorten_branches'
1512                                 has been called.  In each case where the length
1513                                 depends on relative addresses, the largest
1514                                 possible is used.  This routine is also used
1515                                 to compute the initial size of the insn.
1516
1517    *insn_variable_length_p      This returns 1 if the insn's length depends
1518                                 on relative addresses, zero otherwise.
1519
1520    *insn_current_length         This is only called when it is known that the
1521                                 insn has a variable length and returns the
1522                                 current length, based on relative addresses.
1523   */
1524
1525 static void
1526 make_length_attrs (void)
1527 {
1528   static const char *new_names[] =
1529     {
1530       "*insn_default_length",
1531       "*insn_min_length",
1532       "*insn_variable_length_p",
1533       "*insn_current_length"
1534     };
1535   static rtx (*const no_address_fn[]) (rtx)
1536     = {identity_fn,identity_fn, zero_fn, zero_fn};
1537   static rtx (*const address_fn[]) (rtx)
1538     = {max_fn, min_fn, one_fn, identity_fn};
1539   size_t i;
1540   struct attr_desc *length_attr, *new_attr;
1541   struct attr_value *av, *new_av;
1542   struct insn_ent *ie, *new_ie;
1543
1544   /* See if length attribute is defined.  If so, it must be numeric.  Make
1545      it special so we don't output anything for it.  */
1546   length_attr = find_attr (&length_str, 0);
1547   if (length_attr == 0)
1548     return;
1549
1550   if (! length_attr->is_numeric)
1551     fatal ("length attribute must be numeric");
1552
1553   length_attr->is_const = 0;
1554   length_attr->is_special = 1;
1555
1556   /* Make each new attribute, in turn.  */
1557   for (i = 0; i < ARRAY_SIZE (new_names); i++)
1558     {
1559       make_internal_attr (new_names[i],
1560                           substitute_address (length_attr->default_val->value,
1561                                               no_address_fn[i], address_fn[i]),
1562                           ATTR_NONE);
1563       new_attr = find_attr (&new_names[i], 0);
1564       for (av = length_attr->first_value; av; av = av->next)
1565         for (ie = av->first_insn; ie; ie = ie->next)
1566           {
1567             new_av = get_attr_value (substitute_address (av->value,
1568                                                          no_address_fn[i],
1569                                                          address_fn[i]),
1570                                      new_attr, ie->def->insn_code);
1571             new_ie = oballoc (struct insn_ent);
1572             new_ie->def = ie->def;
1573             insert_insn_ent (new_av, new_ie);
1574           }
1575     }
1576 }
1577
1578 /* Utility functions called from above routine.  */
1579
1580 static rtx
1581 identity_fn (rtx exp)
1582 {
1583   return exp;
1584 }
1585
1586 static rtx
1587 zero_fn (rtx exp ATTRIBUTE_UNUSED)
1588 {
1589   return make_numeric_value (0);
1590 }
1591
1592 static rtx
1593 one_fn (rtx exp ATTRIBUTE_UNUSED)
1594 {
1595   return make_numeric_value (1);
1596 }
1597
1598 static rtx
1599 max_fn (rtx exp)
1600 {
1601   int unknown;
1602   return make_numeric_value (max_attr_value (exp, &unknown));
1603 }
1604
1605 static rtx
1606 min_fn (rtx exp)
1607 {
1608   int unknown;
1609   return make_numeric_value (min_attr_value (exp, &unknown));
1610 }
1611
1612 static void
1613 write_length_unit_log (void)
1614 {
1615   struct attr_desc *length_attr = find_attr (&length_str, 0);
1616   struct attr_value *av;
1617   struct insn_ent *ie;
1618   unsigned int length_unit_log, length_or;
1619   int unknown = 0;
1620
1621   if (length_attr == 0)
1622     return;
1623   length_or = or_attr_value (length_attr->default_val->value, &unknown);
1624   for (av = length_attr->first_value; av; av = av->next)
1625     for (ie = av->first_insn; ie; ie = ie->next)
1626       length_or |= or_attr_value (av->value, &unknown);
1627
1628   if (unknown)
1629     length_unit_log = 0;
1630   else
1631     {
1632       length_or = ~length_or;
1633       for (length_unit_log = 0; length_or & 1; length_or >>= 1)
1634         length_unit_log++;
1635     }
1636   printf ("EXPORTED_CONST int length_unit_log = %u;\n", length_unit_log);
1637 }
1638
1639 /* Take a COND expression and see if any of the conditions in it can be
1640    simplified.  If any are known true or known false for the particular insn
1641    code, the COND can be further simplified.
1642
1643    Also call ourselves on any COND operations that are values of this COND.
1644
1645    We do not modify EXP; rather, we make and return a new rtx.  */
1646
1647 static rtx
1648 simplify_cond (rtx exp, int insn_code, int insn_index)
1649 {
1650   int i, j;
1651   /* We store the desired contents here,
1652      then build a new expression if they don't match EXP.  */
1653   rtx defval = XEXP (exp, 1);
1654   rtx new_defval = XEXP (exp, 1);
1655   int len = XVECLEN (exp, 0);
1656   rtx *tests = XNEWVEC (rtx, len);
1657   int allsame = 1;
1658   rtx ret;
1659
1660   /* This lets us free all storage allocated below, if appropriate.  */
1661   obstack_finish (rtl_obstack);
1662
1663   memcpy (tests, XVEC (exp, 0)->elem, len * sizeof (rtx));
1664
1665   /* See if default value needs simplification.  */
1666   if (GET_CODE (defval) == COND)
1667     new_defval = simplify_cond (defval, insn_code, insn_index);
1668
1669   /* Simplify the subexpressions, and see what tests we can get rid of.  */
1670
1671   for (i = 0; i < len; i += 2)
1672     {
1673       rtx newtest, newval;
1674
1675       /* Simplify this test.  */
1676       newtest = simplify_test_exp_in_temp (tests[i], insn_code, insn_index);
1677       tests[i] = newtest;
1678
1679       newval = tests[i + 1];
1680       /* See if this value may need simplification.  */
1681       if (GET_CODE (newval) == COND)
1682         newval = simplify_cond (newval, insn_code, insn_index);
1683
1684       /* Look for ways to delete or combine this test.  */
1685       if (newtest == true_rtx)
1686         {
1687           /* If test is true, make this value the default
1688              and discard this + any following tests.  */
1689           len = i;
1690           defval = tests[i + 1];
1691           new_defval = newval;
1692         }
1693
1694       else if (newtest == false_rtx)
1695         {
1696           /* If test is false, discard it and its value.  */
1697           for (j = i; j < len - 2; j++)
1698             tests[j] = tests[j + 2];
1699           i -= 2;
1700           len -= 2;
1701         }
1702
1703       else if (i > 0 && attr_equal_p (newval, tests[i - 1]))
1704         {
1705           /* If this value and the value for the prev test are the same,
1706              merge the tests.  */
1707
1708           tests[i - 2]
1709             = insert_right_side (IOR, tests[i - 2], newtest,
1710                                  insn_code, insn_index);
1711
1712           /* Delete this test/value.  */
1713           for (j = i; j < len - 2; j++)
1714             tests[j] = tests[j + 2];
1715           len -= 2;
1716           i -= 2;
1717         }
1718
1719       else
1720         tests[i + 1] = newval;
1721     }
1722
1723   /* If the last test in a COND has the same value
1724      as the default value, that test isn't needed.  */
1725
1726   while (len > 0 && attr_equal_p (tests[len - 1], new_defval))
1727     len -= 2;
1728
1729   /* See if we changed anything.  */
1730   if (len != XVECLEN (exp, 0) || new_defval != XEXP (exp, 1))
1731     allsame = 0;
1732   else
1733     for (i = 0; i < len; i++)
1734       if (! attr_equal_p (tests[i], XVECEXP (exp, 0, i)))
1735         {
1736           allsame = 0;
1737           break;
1738         }
1739
1740   if (len == 0)
1741     {
1742       if (GET_CODE (defval) == COND)
1743         ret = simplify_cond (defval, insn_code, insn_index);
1744       else
1745         ret = defval;
1746     }
1747   else if (allsame)
1748     ret = exp;
1749   else
1750     {
1751       rtx newexp = rtx_alloc (COND);
1752
1753       XVEC (newexp, 0) = rtvec_alloc (len);
1754       memcpy (XVEC (newexp, 0)->elem, tests, len * sizeof (rtx));
1755       XEXP (newexp, 1) = new_defval;
1756       ret = newexp;
1757     }
1758   free (tests);
1759   return ret;
1760 }
1761
1762 /* Remove an insn entry from an attribute value.  */
1763
1764 static void
1765 remove_insn_ent (struct attr_value *av, struct insn_ent *ie)
1766 {
1767   struct insn_ent *previe;
1768
1769   if (av->first_insn == ie)
1770     av->first_insn = ie->next;
1771   else
1772     {
1773       for (previe = av->first_insn; previe->next != ie; previe = previe->next)
1774         ;
1775       previe->next = ie->next;
1776     }
1777
1778   av->num_insns--;
1779   if (ie->def->insn_code == -1)
1780     av->has_asm_insn = 0;
1781
1782   num_insn_ents--;
1783 }
1784
1785 /* Insert an insn entry in an attribute value list.  */
1786
1787 static void
1788 insert_insn_ent (struct attr_value *av, struct insn_ent *ie)
1789 {
1790   ie->next = av->first_insn;
1791   av->first_insn = ie;
1792   av->num_insns++;
1793   if (ie->def->insn_code == -1)
1794     av->has_asm_insn = 1;
1795
1796   num_insn_ents++;
1797 }
1798
1799 /* This is a utility routine to take an expression that is a tree of either
1800    AND or IOR expressions and insert a new term.  The new term will be
1801    inserted at the right side of the first node whose code does not match
1802    the root.  A new node will be created with the root's code.  Its left
1803    side will be the old right side and its right side will be the new
1804    term.
1805
1806    If the `term' is itself a tree, all its leaves will be inserted.  */
1807
1808 static rtx
1809 insert_right_side (enum rtx_code code, rtx exp, rtx term, int insn_code, int insn_index)
1810 {
1811   rtx newexp;
1812
1813   /* Avoid consing in some special cases.  */
1814   if (code == AND && term == true_rtx)
1815     return exp;
1816   if (code == AND && term == false_rtx)
1817     return false_rtx;
1818   if (code == AND && exp == true_rtx)
1819     return term;
1820   if (code == AND && exp == false_rtx)
1821     return false_rtx;
1822   if (code == IOR && term == true_rtx)
1823     return true_rtx;
1824   if (code == IOR && term == false_rtx)
1825     return exp;
1826   if (code == IOR && exp == true_rtx)
1827     return true_rtx;
1828   if (code == IOR && exp == false_rtx)
1829     return term;
1830   if (attr_equal_p (exp, term))
1831     return exp;
1832
1833   if (GET_CODE (term) == code)
1834     {
1835       exp = insert_right_side (code, exp, XEXP (term, 0),
1836                                insn_code, insn_index);
1837       exp = insert_right_side (code, exp, XEXP (term, 1),
1838                                insn_code, insn_index);
1839
1840       return exp;
1841     }
1842
1843   if (GET_CODE (exp) == code)
1844     {
1845       rtx new_rtx = insert_right_side (code, XEXP (exp, 1),
1846                                        term, insn_code, insn_index);
1847       if (new_rtx != XEXP (exp, 1))
1848         /* Make a copy of this expression and call recursively.  */
1849         newexp = attr_rtx (code, XEXP (exp, 0), new_rtx);
1850       else
1851         newexp = exp;
1852     }
1853   else
1854     {
1855       /* Insert the new term.  */
1856       newexp = attr_rtx (code, exp, term);
1857     }
1858
1859   return simplify_test_exp_in_temp (newexp, insn_code, insn_index);
1860 }
1861
1862 /* If we have an expression which AND's a bunch of
1863         (not (eq_attrq "alternative" "n"))
1864    terms, we may have covered all or all but one of the possible alternatives.
1865    If so, we can optimize.  Similarly for IOR's of EQ_ATTR.
1866
1867    This routine is passed an expression and either AND or IOR.  It returns a
1868    bitmask indicating which alternatives are mentioned within EXP.  */
1869
1870 static int
1871 compute_alternative_mask (rtx exp, enum rtx_code code)
1872 {
1873   const char *string;
1874   if (GET_CODE (exp) == code)
1875     return compute_alternative_mask (XEXP (exp, 0), code)
1876            | compute_alternative_mask (XEXP (exp, 1), code);
1877
1878   else if (code == AND && GET_CODE (exp) == NOT
1879            && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
1880            && XSTR (XEXP (exp, 0), 0) == alternative_name)
1881     string = XSTR (XEXP (exp, 0), 1);
1882
1883   else if (code == IOR && GET_CODE (exp) == EQ_ATTR
1884            && XSTR (exp, 0) == alternative_name)
1885     string = XSTR (exp, 1);
1886
1887   else if (GET_CODE (exp) == EQ_ATTR_ALT)
1888     {
1889       if (code == AND && XINT (exp, 1))
1890         return XINT (exp, 0);
1891
1892       if (code == IOR && !XINT (exp, 1))
1893         return XINT (exp, 0);
1894
1895       return 0;
1896     }
1897   else
1898     return 0;
1899
1900   if (string[1] == 0)
1901     return 1 << (string[0] - '0');
1902   return 1 << atoi (string);
1903 }
1904
1905 /* Given I, a single-bit mask, return RTX to compare the `alternative'
1906    attribute with the value represented by that bit.  */
1907
1908 static rtx
1909 make_alternative_compare (int mask)
1910 {
1911   return mk_attr_alt (mask);
1912 }
1913
1914 /* If we are processing an (eq_attr "attr" "value") test, we find the value
1915    of "attr" for this insn code.  From that value, we can compute a test
1916    showing when the EQ_ATTR will be true.  This routine performs that
1917    computation.  If a test condition involves an address, we leave the EQ_ATTR
1918    intact because addresses are only valid for the `length' attribute.
1919
1920    EXP is the EQ_ATTR expression and ATTR is the attribute to which
1921    it refers.  VALUE is the value of that attribute for the insn
1922    corresponding to INSN_CODE and INSN_INDEX.  */
1923
1924 static rtx
1925 evaluate_eq_attr (rtx exp, struct attr_desc *attr, rtx value,
1926                   int insn_code, int insn_index)
1927 {
1928   rtx orexp, andexp;
1929   rtx right;
1930   rtx newexp;
1931   int i;
1932
1933   while (GET_CODE (value) == ATTR)
1934     {
1935       struct attr_value *av = NULL;
1936
1937       attr = find_attr (&XSTR (value, 0), 0);
1938
1939       if (insn_code_values)
1940         {
1941           struct attr_value_list *iv;
1942           for (iv = insn_code_values[insn_code]; iv; iv = iv->next)
1943             if (iv->attr == attr)
1944               {
1945                 av = iv->av;
1946                 break;
1947               }
1948         }
1949       else
1950         {
1951           struct insn_ent *ie;
1952           for (av = attr->first_value; av; av = av->next)
1953             for (ie = av->first_insn; ie; ie = ie->next)
1954               if (ie->def->insn_code == insn_code)
1955                 goto got_av;
1956         }
1957       if (av)
1958         {
1959         got_av:
1960           value = av->value;
1961         }
1962     }
1963
1964   switch (GET_CODE (value))
1965     {
1966     case CONST_STRING:
1967       if (! strcmp_check (XSTR (value, 0), XSTR (exp, 1)))
1968         newexp = true_rtx;
1969       else
1970         newexp = false_rtx;
1971       break;
1972
1973     case SYMBOL_REF:
1974       {
1975         const char *prefix;
1976         char *string, *p;
1977
1978         gcc_assert (GET_CODE (exp) == EQ_ATTR);
1979         prefix = attr->enum_name ? attr->enum_name : attr->name;
1980         string = ACONCAT ((prefix, "_", XSTR (exp, 1), NULL));
1981         for (p = string; *p; p++)
1982           *p = TOUPPER (*p);
1983
1984         newexp = attr_rtx (EQ, value,
1985                            attr_rtx (SYMBOL_REF,
1986                                      DEF_ATTR_STRING (string)));
1987         break;
1988       }
1989
1990     case COND:
1991       /* We construct an IOR of all the cases for which the
1992          requested attribute value is present.  Since we start with
1993          FALSE, if it is not present, FALSE will be returned.
1994
1995          Each case is the AND of the NOT's of the previous conditions with the
1996          current condition; in the default case the current condition is TRUE.
1997
1998          For each possible COND value, call ourselves recursively.
1999
2000          The extra TRUE and FALSE expressions will be eliminated by another
2001          call to the simplification routine.  */
2002
2003       orexp = false_rtx;
2004       andexp = true_rtx;
2005
2006       for (i = 0; i < XVECLEN (value, 0); i += 2)
2007         {
2008           rtx this_cond = simplify_test_exp_in_temp (XVECEXP (value, 0, i),
2009                                                     insn_code, insn_index);
2010
2011           right = insert_right_side (AND, andexp, this_cond,
2012                                      insn_code, insn_index);
2013           right = insert_right_side (AND, right,
2014                                      evaluate_eq_attr (exp, attr,
2015                                                        XVECEXP (value, 0,
2016                                                                 i + 1),
2017                                                        insn_code, insn_index),
2018                                      insn_code, insn_index);
2019           orexp = insert_right_side (IOR, orexp, right,
2020                                      insn_code, insn_index);
2021
2022           /* Add this condition into the AND expression.  */
2023           newexp = attr_rtx (NOT, this_cond);
2024           andexp = insert_right_side (AND, andexp, newexp,
2025                                       insn_code, insn_index);
2026         }
2027
2028       /* Handle the default case.  */
2029       right = insert_right_side (AND, andexp,
2030                                  evaluate_eq_attr (exp, attr, XEXP (value, 1),
2031                                                    insn_code, insn_index),
2032                                  insn_code, insn_index);
2033       newexp = insert_right_side (IOR, orexp, right, insn_code, insn_index);
2034       break;
2035
2036     default:
2037       gcc_unreachable ();
2038     }
2039
2040   /* If uses an address, must return original expression.  But set the
2041      ATTR_IND_SIMPLIFIED_P bit so we don't try to simplify it again.  */
2042
2043   address_used = 0;
2044   walk_attr_value (newexp);
2045
2046   if (address_used)
2047     {
2048       if (! ATTR_IND_SIMPLIFIED_P (exp))
2049         return copy_rtx_unchanging (exp);
2050       return exp;
2051     }
2052   else
2053     return newexp;
2054 }
2055
2056 /* This routine is called when an AND of a term with a tree of AND's is
2057    encountered.  If the term or its complement is present in the tree, it
2058    can be replaced with TRUE or FALSE, respectively.
2059
2060    Note that (eq_attr "att" "v1") and (eq_attr "att" "v2") cannot both
2061    be true and hence are complementary.
2062
2063    There is one special case:  If we see
2064         (and (not (eq_attr "att" "v1"))
2065              (eq_attr "att" "v2"))
2066    this can be replaced by (eq_attr "att" "v2").  To do this we need to
2067    replace the term, not anything in the AND tree.  So we pass a pointer to
2068    the term.  */
2069
2070 static rtx
2071 simplify_and_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2072 {
2073   rtx left, right;
2074   rtx newexp;
2075   rtx temp;
2076   int left_eliminates_term, right_eliminates_term;
2077
2078   if (GET_CODE (exp) == AND)
2079     {
2080       left  = simplify_and_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2081       right = simplify_and_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2082       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2083         {
2084           newexp = attr_rtx (AND, left, right);
2085
2086           exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2087         }
2088     }
2089
2090   else if (GET_CODE (exp) == IOR)
2091     {
2092       /* For the IOR case, we do the same as above, except that we can
2093          only eliminate `term' if both sides of the IOR would do so.  */
2094       temp = *pterm;
2095       left = simplify_and_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2096       left_eliminates_term = (temp == true_rtx);
2097
2098       temp = *pterm;
2099       right = simplify_and_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2100       right_eliminates_term = (temp == true_rtx);
2101
2102       if (left_eliminates_term && right_eliminates_term)
2103         *pterm = true_rtx;
2104
2105       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2106         {
2107           newexp = attr_rtx (IOR, left, right);
2108
2109           exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2110         }
2111     }
2112
2113   /* Check for simplifications.  Do some extra checking here since this
2114      routine is called so many times.  */
2115
2116   if (exp == *pterm)
2117     return true_rtx;
2118
2119   else if (GET_CODE (exp) == NOT && XEXP (exp, 0) == *pterm)
2120     return false_rtx;
2121
2122   else if (GET_CODE (*pterm) == NOT && exp == XEXP (*pterm, 0))
2123     return false_rtx;
2124
2125   else if (GET_CODE (exp) == EQ_ATTR_ALT && GET_CODE (*pterm) == EQ_ATTR_ALT)
2126     {
2127       if (attr_alt_subset_p (*pterm, exp))
2128         return true_rtx;
2129
2130       if (attr_alt_subset_of_compl_p (*pterm, exp))
2131         return false_rtx;
2132
2133       if (attr_alt_subset_p (exp, *pterm))
2134         *pterm = true_rtx;
2135
2136       return exp;
2137     }
2138
2139   else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == EQ_ATTR)
2140     {
2141       if (XSTR (exp, 0) != XSTR (*pterm, 0))
2142         return exp;
2143
2144       if (! strcmp_check (XSTR (exp, 1), XSTR (*pterm, 1)))
2145         return true_rtx;
2146       else
2147         return false_rtx;
2148     }
2149
2150   else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2151            && GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
2152     {
2153       if (XSTR (*pterm, 0) != XSTR (XEXP (exp, 0), 0))
2154         return exp;
2155
2156       if (! strcmp_check (XSTR (*pterm, 1), XSTR (XEXP (exp, 0), 1)))
2157         return false_rtx;
2158       else
2159         return true_rtx;
2160     }
2161
2162   else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2163            && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR)
2164     {
2165       if (XSTR (exp, 0) != XSTR (XEXP (*pterm, 0), 0))
2166         return exp;
2167
2168       if (! strcmp_check (XSTR (exp, 1), XSTR (XEXP (*pterm, 0), 1)))
2169         return false_rtx;
2170       else
2171         *pterm = true_rtx;
2172     }
2173
2174   else if (GET_CODE (exp) == NOT && GET_CODE (*pterm) == NOT)
2175     {
2176       if (attr_equal_p (XEXP (exp, 0), XEXP (*pterm, 0)))
2177         return true_rtx;
2178     }
2179
2180   else if (GET_CODE (exp) == NOT)
2181     {
2182       if (attr_equal_p (XEXP (exp, 0), *pterm))
2183         return false_rtx;
2184     }
2185
2186   else if (GET_CODE (*pterm) == NOT)
2187     {
2188       if (attr_equal_p (XEXP (*pterm, 0), exp))
2189         return false_rtx;
2190     }
2191
2192   else if (attr_equal_p (exp, *pterm))
2193     return true_rtx;
2194
2195   return exp;
2196 }
2197
2198 /* Similar to `simplify_and_tree', but for IOR trees.  */
2199
2200 static rtx
2201 simplify_or_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2202 {
2203   rtx left, right;
2204   rtx newexp;
2205   rtx temp;
2206   int left_eliminates_term, right_eliminates_term;
2207
2208   if (GET_CODE (exp) == IOR)
2209     {
2210       left  = simplify_or_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2211       right = simplify_or_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2212       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2213         {
2214           newexp = attr_rtx (GET_CODE (exp), left, right);
2215
2216           exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2217         }
2218     }
2219
2220   else if (GET_CODE (exp) == AND)
2221     {
2222       /* For the AND case, we do the same as above, except that we can
2223          only eliminate `term' if both sides of the AND would do so.  */
2224       temp = *pterm;
2225       left = simplify_or_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2226       left_eliminates_term = (temp == false_rtx);
2227
2228       temp = *pterm;
2229       right = simplify_or_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2230       right_eliminates_term = (temp == false_rtx);
2231
2232       if (left_eliminates_term && right_eliminates_term)
2233         *pterm = false_rtx;
2234
2235       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2236         {
2237           newexp = attr_rtx (GET_CODE (exp), left, right);
2238
2239           exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2240         }
2241     }
2242
2243   if (attr_equal_p (exp, *pterm))
2244     return false_rtx;
2245
2246   else if (GET_CODE (exp) == NOT && attr_equal_p (XEXP (exp, 0), *pterm))
2247     return true_rtx;
2248
2249   else if (GET_CODE (*pterm) == NOT && attr_equal_p (XEXP (*pterm, 0), exp))
2250     return true_rtx;
2251
2252   else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2253            && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
2254            && XSTR (*pterm, 0) == XSTR (XEXP (exp, 0), 0))
2255     *pterm = false_rtx;
2256
2257   else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2258            && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR
2259            && XSTR (exp, 0) == XSTR (XEXP (*pterm, 0), 0))
2260     return false_rtx;
2261
2262   return exp;
2263 }
2264
2265 /* Compute approximate cost of the expression.  Used to decide whether
2266    expression is cheap enough for inline.  */
2267 static int
2268 attr_rtx_cost (rtx x)
2269 {
2270   int cost = 0;
2271   enum rtx_code code;
2272   if (!x)
2273     return 0;
2274   code = GET_CODE (x);
2275   switch (code)
2276     {
2277     case MATCH_OPERAND:
2278       if (XSTR (x, 1)[0])
2279         return 10;
2280       else
2281         return 0;
2282
2283     case EQ_ATTR_ALT:
2284       return 0;
2285
2286     case EQ_ATTR:
2287       /* Alternatives don't result into function call.  */
2288       if (!strcmp_check (XSTR (x, 0), alternative_name))
2289         return 0;
2290       else
2291         return 5;
2292     default:
2293       {
2294         int i, j;
2295         const char *fmt = GET_RTX_FORMAT (code);
2296         for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2297           {
2298             switch (fmt[i])
2299               {
2300               case 'V':
2301               case 'E':
2302                 for (j = 0; j < XVECLEN (x, i); j++)
2303                   cost += attr_rtx_cost (XVECEXP (x, i, j));
2304                 break;
2305               case 'e':
2306                 cost += attr_rtx_cost (XEXP (x, i));
2307                 break;
2308               }
2309           }
2310       }
2311       break;
2312     }
2313   return cost;
2314 }
2315
2316 /* Simplify test expression and use temporary obstack in order to avoid
2317    memory bloat.  Use ATTR_IND_SIMPLIFIED to avoid unnecessary simplifications
2318    and avoid unnecessary copying if possible.  */
2319
2320 static rtx
2321 simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
2322 {
2323   rtx x;
2324   struct obstack *old;
2325   if (ATTR_IND_SIMPLIFIED_P (exp))
2326     return exp;
2327   old = rtl_obstack;
2328   rtl_obstack = temp_obstack;
2329   x = simplify_test_exp (exp, insn_code, insn_index);
2330   rtl_obstack = old;
2331   if (x == exp || rtl_obstack == temp_obstack)
2332     return x;
2333   return attr_copy_rtx (x);
2334 }
2335
2336 /* Returns true if S1 is a subset of S2.  */
2337
2338 static bool
2339 attr_alt_subset_p (rtx s1, rtx s2)
2340 {
2341   switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2342     {
2343     case (0 << 1) | 0:
2344       return !(XINT (s1, 0) &~ XINT (s2, 0));
2345
2346     case (0 << 1) | 1:
2347       return !(XINT (s1, 0) & XINT (s2, 0));
2348
2349     case (1 << 1) | 0:
2350       return false;
2351
2352     case (1 << 1) | 1:
2353       return !(XINT (s2, 0) &~ XINT (s1, 0));
2354
2355     default:
2356       gcc_unreachable ();
2357     }
2358 }
2359
2360 /* Returns true if S1 is a subset of complement of S2.  */
2361
2362 static bool
2363 attr_alt_subset_of_compl_p (rtx s1, rtx s2)
2364 {
2365   switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2366     {
2367     case (0 << 1) | 0:
2368       return !(XINT (s1, 0) & XINT (s2, 0));
2369
2370     case (0 << 1) | 1:
2371       return !(XINT (s1, 0) & ~XINT (s2, 0));
2372
2373     case (1 << 1) | 0:
2374       return !(XINT (s2, 0) &~ XINT (s1, 0));
2375
2376     case (1 << 1) | 1:
2377       return false;
2378
2379     default:
2380       gcc_unreachable ();
2381     }
2382 }
2383
2384 /* Return EQ_ATTR_ALT expression representing intersection of S1 and S2.  */
2385
2386 static rtx
2387 attr_alt_intersection (rtx s1, rtx s2)
2388 {
2389   rtx result = rtx_alloc (EQ_ATTR_ALT);
2390
2391   switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2392     {
2393     case (0 << 1) | 0:
2394       XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2395       break;
2396     case (0 << 1) | 1:
2397       XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2398       break;
2399     case (1 << 1) | 0:
2400       XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2401       break;
2402     case (1 << 1) | 1:
2403       XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2404       break;
2405     default:
2406       gcc_unreachable ();
2407     }
2408   XINT (result, 1) = XINT (s1, 1) & XINT (s2, 1);
2409
2410   return result;
2411 }
2412
2413 /* Return EQ_ATTR_ALT expression representing union of S1 and S2.  */
2414
2415 static rtx
2416 attr_alt_union (rtx s1, rtx s2)
2417 {
2418   rtx result = rtx_alloc (EQ_ATTR_ALT);
2419
2420   switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2421     {
2422     case (0 << 1) | 0:
2423       XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2424       break;
2425     case (0 << 1) | 1:
2426       XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2427       break;
2428     case (1 << 1) | 0:
2429       XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2430       break;
2431     case (1 << 1) | 1:
2432       XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2433       break;
2434     default:
2435       gcc_unreachable ();
2436     }
2437
2438   XINT (result, 1) = XINT (s1, 1) | XINT (s2, 1);
2439   return result;
2440 }
2441
2442 /* Return EQ_ATTR_ALT expression representing complement of S.  */
2443
2444 static rtx
2445 attr_alt_complement (rtx s)
2446 {
2447   rtx result = rtx_alloc (EQ_ATTR_ALT);
2448
2449   XINT (result, 0) = XINT (s, 0);
2450   XINT (result, 1) = 1 - XINT (s, 1);
2451
2452   return result;
2453 }
2454
2455 /* Return EQ_ATTR_ALT expression representing set containing elements set
2456    in E.  */
2457
2458 static rtx
2459 mk_attr_alt (int e)
2460 {
2461   rtx result = rtx_alloc (EQ_ATTR_ALT);
2462
2463   XINT (result, 0) = e;
2464   XINT (result, 1) = 0;
2465
2466   return result;
2467 }
2468
2469 /* Given an expression, see if it can be simplified for a particular insn
2470    code based on the values of other attributes being tested.  This can
2471    eliminate nested get_attr_... calls.
2472
2473    Note that if an endless recursion is specified in the patterns, the
2474    optimization will loop.  However, it will do so in precisely the cases where
2475    an infinite recursion loop could occur during compilation.  It's better that
2476    it occurs here!  */
2477
2478 static rtx
2479 simplify_test_exp (rtx exp, int insn_code, int insn_index)
2480 {
2481   rtx left, right;
2482   struct attr_desc *attr;
2483   struct attr_value *av;
2484   struct insn_ent *ie;
2485   struct attr_value_list *iv;
2486   int i;
2487   rtx newexp = exp;
2488   bool left_alt, right_alt;
2489
2490   /* Don't re-simplify something we already simplified.  */
2491   if (ATTR_IND_SIMPLIFIED_P (exp) || ATTR_CURR_SIMPLIFIED_P (exp))
2492     return exp;
2493
2494   switch (GET_CODE (exp))
2495     {
2496     case AND:
2497       left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2498       if (left == false_rtx)
2499         return false_rtx;
2500       right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2501       if (right == false_rtx)
2502         return false_rtx;
2503
2504       if (GET_CODE (left) == EQ_ATTR_ALT
2505           && GET_CODE (right) == EQ_ATTR_ALT)
2506         {
2507           exp = attr_alt_intersection (left, right);
2508           return simplify_test_exp (exp, insn_code, insn_index);
2509         }
2510
2511       /* If either side is an IOR and we have (eq_attr "alternative" ..")
2512          present on both sides, apply the distributive law since this will
2513          yield simplifications.  */
2514       if ((GET_CODE (left) == IOR || GET_CODE (right) == IOR)
2515           && compute_alternative_mask (left, IOR)
2516           && compute_alternative_mask (right, IOR))
2517         {
2518           if (GET_CODE (left) == IOR)
2519             {
2520               rtx tem = left;
2521               left = right;
2522               right = tem;
2523             }
2524
2525           newexp = attr_rtx (IOR,
2526                              attr_rtx (AND, left, XEXP (right, 0)),
2527                              attr_rtx (AND, left, XEXP (right, 1)));
2528
2529           return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2530         }
2531
2532       /* Try with the term on both sides.  */
2533       right = simplify_and_tree (right, &left, insn_code, insn_index);
2534       if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2535         left = simplify_and_tree (left, &right, insn_code, insn_index);
2536
2537       if (left == false_rtx || right == false_rtx)
2538         return false_rtx;
2539       else if (left == true_rtx)
2540         {
2541           return right;
2542         }
2543       else if (right == true_rtx)
2544         {
2545           return left;
2546         }
2547       /* See if all or all but one of the insn's alternatives are specified
2548          in this tree.  Optimize if so.  */
2549
2550       if (GET_CODE (left) == NOT)
2551         left_alt = (GET_CODE (XEXP (left, 0)) == EQ_ATTR
2552                     && XSTR (XEXP (left, 0), 0) == alternative_name);
2553       else
2554         left_alt = (GET_CODE (left) == EQ_ATTR_ALT
2555                     && XINT (left, 1));
2556
2557       if (GET_CODE (right) == NOT)
2558         right_alt = (GET_CODE (XEXP (right, 0)) == EQ_ATTR
2559                      && XSTR (XEXP (right, 0), 0) == alternative_name);
2560       else
2561         right_alt = (GET_CODE (right) == EQ_ATTR_ALT
2562                      && XINT (right, 1));
2563
2564       if (insn_code >= 0
2565           && (GET_CODE (left) == AND
2566               || left_alt
2567               || GET_CODE (right) == AND
2568               || right_alt))
2569         {
2570           i = compute_alternative_mask (exp, AND);
2571           if (i & ~insn_alternatives[insn_code])
2572             fatal ("invalid alternative specified for pattern number %d",
2573                    insn_index);
2574
2575           /* If all alternatives are excluded, this is false.  */
2576           i ^= insn_alternatives[insn_code];
2577           if (i == 0)
2578             return false_rtx;
2579           else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2580             {
2581               /* If just one excluded, AND a comparison with that one to the
2582                  front of the tree.  The others will be eliminated by
2583                  optimization.  We do not want to do this if the insn has one
2584                  alternative and we have tested none of them!  */
2585               left = make_alternative_compare (i);
2586               right = simplify_and_tree (exp, &left, insn_code, insn_index);
2587               newexp = attr_rtx (AND, left, right);
2588
2589               return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2590             }
2591         }
2592
2593       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2594         {
2595           newexp = attr_rtx (AND, left, right);
2596           return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2597         }
2598       break;
2599
2600     case IOR:
2601       left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2602       if (left == true_rtx)
2603         return true_rtx;
2604       right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2605       if (right == true_rtx)
2606         return true_rtx;
2607
2608       if (GET_CODE (left) == EQ_ATTR_ALT
2609           && GET_CODE (right) == EQ_ATTR_ALT)
2610         {
2611           exp = attr_alt_union (left, right);
2612           return simplify_test_exp (exp, insn_code, insn_index);
2613         }
2614
2615       right = simplify_or_tree (right, &left, insn_code, insn_index);
2616       if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2617         left = simplify_or_tree (left, &right, insn_code, insn_index);
2618
2619       if (right == true_rtx || left == true_rtx)
2620         return true_rtx;
2621       else if (left == false_rtx)
2622         {
2623           return right;
2624         }
2625       else if (right == false_rtx)
2626         {
2627           return left;
2628         }
2629
2630       /* Test for simple cases where the distributive law is useful.  I.e.,
2631             convert (ior (and (x) (y))
2632                          (and (x) (z)))
2633             to      (and (x)
2634                          (ior (y) (z)))
2635        */
2636
2637       else if (GET_CODE (left) == AND && GET_CODE (right) == AND
2638                && attr_equal_p (XEXP (left, 0), XEXP (right, 0)))
2639         {
2640           newexp = attr_rtx (IOR, XEXP (left, 1), XEXP (right, 1));
2641
2642           left = XEXP (left, 0);
2643           right = newexp;
2644           newexp = attr_rtx (AND, left, right);
2645           return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2646         }
2647
2648       /* See if all or all but one of the insn's alternatives are specified
2649          in this tree.  Optimize if so.  */
2650
2651       else if (insn_code >= 0
2652                && (GET_CODE (left) == IOR
2653                    || (GET_CODE (left) == EQ_ATTR_ALT
2654                        && !XINT (left, 1))
2655                    || (GET_CODE (left) == EQ_ATTR
2656                        && XSTR (left, 0) == alternative_name)
2657                    || GET_CODE (right) == IOR
2658                    || (GET_CODE (right) == EQ_ATTR_ALT
2659                        && !XINT (right, 1))
2660                    || (GET_CODE (right) == EQ_ATTR
2661                        && XSTR (right, 0) == alternative_name)))
2662         {
2663           i = compute_alternative_mask (exp, IOR);
2664           if (i & ~insn_alternatives[insn_code])
2665             fatal ("invalid alternative specified for pattern number %d",
2666                    insn_index);
2667
2668           /* If all alternatives are included, this is true.  */
2669           i ^= insn_alternatives[insn_code];
2670           if (i == 0)
2671             return true_rtx;
2672           else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2673             {
2674               /* If just one excluded, IOR a comparison with that one to the
2675                  front of the tree.  The others will be eliminated by
2676                  optimization.  We do not want to do this if the insn has one
2677                  alternative and we have tested none of them!  */
2678               left = make_alternative_compare (i);
2679               right = simplify_and_tree (exp, &left, insn_code, insn_index);
2680               newexp = attr_rtx (IOR, attr_rtx (NOT, left), right);
2681
2682               return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2683             }
2684         }
2685
2686       if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2687         {
2688           newexp = attr_rtx (IOR, left, right);
2689           return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2690         }
2691       break;
2692
2693     case NOT:
2694       if (GET_CODE (XEXP (exp, 0)) == NOT)
2695         {
2696           left = SIMPLIFY_TEST_EXP (XEXP (XEXP (exp, 0), 0),
2697                                     insn_code, insn_index);
2698           return left;
2699         }
2700
2701       left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2702       if (GET_CODE (left) == NOT)
2703         return XEXP (left, 0);
2704
2705       if (left == false_rtx)
2706         return true_rtx;
2707       if (left == true_rtx)
2708         return false_rtx;
2709
2710       if (GET_CODE (left) == EQ_ATTR_ALT)
2711         {
2712           exp = attr_alt_complement (left);
2713           return simplify_test_exp (exp, insn_code, insn_index);
2714         }
2715
2716       /* Try to apply De`Morgan's laws.  */
2717       if (GET_CODE (left) == IOR)
2718         {
2719           newexp = attr_rtx (AND,
2720                              attr_rtx (NOT, XEXP (left, 0)),
2721                              attr_rtx (NOT, XEXP (left, 1)));
2722
2723           newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2724         }
2725       else if (GET_CODE (left) == AND)
2726         {
2727           newexp = attr_rtx (IOR,
2728                              attr_rtx (NOT, XEXP (left, 0)),
2729                              attr_rtx (NOT, XEXP (left, 1)));
2730
2731           newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2732         }
2733       else if (left != XEXP (exp, 0))
2734         {
2735           newexp = attr_rtx (NOT, left);
2736         }
2737       break;
2738
2739     case EQ_ATTR_ALT:
2740       if (!XINT (exp, 0))
2741         return XINT (exp, 1) ? true_rtx : false_rtx;
2742       break;
2743
2744     case EQ_ATTR:
2745       if (XSTR (exp, 0) == alternative_name)
2746         {
2747           newexp = mk_attr_alt (1 << atoi (XSTR (exp, 1)));
2748           break;
2749         }
2750
2751       /* Look at the value for this insn code in the specified attribute.
2752          We normally can replace this comparison with the condition that
2753          would give this insn the values being tested for.  */
2754       if (insn_code >= 0
2755           && (attr = find_attr (&XSTR (exp, 0), 0)) != NULL)
2756         {
2757           rtx x;
2758
2759           av = NULL;
2760           if (insn_code_values)
2761             {
2762               for (iv = insn_code_values[insn_code]; iv; iv = iv->next)
2763                 if (iv->attr == attr)
2764                   {
2765                     av = iv->av;
2766                     break;
2767                   }
2768             }
2769           else
2770             {
2771               for (av = attr->first_value; av; av = av->next)
2772                 for (ie = av->first_insn; ie; ie = ie->next)
2773                   if (ie->def->insn_code == insn_code)
2774                     goto got_av;
2775             }
2776
2777           if (av)
2778             {
2779             got_av:
2780               x = evaluate_eq_attr (exp, attr, av->value,
2781                                     insn_code, insn_index);
2782               x = SIMPLIFY_TEST_EXP (x, insn_code, insn_index);
2783               if (attr_rtx_cost(x) < 20)
2784                 return x;
2785             }
2786         }
2787       break;
2788
2789     default:
2790       break;
2791     }
2792
2793   /* We have already simplified this expression.  Simplifying it again
2794      won't buy anything unless we weren't given a valid insn code
2795      to process (i.e., we are canonicalizing something.).  */
2796   if (insn_code != -2
2797       && ! ATTR_IND_SIMPLIFIED_P (newexp))
2798     return copy_rtx_unchanging (newexp);
2799
2800   return newexp;
2801 }
2802
2803 /* Optimize the attribute lists by seeing if we can determine conditional
2804    values from the known values of other attributes.  This will save subroutine
2805    calls during the compilation.  */
2806
2807 static void
2808 optimize_attrs (void)
2809 {
2810   struct attr_desc *attr;
2811   struct attr_value *av;
2812   struct insn_ent *ie;
2813   rtx newexp;
2814   int i;
2815   struct attr_value_list *ivbuf;
2816   struct attr_value_list *iv;
2817
2818   /* For each insn code, make a list of all the insn_ent's for it,
2819      for all values for all attributes.  */
2820
2821   if (num_insn_ents == 0)
2822     return;
2823
2824   /* Make 2 extra elements, for "code" values -2 and -1.  */
2825   insn_code_values = XCNEWVEC (struct attr_value_list *, insn_code_number + 2);
2826
2827   /* Offset the table address so we can index by -2 or -1.  */
2828   insn_code_values += 2;
2829
2830   iv = ivbuf = XNEWVEC (struct attr_value_list, num_insn_ents);
2831
2832   for (i = 0; i < MAX_ATTRS_INDEX; i++)
2833     for (attr = attrs[i]; attr; attr = attr->next)
2834       for (av = attr->first_value; av; av = av->next)
2835         for (ie = av->first_insn; ie; ie = ie->next)
2836           {
2837             iv->attr = attr;
2838             iv->av = av;
2839             iv->ie = ie;
2840             iv->next = insn_code_values[ie->def->insn_code];
2841             insn_code_values[ie->def->insn_code] = iv;
2842             iv++;
2843           }
2844
2845   /* Sanity check on num_insn_ents.  */
2846   gcc_assert (iv == ivbuf + num_insn_ents);
2847
2848   /* Process one insn code at a time.  */
2849   for (i = -2; i < insn_code_number; i++)
2850     {
2851       /* Clear the ATTR_CURR_SIMPLIFIED_P flag everywhere relevant.
2852          We use it to mean "already simplified for this insn".  */
2853       for (iv = insn_code_values[i]; iv; iv = iv->next)
2854         clear_struct_flag (iv->av->value);
2855
2856       for (iv = insn_code_values[i]; iv; iv = iv->next)
2857         {
2858           struct obstack *old = rtl_obstack;
2859
2860           attr = iv->attr;
2861           av = iv->av;
2862           ie = iv->ie;
2863           if (GET_CODE (av->value) != COND)
2864             continue;
2865
2866           rtl_obstack = temp_obstack;
2867           newexp = av->value;
2868           while (GET_CODE (newexp) == COND)
2869             {
2870               rtx newexp2 = simplify_cond (newexp, ie->def->insn_code,
2871                                            ie->def->insn_index);
2872               if (newexp2 == newexp)
2873                 break;
2874               newexp = newexp2;
2875             }
2876
2877           rtl_obstack = old;
2878           if (newexp != av->value)
2879             {
2880               newexp = attr_copy_rtx (newexp);
2881               remove_insn_ent (av, ie);
2882               av = get_attr_value (newexp, attr, ie->def->insn_code);
2883               iv->av = av;
2884               insert_insn_ent (av, ie);
2885             }
2886         }
2887     }
2888
2889   free (ivbuf);
2890   free (insn_code_values - 2);
2891   insn_code_values = NULL;
2892 }
2893
2894 /* Clear the ATTR_CURR_SIMPLIFIED_P flag in EXP and its subexpressions.  */
2895
2896 static void
2897 clear_struct_flag (rtx x)
2898 {
2899   int i;
2900   int j;
2901   enum rtx_code code;
2902   const char *fmt;
2903
2904   ATTR_CURR_SIMPLIFIED_P (x) = 0;
2905   if (ATTR_IND_SIMPLIFIED_P (x))
2906     return;
2907
2908   code = GET_CODE (x);
2909
2910   switch (code)
2911     {
2912     case REG:
2913     case CONST_INT:
2914     case CONST_DOUBLE:
2915     case CONST_VECTOR:
2916     case MATCH_TEST:
2917     case SYMBOL_REF:
2918     case CODE_LABEL:
2919     case PC:
2920     case CC0:
2921     case EQ_ATTR:
2922     case ATTR_FLAG:
2923       return;
2924
2925     default:
2926       break;
2927     }
2928
2929   /* Compare the elements.  If any pair of corresponding elements
2930      fail to match, return 0 for the whole things.  */
2931
2932   fmt = GET_RTX_FORMAT (code);
2933   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2934     {
2935       switch (fmt[i])
2936         {
2937         case 'V':
2938         case 'E':
2939           for (j = 0; j < XVECLEN (x, i); j++)
2940             clear_struct_flag (XVECEXP (x, i, j));
2941           break;
2942
2943         case 'e':
2944           clear_struct_flag (XEXP (x, i));
2945           break;
2946         }
2947     }
2948 }
2949
2950 /* Add attribute value NAME to the beginning of ATTR's list.  */
2951
2952 static void
2953 add_attr_value (struct attr_desc *attr, const char *name)
2954 {
2955   struct attr_value *av;
2956
2957   av = oballoc (struct attr_value);
2958   av->value = attr_rtx (CONST_STRING, name);
2959   av->next = attr->first_value;
2960   attr->first_value = av;
2961   av->first_insn = NULL;
2962   av->num_insns = 0;
2963   av->has_asm_insn = 0;
2964 }
2965
2966 /* Create table entries for DEFINE_ATTR or DEFINE_ENUM_ATTR.  */
2967
2968 static void
2969 gen_attr (rtx exp, int lineno)
2970 {
2971   struct enum_type *et;
2972   struct enum_value *ev;
2973   struct attr_desc *attr;
2974   const char *name_ptr;
2975   char *p;
2976
2977   /* Make a new attribute structure.  Check for duplicate by looking at
2978      attr->default_val, since it is initialized by this routine.  */
2979   attr = find_attr (&XSTR (exp, 0), 1);
2980   if (attr->default_val)
2981     {
2982       error_with_line (lineno, "duplicate definition for attribute %s",
2983                        attr->name);
2984       message_with_line (attr->lineno, "previous definition");
2985       return;
2986     }
2987   attr->lineno = lineno;
2988
2989   if (GET_CODE (exp) == DEFINE_ENUM_ATTR)
2990     {
2991       attr->enum_name = XSTR (exp, 1);
2992       et = lookup_enum_type (XSTR (exp, 1));
2993       if (!et || !et->md_p)
2994         error_with_line (lineno, "No define_enum called `%s' defined",
2995                          attr->name);
2996       for (ev = et->values; ev; ev = ev->next)
2997         add_attr_value (attr, ev->name);
2998     }
2999   else if (*XSTR (exp, 1) == '\0')
3000     attr->is_numeric = 1;
3001   else
3002     {
3003       name_ptr = XSTR (exp, 1);
3004       while ((p = next_comma_elt (&name_ptr)) != NULL)
3005         add_attr_value (attr, p);
3006     }
3007
3008   if (GET_CODE (XEXP (exp, 2)) == CONST)
3009     {
3010       attr->is_const = 1;
3011       if (attr->is_numeric)
3012         error_with_line (lineno,
3013                          "constant attributes may not take numeric values");
3014
3015       /* Get rid of the CONST node.  It is allowed only at top-level.  */
3016       XEXP (exp, 2) = XEXP (XEXP (exp, 2), 0);
3017     }
3018
3019   if (! strcmp_check (attr->name, length_str) && ! attr->is_numeric)
3020     error_with_line (lineno, "`length' attribute must take numeric values");
3021
3022   /* Set up the default value.  */
3023   XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
3024   attr->default_val = get_attr_value (XEXP (exp, 2), attr, -2);
3025 }
3026
3027 /* Given a pattern for DEFINE_PEEPHOLE or DEFINE_INSN, return the number of
3028    alternatives in the constraints.  Assume all MATCH_OPERANDs have the same
3029    number of alternatives as this should be checked elsewhere.  */
3030
3031 static int
3032 count_alternatives (rtx exp)
3033 {
3034   int i, j, n;
3035   const char *fmt;
3036
3037   if (GET_CODE (exp) == MATCH_OPERAND)
3038     return n_comma_elts (XSTR (exp, 2));
3039
3040   for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3041        i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3042     switch (*fmt++)
3043       {
3044       case 'e':
3045       case 'u':
3046         n = count_alternatives (XEXP (exp, i));
3047         if (n)
3048           return n;
3049         break;
3050
3051       case 'E':
3052       case 'V':
3053         if (XVEC (exp, i) != NULL)
3054           for (j = 0; j < XVECLEN (exp, i); j++)
3055             {
3056               n = count_alternatives (XVECEXP (exp, i, j));
3057               if (n)
3058                 return n;
3059             }
3060       }
3061
3062   return 0;
3063 }
3064
3065 /* Returns nonzero if the given expression contains an EQ_ATTR with the
3066    `alternative' attribute.  */
3067
3068 static int
3069 compares_alternatives_p (rtx exp)
3070 {
3071   int i, j;
3072   const char *fmt;
3073
3074   if (GET_CODE (exp) == EQ_ATTR && XSTR (exp, 0) == alternative_name)
3075     return 1;
3076
3077   for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3078        i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3079     switch (*fmt++)
3080       {
3081       case 'e':
3082       case 'u':
3083         if (compares_alternatives_p (XEXP (exp, i)))
3084           return 1;
3085         break;
3086
3087       case 'E':
3088         for (j = 0; j < XVECLEN (exp, i); j++)
3089           if (compares_alternatives_p (XVECEXP (exp, i, j)))
3090             return 1;
3091         break;
3092       }
3093
3094   return 0;
3095 }
3096
3097 /* Process DEFINE_PEEPHOLE, DEFINE_INSN, and DEFINE_ASM_ATTRIBUTES.  */
3098
3099 static void
3100 gen_insn (rtx exp, int lineno)
3101 {
3102   struct insn_def *id;
3103
3104   id = oballoc (struct insn_def);
3105   id->next = defs;
3106   defs = id;
3107   id->def = exp;
3108   id->lineno = lineno;
3109
3110   switch (GET_CODE (exp))
3111     {
3112     case DEFINE_INSN:
3113       id->insn_code = insn_code_number;
3114       id->insn_index = insn_index_number;
3115       id->num_alternatives = count_alternatives (exp);
3116       if (id->num_alternatives == 0)
3117         id->num_alternatives = 1;
3118       id->vec_idx = 4;
3119       break;
3120
3121     case DEFINE_PEEPHOLE:
3122       id->insn_code = insn_code_number;
3123       id->insn_index = insn_index_number;
3124       id->num_alternatives = count_alternatives (exp);
3125       if (id->num_alternatives == 0)
3126         id->num_alternatives = 1;
3127       id->vec_idx = 3;
3128       break;
3129
3130     case DEFINE_ASM_ATTRIBUTES:
3131       id->insn_code = -1;
3132       id->insn_index = -1;
3133       id->num_alternatives = 1;
3134       id->vec_idx = 0;
3135       got_define_asm_attributes = 1;
3136       break;
3137
3138     default:
3139       gcc_unreachable ();
3140     }
3141 }
3142
3143 /* Process a DEFINE_DELAY.  Validate the vector length, check if annul
3144    true or annul false is specified, and make a `struct delay_desc'.  */
3145
3146 static void
3147 gen_delay (rtx def, int lineno)
3148 {
3149   struct delay_desc *delay;
3150   int i;
3151
3152   if (XVECLEN (def, 1) % 3 != 0)
3153     {
3154       error_with_line (lineno,
3155                        "number of elements in DEFINE_DELAY must"
3156                        " be multiple of three");
3157       return;
3158     }
3159
3160   for (i = 0; i < XVECLEN (def, 1); i += 3)
3161     {
3162       if (XVECEXP (def, 1, i + 1))
3163         have_annul_true = 1;
3164       if (XVECEXP (def, 1, i + 2))
3165         have_annul_false = 1;
3166     }
3167
3168   delay = oballoc (struct delay_desc);
3169   delay->def = def;
3170   delay->num = ++num_delays;
3171   delay->next = delays;
3172   delay->lineno = lineno;
3173   delays = delay;
3174 }
3175
3176 /* Names of attributes that could be possibly cached.  */
3177 static const char *cached_attrs[32];
3178 /* Number of such attributes.  */
3179 static int cached_attr_count;
3180 /* Bitmasks of possibly cached attributes.  */
3181 static unsigned int attrs_seen_once, attrs_seen_more_than_once;
3182 static unsigned int attrs_to_cache;
3183 static unsigned int attrs_cached_inside, attrs_cached_after;
3184
3185 /* Finds non-const attributes that could be possibly cached.
3186    When create is TRUE, fills in cached_attrs array.
3187    Computes ATTRS_SEEN_ONCE and ATTRS_SEEN_MORE_THAN_ONCE
3188    bitmasks.  */
3189
3190 static void
3191 find_attrs_to_cache (rtx exp, bool create)
3192 {
3193   int i;
3194   const char *name;
3195   struct attr_desc *attr;
3196
3197   if (exp == NULL)
3198     return;
3199
3200   switch (GET_CODE (exp))
3201     {
3202     case NOT:
3203       if (GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
3204         find_attrs_to_cache (XEXP (exp, 0), create);
3205       return;
3206
3207     case EQ_ATTR:
3208       name = XSTR (exp, 0);
3209       if (name == alternative_name)
3210         return;
3211       for (i = 0; i < cached_attr_count; i++)
3212         if (name == cached_attrs[i])
3213           {
3214             if ((attrs_seen_once & (1U << i)) != 0)
3215               attrs_seen_more_than_once |= (1U << i);
3216             else
3217               attrs_seen_once |= (1U << i);
3218             return;
3219           }
3220       if (!create)
3221         return;
3222       attr = find_attr (&name, 0);
3223       gcc_assert (attr);
3224       if (attr->is_const)
3225         return;
3226       if (cached_attr_count == 32)
3227         return;
3228       cached_attrs[cached_attr_count] = XSTR (exp, 0);
3229       attrs_seen_once |= (1U << cached_attr_count);
3230       cached_attr_count++;
3231       return;
3232
3233     case AND:
3234     case IOR:
3235       find_attrs_to_cache (XEXP (exp, 0), create);
3236       find_attrs_to_cache (XEXP (exp, 1), create);
3237       return;
3238
3239     case COND:
3240       for (i = 0; i < XVECLEN (exp, 0); i += 2)
3241         find_attrs_to_cache (XVECEXP (exp, 0, i), create);
3242       return;
3243
3244     default:
3245       return;
3246     }
3247 }
3248
3249 /* Given a piece of RTX, print a C expression to test its truth value.
3250    We use AND and IOR both for logical and bit-wise operations, so
3251    interpret them as logical unless they are inside a comparison expression.  */
3252
3253 /* Interpret AND/IOR as bit-wise operations instead of logical.  */
3254 #define FLG_BITWISE             1
3255 /* Set if cached attribute will be known initialized in else block after
3256    this condition.  This is true for LHS of toplevel && and || and
3257    even for RHS of ||, but not for RHS of &&.  */
3258 #define FLG_AFTER               2
3259 /* Set if cached attribute will be known initialized in then block after
3260    this condition.  This is true for LHS of toplevel && and || and
3261    even for RHS of &&, but not for RHS of ||.  */
3262 #define FLG_INSIDE              4
3263 /* Cleared when an operand of &&.  */
3264 #define FLG_OUTSIDE_AND         8
3265
3266 static unsigned int
3267 write_test_expr (rtx exp, unsigned int attrs_cached, int flags)
3268 {
3269   int comparison_operator = 0;
3270   RTX_CODE code;
3271   struct attr_desc *attr;
3272
3273   /* In order not to worry about operator precedence, surround our part of
3274      the expression with parentheses.  */
3275
3276   printf ("(");
3277   code = GET_CODE (exp);
3278   switch (code)
3279     {
3280     /* Binary operators.  */
3281     case GEU: case GTU:
3282     case LEU: case LTU:
3283       printf ("(unsigned) ");
3284       /* Fall through.  */
3285
3286     case EQ: case NE:
3287     case GE: case GT:
3288     case LE: case LT:
3289       comparison_operator = FLG_BITWISE;
3290
3291     case PLUS:   case MINUS:  case MULT:     case DIV:      case MOD:
3292     case AND:    case IOR:    case XOR:
3293     case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3294       if ((code != AND && code != IOR) || (flags & FLG_BITWISE))
3295         {
3296           flags &= ~(FLG_AFTER | FLG_INSIDE | FLG_OUTSIDE_AND);
3297           write_test_expr (XEXP (exp, 0), attrs_cached,
3298                            flags | comparison_operator);
3299         }
3300       else
3301         {
3302           if (code == AND)
3303             flags &= ~FLG_OUTSIDE_AND;
3304           if (GET_CODE (XEXP (exp, 0)) == code
3305               || GET_CODE (XEXP (exp, 0)) == EQ_ATTR
3306               || (GET_CODE (XEXP (exp, 0)) == NOT
3307                   && GET_CODE (XEXP (XEXP (exp, 0), 0)) == EQ_ATTR))
3308             attrs_cached
3309               = write_test_expr (XEXP (exp, 0), attrs_cached, flags);
3310           else
3311             write_test_expr (XEXP (exp, 0), attrs_cached, flags);
3312         }
3313       switch (code)
3314         {
3315         case EQ:
3316           printf (" == ");
3317           break;
3318         case NE:
3319           printf (" != ");
3320           break;
3321         case GE:
3322           printf (" >= ");
3323           break;
3324         case GT:
3325           printf (" > ");
3326           break;
3327         case GEU:
3328           printf (" >= (unsigned) ");
3329           break;
3330         case GTU:
3331           printf (" > (unsigned) ");
3332           break;
3333         case LE:
3334           printf (" <= ");
3335           break;
3336         case LT:
3337           printf (" < ");
3338           break;
3339         case LEU:
3340           printf (" <= (unsigned) ");
3341           break;
3342         case LTU:
3343           printf (" < (unsigned) ");
3344           break;
3345         case PLUS:
3346           printf (" + ");
3347           break;
3348         case MINUS:
3349           printf (" - ");
3350           break;
3351         case MULT:
3352           printf (" * ");
3353           break;
3354         case DIV:
3355           printf (" / ");
3356           break;
3357         case MOD:
3358           printf (" %% ");
3359           break;
3360         case AND:
3361           if (flags & FLG_BITWISE)
3362             printf (" & ");
3363           else
3364             printf (" && ");
3365           break;
3366         case IOR:
3367           if (flags & FLG_BITWISE)
3368             printf (" | ");
3369           else
3370             printf (" || ");
3371           break;
3372         case XOR:
3373           printf (" ^ ");
3374           break;
3375         case ASHIFT:
3376           printf (" << ");
3377           break;
3378         case LSHIFTRT:
3379         case ASHIFTRT:
3380           printf (" >> ");
3381           break;
3382         default:
3383           gcc_unreachable ();
3384         }
3385
3386       if (code == AND)
3387         {
3388           /* For if (something && (cached_x = get_attr_x (insn)) == X)
3389              cached_x is only known to be initialized in then block.  */
3390           flags &= ~FLG_AFTER;
3391         }
3392       else if (code == IOR)
3393         {
3394           if (flags & FLG_OUTSIDE_AND)
3395             /* For if (something || (cached_x = get_attr_x (insn)) == X)
3396                cached_x is only known to be initialized in else block
3397                and else if conditions.  */
3398             flags &= ~FLG_INSIDE;
3399           else
3400             /* For if ((something || (cached_x = get_attr_x (insn)) == X)
3401                        && something_else)
3402                cached_x is not know to be initialized anywhere.  */
3403             flags &= ~(FLG_AFTER | FLG_INSIDE);
3404         }
3405       if ((code == AND || code == IOR)
3406           && (GET_CODE (XEXP (exp, 1)) == code
3407               || GET_CODE (XEXP (exp, 1)) == EQ_ATTR
3408               || (GET_CODE (XEXP (exp, 1)) == NOT
3409                   && GET_CODE (XEXP (XEXP (exp, 1), 0)) == EQ_ATTR)))
3410         attrs_cached
3411           = write_test_expr (XEXP (exp, 1), attrs_cached, flags);
3412       else
3413         write_test_expr (XEXP (exp, 1), attrs_cached,
3414                          flags | comparison_operator);
3415       break;
3416
3417     case NOT:
3418       /* Special-case (not (eq_attrq "alternative" "x")) */
3419       if (! (flags & FLG_BITWISE) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
3420         {
3421           if (XSTR (XEXP (exp, 0), 0) == alternative_name)
3422             {
3423               printf ("which_alternative != %s", XSTR (XEXP (exp, 0), 1));
3424               break;
3425             }
3426
3427           printf ("! ");
3428           attrs_cached = write_test_expr (XEXP (exp, 0), attrs_cached, flags);
3429           break;
3430         }
3431
3432       /* Otherwise, fall through to normal unary operator.  */
3433
3434     /* Unary operators.  */
3435     case ABS:  case NEG:
3436       switch (code)
3437         {
3438         case NOT:
3439           if (flags & FLG_BITWISE)
3440             printf ("~ ");
3441           else
3442             printf ("! ");
3443           break;
3444         case ABS:
3445           printf ("abs ");
3446           break;
3447         case NEG:
3448           printf ("-");
3449           break;
3450         default:
3451           gcc_unreachable ();
3452         }
3453
3454       flags &= ~(FLG_AFTER | FLG_INSIDE | FLG_OUTSIDE_AND);
3455       write_test_expr (XEXP (exp, 0), attrs_cached, flags);
3456       break;
3457
3458     case EQ_ATTR_ALT:
3459         {
3460           int set = XINT (exp, 0), bit = 0;
3461
3462           if (flags & FLG_BITWISE)
3463             fatal ("EQ_ATTR_ALT not valid inside comparison");
3464
3465           if (!set)
3466             fatal ("Empty EQ_ATTR_ALT should be optimized out");
3467
3468           if (!(set & (set - 1)))
3469             {
3470               if (!(set & 0xffff))
3471                 {
3472                   bit += 16;
3473                   set >>= 16;
3474                 }
3475               if (!(set & 0xff))
3476                 {
3477                   bit += 8;
3478                   set >>= 8;
3479                 }
3480               if (!(set & 0xf))
3481                 {
3482                   bit += 4;
3483                   set >>= 4;
3484                 }
3485               if (!(set & 0x3))
3486                 {
3487                   bit += 2;
3488                   set >>= 2;
3489                 }
3490               if (!(set & 1))
3491                 bit++;
3492
3493               printf ("which_alternative %s= %d",
3494                       XINT (exp, 1) ? "!" : "=", bit);
3495             }
3496           else
3497             {
3498               printf ("%s((1 << which_alternative) & %#x)",
3499                       XINT (exp, 1) ? "!" : "", set);
3500             }
3501         }
3502       break;
3503
3504     /* Comparison test of an attribute with a value.  Most of these will
3505        have been removed by optimization.   Handle "alternative"
3506        specially and give error if EQ_ATTR present inside a comparison.  */
3507     case EQ_ATTR:
3508       if (flags & FLG_BITWISE)
3509         fatal ("EQ_ATTR not valid inside comparison");
3510
3511       if (XSTR (exp, 0) == alternative_name)
3512         {
3513           printf ("which_alternative == %s", XSTR (exp, 1));
3514           break;
3515         }
3516
3517       attr = find_attr (&XSTR (exp, 0), 0);
3518       gcc_assert (attr);
3519
3520       /* Now is the time to expand the value of a constant attribute.  */
3521       if (attr->is_const)
3522         {
3523           write_test_expr (evaluate_eq_attr (exp, attr,
3524                                              attr->default_val->value, -2, -2),
3525                            attrs_cached, 0);
3526         }
3527       else
3528         {
3529           int i;
3530           for (i = 0; i < cached_attr_count; i++)
3531             if (attr->name == cached_attrs[i])
3532               break;
3533           if (i < cached_attr_count && (attrs_cached & (1U << i)) != 0)
3534             printf ("cached_%s", attr->name);
3535           else if (i < cached_attr_count && (attrs_to_cache & (1U << i)) != 0)
3536             {
3537               printf ("(cached_%s = get_attr_%s (insn))",
3538                       attr->name, attr->name);
3539               if (flags & FLG_AFTER)
3540                 attrs_cached_after |= (1U << i);
3541               if (flags & FLG_INSIDE)
3542                 attrs_cached_inside |= (1U << i);
3543               attrs_cached |= (1U << i);
3544             }
3545           else
3546             printf ("get_attr_%s (insn)", attr->name);
3547           printf (" == ");
3548           write_attr_valueq (attr, XSTR (exp, 1));
3549         }
3550       break;
3551
3552     /* Comparison test of flags for define_delays.  */
3553     case ATTR_FLAG:
3554       if (flags & FLG_BITWISE)
3555         fatal ("ATTR_FLAG not valid inside comparison");
3556       printf ("(flags & ATTR_FLAG_%s) != 0", XSTR (exp, 0));
3557       break;
3558
3559     /* See if an operand matches a predicate.  */
3560     case MATCH_OPERAND:
3561       /* If only a mode is given, just ensure the mode matches the operand.
3562          If neither a mode nor predicate is given, error.  */
3563       if (XSTR (exp, 1) == NULL || *XSTR (exp, 1) == '\0')
3564         {
3565           if (GET_MODE (exp) == VOIDmode)
3566             fatal ("null MATCH_OPERAND specified as test");
3567           else
3568             printf ("GET_MODE (operands[%d]) == %smode",
3569                     XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3570         }
3571       else
3572         printf ("%s (operands[%d], %smode)",
3573                 XSTR (exp, 1), XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3574       break;
3575
3576     /* Constant integer.  */
3577     case CONST_INT:
3578       printf (HOST_WIDE_INT_PRINT_DEC, XWINT (exp, 0));
3579       break;
3580
3581     case MATCH_TEST:
3582       print_c_condition (XSTR (exp, 0));
3583       if (flags & FLG_BITWISE)
3584         printf (" != 0");
3585       break;
3586
3587     /* A random C expression.  */
3588     case SYMBOL_REF:
3589       print_c_condition (XSTR (exp, 0));
3590       break;
3591
3592     /* The address of the branch target.  */
3593     case MATCH_DUP:
3594       printf ("INSN_ADDRESSES_SET_P () ? INSN_ADDRESSES (INSN_UID (GET_CODE (operands[%d]) == LABEL_REF ? XEXP (operands[%d], 0) : operands[%d])) : 0",
3595               XINT (exp, 0), XINT (exp, 0), XINT (exp, 0));
3596       break;
3597
3598     case PC:
3599       /* The address of the current insn.  We implement this actually as the
3600          address of the current insn for backward branches, but the last
3601          address of the next insn for forward branches, and both with
3602          adjustments that account for the worst-case possible stretching of
3603          intervening alignments between this insn and its destination.  */
3604       printf ("insn_current_reference_address (insn)");
3605       break;
3606
3607     case CONST_STRING:
3608       printf ("%s", XSTR (exp, 0));
3609       break;
3610
3611     case IF_THEN_ELSE:
3612       write_test_expr (XEXP (exp, 0), attrs_cached, 0);
3613       printf (" ? ");
3614       write_test_expr (XEXP (exp, 1), attrs_cached, FLG_BITWISE);
3615       printf (" : ");
3616       write_test_expr (XEXP (exp, 2), attrs_cached, FLG_BITWISE);
3617       break;
3618
3619     default:
3620       fatal ("bad RTX code `%s' in attribute calculation\n",
3621              GET_RTX_NAME (code));
3622     }
3623
3624   printf (")");
3625   return attrs_cached;
3626 }
3627
3628 /* Given an attribute value, return the maximum CONST_STRING argument
3629    encountered.  Set *UNKNOWNP and return INT_MAX if the value is unknown.  */
3630
3631 static int
3632 max_attr_value (rtx exp, int *unknownp)
3633 {
3634   int current_max;
3635   int i, n;
3636
3637   switch (GET_CODE (exp))
3638     {
3639     case CONST_STRING:
3640       current_max = atoi (XSTR (exp, 0));
3641       break;
3642
3643     case COND:
3644       current_max = max_attr_value (XEXP (exp, 1), unknownp);
3645       for (i = 0; i < XVECLEN (exp, 0); i += 2)
3646         {
3647           n = max_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3648           if (n > current_max)
3649             current_max = n;
3650         }
3651       break;
3652
3653     case IF_THEN_ELSE:
3654       current_max = max_attr_value (XEXP (exp, 1), unknownp);
3655       n = max_attr_value (XEXP (exp, 2), unknownp);
3656       if (n > current_max)
3657         current_max = n;
3658       break;
3659
3660     default:
3661       *unknownp = 1;
3662       current_max = INT_MAX;
3663       break;
3664     }
3665
3666   return current_max;
3667 }
3668
3669 /* Given an attribute value, return the minimum CONST_STRING argument
3670    encountered.  Set *UNKNOWNP and return 0 if the value is unknown.  */
3671
3672 static int
3673 min_attr_value (rtx exp, int *unknownp)
3674 {
3675   int current_min;
3676   int i, n;
3677
3678   switch (GET_CODE (exp))
3679     {
3680     case CONST_STRING:
3681       current_min = atoi (XSTR (exp, 0));
3682       break;
3683
3684     case COND:
3685       current_min = min_attr_value (XEXP (exp, 1), unknownp);
3686       for (i = 0; i < XVECLEN (exp, 0); i += 2)
3687         {
3688           n = min_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3689           if (n < current_min)
3690             current_min = n;
3691         }
3692       break;
3693
3694     case IF_THEN_ELSE:
3695       current_min = min_attr_value (XEXP (exp, 1), unknownp);
3696       n = min_attr_value (XEXP (exp, 2), unknownp);
3697       if (n < current_min)
3698         current_min = n;
3699       break;
3700
3701     default:
3702       *unknownp = 1;
3703       current_min = INT_MAX;
3704       break;
3705     }
3706
3707   return current_min;
3708 }
3709
3710 /* Given an attribute value, return the result of ORing together all
3711    CONST_STRING arguments encountered.  Set *UNKNOWNP and return -1
3712    if the numeric value is not known.  */
3713
3714 static int
3715 or_attr_value (rtx exp, int *unknownp)
3716 {
3717   int current_or;
3718   int i;
3719
3720   switch (GET_CODE (exp))
3721     {
3722     case CONST_STRING:
3723       current_or = atoi (XSTR (exp, 0));
3724       break;
3725
3726     case COND:
3727       current_or = or_attr_value (XEXP (exp, 1), unknownp);
3728       for (i = 0; i < XVECLEN (exp, 0); i += 2)
3729         current_or |= or_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3730       break;
3731
3732     case IF_THEN_ELSE:
3733       current_or = or_attr_value (XEXP (exp, 1), unknownp);
3734       current_or |= or_attr_value (XEXP (exp, 2), unknownp);
3735       break;
3736
3737     default:
3738       *unknownp = 1;
3739       current_or = -1;
3740       break;
3741     }
3742
3743   return current_or;
3744 }
3745
3746 /* Scan an attribute value, possibly a conditional, and record what actions
3747    will be required to do any conditional tests in it.
3748
3749    Specifically, set
3750         `must_extract'    if we need to extract the insn operands
3751         `must_constrain'  if we must compute `which_alternative'
3752         `address_used'    if an address expression was used
3753         `length_used'     if an (eq_attr "length" ...) was used
3754  */
3755
3756 static void
3757 walk_attr_value (rtx exp)
3758 {
3759   int i, j;
3760   const char *fmt;
3761   RTX_CODE code;
3762
3763   if (exp == NULL)
3764     return;
3765
3766   code = GET_CODE (exp);
3767   switch (code)
3768     {
3769     case SYMBOL_REF:
3770       if (! ATTR_IND_SIMPLIFIED_P (exp))
3771         /* Since this is an arbitrary expression, it can look at anything.
3772            However, constant expressions do not depend on any particular
3773            insn.  */
3774         must_extract = must_constrain = 1;
3775       return;
3776
3777     case MATCH_OPERAND:
3778       must_extract = 1;
3779       return;
3780
3781     case MATCH_TEST:
3782     case EQ_ATTR_ALT:
3783       must_extract = must_constrain = 1;
3784       break;
3785
3786     case EQ_ATTR:
3787       if (XSTR (exp, 0) == alternative_name)
3788         must_extract = must_constrain = 1;
3789       else if (strcmp_check (XSTR (exp, 0), length_str) == 0)
3790         length_used = 1;
3791       return;
3792
3793     case MATCH_DUP:
3794       must_extract = 1;
3795       address_used = 1;
3796       return;
3797
3798     case PC:
3799       address_used = 1;
3800       return;
3801
3802     case ATTR_FLAG:
3803       return;
3804
3805     default:
3806       break;
3807     }
3808
3809   for (i = 0, fmt = GET_RTX_FORMAT (code); i < GET_RTX_LENGTH (code); i++)
3810     switch (*fmt++)
3811       {
3812       case 'e':
3813       case 'u':
3814         walk_attr_value (XEXP (exp, i));
3815         break;
3816
3817       case 'E':
3818         if (XVEC (exp, i) != NULL)
3819           for (j = 0; j < XVECLEN (exp, i); j++)
3820             walk_attr_value (XVECEXP (exp, i, j));
3821         break;
3822       }
3823 }
3824
3825 /* Write out a function to obtain the attribute for a given INSN.  */
3826
3827 static void
3828 write_attr_get (struct attr_desc *attr)
3829 {
3830   struct attr_value *av, *common_av;
3831   int i, j;
3832
3833   /* Find the most used attribute value.  Handle that as the `default' of the
3834      switch we will generate.  */
3835   common_av = find_most_used (attr);
3836
3837   /* Write out start of function, then all values with explicit `case' lines,
3838      then a `default', then the value with the most uses.  */
3839   if (attr->enum_name)
3840     printf ("enum %s\n", attr->enum_name);
3841   else if (!attr->is_numeric)
3842     printf ("enum attr_%s\n", attr->name);
3843   else
3844     printf ("int\n");
3845
3846   /* If the attribute name starts with a star, the remainder is the name of
3847      the subroutine to use, instead of `get_attr_...'.  */
3848   if (attr->name[0] == '*')
3849     printf ("%s (rtx insn ATTRIBUTE_UNUSED)\n", &attr->name[1]);
3850   else if (attr->is_const == 0)
3851     printf ("get_attr_%s (rtx insn ATTRIBUTE_UNUSED)\n", attr->name);
3852   else
3853     {
3854       printf ("get_attr_%s (void)\n", attr->name);
3855       printf ("{\n");
3856
3857       for (av = attr->first_value; av; av = av->next)
3858         if (av->num_insns == 1)
3859           write_attr_set (attr, 2, av->value, "return", ";",
3860                           true_rtx, av->first_insn->def->insn_code,
3861                           av->first_insn->def->insn_index, 0);
3862         else if (av->num_insns != 0)
3863           write_attr_set (attr, 2, av->value, "return", ";",
3864                           true_rtx, -2, 0, 0);
3865
3866       printf ("}\n\n");
3867       return;
3868     }
3869
3870   printf ("{\n");
3871
3872   /* Find attributes that are worth caching in the conditions.  */
3873   cached_attr_count = 0;
3874   attrs_seen_more_than_once = 0;
3875   for (av = attr->first_value; av; av = av->next)
3876     {
3877       attrs_seen_once = 0;
3878       find_attrs_to_cache (av->value, true);
3879     }
3880   /* Remove those that aren't worth caching from the array.  */
3881   for (i = 0, j = 0; i < cached_attr_count; i++)
3882     if ((attrs_seen_more_than_once & (1U << i)) != 0)
3883       {
3884         const char *name = cached_attrs[i];
3885         struct attr_desc *cached_attr;
3886         if (i != j)
3887           cached_attrs[j] = name;
3888         cached_attr = find_attr (&name, 0);
3889         gcc_assert (cached_attr && cached_attr->is_const == 0);
3890         if (cached_attr->enum_name)
3891           printf ("  enum %s", cached_attr->enum_name);
3892         else if (!cached_attr->is_numeric)
3893           printf ("  enum attr_%s", cached_attr->name);
3894         else
3895           printf ("  int");
3896         printf (" cached_%s ATTRIBUTE_UNUSED;\n", name);
3897         j++;
3898       }
3899   cached_attr_count = j;
3900   if (cached_attr_count)
3901     printf ("\n");
3902
3903   printf ("  switch (recog_memoized (insn))\n");
3904   printf ("    {\n");
3905
3906   for (av = attr->first_value; av; av = av->next)
3907     if (av != common_av)
3908       write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
3909
3910   write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
3911   printf ("    }\n}\n\n");
3912   cached_attr_count = 0;
3913 }
3914
3915 /* Given an AND tree of known true terms (because we are inside an `if' with
3916    that as the condition or are in an `else' clause) and an expression,
3917    replace any known true terms with TRUE.  Use `simplify_and_tree' to do
3918    the bulk of the work.  */
3919
3920 static rtx
3921 eliminate_known_true (rtx known_true, rtx exp, int insn_code, int insn_index)
3922 {
3923   rtx term;
3924
3925   known_true = SIMPLIFY_TEST_EXP (known_true, insn_code, insn_index);
3926
3927   if (GET_CODE (known_true) == AND)
3928     {
3929       exp = eliminate_known_true (XEXP (known_true, 0), exp,
3930                                   insn_code, insn_index);
3931       exp = eliminate_known_true (XEXP (known_true, 1), exp,
3932                                   insn_code, insn_index);
3933     }
3934   else
3935     {
3936       term = known_true;
3937       exp = simplify_and_tree (exp, &term, insn_code, insn_index);
3938     }
3939
3940   return exp;
3941 }
3942
3943 /* Write out a series of tests and assignment statements to perform tests and
3944    sets of an attribute value.  We are passed an indentation amount and prefix
3945    and suffix strings to write around each attribute value (e.g., "return"
3946    and ";").  */
3947
3948 static void
3949 write_attr_set (struct attr_desc *attr, int indent, rtx value,
3950                 const char *prefix, const char *suffix, rtx known_true,
3951                 int insn_code, int insn_index, unsigned int attrs_cached)
3952 {
3953   if (GET_CODE (value) == COND)
3954     {
3955       /* Assume the default value will be the default of the COND unless we
3956          find an always true expression.  */
3957       rtx default_val = XEXP (value, 1);
3958       rtx our_known_true = known_true;
3959       rtx newexp;
3960       int first_if = 1;
3961       int i;
3962
3963       if (cached_attr_count)
3964         {
3965           attrs_seen_once = 0;
3966           attrs_seen_more_than_once = 0;
3967           for (i = 0; i < XVECLEN (value, 0); i += 2)
3968             find_attrs_to_cache (XVECEXP (value, 0, i), false);
3969           attrs_to_cache |= attrs_seen_more_than_once;
3970         }
3971
3972       for (i = 0; i < XVECLEN (value, 0); i += 2)
3973         {
3974           rtx testexp;
3975           rtx inner_true;
3976
3977           testexp = eliminate_known_true (our_known_true,
3978                                           XVECEXP (value, 0, i),
3979                                           insn_code, insn_index);
3980           newexp = attr_rtx (NOT, testexp);
3981           newexp = insert_right_side (AND, our_known_true, newexp,
3982                                       insn_code, insn_index);
3983
3984           /* If the test expression is always true or if the next `known_true'
3985              expression is always false, this is the last case, so break
3986              out and let this value be the `else' case.  */
3987           if (testexp == true_rtx || newexp == false_rtx)
3988             {
3989               default_val = XVECEXP (value, 0, i + 1);
3990               break;
3991             }
3992
3993           /* Compute the expression to pass to our recursive call as being
3994              known true.  */
3995           inner_true = insert_right_side (AND, our_known_true,
3996                                           testexp, insn_code, insn_index);
3997
3998           /* If this is always false, skip it.  */
3999           if (inner_true == false_rtx)
4000             continue;
4001
4002           attrs_cached_inside = attrs_cached;
4003           attrs_cached_after = attrs_cached;
4004           write_indent (indent);
4005           printf ("%sif ", first_if ? "" : "else ");
4006           first_if = 0;
4007           write_test_expr (testexp, attrs_cached,
4008                            (FLG_AFTER | FLG_INSIDE | FLG_OUTSIDE_AND));
4009           attrs_cached = attrs_cached_after;
4010           printf ("\n");
4011           write_indent (indent + 2);
4012           printf ("{\n");
4013
4014           write_attr_set (attr, indent + 4,
4015                           XVECEXP (value, 0, i + 1), prefix, suffix,
4016                           inner_true, insn_code, insn_index,
4017                           attrs_cached_inside);
4018           write_indent (indent + 2);
4019           printf ("}\n");
4020           our_known_true = newexp;
4021         }
4022
4023       if (! first_if)
4024         {
4025           write_indent (indent);
4026           printf ("else\n");
4027           write_indent (indent + 2);
4028           printf ("{\n");
4029         }
4030
4031       write_attr_set (attr, first_if ? indent : indent + 4, default_val,
4032                       prefix, suffix, our_known_true, insn_code, insn_index,
4033                       attrs_cached);
4034
4035       if (! first_if)
4036         {
4037           write_indent (indent + 2);
4038           printf ("}\n");
4039         }
4040     }
4041   else
4042     {
4043       write_indent (indent);
4044       printf ("%s ", prefix);
4045       write_attr_value (attr, value);
4046       printf ("%s\n", suffix);
4047     }
4048 }
4049
4050 /* Write a series of case statements for every instruction in list IE.
4051    INDENT is the amount of indentation to write before each case.  */
4052
4053 static void
4054 write_insn_cases (struct insn_ent *ie, int indent)
4055 {
4056   for (; ie != 0; ie = ie->next)
4057     if (ie->def->insn_code != -1)
4058       {
4059         write_indent (indent);
4060         if (GET_CODE (ie->def->def) == DEFINE_PEEPHOLE)
4061           printf ("case %d:  /* define_peephole, line %d */\n",
4062                   ie->def->insn_code, ie->def->lineno);
4063         else
4064           printf ("case %d:  /* %s */\n",
4065                   ie->def->insn_code, XSTR (ie->def->def, 0));
4066       }
4067 }
4068
4069 /* Write out the computation for one attribute value.  */
4070
4071 static void
4072 write_attr_case (struct attr_desc *attr, struct attr_value *av,
4073                  int write_case_lines, const char *prefix, const char *suffix,
4074                  int indent, rtx known_true)
4075 {
4076   if (av->num_insns == 0)
4077     return;
4078
4079   if (av->has_asm_insn)
4080     {
4081       write_indent (indent);
4082       printf ("case -1:\n");
4083       write_indent (indent + 2);
4084       printf ("if (GET_CODE (PATTERN (insn)) != ASM_INPUT\n");
4085       write_indent (indent + 2);
4086       printf ("    && asm_noperands (PATTERN (insn)) < 0)\n");
4087       write_indent (indent + 2);
4088       printf ("  fatal_insn_not_found (insn);\n");
4089     }
4090
4091   if (write_case_lines)
4092     write_insn_cases (av->first_insn, indent);
4093   else
4094     {
4095       write_indent (indent);
4096       printf ("default:\n");
4097     }
4098
4099   /* See what we have to do to output this value.  */
4100   must_extract = must_constrain = address_used = 0;
4101   walk_attr_value (av->value);
4102
4103   if (must_constrain)
4104     {
4105       write_indent (indent + 2);
4106       printf ("extract_constrain_insn_cached (insn);\n");
4107     }
4108   else if (must_extract)
4109     {
4110       write_indent (indent + 2);
4111       printf ("extract_insn_cached (insn);\n");
4112     }
4113
4114   attrs_to_cache = 0;
4115   if (av->num_insns == 1)
4116     write_attr_set (attr, indent + 2, av->value, prefix, suffix,
4117                     known_true, av->first_insn->def->insn_code,
4118                     av->first_insn->def->insn_index, 0);
4119   else
4120     write_attr_set (attr, indent + 2, av->value, prefix, suffix,
4121                     known_true, -2, 0, 0);
4122
4123   if (strncmp (prefix, "return", 6))
4124     {
4125       write_indent (indent + 2);
4126       printf ("break;\n");
4127     }
4128   printf ("\n");
4129 }
4130
4131 /* Utilities to write in various forms.  */
4132
4133 static void
4134 write_attr_valueq (struct attr_desc *attr, const char *s)
4135 {
4136   if (attr->is_numeric)
4137     {
4138       int num = atoi (s);
4139
4140       printf ("%d", num);
4141
4142       if (num > 9 || num < 0)
4143         printf (" /* %#x */", num);
4144     }
4145   else
4146     {
4147       write_upcase (attr->enum_name ? attr->enum_name : attr->name);
4148       printf ("_");
4149       write_upcase (s);
4150     }
4151 }
4152
4153 static void
4154 write_attr_value (struct attr_desc *attr, rtx value)
4155 {
4156   int op;
4157
4158   switch (GET_CODE (value))
4159     {
4160     case CONST_STRING:
4161       write_attr_valueq (attr, XSTR (value, 0));
4162       break;
4163
4164     case CONST_INT:
4165       printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (value));
4166       break;
4167
4168     case SYMBOL_REF:
4169       print_c_condition (XSTR (value, 0));
4170       break;
4171
4172     case ATTR:
4173       {
4174         struct attr_desc *attr2 = find_attr (&XSTR (value, 0), 0);
4175         if (attr->enum_name)
4176           printf ("(enum %s)", attr->enum_name);
4177         else if (!attr->is_numeric)
4178           printf ("(enum attr_%s)", attr->name);
4179         else if (!attr2->is_numeric)
4180           printf ("(int)");
4181
4182         printf ("get_attr_%s (%s)", attr2->name,
4183                 (attr2->is_const ? "" : "insn"));
4184       }
4185       break;
4186
4187     case PLUS:
4188       op = '+';
4189       goto do_operator;
4190     case MINUS:
4191       op = '-';
4192       goto do_operator;
4193     case MULT:
4194       op = '*';
4195       goto do_operator;
4196     case DIV:
4197       op = '/';
4198       goto do_operator;
4199     case MOD:
4200       op = '%';
4201       goto do_operator;
4202
4203     do_operator:
4204       write_attr_value (attr, XEXP (value, 0));
4205       putchar (' ');
4206       putchar (op);
4207       putchar (' ');
4208       write_attr_value (attr, XEXP (value, 1));
4209       break;
4210
4211     default:
4212       gcc_unreachable ();
4213     }
4214 }
4215
4216 static void
4217 write_upcase (const char *str)
4218 {
4219   while (*str)
4220     {
4221       /* The argument of TOUPPER should not have side effects.  */
4222       putchar (TOUPPER(*str));
4223       str++;
4224     }
4225 }
4226
4227 static void
4228 write_indent (int indent)
4229 {
4230   for (; indent > 8; indent -= 8)
4231     printf ("\t");
4232
4233   for (; indent; indent--)
4234     printf (" ");
4235 }
4236
4237 /* Write a subroutine that is given an insn that requires a delay slot, a
4238    delay slot ordinal, and a candidate insn.  It returns nonzero if the
4239    candidate can be placed in the specified delay slot of the insn.
4240
4241    We can write as many as three subroutines.  `eligible_for_delay'
4242    handles normal delay slots, `eligible_for_annul_true' indicates that
4243    the specified insn can be annulled if the branch is true, and likewise
4244    for `eligible_for_annul_false'.
4245
4246    KIND is a string distinguishing these three cases ("delay", "annul_true",
4247    or "annul_false").  */
4248
4249 static void
4250 write_eligible_delay (const char *kind)
4251 {
4252   struct delay_desc *delay;
4253   int max_slots;
4254   char str[50];
4255   const char *pstr;
4256   struct attr_desc *attr;
4257   struct attr_value *av, *common_av;
4258   int i;
4259
4260   /* Compute the maximum number of delay slots required.  We use the delay
4261      ordinal times this number plus one, plus the slot number as an index into
4262      the appropriate predicate to test.  */
4263
4264   for (delay = delays, max_slots = 0; delay; delay = delay->next)
4265     if (XVECLEN (delay->def, 1) / 3 > max_slots)
4266       max_slots = XVECLEN (delay->def, 1) / 3;
4267
4268   /* Write function prelude.  */
4269
4270   printf ("int\n");
4271   printf ("eligible_for_%s (rtx delay_insn ATTRIBUTE_UNUSED, int slot, rtx candidate_insn, int flags ATTRIBUTE_UNUSED)\n",
4272           kind);
4273   printf ("{\n");
4274   printf ("  rtx insn;\n");
4275   printf ("\n");
4276   printf ("  gcc_assert (slot < %d);\n", max_slots);
4277   printf ("\n");
4278   /* Allow dbr_schedule to pass labels, etc.  This can happen if try_split
4279      converts a compound instruction into a loop.  */
4280   printf ("  if (!INSN_P (candidate_insn))\n");
4281   printf ("    return 0;\n");
4282   printf ("\n");
4283
4284   /* If more than one delay type, find out which type the delay insn is.  */
4285
4286   if (num_delays > 1)
4287     {
4288       attr = find_attr (&delay_type_str, 0);
4289       gcc_assert (attr);
4290       common_av = find_most_used (attr);
4291
4292       printf ("  insn = delay_insn;\n");
4293       printf ("  switch (recog_memoized (insn))\n");
4294       printf ("    {\n");
4295
4296       sprintf (str, " * %d;\n      break;", max_slots);
4297       for (av = attr->first_value; av; av = av->next)
4298         if (av != common_av)
4299           write_attr_case (attr, av, 1, "slot +=", str, 4, true_rtx);
4300
4301       write_attr_case (attr, common_av, 0, "slot +=", str, 4, true_rtx);
4302       printf ("    }\n\n");
4303
4304       /* Ensure matched.  Otherwise, shouldn't have been called.  */
4305       printf ("  gcc_assert (slot >= %d);\n\n", max_slots);
4306     }
4307
4308   /* If just one type of delay slot, write simple switch.  */
4309   if (num_delays == 1 && max_slots == 1)
4310     {
4311       printf ("  insn = candidate_insn;\n");
4312       printf ("  switch (recog_memoized (insn))\n");
4313       printf ("    {\n");
4314
4315       attr = find_attr (&delay_1_0_str, 0);
4316       gcc_assert (attr);
4317       common_av = find_most_used (attr);
4318
4319       for (av = attr->first_value; av; av = av->next)
4320         if (av != common_av)
4321           write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
4322
4323       write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
4324       printf ("    }\n");
4325     }
4326
4327   else
4328     {
4329       /* Write a nested CASE.  The first indicates which condition we need to
4330          test, and the inner CASE tests the condition.  */
4331       printf ("  insn = candidate_insn;\n");
4332       printf ("  switch (slot)\n");
4333       printf ("    {\n");
4334
4335       for (delay = delays; delay; delay = delay->next)
4336         for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
4337           {
4338             printf ("    case %d:\n",
4339                     (i / 3) + (num_delays == 1 ? 0 : delay->num * max_slots));
4340             printf ("      switch (recog_memoized (insn))\n");
4341             printf ("\t{\n");
4342
4343             sprintf (str, "*%s_%d_%d", kind, delay->num, i / 3);
4344             pstr = str;
4345             attr = find_attr (&pstr, 0);
4346             gcc_assert (attr);
4347             common_av = find_most_used (attr);
4348
4349             for (av = attr->first_value; av; av = av->next)
4350               if (av != common_av)
4351                 write_attr_case (attr, av, 1, "return", ";", 8, true_rtx);
4352
4353             write_attr_case (attr, common_av, 0, "return", ";", 8, true_rtx);
4354             printf ("      }\n");
4355           }
4356
4357       printf ("    default:\n");
4358       printf ("      gcc_unreachable ();\n");
4359       printf ("    }\n");
4360     }
4361
4362   printf ("}\n\n");
4363 }
4364
4365 /* This page contains miscellaneous utility routines.  */
4366
4367 /* Given a pointer to a (char *), return a malloc'ed string containing the
4368    next comma-separated element.  Advance the pointer to after the string
4369    scanned, or the end-of-string.  Return NULL if at end of string.  */
4370
4371 static char *
4372 next_comma_elt (const char **pstr)
4373 {
4374   const char *start;
4375
4376   start = scan_comma_elt (pstr);
4377
4378   if (start == NULL)
4379     return NULL;
4380
4381   return attr_string (start, *pstr - start);
4382 }
4383
4384 /* Return a `struct attr_desc' pointer for a given named attribute.  If CREATE
4385    is nonzero, build a new attribute, if one does not exist.  *NAME_P is
4386    replaced by a pointer to a canonical copy of the string.  */
4387
4388 static struct attr_desc *
4389 find_attr (const char **name_p, int create)
4390 {
4391   struct attr_desc *attr;
4392   int index;
4393   const char *name = *name_p;
4394
4395   /* Before we resort to using `strcmp', see if the string address matches
4396      anywhere.  In most cases, it should have been canonicalized to do so.  */
4397   if (name == alternative_name)
4398     return NULL;
4399
4400   index = name[0] & (MAX_ATTRS_INDEX - 1);
4401   for (attr = attrs[index]; attr; attr = attr->next)
4402     if (name == attr->name)
4403       return attr;
4404
4405   /* Otherwise, do it the slow way.  */
4406   for (attr = attrs[index]; attr; attr = attr->next)
4407     if (name[0] == attr->name[0] && ! strcmp (name, attr->name))
4408       {
4409         *name_p = attr->name;
4410         return attr;
4411       }
4412
4413   if (! create)
4414     return NULL;
4415
4416   attr = oballoc (struct attr_desc);
4417   attr->name = DEF_ATTR_STRING (name);
4418   attr->enum_name = 0;
4419   attr->first_value = attr->default_val = NULL;
4420   attr->is_numeric = attr->is_const = attr->is_special = 0;
4421   attr->next = attrs[index];
4422   attrs[index] = attr;
4423
4424   *name_p = attr->name;
4425
4426   return attr;
4427 }
4428
4429 /* Create internal attribute with the given default value.  */
4430
4431 static void
4432 make_internal_attr (const char *name, rtx value, int special)
4433 {
4434   struct attr_desc *attr;
4435
4436   attr = find_attr (&name, 1);
4437   gcc_assert (!attr->default_val);
4438
4439   attr->is_numeric = 1;
4440   attr->is_const = 0;
4441   attr->is_special = (special & ATTR_SPECIAL) != 0;
4442   attr->default_val = get_attr_value (value, attr, -2);
4443 }
4444
4445 /* Find the most used value of an attribute.  */
4446
4447 static struct attr_value *
4448 find_most_used (struct attr_desc *attr)
4449 {
4450   struct attr_value *av;
4451   struct attr_value *most_used;
4452   int nuses;
4453
4454   most_used = NULL;
4455   nuses = -1;
4456
4457   for (av = attr->first_value; av; av = av->next)
4458     if (av->num_insns > nuses)
4459       nuses = av->num_insns, most_used = av;
4460
4461   return most_used;
4462 }
4463
4464 /* Return (attr_value "n") */
4465
4466 static rtx
4467 make_numeric_value (int n)
4468 {
4469   static rtx int_values[20];
4470   rtx exp;
4471   char *p;
4472
4473   gcc_assert (n >= 0);
4474
4475   if (n < 20 && int_values[n])
4476     return int_values[n];
4477
4478   p = attr_printf (MAX_DIGITS, "%d", n);
4479   exp = attr_rtx (CONST_STRING, p);
4480
4481   if (n < 20)
4482     int_values[n] = exp;
4483
4484   return exp;
4485 }
4486
4487 static rtx
4488 copy_rtx_unchanging (rtx orig)
4489 {
4490   if (ATTR_IND_SIMPLIFIED_P (orig) || ATTR_CURR_SIMPLIFIED_P (orig))
4491     return orig;
4492
4493   ATTR_CURR_SIMPLIFIED_P (orig) = 1;
4494   return orig;
4495 }
4496
4497 /* Determine if an insn has a constant number of delay slots, i.e., the
4498    number of delay slots is not a function of the length of the insn.  */
4499
4500 static void
4501 write_const_num_delay_slots (void)
4502 {
4503   struct attr_desc *attr = find_attr (&num_delay_slots_str, 0);
4504   struct attr_value *av;
4505
4506   if (attr)
4507     {
4508       printf ("int\nconst_num_delay_slots (rtx insn)\n");
4509       printf ("{\n");
4510       printf ("  switch (recog_memoized (insn))\n");
4511       printf ("    {\n");
4512
4513       for (av = attr->first_value; av; av = av->next)
4514         {
4515           length_used = 0;
4516           walk_attr_value (av->value);
4517           if (length_used)
4518             write_insn_cases (av->first_insn, 4);
4519         }
4520
4521       printf ("    default:\n");
4522       printf ("      return 1;\n");
4523       printf ("    }\n}\n\n");
4524     }
4525 }
4526 \f
4527 /* Synthetic attributes used by insn-automata.c and the scheduler.
4528    These are primarily concerned with (define_insn_reservation)
4529    patterns.  */
4530
4531 struct insn_reserv
4532 {
4533   struct insn_reserv *next;
4534
4535   const char *name;
4536   int default_latency;
4537   rtx condexp;
4538
4539   /* Sequence number of this insn.  */
4540   int insn_num;
4541
4542   /* Whether a (define_bypass) construct names this insn in its
4543      output list.  */
4544   bool bypassed;
4545 };
4546
4547 static struct insn_reserv *all_insn_reservs = 0;
4548 static struct insn_reserv **last_insn_reserv_p = &all_insn_reservs;
4549 static size_t n_insn_reservs;
4550
4551 /* Store information from a DEFINE_INSN_RESERVATION for future
4552    attribute generation.  */
4553 static void
4554 gen_insn_reserv (rtx def)
4555 {
4556   struct insn_reserv *decl = oballoc (struct insn_reserv);
4557
4558   decl->name            = DEF_ATTR_STRING (XSTR (def, 0));
4559   decl->default_latency = XINT (def, 1);
4560   decl->condexp         = check_attr_test (XEXP (def, 2), 0, 0);
4561   decl->insn_num        = n_insn_reservs;
4562   decl->bypassed        = false;
4563   decl->next            = 0;
4564
4565   *last_insn_reserv_p = decl;
4566   last_insn_reserv_p  = &decl->next;
4567   n_insn_reservs++;
4568 }
4569
4570 /* Store information from a DEFINE_BYPASS for future attribute
4571    generation.  The only thing we care about is the list of output
4572    insns, which will later be used to tag reservation structures with
4573    a 'bypassed' bit.  */
4574
4575 struct bypass_list
4576 {
4577   struct bypass_list *next;
4578   const char *pattern;
4579 };
4580
4581 static struct bypass_list *all_bypasses;
4582 static size_t n_bypasses;
4583
4584 static void
4585 gen_bypass_1 (const char *s, size_t len)
4586 {
4587   struct bypass_list *b;
4588
4589   if (len == 0)
4590     return;
4591
4592   s = attr_string (s, len);
4593   for (b = all_bypasses; b; b = b->next)
4594     if (s == b->pattern)
4595       return;  /* already got that one */
4596
4597   b = oballoc (struct bypass_list);
4598   b->pattern = s;
4599   b->next = all_bypasses;
4600   all_bypasses = b;
4601   n_bypasses++;
4602 }
4603
4604 static void
4605 gen_bypass (rtx def)
4606 {
4607   const char *p, *base;
4608
4609   for (p = base = XSTR (def, 1); *p; p++)
4610     if (*p == ',')
4611       {
4612         gen_bypass_1 (base, p - base);
4613         do
4614           p++;
4615         while (ISSPACE (*p));
4616         base = p;
4617       }
4618   gen_bypass_1 (base, p - base);
4619 }
4620
4621 /* Find and mark all of the bypassed insns.  */
4622 static void
4623 process_bypasses (void)
4624 {
4625   struct bypass_list *b;
4626   struct insn_reserv *r;
4627
4628   /* The reservation list is likely to be much longer than the bypass
4629      list.  */
4630   for (r = all_insn_reservs; r; r = r->next)
4631     for (b = all_bypasses; b; b = b->next)
4632       if (fnmatch (b->pattern, r->name, 0) == 0)
4633         r->bypassed = true;
4634 }
4635
4636 /* Check that attribute NAME is used in define_insn_reservation condition
4637    EXP.  Return true if it is.  */
4638 static bool
4639 check_tune_attr (const char *name, rtx exp)
4640 {
4641   switch (GET_CODE (exp))
4642     {
4643     case AND:
4644       if (check_tune_attr (name, XEXP (exp, 0)))
4645         return true;
4646       return check_tune_attr (name, XEXP (exp, 1));
4647
4648     case IOR:
4649       return (check_tune_attr (name, XEXP (exp, 0))
4650               && check_tune_attr (name, XEXP (exp, 1)));
4651
4652     case EQ_ATTR:
4653       return XSTR (exp, 0) == name;
4654
4655     default:
4656       return false;
4657     }
4658 }
4659
4660 /* Try to find a const attribute (usually cpu or tune) that is used
4661    in all define_insn_reservation conditions.  */
4662 static struct attr_desc *
4663 find_tune_attr (rtx exp)
4664 {
4665   struct attr_desc *attr;
4666
4667   switch (GET_CODE (exp))
4668     {
4669     case AND:
4670     case IOR:
4671       attr = find_tune_attr (XEXP (exp, 0));
4672       if (attr)
4673         return attr;
4674       return find_tune_attr (XEXP (exp, 1));
4675
4676     case EQ_ATTR:
4677       if (XSTR (exp, 0) == alternative_name)
4678         return NULL;
4679
4680       attr = find_attr (&XSTR (exp, 0), 0);
4681       gcc_assert (attr);
4682
4683       if (attr->is_const && !attr->is_special)
4684         {
4685           struct insn_reserv *decl;
4686
4687           for (decl = all_insn_reservs; decl; decl = decl->next)
4688             if (! check_tune_attr (attr->name, decl->condexp))
4689               return NULL;
4690           return attr;
4691         }
4692       return NULL;
4693
4694     default:
4695       return NULL;
4696     }
4697 }
4698
4699 /* Create all of the attributes that describe automaton properties.  */
4700 static void
4701 make_automaton_attrs (void)
4702 {
4703   int i;
4704   struct insn_reserv *decl;
4705   rtx code_exp, lats_exp, byps_exp;
4706   struct attr_desc *tune_attr;
4707
4708   if (n_insn_reservs == 0)
4709     return;
4710
4711   tune_attr = find_tune_attr (all_insn_reservs->condexp);
4712   if (tune_attr != NULL)
4713     {
4714       rtx *condexps = XNEWVEC (rtx, n_insn_reservs * 3);
4715       struct attr_value *val;
4716       bool first = true;
4717
4718       gcc_assert (tune_attr->is_const
4719                   && !tune_attr->is_special
4720                   && !tune_attr->is_numeric);
4721       for (val = tune_attr->first_value; val; val = val->next)
4722         {
4723           if (val == tune_attr->default_val)
4724             continue;
4725           gcc_assert (GET_CODE (val->value) == CONST_STRING);
4726           printf ("static int internal_dfa_insn_code_%s (rtx);\n"
4727                   "static int insn_default_latency_%s (rtx);\n",
4728                   XSTR (val->value, 0), XSTR (val->value, 0));
4729         }
4730
4731       printf ("\n");
4732       printf ("int (*internal_dfa_insn_code) (rtx);\n");
4733       printf ("int (*insn_default_latency) (rtx);\n");
4734       printf ("\n");
4735       printf ("void\n");
4736       printf ("init_sched_attrs (void)\n");
4737       printf ("{\n");
4738
4739       for (val = tune_attr->first_value; val; val = val->next)
4740         {
4741           int j;
4742           char *name;
4743           rtx test = attr_rtx (EQ_ATTR, tune_attr->name, XSTR (val->value, 0));
4744
4745           if (val == tune_attr->default_val)
4746             continue;
4747           for (decl = all_insn_reservs, i = 0;
4748                decl;
4749                decl = decl->next)
4750             {
4751               rtx ctest = test;
4752               rtx condexp
4753                 = simplify_and_tree (decl->condexp, &ctest, -2, 0);
4754               if (condexp == false_rtx)
4755                 continue;
4756               if (condexp == true_rtx)
4757                 break;
4758               condexps[i] = condexp;
4759               condexps[i + 1] = make_numeric_value (decl->insn_num);
4760               condexps[i + 2] = make_numeric_value (decl->default_latency);
4761               i += 3;
4762             }
4763
4764           code_exp = rtx_alloc (COND);
4765           lats_exp = rtx_alloc (COND);
4766
4767           j = i / 3 * 2;
4768           XVEC (code_exp, 0) = rtvec_alloc (j);
4769           XVEC (lats_exp, 0) = rtvec_alloc (j);
4770
4771           if (decl)
4772             {
4773               XEXP (code_exp, 1) = make_numeric_value (decl->insn_num);
4774               XEXP (lats_exp, 1) = make_numeric_value (decl->default_latency);
4775             }
4776           else
4777             {
4778               XEXP (code_exp, 1) = make_numeric_value (n_insn_reservs + 1);
4779               XEXP (lats_exp, 1) = make_numeric_value (0);
4780             }
4781
4782           while (i > 0)
4783             {
4784               i -= 3;
4785               j -= 2;
4786               XVECEXP (code_exp, 0, j) = condexps[i];
4787               XVECEXP (lats_exp, 0, j) = condexps[i];
4788
4789               XVECEXP (code_exp, 0, j + 1) = condexps[i + 1];
4790               XVECEXP (lats_exp, 0, j + 1) = condexps[i + 2];
4791             }
4792
4793           name = XNEWVEC (char,
4794                           sizeof ("*internal_dfa_insn_code_")
4795                           + strlen (XSTR (val->value, 0)));
4796           strcpy (name, "*internal_dfa_insn_code_");
4797           strcat (name, XSTR (val->value, 0));
4798           make_internal_attr (name, code_exp, ATTR_NONE);
4799           strcpy (name, "*insn_default_latency_");
4800           strcat (name, XSTR (val->value, 0));
4801           make_internal_attr (name, lats_exp, ATTR_NONE);
4802           XDELETEVEC (name);
4803
4804           if (first)
4805             {
4806               printf ("  if (");
4807               first = false;
4808             }
4809           else
4810             printf ("  else if (");
4811           write_test_expr (test, 0, 0);
4812           printf (")\n");
4813           printf ("    {\n");
4814           printf ("      internal_dfa_insn_code\n");
4815           printf ("        = internal_dfa_insn_code_%s;\n",
4816                   XSTR (val->value, 0));
4817           printf ("      insn_default_latency\n");
4818           printf ("        = insn_default_latency_%s;\n",
4819                   XSTR (val->value, 0));
4820           printf ("    }\n");
4821         }
4822
4823       printf ("  else\n");
4824       printf ("    gcc_unreachable ();\n");
4825       printf ("}\n");
4826       printf ("\n");
4827
4828       XDELETEVEC (condexps);
4829     }
4830   else
4831     {
4832       code_exp = rtx_alloc (COND);
4833       lats_exp = rtx_alloc (COND);
4834
4835       XVEC (code_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
4836       XVEC (lats_exp, 0) = rtvec_alloc (n_insn_reservs * 2);
4837
4838       XEXP (code_exp, 1) = make_numeric_value (n_insn_reservs + 1);
4839       XEXP (lats_exp, 1) = make_numeric_value (0);
4840
4841       for (decl = all_insn_reservs, i = 0;
4842            decl;
4843            decl = decl->next, i += 2)
4844         {
4845           XVECEXP (code_exp, 0, i)   = decl->condexp;
4846           XVECEXP (lats_exp, 0, i)   = decl->condexp;
4847
4848           XVECEXP (code_exp, 0, i+1) = make_numeric_value (decl->insn_num);
4849           XVECEXP (lats_exp, 0, i+1)
4850             = make_numeric_value (decl->default_latency);
4851         }
4852       make_internal_attr ("*internal_dfa_insn_code", code_exp, ATTR_NONE);
4853       make_internal_attr ("*insn_default_latency",   lats_exp, ATTR_NONE);
4854     }
4855
4856   if (n_bypasses == 0)
4857     byps_exp = make_numeric_value (0);
4858   else
4859     {
4860       process_bypasses ();
4861
4862       byps_exp = rtx_alloc (COND);
4863       XVEC (byps_exp, 0) = rtvec_alloc (n_bypasses * 2);
4864       XEXP (byps_exp, 1) = make_numeric_value (0);
4865       for (decl = all_insn_reservs, i = 0;
4866            decl;
4867            decl = decl->next)
4868         if (decl->bypassed)
4869           {
4870             XVECEXP (byps_exp, 0, i)   = decl->condexp;
4871             XVECEXP (byps_exp, 0, i+1) = make_numeric_value (1);
4872             i += 2;
4873           }
4874     }
4875
4876   make_internal_attr ("*bypass_p",               byps_exp, ATTR_NONE);
4877 }
4878
4879 int
4880 main (int argc, char **argv)
4881 {
4882   rtx desc;
4883   struct attr_desc *attr;
4884   struct insn_def *id;
4885   rtx tem;
4886   int i;
4887
4888   progname = "genattrtab";
4889
4890   if (!init_rtx_reader_args (argc, argv))
4891     return (FATAL_EXIT_CODE);
4892
4893   obstack_init (hash_obstack);
4894   obstack_init (temp_obstack);
4895
4896   /* Set up true and false rtx's */
4897   true_rtx = rtx_alloc (CONST_INT);
4898   XWINT (true_rtx, 0) = 1;
4899   false_rtx = rtx_alloc (CONST_INT);
4900   XWINT (false_rtx, 0) = 0;
4901   ATTR_IND_SIMPLIFIED_P (true_rtx) = ATTR_IND_SIMPLIFIED_P (false_rtx) = 1;
4902   ATTR_PERMANENT_P (true_rtx) = ATTR_PERMANENT_P (false_rtx) = 1;
4903
4904   alternative_name = DEF_ATTR_STRING ("alternative");
4905   length_str = DEF_ATTR_STRING ("length");
4906   delay_type_str = DEF_ATTR_STRING ("*delay_type");
4907   delay_1_0_str = DEF_ATTR_STRING ("*delay_1_0");
4908   num_delay_slots_str = DEF_ATTR_STRING ("*num_delay_slots");
4909
4910   printf ("/* Generated automatically by the program `genattrtab'\n\
4911 from the machine description file `md'.  */\n\n");
4912
4913   /* Read the machine description.  */
4914
4915   while (1)
4916     {
4917       int lineno;
4918
4919       desc = read_md_rtx (&lineno, &insn_code_number);
4920       if (desc == NULL)
4921         break;
4922
4923       switch (GET_CODE (desc))
4924         {
4925         case DEFINE_INSN:
4926         case DEFINE_PEEPHOLE:
4927         case DEFINE_ASM_ATTRIBUTES:
4928           gen_insn (desc, lineno);
4929           break;
4930
4931         case DEFINE_ATTR:
4932         case DEFINE_ENUM_ATTR:
4933           gen_attr (desc, lineno);
4934           break;
4935
4936         case DEFINE_DELAY:
4937           gen_delay (desc, lineno);
4938           break;
4939
4940         case DEFINE_INSN_RESERVATION:
4941           gen_insn_reserv (desc);
4942           break;
4943
4944         case DEFINE_BYPASS:
4945           gen_bypass (desc);
4946           break;
4947
4948         default:
4949           break;
4950         }
4951       if (GET_CODE (desc) != DEFINE_ASM_ATTRIBUTES)
4952         insn_index_number++;
4953     }
4954
4955   if (have_error)
4956     return FATAL_EXIT_CODE;
4957
4958   insn_code_number++;
4959
4960   /* If we didn't have a DEFINE_ASM_ATTRIBUTES, make a null one.  */
4961   if (! got_define_asm_attributes)
4962     {
4963       tem = rtx_alloc (DEFINE_ASM_ATTRIBUTES);
4964       XVEC (tem, 0) = rtvec_alloc (0);
4965       gen_insn (tem, 0);
4966     }
4967
4968   /* Expand DEFINE_DELAY information into new attribute.  */
4969   if (num_delays)
4970     expand_delays ();
4971
4972   printf ("#include \"config.h\"\n");
4973   printf ("#include \"system.h\"\n");
4974   printf ("#include \"coretypes.h\"\n");
4975   printf ("#include \"tm.h\"\n");
4976   printf ("#include \"rtl.h\"\n");
4977   printf ("#include \"insn-attr.h\"\n");
4978   printf ("#include \"tm_p.h\"\n");
4979   printf ("#include \"insn-config.h\"\n");
4980   printf ("#include \"recog.h\"\n");
4981   printf ("#include \"regs.h\"\n");
4982   printf ("#include \"output.h\"\n");
4983   printf ("#include \"diagnostic-core.h\"\n");
4984   printf ("#include \"flags.h\"\n");
4985   printf ("#include \"function.h\"\n");
4986   printf ("\n");
4987   printf ("#define operands recog_data.operand\n\n");
4988
4989   /* Make `insn_alternatives'.  */
4990   insn_alternatives = oballocvec (int, insn_code_number);
4991   for (id = defs; id; id = id->next)
4992     if (id->insn_code >= 0)
4993       insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1;
4994
4995   /* Make `insn_n_alternatives'.  */
4996   insn_n_alternatives = oballocvec (int, insn_code_number);
4997   for (id = defs; id; id = id->next)
4998     if (id->insn_code >= 0)
4999       insn_n_alternatives[id->insn_code] = id->num_alternatives;
5000
5001   /* Construct extra attributes for automata.  */
5002   make_automaton_attrs ();
5003
5004   /* Prepare to write out attribute subroutines by checking everything stored
5005      away and building the attribute cases.  */
5006
5007   check_defs ();
5008
5009   for (i = 0; i < MAX_ATTRS_INDEX; i++)
5010     for (attr = attrs[i]; attr; attr = attr->next)
5011       attr->default_val->value
5012         = check_attr_value (attr->default_val->value, attr);
5013
5014   if (have_error)
5015     return FATAL_EXIT_CODE;
5016
5017   for (i = 0; i < MAX_ATTRS_INDEX; i++)
5018     for (attr = attrs[i]; attr; attr = attr->next)
5019       fill_attr (attr);
5020
5021   /* Construct extra attributes for `length'.  */
5022   make_length_attrs ();
5023
5024   /* Perform any possible optimizations to speed up compilation.  */
5025   optimize_attrs ();
5026
5027   /* Now write out all the `gen_attr_...' routines.  Do these before the
5028      special routines so that they get defined before they are used.  */
5029
5030   for (i = 0; i < MAX_ATTRS_INDEX; i++)
5031     for (attr = attrs[i]; attr; attr = attr->next)
5032       {
5033         if (! attr->is_special && ! attr->is_const)
5034           write_attr_get (attr);
5035       }
5036
5037   /* Write out delay eligibility information, if DEFINE_DELAY present.
5038      (The function to compute the number of delay slots will be written
5039      below.)  */
5040   if (num_delays)
5041     {
5042       write_eligible_delay ("delay");
5043       if (have_annul_true)
5044         write_eligible_delay ("annul_true");
5045       if (have_annul_false)
5046         write_eligible_delay ("annul_false");
5047     }
5048
5049   /* Write out constant delay slot info.  */
5050   write_const_num_delay_slots ();
5051
5052   write_length_unit_log ();
5053
5054   fflush (stdout);
5055   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
5056 }