OSDN Git Service

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