OSDN Git Service

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