OSDN Git Service

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