source: trunk/third/gcc/genrecog.c @ 11288

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