OSDN Git Service

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