OSDN Git Service

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