OSDN Git Service

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