OSDN Git Service

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