1 /* Generate code from machine description to compute values of attributes.
2 Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 /* This program handles insn attributes and the DEFINE_DELAY and
24 DEFINE_INSN_RESERVATION definitions.
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.
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
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.
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
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
56 Internal attributes are defined to handle DEFINE_DELAY and
57 DEFINE_INSN_RESERVATION. Special routines are output for these cases.
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.
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.
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.
73 The strategy used when processing DEFINE_DELAY definitions is to create
74 arbitrarily complex expressions and have the optimization simplify them.
76 Once optimization is complete, any required routines and definitions
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).
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
94 `volatil' (ATTR_EQ_ATTR_P): During simplify_by_exploding the value of an
95 EQ_ATTR rtx is true if !volatil and false if volatil. */
97 #define ATTR_IND_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), unchanging))
98 #define ATTR_CURR_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), in_struct))
99 #define ATTR_PERMANENT_P(RTX) (RTX_FLAG((RTX), return_val))
100 #define ATTR_EQ_ATTR_P(RTX) (RTX_FLAG((RTX), volatil))
103 #define strcmp_check(S1, S2) ((S1) == (S2) \
105 : (gcc_assert (strcmp ((S1), (S2))), 1))
107 #define strcmp_check(S1, S2) ((S1) != (S2))
112 #include "coretypes.h"
116 #include "gensupport.h"
118 #ifdef HAVE_SYS_RESOURCE_H
119 # include <sys/resource.h>
122 /* We must include obstack.h after <sys/time.h>, to avoid lossage with
123 /usr/include/sys/stdtypes.h on Sun OS 4.x. */
127 #include "genattrtab.h"
129 static struct obstack obstack1, obstack2;
130 struct obstack *hash_obstack = &obstack1;
131 struct obstack *temp_obstack = &obstack2;
133 /* enough space to reserve for printing out ints */
134 #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
136 /* Define structures used to record attributes and values. */
138 /* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is
139 encountered, we store all the relevant information into a
140 `struct insn_def'. This is done to allow attribute definitions to occur
141 anywhere in the file. */
145 struct insn_def *next; /* Next insn in chain. */
146 rtx def; /* The DEFINE_... */
147 int insn_code; /* Instruction number. */
148 int insn_index; /* Expression numer in file, for errors. */
149 int lineno; /* Line number. */
150 int num_alternatives; /* Number of alternatives. */
151 int vec_idx; /* Index of attribute vector in `def'. */
154 /* Once everything has been read in, we store in each attribute value a list
155 of insn codes that have that value. Here is the structure used for the
160 struct insn_ent *next; /* Next in chain. */
161 struct insn_def *def; /* Instruction definition. */
164 /* Each value of an attribute (either constant or computed) is assigned a
165 structure which is used as the listhead of the insns that have that
170 rtx value; /* Value of attribute. */
171 struct attr_value *next; /* Next attribute value in chain. */
172 struct insn_ent *first_insn; /* First insn with this value. */
173 int num_insns; /* Number of insns with this value. */
174 int has_asm_insn; /* True if this value used for `asm' insns */
177 /* Structure for each attribute. */
181 char *name; /* Name of attribute. */
182 struct attr_desc *next; /* Next attribute. */
183 struct attr_value *first_value; /* First value of this attribute. */
184 struct attr_value *default_val; /* Default value for this attribute. */
185 int lineno : 24; /* Line number. */
186 unsigned is_numeric : 1; /* Values of this attribute are numeric. */
187 unsigned negative_ok : 1; /* Allow negative numeric values. */
188 unsigned unsigned_p : 1; /* Make the output function unsigned int. */
189 unsigned is_const : 1; /* Attribute value constant for each run. */
190 unsigned is_special : 1; /* Don't call `write_attr_set'. */
191 unsigned static_p : 1; /* Make the output function static. */
194 #define NULL_ATTR (struct attr_desc *) NULL
196 /* Structure for each DEFINE_DELAY. */
200 rtx def; /* DEFINE_DELAY expression. */
201 struct delay_desc *next; /* Next DEFINE_DELAY. */
202 int num; /* Number of DEFINE_DELAY, starting at 1. */
203 int lineno; /* Line number. */
206 /* Listheads of above structures. */
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;
214 /* Other variables. */
216 static int insn_code_number;
217 static int insn_index_number;
218 static int got_define_asm_attributes;
219 static int must_extract;
220 static int must_constrain;
221 static int address_used;
222 static int length_used;
223 static int num_delays;
224 static int have_annul_true, have_annul_false;
225 static int num_insn_ents;
229 /* Stores, for each insn code, the number of constraint alternatives. */
231 static int *insn_n_alternatives;
233 /* Stores, for each insn code, a bitmap that has bits on for each possible
236 static int *insn_alternatives;
238 /* If nonzero, assume that the `alternative' attr has this value.
239 This is the hashed, unique string for the numeral
240 whose value is chosen alternative. */
242 static const char *current_alternative_string;
244 /* Used to simplify expressions. */
246 static rtx true_rtx, false_rtx;
248 /* Used to reduce calls to `strcmp' */
250 static char *alternative_name;
251 static const char *length_str;
252 static const char *delay_type_str;
253 static const char *delay_1_0_str;
254 static const char *num_delay_slots_str;
256 /* Indicate that REG_DEAD notes are valid if dead_or_set_p is ever
259 int reload_completed = 0;
261 /* Some machines test `optimize' in macros called from rtlanal.c, so we need
262 to define it here. */
266 /* Simplify an expression. Only call the routine if there is something to
268 #define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX) \
269 (ATTR_IND_SIMPLIFIED_P (EXP) || ATTR_CURR_SIMPLIFIED_P (EXP) ? (EXP) \
270 : simplify_test_exp (EXP, INSN_CODE, INSN_INDEX))
272 /* Simplify (eq_attr ("alternative") ...)
273 when we are working with a particular alternative. */
274 #define SIMPLIFY_ALTERNATIVE(EXP) \
275 if (current_alternative_string \
276 && GET_CODE ((EXP)) == EQ_ATTR \
277 && XSTR ((EXP), 0) == alternative_name) \
278 (EXP) = (XSTR ((EXP), 1) == current_alternative_string \
279 ? true_rtx : false_rtx);
281 #define DEF_ATTR_STRING(S) (attr_string ((S), strlen (S)))
283 /* These are referenced by rtlanal.c and hence need to be defined somewhere.
284 They won't actually be used. */
286 rtx global_rtl[GR_MAX];
287 rtx pic_offset_table_rtx;
289 static void attr_hash_add_rtx (int, rtx);
290 static void attr_hash_add_string (int, char *);
291 static rtx attr_rtx (enum rtx_code, ...);
292 static rtx attr_rtx_1 (enum rtx_code, va_list);
293 static char *attr_string (const char *, int);
294 static rtx check_attr_value (rtx, struct attr_desc *);
295 static rtx convert_set_attr_alternative (rtx, struct insn_def *);
296 static rtx convert_set_attr (rtx, struct insn_def *);
297 static void check_defs (void);
298 static rtx make_canonical (struct attr_desc *, rtx);
299 static struct attr_value *get_attr_value (rtx, struct attr_desc *, int);
300 static rtx copy_rtx_unchanging (rtx);
301 static rtx copy_boolean (rtx);
302 static void expand_delays (void);
303 static void fill_attr (struct attr_desc *);
304 static rtx substitute_address (rtx, rtx (*) (rtx), rtx (*) (rtx));
305 static void make_length_attrs (void);
306 static rtx identity_fn (rtx);
307 static rtx zero_fn (rtx);
308 static rtx one_fn (rtx);
309 static rtx max_fn (rtx);
310 static void write_length_unit_log (void);
311 static rtx simplify_cond (rtx, int, int);
312 static void clear_struct_flag (rtx);
313 static void remove_insn_ent (struct attr_value *, struct insn_ent *);
314 static void insert_insn_ent (struct attr_value *, struct insn_ent *);
315 static rtx insert_right_side (enum rtx_code, rtx, rtx, int, int);
316 static rtx make_alternative_compare (int);
317 static int compute_alternative_mask (rtx, enum rtx_code);
318 static rtx evaluate_eq_attr (rtx, rtx, int, int);
319 static rtx simplify_and_tree (rtx, rtx *, int, int);
320 static rtx simplify_or_tree (rtx, rtx *, int, int);
321 static rtx simplify_test_exp (rtx, int, int);
322 static rtx simplify_test_exp_in_temp (rtx, int, int);
323 static void optimize_attrs (void);
324 static void gen_attr (rtx, int);
325 static int count_alternatives (rtx);
326 static int compares_alternatives_p (rtx);
327 static int contained_in_p (rtx, rtx);
328 static void gen_insn (rtx, int);
329 static void gen_delay (rtx, int);
330 static void write_test_expr (rtx, int);
331 static int max_attr_value (rtx, int*);
332 static int or_attr_value (rtx, int*);
333 static void walk_attr_value (rtx);
334 static void write_attr_get (struct attr_desc *);
335 static rtx eliminate_known_true (rtx, rtx, int, int);
336 static void write_attr_set (struct attr_desc *, int, rtx,
337 const char *, const char *, rtx,
339 static void write_attr_case (struct attr_desc *, struct attr_value *,
340 int, const char *, const char *, int, rtx);
341 static void write_attr_valueq (struct attr_desc *, const char *);
342 static void write_attr_value (struct attr_desc *, rtx);
343 static void write_upcase (const char *);
344 static void write_indent (int);
345 static void write_eligible_delay (const char *);
346 static int write_expr_attr_cache (rtx, struct attr_desc *);
347 static void write_const_num_delay_slots (void);
348 static char *next_comma_elt (const char **);
349 static struct attr_desc *find_attr (const char **, int);
350 static struct attr_value *find_most_used (struct attr_desc *);
351 static rtx attr_eq (const char *, const char *);
352 static const char *attr_numeral (int);
353 static int attr_equal_p (rtx, rtx);
354 static rtx attr_copy_rtx (rtx);
355 static int attr_rtx_cost (rtx);
356 static bool attr_alt_subset_p (rtx, rtx);
357 static bool attr_alt_subset_of_compl_p (rtx, rtx);
358 static rtx attr_alt_intersection (rtx, rtx);
359 static rtx attr_alt_union (rtx, rtx);
360 static rtx attr_alt_complement (rtx);
361 static bool attr_alt_bit_p (rtx, int);
362 static rtx mk_attr_alt (int);
364 #define oballoc(size) obstack_alloc (hash_obstack, size)
366 /* Hash table for sharing RTL and strings. */
368 /* Each hash table slot is a bucket containing a chain of these structures.
369 Strings are given negative hash codes; RTL expressions are given positive
374 struct attr_hash *next; /* Next structure in the bucket. */
375 int hashcode; /* Hash code of this rtx or string. */
378 char *str; /* The string (negative hash codes) */
379 rtx rtl; /* or the RTL recorded here. */
383 /* Now here is the hash table. When recording an RTL, it is added to
384 the slot whose index is the hash code mod the table size. Note
385 that the hash table is used for several kinds of RTL (see attr_rtx)
386 and for strings. While all these live in the same table, they are
387 completely independent, and the hash code is computed differently
390 #define RTL_HASH_SIZE 4093
391 struct attr_hash *attr_hash_table[RTL_HASH_SIZE];
393 /* Here is how primitive or already-shared RTL's hash
395 #define RTL_HASH(RTL) ((long) (RTL) & 0777777)
397 /* Add an entry to the hash table for RTL with hash code HASHCODE. */
400 attr_hash_add_rtx (int hashcode, rtx rtl)
404 h = obstack_alloc (hash_obstack, sizeof (struct attr_hash));
405 h->hashcode = hashcode;
407 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
408 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
411 /* Add an entry to the hash table for STRING with hash code HASHCODE. */
414 attr_hash_add_string (int hashcode, char *str)
418 h = obstack_alloc (hash_obstack, sizeof (struct attr_hash));
419 h->hashcode = -hashcode;
421 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
422 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
425 /* Generate an RTL expression, but avoid duplicates.
426 Set the ATTR_PERMANENT_P flag for these permanent objects.
428 In some cases we cannot uniquify; then we return an ordinary
429 impermanent rtx with ATTR_PERMANENT_P clear.
433 rtx attr_rtx (code, [element1, ..., elementn]) */
436 attr_rtx_1 (enum rtx_code code, va_list p)
438 rtx rt_val = NULL_RTX;/* RTX to return to caller... */
441 struct obstack *old_obstack = rtl_obstack;
443 /* For each of several cases, search the hash table for an existing entry.
444 Use that entry if one is found; otherwise create a new RTL and add it
447 if (GET_RTX_CLASS (code) == RTX_UNARY)
449 rtx arg0 = va_arg (p, rtx);
451 /* A permanent object cannot point to impermanent ones. */
452 if (! ATTR_PERMANENT_P (arg0))
454 rt_val = rtx_alloc (code);
455 XEXP (rt_val, 0) = arg0;
459 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
460 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
461 if (h->hashcode == hashcode
462 && GET_CODE (h->u.rtl) == code
463 && XEXP (h->u.rtl, 0) == arg0)
468 rtl_obstack = hash_obstack;
469 rt_val = rtx_alloc (code);
470 XEXP (rt_val, 0) = arg0;
473 else if (GET_RTX_CLASS (code) == RTX_BIN_ARITH
474 || GET_RTX_CLASS (code) == RTX_COMM_ARITH
475 || GET_RTX_CLASS (code) == RTX_COMPARE
476 || GET_RTX_CLASS (code) == RTX_COMM_COMPARE)
478 rtx arg0 = va_arg (p, rtx);
479 rtx arg1 = va_arg (p, rtx);
481 /* A permanent object cannot point to impermanent ones. */
482 if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1))
484 rt_val = rtx_alloc (code);
485 XEXP (rt_val, 0) = arg0;
486 XEXP (rt_val, 1) = arg1;
490 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
491 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
492 if (h->hashcode == hashcode
493 && GET_CODE (h->u.rtl) == code
494 && XEXP (h->u.rtl, 0) == arg0
495 && XEXP (h->u.rtl, 1) == arg1)
500 rtl_obstack = hash_obstack;
501 rt_val = rtx_alloc (code);
502 XEXP (rt_val, 0) = arg0;
503 XEXP (rt_val, 1) = arg1;
506 else if (GET_RTX_LENGTH (code) == 1
507 && GET_RTX_FORMAT (code)[0] == 's')
509 char *arg0 = va_arg (p, char *);
511 arg0 = DEF_ATTR_STRING (arg0);
513 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
514 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
515 if (h->hashcode == hashcode
516 && GET_CODE (h->u.rtl) == code
517 && XSTR (h->u.rtl, 0) == arg0)
522 rtl_obstack = hash_obstack;
523 rt_val = rtx_alloc (code);
524 XSTR (rt_val, 0) = arg0;
527 else if (GET_RTX_LENGTH (code) == 2
528 && GET_RTX_FORMAT (code)[0] == 's'
529 && GET_RTX_FORMAT (code)[1] == 's')
531 char *arg0 = va_arg (p, char *);
532 char *arg1 = va_arg (p, char *);
534 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
535 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
536 if (h->hashcode == hashcode
537 && GET_CODE (h->u.rtl) == code
538 && XSTR (h->u.rtl, 0) == arg0
539 && XSTR (h->u.rtl, 1) == arg1)
544 rtl_obstack = hash_obstack;
545 rt_val = rtx_alloc (code);
546 XSTR (rt_val, 0) = arg0;
547 XSTR (rt_val, 1) = arg1;
550 else if (code == CONST_INT)
552 HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
562 int i; /* Array indices... */
563 const char *fmt; /* Current rtx's format... */
565 rt_val = rtx_alloc (code); /* Allocate the storage space. */
567 fmt = GET_RTX_FORMAT (code); /* Find the right format... */
568 for (i = 0; i < GET_RTX_LENGTH (code); i++)
572 case '0': /* Unused field. */
575 case 'i': /* An integer? */
576 XINT (rt_val, i) = va_arg (p, int);
579 case 'w': /* A wide integer? */
580 XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
583 case 's': /* A string? */
584 XSTR (rt_val, i) = va_arg (p, char *);
587 case 'e': /* An expression? */
588 case 'u': /* An insn? Same except when printing. */
589 XEXP (rt_val, i) = va_arg (p, rtx);
592 case 'E': /* An RTX vector? */
593 XVEC (rt_val, i) = va_arg (p, rtvec);
603 rtl_obstack = old_obstack;
604 attr_hash_add_rtx (hashcode, rt_val);
605 ATTR_PERMANENT_P (rt_val) = 1;
610 attr_rtx (enum rtx_code code, ...)
616 result = attr_rtx_1 (code, p);
621 /* Create a new string printed with the printf line arguments into a space
622 of at most LEN bytes:
624 rtx attr_printf (len, format, [arg1, ..., argn]) */
627 attr_printf (unsigned int len, const char *fmt, ...)
634 gcc_assert (len < sizeof str); /* Leave room for \0. */
636 vsprintf (str, fmt, p);
639 return DEF_ATTR_STRING (str);
643 attr_eq (const char *name, const char *value)
645 return attr_rtx (EQ_ATTR, DEF_ATTR_STRING (name), DEF_ATTR_STRING (value));
651 return XSTR (make_numeric_value (n), 0);
654 /* Return a permanent (possibly shared) copy of a string STR (not assumed
655 to be null terminated) with LEN bytes. */
658 attr_string (const char *str, int len)
665 /* Compute the hash code. */
666 hashcode = (len + 1) * 613 + (unsigned) str[0];
667 for (i = 1; i <= len; i += 2)
668 hashcode = ((hashcode * 613) + (unsigned) str[i]);
670 hashcode = -hashcode;
672 /* Search the table for the string. */
673 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
674 if (h->hashcode == -hashcode && h->u.str[0] == str[0]
675 && !strncmp (h->u.str, str, len))
676 return h->u.str; /* <-- return if found. */
678 /* Not found; create a permanent copy and add it to the hash table. */
679 new_str = obstack_alloc (hash_obstack, len + 1);
680 memcpy (new_str, str, len);
682 attr_hash_add_string (hashcode, new_str);
684 return new_str; /* Return the new string. */
687 /* Check two rtx's for equality of contents,
688 taking advantage of the fact that if both are hashed
689 then they can't be equal unless they are the same object. */
692 attr_equal_p (rtx x, rtx y)
694 return (x == y || (! (ATTR_PERMANENT_P (x) && ATTR_PERMANENT_P (y))
695 && rtx_equal_p (x, y)));
698 /* Copy an attribute value expression,
699 descending to all depths, but not copying any
700 permanent hashed subexpressions. */
703 attr_copy_rtx (rtx orig)
708 const char *format_ptr;
710 /* No need to copy a permanent object. */
711 if (ATTR_PERMANENT_P (orig))
714 code = GET_CODE (orig);
732 copy = rtx_alloc (code);
733 PUT_MODE (copy, GET_MODE (orig));
734 ATTR_IND_SIMPLIFIED_P (copy) = ATTR_IND_SIMPLIFIED_P (orig);
735 ATTR_CURR_SIMPLIFIED_P (copy) = ATTR_CURR_SIMPLIFIED_P (orig);
736 ATTR_PERMANENT_P (copy) = ATTR_PERMANENT_P (orig);
737 ATTR_EQ_ATTR_P (copy) = ATTR_EQ_ATTR_P (orig);
739 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
741 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
743 switch (*format_ptr++)
746 XEXP (copy, i) = XEXP (orig, i);
747 if (XEXP (orig, i) != NULL)
748 XEXP (copy, i) = attr_copy_rtx (XEXP (orig, i));
753 XVEC (copy, i) = XVEC (orig, i);
754 if (XVEC (orig, i) != NULL)
756 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
757 for (j = 0; j < XVECLEN (copy, i); j++)
758 XVECEXP (copy, i, j) = attr_copy_rtx (XVECEXP (orig, i, j));
764 XINT (copy, i) = XINT (orig, i);
768 XWINT (copy, i) = XWINT (orig, i);
773 XSTR (copy, i) = XSTR (orig, i);
783 /* Given a test expression for an attribute, ensure it is validly formed.
784 IS_CONST indicates whether the expression is constant for each compiler
785 run (a constant expression may not test any particular insn).
787 Convert (eq_attr "att" "a1,a2") to (ior (eq_attr ... ) (eq_attrq ..))
788 and (eq_attr "att" "!a1") to (not (eq_attr "att" "a1")). Do the latter
789 test first so that (eq_attr "att" "!a1,a2,a3") works as expected.
791 Update the string address in EQ_ATTR expression to be the same used
792 in the attribute (or `alternative_name') to speed up subsequent
793 `find_attr' calls and eliminate most `strcmp' calls.
795 Return the new expression, if any. */
798 check_attr_test (rtx exp, int is_const, int lineno)
800 struct attr_desc *attr;
801 struct attr_value *av;
802 const char *name_ptr, *p;
805 switch (GET_CODE (exp))
808 /* Handle negation test. */
809 if (XSTR (exp, 1)[0] == '!')
810 return check_attr_test (attr_rtx (NOT,
811 attr_eq (XSTR (exp, 0),
815 else if (n_comma_elts (XSTR (exp, 1)) == 1)
817 attr = find_attr (&XSTR (exp, 0), 0);
820 if (! strcmp (XSTR (exp, 0), "alternative"))
821 return mk_attr_alt (1 << atoi (XSTR (exp, 1)));
823 fatal ("unknown attribute `%s' in EQ_ATTR", XSTR (exp, 0));
826 if (is_const && ! attr->is_const)
827 fatal ("constant expression uses insn attribute `%s' in EQ_ATTR",
830 /* Copy this just to make it permanent,
831 so expressions using it can be permanent too. */
832 exp = attr_eq (XSTR (exp, 0), XSTR (exp, 1));
834 /* It shouldn't be possible to simplify the value given to a
835 constant attribute, so don't expand this until it's time to
836 write the test expression. */
838 ATTR_IND_SIMPLIFIED_P (exp) = 1;
840 if (attr->is_numeric)
842 for (p = XSTR (exp, 1); *p; p++)
844 fatal ("attribute `%s' takes only numeric values",
849 for (av = attr->first_value; av; av = av->next)
850 if (GET_CODE (av->value) == CONST_STRING
851 && ! strcmp (XSTR (exp, 1), XSTR (av->value, 0)))
855 fatal ("unknown value `%s' for `%s' attribute",
856 XSTR (exp, 1), XSTR (exp, 0));
861 if (! strcmp (XSTR (exp, 0), "alternative"))
865 name_ptr = XSTR (exp, 1);
866 while ((p = next_comma_elt (&name_ptr)) != NULL)
867 set |= 1 << atoi (p);
869 return mk_attr_alt (set);
873 /* Make an IOR tree of the possible values. */
875 name_ptr = XSTR (exp, 1);
876 while ((p = next_comma_elt (&name_ptr)) != NULL)
878 newexp = attr_eq (XSTR (exp, 0), p);
879 orexp = insert_right_side (IOR, orexp, newexp, -2, -2);
882 return check_attr_test (orexp, is_const, lineno);
891 /* Either TRUE or FALSE. */
899 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
900 XEXP (exp, 1) = check_attr_test (XEXP (exp, 1), is_const, lineno);
904 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
909 fatal ("RTL operator \"%s\" not valid in constant attribute test",
910 GET_RTX_NAME (GET_CODE (exp)));
911 /* These cases can't be simplified. */
912 ATTR_IND_SIMPLIFIED_P (exp) = 1;
915 case LE: case LT: case GT: case GE:
916 case LEU: case LTU: case GTU: case GEU:
918 if (GET_CODE (XEXP (exp, 0)) == SYMBOL_REF
919 && GET_CODE (XEXP (exp, 1)) == SYMBOL_REF)
920 exp = attr_rtx (GET_CODE (exp),
921 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 0), 0)),
922 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 1), 0)));
923 /* These cases can't be simplified. */
924 ATTR_IND_SIMPLIFIED_P (exp) = 1;
930 /* These cases are valid for constant attributes, but can't be
932 exp = attr_rtx (SYMBOL_REF, XSTR (exp, 0));
933 ATTR_IND_SIMPLIFIED_P (exp) = 1;
937 fatal ("RTL operator \"%s\" not valid in attribute test",
938 GET_RTX_NAME (GET_CODE (exp)));
944 /* Given an expression, ensure that it is validly formed and that all named
945 attribute values are valid for the given attribute. Issue a fatal error
946 if not. If no attribute is specified, assume a numeric attribute.
948 Return a perhaps modified replacement expression for the value. */
951 check_attr_value (rtx exp, struct attr_desc *attr)
953 struct attr_value *av;
957 switch (GET_CODE (exp))
960 if (attr && ! attr->is_numeric)
962 message_with_line (attr->lineno,
963 "CONST_INT not valid for non-numeric attribute %s",
969 if (INTVAL (exp) < 0 && ! attr->negative_ok)
971 message_with_line (attr->lineno,
972 "negative numeric value specified for attribute %s",
980 if (! strcmp (XSTR (exp, 0), "*"))
983 if (attr == 0 || attr->is_numeric)
986 if (attr && attr->negative_ok && *p == '-')
991 message_with_line (attr ? attr->lineno : 0,
992 "non-numeric value for numeric attribute %s",
993 attr ? attr->name : "internal");
1000 for (av = attr->first_value; av; av = av->next)
1001 if (GET_CODE (av->value) == CONST_STRING
1002 && ! strcmp (XSTR (av->value, 0), XSTR (exp, 0)))
1007 message_with_line (attr->lineno,
1008 "unknown value `%s' for `%s' attribute",
1009 XSTR (exp, 0), attr ? attr->name : "internal");
1015 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0),
1016 attr ? attr->is_const : 0,
1017 attr ? attr->lineno : 0);
1018 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1019 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
1027 if (attr && !attr->is_numeric)
1029 message_with_line (attr->lineno,
1030 "invalid operation `%s' for non-numeric attribute value",
1031 GET_RTX_NAME (GET_CODE (exp)));
1039 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
1040 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1048 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
1052 if (XVECLEN (exp, 0) % 2 != 0)
1054 message_with_line (attr->lineno,
1055 "first operand of COND must have even length");
1060 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1062 XVECEXP (exp, 0, i) = check_attr_test (XVECEXP (exp, 0, i),
1063 attr ? attr->is_const : 0,
1064 attr ? attr->lineno : 0);
1065 XVECEXP (exp, 0, i + 1)
1066 = check_attr_value (XVECEXP (exp, 0, i + 1), attr);
1069 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1074 struct attr_desc *attr2 = find_attr (&XSTR (exp, 0), 0);
1077 message_with_line (attr ? attr->lineno : 0,
1078 "unknown attribute `%s' in ATTR",
1082 else if (attr && attr->is_const && ! attr2->is_const)
1084 message_with_line (attr->lineno,
1085 "non-constant attribute `%s' referenced from `%s'",
1086 XSTR (exp, 0), attr->name);
1090 && (attr->is_numeric != attr2->is_numeric
1091 || (! attr->negative_ok && attr2->negative_ok)))
1093 message_with_line (attr->lineno,
1094 "numeric attribute mismatch calling `%s' from `%s'",
1095 XSTR (exp, 0), attr->name);
1102 /* A constant SYMBOL_REF is valid as a constant attribute test and
1103 is expanded later by make_canonical into a COND. In a non-constant
1104 attribute test, it is left be. */
1105 return attr_rtx (SYMBOL_REF, XSTR (exp, 0));
1108 message_with_line (attr ? attr->lineno : 0,
1109 "invalid operation `%s' for attribute value",
1110 GET_RTX_NAME (GET_CODE (exp)));
1118 /* Given an SET_ATTR_ALTERNATIVE expression, convert to the canonical SET.
1119 It becomes a COND with each test being (eq_attr "alternative "n") */
1122 convert_set_attr_alternative (rtx exp, struct insn_def *id)
1124 int num_alt = id->num_alternatives;
1128 if (XVECLEN (exp, 1) != num_alt)
1130 message_with_line (id->lineno,
1131 "bad number of entries in SET_ATTR_ALTERNATIVE");
1136 /* Make a COND with all tests but the last. Select the last value via the
1138 condexp = rtx_alloc (COND);
1139 XVEC (condexp, 0) = rtvec_alloc ((num_alt - 1) * 2);
1141 for (i = 0; i < num_alt - 1; i++)
1144 p = attr_numeral (i);
1146 XVECEXP (condexp, 0, 2 * i) = attr_eq (alternative_name, p);
1147 XVECEXP (condexp, 0, 2 * i + 1) = XVECEXP (exp, 1, i);
1150 XEXP (condexp, 1) = XVECEXP (exp, 1, i);
1152 return attr_rtx (SET, attr_rtx (ATTR, XSTR (exp, 0)), condexp);
1155 /* Given a SET_ATTR, convert to the appropriate SET. If a comma-separated
1156 list of values is given, convert to SET_ATTR_ALTERNATIVE first. */
1159 convert_set_attr (rtx exp, struct insn_def *id)
1162 const char *name_ptr;
1166 /* See how many alternative specified. */
1167 n = n_comma_elts (XSTR (exp, 1));
1169 return attr_rtx (SET,
1170 attr_rtx (ATTR, XSTR (exp, 0)),
1171 attr_rtx (CONST_STRING, XSTR (exp, 1)));
1173 newexp = rtx_alloc (SET_ATTR_ALTERNATIVE);
1174 XSTR (newexp, 0) = XSTR (exp, 0);
1175 XVEC (newexp, 1) = rtvec_alloc (n);
1177 /* Process each comma-separated name. */
1178 name_ptr = XSTR (exp, 1);
1180 while ((p = next_comma_elt (&name_ptr)) != NULL)
1181 XVECEXP (newexp, 1, n++) = attr_rtx (CONST_STRING, p);
1183 return convert_set_attr_alternative (newexp, id);
1186 /* Scan all definitions, checking for validity. Also, convert any SET_ATTR
1187 and SET_ATTR_ALTERNATIVE expressions to the corresponding SET
1193 struct insn_def *id;
1194 struct attr_desc *attr;
1198 for (id = defs; id; id = id->next)
1200 if (XVEC (id->def, id->vec_idx) == NULL)
1203 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1205 value = XVECEXP (id->def, id->vec_idx, i);
1206 switch (GET_CODE (value))
1209 if (GET_CODE (XEXP (value, 0)) != ATTR)
1211 message_with_line (id->lineno, "bad attribute set");
1217 case SET_ATTR_ALTERNATIVE:
1218 value = convert_set_attr_alternative (value, id);
1222 value = convert_set_attr (value, id);
1226 message_with_line (id->lineno, "invalid attribute code %s",
1227 GET_RTX_NAME (GET_CODE (value)));
1231 if (value == NULL_RTX)
1234 if ((attr = find_attr (&XSTR (XEXP (value, 0), 0), 0)) == NULL)
1236 message_with_line (id->lineno, "unknown attribute %s",
1237 XSTR (XEXP (value, 0), 0));
1242 XVECEXP (id->def, id->vec_idx, i) = value;
1243 XEXP (value, 1) = check_attr_value (XEXP (value, 1), attr);
1248 /* Given a valid expression for an attribute value, remove any IF_THEN_ELSE
1249 expressions by converting them into a COND. This removes cases from this
1250 program. Also, replace an attribute value of "*" with the default attribute
1254 make_canonical (struct attr_desc *attr, rtx exp)
1259 switch (GET_CODE (exp))
1262 exp = make_numeric_value (INTVAL (exp));
1266 if (! strcmp (XSTR (exp, 0), "*"))
1268 if (attr == 0 || attr->default_val == 0)
1269 fatal ("(attr_value \"*\") used in invalid context");
1270 exp = attr->default_val->value;
1273 XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1278 if (!attr->is_const || ATTR_IND_SIMPLIFIED_P (exp))
1280 /* The SYMBOL_REF is constant for a given run, so mark it as unchanging.
1281 This makes the COND something that won't be considered an arbitrary
1282 expression by walk_attr_value. */
1283 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1284 exp = check_attr_value (exp, attr);
1288 newexp = rtx_alloc (COND);
1289 XVEC (newexp, 0) = rtvec_alloc (2);
1290 XVECEXP (newexp, 0, 0) = XEXP (exp, 0);
1291 XVECEXP (newexp, 0, 1) = XEXP (exp, 1);
1293 XEXP (newexp, 1) = XEXP (exp, 2);
1296 /* Fall through to COND case since this is now a COND. */
1303 /* First, check for degenerate COND. */
1304 if (XVECLEN (exp, 0) == 0)
1305 return make_canonical (attr, XEXP (exp, 1));
1306 defval = XEXP (exp, 1) = make_canonical (attr, XEXP (exp, 1));
1308 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1310 XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
1311 XVECEXP (exp, 0, i + 1)
1312 = make_canonical (attr, XVECEXP (exp, 0, i + 1));
1313 if (! rtx_equal_p (XVECEXP (exp, 0, i + 1), defval))
1329 copy_boolean (rtx exp)
1331 if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
1332 return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
1333 copy_boolean (XEXP (exp, 1)));
1334 if (GET_CODE (exp) == MATCH_OPERAND)
1336 XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1337 XSTR (exp, 2) = DEF_ATTR_STRING (XSTR (exp, 2));
1339 else if (GET_CODE (exp) == EQ_ATTR)
1341 XSTR (exp, 0) = DEF_ATTR_STRING (XSTR (exp, 0));
1342 XSTR (exp, 1) = DEF_ATTR_STRING (XSTR (exp, 1));
1348 /* Given a value and an attribute description, return a `struct attr_value *'
1349 that represents that value. This is either an existing structure, if the
1350 value has been previously encountered, or a newly-created structure.
1352 `insn_code' is the code of an insn whose attribute has the specified
1353 value (-2 if not processing an insn). We ensure that all insns for
1354 a given value have the same number of alternatives if the value checks
1357 static struct attr_value *
1358 get_attr_value (rtx value, struct attr_desc *attr, int insn_code)
1360 struct attr_value *av;
1363 value = make_canonical (attr, value);
1364 if (compares_alternatives_p (value))
1366 if (insn_code < 0 || insn_alternatives == NULL)
1367 fatal ("(eq_attr \"alternatives\" ...) used in non-insn context");
1369 num_alt = insn_alternatives[insn_code];
1372 for (av = attr->first_value; av; av = av->next)
1373 if (rtx_equal_p (value, av->value)
1374 && (num_alt == 0 || av->first_insn == NULL
1375 || insn_alternatives[av->first_insn->def->insn_code]))
1378 av = oballoc (sizeof (struct attr_value));
1380 av->next = attr->first_value;
1381 attr->first_value = av;
1382 av->first_insn = NULL;
1384 av->has_asm_insn = 0;
1389 /* After all DEFINE_DELAYs have been read in, create internal attributes
1390 to generate the required routines.
1392 First, we compute the number of delay slots for each insn (as a COND of
1393 each of the test expressions in DEFINE_DELAYs). Then, if more than one
1394 delay type is specified, we compute a similar function giving the
1395 DEFINE_DELAY ordinal for each insn.
1397 Finally, for each [DEFINE_DELAY, slot #] pair, we compute an attribute that
1398 tells whether a given insn can be in that delay slot.
1400 Normal attribute filling and optimization expands these to contain the
1401 information needed to handle delay slots. */
1404 expand_delays (void)
1406 struct delay_desc *delay;
1412 /* First, generate data for `num_delay_slots' function. */
1414 condexp = rtx_alloc (COND);
1415 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1416 XEXP (condexp, 1) = make_numeric_value (0);
1418 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1420 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1421 XVECEXP (condexp, 0, i + 1)
1422 = make_numeric_value (XVECLEN (delay->def, 1) / 3);
1425 make_internal_attr (num_delay_slots_str, condexp, ATTR_NONE);
1427 /* If more than one delay type, do the same for computing the delay type. */
1430 condexp = rtx_alloc (COND);
1431 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1432 XEXP (condexp, 1) = make_numeric_value (0);
1434 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1436 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1437 XVECEXP (condexp, 0, i + 1) = make_numeric_value (delay->num);
1440 make_internal_attr (delay_type_str, condexp, ATTR_SPECIAL);
1443 /* For each delay possibility and delay slot, compute an eligibility
1444 attribute for non-annulled insns and for each type of annulled (annul
1445 if true and annul if false). */
1446 for (delay = delays; delay; delay = delay->next)
1448 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
1450 condexp = XVECEXP (delay->def, 1, i);
1452 condexp = false_rtx;
1453 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1454 make_numeric_value (1), make_numeric_value (0));
1456 p = attr_printf (sizeof "*delay__" + MAX_DIGITS * 2,
1457 "*delay_%d_%d", delay->num, i / 3);
1458 make_internal_attr (p, newexp, ATTR_SPECIAL);
1460 if (have_annul_true)
1462 condexp = XVECEXP (delay->def, 1, i + 1);
1463 if (condexp == 0) condexp = false_rtx;
1464 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1465 make_numeric_value (1),
1466 make_numeric_value (0));
1467 p = attr_printf (sizeof "*annul_true__" + MAX_DIGITS * 2,
1468 "*annul_true_%d_%d", delay->num, i / 3);
1469 make_internal_attr (p, newexp, ATTR_SPECIAL);
1472 if (have_annul_false)
1474 condexp = XVECEXP (delay->def, 1, i + 2);
1475 if (condexp == 0) condexp = false_rtx;
1476 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1477 make_numeric_value (1),
1478 make_numeric_value (0));
1479 p = attr_printf (sizeof "*annul_false__" + MAX_DIGITS * 2,
1480 "*annul_false_%d_%d", delay->num, i / 3);
1481 make_internal_attr (p, newexp, ATTR_SPECIAL);
1487 /* Once all attributes and insns have been read and checked, we construct for
1488 each attribute value a list of all the insns that have that value for
1492 fill_attr (struct attr_desc *attr)
1494 struct attr_value *av;
1495 struct insn_ent *ie;
1496 struct insn_def *id;
1500 /* Don't fill constant attributes. The value is independent of
1501 any particular insn. */
1505 for (id = defs; id; id = id->next)
1507 /* If no value is specified for this insn for this attribute, use the
1510 if (XVEC (id->def, id->vec_idx))
1511 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1512 if (! strcmp_check (XSTR (XEXP (XVECEXP (id->def, id->vec_idx, i), 0), 0),
1514 value = XEXP (XVECEXP (id->def, id->vec_idx, i), 1);
1517 av = attr->default_val;
1519 av = get_attr_value (value, attr, id->insn_code);
1521 ie = oballoc (sizeof (struct insn_ent));
1523 insert_insn_ent (av, ie);
1527 /* Given an expression EXP, see if it is a COND or IF_THEN_ELSE that has a
1528 test that checks relative positions of insns (uses MATCH_DUP or PC).
1529 If so, replace it with what is obtained by passing the expression to
1530 ADDRESS_FN. If not but it is a COND or IF_THEN_ELSE, call this routine
1531 recursively on each value (including the default value). Otherwise,
1532 return the value returned by NO_ADDRESS_FN applied to EXP. */
1535 substitute_address (rtx exp, rtx (*no_address_fn) (rtx),
1536 rtx (*address_fn) (rtx))
1541 if (GET_CODE (exp) == COND)
1543 /* See if any tests use addresses. */
1545 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1546 walk_attr_value (XVECEXP (exp, 0, i));
1549 return (*address_fn) (exp);
1551 /* Make a new copy of this COND, replacing each element. */
1552 newexp = rtx_alloc (COND);
1553 XVEC (newexp, 0) = rtvec_alloc (XVECLEN (exp, 0));
1554 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1556 XVECEXP (newexp, 0, i) = XVECEXP (exp, 0, i);
1557 XVECEXP (newexp, 0, i + 1)
1558 = substitute_address (XVECEXP (exp, 0, i + 1),
1559 no_address_fn, address_fn);
1562 XEXP (newexp, 1) = substitute_address (XEXP (exp, 1),
1563 no_address_fn, address_fn);
1568 else if (GET_CODE (exp) == IF_THEN_ELSE)
1571 walk_attr_value (XEXP (exp, 0));
1573 return (*address_fn) (exp);
1575 return attr_rtx (IF_THEN_ELSE,
1576 substitute_address (XEXP (exp, 0),
1577 no_address_fn, address_fn),
1578 substitute_address (XEXP (exp, 1),
1579 no_address_fn, address_fn),
1580 substitute_address (XEXP (exp, 2),
1581 no_address_fn, address_fn));
1584 return (*no_address_fn) (exp);
1587 /* Make new attributes from the `length' attribute. The following are made,
1588 each corresponding to a function called from `shorten_branches' or
1591 *insn_default_length This is the length of the insn to be returned
1592 by `get_attr_length' before `shorten_branches'
1593 has been called. In each case where the length
1594 depends on relative addresses, the largest
1595 possible is used. This routine is also used
1596 to compute the initial size of the insn.
1598 *insn_variable_length_p This returns 1 if the insn's length depends
1599 on relative addresses, zero otherwise.
1601 *insn_current_length This is only called when it is known that the
1602 insn has a variable length and returns the
1603 current length, based on relative addresses.
1607 make_length_attrs (void)
1609 static const char *new_names[] =
1611 "*insn_default_length",
1612 "*insn_variable_length_p",
1613 "*insn_current_length"
1615 static rtx (*const no_address_fn[]) (rtx) = {identity_fn, zero_fn, zero_fn};
1616 static rtx (*const address_fn[]) (rtx) = {max_fn, one_fn, identity_fn};
1618 struct attr_desc *length_attr, *new_attr;
1619 struct attr_value *av, *new_av;
1620 struct insn_ent *ie, *new_ie;
1622 /* See if length attribute is defined. If so, it must be numeric. Make
1623 it special so we don't output anything for it. */
1624 length_attr = find_attr (&length_str, 0);
1625 if (length_attr == 0)
1628 if (! length_attr->is_numeric)
1629 fatal ("length attribute must be numeric");
1631 length_attr->is_const = 0;
1632 length_attr->is_special = 1;
1634 /* Make each new attribute, in turn. */
1635 for (i = 0; i < ARRAY_SIZE (new_names); i++)
1637 make_internal_attr (new_names[i],
1638 substitute_address (length_attr->default_val->value,
1639 no_address_fn[i], address_fn[i]),
1641 new_attr = find_attr (&new_names[i], 0);
1642 for (av = length_attr->first_value; av; av = av->next)
1643 for (ie = av->first_insn; ie; ie = ie->next)
1645 new_av = get_attr_value (substitute_address (av->value,
1648 new_attr, ie->def->insn_code);
1649 new_ie = oballoc (sizeof (struct insn_ent));
1650 new_ie->def = ie->def;
1651 insert_insn_ent (new_av, new_ie);
1656 /* Utility functions called from above routine. */
1659 identity_fn (rtx exp)
1665 zero_fn (rtx exp ATTRIBUTE_UNUSED)
1667 return make_numeric_value (0);
1671 one_fn (rtx exp ATTRIBUTE_UNUSED)
1673 return make_numeric_value (1);
1680 return make_numeric_value (max_attr_value (exp, &unknown));
1684 write_length_unit_log (void)
1686 struct attr_desc *length_attr = find_attr (&length_str, 0);
1687 struct attr_value *av;
1688 struct insn_ent *ie;
1689 unsigned int length_unit_log, length_or;
1692 if (length_attr == 0)
1694 length_or = or_attr_value (length_attr->default_val->value, &unknown);
1695 for (av = length_attr->first_value; av; av = av->next)
1696 for (ie = av->first_insn; ie; ie = ie->next)
1697 length_or |= or_attr_value (av->value, &unknown);
1700 length_unit_log = 0;
1703 length_or = ~length_or;
1704 for (length_unit_log = 0; length_or & 1; length_or >>= 1)
1707 printf ("int length_unit_log = %u;\n", length_unit_log);
1710 /* Take a COND expression and see if any of the conditions in it can be
1711 simplified. If any are known true or known false for the particular insn
1712 code, the COND can be further simplified.
1714 Also call ourselves on any COND operations that are values of this COND.
1716 We do not modify EXP; rather, we make and return a new rtx. */
1719 simplify_cond (rtx exp, int insn_code, int insn_index)
1722 /* We store the desired contents here,
1723 then build a new expression if they don't match EXP. */
1724 rtx defval = XEXP (exp, 1);
1725 rtx new_defval = XEXP (exp, 1);
1726 int len = XVECLEN (exp, 0);
1727 rtx *tests = xmalloc (len * sizeof (rtx));
1731 /* This lets us free all storage allocated below, if appropriate. */
1732 obstack_finish (rtl_obstack);
1734 memcpy (tests, XVEC (exp, 0)->elem, len * sizeof (rtx));
1736 /* See if default value needs simplification. */
1737 if (GET_CODE (defval) == COND)
1738 new_defval = simplify_cond (defval, insn_code, insn_index);
1740 /* Simplify the subexpressions, and see what tests we can get rid of. */
1742 for (i = 0; i < len; i += 2)
1744 rtx newtest, newval;
1746 /* Simplify this test. */
1747 newtest = simplify_test_exp_in_temp (tests[i], insn_code, insn_index);
1750 newval = tests[i + 1];
1751 /* See if this value may need simplification. */
1752 if (GET_CODE (newval) == COND)
1753 newval = simplify_cond (newval, insn_code, insn_index);
1755 /* Look for ways to delete or combine this test. */
1756 if (newtest == true_rtx)
1758 /* If test is true, make this value the default
1759 and discard this + any following tests. */
1761 defval = tests[i + 1];
1762 new_defval = newval;
1765 else if (newtest == false_rtx)
1767 /* If test is false, discard it and its value. */
1768 for (j = i; j < len - 2; j++)
1769 tests[j] = tests[j + 2];
1774 else if (i > 0 && attr_equal_p (newval, tests[i - 1]))
1776 /* If this value and the value for the prev test are the same,
1780 = insert_right_side (IOR, tests[i - 2], newtest,
1781 insn_code, insn_index);
1783 /* Delete this test/value. */
1784 for (j = i; j < len - 2; j++)
1785 tests[j] = tests[j + 2];
1791 tests[i + 1] = newval;
1794 /* If the last test in a COND has the same value
1795 as the default value, that test isn't needed. */
1797 while (len > 0 && attr_equal_p (tests[len - 1], new_defval))
1800 /* See if we changed anything. */
1801 if (len != XVECLEN (exp, 0) || new_defval != XEXP (exp, 1))
1804 for (i = 0; i < len; i++)
1805 if (! attr_equal_p (tests[i], XVECEXP (exp, 0, i)))
1813 if (GET_CODE (defval) == COND)
1814 ret = simplify_cond (defval, insn_code, insn_index);
1822 rtx newexp = rtx_alloc (COND);
1824 XVEC (newexp, 0) = rtvec_alloc (len);
1825 memcpy (XVEC (newexp, 0)->elem, tests, len * sizeof (rtx));
1826 XEXP (newexp, 1) = new_defval;
1833 /* Remove an insn entry from an attribute value. */
1836 remove_insn_ent (struct attr_value *av, struct insn_ent *ie)
1838 struct insn_ent *previe;
1840 if (av->first_insn == ie)
1841 av->first_insn = ie->next;
1844 for (previe = av->first_insn; previe->next != ie; previe = previe->next)
1846 previe->next = ie->next;
1850 if (ie->def->insn_code == -1)
1851 av->has_asm_insn = 0;
1856 /* Insert an insn entry in an attribute value list. */
1859 insert_insn_ent (struct attr_value *av, struct insn_ent *ie)
1861 ie->next = av->first_insn;
1862 av->first_insn = ie;
1864 if (ie->def->insn_code == -1)
1865 av->has_asm_insn = 1;
1870 /* This is a utility routine to take an expression that is a tree of either
1871 AND or IOR expressions and insert a new term. The new term will be
1872 inserted at the right side of the first node whose code does not match
1873 the root. A new node will be created with the root's code. Its left
1874 side will be the old right side and its right side will be the new
1877 If the `term' is itself a tree, all its leaves will be inserted. */
1880 insert_right_side (enum rtx_code code, rtx exp, rtx term, int insn_code, int insn_index)
1884 /* Avoid consing in some special cases. */
1885 if (code == AND && term == true_rtx)
1887 if (code == AND && term == false_rtx)
1889 if (code == AND && exp == true_rtx)
1891 if (code == AND && exp == false_rtx)
1893 if (code == IOR && term == true_rtx)
1895 if (code == IOR && term == false_rtx)
1897 if (code == IOR && exp == true_rtx)
1899 if (code == IOR && exp == false_rtx)
1901 if (attr_equal_p (exp, term))
1904 if (GET_CODE (term) == code)
1906 exp = insert_right_side (code, exp, XEXP (term, 0),
1907 insn_code, insn_index);
1908 exp = insert_right_side (code, exp, XEXP (term, 1),
1909 insn_code, insn_index);
1914 if (GET_CODE (exp) == code)
1916 rtx new = insert_right_side (code, XEXP (exp, 1),
1917 term, insn_code, insn_index);
1918 if (new != XEXP (exp, 1))
1919 /* Make a copy of this expression and call recursively. */
1920 newexp = attr_rtx (code, XEXP (exp, 0), new);
1926 /* Insert the new term. */
1927 newexp = attr_rtx (code, exp, term);
1930 return simplify_test_exp_in_temp (newexp, insn_code, insn_index);
1933 /* If we have an expression which AND's a bunch of
1934 (not (eq_attrq "alternative" "n"))
1935 terms, we may have covered all or all but one of the possible alternatives.
1936 If so, we can optimize. Similarly for IOR's of EQ_ATTR.
1938 This routine is passed an expression and either AND or IOR. It returns a
1939 bitmask indicating which alternatives are mentioned within EXP. */
1942 compute_alternative_mask (rtx exp, enum rtx_code code)
1945 if (GET_CODE (exp) == code)
1946 return compute_alternative_mask (XEXP (exp, 0), code)
1947 | compute_alternative_mask (XEXP (exp, 1), code);
1949 else if (code == AND && GET_CODE (exp) == NOT
1950 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
1951 && XSTR (XEXP (exp, 0), 0) == alternative_name)
1952 string = XSTR (XEXP (exp, 0), 1);
1954 else if (code == IOR && GET_CODE (exp) == EQ_ATTR
1955 && XSTR (exp, 0) == alternative_name)
1956 string = XSTR (exp, 1);
1958 else if (GET_CODE (exp) == EQ_ATTR_ALT)
1960 if (code == AND && XINT (exp, 1))
1961 return XINT (exp, 0);
1963 if (code == IOR && !XINT (exp, 1))
1964 return XINT (exp, 0);
1972 return 1 << (string[0] - '0');
1973 return 1 << atoi (string);
1976 /* Given I, a single-bit mask, return RTX to compare the `alternative'
1977 attribute with the value represented by that bit. */
1980 make_alternative_compare (int mask)
1982 return mk_attr_alt (mask);
1985 /* If we are processing an (eq_attr "attr" "value") test, we find the value
1986 of "attr" for this insn code. From that value, we can compute a test
1987 showing when the EQ_ATTR will be true. This routine performs that
1988 computation. If a test condition involves an address, we leave the EQ_ATTR
1989 intact because addresses are only valid for the `length' attribute.
1991 EXP is the EQ_ATTR expression and VALUE is the value of that attribute
1992 for the insn corresponding to INSN_CODE and INSN_INDEX. */
1995 evaluate_eq_attr (rtx exp, rtx value, int insn_code, int insn_index)
2002 switch (GET_CODE (value))
2005 if (! strcmp_check (XSTR (value, 0), XSTR (exp, 1)))
2016 gcc_assert (GET_CODE (exp) == EQ_ATTR);
2017 gcc_assert (strlen (XSTR (exp, 0)) + strlen (XSTR (exp, 1)) + 2
2020 strcpy (string, XSTR (exp, 0));
2021 strcat (string, "_");
2022 strcat (string, XSTR (exp, 1));
2023 for (p = string; *p; p++)
2026 newexp = attr_rtx (EQ, value,
2027 attr_rtx (SYMBOL_REF,
2028 DEF_ATTR_STRING (string)));
2033 /* We construct an IOR of all the cases for which the
2034 requested attribute value is present. Since we start with
2035 FALSE, if it is not present, FALSE will be returned.
2037 Each case is the AND of the NOT's of the previous conditions with the
2038 current condition; in the default case the current condition is TRUE.
2040 For each possible COND value, call ourselves recursively.
2042 The extra TRUE and FALSE expressions will be eliminated by another
2043 call to the simplification routine. */
2048 if (current_alternative_string)
2049 clear_struct_flag (value);
2051 for (i = 0; i < XVECLEN (value, 0); i += 2)
2053 rtx this = simplify_test_exp_in_temp (XVECEXP (value, 0, i),
2054 insn_code, insn_index);
2056 SIMPLIFY_ALTERNATIVE (this);
2058 right = insert_right_side (AND, andexp, this,
2059 insn_code, insn_index);
2060 right = insert_right_side (AND, right,
2061 evaluate_eq_attr (exp,
2064 insn_code, insn_index),
2065 insn_code, insn_index);
2066 orexp = insert_right_side (IOR, orexp, right,
2067 insn_code, insn_index);
2069 /* Add this condition into the AND expression. */
2070 newexp = attr_rtx (NOT, this);
2071 andexp = insert_right_side (AND, andexp, newexp,
2072 insn_code, insn_index);
2075 /* Handle the default case. */
2076 right = insert_right_side (AND, andexp,
2077 evaluate_eq_attr (exp, XEXP (value, 1),
2078 insn_code, insn_index),
2079 insn_code, insn_index);
2080 newexp = insert_right_side (IOR, orexp, right, insn_code, insn_index);
2087 /* If uses an address, must return original expression. But set the
2088 ATTR_IND_SIMPLIFIED_P bit so we don't try to simplify it again. */
2091 walk_attr_value (newexp);
2095 /* This had `&& current_alternative_string', which seems to be wrong. */
2096 if (! ATTR_IND_SIMPLIFIED_P (exp))
2097 return copy_rtx_unchanging (exp);
2104 /* This routine is called when an AND of a term with a tree of AND's is
2105 encountered. If the term or its complement is present in the tree, it
2106 can be replaced with TRUE or FALSE, respectively.
2108 Note that (eq_attr "att" "v1") and (eq_attr "att" "v2") cannot both
2109 be true and hence are complementary.
2111 There is one special case: If we see
2112 (and (not (eq_attr "att" "v1"))
2113 (eq_attr "att" "v2"))
2114 this can be replaced by (eq_attr "att" "v2"). To do this we need to
2115 replace the term, not anything in the AND tree. So we pass a pointer to
2119 simplify_and_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2124 int left_eliminates_term, right_eliminates_term;
2126 if (GET_CODE (exp) == AND)
2128 left = simplify_and_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2129 right = simplify_and_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2130 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2132 newexp = attr_rtx (AND, left, right);
2134 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2138 else if (GET_CODE (exp) == IOR)
2140 /* For the IOR case, we do the same as above, except that we can
2141 only eliminate `term' if both sides of the IOR would do so. */
2143 left = simplify_and_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2144 left_eliminates_term = (temp == true_rtx);
2147 right = simplify_and_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2148 right_eliminates_term = (temp == true_rtx);
2150 if (left_eliminates_term && right_eliminates_term)
2153 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2155 newexp = attr_rtx (IOR, left, right);
2157 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2161 /* Check for simplifications. Do some extra checking here since this
2162 routine is called so many times. */
2167 else if (GET_CODE (exp) == NOT && XEXP (exp, 0) == *pterm)
2170 else if (GET_CODE (*pterm) == NOT && exp == XEXP (*pterm, 0))
2173 else if (GET_CODE (exp) == EQ_ATTR_ALT && GET_CODE (*pterm) == EQ_ATTR_ALT)
2175 if (attr_alt_subset_p (*pterm, exp))
2178 if (attr_alt_subset_of_compl_p (*pterm, exp))
2181 if (attr_alt_subset_p (exp, *pterm))
2187 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == EQ_ATTR)
2189 if (XSTR (exp, 0) != XSTR (*pterm, 0))
2192 if (! strcmp_check (XSTR (exp, 1), XSTR (*pterm, 1)))
2198 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2199 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
2201 if (XSTR (*pterm, 0) != XSTR (XEXP (exp, 0), 0))
2204 if (! strcmp_check (XSTR (*pterm, 1), XSTR (XEXP (exp, 0), 1)))
2210 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2211 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR)
2213 if (XSTR (exp, 0) != XSTR (XEXP (*pterm, 0), 0))
2216 if (! strcmp_check (XSTR (exp, 1), XSTR (XEXP (*pterm, 0), 1)))
2222 else if (GET_CODE (exp) == NOT && GET_CODE (*pterm) == NOT)
2224 if (attr_equal_p (XEXP (exp, 0), XEXP (*pterm, 0)))
2228 else if (GET_CODE (exp) == NOT)
2230 if (attr_equal_p (XEXP (exp, 0), *pterm))
2234 else if (GET_CODE (*pterm) == NOT)
2236 if (attr_equal_p (XEXP (*pterm, 0), exp))
2240 else if (attr_equal_p (exp, *pterm))
2246 /* Similar to `simplify_and_tree', but for IOR trees. */
2249 simplify_or_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2254 int left_eliminates_term, right_eliminates_term;
2256 if (GET_CODE (exp) == IOR)
2258 left = simplify_or_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2259 right = simplify_or_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2260 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2262 newexp = attr_rtx (GET_CODE (exp), left, right);
2264 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2268 else if (GET_CODE (exp) == AND)
2270 /* For the AND case, we do the same as above, except that we can
2271 only eliminate `term' if both sides of the AND would do so. */
2273 left = simplify_or_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2274 left_eliminates_term = (temp == false_rtx);
2277 right = simplify_or_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2278 right_eliminates_term = (temp == false_rtx);
2280 if (left_eliminates_term && right_eliminates_term)
2283 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2285 newexp = attr_rtx (GET_CODE (exp), left, right);
2287 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2291 if (attr_equal_p (exp, *pterm))
2294 else if (GET_CODE (exp) == NOT && attr_equal_p (XEXP (exp, 0), *pterm))
2297 else if (GET_CODE (*pterm) == NOT && attr_equal_p (XEXP (*pterm, 0), exp))
2300 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2301 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
2302 && XSTR (*pterm, 0) == XSTR (XEXP (exp, 0), 0))
2305 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2306 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR
2307 && XSTR (exp, 0) == XSTR (XEXP (*pterm, 0), 0))
2313 /* Compute approximate cost of the expression. Used to decide whether
2314 expression is cheap enough for inline. */
2316 attr_rtx_cost (rtx x)
2322 code = GET_CODE (x);
2335 /* Alternatives don't result into function call. */
2336 if (!strcmp_check (XSTR (x, 0), alternative_name))
2343 const char *fmt = GET_RTX_FORMAT (code);
2344 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2350 for (j = 0; j < XVECLEN (x, i); j++)
2351 cost += attr_rtx_cost (XVECEXP (x, i, j));
2354 cost += attr_rtx_cost (XEXP (x, i));
2364 /* Simplify test expression and use temporary obstack in order to avoid
2365 memory bloat. Use ATTR_IND_SIMPLIFIED to avoid unnecessary simplifications
2366 and avoid unnecessary copying if possible. */
2369 simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
2372 struct obstack *old;
2373 if (ATTR_IND_SIMPLIFIED_P (exp))
2376 rtl_obstack = temp_obstack;
2377 x = simplify_test_exp (exp, insn_code, insn_index);
2379 if (x == exp || rtl_obstack == temp_obstack)
2381 return attr_copy_rtx (x);
2384 /* Returns true if S1 is a subset of S2. */
2387 attr_alt_subset_p (rtx s1, rtx s2)
2389 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2392 return !(XINT (s1, 0) &~ XINT (s2, 0));
2395 return !(XINT (s1, 0) & XINT (s2, 0));
2401 return !(XINT (s2, 0) &~ XINT (s1, 0));
2408 /* Returns true if S1 is a subset of complement of S2. */
2411 attr_alt_subset_of_compl_p (rtx s1, rtx s2)
2413 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2416 return !(XINT (s1, 0) & XINT (s2, 0));
2419 return !(XINT (s1, 0) & ~XINT (s2, 0));
2422 return !(XINT (s2, 0) &~ XINT (s1, 0));
2432 /* Return EQ_ATTR_ALT expression representing intersection of S1 and S2. */
2435 attr_alt_intersection (rtx s1, rtx s2)
2437 rtx result = rtx_alloc (EQ_ATTR_ALT);
2439 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2442 XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2445 XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2448 XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2451 XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2456 XINT (result, 1) = XINT (s1, 1) & XINT (s2, 1);
2461 /* Return EQ_ATTR_ALT expression representing union of S1 and S2. */
2464 attr_alt_union (rtx s1, rtx s2)
2466 rtx result = rtx_alloc (EQ_ATTR_ALT);
2468 switch ((XINT (s1, 1) << 1) | XINT (s2, 1))
2471 XINT (result, 0) = XINT (s1, 0) | XINT (s2, 0);
2474 XINT (result, 0) = XINT (s2, 0) & ~XINT (s1, 0);
2477 XINT (result, 0) = XINT (s1, 0) & ~XINT (s2, 0);
2480 XINT (result, 0) = XINT (s1, 0) & XINT (s2, 0);
2486 XINT (result, 1) = XINT (s1, 1) | XINT (s2, 1);
2490 /* Return EQ_ATTR_ALT expression representing complement of S. */
2493 attr_alt_complement (rtx s)
2495 rtx result = rtx_alloc (EQ_ATTR_ALT);
2497 XINT (result, 0) = XINT (s, 0);
2498 XINT (result, 1) = 1 - XINT (s, 1);
2503 /* Tests whether a bit B belongs to the set represented by S. */
2506 attr_alt_bit_p (rtx s, int b)
2508 return XINT (s, 1) ^ ((XINT (s, 0) >> b) & 1);
2511 /* Return EQ_ATTR_ALT expression representing set containing elements set
2517 rtx result = rtx_alloc (EQ_ATTR_ALT);
2519 XINT (result, 0) = e;
2520 XINT (result, 1) = 0;
2525 /* Given an expression, see if it can be simplified for a particular insn
2526 code based on the values of other attributes being tested. This can
2527 eliminate nested get_attr_... calls.
2529 Note that if an endless recursion is specified in the patterns, the
2530 optimization will loop. However, it will do so in precisely the cases where
2531 an infinite recursion loop could occur during compilation. It's better that
2535 simplify_test_exp (rtx exp, int insn_code, int insn_index)
2538 struct attr_desc *attr;
2539 struct attr_value *av;
2540 struct insn_ent *ie;
2543 bool left_alt, right_alt;
2545 /* Don't re-simplify something we already simplified. */
2546 if (ATTR_IND_SIMPLIFIED_P (exp) || ATTR_CURR_SIMPLIFIED_P (exp))
2549 switch (GET_CODE (exp))
2552 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2553 SIMPLIFY_ALTERNATIVE (left);
2554 if (left == false_rtx)
2556 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2557 SIMPLIFY_ALTERNATIVE (right);
2558 if (left == false_rtx)
2561 if (GET_CODE (left) == EQ_ATTR_ALT
2562 && GET_CODE (right) == EQ_ATTR_ALT)
2564 exp = attr_alt_intersection (left, right);
2565 return simplify_test_exp (exp, insn_code, insn_index);
2568 /* If either side is an IOR and we have (eq_attr "alternative" ..")
2569 present on both sides, apply the distributive law since this will
2570 yield simplifications. */
2571 if ((GET_CODE (left) == IOR || GET_CODE (right) == IOR)
2572 && compute_alternative_mask (left, IOR)
2573 && compute_alternative_mask (right, IOR))
2575 if (GET_CODE (left) == IOR)
2582 newexp = attr_rtx (IOR,
2583 attr_rtx (AND, left, XEXP (right, 0)),
2584 attr_rtx (AND, left, XEXP (right, 1)));
2586 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2589 /* Try with the term on both sides. */
2590 right = simplify_and_tree (right, &left, insn_code, insn_index);
2591 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2592 left = simplify_and_tree (left, &right, insn_code, insn_index);
2594 if (left == false_rtx || right == false_rtx)
2596 else if (left == true_rtx)
2600 else if (right == true_rtx)
2604 /* See if all or all but one of the insn's alternatives are specified
2605 in this tree. Optimize if so. */
2607 if (GET_CODE (left) == NOT)
2608 left_alt = (GET_CODE (XEXP (left, 0)) == EQ_ATTR
2609 && XSTR (XEXP (left, 0), 0) == alternative_name);
2611 left_alt = (GET_CODE (left) == EQ_ATTR_ALT
2614 if (GET_CODE (right) == NOT)
2615 right_alt = (GET_CODE (XEXP (right, 0)) == EQ_ATTR
2616 && XSTR (XEXP (right, 0), 0) == alternative_name);
2618 right_alt = (GET_CODE (right) == EQ_ATTR_ALT
2619 && XINT (right, 1));
2622 && (GET_CODE (left) == AND
2624 || GET_CODE (right) == AND
2627 i = compute_alternative_mask (exp, AND);
2628 if (i & ~insn_alternatives[insn_code])
2629 fatal ("invalid alternative specified for pattern number %d",
2632 /* If all alternatives are excluded, this is false. */
2633 i ^= insn_alternatives[insn_code];
2636 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2638 /* If just one excluded, AND a comparison with that one to the
2639 front of the tree. The others will be eliminated by
2640 optimization. We do not want to do this if the insn has one
2641 alternative and we have tested none of them! */
2642 left = make_alternative_compare (i);
2643 right = simplify_and_tree (exp, &left, insn_code, insn_index);
2644 newexp = attr_rtx (AND, left, right);
2646 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2650 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2652 newexp = attr_rtx (AND, left, right);
2653 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2658 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2659 SIMPLIFY_ALTERNATIVE (left);
2660 if (left == true_rtx)
2662 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
2663 SIMPLIFY_ALTERNATIVE (right);
2664 if (right == true_rtx)
2667 if (GET_CODE (left) == EQ_ATTR_ALT
2668 && GET_CODE (right) == EQ_ATTR_ALT)
2670 exp = attr_alt_union (left, right);
2671 return simplify_test_exp (exp, insn_code, insn_index);
2674 right = simplify_or_tree (right, &left, insn_code, insn_index);
2675 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
2676 left = simplify_or_tree (left, &right, insn_code, insn_index);
2678 if (right == true_rtx || left == true_rtx)
2680 else if (left == false_rtx)
2684 else if (right == false_rtx)
2689 /* Test for simple cases where the distributive law is useful. I.e.,
2690 convert (ior (and (x) (y))
2696 else if (GET_CODE (left) == AND && GET_CODE (right) == AND
2697 && attr_equal_p (XEXP (left, 0), XEXP (right, 0)))
2699 newexp = attr_rtx (IOR, XEXP (left, 1), XEXP (right, 1));
2701 left = XEXP (left, 0);
2703 newexp = attr_rtx (AND, left, right);
2704 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2707 /* See if all or all but one of the insn's alternatives are specified
2708 in this tree. Optimize if so. */
2710 else if (insn_code >= 0
2711 && (GET_CODE (left) == IOR
2712 || (GET_CODE (left) == EQ_ATTR_ALT
2714 || (GET_CODE (left) == EQ_ATTR
2715 && XSTR (left, 0) == alternative_name)
2716 || GET_CODE (right) == IOR
2717 || (GET_CODE (right) == EQ_ATTR_ALT
2718 && !XINT (right, 1))
2719 || (GET_CODE (right) == EQ_ATTR
2720 && XSTR (right, 0) == alternative_name)))
2722 i = compute_alternative_mask (exp, IOR);
2723 if (i & ~insn_alternatives[insn_code])
2724 fatal ("invalid alternative specified for pattern number %d",
2727 /* If all alternatives are included, this is true. */
2728 i ^= insn_alternatives[insn_code];
2731 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
2733 /* If just one excluded, IOR a comparison with that one to the
2734 front of the tree. The others will be eliminated by
2735 optimization. We do not want to do this if the insn has one
2736 alternative and we have tested none of them! */
2737 left = make_alternative_compare (i);
2738 right = simplify_and_tree (exp, &left, insn_code, insn_index);
2739 newexp = attr_rtx (IOR, attr_rtx (NOT, left), right);
2741 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2745 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2747 newexp = attr_rtx (IOR, left, right);
2748 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2753 if (GET_CODE (XEXP (exp, 0)) == NOT)
2755 left = SIMPLIFY_TEST_EXP (XEXP (XEXP (exp, 0), 0),
2756 insn_code, insn_index);
2757 SIMPLIFY_ALTERNATIVE (left);
2761 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
2762 SIMPLIFY_ALTERNATIVE (left);
2763 if (GET_CODE (left) == NOT)
2764 return XEXP (left, 0);
2766 if (left == false_rtx)
2768 if (left == true_rtx)
2771 if (GET_CODE (left) == EQ_ATTR_ALT)
2773 exp = attr_alt_complement (left);
2774 return simplify_test_exp (exp, insn_code, insn_index);
2777 /* Try to apply De`Morgan's laws. */
2778 if (GET_CODE (left) == IOR)
2780 newexp = attr_rtx (AND,
2781 attr_rtx (NOT, XEXP (left, 0)),
2782 attr_rtx (NOT, XEXP (left, 1)));
2784 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2786 else if (GET_CODE (left) == AND)
2788 newexp = attr_rtx (IOR,
2789 attr_rtx (NOT, XEXP (left, 0)),
2790 attr_rtx (NOT, XEXP (left, 1)));
2792 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
2794 else if (left != XEXP (exp, 0))
2796 newexp = attr_rtx (NOT, left);
2801 if (current_alternative_string)
2802 return attr_alt_bit_p (exp, atoi (current_alternative_string)) ? true_rtx : false_rtx;
2805 return XINT (exp, 1) ? true_rtx : false_rtx;
2809 if (current_alternative_string && XSTR (exp, 0) == alternative_name)
2810 return (XSTR (exp, 1) == current_alternative_string
2811 ? true_rtx : false_rtx);
2813 if (XSTR (exp, 0) == alternative_name)
2815 newexp = mk_attr_alt (1 << atoi (XSTR (exp, 1)));
2819 /* Look at the value for this insn code in the specified attribute.
2820 We normally can replace this comparison with the condition that
2821 would give this insn the values being tested for. */
2822 if (XSTR (exp, 0) != alternative_name
2823 && (attr = find_attr (&XSTR (exp, 0), 0)) != NULL)
2824 for (av = attr->first_value; av; av = av->next)
2825 for (ie = av->first_insn; ie; ie = ie->next)
2826 if (ie->def->insn_code == insn_code)
2829 x = evaluate_eq_attr (exp, av->value, insn_code, insn_index);
2830 x = SIMPLIFY_TEST_EXP (x, insn_code, insn_index);
2831 if (attr_rtx_cost(x) < 20)
2840 /* We have already simplified this expression. Simplifying it again
2841 won't buy anything unless we weren't given a valid insn code
2842 to process (i.e., we are canonicalizing something.). */
2843 if (insn_code != -2 /* Seems wrong: && current_alternative_string. */
2844 && ! ATTR_IND_SIMPLIFIED_P (newexp))
2845 return copy_rtx_unchanging (newexp);
2850 /* Optimize the attribute lists by seeing if we can determine conditional
2851 values from the known values of other attributes. This will save subroutine
2852 calls during the compilation. */
2855 optimize_attrs (void)
2857 struct attr_desc *attr;
2858 struct attr_value *av;
2859 struct insn_ent *ie;
2862 struct attr_value_list
2864 struct attr_value *av;
2865 struct insn_ent *ie;
2866 struct attr_desc *attr;
2867 struct attr_value_list *next;
2869 struct attr_value_list **insn_code_values;
2870 struct attr_value_list *ivbuf;
2871 struct attr_value_list *iv;
2873 /* For each insn code, make a list of all the insn_ent's for it,
2874 for all values for all attributes. */
2876 if (num_insn_ents == 0)
2879 /* Make 2 extra elements, for "code" values -2 and -1. */
2880 insn_code_values = xcalloc ((insn_code_number + 2),
2881 sizeof (struct attr_value_list *));
2883 /* Offset the table address so we can index by -2 or -1. */
2884 insn_code_values += 2;
2886 iv = ivbuf = xmalloc (num_insn_ents * sizeof (struct attr_value_list));
2888 for (i = 0; i < MAX_ATTRS_INDEX; i++)
2889 for (attr = attrs[i]; attr; attr = attr->next)
2890 for (av = attr->first_value; av; av = av->next)
2891 for (ie = av->first_insn; ie; ie = ie->next)
2896 iv->next = insn_code_values[ie->def->insn_code];
2897 insn_code_values[ie->def->insn_code] = iv;
2901 /* Sanity check on num_insn_ents. */
2902 gcc_assert (iv == ivbuf + num_insn_ents);
2904 /* Process one insn code at a time. */
2905 for (i = -2; i < insn_code_number; i++)
2907 /* Clear the ATTR_CURR_SIMPLIFIED_P flag everywhere relevant.
2908 We use it to mean "already simplified for this insn". */
2909 for (iv = insn_code_values[i]; iv; iv = iv->next)
2910 clear_struct_flag (iv->av->value);
2912 for (iv = insn_code_values[i]; iv; iv = iv->next)
2914 struct obstack *old = rtl_obstack;
2919 if (GET_CODE (av->value) != COND)
2922 rtl_obstack = temp_obstack;
2924 while (GET_CODE (newexp) == COND)
2926 rtx newexp2 = simplify_cond (newexp, ie->def->insn_code,
2927 ie->def->insn_index);
2928 if (newexp2 == newexp)
2934 if (newexp != av->value)
2936 newexp = attr_copy_rtx (newexp);
2937 remove_insn_ent (av, ie);
2938 av = get_attr_value (newexp, attr, ie->def->insn_code);
2940 insert_insn_ent (av, ie);
2946 free (insn_code_values - 2);
2949 /* Clear the ATTR_CURR_SIMPLIFIED_P flag in EXP and its subexpressions. */
2952 clear_struct_flag (rtx x)
2959 ATTR_CURR_SIMPLIFIED_P (x) = 0;
2960 if (ATTR_IND_SIMPLIFIED_P (x))
2963 code = GET_CODE (x);
2983 /* Compare the elements. If any pair of corresponding elements
2984 fail to match, return 0 for the whole things. */
2986 fmt = GET_RTX_FORMAT (code);
2987 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2993 for (j = 0; j < XVECLEN (x, i); j++)
2994 clear_struct_flag (XVECEXP (x, i, j));
2998 clear_struct_flag (XEXP (x, i));
3004 /* Create table entries for DEFINE_ATTR. */
3007 gen_attr (rtx exp, int lineno)
3009 struct attr_desc *attr;
3010 struct attr_value *av;
3011 const char *name_ptr;
3014 /* Make a new attribute structure. Check for duplicate by looking at
3015 attr->default_val, since it is initialized by this routine. */
3016 attr = find_attr (&XSTR (exp, 0), 1);
3017 if (attr->default_val)
3019 message_with_line (lineno, "duplicate definition for attribute %s",
3021 message_with_line (attr->lineno, "previous definition");
3025 attr->lineno = lineno;
3027 if (*XSTR (exp, 1) == '\0')
3028 attr->is_numeric = 1;
3031 name_ptr = XSTR (exp, 1);
3032 while ((p = next_comma_elt (&name_ptr)) != NULL)
3034 av = oballoc (sizeof (struct attr_value));
3035 av->value = attr_rtx (CONST_STRING, p);
3036 av->next = attr->first_value;
3037 attr->first_value = av;
3038 av->first_insn = NULL;
3040 av->has_asm_insn = 0;
3044 if (GET_CODE (XEXP (exp, 2)) == CONST)
3047 if (attr->is_numeric)
3049 message_with_line (lineno,
3050 "constant attributes may not take numeric values");
3054 /* Get rid of the CONST node. It is allowed only at top-level. */
3055 XEXP (exp, 2) = XEXP (XEXP (exp, 2), 0);
3058 if (! strcmp_check (attr->name, length_str) && ! attr->is_numeric)
3060 message_with_line (lineno,
3061 "`length' attribute must take numeric values");
3065 /* Set up the default value. */
3066 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
3067 attr->default_val = get_attr_value (XEXP (exp, 2), attr, -2);
3070 /* Given a pattern for DEFINE_PEEPHOLE or DEFINE_INSN, return the number of
3071 alternatives in the constraints. Assume all MATCH_OPERANDs have the same
3072 number of alternatives as this should be checked elsewhere. */
3075 count_alternatives (rtx exp)
3080 if (GET_CODE (exp) == MATCH_OPERAND)
3081 return n_comma_elts (XSTR (exp, 2));
3083 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3084 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3089 n = count_alternatives (XEXP (exp, i));
3096 if (XVEC (exp, i) != NULL)
3097 for (j = 0; j < XVECLEN (exp, i); j++)
3099 n = count_alternatives (XVECEXP (exp, i, j));
3108 /* Returns nonzero if the given expression contains an EQ_ATTR with the
3109 `alternative' attribute. */
3112 compares_alternatives_p (rtx exp)
3117 if (GET_CODE (exp) == EQ_ATTR && XSTR (exp, 0) == alternative_name)
3120 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3121 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3126 if (compares_alternatives_p (XEXP (exp, i)))
3131 for (j = 0; j < XVECLEN (exp, i); j++)
3132 if (compares_alternatives_p (XVECEXP (exp, i, j)))
3140 /* Returns nonzero is INNER is contained in EXP. */
3143 contained_in_p (rtx inner, rtx exp)
3148 if (rtx_equal_p (inner, exp))
3151 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
3152 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
3157 if (contained_in_p (inner, XEXP (exp, i)))
3162 for (j = 0; j < XVECLEN (exp, i); j++)
3163 if (contained_in_p (inner, XVECEXP (exp, i, j)))
3171 /* Process DEFINE_PEEPHOLE, DEFINE_INSN, and DEFINE_ASM_ATTRIBUTES. */
3174 gen_insn (rtx exp, int lineno)
3176 struct insn_def *id;
3178 id = oballoc (sizeof (struct insn_def));
3182 id->lineno = lineno;
3184 switch (GET_CODE (exp))
3187 id->insn_code = insn_code_number;
3188 id->insn_index = insn_index_number;
3189 id->num_alternatives = count_alternatives (exp);
3190 if (id->num_alternatives == 0)
3191 id->num_alternatives = 1;
3195 case DEFINE_PEEPHOLE:
3196 id->insn_code = insn_code_number;
3197 id->insn_index = insn_index_number;
3198 id->num_alternatives = count_alternatives (exp);
3199 if (id->num_alternatives == 0)
3200 id->num_alternatives = 1;
3204 case DEFINE_ASM_ATTRIBUTES:
3206 id->insn_index = -1;
3207 id->num_alternatives = 1;
3209 got_define_asm_attributes = 1;
3217 /* Process a DEFINE_DELAY. Validate the vector length, check if annul
3218 true or annul false is specified, and make a `struct delay_desc'. */
3221 gen_delay (rtx def, int lineno)
3223 struct delay_desc *delay;
3226 if (XVECLEN (def, 1) % 3 != 0)
3228 message_with_line (lineno,
3229 "number of elements in DEFINE_DELAY must be multiple of three");
3234 for (i = 0; i < XVECLEN (def, 1); i += 3)
3236 if (XVECEXP (def, 1, i + 1))
3237 have_annul_true = 1;
3238 if (XVECEXP (def, 1, i + 2))
3239 have_annul_false = 1;
3242 delay = oballoc (sizeof (struct delay_desc));
3244 delay->num = ++num_delays;
3245 delay->next = delays;
3246 delay->lineno = lineno;
3250 /* Given a piece of RTX, print a C expression to test its truth value.
3251 We use AND and IOR both for logical and bit-wise operations, so
3252 interpret them as logical unless they are inside a comparison expression.
3253 The first bit of FLAGS will be nonzero in that case.
3255 Set the second bit of FLAGS to make references to attribute values use
3256 a cached local variable instead of calling a function. */
3259 write_test_expr (rtx exp, int flags)
3261 int comparison_operator = 0;
3263 struct attr_desc *attr;
3265 /* In order not to worry about operator precedence, surround our part of
3266 the expression with parentheses. */
3269 code = GET_CODE (exp);
3272 /* Binary operators. */
3275 printf ("(unsigned) ");
3281 comparison_operator = 1;
3283 case PLUS: case MINUS: case MULT: case DIV: case MOD:
3284 case AND: case IOR: case XOR:
3285 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
3286 write_test_expr (XEXP (exp, 0), flags | comparison_operator);
3302 printf (" >= (unsigned) ");
3305 printf (" > (unsigned) ");
3314 printf (" <= (unsigned) ");
3317 printf (" < (unsigned) ");
3360 write_test_expr (XEXP (exp, 1), flags | comparison_operator);
3364 /* Special-case (not (eq_attrq "alternative" "x")) */
3365 if (! (flags & 1) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
3366 && XSTR (XEXP (exp, 0), 0) == alternative_name)
3368 printf ("which_alternative != %s", XSTR (XEXP (exp, 0), 1));
3372 /* Otherwise, fall through to normal unary operator. */
3374 /* Unary operators. */
3394 write_test_expr (XEXP (exp, 0), flags);
3399 int set = XINT (exp, 0), bit = 0;
3402 fatal ("EQ_ATTR_ALT not valid inside comparison");
3405 fatal ("Empty EQ_ATTR_ALT should be optimized out");
3407 if (!(set & (set - 1)))
3409 if (!(set & 0xffff))
3432 printf ("which_alternative %s= %d",
3433 XINT (exp, 1) ? "!" : "=", bit);
3437 printf ("%s((1 << which_alternative) & 0x%x)",
3438 XINT (exp, 1) ? "!" : "", set);
3443 /* Comparison test of an attribute with a value. Most of these will
3444 have been removed by optimization. Handle "alternative"
3445 specially and give error if EQ_ATTR present inside a comparison. */
3448 fatal ("EQ_ATTR not valid inside comparison");
3450 if (XSTR (exp, 0) == alternative_name)
3452 printf ("which_alternative == %s", XSTR (exp, 1));
3456 attr = find_attr (&XSTR (exp, 0), 0);
3459 /* Now is the time to expand the value of a constant attribute. */
3462 write_test_expr (evaluate_eq_attr (exp, attr->default_val->value,
3469 printf ("attr_%s", attr->name);
3471 printf ("get_attr_%s (insn)", attr->name);
3473 write_attr_valueq (attr, XSTR (exp, 1));
3477 /* Comparison test of flags for define_delays. */
3480 fatal ("ATTR_FLAG not valid inside comparison");
3481 printf ("(flags & ATTR_FLAG_%s) != 0", XSTR (exp, 0));
3484 /* See if an operand matches a predicate. */
3486 /* If only a mode is given, just ensure the mode matches the operand.
3487 If neither a mode nor predicate is given, error. */
3488 if (XSTR (exp, 1) == NULL || *XSTR (exp, 1) == '\0')
3490 if (GET_MODE (exp) == VOIDmode)
3491 fatal ("null MATCH_OPERAND specified as test");
3493 printf ("GET_MODE (operands[%d]) == %smode",
3494 XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3497 printf ("%s (operands[%d], %smode)",
3498 XSTR (exp, 1), XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
3501 /* Constant integer. */
3503 printf (HOST_WIDE_INT_PRINT_DEC, XWINT (exp, 0));
3506 /* A random C expression. */
3508 printf ("%s", XSTR (exp, 0));
3511 /* The address of the branch target. */
3513 printf ("INSN_ADDRESSES_SET_P () ? INSN_ADDRESSES (INSN_UID (GET_CODE (operands[%d]) == LABEL_REF ? XEXP (operands[%d], 0) : operands[%d])) : 0",
3514 XINT (exp, 0), XINT (exp, 0), XINT (exp, 0));
3518 /* The address of the current insn. We implement this actually as the
3519 address of the current insn for backward branches, but the last
3520 address of the next insn for forward branches, and both with
3521 adjustments that account for the worst-case possible stretching of
3522 intervening alignments between this insn and its destination. */
3523 printf ("insn_current_reference_address (insn)");
3527 printf ("%s", XSTR (exp, 0));
3531 write_test_expr (XEXP (exp, 0), flags & 2);
3533 write_test_expr (XEXP (exp, 1), flags | 1);
3535 write_test_expr (XEXP (exp, 2), flags | 1);
3539 fatal ("bad RTX code `%s' in attribute calculation\n",
3540 GET_RTX_NAME (code));
3546 /* Given an attribute value, return the maximum CONST_STRING argument
3547 encountered. Set *UNKNOWNP and return INT_MAX if the value is unknown. */
3550 max_attr_value (rtx exp, int *unknownp)
3555 switch (GET_CODE (exp))
3558 current_max = atoi (XSTR (exp, 0));
3562 current_max = max_attr_value (XEXP (exp, 1), unknownp);
3563 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3565 n = max_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3566 if (n > current_max)
3572 current_max = max_attr_value (XEXP (exp, 1), unknownp);
3573 n = max_attr_value (XEXP (exp, 2), unknownp);
3574 if (n > current_max)
3580 current_max = INT_MAX;
3587 /* Given an attribute value, return the result of ORing together all
3588 CONST_STRING arguments encountered. Set *UNKNOWNP and return -1
3589 if the numeric value is not known. */
3592 or_attr_value (rtx exp, int *unknownp)
3597 switch (GET_CODE (exp))
3600 current_or = atoi (XSTR (exp, 0));
3604 current_or = or_attr_value (XEXP (exp, 1), unknownp);
3605 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3606 current_or |= or_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
3610 current_or = or_attr_value (XEXP (exp, 1), unknownp);
3611 current_or |= or_attr_value (XEXP (exp, 2), unknownp);
3623 /* Scan an attribute value, possibly a conditional, and record what actions
3624 will be required to do any conditional tests in it.
3627 `must_extract' if we need to extract the insn operands
3628 `must_constrain' if we must compute `which_alternative'
3629 `address_used' if an address expression was used
3630 `length_used' if an (eq_attr "length" ...) was used
3634 walk_attr_value (rtx exp)
3643 code = GET_CODE (exp);
3647 if (! ATTR_IND_SIMPLIFIED_P (exp))
3648 /* Since this is an arbitrary expression, it can look at anything.
3649 However, constant expressions do not depend on any particular
3651 must_extract = must_constrain = 1;
3659 must_extract = must_constrain = 1;
3663 if (XSTR (exp, 0) == alternative_name)
3664 must_extract = must_constrain = 1;
3665 else if (strcmp_check (XSTR (exp, 0), length_str) == 0)
3685 for (i = 0, fmt = GET_RTX_FORMAT (code); i < GET_RTX_LENGTH (code); i++)
3690 walk_attr_value (XEXP (exp, i));
3694 if (XVEC (exp, i) != NULL)
3695 for (j = 0; j < XVECLEN (exp, i); j++)
3696 walk_attr_value (XVECEXP (exp, i, j));
3701 /* Write out a function to obtain the attribute for a given INSN. */
3704 write_attr_get (struct attr_desc *attr)
3706 struct attr_value *av, *common_av;
3708 /* Find the most used attribute value. Handle that as the `default' of the
3709 switch we will generate. */
3710 common_av = find_most_used (attr);
3712 /* Write out start of function, then all values with explicit `case' lines,
3713 then a `default', then the value with the most uses. */
3716 if (!attr->is_numeric)
3717 printf ("enum attr_%s\n", attr->name);
3718 else if (attr->unsigned_p)
3719 printf ("unsigned int\n");
3723 /* If the attribute name starts with a star, the remainder is the name of
3724 the subroutine to use, instead of `get_attr_...'. */
3725 if (attr->name[0] == '*')
3726 printf ("%s (rtx insn ATTRIBUTE_UNUSED)\n", &attr->name[1]);
3727 else if (attr->is_const == 0)
3728 printf ("get_attr_%s (rtx insn ATTRIBUTE_UNUSED)\n", attr->name);
3731 printf ("get_attr_%s (void)\n", attr->name);
3734 for (av = attr->first_value; av; av = av->next)
3735 if (av->num_insns != 0)
3736 write_attr_set (attr, 2, av->value, "return", ";",
3737 true_rtx, av->first_insn->def->insn_code,
3738 av->first_insn->def->insn_index);
3745 printf (" switch (recog_memoized (insn))\n");
3748 for (av = attr->first_value; av; av = av->next)
3749 if (av != common_av)
3750 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
3752 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
3753 printf (" }\n}\n\n");
3756 /* Given an AND tree of known true terms (because we are inside an `if' with
3757 that as the condition or are in an `else' clause) and an expression,
3758 replace any known true terms with TRUE. Use `simplify_and_tree' to do
3759 the bulk of the work. */
3762 eliminate_known_true (rtx known_true, rtx exp, int insn_code, int insn_index)
3766 known_true = SIMPLIFY_TEST_EXP (known_true, insn_code, insn_index);
3768 if (GET_CODE (known_true) == AND)
3770 exp = eliminate_known_true (XEXP (known_true, 0), exp,
3771 insn_code, insn_index);
3772 exp = eliminate_known_true (XEXP (known_true, 1), exp,
3773 insn_code, insn_index);
3778 exp = simplify_and_tree (exp, &term, insn_code, insn_index);
3784 /* Write out a series of tests and assignment statements to perform tests and
3785 sets of an attribute value. We are passed an indentation amount and prefix
3786 and suffix strings to write around each attribute value (e.g., "return"
3790 write_attr_set (struct attr_desc *attr, int indent, rtx value,
3791 const char *prefix, const char *suffix, rtx known_true,
3792 int insn_code, int insn_index)
3794 if (GET_CODE (value) == COND)
3796 /* Assume the default value will be the default of the COND unless we
3797 find an always true expression. */
3798 rtx default_val = XEXP (value, 1);
3799 rtx our_known_true = known_true;
3804 for (i = 0; i < XVECLEN (value, 0); i += 2)
3809 testexp = eliminate_known_true (our_known_true,
3810 XVECEXP (value, 0, i),
3811 insn_code, insn_index);
3812 newexp = attr_rtx (NOT, testexp);
3813 newexp = insert_right_side (AND, our_known_true, newexp,
3814 insn_code, insn_index);
3816 /* If the test expression is always true or if the next `known_true'
3817 expression is always false, this is the last case, so break
3818 out and let this value be the `else' case. */
3819 if (testexp == true_rtx || newexp == false_rtx)
3821 default_val = XVECEXP (value, 0, i + 1);
3825 /* Compute the expression to pass to our recursive call as being
3827 inner_true = insert_right_side (AND, our_known_true,
3828 testexp, insn_code, insn_index);
3830 /* If this is always false, skip it. */
3831 if (inner_true == false_rtx)
3834 write_indent (indent);
3835 printf ("%sif ", first_if ? "" : "else ");
3837 write_test_expr (testexp, 0);
3839 write_indent (indent + 2);
3842 write_attr_set (attr, indent + 4,
3843 XVECEXP (value, 0, i + 1), prefix, suffix,
3844 inner_true, insn_code, insn_index);
3845 write_indent (indent + 2);
3847 our_known_true = newexp;
3852 write_indent (indent);
3854 write_indent (indent + 2);
3858 write_attr_set (attr, first_if ? indent : indent + 4, default_val,
3859 prefix, suffix, our_known_true, insn_code, insn_index);
3863 write_indent (indent + 2);
3869 write_indent (indent);
3870 printf ("%s ", prefix);
3871 write_attr_value (attr, value);
3872 printf ("%s\n", suffix);
3876 /* Write out the computation for one attribute value. */
3879 write_attr_case (struct attr_desc *attr, struct attr_value *av,
3880 int write_case_lines, const char *prefix, const char *suffix,
3881 int indent, rtx known_true)
3883 struct insn_ent *ie;
3885 if (av->num_insns == 0)
3888 if (av->has_asm_insn)
3890 write_indent (indent);
3891 printf ("case -1:\n");
3892 write_indent (indent + 2);
3893 printf ("if (GET_CODE (PATTERN (insn)) != ASM_INPUT\n");
3894 write_indent (indent + 2);
3895 printf (" && asm_noperands (PATTERN (insn)) < 0)\n");
3896 write_indent (indent + 2);
3897 printf (" fatal_insn_not_found (insn);\n");
3900 if (write_case_lines)
3902 for (ie = av->first_insn; ie; ie = ie->next)
3903 if (ie->def->insn_code != -1)
3905 write_indent (indent);
3906 printf ("case %d: /* %s */\n",
3907 ie->def->insn_code, XSTR (ie->def->def, 0));
3912 write_indent (indent);
3913 printf ("default:\n");
3916 /* See what we have to do to output this value. */
3917 must_extract = must_constrain = address_used = 0;
3918 walk_attr_value (av->value);
3922 write_indent (indent + 2);
3923 printf ("extract_constrain_insn_cached (insn);\n");
3925 else if (must_extract)
3927 write_indent (indent + 2);
3928 printf ("extract_insn_cached (insn);\n");
3931 write_attr_set (attr, indent + 2, av->value, prefix, suffix,
3932 known_true, av->first_insn->def->insn_code,
3933 av->first_insn->def->insn_index);
3935 if (strncmp (prefix, "return", 6))
3937 write_indent (indent + 2);
3938 printf ("break;\n");
3943 /* Search for uses of non-const attributes and write code to cache them. */
3946 write_expr_attr_cache (rtx p, struct attr_desc *attr)
3951 if (GET_CODE (p) == EQ_ATTR)
3953 if (XSTR (p, 0) != attr->name)
3956 if (!attr->is_numeric)
3957 printf (" enum attr_%s ", attr->name);
3958 else if (attr->unsigned_p)
3959 printf (" unsigned int ");
3963 printf ("attr_%s = get_attr_%s (insn);\n", attr->name, attr->name);
3967 fmt = GET_RTX_FORMAT (GET_CODE (p));
3968 ie = GET_RTX_LENGTH (GET_CODE (p));
3969 for (i = 0; i < ie; i++)
3974 if (write_expr_attr_cache (XEXP (p, i), attr))
3979 je = XVECLEN (p, i);
3980 for (j = 0; j < je; ++j)
3981 if (write_expr_attr_cache (XVECEXP (p, i, j), attr))
3990 /* Utilities to write in various forms. */
3993 write_attr_valueq (struct attr_desc *attr, const char *s)
3995 if (attr->is_numeric)
4001 if (num > 9 || num < 0)
4002 printf (" /* 0x%x */", num);
4006 write_upcase (attr->name);
4013 write_attr_value (struct attr_desc *attr, rtx value)
4017 switch (GET_CODE (value))
4020 write_attr_valueq (attr, XSTR (value, 0));
4024 printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (value));
4028 fputs (XSTR (value, 0), stdout);
4033 struct attr_desc *attr2 = find_attr (&XSTR (value, 0), 0);
4034 printf ("get_attr_%s (%s)", attr2->name,
4035 (attr2->is_const ? "" : "insn"));
4056 write_attr_value (attr, XEXP (value, 0));
4060 write_attr_value (attr, XEXP (value, 1));
4069 write_upcase (const char *str)
4073 /* The argument of TOUPPER should not have side effects. */
4074 putchar (TOUPPER(*str));
4080 write_indent (int indent)
4082 for (; indent > 8; indent -= 8)
4085 for (; indent; indent--)
4089 /* Write a subroutine that is given an insn that requires a delay slot, a
4090 delay slot ordinal, and a candidate insn. It returns nonzero if the
4091 candidate can be placed in the specified delay slot of the insn.
4093 We can write as many as three subroutines. `eligible_for_delay'
4094 handles normal delay slots, `eligible_for_annul_true' indicates that
4095 the specified insn can be annulled if the branch is true, and likewise
4096 for `eligible_for_annul_false'.
4098 KIND is a string distinguishing these three cases ("delay", "annul_true",
4099 or "annul_false"). */
4102 write_eligible_delay (const char *kind)
4104 struct delay_desc *delay;
4108 struct attr_desc *attr;
4109 struct attr_value *av, *common_av;
4112 /* Compute the maximum number of delay slots required. We use the delay
4113 ordinal times this number plus one, plus the slot number as an index into
4114 the appropriate predicate to test. */
4116 for (delay = delays, max_slots = 0; delay; delay = delay->next)
4117 if (XVECLEN (delay->def, 1) / 3 > max_slots)
4118 max_slots = XVECLEN (delay->def, 1) / 3;
4120 /* Write function prelude. */
4123 printf ("eligible_for_%s (rtx delay_insn ATTRIBUTE_UNUSED, int slot, rtx candidate_insn, int flags ATTRIBUTE_UNUSED)\n",
4126 printf (" rtx insn;\n");
4128 printf (" gcc_assert (slot < %d)\n", max_slots);
4130 /* Allow dbr_schedule to pass labels, etc. This can happen if try_split
4131 converts a compound instruction into a loop. */
4132 printf (" if (!INSN_P (candidate_insn))\n");
4133 printf (" return 0;\n");
4136 /* If more than one delay type, find out which type the delay insn is. */
4140 attr = find_attr (&delay_type_str, 0);
4142 common_av = find_most_used (attr);
4144 printf (" insn = delay_insn;\n");
4145 printf (" switch (recog_memoized (insn))\n");
4148 sprintf (str, " * %d;\n break;", max_slots);
4149 for (av = attr->first_value; av; av = av->next)
4150 if (av != common_av)
4151 write_attr_case (attr, av, 1, "slot +=", str, 4, true_rtx);
4153 write_attr_case (attr, common_av, 0, "slot +=", str, 4, true_rtx);
4156 /* Ensure matched. Otherwise, shouldn't have been called. */
4157 printf (" gcc_assert (slot >= %d);\n\n", max_slots);
4160 /* If just one type of delay slot, write simple switch. */
4161 if (num_delays == 1 && max_slots == 1)
4163 printf (" insn = candidate_insn;\n");
4164 printf (" switch (recog_memoized (insn))\n");
4167 attr = find_attr (&delay_1_0_str, 0);
4169 common_av = find_most_used (attr);
4171 for (av = attr->first_value; av; av = av->next)
4172 if (av != common_av)
4173 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
4175 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
4181 /* Write a nested CASE. The first indicates which condition we need to
4182 test, and the inner CASE tests the condition. */
4183 printf (" insn = candidate_insn;\n");
4184 printf (" switch (slot)\n");
4187 for (delay = delays; delay; delay = delay->next)
4188 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
4190 printf (" case %d:\n",
4191 (i / 3) + (num_delays == 1 ? 0 : delay->num * max_slots));
4192 printf (" switch (recog_memoized (insn))\n");
4195 sprintf (str, "*%s_%d_%d", kind, delay->num, i / 3);
4197 attr = find_attr (&pstr, 0);
4199 common_av = find_most_used (attr);
4201 for (av = attr->first_value; av; av = av->next)
4202 if (av != common_av)
4203 write_attr_case (attr, av, 1, "return", ";", 8, true_rtx);
4205 write_attr_case (attr, common_av, 0, "return", ";", 8, true_rtx);
4209 printf (" default:\n");
4210 printf (" gcc_unreachable ();\n");
4217 /* This page contains miscellaneous utility routines. */
4219 /* Given a pointer to a (char *), return a malloc'ed string containing the
4220 next comma-separated element. Advance the pointer to after the string
4221 scanned, or the end-of-string. Return NULL if at end of string. */
4224 next_comma_elt (const char **pstr)
4228 start = scan_comma_elt (pstr);
4233 return attr_string (start, *pstr - start);
4236 /* Return a `struct attr_desc' pointer for a given named attribute. If CREATE
4237 is nonzero, build a new attribute, if one does not exist. *NAME_P is
4238 replaced by a pointer to a canonical copy of the string. */
4240 static struct attr_desc *
4241 find_attr (const char **name_p, int create)
4243 struct attr_desc *attr;
4245 const char *name = *name_p;
4247 /* Before we resort to using `strcmp', see if the string address matches
4248 anywhere. In most cases, it should have been canonicalized to do so. */
4249 if (name == alternative_name)
4252 index = name[0] & (MAX_ATTRS_INDEX - 1);
4253 for (attr = attrs[index]; attr; attr = attr->next)
4254 if (name == attr->name)
4257 /* Otherwise, do it the slow way. */
4258 for (attr = attrs[index]; attr; attr = attr->next)
4259 if (name[0] == attr->name[0] && ! strcmp (name, attr->name))
4261 *name_p = attr->name;
4268 attr = oballoc (sizeof (struct attr_desc));
4269 attr->name = DEF_ATTR_STRING (name);
4270 attr->first_value = attr->default_val = NULL;
4271 attr->is_numeric = attr->negative_ok = attr->is_const = attr->is_special = 0;
4272 attr->unsigned_p = attr->static_p = 0;
4273 attr->next = attrs[index];
4274 attrs[index] = attr;
4276 *name_p = attr->name;
4281 /* Create internal attribute with the given default value. */
4284 make_internal_attr (const char *name, rtx value, int special)
4286 struct attr_desc *attr;
4288 attr = find_attr (&name, 1);
4289 gcc_assert (!attr->default_val);
4291 attr->is_numeric = 1;
4293 attr->is_special = (special & ATTR_SPECIAL) != 0;
4294 attr->negative_ok = (special & ATTR_NEGATIVE_OK) != 0;
4295 attr->unsigned_p = (special & ATTR_UNSIGNED) != 0;
4296 attr->static_p = (special & ATTR_STATIC) != 0;
4297 attr->default_val = get_attr_value (value, attr, -2);
4300 /* Find the most used value of an attribute. */
4302 static struct attr_value *
4303 find_most_used (struct attr_desc *attr)
4305 struct attr_value *av;
4306 struct attr_value *most_used;
4312 for (av = attr->first_value; av; av = av->next)
4313 if (av->num_insns > nuses)
4314 nuses = av->num_insns, most_used = av;
4319 /* Return (attr_value "n") */
4322 make_numeric_value (int n)
4324 static rtx int_values[20];
4328 gcc_assert (n >= 0);
4330 if (n < 20 && int_values[n])
4331 return int_values[n];
4333 p = attr_printf (MAX_DIGITS, "%d", n);
4334 exp = attr_rtx (CONST_STRING, p);
4337 int_values[n] = exp;
4343 copy_rtx_unchanging (rtx orig)
4345 if (ATTR_IND_SIMPLIFIED_P (orig) || ATTR_CURR_SIMPLIFIED_P (orig))
4348 ATTR_CURR_SIMPLIFIED_P (orig) = 1;
4352 /* Determine if an insn has a constant number of delay slots, i.e., the
4353 number of delay slots is not a function of the length of the insn. */
4356 write_const_num_delay_slots (void)
4358 struct attr_desc *attr = find_attr (&num_delay_slots_str, 0);
4359 struct attr_value *av;
4360 struct insn_ent *ie;
4364 printf ("int\nconst_num_delay_slots (rtx insn)\n");
4366 printf (" switch (recog_memoized (insn))\n");
4369 for (av = attr->first_value; av; av = av->next)
4372 walk_attr_value (av->value);
4375 for (ie = av->first_insn; ie; ie = ie->next)
4376 if (ie->def->insn_code != -1)
4377 printf (" case %d: /* %s */\n",
4378 ie->def->insn_code, XSTR (ie->def->def, 0));
4379 printf (" return 0;\n");
4383 printf (" default:\n");
4384 printf (" return 1;\n");
4385 printf (" }\n}\n\n");
4390 main (int argc, char **argv)
4393 struct attr_desc *attr;
4394 struct insn_def *id;
4398 progname = "genattrtab";
4400 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
4401 return (FATAL_EXIT_CODE);
4403 obstack_init (hash_obstack);
4404 obstack_init (temp_obstack);
4406 /* Set up true and false rtx's */
4407 true_rtx = rtx_alloc (CONST_INT);
4408 XWINT (true_rtx, 0) = 1;
4409 false_rtx = rtx_alloc (CONST_INT);
4410 XWINT (false_rtx, 0) = 0;
4411 ATTR_IND_SIMPLIFIED_P (true_rtx) = ATTR_IND_SIMPLIFIED_P (false_rtx) = 1;
4412 ATTR_PERMANENT_P (true_rtx) = ATTR_PERMANENT_P (false_rtx) = 1;
4414 alternative_name = DEF_ATTR_STRING ("alternative");
4415 length_str = DEF_ATTR_STRING ("length");
4416 delay_type_str = DEF_ATTR_STRING ("*delay_type");
4417 delay_1_0_str = DEF_ATTR_STRING ("*delay_1_0");
4418 num_delay_slots_str = DEF_ATTR_STRING ("*num_delay_slots");
4420 printf ("/* Generated automatically by the program `genattrtab'\n\
4421 from the machine description file `md'. */\n\n");
4423 /* Read the machine description. */
4425 initiate_automaton_gen (argc, argv);
4430 desc = read_md_rtx (&lineno, &insn_code_number);
4434 switch (GET_CODE (desc))
4437 case DEFINE_PEEPHOLE:
4438 case DEFINE_ASM_ATTRIBUTES:
4439 gen_insn (desc, lineno);
4443 gen_attr (desc, lineno);
4447 gen_delay (desc, lineno);
4450 case DEFINE_CPU_UNIT:
4451 gen_cpu_unit (desc);
4454 case DEFINE_QUERY_CPU_UNIT:
4455 gen_query_cpu_unit (desc);
4463 gen_excl_set (desc);
4467 gen_presence_set (desc);
4470 case FINAL_PRESENCE_SET:
4471 gen_final_presence_set (desc);
4475 gen_absence_set (desc);
4478 case FINAL_ABSENCE_SET:
4479 gen_final_absence_set (desc);
4482 case DEFINE_AUTOMATON:
4483 gen_automaton (desc);
4486 case AUTOMATA_OPTION:
4487 gen_automata_option (desc);
4490 case DEFINE_RESERVATION:
4494 case DEFINE_INSN_RESERVATION:
4495 gen_insn_reserv (desc);
4501 if (GET_CODE (desc) != DEFINE_ASM_ATTRIBUTES)
4502 insn_index_number++;
4506 return FATAL_EXIT_CODE;
4510 /* If we didn't have a DEFINE_ASM_ATTRIBUTES, make a null one. */
4511 if (! got_define_asm_attributes)
4513 tem = rtx_alloc (DEFINE_ASM_ATTRIBUTES);
4514 XVEC (tem, 0) = rtvec_alloc (0);
4518 /* Expand DEFINE_DELAY information into new attribute. */
4522 /* Build DFA, output some functions and expand DFA information
4523 to new attributes. */
4527 printf ("#include \"config.h\"\n");
4528 printf ("#include \"system.h\"\n");
4529 printf ("#include \"coretypes.h\"\n");
4530 printf ("#include \"tm.h\"\n");
4531 printf ("#include \"rtl.h\"\n");
4532 printf ("#include \"tm_p.h\"\n");
4533 printf ("#include \"insn-config.h\"\n");
4534 printf ("#include \"recog.h\"\n");
4535 printf ("#include \"regs.h\"\n");
4536 printf ("#include \"real.h\"\n");
4537 printf ("#include \"output.h\"\n");
4538 printf ("#include \"insn-attr.h\"\n");
4539 printf ("#include \"toplev.h\"\n");
4540 printf ("#include \"flags.h\"\n");
4541 printf ("#include \"function.h\"\n");
4543 printf ("#define operands recog_data.operand\n\n");
4545 /* Make `insn_alternatives'. */
4546 insn_alternatives = oballoc (insn_code_number * sizeof (int));
4547 for (id = defs; id; id = id->next)
4548 if (id->insn_code >= 0)
4549 insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1;
4551 /* Make `insn_n_alternatives'. */
4552 insn_n_alternatives = oballoc (insn_code_number * sizeof (int));
4553 for (id = defs; id; id = id->next)
4554 if (id->insn_code >= 0)
4555 insn_n_alternatives[id->insn_code] = id->num_alternatives;
4557 /* Prepare to write out attribute subroutines by checking everything stored
4558 away and building the attribute cases. */
4562 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4563 for (attr = attrs[i]; attr; attr = attr->next)
4564 attr->default_val->value
4565 = check_attr_value (attr->default_val->value, attr);
4568 return FATAL_EXIT_CODE;
4570 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4571 for (attr = attrs[i]; attr; attr = attr->next)
4574 /* Construct extra attributes for `length'. */
4575 make_length_attrs ();
4577 /* Perform any possible optimizations to speed up compilation. */
4580 /* Now write out all the `gen_attr_...' routines. Do these before the
4581 special routines so that they get defined before they are used. */
4583 for (i = 0; i < MAX_ATTRS_INDEX; i++)
4584 for (attr = attrs[i]; attr; attr = attr->next)
4586 if (! attr->is_special && ! attr->is_const)
4591 = (attr->name [0] == '*'
4592 && strcmp (&attr->name[1], INSN_ALTS_FUNC_NAME) == 0);
4594 printf ("\n#if AUTOMATON_ALTS\n");
4595 write_attr_get (attr);
4597 printf ("#endif\n\n");
4601 /* Write out delay eligibility information, if DEFINE_DELAY present.
4602 (The function to compute the number of delay slots will be written
4606 write_eligible_delay ("delay");
4607 if (have_annul_true)
4608 write_eligible_delay ("annul_true");
4609 if (have_annul_false)
4610 write_eligible_delay ("annul_false");
4613 /* Output code for pipeline hazards recognition based on DFA
4614 (deterministic finite-state automata). */
4618 /* Write out constant delay slot info. */
4619 write_const_num_delay_slots ();
4621 write_length_unit_log ();
4624 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
4627 /* Define this so we can link with print-rtl.o to get debug_rtx function. */
4629 get_insn_name (int code ATTRIBUTE_UNUSED)