OSDN Git Service

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