OSDN Git Service

243eafa62987f9006a71fe246f3ed998f020ce1d
[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 = ndepth - 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       printf ("  switch (");
1780       switch (type)
1781         {
1782         case DT_mode:
1783           printf("GET_MODE (x%d)", depth);
1784           break;
1785         case DT_veclen:
1786           printf("XVECLEN (x%d, 0)", depth);
1787           break;
1788         case DT_elt_zero_int:
1789           printf("XINT (x%d, 0)", depth);
1790           break;
1791         case DT_elt_one_int:
1792           printf("XINT (x%d, 1)", depth);
1793           break;
1794         case DT_elt_zero_wide:
1795           printf("XWINT (x%d, 0)", depth);
1796           break;
1797         default:
1798           abort ();
1799         }
1800       printf (")\n    {\n");
1801
1802       do
1803         {
1804           printf ("    case ");
1805           switch (type)
1806             {
1807             case DT_mode:
1808               printf ("%smode", GET_MODE_NAME (p->tests->u.mode));
1809               break;
1810             case DT_veclen:
1811               printf ("%d", p->tests->u.veclen);
1812               break;
1813             case DT_elt_zero_int:
1814             case DT_elt_one_int:
1815             case DT_elt_zero_wide:
1816               printf (HOST_WIDE_INT_PRINT_DEC, p->tests->u.intval);
1817               break;
1818             default:
1819               abort ();
1820             }
1821           printf (":\n      goto L%d;\n", p->success.first->number);
1822           p->success.first->need_label = 1;
1823
1824           p = p->next;
1825         }
1826       while (p && p->tests->type == type && !p->tests->next);
1827       
1828       printf ("    default:\n      break;\n    }\n");
1829
1830       return p;
1831     }
1832   else
1833     {
1834       /* None of the other tests are ameanable.  */
1835       return p;
1836     }
1837 }
1838
1839 /* Emit code for one test.  */
1840
1841 static void
1842 write_cond (p, depth, subroutine_type)
1843      struct decision_test *p;
1844      int depth;
1845      enum routine_type subroutine_type;
1846 {
1847   switch (p->type)
1848     {
1849     case DT_mode:
1850       printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode));
1851       break;
1852
1853     case DT_code:
1854       printf ("GET_CODE (x%d) == ", depth);
1855       print_code (p->u.code);
1856       break;
1857
1858     case DT_veclen:
1859       printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen);
1860       break;
1861
1862     case DT_elt_zero_int:
1863       printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval);
1864       break;
1865
1866     case DT_elt_one_int:
1867       printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval);
1868       break;
1869
1870     case DT_elt_zero_wide:
1871       printf ("XWINT (x%d, 0) == ", depth);
1872       printf (HOST_WIDE_INT_PRINT_DEC, p->u.intval);
1873       break;
1874
1875     case DT_dup:
1876       printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup);
1877       break;
1878
1879     case DT_pred:
1880       printf ("%s (x%d, %smode)", p->u.pred.name, depth,
1881               GET_MODE_NAME (p->u.pred.mode));
1882       break;
1883
1884     case DT_c_test:
1885       printf ("(%s)", p->u.c_test);
1886       break;
1887
1888     case DT_accept_insn:
1889       switch (subroutine_type)
1890         {
1891         case RECOG:
1892           if (p->u.insn.num_clobbers_to_add == 0)
1893             abort ();
1894           printf ("pnum_clobbers != NULL");
1895           break;
1896
1897         default:
1898           abort ();
1899         }
1900       break;
1901
1902     default:
1903       abort ();
1904     }
1905 }
1906
1907 /* Emit code for one action.  The previous tests have succeeded;
1908    TEST is the last of the chain.  In the normal case we simply
1909    perform a state change.  For the `accept' tests we must do more work.  */
1910
1911 static void
1912 write_action (test, depth, uncond, success, subroutine_type)
1913      struct decision_test *test;
1914      int depth, uncond;
1915      struct decision *success;
1916      enum routine_type subroutine_type;
1917 {
1918   const char *indent;
1919   int want_close = 0;
1920
1921   if (uncond)
1922     indent = "  ";
1923   else if (test->type == DT_accept_op || test->type == DT_accept_insn)
1924     {
1925       fputs ("    {\n", stdout);
1926       indent = "      ";
1927       want_close = 1;
1928     }
1929   else
1930     indent = "    ";
1931
1932   if (test->type == DT_accept_op)
1933     {
1934       printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth);
1935
1936       /* Only allow DT_accept_insn to follow.  */
1937       if (test->next)
1938         {
1939           test = test->next;
1940           if (test->type != DT_accept_insn)
1941             abort ();
1942         }
1943     }
1944
1945   /* Sanity check that we're now at the end of the list of tests.  */
1946   if (test->next)
1947     abort ();
1948
1949   if (test->type == DT_accept_insn)
1950     {
1951       switch (subroutine_type)
1952         {
1953         case RECOG:
1954           if (test->u.insn.num_clobbers_to_add != 0)
1955             printf ("%s*pnum_clobbers = %d;\n",
1956                     indent, test->u.insn.num_clobbers_to_add);
1957           printf ("%sreturn %d;\n", indent, test->u.insn.code_number);
1958           break;
1959
1960         case SPLIT:
1961           printf ("%sreturn gen_split_%d (operands);\n",
1962                   indent, test->u.insn.code_number);
1963           break;
1964
1965         case PEEPHOLE2:
1966           printf ("%stem = gen_peephole2_%d (insn, operands);\n",
1967                   indent, test->u.insn.code_number);
1968           printf ("%sif (tem != 0)\n%s  goto ret1;\n", indent, indent);
1969           break;
1970
1971         default:
1972           abort ();
1973         }
1974     }
1975   else
1976     {
1977       printf("%sgoto L%d;\n", indent, success->number);
1978       success->need_label = 1;
1979     }
1980
1981   if (want_close)
1982     fputs ("    }\n", stdout);
1983 }
1984
1985 /* Return 1 if the test is always true and has no fallthru path.  Return -1
1986    if the test does have a fallthru path, but requires that the condition be
1987    terminated.  Otherwise return 0 for a normal test.  */
1988 /* ??? is_unconditional is a stupid name for a tri-state function.  */
1989
1990 static int
1991 is_unconditional (t, subroutine_type)
1992      struct decision_test *t;
1993      enum routine_type subroutine_type;
1994 {
1995   if (t->type == DT_accept_op)
1996     return 1;
1997
1998   if (t->type == DT_accept_insn)
1999     {
2000       switch (subroutine_type)
2001         {
2002         case RECOG:
2003           return (t->u.insn.num_clobbers_to_add == 0);
2004         case SPLIT:
2005           return 1;
2006         case PEEPHOLE2:
2007           return -1;
2008         default:
2009           abort ();
2010         }
2011     }
2012
2013   return 0;
2014 }
2015
2016 /* Emit code for one node -- the conditional and the accompanying action.
2017    Return true if there is no fallthru path.  */
2018
2019 static int
2020 write_node (p, depth, subroutine_type)
2021      struct decision *p;
2022      int depth;
2023      enum routine_type subroutine_type;
2024 {
2025   struct decision_test *test, *last_test;
2026   int uncond;
2027
2028   last_test = test = p->tests;
2029   uncond = is_unconditional (test, subroutine_type);
2030   if (uncond == 0)
2031     {
2032       printf ("  if (");
2033       write_cond (test, depth, subroutine_type);
2034
2035       while ((test = test->next) != NULL)
2036         {
2037           int uncond2;
2038
2039           last_test = test;
2040           uncond2 = is_unconditional (test, subroutine_type);
2041           if (uncond2 != 0)
2042             break;
2043
2044           printf ("\n      && ");
2045           write_cond (test, depth, subroutine_type);
2046         }
2047
2048       printf (")\n");
2049     }
2050
2051   write_action (last_test, depth, uncond, p->success.first, subroutine_type);
2052
2053   return uncond > 0;
2054 }
2055
2056 /* Emit code for all of the sibling nodes of HEAD.  */
2057
2058 static void
2059 write_tree_1 (head, depth, subroutine_type)
2060      struct decision_head *head;
2061      int depth;
2062      enum routine_type subroutine_type;
2063 {
2064   struct decision *p, *next;
2065   int uncond = 0;
2066
2067   for (p = head->first; p ; p = next)
2068     {
2069       /* The label for the first element was printed in write_tree.  */
2070       if (p != head->first && p->need_label)
2071         OUTPUT_LABEL (" ", p->number);
2072
2073       /* Attempt to write a switch statement for a whole sequence.  */
2074       next = write_switch (p, depth);
2075       if (p != next)
2076         uncond = 0;
2077       else
2078         {
2079           /* Failed -- fall back and write one node.  */
2080           uncond = write_node (p, depth, subroutine_type);
2081           next = p->next;
2082         }
2083     }
2084
2085   /* Finished with this chain.  Close a fallthru path by branching
2086      to the afterward node.  */
2087   if (! uncond)
2088     write_afterward (head->last, head->last->afterward, "  ");
2089 }
2090
2091 /* Write out the decision tree starting at HEAD.  PREVPOS is the
2092    position at the node that branched to this node.  */
2093
2094 static void
2095 write_tree (head, prevpos, type, initial)
2096      struct decision_head *head;
2097      const char *prevpos;
2098      enum routine_type type;
2099      int initial;
2100 {
2101   register struct decision *p = head->first;
2102
2103   putchar ('\n');
2104   if (p->need_label)
2105     OUTPUT_LABEL (" ", p->number);
2106
2107   if (! initial && p->subroutine_number > 0)
2108     {
2109       static const char * const name_prefix[] = {
2110           "recog", "split", "peephole2"
2111       };
2112
2113       static const char * const call_suffix[] = {
2114           ", pnum_clobbers", "", ", _plast_insn"
2115       };
2116
2117       /* This node has been broken out into a separate subroutine.
2118          Call it, test the result, and branch accordingly.  */
2119
2120       if (p->afterward)
2121         {
2122           printf ("  tem = %s_%d (x0, insn%s);\n",
2123                   name_prefix[type], p->subroutine_number, call_suffix[type]);
2124           if (IS_SPLIT (type))
2125             printf ("  if (tem != 0)\n    return tem;\n");
2126           else
2127             printf ("  if (tem >= 0)\n    return tem;\n");
2128
2129           change_state (p->position, p->afterward->position, NULL, "  ");
2130           printf ("  goto L%d;\n", p->afterward->number);
2131         }
2132       else
2133         {
2134           printf ("  return %s_%d (x0, insn%s);\n",
2135                   name_prefix[type], p->subroutine_number, call_suffix[type]);
2136         }
2137     }
2138   else
2139     {
2140       int depth = strlen (p->position);
2141
2142       change_state (prevpos, p->position, head->last->afterward, "  ");
2143       write_tree_1 (head, depth, type);
2144
2145       for (p = head->first; p; p = p->next)
2146         if (p->success.first)
2147           write_tree (&p->success, p->position, type, 0);
2148     }
2149 }
2150
2151 /* Write out a subroutine of type TYPE to do comparisons starting at
2152    node TREE.  */
2153
2154 static void
2155 write_subroutine (head, type)
2156      struct decision_head *head;
2157      enum routine_type type;
2158 {
2159   int subfunction = head->first ? head->first->subroutine_number : 0;
2160   const char *s_or_e;
2161   char extension[32];
2162   int i;
2163   
2164   s_or_e = subfunction ? "static " : "";
2165
2166   if (subfunction)
2167     sprintf (extension, "_%d", subfunction);
2168   else if (type == RECOG)
2169     extension[0] = '\0';
2170   else
2171     strcpy (extension, "_insns");
2172
2173   switch (type)
2174     {
2175     case RECOG:
2176       printf ("%sint recog%s PROTO ((rtx, rtx, int *));\n", s_or_e, extension);
2177       printf ("%sint\n\
2178 recog%s (x0, insn, pnum_clobbers)\n\
2179      register rtx x0;\n\
2180      rtx insn ATTRIBUTE_UNUSED;\n\
2181      int *pnum_clobbers ATTRIBUTE_UNUSED;\n", s_or_e, extension);
2182       break;
2183     case SPLIT:
2184       printf ("%srtx split%s PROTO ((rtx, rtx));\n", s_or_e, extension);
2185       printf ("%srtx\n\
2186 split%s (x0, insn)\n\
2187      register rtx x0;\n\
2188      rtx insn ATTRIBUTE_UNUSED;\n", s_or_e, extension);
2189       break;
2190     case PEEPHOLE2:
2191       printf ("%srtx peephole2%s PROTO ((rtx, rtx, rtx *));\n", s_or_e, extension);
2192       printf ("%srtx\n\
2193 peephole2%s (x0, insn, _plast_insn)\n\
2194      register rtx x0;\n\
2195      rtx insn ATTRIBUTE_UNUSED;\n\
2196      rtx *_plast_insn ATTRIBUTE_UNUSED;\n", s_or_e, extension);
2197       break;
2198     }
2199
2200   printf ("{\n  register rtx * const operands = &recog_data.operand[0];\n");
2201   for (i = 1; i <= max_depth; i++)
2202     printf ("  register rtx x%d ATTRIBUTE_UNUSED;\n", i);
2203
2204   if (type == PEEPHOLE2)
2205     printf ("  register rtx _last_insn = insn;\n");
2206   printf ("  %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int");
2207
2208   if (head->first)
2209     write_tree (head, "", type, 1);
2210   else
2211     printf ("  goto ret0;\n");
2212
2213   if (type == PEEPHOLE2)
2214     printf (" ret1:\n  *_plast_insn = _last_insn;\n  return tem;\n");
2215   printf (" ret0:\n  return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1);
2216 }
2217
2218 /* In break_out_subroutines, we discovered the boundaries for the
2219    subroutines, but did not write them out.  Do so now.  */
2220
2221 static void
2222 write_subroutines (head, type)
2223      struct decision_head *head;
2224      enum routine_type type;
2225 {
2226   struct decision *p;
2227
2228   for (p = head->first; p ; p = p->next)
2229     if (p->success.first)
2230       write_subroutines (&p->success, type);
2231
2232   if (head->first->subroutine_number > 0)
2233     write_subroutine (head, type);
2234 }
2235
2236 /* Begin the output file.  */
2237
2238 static void
2239 write_header ()
2240 {
2241   puts ("\
2242 /* Generated automatically by the program `genrecog' from the target\n\
2243    machine description file.  */\n\
2244 \n\
2245 #include \"config.h\"\n\
2246 #include \"system.h\"\n\
2247 #include \"rtl.h\"\n\
2248 #include \"tm_p.h\"\n\
2249 #include \"function.h\"\n\
2250 #include \"insn-config.h\"\n\
2251 #include \"recog.h\"\n\
2252 #include \"real.h\"\n\
2253 #include \"output.h\"\n\
2254 #include \"flags.h\"\n\
2255 #include \"hard-reg-set.h\"\n\
2256 #include \"resource.h\"\n\
2257 \n");
2258
2259   puts ("\n\
2260 /* `recog' contains a decision tree that recognizes whether the rtx\n\
2261    X0 is a valid instruction.\n\
2262 \n\
2263    recog returns -1 if the rtx is not valid.  If the rtx is valid, recog\n\
2264    returns a nonnegative number which is the insn code number for the\n\
2265    pattern that matched.  This is the same as the order in the machine\n\
2266    description of the entry that matched.  This number can be used as an\n\
2267    index into `insn_data' and other tables.\n\
2268 \n\
2269    The third argument to recog is an optional pointer to an int.  If\n\
2270    present, recog will accept a pattern if it matches except for missing\n\
2271    CLOBBER expressions at the end.  In that case, the value pointed to by\n\
2272    the optional pointer will be set to the number of CLOBBERs that need\n\
2273    to be added (it should be initialized to zero by the caller).  If it\n\
2274    is set nonzero, the caller should allocate a PARALLEL of the\n\
2275    appropriate size, copy the initial entries, and call add_clobbers\n\
2276    (found in insn-emit.c) to fill in the CLOBBERs.\n\
2277 ");
2278
2279   puts ("\n\
2280    The function split_insns returns 0 if the rtl could not\n\
2281    be split or the split rtl in a SEQUENCE if it can be.\n\
2282 \n\
2283    The function peephole2_insns returns 0 if the rtl could not\n\
2284    be matched. If there was a match, the new rtl is returned in a SEQUENCE,\n\
2285    and LAST_INSN will point to the last recognized insn in the old sequence.\n\
2286 */\n\n");
2287 }
2288
2289 \f
2290 /* Construct and return a sequence of decisions
2291    that will recognize INSN.
2292
2293    TYPE says what type of routine we are recognizing (RECOG or SPLIT).  */
2294
2295 static struct decision_head
2296 make_insn_sequence (insn, type)
2297      rtx insn;
2298      enum routine_type type;
2299 {
2300   rtx x;
2301   const char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
2302   struct decision *last;
2303   struct decision_test *test, **place;
2304   struct decision_head head;
2305
2306   record_insn_name (next_insn_code, (type == RECOG ? XSTR (insn, 0) : NULL));
2307
2308   if (type == PEEPHOLE2)
2309     {
2310       int i, j;
2311
2312       /* peephole2 gets special treatment:
2313          - X always gets an outer parallel even if it's only one entry
2314          - we remove all traces of outer-level match_scratch and match_dup
2315            expressions here.  */
2316       x = rtx_alloc (PARALLEL);
2317       PUT_MODE (x, VOIDmode);
2318       XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0));
2319       for (i = j = 0; i < XVECLEN (insn, 0); i++)
2320         {
2321           rtx tmp = XVECEXP (insn, 0, i);
2322           if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP)
2323             {
2324               XVECEXP (x, 0, j) = tmp;
2325               j++;
2326             }
2327         }
2328       XVECLEN (x, 0) = j;
2329     }
2330   else if (XVECLEN (insn, type == RECOG) == 1)
2331     x = XVECEXP (insn, type == RECOG, 0);
2332   else
2333     {
2334       x = rtx_alloc (PARALLEL);
2335       XVEC (x, 0) = XVEC (insn, type == RECOG);
2336       PUT_MODE (x, VOIDmode);
2337     }
2338
2339   validate_pattern (x, insn, NULL_RTX);
2340
2341   memset(&head, 0, sizeof(head));
2342   last = add_to_sequence (x, &head, "", type, 1);
2343
2344   /* Find the end of the test chain on the last node.  */
2345   for (test = last->tests; test->next; test = test->next)
2346     continue;
2347   place = &test->next;
2348
2349   if (c_test[0])
2350     {
2351       /* Need a new node if we have another test to add.  */
2352       if (test->type == DT_accept_op)
2353         {
2354           last = new_decision ("", &last->success);
2355           place = &last->tests;
2356         }
2357       test = new_decision_test (DT_c_test, &place);
2358       test->u.c_test = c_test;
2359     }
2360
2361   test = new_decision_test (DT_accept_insn, &place);
2362   test->u.insn.code_number = next_insn_code;
2363   test->u.insn.lineno = pattern_lineno;
2364   test->u.insn.num_clobbers_to_add = 0;
2365
2366   switch (type)
2367     {
2368     case RECOG:
2369       /* If this is an DEFINE_INSN and X is a PARALLEL, see if it ends
2370          with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.
2371          If so, set up to recognize the pattern without these CLOBBERs.  */
2372
2373       if (GET_CODE (x) == PARALLEL)
2374         {
2375           int i;
2376
2377           /* Find the last non-clobber in the parallel.  */
2378           for (i = XVECLEN (x, 0); i > 0; i--)
2379             {
2380               rtx y = XVECEXP (x, 0, i - 1);
2381               if (GET_CODE (y) != CLOBBER
2382                   || (GET_CODE (XEXP (y, 0)) != REG
2383                       && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH))
2384                 break;
2385             }
2386
2387           if (i != XVECLEN (x, 0))
2388             {
2389               rtx new;
2390               struct decision_head clobber_head;
2391
2392               /* Build a similar insn without the clobbers.  */
2393               if (i == 1)
2394                 new = XVECEXP (x, 0, 0);
2395               else
2396                 {
2397                   int j;
2398
2399                   new = rtx_alloc (PARALLEL);
2400                   XVEC (new, 0) = rtvec_alloc (i);
2401                   for (j = i - 1; j >= 0; j--)
2402                     XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
2403                 }
2404
2405               /* Recognize it.  */
2406               memset (&clobber_head, 0, sizeof(clobber_head));
2407               last = add_to_sequence (new, &clobber_head, "", type, 1);
2408
2409               /* Find the end of the test chain on the last node.  */
2410               for (test = last->tests; test->next; test = test->next)
2411                 continue;
2412
2413               /* We definitely have a new test to add -- create a new
2414                  node if needed.  */
2415               place = &test->next;
2416               if (test->type == DT_accept_op)
2417                 {
2418                   last = new_decision ("", &last->success);
2419                   place = &last->tests;
2420                 }
2421
2422               if (c_test[0])
2423                 {
2424                   test = new_decision_test (DT_c_test, &place);
2425                   test->u.c_test = c_test;
2426                 }
2427
2428               test = new_decision_test (DT_accept_insn, &place);
2429               test->u.insn.code_number = next_insn_code;
2430               test->u.insn.lineno = pattern_lineno;
2431               test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i;
2432
2433               merge_trees (&head, &clobber_head);
2434             }
2435         }
2436       break;
2437
2438     case SPLIT:
2439       /* Define the subroutine we will call below and emit in genemit.  */
2440       printf ("extern rtx gen_split_%d PROTO ((rtx *));\n", next_insn_code);
2441       break;
2442
2443     case PEEPHOLE2:
2444       /* Define the subroutine we will call below and emit in genemit.  */
2445       printf ("extern rtx gen_peephole2_%d PROTO ((rtx, rtx *));\n",
2446               next_insn_code);
2447       break;
2448     }
2449   next_insn_code++;
2450
2451   return head;
2452 }
2453
2454 static void
2455 process_tree (head, subroutine_type)
2456      struct decision_head *head;
2457      enum routine_type subroutine_type;
2458 {
2459   if (head->first == NULL)
2460     {
2461       /* We can elide peephole2_insns, but not recog or split_insns.  */
2462       if (subroutine_type == PEEPHOLE2)
2463         return;
2464     }
2465   else
2466     {
2467       factor_tests (head);
2468
2469       next_subroutine_number = 0;
2470       break_out_subroutines (head, 1);
2471       find_afterward (head, NULL);
2472
2473       /* We run this after find_afterward, because find_afterward needs
2474          the redundant DT_mode tests on predicates to determine whether
2475          two tests can both be true or not.  */
2476       simplify_tests(head);
2477
2478       write_subroutines (head, subroutine_type);
2479     }
2480
2481   write_subroutine (head, subroutine_type);
2482 }
2483 \f
2484 extern int main PROTO ((int, char **));
2485
2486 int
2487 main (argc, argv)
2488      int argc;
2489      char **argv;
2490 {
2491   rtx desc;
2492   struct decision_head recog_tree, split_tree, peephole2_tree, h;
2493   FILE *infile;
2494   register int c;
2495
2496   progname = "genrecog";
2497   obstack_init (rtl_obstack);
2498
2499   memset (&recog_tree, 0, sizeof recog_tree);
2500   memset (&split_tree, 0, sizeof split_tree);
2501   memset (&peephole2_tree, 0, sizeof peephole2_tree);
2502
2503   if (argc <= 1)
2504     fatal ("No input file name.");
2505
2506   infile = fopen (argv[1], "r");
2507   if (infile == 0)
2508     {
2509       perror (argv[1]);
2510       return FATAL_EXIT_CODE;
2511     }
2512   read_rtx_filename = argv[1];
2513
2514   next_insn_code = 0;
2515   next_index = 0;
2516
2517   write_header ();
2518
2519   /* Read the machine description.  */
2520
2521   while (1)
2522     {
2523       c = read_skip_spaces (infile);
2524       if (c == EOF)
2525         break;
2526       ungetc (c, infile);
2527       pattern_lineno = read_rtx_lineno;
2528
2529       desc = read_rtx (infile);
2530       if (GET_CODE (desc) == DEFINE_INSN)
2531         {
2532           h = make_insn_sequence (desc, RECOG);
2533           merge_trees (&recog_tree, &h);
2534         }
2535       else if (GET_CODE (desc) == DEFINE_SPLIT)
2536         {
2537           h = make_insn_sequence (desc, SPLIT);
2538           merge_trees (&split_tree, &h);
2539         }
2540       else if (GET_CODE (desc) == DEFINE_PEEPHOLE2)
2541         {
2542           h = make_insn_sequence (desc, PEEPHOLE2);
2543           merge_trees (&peephole2_tree, &h);
2544         }
2545         
2546       if (GET_CODE (desc) == DEFINE_PEEPHOLE
2547           || GET_CODE (desc) == DEFINE_EXPAND)
2548         next_insn_code++;
2549       next_index++;
2550     }
2551
2552   if (error_count)
2553     return FATAL_EXIT_CODE;
2554
2555   puts ("\n\n");
2556
2557   process_tree (&recog_tree, RECOG);
2558   process_tree (&split_tree, SPLIT);
2559   process_tree (&peephole2_tree, PEEPHOLE2);
2560
2561   fflush (stdout);
2562   return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
2563 }
2564 \f
2565 /* Define this so we can link with print-rtl.o to get debug_rtx function.  */
2566 const char *
2567 get_insn_name (code)
2568      int code;
2569 {
2570   if (code < insn_name_ptr_size)
2571     return insn_name_ptr[code];
2572   else
2573     return NULL;
2574 }
2575
2576 static void
2577 record_insn_name (code, name)
2578      int code;
2579      const char *name;
2580 {
2581   static const char *last_real_name = "insn";
2582   static int last_real_code = 0;
2583   char *new;
2584
2585   if (insn_name_ptr_size <= code)
2586     {
2587       int new_size;
2588       new_size = (insn_name_ptr_size ? insn_name_ptr_size * 2 : 512);
2589       insn_name_ptr =
2590         (char **) xrealloc (insn_name_ptr, sizeof(char *) * new_size);
2591       memset (insn_name_ptr + insn_name_ptr_size, 0, 
2592               sizeof(char *) * (new_size - insn_name_ptr_size));
2593       insn_name_ptr_size = new_size;
2594     }
2595
2596   if (!name || name[0] == '\0')
2597     {
2598       new = xmalloc (strlen (last_real_name) + 10);
2599       sprintf (new, "%s+%d", last_real_name, code - last_real_code);
2600     }
2601   else
2602     {
2603       last_real_name = new = xstrdup (name);
2604       last_real_code = code;
2605     }
2606   
2607   insn_name_ptr[code] = new;
2608 }  
2609 \f
2610 char *
2611 xstrdup (input)
2612   const char *input;
2613 {
2614   register size_t len = strlen (input) + 1;
2615   register char *output = xmalloc (len);
2616   memcpy (output, input, len);
2617   return output;
2618 }
2619
2620 PTR
2621 xrealloc (old, size)
2622   PTR old;
2623   size_t size;
2624 {
2625   register PTR ptr;
2626   if (old)
2627     ptr = (PTR) realloc (old, size);
2628   else
2629     ptr = (PTR) malloc (size);
2630   if (!ptr)
2631     fatal ("virtual memory exhausted");
2632   return ptr;
2633 }
2634
2635 PTR
2636 xmalloc (size)
2637   size_t size;
2638 {
2639   register PTR val = (PTR) malloc (size);
2640
2641   if (val == 0)
2642     fatal ("virtual memory exhausted");
2643   return val;
2644 }
2645 \f
2646 static void
2647 debug_decision_2 (test)
2648      struct decision_test *test;
2649 {
2650   switch (test->type)
2651     {
2652     case DT_mode:
2653       fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode));
2654       break;
2655     case DT_code:
2656       fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code));
2657       break;
2658     case DT_veclen:
2659       fprintf (stderr, "veclen=%d", test->u.veclen);
2660       break;
2661     case DT_elt_zero_int:
2662       fprintf (stderr, "elt0_i=%d", (int) test->u.intval);
2663       break;
2664     case DT_elt_one_int:
2665       fprintf (stderr, "elt1_i=%d", (int) test->u.intval);
2666       break;
2667     case DT_elt_zero_wide:
2668       fprintf (stderr, "elt0_w=");
2669       fprintf (stderr, HOST_WIDE_INT_PRINT_DEC, test->u.intval);
2670       break;
2671     case DT_dup:
2672       fprintf (stderr, "dup=%d", test->u.dup);
2673       break;
2674     case DT_pred:
2675       fprintf (stderr, "pred=(%s,%s)",
2676                test->u.pred.name, GET_MODE_NAME(test->u.pred.mode));
2677       break;
2678     case DT_c_test:
2679       {
2680         char sub[16+4];
2681         strncpy (sub, test->u.c_test, sizeof(sub));
2682         memcpy (sub+16, "...", 4);
2683         fprintf (stderr, "c_test=\"%s\"", sub);
2684       }
2685       break;
2686     case DT_accept_op:
2687       fprintf (stderr, "A_op=%d", test->u.opno);
2688       break;
2689     case DT_accept_insn:
2690       fprintf (stderr, "A_insn=(%d,%d)", 
2691                test->u.insn.code_number, test->u.insn.num_clobbers_to_add);
2692       break;
2693
2694     default:
2695       abort ();
2696     }
2697 }
2698
2699 static void
2700 debug_decision_1 (d, indent)
2701      struct decision *d;
2702      int indent;
2703 {
2704   int i;
2705   struct decision_test *test;
2706
2707   if (d == NULL)
2708     {
2709       for (i = 0; i < indent; ++i)
2710         putc (' ', stderr);
2711       fputs ("(nil)\n", stderr);
2712       return;
2713     }
2714
2715   for (i = 0; i < indent; ++i)
2716     putc (' ', stderr);
2717
2718   putc ('{', stderr);
2719   test = d->tests;
2720   if (test)
2721     {
2722       debug_decision_2 (test);
2723       while ((test = test->next) != NULL)
2724         {
2725           fputs (" + ", stderr);
2726           debug_decision_2 (test);
2727         }
2728     }
2729   fprintf (stderr, "} %d n %d a %d\n", d->number,
2730            (d->next ? d->next->number : -1),
2731            (d->afterward ? d->afterward->number : -1));
2732 }
2733
2734 static void
2735 debug_decision_0 (d, indent, maxdepth)
2736      struct decision *d;
2737      int indent, maxdepth;
2738 {
2739   struct decision *n;
2740   int i;
2741
2742   if (maxdepth < 0)
2743     return;
2744   if (d == NULL)
2745     {
2746       for (i = 0; i < indent; ++i)
2747         putc (' ', stderr);
2748       fputs ("(nil)\n", stderr);
2749       return;
2750     }
2751
2752   debug_decision_1 (d, indent);
2753   for (n = d->success.first; n ; n = n->next)
2754     debug_decision_0 (n, indent + 2, maxdepth - 1);
2755 }
2756
2757 void
2758 debug_decision (d)
2759      struct decision *d;
2760 {
2761   debug_decision_0 (d, 0, 1000000);
2762 }
2763
2764 void
2765 debug_decision_list (d)
2766      struct decision *d;
2767 {
2768   while (d)
2769     {
2770       debug_decision_0 (d, 0, 0);
2771       d = d->next;
2772     }
2773 }