xref: /dragonfly/contrib/gcc-4.7/gcc/genattrtab.c (revision 6ca88057)
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 
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 }
5057