Annotation of gcc/recog.c, revision 1.1.1.1

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