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