OSDN Git Service

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