OSDN Git Service

65387123436a1dbf55a1e3d13dcc0eb8dd708dae
[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 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_veclen_ge, DT_dup, DT_pred, DT_c_test,
94       DT_accept_op, DT_accept_insn
95     } type;
96
97   union
98   {
99     enum machine_mode mode;     /* Machine mode of node.  */
100     RTX_CODE code;              /* Code to test.  */
101
102     struct
103     {
104       const char *name;         /* Predicate to call.  */
105       int index;                /* Index into `preds' or -1.  */
106       enum machine_mode mode;   /* Machine mode for node.  */
107     } pred;
108
109     const char *c_test;         /* Additional test to perform.  */
110     int veclen;                 /* Length of vector.  */
111     int dup;                    /* Number of operand to compare against.  */
112     HOST_WIDE_INT intval;       /* Value for XINT for XWINT.  */
113     int opno;                   /* Operand number matched.  */
114
115     struct {
116       int code_number;          /* Insn number matched.  */
117       int lineno;               /* Line number of the insn.  */
118       int num_clobbers_to_add;  /* Number of CLOBBERs to be added.  */
119     } insn;
120   } u;
121 };
122
123 /* Data structure for decision tree for recognizing legitimate insns.  */
124
125 struct decision
126 {
127   struct decision_head success; /* Nodes to test on success.  */
128   struct decision *next;        /* Node to test on failure.  */
129   struct decision *prev;        /* Node whose failure tests us.  */
130   struct decision *afterward;   /* Node to test on success,
131                                    but failure of successor nodes.  */
132
133   const char *position;         /* String denoting position in pattern.  */
134
135   struct decision_test *tests;  /* The tests for this node.  */
136
137   int number;                   /* Node number, used for labels */
138   int subroutine_number;        /* Number of subroutine this node starts */
139   int need_label;               /* Label needs to be output.  */
140 };
141
142 #define SUBROUTINE_THRESHOLD    100
143
144 static int next_subroutine_number;
145
146 /* We can write three types of subroutines: One for insn recognition,
147    one to split insns, and one for peephole-type optimizations.  This
148    defines which type is being written.  */
149
150 enum routine_type {
151   RECOG, SPLIT, PEEPHOLE2
152 };
153
154 #define IS_SPLIT(X) ((X) != RECOG)
155
156 /* Next available node number for tree nodes.  */
157
158 static int next_number;
159
160 /* Next number to use as an insn_code.  */
161
162 static int next_insn_code;
163
164 /* Similar, but counts all expressions in the MD file; used for
165    error messages.  */
166
167 static int next_index;
168
169 /* Record the highest depth we ever have so we know how many variables to
170    allocate in each subroutine we make.  */
171
172 static int max_depth;
173
174 /* The line number of the start of the pattern currently being processed.  */
175 static int pattern_lineno;
176
177 /* Count of errors.  */
178 static int error_count;
179 \f
180 /* This table contains a list of the rtl codes that can possibly match a
181    predicate defined in recog.c.  The function `maybe_both_true' uses it to
182    deduce that there are no expressions that can be matches by certain pairs
183    of tree nodes.  Also, if a predicate can match only one code, we can
184    hardwire that code into the node testing the predicate.  */
185
186 static const struct pred_table
187 {
188   const char *const name;
189   const RTX_CODE codes[NUM_RTX_CODE];
190 } preds[] = {
191   {"general_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
192                        LABEL_REF, SUBREG, REG, MEM, ADDRESSOF}},
193 #ifdef PREDICATE_CODES
194   PREDICATE_CODES
195 #endif
196   {"address_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
197                        LABEL_REF, SUBREG, REG, MEM, ADDRESSOF,
198                        PLUS, MINUS, MULT}},
199   {"register_operand", {SUBREG, REG, ADDRESSOF}},
200   {"pmode_register_operand", {SUBREG, REG, ADDRESSOF}},
201   {"scratch_operand", {SCRATCH, REG}},
202   {"immediate_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
203                          LABEL_REF}},
204   {"const_int_operand", {CONST_INT}},
205   {"const_double_operand", {CONST_INT, CONST_DOUBLE}},
206   {"nonimmediate_operand", {SUBREG, REG, MEM, ADDRESSOF}},
207   {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
208                          LABEL_REF, SUBREG, REG, ADDRESSOF}},
209   {"push_operand", {MEM}},
210   {"pop_operand", {MEM}},
211   {"memory_operand", {SUBREG, MEM}},
212   {"indirect_operand", {SUBREG, MEM}},
213   {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU,
214                            UNORDERED, ORDERED, UNEQ, UNGE, UNGT, UNLE,
215                            UNLT, LTGT}}
216 };
217
218 #define NUM_KNOWN_PREDS ARRAY_SIZE (preds)
219
220 static const char *const special_mode_pred_table[] = {
221 #ifdef SPECIAL_MODE_PREDICATES
222   SPECIAL_MODE_PREDICATES
223 #endif
224   "pmode_register_operand"
225 };
226
227 #define NUM_SPECIAL_MODE_PREDS ARRAY_SIZE (special_mode_pred_table)
228
229 static struct decision *new_decision
230   (const char *, struct decision_head *);
231 static struct decision_test *new_decision_test
232   (enum decision_type, struct decision_test ***);
233 static rtx find_operand
234   (rtx, int);
235 static rtx find_matching_operand
236   (rtx, int);
237 static void validate_pattern
238   (rtx, rtx, rtx, int);
239 static struct decision *add_to_sequence
240   (rtx, struct decision_head *, const char *, enum routine_type, int);
241
242 static int maybe_both_true_2
243   (struct decision_test *, struct decision_test *);
244 static int maybe_both_true_1
245   (struct decision_test *, struct decision_test *);
246 static int maybe_both_true
247   (struct decision *, struct decision *, int);
248
249 static int nodes_identical_1
250   (struct decision_test *, struct decision_test *);
251 static int nodes_identical
252   (struct decision *, struct decision *);
253 static void merge_accept_insn
254   (struct decision *, struct decision *);
255 static void merge_trees
256   (struct decision_head *, struct decision_head *);
257
258 static void factor_tests
259   (struct decision_head *);
260 static void simplify_tests
261   (struct decision_head *);
262 static int break_out_subroutines
263   (struct decision_head *, int);
264 static void find_afterward
265   (struct decision_head *, struct decision *);
266
267 static void change_state
268   (const char *, const char *, struct decision *, const char *);
269 static void print_code
270   (enum rtx_code);
271 static void write_afterward
272   (struct decision *, struct decision *, const char *);
273 static struct decision *write_switch
274   (struct decision *, int);
275 static void write_cond
276   (struct decision_test *, int, enum routine_type);
277 static void write_action
278   (struct decision *, struct decision_test *, int, int,
279    struct decision *, enum routine_type);
280 static int is_unconditional
281   (struct decision_test *, enum routine_type);
282 static int write_node
283   (struct decision *, int, enum routine_type);
284 static void write_tree_1
285   (struct decision_head *, int, enum routine_type);
286 static void write_tree
287   (struct decision_head *, const char *, enum routine_type, int);
288 static void write_subroutine
289   (struct decision_head *, enum routine_type);
290 static void write_subroutines
291   (struct decision_head *, enum routine_type);
292 static void write_header
293   (void);
294
295 static struct decision_head make_insn_sequence
296   (rtx, enum routine_type);
297 static void process_tree
298   (struct decision_head *, enum routine_type);
299
300 static void record_insn_name
301   (int, const char *);
302
303 static void debug_decision_0
304   (struct decision *, int, int);
305 static void debug_decision_1
306   (struct decision *, int);
307 static void debug_decision_2
308   (struct decision_test *);
309 extern void debug_decision
310   (struct decision *);
311 extern void debug_decision_list
312   (struct decision *);
313 \f
314 /* Create a new node in sequence after LAST.  */
315
316 static struct decision *
317 new_decision (const char *position, struct decision_head *last)
318 {
319   struct decision *new = xmalloc (sizeof (struct decision));
320
321   memset (new, 0, sizeof (*new));
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           /* FALLTHRU */
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           /* FALLTHRU */
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 referant 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       /* FALLTHRU */
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 switch statement, if possible, for an initial sequence of
1739    nodes at START.  Return the first node yet untested.  */
1740
1741 static struct decision *
1742 write_switch (struct decision *start, int depth)
1743 {
1744   struct decision *p = start;
1745   enum decision_type type = p->tests->type;
1746   struct decision *needs_label = NULL;
1747
1748   /* If we have two or more nodes in sequence that test the same one
1749      thing, we may be able to use a switch statement.  */
1750
1751   if (!p->next
1752       || p->tests->next
1753       || p->next->tests->type != type
1754       || p->next->tests->next
1755       || nodes_identical_1 (p->tests, p->next->tests))
1756     return p;
1757
1758   /* DT_code is special in that we can do interesting things with
1759      known predicates at the same time.  */
1760   if (type == DT_code)
1761     {
1762       char codemap[NUM_RTX_CODE];
1763       struct decision *ret;
1764       RTX_CODE code;
1765
1766       memset (codemap, 0, sizeof(codemap));
1767
1768       printf ("  switch (GET_CODE (x%d))\n    {\n", depth);
1769       code = p->tests->u.code;
1770       do
1771         {
1772           if (p != start && p->need_label && needs_label == NULL)
1773             needs_label = p;
1774
1775           printf ("    case ");
1776           print_code (code);
1777           printf (":\n      goto L%d;\n", p->success.first->number);
1778           p->success.first->need_label = 1;
1779
1780           codemap[code] = 1;
1781           p = p->next;
1782         }
1783       while (p
1784              && ! p->tests->next
1785              && p->tests->type == DT_code
1786              && ! codemap[code = p->tests->u.code]);
1787
1788       /* If P is testing a predicate that we know about and we haven't
1789          seen any of the codes that are valid for the predicate, we can
1790          write a series of "case" statement, one for each possible code.
1791          Since we are already in a switch, these redundant tests are very
1792          cheap and will reduce the number of predicates called.  */
1793
1794       /* Note that while we write out cases for these predicates here,
1795          we don't actually write the test here, as it gets kinda messy.
1796          It is trivial to leave this to later by telling our caller that
1797          we only processed the CODE tests.  */
1798       if (needs_label != NULL)
1799         ret = needs_label;
1800       else
1801         ret = p;
1802
1803       while (p && p->tests->type == DT_pred
1804              && p->tests->u.pred.index >= 0)
1805         {
1806           const RTX_CODE *c;
1807
1808           for (c = &preds[p->tests->u.pred.index].codes[0]; *c ; ++c)
1809             if (codemap[(int) *c] != 0)
1810               goto pred_done;
1811
1812           for (c = &preds[p->tests->u.pred.index].codes[0]; *c ; ++c)
1813             {
1814               printf ("    case ");
1815               print_code (*c);
1816               printf (":\n");
1817               codemap[(int) *c] = 1;
1818             }
1819
1820           printf ("      goto L%d;\n", p->number);
1821           p->need_label = 1;
1822           p = p->next;
1823         }
1824
1825     pred_done:
1826       /* Make the default case skip the predicates we managed to match.  */
1827
1828       printf ("    default:\n");
1829       if (p != ret)
1830         {
1831           if (p)
1832             {
1833               printf ("      goto L%d;\n", p->number);
1834               p->need_label = 1;
1835             }
1836           else
1837             write_afterward (start, start->afterward, "      ");
1838         }
1839       else
1840         printf ("     break;\n");
1841       printf ("   }\n");
1842
1843       return ret;
1844     }
1845   else if (type == DT_mode
1846            || type == DT_veclen
1847            || type == DT_elt_zero_int
1848            || type == DT_elt_one_int
1849            || type == DT_elt_zero_wide_safe)
1850     {
1851       const char *indent = "";
1852
1853       /* We cast switch parameter to integer, so we must ensure that the value
1854          fits.  */
1855       if (type == DT_elt_zero_wide_safe)
1856         {
1857           indent = "  ";
1858           printf("  if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth, depth);
1859         }
1860       printf ("%s  switch (", indent);
1861       switch (type)
1862         {
1863         case DT_mode:
1864           printf ("GET_MODE (x%d)", depth);
1865           break;
1866         case DT_veclen:
1867           printf ("XVECLEN (x%d, 0)", depth);
1868           break;
1869         case DT_elt_zero_int:
1870           printf ("XINT (x%d, 0)", depth);
1871           break;
1872         case DT_elt_one_int:
1873           printf ("XINT (x%d, 1)", depth);
1874           break;
1875         case DT_elt_zero_wide_safe:
1876           /* Convert result of XWINT to int for portability since some C
1877              compilers won't do it and some will.  */
1878           printf ("(int) XWINT (x%d, 0)", depth);
1879           break;
1880         default:
1881           abort ();
1882         }
1883       printf (")\n%s    {\n", indent);
1884
1885       do
1886         {
1887           /* Merge trees will not unify identical nodes if their
1888              sub-nodes are at different levels.  Thus we must check
1889              for duplicate cases.  */
1890           struct decision *q;
1891           for (q = start; q != p; q = q->next)
1892             if (nodes_identical_1 (p->tests, q->tests))
1893               goto case_done;
1894
1895           if (p != start && p->need_label && needs_label == NULL)
1896             needs_label = p;
1897
1898           printf ("%s    case ", indent);
1899           switch (type)
1900             {
1901             case DT_mode:
1902               printf ("%smode", GET_MODE_NAME (p->tests->u.mode));
1903               break;
1904             case DT_veclen:
1905               printf ("%d", p->tests->u.veclen);
1906               break;
1907             case DT_elt_zero_int:
1908             case DT_elt_one_int:
1909             case DT_elt_zero_wide:
1910             case DT_elt_zero_wide_safe:
1911               printf (HOST_WIDE_INT_PRINT_DEC_C, p->tests->u.intval);
1912               break;
1913             default:
1914               abort ();
1915             }
1916           printf (":\n%s      goto L%d;\n", indent, p->success.first->number);
1917           p->success.first->need_label = 1;
1918
1919           p = p->next;
1920         }
1921       while (p && p->tests->type == type && !p->tests->next);
1922
1923     case_done:
1924       printf ("%s    default:\n%s      break;\n%s    }\n",
1925               indent, indent, indent);
1926
1927       return needs_label != NULL ? needs_label : p;
1928     }
1929   else
1930     {
1931       /* None of the other tests are amenable.  */
1932       return p;
1933     }
1934 }
1935
1936 /* Emit code for one test.  */
1937
1938 static void
1939 write_cond (struct decision_test *p, int depth,
1940             enum routine_type subroutine_type)
1941 {
1942   switch (p->type)
1943     {
1944     case DT_mode:
1945       printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode));
1946       break;
1947
1948     case DT_code:
1949       printf ("GET_CODE (x%d) == ", depth);
1950       print_code (p->u.code);
1951       break;
1952
1953     case DT_veclen:
1954       printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen);
1955       break;
1956
1957     case DT_elt_zero_int:
1958       printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval);
1959       break;
1960
1961     case DT_elt_one_int:
1962       printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval);
1963       break;
1964
1965     case DT_elt_zero_wide:
1966     case DT_elt_zero_wide_safe:
1967       printf ("XWINT (x%d, 0) == ", depth);
1968       printf (HOST_WIDE_INT_PRINT_DEC_C, p->u.intval);
1969       break;
1970
1971     case DT_veclen_ge:
1972       printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen);
1973       break;
1974
1975     case DT_dup:
1976       printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup);
1977       break;
1978
1979     case DT_pred:
1980       printf ("%s (x%d, %smode)", p->u.pred.name, depth,
1981               GET_MODE_NAME (p->u.pred.mode));
1982       break;
1983
1984     case DT_c_test:
1985       printf ("(%s)", p->u.c_test);
1986       break;
1987
1988     case DT_accept_insn:
1989       switch (subroutine_type)
1990         {
1991         case RECOG:
1992           if (p->u.insn.num_clobbers_to_add == 0)
1993             abort ();
1994           printf ("pnum_clobbers != NULL");
1995           break;
1996
1997         default:
1998           abort ();
1999         }
2000       break;
2001
2002     default:
2003       abort ();
2004     }
2005 }
2006
2007 /* Emit code for one action.  The previous tests have succeeded;
2008    TEST is the last of the chain.  In the normal case we simply
2009    perform a state change.  For the `accept' tests we must do more work.  */
2010
2011 static void
2012 write_action (struct decision *p, struct decision_test *test,
2013               int depth, int uncond, struct decision *success,
2014               enum routine_type subroutine_type)
2015 {
2016   const char *indent;
2017   int want_close = 0;
2018
2019   if (uncond)
2020     indent = "  ";
2021   else if (test->type == DT_accept_op || test->type == DT_accept_insn)
2022     {
2023       fputs ("    {\n", stdout);
2024       indent = "      ";
2025       want_close = 1;
2026     }
2027   else
2028     indent = "    ";
2029
2030   if (test->type == DT_accept_op)
2031     {
2032       printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth);
2033
2034       /* Only allow DT_accept_insn to follow.  */
2035       if (test->next)
2036         {
2037           test = test->next;
2038           if (test->type != DT_accept_insn)
2039             abort ();
2040         }
2041     }
2042
2043   /* Sanity check that we're now at the end of the list of tests.  */
2044   if (test->next)
2045     abort ();
2046
2047   if (test->type == DT_accept_insn)
2048     {
2049       switch (subroutine_type)
2050         {
2051         case RECOG:
2052           if (test->u.insn.num_clobbers_to_add != 0)
2053             printf ("%s*pnum_clobbers = %d;\n",
2054                     indent, test->u.insn.num_clobbers_to_add);
2055           printf ("%sreturn %d;\n", indent, test->u.insn.code_number);
2056           break;
2057
2058         case SPLIT:
2059           printf ("%sreturn gen_split_%d (operands);\n",
2060                   indent, test->u.insn.code_number);
2061           break;
2062
2063         case PEEPHOLE2:
2064           {
2065             int match_len = 0, i;
2066
2067             for (i = strlen (p->position) - 1; i >= 0; --i)
2068               if (ISUPPER (p->position[i]))
2069                 {
2070                   match_len = p->position[i] - 'A';
2071                   break;
2072                 }
2073             printf ("%s*_pmatch_len = %d;\n", indent, match_len);
2074             printf ("%stem = gen_peephole2_%d (insn, operands);\n",
2075                     indent, test->u.insn.code_number);
2076             printf ("%sif (tem != 0)\n%s  return tem;\n", indent, indent);
2077           }
2078           break;
2079
2080         default:
2081           abort ();
2082         }
2083     }
2084   else
2085     {
2086       printf("%sgoto L%d;\n", indent, success->number);
2087       success->need_label = 1;
2088     }
2089
2090   if (want_close)
2091     fputs ("    }\n", stdout);
2092 }
2093
2094 /* Return 1 if the test is always true and has no fallthru path.  Return -1
2095    if the test does have a fallthru path, but requires that the condition be
2096    terminated.  Otherwise return 0 for a normal test.  */
2097 /* ??? is_unconditional is a stupid name for a tri-state function.  */
2098
2099 static int
2100 is_unconditional (struct decision_test *t, enum routine_type subroutine_type)
2101 {
2102   if (t->type == DT_accept_op)
2103     return 1;
2104
2105   if (t->type == DT_accept_insn)
2106     {
2107       switch (subroutine_type)
2108         {
2109         case RECOG:
2110           return (t->u.insn.num_clobbers_to_add == 0);
2111         case SPLIT:
2112           return 1;
2113         case PEEPHOLE2:
2114           return -1;
2115         default:
2116           abort ();
2117         }
2118     }
2119
2120   return 0;
2121 }
2122
2123 /* Emit code for one node -- the conditional and the accompanying action.
2124    Return true if there is no fallthru path.  */
2125
2126 static int
2127 write_node (struct decision *p, int depth,
2128             enum routine_type subroutine_type)
2129 {
2130   struct decision_test *test, *last_test;
2131   int uncond;
2132
2133   last_test = test = p->tests;
2134   uncond = is_unconditional (test, subroutine_type);
2135   if (uncond == 0)
2136     {
2137       printf ("  if (");
2138       write_cond (test, depth, subroutine_type);
2139
2140       while ((test = test->next) != NULL)
2141         {
2142           int uncond2;
2143
2144           last_test = test;
2145           uncond2 = is_unconditional (test, subroutine_type);
2146           if (uncond2 != 0)
2147             break;
2148
2149           printf ("\n      && ");
2150           write_cond (test, depth, subroutine_type);
2151         }
2152
2153       printf (")\n");
2154     }
2155
2156   write_action (p, last_test, depth, uncond, p->success.first, subroutine_type);
2157
2158   return uncond > 0;
2159 }
2160
2161 /* Emit code for all of the sibling nodes of HEAD.  */
2162
2163 static void
2164 write_tree_1 (struct decision_head *head, int depth,
2165               enum routine_type subroutine_type)
2166 {
2167   struct decision *p, *next;
2168   int uncond = 0;
2169
2170   for (p = head->first; p ; p = next)
2171     {
2172       /* The label for the first element was printed in write_tree.  */
2173       if (p != head->first && p->need_label)
2174         OUTPUT_LABEL (" ", p->number);
2175
2176       /* Attempt to write a switch statement for a whole sequence.  */
2177       next = write_switch (p, depth);
2178       if (p != next)
2179         uncond = 0;
2180       else
2181         {
2182           /* Failed -- fall back and write one node.  */
2183           uncond = write_node (p, depth, subroutine_type);
2184           next = p->next;
2185         }
2186     }
2187
2188   /* Finished with this chain.  Close a fallthru path by branching
2189      to the afterward node.  */
2190   if (! uncond)
2191     write_afterward (head->last, head->last->afterward, "  ");
2192 }
2193
2194 /* Write out the decision tree starting at HEAD.  PREVPOS is the
2195    position at the node that branched to this node.  */
2196
2197 static void
2198 write_tree (struct decision_head *head, const char *prevpos,
2199             enum routine_type type, int initial)
2200 {
2201   struct decision *p = head->first;
2202
2203   putchar ('\n');
2204   if (p->need_label)
2205     OUTPUT_LABEL (" ", p->number);
2206
2207   if (! initial && p->subroutine_number > 0)
2208     {
2209       static const char * const name_prefix[] = {
2210           "recog", "split", "peephole2"
2211       };
2212
2213       static const char * const call_suffix[] = {
2214           ", pnum_clobbers", "", ", _pmatch_len"
2215       };
2216
2217       /* This node has been broken out into a separate subroutine.
2218          Call it, test the result, and branch accordingly.  */
2219
2220       if (p->afterward)
2221         {
2222           printf ("  tem = %s_%d (x0, insn%s);\n",
2223                   name_prefix[type], p->subroutine_number, call_suffix[type]);
2224           if (IS_SPLIT (type))
2225             printf ("  if (tem != 0)\n    return tem;\n");
2226           else
2227             printf ("  if (tem >= 0)\n    return tem;\n");
2228
2229           change_state (p->position, p->afterward->position, NULL, "  ");
2230           printf ("  goto L%d;\n", p->afterward->number);
2231         }
2232       else
2233         {
2234           printf ("  return %s_%d (x0, insn%s);\n",
2235                   name_prefix[type], p->subroutine_number, call_suffix[type]);
2236         }
2237     }
2238   else
2239     {
2240       int depth = strlen (p->position);
2241
2242       change_state (prevpos, p->position, head->last->afterward, "  ");
2243       write_tree_1 (head, depth, type);
2244
2245       for (p = head->first; p; p = p->next)
2246         if (p->success.first)
2247           write_tree (&p->success, p->position, type, 0);
2248     }
2249 }
2250
2251 /* Write out a subroutine of type TYPE to do comparisons starting at
2252    node TREE.  */
2253
2254 static void
2255 write_subroutine (struct decision_head *head, enum routine_type type)
2256 {
2257   int subfunction = head->first ? head->first->subroutine_number : 0;
2258   const char *s_or_e;
2259   char extension[32];
2260   int i;
2261
2262   s_or_e = subfunction ? "static " : "";
2263
2264   if (subfunction)
2265     sprintf (extension, "_%d", subfunction);
2266   else if (type == RECOG)
2267     extension[0] = '\0';
2268   else
2269     strcpy (extension, "_insns");
2270
2271   switch (type)
2272     {
2273     case RECOG:
2274       printf ("%sint\n\
2275 recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension);
2276       break;
2277     case SPLIT:
2278       printf ("%srtx\n\
2279 split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
2280               s_or_e, extension);
2281       break;
2282     case PEEPHOLE2:
2283       printf ("%srtx\n\
2284 peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
2285               s_or_e, extension);
2286       break;
2287     }
2288
2289   printf ("{\n  rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n");
2290   for (i = 1; i <= max_depth; i++)
2291     printf ("  rtx x%d ATTRIBUTE_UNUSED;\n", i);
2292
2293   printf ("  %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int");
2294
2295   if (!subfunction)
2296     printf ("  recog_data.insn = NULL_RTX;\n");
2297
2298   if (head->first)
2299     write_tree (head, "", type, 1);
2300   else
2301     printf ("  goto ret0;\n");
2302
2303   printf (" ret0:\n  return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1);
2304 }
2305
2306 /* In break_out_subroutines, we discovered the boundaries for the
2307    subroutines, but did not write them out.  Do so now.  */
2308
2309 static void
2310 write_subroutines (struct decision_head *head, enum routine_type type)
2311 {
2312   struct decision *p;
2313
2314   for (p = head->first; p ; p = p->next)
2315     if (p->success.first)
2316       write_subroutines (&p->success, type);
2317
2318   if (head->first->subroutine_number > 0)
2319     write_subroutine (head, type);
2320 }
2321
2322 /* Begin the output file.  */
2323
2324 static void
2325 write_header (void)
2326 {
2327   puts ("\
2328 /* Generated automatically by the program `genrecog' from the target\n\
2329    machine description file.  */\n\
2330 \n\
2331 #include \"config.h\"\n\
2332 #include \"system.h\"\n\
2333 #include \"coretypes.h\"\n\
2334 #include \"tm.h\"\n\
2335 #include \"rtl.h\"\n\
2336 #include \"tm_p.h\"\n\
2337 #include \"function.h\"\n\
2338 #include \"insn-config.h\"\n\
2339 #include \"recog.h\"\n\
2340 #include \"real.h\"\n\
2341 #include \"output.h\"\n\
2342 #include \"flags.h\"\n\
2343 #include \"hard-reg-set.h\"\n\
2344 #include \"resource.h\"\n\
2345 #include \"toplev.h\"\n\
2346 #include \"reload.h\"\n\
2347 \n");
2348
2349   puts ("\n\
2350 /* `recog' contains a decision tree that recognizes whether the rtx\n\
2351    X0 is a valid instruction.\n\
2352 \n\
2353    recog returns -1 if the rtx is not valid.  If the rtx is valid, recog\n\
2354    returns a nonnegative number which is the insn code number for the\n\
2355    pattern that matched.  This is the same as the order in the machine\n\
2356    description of the entry that matched.  This number can be used as an\n\
2357    index into `insn_data' and other tables.\n");
2358   puts ("\
2359    The third argument to recog is an optional pointer to an int.  If\n\
2360    present, recog will accept a pattern if it matches except for missing\n\
2361    CLOBBER expressions at the end.  In that case, the value pointed to by\n\
2362    the optional pointer will be set to the number of CLOBBERs that need\n\
2363    to be added (it should be initialized to zero by the caller).  If it");
2364   puts ("\
2365    is set nonzero, the caller should allocate a PARALLEL of the\n\
2366    appropriate size, copy the initial entries, and call add_clobbers\n\
2367    (found in insn-emit.c) to fill in the CLOBBERs.\n\
2368 ");
2369
2370   puts ("\n\
2371    The function split_insns returns 0 if the rtl could not\n\
2372    be split or the split rtl as an INSN list if it can be.\n\
2373 \n\
2374    The function peephole2_insns returns 0 if the rtl could not\n\
2375    be matched. If there was a match, the new rtl is returned in an INSN list,\n\
2376    and LAST_INSN will point to the last recognized insn in the old sequence.\n\
2377 */\n\n");
2378 }
2379
2380 \f
2381 /* Construct and return a sequence of decisions
2382    that will recognize INSN.
2383
2384    TYPE says what type of routine we are recognizing (RECOG or SPLIT).  */
2385
2386 static struct decision_head
2387 make_insn_sequence (rtx insn, enum routine_type type)
2388 {
2389   rtx x;
2390   const char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
2391   int truth = maybe_eval_c_test (c_test);
2392   struct decision *last;
2393   struct decision_test *test, **place;
2394   struct decision_head head;
2395   char c_test_pos[2];
2396
2397   /* We should never see an insn whose C test is false at compile time.  */
2398   if (truth == 0)
2399     abort ();
2400
2401   record_insn_name (next_insn_code, (type == RECOG ? XSTR (insn, 0) : NULL));
2402
2403   c_test_pos[0] = '\0';
2404   if (type == PEEPHOLE2)
2405     {
2406       int i, j;
2407
2408       /* peephole2 gets special treatment:
2409          - X always gets an outer parallel even if it's only one entry
2410          - we remove all traces of outer-level match_scratch and match_dup
2411            expressions here.  */
2412       x = rtx_alloc (PARALLEL);
2413       PUT_MODE (x, VOIDmode);
2414       XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0));
2415       for (i = j = 0; i < XVECLEN (insn, 0); i++)
2416         {
2417           rtx tmp = XVECEXP (insn, 0, i);
2418           if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP)
2419             {
2420               XVECEXP (x, 0, j) = tmp;
2421               j++;
2422             }
2423         }
2424       XVECLEN (x, 0) = j;
2425
2426       c_test_pos[0] = 'A' + j - 1;
2427       c_test_pos[1] = '\0';
2428     }
2429   else if (XVECLEN (insn, type == RECOG) == 1)
2430     x = XVECEXP (insn, type == RECOG, 0);
2431   else
2432     {
2433       x = rtx_alloc (PARALLEL);
2434       XVEC (x, 0) = XVEC (insn, type == RECOG);
2435       PUT_MODE (x, VOIDmode);
2436     }
2437
2438   validate_pattern (x, insn, NULL_RTX, 0);
2439
2440   memset(&head, 0, sizeof(head));
2441   last = add_to_sequence (x, &head, "", type, 1);
2442
2443   /* Find the end of the test chain on the last node.  */
2444   for (test = last->tests; test->next; test = test->next)
2445     continue;
2446   place = &test->next;
2447
2448   /* Skip the C test if it's known to be true at compile time.  */
2449   if (truth == -1)
2450     {
2451       /* Need a new node if we have another test to add.  */
2452       if (test->type == DT_accept_op)
2453         {
2454           last = new_decision (c_test_pos, &last->success);
2455           place = &last->tests;
2456         }
2457       test = new_decision_test (DT_c_test, &place);
2458       test->u.c_test = c_test;
2459     }
2460
2461   test = new_decision_test (DT_accept_insn, &place);
2462   test->u.insn.code_number = next_insn_code;
2463   test->u.insn.lineno = pattern_lineno;
2464   test->u.insn.num_clobbers_to_add = 0;
2465
2466   switch (type)
2467     {
2468     case RECOG:
2469       /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends
2470          with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.
2471          If so, set up to recognize the pattern without these CLOBBERs.  */
2472
2473       if (GET_CODE (x) == PARALLEL)
2474         {
2475           int i;
2476
2477           /* Find the last non-clobber in the parallel.  */
2478           for (i = XVECLEN (x, 0); i > 0; i--)
2479             {
2480               rtx y = XVECEXP (x, 0, i - 1);
2481               if (GET_CODE (y) != CLOBBER
2482                   || (GET_CODE (XEXP (y, 0)) != REG
2483                       && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH))
2484                 break;
2485             }
2486
2487           if (i != XVECLEN (x, 0))
2488             {
2489               rtx new;
2490               struct decision_head clobber_head;
2491
2492               /* Build a similar insn without the clobbers.  */
2493               if (i == 1)
2494                 new = XVECEXP (x, 0, 0);
2495               else
2496                 {
2497                   int j;
2498
2499                   new = rtx_alloc (PARALLEL);
2500                   XVEC (new, 0) = rtvec_alloc (i);
2501                   for (j = i - 1; j >= 0; j--)
2502                     XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
2503                 }
2504
2505               /* Recognize it.  */
2506               memset (&clobber_head, 0, sizeof(clobber_head));
2507               last = add_to_sequence (new, &clobber_head, "", type, 1);
2508
2509               /* Find the end of the test chain on the last node.  */
2510               for (test = last->tests; test->next; test = test->next)
2511                 continue;
2512
2513               /* We definitely have a new test to add -- create a new
2514                  node if needed.  */
2515               place = &test->next;
2516               if (test->type == DT_accept_op)
2517                 {
2518                   last = new_decision ("", &last->success);
2519                   place = &last->tests;
2520                 }
2521
2522               /* Skip the C test if it's known to be true at compile
2523                  time.  */
2524               if (truth == -1)
2525                 {
2526                   test = new_decision_test (DT_c_test, &place);
2527                   test->u.c_test = c_test;
2528                 }
2529
2530               test = new_decision_test (DT_accept_insn, &place);
2531               test->u.insn.code_number = next_insn_code;
2532               test->u.insn.lineno = pattern_lineno;
2533               test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i;
2534
2535               merge_trees (&head, &clobber_head);
2536             }
2537         }
2538       break;
2539
2540     case SPLIT:
2541       /* Define the subroutine we will call below and emit in genemit.  */
2542       printf ("extern rtx gen_split_%d (rtx *);\n", next_insn_code);
2543       break;
2544
2545     case PEEPHOLE2:
2546       /* Define the subroutine we will call below and emit in genemit.  */
2547       printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n",
2548               next_insn_code);
2549       break;
2550     }
2551
2552   return head;
2553 }
2554
2555 static void
2556 process_tree (struct decision_head *head, enum routine_type subroutine_type)
2557 {
2558   if (head->first == NULL)
2559     {
2560       /* We can elide peephole2_insns, but not recog or split_insns.  */
2561       if (subroutine_type == PEEPHOLE2)
2562         return;
2563     }
2564   else
2565     {
2566       factor_tests (head);
2567
2568       next_subroutine_number = 0;
2569       break_out_subroutines (head, 1);
2570       find_afterward (head, NULL);
2571
2572       /* We run this after find_afterward, because find_afterward needs
2573          the redundant DT_mode tests on predicates to determine whether
2574          two tests can both be true or not.  */
2575       simplify_tests(head);
2576
2577       write_subroutines (head, subroutine_type);
2578     }
2579
2580   write_subroutine (head, subroutine_type);
2581 }
2582 \f
2583 extern int main (int, char **);
2584
2585 int
2586 main (int argc, char **argv)
2587 {
2588   rtx desc;
2589   struct decision_head recog_tree, split_tree, peephole2_tree, h;
2590
2591   progname = "genrecog";
2592
2593   memset (&recog_tree, 0, sizeof recog_tree);
2594   memset (&split_tree, 0, sizeof split_tree);
2595   memset (&peephole2_tree, 0, sizeof peephole2_tree);
2596
2597   if (argc <= 1)
2598     fatal ("no input file name");
2599
2600   if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE)
2601     return (FATAL_EXIT_CODE);
2602
2603   next_insn_code = 0;
2604   next_index = 0;
2605
2606   write_header ();
2607
2608   /* Read the machine description.  */
2609
2610   while (1)
2611     {
2612       desc = read_md_rtx (&pattern_lineno, &next_insn_code);
2613       if (desc == NULL)
2614         break;
2615
2616       if (GET_CODE (desc) == DEFINE_INSN)
2617         {
2618           h = make_insn_sequence (desc, RECOG);
2619           merge_trees (&recog_tree, &h);
2620         }
2621       else if (GET_CODE (desc) == DEFINE_SPLIT)
2622         {
2623           h = make_insn_sequence (desc, SPLIT);
2624           merge_trees (&split_tree, &h);
2625         }
2626       else if (GET_CODE (desc) == DEFINE_PEEPHOLE2)
2627         {
2628           h = make_insn_sequence (desc, PEEPHOLE2);
2629           merge_trees (&peephole2_tree, &h);
2630         }
2631
2632       next_index++;
2633     }
2634
2635   if (error_count)
2636     return FATAL_EXIT_CODE;
2637
2638   puts ("\n\n");
2639
2640   process_tree (&recog_tree, RECOG);
2641   process_tree (&split_tree, SPLIT);
2642   process_tree (&peephole2_tree, PEEPHOLE2);
2643
2644   fflush (stdout);
2645   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
2646 }
2647 \f
2648 /* Define this so we can link with print-rtl.o to get debug_rtx function.  */
2649 const char *
2650 get_insn_name (int code)
2651 {
2652   if (code < insn_name_ptr_size)
2653     return insn_name_ptr[code];
2654   else
2655     return NULL;
2656 }
2657
2658 static void
2659 record_insn_name (int code, const char *name)
2660 {
2661   static const char *last_real_name = "insn";
2662   static int last_real_code = 0;
2663   char *new;
2664
2665   if (insn_name_ptr_size <= code)
2666     {
2667       int new_size;
2668       new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
2669       insn_name_ptr = xrealloc (insn_name_ptr, sizeof(char *) * new_size);
2670       memset (insn_name_ptr + insn_name_ptr_size, 0,
2671               sizeof(char *) * (new_size - insn_name_ptr_size));
2672       insn_name_ptr_size = new_size;
2673     }
2674
2675   if (!name || name[0] == '\0')
2676     {
2677       new = xmalloc (strlen (last_real_name) + 10);
2678       sprintf (new, "%s+%d", last_real_name, code - last_real_code);
2679     }
2680   else
2681     {
2682       last_real_name = new = xstrdup (name);
2683       last_real_code = code;
2684     }
2685
2686   insn_name_ptr[code] = new;
2687 }
2688 \f
2689 static void
2690 debug_decision_2 (struct decision_test *test)
2691 {
2692   switch (test->type)
2693     {
2694     case DT_mode:
2695       fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode));
2696       break;
2697     case DT_code:
2698       fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code));
2699       break;
2700     case DT_veclen:
2701       fprintf (stderr, "veclen=%d", test->u.veclen);
2702       break;
2703     case DT_elt_zero_int:
2704       fprintf (stderr, "elt0_i=%d", (int) test->u.intval);
2705       break;
2706     case DT_elt_one_int:
2707       fprintf (stderr, "elt1_i=%d", (int) test->u.intval);
2708       break;
2709     case DT_elt_zero_wide:
2710       fprintf (stderr, "elt0_w=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2711       break;
2712     case DT_elt_zero_wide_safe:
2713       fprintf (stderr, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2714       break;
2715     case DT_veclen_ge:
2716       fprintf (stderr, "veclen>=%d", test->u.veclen);
2717       break;
2718     case DT_dup:
2719       fprintf (stderr, "dup=%d", test->u.dup);
2720       break;
2721     case DT_pred:
2722       fprintf (stderr, "pred=(%s,%s)",
2723                test->u.pred.name, GET_MODE_NAME(test->u.pred.mode));
2724       break;
2725     case DT_c_test:
2726       {
2727         char sub[16+4];
2728         strncpy (sub, test->u.c_test, sizeof(sub));
2729         memcpy (sub+16, "...", 4);
2730         fprintf (stderr, "c_test=\"%s\"", sub);
2731       }
2732       break;
2733     case DT_accept_op:
2734       fprintf (stderr, "A_op=%d", test->u.opno);
2735       break;
2736     case DT_accept_insn:
2737       fprintf (stderr, "A_insn=(%d,%d)",
2738                test->u.insn.code_number, test->u.insn.num_clobbers_to_add);
2739       break;
2740
2741     default:
2742       abort ();
2743     }
2744 }
2745
2746 static void
2747 debug_decision_1 (struct decision *d, int indent)
2748 {
2749   int i;
2750   struct decision_test *test;
2751
2752   if (d == NULL)
2753     {
2754       for (i = 0; i < indent; ++i)
2755         putc (' ', stderr);
2756       fputs ("(nil)\n", stderr);
2757       return;
2758     }
2759
2760   for (i = 0; i < indent; ++i)
2761     putc (' ', stderr);
2762
2763   putc ('{', stderr);
2764   test = d->tests;
2765   if (test)
2766     {
2767       debug_decision_2 (test);
2768       while ((test = test->next) != NULL)
2769         {
2770           fputs (" + ", stderr);
2771           debug_decision_2 (test);
2772         }
2773     }
2774   fprintf (stderr, "} %d n %d a %d\n", d->number,
2775            (d->next ? d->next->number : -1),
2776            (d->afterward ? d->afterward->number : -1));
2777 }
2778
2779 static void
2780 debug_decision_0 (struct decision *d, int indent, int maxdepth)
2781 {
2782   struct decision *n;
2783   int i;
2784
2785   if (maxdepth < 0)
2786     return;
2787   if (d == NULL)
2788     {
2789       for (i = 0; i < indent; ++i)
2790         putc (' ', stderr);
2791       fputs ("(nil)\n", stderr);
2792       return;
2793     }
2794
2795   debug_decision_1 (d, indent);
2796   for (n = d->success.first; n ; n = n->next)
2797     debug_decision_0 (n, indent + 2, maxdepth - 1);
2798 }
2799
2800 void
2801 debug_decision (struct decision *d)
2802 {
2803   debug_decision_0 (d, 0, 1000000);
2804 }
2805
2806 void
2807 debug_decision_list (struct decision *d)
2808 {
2809   while (d)
2810     {
2811       debug_decision_0 (d, 0, 0);
2812       d = d->next;
2813     }
2814 }