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