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, 2005 Free Software Foundation, Inc.
4 
5    This file is part of GCC.
6 
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.
11 
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.
16 
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, 51 Franklin Street, Fifth Floor, Boston, MA
20    02110-1301, USA.  */
21 
22 
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.
27 
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).
34 
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.
43 
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.
47 
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.  */
52 
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"
60 
61 #define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \
62   printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER))
63 
64 /* A listhead of decision trees.  The alternatives to a node are kept
65    in a doubly-linked list so we can easily add nodes to the proper
66    place when merging.  */
67 
68 struct decision_head
69 {
70   struct decision *first;
71   struct decision *last;
72 };
73 
74 /* A single test.  The two accept types aren't tests per-se, but
75    their equality (or lack thereof) does affect tree merging so
76    it is convenient to keep them here.  */
77 
78 struct decision_test
79 {
80   /* A linked list through the tests attached to a node.  */
81   struct decision_test *next;
82 
83   /* These types are roughly in the order in which we'd like to test them.  */
84   enum decision_type
85     {
86       DT_num_insns,
87       DT_mode, DT_code, DT_veclen,
88       DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe,
89       DT_const_int,
90       DT_veclen_ge, DT_dup, DT_pred, DT_c_test,
91       DT_accept_op, DT_accept_insn
92     } type;
93 
94   union
95   {
96     int num_insns;		/* Number if insn in a define_peephole2.  */
97     enum machine_mode mode;	/* Machine mode of node.  */
98     RTX_CODE code;		/* Code to test.  */
99 
100     struct
101     {
102       const char *name;		/* Predicate to call.  */
103       const struct pred_data *data;
104                                 /* Optimization hints for this predicate.  */
105       enum machine_mode mode;	/* Machine mode for node.  */
106     } pred;
107 
108     const char *c_test;		/* Additional test to perform.  */
109     int veclen;			/* Length of vector.  */
110     int dup;			/* Number of operand to compare against.  */
111     HOST_WIDE_INT intval;	/* Value for XINT for XWINT.  */
112     int opno;			/* Operand number matched.  */
113 
114     struct {
115       int code_number;		/* Insn number matched.  */
116       int lineno;		/* Line number of the insn.  */
117       int num_clobbers_to_add;	/* Number of CLOBBERs to be added.  */
118     } insn;
119   } u;
120 };
121 
122 /* Data structure for decision tree for recognizing legitimate insns.  */
123 
124 struct decision
125 {
126   struct decision_head success;	/* Nodes to test on success.  */
127   struct decision *next;	/* Node to test on failure.  */
128   struct decision *prev;	/* Node whose failure tests us.  */
129   struct decision *afterward;	/* Node to test on success,
130 				   but failure of successor nodes.  */
131 
132   const char *position;		/* String denoting position in pattern.  */
133 
134   struct decision_test *tests;	/* The tests for this node.  */
135 
136   int number;			/* Node number, used for labels */
137   int subroutine_number;	/* Number of subroutine this node starts */
138   int need_label;		/* Label needs to be output.  */
139 };
140 
141 #define SUBROUTINE_THRESHOLD	100
142 
143 static int next_subroutine_number;
144 
145 /* We can write three types of subroutines: One for insn recognition,
146    one to split insns, and one for peephole-type optimizations.  This
147    defines which type is being written.  */
148 
149 enum routine_type {
150   RECOG, SPLIT, PEEPHOLE2
151 };
152 
153 #define IS_SPLIT(X) ((X) != RECOG)
154 
155 /* Next available node number for tree nodes.  */
156 
157 static int next_number;
158 
159 /* Next number to use as an insn_code.  */
160 
161 static int next_insn_code;
162 
163 /* Record the highest depth we ever have so we know how many variables to
164    allocate in each subroutine we make.  */
165 
166 static int max_depth;
167 
168 /* The line number of the start of the pattern currently being processed.  */
169 static int pattern_lineno;
170 
171 /* Count of errors.  */
172 static int error_count;
173 
174 /* Predicate handling.
175 
176    We construct from the machine description a table mapping each
177    predicate to a list of the rtl codes it can possibly match.  The
178    function 'maybe_both_true' uses it to deduce that there are no
179    expressions that can be matches by certain pairs of tree nodes.
180    Also, if a predicate can match only one code, we can hardwire that
181    code into the node testing the predicate.
182 
183    Some predicates are flagged as special.  validate_pattern will not
184    warn about modeless match_operand expressions if they have a
185    special predicate.  Predicates that allow only constants are also
186    treated as special, for this purpose.
187 
188    validate_pattern will warn about predicates that allow non-lvalues
189    when they appear in destination operands.
190 
191    Calculating the set of rtx codes that can possibly be accepted by a
192    predicate expression EXP requires a three-state logic: any given
193    subexpression may definitively accept a code C (Y), definitively
194    reject a code C (N), or may have an indeterminate effect (I).  N
195    and I is N; Y or I is Y; Y and I, N or I are both I.  Here are full
196    truth tables.
197 
198      a b  a&b  a|b
199      Y Y   Y    Y
200      N Y   N    Y
201      N N   N    N
202      I Y   I    Y
203      I N   N    I
204      I I   I    I
205 
206    We represent Y with 1, N with 0, I with 2.  If any code is left in
207    an I state by the complete expression, we must assume that that
208    code can be accepted.  */
209 
210 #define N 0
211 #define Y 1
212 #define I 2
213 
214 #define TRISTATE_AND(a,b)			\
215   ((a) == I ? ((b) == N ? N : I) :		\
216    (b) == I ? ((a) == N ? N : I) :		\
217    (a) && (b))
218 
219 #define TRISTATE_OR(a,b)			\
220   ((a) == I ? ((b) == Y ? Y : I) :		\
221    (b) == I ? ((a) == Y ? Y : I) :		\
222    (a) || (b))
223 
224 #define TRISTATE_NOT(a)				\
225   ((a) == I ? I : !(a))
226 
227 /* 0 means no warning about that code yet, 1 means warned.  */
228 static char did_you_mean_codes[NUM_RTX_CODE];
229 
230 /* Recursively calculate the set of rtx codes accepted by the
231    predicate expression EXP, writing the result to CODES.  */
232 static void
compute_predicate_codes(rtx exp,char codes[NUM_RTX_CODE])233 compute_predicate_codes (rtx exp, char codes[NUM_RTX_CODE])
234 {
235   char op0_codes[NUM_RTX_CODE];
236   char op1_codes[NUM_RTX_CODE];
237   char op2_codes[NUM_RTX_CODE];
238   int i;
239 
240   switch (GET_CODE (exp))
241     {
242     case AND:
243       compute_predicate_codes (XEXP (exp, 0), op0_codes);
244       compute_predicate_codes (XEXP (exp, 1), op1_codes);
245       for (i = 0; i < NUM_RTX_CODE; i++)
246 	codes[i] = TRISTATE_AND (op0_codes[i], op1_codes[i]);
247       break;
248 
249     case IOR:
250       compute_predicate_codes (XEXP (exp, 0), op0_codes);
251       compute_predicate_codes (XEXP (exp, 1), op1_codes);
252       for (i = 0; i < NUM_RTX_CODE; i++)
253 	codes[i] = TRISTATE_OR (op0_codes[i], op1_codes[i]);
254       break;
255     case NOT:
256       compute_predicate_codes (XEXP (exp, 0), op0_codes);
257       for (i = 0; i < NUM_RTX_CODE; i++)
258 	codes[i] = TRISTATE_NOT (op0_codes[i]);
259       break;
260 
261     case IF_THEN_ELSE:
262       /* a ? b : c  accepts the same codes as (a & b) | (!a & c).  */
263       compute_predicate_codes (XEXP (exp, 0), op0_codes);
264       compute_predicate_codes (XEXP (exp, 1), op1_codes);
265       compute_predicate_codes (XEXP (exp, 2), op2_codes);
266       for (i = 0; i < NUM_RTX_CODE; i++)
267 	codes[i] = TRISTATE_OR (TRISTATE_AND (op0_codes[i], op1_codes[i]),
268 				TRISTATE_AND (TRISTATE_NOT (op0_codes[i]),
269 					      op2_codes[i]));
270       break;
271 
272     case MATCH_CODE:
273       /* MATCH_CODE allows a specified list of codes.  However, if it
274 	 does not apply to the top level of the expression, it does not
275 	 constrain the set of codes for the top level.  */
276       if (XSTR (exp, 1)[0] != '\0')
277 	{
278 	  memset (codes, Y, NUM_RTX_CODE);
279 	  break;
280 	}
281 
282       memset (codes, N, NUM_RTX_CODE);
283       {
284 	const char *next_code = XSTR (exp, 0);
285 	const char *code;
286 
287 	if (*next_code == '\0')
288 	  {
289 	    message_with_line (pattern_lineno, "empty match_code expression");
290 	    error_count++;
291 	    break;
292 	  }
293 
294 	while ((code = scan_comma_elt (&next_code)) != 0)
295 	  {
296 	    size_t n = next_code - code;
297 	    int found_it = 0;
298 
299 	    for (i = 0; i < NUM_RTX_CODE; i++)
300 	      if (!strncmp (code, GET_RTX_NAME (i), n)
301 		  && GET_RTX_NAME (i)[n] == '\0')
302 		{
303 		  codes[i] = Y;
304 		  found_it = 1;
305 		  break;
306 		}
307 	    if (!found_it)
308 	      {
309 		message_with_line (pattern_lineno, "match_code \"%.*s\" matches nothing",
310 				   (int) n, code);
311 		error_count ++;
312 		for (i = 0; i < NUM_RTX_CODE; i++)
313 		  if (!strncasecmp (code, GET_RTX_NAME (i), n)
314 		      && GET_RTX_NAME (i)[n] == '\0'
315 		      && !did_you_mean_codes[i])
316 		    {
317 		      did_you_mean_codes[i] = 1;
318 		      message_with_line (pattern_lineno, "(did you mean \"%s\"?)", GET_RTX_NAME (i));
319 		    }
320 	      }
321 
322 	  }
323       }
324       break;
325 
326     case MATCH_OPERAND:
327       /* MATCH_OPERAND disallows the set of codes that the named predicate
328 	 disallows, and is indeterminate for the codes that it does allow.  */
329       {
330 	struct pred_data *p = lookup_predicate (XSTR (exp, 1));
331 	if (!p)
332 	  {
333 	    message_with_line (pattern_lineno,
334 			       "reference to unknown predicate '%s'",
335 			       XSTR (exp, 1));
336 	    error_count++;
337 	    break;
338 	  }
339 	for (i = 0; i < NUM_RTX_CODE; i++)
340 	  codes[i] = p->codes[i] ? I : N;
341       }
342       break;
343 
344 
345     case MATCH_TEST:
346       /* (match_test WHATEVER) is completely indeterminate.  */
347       memset (codes, I, NUM_RTX_CODE);
348       break;
349 
350     default:
351       message_with_line (pattern_lineno,
352 	 "'%s' cannot be used in a define_predicate expression",
353 	 GET_RTX_NAME (GET_CODE (exp)));
354       error_count++;
355       memset (codes, I, NUM_RTX_CODE);
356       break;
357     }
358 }
359 
360 #undef TRISTATE_OR
361 #undef TRISTATE_AND
362 #undef TRISTATE_NOT
363 
364 /* Process a define_predicate expression: compute the set of predicates
365    that can be matched, and record this as a known predicate.  */
366 static void
process_define_predicate(rtx desc)367 process_define_predicate (rtx desc)
368 {
369   struct pred_data *pred = xcalloc (sizeof (struct pred_data), 1);
370   char codes[NUM_RTX_CODE];
371   bool seen_one = false;
372   int i;
373 
374   pred->name = XSTR (desc, 0);
375   if (GET_CODE (desc) == DEFINE_SPECIAL_PREDICATE)
376     pred->special = 1;
377 
378   compute_predicate_codes (XEXP (desc, 1), codes);
379 
380   for (i = 0; i < NUM_RTX_CODE; i++)
381     if (codes[i] != N)
382       {
383 	pred->codes[i] = true;
384 	if (GET_RTX_CLASS (i) != RTX_CONST_OBJ)
385 	  pred->allows_non_const = true;
386 	if (i != REG
387 	    && i != SUBREG
388 	    && i != MEM
389 	    && i != CONCAT
390 	    && i != PARALLEL
391 	    && i != STRICT_LOW_PART)
392 	  pred->allows_non_lvalue = true;
393 
394 	if (seen_one)
395 	  pred->singleton = UNKNOWN;
396 	else
397 	  {
398 	    pred->singleton = i;
399 	    seen_one = true;
400 	  }
401       }
402   add_predicate (pred);
403 }
404 #undef I
405 #undef N
406 #undef Y
407 
408 
409 static struct decision *new_decision
410   (const char *, struct decision_head *);
411 static struct decision_test *new_decision_test
412   (enum decision_type, struct decision_test ***);
413 static rtx find_operand
414   (rtx, int, rtx);
415 static rtx find_matching_operand
416   (rtx, int);
417 static void validate_pattern
418   (rtx, rtx, rtx, int);
419 static struct decision *add_to_sequence
420   (rtx, struct decision_head *, const char *, enum routine_type, int);
421 
422 static int maybe_both_true_2
423   (struct decision_test *, struct decision_test *);
424 static int maybe_both_true_1
425   (struct decision_test *, struct decision_test *);
426 static int maybe_both_true
427   (struct decision *, struct decision *, int);
428 
429 static int nodes_identical_1
430   (struct decision_test *, struct decision_test *);
431 static int nodes_identical
432   (struct decision *, struct decision *);
433 static void merge_accept_insn
434   (struct decision *, struct decision *);
435 static void merge_trees
436   (struct decision_head *, struct decision_head *);
437 
438 static void factor_tests
439   (struct decision_head *);
440 static void simplify_tests
441   (struct decision_head *);
442 static int break_out_subroutines
443   (struct decision_head *, int);
444 static void find_afterward
445   (struct decision_head *, struct decision *);
446 
447 static void change_state
448   (const char *, const char *, const char *);
449 static void print_code
450   (enum rtx_code);
451 static void write_afterward
452   (struct decision *, struct decision *, const char *);
453 static struct decision *write_switch
454   (struct decision *, int);
455 static void write_cond
456   (struct decision_test *, int, enum routine_type);
457 static void write_action
458   (struct decision *, struct decision_test *, int, int,
459    struct decision *, enum routine_type);
460 static int is_unconditional
461   (struct decision_test *, enum routine_type);
462 static int write_node
463   (struct decision *, int, enum routine_type);
464 static void write_tree_1
465   (struct decision_head *, int, enum routine_type);
466 static void write_tree
467   (struct decision_head *, const char *, enum routine_type, int);
468 static void write_subroutine
469   (struct decision_head *, enum routine_type);
470 static void write_subroutines
471   (struct decision_head *, enum routine_type);
472 static void write_header
473   (void);
474 
475 static struct decision_head make_insn_sequence
476   (rtx, enum routine_type);
477 static void process_tree
478   (struct decision_head *, enum routine_type);
479 
480 static void debug_decision_0
481   (struct decision *, int, int);
482 static void debug_decision_1
483   (struct decision *, int);
484 static void debug_decision_2
485   (struct decision_test *);
486 extern void debug_decision
487   (struct decision *);
488 extern void debug_decision_list
489   (struct decision *);
490 
491 /* Create a new node in sequence after LAST.  */
492 
493 static struct decision *
new_decision(const char * position,struct decision_head * last)494 new_decision (const char *position, struct decision_head *last)
495 {
496   struct decision *new = xcalloc (1, sizeof (struct decision));
497 
498   new->success = *last;
499   new->position = xstrdup (position);
500   new->number = next_number++;
501 
502   last->first = last->last = new;
503   return new;
504 }
505 
506 /* Create a new test and link it in at PLACE.  */
507 
508 static struct decision_test *
new_decision_test(enum decision_type type,struct decision_test *** pplace)509 new_decision_test (enum decision_type type, struct decision_test ***pplace)
510 {
511   struct decision_test **place = *pplace;
512   struct decision_test *test;
513 
514   test = XNEW (struct decision_test);
515   test->next = *place;
516   test->type = type;
517   *place = test;
518 
519   place = &test->next;
520   *pplace = place;
521 
522   return test;
523 }
524 
525 /* Search for and return operand N, stop when reaching node STOP.  */
526 
527 static rtx
find_operand(rtx pattern,int n,rtx stop)528 find_operand (rtx pattern, int n, rtx stop)
529 {
530   const char *fmt;
531   RTX_CODE code;
532   int i, j, len;
533   rtx r;
534 
535   if (pattern == stop)
536     return stop;
537 
538   code = GET_CODE (pattern);
539   if ((code == MATCH_SCRATCH
540        || code == MATCH_OPERAND
541        || code == MATCH_OPERATOR
542        || code == MATCH_PARALLEL)
543       && XINT (pattern, 0) == n)
544     return pattern;
545 
546   fmt = GET_RTX_FORMAT (code);
547   len = GET_RTX_LENGTH (code);
548   for (i = 0; i < len; i++)
549     {
550       switch (fmt[i])
551 	{
552 	case 'e': case 'u':
553 	  if ((r = find_operand (XEXP (pattern, i), n, stop)) != NULL_RTX)
554 	    return r;
555 	  break;
556 
557 	case 'V':
558 	  if (! XVEC (pattern, i))
559 	    break;
560 	  /* Fall through.  */
561 
562 	case 'E':
563 	  for (j = 0; j < XVECLEN (pattern, i); j++)
564 	    if ((r = find_operand (XVECEXP (pattern, i, j), n, stop))
565 		!= NULL_RTX)
566 	      return r;
567 	  break;
568 
569 	case 'i': case 'w': case '0': case 's':
570 	  break;
571 
572 	default:
573 	  gcc_unreachable ();
574 	}
575     }
576 
577   return NULL;
578 }
579 
580 /* Search for and return operand M, such that it has a matching
581    constraint for operand N.  */
582 
583 static rtx
find_matching_operand(rtx pattern,int n)584 find_matching_operand (rtx pattern, int n)
585 {
586   const char *fmt;
587   RTX_CODE code;
588   int i, j, len;
589   rtx r;
590 
591   code = GET_CODE (pattern);
592   if (code == MATCH_OPERAND
593       && (XSTR (pattern, 2)[0] == '0' + n
594 	  || (XSTR (pattern, 2)[0] == '%'
595 	      && XSTR (pattern, 2)[1] == '0' + n)))
596     return pattern;
597 
598   fmt = GET_RTX_FORMAT (code);
599   len = GET_RTX_LENGTH (code);
600   for (i = 0; i < len; i++)
601     {
602       switch (fmt[i])
603 	{
604 	case 'e': case 'u':
605 	  if ((r = find_matching_operand (XEXP (pattern, i), n)))
606 	    return r;
607 	  break;
608 
609 	case 'V':
610 	  if (! XVEC (pattern, i))
611 	    break;
612 	  /* Fall through.  */
613 
614 	case 'E':
615 	  for (j = 0; j < XVECLEN (pattern, i); j++)
616 	    if ((r = find_matching_operand (XVECEXP (pattern, i, j), n)))
617 	      return r;
618 	  break;
619 
620 	case 'i': case 'w': case '0': case 's':
621 	  break;
622 
623 	default:
624 	  gcc_unreachable ();
625 	}
626     }
627 
628   return NULL;
629 }
630 
631 
632 /* Check for various errors in patterns.  SET is nonnull for a destination,
633    and is the complete set pattern.  SET_CODE is '=' for normal sets, and
634    '+' within a context that requires in-out constraints.  */
635 
636 static void
validate_pattern(rtx pattern,rtx insn,rtx set,int set_code)637 validate_pattern (rtx pattern, rtx insn, rtx set, int set_code)
638 {
639   const char *fmt;
640   RTX_CODE code;
641   size_t i, len;
642   int j;
643 
644   code = GET_CODE (pattern);
645   switch (code)
646     {
647     case MATCH_SCRATCH:
648       return;
649     case MATCH_DUP:
650     case MATCH_OP_DUP:
651     case MATCH_PAR_DUP:
652       if (find_operand (insn, XINT (pattern, 0), pattern) == pattern)
653 	{
654 	  message_with_line (pattern_lineno,
655 			     "operand %i duplicated before defined",
656 			     XINT (pattern, 0));
657           error_count++;
658 	}
659       break;
660     case MATCH_OPERAND:
661     case MATCH_OPERATOR:
662       {
663 	const char *pred_name = XSTR (pattern, 1);
664 	const struct pred_data *pred;
665 	const char *c_test;
666 
667 	if (GET_CODE (insn) == DEFINE_INSN)
668 	  c_test = XSTR (insn, 2);
669 	else
670 	  c_test = XSTR (insn, 1);
671 
672 	if (pred_name[0] != 0)
673 	  {
674 	    pred = lookup_predicate (pred_name);
675 	    if (!pred)
676 	      message_with_line (pattern_lineno,
677 				 "warning: unknown predicate '%s'",
678 				 pred_name);
679 	  }
680 	else
681 	  pred = 0;
682 
683 	if (code == MATCH_OPERAND)
684 	  {
685 	    const char constraints0 = XSTR (pattern, 2)[0];
686 
687 	    /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we
688 	       don't use the MATCH_OPERAND constraint, only the predicate.
689 	       This is confusing to folks doing new ports, so help them
690 	       not make the mistake.  */
691 	    if (GET_CODE (insn) == DEFINE_EXPAND
692 		|| GET_CODE (insn) == DEFINE_SPLIT
693 		|| GET_CODE (insn) == DEFINE_PEEPHOLE2)
694 	      {
695 		if (constraints0)
696 		  message_with_line (pattern_lineno,
697 				     "warning: constraints not supported in %s",
698 				     rtx_name[GET_CODE (insn)]);
699 	      }
700 
701 	    /* A MATCH_OPERAND that is a SET should have an output reload.  */
702 	    else if (set && constraints0)
703 	      {
704 		if (set_code == '+')
705 		  {
706 		    if (constraints0 == '+')
707 		      ;
708 		    /* If we've only got an output reload for this operand,
709 		       we'd better have a matching input operand.  */
710 		    else if (constraints0 == '='
711 			     && find_matching_operand (insn, XINT (pattern, 0)))
712 		      ;
713 		    else
714 		      {
715 			message_with_line (pattern_lineno,
716 					   "operand %d missing in-out reload",
717 					   XINT (pattern, 0));
718 			error_count++;
719 		      }
720 		  }
721 		else if (constraints0 != '=' && constraints0 != '+')
722 		  {
723 		    message_with_line (pattern_lineno,
724 				       "operand %d missing output reload",
725 				       XINT (pattern, 0));
726 		    error_count++;
727 		  }
728 	      }
729 	  }
730 
731 	/* Allowing non-lvalues in destinations -- particularly CONST_INT --
732 	   while not likely to occur at runtime, results in less efficient
733 	   code from insn-recog.c.  */
734 	if (set && pred && pred->allows_non_lvalue)
735 	  message_with_line (pattern_lineno,
736 			     "warning: destination operand %d "
737 			     "allows non-lvalue",
738 			     XINT (pattern, 0));
739 
740 	/* A modeless MATCH_OPERAND can be handy when we can check for
741 	   multiple modes in the c_test.  In most other cases, it is a
742 	   mistake.  Only DEFINE_INSN is eligible, since SPLIT and
743 	   PEEP2 can FAIL within the output pattern.  Exclude special
744 	   predicates, which check the mode themselves.  Also exclude
745 	   predicates that allow only constants.  Exclude the SET_DEST
746 	   of a call instruction, as that is a common idiom.  */
747 
748 	if (GET_MODE (pattern) == VOIDmode
749 	    && code == MATCH_OPERAND
750 	    && GET_CODE (insn) == DEFINE_INSN
751 	    && pred
752 	    && !pred->special
753 	    && pred->allows_non_const
754 	    && strstr (c_test, "operands") == NULL
755 	    && ! (set
756 		  && GET_CODE (set) == SET
757 		  && GET_CODE (SET_SRC (set)) == CALL))
758 	  message_with_line (pattern_lineno,
759 			     "warning: operand %d missing mode?",
760 			     XINT (pattern, 0));
761 	return;
762       }
763 
764     case SET:
765       {
766 	enum machine_mode dmode, smode;
767 	rtx dest, src;
768 
769 	dest = SET_DEST (pattern);
770 	src = SET_SRC (pattern);
771 
772 	/* STRICT_LOW_PART is a wrapper.  Its argument is the real
773 	   destination, and it's mode should match the source.  */
774 	if (GET_CODE (dest) == STRICT_LOW_PART)
775 	  dest = XEXP (dest, 0);
776 
777 	/* Find the referent for a DUP.  */
778 
779 	if (GET_CODE (dest) == MATCH_DUP
780 	    || GET_CODE (dest) == MATCH_OP_DUP
781 	    || GET_CODE (dest) == MATCH_PAR_DUP)
782 	  dest = find_operand (insn, XINT (dest, 0), NULL);
783 
784 	if (GET_CODE (src) == MATCH_DUP
785 	    || GET_CODE (src) == MATCH_OP_DUP
786 	    || GET_CODE (src) == MATCH_PAR_DUP)
787 	  src = find_operand (insn, XINT (src, 0), NULL);
788 
789 	dmode = GET_MODE (dest);
790 	smode = GET_MODE (src);
791 
792 	/* The mode of an ADDRESS_OPERAND is the mode of the memory
793 	   reference, not the mode of the address.  */
794 	if (GET_CODE (src) == MATCH_OPERAND
795 	    && ! strcmp (XSTR (src, 1), "address_operand"))
796 	  ;
797 
798         /* The operands of a SET must have the same mode unless one
799 	   is VOIDmode.  */
800         else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode)
801 	  {
802 	    message_with_line (pattern_lineno,
803 			       "mode mismatch in set: %smode vs %smode",
804 			       GET_MODE_NAME (dmode), GET_MODE_NAME (smode));
805 	    error_count++;
806 	  }
807 
808 	/* If only one of the operands is VOIDmode, and PC or CC0 is
809 	   not involved, it's probably a mistake.  */
810 	else if (dmode != smode
811 		 && GET_CODE (dest) != PC
812 		 && GET_CODE (dest) != CC0
813 		 && GET_CODE (src) != PC
814 		 && GET_CODE (src) != CC0
815 		 && GET_CODE (src) != CONST_INT)
816 	  {
817 	    const char *which;
818 	    which = (dmode == VOIDmode ? "destination" : "source");
819 	    message_with_line (pattern_lineno,
820 			       "warning: %s missing a mode?", which);
821 	  }
822 
823 	if (dest != SET_DEST (pattern))
824 	  validate_pattern (dest, insn, pattern, '=');
825 	validate_pattern (SET_DEST (pattern), insn, pattern, '=');
826         validate_pattern (SET_SRC (pattern), insn, NULL_RTX, 0);
827         return;
828       }
829 
830     case CLOBBER:
831       validate_pattern (SET_DEST (pattern), insn, pattern, '=');
832       return;
833 
834     case ZERO_EXTRACT:
835       validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0);
836       validate_pattern (XEXP (pattern, 1), insn, NULL_RTX, 0);
837       validate_pattern (XEXP (pattern, 2), insn, NULL_RTX, 0);
838       return;
839 
840     case STRICT_LOW_PART:
841       validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0);
842       return;
843 
844     case LABEL_REF:
845       if (GET_MODE (XEXP (pattern, 0)) != VOIDmode)
846 	{
847 	  message_with_line (pattern_lineno,
848 			     "operand to label_ref %smode not VOIDmode",
849 			     GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
850 	  error_count++;
851 	}
852       break;
853 
854     default:
855       break;
856     }
857 
858   fmt = GET_RTX_FORMAT (code);
859   len = GET_RTX_LENGTH (code);
860   for (i = 0; i < len; i++)
861     {
862       switch (fmt[i])
863 	{
864 	case 'e': case 'u':
865 	  validate_pattern (XEXP (pattern, i), insn, NULL_RTX, 0);
866 	  break;
867 
868 	case 'E':
869 	  for (j = 0; j < XVECLEN (pattern, i); j++)
870 	    validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX, 0);
871 	  break;
872 
873 	case 'i': case 'w': case '0': case 's':
874 	  break;
875 
876 	default:
877 	  gcc_unreachable ();
878 	}
879     }
880 }
881 
882 /* Create a chain of nodes to verify that an rtl expression matches
883    PATTERN.
884 
885    LAST is a pointer to the listhead in the previous node in the chain (or
886    in the calling function, for the first node).
887 
888    POSITION is the string representing the current position in the insn.
889 
890    INSN_TYPE is the type of insn for which we are emitting code.
891 
892    A pointer to the final node in the chain is returned.  */
893 
894 static struct decision *
add_to_sequence(rtx pattern,struct decision_head * last,const char * position,enum routine_type insn_type,int top)895 add_to_sequence (rtx pattern, struct decision_head *last, const char *position,
896 		 enum routine_type insn_type, int top)
897 {
898   RTX_CODE code;
899   struct decision *this, *sub;
900   struct decision_test *test;
901   struct decision_test **place;
902   char *subpos;
903   size_t i;
904   const char *fmt;
905   int depth = strlen (position);
906   int len;
907   enum machine_mode mode;
908 
909   if (depth > max_depth)
910     max_depth = depth;
911 
912   subpos = xmalloc (depth + 2);
913   strcpy (subpos, position);
914   subpos[depth + 1] = 0;
915 
916   sub = this = new_decision (position, last);
917   place = &this->tests;
918 
919  restart:
920   mode = GET_MODE (pattern);
921   code = GET_CODE (pattern);
922 
923   switch (code)
924     {
925     case PARALLEL:
926       /* Toplevel peephole pattern.  */
927       if (insn_type == PEEPHOLE2 && top)
928 	{
929 	  int num_insns;
930 
931 	  /* Check we have sufficient insns.  This avoids complications
932 	     because we then know peep2_next_insn never fails.  */
933 	  num_insns = XVECLEN (pattern, 0);
934 	  if (num_insns > 1)
935 	    {
936 	      test = new_decision_test (DT_num_insns, &place);
937 	      test->u.num_insns = num_insns;
938 	      last = &sub->success;
939 	    }
940 	  else
941 	    {
942 	      /* We don't need the node we just created -- unlink it.  */
943 	      last->first = last->last = NULL;
944 	    }
945 
946 	  for (i = 0; i < (size_t) XVECLEN (pattern, 0); i++)
947 	    {
948 	      /* Which insn we're looking at is represented by A-Z. We don't
949 	         ever use 'A', however; it is always implied.  */
950 
951 	      subpos[depth] = (i > 0 ? 'A' + i : 0);
952 	      sub = add_to_sequence (XVECEXP (pattern, 0, i),
953 				     last, subpos, insn_type, 0);
954 	      last = &sub->success;
955 	    }
956 	  goto ret;
957 	}
958 
959       /* Else nothing special.  */
960       break;
961 
962     case MATCH_PARALLEL:
963       /* The explicit patterns within a match_parallel enforce a minimum
964 	 length on the vector.  The match_parallel predicate may allow
965 	 for more elements.  We do need to check for this minimum here
966 	 or the code generated to match the internals may reference data
967 	 beyond the end of the vector.  */
968       test = new_decision_test (DT_veclen_ge, &place);
969       test->u.veclen = XVECLEN (pattern, 2);
970       /* Fall through.  */
971 
972     case MATCH_OPERAND:
973     case MATCH_SCRATCH:
974     case MATCH_OPERATOR:
975       {
976 	RTX_CODE was_code = code;
977 	const char *pred_name;
978 	bool allows_const_int = true;
979 
980 	if (code == MATCH_SCRATCH)
981 	  {
982 	    pred_name = "scratch_operand";
983 	    code = UNKNOWN;
984 	  }
985 	else
986 	  {
987 	    pred_name = XSTR (pattern, 1);
988 	    if (code == MATCH_PARALLEL)
989 	      code = PARALLEL;
990 	    else
991 	      code = UNKNOWN;
992 	  }
993 
994 	if (pred_name[0] != 0)
995 	  {
996 	    const struct pred_data *pred;
997 
998 	    test = new_decision_test (DT_pred, &place);
999 	    test->u.pred.name = pred_name;
1000 	    test->u.pred.mode = mode;
1001 
1002 	    /* See if we know about this predicate.
1003 	       If we do, remember it for use below.
1004 
1005 	       We can optimize the generated code a little if either
1006 	       (a) the predicate only accepts one code, or (b) the
1007 	       predicate does not allow CONST_INT, in which case it
1008 	       can match only if the modes match.  */
1009 	    pred = lookup_predicate (pred_name);
1010 	    if (pred)
1011 	      {
1012 		test->u.pred.data = pred;
1013 		allows_const_int = pred->codes[CONST_INT];
1014 		if (was_code == MATCH_PARALLEL
1015 		    && pred->singleton != PARALLEL)
1016 		  message_with_line (pattern_lineno,
1017 			"predicate '%s' used in match_parallel "
1018 			"does not allow only PARALLEL", pred->name);
1019 		else
1020 		  code = pred->singleton;
1021 	      }
1022 	    else
1023 	      message_with_line (pattern_lineno,
1024 			"warning: unknown predicate '%s' in '%s' expression",
1025 			pred_name, GET_RTX_NAME (was_code));
1026 	  }
1027 
1028 	/* Can't enforce a mode if we allow const_int.  */
1029 	if (allows_const_int)
1030 	  mode = VOIDmode;
1031 
1032 	/* Accept the operand, i.e. record it in `operands'.  */
1033 	test = new_decision_test (DT_accept_op, &place);
1034 	test->u.opno = XINT (pattern, 0);
1035 
1036 	if (was_code == MATCH_OPERATOR || was_code == MATCH_PARALLEL)
1037 	  {
1038 	    char base = (was_code == MATCH_OPERATOR ? '0' : 'a');
1039 	    for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++)
1040 	      {
1041 		subpos[depth] = i + base;
1042 		sub = add_to_sequence (XVECEXP (pattern, 2, i),
1043 				       &sub->success, subpos, insn_type, 0);
1044 	      }
1045 	  }
1046 	goto fini;
1047       }
1048 
1049     case MATCH_OP_DUP:
1050       code = UNKNOWN;
1051 
1052       test = new_decision_test (DT_dup, &place);
1053       test->u.dup = XINT (pattern, 0);
1054 
1055       test = new_decision_test (DT_accept_op, &place);
1056       test->u.opno = XINT (pattern, 0);
1057 
1058       for (i = 0; i < (size_t) XVECLEN (pattern, 1); i++)
1059 	{
1060 	  subpos[depth] = i + '0';
1061 	  sub = add_to_sequence (XVECEXP (pattern, 1, i),
1062 				 &sub->success, subpos, insn_type, 0);
1063 	}
1064       goto fini;
1065 
1066     case MATCH_DUP:
1067     case MATCH_PAR_DUP:
1068       code = UNKNOWN;
1069 
1070       test = new_decision_test (DT_dup, &place);
1071       test->u.dup = XINT (pattern, 0);
1072       goto fini;
1073 
1074     case ADDRESS:
1075       pattern = XEXP (pattern, 0);
1076       goto restart;
1077 
1078     default:
1079       break;
1080     }
1081 
1082   fmt = GET_RTX_FORMAT (code);
1083   len = GET_RTX_LENGTH (code);
1084 
1085   /* Do tests against the current node first.  */
1086   for (i = 0; i < (size_t) len; i++)
1087     {
1088       if (fmt[i] == 'i')
1089 	{
1090 	  gcc_assert (i < 2);
1091 
1092 	  if (!i)
1093 	    {
1094 	      test = new_decision_test (DT_elt_zero_int, &place);
1095 	      test->u.intval = XINT (pattern, i);
1096 	    }
1097 	  else
1098 	    {
1099 	      test = new_decision_test (DT_elt_one_int, &place);
1100 	      test->u.intval = XINT (pattern, i);
1101 	    }
1102 	}
1103       else if (fmt[i] == 'w')
1104 	{
1105 	  /* If this value actually fits in an int, we can use a switch
1106 	     statement here, so indicate that.  */
1107 	  enum decision_type type
1108 	    = ((int) XWINT (pattern, i) == XWINT (pattern, i))
1109 	      ? DT_elt_zero_wide_safe : DT_elt_zero_wide;
1110 
1111 	  gcc_assert (!i);
1112 
1113 	  test = new_decision_test (type, &place);
1114 	  test->u.intval = XWINT (pattern, i);
1115 	}
1116       else if (fmt[i] == 'E')
1117 	{
1118 	  gcc_assert (!i);
1119 
1120 	  test = new_decision_test (DT_veclen, &place);
1121 	  test->u.veclen = XVECLEN (pattern, i);
1122 	}
1123     }
1124 
1125   /* Now test our sub-patterns.  */
1126   for (i = 0; i < (size_t) len; i++)
1127     {
1128       switch (fmt[i])
1129 	{
1130 	case 'e': case 'u':
1131 	  subpos[depth] = '0' + i;
1132 	  sub = add_to_sequence (XEXP (pattern, i), &sub->success,
1133 				 subpos, insn_type, 0);
1134 	  break;
1135 
1136 	case 'E':
1137 	  {
1138 	    int j;
1139 	    for (j = 0; j < XVECLEN (pattern, i); j++)
1140 	      {
1141 		subpos[depth] = 'a' + j;
1142 		sub = add_to_sequence (XVECEXP (pattern, i, j),
1143 				       &sub->success, subpos, insn_type, 0);
1144 	      }
1145 	    break;
1146 	  }
1147 
1148 	case 'i': case 'w':
1149 	  /* Handled above.  */
1150 	  break;
1151 	case '0':
1152 	  break;
1153 
1154 	default:
1155 	  gcc_unreachable ();
1156 	}
1157     }
1158 
1159  fini:
1160   /* Insert nodes testing mode and code, if they're still relevant,
1161      before any of the nodes we may have added above.  */
1162   if (code != UNKNOWN)
1163     {
1164       place = &this->tests;
1165       test = new_decision_test (DT_code, &place);
1166       test->u.code = code;
1167     }
1168 
1169   if (mode != VOIDmode)
1170     {
1171       place = &this->tests;
1172       test = new_decision_test (DT_mode, &place);
1173       test->u.mode = mode;
1174     }
1175 
1176   /* If we didn't insert any tests or accept nodes, hork.  */
1177   gcc_assert (this->tests);
1178 
1179  ret:
1180   free (subpos);
1181   return sub;
1182 }
1183 
1184 /* A subroutine of maybe_both_true; examines only one test.
1185    Returns > 0 for "definitely both true" and < 0 for "maybe both true".  */
1186 
1187 static int
maybe_both_true_2(struct decision_test * d1,struct decision_test * d2)1188 maybe_both_true_2 (struct decision_test *d1, struct decision_test *d2)
1189 {
1190   if (d1->type == d2->type)
1191     {
1192       switch (d1->type)
1193 	{
1194 	case DT_num_insns:
1195 	  if (d1->u.num_insns == d2->u.num_insns)
1196 	    return 1;
1197 	  else
1198 	    return -1;
1199 
1200 	case DT_mode:
1201 	  return d1->u.mode == d2->u.mode;
1202 
1203 	case DT_code:
1204 	  return d1->u.code == d2->u.code;
1205 
1206 	case DT_veclen:
1207 	  return d1->u.veclen == d2->u.veclen;
1208 
1209 	case DT_elt_zero_int:
1210 	case DT_elt_one_int:
1211 	case DT_elt_zero_wide:
1212 	case DT_elt_zero_wide_safe:
1213 	  return d1->u.intval == d2->u.intval;
1214 
1215 	default:
1216 	  break;
1217 	}
1218     }
1219 
1220   /* If either has a predicate that we know something about, set
1221      things up so that D1 is the one that always has a known
1222      predicate.  Then see if they have any codes in common.  */
1223 
1224   if (d1->type == DT_pred || d2->type == DT_pred)
1225     {
1226       if (d2->type == DT_pred)
1227 	{
1228 	  struct decision_test *tmp;
1229 	  tmp = d1, d1 = d2, d2 = tmp;
1230 	}
1231 
1232       /* If D2 tests a mode, see if it matches D1.  */
1233       if (d1->u.pred.mode != VOIDmode)
1234 	{
1235 	  if (d2->type == DT_mode)
1236 	    {
1237 	      if (d1->u.pred.mode != d2->u.mode
1238 		  /* The mode of an address_operand predicate is the
1239 		     mode of the memory, not the operand.  It can only
1240 		     be used for testing the predicate, so we must
1241 		     ignore it here.  */
1242 		  && strcmp (d1->u.pred.name, "address_operand") != 0)
1243 		return 0;
1244 	    }
1245 	  /* Don't check two predicate modes here, because if both predicates
1246 	     accept CONST_INT, then both can still be true even if the modes
1247 	     are different.  If they don't accept CONST_INT, there will be a
1248 	     separate DT_mode that will make maybe_both_true_1 return 0.  */
1249 	}
1250 
1251       if (d1->u.pred.data)
1252 	{
1253 	  /* If D2 tests a code, see if it is in the list of valid
1254 	     codes for D1's predicate.  */
1255 	  if (d2->type == DT_code)
1256 	    {
1257 	      if (!d1->u.pred.data->codes[d2->u.code])
1258 		return 0;
1259 	    }
1260 
1261 	  /* Otherwise see if the predicates have any codes in common.  */
1262 	  else if (d2->type == DT_pred && d2->u.pred.data)
1263 	    {
1264 	      bool common = false;
1265 	      enum rtx_code c;
1266 
1267 	      for (c = 0; c < NUM_RTX_CODE; c++)
1268 		if (d1->u.pred.data->codes[c] && d2->u.pred.data->codes[c])
1269 		  {
1270 		    common = true;
1271 		    break;
1272 		  }
1273 
1274 	      if (!common)
1275 		return 0;
1276 	    }
1277 	}
1278     }
1279 
1280   /* Tests vs veclen may be known when strict equality is involved.  */
1281   if (d1->type == DT_veclen && d2->type == DT_veclen_ge)
1282     return d1->u.veclen >= d2->u.veclen;
1283   if (d1->type == DT_veclen_ge && d2->type == DT_veclen)
1284     return d2->u.veclen >= d1->u.veclen;
1285 
1286   return -1;
1287 }
1288 
1289 /* A subroutine of maybe_both_true; examines all the tests for a given node.
1290    Returns > 0 for "definitely both true" and < 0 for "maybe both true".  */
1291 
1292 static int
maybe_both_true_1(struct decision_test * d1,struct decision_test * d2)1293 maybe_both_true_1 (struct decision_test *d1, struct decision_test *d2)
1294 {
1295   struct decision_test *t1, *t2;
1296 
1297   /* A match_operand with no predicate can match anything.  Recognize
1298      this by the existence of a lone DT_accept_op test.  */
1299   if (d1->type == DT_accept_op || d2->type == DT_accept_op)
1300     return 1;
1301 
1302   /* Eliminate pairs of tests while they can exactly match.  */
1303   while (d1 && d2 && d1->type == d2->type)
1304     {
1305       if (maybe_both_true_2 (d1, d2) == 0)
1306 	return 0;
1307       d1 = d1->next, d2 = d2->next;
1308     }
1309 
1310   /* After that, consider all pairs.  */
1311   for (t1 = d1; t1 ; t1 = t1->next)
1312     for (t2 = d2; t2 ; t2 = t2->next)
1313       if (maybe_both_true_2 (t1, t2) == 0)
1314 	return 0;
1315 
1316   return -1;
1317 }
1318 
1319 /* Return 0 if we can prove that there is no RTL that can match both
1320    D1 and D2.  Otherwise, return 1 (it may be that there is an RTL that
1321    can match both or just that we couldn't prove there wasn't such an RTL).
1322 
1323    TOPLEVEL is nonzero if we are to only look at the top level and not
1324    recursively descend.  */
1325 
1326 static int
maybe_both_true(struct decision * d1,struct decision * d2,int toplevel)1327 maybe_both_true (struct decision *d1, struct decision *d2,
1328 		 int toplevel)
1329 {
1330   struct decision *p1, *p2;
1331   int cmp;
1332 
1333   /* Don't compare strings on the different positions in insn.  Doing so
1334      is incorrect and results in false matches from constructs like
1335 
1336 	[(set (subreg:HI (match_operand:SI "register_operand" "r") 0)
1337 	      (subreg:HI (match_operand:SI "register_operand" "r") 0))]
1338      vs
1339 	[(set (match_operand:HI "register_operand" "r")
1340 	      (match_operand:HI "register_operand" "r"))]
1341 
1342      If we are presented with such, we are recursing through the remainder
1343      of a node's success nodes (from the loop at the end of this function).
1344      Skip forward until we come to a position that matches.
1345 
1346      Due to the way position strings are constructed, we know that iterating
1347      forward from the lexically lower position (e.g. "00") will run into
1348      the lexically higher position (e.g. "1") and not the other way around.
1349      This saves a bit of effort.  */
1350 
1351   cmp = strcmp (d1->position, d2->position);
1352   if (cmp != 0)
1353     {
1354       gcc_assert (!toplevel);
1355 
1356       /* If the d2->position was lexically lower, swap.  */
1357       if (cmp > 0)
1358 	p1 = d1, d1 = d2, d2 = p1;
1359 
1360       if (d1->success.first == 0)
1361 	return 1;
1362       for (p1 = d1->success.first; p1; p1 = p1->next)
1363 	if (maybe_both_true (p1, d2, 0))
1364 	  return 1;
1365 
1366       return 0;
1367     }
1368 
1369   /* Test the current level.  */
1370   cmp = maybe_both_true_1 (d1->tests, d2->tests);
1371   if (cmp >= 0)
1372     return cmp;
1373 
1374   /* We can't prove that D1 and D2 cannot both be true.  If we are only
1375      to check the top level, return 1.  Otherwise, see if we can prove
1376      that all choices in both successors are mutually exclusive.  If
1377      either does not have any successors, we can't prove they can't both
1378      be true.  */
1379 
1380   if (toplevel || d1->success.first == 0 || d2->success.first == 0)
1381     return 1;
1382 
1383   for (p1 = d1->success.first; p1; p1 = p1->next)
1384     for (p2 = d2->success.first; p2; p2 = p2->next)
1385       if (maybe_both_true (p1, p2, 0))
1386 	return 1;
1387 
1388   return 0;
1389 }
1390 
1391 /* A subroutine of nodes_identical.  Examine two tests for equivalence.  */
1392 
1393 static int
nodes_identical_1(struct decision_test * d1,struct decision_test * d2)1394 nodes_identical_1 (struct decision_test *d1, struct decision_test *d2)
1395 {
1396   switch (d1->type)
1397     {
1398     case DT_num_insns:
1399       return d1->u.num_insns == d2->u.num_insns;
1400 
1401     case DT_mode:
1402       return d1->u.mode == d2->u.mode;
1403 
1404     case DT_code:
1405       return d1->u.code == d2->u.code;
1406 
1407     case DT_pred:
1408       return (d1->u.pred.mode == d2->u.pred.mode
1409 	      && strcmp (d1->u.pred.name, d2->u.pred.name) == 0);
1410 
1411     case DT_c_test:
1412       return strcmp (d1->u.c_test, d2->u.c_test) == 0;
1413 
1414     case DT_veclen:
1415     case DT_veclen_ge:
1416       return d1->u.veclen == d2->u.veclen;
1417 
1418     case DT_dup:
1419       return d1->u.dup == d2->u.dup;
1420 
1421     case DT_elt_zero_int:
1422     case DT_elt_one_int:
1423     case DT_elt_zero_wide:
1424     case DT_elt_zero_wide_safe:
1425       return d1->u.intval == d2->u.intval;
1426 
1427     case DT_accept_op:
1428       return d1->u.opno == d2->u.opno;
1429 
1430     case DT_accept_insn:
1431       /* Differences will be handled in merge_accept_insn.  */
1432       return 1;
1433 
1434     default:
1435       gcc_unreachable ();
1436     }
1437 }
1438 
1439 /* True iff the two nodes are identical (on one level only).  Due
1440    to the way these lists are constructed, we shouldn't have to
1441    consider different orderings on the tests.  */
1442 
1443 static int
nodes_identical(struct decision * d1,struct decision * d2)1444 nodes_identical (struct decision *d1, struct decision *d2)
1445 {
1446   struct decision_test *t1, *t2;
1447 
1448   for (t1 = d1->tests, t2 = d2->tests; t1 && t2; t1 = t1->next, t2 = t2->next)
1449     {
1450       if (t1->type != t2->type)
1451 	return 0;
1452       if (! nodes_identical_1 (t1, t2))
1453 	return 0;
1454     }
1455 
1456   /* For success, they should now both be null.  */
1457   if (t1 != t2)
1458     return 0;
1459 
1460   /* Check that their subnodes are at the same position, as any one set
1461      of sibling decisions must be at the same position.  Allowing this
1462      requires complications to find_afterward and when change_state is
1463      invoked.  */
1464   if (d1->success.first
1465       && d2->success.first
1466       && strcmp (d1->success.first->position, d2->success.first->position))
1467     return 0;
1468 
1469   return 1;
1470 }
1471 
1472 /* A subroutine of merge_trees; given two nodes that have been declared
1473    identical, cope with two insn accept states.  If they differ in the
1474    number of clobbers, then the conflict was created by make_insn_sequence
1475    and we can drop the with-clobbers version on the floor.  If both
1476    nodes have no additional clobbers, we have found an ambiguity in the
1477    source machine description.  */
1478 
1479 static void
merge_accept_insn(struct decision * oldd,struct decision * addd)1480 merge_accept_insn (struct decision *oldd, struct decision *addd)
1481 {
1482   struct decision_test *old, *add;
1483 
1484   for (old = oldd->tests; old; old = old->next)
1485     if (old->type == DT_accept_insn)
1486       break;
1487   if (old == NULL)
1488     return;
1489 
1490   for (add = addd->tests; add; add = add->next)
1491     if (add->type == DT_accept_insn)
1492       break;
1493   if (add == NULL)
1494     return;
1495 
1496   /* If one node is for a normal insn and the second is for the base
1497      insn with clobbers stripped off, the second node should be ignored.  */
1498 
1499   if (old->u.insn.num_clobbers_to_add == 0
1500       && add->u.insn.num_clobbers_to_add > 0)
1501     {
1502       /* Nothing to do here.  */
1503     }
1504   else if (old->u.insn.num_clobbers_to_add > 0
1505 	   && add->u.insn.num_clobbers_to_add == 0)
1506     {
1507       /* In this case, replace OLD with ADD.  */
1508       old->u.insn = add->u.insn;
1509     }
1510   else
1511     {
1512       message_with_line (add->u.insn.lineno, "`%s' matches `%s'",
1513 			 get_insn_name (add->u.insn.code_number),
1514 			 get_insn_name (old->u.insn.code_number));
1515       message_with_line (old->u.insn.lineno, "previous definition of `%s'",
1516 			 get_insn_name (old->u.insn.code_number));
1517       error_count++;
1518     }
1519 }
1520 
1521 /* Merge two decision trees OLDH and ADDH, modifying OLDH destructively.  */
1522 
1523 static void
merge_trees(struct decision_head * oldh,struct decision_head * addh)1524 merge_trees (struct decision_head *oldh, struct decision_head *addh)
1525 {
1526   struct decision *next, *add;
1527 
1528   if (addh->first == 0)
1529     return;
1530   if (oldh->first == 0)
1531     {
1532       *oldh = *addh;
1533       return;
1534     }
1535 
1536   /* Trying to merge bits at different positions isn't possible.  */
1537   gcc_assert (!strcmp (oldh->first->position, addh->first->position));
1538 
1539   for (add = addh->first; add ; add = next)
1540     {
1541       struct decision *old, *insert_before = NULL;
1542 
1543       next = add->next;
1544 
1545       /* The semantics of pattern matching state that the tests are
1546 	 done in the order given in the MD file so that if an insn
1547 	 matches two patterns, the first one will be used.  However,
1548 	 in practice, most, if not all, patterns are unambiguous so
1549 	 that their order is independent.  In that case, we can merge
1550 	 identical tests and group all similar modes and codes together.
1551 
1552 	 Scan starting from the end of OLDH until we reach a point
1553 	 where we reach the head of the list or where we pass a
1554 	 pattern that could also be true if NEW is true.  If we find
1555 	 an identical pattern, we can merge them.  Also, record the
1556 	 last node that tests the same code and mode and the last one
1557 	 that tests just the same mode.
1558 
1559 	 If we have no match, place NEW after the closest match we found.  */
1560 
1561       for (old = oldh->last; old; old = old->prev)
1562 	{
1563 	  if (nodes_identical (old, add))
1564 	    {
1565 	      merge_accept_insn (old, add);
1566 	      merge_trees (&old->success, &add->success);
1567 	      goto merged_nodes;
1568 	    }
1569 
1570 	  if (maybe_both_true (old, add, 0))
1571 	    break;
1572 
1573 	  /* Insert the nodes in DT test type order, which is roughly
1574 	     how expensive/important the test is.  Given that the tests
1575 	     are also ordered within the list, examining the first is
1576 	     sufficient.  */
1577 	  if ((int) add->tests->type < (int) old->tests->type)
1578 	    insert_before = old;
1579 	}
1580 
1581       if (insert_before == NULL)
1582 	{
1583 	  add->next = NULL;
1584 	  add->prev = oldh->last;
1585 	  oldh->last->next = add;
1586 	  oldh->last = add;
1587 	}
1588       else
1589 	{
1590 	  if ((add->prev = insert_before->prev) != NULL)
1591 	    add->prev->next = add;
1592 	  else
1593 	    oldh->first = add;
1594 	  add->next = insert_before;
1595 	  insert_before->prev = add;
1596 	}
1597 
1598     merged_nodes:;
1599     }
1600 }
1601 
1602 /* Walk the tree looking for sub-nodes that perform common tests.
1603    Factor out the common test into a new node.  This enables us
1604    (depending on the test type) to emit switch statements later.  */
1605 
1606 static void
factor_tests(struct decision_head * head)1607 factor_tests (struct decision_head *head)
1608 {
1609   struct decision *first, *next;
1610 
1611   for (first = head->first; first && first->next; first = next)
1612     {
1613       enum decision_type type;
1614       struct decision *new, *old_last;
1615 
1616       type = first->tests->type;
1617       next = first->next;
1618 
1619       /* Want at least two compatible sequential nodes.  */
1620       if (next->tests->type != type)
1621 	continue;
1622 
1623       /* Don't want all node types, just those we can turn into
1624 	 switch statements.  */
1625       if (type != DT_mode
1626 	  && type != DT_code
1627 	  && type != DT_veclen
1628 	  && type != DT_elt_zero_int
1629 	  && type != DT_elt_one_int
1630 	  && type != DT_elt_zero_wide_safe)
1631 	continue;
1632 
1633       /* If we'd been performing more than one test, create a new node
1634          below our first test.  */
1635       if (first->tests->next != NULL)
1636 	{
1637 	  new = new_decision (first->position, &first->success);
1638 	  new->tests = first->tests->next;
1639 	  first->tests->next = NULL;
1640 	}
1641 
1642       /* Crop the node tree off after our first test.  */
1643       first->next = NULL;
1644       old_last = head->last;
1645       head->last = first;
1646 
1647       /* For each compatible test, adjust to perform only one test in
1648 	 the top level node, then merge the node back into the tree.  */
1649       do
1650 	{
1651 	  struct decision_head h;
1652 
1653 	  if (next->tests->next != NULL)
1654 	    {
1655 	      new = new_decision (next->position, &next->success);
1656 	      new->tests = next->tests->next;
1657 	      next->tests->next = NULL;
1658 	    }
1659 	  new = next;
1660 	  next = next->next;
1661 	  new->next = NULL;
1662 	  h.first = h.last = new;
1663 
1664 	  merge_trees (head, &h);
1665 	}
1666       while (next && next->tests->type == type);
1667 
1668       /* After we run out of compatible tests, graft the remaining nodes
1669 	 back onto the tree.  */
1670       if (next)
1671 	{
1672 	  next->prev = head->last;
1673 	  head->last->next = next;
1674 	  head->last = old_last;
1675 	}
1676     }
1677 
1678   /* Recurse.  */
1679   for (first = head->first; first; first = first->next)
1680     factor_tests (&first->success);
1681 }
1682 
1683 /* After factoring, try to simplify the tests on any one node.
1684    Tests that are useful for switch statements are recognizable
1685    by having only a single test on a node -- we'll be manipulating
1686    nodes with multiple tests:
1687 
1688    If we have mode tests or code tests that are redundant with
1689    predicates, remove them.  */
1690 
1691 static void
simplify_tests(struct decision_head * head)1692 simplify_tests (struct decision_head *head)
1693 {
1694   struct decision *tree;
1695 
1696   for (tree = head->first; tree; tree = tree->next)
1697     {
1698       struct decision_test *a, *b;
1699 
1700       a = tree->tests;
1701       b = a->next;
1702       if (b == NULL)
1703 	continue;
1704 
1705       /* Find a predicate node.  */
1706       while (b && b->type != DT_pred)
1707 	b = b->next;
1708       if (b)
1709 	{
1710 	  /* Due to how these tests are constructed, we don't even need
1711 	     to check that the mode and code are compatible -- they were
1712 	     generated from the predicate in the first place.  */
1713 	  while (a->type == DT_mode || a->type == DT_code)
1714 	    a = a->next;
1715 	  tree->tests = a;
1716 	}
1717     }
1718 
1719   /* Recurse.  */
1720   for (tree = head->first; tree; tree = tree->next)
1721     simplify_tests (&tree->success);
1722 }
1723 
1724 /* Count the number of subnodes of HEAD.  If the number is high enough,
1725    make the first node in HEAD start a separate subroutine in the C code
1726    that is generated.  */
1727 
1728 static int
break_out_subroutines(struct decision_head * head,int initial)1729 break_out_subroutines (struct decision_head *head, int initial)
1730 {
1731   int size = 0;
1732   struct decision *sub;
1733 
1734   for (sub = head->first; sub; sub = sub->next)
1735     size += 1 + break_out_subroutines (&sub->success, 0);
1736 
1737   if (size > SUBROUTINE_THRESHOLD && ! initial)
1738     {
1739       head->first->subroutine_number = ++next_subroutine_number;
1740       size = 1;
1741     }
1742   return size;
1743 }
1744 
1745 /* For each node p, find the next alternative that might be true
1746    when p is true.  */
1747 
1748 static void
find_afterward(struct decision_head * head,struct decision * real_afterward)1749 find_afterward (struct decision_head *head, struct decision *real_afterward)
1750 {
1751   struct decision *p, *q, *afterward;
1752 
1753   /* We can't propagate alternatives across subroutine boundaries.
1754      This is not incorrect, merely a minor optimization loss.  */
1755 
1756   p = head->first;
1757   afterward = (p->subroutine_number > 0 ? NULL : real_afterward);
1758 
1759   for ( ; p ; p = p->next)
1760     {
1761       /* Find the next node that might be true if this one fails.  */
1762       for (q = p->next; q ; q = q->next)
1763 	if (maybe_both_true (p, q, 1))
1764 	  break;
1765 
1766       /* If we reached the end of the list without finding one,
1767 	 use the incoming afterward position.  */
1768       if (!q)
1769 	q = afterward;
1770       p->afterward = q;
1771       if (q)
1772 	q->need_label = 1;
1773     }
1774 
1775   /* Recurse.  */
1776   for (p = head->first; p ; p = p->next)
1777     if (p->success.first)
1778       find_afterward (&p->success, p->afterward);
1779 
1780   /* When we are generating a subroutine, record the real afterward
1781      position in the first node where write_tree can find it, and we
1782      can do the right thing at the subroutine call site.  */
1783   p = head->first;
1784   if (p->subroutine_number > 0)
1785     p->afterward = real_afterward;
1786 }
1787 
1788 /* Assuming that the state of argument is denoted by OLDPOS, take whatever
1789    actions are necessary to move to NEWPOS.  If we fail to move to the
1790    new state, branch to node AFTERWARD if nonzero, otherwise return.
1791 
1792    Failure to move to the new state can only occur if we are trying to
1793    match multiple insns and we try to step past the end of the stream.  */
1794 
1795 static void
change_state(const char * oldpos,const char * newpos,const char * indent)1796 change_state (const char *oldpos, const char *newpos, const char *indent)
1797 {
1798   int odepth = strlen (oldpos);
1799   int ndepth = strlen (newpos);
1800   int depth;
1801   int old_has_insn, new_has_insn;
1802 
1803   /* Pop up as many levels as necessary.  */
1804   for (depth = odepth; strncmp (oldpos, newpos, depth) != 0; --depth)
1805     continue;
1806 
1807   /* Hunt for the last [A-Z] in both strings.  */
1808   for (old_has_insn = odepth - 1; old_has_insn >= 0; --old_has_insn)
1809     if (ISUPPER (oldpos[old_has_insn]))
1810       break;
1811   for (new_has_insn = ndepth - 1; new_has_insn >= 0; --new_has_insn)
1812     if (ISUPPER (newpos[new_has_insn]))
1813       break;
1814 
1815   /* Go down to desired level.  */
1816   while (depth < ndepth)
1817     {
1818       /* It's a different insn from the first one.  */
1819       if (ISUPPER (newpos[depth]))
1820 	{
1821 	  printf ("%stem = peep2_next_insn (%d);\n",
1822 		  indent, newpos[depth] - 'A');
1823 	  printf ("%sx%d = PATTERN (tem);\n", indent, depth + 1);
1824 	}
1825       else if (ISLOWER (newpos[depth]))
1826 	printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1827 		indent, depth + 1, depth, newpos[depth] - 'a');
1828       else
1829 	printf ("%sx%d = XEXP (x%d, %c);\n",
1830 		indent, depth + 1, depth, newpos[depth]);
1831       ++depth;
1832     }
1833 }
1834 
1835 /* Print the enumerator constant for CODE -- the upcase version of
1836    the name.  */
1837 
1838 static void
print_code(enum rtx_code code)1839 print_code (enum rtx_code code)
1840 {
1841   const char *p;
1842   for (p = GET_RTX_NAME (code); *p; p++)
1843     putchar (TOUPPER (*p));
1844 }
1845 
1846 /* Emit code to cross an afterward link -- change state and branch.  */
1847 
1848 static void
write_afterward(struct decision * start,struct decision * afterward,const char * indent)1849 write_afterward (struct decision *start, struct decision *afterward,
1850 		 const char *indent)
1851 {
1852   if (!afterward || start->subroutine_number > 0)
1853     printf("%sgoto ret0;\n", indent);
1854   else
1855     {
1856       change_state (start->position, afterward->position, indent);
1857       printf ("%sgoto L%d;\n", indent, afterward->number);
1858     }
1859 }
1860 
1861 /* Emit a HOST_WIDE_INT as an integer constant expression.  We need to take
1862    special care to avoid "decimal constant is so large that it is unsigned"
1863    warnings in the resulting code.  */
1864 
1865 static void
print_host_wide_int(HOST_WIDE_INT val)1866 print_host_wide_int (HOST_WIDE_INT val)
1867 {
1868   HOST_WIDE_INT min = (unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1);
1869   if (val == min)
1870     printf ("(" HOST_WIDE_INT_PRINT_DEC_C "-1)", val + 1);
1871   else
1872     printf (HOST_WIDE_INT_PRINT_DEC_C, val);
1873 }
1874 
1875 /* Emit a switch statement, if possible, for an initial sequence of
1876    nodes at START.  Return the first node yet untested.  */
1877 
1878 static struct decision *
write_switch(struct decision * start,int depth)1879 write_switch (struct decision *start, int depth)
1880 {
1881   struct decision *p = start;
1882   enum decision_type type = p->tests->type;
1883   struct decision *needs_label = NULL;
1884 
1885   /* If we have two or more nodes in sequence that test the same one
1886      thing, we may be able to use a switch statement.  */
1887 
1888   if (!p->next
1889       || p->tests->next
1890       || p->next->tests->type != type
1891       || p->next->tests->next
1892       || nodes_identical_1 (p->tests, p->next->tests))
1893     return p;
1894 
1895   /* DT_code is special in that we can do interesting things with
1896      known predicates at the same time.  */
1897   if (type == DT_code)
1898     {
1899       char codemap[NUM_RTX_CODE];
1900       struct decision *ret;
1901       RTX_CODE code;
1902 
1903       memset (codemap, 0, sizeof(codemap));
1904 
1905       printf ("  switch (GET_CODE (x%d))\n    {\n", depth);
1906       code = p->tests->u.code;
1907       do
1908 	{
1909 	  if (p != start && p->need_label && needs_label == NULL)
1910 	    needs_label = p;
1911 
1912 	  printf ("    case ");
1913 	  print_code (code);
1914 	  printf (":\n      goto L%d;\n", p->success.first->number);
1915 	  p->success.first->need_label = 1;
1916 
1917 	  codemap[code] = 1;
1918 	  p = p->next;
1919 	}
1920       while (p
1921 	     && ! p->tests->next
1922 	     && p->tests->type == DT_code
1923 	     && ! codemap[code = p->tests->u.code]);
1924 
1925       /* If P is testing a predicate that we know about and we haven't
1926 	 seen any of the codes that are valid for the predicate, we can
1927 	 write a series of "case" statement, one for each possible code.
1928 	 Since we are already in a switch, these redundant tests are very
1929 	 cheap and will reduce the number of predicates called.  */
1930 
1931       /* Note that while we write out cases for these predicates here,
1932 	 we don't actually write the test here, as it gets kinda messy.
1933 	 It is trivial to leave this to later by telling our caller that
1934 	 we only processed the CODE tests.  */
1935       if (needs_label != NULL)
1936 	ret = needs_label;
1937       else
1938 	ret = p;
1939 
1940       while (p && p->tests->type == DT_pred && p->tests->u.pred.data)
1941 	{
1942 	  const struct pred_data *data = p->tests->u.pred.data;
1943 	  RTX_CODE c;
1944 	  for (c = 0; c < NUM_RTX_CODE; c++)
1945 	    if (codemap[c] && data->codes[c])
1946 	      goto pred_done;
1947 
1948 	  for (c = 0; c < NUM_RTX_CODE; c++)
1949 	    if (data->codes[c])
1950 	      {
1951 		fputs ("    case ", stdout);
1952 		print_code (c);
1953 		fputs (":\n", stdout);
1954 		codemap[c] = 1;
1955 	      }
1956 
1957 	  printf ("      goto L%d;\n", p->number);
1958 	  p->need_label = 1;
1959 	  p = p->next;
1960 	}
1961 
1962     pred_done:
1963       /* Make the default case skip the predicates we managed to match.  */
1964 
1965       printf ("    default:\n");
1966       if (p != ret)
1967 	{
1968 	  if (p)
1969 	    {
1970 	      printf ("      goto L%d;\n", p->number);
1971 	      p->need_label = 1;
1972 	    }
1973 	  else
1974 	    write_afterward (start, start->afterward, "      ");
1975 	}
1976       else
1977 	printf ("     break;\n");
1978       printf ("   }\n");
1979 
1980       return ret;
1981     }
1982   else if (type == DT_mode
1983 	   || type == DT_veclen
1984 	   || type == DT_elt_zero_int
1985 	   || type == DT_elt_one_int
1986 	   || type == DT_elt_zero_wide_safe)
1987     {
1988       const char *indent = "";
1989 
1990       /* We cast switch parameter to integer, so we must ensure that the value
1991 	 fits.  */
1992       if (type == DT_elt_zero_wide_safe)
1993 	{
1994 	  indent = "  ";
1995 	  printf("  if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth, depth);
1996 	}
1997       printf ("%s  switch (", indent);
1998       switch (type)
1999 	{
2000 	case DT_mode:
2001 	  printf ("GET_MODE (x%d)", depth);
2002 	  break;
2003 	case DT_veclen:
2004 	  printf ("XVECLEN (x%d, 0)", depth);
2005 	  break;
2006 	case DT_elt_zero_int:
2007 	  printf ("XINT (x%d, 0)", depth);
2008 	  break;
2009 	case DT_elt_one_int:
2010 	  printf ("XINT (x%d, 1)", depth);
2011 	  break;
2012 	case DT_elt_zero_wide_safe:
2013 	  /* Convert result of XWINT to int for portability since some C
2014 	     compilers won't do it and some will.  */
2015 	  printf ("(int) XWINT (x%d, 0)", depth);
2016 	  break;
2017 	default:
2018 	  gcc_unreachable ();
2019 	}
2020       printf (")\n%s    {\n", indent);
2021 
2022       do
2023 	{
2024 	  /* Merge trees will not unify identical nodes if their
2025 	     sub-nodes are at different levels.  Thus we must check
2026 	     for duplicate cases.  */
2027 	  struct decision *q;
2028 	  for (q = start; q != p; q = q->next)
2029 	    if (nodes_identical_1 (p->tests, q->tests))
2030 	      goto case_done;
2031 
2032 	  if (p != start && p->need_label && needs_label == NULL)
2033 	    needs_label = p;
2034 
2035 	  printf ("%s    case ", indent);
2036 	  switch (type)
2037 	    {
2038 	    case DT_mode:
2039 	      printf ("%smode", GET_MODE_NAME (p->tests->u.mode));
2040 	      break;
2041 	    case DT_veclen:
2042 	      printf ("%d", p->tests->u.veclen);
2043 	      break;
2044 	    case DT_elt_zero_int:
2045 	    case DT_elt_one_int:
2046 	    case DT_elt_zero_wide:
2047 	    case DT_elt_zero_wide_safe:
2048 	      print_host_wide_int (p->tests->u.intval);
2049 	      break;
2050 	    default:
2051 	      gcc_unreachable ();
2052 	    }
2053 	  printf (":\n%s      goto L%d;\n", indent, p->success.first->number);
2054 	  p->success.first->need_label = 1;
2055 
2056 	  p = p->next;
2057 	}
2058       while (p && p->tests->type == type && !p->tests->next);
2059 
2060     case_done:
2061       printf ("%s    default:\n%s      break;\n%s    }\n",
2062 	      indent, indent, indent);
2063 
2064       return needs_label != NULL ? needs_label : p;
2065     }
2066   else
2067     {
2068       /* None of the other tests are amenable.  */
2069       return p;
2070     }
2071 }
2072 
2073 /* Emit code for one test.  */
2074 
2075 static void
write_cond(struct decision_test * p,int depth,enum routine_type subroutine_type)2076 write_cond (struct decision_test *p, int depth,
2077 	    enum routine_type subroutine_type)
2078 {
2079   switch (p->type)
2080     {
2081     case DT_num_insns:
2082       printf ("peep2_current_count >= %d", p->u.num_insns);
2083       break;
2084 
2085     case DT_mode:
2086       printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode));
2087       break;
2088 
2089     case DT_code:
2090       printf ("GET_CODE (x%d) == ", depth);
2091       print_code (p->u.code);
2092       break;
2093 
2094     case DT_veclen:
2095       printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen);
2096       break;
2097 
2098     case DT_elt_zero_int:
2099       printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval);
2100       break;
2101 
2102     case DT_elt_one_int:
2103       printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval);
2104       break;
2105 
2106     case DT_elt_zero_wide:
2107     case DT_elt_zero_wide_safe:
2108       printf ("XWINT (x%d, 0) == ", depth);
2109       print_host_wide_int (p->u.intval);
2110       break;
2111 
2112     case DT_const_int:
2113       printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]",
2114 	      depth, (int) p->u.intval);
2115       break;
2116 
2117     case DT_veclen_ge:
2118       printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen);
2119       break;
2120 
2121     case DT_dup:
2122       printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup);
2123       break;
2124 
2125     case DT_pred:
2126       printf ("%s (x%d, %smode)", p->u.pred.name, depth,
2127 	      GET_MODE_NAME (p->u.pred.mode));
2128       break;
2129 
2130     case DT_c_test:
2131       print_c_condition (p->u.c_test);
2132       break;
2133 
2134     case DT_accept_insn:
2135       gcc_assert (subroutine_type == RECOG);
2136       gcc_assert (p->u.insn.num_clobbers_to_add);
2137       printf ("pnum_clobbers != NULL");
2138       break;
2139 
2140     default:
2141       gcc_unreachable ();
2142     }
2143 }
2144 
2145 /* Emit code for one action.  The previous tests have succeeded;
2146    TEST is the last of the chain.  In the normal case we simply
2147    perform a state change.  For the `accept' tests we must do more work.  */
2148 
2149 static void
write_action(struct decision * p,struct decision_test * test,int depth,int uncond,struct decision * success,enum routine_type subroutine_type)2150 write_action (struct decision *p, struct decision_test *test,
2151 	      int depth, int uncond, struct decision *success,
2152 	      enum routine_type subroutine_type)
2153 {
2154   const char *indent;
2155   int want_close = 0;
2156 
2157   if (uncond)
2158     indent = "  ";
2159   else if (test->type == DT_accept_op || test->type == DT_accept_insn)
2160     {
2161       fputs ("    {\n", stdout);
2162       indent = "      ";
2163       want_close = 1;
2164     }
2165   else
2166     indent = "    ";
2167 
2168   if (test->type == DT_accept_op)
2169     {
2170       printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth);
2171 
2172       /* Only allow DT_accept_insn to follow.  */
2173       if (test->next)
2174 	{
2175 	  test = test->next;
2176 	  gcc_assert (test->type == DT_accept_insn);
2177 	}
2178     }
2179 
2180   /* Sanity check that we're now at the end of the list of tests.  */
2181   gcc_assert (!test->next);
2182 
2183   if (test->type == DT_accept_insn)
2184     {
2185       switch (subroutine_type)
2186 	{
2187 	case RECOG:
2188 	  if (test->u.insn.num_clobbers_to_add != 0)
2189 	    printf ("%s*pnum_clobbers = %d;\n",
2190 		    indent, test->u.insn.num_clobbers_to_add);
2191 	  printf ("%sreturn %d;  /* %s */\n", indent,
2192 		  test->u.insn.code_number,
2193 		  get_insn_name (test->u.insn.code_number));
2194 	  break;
2195 
2196 	case SPLIT:
2197 	  printf ("%sreturn gen_split_%d (insn, operands);\n",
2198 		  indent, test->u.insn.code_number);
2199 	  break;
2200 
2201 	case PEEPHOLE2:
2202 	  {
2203 	    int match_len = 0, i;
2204 
2205 	    for (i = strlen (p->position) - 1; i >= 0; --i)
2206 	      if (ISUPPER (p->position[i]))
2207 		{
2208 		  match_len = p->position[i] - 'A';
2209 		  break;
2210 		}
2211 	    printf ("%s*_pmatch_len = %d;\n", indent, match_len);
2212 	    printf ("%stem = gen_peephole2_%d (insn, operands);\n",
2213 		    indent, test->u.insn.code_number);
2214 	    printf ("%sif (tem != 0)\n%s  return tem;\n", indent, indent);
2215 	  }
2216 	  break;
2217 
2218 	default:
2219 	  gcc_unreachable ();
2220 	}
2221     }
2222   else
2223     {
2224       printf("%sgoto L%d;\n", indent, success->number);
2225       success->need_label = 1;
2226     }
2227 
2228   if (want_close)
2229     fputs ("    }\n", stdout);
2230 }
2231 
2232 /* Return 1 if the test is always true and has no fallthru path.  Return -1
2233    if the test does have a fallthru path, but requires that the condition be
2234    terminated.  Otherwise return 0 for a normal test.  */
2235 /* ??? is_unconditional is a stupid name for a tri-state function.  */
2236 
2237 static int
is_unconditional(struct decision_test * t,enum routine_type subroutine_type)2238 is_unconditional (struct decision_test *t, enum routine_type subroutine_type)
2239 {
2240   if (t->type == DT_accept_op)
2241     return 1;
2242 
2243   if (t->type == DT_accept_insn)
2244     {
2245       switch (subroutine_type)
2246 	{
2247 	case RECOG:
2248 	  return (t->u.insn.num_clobbers_to_add == 0);
2249 	case SPLIT:
2250 	  return 1;
2251 	case PEEPHOLE2:
2252 	  return -1;
2253 	default:
2254 	  gcc_unreachable ();
2255 	}
2256     }
2257 
2258   return 0;
2259 }
2260 
2261 /* Emit code for one node -- the conditional and the accompanying action.
2262    Return true if there is no fallthru path.  */
2263 
2264 static int
write_node(struct decision * p,int depth,enum routine_type subroutine_type)2265 write_node (struct decision *p, int depth,
2266 	    enum routine_type subroutine_type)
2267 {
2268   struct decision_test *test, *last_test;
2269   int uncond;
2270 
2271   /* Scan the tests and simplify comparisons against small
2272      constants.  */
2273   for (test = p->tests; test; test = test->next)
2274     {
2275       if (test->type == DT_code
2276 	  && test->u.code == CONST_INT
2277 	  && test->next
2278 	  && test->next->type == DT_elt_zero_wide_safe
2279 	  && -MAX_SAVED_CONST_INT <= test->next->u.intval
2280 	  && test->next->u.intval <= MAX_SAVED_CONST_INT)
2281 	{
2282 	  test->type = DT_const_int;
2283 	  test->u.intval = test->next->u.intval;
2284 	  test->next = test->next->next;
2285 	}
2286     }
2287 
2288   last_test = test = p->tests;
2289   uncond = is_unconditional (test, subroutine_type);
2290   if (uncond == 0)
2291     {
2292       printf ("  if (");
2293       write_cond (test, depth, subroutine_type);
2294 
2295       while ((test = test->next) != NULL)
2296 	{
2297 	  last_test = test;
2298 	  if (is_unconditional (test, subroutine_type))
2299 	    break;
2300 
2301 	  printf ("\n      && ");
2302 	  write_cond (test, depth, subroutine_type);
2303 	}
2304 
2305       printf (")\n");
2306     }
2307 
2308   write_action (p, last_test, depth, uncond, p->success.first, subroutine_type);
2309 
2310   return uncond > 0;
2311 }
2312 
2313 /* Emit code for all of the sibling nodes of HEAD.  */
2314 
2315 static void
write_tree_1(struct decision_head * head,int depth,enum routine_type subroutine_type)2316 write_tree_1 (struct decision_head *head, int depth,
2317 	      enum routine_type subroutine_type)
2318 {
2319   struct decision *p, *next;
2320   int uncond = 0;
2321 
2322   for (p = head->first; p ; p = next)
2323     {
2324       /* The label for the first element was printed in write_tree.  */
2325       if (p != head->first && p->need_label)
2326 	OUTPUT_LABEL (" ", p->number);
2327 
2328       /* Attempt to write a switch statement for a whole sequence.  */
2329       next = write_switch (p, depth);
2330       if (p != next)
2331 	uncond = 0;
2332       else
2333 	{
2334 	  /* Failed -- fall back and write one node.  */
2335 	  uncond = write_node (p, depth, subroutine_type);
2336 	  next = p->next;
2337 	}
2338     }
2339 
2340   /* Finished with this chain.  Close a fallthru path by branching
2341      to the afterward node.  */
2342   if (! uncond)
2343     write_afterward (head->last, head->last->afterward, "  ");
2344 }
2345 
2346 /* Write out the decision tree starting at HEAD.  PREVPOS is the
2347    position at the node that branched to this node.  */
2348 
2349 static void
write_tree(struct decision_head * head,const char * prevpos,enum routine_type type,int initial)2350 write_tree (struct decision_head *head, const char *prevpos,
2351 	    enum routine_type type, int initial)
2352 {
2353   struct decision *p = head->first;
2354 
2355   putchar ('\n');
2356   if (p->need_label)
2357     OUTPUT_LABEL (" ", p->number);
2358 
2359   if (! initial && p->subroutine_number > 0)
2360     {
2361       static const char * const name_prefix[] = {
2362 	  "recog", "split", "peephole2"
2363       };
2364 
2365       static const char * const call_suffix[] = {
2366 	  ", pnum_clobbers", "", ", _pmatch_len"
2367       };
2368 
2369       /* This node has been broken out into a separate subroutine.
2370 	 Call it, test the result, and branch accordingly.  */
2371 
2372       if (p->afterward)
2373 	{
2374 	  printf ("  tem = %s_%d (x0, insn%s);\n",
2375 		  name_prefix[type], p->subroutine_number, call_suffix[type]);
2376 	  if (IS_SPLIT (type))
2377 	    printf ("  if (tem != 0)\n    return tem;\n");
2378 	  else
2379 	    printf ("  if (tem >= 0)\n    return tem;\n");
2380 
2381 	  change_state (p->position, p->afterward->position, "  ");
2382 	  printf ("  goto L%d;\n", p->afterward->number);
2383 	}
2384       else
2385 	{
2386 	  printf ("  return %s_%d (x0, insn%s);\n",
2387 		  name_prefix[type], p->subroutine_number, call_suffix[type]);
2388 	}
2389     }
2390   else
2391     {
2392       int depth = strlen (p->position);
2393 
2394       change_state (prevpos, p->position, "  ");
2395       write_tree_1 (head, depth, type);
2396 
2397       for (p = head->first; p; p = p->next)
2398         if (p->success.first)
2399           write_tree (&p->success, p->position, type, 0);
2400     }
2401 }
2402 
2403 /* Write out a subroutine of type TYPE to do comparisons starting at
2404    node TREE.  */
2405 
2406 static void
write_subroutine(struct decision_head * head,enum routine_type type)2407 write_subroutine (struct decision_head *head, enum routine_type type)
2408 {
2409   int subfunction = head->first ? head->first->subroutine_number : 0;
2410   const char *s_or_e;
2411   char extension[32];
2412   int i;
2413 
2414   s_or_e = subfunction ? "static " : "";
2415 
2416   if (subfunction)
2417     sprintf (extension, "_%d", subfunction);
2418   else if (type == RECOG)
2419     extension[0] = '\0';
2420   else
2421     strcpy (extension, "_insns");
2422 
2423   switch (type)
2424     {
2425     case RECOG:
2426       printf ("%sint\n\
2427 recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension);
2428       break;
2429     case SPLIT:
2430       printf ("%srtx\n\
2431 split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
2432 	      s_or_e, extension);
2433       break;
2434     case PEEPHOLE2:
2435       printf ("%srtx\n\
2436 peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
2437 	      s_or_e, extension);
2438       break;
2439     }
2440 
2441   printf ("{\n  rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n");
2442   for (i = 1; i <= max_depth; i++)
2443     printf ("  rtx x%d ATTRIBUTE_UNUSED;\n", i);
2444 
2445   printf ("  %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int");
2446 
2447   if (!subfunction)
2448     printf ("  recog_data.insn = NULL_RTX;\n");
2449 
2450   if (head->first)
2451     write_tree (head, "", type, 1);
2452   else
2453     printf ("  goto ret0;\n");
2454 
2455   printf (" ret0:\n  return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1);
2456 }
2457 
2458 /* In break_out_subroutines, we discovered the boundaries for the
2459    subroutines, but did not write them out.  Do so now.  */
2460 
2461 static void
write_subroutines(struct decision_head * head,enum routine_type type)2462 write_subroutines (struct decision_head *head, enum routine_type type)
2463 {
2464   struct decision *p;
2465 
2466   for (p = head->first; p ; p = p->next)
2467     if (p->success.first)
2468       write_subroutines (&p->success, type);
2469 
2470   if (head->first->subroutine_number > 0)
2471     write_subroutine (head, type);
2472 }
2473 
2474 /* Begin the output file.  */
2475 
2476 static void
write_header(void)2477 write_header (void)
2478 {
2479   puts ("\
2480 /* Generated automatically by the program `genrecog' from the target\n\
2481    machine description file.  */\n\
2482 \n\
2483 #include \"config.h\"\n\
2484 #include \"system.h\"\n\
2485 #include \"coretypes.h\"\n\
2486 #include \"tm.h\"\n\
2487 #include \"rtl.h\"\n\
2488 #include \"tm_p.h\"\n\
2489 #include \"function.h\"\n\
2490 #include \"insn-config.h\"\n\
2491 #include \"recog.h\"\n\
2492 #include \"real.h\"\n\
2493 #include \"output.h\"\n\
2494 #include \"flags.h\"\n\
2495 #include \"hard-reg-set.h\"\n\
2496 #include \"resource.h\"\n\
2497 #include \"toplev.h\"\n\
2498 #include \"reload.h\"\n\
2499 #include \"tm-constrs.h\"\n\
2500 \n");
2501 
2502   puts ("\n\
2503 /* `recog' contains a decision tree that recognizes whether the rtx\n\
2504    X0 is a valid instruction.\n\
2505 \n\
2506    recog returns -1 if the rtx is not valid.  If the rtx is valid, recog\n\
2507    returns a nonnegative number which is the insn code number for the\n\
2508    pattern that matched.  This is the same as the order in the machine\n\
2509    description of the entry that matched.  This number can be used as an\n\
2510    index into `insn_data' and other tables.\n");
2511   puts ("\
2512    The third argument to recog is an optional pointer to an int.  If\n\
2513    present, recog will accept a pattern if it matches except for missing\n\
2514    CLOBBER expressions at the end.  In that case, the value pointed to by\n\
2515    the optional pointer will be set to the number of CLOBBERs that need\n\
2516    to be added (it should be initialized to zero by the caller).  If it");
2517   puts ("\
2518    is set nonzero, the caller should allocate a PARALLEL of the\n\
2519    appropriate size, copy the initial entries, and call add_clobbers\n\
2520    (found in insn-emit.c) to fill in the CLOBBERs.\n\
2521 ");
2522 
2523   puts ("\n\
2524    The function split_insns returns 0 if the rtl could not\n\
2525    be split or the split rtl as an INSN list if it can be.\n\
2526 \n\
2527    The function peephole2_insns returns 0 if the rtl could not\n\
2528    be matched. If there was a match, the new rtl is returned in an INSN list,\n\
2529    and LAST_INSN will point to the last recognized insn in the old sequence.\n\
2530 */\n\n");
2531 }
2532 
2533 
2534 /* Construct and return a sequence of decisions
2535    that will recognize INSN.
2536 
2537    TYPE says what type of routine we are recognizing (RECOG or SPLIT).  */
2538 
2539 static struct decision_head
make_insn_sequence(rtx insn,enum routine_type type)2540 make_insn_sequence (rtx insn, enum routine_type type)
2541 {
2542   rtx x;
2543   const char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
2544   int truth = maybe_eval_c_test (c_test);
2545   struct decision *last;
2546   struct decision_test *test, **place;
2547   struct decision_head head;
2548   char c_test_pos[2];
2549 
2550   /* We should never see an insn whose C test is false at compile time.  */
2551   gcc_assert (truth);
2552 
2553   c_test_pos[0] = '\0';
2554   if (type == PEEPHOLE2)
2555     {
2556       int i, j;
2557 
2558       /* peephole2 gets special treatment:
2559 	 - X always gets an outer parallel even if it's only one entry
2560 	 - we remove all traces of outer-level match_scratch and match_dup
2561            expressions here.  */
2562       x = rtx_alloc (PARALLEL);
2563       PUT_MODE (x, VOIDmode);
2564       XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0));
2565       for (i = j = 0; i < XVECLEN (insn, 0); i++)
2566 	{
2567 	  rtx tmp = XVECEXP (insn, 0, i);
2568 	  if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP)
2569 	    {
2570 	      XVECEXP (x, 0, j) = tmp;
2571 	      j++;
2572 	    }
2573 	}
2574       XVECLEN (x, 0) = j;
2575 
2576       c_test_pos[0] = 'A' + j - 1;
2577       c_test_pos[1] = '\0';
2578     }
2579   else if (XVECLEN (insn, type == RECOG) == 1)
2580     x = XVECEXP (insn, type == RECOG, 0);
2581   else
2582     {
2583       x = rtx_alloc (PARALLEL);
2584       XVEC (x, 0) = XVEC (insn, type == RECOG);
2585       PUT_MODE (x, VOIDmode);
2586     }
2587 
2588   validate_pattern (x, insn, NULL_RTX, 0);
2589 
2590   memset(&head, 0, sizeof(head));
2591   last = add_to_sequence (x, &head, "", type, 1);
2592 
2593   /* Find the end of the test chain on the last node.  */
2594   for (test = last->tests; test->next; test = test->next)
2595     continue;
2596   place = &test->next;
2597 
2598   /* Skip the C test if it's known to be true at compile time.  */
2599   if (truth == -1)
2600     {
2601       /* Need a new node if we have another test to add.  */
2602       if (test->type == DT_accept_op)
2603 	{
2604 	  last = new_decision (c_test_pos, &last->success);
2605 	  place = &last->tests;
2606 	}
2607       test = new_decision_test (DT_c_test, &place);
2608       test->u.c_test = c_test;
2609     }
2610 
2611   test = new_decision_test (DT_accept_insn, &place);
2612   test->u.insn.code_number = next_insn_code;
2613   test->u.insn.lineno = pattern_lineno;
2614   test->u.insn.num_clobbers_to_add = 0;
2615 
2616   switch (type)
2617     {
2618     case RECOG:
2619       /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends
2620 	 with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.
2621 	 If so, set up to recognize the pattern without these CLOBBERs.  */
2622 
2623       if (GET_CODE (x) == PARALLEL)
2624 	{
2625 	  int i;
2626 
2627 	  /* Find the last non-clobber in the parallel.  */
2628 	  for (i = XVECLEN (x, 0); i > 0; i--)
2629 	    {
2630 	      rtx y = XVECEXP (x, 0, i - 1);
2631 	      if (GET_CODE (y) != CLOBBER
2632 		  || (!REG_P (XEXP (y, 0))
2633 		      && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH))
2634 		break;
2635 	    }
2636 
2637 	  if (i != XVECLEN (x, 0))
2638 	    {
2639 	      rtx new;
2640 	      struct decision_head clobber_head;
2641 
2642 	      /* Build a similar insn without the clobbers.  */
2643 	      if (i == 1)
2644 		new = XVECEXP (x, 0, 0);
2645 	      else
2646 		{
2647 		  int j;
2648 
2649 		  new = rtx_alloc (PARALLEL);
2650 		  XVEC (new, 0) = rtvec_alloc (i);
2651 		  for (j = i - 1; j >= 0; j--)
2652 		    XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
2653 		}
2654 
2655 	      /* Recognize it.  */
2656 	      memset (&clobber_head, 0, sizeof(clobber_head));
2657 	      last = add_to_sequence (new, &clobber_head, "", type, 1);
2658 
2659 	      /* Find the end of the test chain on the last node.  */
2660 	      for (test = last->tests; test->next; test = test->next)
2661 		continue;
2662 
2663 	      /* We definitely have a new test to add -- create a new
2664 		 node if needed.  */
2665 	      place = &test->next;
2666 	      if (test->type == DT_accept_op)
2667 		{
2668 		  last = new_decision ("", &last->success);
2669 		  place = &last->tests;
2670 		}
2671 
2672 	      /* Skip the C test if it's known to be true at compile
2673                  time.  */
2674 	      if (truth == -1)
2675 		{
2676 		  test = new_decision_test (DT_c_test, &place);
2677 		  test->u.c_test = c_test;
2678 		}
2679 
2680 	      test = new_decision_test (DT_accept_insn, &place);
2681 	      test->u.insn.code_number = next_insn_code;
2682 	      test->u.insn.lineno = pattern_lineno;
2683 	      test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i;
2684 
2685 	      merge_trees (&head, &clobber_head);
2686 	    }
2687 	}
2688       break;
2689 
2690     case SPLIT:
2691       /* Define the subroutine we will call below and emit in genemit.  */
2692       printf ("extern rtx gen_split_%d (rtx, rtx *);\n", next_insn_code);
2693       break;
2694 
2695     case PEEPHOLE2:
2696       /* Define the subroutine we will call below and emit in genemit.  */
2697       printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n",
2698 	      next_insn_code);
2699       break;
2700     }
2701 
2702   return head;
2703 }
2704 
2705 static void
process_tree(struct decision_head * head,enum routine_type subroutine_type)2706 process_tree (struct decision_head *head, enum routine_type subroutine_type)
2707 {
2708   if (head->first == NULL)
2709     {
2710       /* We can elide peephole2_insns, but not recog or split_insns.  */
2711       if (subroutine_type == PEEPHOLE2)
2712 	return;
2713     }
2714   else
2715     {
2716       factor_tests (head);
2717 
2718       next_subroutine_number = 0;
2719       break_out_subroutines (head, 1);
2720       find_afterward (head, NULL);
2721 
2722       /* We run this after find_afterward, because find_afterward needs
2723 	 the redundant DT_mode tests on predicates to determine whether
2724 	 two tests can both be true or not.  */
2725       simplify_tests(head);
2726 
2727       write_subroutines (head, subroutine_type);
2728     }
2729 
2730   write_subroutine (head, subroutine_type);
2731 }
2732 
2733 extern int main (int, char **);
2734 
2735 int
main(int argc,char ** argv)2736 main (int argc, char **argv)
2737 {
2738   rtx desc;
2739   struct decision_head recog_tree, split_tree, peephole2_tree, h;
2740 
2741   progname = "genrecog";
2742 
2743   memset (&recog_tree, 0, sizeof recog_tree);
2744   memset (&split_tree, 0, sizeof split_tree);
2745   memset (&peephole2_tree, 0, sizeof peephole2_tree);
2746 
2747   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
2748     return (FATAL_EXIT_CODE);
2749 
2750   next_insn_code = 0;
2751 
2752   write_header ();
2753 
2754   /* Read the machine description.  */
2755 
2756   while (1)
2757     {
2758       desc = read_md_rtx (&pattern_lineno, &next_insn_code);
2759       if (desc == NULL)
2760 	break;
2761 
2762       switch (GET_CODE (desc))
2763 	{
2764 	case DEFINE_PREDICATE:
2765 	case DEFINE_SPECIAL_PREDICATE:
2766 	  process_define_predicate (desc);
2767 	  break;
2768 
2769 	case DEFINE_INSN:
2770 	  h = make_insn_sequence (desc, RECOG);
2771 	  merge_trees (&recog_tree, &h);
2772 	  break;
2773 
2774 	case DEFINE_SPLIT:
2775 	  h = make_insn_sequence (desc, SPLIT);
2776 	  merge_trees (&split_tree, &h);
2777 	  break;
2778 
2779 	case DEFINE_PEEPHOLE2:
2780 	  h = make_insn_sequence (desc, PEEPHOLE2);
2781 	  merge_trees (&peephole2_tree, &h);
2782 
2783 	default:
2784 	  /* do nothing */;
2785 	}
2786     }
2787 
2788   if (error_count || have_error)
2789     return FATAL_EXIT_CODE;
2790 
2791   puts ("\n\n");
2792 
2793   process_tree (&recog_tree, RECOG);
2794   process_tree (&split_tree, SPLIT);
2795   process_tree (&peephole2_tree, PEEPHOLE2);
2796 
2797   fflush (stdout);
2798   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
2799 }
2800 
2801 static void
debug_decision_2(struct decision_test * test)2802 debug_decision_2 (struct decision_test *test)
2803 {
2804   switch (test->type)
2805     {
2806     case DT_num_insns:
2807       fprintf (stderr, "num_insns=%d", test->u.num_insns);
2808       break;
2809     case DT_mode:
2810       fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode));
2811       break;
2812     case DT_code:
2813       fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code));
2814       break;
2815     case DT_veclen:
2816       fprintf (stderr, "veclen=%d", test->u.veclen);
2817       break;
2818     case DT_elt_zero_int:
2819       fprintf (stderr, "elt0_i=%d", (int) test->u.intval);
2820       break;
2821     case DT_elt_one_int:
2822       fprintf (stderr, "elt1_i=%d", (int) test->u.intval);
2823       break;
2824     case DT_elt_zero_wide:
2825       fprintf (stderr, "elt0_w=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2826       break;
2827     case DT_elt_zero_wide_safe:
2828       fprintf (stderr, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2829       break;
2830     case DT_veclen_ge:
2831       fprintf (stderr, "veclen>=%d", test->u.veclen);
2832       break;
2833     case DT_dup:
2834       fprintf (stderr, "dup=%d", test->u.dup);
2835       break;
2836     case DT_pred:
2837       fprintf (stderr, "pred=(%s,%s)",
2838 	       test->u.pred.name, GET_MODE_NAME(test->u.pred.mode));
2839       break;
2840     case DT_c_test:
2841       {
2842 	char sub[16+4];
2843 	strncpy (sub, test->u.c_test, sizeof(sub));
2844 	memcpy (sub+16, "...", 4);
2845 	fprintf (stderr, "c_test=\"%s\"", sub);
2846       }
2847       break;
2848     case DT_accept_op:
2849       fprintf (stderr, "A_op=%d", test->u.opno);
2850       break;
2851     case DT_accept_insn:
2852       fprintf (stderr, "A_insn=(%d,%d)",
2853 	       test->u.insn.code_number, test->u.insn.num_clobbers_to_add);
2854       break;
2855 
2856     default:
2857       gcc_unreachable ();
2858     }
2859 }
2860 
2861 static void
debug_decision_1(struct decision * d,int indent)2862 debug_decision_1 (struct decision *d, int indent)
2863 {
2864   int i;
2865   struct decision_test *test;
2866 
2867   if (d == NULL)
2868     {
2869       for (i = 0; i < indent; ++i)
2870 	putc (' ', stderr);
2871       fputs ("(nil)\n", stderr);
2872       return;
2873     }
2874 
2875   for (i = 0; i < indent; ++i)
2876     putc (' ', stderr);
2877 
2878   putc ('{', stderr);
2879   test = d->tests;
2880   if (test)
2881     {
2882       debug_decision_2 (test);
2883       while ((test = test->next) != NULL)
2884 	{
2885 	  fputs (" + ", stderr);
2886 	  debug_decision_2 (test);
2887 	}
2888     }
2889   fprintf (stderr, "} %d n %d a %d\n", d->number,
2890 	   (d->next ? d->next->number : -1),
2891 	   (d->afterward ? d->afterward->number : -1));
2892 }
2893 
2894 static void
debug_decision_0(struct decision * d,int indent,int maxdepth)2895 debug_decision_0 (struct decision *d, int indent, int maxdepth)
2896 {
2897   struct decision *n;
2898   int i;
2899 
2900   if (maxdepth < 0)
2901     return;
2902   if (d == NULL)
2903     {
2904       for (i = 0; i < indent; ++i)
2905 	putc (' ', stderr);
2906       fputs ("(nil)\n", stderr);
2907       return;
2908     }
2909 
2910   debug_decision_1 (d, indent);
2911   for (n = d->success.first; n ; n = n->next)
2912     debug_decision_0 (n, indent + 2, maxdepth - 1);
2913 }
2914 
2915 void
debug_decision(struct decision * d)2916 debug_decision (struct decision *d)
2917 {
2918   debug_decision_0 (d, 0, 1000000);
2919 }
2920 
2921 void
debug_decision_list(struct decision * d)2922 debug_decision_list (struct decision *d)
2923 {
2924   while (d)
2925     {
2926       debug_decision_0 (d, 0, 0);
2927       d = d->next;
2928     }
2929 }
2930