Annotation of gcc/genrecog.c, revision 1.1.1.7

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.