OSDN Git Service

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