get mxge to build, stage 29/many
[dragonfly.git] / contrib / gcc-3.4 / gcc / genrecog.c
blobbe7505b31ae9363b4734d506062bd6eef6221df6
1 /* Generate code from machine description to recognize rtl as insns.
2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
23 /* This program is used to produce insn-recog.c, which contains a
24 function called `recog' plus its subroutines. These functions
25 contain a decision tree that recognizes whether an rtx, the
26 argument given to recog, is a valid instruction.
28 recog returns -1 if the rtx is not valid. If the rtx is valid,
29 recog returns a nonnegative number which is the insn code number
30 for the pattern that matched. This is the same as the order in the
31 machine description of the entry that matched. This number can be
32 used as an index into various insn_* tables, such as insn_template,
33 insn_outfun, and insn_n_operands (found in insn-output.c).
35 The third argument to recog is an optional pointer to an int. If
36 present, recog will accept a pattern if it matches except for
37 missing CLOBBER expressions at the end. In that case, the value
38 pointed to by the optional pointer will be set to the number of
39 CLOBBERs that need to be added (it should be initialized to zero by
40 the caller). If it is set nonzero, the caller should allocate a
41 PARALLEL of the appropriate size, copy the initial entries, and
42 call add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.
44 This program also generates the function `split_insns', which
45 returns 0 if the rtl could not be split, or it returns the split
46 rtl as an INSN list.
48 This program also generates the function `peephole2_insns', which
49 returns 0 if the rtl could not be matched. If there was a match,
50 the new rtl is returned in an INSN list, and LAST_INSN will point
51 to the last recognized insn in the old sequence. */
53 #include "bconfig.h"
54 #include "system.h"
55 #include "coretypes.h"
56 #include "tm.h"
57 #include "rtl.h"
58 #include "errors.h"
59 #include "gensupport.h"
62 #define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \
63 printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER))
65 /* Holds an array of names indexed by insn_code_number. */
66 static char **insn_name_ptr = 0;
67 static int insn_name_ptr_size = 0;
69 /* A listhead of decision trees. The alternatives to a node are kept
70 in a doubly-linked list so we can easily add nodes to the proper
71 place when merging. */
73 struct decision_head
75 struct decision *first;
76 struct decision *last;
79 /* A single test. The two accept types aren't tests per-se, but
80 their equality (or lack thereof) does affect tree merging so
81 it is convenient to keep them here. */
83 struct decision_test
85 /* A linked list through the tests attached to a node. */
86 struct decision_test *next;
88 /* These types are roughly in the order in which we'd like to test them. */
89 enum decision_type
91 DT_mode, DT_code, DT_veclen,
92 DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe,
93 DT_veclen_ge, DT_dup, DT_pred, DT_c_test,
94 DT_accept_op, DT_accept_insn
95 } type;
97 union
99 enum machine_mode mode; /* Machine mode of node. */
100 RTX_CODE code; /* Code to test. */
102 struct
104 const char *name; /* Predicate to call. */
105 int index; /* Index into `preds' or -1. */
106 enum machine_mode mode; /* Machine mode for node. */
107 } pred;
109 const char *c_test; /* Additional test to perform. */
110 int veclen; /* Length of vector. */
111 int dup; /* Number of operand to compare against. */
112 HOST_WIDE_INT intval; /* Value for XINT for XWINT. */
113 int opno; /* Operand number matched. */
115 struct {
116 int code_number; /* Insn number matched. */
117 int lineno; /* Line number of the insn. */
118 int num_clobbers_to_add; /* Number of CLOBBERs to be added. */
119 } insn;
120 } u;
123 /* Data structure for decision tree for recognizing legitimate insns. */
125 struct decision
127 struct decision_head success; /* Nodes to test on success. */
128 struct decision *next; /* Node to test on failure. */
129 struct decision *prev; /* Node whose failure tests us. */
130 struct decision *afterward; /* Node to test on success,
131 but failure of successor nodes. */
133 const char *position; /* String denoting position in pattern. */
135 struct decision_test *tests; /* The tests for this node. */
137 int number; /* Node number, used for labels */
138 int subroutine_number; /* Number of subroutine this node starts */
139 int need_label; /* Label needs to be output. */
142 #define SUBROUTINE_THRESHOLD 100
144 static int next_subroutine_number;
146 /* We can write three types of subroutines: One for insn recognition,
147 one to split insns, and one for peephole-type optimizations. This
148 defines which type is being written. */
150 enum routine_type {
151 RECOG, SPLIT, PEEPHOLE2
154 #define IS_SPLIT(X) ((X) != RECOG)
156 /* Next available node number for tree nodes. */
158 static int next_number;
160 /* Next number to use as an insn_code. */
162 static int next_insn_code;
164 /* Similar, but counts all expressions in the MD file; used for
165 error messages. */
167 static int next_index;
169 /* Record the highest depth we ever have so we know how many variables to
170 allocate in each subroutine we make. */
172 static int max_depth;
174 /* The line number of the start of the pattern currently being processed. */
175 static int pattern_lineno;
177 /* Count of errors. */
178 static int error_count;
180 /* This table contains a list of the rtl codes that can possibly match a
181 predicate defined in recog.c. The function `maybe_both_true' uses it to
182 deduce that there are no expressions that can be matches by certain pairs
183 of tree nodes. Also, if a predicate can match only one code, we can
184 hardwire that code into the node testing the predicate. */
186 static const struct pred_table
188 const char *const name;
189 const RTX_CODE codes[NUM_RTX_CODE];
190 } preds[] = {
191 {"general_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
192 LABEL_REF, SUBREG, REG, MEM, ADDRESSOF}},
193 #ifdef PREDICATE_CODES
194 PREDICATE_CODES
195 #endif
196 {"address_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
197 LABEL_REF, SUBREG, REG, MEM, ADDRESSOF,
198 PLUS, MINUS, MULT}},
199 {"register_operand", {SUBREG, REG, ADDRESSOF}},
200 {"pmode_register_operand", {SUBREG, REG, ADDRESSOF}},
201 {"scratch_operand", {SCRATCH, REG}},
202 {"immediate_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
203 LABEL_REF}},
204 {"const_int_operand", {CONST_INT}},
205 {"const_double_operand", {CONST_INT, CONST_DOUBLE}},
206 {"nonimmediate_operand", {SUBREG, REG, MEM, ADDRESSOF}},
207 {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
208 LABEL_REF, SUBREG, REG, ADDRESSOF}},
209 {"push_operand", {MEM}},
210 {"pop_operand", {MEM}},
211 {"memory_operand", {SUBREG, MEM}},
212 {"indirect_operand", {SUBREG, MEM}},
213 {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU,
214 UNORDERED, ORDERED, UNEQ, UNGE, UNGT, UNLE,
215 UNLT, LTGT}}
218 #define NUM_KNOWN_PREDS ARRAY_SIZE (preds)
220 static const char *const special_mode_pred_table[] = {
221 #ifdef SPECIAL_MODE_PREDICATES
222 SPECIAL_MODE_PREDICATES
223 #endif
224 "pmode_register_operand"
227 #define NUM_SPECIAL_MODE_PREDS ARRAY_SIZE (special_mode_pred_table)
229 static struct decision *new_decision
230 (const char *, struct decision_head *);
231 static struct decision_test *new_decision_test
232 (enum decision_type, struct decision_test ***);
233 static rtx find_operand
234 (rtx, int, rtx);
235 static rtx find_matching_operand
236 (rtx, int);
237 static void validate_pattern
238 (rtx, rtx, rtx, int);
239 static struct decision *add_to_sequence
240 (rtx, struct decision_head *, const char *, enum routine_type, int);
242 static int maybe_both_true_2
243 (struct decision_test *, struct decision_test *);
244 static int maybe_both_true_1
245 (struct decision_test *, struct decision_test *);
246 static int maybe_both_true
247 (struct decision *, struct decision *, int);
249 static int nodes_identical_1
250 (struct decision_test *, struct decision_test *);
251 static int nodes_identical
252 (struct decision *, struct decision *);
253 static void merge_accept_insn
254 (struct decision *, struct decision *);
255 static void merge_trees
256 (struct decision_head *, struct decision_head *);
258 static void factor_tests
259 (struct decision_head *);
260 static void simplify_tests
261 (struct decision_head *);
262 static int break_out_subroutines
263 (struct decision_head *, int);
264 static void find_afterward
265 (struct decision_head *, struct decision *);
267 static void change_state
268 (const char *, const char *, struct decision *, const char *);
269 static void print_code
270 (enum rtx_code);
271 static void write_afterward
272 (struct decision *, struct decision *, const char *);
273 static struct decision *write_switch
274 (struct decision *, int);
275 static void write_cond
276 (struct decision_test *, int, enum routine_type);
277 static void write_action
278 (struct decision *, struct decision_test *, int, int,
279 struct decision *, enum routine_type);
280 static int is_unconditional
281 (struct decision_test *, enum routine_type);
282 static int write_node
283 (struct decision *, int, enum routine_type);
284 static void write_tree_1
285 (struct decision_head *, int, enum routine_type);
286 static void write_tree
287 (struct decision_head *, const char *, enum routine_type, int);
288 static void write_subroutine
289 (struct decision_head *, enum routine_type);
290 static void write_subroutines
291 (struct decision_head *, enum routine_type);
292 static void write_header
293 (void);
295 static struct decision_head make_insn_sequence
296 (rtx, enum routine_type);
297 static void process_tree
298 (struct decision_head *, enum routine_type);
300 static void record_insn_name
301 (int, const char *);
303 static void debug_decision_0
304 (struct decision *, int, int);
305 static void debug_decision_1
306 (struct decision *, int);
307 static void debug_decision_2
308 (struct decision_test *);
309 extern void debug_decision
310 (struct decision *);
311 extern void debug_decision_list
312 (struct decision *);
314 /* Create a new node in sequence after LAST. */
316 static struct decision *
317 new_decision (const char *position, struct decision_head *last)
319 struct decision *new = xcalloc (1, sizeof (struct decision));
321 new->success = *last;
322 new->position = xstrdup (position);
323 new->number = next_number++;
325 last->first = last->last = new;
326 return new;
329 /* Create a new test and link it in at PLACE. */
331 static struct decision_test *
332 new_decision_test (enum decision_type type, struct decision_test ***pplace)
334 struct decision_test **place = *pplace;
335 struct decision_test *test;
337 test = xmalloc (sizeof (*test));
338 test->next = *place;
339 test->type = type;
340 *place = test;
342 place = &test->next;
343 *pplace = place;
345 return test;
348 /* Search for and return operand N, stop when reaching node STOP. */
350 static rtx
351 find_operand (rtx pattern, int n, rtx stop)
353 const char *fmt;
354 RTX_CODE code;
355 int i, j, len;
356 rtx r;
358 if (pattern == stop)
359 return stop;
361 code = GET_CODE (pattern);
362 if ((code == MATCH_SCRATCH
363 || code == MATCH_INSN
364 || code == MATCH_OPERAND
365 || code == MATCH_OPERATOR
366 || code == MATCH_PARALLEL)
367 && XINT (pattern, 0) == n)
368 return pattern;
370 fmt = GET_RTX_FORMAT (code);
371 len = GET_RTX_LENGTH (code);
372 for (i = 0; i < len; i++)
374 switch (fmt[i])
376 case 'e': case 'u':
377 if ((r = find_operand (XEXP (pattern, i), n, stop)) != NULL_RTX)
378 return r;
379 break;
381 case 'V':
382 if (! XVEC (pattern, i))
383 break;
384 /* Fall through. */
386 case 'E':
387 for (j = 0; j < XVECLEN (pattern, i); j++)
388 if ((r = find_operand (XVECEXP (pattern, i, j), n, stop))
389 != NULL_RTX)
390 return r;
391 break;
393 case 'i': case 'w': case '0': case 's':
394 break;
396 default:
397 abort ();
401 return NULL;
404 /* Search for and return operand M, such that it has a matching
405 constraint for operand N. */
407 static rtx
408 find_matching_operand (rtx pattern, int n)
410 const char *fmt;
411 RTX_CODE code;
412 int i, j, len;
413 rtx r;
415 code = GET_CODE (pattern);
416 if (code == MATCH_OPERAND
417 && (XSTR (pattern, 2)[0] == '0' + n
418 || (XSTR (pattern, 2)[0] == '%'
419 && XSTR (pattern, 2)[1] == '0' + n)))
420 return pattern;
422 fmt = GET_RTX_FORMAT (code);
423 len = GET_RTX_LENGTH (code);
424 for (i = 0; i < len; i++)
426 switch (fmt[i])
428 case 'e': case 'u':
429 if ((r = find_matching_operand (XEXP (pattern, i), n)))
430 return r;
431 break;
433 case 'V':
434 if (! XVEC (pattern, i))
435 break;
436 /* Fall through. */
438 case 'E':
439 for (j = 0; j < XVECLEN (pattern, i); j++)
440 if ((r = find_matching_operand (XVECEXP (pattern, i, j), n)))
441 return r;
442 break;
444 case 'i': case 'w': case '0': case 's':
445 break;
447 default:
448 abort ();
452 return NULL;
456 /* Check for various errors in patterns. SET is nonnull for a destination,
457 and is the complete set pattern. SET_CODE is '=' for normal sets, and
458 '+' within a context that requires in-out constraints. */
460 static void
461 validate_pattern (rtx pattern, rtx insn, rtx set, int set_code)
463 const char *fmt;
464 RTX_CODE code;
465 size_t i, len;
466 int j;
468 code = GET_CODE (pattern);
469 switch (code)
471 case MATCH_SCRATCH:
472 return;
473 case MATCH_DUP:
474 case MATCH_OP_DUP:
475 case MATCH_PAR_DUP:
476 if (find_operand (insn, XINT (pattern, 0), pattern) == pattern)
478 message_with_line (pattern_lineno,
479 "operand %i duplicated before defined",
480 XINT (pattern, 0));
481 error_count++;
483 break;
484 case MATCH_INSN:
485 case MATCH_OPERAND:
486 case MATCH_OPERATOR:
488 const char *pred_name = XSTR (pattern, 1);
489 int allows_non_lvalue = 1, allows_non_const = 1;
490 int special_mode_pred = 0;
491 const char *c_test;
493 if (GET_CODE (insn) == DEFINE_INSN)
494 c_test = XSTR (insn, 2);
495 else
496 c_test = XSTR (insn, 1);
498 if (pred_name[0] != 0)
500 for (i = 0; i < NUM_KNOWN_PREDS; i++)
501 if (! strcmp (preds[i].name, pred_name))
502 break;
504 if (i < NUM_KNOWN_PREDS)
506 int j;
508 allows_non_lvalue = allows_non_const = 0;
509 for (j = 0; preds[i].codes[j] != 0; j++)
511 RTX_CODE c = preds[i].codes[j];
512 if (c != LABEL_REF
513 && c != SYMBOL_REF
514 && c != CONST_INT
515 && c != CONST_DOUBLE
516 && c != CONST
517 && c != HIGH
518 && c != CONSTANT_P_RTX)
519 allows_non_const = 1;
521 if (c != REG
522 && c != SUBREG
523 && c != MEM
524 && c != ADDRESSOF
525 && c != CONCAT
526 && c != PARALLEL
527 && c != STRICT_LOW_PART)
528 allows_non_lvalue = 1;
531 else
533 #ifdef PREDICATE_CODES
534 /* If the port has a list of the predicates it uses but
535 omits one, warn. */
536 message_with_line (pattern_lineno,
537 "warning: `%s' not in PREDICATE_CODES",
538 pred_name);
539 #endif
542 for (i = 0; i < NUM_SPECIAL_MODE_PREDS; ++i)
543 if (strcmp (pred_name, special_mode_pred_table[i]) == 0)
545 special_mode_pred = 1;
546 break;
550 if (code == MATCH_OPERAND)
552 const char constraints0 = XSTR (pattern, 2)[0];
554 /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we
555 don't use the MATCH_OPERAND constraint, only the predicate.
556 This is confusing to folks doing new ports, so help them
557 not make the mistake. */
558 if (GET_CODE (insn) == DEFINE_EXPAND
559 || GET_CODE (insn) == DEFINE_SPLIT
560 || GET_CODE (insn) == DEFINE_PEEPHOLE2)
562 if (constraints0)
563 message_with_line (pattern_lineno,
564 "warning: constraints not supported in %s",
565 rtx_name[GET_CODE (insn)]);
568 /* A MATCH_OPERAND that is a SET should have an output reload. */
569 else if (set && constraints0)
571 if (set_code == '+')
573 if (constraints0 == '+')
575 /* If we've only got an output reload for this operand,
576 we'd better have a matching input operand. */
577 else if (constraints0 == '='
578 && find_matching_operand (insn, XINT (pattern, 0)))
580 else
582 message_with_line (pattern_lineno,
583 "operand %d missing in-out reload",
584 XINT (pattern, 0));
585 error_count++;
588 else if (constraints0 != '=' && constraints0 != '+')
590 message_with_line (pattern_lineno,
591 "operand %d missing output reload",
592 XINT (pattern, 0));
593 error_count++;
598 /* Allowing non-lvalues in destinations -- particularly CONST_INT --
599 while not likely to occur at runtime, results in less efficient
600 code from insn-recog.c. */
601 if (set
602 && pred_name[0] != '\0'
603 && allows_non_lvalue)
605 message_with_line (pattern_lineno,
606 "warning: destination operand %d allows non-lvalue",
607 XINT (pattern, 0));
610 /* A modeless MATCH_OPERAND can be handy when we can
611 check for multiple modes in the c_test. In most other cases,
612 it is a mistake. Only DEFINE_INSN is eligible, since SPLIT
613 and PEEP2 can FAIL within the output pattern. Exclude
614 address_operand, since its mode is related to the mode of
615 the memory not the operand. Exclude the SET_DEST of a call
616 instruction, as that is a common idiom. */
618 if (GET_MODE (pattern) == VOIDmode
619 && code == MATCH_OPERAND
620 && GET_CODE (insn) == DEFINE_INSN
621 && allows_non_const
622 && ! special_mode_pred
623 && pred_name[0] != '\0'
624 && strcmp (pred_name, "address_operand") != 0
625 && strstr (c_test, "operands") == NULL
626 && ! (set
627 && GET_CODE (set) == SET
628 && GET_CODE (SET_SRC (set)) == CALL))
630 message_with_line (pattern_lineno,
631 "warning: operand %d missing mode?",
632 XINT (pattern, 0));
634 return;
637 case SET:
639 enum machine_mode dmode, smode;
640 rtx dest, src;
642 dest = SET_DEST (pattern);
643 src = SET_SRC (pattern);
645 /* STRICT_LOW_PART is a wrapper. Its argument is the real
646 destination, and it's mode should match the source. */
647 if (GET_CODE (dest) == STRICT_LOW_PART)
648 dest = XEXP (dest, 0);
650 /* Find the referent for a DUP. */
652 if (GET_CODE (dest) == MATCH_DUP
653 || GET_CODE (dest) == MATCH_OP_DUP
654 || GET_CODE (dest) == MATCH_PAR_DUP)
655 dest = find_operand (insn, XINT (dest, 0), NULL);
657 if (GET_CODE (src) == MATCH_DUP
658 || GET_CODE (src) == MATCH_OP_DUP
659 || GET_CODE (src) == MATCH_PAR_DUP)
660 src = find_operand (insn, XINT (src, 0), NULL);
662 dmode = GET_MODE (dest);
663 smode = GET_MODE (src);
665 /* The mode of an ADDRESS_OPERAND is the mode of the memory
666 reference, not the mode of the address. */
667 if (GET_CODE (src) == MATCH_OPERAND
668 && ! strcmp (XSTR (src, 1), "address_operand"))
671 /* The operands of a SET must have the same mode unless one
672 is VOIDmode. */
673 else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode)
675 message_with_line (pattern_lineno,
676 "mode mismatch in set: %smode vs %smode",
677 GET_MODE_NAME (dmode), GET_MODE_NAME (smode));
678 error_count++;
681 /* If only one of the operands is VOIDmode, and PC or CC0 is
682 not involved, it's probably a mistake. */
683 else if (dmode != smode
684 && GET_CODE (dest) != PC
685 && GET_CODE (dest) != CC0
686 && GET_CODE (src) != PC
687 && GET_CODE (src) != CC0
688 && GET_CODE (src) != CONST_INT)
690 const char *which;
691 which = (dmode == VOIDmode ? "destination" : "source");
692 message_with_line (pattern_lineno,
693 "warning: %s missing a mode?", which);
696 if (dest != SET_DEST (pattern))
697 validate_pattern (dest, insn, pattern, '=');
698 validate_pattern (SET_DEST (pattern), insn, pattern, '=');
699 validate_pattern (SET_SRC (pattern), insn, NULL_RTX, 0);
700 return;
703 case CLOBBER:
704 validate_pattern (SET_DEST (pattern), insn, pattern, '=');
705 return;
707 case ZERO_EXTRACT:
708 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0);
709 validate_pattern (XEXP (pattern, 1), insn, NULL_RTX, 0);
710 validate_pattern (XEXP (pattern, 2), insn, NULL_RTX, 0);
711 return;
713 case STRICT_LOW_PART:
714 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0);
715 return;
717 case LABEL_REF:
718 if (GET_MODE (XEXP (pattern, 0)) != VOIDmode)
720 message_with_line (pattern_lineno,
721 "operand to label_ref %smode not VOIDmode",
722 GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
723 error_count++;
725 break;
727 default:
728 break;
731 fmt = GET_RTX_FORMAT (code);
732 len = GET_RTX_LENGTH (code);
733 for (i = 0; i < len; i++)
735 switch (fmt[i])
737 case 'e': case 'u':
738 validate_pattern (XEXP (pattern, i), insn, NULL_RTX, 0);
739 break;
741 case 'E':
742 for (j = 0; j < XVECLEN (pattern, i); j++)
743 validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX, 0);
744 break;
746 case 'i': case 'w': case '0': case 's':
747 break;
749 default:
750 abort ();
755 /* Create a chain of nodes to verify that an rtl expression matches
756 PATTERN.
758 LAST is a pointer to the listhead in the previous node in the chain (or
759 in the calling function, for the first node).
761 POSITION is the string representing the current position in the insn.
763 INSN_TYPE is the type of insn for which we are emitting code.
765 A pointer to the final node in the chain is returned. */
767 static struct decision *
768 add_to_sequence (rtx pattern, struct decision_head *last, const char *position,
769 enum routine_type insn_type, int top)
771 RTX_CODE code;
772 struct decision *this, *sub;
773 struct decision_test *test;
774 struct decision_test **place;
775 char *subpos;
776 size_t i;
777 const char *fmt;
778 int depth = strlen (position);
779 int len;
780 enum machine_mode mode;
782 if (depth > max_depth)
783 max_depth = depth;
785 subpos = xmalloc (depth + 2);
786 strcpy (subpos, position);
787 subpos[depth + 1] = 0;
789 sub = this = new_decision (position, last);
790 place = &this->tests;
792 restart:
793 mode = GET_MODE (pattern);
794 code = GET_CODE (pattern);
796 switch (code)
798 case PARALLEL:
799 /* Toplevel peephole pattern. */
800 if (insn_type == PEEPHOLE2 && top)
802 /* We don't need the node we just created -- unlink it. */
803 last->first = last->last = NULL;
805 for (i = 0; i < (size_t) XVECLEN (pattern, 0); i++)
807 /* Which insn we're looking at is represented by A-Z. We don't
808 ever use 'A', however; it is always implied. */
810 subpos[depth] = (i > 0 ? 'A' + i : 0);
811 sub = add_to_sequence (XVECEXP (pattern, 0, i),
812 last, subpos, insn_type, 0);
813 last = &sub->success;
815 goto ret;
818 /* Else nothing special. */
819 break;
821 case MATCH_PARALLEL:
822 /* The explicit patterns within a match_parallel enforce a minimum
823 length on the vector. The match_parallel predicate may allow
824 for more elements. We do need to check for this minimum here
825 or the code generated to match the internals may reference data
826 beyond the end of the vector. */
827 test = new_decision_test (DT_veclen_ge, &place);
828 test->u.veclen = XVECLEN (pattern, 2);
829 /* Fall through. */
831 case MATCH_OPERAND:
832 case MATCH_SCRATCH:
833 case MATCH_OPERATOR:
834 case MATCH_INSN:
836 const char *pred_name;
837 RTX_CODE was_code = code;
838 int allows_const_int = 1;
840 if (code == MATCH_SCRATCH)
842 pred_name = "scratch_operand";
843 code = UNKNOWN;
845 else
847 pred_name = XSTR (pattern, 1);
848 if (code == MATCH_PARALLEL)
849 code = PARALLEL;
850 else
851 code = UNKNOWN;
854 if (pred_name[0] != 0)
856 test = new_decision_test (DT_pred, &place);
857 test->u.pred.name = pred_name;
858 test->u.pred.mode = mode;
860 /* See if we know about this predicate and save its number.
861 If we do, and it only accepts one code, note that fact.
863 If we know that the predicate does not allow CONST_INT,
864 we know that the only way the predicate can match is if
865 the modes match (here we use the kludge of relying on the
866 fact that "address_operand" accepts CONST_INT; otherwise,
867 it would have to be a special case), so we can test the
868 mode (but we need not). This fact should considerably
869 simplify the generated code. */
871 for (i = 0; i < NUM_KNOWN_PREDS; i++)
872 if (! strcmp (preds[i].name, pred_name))
873 break;
875 if (i < NUM_KNOWN_PREDS)
877 int j;
879 test->u.pred.index = i;
881 if (preds[i].codes[1] == 0 && code == UNKNOWN)
882 code = preds[i].codes[0];
884 allows_const_int = 0;
885 for (j = 0; preds[i].codes[j] != 0; j++)
886 if (preds[i].codes[j] == CONST_INT)
888 allows_const_int = 1;
889 break;
892 else
893 test->u.pred.index = -1;
896 /* Can't enforce a mode if we allow const_int. */
897 if (allows_const_int)
898 mode = VOIDmode;
900 /* Accept the operand, ie. record it in `operands'. */
901 test = new_decision_test (DT_accept_op, &place);
902 test->u.opno = XINT (pattern, 0);
904 if (was_code == MATCH_OPERATOR || was_code == MATCH_PARALLEL)
906 char base = (was_code == MATCH_OPERATOR ? '0' : 'a');
907 for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++)
909 subpos[depth] = i + base;
910 sub = add_to_sequence (XVECEXP (pattern, 2, i),
911 &sub->success, subpos, insn_type, 0);
914 goto fini;
917 case MATCH_OP_DUP:
918 code = UNKNOWN;
920 test = new_decision_test (DT_dup, &place);
921 test->u.dup = XINT (pattern, 0);
923 test = new_decision_test (DT_accept_op, &place);
924 test->u.opno = XINT (pattern, 0);
926 for (i = 0; i < (size_t) XVECLEN (pattern, 1); i++)
928 subpos[depth] = i + '0';
929 sub = add_to_sequence (XVECEXP (pattern, 1, i),
930 &sub->success, subpos, insn_type, 0);
932 goto fini;
934 case MATCH_DUP:
935 case MATCH_PAR_DUP:
936 code = UNKNOWN;
938 test = new_decision_test (DT_dup, &place);
939 test->u.dup = XINT (pattern, 0);
940 goto fini;
942 case ADDRESS:
943 pattern = XEXP (pattern, 0);
944 goto restart;
946 default:
947 break;
950 fmt = GET_RTX_FORMAT (code);
951 len = GET_RTX_LENGTH (code);
953 /* Do tests against the current node first. */
954 for (i = 0; i < (size_t) len; i++)
956 if (fmt[i] == 'i')
958 if (i == 0)
960 test = new_decision_test (DT_elt_zero_int, &place);
961 test->u.intval = XINT (pattern, i);
963 else if (i == 1)
965 test = new_decision_test (DT_elt_one_int, &place);
966 test->u.intval = XINT (pattern, i);
968 else
969 abort ();
971 else if (fmt[i] == 'w')
973 /* If this value actually fits in an int, we can use a switch
974 statement here, so indicate that. */
975 enum decision_type type
976 = ((int) XWINT (pattern, i) == XWINT (pattern, i))
977 ? DT_elt_zero_wide_safe : DT_elt_zero_wide;
979 if (i != 0)
980 abort ();
982 test = new_decision_test (type, &place);
983 test->u.intval = XWINT (pattern, i);
985 else if (fmt[i] == 'E')
987 if (i != 0)
988 abort ();
990 test = new_decision_test (DT_veclen, &place);
991 test->u.veclen = XVECLEN (pattern, i);
995 /* Now test our sub-patterns. */
996 for (i = 0; i < (size_t) len; i++)
998 switch (fmt[i])
1000 case 'e': case 'u':
1001 subpos[depth] = '0' + i;
1002 sub = add_to_sequence (XEXP (pattern, i), &sub->success,
1003 subpos, insn_type, 0);
1004 break;
1006 case 'E':
1008 int j;
1009 for (j = 0; j < XVECLEN (pattern, i); j++)
1011 subpos[depth] = 'a' + j;
1012 sub = add_to_sequence (XVECEXP (pattern, i, j),
1013 &sub->success, subpos, insn_type, 0);
1015 break;
1018 case 'i': case 'w':
1019 /* Handled above. */
1020 break;
1021 case '0':
1022 break;
1024 default:
1025 abort ();
1029 fini:
1030 /* Insert nodes testing mode and code, if they're still relevant,
1031 before any of the nodes we may have added above. */
1032 if (code != UNKNOWN)
1034 place = &this->tests;
1035 test = new_decision_test (DT_code, &place);
1036 test->u.code = code;
1039 if (mode != VOIDmode)
1041 place = &this->tests;
1042 test = new_decision_test (DT_mode, &place);
1043 test->u.mode = mode;
1046 /* If we didn't insert any tests or accept nodes, hork. */
1047 if (this->tests == NULL)
1048 abort ();
1050 ret:
1051 free (subpos);
1052 return sub;
1055 /* A subroutine of maybe_both_true; examines only one test.
1056 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
1058 static int
1059 maybe_both_true_2 (struct decision_test *d1, struct decision_test *d2)
1061 if (d1->type == d2->type)
1063 switch (d1->type)
1065 case DT_mode:
1066 return d1->u.mode == d2->u.mode;
1068 case DT_code:
1069 return d1->u.code == d2->u.code;
1071 case DT_veclen:
1072 return d1->u.veclen == d2->u.veclen;
1074 case DT_elt_zero_int:
1075 case DT_elt_one_int:
1076 case DT_elt_zero_wide:
1077 case DT_elt_zero_wide_safe:
1078 return d1->u.intval == d2->u.intval;
1080 default:
1081 break;
1085 /* If either has a predicate that we know something about, set
1086 things up so that D1 is the one that always has a known
1087 predicate. Then see if they have any codes in common. */
1089 if (d1->type == DT_pred || d2->type == DT_pred)
1091 if (d2->type == DT_pred)
1093 struct decision_test *tmp;
1094 tmp = d1, d1 = d2, d2 = tmp;
1097 /* If D2 tests a mode, see if it matches D1. */
1098 if (d1->u.pred.mode != VOIDmode)
1100 if (d2->type == DT_mode)
1102 if (d1->u.pred.mode != d2->u.mode
1103 /* The mode of an address_operand predicate is the
1104 mode of the memory, not the operand. It can only
1105 be used for testing the predicate, so we must
1106 ignore it here. */
1107 && strcmp (d1->u.pred.name, "address_operand") != 0)
1108 return 0;
1110 /* Don't check two predicate modes here, because if both predicates
1111 accept CONST_INT, then both can still be true even if the modes
1112 are different. If they don't accept CONST_INT, there will be a
1113 separate DT_mode that will make maybe_both_true_1 return 0. */
1116 if (d1->u.pred.index >= 0)
1118 /* If D2 tests a code, see if it is in the list of valid
1119 codes for D1's predicate. */
1120 if (d2->type == DT_code)
1122 const RTX_CODE *c = &preds[d1->u.pred.index].codes[0];
1123 while (*c != 0)
1125 if (*c == d2->u.code)
1126 break;
1127 ++c;
1129 if (*c == 0)
1130 return 0;
1133 /* Otherwise see if the predicates have any codes in common. */
1134 else if (d2->type == DT_pred && d2->u.pred.index >= 0)
1136 const RTX_CODE *c1 = &preds[d1->u.pred.index].codes[0];
1137 int common = 0;
1139 while (*c1 != 0 && !common)
1141 const RTX_CODE *c2 = &preds[d2->u.pred.index].codes[0];
1142 while (*c2 != 0 && !common)
1144 common = (*c1 == *c2);
1145 ++c2;
1147 ++c1;
1150 if (!common)
1151 return 0;
1156 /* Tests vs veclen may be known when strict equality is involved. */
1157 if (d1->type == DT_veclen && d2->type == DT_veclen_ge)
1158 return d1->u.veclen >= d2->u.veclen;
1159 if (d1->type == DT_veclen_ge && d2->type == DT_veclen)
1160 return d2->u.veclen >= d1->u.veclen;
1162 return -1;
1165 /* A subroutine of maybe_both_true; examines all the tests for a given node.
1166 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */
1168 static int
1169 maybe_both_true_1 (struct decision_test *d1, struct decision_test *d2)
1171 struct decision_test *t1, *t2;
1173 /* A match_operand with no predicate can match anything. Recognize
1174 this by the existence of a lone DT_accept_op test. */
1175 if (d1->type == DT_accept_op || d2->type == DT_accept_op)
1176 return 1;
1178 /* Eliminate pairs of tests while they can exactly match. */
1179 while (d1 && d2 && d1->type == d2->type)
1181 if (maybe_both_true_2 (d1, d2) == 0)
1182 return 0;
1183 d1 = d1->next, d2 = d2->next;
1186 /* After that, consider all pairs. */
1187 for (t1 = d1; t1 ; t1 = t1->next)
1188 for (t2 = d2; t2 ; t2 = t2->next)
1189 if (maybe_both_true_2 (t1, t2) == 0)
1190 return 0;
1192 return -1;
1195 /* Return 0 if we can prove that there is no RTL that can match both
1196 D1 and D2. Otherwise, return 1 (it may be that there is an RTL that
1197 can match both or just that we couldn't prove there wasn't such an RTL).
1199 TOPLEVEL is nonzero if we are to only look at the top level and not
1200 recursively descend. */
1202 static int
1203 maybe_both_true (struct decision *d1, struct decision *d2,
1204 int toplevel)
1206 struct decision *p1, *p2;
1207 int cmp;
1209 /* Don't compare strings on the different positions in insn. Doing so
1210 is incorrect and results in false matches from constructs like
1212 [(set (subreg:HI (match_operand:SI "register_operand" "r") 0)
1213 (subreg:HI (match_operand:SI "register_operand" "r") 0))]
1215 [(set (match_operand:HI "register_operand" "r")
1216 (match_operand:HI "register_operand" "r"))]
1218 If we are presented with such, we are recursing through the remainder
1219 of a node's success nodes (from the loop at the end of this function).
1220 Skip forward until we come to a position that matches.
1222 Due to the way position strings are constructed, we know that iterating
1223 forward from the lexically lower position (e.g. "00") will run into
1224 the lexically higher position (e.g. "1") and not the other way around.
1225 This saves a bit of effort. */
1227 cmp = strcmp (d1->position, d2->position);
1228 if (cmp != 0)
1230 if (toplevel)
1231 abort ();
1233 /* If the d2->position was lexically lower, swap. */
1234 if (cmp > 0)
1235 p1 = d1, d1 = d2, d2 = p1;
1237 if (d1->success.first == 0)
1238 return 1;
1239 for (p1 = d1->success.first; p1; p1 = p1->next)
1240 if (maybe_both_true (p1, d2, 0))
1241 return 1;
1243 return 0;
1246 /* Test the current level. */
1247 cmp = maybe_both_true_1 (d1->tests, d2->tests);
1248 if (cmp >= 0)
1249 return cmp;
1251 /* We can't prove that D1 and D2 cannot both be true. If we are only
1252 to check the top level, return 1. Otherwise, see if we can prove
1253 that all choices in both successors are mutually exclusive. If
1254 either does not have any successors, we can't prove they can't both
1255 be true. */
1257 if (toplevel || d1->success.first == 0 || d2->success.first == 0)
1258 return 1;
1260 for (p1 = d1->success.first; p1; p1 = p1->next)
1261 for (p2 = d2->success.first; p2; p2 = p2->next)
1262 if (maybe_both_true (p1, p2, 0))
1263 return 1;
1265 return 0;
1268 /* A subroutine of nodes_identical. Examine two tests for equivalence. */
1270 static int
1271 nodes_identical_1 (struct decision_test *d1, struct decision_test *d2)
1273 switch (d1->type)
1275 case DT_mode:
1276 return d1->u.mode == d2->u.mode;
1278 case DT_code:
1279 return d1->u.code == d2->u.code;
1281 case DT_pred:
1282 return (d1->u.pred.mode == d2->u.pred.mode
1283 && strcmp (d1->u.pred.name, d2->u.pred.name) == 0);
1285 case DT_c_test:
1286 return strcmp (d1->u.c_test, d2->u.c_test) == 0;
1288 case DT_veclen:
1289 case DT_veclen_ge:
1290 return d1->u.veclen == d2->u.veclen;
1292 case DT_dup:
1293 return d1->u.dup == d2->u.dup;
1295 case DT_elt_zero_int:
1296 case DT_elt_one_int:
1297 case DT_elt_zero_wide:
1298 case DT_elt_zero_wide_safe:
1299 return d1->u.intval == d2->u.intval;
1301 case DT_accept_op:
1302 return d1->u.opno == d2->u.opno;
1304 case DT_accept_insn:
1305 /* Differences will be handled in merge_accept_insn. */
1306 return 1;
1308 default:
1309 abort ();
1313 /* True iff the two nodes are identical (on one level only). Due
1314 to the way these lists are constructed, we shouldn't have to
1315 consider different orderings on the tests. */
1317 static int
1318 nodes_identical (struct decision *d1, struct decision *d2)
1320 struct decision_test *t1, *t2;
1322 for (t1 = d1->tests, t2 = d2->tests; t1 && t2; t1 = t1->next, t2 = t2->next)
1324 if (t1->type != t2->type)
1325 return 0;
1326 if (! nodes_identical_1 (t1, t2))
1327 return 0;
1330 /* For success, they should now both be null. */
1331 if (t1 != t2)
1332 return 0;
1334 /* Check that their subnodes are at the same position, as any one set
1335 of sibling decisions must be at the same position. Allowing this
1336 requires complications to find_afterward and when change_state is
1337 invoked. */
1338 if (d1->success.first
1339 && d2->success.first
1340 && strcmp (d1->success.first->position, d2->success.first->position))
1341 return 0;
1343 return 1;
1346 /* A subroutine of merge_trees; given two nodes that have been declared
1347 identical, cope with two insn accept states. If they differ in the
1348 number of clobbers, then the conflict was created by make_insn_sequence
1349 and we can drop the with-clobbers version on the floor. If both
1350 nodes have no additional clobbers, we have found an ambiguity in the
1351 source machine description. */
1353 static void
1354 merge_accept_insn (struct decision *oldd, struct decision *addd)
1356 struct decision_test *old, *add;
1358 for (old = oldd->tests; old; old = old->next)
1359 if (old->type == DT_accept_insn)
1360 break;
1361 if (old == NULL)
1362 return;
1364 for (add = addd->tests; add; add = add->next)
1365 if (add->type == DT_accept_insn)
1366 break;
1367 if (add == NULL)
1368 return;
1370 /* If one node is for a normal insn and the second is for the base
1371 insn with clobbers stripped off, the second node should be ignored. */
1373 if (old->u.insn.num_clobbers_to_add == 0
1374 && add->u.insn.num_clobbers_to_add > 0)
1376 /* Nothing to do here. */
1378 else if (old->u.insn.num_clobbers_to_add > 0
1379 && add->u.insn.num_clobbers_to_add == 0)
1381 /* In this case, replace OLD with ADD. */
1382 old->u.insn = add->u.insn;
1384 else
1386 message_with_line (add->u.insn.lineno, "`%s' matches `%s'",
1387 get_insn_name (add->u.insn.code_number),
1388 get_insn_name (old->u.insn.code_number));
1389 message_with_line (old->u.insn.lineno, "previous definition of `%s'",
1390 get_insn_name (old->u.insn.code_number));
1391 error_count++;
1395 /* Merge two decision trees OLDH and ADDH, modifying OLDH destructively. */
1397 static void
1398 merge_trees (struct decision_head *oldh, struct decision_head *addh)
1400 struct decision *next, *add;
1402 if (addh->first == 0)
1403 return;
1404 if (oldh->first == 0)
1406 *oldh = *addh;
1407 return;
1410 /* Trying to merge bits at different positions isn't possible. */
1411 if (strcmp (oldh->first->position, addh->first->position))
1412 abort ();
1414 for (add = addh->first; add ; add = next)
1416 struct decision *old, *insert_before = NULL;
1418 next = add->next;
1420 /* The semantics of pattern matching state that the tests are
1421 done in the order given in the MD file so that if an insn
1422 matches two patterns, the first one will be used. However,
1423 in practice, most, if not all, patterns are unambiguous so
1424 that their order is independent. In that case, we can merge
1425 identical tests and group all similar modes and codes together.
1427 Scan starting from the end of OLDH until we reach a point
1428 where we reach the head of the list or where we pass a
1429 pattern that could also be true if NEW is true. If we find
1430 an identical pattern, we can merge them. Also, record the
1431 last node that tests the same code and mode and the last one
1432 that tests just the same mode.
1434 If we have no match, place NEW after the closest match we found. */
1436 for (old = oldh->last; old; old = old->prev)
1438 if (nodes_identical (old, add))
1440 merge_accept_insn (old, add);
1441 merge_trees (&old->success, &add->success);
1442 goto merged_nodes;
1445 if (maybe_both_true (old, add, 0))
1446 break;
1448 /* Insert the nodes in DT test type order, which is roughly
1449 how expensive/important the test is. Given that the tests
1450 are also ordered within the list, examining the first is
1451 sufficient. */
1452 if ((int) add->tests->type < (int) old->tests->type)
1453 insert_before = old;
1456 if (insert_before == NULL)
1458 add->next = NULL;
1459 add->prev = oldh->last;
1460 oldh->last->next = add;
1461 oldh->last = add;
1463 else
1465 if ((add->prev = insert_before->prev) != NULL)
1466 add->prev->next = add;
1467 else
1468 oldh->first = add;
1469 add->next = insert_before;
1470 insert_before->prev = add;
1473 merged_nodes:;
1477 /* Walk the tree looking for sub-nodes that perform common tests.
1478 Factor out the common test into a new node. This enables us
1479 (depending on the test type) to emit switch statements later. */
1481 static void
1482 factor_tests (struct decision_head *head)
1484 struct decision *first, *next;
1486 for (first = head->first; first && first->next; first = next)
1488 enum decision_type type;
1489 struct decision *new, *old_last;
1491 type = first->tests->type;
1492 next = first->next;
1494 /* Want at least two compatible sequential nodes. */
1495 if (next->tests->type != type)
1496 continue;
1498 /* Don't want all node types, just those we can turn into
1499 switch statements. */
1500 if (type != DT_mode
1501 && type != DT_code
1502 && type != DT_veclen
1503 && type != DT_elt_zero_int
1504 && type != DT_elt_one_int
1505 && type != DT_elt_zero_wide_safe)
1506 continue;
1508 /* If we'd been performing more than one test, create a new node
1509 below our first test. */
1510 if (first->tests->next != NULL)
1512 new = new_decision (first->position, &first->success);
1513 new->tests = first->tests->next;
1514 first->tests->next = NULL;
1517 /* Crop the node tree off after our first test. */
1518 first->next = NULL;
1519 old_last = head->last;
1520 head->last = first;
1522 /* For each compatible test, adjust to perform only one test in
1523 the top level node, then merge the node back into the tree. */
1526 struct decision_head h;
1528 if (next->tests->next != NULL)
1530 new = new_decision (next->position, &next->success);
1531 new->tests = next->tests->next;
1532 next->tests->next = NULL;
1534 new = next;
1535 next = next->next;
1536 new->next = NULL;
1537 h.first = h.last = new;
1539 merge_trees (head, &h);
1541 while (next && next->tests->type == type);
1543 /* After we run out of compatible tests, graft the remaining nodes
1544 back onto the tree. */
1545 if (next)
1547 next->prev = head->last;
1548 head->last->next = next;
1549 head->last = old_last;
1553 /* Recurse. */
1554 for (first = head->first; first; first = first->next)
1555 factor_tests (&first->success);
1558 /* After factoring, try to simplify the tests on any one node.
1559 Tests that are useful for switch statements are recognizable
1560 by having only a single test on a node -- we'll be manipulating
1561 nodes with multiple tests:
1563 If we have mode tests or code tests that are redundant with
1564 predicates, remove them. */
1566 static void
1567 simplify_tests (struct decision_head *head)
1569 struct decision *tree;
1571 for (tree = head->first; tree; tree = tree->next)
1573 struct decision_test *a, *b;
1575 a = tree->tests;
1576 b = a->next;
1577 if (b == NULL)
1578 continue;
1580 /* Find a predicate node. */
1581 while (b && b->type != DT_pred)
1582 b = b->next;
1583 if (b)
1585 /* Due to how these tests are constructed, we don't even need
1586 to check that the mode and code are compatible -- they were
1587 generated from the predicate in the first place. */
1588 while (a->type == DT_mode || a->type == DT_code)
1589 a = a->next;
1590 tree->tests = a;
1594 /* Recurse. */
1595 for (tree = head->first; tree; tree = tree->next)
1596 simplify_tests (&tree->success);
1599 /* Count the number of subnodes of HEAD. If the number is high enough,
1600 make the first node in HEAD start a separate subroutine in the C code
1601 that is generated. */
1603 static int
1604 break_out_subroutines (struct decision_head *head, int initial)
1606 int size = 0;
1607 struct decision *sub;
1609 for (sub = head->first; sub; sub = sub->next)
1610 size += 1 + break_out_subroutines (&sub->success, 0);
1612 if (size > SUBROUTINE_THRESHOLD && ! initial)
1614 head->first->subroutine_number = ++next_subroutine_number;
1615 size = 1;
1617 return size;
1620 /* For each node p, find the next alternative that might be true
1621 when p is true. */
1623 static void
1624 find_afterward (struct decision_head *head, struct decision *real_afterward)
1626 struct decision *p, *q, *afterward;
1628 /* We can't propagate alternatives across subroutine boundaries.
1629 This is not incorrect, merely a minor optimization loss. */
1631 p = head->first;
1632 afterward = (p->subroutine_number > 0 ? NULL : real_afterward);
1634 for ( ; p ; p = p->next)
1636 /* Find the next node that might be true if this one fails. */
1637 for (q = p->next; q ; q = q->next)
1638 if (maybe_both_true (p, q, 1))
1639 break;
1641 /* If we reached the end of the list without finding one,
1642 use the incoming afterward position. */
1643 if (!q)
1644 q = afterward;
1645 p->afterward = q;
1646 if (q)
1647 q->need_label = 1;
1650 /* Recurse. */
1651 for (p = head->first; p ; p = p->next)
1652 if (p->success.first)
1653 find_afterward (&p->success, p->afterward);
1655 /* When we are generating a subroutine, record the real afterward
1656 position in the first node where write_tree can find it, and we
1657 can do the right thing at the subroutine call site. */
1658 p = head->first;
1659 if (p->subroutine_number > 0)
1660 p->afterward = real_afterward;
1663 /* Assuming that the state of argument is denoted by OLDPOS, take whatever
1664 actions are necessary to move to NEWPOS. If we fail to move to the
1665 new state, branch to node AFTERWARD if nonzero, otherwise return.
1667 Failure to move to the new state can only occur if we are trying to
1668 match multiple insns and we try to step past the end of the stream. */
1670 static void
1671 change_state (const char *oldpos, const char *newpos,
1672 struct decision *afterward, const char *indent)
1674 int odepth = strlen (oldpos);
1675 int ndepth = strlen (newpos);
1676 int depth;
1677 int old_has_insn, new_has_insn;
1679 /* Pop up as many levels as necessary. */
1680 for (depth = odepth; strncmp (oldpos, newpos, depth) != 0; --depth)
1681 continue;
1683 /* Hunt for the last [A-Z] in both strings. */
1684 for (old_has_insn = odepth - 1; old_has_insn >= 0; --old_has_insn)
1685 if (ISUPPER (oldpos[old_has_insn]))
1686 break;
1687 for (new_has_insn = ndepth - 1; new_has_insn >= 0; --new_has_insn)
1688 if (ISUPPER (newpos[new_has_insn]))
1689 break;
1691 /* Go down to desired level. */
1692 while (depth < ndepth)
1694 /* It's a different insn from the first one. */
1695 if (ISUPPER (newpos[depth]))
1697 /* We can only fail if we're moving down the tree. */
1698 if (old_has_insn >= 0 && oldpos[old_has_insn] >= newpos[depth])
1700 printf ("%stem = peep2_next_insn (%d);\n",
1701 indent, newpos[depth] - 'A');
1703 else
1705 printf ("%stem = peep2_next_insn (%d);\n",
1706 indent, newpos[depth] - 'A');
1707 printf ("%sif (tem == NULL_RTX)\n", indent);
1708 if (afterward)
1709 printf ("%s goto L%d;\n", indent, afterward->number);
1710 else
1711 printf ("%s goto ret0;\n", indent);
1713 printf ("%sx%d = PATTERN (tem);\n", indent, depth + 1);
1715 else if (ISLOWER (newpos[depth]))
1716 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1717 indent, depth + 1, depth, newpos[depth] - 'a');
1718 else
1719 printf ("%sx%d = XEXP (x%d, %c);\n",
1720 indent, depth + 1, depth, newpos[depth]);
1721 ++depth;
1725 /* Print the enumerator constant for CODE -- the upcase version of
1726 the name. */
1728 static void
1729 print_code (enum rtx_code code)
1731 const char *p;
1732 for (p = GET_RTX_NAME (code); *p; p++)
1733 putchar (TOUPPER (*p));
1736 /* Emit code to cross an afterward link -- change state and branch. */
1738 static void
1739 write_afterward (struct decision *start, struct decision *afterward,
1740 const char *indent)
1742 if (!afterward || start->subroutine_number > 0)
1743 printf("%sgoto ret0;\n", indent);
1744 else
1746 change_state (start->position, afterward->position, NULL, indent);
1747 printf ("%sgoto L%d;\n", indent, afterward->number);
1751 /* Emit a HOST_WIDE_INT as an integer constant expression. We need to take
1752 special care to avoid "decimal constant is so large that it is unsigned"
1753 warnings in the resulting code. */
1755 static void
1756 print_host_wide_int (HOST_WIDE_INT val)
1758 HOST_WIDE_INT min = (unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1);
1759 if (val == min)
1760 printf ("(" HOST_WIDE_INT_PRINT_DEC_C "-1)", val + 1);
1761 else
1762 printf (HOST_WIDE_INT_PRINT_DEC_C, val);
1765 /* Emit a switch statement, if possible, for an initial sequence of
1766 nodes at START. Return the first node yet untested. */
1768 static struct decision *
1769 write_switch (struct decision *start, int depth)
1771 struct decision *p = start;
1772 enum decision_type type = p->tests->type;
1773 struct decision *needs_label = NULL;
1775 /* If we have two or more nodes in sequence that test the same one
1776 thing, we may be able to use a switch statement. */
1778 if (!p->next
1779 || p->tests->next
1780 || p->next->tests->type != type
1781 || p->next->tests->next
1782 || nodes_identical_1 (p->tests, p->next->tests))
1783 return p;
1785 /* DT_code is special in that we can do interesting things with
1786 known predicates at the same time. */
1787 if (type == DT_code)
1789 char codemap[NUM_RTX_CODE];
1790 struct decision *ret;
1791 RTX_CODE code;
1793 memset (codemap, 0, sizeof(codemap));
1795 printf (" switch (GET_CODE (x%d))\n {\n", depth);
1796 code = p->tests->u.code;
1799 if (p != start && p->need_label && needs_label == NULL)
1800 needs_label = p;
1802 printf (" case ");
1803 print_code (code);
1804 printf (":\n goto L%d;\n", p->success.first->number);
1805 p->success.first->need_label = 1;
1807 codemap[code] = 1;
1808 p = p->next;
1810 while (p
1811 && ! p->tests->next
1812 && p->tests->type == DT_code
1813 && ! codemap[code = p->tests->u.code]);
1815 /* If P is testing a predicate that we know about and we haven't
1816 seen any of the codes that are valid for the predicate, we can
1817 write a series of "case" statement, one for each possible code.
1818 Since we are already in a switch, these redundant tests are very
1819 cheap and will reduce the number of predicates called. */
1821 /* Note that while we write out cases for these predicates here,
1822 we don't actually write the test here, as it gets kinda messy.
1823 It is trivial to leave this to later by telling our caller that
1824 we only processed the CODE tests. */
1825 if (needs_label != NULL)
1826 ret = needs_label;
1827 else
1828 ret = p;
1830 while (p && p->tests->type == DT_pred
1831 && p->tests->u.pred.index >= 0)
1833 const RTX_CODE *c;
1835 for (c = &preds[p->tests->u.pred.index].codes[0]; *c ; ++c)
1836 if (codemap[(int) *c] != 0)
1837 goto pred_done;
1839 for (c = &preds[p->tests->u.pred.index].codes[0]; *c ; ++c)
1841 printf (" case ");
1842 print_code (*c);
1843 printf (":\n");
1844 codemap[(int) *c] = 1;
1847 printf (" goto L%d;\n", p->number);
1848 p->need_label = 1;
1849 p = p->next;
1852 pred_done:
1853 /* Make the default case skip the predicates we managed to match. */
1855 printf (" default:\n");
1856 if (p != ret)
1858 if (p)
1860 printf (" goto L%d;\n", p->number);
1861 p->need_label = 1;
1863 else
1864 write_afterward (start, start->afterward, " ");
1866 else
1867 printf (" break;\n");
1868 printf (" }\n");
1870 return ret;
1872 else if (type == DT_mode
1873 || type == DT_veclen
1874 || type == DT_elt_zero_int
1875 || type == DT_elt_one_int
1876 || type == DT_elt_zero_wide_safe)
1878 const char *indent = "";
1880 /* We cast switch parameter to integer, so we must ensure that the value
1881 fits. */
1882 if (type == DT_elt_zero_wide_safe)
1884 indent = " ";
1885 printf(" if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth, depth);
1887 printf ("%s switch (", indent);
1888 switch (type)
1890 case DT_mode:
1891 printf ("GET_MODE (x%d)", depth);
1892 break;
1893 case DT_veclen:
1894 printf ("XVECLEN (x%d, 0)", depth);
1895 break;
1896 case DT_elt_zero_int:
1897 printf ("XINT (x%d, 0)", depth);
1898 break;
1899 case DT_elt_one_int:
1900 printf ("XINT (x%d, 1)", depth);
1901 break;
1902 case DT_elt_zero_wide_safe:
1903 /* Convert result of XWINT to int for portability since some C
1904 compilers won't do it and some will. */
1905 printf ("(int) XWINT (x%d, 0)", depth);
1906 break;
1907 default:
1908 abort ();
1910 printf (")\n%s {\n", indent);
1914 /* Merge trees will not unify identical nodes if their
1915 sub-nodes are at different levels. Thus we must check
1916 for duplicate cases. */
1917 struct decision *q;
1918 for (q = start; q != p; q = q->next)
1919 if (nodes_identical_1 (p->tests, q->tests))
1920 goto case_done;
1922 if (p != start && p->need_label && needs_label == NULL)
1923 needs_label = p;
1925 printf ("%s case ", indent);
1926 switch (type)
1928 case DT_mode:
1929 printf ("%smode", GET_MODE_NAME (p->tests->u.mode));
1930 break;
1931 case DT_veclen:
1932 printf ("%d", p->tests->u.veclen);
1933 break;
1934 case DT_elt_zero_int:
1935 case DT_elt_one_int:
1936 case DT_elt_zero_wide:
1937 case DT_elt_zero_wide_safe:
1938 print_host_wide_int (p->tests->u.intval);
1939 break;
1940 default:
1941 abort ();
1943 printf (":\n%s goto L%d;\n", indent, p->success.first->number);
1944 p->success.first->need_label = 1;
1946 p = p->next;
1948 while (p && p->tests->type == type && !p->tests->next);
1950 case_done:
1951 printf ("%s default:\n%s break;\n%s }\n",
1952 indent, indent, indent);
1954 return needs_label != NULL ? needs_label : p;
1956 else
1958 /* None of the other tests are amenable. */
1959 return p;
1963 /* Emit code for one test. */
1965 static void
1966 write_cond (struct decision_test *p, int depth,
1967 enum routine_type subroutine_type)
1969 switch (p->type)
1971 case DT_mode:
1972 printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode));
1973 break;
1975 case DT_code:
1976 printf ("GET_CODE (x%d) == ", depth);
1977 print_code (p->u.code);
1978 break;
1980 case DT_veclen:
1981 printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen);
1982 break;
1984 case DT_elt_zero_int:
1985 printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval);
1986 break;
1988 case DT_elt_one_int:
1989 printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval);
1990 break;
1992 case DT_elt_zero_wide:
1993 case DT_elt_zero_wide_safe:
1994 printf ("XWINT (x%d, 0) == ", depth);
1995 print_host_wide_int (p->u.intval);
1996 break;
1998 case DT_veclen_ge:
1999 printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen);
2000 break;
2002 case DT_dup:
2003 printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup);
2004 break;
2006 case DT_pred:
2007 printf ("%s (x%d, %smode)", p->u.pred.name, depth,
2008 GET_MODE_NAME (p->u.pred.mode));
2009 break;
2011 case DT_c_test:
2012 printf ("(%s)", p->u.c_test);
2013 break;
2015 case DT_accept_insn:
2016 switch (subroutine_type)
2018 case RECOG:
2019 if (p->u.insn.num_clobbers_to_add == 0)
2020 abort ();
2021 printf ("pnum_clobbers != NULL");
2022 break;
2024 default:
2025 abort ();
2027 break;
2029 default:
2030 abort ();
2034 /* Emit code for one action. The previous tests have succeeded;
2035 TEST is the last of the chain. In the normal case we simply
2036 perform a state change. For the `accept' tests we must do more work. */
2038 static void
2039 write_action (struct decision *p, struct decision_test *test,
2040 int depth, int uncond, struct decision *success,
2041 enum routine_type subroutine_type)
2043 const char *indent;
2044 int want_close = 0;
2046 if (uncond)
2047 indent = " ";
2048 else if (test->type == DT_accept_op || test->type == DT_accept_insn)
2050 fputs (" {\n", stdout);
2051 indent = " ";
2052 want_close = 1;
2054 else
2055 indent = " ";
2057 if (test->type == DT_accept_op)
2059 printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth);
2061 /* Only allow DT_accept_insn to follow. */
2062 if (test->next)
2064 test = test->next;
2065 if (test->type != DT_accept_insn)
2066 abort ();
2070 /* Sanity check that we're now at the end of the list of tests. */
2071 if (test->next)
2072 abort ();
2074 if (test->type == DT_accept_insn)
2076 switch (subroutine_type)
2078 case RECOG:
2079 if (test->u.insn.num_clobbers_to_add != 0)
2080 printf ("%s*pnum_clobbers = %d;\n",
2081 indent, test->u.insn.num_clobbers_to_add);
2082 printf ("%sreturn %d;\n", indent, test->u.insn.code_number);
2083 break;
2085 case SPLIT:
2086 printf ("%sreturn gen_split_%d (operands);\n",
2087 indent, test->u.insn.code_number);
2088 break;
2090 case PEEPHOLE2:
2092 int match_len = 0, i;
2094 for (i = strlen (p->position) - 1; i >= 0; --i)
2095 if (ISUPPER (p->position[i]))
2097 match_len = p->position[i] - 'A';
2098 break;
2100 printf ("%s*_pmatch_len = %d;\n", indent, match_len);
2101 printf ("%stem = gen_peephole2_%d (insn, operands);\n",
2102 indent, test->u.insn.code_number);
2103 printf ("%sif (tem != 0)\n%s return tem;\n", indent, indent);
2105 break;
2107 default:
2108 abort ();
2111 else
2113 printf("%sgoto L%d;\n", indent, success->number);
2114 success->need_label = 1;
2117 if (want_close)
2118 fputs (" }\n", stdout);
2121 /* Return 1 if the test is always true and has no fallthru path. Return -1
2122 if the test does have a fallthru path, but requires that the condition be
2123 terminated. Otherwise return 0 for a normal test. */
2124 /* ??? is_unconditional is a stupid name for a tri-state function. */
2126 static int
2127 is_unconditional (struct decision_test *t, enum routine_type subroutine_type)
2129 if (t->type == DT_accept_op)
2130 return 1;
2132 if (t->type == DT_accept_insn)
2134 switch (subroutine_type)
2136 case RECOG:
2137 return (t->u.insn.num_clobbers_to_add == 0);
2138 case SPLIT:
2139 return 1;
2140 case PEEPHOLE2:
2141 return -1;
2142 default:
2143 abort ();
2147 return 0;
2150 /* Emit code for one node -- the conditional and the accompanying action.
2151 Return true if there is no fallthru path. */
2153 static int
2154 write_node (struct decision *p, int depth,
2155 enum routine_type subroutine_type)
2157 struct decision_test *test, *last_test;
2158 int uncond;
2160 last_test = test = p->tests;
2161 uncond = is_unconditional (test, subroutine_type);
2162 if (uncond == 0)
2164 printf (" if (");
2165 write_cond (test, depth, subroutine_type);
2167 while ((test = test->next) != NULL)
2169 int uncond2;
2171 last_test = test;
2172 uncond2 = is_unconditional (test, subroutine_type);
2173 if (uncond2 != 0)
2174 break;
2176 printf ("\n && ");
2177 write_cond (test, depth, subroutine_type);
2180 printf (")\n");
2183 write_action (p, last_test, depth, uncond, p->success.first, subroutine_type);
2185 return uncond > 0;
2188 /* Emit code for all of the sibling nodes of HEAD. */
2190 static void
2191 write_tree_1 (struct decision_head *head, int depth,
2192 enum routine_type subroutine_type)
2194 struct decision *p, *next;
2195 int uncond = 0;
2197 for (p = head->first; p ; p = next)
2199 /* The label for the first element was printed in write_tree. */
2200 if (p != head->first && p->need_label)
2201 OUTPUT_LABEL (" ", p->number);
2203 /* Attempt to write a switch statement for a whole sequence. */
2204 next = write_switch (p, depth);
2205 if (p != next)
2206 uncond = 0;
2207 else
2209 /* Failed -- fall back and write one node. */
2210 uncond = write_node (p, depth, subroutine_type);
2211 next = p->next;
2215 /* Finished with this chain. Close a fallthru path by branching
2216 to the afterward node. */
2217 if (! uncond)
2218 write_afterward (head->last, head->last->afterward, " ");
2221 /* Write out the decision tree starting at HEAD. PREVPOS is the
2222 position at the node that branched to this node. */
2224 static void
2225 write_tree (struct decision_head *head, const char *prevpos,
2226 enum routine_type type, int initial)
2228 struct decision *p = head->first;
2230 putchar ('\n');
2231 if (p->need_label)
2232 OUTPUT_LABEL (" ", p->number);
2234 if (! initial && p->subroutine_number > 0)
2236 static const char * const name_prefix[] = {
2237 "recog", "split", "peephole2"
2240 static const char * const call_suffix[] = {
2241 ", pnum_clobbers", "", ", _pmatch_len"
2244 /* This node has been broken out into a separate subroutine.
2245 Call it, test the result, and branch accordingly. */
2247 if (p->afterward)
2249 printf (" tem = %s_%d (x0, insn%s);\n",
2250 name_prefix[type], p->subroutine_number, call_suffix[type]);
2251 if (IS_SPLIT (type))
2252 printf (" if (tem != 0)\n return tem;\n");
2253 else
2254 printf (" if (tem >= 0)\n return tem;\n");
2256 change_state (p->position, p->afterward->position, NULL, " ");
2257 printf (" goto L%d;\n", p->afterward->number);
2259 else
2261 printf (" return %s_%d (x0, insn%s);\n",
2262 name_prefix[type], p->subroutine_number, call_suffix[type]);
2265 else
2267 int depth = strlen (p->position);
2269 change_state (prevpos, p->position, head->last->afterward, " ");
2270 write_tree_1 (head, depth, type);
2272 for (p = head->first; p; p = p->next)
2273 if (p->success.first)
2274 write_tree (&p->success, p->position, type, 0);
2278 /* Write out a subroutine of type TYPE to do comparisons starting at
2279 node TREE. */
2281 static void
2282 write_subroutine (struct decision_head *head, enum routine_type type)
2284 int subfunction = head->first ? head->first->subroutine_number : 0;
2285 const char *s_or_e;
2286 char extension[32];
2287 int i;
2289 s_or_e = subfunction ? "static " : "";
2291 if (subfunction)
2292 sprintf (extension, "_%d", subfunction);
2293 else if (type == RECOG)
2294 extension[0] = '\0';
2295 else
2296 strcpy (extension, "_insns");
2298 switch (type)
2300 case RECOG:
2301 printf ("%sint\n\
2302 recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension);
2303 break;
2304 case SPLIT:
2305 printf ("%srtx\n\
2306 split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
2307 s_or_e, extension);
2308 break;
2309 case PEEPHOLE2:
2310 printf ("%srtx\n\
2311 peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
2312 s_or_e, extension);
2313 break;
2316 printf ("{\n rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n");
2317 for (i = 1; i <= max_depth; i++)
2318 printf (" rtx x%d ATTRIBUTE_UNUSED;\n", i);
2320 printf (" %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int");
2322 if (!subfunction)
2323 printf (" recog_data.insn = NULL_RTX;\n");
2325 if (head->first)
2326 write_tree (head, "", type, 1);
2327 else
2328 printf (" goto ret0;\n");
2330 printf (" ret0:\n return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1);
2333 /* In break_out_subroutines, we discovered the boundaries for the
2334 subroutines, but did not write them out. Do so now. */
2336 static void
2337 write_subroutines (struct decision_head *head, enum routine_type type)
2339 struct decision *p;
2341 for (p = head->first; p ; p = p->next)
2342 if (p->success.first)
2343 write_subroutines (&p->success, type);
2345 if (head->first->subroutine_number > 0)
2346 write_subroutine (head, type);
2349 /* Begin the output file. */
2351 static void
2352 write_header (void)
2354 puts ("\
2355 /* Generated automatically by the program `genrecog' from the target\n\
2356 machine description file. */\n\
2358 #include \"config.h\"\n\
2359 #include \"system.h\"\n\
2360 #include \"coretypes.h\"\n\
2361 #include \"tm.h\"\n\
2362 #include \"rtl.h\"\n\
2363 #include \"tm_p.h\"\n\
2364 #include \"function.h\"\n\
2365 #include \"insn-config.h\"\n\
2366 #include \"recog.h\"\n\
2367 #include \"real.h\"\n\
2368 #include \"output.h\"\n\
2369 #include \"flags.h\"\n\
2370 #include \"hard-reg-set.h\"\n\
2371 #include \"resource.h\"\n\
2372 #include \"toplev.h\"\n\
2373 #include \"reload.h\"\n\
2374 \n");
2376 puts ("\n\
2377 /* `recog' contains a decision tree that recognizes whether the rtx\n\
2378 X0 is a valid instruction.\n\
2380 recog returns -1 if the rtx is not valid. If the rtx is valid, recog\n\
2381 returns a nonnegative number which is the insn code number for the\n\
2382 pattern that matched. This is the same as the order in the machine\n\
2383 description of the entry that matched. This number can be used as an\n\
2384 index into `insn_data' and other tables.\n");
2385 puts ("\
2386 The third argument to recog is an optional pointer to an int. If\n\
2387 present, recog will accept a pattern if it matches except for missing\n\
2388 CLOBBER expressions at the end. In that case, the value pointed to by\n\
2389 the optional pointer will be set to the number of CLOBBERs that need\n\
2390 to be added (it should be initialized to zero by the caller). If it");
2391 puts ("\
2392 is set nonzero, the caller should allocate a PARALLEL of the\n\
2393 appropriate size, copy the initial entries, and call add_clobbers\n\
2394 (found in insn-emit.c) to fill in the CLOBBERs.\n\
2397 puts ("\n\
2398 The function split_insns returns 0 if the rtl could not\n\
2399 be split or the split rtl as an INSN list if it can be.\n\
2401 The function peephole2_insns returns 0 if the rtl could not\n\
2402 be matched. If there was a match, the new rtl is returned in an INSN list,\n\
2403 and LAST_INSN will point to the last recognized insn in the old sequence.\n\
2404 */\n\n");
2408 /* Construct and return a sequence of decisions
2409 that will recognize INSN.
2411 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */
2413 static struct decision_head
2414 make_insn_sequence (rtx insn, enum routine_type type)
2416 rtx x;
2417 const char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
2418 int truth = maybe_eval_c_test (c_test);
2419 struct decision *last;
2420 struct decision_test *test, **place;
2421 struct decision_head head;
2422 char c_test_pos[2];
2424 /* We should never see an insn whose C test is false at compile time. */
2425 if (truth == 0)
2426 abort ();
2428 record_insn_name (next_insn_code, (type == RECOG ? XSTR (insn, 0) : NULL));
2430 c_test_pos[0] = '\0';
2431 if (type == PEEPHOLE2)
2433 int i, j;
2435 /* peephole2 gets special treatment:
2436 - X always gets an outer parallel even if it's only one entry
2437 - we remove all traces of outer-level match_scratch and match_dup
2438 expressions here. */
2439 x = rtx_alloc (PARALLEL);
2440 PUT_MODE (x, VOIDmode);
2441 XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0));
2442 for (i = j = 0; i < XVECLEN (insn, 0); i++)
2444 rtx tmp = XVECEXP (insn, 0, i);
2445 if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP)
2447 XVECEXP (x, 0, j) = tmp;
2448 j++;
2451 XVECLEN (x, 0) = j;
2453 c_test_pos[0] = 'A' + j - 1;
2454 c_test_pos[1] = '\0';
2456 else if (XVECLEN (insn, type == RECOG) == 1)
2457 x = XVECEXP (insn, type == RECOG, 0);
2458 else
2460 x = rtx_alloc (PARALLEL);
2461 XVEC (x, 0) = XVEC (insn, type == RECOG);
2462 PUT_MODE (x, VOIDmode);
2465 validate_pattern (x, insn, NULL_RTX, 0);
2467 memset(&head, 0, sizeof(head));
2468 last = add_to_sequence (x, &head, "", type, 1);
2470 /* Find the end of the test chain on the last node. */
2471 for (test = last->tests; test->next; test = test->next)
2472 continue;
2473 place = &test->next;
2475 /* Skip the C test if it's known to be true at compile time. */
2476 if (truth == -1)
2478 /* Need a new node if we have another test to add. */
2479 if (test->type == DT_accept_op)
2481 last = new_decision (c_test_pos, &last->success);
2482 place = &last->tests;
2484 test = new_decision_test (DT_c_test, &place);
2485 test->u.c_test = c_test;
2488 test = new_decision_test (DT_accept_insn, &place);
2489 test->u.insn.code_number = next_insn_code;
2490 test->u.insn.lineno = pattern_lineno;
2491 test->u.insn.num_clobbers_to_add = 0;
2493 switch (type)
2495 case RECOG:
2496 /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends
2497 with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.
2498 If so, set up to recognize the pattern without these CLOBBERs. */
2500 if (GET_CODE (x) == PARALLEL)
2502 int i;
2504 /* Find the last non-clobber in the parallel. */
2505 for (i = XVECLEN (x, 0); i > 0; i--)
2507 rtx y = XVECEXP (x, 0, i - 1);
2508 if (GET_CODE (y) != CLOBBER
2509 || (GET_CODE (XEXP (y, 0)) != REG
2510 && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH))
2511 break;
2514 if (i != XVECLEN (x, 0))
2516 rtx new;
2517 struct decision_head clobber_head;
2519 /* Build a similar insn without the clobbers. */
2520 if (i == 1)
2521 new = XVECEXP (x, 0, 0);
2522 else
2524 int j;
2526 new = rtx_alloc (PARALLEL);
2527 XVEC (new, 0) = rtvec_alloc (i);
2528 for (j = i - 1; j >= 0; j--)
2529 XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
2532 /* Recognize it. */
2533 memset (&clobber_head, 0, sizeof(clobber_head));
2534 last = add_to_sequence (new, &clobber_head, "", type, 1);
2536 /* Find the end of the test chain on the last node. */
2537 for (test = last->tests; test->next; test = test->next)
2538 continue;
2540 /* We definitely have a new test to add -- create a new
2541 node if needed. */
2542 place = &test->next;
2543 if (test->type == DT_accept_op)
2545 last = new_decision ("", &last->success);
2546 place = &last->tests;
2549 /* Skip the C test if it's known to be true at compile
2550 time. */
2551 if (truth == -1)
2553 test = new_decision_test (DT_c_test, &place);
2554 test->u.c_test = c_test;
2557 test = new_decision_test (DT_accept_insn, &place);
2558 test->u.insn.code_number = next_insn_code;
2559 test->u.insn.lineno = pattern_lineno;
2560 test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i;
2562 merge_trees (&head, &clobber_head);
2565 break;
2567 case SPLIT:
2568 /* Define the subroutine we will call below and emit in genemit. */
2569 printf ("extern rtx gen_split_%d (rtx *);\n", next_insn_code);
2570 break;
2572 case PEEPHOLE2:
2573 /* Define the subroutine we will call below and emit in genemit. */
2574 printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n",
2575 next_insn_code);
2576 break;
2579 return head;
2582 static void
2583 process_tree (struct decision_head *head, enum routine_type subroutine_type)
2585 if (head->first == NULL)
2587 /* We can elide peephole2_insns, but not recog or split_insns. */
2588 if (subroutine_type == PEEPHOLE2)
2589 return;
2591 else
2593 factor_tests (head);
2595 next_subroutine_number = 0;
2596 break_out_subroutines (head, 1);
2597 find_afterward (head, NULL);
2599 /* We run this after find_afterward, because find_afterward needs
2600 the redundant DT_mode tests on predicates to determine whether
2601 two tests can both be true or not. */
2602 simplify_tests(head);
2604 write_subroutines (head, subroutine_type);
2607 write_subroutine (head, subroutine_type);
2610 extern int main (int, char **);
2613 main (int argc, char **argv)
2615 rtx desc;
2616 struct decision_head recog_tree, split_tree, peephole2_tree, h;
2618 progname = "genrecog";
2620 memset (&recog_tree, 0, sizeof recog_tree);
2621 memset (&split_tree, 0, sizeof split_tree);
2622 memset (&peephole2_tree, 0, sizeof peephole2_tree);
2624 if (argc <= 1)
2625 fatal ("no input file name");
2627 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
2628 return (FATAL_EXIT_CODE);
2630 next_insn_code = 0;
2631 next_index = 0;
2633 write_header ();
2635 /* Read the machine description. */
2637 while (1)
2639 desc = read_md_rtx (&pattern_lineno, &next_insn_code);
2640 if (desc == NULL)
2641 break;
2643 if (GET_CODE (desc) == DEFINE_INSN)
2645 h = make_insn_sequence (desc, RECOG);
2646 merge_trees (&recog_tree, &h);
2648 else if (GET_CODE (desc) == DEFINE_SPLIT)
2650 h = make_insn_sequence (desc, SPLIT);
2651 merge_trees (&split_tree, &h);
2653 else if (GET_CODE (desc) == DEFINE_PEEPHOLE2)
2655 h = make_insn_sequence (desc, PEEPHOLE2);
2656 merge_trees (&peephole2_tree, &h);
2659 next_index++;
2662 if (error_count)
2663 return FATAL_EXIT_CODE;
2665 puts ("\n\n");
2667 process_tree (&recog_tree, RECOG);
2668 process_tree (&split_tree, SPLIT);
2669 process_tree (&peephole2_tree, PEEPHOLE2);
2671 fflush (stdout);
2672 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
2675 /* Define this so we can link with print-rtl.o to get debug_rtx function. */
2676 const char *
2677 get_insn_name (int code)
2679 if (code < insn_name_ptr_size)
2680 return insn_name_ptr[code];
2681 else
2682 return NULL;
2685 static void
2686 record_insn_name (int code, const char *name)
2688 static const char *last_real_name = "insn";
2689 static int last_real_code = 0;
2690 char *new;
2692 if (insn_name_ptr_size <= code)
2694 int new_size;
2695 new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
2696 insn_name_ptr = xrealloc (insn_name_ptr, sizeof(char *) * new_size);
2697 memset (insn_name_ptr + insn_name_ptr_size, 0,
2698 sizeof(char *) * (new_size - insn_name_ptr_size));
2699 insn_name_ptr_size = new_size;
2702 if (!name || name[0] == '\0')
2704 new = xmalloc (strlen (last_real_name) + 10);
2705 sprintf (new, "%s+%d", last_real_name, code - last_real_code);
2707 else
2709 last_real_name = new = xstrdup (name);
2710 last_real_code = code;
2713 insn_name_ptr[code] = new;
2716 static void
2717 debug_decision_2 (struct decision_test *test)
2719 switch (test->type)
2721 case DT_mode:
2722 fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode));
2723 break;
2724 case DT_code:
2725 fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code));
2726 break;
2727 case DT_veclen:
2728 fprintf (stderr, "veclen=%d", test->u.veclen);
2729 break;
2730 case DT_elt_zero_int:
2731 fprintf (stderr, "elt0_i=%d", (int) test->u.intval);
2732 break;
2733 case DT_elt_one_int:
2734 fprintf (stderr, "elt1_i=%d", (int) test->u.intval);
2735 break;
2736 case DT_elt_zero_wide:
2737 fprintf (stderr, "elt0_w=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2738 break;
2739 case DT_elt_zero_wide_safe:
2740 fprintf (stderr, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2741 break;
2742 case DT_veclen_ge:
2743 fprintf (stderr, "veclen>=%d", test->u.veclen);
2744 break;
2745 case DT_dup:
2746 fprintf (stderr, "dup=%d", test->u.dup);
2747 break;
2748 case DT_pred:
2749 fprintf (stderr, "pred=(%s,%s)",
2750 test->u.pred.name, GET_MODE_NAME(test->u.pred.mode));
2751 break;
2752 case DT_c_test:
2754 char sub[16+4];
2755 strncpy (sub, test->u.c_test, sizeof(sub));
2756 memcpy (sub+16, "...", 4);
2757 fprintf (stderr, "c_test=\"%s\"", sub);
2759 break;
2760 case DT_accept_op:
2761 fprintf (stderr, "A_op=%d", test->u.opno);
2762 break;
2763 case DT_accept_insn:
2764 fprintf (stderr, "A_insn=(%d,%d)",
2765 test->u.insn.code_number, test->u.insn.num_clobbers_to_add);
2766 break;
2768 default:
2769 abort ();
2773 static void
2774 debug_decision_1 (struct decision *d, int indent)
2776 int i;
2777 struct decision_test *test;
2779 if (d == NULL)
2781 for (i = 0; i < indent; ++i)
2782 putc (' ', stderr);
2783 fputs ("(nil)\n", stderr);
2784 return;
2787 for (i = 0; i < indent; ++i)
2788 putc (' ', stderr);
2790 putc ('{', stderr);
2791 test = d->tests;
2792 if (test)
2794 debug_decision_2 (test);
2795 while ((test = test->next) != NULL)
2797 fputs (" + ", stderr);
2798 debug_decision_2 (test);
2801 fprintf (stderr, "} %d n %d a %d\n", d->number,
2802 (d->next ? d->next->number : -1),
2803 (d->afterward ? d->afterward->number : -1));
2806 static void
2807 debug_decision_0 (struct decision *d, int indent, int maxdepth)
2809 struct decision *n;
2810 int i;
2812 if (maxdepth < 0)
2813 return;
2814 if (d == NULL)
2816 for (i = 0; i < indent; ++i)
2817 putc (' ', stderr);
2818 fputs ("(nil)\n", stderr);
2819 return;
2822 debug_decision_1 (d, indent);
2823 for (n = d->success.first; n ; n = n->next)
2824 debug_decision_0 (n, indent + 2, maxdepth - 1);
2827 void
2828 debug_decision (struct decision *d)
2830 debug_decision_0 (d, 0, 1000000);
2833 void
2834 debug_decision_list (struct decision *d)
2836 while (d)
2838 debug_decision_0 (d, 0, 0);
2839 d = d->next;