OSDN Git Service

* mn10300.md (adddi3, subdi3): Remove expanders and patterns.
[pf3gnuchains/gcc-fork.git] / gcc / genrecog.c
1 /* Generate code from machine description to recognize rtl as insns.
2    Copyright (C) 1987, 88, 92, 93, 94, 1995 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 /* This program is used to produce insn-recog.c, which contains
23    a function called `recog' plus its subroutines.
24    These functions contain a decision tree
25    that recognizes whether an rtx, the argument given to recog,
26    is a valid instruction.
27
28    recog returns -1 if the rtx is not valid.
29    If the rtx is valid, recog returns a nonnegative number
30    which is the insn code number for the pattern that matched.
31    This is the same as the order in the machine description of the
32    entry that matched.  This number can be used as an index into various
33    insn_* tables, such as insn_template, insn_outfun, and insn_n_operands
34    (found in insn-output.c).
35
36    The third argument to recog is an optional pointer to an int.
37    If present, recog will accept a pattern if it matches except for
38    missing CLOBBER expressions at the end.  In that case, the value
39    pointed to by the optional pointer will be set to the number of
40    CLOBBERs that need to be added (it should be initialized to zero by
41    the caller).  If it is set nonzero, the caller should allocate a
42    PARALLEL of the appropriate size, copy the initial entries, and call
43    add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.
44
45    This program also generates the function `split_insns',
46    which returns 0 if the rtl could not be split, or
47    it returns the split rtl in a SEQUENCE.  */
48
49 #include <stdio.h>
50 #include "hconfig.h"
51 #include "rtl.h"
52 #include "obstack.h"
53
54 static struct obstack obstack;
55 struct obstack *rtl_obstack = &obstack;
56
57 #define obstack_chunk_alloc xmalloc
58 #define obstack_chunk_free free
59
60 extern void free ();
61 extern rtx read_rtx ();
62
63 /* Data structure for a listhead of decision trees.  The alternatives
64    to a node are kept in a doublely-linked list so we can easily add nodes
65    to the proper place when merging.  */
66
67 struct decision_head { struct decision *first, *last; };
68
69 /* Data structure for decision tree for recognizing
70    legitimate instructions.  */
71
72 struct decision
73 {
74   int number;                   /* Node number, used for labels */
75   char *position;               /* String denoting position in pattern */
76   RTX_CODE code;                /* Code to test for or UNKNOWN to suppress */
77   char ignore_code;             /* If non-zero, need not test code */
78   char ignore_mode;             /* If non-zero, need not test mode */
79   int veclen;                   /* Length of vector, if nonzero */
80   enum machine_mode mode;       /* Machine mode of node */
81   char enforce_mode;            /* If non-zero, test `mode' */
82   char retest_code, retest_mode; /* See write_tree_1 */
83   int test_elt_zero_int;        /* Nonzero if should test XINT (rtl, 0) */
84   int elt_zero_int;             /* Required value for XINT (rtl, 0) */
85   int test_elt_one_int;         /* Nonzero if should test XINT (rtl, 1) */
86   int elt_one_int;              /* Required value for XINT (rtl, 1) */
87   int test_elt_zero_wide;       /* Nonzero if should test XWINT (rtl, 0) */
88   HOST_WIDE_INT elt_zero_wide;  /* Required value for XWINT (rtl, 0) */
89   char *tests;                  /* If nonzero predicate to call */
90   int pred;                     /* `preds' index of predicate or -1 */
91   char *c_test;                 /* Additional test to perform */
92   struct decision_head success; /* Nodes to test on success */
93   int insn_code_number;         /* Insn number matched, if success */
94   int num_clobbers_to_add;      /* Number of CLOBBERs to be added to pattern */
95   struct decision *next;        /* Node to test on failure */
96   struct decision *prev;        /* Node whose failure tests us */
97   struct decision *afterward;   /* Node to test on success, but failure of
98                                    successor nodes */
99   int opno;                     /* Operand number, if >= 0 */
100   int dupno;                    /* Number of operand to compare against */
101   int label_needed;             /* Nonzero if label needed when writing tree */
102   int subroutine_number;        /* Number of subroutine this node starts */
103 };
104
105 #define SUBROUTINE_THRESHOLD 50
106
107 static int next_subroutine_number;
108
109 /* We can write two types of subroutines: One for insn recognition and
110    one to split insns.  This defines which type is being written.  */
111
112 enum routine_type {RECOG, SPLIT};
113
114 /* Next available node number for tree nodes.  */
115
116 static int next_number;
117
118 /* Next number to use as an insn_code.  */
119
120 static int next_insn_code;
121
122 /* Similar, but counts all expressions in the MD file; used for
123    error messages.  */
124
125 static int next_index;
126
127 /* Record the highest depth we ever have so we know how many variables to
128    allocate in each subroutine we make.  */
129
130 static int max_depth;
131 \f
132 /* This table contains a list of the rtl codes that can possibly match a
133    predicate defined in recog.c.  The function `not_both_true' uses it to
134    deduce that there are no expressions that can be matches by certain pairs
135    of tree nodes.  Also, if a predicate can match only one code, we can
136    hardwire that code into the node testing the predicate.  */
137
138 static struct pred_table
139 {
140   char *name;
141   RTX_CODE codes[NUM_RTX_CODE];
142 } preds[]
143   = {{"general_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
144                           LABEL_REF, SUBREG, REG, MEM}},
145 #ifdef PREDICATE_CODES
146      PREDICATE_CODES
147 #endif
148      {"address_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
149                           LABEL_REF, SUBREG, REG, MEM, PLUS, MINUS, MULT}},
150      {"register_operand", {SUBREG, REG}},
151      {"scratch_operand", {SCRATCH, REG}},
152      {"immediate_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
153                             LABEL_REF}},
154      {"const_int_operand", {CONST_INT}},
155      {"const_double_operand", {CONST_INT, CONST_DOUBLE}},
156      {"nonimmediate_operand", {SUBREG, REG, MEM}},
157      {"nonmemory_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
158                             LABEL_REF, SUBREG, REG}},
159      {"push_operand", {MEM}},
160      {"memory_operand", {SUBREG, MEM}},
161      {"indirect_operand", {SUBREG, MEM}},
162      {"comparison_operator", {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU}},
163      {"mode_independent_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF,
164                                    LABEL_REF, SUBREG, REG, MEM}}};
165
166 #define NUM_KNOWN_PREDS (sizeof preds / sizeof preds[0])
167
168 static struct decision_head make_insn_sequence PROTO((rtx, enum routine_type));
169 static struct decision *add_to_sequence PROTO((rtx, struct decision_head *,
170                                                char *));
171 static int not_both_true        PROTO((struct decision *, struct decision *,
172                                        int));
173 static int position_merit       PROTO((struct decision *, enum machine_mode,
174                                        enum rtx_code));
175 static struct decision_head merge_trees PROTO((struct decision_head,
176                                                struct decision_head));
177 static int break_out_subroutines PROTO((struct decision_head,
178                                         enum routine_type, int));
179 static void write_subroutine    PROTO((struct decision *, enum routine_type));
180 static void write_tree_1        PROTO((struct decision *, char *,
181                                        struct decision *, enum routine_type));
182 static void print_code          PROTO((enum rtx_code));
183 static int same_codes           PROTO((struct decision *, enum rtx_code));
184 static void clear_codes         PROTO((struct decision *));
185 static int same_modes           PROTO((struct decision *, enum machine_mode));
186 static void clear_modes         PROTO((struct decision *));
187 static void write_tree          PROTO((struct decision *, char *,
188                                        struct decision *, int,
189                                        enum routine_type));
190 static void change_state        PROTO((char *, char *, int));
191 static char *copystr            PROTO((char *));
192 static void mybzero             PROTO((char *, unsigned));
193 static void mybcopy             PROTO((char *, char *, unsigned));
194 static char *concat             PROTO((char *, char *));
195 static void fatal               PROTO((char *));
196 char *xrealloc                  PROTO((char *, unsigned));
197 char *xmalloc                   PROTO((unsigned));
198 void fancy_abort                PROTO((void));
199 \f
200 /* Construct and return a sequence of decisions
201    that will recognize INSN.
202
203    TYPE says what type of routine we are recognizing (RECOG or SPLIT).  */
204
205 static struct decision_head
206 make_insn_sequence (insn, type)
207      rtx insn;
208      enum routine_type type;
209 {
210   rtx x;
211   char *c_test = XSTR (insn, type == RECOG ? 2 : 1);
212   struct decision *last;
213   struct decision_head head;
214
215   if (XVECLEN (insn, type == RECOG) == 1)
216     x = XVECEXP (insn, type == RECOG, 0);
217   else
218     {
219       x = rtx_alloc (PARALLEL);
220       XVEC (x, 0) = XVEC (insn, type == RECOG);
221       PUT_MODE (x, VOIDmode);
222     }
223
224   last = add_to_sequence (x, &head, "");
225
226   if (c_test[0])
227     last->c_test = c_test;
228   last->insn_code_number = next_insn_code;
229   last->num_clobbers_to_add = 0;
230
231   /* If this is not a DEFINE_SPLIT and X is a PARALLEL, see if it ends with a
232      group of CLOBBERs of (hard) registers or MATCH_SCRATCHes.  If so, set up
233      to recognize the pattern without these CLOBBERs.  */
234
235   if (type == RECOG && GET_CODE (x) == PARALLEL)
236     {
237       int i;
238
239       for (i = XVECLEN (x, 0); i > 0; i--)
240         if (GET_CODE (XVECEXP (x, 0, i - 1)) != CLOBBER
241             || (GET_CODE (XEXP (XVECEXP (x, 0, i - 1), 0)) != REG
242                 && GET_CODE (XEXP (XVECEXP (x, 0, i - 1), 0)) != MATCH_SCRATCH))
243           break;
244
245       if (i != XVECLEN (x, 0))
246         {
247           rtx new;
248           struct decision_head clobber_head;
249
250           if (i == 1)
251             new = XVECEXP (x, 0, 0);
252           else
253             {
254               int j;
255
256               new = rtx_alloc (PARALLEL);
257               XVEC (new, 0) = rtvec_alloc (i);
258               for (j = i - 1; j >= 0; j--)
259                 XVECEXP (new, 0, j) = XVECEXP (x, 0, j);
260             }
261
262           last = add_to_sequence (new, &clobber_head, "");
263
264           if (c_test[0])
265             last->c_test = c_test;
266           last->insn_code_number = next_insn_code;
267           last->num_clobbers_to_add = XVECLEN (x, 0) - i;
268
269           head = merge_trees (head, clobber_head);
270         }
271     }
272
273   next_insn_code++;
274
275   if (type == SPLIT)
276     /* Define the subroutine we will call below and emit in genemit.  */
277     printf ("extern rtx gen_split_%d ();\n", last->insn_code_number);
278
279   return head;
280 }
281 \f
282 /* Create a chain of nodes to verify that an rtl expression matches
283    PATTERN.
284
285    LAST is a pointer to the listhead in the previous node in the chain (or
286    in the calling function, for the first node).
287
288    POSITION is the string representing the current position in the insn.
289
290    A pointer to the final node in the chain is returned.  */
291
292 static struct decision *
293 add_to_sequence (pattern, last, position)
294      rtx pattern;
295      struct decision_head *last;
296      char *position;
297 {
298   register RTX_CODE code;
299   register struct decision *new
300     = (struct decision *) xmalloc (sizeof (struct decision));
301   struct decision *this;
302   char *newpos;
303   register char *fmt;
304   register int i;
305   int depth = strlen (position);
306   int len;
307
308   if (depth > max_depth)
309     max_depth = depth;
310
311   new->number = next_number++;
312   new->position = copystr (position);
313   new->ignore_code = 0;
314   new->ignore_mode = 0;
315   new->enforce_mode = 1;
316   new->retest_code = new->retest_mode = 0;
317   new->veclen = 0;
318   new->test_elt_zero_int = 0;
319   new->test_elt_one_int = 0;
320   new->test_elt_zero_wide = 0;
321   new->elt_zero_int = 0;
322   new->elt_one_int = 0;
323   new->elt_zero_wide = 0;
324   new->tests = 0;
325   new->pred = -1;
326   new->c_test = 0;
327   new->success.first = new->success.last = 0;
328   new->insn_code_number = -1;
329   new->num_clobbers_to_add = 0;
330   new->next = 0;
331   new->prev = 0;
332   new->afterward = 0;
333   new->opno = -1;
334   new->dupno = -1;
335   new->label_needed = 0;
336   new->subroutine_number = 0;
337
338   this = new;
339
340   last->first = last->last = new;
341
342   newpos = (char *) alloca (depth + 2);
343   strcpy (newpos, position);
344   newpos[depth + 1] = 0;
345
346  restart:
347
348   new->mode = GET_MODE (pattern);
349   new->code = code = GET_CODE (pattern);
350
351   switch (code)
352     {
353     case MATCH_OPERAND:
354     case MATCH_SCRATCH:
355     case MATCH_OPERATOR:
356     case MATCH_PARALLEL:
357       new->opno = XINT (pattern, 0);
358       new->code = (code == MATCH_PARALLEL ? PARALLEL : UNKNOWN);
359       new->enforce_mode = 0;
360
361       if (code == MATCH_SCRATCH)
362         new->tests = "scratch_operand";
363       else
364         new->tests = XSTR (pattern, 1);
365
366       if (*new->tests == 0)
367         new->tests = 0;
368
369       /* See if we know about this predicate and save its number.  If we do,
370          and it only accepts one code, note that fact.  The predicate
371          `const_int_operand' only tests for a CONST_INT, so if we do so we
372          can avoid calling it at all.
373
374          Finally, if we know that the predicate does not allow CONST_INT, we
375          know that the only way the predicate can match is if the modes match
376          (here we use the kludge of relying on the fact that "address_operand"
377          accepts CONST_INT; otherwise, it would have to be a special case),
378          so we can test the mode (but we need not).  This fact should
379          considerably simplify the generated code.  */
380
381       if (new->tests)
382         {
383           for (i = 0; i < NUM_KNOWN_PREDS; i++)
384             if (! strcmp (preds[i].name, new->tests))
385               {
386                 int j;
387                 int allows_const_int = 0;
388
389                 new->pred = i;
390
391                 if (preds[i].codes[1] == 0 && new->code == UNKNOWN)
392                   {
393                     new->code = preds[i].codes[0];
394                     if (! strcmp ("const_int_operand", new->tests))
395                       new->tests = 0, new->pred = -1;
396                   }
397
398                 for (j = 0; j < NUM_RTX_CODE && preds[i].codes[j] != 0; j++)
399                   if (preds[i].codes[j] == CONST_INT)
400                     allows_const_int = 1;
401
402                 if (! allows_const_int)
403                   new->enforce_mode = new->ignore_mode= 1;
404
405                 break;
406               }
407
408 #ifdef PREDICATE_CODES
409           /* If the port has a list of the predicates it uses but omits
410              one, warn.  */
411           if (i == NUM_KNOWN_PREDS)
412             fprintf (stderr, "Warning: `%s' not in PREDICATE_CODES\n",
413                      new->tests);
414 #endif
415         }
416
417       if (code == MATCH_OPERATOR || code == MATCH_PARALLEL)
418         {
419           for (i = 0; i < XVECLEN (pattern, 2); i++)
420             {
421               newpos[depth] = i + (code == MATCH_OPERATOR ? '0': 'a');
422               new = add_to_sequence (XVECEXP (pattern, 2, i),
423                                      &new->success, newpos);
424             }
425         }
426
427       return new;
428
429     case MATCH_OP_DUP:
430       new->opno = XINT (pattern, 0);
431       new->dupno = XINT (pattern, 0);
432       new->code = UNKNOWN;
433       new->tests = 0;
434       for (i = 0; i < XVECLEN (pattern, 1); i++)
435         {
436           newpos[depth] = i + '0';
437           new = add_to_sequence (XVECEXP (pattern, 1, i),
438                                  &new->success, newpos);
439         }
440       return new;
441
442     case MATCH_DUP:
443     case MATCH_PAR_DUP:
444       new->dupno = XINT (pattern, 0);
445       new->code = UNKNOWN;
446       new->enforce_mode = 0;
447       return new;
448
449     case ADDRESS:
450       pattern = XEXP (pattern, 0);
451       goto restart;
452
453     case SET:
454       newpos[depth] = '0';
455       new = add_to_sequence (SET_DEST (pattern), &new->success, newpos);
456       this->success.first->enforce_mode = 1;
457       newpos[depth] = '1';
458       new = add_to_sequence (SET_SRC (pattern), &new->success, newpos);
459
460       /* If set are setting CC0 from anything other than a COMPARE, we
461          must enforce the mode so that we do not produce ambiguous insns.  */
462       if (GET_CODE (SET_DEST (pattern)) == CC0
463           && GET_CODE (SET_SRC (pattern)) != COMPARE)
464         this->success.first->enforce_mode = 1;
465       return new;
466
467     case SIGN_EXTEND:
468     case ZERO_EXTEND:
469     case STRICT_LOW_PART:
470       newpos[depth] = '0';
471       new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
472       this->success.first->enforce_mode = 1;
473       return new;
474
475     case SUBREG:
476       this->test_elt_one_int = 1;
477       this->elt_one_int = XINT (pattern, 1);
478       newpos[depth] = '0';
479       new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
480       this->success.first->enforce_mode = 1;
481       return new;
482
483     case ZERO_EXTRACT:
484     case SIGN_EXTRACT:
485       newpos[depth] = '0';
486       new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
487       this->success.first->enforce_mode = 1;
488       newpos[depth] = '1';
489       new = add_to_sequence (XEXP (pattern, 1), &new->success, newpos);
490       newpos[depth] = '2';
491       new = add_to_sequence (XEXP (pattern, 2), &new->success, newpos);
492       return new;
493
494     case EQ:   case NE:   case LE:   case LT:   case GE:  case GT:
495     case LEU:  case LTU:  case GEU:  case GTU:
496       /* If the first operand is (cc0), we don't have to do anything
497          special.  */
498       if (GET_CODE (XEXP (pattern, 0)) == CC0)
499         break;
500
501       /* ... fall through ...  */
502       
503     case COMPARE:
504       /* Enforce the mode on the first operand to avoid ambiguous insns.  */
505       newpos[depth] = '0';
506       new = add_to_sequence (XEXP (pattern, 0), &new->success, newpos);
507       this->success.first->enforce_mode = 1;
508       newpos[depth] = '1';
509       new = add_to_sequence (XEXP (pattern, 1), &new->success, newpos);
510       return new;
511     }
512
513   fmt = GET_RTX_FORMAT (code);
514   len = GET_RTX_LENGTH (code);
515   for (i = 0; i < len; i++)
516     {
517       newpos[depth] = '0' + i;
518       if (fmt[i] == 'e' || fmt[i] == 'u')
519         new = add_to_sequence (XEXP (pattern, i), &new->success, newpos);
520       else if (fmt[i] == 'i' && i == 0)
521         {
522           this->test_elt_zero_int = 1;
523           this->elt_zero_int = XINT (pattern, i);
524         }
525       else if (fmt[i] == 'i' && i == 1)
526         {
527           this->test_elt_one_int = 1;
528           this->elt_one_int = XINT (pattern, i);
529         }
530       else if (fmt[i] == 'w' && i == 0)
531         {
532           this->test_elt_zero_wide = 1;
533           this->elt_zero_wide = XWINT (pattern, i);
534         }
535       else if (fmt[i] == 'E')
536         {
537           register int j;
538           /* We do not handle a vector appearing as other than
539              the first item, just because nothing uses them
540              and by handling only the special case
541              we can use one element in newpos for either
542              the item number of a subexpression
543              or the element number in a vector.  */
544           if (i != 0)
545             abort ();
546           this->veclen = XVECLEN (pattern, i);
547           for (j = 0; j < XVECLEN (pattern, i); j++)
548             {
549               newpos[depth] = 'a' + j;
550               new = add_to_sequence (XVECEXP (pattern, i, j),
551                                      &new->success, newpos);
552             }
553         }
554       else if (fmt[i] != '0')
555         abort ();
556     }
557   return new;
558 }
559 \f
560 /* Return 1 if we can prove that there is no RTL that can match both
561    D1 and D2.  Otherwise, return 0 (it may be that there is an RTL that
562    can match both or just that we couldn't prove there wasn't such an RTL).
563
564    TOPLEVEL is non-zero if we are to only look at the top level and not
565    recursively descend.  */
566
567 static int
568 not_both_true (d1, d2, toplevel)
569      struct decision *d1, *d2;
570      int toplevel;
571 {
572   struct decision *p1, *p2;
573
574   /* If they are both to test modes and the modes are different, they aren't
575      both true.  Similarly for codes, integer elements, and vector lengths.  */
576
577   if ((d1->enforce_mode && d2->enforce_mode
578        && d1->mode != VOIDmode && d2->mode != VOIDmode && d1->mode != d2->mode)
579       || (d1->code != UNKNOWN && d2->code != UNKNOWN && d1->code != d2->code)
580       || (d1->test_elt_zero_int && d2->test_elt_zero_int
581           && d1->elt_zero_int != d2->elt_zero_int)
582       || (d1->test_elt_one_int && d2->test_elt_one_int
583           && d1->elt_one_int != d2->elt_one_int)
584       || (d1->test_elt_zero_wide && d2->test_elt_zero_wide
585           && d1->elt_zero_wide != d2->elt_zero_wide)
586       || (d1->veclen && d2->veclen && d1->veclen != d2->veclen))
587     return 1;
588
589   /* If either is a wild-card MATCH_OPERAND without a predicate, it can match
590      absolutely anything, so we can't say that no intersection is possible.
591      This case is detected by having a zero TESTS field with a code of
592      UNKNOWN.  */
593
594   if ((d1->tests == 0 && d1->code == UNKNOWN)
595       || (d2->tests == 0 && d2->code == UNKNOWN))
596     return 0;
597
598   /* If either has a predicate that we know something about, set things up so
599      that D1 is the one that always has a known predicate.  Then see if they
600      have any codes in common.  */
601
602   if (d1->pred >= 0 || d2->pred >= 0)
603     {
604       int i, j;
605
606       if (d2->pred >= 0)
607         p1 = d1, d1 = d2, d2 = p1;
608
609       /* If D2 tests an explicit code, see if it is in the list of valid codes
610          for D1's predicate.  */
611       if (d2->code != UNKNOWN)
612         {
613           for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
614             if (preds[d1->pred].codes[i] == d2->code)
615               break;
616
617           if (preds[d1->pred].codes[i] == 0)
618             return 1;
619         }
620
621       /* Otherwise see if the predicates have any codes in common.  */
622
623       else if (d2->pred >= 0)
624         {
625           for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
626             {
627               for (j = 0; j < NUM_RTX_CODE; j++)
628                 if (preds[d2->pred].codes[j] == 0
629                     || preds[d2->pred].codes[j] == preds[d1->pred].codes[i])
630                   break;
631
632               if (preds[d2->pred].codes[j] != 0)
633                 break;
634             }
635
636           if (preds[d1->pred].codes[i] == 0)
637             return 1;
638         }
639     }
640
641   /* If we got here, we can't prove that D1 and D2 cannot both be true.
642      If we are only to check the top level, return 0.  Otherwise, see if
643      we can prove that all choices in both successors are mutually
644      exclusive.  If either does not have any successors, we can't prove
645      they can't both be true.  */
646
647   if (toplevel || d1->success.first == 0 || d2->success.first == 0)
648     return 0;
649
650   for (p1 = d1->success.first; p1; p1 = p1->next)
651     for (p2 = d2->success.first; p2; p2 = p2->next)
652       if (! not_both_true (p1, p2, 0))
653         return 0;
654
655   return 1;
656 }
657 \f
658 /* Assuming that we can reorder all the alternatives at a specific point in
659    the tree (see discussion in merge_trees), we would prefer an ordering of
660    nodes where groups of consecutive nodes test the same mode and, within each
661    mode, groups of nodes test the same code.  With this order, we can
662    construct nested switch statements, the inner one to test the code and
663    the outer one to test the mode.
664
665    We would like to list nodes testing for specific codes before those
666    that test predicates to avoid unnecessary function calls.  Similarly,
667    tests for specific modes should precede nodes that allow any mode.
668
669    This function returns the merit (with 0 being the best) of inserting
670    a test involving the specified MODE and CODE after node P.  If P is
671    zero, we are to determine the merit of inserting the test at the front
672    of the list.  */
673
674 static int
675 position_merit (p, mode, code)
676      struct decision *p;
677      enum machine_mode mode;
678      enum rtx_code code;
679 {
680   enum machine_mode p_mode;
681
682   /* The only time the front of the list is anything other than the worst
683      position is if we are testing a mode that isn't VOIDmode.  */
684   if (p == 0)
685     return mode == VOIDmode ? 3 : 2;
686
687   p_mode = p->enforce_mode ? p->mode : VOIDmode;
688
689   /* The best case is if the codes and modes both match.  */
690   if (p_mode == mode && p->code== code)
691     return 0;
692
693   /* If the codes don't match, the next best case is if the modes match.
694      In that case, the best position for this node depends on whether
695      we are testing for a specific code or not.  If we are, the best place
696      is after some other test for an explicit code and our mode or after
697      the last test in the previous mode if every test in our mode is for
698      an unknown code.
699
700      If we are testing for UNKNOWN, then the next best case is at the end of
701      our mode.  */
702
703   if ((code != UNKNOWN
704        && ((p_mode == mode && p->code != UNKNOWN)
705            || (p_mode != mode && p->next
706                && (p->next->enforce_mode ? p->next->mode : VOIDmode) == mode
707                && (p->next->code == UNKNOWN))))
708       || (code == UNKNOWN && p_mode == mode
709           && (p->next == 0
710               || (p->next->enforce_mode ? p->next->mode : VOIDmode) != mode)))
711     return 1;
712
713   /* The third best case occurs when nothing is testing MODE.  If MODE
714      is not VOIDmode, then the third best case is after something of any
715      mode that is not VOIDmode.  If we are testing VOIDmode, the third best
716      place is the end of the list.  */
717
718   if (p_mode != mode
719       && ((mode != VOIDmode && p_mode != VOIDmode)
720           || (mode == VOIDmode && p->next == 0)))
721     return 2;
722
723   /* Otherwise, we have the worst case.  */
724   return 3;
725 }
726 \f
727 /* Merge two decision tree listheads OLDH and ADDH,
728    modifying OLDH destructively, and return the merged tree.  */
729
730 static struct decision_head
731 merge_trees (oldh, addh)
732      register struct decision_head oldh, addh;
733 {
734   struct decision *add, *next;
735
736   if (oldh.first == 0)
737     return addh;
738
739   if (addh.first == 0)
740     return oldh;
741
742   /* If we are adding things at different positions, something is wrong.  */
743   if (strcmp (oldh.first->position, addh.first->position))
744     abort ();
745
746   for (add = addh.first; add; add = next)
747     {
748       enum machine_mode add_mode = add->enforce_mode ? add->mode : VOIDmode;
749       struct decision *best_position = 0;
750       int best_merit = 4;
751       struct decision *old;
752
753       next = add->next;
754
755       /* The semantics of pattern matching state that the tests are done in
756          the order given in the MD file so that if an insn matches two
757          patterns, the first one will be used.  However, in practice, most,
758          if not all, patterns are unambiguous so that their order is 
759          independent.  In that case, we can merge identical tests and
760          group all similar modes and codes together.
761
762          Scan starting from the end of OLDH until we reach a point
763          where we reach the head of the list or where we pass a pattern
764          that could also be true if NEW is true.  If we find an identical
765          pattern, we can merge them.  Also, record the last node that tests
766          the same code and mode and the last one that tests just the same mode.
767
768          If we have no match, place NEW after the closest match we found.  */
769          
770       for (old = oldh.last; old; old = old->prev)
771         {
772           int our_merit;
773
774           /* If we don't have anything to test except an additional test,
775              do not consider the two nodes equal.  If we did, the test below
776              would cause an infinite recursion.  */
777           if (old->tests == 0 && old->test_elt_zero_int == 0
778               && old->test_elt_one_int == 0 && old->veclen == 0
779               && old->test_elt_zero_wide == 0
780               && old->dupno == -1 && old->mode == VOIDmode
781               && old->code == UNKNOWN
782               && (old->c_test != 0 || add->c_test != 0))
783             ;
784
785           else if ((old->tests == add->tests
786                     || (old->pred >= 0 && old->pred == add->pred)
787                     || (old->tests && add->tests
788                         && !strcmp (old->tests, add->tests)))
789                    && old->test_elt_zero_int == add->test_elt_zero_int
790                    && old->elt_zero_int == add->elt_zero_int
791                    && old->test_elt_one_int == add->test_elt_one_int
792                    && old->elt_one_int == add->elt_one_int
793                    && old->test_elt_zero_wide == add->test_elt_zero_wide
794                    && old->elt_zero_wide == add->elt_zero_wide
795                    && old->veclen == add->veclen
796                    && old->dupno == add->dupno
797                    && old->opno == add->opno
798                    && old->code == add->code
799                    && old->enforce_mode == add->enforce_mode
800                    && old->mode == add->mode)
801             {
802               /* If the additional test is not the same, split both nodes
803                  into nodes that just contain all things tested before the
804                  additional test and nodes that contain the additional test
805                  and actions when it is true.  This optimization is important
806                  because of the case where we have almost identical patterns
807                  with different tests on target flags.  */
808
809               if (old->c_test != add->c_test
810                   && ! (old->c_test && add->c_test
811                         && !strcmp (old->c_test, add->c_test)))
812                 {
813                   if (old->insn_code_number >= 0 || old->opno >= 0)
814                     {
815                       struct decision *split
816                         = (struct decision *) xmalloc (sizeof (struct decision));
817
818                       mybcopy ((char *) old, (char *) split,
819                                sizeof (struct decision));
820
821                       old->success.first = old->success.last = split;
822                       old->c_test = 0;
823                       old->opno = -1;
824                       old->insn_code_number = -1;
825                       old->num_clobbers_to_add = 0;
826
827                       split->number = next_number++;
828                       split->next = split->prev = 0;
829                       split->mode = VOIDmode;
830                       split->code = UNKNOWN;
831                       split->veclen = 0;
832                       split->test_elt_zero_int = 0;
833                       split->test_elt_one_int = 0;
834                       split->test_elt_zero_wide = 0;
835                       split->tests = 0;
836                       split->pred = -1;
837                       split->dupno = -1;
838                     }
839
840                   if (add->insn_code_number >= 0 || add->opno >= 0)
841                     {
842                       struct decision *split
843                         = (struct decision *) xmalloc (sizeof (struct decision));
844
845                       mybcopy ((char *) add, (char *) split,
846                                sizeof (struct decision));
847
848                       add->success.first = add->success.last = split;
849                       add->c_test = 0;
850                       add->opno = -1;
851                       add->insn_code_number = -1;
852                       add->num_clobbers_to_add = 0;
853
854                       split->number = next_number++;
855                       split->next = split->prev = 0;
856                       split->mode = VOIDmode;
857                       split->code = UNKNOWN;
858                       split->veclen = 0;
859                       split->test_elt_zero_int = 0;
860                       split->test_elt_one_int = 0;
861                       split->test_elt_zero_wide = 0;
862                       split->tests = 0;
863                       split->pred = -1;
864                       split->dupno = -1;
865                     }
866                 }
867
868               if (old->insn_code_number >= 0 && add->insn_code_number >= 0)
869                 {
870                   /* If one node is for a normal insn and the second is
871                      for the base insn with clobbers stripped off, the
872                      second node should be ignored.  */
873
874                   if (old->num_clobbers_to_add == 0
875                       && add->num_clobbers_to_add > 0)
876                     /* Nothing to do here.  */
877                     ;
878                   else if (old->num_clobbers_to_add > 0
879                            && add->num_clobbers_to_add == 0)
880                     {
881                       /* In this case, replace OLD with ADD.  */
882                       old->insn_code_number = add->insn_code_number;
883                       old->num_clobbers_to_add = 0;
884                     }
885                   else
886                     fatal ("Two actions at one point in tree");
887                 }
888
889               if (old->insn_code_number == -1)
890                 old->insn_code_number = add->insn_code_number;
891               old->success = merge_trees (old->success, add->success);
892               add = 0;
893               break;
894             }
895
896           /* Unless we have already found the best possible insert point,
897              see if this position is better.  If so, record it.  */
898
899           if (best_merit != 0
900               && ((our_merit = position_merit (old, add_mode, add->code))
901                   < best_merit))
902             best_merit = our_merit, best_position = old;
903
904           if (! not_both_true (old, add, 0))
905             break;
906         }
907
908       /* If ADD was duplicate, we are done.  */
909       if (add == 0)
910         continue;
911
912       /* Otherwise, find the best place to insert ADD.  Normally this is
913          BEST_POSITION.  However, if we went all the way to the top of
914          the list, it might be better to insert at the top.  */
915
916       if (best_position == 0)
917         abort ();
918
919       if (old == 0
920           && position_merit (NULL_PTR, add_mode, add->code) < best_merit)
921         {
922           add->prev = 0;
923           add->next = oldh.first;
924           oldh.first->prev = add;
925           oldh.first = add;
926         }
927
928       else
929         {
930           add->prev = best_position;
931           add->next = best_position->next;
932           best_position->next = add;
933           if (best_position == oldh.last)
934             oldh.last = add;
935           else
936             add->next->prev = add;
937         }
938     }
939
940   return oldh;
941 }
942 \f
943 /* Count the number of subnodes of HEAD.  If the number is high enough,
944    make the first node in HEAD start a separate subroutine in the C code
945    that is generated.
946
947    TYPE gives the type of routine we are writing.
948
949    INITIAL is non-zero if this is the highest-level node.  We never write
950    it out here.  */
951
952 static int
953 break_out_subroutines (head, type, initial)
954      struct decision_head head;
955      enum routine_type type;
956      int initial;
957 {
958   int size = 0;
959   struct decision *sub;
960
961   for (sub = head.first; sub; sub = sub->next)
962     size += 1 + break_out_subroutines (sub->success, type, 0);
963
964   if (size > SUBROUTINE_THRESHOLD && ! initial)
965     {
966       head.first->subroutine_number = ++next_subroutine_number;
967       write_subroutine (head.first, type);
968       size = 1;
969     }
970   return size;
971 }
972 \f
973 /* Write out a subroutine of type TYPE to do comparisons starting at node
974    TREE.  */
975
976 static void
977 write_subroutine (tree, type)
978      struct decision *tree;
979      enum routine_type type;
980 {
981   int i;
982
983   if (type == SPLIT)
984     printf ("rtx\nsplit");
985   else
986     printf ("int\nrecog");
987
988   if (tree != 0 && tree->subroutine_number > 0)
989     printf ("_%d", tree->subroutine_number);
990   else if (type == SPLIT)
991     printf ("_insns");
992
993   printf (" (x0, insn");
994   if (type == RECOG)
995     printf (", pnum_clobbers");
996
997   printf (")\n");
998   printf ("     register rtx x0;\n     rtx insn;\n");
999   if (type == RECOG)
1000     printf ("     int *pnum_clobbers;\n");
1001
1002   printf ("{\n");
1003   printf ("  register rtx *ro = &recog_operand[0];\n");
1004
1005   printf ("  register rtx ");
1006   for (i = 1; i < max_depth; i++)
1007     printf ("x%d, ", i);
1008
1009   printf ("x%d;\n", max_depth);
1010   printf ("  %s tem;\n", type == SPLIT ? "rtx" : "int");
1011   write_tree (tree, "", NULL_PTR, 1, type);
1012   printf (" ret0: return %d;\n}\n\n", type == SPLIT ? 0 : -1);
1013 }
1014 \f
1015 /* This table is used to indent the recog_* functions when we are inside
1016    conditions or switch statements.  We only support small indentations
1017    and always indent at least two spaces.  */
1018
1019 static char *indents[]
1020   = {"  ", "  ", "  ", "   ", "    ", "     ", "      ", "       ",
1021      "\t", "\t ", "\t  ", "\t   ", "\t    ", "\t     ", "\t      ",
1022      "\t\t", "\t\t ", "\t\t  ", "\t\t   ", "\t\t    ", "\t\t     "};
1023
1024 /* Write out C code to perform the decisions in TREE for a subroutine of
1025    type TYPE.  If all of the choices fail, branch to node AFTERWARD, if
1026    non-zero, otherwise return.  PREVPOS is the position of the node that
1027    branched to this test.
1028
1029    When we merged all alternatives, we tried to set up a convenient order.
1030    Specifically, tests involving the same mode are all grouped together,
1031    followed by a group that does not contain a mode test.  Within each group
1032    of the same mode, we also group tests with the same code, followed by a
1033    group that does not test a code.
1034
1035    Occasionally, we cannot arbitrarily reorder the tests so that multiple
1036    sequence of groups as described above are present.
1037
1038    We generate two nested switch statements, the outer statement for
1039    testing modes, and the inner switch for testing RTX codes.  It is
1040    not worth optimizing cases when only a small number of modes or 
1041    codes is tested, since the compiler can do that when compiling the
1042    resulting function.   We do check for when every test is the same mode
1043    or code.  */
1044
1045 static void
1046 write_tree_1 (tree, prevpos, afterward, type)
1047      struct decision *tree;
1048      char *prevpos;
1049      struct decision *afterward;
1050      enum routine_type type;
1051 {
1052   register struct decision *p, *p1;
1053   register int depth = tree ? strlen (tree->position) : 0;
1054   enum machine_mode switch_mode = VOIDmode;
1055   RTX_CODE switch_code = UNKNOWN;
1056   int uncond = 0;
1057   char modemap[NUM_MACHINE_MODES];
1058   char codemap[NUM_RTX_CODE];
1059   int indent = 2;
1060   int i;
1061
1062   /* One tricky area is what is the exact state when we branch to a
1063      node's label.  There are two cases where we branch: when looking at
1064      successors to a node, or when a set of tests fails.
1065
1066      In the former case, we are always branching to the first node in a
1067      decision list and we want all required tests to be performed.  We
1068      put the labels for such nodes in front of any switch or test statements.
1069      These branches are done without updating the position to that of the
1070      target node.
1071
1072      In the latter case, we are branching to a node that is not the first
1073      node in a decision list.  We have already checked that it is possible
1074      for both the node we originally tested at this level and the node we
1075      are branching to to be both match some pattern.  That means that they
1076      usually will be testing the same mode and code.  So it is normally safe
1077      for such labels to be inside switch statements, since the tests done
1078      by virtue of arriving at that label will usually already have been
1079      done.  The exception is a branch from a node that does not test a
1080      mode or code to one that does.  In such cases, we set the `retest_mode'
1081      or `retest_code' flags.  That will ensure that we start a new switch
1082      at that position and put the label before the switch. 
1083
1084      The branches in the latter case must set the position to that of the
1085      target node.  */
1086
1087
1088   printf ("\n");
1089   if (tree && tree->subroutine_number == 0)
1090     {
1091       printf ("  L%d:\n", tree->number);
1092       tree->label_needed = 0;
1093     }
1094
1095   if (tree)
1096     {
1097       change_state (prevpos, tree->position, 2);
1098       prevpos = tree->position;
1099     }
1100
1101   for (p = tree; p; p = p->next)
1102     {
1103       enum machine_mode mode = p->enforce_mode ? p->mode : VOIDmode;
1104       int need_bracket;
1105       int wrote_bracket = 0;
1106       int inner_indent;
1107
1108       if (p->success.first == 0 && p->insn_code_number < 0)
1109         abort ();
1110
1111       /* Find the next alternative to p that might be true when p is true.
1112          Test that one next if p's successors fail.  */
1113
1114       for (p1 = p->next; p1 && not_both_true (p, p1, 1); p1 = p1->next)
1115         ;
1116       p->afterward = p1;
1117
1118       if (p1)
1119         {
1120           if (mode == VOIDmode && p1->enforce_mode && p1->mode != VOIDmode)
1121             p1->retest_mode = 1;
1122           if (p->code == UNKNOWN && p1->code != UNKNOWN)
1123             p1->retest_code = 1;
1124           p1->label_needed = 1;
1125         }
1126
1127       /* If we have a different code or mode than the last node and
1128          are in a switch on codes, we must either end the switch or
1129          go to another case.  We must also end the switch if this
1130          node needs a label and to retest either the mode or code.  */
1131
1132       if (switch_code != UNKNOWN
1133           && (switch_code != p->code || switch_mode != mode
1134               || (p->label_needed && (p->retest_mode || p->retest_code))))
1135         {
1136           enum rtx_code code = p->code;
1137
1138           /* If P is testing a predicate that we know about and we haven't
1139              seen any of the codes that are valid for the predicate, we
1140              can write a series of "case" statement, one for each possible
1141              code.  Since we are already in a switch, these redundant tests
1142              are very cheap and will reduce the number of predicate called.  */
1143
1144           if (p->pred >= 0)
1145             {
1146               for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1147                 if (codemap[(int) preds[p->pred].codes[i]])
1148                   break;
1149
1150               if (preds[p->pred].codes[i] == 0)
1151                 code = MATCH_OPERAND;
1152             }
1153
1154           if (code == UNKNOWN || codemap[(int) code]
1155               || switch_mode != mode
1156               || (p->label_needed && (p->retest_mode || p->retest_code)))
1157             {
1158               printf ("%s}\n", indents[indent - 2]);
1159               switch_code = UNKNOWN;
1160               indent -= 4;
1161             }
1162           else
1163             {
1164               if (! uncond)
1165                 printf ("%sbreak;\n", indents[indent]);
1166
1167               if (code == MATCH_OPERAND)
1168                 {
1169                   for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1170                     {
1171                       printf ("%scase ", indents[indent - 2]);
1172                       print_code (preds[p->pred].codes[i]);
1173                       printf (":\n");
1174                       codemap[(int) preds[p->pred].codes[i]] = 1;
1175                     }
1176                 }
1177               else
1178                 {
1179                   printf ("%scase ", indents[indent - 2]);
1180                   print_code (code);
1181                   printf (":\n");
1182                   codemap[(int) p->code] = 1;
1183                 }
1184
1185               switch_code = code;
1186             }
1187
1188           uncond = 0;
1189         }
1190
1191       /* If we were previously in a switch on modes and now have a different
1192          mode, end at least the case, and maybe end the switch if we are
1193          not testing a mode or testing a mode whose case we already saw.  */
1194
1195       if (switch_mode != VOIDmode
1196           && (switch_mode != mode || (p->label_needed && p->retest_mode)))
1197         {
1198           if (mode == VOIDmode || modemap[(int) mode]
1199               || (p->label_needed && p->retest_mode))
1200             {
1201               printf ("%s}\n", indents[indent - 2]);
1202               switch_mode = VOIDmode;
1203               indent -= 4;
1204             }
1205           else
1206             {
1207               if (! uncond)
1208                 printf ("      break;\n");
1209               printf ("    case %smode:\n", GET_MODE_NAME (mode));
1210               switch_mode = mode;
1211               modemap[(int) mode] = 1;
1212             }
1213
1214           uncond = 0;
1215         }
1216
1217       /* If we are about to write dead code, something went wrong.  */
1218       if (! p->label_needed && uncond)
1219         abort ();
1220
1221       /* If we need a label and we will want to retest the mode or code at
1222          that label, write the label now.  We have already ensured that
1223          things will be valid for the test.  */
1224
1225       if (p->label_needed && (p->retest_mode || p->retest_code))
1226         {
1227           printf ("%sL%d:\n", indents[indent - 2], p->number);
1228           p->label_needed = 0;
1229         }
1230
1231       uncond = 0;
1232
1233       /* If we are not in any switches, see if we can shortcut things
1234          by checking for identical modes and codes.  */
1235
1236       if (switch_mode == VOIDmode && switch_code == UNKNOWN)
1237         {
1238           /* If p and its alternatives all want the same mode,
1239              reject all others at once, first, then ignore the mode.  */
1240
1241           if (mode != VOIDmode && p->next && same_modes (p, mode))
1242             {
1243               printf ("  if (GET_MODE (x%d) != %smode)\n",
1244                       depth, GET_MODE_NAME (p->mode));
1245               if (afterward)
1246                 {
1247                   printf ("    {\n");
1248                   change_state (p->position, afterward->position, 6);
1249                   printf ("      goto L%d;\n    }\n", afterward->number);
1250                 }
1251               else
1252                 printf ("    goto ret0;\n");
1253               clear_modes (p);
1254               mode = VOIDmode;
1255             }
1256
1257           /* If p and its alternatives all want the same code,
1258              reject all others at once, first, then ignore the code.  */
1259
1260           if (p->code != UNKNOWN && p->next && same_codes (p, p->code))
1261             {
1262               printf ("  if (GET_CODE (x%d) != ", depth);
1263               print_code (p->code);
1264               printf (")\n");
1265               if (afterward)
1266                 {
1267                   printf ("    {\n");
1268                   change_state (p->position, afterward->position, indent + 4);
1269                   printf ("    goto L%d;\n    }\n", afterward->number);
1270                 }
1271               else
1272                 printf ("    goto ret0;\n");
1273               clear_codes (p);
1274             }
1275         }
1276
1277       /* If we are not in a mode switch and we are testing for a specific
1278          mode, start a mode switch unless we have just one node or the next
1279          node is not testing a mode (we have already tested for the case of
1280          more than one mode, but all of the same mode).  */
1281
1282       if (switch_mode == VOIDmode && mode != VOIDmode && p->next != 0
1283           && p->next->enforce_mode && p->next->mode != VOIDmode)
1284         {
1285           mybzero (modemap, sizeof modemap);
1286           printf ("%sswitch (GET_MODE (x%d))\n", indents[indent], depth);
1287           printf ("%s{\n", indents[indent + 2]);
1288           indent += 4;
1289           printf ("%scase %smode:\n", indents[indent - 2],
1290                   GET_MODE_NAME (mode));
1291           modemap[(int) mode] = 1;
1292           switch_mode = mode;
1293         }
1294
1295       /* Similarly for testing codes.  */
1296
1297       if (switch_code == UNKNOWN && p->code != UNKNOWN && ! p->ignore_code
1298           && p->next != 0 && p->next->code != UNKNOWN)
1299         {
1300           mybzero (codemap, sizeof codemap);
1301           printf ("%sswitch (GET_CODE (x%d))\n", indents[indent], depth);
1302           printf ("%s{\n", indents[indent + 2]);
1303           indent += 4;
1304           printf ("%scase ", indents[indent - 2]);
1305           print_code (p->code);
1306           printf (":\n");
1307           codemap[(int) p->code] = 1;
1308           switch_code = p->code;
1309         }
1310
1311       /* Now that most mode and code tests have been done, we can write out
1312          a label for an inner node, if we haven't already.  */
1313       if (p->label_needed)
1314         printf ("%sL%d:\n", indents[indent - 2], p->number);
1315
1316       inner_indent = indent;
1317
1318       /* The only way we can have to do a mode or code test here is if
1319          this node needs such a test but is the only node to be tested.
1320          In that case, we won't have started a switch.  Note that this is
1321          the only way the switch and test modes can disagree.  */
1322
1323       if ((mode != switch_mode && ! p->ignore_mode)
1324           || (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1325           || p->test_elt_zero_int || p->test_elt_one_int
1326           || p->test_elt_zero_wide || p->veclen
1327           || p->dupno >= 0 || p->tests || p->num_clobbers_to_add)
1328         {
1329           printf ("%sif (", indents[indent]);
1330
1331           if (mode != switch_mode && ! p->ignore_mode)
1332             printf ("GET_MODE (x%d) == %smode && ",
1333                     depth, GET_MODE_NAME (mode));
1334           if (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1335             {
1336               printf ("GET_CODE (x%d) == ", depth);
1337               print_code (p->code);
1338               printf (" && ");
1339             }
1340
1341           if (p->test_elt_zero_int)
1342             printf ("XINT (x%d, 0) == %d && ", depth, p->elt_zero_int);
1343           if (p->test_elt_one_int)
1344             printf ("XINT (x%d, 1) == %d && ", depth, p->elt_one_int);
1345           if (p->test_elt_zero_wide)
1346             {
1347               /* Set offset to 1 iff the number might get propagated to
1348                  unsigned long by ANSI C rules, else 0.
1349                  Prospective hosts are required to have at least 32 bit
1350                  ints, and integer constants in machine descriptions
1351                  must fit in 32 bit, thus it suffices to check only
1352                  for 1 << 31 .  */
1353               HOST_WIDE_INT offset = p->elt_zero_wide == -2147483647 - 1;
1354               printf (
1355 #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1356                        "XWINT (x%d, 0) == %d%s && ",
1357 #else
1358                        "XWINT (x%d, 0) == %ld%s && ",
1359 #endif
1360                        depth, p->elt_zero_wide + offset, offset ? "-1" : "");
1361             }
1362           if (p->veclen)
1363             printf ("XVECLEN (x%d, 0) == %d && ", depth, p->veclen);
1364           if (p->dupno >= 0)
1365             printf ("rtx_equal_p (x%d, ro[%d]) && ", depth, p->dupno);
1366           if (p->num_clobbers_to_add)
1367             printf ("pnum_clobbers != 0 && ");
1368           if (p->tests)
1369             printf ("%s (x%d, %smode)", p->tests, depth,
1370                     GET_MODE_NAME (p->mode));
1371           else
1372             printf ("1");
1373
1374           printf (")\n");
1375           inner_indent += 2;
1376         }
1377       else
1378         uncond = 1;
1379
1380       need_bracket = ! uncond;
1381
1382       if (p->opno >= 0)
1383         {
1384           if (need_bracket)
1385             {
1386               printf ("%s{\n", indents[inner_indent]);
1387               inner_indent += 2;
1388               wrote_bracket = 1;
1389               need_bracket = 0;
1390             }
1391
1392           printf ("%sro[%d] = x%d;\n", indents[inner_indent], p->opno, depth);
1393         }
1394
1395       if (p->c_test)
1396         {
1397           printf ("%sif (%s)\n", indents[inner_indent], p->c_test);
1398           inner_indent += 2;
1399           uncond = 0;
1400           need_bracket = 1;
1401         }
1402
1403       if (p->insn_code_number >= 0)
1404         {
1405           if (type == SPLIT)
1406             printf ("%sreturn gen_split_%d (operands);\n",
1407                     indents[inner_indent], p->insn_code_number);
1408           else
1409             {
1410               if (p->num_clobbers_to_add)
1411                 {
1412                   if (need_bracket)
1413                     {
1414                       printf ("%s{\n", indents[inner_indent]);
1415                       inner_indent += 2;
1416                     }
1417
1418                   printf ("%s*pnum_clobbers = %d;\n",
1419                           indents[inner_indent], p->num_clobbers_to_add);
1420                   printf ("%sreturn %d;\n",
1421                           indents[inner_indent], p->insn_code_number);
1422
1423                   if (need_bracket)
1424                     {
1425                       inner_indent -= 2;
1426                       printf ("%s}\n", indents[inner_indent]);
1427                     }
1428                 }
1429               else
1430                 printf ("%sreturn %d;\n",
1431                         indents[inner_indent], p->insn_code_number);
1432             }
1433         }
1434       else
1435         printf ("%sgoto L%d;\n", indents[inner_indent],
1436                 p->success.first->number);
1437
1438       if (wrote_bracket)
1439         printf ("%s}\n", indents[inner_indent - 2]);
1440     }
1441
1442   /* We have now tested all alternatives.  End any switches we have open
1443      and branch to the alternative node unless we know that we can't fall
1444      through to the branch.  */
1445
1446   if (switch_code != UNKNOWN)
1447     {
1448       printf ("%s}\n", indents[indent - 2]);
1449       indent -= 4;
1450       uncond = 0;
1451     }
1452
1453   if (switch_mode != VOIDmode)
1454     {
1455       printf ("%s}\n", indents[indent - 2]);
1456       indent -= 4;
1457       uncond = 0;
1458     }
1459
1460   if (indent != 2)
1461     abort ();
1462
1463   if (uncond)
1464     return;
1465
1466   if (afterward)
1467     {
1468       change_state (prevpos, afterward->position, 2);
1469       printf ("  goto L%d;\n", afterward->number);
1470     }
1471   else
1472     printf ("  goto ret0;\n");
1473 }
1474
1475 static void
1476 print_code (code)
1477      enum rtx_code code;
1478 {
1479   register char *p1;
1480   for (p1 = GET_RTX_NAME (code); *p1; p1++)
1481     {
1482       if (*p1 >= 'a' && *p1 <= 'z')
1483         putchar (*p1 + 'A' - 'a');
1484       else
1485         putchar (*p1);
1486     }
1487 }
1488
1489 static int
1490 same_codes (p, code)
1491      register struct decision *p;
1492      register enum rtx_code code;
1493 {
1494   for (; p; p = p->next)
1495     if (p->code != code)
1496       return 0;
1497
1498   return 1;
1499 }
1500
1501 static void
1502 clear_codes (p)
1503      register struct decision *p;
1504 {
1505   for (; p; p = p->next)
1506     p->ignore_code = 1;
1507 }
1508
1509 static int
1510 same_modes (p, mode)
1511      register struct decision *p;
1512      register enum machine_mode mode;
1513 {
1514   for (; p; p = p->next)
1515     if ((p->enforce_mode ? p->mode : VOIDmode) != mode)
1516       return 0;
1517
1518   return 1;
1519 }
1520
1521 static void
1522 clear_modes (p)
1523      register struct decision *p;
1524 {
1525   for (; p; p = p->next)
1526     p->enforce_mode = 0;
1527 }
1528 \f
1529 /* Write out the decision tree starting at TREE for a subroutine of type TYPE.
1530
1531    PREVPOS is the position at the node that branched to this node.
1532
1533    INITIAL is nonzero if this is the first node we are writing in a subroutine.
1534
1535    If all nodes are false, branch to the node AFTERWARD.  */
1536
1537 static void
1538 write_tree (tree, prevpos, afterward, initial, type)
1539      struct decision *tree;
1540      char *prevpos;
1541      struct decision *afterward;
1542      int initial;
1543      enum routine_type type;
1544 {
1545   register struct decision *p;
1546   char *name_prefix = (type == SPLIT ? "split" : "recog");
1547   char *call_suffix = (type == SPLIT ? "" : ", pnum_clobbers");
1548
1549   if (! initial && tree->subroutine_number > 0)
1550     {
1551       printf (" L%d:\n", tree->number);
1552
1553       if (afterward)
1554         {
1555           printf ("  tem = %s_%d (x0, insn%s);\n",
1556                   name_prefix, tree->subroutine_number, call_suffix);
1557           if (type == SPLIT)
1558             printf ("  if (tem != 0) return tem;\n");
1559           else
1560             printf ("  if (tem >= 0) return tem;\n");
1561           change_state (tree->position, afterward->position, 2);
1562           printf ("  goto L%d;\n", afterward->number);
1563         }
1564       else
1565         printf ("  return %s_%d (x0, insn%s);\n",
1566                 name_prefix, tree->subroutine_number, call_suffix);
1567       return;
1568     }
1569
1570   write_tree_1 (tree, prevpos, afterward, type);
1571
1572   for (p = tree; p; p = p->next)
1573     if (p->success.first)
1574       write_tree (p->success.first, p->position,
1575                   p->afterward ? p->afterward : afterward, 0, type);
1576 }
1577
1578 \f
1579 /* Assuming that the state of argument is denoted by OLDPOS, take whatever
1580    actions are necessary to move to NEWPOS.
1581
1582    INDENT says how many blanks to place at the front of lines.  */
1583
1584 static void
1585 change_state (oldpos, newpos, indent)
1586      char *oldpos;
1587      char *newpos;
1588      int indent;
1589 {
1590   int odepth = strlen (oldpos);
1591   int depth = odepth;
1592   int ndepth = strlen (newpos);
1593
1594   /* Pop up as many levels as necessary.  */
1595
1596   while (strncmp (oldpos, newpos, depth))
1597     --depth;
1598
1599   /* Go down to desired level.  */
1600
1601   while (depth < ndepth)
1602     {
1603       if (newpos[depth] >= 'a' && newpos[depth] <= 'z')
1604         printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1605                 indents[indent], depth + 1, depth, newpos[depth] - 'a');
1606       else
1607         printf ("%sx%d = XEXP (x%d, %c);\n",
1608                 indents[indent], depth + 1, depth, newpos[depth]);
1609       ++depth;
1610     }
1611 }
1612 \f
1613 static char *
1614 copystr (s1)
1615      char *s1;
1616 {
1617   register char *tem;
1618
1619   if (s1 == 0)
1620     return 0;
1621
1622   tem = (char *) xmalloc (strlen (s1) + 1);
1623   strcpy (tem, s1);
1624
1625   return tem;
1626 }
1627
1628 static void
1629 mybzero (b, length)
1630      register char *b;
1631      register unsigned length;
1632 {
1633   while (length-- > 0)
1634     *b++ = 0;
1635 }
1636
1637 static void
1638 mybcopy (in, out, length)
1639      register char *in, *out;
1640      register unsigned length;
1641 {
1642   while (length-- > 0)
1643     *out++ = *in++;
1644 }
1645
1646 static char *
1647 concat (s1, s2)
1648      char *s1, *s2;
1649 {
1650   register char *tem;
1651
1652   if (s1 == 0)
1653     return s2;
1654   if (s2 == 0)
1655     return s1;
1656
1657   tem = (char *) xmalloc (strlen (s1) + strlen (s2) + 2);
1658   strcpy (tem, s1);
1659   strcat (tem, " ");
1660   strcat (tem, s2);
1661
1662   return tem;
1663 }
1664
1665 char *
1666 xrealloc (ptr, size)
1667      char *ptr;
1668      unsigned size;
1669 {
1670   char *result = (char *) realloc (ptr, size);
1671   if (!result)
1672     fatal ("virtual memory exhausted");
1673   return result;
1674 }
1675
1676 char *
1677 xmalloc (size)
1678      unsigned size;
1679 {
1680   register char *val = (char *) malloc (size);
1681
1682   if (val == 0)
1683     fatal ("virtual memory exhausted");
1684   return val;
1685 }
1686
1687 static void
1688 fatal (s)
1689      char *s;
1690 {
1691   fprintf (stderr, "genrecog: ");
1692   fprintf (stderr, s);
1693   fprintf (stderr, "\n");
1694   fprintf (stderr, "after %d definitions\n", next_index);
1695   exit (FATAL_EXIT_CODE);
1696 }
1697
1698 /* More 'friendly' abort that prints the line and file.
1699    config.h can #define abort fancy_abort if you like that sort of thing.  */
1700
1701 void
1702 fancy_abort ()
1703 {
1704   fatal ("Internal gcc abort.");
1705 }
1706 \f
1707 int
1708 main (argc, argv)
1709      int argc;
1710      char **argv;
1711 {
1712   rtx desc;
1713   struct decision_head recog_tree;
1714   struct decision_head split_tree;
1715   FILE *infile;
1716   register int c;
1717
1718   obstack_init (rtl_obstack);
1719   recog_tree.first = recog_tree.last = split_tree.first = split_tree.last = 0;
1720
1721   if (argc <= 1)
1722     fatal ("No input file name.");
1723
1724   infile = fopen (argv[1], "r");
1725   if (infile == 0)
1726     {
1727       perror (argv[1]);
1728       exit (FATAL_EXIT_CODE);
1729     }
1730
1731   init_rtl ();
1732   next_insn_code = 0;
1733   next_index = 0;
1734
1735   printf ("/* Generated automatically by the program `genrecog'\n\
1736 from the machine description file `md'.  */\n\n");
1737
1738   printf ("#include \"config.h\"\n");
1739   printf ("#include \"rtl.h\"\n");
1740   printf ("#include \"insn-config.h\"\n");
1741   printf ("#include \"recog.h\"\n");
1742   printf ("#include \"real.h\"\n");
1743   printf ("#include \"output.h\"\n");
1744   printf ("#include \"flags.h\"\n");
1745   printf ("\n");
1746
1747   /* Read the machine description.  */
1748
1749   while (1)
1750     {
1751       c = read_skip_spaces (infile);
1752       if (c == EOF)
1753         break;
1754       ungetc (c, infile);
1755
1756       desc = read_rtx (infile);
1757       if (GET_CODE (desc) == DEFINE_INSN)
1758         recog_tree = merge_trees (recog_tree,
1759                                   make_insn_sequence (desc, RECOG));
1760       else if (GET_CODE (desc) == DEFINE_SPLIT)
1761         split_tree = merge_trees (split_tree,
1762                                   make_insn_sequence (desc, SPLIT));
1763       if (GET_CODE (desc) == DEFINE_PEEPHOLE
1764           || GET_CODE (desc) == DEFINE_EXPAND)
1765         next_insn_code++;
1766       next_index++;
1767     }
1768
1769   printf ("\n\
1770 /* `recog' contains a decision tree\n\
1771    that recognizes whether the rtx X0 is a valid instruction.\n\
1772 \n\
1773    recog returns -1 if the rtx is not valid.\n\
1774    If the rtx is valid, recog returns a nonnegative number\n\
1775    which is the insn code number for the pattern that matched.\n");
1776   printf ("   This is the same as the order in the machine description of\n\
1777    the entry that matched.  This number can be used as an index into\n\
1778    entry that matched.  This number can be used as an index into various\n\
1779    insn_* tables, such as insn_templates, insn_outfun, and insn_n_operands\n\
1780    (found in insn-output.c).\n\n");
1781   printf ("   The third argument to recog is an optional pointer to an int.\n\
1782    If present, recog will accept a pattern if it matches except for\n\
1783    missing CLOBBER expressions at the end.  In that case, the value\n\
1784    pointed to by the optional pointer will be set to the number of\n\
1785    CLOBBERs that need to be added (it should be initialized to zero by\n\
1786    the caller).  If it is set nonzero, the caller should allocate a\n\
1787    PARALLEL of the appropriate size, copy the initial entries, and call\n\
1788    add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.");
1789
1790   if (split_tree.first)
1791     printf ("\n\n   The function split_insns returns 0 if the rtl could not\n\
1792    be split or the split rtl in a SEQUENCE if it can be.");
1793
1794   printf ("*/\n\n");
1795
1796   printf ("rtx recog_operand[MAX_RECOG_OPERANDS];\n\n");
1797   printf ("rtx *recog_operand_loc[MAX_RECOG_OPERANDS];\n\n");
1798   printf ("rtx *recog_dup_loc[MAX_DUP_OPERANDS];\n\n");
1799   printf ("char recog_dup_num[MAX_DUP_OPERANDS];\n\n");
1800   printf ("#define operands recog_operand\n\n");
1801
1802   next_subroutine_number = 0;
1803   break_out_subroutines (recog_tree, RECOG, 1);
1804   write_subroutine (recog_tree.first, RECOG);
1805
1806   next_subroutine_number = 0;
1807   break_out_subroutines (split_tree, SPLIT, 1);
1808   write_subroutine (split_tree.first, SPLIT);
1809
1810   fflush (stdout);
1811   exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
1812   /* NOTREACHED */
1813   return 0;
1814 }