OSDN Git Service

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