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