OSDN Git Service

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