OSDN Git Service

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