OSDN Git Service

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