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 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_FUNCTION_UNIT 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_FUNCTION_UNIT. 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 and DEFINE_FUNCTION_UNIT
74 definitions is to create arbitrarily complex expressions and have the
75 optimization simplify them.
77 Once optimization is complete, any required routines and definitions
80 An optimization that is not yet implemented is to hoist the constant
81 expressions entirely out of the routines and definitions that are written.
82 A way to do this is to iterate over all possible combinations of values
83 for constant attributes and generate a set of functions for that given
84 combination. An initialization function would be written that evaluates
85 the attributes and installs the corresponding set of routines and
86 definitions (each would be accessed through a pointer).
88 We use the flags in an RTX as follows:
89 `unchanging' (ATTR_IND_SIMPLIFIED_P): This rtx is fully simplified
90 independent of the insn code.
91 `in_struct' (ATTR_CURR_SIMPLIFIED_P): This rtx is fully simplified
92 for the insn code currently being processed (see optimize_attrs).
93 `integrated' (ATTR_PERMANENT_P): This rtx is permanent and unique
95 `volatil' (ATTR_EQ_ATTR_P): During simplify_by_exploding the value of an
96 EQ_ATTR rtx is true if !volatil and false if volatil. */
98 #define ATTR_IND_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), unchanging))
99 #define ATTR_CURR_SIMPLIFIED_P(RTX) (RTX_FLAG((RTX), in_struct))
100 #define ATTR_PERMANENT_P(RTX) (RTX_FLAG((RTX), integrated))
101 #define ATTR_EQ_ATTR_P(RTX) (RTX_FLAG((RTX), volatil))
105 #include "coretypes.h"
109 #include "gensupport.h"
111 #ifdef HAVE_SYS_RESOURCE_H
112 # include <sys/resource.h>
115 /* We must include obstack.h after <sys/time.h>, to avoid lossage with
116 /usr/include/sys/stdtypes.h on Sun OS 4.x. */
120 #include "genattrtab.h"
122 static struct obstack obstack1, obstack2;
123 struct obstack *hash_obstack = &obstack1;
124 struct obstack *temp_obstack = &obstack2;
126 /* enough space to reserve for printing out ints */
127 #define MAX_DIGITS (HOST_BITS_PER_INT * 3 / 10 + 3)
129 /* Define structures used to record attributes and values. */
131 /* As each DEFINE_INSN, DEFINE_PEEPHOLE, or DEFINE_ASM_ATTRIBUTES is
132 encountered, we store all the relevant information into a
133 `struct insn_def'. This is done to allow attribute definitions to occur
134 anywhere in the file. */
138 struct insn_def *next; /* Next insn in chain. */
139 rtx def; /* The DEFINE_... */
140 int insn_code; /* Instruction number. */
141 int insn_index; /* Expression numer in file, for errors. */
142 int lineno; /* Line number. */
143 int num_alternatives; /* Number of alternatives. */
144 int vec_idx; /* Index of attribute vector in `def'. */
147 /* Once everything has been read in, we store in each attribute value a list
148 of insn codes that have that value. Here is the structure used for the
153 struct insn_ent *next; /* Next in chain. */
154 int insn_code; /* Instruction number. */
155 int insn_index; /* Index of definition in file */
156 int lineno; /* Line number. */
159 /* Each value of an attribute (either constant or computed) is assigned a
160 structure which is used as the listhead of the insns that have that
165 rtx value; /* Value of attribute. */
166 struct attr_value *next; /* Next attribute value in chain. */
167 struct insn_ent *first_insn; /* First insn with this value. */
168 int num_insns; /* Number of insns with this value. */
169 int has_asm_insn; /* True if this value used for `asm' insns */
172 /* Structure for each attribute. */
176 char *name; /* Name of attribute. */
177 struct attr_desc *next; /* Next attribute. */
178 struct attr_value *first_value; /* First value of this attribute. */
179 struct attr_value *default_val; /* Default value for this attribute. */
180 int lineno : 24; /* Line number. */
181 unsigned is_numeric : 1; /* Values of this attribute are numeric. */
182 unsigned negative_ok : 1; /* Allow negative numeric values. */
183 unsigned unsigned_p : 1; /* Make the output function unsigned int. */
184 unsigned is_const : 1; /* Attribute value constant for each run. */
185 unsigned is_special : 1; /* Don't call `write_attr_set'. */
186 unsigned func_units_p : 1; /* This is the function_units attribute. */
187 unsigned blockage_p : 1; /* This is the blockage range function. */
188 unsigned static_p : 1; /* Make the output function static. */
191 #define NULL_ATTR (struct attr_desc *) NULL
193 /* A range of values. */
201 /* Structure for each DEFINE_DELAY. */
205 rtx def; /* DEFINE_DELAY expression. */
206 struct delay_desc *next; /* Next DEFINE_DELAY. */
207 int num; /* Number of DEFINE_DELAY, starting at 1. */
208 int lineno; /* Line number. */
211 /* Record information about each DEFINE_FUNCTION_UNIT. */
213 struct function_unit_op
215 rtx condexp; /* Expression TRUE for applicable insn. */
216 struct function_unit_op *next; /* Next operation for this function unit. */
217 int num; /* Ordinal for this operation type in unit. */
218 int ready; /* Cost until data is ready. */
219 int issue_delay; /* Cost until unit can accept another insn. */
220 rtx conflict_exp; /* Expression TRUE for insns incurring issue delay. */
221 rtx issue_exp; /* Expression computing issue delay. */
222 int lineno; /* Line number. */
225 /* Record information about each function unit mentioned in a
226 DEFINE_FUNCTION_UNIT. */
230 const char *name; /* Function unit name. */
231 struct function_unit *next; /* Next function unit. */
232 int num; /* Ordinal of this unit type. */
233 int multiplicity; /* Number of units of this type. */
234 int simultaneity; /* Maximum number of simultaneous insns
235 on this function unit or 0 if unlimited. */
236 rtx condexp; /* Expression TRUE for insn needing unit. */
237 int num_opclasses; /* Number of different operation types. */
238 struct function_unit_op *ops; /* Pointer to first operation type. */
239 int needs_conflict_function; /* Nonzero if a conflict function required. */
240 int needs_blockage_function; /* Nonzero if a blockage function required. */
241 int needs_range_function; /* Nonzero if blockage range function needed. */
242 rtx default_cost; /* Conflict cost, if constant. */
243 struct range issue_delay; /* Range of issue delay values. */
244 int max_blockage; /* Maximum time an insn blocks the unit. */
245 int first_lineno; /* First seen line number. */
248 /* Listheads of above structures. */
250 /* This one is indexed by the first character of the attribute name. */
251 #define MAX_ATTRS_INDEX 256
252 static struct attr_desc *attrs[MAX_ATTRS_INDEX];
253 static struct insn_def *defs;
254 static struct delay_desc *delays;
255 static struct function_unit *units;
257 /* An expression where all the unknown terms are EQ_ATTR tests can be
258 rearranged into a COND provided we can enumerate all possible
259 combinations of the unknown values. The set of combinations become the
260 tests of the COND; the value of the expression given that combination is
261 computed and becomes the corresponding value. To do this, we must be
262 able to enumerate all values for each attribute used in the expression
263 (currently, we give up if we find a numeric attribute).
265 If the set of EQ_ATTR tests used in an expression tests the value of N
266 different attributes, the list of all possible combinations can be made
267 by walking the N-dimensional attribute space defined by those
268 attributes. We record each of these as a struct dimension.
270 The algorithm relies on sharing EQ_ATTR nodes: if two nodes in an
271 expression are the same, the will also have the same address. We find
272 all the EQ_ATTR nodes by marking them ATTR_EQ_ATTR_P. This bit later
273 represents the value of an EQ_ATTR node, so once all nodes are marked,
274 they are also given an initial value of FALSE.
276 We then separate the set of EQ_ATTR nodes into dimensions for each
277 attribute and put them on the VALUES list. Terms are added as needed by
278 `add_values_to_cover' so that all possible values of the attribute are
281 Each dimension also has a current value. This is the node that is
282 currently considered to be TRUE. If this is one of the nodes added by
283 `add_values_to_cover', all the EQ_ATTR tests in the original expression
284 will be FALSE. Otherwise, only the CURRENT_VALUE will be true.
286 NUM_VALUES is simply the length of the VALUES list and is there for
289 Once the dimensions are created, the algorithm enumerates all possible
290 values and computes the current value of the given expression. */
294 struct attr_desc *attr; /* Attribute for this dimension. */
295 rtx values; /* List of attribute values used. */
296 rtx current_value; /* Position in the list for the TRUE value. */
297 int num_values; /* Length of the values list. */
300 /* Other variables. */
302 static int insn_code_number;
303 static int insn_index_number;
304 static int got_define_asm_attributes;
305 static int must_extract;
306 static int must_constrain;
307 static int address_used;
308 static int length_used;
309 static int num_delays;
310 static int have_annul_true, have_annul_false;
311 static int num_units, num_unit_opclasses;
312 static int num_insn_ents;
316 /* Used as operand to `operate_exp': */
318 enum operator {PLUS_OP, MINUS_OP, POS_MINUS_OP, EQ_OP, OR_OP, ORX_OP, MAX_OP, MIN_OP, RANGE_OP};
320 /* Stores, for each insn code, the number of constraint alternatives. */
322 static int *insn_n_alternatives;
324 /* Stores, for each insn code, a bitmap that has bits on for each possible
327 static int *insn_alternatives;
329 /* If nonzero, assume that the `alternative' attr has this value.
330 This is the hashed, unique string for the numeral
331 whose value is chosen alternative. */
333 static const char *current_alternative_string;
335 /* Used to simplify expressions. */
337 static rtx true_rtx, false_rtx;
339 /* Used to reduce calls to `strcmp' */
341 static char *alternative_name;
343 /* Indicate that REG_DEAD notes are valid if dead_or_set_p is ever
346 int reload_completed = 0;
348 /* Some machines test `optimize' in macros called from rtlanal.c, so we need
349 to define it here. */
353 /* Simplify an expression. Only call the routine if there is something to
355 #define SIMPLIFY_TEST_EXP(EXP,INSN_CODE,INSN_INDEX) \
356 (ATTR_IND_SIMPLIFIED_P (EXP) || ATTR_CURR_SIMPLIFIED_P (EXP) ? (EXP) \
357 : simplify_test_exp (EXP, INSN_CODE, INSN_INDEX))
359 /* Simplify (eq_attr ("alternative") ...)
360 when we are working with a particular alternative. */
361 #define SIMPLIFY_ALTERNATIVE(EXP) \
362 if (current_alternative_string \
363 && GET_CODE ((EXP)) == EQ_ATTR \
364 && XSTR ((EXP), 0) == alternative_name) \
365 (EXP) = (XSTR ((EXP), 1) == current_alternative_string \
366 ? true_rtx : false_rtx);
368 /* These are referenced by rtlanal.c and hence need to be defined somewhere.
369 They won't actually be used. */
371 rtx global_rtl[GR_MAX];
372 rtx pic_offset_table_rtx;
374 static void attr_hash_add_rtx (int, rtx);
375 static void attr_hash_add_string (int, char *);
376 static rtx attr_rtx (enum rtx_code, ...);
377 static rtx attr_rtx_1 (enum rtx_code, va_list);
378 static char *attr_string (const char *, int);
379 static rtx check_attr_value (rtx, struct attr_desc *);
380 static rtx convert_set_attr_alternative (rtx, struct insn_def *);
381 static rtx convert_set_attr (rtx, struct insn_def *);
382 static void check_defs (void);
383 static rtx make_canonical (struct attr_desc *, rtx);
384 static struct attr_value *get_attr_value (rtx, struct attr_desc *, int);
385 static rtx copy_rtx_unchanging (rtx);
386 static rtx copy_boolean (rtx);
387 static void expand_delays (void);
388 static rtx operate_exp (enum operator, rtx, rtx);
389 static void expand_units (void);
390 static rtx simplify_knowing (rtx, rtx);
391 static rtx encode_units_mask (rtx);
392 static void fill_attr (struct attr_desc *);
393 static rtx substitute_address (rtx, rtx (*) (rtx), rtx (*) (rtx));
394 static void make_length_attrs (void);
395 static rtx identity_fn (rtx);
396 static rtx zero_fn (rtx);
397 static rtx one_fn (rtx);
398 static rtx max_fn (rtx);
399 static void write_length_unit_log (void);
400 static rtx simplify_cond (rtx, int, int);
401 static rtx simplify_by_exploding (rtx);
402 static int find_and_mark_used_attributes (rtx, rtx *, int *);
403 static void unmark_used_attributes (rtx, struct dimension *, int);
404 static int add_values_to_cover (struct dimension *);
405 static int increment_current_value (struct dimension *, int);
406 static rtx test_for_current_value (struct dimension *, int);
407 static rtx simplify_with_current_value (rtx, struct dimension *, int);
408 static rtx simplify_with_current_value_aux (rtx);
409 static void clear_struct_flag (rtx);
410 static void remove_insn_ent (struct attr_value *, struct insn_ent *);
411 static void insert_insn_ent (struct attr_value *, struct insn_ent *);
412 static rtx insert_right_side (enum rtx_code, rtx, rtx, int, int);
413 static rtx make_alternative_compare (int);
414 static int compute_alternative_mask (rtx, enum rtx_code);
415 static rtx evaluate_eq_attr (rtx, rtx, int, int);
416 static rtx simplify_and_tree (rtx, rtx *, int, int);
417 static rtx simplify_or_tree (rtx, rtx *, int, int);
418 static rtx simplify_test_exp (rtx, int, int);
419 static rtx simplify_test_exp_in_temp (rtx, int, int);
420 static void optimize_attrs (void);
421 static void gen_attr (rtx, int);
422 static int count_alternatives (rtx);
423 static int compares_alternatives_p (rtx);
424 static int contained_in_p (rtx, rtx);
425 static void gen_insn (rtx, int);
426 static void gen_delay (rtx, int);
427 static void gen_unit (rtx, int);
428 static void write_test_expr (rtx, int);
429 static int max_attr_value (rtx, int*);
430 static int or_attr_value (rtx, int*);
431 static void walk_attr_value (rtx);
432 static void write_attr_get (struct attr_desc *);
433 static rtx eliminate_known_true (rtx, rtx, int, int);
434 static void write_attr_set (struct attr_desc *, int, rtx,
435 const char *, const char *, rtx,
437 static void write_attr_case (struct attr_desc *, struct attr_value *,
438 int, const char *, const char *, int, rtx);
439 static void write_unit_name (const char *, int, const char *);
440 static void write_attr_valueq (struct attr_desc *, const char *);
441 static void write_attr_value (struct attr_desc *, rtx);
442 static void write_upcase (const char *);
443 static void write_indent (int);
444 static void write_eligible_delay (const char *);
445 static void write_function_unit_info (void);
446 static void write_complex_function (struct function_unit *, const char *,
448 static int write_expr_attr_cache (rtx, struct attr_desc *);
449 static void write_toplevel_expr (rtx);
450 static void write_const_num_delay_slots (void);
451 static char *next_comma_elt (const char **);
452 static struct attr_desc *find_attr (const char *, int);
453 static struct attr_value *find_most_used (struct attr_desc *);
454 static rtx find_single_value (struct attr_desc *);
455 static void extend_range (struct range *, int, int);
456 static rtx attr_eq (const char *, const char *);
457 static const char *attr_numeral (int);
458 static int attr_equal_p (rtx, rtx);
459 static rtx attr_copy_rtx (rtx);
460 static int attr_rtx_cost (rtx);
462 #define oballoc(size) obstack_alloc (hash_obstack, size)
464 /* Hash table for sharing RTL and strings. */
466 /* Each hash table slot is a bucket containing a chain of these structures.
467 Strings are given negative hash codes; RTL expressions are given positive
472 struct attr_hash *next; /* Next structure in the bucket. */
473 int hashcode; /* Hash code of this rtx or string. */
476 char *str; /* The string (negative hash codes) */
477 rtx rtl; /* or the RTL recorded here. */
481 /* Now here is the hash table. When recording an RTL, it is added to
482 the slot whose index is the hash code mod the table size. Note
483 that the hash table is used for several kinds of RTL (see attr_rtx)
484 and for strings. While all these live in the same table, they are
485 completely independent, and the hash code is computed differently
488 #define RTL_HASH_SIZE 4093
489 struct attr_hash *attr_hash_table[RTL_HASH_SIZE];
491 /* Here is how primitive or already-shared RTL's hash
493 #define RTL_HASH(RTL) ((long) (RTL) & 0777777)
495 /* Add an entry to the hash table for RTL with hash code HASHCODE. */
498 attr_hash_add_rtx (int hashcode, rtx rtl)
502 h = obstack_alloc (hash_obstack, sizeof (struct attr_hash));
503 h->hashcode = hashcode;
505 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
506 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
509 /* Add an entry to the hash table for STRING with hash code HASHCODE. */
512 attr_hash_add_string (int hashcode, char *str)
516 h = obstack_alloc (hash_obstack, sizeof (struct attr_hash));
517 h->hashcode = -hashcode;
519 h->next = attr_hash_table[hashcode % RTL_HASH_SIZE];
520 attr_hash_table[hashcode % RTL_HASH_SIZE] = h;
523 /* Generate an RTL expression, but avoid duplicates.
524 Set the ATTR_PERMANENT_P flag for these permanent objects.
526 In some cases we cannot uniquify; then we return an ordinary
527 impermanent rtx with ATTR_PERMANENT_P clear.
529 Args are like gen_rtx, but without the mode:
531 rtx attr_rtx (code, [element1, ..., elementn]) */
534 attr_rtx_1 (enum rtx_code code, va_list p)
536 rtx rt_val = NULL_RTX;/* RTX to return to caller... */
539 struct obstack *old_obstack = rtl_obstack;
541 /* For each of several cases, search the hash table for an existing entry.
542 Use that entry if one is found; otherwise create a new RTL and add it
545 if (GET_RTX_CLASS (code) == '1')
547 rtx arg0 = va_arg (p, rtx);
549 /* A permanent object cannot point to impermanent ones. */
550 if (! ATTR_PERMANENT_P (arg0))
552 rt_val = rtx_alloc (code);
553 XEXP (rt_val, 0) = arg0;
557 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
558 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
559 if (h->hashcode == hashcode
560 && GET_CODE (h->u.rtl) == code
561 && XEXP (h->u.rtl, 0) == arg0)
566 rtl_obstack = hash_obstack;
567 rt_val = rtx_alloc (code);
568 XEXP (rt_val, 0) = arg0;
571 else if (GET_RTX_CLASS (code) == 'c'
572 || GET_RTX_CLASS (code) == '2'
573 || GET_RTX_CLASS (code) == '<')
575 rtx arg0 = va_arg (p, rtx);
576 rtx arg1 = va_arg (p, rtx);
578 /* A permanent object cannot point to impermanent ones. */
579 if (! ATTR_PERMANENT_P (arg0) || ! ATTR_PERMANENT_P (arg1))
581 rt_val = rtx_alloc (code);
582 XEXP (rt_val, 0) = arg0;
583 XEXP (rt_val, 1) = arg1;
587 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
588 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
589 if (h->hashcode == hashcode
590 && GET_CODE (h->u.rtl) == code
591 && XEXP (h->u.rtl, 0) == arg0
592 && XEXP (h->u.rtl, 1) == arg1)
597 rtl_obstack = hash_obstack;
598 rt_val = rtx_alloc (code);
599 XEXP (rt_val, 0) = arg0;
600 XEXP (rt_val, 1) = arg1;
603 else if (GET_RTX_LENGTH (code) == 1
604 && GET_RTX_FORMAT (code)[0] == 's')
606 char *arg0 = va_arg (p, char *);
608 if (code == SYMBOL_REF)
609 arg0 = attr_string (arg0, strlen (arg0));
611 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0));
612 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
613 if (h->hashcode == hashcode
614 && GET_CODE (h->u.rtl) == code
615 && XSTR (h->u.rtl, 0) == arg0)
620 rtl_obstack = hash_obstack;
621 rt_val = rtx_alloc (code);
622 XSTR (rt_val, 0) = arg0;
625 else if (GET_RTX_LENGTH (code) == 2
626 && GET_RTX_FORMAT (code)[0] == 's'
627 && GET_RTX_FORMAT (code)[1] == 's')
629 char *arg0 = va_arg (p, char *);
630 char *arg1 = va_arg (p, char *);
632 hashcode = ((HOST_WIDE_INT) code + RTL_HASH (arg0) + RTL_HASH (arg1));
633 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
634 if (h->hashcode == hashcode
635 && GET_CODE (h->u.rtl) == code
636 && XSTR (h->u.rtl, 0) == arg0
637 && XSTR (h->u.rtl, 1) == arg1)
642 rtl_obstack = hash_obstack;
643 rt_val = rtx_alloc (code);
644 XSTR (rt_val, 0) = arg0;
645 XSTR (rt_val, 1) = arg1;
648 else if (code == CONST_INT)
650 HOST_WIDE_INT arg0 = va_arg (p, HOST_WIDE_INT);
660 int i; /* Array indices... */
661 const char *fmt; /* Current rtx's format... */
663 rt_val = rtx_alloc (code); /* Allocate the storage space. */
665 fmt = GET_RTX_FORMAT (code); /* Find the right format... */
666 for (i = 0; i < GET_RTX_LENGTH (code); i++)
670 case '0': /* Unused field. */
673 case 'i': /* An integer? */
674 XINT (rt_val, i) = va_arg (p, int);
677 case 'w': /* A wide integer? */
678 XWINT (rt_val, i) = va_arg (p, HOST_WIDE_INT);
681 case 's': /* A string? */
682 XSTR (rt_val, i) = va_arg (p, char *);
685 case 'e': /* An expression? */
686 case 'u': /* An insn? Same except when printing. */
687 XEXP (rt_val, i) = va_arg (p, rtx);
690 case 'E': /* An RTX vector? */
691 XVEC (rt_val, i) = va_arg (p, rtvec);
701 rtl_obstack = old_obstack;
702 attr_hash_add_rtx (hashcode, rt_val);
703 ATTR_PERMANENT_P (rt_val) = 1;
708 attr_rtx (enum rtx_code code, ...)
714 result = attr_rtx_1 (code, p);
719 /* Create a new string printed with the printf line arguments into a space
720 of at most LEN bytes:
722 rtx attr_printf (len, format, [arg1, ..., argn]) */
725 attr_printf (unsigned int len, const char *fmt, ...)
732 if (len > sizeof str - 1) /* Leave room for \0. */
735 vsprintf (str, fmt, p);
738 return attr_string (str, strlen (str));
742 attr_eq (const char *name, const char *value)
744 return attr_rtx (EQ_ATTR, attr_string (name, strlen (name)),
745 attr_string (value, strlen (value)));
751 return XSTR (make_numeric_value (n), 0);
754 /* Return a permanent (possibly shared) copy of a string STR (not assumed
755 to be null terminated) with LEN bytes. */
758 attr_string (const char *str, int len)
765 /* Compute the hash code. */
766 hashcode = (len + 1) * 613 + (unsigned) str[0];
767 for (i = 1; i <= len; i += 2)
768 hashcode = ((hashcode * 613) + (unsigned) str[i]);
770 hashcode = -hashcode;
772 /* Search the table for the string. */
773 for (h = attr_hash_table[hashcode % RTL_HASH_SIZE]; h; h = h->next)
774 if (h->hashcode == -hashcode && h->u.str[0] == str[0]
775 && !strncmp (h->u.str, str, len))
776 return h->u.str; /* <-- return if found. */
778 /* Not found; create a permanent copy and add it to the hash table. */
779 new_str = obstack_alloc (hash_obstack, len + 1);
780 memcpy (new_str, str, len);
782 attr_hash_add_string (hashcode, new_str);
784 return new_str; /* Return the new string. */
787 /* Check two rtx's for equality of contents,
788 taking advantage of the fact that if both are hashed
789 then they can't be equal unless they are the same object. */
792 attr_equal_p (rtx x, rtx y)
794 return (x == y || (! (ATTR_PERMANENT_P (x) && ATTR_PERMANENT_P (y))
795 && rtx_equal_p (x, y)));
798 /* Copy an attribute value expression,
799 descending to all depths, but not copying any
800 permanent hashed subexpressions. */
803 attr_copy_rtx (rtx orig)
808 const char *format_ptr;
810 /* No need to copy a permanent object. */
811 if (ATTR_PERMANENT_P (orig))
814 code = GET_CODE (orig);
833 copy = rtx_alloc (code);
834 PUT_MODE (copy, GET_MODE (orig));
835 ATTR_IND_SIMPLIFIED_P (copy) = ATTR_IND_SIMPLIFIED_P (orig);
836 ATTR_CURR_SIMPLIFIED_P (copy) = ATTR_CURR_SIMPLIFIED_P (orig);
837 ATTR_PERMANENT_P (copy) = ATTR_PERMANENT_P (orig);
838 ATTR_EQ_ATTR_P (copy) = ATTR_EQ_ATTR_P (orig);
840 format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
842 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
844 switch (*format_ptr++)
847 XEXP (copy, i) = XEXP (orig, i);
848 if (XEXP (orig, i) != NULL)
849 XEXP (copy, i) = attr_copy_rtx (XEXP (orig, i));
854 XVEC (copy, i) = XVEC (orig, i);
855 if (XVEC (orig, i) != NULL)
857 XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
858 for (j = 0; j < XVECLEN (copy, i); j++)
859 XVECEXP (copy, i, j) = attr_copy_rtx (XVECEXP (orig, i, j));
865 XINT (copy, i) = XINT (orig, i);
869 XWINT (copy, i) = XWINT (orig, i);
874 XSTR (copy, i) = XSTR (orig, i);
884 /* Given a test expression for an attribute, ensure it is validly formed.
885 IS_CONST indicates whether the expression is constant for each compiler
886 run (a constant expression may not test any particular insn).
888 Convert (eq_attr "att" "a1,a2") to (ior (eq_attr ... ) (eq_attrq ..))
889 and (eq_attr "att" "!a1") to (not (eq_attr "att" "a1")). Do the latter
890 test first so that (eq_attr "att" "!a1,a2,a3") works as expected.
892 Update the string address in EQ_ATTR expression to be the same used
893 in the attribute (or `alternative_name') to speed up subsequent
894 `find_attr' calls and eliminate most `strcmp' calls.
896 Return the new expression, if any. */
899 check_attr_test (rtx exp, int is_const, int lineno)
901 struct attr_desc *attr;
902 struct attr_value *av;
903 const char *name_ptr, *p;
906 switch (GET_CODE (exp))
909 /* Handle negation test. */
910 if (XSTR (exp, 1)[0] == '!')
911 return check_attr_test (attr_rtx (NOT,
912 attr_eq (XSTR (exp, 0),
916 else if (n_comma_elts (XSTR (exp, 1)) == 1)
918 attr = find_attr (XSTR (exp, 0), 0);
921 if (! strcmp (XSTR (exp, 0), "alternative"))
923 XSTR (exp, 0) = alternative_name;
924 /* This can't be simplified any further. */
925 ATTR_IND_SIMPLIFIED_P (exp) = 1;
929 fatal ("unknown attribute `%s' in EQ_ATTR", XSTR (exp, 0));
932 if (is_const && ! attr->is_const)
933 fatal ("constant expression uses insn attribute `%s' in EQ_ATTR",
936 /* Copy this just to make it permanent,
937 so expressions using it can be permanent too. */
938 exp = attr_eq (XSTR (exp, 0), XSTR (exp, 1));
940 /* It shouldn't be possible to simplify the value given to a
941 constant attribute, so don't expand this until it's time to
942 write the test expression. */
944 ATTR_IND_SIMPLIFIED_P (exp) = 1;
946 if (attr->is_numeric)
948 for (p = XSTR (exp, 1); *p; p++)
950 fatal ("attribute `%s' takes only numeric values",
955 for (av = attr->first_value; av; av = av->next)
956 if (GET_CODE (av->value) == CONST_STRING
957 && ! strcmp (XSTR (exp, 1), XSTR (av->value, 0)))
961 fatal ("unknown value `%s' for `%s' attribute",
962 XSTR (exp, 1), XSTR (exp, 0));
967 /* Make an IOR tree of the possible values. */
969 name_ptr = XSTR (exp, 1);
970 while ((p = next_comma_elt (&name_ptr)) != NULL)
972 newexp = attr_eq (XSTR (exp, 0), p);
973 orexp = insert_right_side (IOR, orexp, newexp, -2, -2);
976 return check_attr_test (orexp, is_const, lineno);
984 /* Either TRUE or FALSE. */
992 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
993 XEXP (exp, 1) = check_attr_test (XEXP (exp, 1), is_const, lineno);
997 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0), is_const, lineno);
1003 fatal ("RTL operator \"%s\" not valid in constant attribute test",
1004 GET_RTX_NAME (GET_CODE (exp)));
1005 /* These cases can't be simplified. */
1006 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1009 case LE: case LT: case GT: case GE:
1010 case LEU: case LTU: case GTU: case GEU:
1012 if (GET_CODE (XEXP (exp, 0)) == SYMBOL_REF
1013 && GET_CODE (XEXP (exp, 1)) == SYMBOL_REF)
1014 exp = attr_rtx (GET_CODE (exp),
1015 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 0), 0)),
1016 attr_rtx (SYMBOL_REF, XSTR (XEXP (exp, 1), 0)));
1017 /* These cases can't be simplified. */
1018 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1024 /* These cases are valid for constant attributes, but can't be
1026 exp = attr_rtx (SYMBOL_REF, XSTR (exp, 0));
1027 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1031 fatal ("RTL operator \"%s\" not valid in attribute test",
1032 GET_RTX_NAME (GET_CODE (exp)));
1038 /* Given an expression, ensure that it is validly formed and that all named
1039 attribute values are valid for the given attribute. Issue a fatal error
1040 if not. If no attribute is specified, assume a numeric attribute.
1042 Return a perhaps modified replacement expression for the value. */
1045 check_attr_value (rtx exp, struct attr_desc *attr)
1047 struct attr_value *av;
1051 switch (GET_CODE (exp))
1054 if (attr && ! attr->is_numeric)
1056 message_with_line (attr->lineno,
1057 "CONST_INT not valid for non-numeric attribute %s",
1063 if (INTVAL (exp) < 0 && ! attr->negative_ok)
1065 message_with_line (attr->lineno,
1066 "negative numeric value specified for attribute %s",
1074 if (! strcmp (XSTR (exp, 0), "*"))
1077 if (attr == 0 || attr->is_numeric)
1080 if (attr && attr->negative_ok && *p == '-')
1085 message_with_line (attr ? attr->lineno : 0,
1086 "non-numeric value for numeric attribute %s",
1087 attr ? attr->name : "internal");
1094 for (av = attr->first_value; av; av = av->next)
1095 if (GET_CODE (av->value) == CONST_STRING
1096 && ! strcmp (XSTR (av->value, 0), XSTR (exp, 0)))
1101 message_with_line (attr->lineno,
1102 "unknown value `%s' for `%s' attribute",
1103 XSTR (exp, 0), attr ? attr->name : "internal");
1109 XEXP (exp, 0) = check_attr_test (XEXP (exp, 0),
1110 attr ? attr->is_const : 0,
1111 attr ? attr->lineno : 0);
1112 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1113 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
1121 if (attr && !attr->is_numeric)
1123 message_with_line (attr->lineno,
1124 "invalid operation `%s' for non-numeric attribute value",
1125 GET_RTX_NAME (GET_CODE (exp)));
1133 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
1134 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1142 XEXP (exp, 0) = check_attr_value (XEXP (exp, 0), attr);
1146 if (XVECLEN (exp, 0) % 2 != 0)
1148 message_with_line (attr->lineno,
1149 "first operand of COND must have even length");
1154 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1156 XVECEXP (exp, 0, i) = check_attr_test (XVECEXP (exp, 0, i),
1157 attr ? attr->is_const : 0,
1158 attr ? attr->lineno : 0);
1159 XVECEXP (exp, 0, i + 1)
1160 = check_attr_value (XVECEXP (exp, 0, i + 1), attr);
1163 XEXP (exp, 1) = check_attr_value (XEXP (exp, 1), attr);
1168 struct attr_desc *attr2 = find_attr (XSTR (exp, 0), 0);
1171 message_with_line (attr ? attr->lineno : 0,
1172 "unknown attribute `%s' in ATTR",
1176 else if (attr && attr->is_const && ! attr2->is_const)
1178 message_with_line (attr->lineno,
1179 "non-constant attribute `%s' referenced from `%s'",
1180 XSTR (exp, 0), attr->name);
1184 && (attr->is_numeric != attr2->is_numeric
1185 || (! attr->negative_ok && attr2->negative_ok)))
1187 message_with_line (attr->lineno,
1188 "numeric attribute mismatch calling `%s' from `%s'",
1189 XSTR (exp, 0), attr->name);
1196 /* A constant SYMBOL_REF is valid as a constant attribute test and
1197 is expanded later by make_canonical into a COND. In a non-constant
1198 attribute test, it is left be. */
1199 return attr_rtx (SYMBOL_REF, XSTR (exp, 0));
1202 message_with_line (attr ? attr->lineno : 0,
1203 "invalid operation `%s' for attribute value",
1204 GET_RTX_NAME (GET_CODE (exp)));
1212 /* Given an SET_ATTR_ALTERNATIVE expression, convert to the canonical SET.
1213 It becomes a COND with each test being (eq_attr "alternative "n") */
1216 convert_set_attr_alternative (rtx exp, struct insn_def *id)
1218 int num_alt = id->num_alternatives;
1222 if (XVECLEN (exp, 1) != num_alt)
1224 message_with_line (id->lineno,
1225 "bad number of entries in SET_ATTR_ALTERNATIVE");
1230 /* Make a COND with all tests but the last. Select the last value via the
1232 condexp = rtx_alloc (COND);
1233 XVEC (condexp, 0) = rtvec_alloc ((num_alt - 1) * 2);
1235 for (i = 0; i < num_alt - 1; i++)
1238 p = attr_numeral (i);
1240 XVECEXP (condexp, 0, 2 * i) = attr_eq (alternative_name, p);
1241 XVECEXP (condexp, 0, 2 * i + 1) = XVECEXP (exp, 1, i);
1244 XEXP (condexp, 1) = XVECEXP (exp, 1, i);
1246 return attr_rtx (SET, attr_rtx (ATTR, XSTR (exp, 0)), condexp);
1249 /* Given a SET_ATTR, convert to the appropriate SET. If a comma-separated
1250 list of values is given, convert to SET_ATTR_ALTERNATIVE first. */
1253 convert_set_attr (rtx exp, struct insn_def *id)
1256 const char *name_ptr;
1260 /* See how many alternative specified. */
1261 n = n_comma_elts (XSTR (exp, 1));
1263 return attr_rtx (SET,
1264 attr_rtx (ATTR, XSTR (exp, 0)),
1265 attr_rtx (CONST_STRING, XSTR (exp, 1)));
1267 newexp = rtx_alloc (SET_ATTR_ALTERNATIVE);
1268 XSTR (newexp, 0) = XSTR (exp, 0);
1269 XVEC (newexp, 1) = rtvec_alloc (n);
1271 /* Process each comma-separated name. */
1272 name_ptr = XSTR (exp, 1);
1274 while ((p = next_comma_elt (&name_ptr)) != NULL)
1275 XVECEXP (newexp, 1, n++) = attr_rtx (CONST_STRING, p);
1277 return convert_set_attr_alternative (newexp, id);
1280 /* Scan all definitions, checking for validity. Also, convert any SET_ATTR
1281 and SET_ATTR_ALTERNATIVE expressions to the corresponding SET
1287 struct insn_def *id;
1288 struct attr_desc *attr;
1292 for (id = defs; id; id = id->next)
1294 if (XVEC (id->def, id->vec_idx) == NULL)
1297 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
1299 value = XVECEXP (id->def, id->vec_idx, i);
1300 switch (GET_CODE (value))
1303 if (GET_CODE (XEXP (value, 0)) != ATTR)
1305 message_with_line (id->lineno, "bad attribute set");
1311 case SET_ATTR_ALTERNATIVE:
1312 value = convert_set_attr_alternative (value, id);
1316 value = convert_set_attr (value, id);
1320 message_with_line (id->lineno, "invalid attribute code %s",
1321 GET_RTX_NAME (GET_CODE (value)));
1325 if (value == NULL_RTX)
1328 if ((attr = find_attr (XSTR (XEXP (value, 0), 0), 0)) == NULL)
1330 message_with_line (id->lineno, "unknown attribute %s",
1331 XSTR (XEXP (value, 0), 0));
1336 XVECEXP (id->def, id->vec_idx, i) = value;
1337 XEXP (value, 1) = check_attr_value (XEXP (value, 1), attr);
1342 /* Given a valid expression for an attribute value, remove any IF_THEN_ELSE
1343 expressions by converting them into a COND. This removes cases from this
1344 program. Also, replace an attribute value of "*" with the default attribute
1348 make_canonical (struct attr_desc *attr, rtx exp)
1353 switch (GET_CODE (exp))
1356 exp = make_numeric_value (INTVAL (exp));
1360 if (! strcmp (XSTR (exp, 0), "*"))
1362 if (attr == 0 || attr->default_val == 0)
1363 fatal ("(attr_value \"*\") used in invalid context");
1364 exp = attr->default_val->value;
1370 if (!attr->is_const || ATTR_IND_SIMPLIFIED_P (exp))
1372 /* The SYMBOL_REF is constant for a given run, so mark it as unchanging.
1373 This makes the COND something that won't be considered an arbitrary
1374 expression by walk_attr_value. */
1375 ATTR_IND_SIMPLIFIED_P (exp) = 1;
1376 exp = check_attr_value (exp, attr);
1380 newexp = rtx_alloc (COND);
1381 XVEC (newexp, 0) = rtvec_alloc (2);
1382 XVECEXP (newexp, 0, 0) = XEXP (exp, 0);
1383 XVECEXP (newexp, 0, 1) = XEXP (exp, 1);
1385 XEXP (newexp, 1) = XEXP (exp, 2);
1388 /* Fall through to COND case since this is now a COND. */
1395 /* First, check for degenerate COND. */
1396 if (XVECLEN (exp, 0) == 0)
1397 return make_canonical (attr, XEXP (exp, 1));
1398 defval = XEXP (exp, 1) = make_canonical (attr, XEXP (exp, 1));
1400 for (i = 0; i < XVECLEN (exp, 0); i += 2)
1402 XVECEXP (exp, 0, i) = copy_boolean (XVECEXP (exp, 0, i));
1403 XVECEXP (exp, 0, i + 1)
1404 = make_canonical (attr, XVECEXP (exp, 0, i + 1));
1405 if (! rtx_equal_p (XVECEXP (exp, 0, i + 1), defval))
1421 copy_boolean (rtx exp)
1423 if (GET_CODE (exp) == AND || GET_CODE (exp) == IOR)
1424 return attr_rtx (GET_CODE (exp), copy_boolean (XEXP (exp, 0)),
1425 copy_boolean (XEXP (exp, 1)));
1429 /* Given a value and an attribute description, return a `struct attr_value *'
1430 that represents that value. This is either an existing structure, if the
1431 value has been previously encountered, or a newly-created structure.
1433 `insn_code' is the code of an insn whose attribute has the specified
1434 value (-2 if not processing an insn). We ensure that all insns for
1435 a given value have the same number of alternatives if the value checks
1438 static struct attr_value *
1439 get_attr_value (rtx value, struct attr_desc *attr, int insn_code)
1441 struct attr_value *av;
1444 value = make_canonical (attr, value);
1445 if (compares_alternatives_p (value))
1447 if (insn_code < 0 || insn_alternatives == NULL)
1448 fatal ("(eq_attr \"alternatives\" ...) used in non-insn context");
1450 num_alt = insn_alternatives[insn_code];
1453 for (av = attr->first_value; av; av = av->next)
1454 if (rtx_equal_p (value, av->value)
1455 && (num_alt == 0 || av->first_insn == NULL
1456 || insn_alternatives[av->first_insn->insn_code]))
1459 av = oballoc (sizeof (struct attr_value));
1461 av->next = attr->first_value;
1462 attr->first_value = av;
1463 av->first_insn = NULL;
1465 av->has_asm_insn = 0;
1470 /* After all DEFINE_DELAYs have been read in, create internal attributes
1471 to generate the required routines.
1473 First, we compute the number of delay slots for each insn (as a COND of
1474 each of the test expressions in DEFINE_DELAYs). Then, if more than one
1475 delay type is specified, we compute a similar function giving the
1476 DEFINE_DELAY ordinal for each insn.
1478 Finally, for each [DEFINE_DELAY, slot #] pair, we compute an attribute that
1479 tells whether a given insn can be in that delay slot.
1481 Normal attribute filling and optimization expands these to contain the
1482 information needed to handle delay slots. */
1485 expand_delays (void)
1487 struct delay_desc *delay;
1493 /* First, generate data for `num_delay_slots' function. */
1495 condexp = rtx_alloc (COND);
1496 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1497 XEXP (condexp, 1) = make_numeric_value (0);
1499 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1501 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1502 XVECEXP (condexp, 0, i + 1)
1503 = make_numeric_value (XVECLEN (delay->def, 1) / 3);
1506 make_internal_attr ("*num_delay_slots", condexp, ATTR_NONE);
1508 /* If more than one delay type, do the same for computing the delay type. */
1511 condexp = rtx_alloc (COND);
1512 XVEC (condexp, 0) = rtvec_alloc (num_delays * 2);
1513 XEXP (condexp, 1) = make_numeric_value (0);
1515 for (i = 0, delay = delays; delay; i += 2, delay = delay->next)
1517 XVECEXP (condexp, 0, i) = XEXP (delay->def, 0);
1518 XVECEXP (condexp, 0, i + 1) = make_numeric_value (delay->num);
1521 make_internal_attr ("*delay_type", condexp, ATTR_SPECIAL);
1524 /* For each delay possibility and delay slot, compute an eligibility
1525 attribute for non-annulled insns and for each type of annulled (annul
1526 if true and annul if false). */
1527 for (delay = delays; delay; delay = delay->next)
1529 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
1531 condexp = XVECEXP (delay->def, 1, i);
1533 condexp = false_rtx;
1534 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1535 make_numeric_value (1), make_numeric_value (0));
1537 p = attr_printf (sizeof "*delay__" + MAX_DIGITS * 2,
1538 "*delay_%d_%d", delay->num, i / 3);
1539 make_internal_attr (p, newexp, ATTR_SPECIAL);
1541 if (have_annul_true)
1543 condexp = XVECEXP (delay->def, 1, i + 1);
1544 if (condexp == 0) condexp = false_rtx;
1545 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1546 make_numeric_value (1),
1547 make_numeric_value (0));
1548 p = attr_printf (sizeof "*annul_true__" + MAX_DIGITS * 2,
1549 "*annul_true_%d_%d", delay->num, i / 3);
1550 make_internal_attr (p, newexp, ATTR_SPECIAL);
1553 if (have_annul_false)
1555 condexp = XVECEXP (delay->def, 1, i + 2);
1556 if (condexp == 0) condexp = false_rtx;
1557 newexp = attr_rtx (IF_THEN_ELSE, condexp,
1558 make_numeric_value (1),
1559 make_numeric_value (0));
1560 p = attr_printf (sizeof "*annul_false__" + MAX_DIGITS * 2,
1561 "*annul_false_%d_%d", delay->num, i / 3);
1562 make_internal_attr (p, newexp, ATTR_SPECIAL);
1568 /* This function is given a left and right side expression and an operator.
1569 Each side is a conditional expression, each alternative of which has a
1570 numerical value. The function returns another conditional expression
1571 which, for every possible set of condition values, returns a value that is
1572 the operator applied to the values of the two sides.
1574 Since this is called early, it must also support IF_THEN_ELSE. */
1577 operate_exp (enum operator op, rtx left, rtx right)
1579 int left_value, right_value;
1583 /* If left is a string, apply operator to it and the right side. */
1584 if (GET_CODE (left) == CONST_STRING)
1586 /* If right is also a string, just perform the operation. */
1587 if (GET_CODE (right) == CONST_STRING)
1589 left_value = atoi (XSTR (left, 0));
1590 right_value = atoi (XSTR (right, 0));
1594 i = left_value + right_value;
1598 i = left_value - right_value;
1601 case POS_MINUS_OP: /* The positive part of LEFT - RIGHT. */
1602 if (left_value > right_value)
1603 i = left_value - right_value;
1610 i = left_value | right_value;
1614 i = left_value == right_value;
1618 i = (left_value << (HOST_BITS_PER_INT / 2)) | right_value;
1622 if (left_value > right_value)
1629 if (left_value < right_value)
1639 if (i == left_value)
1641 if (i == right_value)
1643 return make_numeric_value (i);
1645 else if (GET_CODE (right) == IF_THEN_ELSE)
1647 /* Apply recursively to all values within. */
1648 rtx newleft = operate_exp (op, left, XEXP (right, 1));
1649 rtx newright = operate_exp (op, left, XEXP (right, 2));
1650 if (rtx_equal_p (newleft, newright))
1652 return attr_rtx (IF_THEN_ELSE, XEXP (right, 0), newleft, newright);
1654 else if (GET_CODE (right) == COND)
1659 newexp = rtx_alloc (COND);
1660 XVEC (newexp, 0) = rtvec_alloc (XVECLEN (right, 0));
1661 defval = XEXP (newexp, 1) = operate_exp (op, left, XEXP (right, 1));
1663 for (i = 0; i < XVECLEN (right, 0); i += 2)
1665 XVECEXP (newexp, 0, i) = XVECEXP (right, 0, i);
1666 XVECEXP (newexp, 0, i + 1)
1667 = operate_exp (op, left, XVECEXP (right, 0, i + 1));
1668 if (! rtx_equal_p (XVECEXP (newexp, 0, i + 1),
1673 /* If the resulting cond is trivial (all alternatives
1674 give the same value), optimize it away. */
1676 return operate_exp (op, left, XEXP (right, 1));
1681 fatal ("badly formed attribute value");
1684 /* A hack to prevent expand_units from completely blowing up: ORX_OP does
1685 not associate through IF_THEN_ELSE. */
1686 else if (op == ORX_OP && GET_CODE (right) == IF_THEN_ELSE)
1688 return attr_rtx (IOR, left, right);
1691 /* Otherwise, do recursion the other way. */
1692 else if (GET_CODE (left) == IF_THEN_ELSE)
1694 rtx newleft = operate_exp (op, XEXP (left, 1), right);
1695 rtx newright = operate_exp (op, XEXP (left, 2), right);
1696 if (rtx_equal_p (newleft, newright))
1698 return attr_rtx (IF_THEN_ELSE, XEXP (left, 0), newleft, newright);
1700 else if (GET_CODE (left) == COND)
1705 newexp = rtx_alloc (COND);
1706 XVEC (newexp, 0) = rtvec_alloc (XVECLEN (left, 0));
1707 defval = XEXP (newexp, 1) = operate_exp (op, XEXP (left, 1), right);
1709 for (i = 0; i < XVECLEN (left, 0); i += 2)
1711 XVECEXP (newexp, 0, i) = XVECEXP (left, 0, i);
1712 XVECEXP (newexp, 0, i + 1)
1713 = operate_exp (op, XVECEXP (left, 0, i + 1), right);
1714 if (! rtx_equal_p (XVECEXP (newexp, 0, i + 1),
1719 /* If the cond is trivial (all alternatives give the same value),
1720 optimize it away. */
1722 return operate_exp (op, XEXP (left, 1), right);
1724 /* If the result is the same as the LEFT operand,
1726 if (rtx_equal_p (newexp, left))
1733 fatal ("badly formed attribute value");
1738 /* Once all attributes and DEFINE_FUNCTION_UNITs have been read, we
1739 construct a number of attributes.
1741 The first produces a function `function_units_used' which is given an
1742 insn and produces an encoding showing which function units are required
1743 for the execution of that insn. If the value is non-negative, the insn
1744 uses that unit; otherwise, the value is a one's complement mask of units
1747 The second produces a function `result_ready_cost' which is used to
1748 determine the time that the result of an insn will be ready and hence
1749 a worst-case schedule.
1751 Both of these produce quite complex expressions which are then set as the
1752 default value of internal attributes. Normal attribute simplification
1753 should produce reasonable expressions.
1755 For each unit, a `<name>_unit_ready_cost' function will take an
1756 insn and give the delay until that unit will be ready with the result
1757 and a `<name>_unit_conflict_cost' function is given an insn already
1758 executing on the unit and a candidate to execute and will give the
1759 cost from the time the executing insn started until the candidate
1760 can start (ignore limitations on the number of simultaneous insns).
1762 For each unit, a `<name>_unit_blockage' function is given an insn
1763 already executing on the unit and a candidate to execute and will
1764 give the delay incurred due to function unit conflicts. The range of
1765 blockage cost values for a given executing insn is given by the
1766 `<name>_unit_blockage_range' function. These values are encoded in
1767 an int where the upper half gives the minimum value and the lower
1768 half gives the maximum value. */
1773 struct function_unit *unit, **unit_num;
1774 struct function_unit_op *op, **op_array, ***unit_ops;
1779 int i, j, u, num, nvalues;
1781 /* Rebuild the condition for the unit to share the RTL expressions.
1782 Sharing is required by simplify_by_exploding. Build the issue delay
1783 expressions. Validate the expressions we were given for the conditions
1784 and conflict vector. Then make attributes for use in the conflict
1787 for (unit = units; unit; unit = unit->next)
1789 unit->condexp = check_attr_test (unit->condexp, 0, unit->first_lineno);
1791 for (op = unit->ops; op; op = op->next)
1793 rtx issue_delay = make_numeric_value (op->issue_delay);
1794 rtx issue_exp = issue_delay;
1796 /* Build, validate, and simplify the issue delay expression. */
1797 if (op->conflict_exp != true_rtx)
1798 issue_exp = attr_rtx (IF_THEN_ELSE, op->conflict_exp,
1799 issue_exp, make_numeric_value (0));
1800 issue_exp = check_attr_value (make_canonical (NULL_ATTR,
1803 issue_exp = simplify_knowing (issue_exp, unit->condexp);
1804 op->issue_exp = issue_exp;
1806 /* Make an attribute for use in the conflict function if needed. */
1807 unit->needs_conflict_function = (unit->issue_delay.min
1808 != unit->issue_delay.max);
1809 if (unit->needs_conflict_function)
1811 str = attr_printf ((strlen (unit->name) + sizeof "*_cost_"
1813 "*%s_cost_%d", unit->name, op->num);
1814 make_internal_attr (str, issue_exp, ATTR_SPECIAL);
1817 /* Validate the condition. */
1818 op->condexp = check_attr_test (op->condexp, 0, op->lineno);
1822 /* Compute the mask of function units used. Initially, the unitsmask is
1823 zero. Set up a conditional to compute each unit's contribution. */
1824 unitsmask = make_numeric_value (0);
1825 newexp = rtx_alloc (IF_THEN_ELSE);
1826 XEXP (newexp, 2) = make_numeric_value (0);
1828 /* If we have just a few units, we may be all right expanding the whole
1829 thing. But the expansion is 2**N in space on the number of opclasses,
1830 so we can't do this for very long -- Alpha and MIPS in particular have
1831 problems with this. So in that situation, we fall back on an alternate
1832 implementation method. */
1833 #define NUM_UNITOP_CUTOFF 20
1835 if (num_unit_opclasses < NUM_UNITOP_CUTOFF)
1837 /* Merge each function unit into the unit mask attributes. */
1838 for (unit = units; unit; unit = unit->next)
1840 XEXP (newexp, 0) = unit->condexp;
1841 XEXP (newexp, 1) = make_numeric_value (1 << unit->num);
1842 unitsmask = operate_exp (OR_OP, unitsmask, newexp);
1847 /* Merge each function unit into the unit mask attributes. */
1848 for (unit = units; unit; unit = unit->next)
1850 XEXP (newexp, 0) = unit->condexp;
1851 XEXP (newexp, 1) = make_numeric_value (1 << unit->num);
1852 unitsmask = operate_exp (ORX_OP, unitsmask, attr_copy_rtx (newexp));
1856 /* Simplify the unit mask expression, encode it, and make an attribute
1857 for the function_units_used function. */
1858 unitsmask = simplify_by_exploding (unitsmask);
1860 if (num_unit_opclasses < NUM_UNITOP_CUTOFF)
1861 unitsmask = encode_units_mask (unitsmask);
1864 /* We can no longer encode unitsmask at compile time, so emit code to
1865 calculate it at runtime. Rather, put a marker for where we'd do
1866 the code, and actually output it in write_attr_get(). */
1867 unitsmask = attr_rtx (FFS, unitsmask);
1870 make_internal_attr ("*function_units_used", unitsmask,
1871 (ATTR_NEGATIVE_OK | ATTR_FUNC_UNITS));
1873 /* Create an array of ops for each unit. Add an extra unit for the
1874 result_ready_cost function that has the ops of all other units. */
1875 unit_ops = xmalloc ((num_units + 1) * sizeof (struct function_unit_op **));
1876 unit_num = xmalloc ((num_units + 1) * sizeof (struct function_unit *));
1878 unit_num[num_units] = unit = xmalloc (sizeof (struct function_unit));
1879 unit->num = num_units;
1880 unit->num_opclasses = 0;
1882 for (unit = units; unit; unit = unit->next)
1884 unit_num[num_units]->num_opclasses += unit->num_opclasses;
1885 unit_num[unit->num] = unit;
1886 unit_ops[unit->num] = op_array =
1887 xmalloc (unit->num_opclasses * sizeof (struct function_unit_op *));
1889 for (op = unit->ops; op; op = op->next)
1890 op_array[op->num] = op;
1893 /* Compose the array of ops for the extra unit. */
1894 unit_ops[num_units] = op_array =
1895 xmalloc (unit_num[num_units]->num_opclasses
1896 * sizeof (struct function_unit_op *));
1898 for (unit = units, i = 0; unit; i += unit->num_opclasses, unit = unit->next)
1899 memcpy (&op_array[i], unit_ops[unit->num],
1900 unit->num_opclasses * sizeof (struct function_unit_op *));
1902 /* Compute the ready cost function for each unit by computing the
1903 condition for each non-default value. */
1904 for (u = 0; u <= num_units; u++)
1910 op_array = unit_ops[unit->num];
1911 num = unit->num_opclasses;
1913 /* Sort the array of ops into increasing ready cost order. */
1914 for (i = 0; i < num; i++)
1915 for (j = num - 1; j > i; j--)
1916 if (op_array[j - 1]->ready < op_array[j]->ready)
1919 op_array[j] = op_array[j - 1];
1920 op_array[j - 1] = op;
1923 /* Determine how many distinct non-default ready cost values there
1924 are. We use a default ready cost value of 1. */
1925 nvalues = 0; value = 1;
1926 for (i = num - 1; i >= 0; i--)
1927 if (op_array[i]->ready > value)
1929 value = op_array[i]->ready;
1934 readycost = make_numeric_value (1);
1937 /* Construct the ready cost expression as a COND of each value from
1938 the largest to the smallest. */
1939 readycost = rtx_alloc (COND);
1940 XVEC (readycost, 0) = rtvec_alloc (nvalues * 2);
1941 XEXP (readycost, 1) = make_numeric_value (1);
1945 value = op_array[0]->ready;
1946 for (i = 0; i < num; i++)
1951 else if (op->ready == value)
1952 orexp = insert_right_side (IOR, orexp, op->condexp, -2, -2);
1955 XVECEXP (readycost, 0, nvalues * 2) = orexp;
1956 XVECEXP (readycost, 0, nvalues * 2 + 1)
1957 = make_numeric_value (value);
1960 orexp = op->condexp;
1963 XVECEXP (readycost, 0, nvalues * 2) = orexp;
1964 XVECEXP (readycost, 0, nvalues * 2 + 1) = make_numeric_value (value);
1969 rtx max_blockage = 0, min_blockage = 0;
1971 /* Simplify the readycost expression by only considering insns
1972 that use the unit. */
1973 readycost = simplify_knowing (readycost, unit->condexp);
1975 /* Determine the blockage cost the executing insn (E) given
1976 the candidate insn (C). This is the maximum of the issue
1977 delay, the pipeline delay, and the simultaneity constraint.
1978 Each function_unit_op represents the characteristics of the
1979 candidate insn, so in the expressions below, C is a known
1980 term and E is an unknown term.
1982 We compute the blockage cost for each E for every possible C.
1983 Thus OP represents E, and READYCOST is a list of values for
1986 The issue delay function for C is op->issue_exp and is used to
1987 write the `<name>_unit_conflict_cost' function. Symbolically
1988 this is "ISSUE-DELAY (E,C)".
1990 The pipeline delay results form the FIFO constraint on the
1991 function unit and is "READY-COST (E) + 1 - READY-COST (C)".
1993 The simultaneity constraint is based on how long it takes to
1994 fill the unit given the minimum issue delay. FILL-TIME is the
1995 constant "MIN (ISSUE-DELAY (*,*)) * (SIMULTANEITY - 1)", and
1996 the simultaneity constraint is "READY-COST (E) - FILL-TIME"
1997 if SIMULTANEITY is nonzero and zero otherwise.
1999 Thus, BLOCKAGE (E,C) when SIMULTANEITY is zero is
2001 MAX (ISSUE-DELAY (E,C),
2002 READY-COST (E) - (READY-COST (C) - 1))
2006 MAX (ISSUE-DELAY (E,C),
2007 READY-COST (E) - (READY-COST (C) - 1),
2008 READY-COST (E) - FILL-TIME)
2010 The `<name>_unit_blockage' function is computed by determining
2011 this value for each candidate insn. As these values are
2012 computed, we also compute the upper and lower bounds for
2013 BLOCKAGE (E,*). These are combined to form the function
2014 `<name>_unit_blockage_range'. Finally, the maximum blockage
2015 cost, MAX (BLOCKAGE (*,*)), is computed. */
2017 for (op = unit->ops; op; op = op->next)
2019 rtx blockage = op->issue_exp;
2020 blockage = simplify_knowing (blockage, unit->condexp);
2022 /* Add this op's contribution to MAX (BLOCKAGE (E,*)) and
2023 MIN (BLOCKAGE (E,*)). */
2024 if (max_blockage == 0)
2025 max_blockage = min_blockage = blockage;
2029 = simplify_knowing (operate_exp (MAX_OP, max_blockage,
2033 = simplify_knowing (operate_exp (MIN_OP, min_blockage,
2038 /* Make an attribute for use in the blockage function. */
2039 str = attr_printf ((strlen (unit->name) + sizeof "*_block_"
2041 "*%s_block_%d", unit->name, op->num);
2042 make_internal_attr (str, blockage, ATTR_SPECIAL);
2045 /* Record MAX (BLOCKAGE (*,*)). */
2048 unit->max_blockage = max_attr_value (max_blockage, &unknown);
2051 /* See if the upper and lower bounds of BLOCKAGE (E,*) are the
2052 same. If so, the blockage function carries no additional
2053 information and is not written. */
2054 newexp = operate_exp (EQ_OP, max_blockage, min_blockage);
2055 newexp = simplify_knowing (newexp, unit->condexp);
2056 unit->needs_blockage_function
2057 = (GET_CODE (newexp) != CONST_STRING
2058 || atoi (XSTR (newexp, 0)) != 1);
2060 /* If the all values of BLOCKAGE (E,C) have the same value,
2061 neither blockage function is written. */
2062 unit->needs_range_function
2063 = (unit->needs_blockage_function
2064 || GET_CODE (max_blockage) != CONST_STRING);
2066 if (unit->needs_range_function)
2068 /* Compute the blockage range function and make an attribute
2069 for writing its value. */
2070 newexp = operate_exp (RANGE_OP, min_blockage, max_blockage);
2071 newexp = simplify_knowing (newexp, unit->condexp);
2073 str = attr_printf ((strlen (unit->name)
2074 + sizeof "*_unit_blockage_range"),
2075 "*%s_unit_blockage_range", unit->name);
2076 make_internal_attr (str, newexp, (ATTR_STATIC|ATTR_BLOCKAGE|ATTR_UNSIGNED));
2079 str = attr_printf (strlen (unit->name) + sizeof "*_unit_ready_cost",
2080 "*%s_unit_ready_cost", unit->name);
2081 make_internal_attr (str, readycost, ATTR_STATIC);
2085 /* Make an attribute for the ready_cost function. Simplifying
2086 further with simplify_by_exploding doesn't win. */
2087 str = "*result_ready_cost";
2088 make_internal_attr (str, readycost, ATTR_NONE);
2092 /* For each unit that requires a conflict cost function, make an attribute
2093 that maps insns to the operation number. */
2094 for (unit = units; unit; unit = unit->next)
2098 if (! unit->needs_conflict_function
2099 && ! unit->needs_blockage_function)
2102 caseexp = rtx_alloc (COND);
2103 XVEC (caseexp, 0) = rtvec_alloc ((unit->num_opclasses - 1) * 2);
2105 for (op = unit->ops; op; op = op->next)
2107 /* Make our adjustment to the COND being computed. If we are the
2108 last operation class, place our values into the default of the
2110 if (op->num == unit->num_opclasses - 1)
2112 XEXP (caseexp, 1) = make_numeric_value (op->num);
2116 XVECEXP (caseexp, 0, op->num * 2) = op->condexp;
2117 XVECEXP (caseexp, 0, op->num * 2 + 1)
2118 = make_numeric_value (op->num);
2122 /* Simplifying caseexp with simplify_by_exploding doesn't win. */
2123 str = attr_printf (strlen (unit->name) + sizeof "*_cases",
2124 "*%s_cases", unit->name);
2125 make_internal_attr (str, caseexp, ATTR_SPECIAL);
2129 /* Simplify EXP given KNOWN_TRUE. */
2132 simplify_knowing (rtx exp, rtx known_true)
2134 if (GET_CODE (exp) != CONST_STRING)
2136 int unknown = 0, max;
2137 max = max_attr_value (exp, &unknown);
2140 exp = attr_rtx (IF_THEN_ELSE, known_true, exp,
2141 make_numeric_value (max));
2142 exp = simplify_by_exploding (exp);
2148 /* Translate the CONST_STRING expressions in X to change the encoding of
2149 value. On input, the value is a bitmask with a one bit for each unit
2150 used; on output, the value is the unit number (zero based) if one
2151 and only one unit is used or the one's complement of the bitmask. */
2154 encode_units_mask (rtx x)
2161 code = GET_CODE (x);
2166 i = atoi (XSTR (x, 0));
2168 /* The sign bit encodes a one's complement mask. */
2170 else if (i != 0 && i == (i & -i))
2171 /* Only one bit is set, so yield that unit number. */
2172 for (j = 0; (i >>= 1) != 0; j++)
2176 return attr_rtx (CONST_STRING, attr_printf (MAX_DIGITS, "%d", j));
2194 /* Compare the elements. If any pair of corresponding elements
2195 fail to match, return 0 for the whole things. */
2197 fmt = GET_RTX_FORMAT (code);
2198 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2204 for (j = 0; j < XVECLEN (x, i); j++)
2205 XVECEXP (x, i, j) = encode_units_mask (XVECEXP (x, i, j));
2209 XEXP (x, i) = encode_units_mask (XEXP (x, i));
2216 /* Once all attributes and insns have been read and checked, we construct for
2217 each attribute value a list of all the insns that have that value for
2221 fill_attr (struct attr_desc *attr)
2223 struct attr_value *av;
2224 struct insn_ent *ie;
2225 struct insn_def *id;
2229 /* Don't fill constant attributes. The value is independent of
2230 any particular insn. */
2234 for (id = defs; id; id = id->next)
2236 /* If no value is specified for this insn for this attribute, use the
2239 if (XVEC (id->def, id->vec_idx))
2240 for (i = 0; i < XVECLEN (id->def, id->vec_idx); i++)
2241 if (! strcmp (XSTR (XEXP (XVECEXP (id->def, id->vec_idx, i), 0), 0),
2243 value = XEXP (XVECEXP (id->def, id->vec_idx, i), 1);
2246 av = attr->default_val;
2248 av = get_attr_value (value, attr, id->insn_code);
2250 ie = oballoc (sizeof (struct insn_ent));
2251 ie->insn_code = id->insn_code;
2252 ie->insn_index = id->insn_code;
2253 insert_insn_ent (av, ie);
2257 /* Given an expression EXP, see if it is a COND or IF_THEN_ELSE that has a
2258 test that checks relative positions of insns (uses MATCH_DUP or PC).
2259 If so, replace it with what is obtained by passing the expression to
2260 ADDRESS_FN. If not but it is a COND or IF_THEN_ELSE, call this routine
2261 recursively on each value (including the default value). Otherwise,
2262 return the value returned by NO_ADDRESS_FN applied to EXP. */
2265 substitute_address (rtx exp, rtx (*no_address_fn) (rtx),
2266 rtx (*address_fn) (rtx))
2271 if (GET_CODE (exp) == COND)
2273 /* See if any tests use addresses. */
2275 for (i = 0; i < XVECLEN (exp, 0); i += 2)
2276 walk_attr_value (XVECEXP (exp, 0, i));
2279 return (*address_fn) (exp);
2281 /* Make a new copy of this COND, replacing each element. */
2282 newexp = rtx_alloc (COND);
2283 XVEC (newexp, 0) = rtvec_alloc (XVECLEN (exp, 0));
2284 for (i = 0; i < XVECLEN (exp, 0); i += 2)
2286 XVECEXP (newexp, 0, i) = XVECEXP (exp, 0, i);
2287 XVECEXP (newexp, 0, i + 1)
2288 = substitute_address (XVECEXP (exp, 0, i + 1),
2289 no_address_fn, address_fn);
2292 XEXP (newexp, 1) = substitute_address (XEXP (exp, 1),
2293 no_address_fn, address_fn);
2298 else if (GET_CODE (exp) == IF_THEN_ELSE)
2301 walk_attr_value (XEXP (exp, 0));
2303 return (*address_fn) (exp);
2305 return attr_rtx (IF_THEN_ELSE,
2306 substitute_address (XEXP (exp, 0),
2307 no_address_fn, address_fn),
2308 substitute_address (XEXP (exp, 1),
2309 no_address_fn, address_fn),
2310 substitute_address (XEXP (exp, 2),
2311 no_address_fn, address_fn));
2314 return (*no_address_fn) (exp);
2317 /* Make new attributes from the `length' attribute. The following are made,
2318 each corresponding to a function called from `shorten_branches' or
2321 *insn_default_length This is the length of the insn to be returned
2322 by `get_attr_length' before `shorten_branches'
2323 has been called. In each case where the length
2324 depends on relative addresses, the largest
2325 possible is used. This routine is also used
2326 to compute the initial size of the insn.
2328 *insn_variable_length_p This returns 1 if the insn's length depends
2329 on relative addresses, zero otherwise.
2331 *insn_current_length This is only called when it is known that the
2332 insn has a variable length and returns the
2333 current length, based on relative addresses.
2337 make_length_attrs (void)
2339 static const char *const new_names[] = {"*insn_default_length",
2340 "*insn_variable_length_p",
2341 "*insn_current_length"};
2342 static rtx (*const no_address_fn[]) (rtx) = {identity_fn, zero_fn, zero_fn};
2343 static rtx (*const address_fn[]) (rtx) = {max_fn, one_fn, identity_fn};
2345 struct attr_desc *length_attr, *new_attr;
2346 struct attr_value *av, *new_av;
2347 struct insn_ent *ie, *new_ie;
2349 /* See if length attribute is defined. If so, it must be numeric. Make
2350 it special so we don't output anything for it. */
2351 length_attr = find_attr ("length", 0);
2352 if (length_attr == 0)
2355 if (! length_attr->is_numeric)
2356 fatal ("length attribute must be numeric");
2358 length_attr->is_const = 0;
2359 length_attr->is_special = 1;
2361 /* Make each new attribute, in turn. */
2362 for (i = 0; i < ARRAY_SIZE (new_names); i++)
2364 make_internal_attr (new_names[i],
2365 substitute_address (length_attr->default_val->value,
2366 no_address_fn[i], address_fn[i]),
2368 new_attr = find_attr (new_names[i], 0);
2369 for (av = length_attr->first_value; av; av = av->next)
2370 for (ie = av->first_insn; ie; ie = ie->next)
2372 new_av = get_attr_value (substitute_address (av->value,
2375 new_attr, ie->insn_code);
2376 new_ie = oballoc (sizeof (struct insn_ent));
2377 new_ie->insn_code = ie->insn_code;
2378 new_ie->insn_index = ie->insn_index;
2379 insert_insn_ent (new_av, new_ie);
2384 /* Utility functions called from above routine. */
2387 identity_fn (rtx exp)
2393 zero_fn (rtx exp ATTRIBUTE_UNUSED)
2395 return make_numeric_value (0);
2399 one_fn (rtx exp ATTRIBUTE_UNUSED)
2401 return make_numeric_value (1);
2408 return make_numeric_value (max_attr_value (exp, &unknown));
2412 write_length_unit_log (void)
2414 struct attr_desc *length_attr = find_attr ("length", 0);
2415 struct attr_value *av;
2416 struct insn_ent *ie;
2417 unsigned int length_unit_log, length_or;
2420 if (length_attr == 0)
2422 length_or = or_attr_value (length_attr->default_val->value, &unknown);
2423 for (av = length_attr->first_value; av; av = av->next)
2424 for (ie = av->first_insn; ie; ie = ie->next)
2425 length_or |= or_attr_value (av->value, &unknown);
2428 length_unit_log = 0;
2431 length_or = ~length_or;
2432 for (length_unit_log = 0; length_or & 1; length_or >>= 1)
2435 printf ("int length_unit_log = %u;\n", length_unit_log);
2438 /* Take a COND expression and see if any of the conditions in it can be
2439 simplified. If any are known true or known false for the particular insn
2440 code, the COND can be further simplified.
2442 Also call ourselves on any COND operations that are values of this COND.
2444 We do not modify EXP; rather, we make and return a new rtx. */
2447 simplify_cond (rtx exp, int insn_code, int insn_index)
2450 /* We store the desired contents here,
2451 then build a new expression if they don't match EXP. */
2452 rtx defval = XEXP (exp, 1);
2453 rtx new_defval = XEXP (exp, 1);
2454 int len = XVECLEN (exp, 0);
2455 rtx *tests = xmalloc (len * sizeof (rtx));
2459 /* This lets us free all storage allocated below, if appropriate. */
2460 obstack_finish (rtl_obstack);
2462 memcpy (tests, XVEC (exp, 0)->elem, len * sizeof (rtx));
2464 /* See if default value needs simplification. */
2465 if (GET_CODE (defval) == COND)
2466 new_defval = simplify_cond (defval, insn_code, insn_index);
2468 /* Simplify the subexpressions, and see what tests we can get rid of. */
2470 for (i = 0; i < len; i += 2)
2472 rtx newtest, newval;
2474 /* Simplify this test. */
2475 newtest = simplify_test_exp_in_temp (tests[i], insn_code, insn_index);
2478 newval = tests[i + 1];
2479 /* See if this value may need simplification. */
2480 if (GET_CODE (newval) == COND)
2481 newval = simplify_cond (newval, insn_code, insn_index);
2483 /* Look for ways to delete or combine this test. */
2484 if (newtest == true_rtx)
2486 /* If test is true, make this value the default
2487 and discard this + any following tests. */
2489 defval = tests[i + 1];
2490 new_defval = newval;
2493 else if (newtest == false_rtx)
2495 /* If test is false, discard it and its value. */
2496 for (j = i; j < len - 2; j++)
2497 tests[j] = tests[j + 2];
2501 else if (i > 0 && attr_equal_p (newval, tests[i - 1]))
2503 /* If this value and the value for the prev test are the same,
2507 = insert_right_side (IOR, tests[i - 2], newtest,
2508 insn_code, insn_index);
2510 /* Delete this test/value. */
2511 for (j = i; j < len - 2; j++)
2512 tests[j] = tests[j + 2];
2517 tests[i + 1] = newval;
2520 /* If the last test in a COND has the same value
2521 as the default value, that test isn't needed. */
2523 while (len > 0 && attr_equal_p (tests[len - 1], new_defval))
2526 /* See if we changed anything. */
2527 if (len != XVECLEN (exp, 0) || new_defval != XEXP (exp, 1))
2530 for (i = 0; i < len; i++)
2531 if (! attr_equal_p (tests[i], XVECEXP (exp, 0, i)))
2539 if (GET_CODE (defval) == COND)
2540 ret = simplify_cond (defval, insn_code, insn_index);
2548 rtx newexp = rtx_alloc (COND);
2550 XVEC (newexp, 0) = rtvec_alloc (len);
2551 memcpy (XVEC (newexp, 0)->elem, tests, len * sizeof (rtx));
2552 XEXP (newexp, 1) = new_defval;
2559 /* Remove an insn entry from an attribute value. */
2562 remove_insn_ent (struct attr_value *av, struct insn_ent *ie)
2564 struct insn_ent *previe;
2566 if (av->first_insn == ie)
2567 av->first_insn = ie->next;
2570 for (previe = av->first_insn; previe->next != ie; previe = previe->next)
2572 previe->next = ie->next;
2576 if (ie->insn_code == -1)
2577 av->has_asm_insn = 0;
2582 /* Insert an insn entry in an attribute value list. */
2585 insert_insn_ent (struct attr_value *av, struct insn_ent *ie)
2587 ie->next = av->first_insn;
2588 av->first_insn = ie;
2590 if (ie->insn_code == -1)
2591 av->has_asm_insn = 1;
2596 /* This is a utility routine to take an expression that is a tree of either
2597 AND or IOR expressions and insert a new term. The new term will be
2598 inserted at the right side of the first node whose code does not match
2599 the root. A new node will be created with the root's code. Its left
2600 side will be the old right side and its right side will be the new
2603 If the `term' is itself a tree, all its leaves will be inserted. */
2606 insert_right_side (enum rtx_code code, rtx exp, rtx term, int insn_code, int insn_index)
2610 /* Avoid consing in some special cases. */
2611 if (code == AND && term == true_rtx)
2613 if (code == AND && term == false_rtx)
2615 if (code == AND && exp == true_rtx)
2617 if (code == AND && exp == false_rtx)
2619 if (code == IOR && term == true_rtx)
2621 if (code == IOR && term == false_rtx)
2623 if (code == IOR && exp == true_rtx)
2625 if (code == IOR && exp == false_rtx)
2627 if (attr_equal_p (exp, term))
2630 if (GET_CODE (term) == code)
2632 exp = insert_right_side (code, exp, XEXP (term, 0),
2633 insn_code, insn_index);
2634 exp = insert_right_side (code, exp, XEXP (term, 1),
2635 insn_code, insn_index);
2640 if (GET_CODE (exp) == code)
2642 rtx new = insert_right_side (code, XEXP (exp, 1),
2643 term, insn_code, insn_index);
2644 if (new != XEXP (exp, 1))
2645 /* Make a copy of this expression and call recursively. */
2646 newexp = attr_rtx (code, XEXP (exp, 0), new);
2652 /* Insert the new term. */
2653 newexp = attr_rtx (code, exp, term);
2656 return simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2659 /* If we have an expression which AND's a bunch of
2660 (not (eq_attrq "alternative" "n"))
2661 terms, we may have covered all or all but one of the possible alternatives.
2662 If so, we can optimize. Similarly for IOR's of EQ_ATTR.
2664 This routine is passed an expression and either AND or IOR. It returns a
2665 bitmask indicating which alternatives are mentioned within EXP. */
2668 compute_alternative_mask (rtx exp, enum rtx_code code)
2671 if (GET_CODE (exp) == code)
2672 return compute_alternative_mask (XEXP (exp, 0), code)
2673 | compute_alternative_mask (XEXP (exp, 1), code);
2675 else if (code == AND && GET_CODE (exp) == NOT
2676 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
2677 && XSTR (XEXP (exp, 0), 0) == alternative_name)
2678 string = XSTR (XEXP (exp, 0), 1);
2680 else if (code == IOR && GET_CODE (exp) == EQ_ATTR
2681 && XSTR (exp, 0) == alternative_name)
2682 string = XSTR (exp, 1);
2688 return 1 << (string[0] - '0');
2689 return 1 << atoi (string);
2692 /* Given I, a single-bit mask, return RTX to compare the `alternative'
2693 attribute with the value represented by that bit. */
2696 make_alternative_compare (int mask)
2702 for (i = 0; (mask & (1 << i)) == 0; i++)
2705 newexp = attr_rtx (EQ_ATTR, alternative_name, attr_numeral (i));
2706 ATTR_IND_SIMPLIFIED_P (newexp) = 1;
2711 /* If we are processing an (eq_attr "attr" "value") test, we find the value
2712 of "attr" for this insn code. From that value, we can compute a test
2713 showing when the EQ_ATTR will be true. This routine performs that
2714 computation. If a test condition involves an address, we leave the EQ_ATTR
2715 intact because addresses are only valid for the `length' attribute.
2717 EXP is the EQ_ATTR expression and VALUE is the value of that attribute
2718 for the insn corresponding to INSN_CODE and INSN_INDEX. */
2721 evaluate_eq_attr (rtx exp, rtx value, int insn_code, int insn_index)
2728 if (GET_CODE (value) == CONST_STRING)
2730 if (! strcmp (XSTR (value, 0), XSTR (exp, 1)))
2735 else if (GET_CODE (value) == SYMBOL_REF)
2740 if (GET_CODE (exp) != EQ_ATTR)
2743 if (strlen (XSTR (exp, 0)) + strlen (XSTR (exp, 1)) + 2 > 256)
2746 strcpy (string, XSTR (exp, 0));
2747 strcat (string, "_");
2748 strcat (string, XSTR (exp, 1));
2749 for (p = string; *p; p++)
2752 newexp = attr_rtx (EQ, value,
2753 attr_rtx (SYMBOL_REF,
2754 attr_string (string, strlen (string))));
2756 else if (GET_CODE (value) == COND)
2758 /* We construct an IOR of all the cases for which the requested attribute
2759 value is present. Since we start with FALSE, if it is not present,
2760 FALSE will be returned.
2762 Each case is the AND of the NOT's of the previous conditions with the
2763 current condition; in the default case the current condition is TRUE.
2765 For each possible COND value, call ourselves recursively.
2767 The extra TRUE and FALSE expressions will be eliminated by another
2768 call to the simplification routine. */
2773 if (current_alternative_string)
2774 clear_struct_flag (value);
2776 for (i = 0; i < XVECLEN (value, 0); i += 2)
2778 rtx this = simplify_test_exp_in_temp (XVECEXP (value, 0, i),
2779 insn_code, insn_index);
2781 SIMPLIFY_ALTERNATIVE (this);
2783 right = insert_right_side (AND, andexp, this,
2784 insn_code, insn_index);
2785 right = insert_right_side (AND, right,
2786 evaluate_eq_attr (exp,
2789 insn_code, insn_index),
2790 insn_code, insn_index);
2791 orexp = insert_right_side (IOR, orexp, right,
2792 insn_code, insn_index);
2794 /* Add this condition into the AND expression. */
2795 newexp = attr_rtx (NOT, this);
2796 andexp = insert_right_side (AND, andexp, newexp,
2797 insn_code, insn_index);
2800 /* Handle the default case. */
2801 right = insert_right_side (AND, andexp,
2802 evaluate_eq_attr (exp, XEXP (value, 1),
2803 insn_code, insn_index),
2804 insn_code, insn_index);
2805 newexp = insert_right_side (IOR, orexp, right, insn_code, insn_index);
2810 /* If uses an address, must return original expression. But set the
2811 ATTR_IND_SIMPLIFIED_P bit so we don't try to simplify it again. */
2814 walk_attr_value (newexp);
2818 /* This had `&& current_alternative_string', which seems to be wrong. */
2819 if (! ATTR_IND_SIMPLIFIED_P (exp))
2820 return copy_rtx_unchanging (exp);
2827 /* This routine is called when an AND of a term with a tree of AND's is
2828 encountered. If the term or its complement is present in the tree, it
2829 can be replaced with TRUE or FALSE, respectively.
2831 Note that (eq_attr "att" "v1") and (eq_attr "att" "v2") cannot both
2832 be true and hence are complementary.
2834 There is one special case: If we see
2835 (and (not (eq_attr "att" "v1"))
2836 (eq_attr "att" "v2"))
2837 this can be replaced by (eq_attr "att" "v2"). To do this we need to
2838 replace the term, not anything in the AND tree. So we pass a pointer to
2842 simplify_and_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2847 int left_eliminates_term, right_eliminates_term;
2849 if (GET_CODE (exp) == AND)
2851 left = simplify_and_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2852 right = simplify_and_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2853 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2855 newexp = attr_rtx (GET_CODE (exp), left, right);
2857 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2861 else if (GET_CODE (exp) == IOR)
2863 /* For the IOR case, we do the same as above, except that we can
2864 only eliminate `term' if both sides of the IOR would do so. */
2866 left = simplify_and_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2867 left_eliminates_term = (temp == true_rtx);
2870 right = simplify_and_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2871 right_eliminates_term = (temp == true_rtx);
2873 if (left_eliminates_term && right_eliminates_term)
2876 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2878 newexp = attr_rtx (GET_CODE (exp), left, right);
2880 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2884 /* Check for simplifications. Do some extra checking here since this
2885 routine is called so many times. */
2890 else if (GET_CODE (exp) == NOT && XEXP (exp, 0) == *pterm)
2893 else if (GET_CODE (*pterm) == NOT && exp == XEXP (*pterm, 0))
2896 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == EQ_ATTR)
2898 if (XSTR (exp, 0) != XSTR (*pterm, 0))
2901 if (! strcmp (XSTR (exp, 1), XSTR (*pterm, 1)))
2907 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
2908 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR)
2910 if (XSTR (*pterm, 0) != XSTR (XEXP (exp, 0), 0))
2913 if (! strcmp (XSTR (*pterm, 1), XSTR (XEXP (exp, 0), 1)))
2919 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
2920 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR)
2922 if (XSTR (exp, 0) != XSTR (XEXP (*pterm, 0), 0))
2925 if (! strcmp (XSTR (exp, 1), XSTR (XEXP (*pterm, 0), 1)))
2931 else if (GET_CODE (exp) == NOT && GET_CODE (*pterm) == NOT)
2933 if (attr_equal_p (XEXP (exp, 0), XEXP (*pterm, 0)))
2937 else if (GET_CODE (exp) == NOT)
2939 if (attr_equal_p (XEXP (exp, 0), *pterm))
2943 else if (GET_CODE (*pterm) == NOT)
2945 if (attr_equal_p (XEXP (*pterm, 0), exp))
2949 else if (attr_equal_p (exp, *pterm))
2955 /* Similar to `simplify_and_tree', but for IOR trees. */
2958 simplify_or_tree (rtx exp, rtx *pterm, int insn_code, int insn_index)
2963 int left_eliminates_term, right_eliminates_term;
2965 if (GET_CODE (exp) == IOR)
2967 left = simplify_or_tree (XEXP (exp, 0), pterm, insn_code, insn_index);
2968 right = simplify_or_tree (XEXP (exp, 1), pterm, insn_code, insn_index);
2969 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2971 newexp = attr_rtx (GET_CODE (exp), left, right);
2973 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
2977 else if (GET_CODE (exp) == AND)
2979 /* For the AND case, we do the same as above, except that we can
2980 only eliminate `term' if both sides of the AND would do so. */
2982 left = simplify_or_tree (XEXP (exp, 0), &temp, insn_code, insn_index);
2983 left_eliminates_term = (temp == false_rtx);
2986 right = simplify_or_tree (XEXP (exp, 1), &temp, insn_code, insn_index);
2987 right_eliminates_term = (temp == false_rtx);
2989 if (left_eliminates_term && right_eliminates_term)
2992 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
2994 newexp = attr_rtx (GET_CODE (exp), left, right);
2996 exp = simplify_test_exp_in_temp (newexp, insn_code, insn_index);
3000 if (attr_equal_p (exp, *pterm))
3003 else if (GET_CODE (exp) == NOT && attr_equal_p (XEXP (exp, 0), *pterm))
3006 else if (GET_CODE (*pterm) == NOT && attr_equal_p (XEXP (*pterm, 0), exp))
3009 else if (GET_CODE (*pterm) == EQ_ATTR && GET_CODE (exp) == NOT
3010 && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
3011 && XSTR (*pterm, 0) == XSTR (XEXP (exp, 0), 0))
3014 else if (GET_CODE (exp) == EQ_ATTR && GET_CODE (*pterm) == NOT
3015 && GET_CODE (XEXP (*pterm, 0)) == EQ_ATTR
3016 && XSTR (exp, 0) == XSTR (XEXP (*pterm, 0), 0))
3022 /* Compute approximate cost of the expression. Used to decide whether
3023 expression is cheap enough for inline. */
3025 attr_rtx_cost (rtx x)
3031 code = GET_CODE (x);
3040 /* Alternatives don't result into function call. */
3041 if (!strcmp (XSTR (x, 0), "alternative"))
3048 const char *fmt = GET_RTX_FORMAT (code);
3049 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3055 for (j = 0; j < XVECLEN (x, i); j++)
3056 cost += attr_rtx_cost (XVECEXP (x, i, j));
3059 cost += attr_rtx_cost (XEXP (x, i));
3069 /* Simplify test expression and use temporary obstack in order to avoid
3070 memory bloat. Use ATTR_IND_SIMPLIFIED to avoid unnecessary simplifications
3071 and avoid unnecessary copying if possible. */
3074 simplify_test_exp_in_temp (rtx exp, int insn_code, int insn_index)
3077 struct obstack *old;
3078 if (ATTR_IND_SIMPLIFIED_P (exp))
3081 rtl_obstack = temp_obstack;
3082 x = simplify_test_exp (exp, insn_code, insn_index);
3084 if (x == exp || rtl_obstack == temp_obstack)
3086 return attr_copy_rtx (x);
3089 /* Given an expression, see if it can be simplified for a particular insn
3090 code based on the values of other attributes being tested. This can
3091 eliminate nested get_attr_... calls.
3093 Note that if an endless recursion is specified in the patterns, the
3094 optimization will loop. However, it will do so in precisely the cases where
3095 an infinite recursion loop could occur during compilation. It's better that
3099 simplify_test_exp (rtx exp, int insn_code, int insn_index)
3102 struct attr_desc *attr;
3103 struct attr_value *av;
3104 struct insn_ent *ie;
3108 /* Don't re-simplify something we already simplified. */
3109 if (ATTR_IND_SIMPLIFIED_P (exp) || ATTR_CURR_SIMPLIFIED_P (exp))
3112 switch (GET_CODE (exp))
3115 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
3116 SIMPLIFY_ALTERNATIVE (left);
3117 if (left == false_rtx)
3119 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
3120 SIMPLIFY_ALTERNATIVE (right);
3121 if (left == false_rtx)
3124 /* If either side is an IOR and we have (eq_attr "alternative" ..")
3125 present on both sides, apply the distributive law since this will
3126 yield simplifications. */
3127 if ((GET_CODE (left) == IOR || GET_CODE (right) == IOR)
3128 && compute_alternative_mask (left, IOR)
3129 && compute_alternative_mask (right, IOR))
3131 if (GET_CODE (left) == IOR)
3138 newexp = attr_rtx (IOR,
3139 attr_rtx (AND, left, XEXP (right, 0)),
3140 attr_rtx (AND, left, XEXP (right, 1)));
3142 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3145 /* Try with the term on both sides. */
3146 right = simplify_and_tree (right, &left, insn_code, insn_index);
3147 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
3148 left = simplify_and_tree (left, &right, insn_code, insn_index);
3150 if (left == false_rtx || right == false_rtx)
3152 else if (left == true_rtx)
3156 else if (right == true_rtx)
3160 /* See if all or all but one of the insn's alternatives are specified
3161 in this tree. Optimize if so. */
3163 else if (insn_code >= 0
3164 && (GET_CODE (left) == AND
3165 || (GET_CODE (left) == NOT
3166 && GET_CODE (XEXP (left, 0)) == EQ_ATTR
3167 && XSTR (XEXP (left, 0), 0) == alternative_name)
3168 || GET_CODE (right) == AND
3169 || (GET_CODE (right) == NOT
3170 && GET_CODE (XEXP (right, 0)) == EQ_ATTR
3171 && XSTR (XEXP (right, 0), 0) == alternative_name)))
3173 i = compute_alternative_mask (exp, AND);
3174 if (i & ~insn_alternatives[insn_code])
3175 fatal ("invalid alternative specified for pattern number %d",
3178 /* If all alternatives are excluded, this is false. */
3179 i ^= insn_alternatives[insn_code];
3182 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
3184 /* If just one excluded, AND a comparison with that one to the
3185 front of the tree. The others will be eliminated by
3186 optimization. We do not want to do this if the insn has one
3187 alternative and we have tested none of them! */
3188 left = make_alternative_compare (i);
3189 right = simplify_and_tree (exp, &left, insn_code, insn_index);
3190 newexp = attr_rtx (AND, left, right);
3192 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3196 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
3198 newexp = attr_rtx (AND, left, right);
3199 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3204 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
3205 SIMPLIFY_ALTERNATIVE (left);
3206 if (left == true_rtx)
3208 right = SIMPLIFY_TEST_EXP (XEXP (exp, 1), insn_code, insn_index);
3209 SIMPLIFY_ALTERNATIVE (right);
3210 if (right == true_rtx)
3213 right = simplify_or_tree (right, &left, insn_code, insn_index);
3214 if (left == XEXP (exp, 0) && right == XEXP (exp, 1))
3215 left = simplify_or_tree (left, &right, insn_code, insn_index);
3217 if (right == true_rtx || left == true_rtx)
3219 else if (left == false_rtx)
3223 else if (right == false_rtx)
3228 /* Test for simple cases where the distributive law is useful. I.e.,
3229 convert (ior (and (x) (y))
3235 else if (GET_CODE (left) == AND && GET_CODE (right) == AND
3236 && attr_equal_p (XEXP (left, 0), XEXP (right, 0)))
3238 newexp = attr_rtx (IOR, XEXP (left, 1), XEXP (right, 1));
3240 left = XEXP (left, 0);
3242 newexp = attr_rtx (AND, left, right);
3243 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3246 /* See if all or all but one of the insn's alternatives are specified
3247 in this tree. Optimize if so. */
3249 else if (insn_code >= 0
3250 && (GET_CODE (left) == IOR
3251 || (GET_CODE (left) == EQ_ATTR
3252 && XSTR (left, 0) == alternative_name)
3253 || GET_CODE (right) == IOR
3254 || (GET_CODE (right) == EQ_ATTR
3255 && XSTR (right, 0) == alternative_name)))
3257 i = compute_alternative_mask (exp, IOR);
3258 if (i & ~insn_alternatives[insn_code])
3259 fatal ("invalid alternative specified for pattern number %d",
3262 /* If all alternatives are included, this is true. */
3263 i ^= insn_alternatives[insn_code];
3266 else if ((i & (i - 1)) == 0 && insn_alternatives[insn_code] > 1)
3268 /* If just one excluded, IOR a comparison with that one to the
3269 front of the tree. The others will be eliminated by
3270 optimization. We do not want to do this if the insn has one
3271 alternative and we have tested none of them! */
3272 left = make_alternative_compare (i);
3273 right = simplify_and_tree (exp, &left, insn_code, insn_index);
3274 newexp = attr_rtx (IOR, attr_rtx (NOT, left), right);
3276 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3280 if (left != XEXP (exp, 0) || right != XEXP (exp, 1))
3282 newexp = attr_rtx (IOR, left, right);
3283 return SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3288 if (GET_CODE (XEXP (exp, 0)) == NOT)
3290 left = SIMPLIFY_TEST_EXP (XEXP (XEXP (exp, 0), 0),
3291 insn_code, insn_index);
3292 SIMPLIFY_ALTERNATIVE (left);
3296 left = SIMPLIFY_TEST_EXP (XEXP (exp, 0), insn_code, insn_index);
3297 SIMPLIFY_ALTERNATIVE (left);
3298 if (GET_CODE (left) == NOT)
3299 return XEXP (left, 0);
3301 if (left == false_rtx)
3303 else if (left == true_rtx)
3306 /* Try to apply De`Morgan's laws. */
3307 else if (GET_CODE (left) == IOR)
3309 newexp = attr_rtx (AND,
3310 attr_rtx (NOT, XEXP (left, 0)),
3311 attr_rtx (NOT, XEXP (left, 1)));
3313 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3315 else if (GET_CODE (left) == AND)
3317 newexp = attr_rtx (IOR,
3318 attr_rtx (NOT, XEXP (left, 0)),
3319 attr_rtx (NOT, XEXP (left, 1)));
3321 newexp = SIMPLIFY_TEST_EXP (newexp, insn_code, insn_index);
3323 else if (left != XEXP (exp, 0))
3325 newexp = attr_rtx (NOT, left);
3330 if (current_alternative_string && XSTR (exp, 0) == alternative_name)
3331 return (XSTR (exp, 1) == current_alternative_string
3332 ? true_rtx : false_rtx);
3334 /* Look at the value for this insn code in the specified attribute.
3335 We normally can replace this comparison with the condition that
3336 would give this insn the values being tested for. */
3337 if (XSTR (exp, 0) != alternative_name
3338 && (attr = find_attr (XSTR (exp, 0), 0)) != NULL)
3339 for (av = attr->first_value; av; av = av->next)
3340 for (ie = av->first_insn; ie; ie = ie->next)
3341 if (ie->insn_code == insn_code)
3344 x = evaluate_eq_attr (exp, av->value, insn_code, insn_index);
3345 x = SIMPLIFY_TEST_EXP (x, insn_code, insn_index);
3346 if (attr_rtx_cost(x) < 20)
3355 /* We have already simplified this expression. Simplifying it again
3356 won't buy anything unless we weren't given a valid insn code
3357 to process (i.e., we are canonicalizing something.). */
3358 if (insn_code != -2 /* Seems wrong: && current_alternative_string. */
3359 && ! ATTR_IND_SIMPLIFIED_P (newexp))
3360 return copy_rtx_unchanging (newexp);
3365 /* Optimize the attribute lists by seeing if we can determine conditional
3366 values from the known values of other attributes. This will save subroutine
3367 calls during the compilation. */
3370 optimize_attrs (void)
3372 struct attr_desc *attr;
3373 struct attr_value *av;
3374 struct insn_ent *ie;
3377 struct attr_value_list
3379 struct attr_value *av;
3380 struct insn_ent *ie;
3381 struct attr_desc *attr;
3382 struct attr_value_list *next;
3384 struct attr_value_list **insn_code_values;
3385 struct attr_value_list *ivbuf;
3386 struct attr_value_list *iv;
3388 /* For each insn code, make a list of all the insn_ent's for it,
3389 for all values for all attributes. */
3391 if (num_insn_ents == 0)
3394 /* Make 2 extra elements, for "code" values -2 and -1. */
3395 insn_code_values = xcalloc ((insn_code_number + 2),
3396 sizeof (struct attr_value_list *));
3398 /* Offset the table address so we can index by -2 or -1. */
3399 insn_code_values += 2;
3401 iv = ivbuf = xmalloc (num_insn_ents * sizeof (struct attr_value_list));
3403 for (i = 0; i < MAX_ATTRS_INDEX; i++)
3404 for (attr = attrs[i]; attr; attr = attr->next)
3405 for (av = attr->first_value; av; av = av->next)
3406 for (ie = av->first_insn; ie; ie = ie->next)
3411 iv->next = insn_code_values[ie->insn_code];
3412 insn_code_values[ie->insn_code] = iv;
3416 /* Sanity check on num_insn_ents. */
3417 if (iv != ivbuf + num_insn_ents)
3420 /* Process one insn code at a time. */
3421 for (i = -2; i < insn_code_number; i++)
3423 /* Clear the ATTR_CURR_SIMPLIFIED_P flag everywhere relevant.
3424 We use it to mean "already simplified for this insn". */
3425 for (iv = insn_code_values[i]; iv; iv = iv->next)
3426 clear_struct_flag (iv->av->value);
3428 for (iv = insn_code_values[i]; iv; iv = iv->next)
3430 struct obstack *old = rtl_obstack;
3435 if (GET_CODE (av->value) != COND)
3438 rtl_obstack = temp_obstack;
3440 while (GET_CODE (newexp) == COND)
3442 rtx newexp2 = simplify_cond (newexp, ie->insn_code,
3444 if (newexp2 == newexp)
3450 if (newexp != av->value)
3452 newexp = attr_copy_rtx (newexp);
3453 remove_insn_ent (av, ie);
3454 av = get_attr_value (newexp, attr, ie->insn_code);
3456 insert_insn_ent (av, ie);
3462 free (insn_code_values - 2);
3465 /* If EXP is a suitable expression, reorganize it by constructing an
3466 equivalent expression that is a COND with the tests being all combinations
3467 of attribute values and the values being simple constants. */
3470 simplify_by_exploding (rtx exp)
3472 rtx list = 0, link, condexp, defval = NULL_RTX;
3473 struct dimension *space;
3474 rtx *condtest, *condval;
3475 int i, j, total, ndim = 0;
3476 int most_tests, num_marks, new_marks;
3479 /* Locate all the EQ_ATTR expressions. */
3480 if (! find_and_mark_used_attributes (exp, &list, &ndim) || ndim == 0)
3482 unmark_used_attributes (list, 0, 0);
3486 /* Create an attribute space from the list of used attributes. For each
3487 dimension in the attribute space, record the attribute, list of values
3488 used, and number of values used. Add members to the list of values to
3489 cover the domain of the attribute. This makes the expanded COND form
3490 order independent. */
3492 space = xmalloc (ndim * sizeof (struct dimension));
3495 for (ndim = 0; list; ndim++)
3497 /* Pull the first attribute value from the list and record that
3498 attribute as another dimension in the attribute space. */
3499 const char *name = XSTR (XEXP (list, 0), 0);
3502 if ((space[ndim].attr = find_attr (name, 0)) == 0
3503 || space[ndim].attr->is_numeric)
3505 unmark_used_attributes (list, space, ndim);
3509 /* Add all remaining attribute values that refer to this attribute. */
3510 space[ndim].num_values = 0;
3511 space[ndim].values = 0;
3513 for (link = list; link; link = *prev)
3514 if (! strcmp (XSTR (XEXP (link, 0), 0), name))
3516 space[ndim].num_values++;
3517 *prev = XEXP (link, 1);
3518 XEXP (link, 1) = space[ndim].values;
3519 space[ndim].values = link;
3522 prev = &XEXP (link, 1);
3524 /* Add sufficient members to the list of values to make the list
3525 mutually exclusive and record the total size of the attribute
3527 total *= add_values_to_cover (&space[ndim]);
3530 /* Sort the attribute space so that the attributes go from non-constant
3531 to constant and from most values to least values. */
3532 for (i = 0; i < ndim; i++)
3533 for (j = ndim - 1; j > i; j--)
3534 if ((space[j-1].attr->is_const && !space[j].attr->is_const)
3535 || space[j-1].num_values < space[j].num_values)
3537 struct dimension tmp;
3539 space[j] = space[j - 1];
3543 /* Establish the initial current value. */
3544 for (i = 0; i < ndim; i++)
3545 space[i].current_value = space[i].values;
3547 condtest = xmalloc (total * sizeof (rtx));
3548 condval = xmalloc (total * sizeof (rtx));
3550 /* Expand the tests and values by iterating over all values in the
3554 condtest[i] = test_for_current_value (space, ndim);
3555 condval[i] = simplify_with_current_value (exp, space, ndim);
3556 if (! increment_current_value (space, ndim))
3562 /* We are now finished with the original expression. */
3563 unmark_used_attributes (0, space, ndim);
3566 /* Find the most used constant value and make that the default. */
3568 for (i = num_marks = 0; i < total; i++)
3569 if (GET_CODE (condval[i]) == CONST_STRING
3570 && ! ATTR_EQ_ATTR_P (condval[i]))
3572 /* Mark the unmarked constant value and count how many are marked. */
3573 ATTR_EQ_ATTR_P (condval[i]) = 1;
3574 for (j = new_marks = 0; j < total; j++)
3575 if (GET_CODE (condval[j]) == CONST_STRING
3576 && ATTR_EQ_ATTR_P (condval[j]))
3578 if (new_marks - num_marks > most_tests)
3580 most_tests = new_marks - num_marks;
3581 defval = condval[i];
3583 num_marks = new_marks;
3585 /* Clear all the marks. */
3586 for (i = 0; i < total; i++)
3587 ATTR_EQ_ATTR_P (condval[i]) = 0;
3589 /* Give up if nothing is constant. */
3593 /* If all values are the default, use that. */
3594 else if (total == most_tests)
3597 /* Make a COND with the most common constant value the default. (A more
3598 complex method where tests with the same value were combined didn't
3599 seem to improve things.) */
3602 condexp = rtx_alloc (COND);
3603 XVEC (condexp, 0) = rtvec_alloc ((total - most_tests) * 2);
3604 XEXP (condexp, 1) = defval;
3605 for (i = j = 0; i < total; i++)
3606 if (condval[i] != defval)
3608 XVECEXP (condexp, 0, 2 * j) = condtest[i];
3609 XVECEXP (condexp, 0, 2 * j + 1) = condval[i];
3619 /* Set the ATTR_EQ_ATTR_P flag for all EQ_ATTR expressions in EXP and
3620 verify that EXP can be simplified to a constant term if all the EQ_ATTR
3621 tests have known value. */
3624 find_and_mark_used_attributes (rtx exp, rtx *terms, int *nterms)
3628 switch (GET_CODE (exp))
3631 if (! ATTR_EQ_ATTR_P (exp))
3633 rtx link = rtx_alloc (EXPR_LIST);
3634 XEXP (link, 0) = exp;
3635 XEXP (link, 1) = *terms;
3638 ATTR_EQ_ATTR_P (exp) = 1;
3647 if (! find_and_mark_used_attributes (XEXP (exp, 2), terms, nterms))
3651 if (! find_and_mark_used_attributes (XEXP (exp, 1), terms, nterms))
3654 if (! find_and_mark_used_attributes (XEXP (exp, 0), terms, nterms))
3659 for (i = 0; i < XVECLEN (exp, 0); i++)
3660 if (! find_and_mark_used_attributes (XVECEXP (exp, 0, i), terms, nterms))
3662 if (! find_and_mark_used_attributes (XEXP (exp, 1), terms, nterms))
3671 /* Clear the ATTR_EQ_ATTR_P flag in all EQ_ATTR expressions on LIST and
3672 in the values of the NDIM-dimensional attribute space SPACE. */
3675 unmark_used_attributes (rtx list, struct dimension *space, int ndim)
3680 for (i = 0; i < ndim; i++)
3681 unmark_used_attributes (space[i].values, 0, 0);
3683 for (link = list; link; link = XEXP (link, 1))
3685 exp = XEXP (link, 0);
3686 if (GET_CODE (exp) == EQ_ATTR)
3687 ATTR_EQ_ATTR_P (exp) = 0;
3691 /* Update the attribute dimension DIM so that all values of the attribute
3692 are tested. Return the updated number of values. */
3695 add_values_to_cover (struct dimension *dim)
3697 struct attr_value *av;
3698 rtx exp, link, *prev;
3701 for (av = dim->attr->first_value; av; av = av->next)
3702 if (GET_CODE (av->value) == CONST_STRING)
3705 if (nalt < dim->num_values)
3707 else if (nalt == dim->num_values)
3710 else if (nalt * 2 < dim->num_values * 3)
3712 /* Most all the values of the attribute are used, so add all the unused
3714 prev = &dim->values;
3715 for (link = dim->values; link; link = *prev)
3716 prev = &XEXP (link, 1);
3718 for (av = dim->attr->first_value; av; av = av->next)
3719 if (GET_CODE (av->value) == CONST_STRING)
3721 exp = attr_eq (dim->attr->name, XSTR (av->value, 0));
3722 if (ATTR_EQ_ATTR_P (exp))
3725 link = rtx_alloc (EXPR_LIST);
3726 XEXP (link, 0) = exp;
3729 prev = &XEXP (link, 1);
3731 dim->num_values = nalt;
3735 rtx orexp = false_rtx;
3737 /* Very few values are used, so compute a mutually exclusive
3738 expression. (We could do this for numeric values if that becomes
3740 prev = &dim->values;
3741 for (link = dim->values; link; link = *prev)
3743 orexp = insert_right_side (IOR, orexp, XEXP (link, 0), -2, -2);
3744 prev = &XEXP (link, 1);
3746 link = rtx_alloc (EXPR_LIST);
3747 XEXP (link, 0) = attr_rtx (NOT, orexp);
3752 return dim->num_values;
3755 /* Increment the current value for the NDIM-dimensional attribute space SPACE
3756 and return FALSE if the increment overflowed. */
3759 increment_current_value (struct dimension *space, int ndim)
3763 for (i = ndim - 1; i >= 0; i--)
3765 if ((space[i].current_value = XEXP (space[i].current_value, 1)) == 0)
3766 space[i].current_value = space[i].values;
3773 /* Construct an expression corresponding to the current value for the
3774 NDIM-dimensional attribute space SPACE. */
3777 test_for_current_value (struct dimension *space, int ndim)
3782 for (i = 0; i < ndim; i++)
3783 exp = insert_right_side (AND, exp, XEXP (space[i].current_value, 0),
3789 /* Given the current value of the NDIM-dimensional attribute space SPACE,
3790 set the corresponding EQ_ATTR expressions to that value and reduce
3791 the expression EXP as much as possible. On input [and output], all
3792 known EQ_ATTR expressions are set to FALSE. */
3795 simplify_with_current_value (rtx exp, struct dimension *space, int ndim)
3800 /* Mark each current value as TRUE. */
3801 for (i = 0; i < ndim; i++)
3803 x = XEXP (space[i].current_value, 0);
3804 if (GET_CODE (x) == EQ_ATTR)
3805 ATTR_EQ_ATTR_P (x) = 0;
3808 exp = simplify_with_current_value_aux (exp);
3810 /* Change each current value back to FALSE. */
3811 for (i = 0; i < ndim; i++)
3813 x = XEXP (space[i].current_value, 0);
3814 if (GET_CODE (x) == EQ_ATTR)
3815 ATTR_EQ_ATTR_P (x) = 1;
3821 /* Reduce the expression EXP based on the ATTR_EQ_ATTR_P settings of
3822 all EQ_ATTR expressions. */
3825 simplify_with_current_value_aux (rtx exp)
3830 switch (GET_CODE (exp))
3833 if (ATTR_EQ_ATTR_P (exp))
3842 cond = simplify_with_current_value_aux (XEXP (exp, 0));
3843 if (cond == true_rtx)
3844 return simplify_with_current_value_aux (XEXP (exp, 1));
3845 else if (cond == false_rtx)
3846 return simplify_with_current_value_aux (XEXP (exp, 2));
3848 return attr_rtx (IF_THEN_ELSE, cond,
3849 simplify_with_current_value_aux (XEXP (exp, 1)),
3850 simplify_with_current_value_aux (XEXP (exp, 2)));
3853 cond = simplify_with_current_value_aux (XEXP (exp, 1));
3854 if (cond == true_rtx)
3856 else if (cond == false_rtx)
3857 return simplify_with_current_value_aux (XEXP (exp, 0));
3859 return attr_rtx (IOR, cond,
3860 simplify_with_current_value_aux (XEXP (exp, 0)));
3863 cond = simplify_with_current_value_aux (XEXP (exp, 1));
3864 if (cond == true_rtx)
3865 return simplify_with_current_value_aux (XEXP (exp, 0));
3866 else if (cond == false_rtx)
3869 return attr_rtx (AND, cond,
3870 simplify_with_current_value_aux (XEXP (exp, 0)));
3873 cond = simplify_with_current_value_aux (XEXP (exp, 0));
3874 if (cond == true_rtx)
3876 else if (cond == false_rtx)
3879 return attr_rtx (NOT, cond);
3882 for (i = 0; i < XVECLEN (exp, 0); i += 2)
3884 cond = simplify_with_current_value_aux (XVECEXP (exp, 0, i));
3885 if (cond == true_rtx)
3886 return simplify_with_current_value_aux (XVECEXP (exp, 0, i + 1));
3887 else if (cond == false_rtx)
3890 abort (); /* With all EQ_ATTR's of known value, a case should
3891 have been selected. */
3893 return simplify_with_current_value_aux (XEXP (exp, 1));
3900 /* Clear the ATTR_CURR_SIMPLIFIED_P flag in EXP and its subexpressions. */
3903 clear_struct_flag (rtx x)
3910 ATTR_CURR_SIMPLIFIED_P (x) = 0;
3911 if (ATTR_IND_SIMPLIFIED_P (x))
3914 code = GET_CODE (x);
3935 /* Compare the elements. If any pair of corresponding elements
3936 fail to match, return 0 for the whole things. */
3938 fmt = GET_RTX_FORMAT (code);
3939 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
3945 for (j = 0; j < XVECLEN (x, i); j++)
3946 clear_struct_flag (XVECEXP (x, i, j));
3950 clear_struct_flag (XEXP (x, i));
3956 /* Create table entries for DEFINE_ATTR. */
3959 gen_attr (rtx exp, int lineno)
3961 struct attr_desc *attr;
3962 struct attr_value *av;
3963 const char *name_ptr;
3966 /* Make a new attribute structure. Check for duplicate by looking at
3967 attr->default_val, since it is initialized by this routine. */
3968 attr = find_attr (XSTR (exp, 0), 1);
3969 if (attr->default_val)
3971 message_with_line (lineno, "duplicate definition for attribute %s",
3973 message_with_line (attr->lineno, "previous definition");
3977 attr->lineno = lineno;
3979 if (*XSTR (exp, 1) == '\0')
3980 attr->is_numeric = 1;
3983 name_ptr = XSTR (exp, 1);
3984 while ((p = next_comma_elt (&name_ptr)) != NULL)
3986 av = oballoc (sizeof (struct attr_value));
3987 av->value = attr_rtx (CONST_STRING, p);
3988 av->next = attr->first_value;
3989 attr->first_value = av;
3990 av->first_insn = NULL;
3992 av->has_asm_insn = 0;
3996 if (GET_CODE (XEXP (exp, 2)) == CONST)
3999 if (attr->is_numeric)
4001 message_with_line (lineno,
4002 "constant attributes may not take numeric values");
4006 /* Get rid of the CONST node. It is allowed only at top-level. */
4007 XEXP (exp, 2) = XEXP (XEXP (exp, 2), 0);
4010 if (! strcmp (attr->name, "length") && ! attr->is_numeric)
4012 message_with_line (lineno,
4013 "`length' attribute must take numeric values");
4017 /* Set up the default value. */
4018 XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
4019 attr->default_val = get_attr_value (XEXP (exp, 2), attr, -2);
4022 /* Given a pattern for DEFINE_PEEPHOLE or DEFINE_INSN, return the number of
4023 alternatives in the constraints. Assume all MATCH_OPERANDs have the same
4024 number of alternatives as this should be checked elsewhere. */
4027 count_alternatives (rtx exp)
4032 if (GET_CODE (exp) == MATCH_OPERAND)
4033 return n_comma_elts (XSTR (exp, 2));
4035 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
4036 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
4041 n = count_alternatives (XEXP (exp, i));
4048 if (XVEC (exp, i) != NULL)
4049 for (j = 0; j < XVECLEN (exp, i); j++)
4051 n = count_alternatives (XVECEXP (exp, i, j));
4060 /* Returns nonzero if the given expression contains an EQ_ATTR with the
4061 `alternative' attribute. */
4064 compares_alternatives_p (rtx exp)
4069 if (GET_CODE (exp) == EQ_ATTR && XSTR (exp, 0) == alternative_name)
4072 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
4073 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
4078 if (compares_alternatives_p (XEXP (exp, i)))
4083 for (j = 0; j < XVECLEN (exp, i); j++)
4084 if (compares_alternatives_p (XVECEXP (exp, i, j)))
4092 /* Returns nonzero is INNER is contained in EXP. */
4095 contained_in_p (rtx inner, rtx exp)
4100 if (rtx_equal_p (inner, exp))
4103 for (i = 0, fmt = GET_RTX_FORMAT (GET_CODE (exp));
4104 i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
4109 if (contained_in_p (inner, XEXP (exp, i)))
4114 for (j = 0; j < XVECLEN (exp, i); j++)
4115 if (contained_in_p (inner, XVECEXP (exp, i, j)))
4123 /* Process DEFINE_PEEPHOLE, DEFINE_INSN, and DEFINE_ASM_ATTRIBUTES. */
4126 gen_insn (rtx exp, int lineno)
4128 struct insn_def *id;
4130 id = oballoc (sizeof (struct insn_def));
4134 id->lineno = lineno;
4136 switch (GET_CODE (exp))
4139 id->insn_code = insn_code_number;
4140 id->insn_index = insn_index_number;
4141 id->num_alternatives = count_alternatives (exp);
4142 if (id->num_alternatives == 0)
4143 id->num_alternatives = 1;
4147 case DEFINE_PEEPHOLE:
4148 id->insn_code = insn_code_number;
4149 id->insn_index = insn_index_number;
4150 id->num_alternatives = count_alternatives (exp);
4151 if (id->num_alternatives == 0)
4152 id->num_alternatives = 1;
4156 case DEFINE_ASM_ATTRIBUTES:
4158 id->insn_index = -1;
4159 id->num_alternatives = 1;
4161 got_define_asm_attributes = 1;
4169 /* Process a DEFINE_DELAY. Validate the vector length, check if annul
4170 true or annul false is specified, and make a `struct delay_desc'. */
4173 gen_delay (rtx def, int lineno)
4175 struct delay_desc *delay;
4178 if (XVECLEN (def, 1) % 3 != 0)
4180 message_with_line (lineno,
4181 "number of elements in DEFINE_DELAY must be multiple of three");
4186 for (i = 0; i < XVECLEN (def, 1); i += 3)
4188 if (XVECEXP (def, 1, i + 1))
4189 have_annul_true = 1;
4190 if (XVECEXP (def, 1, i + 2))
4191 have_annul_false = 1;
4194 delay = oballoc (sizeof (struct delay_desc));
4196 delay->num = ++num_delays;
4197 delay->next = delays;
4198 delay->lineno = lineno;
4202 /* Process a DEFINE_FUNCTION_UNIT.
4204 This gives information about a function unit contained in the CPU.
4205 We fill in a `struct function_unit_op' and a `struct function_unit'
4206 with information used later by `expand_unit'. */
4209 gen_unit (rtx def, int lineno)
4211 struct function_unit *unit;
4212 struct function_unit_op *op;
4213 const char *name = XSTR (def, 0);
4214 int multiplicity = XINT (def, 1);
4215 int simultaneity = XINT (def, 2);
4216 rtx condexp = XEXP (def, 3);
4217 int ready_cost = MAX (XINT (def, 4), 1);
4218 int issue_delay = MAX (XINT (def, 5), 1);
4220 /* See if we have already seen this function unit. If so, check that
4221 the multiplicity and simultaneity values are the same. If not, make
4222 a structure for this function unit. */
4223 for (unit = units; unit; unit = unit->next)
4224 if (! strcmp (unit->name, name))
4226 if (unit->multiplicity != multiplicity
4227 || unit->simultaneity != simultaneity)
4229 message_with_line (lineno,
4230 "differing specifications given for function unit %s",
4232 message_with_line (unit->first_lineno, "previous definition");
4241 unit = oballoc (sizeof (struct function_unit));
4243 unit->multiplicity = multiplicity;
4244 unit->simultaneity = simultaneity;
4245 unit->issue_delay.min = unit->issue_delay.max = issue_delay;
4246 unit->num = num_units++;
4247 unit->num_opclasses = 0;
4248 unit->condexp = false_rtx;
4251 unit->first_lineno = lineno;
4255 /* Make a new operation class structure entry and initialize it. */
4256 op = oballoc (sizeof (struct function_unit_op));
4257 op->condexp = condexp;
4258 op->num = unit->num_opclasses++;
4259 op->ready = ready_cost;
4260 op->issue_delay = issue_delay;
4261 op->next = unit->ops;
4262 op->lineno = lineno;
4264 num_unit_opclasses++;
4266 /* Set our issue expression based on whether or not an optional conflict
4267 vector was specified. */
4270 /* Compute the IOR of all the specified expressions. */
4271 rtx orexp = false_rtx;
4274 for (i = 0; i < XVECLEN (def, 6); i++)
4275 orexp = insert_right_side (IOR, orexp, XVECEXP (def, 6, i), -2, -2);
4277 op->conflict_exp = orexp;
4278 extend_range (&unit->issue_delay, 1, issue_delay);
4282 op->conflict_exp = true_rtx;
4283 extend_range (&unit->issue_delay, issue_delay, issue_delay);
4286 /* Merge our conditional into that of the function unit so we can determine
4287 which insns are used by the function unit. */
4288 unit->condexp = insert_right_side (IOR, unit->condexp, op->condexp, -2, -2);
4291 /* Given a piece of RTX, print a C expression to test its truth value.
4292 We use AND and IOR both for logical and bit-wise operations, so
4293 interpret them as logical unless they are inside a comparison expression.
4294 The first bit of FLAGS will be nonzero in that case.
4296 Set the second bit of FLAGS to make references to attribute values use
4297 a cached local variable instead of calling a function. */
4300 write_test_expr (rtx exp, int flags)
4302 int comparison_operator = 0;
4304 struct attr_desc *attr;
4306 /* In order not to worry about operator precedence, surround our part of
4307 the expression with parentheses. */
4310 code = GET_CODE (exp);
4313 /* Binary operators. */
4315 case GE: case GT: case GEU: case GTU:
4316 case LE: case LT: case LEU: case LTU:
4317 comparison_operator = 1;
4319 case PLUS: case MINUS: case MULT: case DIV: case MOD:
4320 case AND: case IOR: case XOR:
4321 case ASHIFT: case LSHIFTRT: case ASHIFTRT:
4322 write_test_expr (XEXP (exp, 0), flags | comparison_operator);
4338 printf (" >= (unsigned) ");
4341 printf (" > (unsigned) ");
4350 printf (" <= (unsigned) ");
4353 printf (" < (unsigned) ");
4396 write_test_expr (XEXP (exp, 1), flags | comparison_operator);
4400 /* Special-case (not (eq_attrq "alternative" "x")) */
4401 if (! (flags & 1) && GET_CODE (XEXP (exp, 0)) == EQ_ATTR
4402 && XSTR (XEXP (exp, 0), 0) == alternative_name)
4404 printf ("which_alternative != %s", XSTR (XEXP (exp, 0), 1));
4408 /* Otherwise, fall through to normal unary operator. */
4410 /* Unary operators. */
4430 write_test_expr (XEXP (exp, 0), flags);
4433 /* Comparison test of an attribute with a value. Most of these will
4434 have been removed by optimization. Handle "alternative"
4435 specially and give error if EQ_ATTR present inside a comparison. */
4438 fatal ("EQ_ATTR not valid inside comparison");
4440 if (XSTR (exp, 0) == alternative_name)
4442 printf ("which_alternative == %s", XSTR (exp, 1));
4446 attr = find_attr (XSTR (exp, 0), 0);
4450 /* Now is the time to expand the value of a constant attribute. */
4453 write_test_expr (evaluate_eq_attr (exp, attr->default_val->value,
4460 printf ("attr_%s", attr->name);
4462 printf ("get_attr_%s (insn)", attr->name);
4464 write_attr_valueq (attr, XSTR (exp, 1));
4468 /* Comparison test of flags for define_delays. */
4471 fatal ("ATTR_FLAG not valid inside comparison");
4472 printf ("(flags & ATTR_FLAG_%s) != 0", XSTR (exp, 0));
4475 /* See if an operand matches a predicate. */
4477 /* If only a mode is given, just ensure the mode matches the operand.
4478 If neither a mode nor predicate is given, error. */
4479 if (XSTR (exp, 1) == NULL || *XSTR (exp, 1) == '\0')
4481 if (GET_MODE (exp) == VOIDmode)
4482 fatal ("null MATCH_OPERAND specified as test");
4484 printf ("GET_MODE (operands[%d]) == %smode",
4485 XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
4488 printf ("%s (operands[%d], %smode)",
4489 XSTR (exp, 1), XINT (exp, 0), GET_MODE_NAME (GET_MODE (exp)));
4493 printf ("%s (insn)", XSTR (exp, 0));
4496 /* Constant integer. */
4498 printf (HOST_WIDE_INT_PRINT_DEC, XWINT (exp, 0));
4501 /* A random C expression. */
4503 printf ("%s", XSTR (exp, 0));
4506 /* The address of the branch target. */
4508 printf ("INSN_ADDRESSES_SET_P () ? INSN_ADDRESSES (INSN_UID (GET_CODE (operands[%d]) == LABEL_REF ? XEXP (operands[%d], 0) : operands[%d])) : 0",
4509 XINT (exp, 0), XINT (exp, 0), XINT (exp, 0));
4513 /* The address of the current insn. We implement this actually as the
4514 address of the current insn for backward branches, but the last
4515 address of the next insn for forward branches, and both with
4516 adjustments that account for the worst-case possible stretching of
4517 intervening alignments between this insn and its destination. */
4518 printf ("insn_current_reference_address (insn)");
4522 printf ("%s", XSTR (exp, 0));
4526 write_test_expr (XEXP (exp, 0), flags & 2);
4528 write_test_expr (XEXP (exp, 1), flags | 1);
4530 write_test_expr (XEXP (exp, 2), flags | 1);
4534 fatal ("bad RTX code `%s' in attribute calculation\n",
4535 GET_RTX_NAME (code));
4541 /* Given an attribute value, return the maximum CONST_STRING argument
4542 encountered. Set *UNKNOWNP and return INT_MAX if the value is unknown. */
4545 max_attr_value (rtx exp, int *unknownp)
4550 switch (GET_CODE (exp))
4553 current_max = atoi (XSTR (exp, 0));
4557 current_max = max_attr_value (XEXP (exp, 1), unknownp);
4558 for (i = 0; i < XVECLEN (exp, 0); i += 2)
4560 n = max_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
4561 if (n > current_max)
4567 current_max = max_attr_value (XEXP (exp, 1), unknownp);
4568 n = max_attr_value (XEXP (exp, 2), unknownp);
4569 if (n > current_max)
4575 current_max = INT_MAX;
4582 /* Given an attribute value, return the result of ORing together all
4583 CONST_STRING arguments encountered. Set *UNKNOWNP and return -1
4584 if the numeric value is not known. */
4587 or_attr_value (rtx exp, int *unknownp)
4592 switch (GET_CODE (exp))
4595 current_or = atoi (XSTR (exp, 0));
4599 current_or = or_attr_value (XEXP (exp, 1), unknownp);
4600 for (i = 0; i < XVECLEN (exp, 0); i += 2)
4601 current_or |= or_attr_value (XVECEXP (exp, 0, i + 1), unknownp);
4605 current_or = or_attr_value (XEXP (exp, 1), unknownp);
4606 current_or |= or_attr_value (XEXP (exp, 2), unknownp);
4618 /* Scan an attribute value, possibly a conditional, and record what actions
4619 will be required to do any conditional tests in it.
4622 `must_extract' if we need to extract the insn operands
4623 `must_constrain' if we must compute `which_alternative'
4624 `address_used' if an address expression was used
4625 `length_used' if an (eq_attr "length" ...) was used
4629 walk_attr_value (rtx exp)
4638 code = GET_CODE (exp);
4642 if (! ATTR_IND_SIMPLIFIED_P (exp))
4643 /* Since this is an arbitrary expression, it can look at anything.
4644 However, constant expressions do not depend on any particular
4646 must_extract = must_constrain = 1;
4654 if (XSTR (exp, 0) == alternative_name)
4655 must_extract = must_constrain = 1;
4656 else if (strcmp (XSTR (exp, 0), "length") == 0)
4676 for (i = 0, fmt = GET_RTX_FORMAT (code); i < GET_RTX_LENGTH (code); i++)
4681 walk_attr_value (XEXP (exp, i));
4685 if (XVEC (exp, i) != NULL)
4686 for (j = 0; j < XVECLEN (exp, i); j++)
4687 walk_attr_value (XVECEXP (exp, i, j));
4692 /* Write out a function to obtain the attribute for a given INSN. */
4695 write_attr_get (struct attr_desc *attr)
4697 struct attr_value *av, *common_av;
4699 /* Find the most used attribute value. Handle that as the `default' of the
4700 switch we will generate. */
4701 common_av = find_most_used (attr);
4703 /* Write out start of function, then all values with explicit `case' lines,
4704 then a `default', then the value with the most uses. */
4707 if (!attr->is_numeric)
4708 printf ("enum attr_%s\n", attr->name);
4709 else if (attr->unsigned_p)
4710 printf ("unsigned int\n");
4714 /* If the attribute name starts with a star, the remainder is the name of
4715 the subroutine to use, instead of `get_attr_...'. */
4716 if (attr->name[0] == '*')
4717 printf ("%s (rtx insn ATTRIBUTE_UNUSED)\n", &attr->name[1]);
4718 else if (attr->is_const == 0)
4719 printf ("get_attr_%s (rtx insn ATTRIBUTE_UNUSED)\n", attr->name);
4722 printf ("get_attr_%s (void)\n", attr->name);
4725 for (av = attr->first_value; av; av = av->next)
4726 if (av->num_insns != 0)
4727 write_attr_set (attr, 2, av->value, "return", ";",
4728 true_rtx, av->first_insn->insn_code,
4729 av->first_insn->insn_index);
4737 if (GET_CODE (common_av->value) == FFS)
4739 rtx p = XEXP (common_av->value, 0);
4741 /* No need to emit code to abort if the insn is unrecognized; the
4742 other get_attr_foo functions will do that when we call them. */
4744 write_toplevel_expr (p);
4746 printf ("\n if (accum && accum == (accum & -accum))\n");
4748 printf (" int i;\n");
4749 printf (" for (i = 0; accum >>= 1; ++i) continue;\n");
4750 printf (" accum = i;\n");
4751 printf (" }\n else\n");
4752 printf (" accum = ~accum;\n");
4753 printf (" return accum;\n}\n\n");
4757 printf (" switch (recog_memoized (insn))\n");
4760 for (av = attr->first_value; av; av = av->next)
4761 if (av != common_av)
4762 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
4764 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
4765 printf (" }\n}\n\n");
4769 /* Given an AND tree of known true terms (because we are inside an `if' with
4770 that as the condition or are in an `else' clause) and an expression,
4771 replace any known true terms with TRUE. Use `simplify_and_tree' to do
4772 the bulk of the work. */
4775 eliminate_known_true (rtx known_true, rtx exp, int insn_code, int insn_index)
4779 known_true = SIMPLIFY_TEST_EXP (known_true, insn_code, insn_index);
4781 if (GET_CODE (known_true) == AND)
4783 exp = eliminate_known_true (XEXP (known_true, 0), exp,
4784 insn_code, insn_index);
4785 exp = eliminate_known_true (XEXP (known_true, 1), exp,
4786 insn_code, insn_index);
4791 exp = simplify_and_tree (exp, &term, insn_code, insn_index);
4797 /* Write out a series of tests and assignment statements to perform tests and
4798 sets of an attribute value. We are passed an indentation amount and prefix
4799 and suffix strings to write around each attribute value (e.g., "return"
4803 write_attr_set (struct attr_desc *attr, int indent, rtx value,
4804 const char *prefix, const char *suffix, rtx known_true,
4805 int insn_code, int insn_index)
4807 if (GET_CODE (value) == COND)
4809 /* Assume the default value will be the default of the COND unless we
4810 find an always true expression. */
4811 rtx default_val = XEXP (value, 1);
4812 rtx our_known_true = known_true;
4817 for (i = 0; i < XVECLEN (value, 0); i += 2)
4822 testexp = eliminate_known_true (our_known_true,
4823 XVECEXP (value, 0, i),
4824 insn_code, insn_index);
4825 newexp = attr_rtx (NOT, testexp);
4826 newexp = insert_right_side (AND, our_known_true, newexp,
4827 insn_code, insn_index);
4829 /* If the test expression is always true or if the next `known_true'
4830 expression is always false, this is the last case, so break
4831 out and let this value be the `else' case. */
4832 if (testexp == true_rtx || newexp == false_rtx)
4834 default_val = XVECEXP (value, 0, i + 1);
4838 /* Compute the expression to pass to our recursive call as being
4840 inner_true = insert_right_side (AND, our_known_true,
4841 testexp, insn_code, insn_index);
4843 /* If this is always false, skip it. */
4844 if (inner_true == false_rtx)
4847 write_indent (indent);
4848 printf ("%sif ", first_if ? "" : "else ");
4850 write_test_expr (testexp, 0);
4852 write_indent (indent + 2);
4855 write_attr_set (attr, indent + 4,
4856 XVECEXP (value, 0, i + 1), prefix, suffix,
4857 inner_true, insn_code, insn_index);
4858 write_indent (indent + 2);
4860 our_known_true = newexp;
4865 write_indent (indent);
4867 write_indent (indent + 2);
4871 write_attr_set (attr, first_if ? indent : indent + 4, default_val,
4872 prefix, suffix, our_known_true, insn_code, insn_index);
4876 write_indent (indent + 2);
4882 write_indent (indent);
4883 printf ("%s ", prefix);
4884 write_attr_value (attr, value);
4885 printf ("%s\n", suffix);
4889 /* Write out the computation for one attribute value. */
4892 write_attr_case (struct attr_desc *attr, struct attr_value *av,
4893 int write_case_lines, const char *prefix, const char *suffix,
4894 int indent, rtx known_true)
4896 struct insn_ent *ie;
4898 if (av->num_insns == 0)
4901 if (av->has_asm_insn)
4903 write_indent (indent);
4904 printf ("case -1:\n");
4905 write_indent (indent + 2);
4906 printf ("if (GET_CODE (PATTERN (insn)) != ASM_INPUT\n");
4907 write_indent (indent + 2);
4908 printf (" && asm_noperands (PATTERN (insn)) < 0)\n");
4909 write_indent (indent + 2);
4910 printf (" fatal_insn_not_found (insn);\n");
4913 if (write_case_lines)
4915 for (ie = av->first_insn; ie; ie = ie->next)
4916 if (ie->insn_code != -1)
4918 write_indent (indent);
4919 printf ("case %d:\n", ie->insn_code);
4924 write_indent (indent);
4925 printf ("default:\n");
4928 /* See what we have to do to output this value. */
4929 must_extract = must_constrain = address_used = 0;
4930 walk_attr_value (av->value);
4934 write_indent (indent + 2);
4935 printf ("extract_constrain_insn_cached (insn);\n");
4937 else if (must_extract)
4939 write_indent (indent + 2);
4940 printf ("extract_insn_cached (insn);\n");
4943 write_attr_set (attr, indent + 2, av->value, prefix, suffix,
4944 known_true, av->first_insn->insn_code,
4945 av->first_insn->insn_index);
4947 if (strncmp (prefix, "return", 6))
4949 write_indent (indent + 2);
4950 printf ("break;\n");
4955 /* Search for uses of non-const attributes and write code to cache them. */
4958 write_expr_attr_cache (rtx p, struct attr_desc *attr)
4963 if (GET_CODE (p) == EQ_ATTR)
4965 if (XSTR (p, 0) != attr->name)
4968 if (!attr->is_numeric)
4969 printf (" enum attr_%s ", attr->name);
4970 else if (attr->unsigned_p)
4971 printf (" unsigned int ");
4975 printf ("attr_%s = get_attr_%s (insn);\n", attr->name, attr->name);
4979 fmt = GET_RTX_FORMAT (GET_CODE (p));
4980 ie = GET_RTX_LENGTH (GET_CODE (p));
4981 for (i = 0; i < ie; i++)
4986 if (write_expr_attr_cache (XEXP (p, i), attr))
4991 je = XVECLEN (p, i);
4992 for (j = 0; j < je; ++j)
4993 if (write_expr_attr_cache (XVECEXP (p, i, j), attr))
5002 /* Evaluate an expression at top level. A front end to write_test_expr,
5003 in which we cache attribute values and break up excessively large
5004 expressions to cater to older compilers. */
5007 write_toplevel_expr (rtx p)
5009 struct attr_desc *attr;
5012 for (i = 0; i < MAX_ATTRS_INDEX; ++i)
5013 for (attr = attrs[i]; attr; attr = attr->next)
5014 if (!attr->is_const)
5015 write_expr_attr_cache (p, attr);
5017 printf (" unsigned long accum = 0;\n\n");
5019 while (GET_CODE (p) == IOR)
5022 if (GET_CODE (XEXP (p, 0)) == IOR)
5023 e = XEXP (p, 1), p = XEXP (p, 0);
5025 e = XEXP (p, 0), p = XEXP (p, 1);
5027 printf (" accum |= ");
5028 write_test_expr (e, 3);
5031 printf (" accum |= ");
5032 write_test_expr (p, 3);
5036 /* Utilities to write names in various forms. */
5039 write_unit_name (const char *prefix, int num, const char *suffix)
5041 struct function_unit *unit;
5043 for (unit = units; unit; unit = unit->next)
5044 if (unit->num == num)
5046 printf ("%s%s%s", prefix, unit->name, suffix);
5050 printf ("%s<unknown>%s", prefix, suffix);
5054 write_attr_valueq (struct attr_desc *attr, const char *s)
5056 if (attr->is_numeric)
5062 /* Make the blockage range values and function units used values easier
5064 if (attr->func_units_p)
5067 printf (" /* units: none */");
5069 write_unit_name (" /* units: ", num, " */");
5073 const char *sep = " /* units: ";
5074 for (i = 0, num = ~num; num; i++, num >>= 1)
5077 write_unit_name (sep, i, (num == 1) ? " */" : "");
5083 else if (attr->blockage_p)
5084 printf (" /* min %d, max %d */", num >> (HOST_BITS_PER_INT / 2),
5085 num & ((1 << (HOST_BITS_PER_INT / 2)) - 1));
5087 else if (num > 9 || num < 0)
5088 printf (" /* 0x%x */", num);
5092 write_upcase (attr->name);
5099 write_attr_value (struct attr_desc *attr, rtx value)
5103 switch (GET_CODE (value))
5106 write_attr_valueq (attr, XSTR (value, 0));
5110 printf (HOST_WIDE_INT_PRINT_DEC, INTVAL (value));
5114 fputs (XSTR (value, 0), stdout);
5119 struct attr_desc *attr2 = find_attr (XSTR (value, 0), 0);
5120 printf ("get_attr_%s (%s)", attr2->name,
5121 (attr2->is_const ? "" : "insn"));
5142 write_attr_value (attr, XEXP (value, 0));
5146 write_attr_value (attr, XEXP (value, 1));
5155 write_upcase (const char *str)
5159 /* The argument of TOUPPER should not have side effects. */
5160 putchar (TOUPPER(*str));
5166 write_indent (int indent)
5168 for (; indent > 8; indent -= 8)
5171 for (; indent; indent--)
5175 /* Write a subroutine that is given an insn that requires a delay slot, a
5176 delay slot ordinal, and a candidate insn. It returns nonzero if the
5177 candidate can be placed in the specified delay slot of the insn.
5179 We can write as many as three subroutines. `eligible_for_delay'
5180 handles normal delay slots, `eligible_for_annul_true' indicates that
5181 the specified insn can be annulled if the branch is true, and likewise
5182 for `eligible_for_annul_false'.
5184 KIND is a string distinguishing these three cases ("delay", "annul_true",
5185 or "annul_false"). */
5188 write_eligible_delay (const char *kind)
5190 struct delay_desc *delay;
5193 struct attr_desc *attr;
5194 struct attr_value *av, *common_av;
5197 /* Compute the maximum number of delay slots required. We use the delay
5198 ordinal times this number plus one, plus the slot number as an index into
5199 the appropriate predicate to test. */
5201 for (delay = delays, max_slots = 0; delay; delay = delay->next)
5202 if (XVECLEN (delay->def, 1) / 3 > max_slots)
5203 max_slots = XVECLEN (delay->def, 1) / 3;
5205 /* Write function prelude. */
5208 printf ("eligible_for_%s (rtx delay_insn ATTRIBUTE_UNUSED, int slot, rtx candidate_insn, int flags ATTRIBUTE_UNUSED)\n",
5211 printf (" rtx insn;\n");
5213 printf (" if (slot >= %d)\n", max_slots);
5214 printf (" abort ();\n");
5217 /* If more than one delay type, find out which type the delay insn is. */
5221 attr = find_attr ("*delay_type", 0);
5224 common_av = find_most_used (attr);
5226 printf (" insn = delay_insn;\n");
5227 printf (" switch (recog_memoized (insn))\n");
5230 sprintf (str, " * %d;\n break;", max_slots);
5231 for (av = attr->first_value; av; av = av->next)
5232 if (av != common_av)
5233 write_attr_case (attr, av, 1, "slot +=", str, 4, true_rtx);
5235 write_attr_case (attr, common_av, 0, "slot +=", str, 4, true_rtx);
5238 /* Ensure matched. Otherwise, shouldn't have been called. */
5239 printf (" if (slot < %d)\n", max_slots);
5240 printf (" abort ();\n\n");
5243 /* If just one type of delay slot, write simple switch. */
5244 if (num_delays == 1 && max_slots == 1)
5246 printf (" insn = candidate_insn;\n");
5247 printf (" switch (recog_memoized (insn))\n");
5250 attr = find_attr ("*delay_1_0", 0);
5253 common_av = find_most_used (attr);
5255 for (av = attr->first_value; av; av = av->next)
5256 if (av != common_av)
5257 write_attr_case (attr, av, 1, "return", ";", 4, true_rtx);
5259 write_attr_case (attr, common_av, 0, "return", ";", 4, true_rtx);
5265 /* Write a nested CASE. The first indicates which condition we need to
5266 test, and the inner CASE tests the condition. */
5267 printf (" insn = candidate_insn;\n");
5268 printf (" switch (slot)\n");
5271 for (delay = delays; delay; delay = delay->next)
5272 for (i = 0; i < XVECLEN (delay->def, 1); i += 3)
5274 printf (" case %d:\n",
5275 (i / 3) + (num_delays == 1 ? 0 : delay->num * max_slots));
5276 printf (" switch (recog_memoized (insn))\n");
5279 sprintf (str, "*%s_%d_%d", kind, delay->num, i / 3);
5280 attr = find_attr (str, 0);
5283 common_av = find_most_used (attr);
5285 for (av = attr->first_value; av; av = av->next)
5286 if (av != common_av)
5287 write_attr_case (attr, av, 1, "return", ";", 8, true_rtx);
5289 write_attr_case (attr, common_av, 0, "return", ";", 8, true_rtx);
5293 printf (" default:\n");
5294 printf (" abort ();\n");
5301 /* Write routines to compute conflict cost for function units. Then write a
5302 table describing the available function units. */
5305 write_function_unit_info (void)
5307 struct function_unit *unit;
5310 /* Write out conflict routines for function units. Don't bother writing
5311 one if there is only one issue delay value. */
5313 for (unit = units; unit; unit = unit->next)
5315 if (unit->needs_blockage_function)
5316 write_complex_function (unit, "blockage", "block");
5318 /* If the minimum and maximum conflict costs are the same, there
5319 is only one value, so we don't need a function. */
5320 if (! unit->needs_conflict_function)
5322 unit->default_cost = make_numeric_value (unit->issue_delay.max);
5326 /* The function first computes the case from the candidate insn. */
5327 unit->default_cost = make_numeric_value (0);
5328 write_complex_function (unit, "conflict_cost", "cost");
5331 /* Now that all functions have been written, write the table describing
5332 the function units. The name is included for documentation purposes
5335 printf ("const struct function_unit_desc function_units[] = {\n");
5337 /* Write out the descriptions in numeric order, but don't force that order
5338 on the list. Doing so increases the runtime of genattrtab.c. */
5339 for (i = 0; i < num_units; i++)
5341 for (unit = units; unit; unit = unit->next)
5345 printf (" {\"%s\", %d, %d, %d, %s, %d, %s_unit_ready_cost, ",
5346 unit->name, 1 << unit->num, unit->multiplicity,
5347 unit->simultaneity, XSTR (unit->default_cost, 0),
5348 unit->issue_delay.max, unit->name);
5350 if (unit->needs_conflict_function)
5351 printf ("%s_unit_conflict_cost, ", unit->name);
5355 printf ("%d, ", unit->max_blockage);
5357 if (unit->needs_range_function)
5358 printf ("%s_unit_blockage_range, ", unit->name);
5362 if (unit->needs_blockage_function)
5363 printf ("%s_unit_blockage", unit->name);
5371 printf ("{\"dummy\", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} /* a dummy element */");
5376 write_complex_function (struct function_unit *unit,
5378 const char *connection)
5380 struct attr_desc *case_attr, *attr;
5381 struct attr_value *av, *common_av;
5387 printf ("static int\n");
5388 printf ("%s_unit_%s (rtx executing_insn, rtx candidate_insn)\n",
5391 printf (" rtx insn;\n");
5392 printf (" int casenum;\n\n");
5393 printf (" insn = executing_insn;\n");
5394 printf (" switch (recog_memoized (insn))\n");
5397 /* Write the `switch' statement to get the case value. */
5398 if (strlen (unit->name) + sizeof "*_cases" > 256)
5400 sprintf (str, "*%s_cases", unit->name);
5401 case_attr = find_attr (str, 0);
5404 common_av = find_most_used (case_attr);
5406 for (av = case_attr->first_value; av; av = av->next)
5407 if (av != common_av)
5408 write_attr_case (case_attr, av, 1,
5409 "casenum =", ";", 4, unit->condexp);
5411 write_attr_case (case_attr, common_av, 0,
5412 "casenum =", ";", 4, unit->condexp);
5415 /* Now write an outer switch statement on each case. Then write
5416 the tests on the executing function within each. */
5417 printf (" insn = candidate_insn;\n");
5418 printf (" switch (casenum)\n");
5421 for (i = 0; i < unit->num_opclasses; i++)
5423 /* Ensure using this case. */
5425 for (av = case_attr->first_value; av; av = av->next)
5427 && contained_in_p (make_numeric_value (i), av->value))
5433 printf (" case %d:\n", i);
5434 sprintf (str, "*%s_%s_%d", unit->name, connection, i);
5435 attr = find_attr (str, 0);
5439 /* If single value, just write it. */
5440 value = find_single_value (attr);
5442 write_attr_set (attr, 6, value, "return", ";\n", true_rtx, -2, -2);
5445 common_av = find_most_used (attr);
5446 printf (" switch (recog_memoized (insn))\n");
5449 for (av = attr->first_value; av; av = av->next)
5450 if (av != common_av)
5451 write_attr_case (attr, av, 1,
5452 "return", ";", 8, unit->condexp);
5454 write_attr_case (attr, common_av, 0,
5455 "return", ";", 8, unit->condexp);
5460 /* This default case should not be needed, but gcc's analysis is not
5461 good enough to realize that the default case is not needed for the
5462 second switch statement. */
5463 printf (" default:\n abort ();\n");
5464 printf (" }\n}\n\n");
5467 /* This page contains miscellaneous utility routines. */
5469 /* Given a pointer to a (char *), return a malloc'ed string containing the
5470 next comma-separated element. Advance the pointer to after the string
5471 scanned, or the end-of-string. Return NULL if at end of string. */
5474 next_comma_elt (const char **pstr)
5478 start = scan_comma_elt (pstr);
5483 return attr_string (start, *pstr - start);
5486 /* Return a `struct attr_desc' pointer for a given named attribute. If CREATE
5487 is nonzero, build a new attribute, if one does not exist. */
5489 static struct attr_desc *
5490 find_attr (const char *name, int create)
5492 struct attr_desc *attr;
5495 /* Before we resort to using `strcmp', see if the string address matches
5496 anywhere. In most cases, it should have been canonicalized to do so. */
5497 if (name == alternative_name)
5500 index = name[0] & (MAX_ATTRS_INDEX - 1);
5501 for (attr = attrs[index]; attr; attr = attr->next)
5502 if (name == attr->name)
5505 /* Otherwise, do it the slow way. */
5506 for (attr = attrs[index]; attr; attr = attr->next)
5507 if (name[0] == attr->name[0] && ! strcmp (name, attr->name))
5513 attr = oballoc (sizeof (struct attr_desc));
5514 attr->name = attr_string (name, strlen (name));
5515 attr->first_value = attr->default_val = NULL;
5516 attr->is_numeric = attr->negative_ok = attr->is_const = attr->is_special = 0;
5517 attr->unsigned_p = attr->func_units_p = attr->blockage_p = attr->static_p = 0;
5518 attr->next = attrs[index];
5519 attrs[index] = attr;
5524 /* Create internal attribute with the given default value. */
5527 make_internal_attr (const char *name, rtx value, int special)
5529 struct attr_desc *attr;
5531 attr = find_attr (name, 1);
5532 if (attr->default_val)
5535 attr->is_numeric = 1;
5537 attr->is_special = (special & ATTR_SPECIAL) != 0;
5538 attr->negative_ok = (special & ATTR_NEGATIVE_OK) != 0;
5539 attr->unsigned_p = (special & ATTR_UNSIGNED) != 0;
5540 attr->func_units_p = (special & ATTR_FUNC_UNITS) != 0;
5541 attr->blockage_p = (special & ATTR_BLOCKAGE) != 0;
5542 attr->static_p = (special & ATTR_STATIC) != 0;
5543 attr->default_val = get_attr_value (value, attr, -2);
5546 /* Find the most used value of an attribute. */
5548 static struct attr_value *
5549 find_most_used (struct attr_desc *attr)
5551 struct attr_value *av;
5552 struct attr_value *most_used;
5558 for (av = attr->first_value; av; av = av->next)
5559 if (av->num_insns > nuses)
5560 nuses = av->num_insns, most_used = av;
5565 /* If an attribute only has a single value used, return it. Otherwise
5569 find_single_value (struct attr_desc *attr)
5571 struct attr_value *av;
5574 unique_value = NULL;
5575 for (av = attr->first_value; av; av = av->next)
5581 unique_value = av->value;
5584 return unique_value;
5587 /* Return (attr_value "n") */
5590 make_numeric_value (int n)
5592 static rtx int_values[20];
5599 if (n < 20 && int_values[n])
5600 return int_values[n];
5602 p = attr_printf (MAX_DIGITS, "%d", n);
5603 exp = attr_rtx (CONST_STRING, p);
5606 int_values[n] = exp;
5612 extend_range (struct range *range, int min, int max)
5614 if (range->min > min)
5616 if (range->max < max)
5621 copy_rtx_unchanging (rtx orig)
5623 if (ATTR_IND_SIMPLIFIED_P (orig) || ATTR_CURR_SIMPLIFIED_P (orig))
5626 ATTR_CURR_SIMPLIFIED_P (orig) = 1;
5630 /* Determine if an insn has a constant number of delay slots, i.e., the
5631 number of delay slots is not a function of the length of the insn. */
5634 write_const_num_delay_slots (void)
5636 struct attr_desc *attr = find_attr ("*num_delay_slots", 0);
5637 struct attr_value *av;
5638 struct insn_ent *ie;
5642 printf ("int\nconst_num_delay_slots (rtx insn)\n");
5644 printf (" switch (recog_memoized (insn))\n");
5647 for (av = attr->first_value; av; av = av->next)
5650 walk_attr_value (av->value);
5653 for (ie = av->first_insn; ie; ie = ie->next)
5654 if (ie->insn_code != -1)
5655 printf (" case %d:\n", ie->insn_code);
5656 printf (" return 0;\n");
5660 printf (" default:\n");
5661 printf (" return 1;\n");
5662 printf (" }\n}\n\n");
5667 main (int argc, char **argv)
5670 struct attr_desc *attr;
5671 struct insn_def *id;
5675 progname = "genattrtab";
5678 fatal ("no input file name");
5680 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
5681 return (FATAL_EXIT_CODE);
5683 obstack_init (hash_obstack);
5684 obstack_init (temp_obstack);
5686 /* Set up true and false rtx's */
5687 true_rtx = rtx_alloc (CONST_INT);
5688 XWINT (true_rtx, 0) = 1;
5689 false_rtx = rtx_alloc (CONST_INT);
5690 XWINT (false_rtx, 0) = 0;
5691 ATTR_IND_SIMPLIFIED_P (true_rtx) = ATTR_IND_SIMPLIFIED_P (false_rtx) = 1;
5692 ATTR_PERMANENT_P (true_rtx) = ATTR_PERMANENT_P (false_rtx) = 1;
5694 alternative_name = attr_string ("alternative", strlen ("alternative"));
5696 printf ("/* Generated automatically by the program `genattrtab'\n\
5697 from the machine description file `md'. */\n\n");
5699 /* Read the machine description. */
5701 initiate_automaton_gen (argc, argv);
5706 desc = read_md_rtx (&lineno, &insn_code_number);
5710 switch (GET_CODE (desc))
5713 case DEFINE_PEEPHOLE:
5714 case DEFINE_ASM_ATTRIBUTES:
5715 gen_insn (desc, lineno);
5719 gen_attr (desc, lineno);
5723 gen_delay (desc, lineno);
5726 case DEFINE_FUNCTION_UNIT:
5727 gen_unit (desc, lineno);
5730 case DEFINE_CPU_UNIT:
5731 gen_cpu_unit (desc);
5734 case DEFINE_QUERY_CPU_UNIT:
5735 gen_query_cpu_unit (desc);
5743 gen_excl_set (desc);
5747 gen_presence_set (desc);
5750 case FINAL_PRESENCE_SET:
5751 gen_final_presence_set (desc);
5755 gen_absence_set (desc);
5758 case FINAL_ABSENCE_SET:
5759 gen_final_absence_set (desc);
5762 case DEFINE_AUTOMATON:
5763 gen_automaton (desc);
5766 case AUTOMATA_OPTION:
5767 gen_automata_option (desc);
5770 case DEFINE_RESERVATION:
5774 case DEFINE_INSN_RESERVATION:
5775 gen_insn_reserv (desc);
5781 if (GET_CODE (desc) != DEFINE_ASM_ATTRIBUTES)
5782 insn_index_number++;
5786 return FATAL_EXIT_CODE;
5790 /* If we didn't have a DEFINE_ASM_ATTRIBUTES, make a null one. */
5791 if (! got_define_asm_attributes)
5793 tem = rtx_alloc (DEFINE_ASM_ATTRIBUTES);
5794 XVEC (tem, 0) = rtvec_alloc (0);
5798 /* Expand DEFINE_DELAY information into new attribute. */
5802 if (num_units || num_dfa_decls)
5804 /* Expand DEFINE_FUNCTION_UNIT information into new attributes. */
5806 /* Build DFA, output some functions and expand DFA information
5807 into new attributes. */
5811 printf ("#include \"config.h\"\n");
5812 printf ("#include \"system.h\"\n");
5813 printf ("#include \"coretypes.h\"\n");
5814 printf ("#include \"tm.h\"\n");
5815 printf ("#include \"rtl.h\"\n");
5816 printf ("#include \"tm_p.h\"\n");
5817 printf ("#include \"insn-config.h\"\n");
5818 printf ("#include \"recog.h\"\n");
5819 printf ("#include \"regs.h\"\n");
5820 printf ("#include \"real.h\"\n");
5821 printf ("#include \"output.h\"\n");
5822 printf ("#include \"insn-attr.h\"\n");
5823 printf ("#include \"toplev.h\"\n");
5824 printf ("#include \"flags.h\"\n");
5825 printf ("#include \"function.h\"\n");
5827 printf ("#define operands recog_data.operand\n\n");
5829 /* Make `insn_alternatives'. */
5830 insn_alternatives = oballoc (insn_code_number * sizeof (int));
5831 for (id = defs; id; id = id->next)
5832 if (id->insn_code >= 0)
5833 insn_alternatives[id->insn_code] = (1 << id->num_alternatives) - 1;
5835 /* Make `insn_n_alternatives'. */
5836 insn_n_alternatives = oballoc (insn_code_number * sizeof (int));
5837 for (id = defs; id; id = id->next)
5838 if (id->insn_code >= 0)
5839 insn_n_alternatives[id->insn_code] = id->num_alternatives;
5841 /* Prepare to write out attribute subroutines by checking everything stored
5842 away and building the attribute cases. */
5846 for (i = 0; i < MAX_ATTRS_INDEX; i++)
5847 for (attr = attrs[i]; attr; attr = attr->next)
5848 attr->default_val->value
5849 = check_attr_value (attr->default_val->value, attr);
5852 return FATAL_EXIT_CODE;
5854 for (i = 0; i < MAX_ATTRS_INDEX; i++)
5855 for (attr = attrs[i]; attr; attr = attr->next)
5858 /* Construct extra attributes for `length'. */
5859 make_length_attrs ();
5861 /* Perform any possible optimizations to speed up compilation. */
5864 /* Now write out all the `gen_attr_...' routines. Do these before the
5865 special routines (specifically before write_function_unit_info), so
5866 that they get defined before they are used. */
5868 for (i = 0; i < MAX_ATTRS_INDEX; i++)
5869 for (attr = attrs[i]; attr; attr = attr->next)
5871 if (! attr->is_special && ! attr->is_const)
5876 = (attr->name [0] == '*'
5877 && strcmp (&attr->name [1], INSN_ALTS_FUNC_NAME) == 0);
5879 printf ("\n#if AUTOMATON_ALTS\n");
5880 write_attr_get (attr);
5882 printf ("#endif\n\n");
5886 /* Write out delay eligibility information, if DEFINE_DELAY present.
5887 (The function to compute the number of delay slots will be written
5891 write_eligible_delay ("delay");
5892 if (have_annul_true)
5893 write_eligible_delay ("annul_true");
5894 if (have_annul_false)
5895 write_eligible_delay ("annul_false");
5898 if (num_units || num_dfa_decls)
5900 /* Write out information about function units. */
5901 write_function_unit_info ();
5902 /* Output code for pipeline hazards recognition based on DFA
5903 (deterministic finite state automata. */
5907 /* Write out constant delay slot info. */
5908 write_const_num_delay_slots ();
5910 write_length_unit_log ();
5913 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
5916 /* Define this so we can link with print-rtl.o to get debug_rtx function. */
5918 get_insn_name (int code ATTRIBUTE_UNUSED)