OSDN Git Service

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