OSDN Git Service

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