OSDN Git Service

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