xref: /dragonfly/contrib/gcc-4.7/gcc/genattrtab.c (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
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
attr_hash_add_rtx(int hashcode,rtx rtl)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
attr_hash_add_string(int hashcode,char * str)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
attr_rtx_1(enum rtx_code code,va_list p)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
attr_rtx(enum rtx_code code,...)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 *
attr_printf(unsigned int len,const char * fmt,...)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
attr_eq(const char * name,const char * value)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 *
attr_numeral(int n)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 *
attr_string(const char * str,int len)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
attr_equal_p(rtx x,rtx y)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
attr_copy_rtx(rtx orig)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
check_attr_test(rtx exp,int is_const,int lineno)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
check_attr_value(rtx exp,struct attr_desc * attr)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
convert_set_attr_alternative(rtx exp,struct insn_def * id)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
convert_set_attr(rtx exp,struct insn_def * id)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
check_defs(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
make_canonical(struct attr_desc * attr,rtx exp)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
copy_boolean(rtx exp)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 *
get_attr_value(rtx value,struct attr_desc * attr,int insn_code)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
expand_delays(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
fill_attr(struct attr_desc * attr)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
substitute_address(rtx exp,rtx (* no_address_fn)(rtx),rtx (* address_fn)(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
make_length_attrs(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
identity_fn(rtx exp)1581 identity_fn (rtx exp)
1582 {
1583   return exp;
1584 }
1585 
1586 static rtx
zero_fn(rtx exp ATTRIBUTE_UNUSED)1587 zero_fn (rtx exp ATTRIBUTE_UNUSED)
1588 {
1589   return make_numeric_value (0);
1590 }
1591 
1592 static rtx
one_fn(rtx exp ATTRIBUTE_UNUSED)1593 one_fn (rtx exp ATTRIBUTE_UNUSED)
1594 {
1595   return make_numeric_value (1);
1596 }
1597 
1598 static rtx
max_fn(rtx exp)1599 max_fn (rtx exp)
1600 {
1601   int unknown;
1602   return make_numeric_value (max_attr_value (exp, &unknown));
1603 }
1604 
1605 static rtx
min_fn(rtx exp)1606 min_fn (rtx exp)
1607 {
1608   int unknown;
1609   return make_numeric_value (min_attr_value (exp, &unknown));
1610 }
1611 
1612 static void
write_length_unit_log(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
simplify_cond(rtx exp,int insn_code,int insn_index)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
remove_insn_ent(struct attr_value * av,struct insn_ent * ie)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
insert_insn_ent(struct attr_value * av,struct insn_ent * ie)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
insert_right_side(enum rtx_code code,rtx exp,rtx term,int insn_code,int insn_index)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
compute_alternative_mask(rtx exp,enum rtx_code code)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
make_alternative_compare(int mask)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
evaluate_eq_attr(rtx exp,struct attr_desc * attr,rtx value,int insn_code,int insn_index)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
simplify_and_tree(rtx exp,rtx * pterm,int insn_code,int insn_index)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
simplify_or_tree(rtx exp,rtx * pterm,int insn_code,int insn_index)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
attr_rtx_cost(rtx x)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
simplify_test_exp_in_temp(rtx exp,int insn_code,int insn_index)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
attr_alt_subset_p(rtx s1,rtx s2)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
attr_alt_subset_of_compl_p(rtx s1,rtx s2)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
attr_alt_intersection(rtx s1,rtx s2)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
attr_alt_union(rtx s1,rtx s2)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
attr_alt_complement(rtx s)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
mk_attr_alt(int e)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
simplify_test_exp(rtx exp,int insn_code,int insn_index)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
optimize_attrs(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
clear_struct_flag(rtx x)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
add_attr_value(struct attr_desc * attr,const char * name)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
gen_attr(rtx exp,int lineno)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
count_alternatives(rtx exp)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
compares_alternatives_p(rtx exp)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
gen_insn(rtx exp,int lineno)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
gen_delay(rtx def,int lineno)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
find_attrs_to_cache(rtx exp,bool create)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
write_test_expr(rtx exp,unsigned int attrs_cached,int flags)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
max_attr_value(rtx exp,int * unknownp)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
min_attr_value(rtx exp,int * unknownp)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
or_attr_value(rtx exp,int * unknownp)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
walk_attr_value(rtx exp)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
write_attr_get(struct attr_desc * attr)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
eliminate_known_true(rtx known_true,rtx exp,int insn_code,int insn_index)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
write_attr_set(struct attr_desc * attr,int indent,rtx value,const char * prefix,const char * suffix,rtx known_true,int insn_code,int insn_index,unsigned int attrs_cached)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
write_insn_cases(struct insn_ent * ie,int indent)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
write_attr_case(struct attr_desc * attr,struct attr_value * av,int write_case_lines,const char * prefix,const char * suffix,int indent,rtx known_true)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
write_attr_valueq(struct attr_desc * attr,const char * s)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
write_attr_value(struct attr_desc * attr,rtx value)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
write_upcase(const char * str)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
write_indent(int indent)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
write_eligible_delay(const char * kind)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 *
next_comma_elt(const char ** pstr)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 *
find_attr(const char ** name_p,int create)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
make_internal_attr(const char * name,rtx value,int special)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 *
find_most_used(struct attr_desc * attr)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
make_numeric_value(int n)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
copy_rtx_unchanging(rtx orig)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
write_const_num_delay_slots(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
gen_insn_reserv(rtx def)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
gen_bypass_1(const char * s,size_t len)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
gen_bypass(rtx def)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
process_bypasses(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
check_tune_attr(const char * name,rtx exp)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 *
find_tune_attr(rtx exp)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
make_automaton_attrs(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
main(int argc,char ** argv)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