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

Revision 8834, 53.7 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, 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, 1995 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
513  fmt = GET_RTX_FORMAT (code);
514  len = GET_RTX_LENGTH (code);
515  for (i = 0; i < len; i++)
516    {
517      newpos[depth] = '0' + i;
518      if (fmt[i] == 'e' || fmt[i] == 'u')
519        new = add_to_sequence (XEXP (pattern, i), &new->success, newpos);
520      else if (fmt[i] == 'i' && i == 0)
521        {
522          this->test_elt_zero_int = 1;
523          this->elt_zero_int = XINT (pattern, i);
524        }
525      else if (fmt[i] == 'i' && i == 1)
526        {
527          this->test_elt_one_int = 1;
528          this->elt_one_int = XINT (pattern, i);
529        }
530      else if (fmt[i] == 'w' && i == 0)
531        {
532          this->test_elt_zero_wide = 1;
533          this->elt_zero_wide = XWINT (pattern, i);
534        }
535      else if (fmt[i] == 'E')
536        {
537          register int j;
538          /* We do not handle a vector appearing as other than
539             the first item, just because nothing uses them
540             and by handling only the special case
541             we can use one element in newpos for either
542             the item number of a subexpression
543             or the element number in a vector.  */
544          if (i != 0)
545            abort ();
546          this->veclen = XVECLEN (pattern, i);
547          for (j = 0; j < XVECLEN (pattern, i); j++)
548            {
549              newpos[depth] = 'a' + j;
550              new = add_to_sequence (XVECEXP (pattern, i, j),
551                                     &new->success, newpos);
552            }
553        }
554      else if (fmt[i] != '0')
555        abort ();
556    }
557  return new;
558}
559
560/* Return 1 if we can prove that there is no RTL that can match both
561   D1 and D2.  Otherwise, return 0 (it may be that there is an RTL that
562   can match both or just that we couldn't prove there wasn't such an RTL).
563
564   TOPLEVEL is non-zero if we are to only look at the top level and not
565   recursively descend.  */
566
567static int
568not_both_true (d1, d2, toplevel)
569     struct decision *d1, *d2;
570     int toplevel;
571{
572  struct decision *p1, *p2;
573
574  /* If they are both to test modes and the modes are different, they aren't
575     both true.  Similarly for codes, integer elements, and vector lengths. */
576
577  if ((d1->enforce_mode && d2->enforce_mode
578       && d1->mode != VOIDmode && d2->mode != VOIDmode && d1->mode != d2->mode)
579      || (d1->code != UNKNOWN && d2->code != UNKNOWN && d1->code != d2->code)
580      || (d1->test_elt_zero_int && d2->test_elt_zero_int
581          && d1->elt_zero_int != d2->elt_zero_int)
582      || (d1->test_elt_one_int && d2->test_elt_one_int
583          && d1->elt_one_int != d2->elt_one_int)
584      || (d1->test_elt_zero_wide && d2->test_elt_zero_wide
585          && d1->elt_zero_wide != d2->elt_zero_wide)
586      || (d1->veclen && d2->veclen && d1->veclen != d2->veclen))
587    return 1;
588
589  /* If either is a wild-card MATCH_OPERAND without a predicate, it can match
590     absolutely anything, so we can't say that no intersection is possible.
591     This case is detected by having a zero TESTS field with a code of
592     UNKNOWN.  */
593
594  if ((d1->tests == 0 && d1->code == UNKNOWN)
595      || (d2->tests == 0 && d2->code == UNKNOWN))
596    return 0;
597
598  /* If either has a predicate that we know something about, set things up so
599     that D1 is the one that always has a known predicate.  Then see if they
600     have any codes in common.  */
601
602  if (d1->pred >= 0 || d2->pred >= 0)
603    {
604      int i, j;
605
606      if (d2->pred >= 0)
607        p1 = d1, d1 = d2, d2 = p1;
608
609      /* If D2 tests an explicit code, see if it is in the list of valid codes
610         for D1's predicate.  */
611      if (d2->code != UNKNOWN)
612        {
613          for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
614            if (preds[d1->pred].codes[i] == d2->code)
615              break;
616
617          if (preds[d1->pred].codes[i] == 0)
618            return 1;
619        }
620
621      /* Otherwise see if the predicates have any codes in common.  */
622
623      else if (d2->pred >= 0)
624        {
625          for (i = 0; i < NUM_RTX_CODE && preds[d1->pred].codes[i] != 0; i++)
626            {
627              for (j = 0; j < NUM_RTX_CODE; j++)
628                if (preds[d2->pred].codes[j] == 0
629                    || preds[d2->pred].codes[j] == preds[d1->pred].codes[i])
630                  break;
631
632              if (preds[d2->pred].codes[j] != 0)
633                break;
634            }
635
636          if (preds[d1->pred].codes[i] == 0)
637            return 1;
638        }
639    }
640
641  /* If we got here, we can't prove that D1 and D2 cannot both be true.
642     If we are only to check the top level, return 0.  Otherwise, see if
643     we can prove that all choices in both successors are mutually
644     exclusive.  If either does not have any successors, we can't prove
645     they can't both be true.  */
646
647  if (toplevel || d1->success.first == 0 || d2->success.first == 0)
648    return 0;
649
650  for (p1 = d1->success.first; p1; p1 = p1->next)
651    for (p2 = d2->success.first; p2; p2 = p2->next)
652      if (! not_both_true (p1, p2, 0))
653        return 0;
654
655  return 1;
656}
657
658/* Assuming that we can reorder all the alternatives at a specific point in
659   the tree (see discussion in merge_trees), we would prefer an ordering of
660   nodes where groups of consecutive nodes test the same mode and, within each
661   mode, groups of nodes test the same code.  With this order, we can
662   construct nested switch statements, the inner one to test the code and
663   the outer one to test the mode.
664
665   We would like to list nodes testing for specific codes before those
666   that test predicates to avoid unnecessary function calls.  Similarly,
667   tests for specific modes should precede nodes that allow any mode.
668
669   This function returns the merit (with 0 being the best) of inserting
670   a test involving the specified MODE and CODE after node P.  If P is
671   zero, we are to determine the merit of inserting the test at the front
672   of the list.  */
673
674static int
675position_merit (p, mode, code)
676     struct decision *p;
677     enum machine_mode mode;
678     enum rtx_code code;
679{
680  enum machine_mode p_mode;
681
682  /* The only time the front of the list is anything other than the worst
683     position is if we are testing a mode that isn't VOIDmode.  */
684  if (p == 0)
685    return mode == VOIDmode ? 3 : 2;
686
687  p_mode = p->enforce_mode ? p->mode : VOIDmode;
688
689  /* The best case is if the codes and modes both match.  */
690  if (p_mode == mode && p->code== code)
691    return 0;
692
693  /* If the codes don't match, the next best case is if the modes match.
694     In that case, the best position for this node depends on whether
695     we are testing for a specific code or not.  If we are, the best place
696     is after some other test for an explicit code and our mode or after
697     the last test in the previous mode if every test in our mode is for
698     an unknown code.
699
700     If we are testing for UNKNOWN, then the next best case is at the end of
701     our mode.  */
702
703  if ((code != UNKNOWN
704       && ((p_mode == mode && p->code != UNKNOWN)
705           || (p_mode != mode && p->next
706               && (p->next->enforce_mode ? p->next->mode : VOIDmode) == mode
707               && (p->next->code == UNKNOWN))))
708      || (code == UNKNOWN && p_mode == mode
709          && (p->next == 0
710              || (p->next->enforce_mode ? p->next->mode : VOIDmode) != mode)))
711    return 1;
712
713  /* The third best case occurs when nothing is testing MODE.  If MODE
714     is not VOIDmode, then the third best case is after something of any
715     mode that is not VOIDmode.  If we are testing VOIDmode, the third best
716     place is the end of the list.  */
717
718  if (p_mode != mode
719      && ((mode != VOIDmode && p_mode != VOIDmode)
720          || (mode == VOIDmode && p->next == 0)))
721    return 2;
722
723  /* Otherwise, we have the worst case.  */
724  return 3;
725}
726
727/* Merge two decision tree listheads OLDH and ADDH,
728   modifying OLDH destructively, and return the merged tree.  */
729
730static struct decision_head
731merge_trees (oldh, addh)
732     register struct decision_head oldh, addh;
733{
734  struct decision *add, *next;
735
736  if (oldh.first == 0)
737    return addh;
738
739  if (addh.first == 0)
740    return oldh;
741
742  /* If we are adding things at different positions, something is wrong.  */
743  if (strcmp (oldh.first->position, addh.first->position))
744    abort ();
745
746  for (add = addh.first; add; add = next)
747    {
748      enum machine_mode add_mode = add->enforce_mode ? add->mode : VOIDmode;
749      struct decision *best_position = 0;
750      int best_merit = 4;
751      struct decision *old;
752
753      next = add->next;
754
755      /* The semantics of pattern matching state that the tests are done in
756         the order given in the MD file so that if an insn matches two
757         patterns, the first one will be used.  However, in practice, most,
758         if not all, patterns are unambiguous so that their order is
759         independent.  In that case, we can merge identical tests and
760         group all similar modes and codes together.
761
762         Scan starting from the end of OLDH until we reach a point
763         where we reach the head of the list or where we pass a pattern
764         that could also be true if NEW is true.  If we find an identical
765         pattern, we can merge them.  Also, record the last node that tests
766         the same code and mode and the last one that tests just the same mode.
767
768         If we have no match, place NEW after the closest match we found.  */
769         
770      for (old = oldh.last; old; old = old->prev)
771        {
772          int our_merit;
773
774          /* If we don't have anything to test except an additional test,
775             do not consider the two nodes equal.  If we did, the test below
776             would cause an infinite recursion.  */
777          if (old->tests == 0 && old->test_elt_zero_int == 0
778              && old->test_elt_one_int == 0 && old->veclen == 0
779              && old->test_elt_zero_wide == 0
780              && old->dupno == -1 && old->mode == VOIDmode
781              && old->code == UNKNOWN
782              && (old->c_test != 0 || add->c_test != 0))
783            ;
784
785          else if ((old->tests == add->tests
786                    || (old->pred >= 0 && old->pred == add->pred)
787                    || (old->tests && add->tests
788                        && !strcmp (old->tests, add->tests)))
789                   && old->test_elt_zero_int == add->test_elt_zero_int
790                   && old->elt_zero_int == add->elt_zero_int
791                   && old->test_elt_one_int == add->test_elt_one_int
792                   && old->elt_one_int == add->elt_one_int
793                   && old->test_elt_zero_wide == add->test_elt_zero_wide
794                   && old->elt_zero_wide == add->elt_zero_wide
795                   && old->veclen == add->veclen
796                   && old->dupno == add->dupno
797                   && old->opno == add->opno
798                   && old->code == add->code
799                   && old->enforce_mode == add->enforce_mode
800                   && old->mode == add->mode)
801            {
802              /* If the additional test is not the same, split both nodes
803                 into nodes that just contain all things tested before the
804                 additional test and nodes that contain the additional test
805                 and actions when it is true.  This optimization is important
806                 because of the case where we have almost identical patterns
807                 with different tests on target flags.  */
808
809              if (old->c_test != add->c_test
810                  && ! (old->c_test && add->c_test
811                        && !strcmp (old->c_test, add->c_test)))
812                {
813                  if (old->insn_code_number >= 0 || old->opno >= 0)
814                    {
815                      struct decision *split
816                        = (struct decision *) xmalloc (sizeof (struct decision));
817
818                      mybcopy ((char *) old, (char *) split,
819                               sizeof (struct decision));
820
821                      old->success.first = old->success.last = split;
822                      old->c_test = 0;
823                      old->opno = -1;
824                      old->insn_code_number = -1;
825                      old->num_clobbers_to_add = 0;
826
827                      split->number = next_number++;
828                      split->next = split->prev = 0;
829                      split->mode = VOIDmode;
830                      split->code = UNKNOWN;
831                      split->veclen = 0;
832                      split->test_elt_zero_int = 0;
833                      split->test_elt_one_int = 0;
834                      split->test_elt_zero_wide = 0;
835                      split->tests = 0;
836                      split->pred = -1;
837                      split->dupno = -1;
838                    }
839
840                  if (add->insn_code_number >= 0 || add->opno >= 0)
841                    {
842                      struct decision *split
843                        = (struct decision *) xmalloc (sizeof (struct decision));
844
845                      mybcopy ((char *) add, (char *) split,
846                               sizeof (struct decision));
847
848                      add->success.first = add->success.last = split;
849                      add->c_test = 0;
850                      add->opno = -1;
851                      add->insn_code_number = -1;
852                      add->num_clobbers_to_add = 0;
853
854                      split->number = next_number++;
855                      split->next = split->prev = 0;
856                      split->mode = VOIDmode;
857                      split->code = UNKNOWN;
858                      split->veclen = 0;
859                      split->test_elt_zero_int = 0;
860                      split->test_elt_one_int = 0;
861                      split->test_elt_zero_wide = 0;
862                      split->tests = 0;
863                      split->pred = -1;
864                      split->dupno = -1;
865                    }
866                }
867
868              if (old->insn_code_number >= 0 && add->insn_code_number >= 0)
869                {
870                  /* If one node is for a normal insn and the second is
871                     for the base insn with clobbers stripped off, the
872                     second node should be ignored.  */
873
874                  if (old->num_clobbers_to_add == 0
875                      && add->num_clobbers_to_add > 0)
876                    /* Nothing to do here.  */
877                    ;
878                  else if (old->num_clobbers_to_add > 0
879                           && add->num_clobbers_to_add == 0)
880                    {
881                      /* In this case, replace OLD with ADD.  */
882                      old->insn_code_number = add->insn_code_number;
883                      old->num_clobbers_to_add = 0;
884                    }
885                  else
886                    fatal ("Two actions at one point in tree");
887                }
888
889              if (old->insn_code_number == -1)
890                old->insn_code_number = add->insn_code_number;
891              old->success = merge_trees (old->success, add->success);
892              add = 0;
893              break;
894            }
895
896          /* Unless we have already found the best possible insert point,
897             see if this position is better.  If so, record it.  */
898
899          if (best_merit != 0
900              && ((our_merit = position_merit (old, add_mode, add->code))
901                  < best_merit))
902            best_merit = our_merit, best_position = old;
903
904          if (! not_both_true (old, add, 0))
905            break;
906        }
907
908      /* If ADD was duplicate, we are done.  */
909      if (add == 0)
910        continue;
911
912      /* Otherwise, find the best place to insert ADD.  Normally this is
913         BEST_POSITION.  However, if we went all the way to the top of
914         the list, it might be better to insert at the top.  */
915
916      if (best_position == 0)
917        abort ();
918
919      if (old == 0
920          && position_merit (NULL_PTR, add_mode, add->code) < best_merit)
921        {
922          add->prev = 0;
923          add->next = oldh.first;
924          oldh.first->prev = add;
925          oldh.first = add;
926        }
927
928      else
929        {
930          add->prev = best_position;
931          add->next = best_position->next;
932          best_position->next = add;
933          if (best_position == oldh.last)
934            oldh.last = add;
935          else
936            add->next->prev = add;
937        }
938    }
939
940  return oldh;
941}
942
943/* Count the number of subnodes of HEAD.  If the number is high enough,
944   make the first node in HEAD start a separate subroutine in the C code
945   that is generated.
946
947   TYPE gives the type of routine we are writing.
948
949   INITIAL is non-zero if this is the highest-level node.  We never write
950   it out here.  */
951
952static int
953break_out_subroutines (head, type, initial)
954     struct decision_head head;
955     enum routine_type type;
956     int initial;
957{
958  int size = 0;
959  struct decision *sub;
960
961  for (sub = head.first; sub; sub = sub->next)
962    size += 1 + break_out_subroutines (sub->success, type, 0);
963
964  if (size > SUBROUTINE_THRESHOLD && ! initial)
965    {
966      head.first->subroutine_number = ++next_subroutine_number;
967      write_subroutine (head.first, type);
968      size = 1;
969    }
970  return size;
971}
972
973/* Write out a subroutine of type TYPE to do comparisons starting at node
974   TREE.  */
975
976static void
977write_subroutine (tree, type)
978     struct decision *tree;
979     enum routine_type type;
980{
981  int i;
982
983  if (type == SPLIT)
984    printf ("rtx\nsplit");
985  else
986    printf ("int\nrecog");
987
988  if (tree != 0 && tree->subroutine_number > 0)
989    printf ("_%d", tree->subroutine_number);
990  else if (type == SPLIT)
991    printf ("_insns");
992
993  printf (" (x0, insn");
994  if (type == RECOG)
995    printf (", pnum_clobbers");
996
997  printf (")\n");
998  printf ("     register rtx x0;\n     rtx insn;\n");
999  if (type == RECOG)
1000    printf ("     int *pnum_clobbers;\n");
1001
1002  printf ("{\n");
1003  printf ("  register rtx *ro = &recog_operand[0];\n");
1004
1005  printf ("  register rtx ");
1006  for (i = 1; i < max_depth; i++)
1007    printf ("x%d, ", i);
1008
1009  printf ("x%d;\n", max_depth);
1010  printf ("  %s tem;\n", type == SPLIT ? "rtx" : "int");
1011  write_tree (tree, "", NULL_PTR, 1, type);
1012  printf (" ret0: return %d;\n}\n\n", type == SPLIT ? 0 : -1);
1013}
1014
1015/* This table is used to indent the recog_* functions when we are inside
1016   conditions or switch statements.  We only support small indentations
1017   and always indent at least two spaces.  */
1018
1019static char *indents[]
1020  = {"  ", "  ", "  ", "   ", "    ", "     ", "      ", "       ",
1021     "\t", "\t ", "\t  ", "\t   ", "\t    ", "\t     ", "\t      ",
1022     "\t\t", "\t\t ", "\t\t  ", "\t\t   ", "\t\t    ", "\t\t     "};
1023
1024/* Write out C code to perform the decisions in TREE for a subroutine of
1025   type TYPE.  If all of the choices fail, branch to node AFTERWARD, if
1026   non-zero, otherwise return.  PREVPOS is the position of the node that
1027   branched to this test.
1028
1029   When we merged all alternatives, we tried to set up a convenient order.
1030   Specifically, tests involving the same mode are all grouped together,
1031   followed by a group that does not contain a mode test.  Within each group
1032   of the same mode, we also group tests with the same code, followed by a
1033   group that does not test a code.
1034
1035   Occasionally, we cannot arbitrarily reorder the tests so that multiple
1036   sequence of groups as described above are present.
1037
1038   We generate two nested switch statements, the outer statement for
1039   testing modes, and the inner switch for testing RTX codes.  It is
1040   not worth optimizing cases when only a small number of modes or
1041   codes is tested, since the compiler can do that when compiling the
1042   resulting function.   We do check for when every test is the same mode
1043   or code.  */
1044
1045static void
1046write_tree_1 (tree, prevpos, afterward, type)
1047     struct decision *tree;
1048     char *prevpos;
1049     struct decision *afterward;
1050     enum routine_type type;
1051{
1052  register struct decision *p, *p1;
1053  register int depth = tree ? strlen (tree->position) : 0;
1054  enum machine_mode switch_mode = VOIDmode;
1055  RTX_CODE switch_code = UNKNOWN;
1056  int uncond = 0;
1057  char modemap[NUM_MACHINE_MODES];
1058  char codemap[NUM_RTX_CODE];
1059  int indent = 2;
1060  int i;
1061
1062  /* One tricky area is what is the exact state when we branch to a
1063     node's label.  There are two cases where we branch: when looking at
1064     successors to a node, or when a set of tests fails.
1065
1066     In the former case, we are always branching to the first node in a
1067     decision list and we want all required tests to be performed.  We
1068     put the labels for such nodes in front of any switch or test statements.
1069     These branches are done without updating the position to that of the
1070     target node.
1071
1072     In the latter case, we are branching to a node that is not the first
1073     node in a decision list.  We have already checked that it is possible
1074     for both the node we originally tested at this level and the node we
1075     are branching to to be both match some pattern.  That means that they
1076     usually will be testing the same mode and code.  So it is normally safe
1077     for such labels to be inside switch statements, since the tests done
1078     by virtue of arriving at that label will usually already have been
1079     done.  The exception is a branch from a node that does not test a
1080     mode or code to one that does.  In such cases, we set the `retest_mode'
1081     or `retest_code' flags.  That will ensure that we start a new switch
1082     at that position and put the label before the switch.
1083
1084     The branches in the latter case must set the position to that of the
1085     target node.  */
1086
1087
1088  printf ("\n");
1089  if (tree && tree->subroutine_number == 0)
1090    {
1091      printf ("  L%d:\n", tree->number);
1092      tree->label_needed = 0;
1093    }
1094
1095  if (tree)
1096    {
1097      change_state (prevpos, tree->position, 2);
1098      prevpos = tree->position;
1099    }
1100
1101  for (p = tree; p; p = p->next)
1102    {
1103      enum machine_mode mode = p->enforce_mode ? p->mode : VOIDmode;
1104      int need_bracket;
1105      int wrote_bracket = 0;
1106      int inner_indent;
1107
1108      if (p->success.first == 0 && p->insn_code_number < 0)
1109        abort ();
1110
1111      /* Find the next alternative to p that might be true when p is true.
1112         Test that one next if p's successors fail.  */
1113
1114      for (p1 = p->next; p1 && not_both_true (p, p1, 1); p1 = p1->next)
1115        ;
1116      p->afterward = p1;
1117
1118      if (p1)
1119        {
1120          if (mode == VOIDmode && p1->enforce_mode && p1->mode != VOIDmode)
1121            p1->retest_mode = 1;
1122          if (p->code == UNKNOWN && p1->code != UNKNOWN)
1123            p1->retest_code = 1;
1124          p1->label_needed = 1;
1125        }
1126
1127      /* If we have a different code or mode than the last node and
1128         are in a switch on codes, we must either end the switch or
1129         go to another case.  We must also end the switch if this
1130         node needs a label and to retest either the mode or code.  */
1131
1132      if (switch_code != UNKNOWN
1133          && (switch_code != p->code || switch_mode != mode
1134              || (p->label_needed && (p->retest_mode || p->retest_code))))
1135        {
1136          enum rtx_code code = p->code;
1137
1138          /* If P is testing a predicate that we know about and we haven't
1139             seen any of the codes that are valid for the predicate, we
1140             can write a series of "case" statement, one for each possible
1141             code.  Since we are already in a switch, these redundant tests
1142             are very cheap and will reduce the number of predicate called. */
1143
1144          if (p->pred >= 0)
1145            {
1146              for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1147                if (codemap[(int) preds[p->pred].codes[i]])
1148                  break;
1149
1150              if (preds[p->pred].codes[i] == 0)
1151                code = MATCH_OPERAND;
1152            }
1153
1154          if (code == UNKNOWN || codemap[(int) code]
1155              || switch_mode != mode
1156              || (p->label_needed && (p->retest_mode || p->retest_code)))
1157            {
1158              printf ("%s}\n", indents[indent - 2]);
1159              switch_code = UNKNOWN;
1160              indent -= 4;
1161            }
1162          else
1163            {
1164              if (! uncond)
1165                printf ("%sbreak;\n", indents[indent]);
1166
1167              if (code == MATCH_OPERAND)
1168                {
1169                  for (i = 0; i < NUM_RTX_CODE && preds[p->pred].codes[i] != 0; i++)
1170                    {
1171                      printf ("%scase ", indents[indent - 2]);
1172                      print_code (preds[p->pred].codes[i]);
1173                      printf (":\n");
1174                      codemap[(int) preds[p->pred].codes[i]] = 1;
1175                    }
1176                }
1177              else
1178                {
1179                  printf ("%scase ", indents[indent - 2]);
1180                  print_code (code);
1181                  printf (":\n");
1182                  codemap[(int) p->code] = 1;
1183                }
1184
1185              switch_code = code;
1186            }
1187
1188          uncond = 0;
1189        }
1190
1191      /* If we were previously in a switch on modes and now have a different
1192         mode, end at least the case, and maybe end the switch if we are
1193         not testing a mode or testing a mode whose case we already saw.  */
1194
1195      if (switch_mode != VOIDmode
1196          && (switch_mode != mode || (p->label_needed && p->retest_mode)))
1197        {
1198          if (mode == VOIDmode || modemap[(int) mode]
1199              || (p->label_needed && p->retest_mode))
1200            {
1201              printf ("%s}\n", indents[indent - 2]);
1202              switch_mode = VOIDmode;
1203              indent -= 4;
1204            }
1205          else
1206            {
1207              if (! uncond)
1208                printf ("      break;\n");
1209              printf ("    case %smode:\n", GET_MODE_NAME (mode));
1210              switch_mode = mode;
1211              modemap[(int) mode] = 1;
1212            }
1213
1214          uncond = 0;
1215        }
1216
1217      /* If we are about to write dead code, something went wrong.  */
1218      if (! p->label_needed && uncond)
1219        abort ();
1220
1221      /* If we need a label and we will want to retest the mode or code at
1222         that label, write the label now.  We have already ensured that
1223         things will be valid for the test.  */
1224
1225      if (p->label_needed && (p->retest_mode || p->retest_code))
1226        {
1227          printf ("%sL%d:\n", indents[indent - 2], p->number);
1228          p->label_needed = 0;
1229        }
1230
1231      uncond = 0;
1232
1233      /* If we are not in any switches, see if we can shortcut things
1234         by checking for identical modes and codes.  */
1235
1236      if (switch_mode == VOIDmode && switch_code == UNKNOWN)
1237        {
1238          /* If p and its alternatives all want the same mode,
1239             reject all others at once, first, then ignore the mode.  */
1240
1241          if (mode != VOIDmode && p->next && same_modes (p, mode))
1242            {
1243              printf ("  if (GET_MODE (x%d) != %smode)\n",
1244                      depth, GET_MODE_NAME (p->mode));
1245              if (afterward)
1246                {
1247                  printf ("    {\n");
1248                  change_state (p->position, afterward->position, 6);
1249                  printf ("      goto L%d;\n    }\n", afterward->number);
1250                }
1251              else
1252                printf ("    goto ret0;\n");
1253              clear_modes (p);
1254              mode = VOIDmode;
1255            }
1256
1257          /* If p and its alternatives all want the same code,
1258             reject all others at once, first, then ignore the code.  */
1259
1260          if (p->code != UNKNOWN && p->next && same_codes (p, p->code))
1261            {
1262              printf ("  if (GET_CODE (x%d) != ", depth);
1263              print_code (p->code);
1264              printf (")\n");
1265              if (afterward)
1266                {
1267                  printf ("    {\n");
1268                  change_state (p->position, afterward->position, indent + 4);
1269                  printf ("    goto L%d;\n    }\n", afterward->number);
1270                }
1271              else
1272                printf ("    goto ret0;\n");
1273              clear_codes (p);
1274            }
1275        }
1276
1277      /* If we are not in a mode switch and we are testing for a specific
1278         mode, start a mode switch unless we have just one node or the next
1279         node is not testing a mode (we have already tested for the case of
1280         more than one mode, but all of the same mode).  */
1281
1282      if (switch_mode == VOIDmode && mode != VOIDmode && p->next != 0
1283          && p->next->enforce_mode && p->next->mode != VOIDmode)
1284        {
1285          mybzero (modemap, sizeof modemap);
1286          printf ("%sswitch (GET_MODE (x%d))\n", indents[indent], depth);
1287          printf ("%s{\n", indents[indent + 2]);
1288          indent += 4;
1289          printf ("%scase %smode:\n", indents[indent - 2],
1290                  GET_MODE_NAME (mode));
1291          modemap[(int) mode] = 1;
1292          switch_mode = mode;
1293        }
1294
1295      /* Similarly for testing codes.  */
1296
1297      if (switch_code == UNKNOWN && p->code != UNKNOWN && ! p->ignore_code
1298          && p->next != 0 && p->next->code != UNKNOWN)
1299        {
1300          mybzero (codemap, sizeof codemap);
1301          printf ("%sswitch (GET_CODE (x%d))\n", indents[indent], depth);
1302          printf ("%s{\n", indents[indent + 2]);
1303          indent += 4;
1304          printf ("%scase ", indents[indent - 2]);
1305          print_code (p->code);
1306          printf (":\n");
1307          codemap[(int) p->code] = 1;
1308          switch_code = p->code;
1309        }
1310
1311      /* Now that most mode and code tests have been done, we can write out
1312         a label for an inner node, if we haven't already. */
1313      if (p->label_needed)
1314        printf ("%sL%d:\n", indents[indent - 2], p->number);
1315
1316      inner_indent = indent;
1317
1318      /* The only way we can have to do a mode or code test here is if
1319         this node needs such a test but is the only node to be tested.
1320         In that case, we won't have started a switch.  Note that this is
1321         the only way the switch and test modes can disagree.  */
1322
1323      if ((mode != switch_mode && ! p->ignore_mode)
1324          || (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1325          || p->test_elt_zero_int || p->test_elt_one_int
1326          || p->test_elt_zero_wide || p->veclen
1327          || p->dupno >= 0 || p->tests || p->num_clobbers_to_add)
1328        {
1329          printf ("%sif (", indents[indent]);
1330
1331          if (mode != switch_mode && ! p->ignore_mode)
1332            printf ("GET_MODE (x%d) == %smode && ",
1333                    depth, GET_MODE_NAME (mode));
1334          if (p->code != switch_code && p->code != UNKNOWN && ! p->ignore_code)
1335            {
1336              printf ("GET_CODE (x%d) == ", depth);
1337              print_code (p->code);
1338              printf (" && ");
1339            }
1340
1341          if (p->test_elt_zero_int)
1342            printf ("XINT (x%d, 0) == %d && ", depth, p->elt_zero_int);
1343          if (p->test_elt_one_int)
1344            printf ("XINT (x%d, 1) == %d && ", depth, p->elt_one_int);
1345          if (p->test_elt_zero_wide)
1346            {
1347              /* Set offset to 1 iff the number might get propagated to
1348                 unsigned long by ANSI C rules, else 0.
1349                 Prospective hosts are required to have at least 32 bit
1350                 ints, and integer constants in machine descriptions
1351                 must fit in 32 bit, thus it suffices to check only
1352                 for 1 << 31 .  */
1353              HOST_WIDE_INT offset = p->elt_zero_wide == -2147483647 - 1;
1354              printf (
1355#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
1356                       "XWINT (x%d, 0) == %d%s && ",
1357#else
1358                       "XWINT (x%d, 0) == %ld%s && ",
1359#endif
1360                       depth, p->elt_zero_wide + offset, offset ? "-1" : "");
1361            }
1362          if (p->veclen)
1363            printf ("XVECLEN (x%d, 0) == %d && ", depth, p->veclen);
1364          if (p->dupno >= 0)
1365            printf ("rtx_equal_p (x%d, ro[%d]) && ", depth, p->dupno);
1366          if (p->num_clobbers_to_add)
1367            printf ("pnum_clobbers != 0 && ");
1368          if (p->tests)
1369            printf ("%s (x%d, %smode)", p->tests, depth,
1370                    GET_MODE_NAME (p->mode));
1371          else
1372            printf ("1");
1373
1374          printf (")\n");
1375          inner_indent += 2;
1376        }
1377      else
1378        uncond = 1;
1379
1380      need_bracket = ! uncond;
1381
1382      if (p->opno >= 0)
1383        {
1384          if (need_bracket)
1385            {
1386              printf ("%s{\n", indents[inner_indent]);
1387              inner_indent += 2;
1388              wrote_bracket = 1;
1389              need_bracket = 0;
1390            }
1391
1392          printf ("%sro[%d] = x%d;\n", indents[inner_indent], p->opno, depth);
1393        }
1394
1395      if (p->c_test)
1396        {
1397          printf ("%sif (%s)\n", indents[inner_indent], p->c_test);
1398          inner_indent += 2;
1399          uncond = 0;
1400          need_bracket = 1;
1401        }
1402
1403      if (p->insn_code_number >= 0)
1404        {
1405          if (type == SPLIT)
1406            printf ("%sreturn gen_split_%d (operands);\n",
1407                    indents[inner_indent], p->insn_code_number);
1408          else
1409            {
1410              if (p->num_clobbers_to_add)
1411                {
1412                  if (need_bracket)
1413                    {
1414                      printf ("%s{\n", indents[inner_indent]);
1415                      inner_indent += 2;
1416                    }
1417
1418                  printf ("%s*pnum_clobbers = %d;\n",
1419                          indents[inner_indent], p->num_clobbers_to_add);
1420                  printf ("%sreturn %d;\n",
1421                          indents[inner_indent], p->insn_code_number);
1422
1423                  if (need_bracket)
1424                    {
1425                      inner_indent -= 2;
1426                      printf ("%s}\n", indents[inner_indent]);
1427                    }
1428                }
1429              else
1430                printf ("%sreturn %d;\n",
1431                        indents[inner_indent], p->insn_code_number);
1432            }
1433        }
1434      else
1435        printf ("%sgoto L%d;\n", indents[inner_indent],
1436                p->success.first->number);
1437
1438      if (wrote_bracket)
1439        printf ("%s}\n", indents[inner_indent - 2]);
1440    }
1441
1442  /* We have now tested all alternatives.  End any switches we have open
1443     and branch to the alternative node unless we know that we can't fall
1444     through to the branch.  */
1445
1446  if (switch_code != UNKNOWN)
1447    {
1448      printf ("%s}\n", indents[indent - 2]);
1449      indent -= 4;
1450      uncond = 0;
1451    }
1452
1453  if (switch_mode != VOIDmode)
1454    {
1455      printf ("%s}\n", indents[indent - 2]);
1456      indent -= 4;
1457      uncond = 0;
1458    }
1459
1460  if (indent != 2)
1461    abort ();
1462
1463  if (uncond)
1464    return;
1465
1466  if (afterward)
1467    {
1468      change_state (prevpos, afterward->position, 2);
1469      printf ("  goto L%d;\n", afterward->number);
1470    }
1471  else
1472    printf ("  goto ret0;\n");
1473}
1474
1475static void
1476print_code (code)
1477     enum rtx_code code;
1478{
1479  register char *p1;
1480  for (p1 = GET_RTX_NAME (code); *p1; p1++)
1481    {
1482      if (*p1 >= 'a' && *p1 <= 'z')
1483        putchar (*p1 + 'A' - 'a');
1484      else
1485        putchar (*p1);
1486    }
1487}
1488
1489static int
1490same_codes (p, code)
1491     register struct decision *p;
1492     register enum rtx_code code;
1493{
1494  for (; p; p = p->next)
1495    if (p->code != code)
1496      return 0;
1497
1498  return 1;
1499}
1500
1501static void
1502clear_codes (p)
1503     register struct decision *p;
1504{
1505  for (; p; p = p->next)
1506    p->ignore_code = 1;
1507}
1508
1509static int
1510same_modes (p, mode)
1511     register struct decision *p;
1512     register enum machine_mode mode;
1513{
1514  for (; p; p = p->next)
1515    if ((p->enforce_mode ? p->mode : VOIDmode) != mode)
1516      return 0;
1517
1518  return 1;
1519}
1520
1521static void
1522clear_modes (p)
1523     register struct decision *p;
1524{
1525  for (; p; p = p->next)
1526    p->enforce_mode = 0;
1527}
1528
1529/* Write out the decision tree starting at TREE for a subroutine of type TYPE.
1530
1531   PREVPOS is the position at the node that branched to this node.
1532
1533   INITIAL is nonzero if this is the first node we are writing in a subroutine.
1534
1535   If all nodes are false, branch to the node AFTERWARD.  */
1536
1537static void
1538write_tree (tree, prevpos, afterward, initial, type)
1539     struct decision *tree;
1540     char *prevpos;
1541     struct decision *afterward;
1542     int initial;
1543     enum routine_type type;
1544{
1545  register struct decision *p;
1546  char *name_prefix = (type == SPLIT ? "split" : "recog");
1547  char *call_suffix = (type == SPLIT ? "" : ", pnum_clobbers");
1548
1549  if (! initial && tree->subroutine_number > 0)
1550    {
1551      printf (" L%d:\n", tree->number);
1552
1553      if (afterward)
1554        {
1555          printf ("  tem = %s_%d (x0, insn%s);\n",
1556                  name_prefix, tree->subroutine_number, call_suffix);
1557          if (type == SPLIT)
1558            printf ("  if (tem != 0) return tem;\n");
1559          else
1560            printf ("  if (tem >= 0) return tem;\n");
1561          change_state (tree->position, afterward->position, 2);
1562          printf ("  goto L%d;\n", afterward->number);
1563        }
1564      else
1565        printf ("  return %s_%d (x0, insn%s);\n",
1566                name_prefix, tree->subroutine_number, call_suffix);
1567      return;
1568    }
1569
1570  write_tree_1 (tree, prevpos, afterward, type);
1571
1572  for (p = tree; p; p = p->next)
1573    if (p->success.first)
1574      write_tree (p->success.first, p->position,
1575                  p->afterward ? p->afterward : afterward, 0, type);
1576}
1577
1578
1579/* Assuming that the state of argument is denoted by OLDPOS, take whatever
1580   actions are necessary to move to NEWPOS.
1581
1582   INDENT says how many blanks to place at the front of lines.  */
1583
1584static void
1585change_state (oldpos, newpos, indent)
1586     char *oldpos;
1587     char *newpos;
1588     int indent;
1589{
1590  int odepth = strlen (oldpos);
1591  int depth = odepth;
1592  int ndepth = strlen (newpos);
1593
1594  /* Pop up as many levels as necessary.  */
1595
1596  while (strncmp (oldpos, newpos, depth))
1597    --depth;
1598
1599  /* Go down to desired level.  */
1600
1601  while (depth < ndepth)
1602    {
1603      if (newpos[depth] >= 'a' && newpos[depth] <= 'z')
1604        printf ("%sx%d = XVECEXP (x%d, 0, %d);\n",
1605                indents[indent], depth + 1, depth, newpos[depth] - 'a');
1606      else
1607        printf ("%sx%d = XEXP (x%d, %c);\n",
1608                indents[indent], depth + 1, depth, newpos[depth]);
1609      ++depth;
1610    }
1611}
1612
1613static char *
1614copystr (s1)
1615     char *s1;
1616{
1617  register char *tem;
1618
1619  if (s1 == 0)
1620    return 0;
1621
1622  tem = (char *) xmalloc (strlen (s1) + 1);
1623  strcpy (tem, s1);
1624
1625  return tem;
1626}
1627
1628static void
1629mybzero (b, length)
1630     register char *b;
1631     register unsigned length;
1632{
1633  while (length-- > 0)
1634    *b++ = 0;
1635}
1636
1637static void
1638mybcopy (in, out, length)
1639     register char *in, *out;
1640     register unsigned length;
1641{
1642  while (length-- > 0)
1643    *out++ = *in++;
1644}
1645
1646static char *
1647concat (s1, s2)
1648     char *s1, *s2;
1649{
1650  register char *tem;
1651
1652  if (s1 == 0)
1653    return s2;
1654  if (s2 == 0)
1655    return s1;
1656
1657  tem = (char *) xmalloc (strlen (s1) + strlen (s2) + 2);
1658  strcpy (tem, s1);
1659  strcat (tem, " ");
1660  strcat (tem, s2);
1661
1662  return tem;
1663}
1664
1665char *
1666xrealloc (ptr, size)
1667     char *ptr;
1668     unsigned size;
1669{
1670  char *result = (char *) realloc (ptr, size);
1671  if (!result)
1672    fatal ("virtual memory exhausted");
1673  return result;
1674}
1675
1676char *
1677xmalloc (size)
1678     unsigned size;
1679{
1680  register char *val = (char *) malloc (size);
1681
1682  if (val == 0)
1683    fatal ("virtual memory exhausted");
1684  return val;
1685}
1686
1687static void
1688fatal (s)
1689     char *s;
1690{
1691  fprintf (stderr, "genrecog: ");
1692  fprintf (stderr, s);
1693  fprintf (stderr, "\n");
1694  fprintf (stderr, "after %d definitions\n", next_index);
1695  exit (FATAL_EXIT_CODE);
1696}
1697
1698/* More 'friendly' abort that prints the line and file.
1699   config.h can #define abort fancy_abort if you like that sort of thing.  */
1700
1701void
1702fancy_abort ()
1703{
1704  fatal ("Internal gcc abort.");
1705}
1706
1707int
1708main (argc, argv)
1709     int argc;
1710     char **argv;
1711{
1712  rtx desc;
1713  struct decision_head recog_tree;
1714  struct decision_head split_tree;
1715  FILE *infile;
1716  register int c;
1717
1718  obstack_init (rtl_obstack);
1719  recog_tree.first = recog_tree.last = split_tree.first = split_tree.last = 0;
1720
1721  if (argc <= 1)
1722    fatal ("No input file name.");
1723
1724  infile = fopen (argv[1], "r");
1725  if (infile == 0)
1726    {
1727      perror (argv[1]);
1728      exit (FATAL_EXIT_CODE);
1729    }
1730
1731  init_rtl ();
1732  next_insn_code = 0;
1733  next_index = 0;
1734
1735  printf ("/* Generated automatically by the program `genrecog'\n\
1736from the machine description file `md'.  */\n\n");
1737
1738  printf ("#include \"config.h\"\n");
1739  printf ("#include \"rtl.h\"\n");
1740  printf ("#include \"insn-config.h\"\n");
1741  printf ("#include \"recog.h\"\n");
1742  printf ("#include \"real.h\"\n");
1743  printf ("#include \"output.h\"\n");
1744  printf ("#include \"flags.h\"\n");
1745  printf ("\n");
1746
1747  /* Read the machine description.  */
1748
1749  while (1)
1750    {
1751      c = read_skip_spaces (infile);
1752      if (c == EOF)
1753        break;
1754      ungetc (c, infile);
1755
1756      desc = read_rtx (infile);
1757      if (GET_CODE (desc) == DEFINE_INSN)
1758        recog_tree = merge_trees (recog_tree,
1759                                  make_insn_sequence (desc, RECOG));
1760      else if (GET_CODE (desc) == DEFINE_SPLIT)
1761        split_tree = merge_trees (split_tree,
1762                                  make_insn_sequence (desc, SPLIT));
1763      if (GET_CODE (desc) == DEFINE_PEEPHOLE
1764          || GET_CODE (desc) == DEFINE_EXPAND)
1765        next_insn_code++;
1766      next_index++;
1767    }
1768
1769  printf ("\n\
1770/* `recog' contains a decision tree\n\
1771   that recognizes whether the rtx X0 is a valid instruction.\n\
1772\n\
1773   recog returns -1 if the rtx is not valid.\n\
1774   If the rtx is valid, recog returns a nonnegative number\n\
1775   which is the insn code number for the pattern that matched.\n");
1776  printf ("   This is the same as the order in the machine description of\n\
1777   the entry that matched.  This number can be used as an index into\n\
1778   entry that matched.  This number can be used as an index into various\n\
1779   insn_* tables, such as insn_templates, insn_outfun, and insn_n_operands\n\
1780   (found in insn-output.c).\n\n");
1781  printf ("   The third argument to recog is an optional pointer to an int.\n\
1782   If present, recog will accept a pattern if it matches except for\n\
1783   missing CLOBBER expressions at the end.  In that case, the value\n\
1784   pointed to by the optional pointer will be set to the number of\n\
1785   CLOBBERs that need to be added (it should be initialized to zero by\n\
1786   the caller).  If it is set nonzero, the caller should allocate a\n\
1787   PARALLEL of the appropriate size, copy the initial entries, and call\n\
1788   add_clobbers (found in insn-emit.c) to fill in the CLOBBERs.");
1789
1790  if (split_tree.first)
1791    printf ("\n\n   The function split_insns returns 0 if the rtl could not\n\
1792   be split or the split rtl in a SEQUENCE if it can be.");
1793
1794  printf ("*/\n\n");
1795
1796  printf ("rtx recog_operand[MAX_RECOG_OPERANDS];\n\n");
1797  printf ("rtx *recog_operand_loc[MAX_RECOG_OPERANDS];\n\n");
1798  printf ("rtx *recog_dup_loc[MAX_DUP_OPERANDS];\n\n");
1799  printf ("char recog_dup_num[MAX_DUP_OPERANDS];\n\n");
1800  printf ("#define operands recog_operand\n\n");
1801
1802  next_subroutine_number = 0;
1803  break_out_subroutines (recog_tree, RECOG, 1);
1804  write_subroutine (recog_tree.first, RECOG);
1805
1806  next_subroutine_number = 0;
1807  break_out_subroutines (split_tree, SPLIT, 1);
1808  write_subroutine (split_tree.first, SPLIT);
1809
1810  fflush (stdout);
1811  exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
1812  /* NOTREACHED */
1813  return 0;
1814}
Note: See TracBrowser for help on using the repository browser.