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