Annotation of gcc/recog.c, revision 1.1.1.7

1.1       root        1: /* Subroutines used by or related to instruction recognition.
1.1.1.6   root        2:    Copyright (C) 1987, 88, 91, 92, 93, 1994 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: #include "config.h"
                     23: #include "rtl.h"
                     24: #include <stdio.h>
                     25: #include "insn-config.h"
                     26: #include "insn-attr.h"
                     27: #include "insn-flags.h"
                     28: #include "insn-codes.h"
                     29: #include "recog.h"
                     30: #include "regs.h"
                     31: #include "hard-reg-set.h"
                     32: #include "flags.h"
                     33: #include "real.h"
                     34: 
                     35: #ifndef STACK_PUSH_CODE
                     36: #ifdef STACK_GROWS_DOWNWARD
                     37: #define STACK_PUSH_CODE PRE_DEC
                     38: #else
                     39: #define STACK_PUSH_CODE PRE_INC
                     40: #endif
                     41: #endif
                     42: 
                     43: /* Import from final.c: */
                     44: extern rtx alter_subreg ();
                     45: 
                     46: int strict_memory_address_p ();
                     47: int memory_address_p ();
                     48: 
                     49: /* Nonzero means allow operands to be volatile.
                     50:    This should be 0 if you are generating rtl, such as if you are calling
                     51:    the functions in optabs.c and expmed.c (most of the time).
                     52:    This should be 1 if all valid insns need to be recognized,
                     53:    such as in regclass.c and final.c and reload.c.
                     54: 
                     55:    init_recog and init_recog_no_volatile are responsible for setting this.  */
                     56: 
                     57: int volatile_ok;
                     58: 
                     59: /* On return from `constrain_operands', indicate which alternative
                     60:    was satisfied.  */
                     61: 
                     62: int which_alternative;
                     63: 
                     64: /* Nonzero after end of reload pass.
                     65:    Set to 1 or 0 by toplev.c.
                     66:    Controls the significance of (SUBREG (MEM)).  */
                     67: 
                     68: int reload_completed;
                     69: 
                     70: /* Initialize data used by the function `recog'.
                     71:    This must be called once in the compilation of a function
                     72:    before any insn recognition may be done in the function.  */
                     73: 
                     74: void
                     75: init_recog_no_volatile ()
                     76: {
                     77:   volatile_ok = 0;
                     78: }
                     79: 
                     80: void
                     81: init_recog ()
                     82: {
                     83:   volatile_ok = 1;
                     84: }
                     85: 
                     86: /* Try recognizing the instruction INSN,
                     87:    and return the code number that results.
1.1.1.7 ! root       88:    Remember the code so that repeated calls do not
1.1       root       89:    need to spend the time for actual rerecognition.
                     90: 
                     91:    This function is the normal interface to instruction recognition.
                     92:    The automatically-generated function `recog' is normally called
                     93:    through this one.  (The only exception is in combine.c.)  */
                     94: 
                     95: int
                     96: recog_memoized (insn)
                     97:      rtx insn;
                     98: {
                     99:   if (INSN_CODE (insn) < 0)
1.1.1.4   root      100:     INSN_CODE (insn) = recog (PATTERN (insn), insn, NULL_PTR);
1.1       root      101:   return INSN_CODE (insn);
                    102: }
                    103: 
                    104: /* Check that X is an insn-body for an `asm' with operands
                    105:    and that the operands mentioned in it are legitimate.  */
                    106: 
                    107: int
                    108: check_asm_operands (x)
                    109:      rtx x;
                    110: {
                    111:   int noperands = asm_noperands (x);
                    112:   rtx *operands;
                    113:   int i;
                    114: 
                    115:   if (noperands < 0)
                    116:     return 0;
                    117:   if (noperands == 0)
                    118:     return 1;
                    119: 
                    120:   operands = (rtx *) alloca (noperands * sizeof (rtx));
1.1.1.4   root      121:   decode_asm_operands (x, operands, NULL_PTR, NULL_PTR, NULL_PTR);
1.1       root      122: 
                    123:   for (i = 0; i < noperands; i++)
                    124:     if (!general_operand (operands[i], VOIDmode))
                    125:       return 0;
                    126: 
                    127:   return 1;
                    128: }
                    129: 
                    130: /* Static data for the next two routines.
                    131: 
                    132:    The maximum number of changes supported is defined as the maximum
                    133:    number of operands times 5.  This allows for repeated substitutions
                    134:    inside complex indexed address, or, alternatively, changes in up
                    135:    to 5 insns.  */
                    136: 
                    137: #define MAX_CHANGE_LOCS        (MAX_RECOG_OPERANDS * 5)
                    138: 
                    139: static rtx change_objects[MAX_CHANGE_LOCS];
                    140: static int change_old_codes[MAX_CHANGE_LOCS];
                    141: static rtx *change_locs[MAX_CHANGE_LOCS];
                    142: static rtx change_olds[MAX_CHANGE_LOCS];
                    143: 
                    144: static int num_changes = 0;
                    145: 
                    146: /* Validate a proposed change to OBJECT.  LOC is the location in the rtl for
                    147:    at which NEW will be placed.  If OBJECT is zero, no validation is done,
                    148:    the change is simply made.
                    149: 
                    150:    Two types of objects are supported:  If OBJECT is a MEM, memory_address_p
                    151:    will be called with the address and mode as parameters.  If OBJECT is
                    152:    an INSN, CALL_INSN, or JUMP_INSN, the insn will be re-recognized with
                    153:    the change in place.
                    154: 
                    155:    IN_GROUP is non-zero if this is part of a group of changes that must be
                    156:    performed as a group.  In that case, the changes will be stored.  The
                    157:    function `apply_change_group' will validate and apply the changes.
                    158: 
                    159:    If IN_GROUP is zero, this is a single change.  Try to recognize the insn
                    160:    or validate the memory reference with the change applied.  If the result
                    161:    is not valid for the machine, suppress the change and return zero.
                    162:    Otherwise, perform the change and return 1.  */
                    163: 
                    164: int
                    165: validate_change (object, loc, new, in_group)
                    166:     rtx object;
                    167:     rtx *loc;
                    168:     rtx new;
                    169:     int in_group;
                    170: {
                    171:   rtx old = *loc;
                    172: 
                    173:   if (old == new || rtx_equal_p (old, new))
                    174:     return 1;
                    175: 
                    176:   if (num_changes >= MAX_CHANGE_LOCS
                    177:       || (in_group == 0 && num_changes != 0))
                    178:     abort ();
                    179: 
                    180:   *loc = new;
                    181: 
                    182:   /* Save the information describing this change.  */
                    183:   change_objects[num_changes] = object;
                    184:   change_locs[num_changes] = loc;
                    185:   change_olds[num_changes] = old;
                    186: 
                    187:   if (object && GET_CODE (object) != MEM)
                    188:     {
                    189:       /* Set INSN_CODE to force rerecognition of insn.  Save old code in
                    190:         case invalid.  */
                    191:       change_old_codes[num_changes] = INSN_CODE (object);
                    192:       INSN_CODE (object) = -1;
                    193:     }
                    194: 
                    195:   num_changes++;
                    196: 
                    197:   /* If we are making a group of changes, return 1.  Otherwise, validate the
                    198:      change group we made.  */
                    199: 
                    200:   if (in_group)
                    201:     return 1;
                    202:   else
                    203:     return apply_change_group ();
                    204: }
                    205: 
                    206: /* Apply a group of changes previously issued with `validate_change'.
                    207:    Return 1 if all changes are valid, zero otherwise.  */
                    208: 
                    209: int
                    210: apply_change_group ()
                    211: {
                    212:   int i;
                    213: 
                    214:   /* The changes have been applied and all INSN_CODEs have been reset to force
                    215:      rerecognition.
                    216: 
                    217:      The changes are valid if we aren't given an object, or if we are
                    218:      given a MEM and it still is a valid address, or if this is in insn
                    219:      and it is recognized.  In the latter case, if reload has completed,
                    220:      we also require that the operands meet the constraints for
                    221:      the insn.  We do not allow modifying an ASM_OPERANDS after reload
                    222:      has completed because verifying the constraints is too difficult.  */
                    223: 
                    224:   for (i = 0; i < num_changes; i++)
                    225:     {
                    226:       rtx object = change_objects[i];
                    227: 
                    228:       if (object == 0)
                    229:        continue;
                    230: 
                    231:       if (GET_CODE (object) == MEM)
                    232:        {
                    233:          if (! memory_address_p (GET_MODE (object), XEXP (object, 0)))
                    234:            break;
                    235:        }
                    236:       else if ((recog_memoized (object) < 0
                    237:                && (asm_noperands (PATTERN (object)) < 0
                    238:                    || ! check_asm_operands (PATTERN (object))
                    239:                    || reload_completed))
                    240:               || (reload_completed
                    241:                   && (insn_extract (object),
                    242:                       ! constrain_operands (INSN_CODE (object), 1))))
                    243:        {
                    244:          rtx pat = PATTERN (object);
                    245: 
                    246:          /* Perhaps we couldn't recognize the insn because there were
                    247:             extra CLOBBERs at the end.  If so, try to re-recognize
                    248:             without the last CLOBBER (later iterations will cause each of
                    249:             them to be eliminated, in turn).  But don't do this if we
                    250:             have an ASM_OPERAND.  */
                    251:          if (GET_CODE (pat) == PARALLEL
                    252:              && GET_CODE (XVECEXP (pat, 0, XVECLEN (pat, 0) - 1)) == CLOBBER
                    253:              && asm_noperands (PATTERN (object)) < 0)
                    254:            {
                    255:               rtx newpat;
                    256: 
                    257:               if (XVECLEN (pat, 0) == 2)
                    258:                 newpat = XVECEXP (pat, 0, 0);
                    259:               else
                    260:                 {
                    261:                   int j;
                    262: 
                    263:                   newpat = gen_rtx (PARALLEL, VOIDmode, 
                    264:                                     gen_rtvec (XVECLEN (pat, 0) - 1));
                    265:                   for (j = 0; j < XVECLEN (newpat, 0); j++)
                    266:                     XVECEXP (newpat, 0, j) = XVECEXP (pat, 0, j);
                    267:                 }
                    268: 
                    269:               /* Add a new change to this group to replace the pattern
                    270:                  with this new pattern.  Then consider this change
                    271:                  as having succeeded.  The change we added will
                    272:                  cause the entire call to fail if things remain invalid.
                    273: 
                    274:                  Note that this can lose if a later change than the one
                    275:                  we are processing specified &XVECEXP (PATTERN (object), 0, X)
                    276:                  but this shouldn't occur.  */
                    277: 
                    278:               validate_change (object, &PATTERN (object), newpat, 1);
                    279:             }
                    280:          else if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
                    281:            /* If this insn is a CLOBBER or USE, it is always valid, but is
                    282:               never recognized.  */
                    283:            continue;
                    284:          else
                    285:            break;
                    286:        }
                    287:     }
                    288: 
                    289:   if (i == num_changes)
                    290:     {
                    291:       num_changes = 0;
                    292:       return 1;
                    293:     }
                    294:   else
                    295:     {
                    296:       cancel_changes (0);
                    297:       return 0;
                    298:     }
                    299: }
                    300: 
                    301: /* Return the number of changes so far in the current group.   */
                    302: 
                    303: int
                    304: num_validated_changes ()
                    305: {
                    306:   return num_changes;
                    307: }
                    308: 
                    309: /* Retract the changes numbered NUM and up.  */
                    310: 
                    311: void
                    312: cancel_changes (num)
                    313:      int num;
                    314: {
                    315:   int i;
                    316: 
                    317:   /* Back out all the changes.  Do this in the opposite order in which
                    318:      they were made.  */
                    319:   for (i = num_changes - 1; i >= num; i--)
                    320:     {
                    321:       *change_locs[i] = change_olds[i];
                    322:       if (change_objects[i] && GET_CODE (change_objects[i]) != MEM)
                    323:        INSN_CODE (change_objects[i]) = change_old_codes[i];
                    324:     }
                    325:   num_changes = num;
                    326: }
                    327: 
                    328: /* Replace every occurrence of FROM in X with TO.  Mark each change with
                    329:    validate_change passing OBJECT.  */
                    330: 
                    331: static void
                    332: validate_replace_rtx_1 (loc, from, to, object)
                    333:      rtx *loc;
                    334:      rtx from, to, object;
                    335: {
                    336:   register int i, j;
                    337:   register char *fmt;
                    338:   register rtx x = *loc;
                    339:   enum rtx_code code = GET_CODE (x);
                    340: 
                    341:   /* X matches FROM if it is the same rtx or they are both referring to the
                    342:      same register in the same mode.  Avoid calling rtx_equal_p unless the
                    343:      operands look similar.  */
                    344: 
                    345:   if (x == from
                    346:       || (GET_CODE (x) == REG && GET_CODE (from) == REG
                    347:          && GET_MODE (x) == GET_MODE (from)
                    348:          && REGNO (x) == REGNO (from))
                    349:       || (GET_CODE (x) == GET_CODE (from) && GET_MODE (x) == GET_MODE (from)
                    350:          && rtx_equal_p (x, from)))
                    351:     {
                    352:       validate_change (object, loc, to, 1);
                    353:       return;
                    354:     }
                    355: 
                    356:   /* For commutative or comparison operations, try replacing each argument
                    357:      separately and seeing if we made any changes.  If so, put a constant
                    358:      argument last.*/
                    359:   if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
                    360:     {
                    361:       int prev_changes = num_changes;
                    362: 
                    363:       validate_replace_rtx_1 (&XEXP (x, 0), from, to, object);
                    364:       validate_replace_rtx_1 (&XEXP (x, 1), from, to, object);
                    365:       if (prev_changes != num_changes && CONSTANT_P (XEXP (x, 0)))
                    366:        {
                    367:          validate_change (object, loc,
                    368:                           gen_rtx (GET_RTX_CLASS (code) == 'c' ? code
                    369:                                    : swap_condition (code),
                    370:                                    GET_MODE (x), XEXP (x, 1), XEXP (x, 0)),
                    371:                           1);
                    372:          x = *loc;
                    373:          code = GET_CODE (x);
                    374:        }
                    375:     }
                    376: 
                    377:   switch (code)
                    378:     {
                    379:     case PLUS:
                    380:       /* If we have have a PLUS whose second operand is now a CONST_INT, use
                    381:         plus_constant to try to simplify it.  */
                    382:       if (GET_CODE (XEXP (x, 1)) == CONST_INT && XEXP (x, 1) == to)
                    383:        validate_change (object, loc, 
                    384:                         plus_constant (XEXP (x, 0), INTVAL (XEXP (x, 1))), 1);
                    385:       return;
                    386:       
                    387:     case ZERO_EXTEND:
                    388:     case SIGN_EXTEND:
                    389:       /* In these cases, the operation to be performed depends on the mode
                    390:         of the operand.  If we are replacing the operand with a VOIDmode
                    391:         constant, we lose the information.  So try to simplify the operation
                    392:         in that case.  If it fails, substitute in something that we know
1.1.1.3   root      393:         won't be recognized.  */
1.1       root      394:       if (GET_MODE (to) == VOIDmode
                    395:          && (XEXP (x, 0) == from
                    396:              || (GET_CODE (XEXP (x, 0)) == REG && GET_CODE (from) == REG
                    397:                  && GET_MODE (XEXP (x, 0)) == GET_MODE (from)
                    398:                  && REGNO (XEXP (x, 0)) == REGNO (from))))
                    399:        {
                    400:          rtx new = simplify_unary_operation (code, GET_MODE (x), to,
                    401:                                              GET_MODE (from));
                    402:          if (new == 0)
                    403:            new = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
                    404: 
                    405:          validate_change (object, loc, new, 1);
                    406:          return;
                    407:        }
                    408:       break;
                    409:        
                    410:     case SUBREG:
                    411:       /* If we have a SUBREG of a register that we are replacing and we are
                    412:         replacing it with a MEM, make a new MEM and try replacing the
                    413:         SUBREG with it.  Don't do this if the MEM has a mode-dependent address
                    414:         or if we would be widening it.  */
                    415: 
                    416:       if (SUBREG_REG (x) == from
                    417:          && GET_CODE (from) == REG
                    418:          && GET_CODE (to) == MEM
                    419:          && ! mode_dependent_address_p (XEXP (to, 0))
                    420:          && ! MEM_VOLATILE_P (to)
                    421:          && GET_MODE_SIZE (GET_MODE (x)) <= GET_MODE_SIZE (GET_MODE (to)))
                    422:        {
                    423:          int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
                    424:          enum machine_mode mode = GET_MODE (x);
                    425:          rtx new;
                    426: 
1.1.1.7 ! root      427:          if (BYTES_BIG_ENDIAN)
        !           428:            offset += (MIN (UNITS_PER_WORD,
        !           429:                            GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
        !           430:                       - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
1.1       root      431: 
                    432:          new = gen_rtx (MEM, mode, plus_constant (XEXP (to, 0), offset));
                    433:          MEM_VOLATILE_P (new) = MEM_VOLATILE_P (to);
                    434:          RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (to);
                    435:          MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (to);
                    436:          validate_change (object, loc, new, 1);
                    437:          return;
                    438:        }
                    439:       break;
                    440: 
                    441:     case ZERO_EXTRACT:
                    442:     case SIGN_EXTRACT:
                    443:       /* If we are replacing a register with memory, try to change the memory
                    444:         to be the mode required for memory in extract operations (this isn't
                    445:         likely to be an insertion operation; if it was, nothing bad will
                    446:         happen, we might just fail in some cases).  */
                    447: 
                    448:       if (XEXP (x, 0) == from && GET_CODE (from) == REG && GET_CODE (to) == MEM
                    449:          && GET_CODE (XEXP (x, 1)) == CONST_INT
                    450:          && GET_CODE (XEXP (x, 2)) == CONST_INT
                    451:          && ! mode_dependent_address_p (XEXP (to, 0))
                    452:          && ! MEM_VOLATILE_P (to))
                    453:        {
                    454:          enum machine_mode wanted_mode = VOIDmode;
                    455:          enum machine_mode is_mode = GET_MODE (to);
                    456:          int width = INTVAL (XEXP (x, 1));
                    457:          int pos = INTVAL (XEXP (x, 2));
                    458: 
                    459: #ifdef HAVE_extzv
                    460:          if (code == ZERO_EXTRACT)
                    461:            wanted_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
                    462: #endif
                    463: #ifdef HAVE_extv
                    464:          if (code == SIGN_EXTRACT)
                    465:            wanted_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
                    466: #endif
                    467: 
1.1.1.3   root      468:          /* If we have a narrower mode, we can do something.  */
1.1       root      469:          if (wanted_mode != VOIDmode
                    470:              && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
                    471:            {
                    472:              int offset = pos / BITS_PER_UNIT;
                    473:              rtx newmem;
                    474: 
                    475:                  /* If the bytes and bits are counted differently, we
                    476:                     must adjust the offset.  */
1.1.1.7 ! root      477:              if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
        !           478:                offset = (GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (wanted_mode)
        !           479:                          - offset);
1.1       root      480: 
                    481:              pos %= GET_MODE_BITSIZE (wanted_mode);
                    482: 
                    483:              newmem = gen_rtx (MEM, wanted_mode,
                    484:                                plus_constant (XEXP (to, 0), offset));
                    485:              RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (to);
                    486:              MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (to);
                    487:              MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (to);
                    488: 
1.1.1.4   root      489:              validate_change (object, &XEXP (x, 2), GEN_INT (pos), 1);
1.1       root      490:              validate_change (object, &XEXP (x, 0), newmem, 1);
                    491:            }
                    492:        }
                    493: 
                    494:       break;
                    495:     }
                    496:       
                    497:   fmt = GET_RTX_FORMAT (code);
                    498:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                    499:     {
                    500:       if (fmt[i] == 'e')
                    501:        validate_replace_rtx_1 (&XEXP (x, i), from, to, object);
                    502:       else if (fmt[i] == 'E')
                    503:        for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                    504:          validate_replace_rtx_1 (&XVECEXP (x, i, j), from, to, object);
                    505:     }
                    506: }
                    507: 
                    508: /* Try replacing every occurrence of FROM in INSN with TO.  After all
                    509:    changes have been made, validate by seeing if INSN is still valid.  */
                    510: 
                    511: int
                    512: validate_replace_rtx (from, to, insn)
                    513:      rtx from, to, insn;
                    514: {
                    515:   validate_replace_rtx_1 (&PATTERN (insn), from, to, insn);
                    516:   return apply_change_group ();
                    517: }
                    518: 
                    519: #ifdef HAVE_cc0
                    520: /* Return 1 if the insn using CC0 set by INSN does not contain
                    521:    any ordered tests applied to the condition codes.
                    522:    EQ and NE tests do not count.  */
                    523: 
                    524: int
                    525: next_insn_tests_no_inequality (insn)
                    526:      rtx insn;
                    527: {
                    528:   register rtx next = next_cc0_user (insn);
                    529: 
                    530:   /* If there is no next insn, we have to take the conservative choice.  */
                    531:   if (next == 0)
                    532:     return 0;
                    533: 
                    534:   return ((GET_CODE (next) == JUMP_INSN
                    535:           || GET_CODE (next) == INSN
                    536:           || GET_CODE (next) == CALL_INSN)
                    537:          && ! inequality_comparisons_p (PATTERN (next)));
                    538: }
                    539: 
                    540: #if 0  /* This is useless since the insn that sets the cc's
                    541:          must be followed immediately by the use of them.  */
                    542: /* Return 1 if the CC value set up by INSN is not used.  */
                    543: 
                    544: int
                    545: next_insns_test_no_inequality (insn)
                    546:      rtx insn;
                    547: {
                    548:   register rtx next = NEXT_INSN (insn);
                    549: 
                    550:   for (; next != 0; next = NEXT_INSN (next))
                    551:     {
                    552:       if (GET_CODE (next) == CODE_LABEL
                    553:          || GET_CODE (next) == BARRIER)
                    554:        return 1;
                    555:       if (GET_CODE (next) == NOTE)
                    556:        continue;
                    557:       if (inequality_comparisons_p (PATTERN (next)))
                    558:        return 0;
                    559:       if (sets_cc0_p (PATTERN (next)) == 1)
                    560:        return 1;
                    561:       if (! reg_mentioned_p (cc0_rtx, PATTERN (next)))
                    562:        return 1;
                    563:     }
                    564:   return 1;
                    565: }
                    566: #endif
                    567: #endif
                    568: 
                    569: /* This is used by find_single_use to locate an rtx that contains exactly one
                    570:    use of DEST, which is typically either a REG or CC0.  It returns a
                    571:    pointer to the innermost rtx expression containing DEST.  Appearances of
                    572:    DEST that are being used to totally replace it are not counted.  */
                    573: 
                    574: static rtx *
                    575: find_single_use_1 (dest, loc)
                    576:      rtx dest;
                    577:      rtx *loc;
                    578: {
                    579:   rtx x = *loc;
                    580:   enum rtx_code code = GET_CODE (x);
                    581:   rtx *result = 0;
                    582:   rtx *this_result;
                    583:   int i;
                    584:   char *fmt;
                    585: 
                    586:   switch (code)
                    587:     {
                    588:     case CONST_INT:
                    589:     case CONST:
                    590:     case LABEL_REF:
                    591:     case SYMBOL_REF:
                    592:     case CONST_DOUBLE:
                    593:     case CLOBBER:
                    594:       return 0;
                    595: 
                    596:     case SET:
                    597:       /* If the destination is anything other than CC0, PC, a REG or a SUBREG
                    598:         of a REG that occupies all of the REG, the insn uses DEST if
                    599:         it is mentioned in the destination or the source.  Otherwise, we
                    600:         need just check the source.  */
                    601:       if (GET_CODE (SET_DEST (x)) != CC0
                    602:          && GET_CODE (SET_DEST (x)) != PC
                    603:          && GET_CODE (SET_DEST (x)) != REG
                    604:          && ! (GET_CODE (SET_DEST (x)) == SUBREG
                    605:                && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG
                    606:                && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
                    607:                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
                    608:                    == ((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
                    609:                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))))
                    610:        break;
                    611: 
                    612:       return find_single_use_1 (dest, &SET_SRC (x));
                    613: 
                    614:     case MEM:
                    615:     case SUBREG:
                    616:       return find_single_use_1 (dest, &XEXP (x, 0));
                    617:     }
                    618: 
                    619:   /* If it wasn't one of the common cases above, check each expression and
                    620:      vector of this code.  Look for a unique usage of DEST.  */
                    621: 
                    622:   fmt = GET_RTX_FORMAT (code);
                    623:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                    624:     {
                    625:       if (fmt[i] == 'e')
                    626:        {
                    627:          if (dest == XEXP (x, i)
                    628:              || (GET_CODE (dest) == REG && GET_CODE (XEXP (x, i)) == REG
                    629:                  && REGNO (dest) == REGNO (XEXP (x, i))))
                    630:            this_result = loc;
                    631:          else
                    632:            this_result = find_single_use_1 (dest, &XEXP (x, i));
                    633: 
                    634:          if (result == 0)
                    635:            result = this_result;
                    636:          else if (this_result)
                    637:            /* Duplicate usage.  */
                    638:            return 0;
                    639:        }
                    640:       else if (fmt[i] == 'E')
                    641:        {
                    642:          int j;
                    643: 
                    644:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                    645:            {
                    646:              if (XVECEXP (x, i, j) == dest
                    647:                  || (GET_CODE (dest) == REG
                    648:                      && GET_CODE (XVECEXP (x, i, j)) == REG
                    649:                      && REGNO (XVECEXP (x, i, j)) == REGNO (dest)))
                    650:                this_result = loc;
                    651:              else
                    652:                this_result = find_single_use_1 (dest, &XVECEXP (x, i, j));
                    653: 
                    654:              if (result == 0)
                    655:                result = this_result;
                    656:              else if (this_result)
                    657:                return 0;
                    658:            }
                    659:        }
                    660:     }
                    661: 
                    662:   return result;
                    663: }
                    664: 
                    665: /* See if DEST, produced in INSN, is used only a single time in the
                    666:    sequel.  If so, return a pointer to the innermost rtx expression in which
                    667:    it is used.
                    668: 
                    669:    If PLOC is non-zero, *PLOC is set to the insn containing the single use.
                    670: 
                    671:    This routine will return usually zero either before flow is called (because
                    672:    there will be no LOG_LINKS notes) or after reload (because the REG_DEAD
                    673:    note can't be trusted).
                    674: 
                    675:    If DEST is cc0_rtx, we look only at the next insn.  In that case, we don't
                    676:    care about REG_DEAD notes or LOG_LINKS.
                    677: 
                    678:    Otherwise, we find the single use by finding an insn that has a
                    679:    LOG_LINKS pointing at INSN and has a REG_DEAD note for DEST.  If DEST is
                    680:    only referenced once in that insn, we know that it must be the first
                    681:    and last insn referencing DEST.  */
                    682: 
                    683: rtx *
                    684: find_single_use (dest, insn, ploc)
                    685:      rtx dest;
                    686:      rtx insn;
                    687:      rtx *ploc;
                    688: {
                    689:   rtx next;
                    690:   rtx *result;
                    691:   rtx link;
                    692: 
                    693: #ifdef HAVE_cc0
                    694:   if (dest == cc0_rtx)
                    695:     {
                    696:       next = NEXT_INSN (insn);
                    697:       if (next == 0
                    698:          || (GET_CODE (next) != INSN && GET_CODE (next) != JUMP_INSN))
                    699:        return 0;
                    700: 
                    701:       result = find_single_use_1 (dest, &PATTERN (next));
                    702:       if (result && ploc)
                    703:        *ploc = next;
                    704:       return result;
                    705:     }
                    706: #endif
                    707: 
                    708:   if (reload_completed || reload_in_progress || GET_CODE (dest) != REG)
                    709:     return 0;
                    710: 
                    711:   for (next = next_nonnote_insn (insn);
                    712:        next != 0 && GET_CODE (next) != CODE_LABEL;
                    713:        next = next_nonnote_insn (next))
                    714:     if (GET_RTX_CLASS (GET_CODE (next)) == 'i' && dead_or_set_p (next, dest))
                    715:       {
                    716:        for (link = LOG_LINKS (next); link; link = XEXP (link, 1))
                    717:          if (XEXP (link, 0) == insn)
                    718:            break;
                    719: 
                    720:        if (link)
                    721:          {
                    722:            result = find_single_use_1 (dest, &PATTERN (next));
                    723:            if (ploc)
                    724:              *ploc = next;
                    725:            return result;
                    726:          }
                    727:       }
                    728: 
                    729:   return 0;
                    730: }
                    731: 
                    732: /* Return 1 if OP is a valid general operand for machine mode MODE.
                    733:    This is either a register reference, a memory reference,
                    734:    or a constant.  In the case of a memory reference, the address
                    735:    is checked for general validity for the target machine.
                    736: 
                    737:    Register and memory references must have mode MODE in order to be valid,
                    738:    but some constants have no machine mode and are valid for any mode.
                    739: 
                    740:    If MODE is VOIDmode, OP is checked for validity for whatever mode
                    741:    it has.
                    742: 
                    743:    The main use of this function is as a predicate in match_operand
                    744:    expressions in the machine description.
                    745: 
1.1.1.3   root      746:    For an explanation of this function's behavior for registers of
1.1       root      747:    class NO_REGS, see the comment for `register_operand'.  */
                    748: 
                    749: int
                    750: general_operand (op, mode)
                    751:      register rtx op;
                    752:      enum machine_mode mode;
                    753: {
                    754:   register enum rtx_code code = GET_CODE (op);
                    755:   int mode_altering_drug = 0;
                    756: 
                    757:   if (mode == VOIDmode)
                    758:     mode = GET_MODE (op);
                    759: 
                    760:   /* Don't accept CONST_INT or anything similar
                    761:      if the caller wants something floating.  */
                    762:   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1.1.1.4   root      763:       && GET_MODE_CLASS (mode) != MODE_INT
                    764:       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1.1       root      765:     return 0;
                    766: 
                    767:   if (CONSTANT_P (op))
                    768:     return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode)
                    769: #ifdef LEGITIMATE_PIC_OPERAND_P
                    770:            && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
                    771: #endif
                    772:            && LEGITIMATE_CONSTANT_P (op));
                    773: 
                    774:   /* Except for certain constants with VOIDmode, already checked for,
                    775:      OP's mode must match MODE if MODE specifies a mode.  */
                    776: 
                    777:   if (GET_MODE (op) != mode)
                    778:     return 0;
                    779: 
                    780:   if (code == SUBREG)
                    781:     {
                    782: #ifdef INSN_SCHEDULING
                    783:       /* On machines that have insn scheduling, we want all memory
                    784:         reference to be explicit, so outlaw paradoxical SUBREGs.  */
                    785:       if (GET_CODE (SUBREG_REG (op)) == MEM
                    786:          && GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
                    787:        return 0;
                    788: #endif
                    789: 
                    790:       op = SUBREG_REG (op);
                    791:       code = GET_CODE (op);
                    792: #if 0
                    793:       /* No longer needed, since (SUBREG (MEM...))
                    794:         will load the MEM into a reload reg in the MEM's own mode.  */
                    795:       mode_altering_drug = 1;
                    796: #endif
                    797:     }
                    798: 
                    799:   if (code == REG)
                    800:     /* A register whose class is NO_REGS is not a general operand.  */
                    801:     return (REGNO (op) >= FIRST_PSEUDO_REGISTER
                    802:            || REGNO_REG_CLASS (REGNO (op)) != NO_REGS);
                    803: 
                    804:   if (code == MEM)
                    805:     {
                    806:       register rtx y = XEXP (op, 0);
                    807:       if (! volatile_ok && MEM_VOLATILE_P (op))
                    808:        return 0;
                    809:       /* Use the mem's mode, since it will be reloaded thus.  */
                    810:       mode = GET_MODE (op);
                    811:       GO_IF_LEGITIMATE_ADDRESS (mode, y, win);
                    812:     }
                    813:   return 0;
                    814: 
                    815:  win:
                    816:   if (mode_altering_drug)
                    817:     return ! mode_dependent_address_p (XEXP (op, 0));
                    818:   return 1;
                    819: }
                    820: 
                    821: /* Return 1 if OP is a valid memory address for a memory reference
                    822:    of mode MODE.
                    823: 
                    824:    The main use of this function is as a predicate in match_operand
                    825:    expressions in the machine description.  */
                    826: 
                    827: int
                    828: address_operand (op, mode)
                    829:      register rtx op;
                    830:      enum machine_mode mode;
                    831: {
                    832:   return memory_address_p (mode, op);
                    833: }
                    834: 
                    835: /* Return 1 if OP is a register reference of mode MODE.
                    836:    If MODE is VOIDmode, accept a register in any mode.
                    837: 
                    838:    The main use of this function is as a predicate in match_operand
                    839:    expressions in the machine description.
                    840: 
                    841:    As a special exception, registers whose class is NO_REGS are
                    842:    not accepted by `register_operand'.  The reason for this change
                    843:    is to allow the representation of special architecture artifacts
                    844:    (such as a condition code register) without extending the rtl
                    845:    definitions.  Since registers of class NO_REGS cannot be used
                    846:    as registers in any case where register classes are examined,
                    847:    it is most consistent to keep this function from accepting them.  */
                    848: 
                    849: int
                    850: register_operand (op, mode)
                    851:      register rtx op;
                    852:      enum machine_mode mode;
                    853: {
                    854:   if (GET_MODE (op) != mode && mode != VOIDmode)
                    855:     return 0;
                    856: 
                    857:   if (GET_CODE (op) == SUBREG)
                    858:     {
                    859:       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
                    860:         because it is guaranteed to be reloaded into one.
                    861:         Just make sure the MEM is valid in itself.
                    862:         (Ideally, (SUBREG (MEM)...) should not exist after reload,
                    863:         but currently it does result from (SUBREG (REG)...) where the
                    864:         reg went on the stack.)  */
                    865:       if (! reload_completed && GET_CODE (SUBREG_REG (op)) == MEM)
                    866:        return general_operand (op, mode);
1.1.1.7 ! root      867: 
        !           868: #ifdef CLASS_CANNOT_CHANGE_SIZE
        !           869:       if (GET_CODE (SUBREG_REG (op)) == REG
        !           870:          && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER
        !           871:          && TEST_HARD_REG_BIT (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
        !           872:                                REGNO (SUBREG_REG (op)))
        !           873:          && (GET_MODE_SIZE (mode)
        !           874:              != GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))))
        !           875:        return 0;
        !           876: #endif
        !           877: 
1.1       root      878:       op = SUBREG_REG (op);
                    879:     }
                    880: 
                    881:   /* We don't consider registers whose class is NO_REGS
                    882:      to be a register operand.  */
                    883:   return (GET_CODE (op) == REG
                    884:          && (REGNO (op) >= FIRST_PSEUDO_REGISTER
                    885:              || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
                    886: }
                    887: 
                    888: /* Return 1 if OP should match a MATCH_SCRATCH, i.e., if it is a SCRATCH
                    889:    or a hard register.  */
                    890: 
                    891: int
                    892: scratch_operand (op, mode)
                    893:      register rtx op;
                    894:      enum machine_mode mode;
                    895: {
                    896:   return (GET_MODE (op) == mode
                    897:          && (GET_CODE (op) == SCRATCH
                    898:              || (GET_CODE (op) == REG
                    899:                  && REGNO (op) < FIRST_PSEUDO_REGISTER)));
                    900: }
                    901: 
                    902: /* Return 1 if OP is a valid immediate operand for mode MODE.
                    903: 
                    904:    The main use of this function is as a predicate in match_operand
                    905:    expressions in the machine description.  */
                    906: 
                    907: int
                    908: immediate_operand (op, mode)
                    909:      register rtx op;
                    910:      enum machine_mode mode;
                    911: {
                    912:   /* Don't accept CONST_INT or anything similar
                    913:      if the caller wants something floating.  */
                    914:   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1.1.1.4   root      915:       && GET_MODE_CLASS (mode) != MODE_INT
                    916:       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1.1       root      917:     return 0;
                    918: 
                    919:   return (CONSTANT_P (op)
                    920:          && (GET_MODE (op) == mode || mode == VOIDmode
                    921:              || GET_MODE (op) == VOIDmode)
                    922: #ifdef LEGITIMATE_PIC_OPERAND_P
                    923:          && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
                    924: #endif
                    925:          && LEGITIMATE_CONSTANT_P (op));
                    926: }
                    927: 
                    928: /* Returns 1 if OP is an operand that is a CONST_INT.  */
                    929: 
                    930: int
                    931: const_int_operand (op, mode)
                    932:      register rtx op;
                    933:      enum machine_mode mode;
                    934: {
                    935:   return GET_CODE (op) == CONST_INT;
                    936: }
                    937: 
                    938: /* Returns 1 if OP is an operand that is a constant integer or constant
                    939:    floating-point number.  */
                    940: 
                    941: int
                    942: const_double_operand (op, mode)
                    943:      register rtx op;
                    944:      enum machine_mode mode;
                    945: {
                    946:   /* Don't accept CONST_INT or anything similar
                    947:      if the caller wants something floating.  */
                    948:   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1.1.1.4   root      949:       && GET_MODE_CLASS (mode) != MODE_INT
                    950:       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1.1       root      951:     return 0;
                    952: 
                    953:   return ((GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT)
                    954:          && (mode == VOIDmode || GET_MODE (op) == mode
                    955:              || GET_MODE (op) == VOIDmode));
                    956: }
                    957: 
                    958: /* Return 1 if OP is a general operand that is not an immediate operand.  */
                    959: 
                    960: int
                    961: nonimmediate_operand (op, mode)
                    962:      register rtx op;
                    963:      enum machine_mode mode;
                    964: {
                    965:   return (general_operand (op, mode) && ! CONSTANT_P (op));
                    966: }
                    967: 
                    968: /* Return 1 if OP is a register reference or immediate value of mode MODE.  */
                    969: 
                    970: int
                    971: nonmemory_operand (op, mode)
                    972:      register rtx op;
                    973:      enum machine_mode mode;
                    974: {
                    975:   if (CONSTANT_P (op))
                    976:     {
                    977:       /* Don't accept CONST_INT or anything similar
                    978:         if the caller wants something floating.  */
                    979:       if (GET_MODE (op) == VOIDmode && mode != VOIDmode
1.1.1.4   root      980:          && GET_MODE_CLASS (mode) != MODE_INT
                    981:          && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
1.1       root      982:        return 0;
                    983: 
                    984:       return ((GET_MODE (op) == VOIDmode || GET_MODE (op) == mode)
                    985: #ifdef LEGITIMATE_PIC_OPERAND_P
                    986:              && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (op))
                    987: #endif
                    988:              && LEGITIMATE_CONSTANT_P (op));
                    989:     }
                    990: 
                    991:   if (GET_MODE (op) != mode && mode != VOIDmode)
                    992:     return 0;
                    993: 
                    994:   if (GET_CODE (op) == SUBREG)
                    995:     {
                    996:       /* Before reload, we can allow (SUBREG (MEM...)) as a register operand
                    997:         because it is guaranteed to be reloaded into one.
                    998:         Just make sure the MEM is valid in itself.
                    999:         (Ideally, (SUBREG (MEM)...) should not exist after reload,
                   1000:         but currently it does result from (SUBREG (REG)...) where the
                   1001:         reg went on the stack.)  */
                   1002:       if (! reload_completed && GET_CODE (SUBREG_REG (op)) == MEM)
                   1003:        return general_operand (op, mode);
                   1004:       op = SUBREG_REG (op);
                   1005:     }
                   1006: 
                   1007:   /* We don't consider registers whose class is NO_REGS
                   1008:      to be a register operand.  */
                   1009:   return (GET_CODE (op) == REG
                   1010:          && (REGNO (op) >= FIRST_PSEUDO_REGISTER
                   1011:              || REGNO_REG_CLASS (REGNO (op)) != NO_REGS));
                   1012: }
                   1013: 
                   1014: /* Return 1 if OP is a valid operand that stands for pushing a
                   1015:    value of mode MODE onto the stack.
                   1016: 
                   1017:    The main use of this function is as a predicate in match_operand
                   1018:    expressions in the machine description.  */
                   1019: 
                   1020: int
                   1021: push_operand (op, mode)
                   1022:      rtx op;
                   1023:      enum machine_mode mode;
                   1024: {
                   1025:   if (GET_CODE (op) != MEM)
                   1026:     return 0;
                   1027: 
                   1028:   if (GET_MODE (op) != mode)
                   1029:     return 0;
                   1030: 
                   1031:   op = XEXP (op, 0);
                   1032: 
                   1033:   if (GET_CODE (op) != STACK_PUSH_CODE)
                   1034:     return 0;
                   1035: 
                   1036:   return XEXP (op, 0) == stack_pointer_rtx;
                   1037: }
                   1038: 
                   1039: /* Return 1 if ADDR is a valid memory address for mode MODE.  */
                   1040: 
                   1041: int
                   1042: memory_address_p (mode, addr)
                   1043:      enum machine_mode mode;
                   1044:      register rtx addr;
                   1045: {
                   1046:   GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
                   1047:   return 0;
                   1048: 
                   1049:  win:
                   1050:   return 1;
                   1051: }
                   1052: 
                   1053: /* Return 1 if OP is a valid memory reference with mode MODE,
                   1054:    including a valid address.
                   1055: 
                   1056:    The main use of this function is as a predicate in match_operand
                   1057:    expressions in the machine description.  */
                   1058: 
                   1059: int
                   1060: memory_operand (op, mode)
                   1061:      register rtx op;
                   1062:      enum machine_mode mode;
                   1063: {
                   1064:   rtx inner;
                   1065: 
                   1066:   if (! reload_completed)
                   1067:     /* Note that no SUBREG is a memory operand before end of reload pass,
                   1068:        because (SUBREG (MEM...)) forces reloading into a register.  */
                   1069:     return GET_CODE (op) == MEM && general_operand (op, mode);
                   1070: 
                   1071:   if (mode != VOIDmode && GET_MODE (op) != mode)
                   1072:     return 0;
                   1073: 
                   1074:   inner = op;
                   1075:   if (GET_CODE (inner) == SUBREG)
                   1076:     inner = SUBREG_REG (inner);
                   1077: 
                   1078:   return (GET_CODE (inner) == MEM && general_operand (op, mode));
                   1079: }
                   1080: 
                   1081: /* Return 1 if OP is a valid indirect memory reference with mode MODE;
                   1082:    that is, a memory reference whose address is a general_operand.  */
                   1083: 
                   1084: int
                   1085: indirect_operand (op, mode)
                   1086:      register rtx op;
                   1087:      enum machine_mode mode;
                   1088: {
                   1089:   /* Before reload, a SUBREG isn't in memory (see memory_operand, above).  */
                   1090:   if (! reload_completed
                   1091:       && GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == MEM)
                   1092:     {
                   1093:       register int offset = SUBREG_WORD (op) * UNITS_PER_WORD;
                   1094:       rtx inner = SUBREG_REG (op);
                   1095: 
1.1.1.7 ! root     1096:       if (BYTES_BIG_ENDIAN)
        !          1097:        offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (op)))
        !          1098:                   - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (inner))));
1.1       root     1099: 
1.1.1.6   root     1100:       if (mode != VOIDmode && GET_MODE (op) != mode)
                   1101:        return 0;
                   1102: 
1.1       root     1103:       /* The only way that we can have a general_operand as the resulting
                   1104:         address is if OFFSET is zero and the address already is an operand
                   1105:         or if the address is (plus Y (const_int -OFFSET)) and Y is an
                   1106:         operand.  */
                   1107: 
                   1108:       return ((offset == 0 && general_operand (XEXP (inner, 0), Pmode))
                   1109:              || (GET_CODE (XEXP (inner, 0)) == PLUS
                   1110:                  && GET_CODE (XEXP (XEXP (inner, 0), 1)) == CONST_INT
                   1111:                  && INTVAL (XEXP (XEXP (inner, 0), 1)) == -offset
                   1112:                  && general_operand (XEXP (XEXP (inner, 0), 0), Pmode)));
                   1113:     }
                   1114: 
                   1115:   return (GET_CODE (op) == MEM
                   1116:          && memory_operand (op, mode)
                   1117:          && general_operand (XEXP (op, 0), Pmode));
                   1118: }
                   1119: 
                   1120: /* Return 1 if this is a comparison operator.  This allows the use of
                   1121:    MATCH_OPERATOR to recognize all the branch insns.  */
                   1122: 
                   1123: int
                   1124: comparison_operator (op, mode)
                   1125:     register rtx op;
                   1126:     enum machine_mode mode;
                   1127: {
                   1128:   return ((mode == VOIDmode || GET_MODE (op) == mode)
                   1129:          && GET_RTX_CLASS (GET_CODE (op)) == '<');
                   1130: }
                   1131: 
                   1132: /* If BODY is an insn body that uses ASM_OPERANDS,
                   1133:    return the number of operands (both input and output) in the insn.
                   1134:    Otherwise return -1.  */
                   1135: 
                   1136: int
                   1137: asm_noperands (body)
                   1138:      rtx body;
                   1139: {
                   1140:   if (GET_CODE (body) == ASM_OPERANDS)
                   1141:     /* No output operands: return number of input operands.  */
                   1142:     return ASM_OPERANDS_INPUT_LENGTH (body);
                   1143:   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
                   1144:     /* Single output operand: BODY is (set OUTPUT (asm_operands ...)).  */
                   1145:     return ASM_OPERANDS_INPUT_LENGTH (SET_SRC (body)) + 1;
                   1146:   else if (GET_CODE (body) == PARALLEL
                   1147:           && GET_CODE (XVECEXP (body, 0, 0)) == SET
                   1148:           && GET_CODE (SET_SRC (XVECEXP (body, 0, 0))) == ASM_OPERANDS)
                   1149:     {
                   1150:       /* Multiple output operands, or 1 output plus some clobbers:
                   1151:         body is [(set OUTPUT (asm_operands ...))... (clobber (reg ...))...].  */
                   1152:       int i;
                   1153:       int n_sets;
                   1154: 
                   1155:       /* Count backwards through CLOBBERs to determine number of SETs.  */
                   1156:       for (i = XVECLEN (body, 0); i > 0; i--)
                   1157:        {
                   1158:          if (GET_CODE (XVECEXP (body, 0, i - 1)) == SET)
                   1159:            break;
                   1160:          if (GET_CODE (XVECEXP (body, 0, i - 1)) != CLOBBER)
                   1161:            return -1;
                   1162:        }
                   1163: 
                   1164:       /* N_SETS is now number of output operands.  */
                   1165:       n_sets = i;
                   1166: 
                   1167:       /* Verify that all the SETs we have
                   1168:         came from a single original asm_operands insn
                   1169:         (so that invalid combinations are blocked).  */
                   1170:       for (i = 0; i < n_sets; i++)
                   1171:        {
                   1172:          rtx elt = XVECEXP (body, 0, i);
                   1173:          if (GET_CODE (elt) != SET)
                   1174:            return -1;
                   1175:          if (GET_CODE (SET_SRC (elt)) != ASM_OPERANDS)
                   1176:            return -1;
                   1177:          /* If these ASM_OPERANDS rtx's came from different original insns
                   1178:             then they aren't allowed together.  */
                   1179:          if (ASM_OPERANDS_INPUT_VEC (SET_SRC (elt))
                   1180:              != ASM_OPERANDS_INPUT_VEC (SET_SRC (XVECEXP (body, 0, 0))))
                   1181:            return -1;
                   1182:        }
                   1183:       return (ASM_OPERANDS_INPUT_LENGTH (SET_SRC (XVECEXP (body, 0, 0)))
                   1184:              + n_sets);
                   1185:     }
                   1186:   else if (GET_CODE (body) == PARALLEL
                   1187:           && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
                   1188:     {
                   1189:       /* 0 outputs, but some clobbers:
                   1190:         body is [(asm_operands ...) (clobber (reg ...))...].  */
                   1191:       int i;
                   1192: 
                   1193:       /* Make sure all the other parallel things really are clobbers.  */
                   1194:       for (i = XVECLEN (body, 0) - 1; i > 0; i--)
                   1195:        if (GET_CODE (XVECEXP (body, 0, i)) != CLOBBER)
                   1196:          return -1;
                   1197: 
                   1198:       return ASM_OPERANDS_INPUT_LENGTH (XVECEXP (body, 0, 0));
                   1199:     }
                   1200:   else
                   1201:     return -1;
                   1202: }
                   1203: 
                   1204: /* Assuming BODY is an insn body that uses ASM_OPERANDS,
                   1205:    copy its operands (both input and output) into the vector OPERANDS,
                   1206:    the locations of the operands within the insn into the vector OPERAND_LOCS,
                   1207:    and the constraints for the operands into CONSTRAINTS.
                   1208:    Write the modes of the operands into MODES.
                   1209:    Return the assembler-template.
                   1210: 
                   1211:    If MODES, OPERAND_LOCS, CONSTRAINTS or OPERANDS is 0,
                   1212:    we don't store that info.  */
                   1213: 
                   1214: char *
                   1215: decode_asm_operands (body, operands, operand_locs, constraints, modes)
                   1216:      rtx body;
                   1217:      rtx *operands;
                   1218:      rtx **operand_locs;
                   1219:      char **constraints;
                   1220:      enum machine_mode *modes;
                   1221: {
                   1222:   register int i;
                   1223:   int noperands;
                   1224:   char *template = 0;
                   1225: 
                   1226:   if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
                   1227:     {
                   1228:       rtx asmop = SET_SRC (body);
                   1229:       /* Single output operand: BODY is (set OUTPUT (asm_operands ....)).  */
                   1230: 
                   1231:       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop) + 1;
                   1232: 
                   1233:       for (i = 1; i < noperands; i++)
                   1234:        {
                   1235:          if (operand_locs)
                   1236:            operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i - 1);
                   1237:          if (operands)
                   1238:            operands[i] = ASM_OPERANDS_INPUT (asmop, i - 1);
                   1239:          if (constraints)
                   1240:            constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i - 1);
                   1241:          if (modes)
                   1242:            modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i - 1);
                   1243:        }
                   1244: 
                   1245:       /* The output is in the SET.
                   1246:         Its constraint is in the ASM_OPERANDS itself.  */
                   1247:       if (operands)
                   1248:        operands[0] = SET_DEST (body);
                   1249:       if (operand_locs)
                   1250:        operand_locs[0] = &SET_DEST (body);
                   1251:       if (constraints)
                   1252:        constraints[0] = ASM_OPERANDS_OUTPUT_CONSTRAINT (asmop);
                   1253:       if (modes)
                   1254:        modes[0] = GET_MODE (SET_DEST (body));
                   1255:       template = ASM_OPERANDS_TEMPLATE (asmop);
                   1256:     }
                   1257:   else if (GET_CODE (body) == ASM_OPERANDS)
                   1258:     {
                   1259:       rtx asmop = body;
                   1260:       /* No output operands: BODY is (asm_operands ....).  */
                   1261: 
                   1262:       noperands = ASM_OPERANDS_INPUT_LENGTH (asmop);
                   1263: 
                   1264:       /* The input operands are found in the 1st element vector.  */
                   1265:       /* Constraints for inputs are in the 2nd element vector.  */
                   1266:       for (i = 0; i < noperands; i++)
                   1267:        {
                   1268:          if (operand_locs)
                   1269:            operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
                   1270:          if (operands)
                   1271:            operands[i] = ASM_OPERANDS_INPUT (asmop, i);
                   1272:          if (constraints)
                   1273:            constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
                   1274:          if (modes)
                   1275:            modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
                   1276:        }
                   1277:       template = ASM_OPERANDS_TEMPLATE (asmop);
                   1278:     }
                   1279:   else if (GET_CODE (body) == PARALLEL
                   1280:           && GET_CODE (XVECEXP (body, 0, 0)) == SET)
                   1281:     {
                   1282:       rtx asmop = SET_SRC (XVECEXP (body, 0, 0));
                   1283:       int nparallel = XVECLEN (body, 0); /* Includes CLOBBERs.  */
                   1284:       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
                   1285:       int nout = 0;            /* Does not include CLOBBERs.  */
                   1286: 
                   1287:       /* At least one output, plus some CLOBBERs.  */
                   1288: 
                   1289:       /* The outputs are in the SETs.
                   1290:         Their constraints are in the ASM_OPERANDS itself.  */
                   1291:       for (i = 0; i < nparallel; i++)
                   1292:        {
                   1293:          if (GET_CODE (XVECEXP (body, 0, i)) == CLOBBER)
                   1294:            break;              /* Past last SET */
                   1295:          
                   1296:          if (operands)
                   1297:            operands[i] = SET_DEST (XVECEXP (body, 0, i));
                   1298:          if (operand_locs)
                   1299:            operand_locs[i] = &SET_DEST (XVECEXP (body, 0, i));
                   1300:          if (constraints)
                   1301:            constraints[i] = XSTR (SET_SRC (XVECEXP (body, 0, i)), 1);
                   1302:          if (modes)
                   1303:            modes[i] = GET_MODE (SET_DEST (XVECEXP (body, 0, i)));
                   1304:          nout++;
                   1305:        }
                   1306: 
                   1307:       for (i = 0; i < nin; i++)
                   1308:        {
                   1309:          if (operand_locs)
                   1310:            operand_locs[i + nout] = &ASM_OPERANDS_INPUT (asmop, i);
                   1311:          if (operands)
                   1312:            operands[i + nout] = ASM_OPERANDS_INPUT (asmop, i);
                   1313:          if (constraints)
                   1314:            constraints[i + nout] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
                   1315:          if (modes)
                   1316:            modes[i + nout] = ASM_OPERANDS_INPUT_MODE (asmop, i);
                   1317:        }
                   1318: 
                   1319:       template = ASM_OPERANDS_TEMPLATE (asmop);
                   1320:     }
                   1321:   else if (GET_CODE (body) == PARALLEL
                   1322:           && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
                   1323:     {
                   1324:       /* No outputs, but some CLOBBERs.  */
                   1325: 
                   1326:       rtx asmop = XVECEXP (body, 0, 0);
                   1327:       int nin = ASM_OPERANDS_INPUT_LENGTH (asmop);
                   1328: 
                   1329:       for (i = 0; i < nin; i++)
                   1330:        {
                   1331:          if (operand_locs)
                   1332:            operand_locs[i] = &ASM_OPERANDS_INPUT (asmop, i);
                   1333:          if (operands)
                   1334:            operands[i] = ASM_OPERANDS_INPUT (asmop, i);
                   1335:          if (constraints)
                   1336:            constraints[i] = ASM_OPERANDS_INPUT_CONSTRAINT (asmop, i);
                   1337:          if (modes)
                   1338:            modes[i] = ASM_OPERANDS_INPUT_MODE (asmop, i);
                   1339:        }
                   1340: 
                   1341:       template = ASM_OPERANDS_TEMPLATE (asmop);
                   1342:     }
                   1343: 
                   1344:   return template;
                   1345: }
                   1346: 
                   1347: /* Given an rtx *P, if it is a sum containing an integer constant term,
                   1348:    return the location (type rtx *) of the pointer to that constant term.
                   1349:    Otherwise, return a null pointer.  */
                   1350: 
                   1351: static rtx *
                   1352: find_constant_term_loc (p)
                   1353:      rtx *p;
                   1354: {
                   1355:   register rtx *tem;
                   1356:   register enum rtx_code code = GET_CODE (*p);
                   1357: 
                   1358:   /* If *P IS such a constant term, P is its location.  */
                   1359: 
                   1360:   if (code == CONST_INT || code == SYMBOL_REF || code == LABEL_REF
                   1361:       || code == CONST)
                   1362:     return p;
                   1363: 
                   1364:   /* Otherwise, if not a sum, it has no constant term.  */
                   1365: 
                   1366:   if (GET_CODE (*p) != PLUS)
                   1367:     return 0;
                   1368: 
                   1369:   /* If one of the summands is constant, return its location.  */
                   1370: 
                   1371:   if (XEXP (*p, 0) && CONSTANT_P (XEXP (*p, 0))
                   1372:       && XEXP (*p, 1) && CONSTANT_P (XEXP (*p, 1)))
                   1373:     return p;
                   1374: 
                   1375:   /* Otherwise, check each summand for containing a constant term.  */
                   1376: 
                   1377:   if (XEXP (*p, 0) != 0)
                   1378:     {
                   1379:       tem = find_constant_term_loc (&XEXP (*p, 0));
                   1380:       if (tem != 0)
                   1381:        return tem;
                   1382:     }
                   1383: 
                   1384:   if (XEXP (*p, 1) != 0)
                   1385:     {
                   1386:       tem = find_constant_term_loc (&XEXP (*p, 1));
                   1387:       if (tem != 0)
                   1388:        return tem;
                   1389:     }
                   1390: 
                   1391:   return 0;
                   1392: }
                   1393: 
                   1394: /* Return 1 if OP is a memory reference
                   1395:    whose address contains no side effects
                   1396:    and remains valid after the addition
                   1397:    of a positive integer less than the
                   1398:    size of the object being referenced.
                   1399: 
                   1400:    We assume that the original address is valid and do not check it.
                   1401: 
                   1402:    This uses strict_memory_address_p as a subroutine, so
                   1403:    don't use it before reload.  */
                   1404: 
                   1405: int
                   1406: offsettable_memref_p (op)
                   1407:      rtx op;
                   1408: {
                   1409:   return ((GET_CODE (op) == MEM)
                   1410:          && offsettable_address_p (1, GET_MODE (op), XEXP (op, 0)));
                   1411: }
                   1412: 
                   1413: /* Similar, but don't require a strictly valid mem ref:
                   1414:    consider pseudo-regs valid as index or base regs.  */
                   1415: 
                   1416: int
                   1417: offsettable_nonstrict_memref_p (op)
                   1418:      rtx op;
                   1419: {
                   1420:   return ((GET_CODE (op) == MEM)
                   1421:          && offsettable_address_p (0, GET_MODE (op), XEXP (op, 0)));
                   1422: }
                   1423: 
                   1424: /* Return 1 if Y is a memory address which contains no side effects
                   1425:    and would remain valid after the addition of a positive integer
                   1426:    less than the size of that mode.
                   1427: 
                   1428:    We assume that the original address is valid and do not check it.
                   1429:    We do check that it is valid for narrower modes.
                   1430: 
                   1431:    If STRICTP is nonzero, we require a strictly valid address,
                   1432:    for the sake of use in reload.c.  */
                   1433: 
                   1434: int
                   1435: offsettable_address_p (strictp, mode, y)
                   1436:      int strictp;
                   1437:      enum machine_mode mode;
                   1438:      register rtx y;
                   1439: {
                   1440:   register enum rtx_code ycode = GET_CODE (y);
                   1441:   register rtx z;
                   1442:   rtx y1 = y;
                   1443:   rtx *y2;
                   1444:   int (*addressp) () = (strictp ? strict_memory_address_p : memory_address_p);
                   1445: 
                   1446:   if (CONSTANT_ADDRESS_P (y))
                   1447:     return 1;
                   1448: 
                   1449:   /* Adjusting an offsettable address involves changing to a narrower mode.
                   1450:      Make sure that's OK.  */
                   1451: 
                   1452:   if (mode_dependent_address_p (y))
                   1453:     return 0;
                   1454: 
                   1455:   /* If the expression contains a constant term,
                   1456:      see if it remains valid when max possible offset is added.  */
                   1457: 
                   1458:   if ((ycode == PLUS) && (y2 = find_constant_term_loc (&y1)))
                   1459:     {
                   1460:       int good;
                   1461: 
                   1462:       y1 = *y2;
                   1463:       *y2 = plus_constant (*y2, GET_MODE_SIZE (mode) - 1);
                   1464:       /* Use QImode because an odd displacement may be automatically invalid
                   1465:         for any wider mode.  But it should be valid for a single byte.  */
                   1466:       good = (*addressp) (QImode, y);
                   1467: 
                   1468:       /* In any case, restore old contents of memory.  */
                   1469:       *y2 = y1;
                   1470:       return good;
                   1471:     }
                   1472: 
                   1473:   if (ycode == PRE_DEC || ycode == PRE_INC
                   1474:       || ycode == POST_DEC || ycode == POST_INC)
                   1475:     return 0;
                   1476: 
                   1477:   /* The offset added here is chosen as the maximum offset that
                   1478:      any instruction could need to add when operating on something
                   1479:      of the specified mode.  We assume that if Y and Y+c are
                   1480:      valid addresses then so is Y+d for all 0<d<c.  */
                   1481: 
                   1482:   z = plus_constant_for_output (y, GET_MODE_SIZE (mode) - 1);
                   1483: 
                   1484:   /* Use QImode because an odd displacement may be automatically invalid
                   1485:      for any wider mode.  But it should be valid for a single byte.  */
                   1486:   return (*addressp) (QImode, z);
                   1487: }
                   1488: 
                   1489: /* Return 1 if ADDR is an address-expression whose effect depends
                   1490:    on the mode of the memory reference it is used in.
                   1491: 
                   1492:    Autoincrement addressing is a typical example of mode-dependence
                   1493:    because the amount of the increment depends on the mode.  */
                   1494: 
                   1495: int
                   1496: mode_dependent_address_p (addr)
                   1497:      rtx addr;
                   1498: {
                   1499:   GO_IF_MODE_DEPENDENT_ADDRESS (addr, win);
                   1500:   return 0;
                   1501:  win:
                   1502:   return 1;
                   1503: }
                   1504: 
                   1505: /* Return 1 if OP is a general operand
                   1506:    other than a memory ref with a mode dependent address.  */
                   1507: 
                   1508: int
                   1509: mode_independent_operand (op, mode)
                   1510:      enum machine_mode mode;
                   1511:      rtx op;
                   1512: {
                   1513:   rtx addr;
                   1514: 
                   1515:   if (! general_operand (op, mode))
                   1516:     return 0;
                   1517: 
                   1518:   if (GET_CODE (op) != MEM)
                   1519:     return 1;
                   1520: 
                   1521:   addr = XEXP (op, 0);
                   1522:   GO_IF_MODE_DEPENDENT_ADDRESS (addr, lose);
                   1523:   return 1;
                   1524:  lose:
                   1525:   return 0;
                   1526: }
                   1527: 
                   1528: /* Given an operand OP that is a valid memory reference
                   1529:    which satisfies offsettable_memref_p,
                   1530:    return a new memory reference whose address has been adjusted by OFFSET.
                   1531:    OFFSET should be positive and less than the size of the object referenced.
                   1532: */
                   1533: 
                   1534: rtx
                   1535: adj_offsettable_operand (op, offset)
                   1536:      rtx op;
                   1537:      int offset;
                   1538: {
                   1539:   register enum rtx_code code = GET_CODE (op);
                   1540: 
                   1541:   if (code == MEM) 
                   1542:     {
                   1543:       register rtx y = XEXP (op, 0);
                   1544:       register rtx new;
                   1545: 
                   1546:       if (CONSTANT_ADDRESS_P (y))
                   1547:        {
                   1548:          new = gen_rtx (MEM, GET_MODE (op), plus_constant_for_output (y, offset));
                   1549:          RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
                   1550:          return new;
                   1551:        }
                   1552: 
                   1553:       if (GET_CODE (y) == PLUS)
                   1554:        {
                   1555:          rtx z = y;
                   1556:          register rtx *const_loc;
                   1557: 
                   1558:          op = copy_rtx (op);
                   1559:          z = XEXP (op, 0);
                   1560:          const_loc = find_constant_term_loc (&z);
                   1561:          if (const_loc)
                   1562:            {
                   1563:              *const_loc = plus_constant_for_output (*const_loc, offset);
                   1564:              return op;
                   1565:            }
                   1566:        }
                   1567: 
                   1568:       new = gen_rtx (MEM, GET_MODE (op), plus_constant_for_output (y, offset));
                   1569:       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (op);
                   1570:       return new;
                   1571:     }
                   1572:   abort ();
                   1573: }
                   1574: 
                   1575: #ifdef REGISTER_CONSTRAINTS
                   1576: 
                   1577: /* Check the operands of an insn (found in recog_operands)
                   1578:    against the insn's operand constraints (found via INSN_CODE_NUM)
                   1579:    and return 1 if they are valid.
                   1580: 
                   1581:    WHICH_ALTERNATIVE is set to a number which indicates which
                   1582:    alternative of constraints was matched: 0 for the first alternative,
                   1583:    1 for the next, etc.
                   1584: 
                   1585:    In addition, when two operands are match
                   1586:    and it happens that the output operand is (reg) while the
                   1587:    input operand is --(reg) or ++(reg) (a pre-inc or pre-dec),
                   1588:    make the output operand look like the input.
                   1589:    This is because the output operand is the one the template will print.
                   1590: 
                   1591:    This is used in final, just before printing the assembler code and by
                   1592:    the routines that determine an insn's attribute.
                   1593: 
                   1594:    If STRICT is a positive non-zero value, it means that we have been
                   1595:    called after reload has been completed.  In that case, we must
                   1596:    do all checks strictly.  If it is zero, it means that we have been called
                   1597:    before reload has completed.  In that case, we first try to see if we can
                   1598:    find an alternative that matches strictly.  If not, we try again, this
                   1599:    time assuming that reload will fix up the insn.  This provides a "best
                   1600:    guess" for the alternative and is used to compute attributes of insns prior
                   1601:    to reload.  A negative value of STRICT is used for this internal call.  */
                   1602: 
                   1603: struct funny_match
                   1604: {
                   1605:   int this, other;
                   1606: };
                   1607: 
                   1608: int
                   1609: constrain_operands (insn_code_num, strict)
                   1610:      int insn_code_num;
                   1611:      int strict;
                   1612: {
                   1613:   char *constraints[MAX_RECOG_OPERANDS];
1.1.1.3   root     1614:   int matching_operands[MAX_RECOG_OPERANDS];
                   1615:   enum op_type {OP_IN, OP_OUT, OP_INOUT} op_types[MAX_RECOG_OPERANDS];
                   1616:   int earlyclobber[MAX_RECOG_OPERANDS];
1.1       root     1617:   register int c;
                   1618:   int noperands = insn_n_operands[insn_code_num];
                   1619: 
                   1620:   struct funny_match funny_match[MAX_RECOG_OPERANDS];
                   1621:   int funny_match_index;
                   1622:   int nalternatives = insn_n_alternatives[insn_code_num];
                   1623: 
                   1624:   if (noperands == 0 || nalternatives == 0)
                   1625:     return 1;
                   1626: 
                   1627:   for (c = 0; c < noperands; c++)
1.1.1.3   root     1628:     {
                   1629:       constraints[c] = insn_operand_constraint[insn_code_num][c];
                   1630:       matching_operands[c] = -1;
                   1631:       op_types[c] = OP_IN;
                   1632:     }
1.1       root     1633: 
                   1634:   which_alternative = 0;
                   1635: 
                   1636:   while (which_alternative < nalternatives)
                   1637:     {
                   1638:       register int opno;
                   1639:       int lose = 0;
                   1640:       funny_match_index = 0;
                   1641: 
                   1642:       for (opno = 0; opno < noperands; opno++)
                   1643:        {
                   1644:          register rtx op = recog_operand[opno];
                   1645:          enum machine_mode mode = GET_MODE (op);
                   1646:          register char *p = constraints[opno];
                   1647:          int offset = 0;
                   1648:          int win = 0;
                   1649:          int val;
                   1650: 
1.1.1.3   root     1651:          earlyclobber[opno] = 0;
                   1652: 
1.1       root     1653:          if (GET_CODE (op) == SUBREG)
                   1654:            {
                   1655:              if (GET_CODE (SUBREG_REG (op)) == REG
                   1656:                  && REGNO (SUBREG_REG (op)) < FIRST_PSEUDO_REGISTER)
                   1657:                offset = SUBREG_WORD (op);
                   1658:              op = SUBREG_REG (op);
                   1659:            }
                   1660: 
                   1661:          /* An empty constraint or empty alternative
                   1662:             allows anything which matched the pattern.  */
                   1663:          if (*p == 0 || *p == ',')
                   1664:            win = 1;
                   1665: 
                   1666:          while (*p && (c = *p++) != ',')
                   1667:            switch (c)
                   1668:              {
                   1669:              case '?':
                   1670:              case '!':
                   1671:              case '*':
                   1672:              case '%':
                   1673:                break;
                   1674: 
1.1.1.6   root     1675:              case '#':
                   1676:                /* Ignore rest of this alternative as far as
                   1677:                   constraint checking is concerned.  */
                   1678:                while (*p && *p != ',')
                   1679:                  p++;
                   1680:                break;
                   1681: 
1.1.1.3   root     1682:              case '=':
                   1683:                op_types[opno] = OP_OUT;
                   1684:                break;
                   1685: 
                   1686:              case '+':
                   1687:                op_types[opno] = OP_INOUT;
                   1688:                break;
                   1689: 
                   1690:              case '&':
                   1691:                earlyclobber[opno] = 1;
                   1692:                break;
                   1693: 
1.1       root     1694:              case '0':
                   1695:              case '1':
                   1696:              case '2':
                   1697:              case '3':
                   1698:              case '4':
                   1699:                /* This operand must be the same as a previous one.
                   1700:                   This kind of constraint is used for instructions such
                   1701:                   as add when they take only two operands.
                   1702: 
                   1703:                   Note that the lower-numbered operand is passed first.
                   1704: 
                   1705:                   If we are not testing strictly, assume that this constraint
                   1706:                   will be satisfied.  */
                   1707:                if (strict < 0)
                   1708:                  val = 1;
                   1709:                else
                   1710:                  val = operands_match_p (recog_operand[c - '0'],
                   1711:                                          recog_operand[opno]);
                   1712: 
1.1.1.3   root     1713:                matching_operands[opno] = c - '0';
                   1714:                matching_operands[c - '0'] = opno;
                   1715: 
1.1       root     1716:                if (val != 0)
                   1717:                  win = 1;
                   1718:                /* If output is *x and input is *--x,
                   1719:                   arrange later to change the output to *--x as well,
                   1720:                   since the output op is the one that will be printed.  */
                   1721:                if (val == 2 && strict > 0)
                   1722:                  {
                   1723:                    funny_match[funny_match_index].this = opno;
                   1724:                    funny_match[funny_match_index++].other = c - '0';
                   1725:                  }
                   1726:                break;
                   1727: 
                   1728:              case 'p':
                   1729:                /* p is used for address_operands.  When we are called by
1.1.1.6   root     1730:                   gen_reload, no one will have checked that the address is
                   1731:                   strictly valid, i.e., that all pseudos requiring hard regs
                   1732:                   have gotten them.  */
1.1       root     1733:                if (strict <= 0
                   1734:                    || (strict_memory_address_p
                   1735:                        (insn_operand_mode[insn_code_num][opno], op)))
                   1736:                  win = 1;
                   1737:                break;
                   1738: 
                   1739:                /* No need to check general_operand again;
                   1740:                   it was done in insn-recog.c.  */
                   1741:              case 'g':
                   1742:                /* Anything goes unless it is a REG and really has a hard reg
                   1743:                   but the hard reg is not in the class GENERAL_REGS.  */
                   1744:                if (strict < 0
                   1745:                    || GENERAL_REGS == ALL_REGS
                   1746:                    || GET_CODE (op) != REG
1.1.1.3   root     1747:                    || (reload_in_progress
                   1748:                        && REGNO (op) >= FIRST_PSEUDO_REGISTER)
1.1       root     1749:                    || reg_fits_class_p (op, GENERAL_REGS, offset, mode))
                   1750:                  win = 1;
                   1751:                break;
                   1752: 
                   1753:              case 'r':
                   1754:                if (strict < 0
                   1755:                    || (strict == 0
                   1756:                        && GET_CODE (op) == REG
                   1757:                        && REGNO (op) >= FIRST_PSEUDO_REGISTER)
                   1758:                    || (strict == 0 && GET_CODE (op) == SCRATCH)
                   1759:                    || (GET_CODE (op) == REG
1.1.1.5   root     1760:                        && ((GENERAL_REGS == ALL_REGS
                   1761:                             && REGNO (op) < FIRST_PSEUDO_REGISTER)
1.1       root     1762:                            || reg_fits_class_p (op, GENERAL_REGS,
                   1763:                                                 offset, mode))))
                   1764:                  win = 1;
                   1765:                break;
                   1766: 
                   1767:              case 'X':
                   1768:                /* This is used for a MATCH_SCRATCH in the cases when we
                   1769:                   don't actually need anything.  So anything goes any time. */
                   1770:                win = 1;
                   1771:                break;
                   1772: 
                   1773:              case 'm':
                   1774:                if (GET_CODE (op) == MEM
                   1775:                    /* Before reload, accept what reload can turn into mem.  */
1.1.1.3   root     1776:                    || (strict < 0 && CONSTANT_P (op))
                   1777:                    /* During reload, accept a pseudo  */
                   1778:                    || (reload_in_progress && GET_CODE (op) == REG
                   1779:                        && REGNO (op) >= FIRST_PSEUDO_REGISTER))
1.1       root     1780:                  win = 1;
                   1781:                break;
                   1782: 
                   1783:              case '<':
                   1784:                if (GET_CODE (op) == MEM
                   1785:                    && (GET_CODE (XEXP (op, 0)) == PRE_DEC
                   1786:                        || GET_CODE (XEXP (op, 0)) == POST_DEC))
                   1787:                  win = 1;
                   1788:                break;
                   1789: 
                   1790:              case '>':
                   1791:                if (GET_CODE (op) == MEM
                   1792:                    && (GET_CODE (XEXP (op, 0)) == PRE_INC
                   1793:                        || GET_CODE (XEXP (op, 0)) == POST_INC))
                   1794:                  win = 1;
                   1795:                break;
                   1796: 
                   1797:              case 'E':
1.1.1.7 ! root     1798: #ifndef REAL_ARITHMETIC
1.1       root     1799:                /* Match any CONST_DOUBLE, but only if
                   1800:                   we can examine the bits of it reliably.  */
                   1801:                if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT
1.1.1.4   root     1802:                     || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD)
1.1.1.2   root     1803:                    && GET_MODE (op) != VOIDmode && ! flag_pretend_float)
1.1       root     1804:                  break;
1.1.1.7 ! root     1805: #endif
1.1       root     1806:                if (GET_CODE (op) == CONST_DOUBLE)
                   1807:                  win = 1;
                   1808:                break;
                   1809: 
                   1810:              case 'F':
                   1811:                if (GET_CODE (op) == CONST_DOUBLE)
                   1812:                  win = 1;
                   1813:                break;
                   1814: 
                   1815:              case 'G':
                   1816:              case 'H':
                   1817:                if (GET_CODE (op) == CONST_DOUBLE
                   1818:                    && CONST_DOUBLE_OK_FOR_LETTER_P (op, c))
                   1819:                  win = 1;
                   1820:                break;
                   1821: 
                   1822:              case 's':
                   1823:                if (GET_CODE (op) == CONST_INT
                   1824:                    || (GET_CODE (op) == CONST_DOUBLE
                   1825:                        && GET_MODE (op) == VOIDmode))
                   1826:                  break;
                   1827:              case 'i':
                   1828:                if (CONSTANT_P (op))
                   1829:                  win = 1;
                   1830:                break;
                   1831: 
                   1832:              case 'n':
                   1833:                if (GET_CODE (op) == CONST_INT
                   1834:                    || (GET_CODE (op) == CONST_DOUBLE
                   1835:                        && GET_MODE (op) == VOIDmode))
                   1836:                  win = 1;
                   1837:                break;
                   1838: 
                   1839:              case 'I':
                   1840:              case 'J':
                   1841:              case 'K':
                   1842:              case 'L':
                   1843:              case 'M':
                   1844:              case 'N':
                   1845:              case 'O':
                   1846:              case 'P':
                   1847:                if (GET_CODE (op) == CONST_INT
                   1848:                    && CONST_OK_FOR_LETTER_P (INTVAL (op), c))
                   1849:                  win = 1;
                   1850:                break;
                   1851: 
                   1852: #ifdef EXTRA_CONSTRAINT
                   1853:               case 'Q':
                   1854:               case 'R':
                   1855:               case 'S':
                   1856:               case 'T':
                   1857:               case 'U':
                   1858:                if (EXTRA_CONSTRAINT (op, c))
                   1859:                  win = 1;
                   1860:                break;
                   1861: #endif
                   1862: 
                   1863:              case 'V':
                   1864:                if (GET_CODE (op) == MEM
                   1865:                    && ! offsettable_memref_p (op))
                   1866:                  win = 1;
                   1867:                break;
                   1868: 
                   1869:              case 'o':
                   1870:                if ((strict > 0 && offsettable_memref_p (op))
                   1871:                    || (strict == 0 && offsettable_nonstrict_memref_p (op))
                   1872:                    /* Before reload, accept what reload can handle.  */
                   1873:                    || (strict < 0
1.1.1.3   root     1874:                        && (CONSTANT_P (op) || GET_CODE (op) == MEM))
                   1875:                    /* During reload, accept a pseudo  */
                   1876:                    || (reload_in_progress && GET_CODE (op) == REG
                   1877:                        && REGNO (op) >= FIRST_PSEUDO_REGISTER))
1.1       root     1878:                  win = 1;
                   1879:                break;
                   1880: 
                   1881:              default:
                   1882:                if (strict < 0
                   1883:                    || (strict == 0
                   1884:                        && GET_CODE (op) == REG
                   1885:                        && REGNO (op) >= FIRST_PSEUDO_REGISTER)
                   1886:                    || (strict == 0 && GET_CODE (op) == SCRATCH)
                   1887:                    || (GET_CODE (op) == REG
                   1888:                        && reg_fits_class_p (op, REG_CLASS_FROM_LETTER (c),
                   1889:                                             offset, mode)))
                   1890:                  win = 1;
                   1891:              }
                   1892: 
                   1893:          constraints[opno] = p;
                   1894:          /* If this operand did not win somehow,
                   1895:             this alternative loses.  */
                   1896:          if (! win)
                   1897:            lose = 1;
                   1898:        }
                   1899:       /* This alternative won; the operands are ok.
                   1900:         Change whichever operands this alternative says to change.  */
                   1901:       if (! lose)
                   1902:        {
1.1.1.3   root     1903:          int opno, eopno;
                   1904: 
                   1905:          /* See if any earlyclobber operand conflicts with some other
                   1906:             operand.  */
                   1907: 
                   1908:          if (strict > 0)
                   1909:            for (eopno = 0; eopno < noperands; eopno++)
                   1910:              /* Ignore earlyclobber operands now in memory,
                   1911:                 because we would often report failure when we have
                   1912:                 two memory operands, one of which was formerly a REG.  */
                   1913:              if (earlyclobber[eopno]
                   1914:                  && GET_CODE (recog_operand[eopno]) == REG)
                   1915:                for (opno = 0; opno < noperands; opno++)
                   1916:                  if ((GET_CODE (recog_operand[opno]) == MEM
                   1917:                       || op_types[opno] != OP_OUT)
                   1918:                      && opno != eopno
1.1.1.5   root     1919:                      /* Ignore things like match_operator operands. */
                   1920:                      && *constraints[opno] != 0
1.1.1.3   root     1921:                      && ! (matching_operands[opno] == eopno
                   1922:                            && rtx_equal_p (recog_operand[opno],
                   1923:                                            recog_operand[eopno]))
                   1924:                      && ! safe_from_earlyclobber (recog_operand[opno],
                   1925:                                                   recog_operand[eopno]))
                   1926:                    lose = 1;
                   1927: 
                   1928:          if (! lose)
1.1       root     1929:            {
1.1.1.3   root     1930:              while (--funny_match_index >= 0)
                   1931:                {
                   1932:                  recog_operand[funny_match[funny_match_index].other]
                   1933:                    = recog_operand[funny_match[funny_match_index].this];
                   1934:                }
                   1935: 
                   1936:              return 1;
1.1       root     1937:            }
                   1938:        }
                   1939: 
                   1940:       which_alternative++;
                   1941:     }
                   1942: 
                   1943:   /* If we are about to reject this, but we are not to test strictly,
                   1944:      try a very loose test.  Only return failure if it fails also.  */
                   1945:   if (strict == 0)
                   1946:     return constrain_operands (insn_code_num, -1);
                   1947:   else
                   1948:     return 0;
                   1949: }
                   1950: 
                   1951: /* Return 1 iff OPERAND (assumed to be a REG rtx)
                   1952:    is a hard reg in class CLASS when its regno is offsetted by OFFSET
                   1953:    and changed to mode MODE.
                   1954:    If REG occupies multiple hard regs, all of them must be in CLASS.  */
                   1955: 
                   1956: int
                   1957: reg_fits_class_p (operand, class, offset, mode)
                   1958:      rtx operand;
                   1959:      register enum reg_class class;
                   1960:      int offset;
                   1961:      enum machine_mode mode;
                   1962: {
                   1963:   register int regno = REGNO (operand);
                   1964:   if (regno < FIRST_PSEUDO_REGISTER
                   1965:       && TEST_HARD_REG_BIT (reg_class_contents[(int) class],
                   1966:                            regno + offset))
                   1967:     {
                   1968:       register int sr;
                   1969:       regno += offset;
                   1970:       for (sr = HARD_REGNO_NREGS (regno, mode) - 1;
                   1971:           sr > 0; sr--)
                   1972:        if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class],
                   1973:                                 regno + sr))
                   1974:          break;
                   1975:       return sr == 0;
                   1976:     }
                   1977: 
                   1978:   return 0;
                   1979: }
                   1980: 
                   1981: #endif /* REGISTER_CONSTRAINTS */

unix.superglobalmegacorp.com

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