Annotation of GNUtools/cc/reload1.c, revision 1.1

1.1     ! root        1: /* Reload pseudo regs into hard regs for insns that require hard regs.
        !             2:    Copyright (C) 1987, 1988, 1989, 1992, 1993 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 <stdio.h>
        !            22: #include "config.h"
        !            23: #include "rtl.h"
        !            24: #include "obstack.h"
        !            25: #include "insn-config.h"
        !            26: #include "insn-flags.h"
        !            27: #include "insn-codes.h"
        !            28: #include "flags.h"
        !            29: #include "expr.h"
        !            30: #include "regs.h"
        !            31: #include "hard-reg-set.h"
        !            32: #include "reload.h"
        !            33: #include "recog.h"
        !            34: #include "basic-block.h"
        !            35: #include "output.h"
        !            36: 
        !            37: /* This file contains the reload pass of the compiler, which is
        !            38:    run after register allocation has been done.  It checks that
        !            39:    each insn is valid (operands required to be in registers really
        !            40:    are in registers of the proper class) and fixes up invalid ones
        !            41:    by copying values temporarily into registers for the insns
        !            42:    that need them.
        !            43: 
        !            44:    The results of register allocation are described by the vector
        !            45:    reg_renumber; the insns still contain pseudo regs, but reg_renumber
        !            46:    can be used to find which hard reg, if any, a pseudo reg is in.
        !            47: 
        !            48:    The technique we always use is to free up a few hard regs that are
        !            49:    called ``reload regs'', and for each place where a pseudo reg
        !            50:    must be in a hard reg, copy it temporarily into one of the reload regs.
        !            51: 
        !            52:    All the pseudos that were formerly allocated to the hard regs that
        !            53:    are now in use as reload regs must be ``spilled''.  This means
        !            54:    that they go to other hard regs, or to stack slots if no other
        !            55:    available hard regs can be found.  Spilling can invalidate more
        !            56:    insns, requiring additional need for reloads, so we must keep checking
        !            57:    until the process stabilizes.
        !            58: 
        !            59:    For machines with different classes of registers, we must keep track
        !            60:    of the register class needed for each reload, and make sure that
        !            61:    we allocate enough reload registers of each class.
        !            62: 
        !            63:    The file reload.c contains the code that checks one insn for
        !            64:    validity and reports the reloads that it needs.  This file
        !            65:    is in charge of scanning the entire rtl code, accumulating the
        !            66:    reload needs, spilling, assigning reload registers to use for
        !            67:    fixing up each insn, and generating the new insns to copy values
        !            68:    into the reload registers.  */
        !            69: 
        !            70: 
        !            71: #ifndef REGISTER_MOVE_COST
        !            72: #define REGISTER_MOVE_COST(x, y) 2
        !            73: #endif
        !            74: 
        !            75: #ifndef MEMORY_MOVE_COST
        !            76: #define MEMORY_MOVE_COST(x) 4
        !            77: #endif
        !            78: 
        !            79: /* During reload_as_needed, element N contains a REG rtx for the hard reg
        !            80:    into which reg N has been reloaded (perhaps for a previous insn). */
        !            81: static rtx *reg_last_reload_reg;
        !            82: 
        !            83: /* Elt N nonzero if reg_last_reload_reg[N] has been set in this insn
        !            84:    for an output reload that stores into reg N.  */
        !            85: static char *reg_has_output_reload;
        !            86: 
        !            87: /* Indicates which hard regs are reload-registers for an output reload
        !            88:    in the current insn.  */
        !            89: static HARD_REG_SET reg_is_output_reload;
        !            90: 
        !            91: /* Element N is the constant value to which pseudo reg N is equivalent,
        !            92:    or zero if pseudo reg N is not equivalent to a constant.
        !            93:    find_reloads looks at this in order to replace pseudo reg N
        !            94:    with the constant it stands for.  */
        !            95: rtx *reg_equiv_constant;
        !            96: 
        !            97: /* Element N is a memory location to which pseudo reg N is equivalent,
        !            98:    prior to any register elimination (such as frame pointer to stack
        !            99:    pointer).  Depending on whether or not it is a valid address, this value
        !           100:    is transferred to either reg_equiv_address or reg_equiv_mem.  */
        !           101: rtx *reg_equiv_memory_loc;
        !           102: 
        !           103: /* Element N is the address of stack slot to which pseudo reg N is equivalent.
        !           104:    This is used when the address is not valid as a memory address
        !           105:    (because its displacement is too big for the machine.)  */
        !           106: rtx *reg_equiv_address;
        !           107: 
        !           108: /* Element N is the memory slot to which pseudo reg N is equivalent,
        !           109:    or zero if pseudo reg N is not equivalent to a memory slot.  */
        !           110: rtx *reg_equiv_mem;
        !           111: 
        !           112: /* Widest width in which each pseudo reg is referred to (via subreg).  */
        !           113: static int *reg_max_ref_width;
        !           114: 
        !           115: /* Element N is the insn that initialized reg N from its equivalent
        !           116:    constant or memory slot.  */
        !           117: static rtx *reg_equiv_init;
        !           118: 
        !           119: /* During reload_as_needed, element N contains the last pseudo regno
        !           120:    reloaded into the Nth reload register.  This vector is in parallel
        !           121:    with spill_regs.  If that pseudo reg occupied more than one register,
        !           122:    reg_reloaded_contents points to that pseudo for each spill register in
        !           123:    use; all of these must remain set for an inheritance to occur.  */
        !           124: static int reg_reloaded_contents[FIRST_PSEUDO_REGISTER];
        !           125: 
        !           126: /* During reload_as_needed, element N contains the insn for which
        !           127:    the Nth reload register was last used.  This vector is in parallel
        !           128:    with spill_regs, and its contents are significant only when
        !           129:    reg_reloaded_contents is significant.  */
        !           130: static rtx reg_reloaded_insn[FIRST_PSEUDO_REGISTER];
        !           131: 
        !           132: /* Number of spill-regs so far; number of valid elements of spill_regs.  */
        !           133: static int n_spills;
        !           134: 
        !           135: /* In parallel with spill_regs, contains REG rtx's for those regs.
        !           136:    Holds the last rtx used for any given reg, or 0 if it has never
        !           137:    been used for spilling yet.  This rtx is reused, provided it has
        !           138:    the proper mode.  */
        !           139: static rtx spill_reg_rtx[FIRST_PSEUDO_REGISTER];
        !           140: 
        !           141: /* In parallel with spill_regs, contains nonzero for a spill reg
        !           142:    that was stored after the last time it was used.
        !           143:    The precise value is the insn generated to do the store.  */
        !           144: static rtx spill_reg_store[FIRST_PSEUDO_REGISTER];
        !           145: 
        !           146: /* This table is the inverse mapping of spill_regs:
        !           147:    indexed by hard reg number,
        !           148:    it contains the position of that reg in spill_regs,
        !           149:    or -1 for something that is not in spill_regs.  */
        !           150: static short spill_reg_order[FIRST_PSEUDO_REGISTER];
        !           151: 
        !           152: /* This reg set indicates registers that may not be used for retrying global
        !           153:    allocation.  The registers that may not be used include all spill registers
        !           154:    and the frame pointer (if we are using one).  */
        !           155: HARD_REG_SET forbidden_regs;
        !           156: 
        !           157: /* This reg set indicates registers that are not good for spill registers.
        !           158:    They will not be used to complete groups of spill registers.  This includes
        !           159:    all fixed registers, registers that may be eliminated, and, if
        !           160:    SMALL_REGISTER_CLASSES is not defined, registers explicitly used in the rtl.
        !           161: 
        !           162:    (spill_reg_order prevents these registers from being used to start a
        !           163:    group.)  */
        !           164: static HARD_REG_SET bad_spill_regs;
        !           165: 
        !           166: /* Describes order of use of registers for reloading
        !           167:    of spilled pseudo-registers.  `spills' is the number of
        !           168:    elements that are actually valid; new ones are added at the end.  */
        !           169: static short spill_regs[FIRST_PSEUDO_REGISTER];
        !           170: 
        !           171: /* Describes order of preference for putting regs into spill_regs.
        !           172:    Contains the numbers of all the hard regs, in order most preferred first.
        !           173:    This order is different for each function.
        !           174:    It is set up by order_regs_for_reload.
        !           175:    Empty elements at the end contain -1.  */
        !           176: static short potential_reload_regs[FIRST_PSEUDO_REGISTER];
        !           177: 
        !           178: /* 1 for a hard register that appears explicitly in the rtl
        !           179:    (for example, function value registers, special registers
        !           180:    used by insns, structure value pointer registers).  */
        !           181: static char regs_explicitly_used[FIRST_PSEUDO_REGISTER];
        !           182: 
        !           183: /* Indicates if a register was counted against the need for
        !           184:    groups.  0 means it can count against max_nongroup instead.  */
        !           185: static HARD_REG_SET counted_for_groups;
        !           186: 
        !           187: /* Indicates if a register was counted against the need for
        !           188:    non-groups.  0 means it can become part of a new group.
        !           189:    During choose_reload_regs, 1 here means don't use this reg
        !           190:    as part of a group, even if it seems to be otherwise ok.  */
        !           191: static HARD_REG_SET counted_for_nongroups;
        !           192: 
        !           193: /* Indexed by pseudo reg number N,
        !           194:    says may not delete stores into the real (memory) home of pseudo N.
        !           195:    This is set if we already substituted a memory equivalent in some uses,
        !           196:    which happens when we have to eliminate the fp from it.  */
        !           197: static char *cannot_omit_stores;
        !           198: 
        !           199: /* Nonzero if indirect addressing is supported on the machine; this means
        !           200:    that spilling (REG n) does not require reloading it into a register in
        !           201:    order to do (MEM (REG n)) or (MEM (PLUS (REG n) (CONST_INT c))).  The
        !           202:    value indicates the level of indirect addressing supported, e.g., two
        !           203:    means that (MEM (MEM (REG n))) is also valid if (REG n) does not get
        !           204:    a hard register.  */
        !           205: 
        !           206: static char spill_indirect_levels;
        !           207: 
        !           208: /* Nonzero if indirect addressing is supported when the innermost MEM is
        !           209:    of the form (MEM (SYMBOL_REF sym)).  It is assumed that the level to
        !           210:    which these are valid is the same as spill_indirect_levels, above.   */
        !           211: 
        !           212: char indirect_symref_ok;
        !           213: 
        !           214: /* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid.  */
        !           215: 
        !           216: char double_reg_address_ok;
        !           217: 
        !           218: /* Record the stack slot for each spilled hard register.  */
        !           219: 
        !           220: static rtx spill_stack_slot[FIRST_PSEUDO_REGISTER];
        !           221: 
        !           222: /* Width allocated so far for that stack slot.  */
        !           223: 
        !           224: static int spill_stack_slot_width[FIRST_PSEUDO_REGISTER];
        !           225: 
        !           226: /* Indexed by register class and basic block number, nonzero if there is
        !           227:    any need for a spill register of that class in that basic block.
        !           228:    The pointer is 0 if we did stupid allocation and don't know
        !           229:    the structure of basic blocks.  */
        !           230: 
        !           231: char *basic_block_needs[N_REG_CLASSES];
        !           232: 
        !           233: /* First uid used by insns created by reload in this function.
        !           234:    Used in find_equiv_reg.  */
        !           235: int reload_first_uid;
        !           236: 
        !           237: /* Flag set by local-alloc or global-alloc if anything is live in
        !           238:    a call-clobbered reg across calls.  */
        !           239: 
        !           240: int caller_save_needed;
        !           241: 
        !           242: /* Set to 1 while reload_as_needed is operating.
        !           243:    Required by some machines to handle any generated moves differently.  */
        !           244: 
        !           245: int reload_in_progress = 0;
        !           246: 
        !           247: /* These arrays record the insn_code of insns that may be needed to
        !           248:    perform input and output reloads of special objects.  They provide a
        !           249:    place to pass a scratch register.  */
        !           250: 
        !           251: enum insn_code reload_in_optab[NUM_MACHINE_MODES];
        !           252: enum insn_code reload_out_optab[NUM_MACHINE_MODES];
        !           253: 
        !           254: /* This obstack is used for allocation of rtl during register elimination.
        !           255:    The allocated storage can be freed once find_reloads has processed the
        !           256:    insn.  */
        !           257: 
        !           258: struct obstack reload_obstack;
        !           259: char *reload_firstobj;
        !           260: 
        !           261: #define obstack_chunk_alloc xmalloc
        !           262: #define obstack_chunk_free free
        !           263: 
        !           264: /* List of labels that must never be deleted.  */
        !           265: extern rtx forced_labels;
        !           266: 
        !           267: /* This structure is used to record information about register eliminations.
        !           268:    Each array entry describes one possible way of eliminating a register
        !           269:    in favor of another.   If there is more than one way of eliminating a
        !           270:    particular register, the most preferred should be specified first.  */
        !           271: 
        !           272: static struct elim_table
        !           273: {
        !           274:   int from;                    /* Register number to be eliminated. */
        !           275:   int to;                      /* Register number used as replacement. */
        !           276:   int initial_offset;          /* Initial difference between values. */
        !           277:   int can_eliminate;           /* Non-zero if this elimination can be done. */
        !           278:   int can_eliminate_previous;  /* Value of CAN_ELIMINATE in previous scan over
        !           279:                                   insns made by reload. */
        !           280:   int offset;                  /* Current offset between the two regs. */
        !           281:   int max_offset;              /* Maximum offset between the two regs. */
        !           282:   int previous_offset;         /* Offset at end of previous insn. */
        !           283:   int ref_outside_mem;         /* "to" has been referenced outside a MEM. */
        !           284:   rtx from_rtx;                        /* REG rtx for the register to be eliminated.
        !           285:                                   We cannot simply compare the number since
        !           286:                                   we might then spuriously replace a hard
        !           287:                                   register corresponding to a pseudo
        !           288:                                   assigned to the reg to be eliminated. */
        !           289:   rtx to_rtx;                  /* REG rtx for the replacement. */
        !           290: } reg_eliminate[] =
        !           291: 
        !           292: /* If a set of eliminable registers was specified, define the table from it.
        !           293:    Otherwise, default to the normal case of the frame pointer being
        !           294:    replaced by the stack pointer.  */
        !           295: 
        !           296: #ifdef ELIMINABLE_REGS
        !           297:   ELIMINABLE_REGS;
        !           298: #else
        !           299:   {{ FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}};
        !           300: #endif
        !           301: 
        !           302: #define NUM_ELIMINABLE_REGS (sizeof reg_eliminate / sizeof reg_eliminate[0])
        !           303: 
        !           304: /* Record the number of pending eliminations that have an offset not equal
        !           305:    to their initial offset.  If non-zero, we use a new copy of each
        !           306:    replacement result in any insns encountered.  */
        !           307: static int num_not_at_initial_offset;
        !           308: 
        !           309: /* Count the number of registers that we may be able to eliminate.  */
        !           310: static int num_eliminable;
        !           311: 
        !           312: /* For each label, we record the offset of each elimination.  If we reach
        !           313:    a label by more than one path and an offset differs, we cannot do the
        !           314:    elimination.  This information is indexed by the number of the label.
        !           315:    The first table is an array of flags that records whether we have yet
        !           316:    encountered a label and the second table is an array of arrays, one
        !           317:    entry in the latter array for each elimination.  */
        !           318: 
        !           319: static char *offsets_known_at;
        !           320: static int (*offsets_at)[NUM_ELIMINABLE_REGS];
        !           321: 
        !           322: /* Number of labels in the current function.  */
        !           323: 
        !           324: static int num_labels;
        !           325: 
        !           326: struct hard_reg_n_uses { int regno; int uses; };
        !           327: 
        !           328: static int possible_group_p            PROTO((int, int *));
        !           329: static void count_possible_groups      PROTO((int *, enum machine_mode *,
        !           330:                                               int *));
        !           331: static int modes_equiv_for_class_p     PROTO((enum machine_mode,
        !           332:                                               enum machine_mode,
        !           333:                                               enum reg_class));
        !           334: static void spill_failure              PROTO((rtx));
        !           335: static int new_spill_reg               PROTO((int, int, int *, int *, int,
        !           336:                                               FILE *));
        !           337: static void delete_dead_insn           PROTO((rtx));
        !           338: static void alter_reg                          PROTO((int, int));
        !           339: static void mark_scratch_live          PROTO((rtx));
        !           340: static void set_label_offsets          PROTO((rtx, rtx, int));
        !           341: static int eliminate_regs_in_insn      PROTO((rtx, int));
        !           342: static void mark_not_eliminable                PROTO((rtx, rtx));
        !           343: static int spill_hard_reg              PROTO((int, int, FILE *, int));
        !           344: static void scan_paradoxical_subregs   PROTO((rtx));
        !           345: static int hard_reg_use_compare                PROTO((struct hard_reg_n_uses *,
        !           346:                                               struct hard_reg_n_uses *));
        !           347: static void order_regs_for_reload      PROTO((void));
        !           348: static void reload_as_needed           PROTO((rtx, int));
        !           349: static void forget_old_reloads_1       PROTO((rtx, rtx));
        !           350: static int reload_reg_class_lower      PROTO((short *, short *));
        !           351: static void mark_reload_reg_in_use     PROTO((int, int, enum reload_type,
        !           352:                                               enum machine_mode));
        !           353: static void clear_reload_reg_in_use    PROTO((int, int, enum reload_type,
        !           354:                                               enum machine_mode));
        !           355: static int reload_reg_free_p           PROTO((int, int, enum reload_type));
        !           356: static int reload_reg_free_before_p    PROTO((int, int, enum reload_type));
        !           357: static int reload_reg_reaches_end_p    PROTO((int, int, enum reload_type));
        !           358: static int allocate_reload_reg         PROTO((int, rtx, int, int));
        !           359: static void choose_reload_regs         PROTO((rtx, rtx));
        !           360: static void merge_assigned_reloads     PROTO((rtx));
        !           361: static void emit_reload_insns          PROTO((rtx));
        !           362: static void delete_output_reload       PROTO((rtx, int, rtx));
        !           363: static void inc_for_reload             PROTO((rtx, rtx, int));
        !           364: static int constraint_accepts_reg_p    PROTO((char *, rtx));
        !           365: static int count_occurrences           PROTO((rtx, rtx));
        !           366: 
        !           367: /* Initialize the reload pass once per compilation.  */
        !           368: 
        !           369: void
        !           370: init_reload ()
        !           371: {
        !           372:   register int i;
        !           373: 
        !           374:   /* Often (MEM (REG n)) is still valid even if (REG n) is put on the stack.
        !           375:      Set spill_indirect_levels to the number of levels such addressing is
        !           376:      permitted, zero if it is not permitted at all.  */
        !           377: 
        !           378:   register rtx tem
        !           379:     = gen_rtx (MEM, Pmode,
        !           380:               gen_rtx (PLUS, Pmode,
        !           381:                        gen_rtx (REG, Pmode, LAST_VIRTUAL_REGISTER + 1),
        !           382:                        GEN_INT (4)));
        !           383:   spill_indirect_levels = 0;
        !           384: 
        !           385:   while (memory_address_p (QImode, tem))
        !           386:     {
        !           387:       spill_indirect_levels++;
        !           388:       tem = gen_rtx (MEM, Pmode, tem);
        !           389:     }
        !           390: 
        !           391:   /* See if indirect addressing is valid for (MEM (SYMBOL_REF ...)).  */
        !           392: 
        !           393:   tem = gen_rtx (MEM, Pmode, gen_rtx (SYMBOL_REF, Pmode, "foo"));
        !           394:   indirect_symref_ok = memory_address_p (QImode, tem);
        !           395: 
        !           396:   /* See if reg+reg is a valid (and offsettable) address.  */
        !           397: 
        !           398:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           399:     {
        !           400:       tem = gen_rtx (PLUS, Pmode,
        !           401:                     gen_rtx (REG, Pmode, HARD_FRAME_POINTER_REGNUM),
        !           402:                     gen_rtx (REG, Pmode, i));
        !           403:       /* This way, we make sure that reg+reg is an offsettable address.  */
        !           404:       tem = plus_constant (tem, 4);
        !           405: 
        !           406:       if (memory_address_p (QImode, tem))
        !           407:        {
        !           408:          double_reg_address_ok = 1;
        !           409:          break;
        !           410:        }
        !           411:     }
        !           412: 
        !           413:   /* Initialize obstack for our rtl allocation. */
        !           414:   gcc_obstack_init (&reload_obstack);
        !           415:   reload_firstobj = (char *) obstack_alloc (&reload_obstack, 0);
        !           416: }
        !           417: 
        !           418: /* Main entry point for the reload pass.
        !           419: 
        !           420:    FIRST is the first insn of the function being compiled.
        !           421: 
        !           422:    GLOBAL nonzero means we were called from global_alloc
        !           423:    and should attempt to reallocate any pseudoregs that we
        !           424:    displace from hard regs we will use for reloads.
        !           425:    If GLOBAL is zero, we do not have enough information to do that,
        !           426:    so any pseudo reg that is spilled must go to the stack.
        !           427: 
        !           428:    DUMPFILE is the global-reg debugging dump file stream, or 0.
        !           429:    If it is nonzero, messages are written to it to describe
        !           430:    which registers are seized as reload regs, which pseudo regs
        !           431:    are spilled from them, and where the pseudo regs are reallocated to.
        !           432: 
        !           433:    Return value is nonzero if reload failed
        !           434:    and we must not do any more for this function.  */
        !           435: 
        !           436: int
        !           437: reload (first, global, dumpfile)
        !           438:      rtx first;
        !           439:      int global;
        !           440:      FILE *dumpfile;
        !           441: {
        !           442:   register int class;
        !           443:   register int i, j;
        !           444:   register rtx insn;
        !           445:   register struct elim_table *ep;
        !           446: 
        !           447:   int something_changed;
        !           448:   int something_needs_reloads;
        !           449:   int something_needs_elimination;
        !           450:   int new_basic_block_needs;
        !           451:   enum reg_class caller_save_spill_class = NO_REGS;
        !           452:   int caller_save_group_size = 1;
        !           453: 
        !           454:   /* Nonzero means we couldn't get enough spill regs.  */
        !           455:   int failure = 0;
        !           456: 
        !           457:   /* The basic block number currently being processed for INSN.  */
        !           458:   int this_block;
        !           459: 
        !           460:   /* Make sure even insns with volatile mem refs are recognizable.  */
        !           461:   init_recog ();
        !           462: 
        !           463:   /* Enable find_equiv_reg to distinguish insns made by reload.  */
        !           464:   reload_first_uid = get_max_uid ();
        !           465: 
        !           466:   for (i = 0; i < N_REG_CLASSES; i++)
        !           467:     basic_block_needs[i] = 0;
        !           468: 
        !           469: #ifdef SECONDARY_MEMORY_NEEDED
        !           470:   /* Initialize the secondary memory table.  */
        !           471:   clear_secondary_mem ();
        !           472: #endif
        !           473: 
        !           474:   /* Remember which hard regs appear explicitly
        !           475:      before we merge into `regs_ever_live' the ones in which
        !           476:      pseudo regs have been allocated.  */
        !           477:   bcopy (regs_ever_live, regs_explicitly_used, sizeof regs_ever_live);
        !           478: 
        !           479:   /* We don't have a stack slot for any spill reg yet.  */
        !           480:   bzero (spill_stack_slot, sizeof spill_stack_slot);
        !           481:   bzero (spill_stack_slot_width, sizeof spill_stack_slot_width);
        !           482: 
        !           483:   /* Initialize the save area information for caller-save, in case some
        !           484:      are needed.  */
        !           485:   init_save_areas ();
        !           486: 
        !           487:   /* Compute which hard registers are now in use
        !           488:      as homes for pseudo registers.
        !           489:      This is done here rather than (eg) in global_alloc
        !           490:      because this point is reached even if not optimizing.  */
        !           491: 
        !           492:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           493:     mark_home_live (i);
        !           494: 
        !           495:   for (i = 0; i < scratch_list_length; i++)
        !           496:     if (scratch_list[i])
        !           497:       mark_scratch_live (scratch_list[i]);
        !           498: 
        !           499:   /* Make sure that the last insn in the chain
        !           500:      is not something that needs reloading.  */
        !           501:   emit_note (NULL_PTR, NOTE_INSN_DELETED);
        !           502: 
        !           503:   /* Find all the pseudo registers that didn't get hard regs
        !           504:      but do have known equivalent constants or memory slots.
        !           505:      These include parameters (known equivalent to parameter slots)
        !           506:      and cse'd or loop-moved constant memory addresses.
        !           507: 
        !           508:      Record constant equivalents in reg_equiv_constant
        !           509:      so they will be substituted by find_reloads.
        !           510:      Record memory equivalents in reg_mem_equiv so they can
        !           511:      be substituted eventually by altering the REG-rtx's.  */
        !           512: 
        !           513:   reg_equiv_constant = (rtx *) alloca (max_regno * sizeof (rtx));
        !           514:   bzero (reg_equiv_constant, max_regno * sizeof (rtx));
        !           515:   reg_equiv_memory_loc = (rtx *) alloca (max_regno * sizeof (rtx));
        !           516:   bzero (reg_equiv_memory_loc, max_regno * sizeof (rtx));
        !           517:   reg_equiv_mem = (rtx *) alloca (max_regno * sizeof (rtx));
        !           518:   bzero (reg_equiv_mem, max_regno * sizeof (rtx));
        !           519:   reg_equiv_init = (rtx *) alloca (max_regno * sizeof (rtx));
        !           520:   bzero (reg_equiv_init, max_regno * sizeof (rtx));
        !           521:   reg_equiv_address = (rtx *) alloca (max_regno * sizeof (rtx));
        !           522:   bzero (reg_equiv_address, max_regno * sizeof (rtx));
        !           523:   reg_max_ref_width = (int *) alloca (max_regno * sizeof (int));
        !           524:   bzero (reg_max_ref_width, max_regno * sizeof (int));
        !           525:   cannot_omit_stores = (char *) alloca (max_regno);
        !           526:   bzero (cannot_omit_stores, max_regno);
        !           527: 
        !           528:   /* Look for REG_EQUIV notes; record what each pseudo is equivalent to.
        !           529:      Also find all paradoxical subregs
        !           530:      and find largest such for each pseudo.  */
        !           531: 
        !           532:   for (insn = first; insn; insn = NEXT_INSN (insn))
        !           533:     {
        !           534:       rtx set = single_set (insn);
        !           535: 
        !           536:       if (set != 0 && GET_CODE (SET_DEST (set)) == REG)
        !           537:        {
        !           538:          rtx note = find_reg_note (insn, REG_EQUIV, NULL_RTX);
        !           539:          if (note
        !           540: #ifdef LEGITIMATE_PIC_OPERAND_P
        !           541:              && (! CONSTANT_P (XEXP (note, 0)) || ! flag_pic
        !           542:                  || LEGITIMATE_PIC_OPERAND_P (XEXP (note, 0)))
        !           543: #endif
        !           544:              )
        !           545:            {
        !           546:              rtx x = XEXP (note, 0);
        !           547:              i = REGNO (SET_DEST (set));
        !           548:              if (i > LAST_VIRTUAL_REGISTER)
        !           549:                {
        !           550:                  if (GET_CODE (x) == MEM)
        !           551:                    reg_equiv_memory_loc[i] = x;
        !           552:                  else if (CONSTANT_P (x))
        !           553:                    {
        !           554:                      if (LEGITIMATE_CONSTANT_P (x))
        !           555:                        reg_equiv_constant[i] = x;
        !           556:                      else
        !           557:                        reg_equiv_memory_loc[i]
        !           558:                          = force_const_mem (GET_MODE (SET_DEST (set)), x);
        !           559:                    }
        !           560:                  else
        !           561:                    continue;
        !           562: 
        !           563:                  /* If this register is being made equivalent to a MEM
        !           564:                     and the MEM is not SET_SRC, the equivalencing insn
        !           565:                     is one with the MEM as a SET_DEST and it occurs later.
        !           566:                     So don't mark this insn now.  */
        !           567:                  if (GET_CODE (x) != MEM
        !           568:                      || rtx_equal_p (SET_SRC (set), x))
        !           569:                    reg_equiv_init[i] = insn;
        !           570:                }
        !           571:            }
        !           572:        }
        !           573: 
        !           574:       /* If this insn is setting a MEM from a register equivalent to it,
        !           575:         this is the equivalencing insn.  */
        !           576:       else if (set && GET_CODE (SET_DEST (set)) == MEM
        !           577:               && GET_CODE (SET_SRC (set)) == REG
        !           578:               && reg_equiv_memory_loc[REGNO (SET_SRC (set))]
        !           579:               && rtx_equal_p (SET_DEST (set),
        !           580:                               reg_equiv_memory_loc[REGNO (SET_SRC (set))]))
        !           581:        reg_equiv_init[REGNO (SET_SRC (set))] = insn;
        !           582: 
        !           583:       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
        !           584:        scan_paradoxical_subregs (PATTERN (insn));
        !           585:     }
        !           586: 
        !           587:   /* Does this function require a frame pointer?  */
        !           588: 
        !           589:   frame_pointer_needed = (! flag_omit_frame_pointer
        !           590: #ifdef EXIT_IGNORE_STACK
        !           591:                          /* ?? If EXIT_IGNORE_STACK is set, we will not save
        !           592:                             and restore sp for alloca.  So we can't eliminate
        !           593:                             the frame pointer in that case.  At some point,
        !           594:                             we should improve this by emitting the
        !           595:                             sp-adjusting insns for this case.  */
        !           596:                          || (current_function_calls_alloca
        !           597:                              && EXIT_IGNORE_STACK)
        !           598: #endif
        !           599:                          || FRAME_POINTER_REQUIRED);
        !           600: 
        !           601:   num_eliminable = 0;
        !           602: 
        !           603:   /* Initialize the table of registers to eliminate.  The way we do this
        !           604:      depends on how the eliminable registers were defined.  */
        !           605: #ifdef ELIMINABLE_REGS
        !           606:   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !           607:     {
        !           608:       ep->can_eliminate = ep->can_eliminate_previous
        !           609:        = (CAN_ELIMINATE (ep->from, ep->to)
        !           610:           && (ep->from != HARD_FRAME_POINTER_REGNUM 
        !           611:               || ! frame_pointer_needed));
        !           612:     }
        !           613: #else
        !           614:   reg_eliminate[0].can_eliminate = reg_eliminate[0].can_eliminate_previous
        !           615:     = ! frame_pointer_needed;
        !           616: #endif
        !           617: 
        !           618:   /* Count the number of eliminable registers and build the FROM and TO
        !           619:      REG rtx's.  Note that code in gen_rtx will cause, e.g.,
        !           620:      gen_rtx (REG, Pmode, STACK_POINTER_REGNUM) to equal stack_pointer_rtx.
        !           621:      We depend on this.  */
        !           622:   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !           623:     {
        !           624:       num_eliminable += ep->can_eliminate;
        !           625:       ep->from_rtx = gen_rtx (REG, Pmode, ep->from);
        !           626:       ep->to_rtx = gen_rtx (REG, Pmode, ep->to);
        !           627:     }
        !           628: 
        !           629:   num_labels = max_label_num () - get_first_label_num ();
        !           630: 
        !           631:   /* Allocate the tables used to store offset information at labels.  */
        !           632:   offsets_known_at = (char *) alloca (num_labels);
        !           633:   offsets_at
        !           634:     = (int (*)[NUM_ELIMINABLE_REGS])
        !           635:       alloca (num_labels * NUM_ELIMINABLE_REGS * sizeof (int));
        !           636: 
        !           637:   offsets_known_at -= get_first_label_num ();
        !           638:   offsets_at -= get_first_label_num ();
        !           639: 
        !           640:   /* Alter each pseudo-reg rtx to contain its hard reg number.
        !           641:      Assign stack slots to the pseudos that lack hard regs or equivalents.
        !           642:      Do not touch virtual registers.  */
        !           643: 
        !           644:   for (i = LAST_VIRTUAL_REGISTER + 1; i < max_regno; i++)
        !           645:     alter_reg (i, -1);
        !           646: 
        !           647:   /* Round size of stack frame to BIGGEST_ALIGNMENT.  This must be done here
        !           648:      because the stack size may be a part of the offset computation for
        !           649:      register elimination.   */
        !           650:   assign_stack_local (BLKmode, 0, 0);
        !           651: 
        !           652:   /* If we have some registers we think can be eliminated, scan all insns to
        !           653:      see if there is an insn that sets one of these registers to something
        !           654:      other than itself plus a constant.  If so, the register cannot be
        !           655:      eliminated.  Doing this scan here eliminates an extra pass through the
        !           656:      main reload loop in the most common case where register elimination
        !           657:      cannot be done.  */
        !           658:   for (insn = first; insn && num_eliminable; insn = NEXT_INSN (insn))
        !           659:     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
        !           660:        || GET_CODE (insn) == CALL_INSN)
        !           661:       note_stores (PATTERN (insn), mark_not_eliminable);
        !           662: 
        !           663: #ifndef REGISTER_CONSTRAINTS
        !           664:   /* If all the pseudo regs have hard regs,
        !           665:      except for those that are never referenced,
        !           666:      we know that no reloads are needed.  */
        !           667:   /* But that is not true if there are register constraints, since
        !           668:      in that case some pseudos might be in the wrong kind of hard reg.  */
        !           669: 
        !           670:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           671:     if (reg_renumber[i] == -1 && reg_n_refs[i] != 0)
        !           672:       break;
        !           673: 
        !           674:   if (i == max_regno && num_eliminable == 0 && ! caller_save_needed)
        !           675:     return;
        !           676: #endif
        !           677: 
        !           678:   /* Compute the order of preference for hard registers to spill.
        !           679:      Store them by decreasing preference in potential_reload_regs.  */
        !           680: 
        !           681:   order_regs_for_reload ();
        !           682: 
        !           683:   /* So far, no hard regs have been spilled.  */
        !           684:   n_spills = 0;
        !           685:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           686:     spill_reg_order[i] = -1;
        !           687: 
        !           688:   /* On most machines, we can't use any register explicitly used in the
        !           689:      rtl as a spill register.  But on some, we have to.  Those will have
        !           690:      taken care to keep the life of hard regs as short as possible.  */
        !           691: 
        !           692: #ifdef SMALL_REGISTER_CLASSES
        !           693:   CLEAR_HARD_REG_SET (forbidden_regs);
        !           694: #else
        !           695:   COPY_HARD_REG_SET (forbidden_regs, bad_spill_regs);
        !           696: #endif
        !           697: 
        !           698:   /* Spill any hard regs that we know we can't eliminate.  */
        !           699:   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !           700:     if (! ep->can_eliminate)
        !           701:       {
        !           702:        spill_hard_reg (ep->from, global, dumpfile, 1);
        !           703:        regs_ever_live[ep->from] = 1;
        !           704:       }
        !           705: 
        !           706:   if (global)
        !           707:     for (i = 0; i < N_REG_CLASSES; i++)
        !           708:       {
        !           709:        basic_block_needs[i] = (char *)alloca (n_basic_blocks);
        !           710:        bzero (basic_block_needs[i], n_basic_blocks);
        !           711:       }
        !           712: 
        !           713:   /* From now on, we need to emit any moves without making new pseudos.  */
        !           714:   reload_in_progress = 1;
        !           715: 
        !           716:   /* This loop scans the entire function each go-round
        !           717:      and repeats until one repetition spills no additional hard regs.  */
        !           718: 
        !           719:   /* This flag is set when a pseudo reg is spilled,
        !           720:      to require another pass.  Note that getting an additional reload
        !           721:      reg does not necessarily imply any pseudo reg was spilled;
        !           722:      sometimes we find a reload reg that no pseudo reg was allocated in.  */
        !           723:   something_changed = 1;
        !           724:   /* This flag is set if there are any insns that require reloading.  */
        !           725:   something_needs_reloads = 0;
        !           726:   /* This flag is set if there are any insns that require register
        !           727:      eliminations.  */
        !           728:   something_needs_elimination = 0;
        !           729:   while (something_changed)
        !           730:     {
        !           731:       rtx after_call = 0;
        !           732: 
        !           733:       /* For each class, number of reload regs needed in that class.
        !           734:         This is the maximum over all insns of the needs in that class
        !           735:         of the individual insn.  */
        !           736:       int max_needs[N_REG_CLASSES];
        !           737:       /* For each class, size of group of consecutive regs
        !           738:         that is needed for the reloads of this class.  */
        !           739:       int group_size[N_REG_CLASSES];
        !           740:       /* For each class, max number of consecutive groups needed.
        !           741:         (Each group contains group_size[CLASS] consecutive registers.)  */
        !           742:       int max_groups[N_REG_CLASSES];
        !           743:       /* For each class, max number needed of regs that don't belong
        !           744:         to any of the groups.  */
        !           745:       int max_nongroups[N_REG_CLASSES];
        !           746:       /* For each class, the machine mode which requires consecutive
        !           747:         groups of regs of that class.
        !           748:         If two different modes ever require groups of one class,
        !           749:         they must be the same size and equally restrictive for that class,
        !           750:         otherwise we can't handle the complexity.  */
        !           751:       enum machine_mode group_mode[N_REG_CLASSES];
        !           752:       /* Record the insn where each maximum need is first found.  */
        !           753:       rtx max_needs_insn[N_REG_CLASSES];
        !           754:       rtx max_groups_insn[N_REG_CLASSES];
        !           755:       rtx max_nongroups_insn[N_REG_CLASSES];
        !           756:       rtx x;
        !           757:       int starting_frame_size = get_frame_size ();
        !           758:       static char *reg_class_names[] = REG_CLASS_NAMES;
        !           759: 
        !           760:       something_changed = 0;
        !           761:       bzero (max_needs, sizeof max_needs);
        !           762:       bzero (max_groups, sizeof max_groups);
        !           763:       bzero (max_nongroups, sizeof max_nongroups);
        !           764:       bzero (max_needs_insn, sizeof max_needs_insn);
        !           765:       bzero (max_groups_insn, sizeof max_groups_insn);
        !           766:       bzero (max_nongroups_insn, sizeof max_nongroups_insn);
        !           767:       bzero (group_size, sizeof group_size);
        !           768:       for (i = 0; i < N_REG_CLASSES; i++)
        !           769:        group_mode[i] = VOIDmode;
        !           770: 
        !           771:       /* Keep track of which basic blocks are needing the reloads.  */
        !           772:       this_block = 0;
        !           773: 
        !           774:       /* Remember whether any element of basic_block_needs
        !           775:         changes from 0 to 1 in this pass.  */
        !           776:       new_basic_block_needs = 0;
        !           777: 
        !           778:       /* Reset all offsets on eliminable registers to their initial values.  */
        !           779: #ifdef ELIMINABLE_REGS
        !           780:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !           781:        {
        !           782:          INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, ep->initial_offset);
        !           783:          ep->previous_offset = ep->offset
        !           784:            = ep->max_offset = ep->initial_offset;
        !           785:        }
        !           786: #else
        !           787: #ifdef INITIAL_FRAME_POINTER_OFFSET
        !           788:       INITIAL_FRAME_POINTER_OFFSET (reg_eliminate[0].initial_offset);
        !           789: #else
        !           790:       if (!FRAME_POINTER_REQUIRED)
        !           791:        abort ();
        !           792:       reg_eliminate[0].initial_offset = 0;
        !           793: #endif
        !           794:       reg_eliminate[0].previous_offset = reg_eliminate[0].max_offset
        !           795:        = reg_eliminate[0].offset = reg_eliminate[0].initial_offset;
        !           796: #endif
        !           797: 
        !           798:       num_not_at_initial_offset = 0;
        !           799: 
        !           800:       bzero (&offsets_known_at[get_first_label_num ()], num_labels);
        !           801: 
        !           802:       /* Set a known offset for each forced label to be at the initial offset
        !           803:         of each elimination.  We do this because we assume that all
        !           804:         computed jumps occur from a location where each elimination is
        !           805:         at its initial offset.  */
        !           806: 
        !           807:       for (x = forced_labels; x; x = XEXP (x, 1))
        !           808:        if (XEXP (x, 0))
        !           809:          set_label_offsets (XEXP (x, 0), NULL_RTX, 1);
        !           810: 
        !           811:       /* For each pseudo register that has an equivalent location defined,
        !           812:         try to eliminate any eliminable registers (such as the frame pointer)
        !           813:         assuming initial offsets for the replacement register, which
        !           814:         is the normal case.
        !           815: 
        !           816:         If the resulting location is directly addressable, substitute
        !           817:         the MEM we just got directly for the old REG.
        !           818: 
        !           819:         If it is not addressable but is a constant or the sum of a hard reg
        !           820:         and constant, it is probably not addressable because the constant is
        !           821:         out of range, in that case record the address; we will generate
        !           822:         hairy code to compute the address in a register each time it is
        !           823:         needed.  Similarly if it is a hard register, but one that is not
        !           824:         valid as an address register.
        !           825: 
        !           826:         If the location is not addressable, but does not have one of the
        !           827:         above forms, assign a stack slot.  We have to do this to avoid the
        !           828:         potential of producing lots of reloads if, e.g., a location involves
        !           829:         a pseudo that didn't get a hard register and has an equivalent memory
        !           830:         location that also involves a pseudo that didn't get a hard register.
        !           831: 
        !           832:         Perhaps at some point we will improve reload_when_needed handling
        !           833:         so this problem goes away.  But that's very hairy.  */
        !           834: 
        !           835:       for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !           836:        if (reg_renumber[i] < 0 && reg_equiv_memory_loc[i])
        !           837:          {
        !           838:            rtx x = eliminate_regs (reg_equiv_memory_loc[i], 0, NULL_RTX);
        !           839: 
        !           840:            if (strict_memory_address_p (GET_MODE (regno_reg_rtx[i]),
        !           841:                                         XEXP (x, 0)))
        !           842:              reg_equiv_mem[i] = x, reg_equiv_address[i] = 0;
        !           843:            else if (CONSTANT_P (XEXP (x, 0))
        !           844:                     || (GET_CODE (XEXP (x, 0)) == REG
        !           845:                         && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
        !           846:                     || (GET_CODE (XEXP (x, 0)) == PLUS
        !           847:                         && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
        !           848:                         && (REGNO (XEXP (XEXP (x, 0), 0))
        !           849:                             < FIRST_PSEUDO_REGISTER)
        !           850:                         && CONSTANT_P (XEXP (XEXP (x, 0), 1))))
        !           851:              reg_equiv_address[i] = XEXP (x, 0), reg_equiv_mem[i] = 0;
        !           852:            else
        !           853:              {
        !           854:                /* Make a new stack slot.  Then indicate that something
        !           855:                   changed so we go back and recompute offsets for
        !           856:                   eliminable registers because the allocation of memory
        !           857:                   below might change some offset.  reg_equiv_{mem,address}
        !           858:                   will be set up for this pseudo on the next pass around
        !           859:                   the loop.  */
        !           860:                reg_equiv_memory_loc[i] = 0;
        !           861:                reg_equiv_init[i] = 0;
        !           862:                alter_reg (i, -1);
        !           863:                something_changed = 1;
        !           864:              }
        !           865:          }
        !           866: 
        !           867:       /* If we allocated another pseudo to the stack, redo elimination
        !           868:         bookkeeping.  */
        !           869:       if (something_changed)
        !           870:        continue;
        !           871: 
        !           872:       /* If caller-saves needs a group, initialize the group to include
        !           873:         the size and mode required for caller-saves.  */
        !           874: 
        !           875:       if (caller_save_group_size > 1)
        !           876:        {
        !           877:          group_mode[(int) caller_save_spill_class] = Pmode;
        !           878:          group_size[(int) caller_save_spill_class] = caller_save_group_size;
        !           879:        }
        !           880: 
        !           881:       /* Compute the most additional registers needed by any instruction.
        !           882:         Collect information separately for each class of regs.  */
        !           883: 
        !           884:       for (insn = first; insn; insn = NEXT_INSN (insn))
        !           885:        {
        !           886:          if (global && this_block + 1 < n_basic_blocks
        !           887:              && insn == basic_block_head[this_block+1])
        !           888:            ++this_block;
        !           889: 
        !           890:          /* If this is a label, a JUMP_INSN, or has REG_NOTES (which
        !           891:             might include REG_LABEL), we need to see what effects this
        !           892:             has on the known offsets at labels.  */
        !           893: 
        !           894:          if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN
        !           895:              || (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
        !           896:                  && REG_NOTES (insn) != 0))
        !           897:            set_label_offsets (insn, insn, 0);
        !           898: 
        !           899:          if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
        !           900:            {
        !           901:              /* Nonzero means don't use a reload reg that overlaps
        !           902:                 the place where a function value can be returned.  */
        !           903:              rtx avoid_return_reg = 0;
        !           904: 
        !           905:              rtx old_body = PATTERN (insn);
        !           906:              int old_code = INSN_CODE (insn);
        !           907:              rtx old_notes = REG_NOTES (insn);
        !           908:              int did_elimination = 0;
        !           909:              int max_total_input_groups = 0, max_total_output_groups = 0;
        !           910: 
        !           911:              /* To compute the number of reload registers of each class 
        !           912:                 needed for an insn, we must similate what choose_reload_regs
        !           913:                 can do.  We do this by splitting an insn into an "input" and
        !           914:                 an "output" part.  RELOAD_OTHER reloads are used in both. 
        !           915:                 The input part uses those reloads, RELOAD_FOR_INPUT reloads,
        !           916:                 which must be live over the entire input section of reloads,
        !           917:                 and the maximum of all the RELOAD_FOR_INPUT_ADDRESS and
        !           918:                 RELOAD_FOR_OPERAND_ADDRESS reloads, which conflict with the
        !           919:                 inputs.
        !           920: 
        !           921:                 The registers needed for output are RELOAD_OTHER and
        !           922:                 RELOAD_FOR_OUTPUT, which are live for the entire output
        !           923:                 portion, and the maximum of all the RELOAD_FOR_OUTPUT_ADDRESS
        !           924:                 reloads for each operand.
        !           925: 
        !           926:                 The total number of registers needed is the maximum of the
        !           927:                 inputs and outputs.  */
        !           928: 
        !           929:              /* These just count RELOAD_OTHER.  */
        !           930:              int insn_needs[N_REG_CLASSES];
        !           931:              int insn_groups[N_REG_CLASSES];
        !           932:              int insn_total_groups = 0;
        !           933: 
        !           934:              /* Count RELOAD_FOR_INPUT reloads.  */
        !           935:              int insn_needs_for_inputs[N_REG_CLASSES];
        !           936:              int insn_groups_for_inputs[N_REG_CLASSES];
        !           937:              int insn_total_groups_for_inputs = 0;
        !           938: 
        !           939:              /* Count RELOAD_FOR_OUTPUT reloads.  */
        !           940:              int insn_needs_for_outputs[N_REG_CLASSES];
        !           941:              int insn_groups_for_outputs[N_REG_CLASSES];
        !           942:              int insn_total_groups_for_outputs = 0;
        !           943: 
        !           944:              /* Count RELOAD_FOR_INSN reloads.  */
        !           945:              int insn_needs_for_insn[N_REG_CLASSES];
        !           946:              int insn_groups_for_insn[N_REG_CLASSES];
        !           947:              int insn_total_groups_for_insn = 0;
        !           948: 
        !           949:              /* Count RELOAD_FOR_OTHER_ADDRESS reloads.  */
        !           950:              int insn_needs_for_other_addr[N_REG_CLASSES];
        !           951:              int insn_groups_for_other_addr[N_REG_CLASSES];
        !           952:              int insn_total_groups_for_other_addr = 0;
        !           953: 
        !           954:              /* Count RELOAD_FOR_INPUT_ADDRESS reloads.  */
        !           955:              int insn_needs_for_in_addr[MAX_RECOG_OPERANDS][N_REG_CLASSES];
        !           956:              int insn_groups_for_in_addr[MAX_RECOG_OPERANDS][N_REG_CLASSES];
        !           957:              int insn_total_groups_for_in_addr[MAX_RECOG_OPERANDS];
        !           958: 
        !           959:              /* Count RELOAD_FOR_OUTPUT_ADDRESS reloads.  */
        !           960:              int insn_needs_for_out_addr[MAX_RECOG_OPERANDS][N_REG_CLASSES];
        !           961:              int insn_groups_for_out_addr[MAX_RECOG_OPERANDS][N_REG_CLASSES];
        !           962:              int insn_total_groups_for_out_addr[MAX_RECOG_OPERANDS];
        !           963: 
        !           964:              /* Count RELOAD_FOR_OPERAND_ADDRESS reloads.  */
        !           965:              int insn_needs_for_op_addr[N_REG_CLASSES];
        !           966:              int insn_groups_for_op_addr[N_REG_CLASSES];
        !           967:              int insn_total_groups_for_op_addr = 0;
        !           968: 
        !           969: #if 0  /* This wouldn't work nowadays, since optimize_bit_field
        !           970:          looks for non-strict memory addresses.  */
        !           971:              /* Optimization: a bit-field instruction whose field
        !           972:                 happens to be a byte or halfword in memory
        !           973:                 can be changed to a move instruction.  */
        !           974: 
        !           975:              if (GET_CODE (PATTERN (insn)) == SET)
        !           976:                {
        !           977:                  rtx dest = SET_DEST (PATTERN (insn));
        !           978:                  rtx src = SET_SRC (PATTERN (insn));
        !           979: 
        !           980:                  if (GET_CODE (dest) == ZERO_EXTRACT
        !           981:                      || GET_CODE (dest) == SIGN_EXTRACT)
        !           982:                    optimize_bit_field (PATTERN (insn), insn, reg_equiv_mem);
        !           983:                  if (GET_CODE (src) == ZERO_EXTRACT
        !           984:                      || GET_CODE (src) == SIGN_EXTRACT)
        !           985:                    optimize_bit_field (PATTERN (insn), insn, reg_equiv_mem);
        !           986:                }
        !           987: #endif
        !           988: 
        !           989:              /* If needed, eliminate any eliminable registers.  */
        !           990:              if (num_eliminable)
        !           991:                did_elimination = eliminate_regs_in_insn (insn, 0);
        !           992: 
        !           993: #ifdef SMALL_REGISTER_CLASSES
        !           994:              /* Set avoid_return_reg if this is an insn
        !           995:                 that might use the value of a function call.  */
        !           996:              if (GET_CODE (insn) == CALL_INSN)
        !           997:                {
        !           998:                  if (GET_CODE (PATTERN (insn)) == SET)
        !           999:                    after_call = SET_DEST (PATTERN (insn));
        !          1000:                  else if (GET_CODE (PATTERN (insn)) == PARALLEL
        !          1001:                           && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
        !          1002:                    after_call = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
        !          1003:                  else
        !          1004:                    after_call = 0;
        !          1005:                }
        !          1006:              else if (after_call != 0
        !          1007:                       && !(GET_CODE (PATTERN (insn)) == SET
        !          1008:                            && SET_DEST (PATTERN (insn)) == stack_pointer_rtx))
        !          1009:                {
        !          1010:                  if (reg_mentioned_p (after_call, PATTERN (insn)))
        !          1011:                    avoid_return_reg = after_call;
        !          1012:                  after_call = 0;
        !          1013:                }
        !          1014: #endif /* SMALL_REGISTER_CLASSES */
        !          1015: 
        !          1016:              /* Analyze the instruction.  */
        !          1017:              find_reloads (insn, 0, spill_indirect_levels, global,
        !          1018:                            spill_reg_order);
        !          1019: 
        !          1020:              /* Remember for later shortcuts which insns had any reloads or
        !          1021:                 register eliminations.
        !          1022: 
        !          1023:                 One might think that it would be worthwhile to mark insns
        !          1024:                 that need register replacements but not reloads, but this is
        !          1025:                 not safe because find_reloads may do some manipulation of
        !          1026:                 the insn (such as swapping commutative operands), which would
        !          1027:                 be lost when we restore the old pattern after register
        !          1028:                 replacement.  So the actions of find_reloads must be redone in
        !          1029:                 subsequent passes or in reload_as_needed.
        !          1030: 
        !          1031:                 However, it is safe to mark insns that need reloads
        !          1032:                 but not register replacement.  */
        !          1033: 
        !          1034:              PUT_MODE (insn, (did_elimination ? QImode
        !          1035:                               : n_reloads ? HImode
        !          1036:                               : GET_MODE (insn) == DImode ? DImode
        !          1037:                               : VOIDmode));
        !          1038: 
        !          1039:              /* Discard any register replacements done.  */
        !          1040:              if (did_elimination)
        !          1041:                {
        !          1042:                  obstack_free (&reload_obstack, reload_firstobj);
        !          1043:                  PATTERN (insn) = old_body;
        !          1044:                  INSN_CODE (insn) = old_code;
        !          1045:                  REG_NOTES (insn) = old_notes;
        !          1046:                  something_needs_elimination = 1;
        !          1047:                }
        !          1048: 
        !          1049:              /* If this insn has no reloads, we need not do anything except
        !          1050:                 in the case of a CALL_INSN when we have caller-saves and
        !          1051:                 caller-save needs reloads.  */
        !          1052: 
        !          1053:              if (n_reloads == 0
        !          1054:                  && ! (GET_CODE (insn) == CALL_INSN
        !          1055:                        && caller_save_spill_class != NO_REGS))
        !          1056:                continue;
        !          1057: 
        !          1058:              something_needs_reloads = 1;
        !          1059: 
        !          1060:              for (i = 0; i < N_REG_CLASSES; i++)
        !          1061:                {
        !          1062:                  insn_needs[i] = 0, insn_groups[i] = 0;
        !          1063:                  insn_needs_for_inputs[i] = 0, insn_groups_for_inputs[i] = 0;
        !          1064:                  insn_needs_for_outputs[i] = 0, insn_groups_for_outputs[i] = 0;
        !          1065:                  insn_needs_for_insn[i] = 0, insn_groups_for_insn[i] = 0;
        !          1066:                  insn_needs_for_op_addr[i] = 0, insn_groups_for_op_addr[i] = 0;
        !          1067:                  insn_needs_for_other_addr[i] = 0;
        !          1068:                  insn_groups_for_other_addr[i] = 0;
        !          1069:                }
        !          1070: 
        !          1071:              for (i = 0; i < reload_n_operands; i++)
        !          1072:                {
        !          1073:                  insn_total_groups_for_in_addr[i] = 0;
        !          1074:                  insn_total_groups_for_out_addr[i] = 0;
        !          1075: 
        !          1076:                  for (j = 0; j < N_REG_CLASSES; j++)
        !          1077:                    {
        !          1078:                      insn_needs_for_in_addr[i][j] = 0;
        !          1079:                      insn_needs_for_out_addr[i][j] = 0;
        !          1080:                      insn_groups_for_in_addr[i][j] = 0;
        !          1081:                      insn_groups_for_out_addr[i][j] = 0;
        !          1082:                    }
        !          1083:                }
        !          1084:                    
        !          1085:              /* Count each reload once in every class
        !          1086:                 containing the reload's own class.  */
        !          1087: 
        !          1088:              for (i = 0; i < n_reloads; i++)
        !          1089:                {
        !          1090:                  register enum reg_class *p;
        !          1091:                  enum reg_class class = reload_reg_class[i];
        !          1092:                  int size;
        !          1093:                  enum machine_mode mode;
        !          1094:                  int *this_groups;
        !          1095:                  int *this_needs;
        !          1096:                  int *this_total_groups;
        !          1097: 
        !          1098:                  /* Don't count the dummy reloads, for which one of the
        !          1099:                     regs mentioned in the insn can be used for reloading.
        !          1100:                     Don't count optional reloads.
        !          1101:                     Don't count reloads that got combined with others.  */
        !          1102:                  if (reload_reg_rtx[i] != 0
        !          1103:                      || reload_optional[i] != 0
        !          1104:                      || (reload_out[i] == 0 && reload_in[i] == 0
        !          1105:                          && ! reload_secondary_p[i]))
        !          1106:                    continue;
        !          1107: 
        !          1108:                  /* Show that a reload register of this class is needed
        !          1109:                     in this basic block.  We do not use insn_needs and
        !          1110:                     insn_groups because they are overly conservative for
        !          1111:                     this purpose.  */
        !          1112:                  if (global && ! basic_block_needs[(int) class][this_block])
        !          1113:                    {
        !          1114:                      basic_block_needs[(int) class][this_block] = 1;
        !          1115:                      new_basic_block_needs = 1;
        !          1116:                    }
        !          1117: 
        !          1118:                  /* Decide which time-of-use to count this reload for.  */
        !          1119:                  switch (reload_when_needed[i])
        !          1120:                    {
        !          1121:                    case RELOAD_OTHER:
        !          1122:                      this_needs = insn_needs;
        !          1123:                      this_groups = insn_groups;
        !          1124:                      this_total_groups = &insn_total_groups;
        !          1125:                      break;
        !          1126: 
        !          1127:                    case RELOAD_FOR_INPUT:
        !          1128:                      this_needs = insn_needs_for_inputs;
        !          1129:                      this_groups = insn_groups_for_inputs;
        !          1130:                      this_total_groups = &insn_total_groups_for_inputs;
        !          1131:                      break;
        !          1132: 
        !          1133:                    case RELOAD_FOR_OUTPUT:
        !          1134:                      this_needs = insn_needs_for_outputs;
        !          1135:                      this_groups = insn_groups_for_outputs;
        !          1136:                      this_total_groups = &insn_total_groups_for_outputs;
        !          1137:                      break;
        !          1138: 
        !          1139:                    case RELOAD_FOR_INSN:
        !          1140:                      this_needs = insn_needs_for_insn;
        !          1141:                      this_groups = insn_groups_for_insn;
        !          1142:                      this_total_groups = &insn_total_groups_for_insn;
        !          1143:                      break;
        !          1144: 
        !          1145:                    case RELOAD_FOR_OTHER_ADDRESS:
        !          1146:                      this_needs = insn_needs_for_other_addr;
        !          1147:                      this_groups = insn_groups_for_other_addr;
        !          1148:                      this_total_groups = &insn_total_groups_for_other_addr;
        !          1149:                      break;
        !          1150: 
        !          1151:                    case RELOAD_FOR_INPUT_ADDRESS:
        !          1152:                      this_needs = insn_needs_for_in_addr[reload_opnum[i]];
        !          1153:                      this_groups = insn_groups_for_in_addr[reload_opnum[i]];
        !          1154:                      this_total_groups
        !          1155:                        = &insn_total_groups_for_in_addr[reload_opnum[i]];
        !          1156:                      break;
        !          1157: 
        !          1158:                    case RELOAD_FOR_OUTPUT_ADDRESS:
        !          1159:                      this_needs = insn_needs_for_out_addr[reload_opnum[i]];
        !          1160:                      this_groups = insn_groups_for_out_addr[reload_opnum[i]];
        !          1161:                      this_total_groups
        !          1162:                        = &insn_total_groups_for_out_addr[reload_opnum[i]];
        !          1163:                      break;
        !          1164: 
        !          1165:                    case RELOAD_FOR_OPERAND_ADDRESS:
        !          1166:                      this_needs = insn_needs_for_op_addr;
        !          1167:                      this_groups = insn_groups_for_op_addr;
        !          1168:                      this_total_groups = &insn_total_groups_for_op_addr;
        !          1169:                      break;
        !          1170:                    }
        !          1171: 
        !          1172:                  mode = reload_inmode[i];
        !          1173:                  if (GET_MODE_SIZE (reload_outmode[i]) > GET_MODE_SIZE (mode))
        !          1174:                    mode = reload_outmode[i];
        !          1175:                  size = CLASS_MAX_NREGS (class, mode);
        !          1176:                  if (size > 1)
        !          1177:                    {
        !          1178:                      enum machine_mode other_mode, allocate_mode;
        !          1179: 
        !          1180:                      /* Count number of groups needed separately from
        !          1181:                         number of individual regs needed.  */
        !          1182:                      this_groups[(int) class]++;
        !          1183:                      p = reg_class_superclasses[(int) class];
        !          1184:                      while (*p != LIM_REG_CLASSES)
        !          1185:                        this_groups[(int) *p++]++;
        !          1186:                      (*this_total_groups)++;
        !          1187: 
        !          1188:                      /* Record size and mode of a group of this class.  */
        !          1189:                      /* If more than one size group is needed,
        !          1190:                         make all groups the largest needed size.  */
        !          1191:                      if (group_size[(int) class] < size)
        !          1192:                        {
        !          1193:                          other_mode = group_mode[(int) class];
        !          1194:                          allocate_mode = mode;
        !          1195: 
        !          1196:                          group_size[(int) class] = size;
        !          1197:                          group_mode[(int) class] = mode;
        !          1198:                        }
        !          1199:                      else
        !          1200:                        {
        !          1201:                          other_mode = mode;
        !          1202:                          allocate_mode = group_mode[(int) class];
        !          1203:                        }
        !          1204: 
        !          1205:                      /* Crash if two dissimilar machine modes both need
        !          1206:                         groups of consecutive regs of the same class.  */
        !          1207: 
        !          1208:                      if (other_mode != VOIDmode
        !          1209:                          && other_mode != allocate_mode
        !          1210:                          && ! modes_equiv_for_class_p (allocate_mode,
        !          1211:                                                        other_mode,
        !          1212:                                                        class))
        !          1213:                        abort ();
        !          1214:                    }
        !          1215:                  else if (size == 1)
        !          1216:                    {
        !          1217:                      this_needs[(int) class] += 1;
        !          1218:                      p = reg_class_superclasses[(int) class];
        !          1219:                      while (*p != LIM_REG_CLASSES)
        !          1220:                        this_needs[(int) *p++] += 1;
        !          1221:                    }
        !          1222:                  else
        !          1223:                    abort ();
        !          1224:                }
        !          1225: 
        !          1226:              /* All reloads have been counted for this insn;
        !          1227:                 now merge the various times of use.
        !          1228:                 This sets insn_needs, etc., to the maximum total number
        !          1229:                 of registers needed at any point in this insn.  */
        !          1230: 
        !          1231:              for (i = 0; i < N_REG_CLASSES; i++)
        !          1232:                {
        !          1233:                  int in_max, out_max;
        !          1234: 
        !          1235:                  for (in_max = 0, out_max = 0, j = 0;
        !          1236:                       j < reload_n_operands; j++)
        !          1237:                    {
        !          1238:                      in_max = MAX (in_max, insn_needs_for_in_addr[j][i]);
        !          1239:                      out_max = MAX (out_max, insn_needs_for_out_addr[j][i]);
        !          1240:                    }
        !          1241: 
        !          1242:                  /* RELOAD_FOR_INSN reloads conflict with inputs, outputs,
        !          1243:                     and operand addresses but not things used to reload them.
        !          1244:                     Similarly, RELOAD_FOR_OPERAND_ADDRESS reloads don't
        !          1245:                     conflict with things needed to reload inputs or
        !          1246:                     outputs. */
        !          1247: 
        !          1248:                  in_max = MAX (in_max, insn_needs_for_op_addr[i]);
        !          1249:                  out_max = MAX (out_max, insn_needs_for_insn[i]);
        !          1250: 
        !          1251:                  insn_needs_for_inputs[i]
        !          1252:                    = MAX (insn_needs_for_inputs[i]
        !          1253:                           + insn_needs_for_op_addr[i]
        !          1254:                           + insn_needs_for_insn[i],
        !          1255:                           in_max + insn_needs_for_inputs[i]);
        !          1256: 
        !          1257:                  insn_needs_for_outputs[i] += out_max;
        !          1258:                  insn_needs[i] += MAX (MAX (insn_needs_for_inputs[i],
        !          1259:                                             insn_needs_for_outputs[i]),
        !          1260:                                        insn_needs_for_other_addr[i]);
        !          1261: 
        !          1262:                  for (in_max = 0, out_max = 0, j = 0;
        !          1263:                       j < reload_n_operands; j++)
        !          1264:                    {
        !          1265:                      in_max = MAX (in_max, insn_groups_for_in_addr[j][i]);
        !          1266:                      out_max = MAX (out_max, insn_groups_for_out_addr[j][i]);
        !          1267:                    }
        !          1268: 
        !          1269:                  in_max = MAX (in_max, insn_groups_for_op_addr[i]);
        !          1270:                  out_max = MAX (out_max, insn_groups_for_insn[i]);
        !          1271: 
        !          1272:                  insn_groups_for_inputs[i]
        !          1273:                    = MAX (insn_groups_for_inputs[i]
        !          1274:                           + insn_groups_for_op_addr[i]
        !          1275:                           + insn_groups_for_insn[i],
        !          1276:                           in_max + insn_groups_for_inputs[i]);
        !          1277: 
        !          1278:                  insn_groups_for_outputs[i] += out_max;
        !          1279:                  insn_groups[i] += MAX (MAX (insn_groups_for_inputs[i],
        !          1280:                                              insn_groups_for_outputs[i]),
        !          1281:                                         insn_groups_for_other_addr[i]);
        !          1282:                }
        !          1283: 
        !          1284:              for (i = 0; i < reload_n_operands; i++)
        !          1285:                {
        !          1286:                  max_total_input_groups
        !          1287:                    = MAX (max_total_input_groups,
        !          1288:                           insn_total_groups_for_in_addr[i]);
        !          1289:                  max_total_output_groups
        !          1290:                    = MAX (max_total_output_groups,
        !          1291:                           insn_total_groups_for_out_addr[i]);
        !          1292:                }
        !          1293: 
        !          1294:              max_total_input_groups = MAX (max_total_input_groups,
        !          1295:                                            insn_total_groups_for_op_addr);
        !          1296:              max_total_output_groups = MAX (max_total_output_groups,
        !          1297:                                             insn_total_groups_for_insn);
        !          1298: 
        !          1299:              insn_total_groups_for_inputs
        !          1300:                = MAX (max_total_input_groups + insn_total_groups_for_op_addr
        !          1301:                       + insn_total_groups_for_insn,
        !          1302:                       max_total_input_groups + insn_total_groups_for_inputs);
        !          1303: 
        !          1304:              insn_total_groups_for_outputs += max_total_output_groups;
        !          1305: 
        !          1306:              insn_total_groups += MAX (MAX (insn_total_groups_for_outputs,
        !          1307:                                             insn_total_groups_for_inputs),
        !          1308:                                        insn_total_groups_for_other_addr);
        !          1309: 
        !          1310:              /* If this is a CALL_INSN and caller-saves will need
        !          1311:                 a spill register, act as if the spill register is
        !          1312:                 needed for this insn.   However, the spill register
        !          1313:                 can be used by any reload of this insn, so we only
        !          1314:                 need do something if no need for that class has
        !          1315:                 been recorded.
        !          1316: 
        !          1317:                 The assumption that every CALL_INSN will trigger a
        !          1318:                 caller-save is highly conservative, however, the number
        !          1319:                 of cases where caller-saves will need a spill register but
        !          1320:                 a block containing a CALL_INSN won't need a spill register
        !          1321:                 of that class should be quite rare.
        !          1322: 
        !          1323:                 If a group is needed, the size and mode of the group will
        !          1324:                 have been set up at the beginning of this loop.  */
        !          1325: 
        !          1326:              if (GET_CODE (insn) == CALL_INSN
        !          1327:                  && caller_save_spill_class != NO_REGS)
        !          1328:                {
        !          1329:                  int *caller_save_needs
        !          1330:                    = (caller_save_group_size > 1 ? insn_groups : insn_needs);
        !          1331: 
        !          1332:                  if (caller_save_needs[(int) caller_save_spill_class] == 0)
        !          1333:                    {
        !          1334:                      register enum reg_class *p
        !          1335:                        = reg_class_superclasses[(int) caller_save_spill_class];
        !          1336: 
        !          1337:                      caller_save_needs[(int) caller_save_spill_class]++;
        !          1338: 
        !          1339:                      while (*p != LIM_REG_CLASSES)
        !          1340:                        caller_save_needs[(int) *p++] += 1;
        !          1341:                    }
        !          1342: 
        !          1343:                  if (caller_save_group_size > 1)
        !          1344:                    insn_total_groups = MAX (insn_total_groups, 1);
        !          1345: 
        !          1346: 
        !          1347:                 /* Show that this basic block will need a register of
        !          1348:                    this class.  */
        !          1349: 
        !          1350:                 if (global
        !          1351:                     && ! (basic_block_needs[(int) caller_save_spill_class]
        !          1352:                           [this_block]))
        !          1353:                   {
        !          1354:                     basic_block_needs[(int) caller_save_spill_class]
        !          1355:                       [this_block] = 1;
        !          1356:                     new_basic_block_needs = 1;
        !          1357:                   }
        !          1358:                }
        !          1359: 
        !          1360: #ifdef SMALL_REGISTER_CLASSES
        !          1361:              /* If this insn stores the value of a function call,
        !          1362:                 and that value is in a register that has been spilled,
        !          1363:                 and if the insn needs a reload in a class
        !          1364:                 that might use that register as the reload register,
        !          1365:                 then add add an extra need in that class.
        !          1366:                 This makes sure we have a register available that does
        !          1367:                 not overlap the return value.  */
        !          1368:              if (avoid_return_reg)
        !          1369:                {
        !          1370:                  int regno = REGNO (avoid_return_reg);
        !          1371:                  int nregs
        !          1372:                    = HARD_REGNO_NREGS (regno, GET_MODE (avoid_return_reg));
        !          1373:                  int r;
        !          1374:                  int basic_needs[N_REG_CLASSES], basic_groups[N_REG_CLASSES];
        !          1375: 
        !          1376:                  /* First compute the "basic needs", which counts a
        !          1377:                     need only in the smallest class in which it
        !          1378:                     is required.  */
        !          1379: 
        !          1380:                  bcopy (insn_needs, basic_needs, sizeof basic_needs);
        !          1381:                  bcopy (insn_groups, basic_groups, sizeof basic_groups);
        !          1382: 
        !          1383:                  for (i = 0; i < N_REG_CLASSES; i++)
        !          1384:                    {
        !          1385:                      enum reg_class *p;
        !          1386: 
        !          1387:                      if (basic_needs[i] >= 0)
        !          1388:                        for (p = reg_class_superclasses[i];
        !          1389:                             *p != LIM_REG_CLASSES; p++)
        !          1390:                          basic_needs[(int) *p] -= basic_needs[i];
        !          1391: 
        !          1392:                      if (basic_groups[i] >= 0)
        !          1393:                        for (p = reg_class_superclasses[i];
        !          1394:                             *p != LIM_REG_CLASSES; p++)
        !          1395:                          basic_groups[(int) *p] -= basic_groups[i];
        !          1396:                    }
        !          1397: 
        !          1398:                  /* Now count extra regs if there might be a conflict with
        !          1399:                     the return value register.
        !          1400: 
        !          1401:                     ??? This is not quite correct because we don't properly
        !          1402:                     handle the case of groups, but if we end up doing
        !          1403:                     something wrong, it either will end up not mattering or
        !          1404:                     we will abort elsewhere.  */
        !          1405:                   
        !          1406:                  for (r = regno; r < regno + nregs; r++)
        !          1407:                    if (spill_reg_order[r] >= 0)
        !          1408:                      for (i = 0; i < N_REG_CLASSES; i++)
        !          1409:                        if (TEST_HARD_REG_BIT (reg_class_contents[i], r))
        !          1410:                          {
        !          1411:                            if (basic_needs[i] > 0 || basic_groups[i] > 0)
        !          1412:                              {
        !          1413:                                enum reg_class *p;
        !          1414: 
        !          1415:                                insn_needs[i]++;
        !          1416:                                p = reg_class_superclasses[i];
        !          1417:                                while (*p != LIM_REG_CLASSES)
        !          1418:                                  insn_needs[(int) *p++]++;
        !          1419:                              }
        !          1420:                          }
        !          1421:                }
        !          1422: #endif /* SMALL_REGISTER_CLASSES */
        !          1423: 
        !          1424:              /* For each class, collect maximum need of any insn.  */
        !          1425: 
        !          1426:              for (i = 0; i < N_REG_CLASSES; i++)
        !          1427:                {
        !          1428:                  if (max_needs[i] < insn_needs[i])
        !          1429:                    {
        !          1430:                      max_needs[i] = insn_needs[i];
        !          1431:                      max_needs_insn[i] = insn;
        !          1432:                    }
        !          1433:                  if (max_groups[i] < insn_groups[i])
        !          1434:                    {
        !          1435:                      max_groups[i] = insn_groups[i];
        !          1436:                      max_groups_insn[i] = insn;
        !          1437:                    }
        !          1438:                  if (insn_total_groups > 0)
        !          1439:                    if (max_nongroups[i] < insn_needs[i])
        !          1440:                      {
        !          1441:                        max_nongroups[i] = insn_needs[i];
        !          1442:                        max_nongroups_insn[i] = insn;
        !          1443:                      }
        !          1444:                }
        !          1445:            }
        !          1446:          /* Note that there is a continue statement above.  */
        !          1447:        }
        !          1448: 
        !          1449:       /* If we allocated any new memory locations, make another pass
        !          1450:         since it might have changed elimination offsets.  */
        !          1451:       if (starting_frame_size != get_frame_size ())
        !          1452:        something_changed = 1;
        !          1453: 
        !          1454:       if (dumpfile)
        !          1455:        for (i = 0; i < N_REG_CLASSES; i++)
        !          1456:          {
        !          1457:            if (max_needs[i] > 0)
        !          1458:              fprintf (dumpfile,
        !          1459:                         ";; Need %d reg%s of class %s (for insn %d).\n",
        !          1460:                       max_needs[i], max_needs[i] == 1 ? "" : "s",
        !          1461:                       reg_class_names[i], INSN_UID (max_needs_insn[i]));
        !          1462:            if (max_nongroups[i] > 0)
        !          1463:              fprintf (dumpfile,
        !          1464:                       ";; Need %d nongroup reg%s of class %s (for insn %d).\n",
        !          1465:                       max_nongroups[i], max_nongroups[i] == 1 ? "" : "s",
        !          1466:                       reg_class_names[i], INSN_UID (max_nongroups_insn[i]));
        !          1467:            if (max_groups[i] > 0)
        !          1468:              fprintf (dumpfile,
        !          1469:                       ";; Need %d group%s (%smode) of class %s (for insn %d).\n",
        !          1470:                       max_groups[i], max_groups[i] == 1 ? "" : "s",
        !          1471:                       mode_name[(int) group_mode[i]],
        !          1472:                       reg_class_names[i], INSN_UID (max_groups_insn[i]));
        !          1473:          }
        !          1474:                         
        !          1475:       /* If we have caller-saves, set up the save areas and see if caller-save
        !          1476:         will need a spill register.  */
        !          1477: 
        !          1478:       if (caller_save_needed
        !          1479:          && ! setup_save_areas (&something_changed)
        !          1480:          && caller_save_spill_class  == NO_REGS)
        !          1481:        {
        !          1482:          /* The class we will need depends on whether the machine
        !          1483:             supports the sum of two registers for an address; see
        !          1484:             find_address_reloads for details.  */
        !          1485: 
        !          1486:          caller_save_spill_class
        !          1487:            = double_reg_address_ok ? INDEX_REG_CLASS : BASE_REG_CLASS;
        !          1488:          caller_save_group_size
        !          1489:            = CLASS_MAX_NREGS (caller_save_spill_class, Pmode);
        !          1490:          something_changed = 1;
        !          1491:        }
        !          1492: 
        !          1493:       /* See if anything that happened changes which eliminations are valid.
        !          1494:         For example, on the Sparc, whether or not the frame pointer can
        !          1495:         be eliminated can depend on what registers have been used.  We need
        !          1496:         not check some conditions again (such as flag_omit_frame_pointer)
        !          1497:         since they can't have changed.  */
        !          1498: 
        !          1499:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          1500:        if ((ep->from == HARD_FRAME_POINTER_REGNUM && FRAME_POINTER_REQUIRED)
        !          1501: #ifdef ELIMINABLE_REGS
        !          1502:            || ! CAN_ELIMINATE (ep->from, ep->to)
        !          1503: #endif
        !          1504:            )
        !          1505:          ep->can_eliminate = 0;
        !          1506: 
        !          1507:       /* Look for the case where we have discovered that we can't replace
        !          1508:         register A with register B and that means that we will now be
        !          1509:         trying to replace register A with register C.  This means we can
        !          1510:         no longer replace register C with register B and we need to disable
        !          1511:         such an elimination, if it exists.  This occurs often with A == ap,
        !          1512:         B == sp, and C == fp.  */
        !          1513: 
        !          1514:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          1515:        {
        !          1516:          struct elim_table *op;
        !          1517:          register int new_to = -1;
        !          1518: 
        !          1519:          if (! ep->can_eliminate && ep->can_eliminate_previous)
        !          1520:            {
        !          1521:              /* Find the current elimination for ep->from, if there is a
        !          1522:                 new one.  */
        !          1523:              for (op = reg_eliminate;
        !          1524:                   op < &reg_eliminate[NUM_ELIMINABLE_REGS]; op++)
        !          1525:                if (op->from == ep->from && op->can_eliminate)
        !          1526:                  {
        !          1527:                    new_to = op->to;
        !          1528:                    break;
        !          1529:                  }
        !          1530: 
        !          1531:              /* See if there is an elimination of NEW_TO -> EP->TO.  If so,
        !          1532:                 disable it.  */
        !          1533:              for (op = reg_eliminate;
        !          1534:                   op < &reg_eliminate[NUM_ELIMINABLE_REGS]; op++)
        !          1535:                if (op->from == new_to && op->to == ep->to)
        !          1536:                  op->can_eliminate = 0;
        !          1537:            }
        !          1538:        }
        !          1539: 
        !          1540:       /* See if any registers that we thought we could eliminate the previous
        !          1541:         time are no longer eliminable.  If so, something has changed and we
        !          1542:         must spill the register.  Also, recompute the number of eliminable
        !          1543:         registers and see if the frame pointer is needed; it is if there is
        !          1544:         no elimination of the frame pointer that we can perform.  */
        !          1545: 
        !          1546:       frame_pointer_needed = 1;
        !          1547:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          1548:        {
        !          1549:          if (ep->can_eliminate && ep->from == FRAME_POINTER_REGNUM
        !          1550:              && ep->to != HARD_FRAME_POINTER_REGNUM)
        !          1551:            frame_pointer_needed = 0;
        !          1552: 
        !          1553:          if (! ep->can_eliminate && ep->can_eliminate_previous)
        !          1554:            {
        !          1555:              ep->can_eliminate_previous = 0;
        !          1556:              spill_hard_reg (ep->from, global, dumpfile, 1);
        !          1557:              regs_ever_live[ep->from] = 1;
        !          1558:              something_changed = 1;
        !          1559:              num_eliminable--;
        !          1560:            }
        !          1561:        }
        !          1562: 
        !          1563:       /* If all needs are met, we win.  */
        !          1564: 
        !          1565:       for (i = 0; i < N_REG_CLASSES; i++)
        !          1566:        if (max_needs[i] > 0 || max_groups[i] > 0 || max_nongroups[i] > 0)
        !          1567:          break;
        !          1568:       if (i == N_REG_CLASSES && !new_basic_block_needs && ! something_changed)
        !          1569:        break;
        !          1570: 
        !          1571:       /* Not all needs are met; must spill some hard regs.  */
        !          1572: 
        !          1573:       /* Put all registers spilled so far back in potential_reload_regs, but
        !          1574:         put them at the front, since we've already spilled most of the
        !          1575:         psuedos in them (we might have left some pseudos unspilled if they
        !          1576:         were in a block that didn't need any spill registers of a conflicting
        !          1577:         class.  We used to try to mark off the need for those registers,
        !          1578:         but doing so properly is very complex and reallocating them is the
        !          1579:         simpler approach.  First, "pack" potential_reload_regs by pushing 
        !          1580:         any nonnegative entries towards the end.  That will leave room 
        !          1581:         for the registers we already spilled.
        !          1582: 
        !          1583:         Also, undo the marking of the spill registers from the last time
        !          1584:         around in FORBIDDEN_REGS since we will be probably be allocating
        !          1585:         them again below.
        !          1586: 
        !          1587:         ??? It is theoretically possible that we might end up not using one
        !          1588:         of our previously-spilled registers in this allocation, even though
        !          1589:         they are at the head of the list.  It's not clear what to do about
        !          1590:         this, but it was no better before, when we marked off the needs met
        !          1591:         by the previously-spilled registers.  With the current code, globals
        !          1592:         can be allocated into these registers, but locals cannot.  */
        !          1593: 
        !          1594:       if (n_spills)
        !          1595:        {
        !          1596:          for (i = j = FIRST_PSEUDO_REGISTER - 1; i >= 0; i--)
        !          1597:            if (potential_reload_regs[i] != -1)
        !          1598:              potential_reload_regs[j--] = potential_reload_regs[i];
        !          1599: 
        !          1600:          for (i = 0; i < n_spills; i++)
        !          1601:            {
        !          1602:              potential_reload_regs[i] = spill_regs[i];
        !          1603:              spill_reg_order[spill_regs[i]] = -1;
        !          1604:              CLEAR_HARD_REG_BIT (forbidden_regs, spill_regs[i]);
        !          1605:            }
        !          1606: 
        !          1607:          n_spills = 0;
        !          1608:        }
        !          1609: 
        !          1610:       /* Now find more reload regs to satisfy the remaining need
        !          1611:         Do it by ascending class number, since otherwise a reg
        !          1612:         might be spilled for a big class and might fail to count
        !          1613:         for a smaller class even though it belongs to that class.
        !          1614: 
        !          1615:         Count spilled regs in `spills', and add entries to
        !          1616:         `spill_regs' and `spill_reg_order'.
        !          1617: 
        !          1618:         ??? Note there is a problem here.
        !          1619:         When there is a need for a group in a high-numbered class,
        !          1620:         and also need for non-group regs that come from a lower class,
        !          1621:         the non-group regs are chosen first.  If there aren't many regs,
        !          1622:         they might leave no room for a group.
        !          1623: 
        !          1624:         This was happening on the 386.  To fix it, we added the code
        !          1625:         that calls possible_group_p, so that the lower class won't
        !          1626:         break up the last possible group.
        !          1627: 
        !          1628:         Really fixing the problem would require changes above
        !          1629:         in counting the regs already spilled, and in choose_reload_regs.
        !          1630:         It might be hard to avoid introducing bugs there.  */
        !          1631: 
        !          1632:       CLEAR_HARD_REG_SET (counted_for_groups);
        !          1633:       CLEAR_HARD_REG_SET (counted_for_nongroups);
        !          1634: 
        !          1635:       for (class = 0; class < N_REG_CLASSES; class++)
        !          1636:        {
        !          1637:          /* First get the groups of registers.
        !          1638:             If we got single registers first, we might fragment
        !          1639:             possible groups.  */
        !          1640:          while (max_groups[class] > 0)
        !          1641:            {
        !          1642:              /* If any single spilled regs happen to form groups,
        !          1643:                 count them now.  Maybe we don't really need
        !          1644:                 to spill another group.  */
        !          1645:              count_possible_groups (group_size, group_mode, max_groups);
        !          1646: 
        !          1647:              if (max_groups[class] <= 0)
        !          1648:                break;
        !          1649: 
        !          1650:              /* Groups of size 2 (the only groups used on most machines)
        !          1651:                 are treated specially.  */
        !          1652:              if (group_size[class] == 2)
        !          1653:                {
        !          1654:                  /* First, look for a register that will complete a group.  */
        !          1655:                  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1656:                    {
        !          1657:                      int other;
        !          1658: 
        !          1659:                      j = potential_reload_regs[i];
        !          1660:                      if (j >= 0 && ! TEST_HARD_REG_BIT (bad_spill_regs, j)
        !          1661:                          &&
        !          1662:                          ((j > 0 && (other = j - 1, spill_reg_order[other] >= 0)
        !          1663:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !          1664:                            && TEST_HARD_REG_BIT (reg_class_contents[class], other)
        !          1665:                            && HARD_REGNO_MODE_OK (other, group_mode[class])
        !          1666:                            && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          1667:                                                    other)
        !          1668:                            /* We don't want one part of another group.
        !          1669:                               We could get "two groups" that overlap!  */
        !          1670:                            && ! TEST_HARD_REG_BIT (counted_for_groups, other))
        !          1671:                           ||
        !          1672:                           (j < FIRST_PSEUDO_REGISTER - 1
        !          1673:                            && (other = j + 1, spill_reg_order[other] >= 0)
        !          1674:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !          1675:                            && TEST_HARD_REG_BIT (reg_class_contents[class], other)
        !          1676:                            && HARD_REGNO_MODE_OK (j, group_mode[class])
        !          1677:                            && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          1678:                                                    other)
        !          1679:                            && ! TEST_HARD_REG_BIT (counted_for_groups,
        !          1680:                                                    other))))
        !          1681:                        {
        !          1682:                          register enum reg_class *p;
        !          1683: 
        !          1684:                          /* We have found one that will complete a group,
        !          1685:                             so count off one group as provided.  */
        !          1686:                          max_groups[class]--;
        !          1687:                          p = reg_class_superclasses[class];
        !          1688:                          while (*p != LIM_REG_CLASSES)
        !          1689:                            max_groups[(int) *p++]--;
        !          1690: 
        !          1691:                          /* Indicate both these regs are part of a group.  */
        !          1692:                          SET_HARD_REG_BIT (counted_for_groups, j);
        !          1693:                          SET_HARD_REG_BIT (counted_for_groups, other);
        !          1694:                          break;
        !          1695:                        }
        !          1696:                    }
        !          1697:                  /* We can't complete a group, so start one.  */
        !          1698: #ifdef SMALL_REGISTER_CLASSES
        !          1699:                  /* Look for a pair neither of which is explicitly used.  */
        !          1700:                  if (i == FIRST_PSEUDO_REGISTER)
        !          1701:                    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1702:                      {
        !          1703:                        int k;
        !          1704:                        j = potential_reload_regs[i];
        !          1705:                        /* Verify that J+1 is a potential reload reg.  */
        !          1706:                        for (k = 0; k < FIRST_PSEUDO_REGISTER; k++)
        !          1707:                          if (potential_reload_regs[k] == j + 1)
        !          1708:                            break;
        !          1709:                        if (j >= 0 && j + 1 < FIRST_PSEUDO_REGISTER
        !          1710:                            && k < FIRST_PSEUDO_REGISTER
        !          1711:                            && spill_reg_order[j] < 0 && spill_reg_order[j + 1] < 0
        !          1712:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !          1713:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j + 1)
        !          1714:                            && HARD_REGNO_MODE_OK (j, group_mode[class])
        !          1715:                            && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          1716:                                                    j + 1)
        !          1717:                            && ! TEST_HARD_REG_BIT (bad_spill_regs, j + 1)
        !          1718:                            /* Reject J at this stage
        !          1719:                               if J+1 was explicitly used.  */
        !          1720:                            && ! regs_explicitly_used[j + 1])
        !          1721:                          break;
        !          1722:                      }
        !          1723: #endif
        !          1724:                  /* Now try any group at all
        !          1725:                     whose registers are not in bad_spill_regs.  */
        !          1726:                  if (i == FIRST_PSEUDO_REGISTER)
        !          1727:                    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1728:                      {
        !          1729:                        int k;
        !          1730:                        j = potential_reload_regs[i];
        !          1731:                        /* Verify that J+1 is a potential reload reg.  */
        !          1732:                        for (k = 0; k < FIRST_PSEUDO_REGISTER; k++)
        !          1733:                          if (potential_reload_regs[k] == j + 1)
        !          1734:                            break;
        !          1735:                        if (j >= 0 && j + 1 < FIRST_PSEUDO_REGISTER
        !          1736:                            && k < FIRST_PSEUDO_REGISTER
        !          1737:                            && spill_reg_order[j] < 0 && spill_reg_order[j + 1] < 0
        !          1738:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j)
        !          1739:                            && TEST_HARD_REG_BIT (reg_class_contents[class], j + 1)
        !          1740:                            && HARD_REGNO_MODE_OK (j, group_mode[class])
        !          1741:                            && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          1742:                                                    j + 1)
        !          1743:                            && ! TEST_HARD_REG_BIT (bad_spill_regs, j + 1))
        !          1744:                          break;
        !          1745:                      }
        !          1746: 
        !          1747:                  /* I should be the index in potential_reload_regs
        !          1748:                     of the new reload reg we have found.  */
        !          1749: 
        !          1750:                  if (i >= FIRST_PSEUDO_REGISTER)
        !          1751:                    {
        !          1752:                      /* There are no groups left to spill.  */
        !          1753:                      spill_failure (max_groups_insn[class]);
        !          1754:                      failure = 1;
        !          1755:                      goto failed;
        !          1756:                    }
        !          1757:                  else
        !          1758:                    something_changed
        !          1759:                      |= new_spill_reg (i, class, max_needs, NULL_PTR,
        !          1760:                                        global, dumpfile);
        !          1761:                }
        !          1762:              else
        !          1763:                {
        !          1764:                  /* For groups of more than 2 registers,
        !          1765:                     look for a sufficient sequence of unspilled registers,
        !          1766:                     and spill them all at once.  */
        !          1767:                  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1768:                    {
        !          1769:                      int k;
        !          1770: 
        !          1771:                      j = potential_reload_regs[i];
        !          1772:                      if (j >= 0
        !          1773:                          && j + group_size[class] <= FIRST_PSEUDO_REGISTER
        !          1774:                          && HARD_REGNO_MODE_OK (j, group_mode[class]))
        !          1775:                        {
        !          1776:                          /* Check each reg in the sequence.  */
        !          1777:                          for (k = 0; k < group_size[class]; k++)
        !          1778:                            if (! (spill_reg_order[j + k] < 0
        !          1779:                                   && ! TEST_HARD_REG_BIT (bad_spill_regs, j + k)
        !          1780:                                   && TEST_HARD_REG_BIT (reg_class_contents[class], j + k)))
        !          1781:                              break;
        !          1782:                          /* We got a full sequence, so spill them all.  */
        !          1783:                          if (k == group_size[class])
        !          1784:                            {
        !          1785:                              register enum reg_class *p;
        !          1786:                              for (k = 0; k < group_size[class]; k++)
        !          1787:                                {
        !          1788:                                  int idx;
        !          1789:                                  SET_HARD_REG_BIT (counted_for_groups, j + k);
        !          1790:                                  for (idx = 0; idx < FIRST_PSEUDO_REGISTER; idx++)
        !          1791:                                    if (potential_reload_regs[idx] == j + k)
        !          1792:                                      break;
        !          1793:                                  something_changed
        !          1794:                                    |= new_spill_reg (idx, class,
        !          1795:                                                      max_needs, NULL_PTR,
        !          1796:                                                      global, dumpfile);
        !          1797:                                }
        !          1798: 
        !          1799:                              /* We have found one that will complete a group,
        !          1800:                                 so count off one group as provided.  */
        !          1801:                              max_groups[class]--;
        !          1802:                              p = reg_class_superclasses[class];
        !          1803:                              while (*p != LIM_REG_CLASSES)
        !          1804:                                max_groups[(int) *p++]--;
        !          1805: 
        !          1806:                              break;
        !          1807:                            }
        !          1808:                        }
        !          1809:                    }
        !          1810:                  /* We couldn't find any registers for this reload.
        !          1811:                     Avoid going into an infinite loop.  */
        !          1812:                  if (i >= FIRST_PSEUDO_REGISTER)
        !          1813:                    {
        !          1814:                      /* There are no groups left.  */
        !          1815:                      spill_failure (max_groups_insn[class]);
        !          1816:                      failure = 1;
        !          1817:                      goto failed;
        !          1818:                    }
        !          1819:                }
        !          1820:            }
        !          1821: 
        !          1822:          /* Now similarly satisfy all need for single registers.  */
        !          1823: 
        !          1824:          while (max_needs[class] > 0 || max_nongroups[class] > 0)
        !          1825:            {
        !          1826: #ifdef SMALL_REGISTER_CLASSES
        !          1827:              /* This should be right for all machines, but only the 386
        !          1828:                 is known to need it, so this conditional plays safe.
        !          1829:                 ??? For 2.5, try making this unconditional.  */
        !          1830:              /* If we spilled enough regs, but they weren't counted
        !          1831:                 against the non-group need, see if we can count them now.
        !          1832:                 If so, we can avoid some actual spilling.  */
        !          1833:              if (max_needs[class] <= 0 && max_nongroups[class] > 0)
        !          1834:                for (i = 0; i < n_spills; i++)
        !          1835:                  if (TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1836:                                         spill_regs[i])
        !          1837:                      && !TEST_HARD_REG_BIT (counted_for_groups,
        !          1838:                                             spill_regs[i])
        !          1839:                      && !TEST_HARD_REG_BIT (counted_for_nongroups,
        !          1840:                                             spill_regs[i])
        !          1841:                      && max_nongroups[class] > 0)
        !          1842:                    {
        !          1843:                      register enum reg_class *p;
        !          1844: 
        !          1845:                      SET_HARD_REG_BIT (counted_for_nongroups, spill_regs[i]);
        !          1846:                      max_nongroups[class]--;
        !          1847:                      p = reg_class_superclasses[class];
        !          1848:                      while (*p != LIM_REG_CLASSES)
        !          1849:                        max_nongroups[(int) *p++]--;
        !          1850:                    }
        !          1851:              if (max_needs[class] <= 0 && max_nongroups[class] <= 0)
        !          1852:                break;
        !          1853: #endif
        !          1854: 
        !          1855:              /* Consider the potential reload regs that aren't
        !          1856:                 yet in use as reload regs, in order of preference.
        !          1857:                 Find the most preferred one that's in this class.  */
        !          1858: 
        !          1859:              for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1860:                if (potential_reload_regs[i] >= 0
        !          1861:                    && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1862:                                          potential_reload_regs[i])
        !          1863:                    /* If this reg will not be available for groups,
        !          1864:                       pick one that does not foreclose possible groups.
        !          1865:                       This is a kludge, and not very general,
        !          1866:                       but it should be sufficient to make the 386 work,
        !          1867:                       and the problem should not occur on machines with
        !          1868:                       more registers.  */
        !          1869:                    && (max_nongroups[class] == 0
        !          1870:                        || possible_group_p (potential_reload_regs[i], max_groups)))
        !          1871:                  break;
        !          1872: 
        !          1873:              /* If we couldn't get a register, try to get one even if we
        !          1874:                 might foreclose possible groups.  This may cause problems
        !          1875:                 later, but that's better than aborting now, since it is
        !          1876:                 possible that we will, in fact, be able to form the needed
        !          1877:                 group even with this allocation.  */
        !          1878: 
        !          1879:              if (i >= FIRST_PSEUDO_REGISTER
        !          1880:                  && (asm_noperands (max_needs[class] > 0
        !          1881:                                     ? max_needs_insn[class]
        !          1882:                                     : max_nongroups_insn[class])
        !          1883:                      < 0))
        !          1884:                for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          1885:                  if (potential_reload_regs[i] >= 0
        !          1886:                      && TEST_HARD_REG_BIT (reg_class_contents[class],
        !          1887:                                            potential_reload_regs[i]))
        !          1888:                    break;
        !          1889: 
        !          1890:              /* I should be the index in potential_reload_regs
        !          1891:                 of the new reload reg we have found.  */
        !          1892: 
        !          1893:              if (i >= FIRST_PSEUDO_REGISTER)
        !          1894:                {
        !          1895:                  /* There are no possible registers left to spill.  */
        !          1896:                  spill_failure (max_needs[class] > 0 ? max_needs_insn[class]
        !          1897:                                 : max_nongroups_insn[class]);
        !          1898:                  failure = 1;
        !          1899:                  goto failed;
        !          1900:                }
        !          1901:              else
        !          1902:                something_changed
        !          1903:                  |= new_spill_reg (i, class, max_needs, max_nongroups,
        !          1904:                                    global, dumpfile);
        !          1905:            }
        !          1906:        }
        !          1907:     }
        !          1908: 
        !          1909:   /* If global-alloc was run, notify it of any register eliminations we have
        !          1910:      done.  */
        !          1911:   if (global)
        !          1912:     for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          1913:       if (ep->can_eliminate)
        !          1914:        mark_elimination (ep->from, ep->to);
        !          1915: 
        !          1916:   /* Insert code to save and restore call-clobbered hard regs
        !          1917:      around calls.  Tell if what mode to use so that we will process
        !          1918:      those insns in reload_as_needed if we have to.  */
        !          1919: 
        !          1920:   if (caller_save_needed)
        !          1921:     save_call_clobbered_regs (num_eliminable ? QImode
        !          1922:                              : caller_save_spill_class != NO_REGS ? HImode
        !          1923:                              : VOIDmode);
        !          1924: 
        !          1925:   /* If a pseudo has no hard reg, delete the insns that made the equivalence.
        !          1926:      If that insn didn't set the register (i.e., it copied the register to
        !          1927:      memory), just delete that insn instead of the equivalencing insn plus
        !          1928:      anything now dead.  If we call delete_dead_insn on that insn, we may
        !          1929:      delete the insn that actually sets the register if the register die
        !          1930:      there and that is incorrect.  */
        !          1931: 
        !          1932:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !          1933:     if (reg_renumber[i] < 0 && reg_equiv_init[i] != 0
        !          1934:        && GET_CODE (reg_equiv_init[i]) != NOTE)
        !          1935:       {
        !          1936:        if (reg_set_p (regno_reg_rtx[i], PATTERN (reg_equiv_init[i])))
        !          1937:          delete_dead_insn (reg_equiv_init[i]);
        !          1938:        else
        !          1939:          {
        !          1940:            PUT_CODE (reg_equiv_init[i], NOTE);
        !          1941:            NOTE_SOURCE_FILE (reg_equiv_init[i]) = 0;
        !          1942:            NOTE_LINE_NUMBER (reg_equiv_init[i]) = NOTE_INSN_DELETED;
        !          1943:          }
        !          1944:       }
        !          1945: 
        !          1946:   /* Use the reload registers where necessary
        !          1947:      by generating move instructions to move the must-be-register
        !          1948:      values into or out of the reload registers.  */
        !          1949: 
        !          1950:   if (something_needs_reloads || something_needs_elimination
        !          1951:       || (caller_save_needed && num_eliminable)
        !          1952:       || caller_save_spill_class != NO_REGS)
        !          1953:     reload_as_needed (first, global);
        !          1954: 
        !          1955:   /* If we were able to eliminate the frame pointer, show that it is no
        !          1956:      longer live at the start of any basic block.  If it ls live by
        !          1957:      virtue of being in a pseudo, that pseudo will be marked live
        !          1958:      and hence the frame pointer will be known to be live via that
        !          1959:      pseudo.  */
        !          1960: 
        !          1961:   if (! frame_pointer_needed)
        !          1962:     for (i = 0; i < n_basic_blocks; i++)
        !          1963:       basic_block_live_at_start[i][HARD_FRAME_POINTER_REGNUM / REGSET_ELT_BITS]
        !          1964:        &= ~ ((REGSET_ELT_TYPE) 1 << (HARD_FRAME_POINTER_REGNUM
        !          1965:                                      % REGSET_ELT_BITS));
        !          1966: 
        !          1967:   /* Come here (with failure set nonzero) if we can't get enough spill regs
        !          1968:      and we decide not to abort about it.  */
        !          1969:  failed:
        !          1970: 
        !          1971:   reload_in_progress = 0;
        !          1972: 
        !          1973:   /* Now eliminate all pseudo regs by modifying them into
        !          1974:      their equivalent memory references.
        !          1975:      The REG-rtx's for the pseudos are modified in place,
        !          1976:      so all insns that used to refer to them now refer to memory.
        !          1977: 
        !          1978:      For a reg that has a reg_equiv_address, all those insns
        !          1979:      were changed by reloading so that no insns refer to it any longer;
        !          1980:      but the DECL_RTL of a variable decl may refer to it,
        !          1981:      and if so this causes the debugging info to mention the variable.  */
        !          1982: 
        !          1983:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !          1984:     {
        !          1985:       rtx addr = 0;
        !          1986:       int in_struct = 0;
        !          1987:       if (reg_equiv_mem[i])
        !          1988:        {
        !          1989:          addr = XEXP (reg_equiv_mem[i], 0);
        !          1990:          in_struct = MEM_IN_STRUCT_P (reg_equiv_mem[i]);
        !          1991:        }
        !          1992:       if (reg_equiv_address[i])
        !          1993:        addr = reg_equiv_address[i];
        !          1994:       if (addr)
        !          1995:        {
        !          1996:          if (reg_renumber[i] < 0)
        !          1997:            {
        !          1998:              rtx reg = regno_reg_rtx[i];
        !          1999:              XEXP (reg, 0) = addr;
        !          2000:              REG_USERVAR_P (reg) = 0;
        !          2001:              MEM_IN_STRUCT_P (reg) = in_struct;
        !          2002:              PUT_CODE (reg, MEM);
        !          2003:            }
        !          2004:          else if (reg_equiv_mem[i])
        !          2005:            XEXP (reg_equiv_mem[i], 0) = addr;
        !          2006:        }
        !          2007:     }
        !          2008: 
        !          2009: #ifdef PRESERVE_DEATH_INFO_REGNO_P
        !          2010:   /* Make a pass over all the insns and remove death notes for things that
        !          2011:      are no longer registers or no longer die in the insn (e.g., an input
        !          2012:      and output pseudo being tied).  */
        !          2013: 
        !          2014:   for (insn = first; insn; insn = NEXT_INSN (insn))
        !          2015:     if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
        !          2016:       {
        !          2017:        rtx note, next;
        !          2018: 
        !          2019:        for (note = REG_NOTES (insn); note; note = next)
        !          2020:          {
        !          2021:            next = XEXP (note, 1);
        !          2022:            if (REG_NOTE_KIND (note) == REG_DEAD
        !          2023:                && (GET_CODE (XEXP (note, 0)) != REG
        !          2024:                    || reg_set_p (XEXP (note, 0), PATTERN (insn))))
        !          2025:              remove_note (insn, note);
        !          2026:          }
        !          2027:       }
        !          2028: #endif
        !          2029: 
        !          2030:   /* Indicate that we no longer have known memory locations or constants.  */
        !          2031:   reg_equiv_constant = 0;
        !          2032:   reg_equiv_memory_loc = 0;
        !          2033: 
        !          2034:   if (scratch_list)
        !          2035:     free (scratch_list);
        !          2036:   scratch_list = 0;
        !          2037:   scratch_list_length = 0;
        !          2038:   if (scratch_block)
        !          2039:     free (scratch_block);
        !          2040:   scratch_block = 0;
        !          2041: 
        !          2042:   return failure;
        !          2043: }
        !          2044: 
        !          2045: /* Nonzero if, after spilling reg REGNO for non-groups,
        !          2046:    it will still be possible to find a group if we still need one.  */
        !          2047: 
        !          2048: static int
        !          2049: possible_group_p (regno, max_groups)
        !          2050:      int regno;
        !          2051:      int *max_groups;
        !          2052: {
        !          2053:   int i;
        !          2054:   int class = (int) NO_REGS;
        !          2055: 
        !          2056:   for (i = 0; i < (int) N_REG_CLASSES; i++)
        !          2057:     if (max_groups[i] > 0)
        !          2058:       {
        !          2059:        class = i;
        !          2060:        break;
        !          2061:       }
        !          2062: 
        !          2063:   if (class == (int) NO_REGS)
        !          2064:     return 1;
        !          2065: 
        !          2066:   /* Consider each pair of consecutive registers.  */
        !          2067:   for (i = 0; i < FIRST_PSEUDO_REGISTER - 1; i++)
        !          2068:     {
        !          2069:       /* Ignore pairs that include reg REGNO.  */
        !          2070:       if (i == regno || i + 1 == regno)
        !          2071:        continue;
        !          2072: 
        !          2073:       /* Ignore pairs that are outside the class that needs the group.
        !          2074:         ??? Here we fail to handle the case where two different classes
        !          2075:         independently need groups.  But this never happens with our
        !          2076:         current machine descriptions.  */
        !          2077:       if (! (TEST_HARD_REG_BIT (reg_class_contents[class], i)
        !          2078:             && TEST_HARD_REG_BIT (reg_class_contents[class], i + 1)))
        !          2079:        continue;
        !          2080: 
        !          2081:       /* A pair of consecutive regs we can still spill does the trick.  */
        !          2082:       if (spill_reg_order[i] < 0 && spill_reg_order[i + 1] < 0
        !          2083:          && ! TEST_HARD_REG_BIT (bad_spill_regs, i)
        !          2084:          && ! TEST_HARD_REG_BIT (bad_spill_regs, i + 1))
        !          2085:        return 1;
        !          2086: 
        !          2087:       /* A pair of one already spilled and one we can spill does it
        !          2088:         provided the one already spilled is not otherwise reserved.  */
        !          2089:       if (spill_reg_order[i] < 0
        !          2090:          && ! TEST_HARD_REG_BIT (bad_spill_regs, i)
        !          2091:          && spill_reg_order[i + 1] >= 0
        !          2092:          && ! TEST_HARD_REG_BIT (counted_for_groups, i + 1)
        !          2093:          && ! TEST_HARD_REG_BIT (counted_for_nongroups, i + 1))
        !          2094:        return 1;
        !          2095:       if (spill_reg_order[i + 1] < 0
        !          2096:          && ! TEST_HARD_REG_BIT (bad_spill_regs, i + 1)
        !          2097:          && spill_reg_order[i] >= 0
        !          2098:          && ! TEST_HARD_REG_BIT (counted_for_groups, i)
        !          2099:          && ! TEST_HARD_REG_BIT (counted_for_nongroups, i))
        !          2100:        return 1;
        !          2101:     }
        !          2102: 
        !          2103:   return 0;
        !          2104: }
        !          2105: 
        !          2106: /* Count any groups that can be formed from the registers recently spilled.
        !          2107:    This is done class by class, in order of ascending class number.  */
        !          2108: 
        !          2109: static void
        !          2110: count_possible_groups (group_size, group_mode, max_groups)
        !          2111:      int *group_size;
        !          2112:      enum machine_mode *group_mode;
        !          2113:      int *max_groups;
        !          2114: {
        !          2115:   int i;
        !          2116:   /* Now find all consecutive groups of spilled registers
        !          2117:      and mark each group off against the need for such groups.
        !          2118:      But don't count them against ordinary need, yet.  */
        !          2119: 
        !          2120:   for (i = 0; i < N_REG_CLASSES; i++)
        !          2121:     if (group_size[i] > 1)
        !          2122:       {
        !          2123:        HARD_REG_SET new;
        !          2124:        int j;
        !          2125: 
        !          2126:        CLEAR_HARD_REG_SET (new);
        !          2127: 
        !          2128:        /* Make a mask of all the regs that are spill regs in class I.  */
        !          2129:        for (j = 0; j < n_spills; j++)
        !          2130:          if (TEST_HARD_REG_BIT (reg_class_contents[i], spill_regs[j])
        !          2131:              && ! TEST_HARD_REG_BIT (counted_for_groups, spill_regs[j])
        !          2132:              && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          2133:                                      spill_regs[j]))
        !          2134:            SET_HARD_REG_BIT (new, spill_regs[j]);
        !          2135: 
        !          2136:        /* Find each consecutive group of them.  */
        !          2137:        for (j = 0; j < FIRST_PSEUDO_REGISTER && max_groups[i] > 0; j++)
        !          2138:          if (TEST_HARD_REG_BIT (new, j)
        !          2139:              && j + group_size[i] <= FIRST_PSEUDO_REGISTER
        !          2140:              /* Next line in case group-mode for this class
        !          2141:                 demands an even-odd pair.  */
        !          2142:              && HARD_REGNO_MODE_OK (j, group_mode[i]))
        !          2143:            {
        !          2144:              int k;
        !          2145:              for (k = 1; k < group_size[i]; k++)
        !          2146:                if (! TEST_HARD_REG_BIT (new, j + k))
        !          2147:                  break;
        !          2148:              if (k == group_size[i])
        !          2149:                {
        !          2150:                  /* We found a group.  Mark it off against this class's
        !          2151:                     need for groups, and against each superclass too.  */
        !          2152:                  register enum reg_class *p;
        !          2153:                  max_groups[i]--;
        !          2154:                  p = reg_class_superclasses[i];
        !          2155:                  while (*p != LIM_REG_CLASSES)
        !          2156:                    max_groups[(int) *p++]--;
        !          2157:                  /* Don't count these registers again.  */
        !          2158:                  for (k = 0; k < group_size[i]; k++)
        !          2159:                    SET_HARD_REG_BIT (counted_for_groups, j + k);
        !          2160:                }
        !          2161:              /* Skip to the last reg in this group.  When j is incremented
        !          2162:                 above, it will then point to the first reg of the next
        !          2163:                 possible group.  */
        !          2164:              j += k - 1;
        !          2165:            }
        !          2166:       }
        !          2167: 
        !          2168: }
        !          2169: 
        !          2170: /* ALLOCATE_MODE is a register mode that needs to be reloaded.  OTHER_MODE is
        !          2171:    another mode that needs to be reloaded for the same register class CLASS.
        !          2172:    If any reg in CLASS allows ALLOCATE_MODE but not OTHER_MODE, fail.
        !          2173:    ALLOCATE_MODE will never be smaller than OTHER_MODE.
        !          2174: 
        !          2175:    This code used to also fail if any reg in CLASS allows OTHER_MODE but not
        !          2176:    ALLOCATE_MODE.  This test is unnecessary, because we will never try to put
        !          2177:    something of mode ALLOCATE_MODE into an OTHER_MODE register.  Testing this
        !          2178:    causes unnecessary failures on machines requiring alignment of register
        !          2179:    groups when the two modes are different sizes, because the larger mode has
        !          2180:    more strict alignment rules than the smaller mode.  */
        !          2181: 
        !          2182: static int
        !          2183: modes_equiv_for_class_p (allocate_mode, other_mode, class)
        !          2184:      enum machine_mode allocate_mode, other_mode;
        !          2185:      enum reg_class class;
        !          2186: {
        !          2187:   register int regno;
        !          2188:   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
        !          2189:     {
        !          2190:       if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno)
        !          2191:          && HARD_REGNO_MODE_OK (regno, allocate_mode)
        !          2192:          && ! HARD_REGNO_MODE_OK (regno, other_mode))
        !          2193:        return 0;
        !          2194:     }
        !          2195:   return 1;
        !          2196: }
        !          2197: 
        !          2198: /* Handle the failure to find a register to spill.
        !          2199:    INSN should be one of the insns which needed this particular spill reg.  */
        !          2200: 
        !          2201: static void
        !          2202: spill_failure (insn)
        !          2203:      rtx insn;
        !          2204: {
        !          2205:   if (asm_noperands (PATTERN (insn)) >= 0)
        !          2206:     error_for_asm (insn, "`asm' needs too many reloads");
        !          2207:   else
        !          2208:     abort ();
        !          2209: }
        !          2210: 
        !          2211: /* Add a new register to the tables of available spill-registers
        !          2212:     (as well as spilling all pseudos allocated to the register).
        !          2213:    I is the index of this register in potential_reload_regs.
        !          2214:    CLASS is the regclass whose need is being satisfied.
        !          2215:    MAX_NEEDS and MAX_NONGROUPS are the vectors of needs,
        !          2216:     so that this register can count off against them.
        !          2217:     MAX_NONGROUPS is 0 if this register is part of a group.
        !          2218:    GLOBAL and DUMPFILE are the same as the args that `reload' got.  */
        !          2219: 
        !          2220: static int
        !          2221: new_spill_reg (i, class, max_needs, max_nongroups, global, dumpfile)
        !          2222:      int i;
        !          2223:      int class;
        !          2224:      int *max_needs;
        !          2225:      int *max_nongroups;
        !          2226:      int global;
        !          2227:      FILE *dumpfile;
        !          2228: {
        !          2229:   register enum reg_class *p;
        !          2230:   int val;
        !          2231:   int regno = potential_reload_regs[i];
        !          2232: 
        !          2233:   if (i >= FIRST_PSEUDO_REGISTER)
        !          2234:     abort ();  /* Caller failed to find any register.  */
        !          2235: 
        !          2236: #ifdef HI_SUM_TARGET_REGNO
        !          2237:   if (regno != HI_SUM_TARGET_REGNO)
        !          2238: #endif
        !          2239:   if (fixed_regs[regno] || TEST_HARD_REG_BIT (forbidden_regs, regno))
        !          2240:     fatal ("fixed or forbidden register was spilled.\n\
        !          2241: This may be due to a compiler bug or to impossible asm statements.");
        !          2242: 
        !          2243:   /* Make reg REGNO an additional reload reg.  */
        !          2244: 
        !          2245:   potential_reload_regs[i] = -1;
        !          2246:   spill_regs[n_spills] = regno;
        !          2247:   spill_reg_order[regno] = n_spills;
        !          2248:   if (dumpfile)
        !          2249:     fprintf (dumpfile, "Spilling reg %d.\n", spill_regs[n_spills]);
        !          2250: 
        !          2251:   /* Clear off the needs we just satisfied.  */
        !          2252: 
        !          2253:   max_needs[class]--;
        !          2254:   p = reg_class_superclasses[class];
        !          2255:   while (*p != LIM_REG_CLASSES)
        !          2256:     max_needs[(int) *p++]--;
        !          2257: 
        !          2258:   if (max_nongroups && max_nongroups[class] > 0)
        !          2259:     {
        !          2260:       SET_HARD_REG_BIT (counted_for_nongroups, regno);
        !          2261:       max_nongroups[class]--;
        !          2262:       p = reg_class_superclasses[class];
        !          2263:       while (*p != LIM_REG_CLASSES)
        !          2264:        max_nongroups[(int) *p++]--;
        !          2265:     }
        !          2266: 
        !          2267:   /* Spill every pseudo reg that was allocated to this reg
        !          2268:      or to something that overlaps this reg.  */
        !          2269: 
        !          2270:   val = spill_hard_reg (spill_regs[n_spills], global, dumpfile, 0);
        !          2271: 
        !          2272:   /* If there are some registers still to eliminate and this register
        !          2273:      wasn't ever used before, additional stack space may have to be
        !          2274:      allocated to store this register.  Thus, we may have changed the offset
        !          2275:      between the stack and frame pointers, so mark that something has changed.
        !          2276:      (If new pseudos were spilled, thus requiring more space, VAL would have
        !          2277:      been set non-zero by the call to spill_hard_reg above since additional
        !          2278:      reloads may be needed in that case.
        !          2279: 
        !          2280:      One might think that we need only set VAL to 1 if this is a call-used
        !          2281:      register.  However, the set of registers that must be saved by the
        !          2282:      prologue is not identical to the call-used set.  For example, the
        !          2283:      register used by the call insn for the return PC is a call-used register,
        !          2284:      but must be saved by the prologue.  */
        !          2285:   if (num_eliminable && ! regs_ever_live[spill_regs[n_spills]])
        !          2286:     val = 1;
        !          2287: 
        !          2288:   regs_ever_live[spill_regs[n_spills]] = 1;
        !          2289:   n_spills++;
        !          2290: 
        !          2291:   return val;
        !          2292: }
        !          2293: 
        !          2294: /* Delete an unneeded INSN and any previous insns who sole purpose is loading
        !          2295:    data that is dead in INSN.  */
        !          2296: 
        !          2297: static void
        !          2298: delete_dead_insn (insn)
        !          2299:      rtx insn;
        !          2300: {
        !          2301:   rtx prev = prev_real_insn (insn);
        !          2302:   rtx prev_dest;
        !          2303: 
        !          2304:   /* If the previous insn sets a register that dies in our insn, delete it
        !          2305:      too.  */
        !          2306:   if (prev && GET_CODE (PATTERN (prev)) == SET
        !          2307:       && (prev_dest = SET_DEST (PATTERN (prev)), GET_CODE (prev_dest) == REG)
        !          2308:       && reg_mentioned_p (prev_dest, PATTERN (insn))
        !          2309:       && find_regno_note (insn, REG_DEAD, REGNO (prev_dest)))
        !          2310:     delete_dead_insn (prev);
        !          2311: 
        !          2312:   PUT_CODE (insn, NOTE);
        !          2313:   NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
        !          2314:   NOTE_SOURCE_FILE (insn) = 0;
        !          2315: }
        !          2316: 
        !          2317: /* Modify the home of pseudo-reg I.
        !          2318:    The new home is present in reg_renumber[I].
        !          2319: 
        !          2320:    FROM_REG may be the hard reg that the pseudo-reg is being spilled from;
        !          2321:    or it may be -1, meaning there is none or it is not relevant.
        !          2322:    This is used so that all pseudos spilled from a given hard reg
        !          2323:    can share one stack slot.  */
        !          2324: 
        !          2325: static void
        !          2326: alter_reg (i, from_reg)
        !          2327:      register int i;
        !          2328:      int from_reg;
        !          2329: {
        !          2330:   /* When outputting an inline function, this can happen
        !          2331:      for a reg that isn't actually used.  */
        !          2332:   if (regno_reg_rtx[i] == 0)
        !          2333:     return;
        !          2334: 
        !          2335:   /* If the reg got changed to a MEM at rtl-generation time,
        !          2336:      ignore it.  */
        !          2337:   if (GET_CODE (regno_reg_rtx[i]) != REG)
        !          2338:     return;
        !          2339: 
        !          2340:   /* Modify the reg-rtx to contain the new hard reg
        !          2341:      number or else to contain its pseudo reg number.  */
        !          2342:   REGNO (regno_reg_rtx[i])
        !          2343:     = reg_renumber[i] >= 0 ? reg_renumber[i] : i;
        !          2344: 
        !          2345:   /* If we have a pseudo that is needed but has no hard reg or equivalent,
        !          2346:      allocate a stack slot for it.  */
        !          2347: 
        !          2348:   if (reg_renumber[i] < 0
        !          2349:       && reg_n_refs[i] > 0
        !          2350:       && reg_equiv_constant[i] == 0
        !          2351:       && reg_equiv_memory_loc[i] == 0)
        !          2352:     {
        !          2353:       register rtx x;
        !          2354:       int inherent_size = PSEUDO_REGNO_BYTES (i);
        !          2355:       int total_size = MAX (inherent_size, reg_max_ref_width[i]);
        !          2356:       int adjust = 0;
        !          2357: 
        !          2358:       /* Each pseudo reg has an inherent size which comes from its own mode,
        !          2359:         and a total size which provides room for paradoxical subregs
        !          2360:         which refer to the pseudo reg in wider modes.
        !          2361: 
        !          2362:         We can use a slot already allocated if it provides both
        !          2363:         enough inherent space and enough total space.
        !          2364:         Otherwise, we allocate a new slot, making sure that it has no less
        !          2365:         inherent space, and no less total space, then the previous slot.  */
        !          2366:       if (from_reg == -1)
        !          2367:        {
        !          2368:          /* No known place to spill from => no slot to reuse.  */
        !          2369:          x = assign_stack_local (GET_MODE (regno_reg_rtx[i]), total_size, -1);
        !          2370: #if BYTES_BIG_ENDIAN
        !          2371:          /* Cancel the  big-endian correction done in assign_stack_local.
        !          2372:             Get the address of the beginning of the slot.
        !          2373:             This is so we can do a big-endian correction unconditionally
        !          2374:             below.  */
        !          2375:          adjust = inherent_size - total_size;
        !          2376: #endif
        !          2377:        }
        !          2378:       /* Reuse a stack slot if possible.  */
        !          2379:       else if (spill_stack_slot[from_reg] != 0
        !          2380:               && spill_stack_slot_width[from_reg] >= total_size
        !          2381:               && (GET_MODE_SIZE (GET_MODE (spill_stack_slot[from_reg]))
        !          2382:                   >= inherent_size))
        !          2383:        x = spill_stack_slot[from_reg];
        !          2384:       /* Allocate a bigger slot.  */
        !          2385:       else
        !          2386:        {
        !          2387:          /* Compute maximum size needed, both for inherent size
        !          2388:             and for total size.  */
        !          2389:          enum machine_mode mode = GET_MODE (regno_reg_rtx[i]);
        !          2390:          if (spill_stack_slot[from_reg])
        !          2391:            {
        !          2392:              if (GET_MODE_SIZE (GET_MODE (spill_stack_slot[from_reg]))
        !          2393:                  > inherent_size)
        !          2394:                mode = GET_MODE (spill_stack_slot[from_reg]);
        !          2395:              if (spill_stack_slot_width[from_reg] > total_size)
        !          2396:                total_size = spill_stack_slot_width[from_reg];
        !          2397:            }
        !          2398:          /* Make a slot with that size.  */
        !          2399:          x = assign_stack_local (mode, total_size, -1);
        !          2400: #if BYTES_BIG_ENDIAN
        !          2401:          /* Cancel the  big-endian correction done in assign_stack_local.
        !          2402:             Get the address of the beginning of the slot.
        !          2403:             This is so we can do a big-endian correction unconditionally
        !          2404:             below.  */
        !          2405:          adjust = GET_MODE_SIZE (mode) - total_size;
        !          2406: #endif
        !          2407:          spill_stack_slot[from_reg] = x;
        !          2408:          spill_stack_slot_width[from_reg] = total_size;
        !          2409:        }
        !          2410: 
        !          2411: #if BYTES_BIG_ENDIAN
        !          2412:       /* On a big endian machine, the "address" of the slot
        !          2413:         is the address of the low part that fits its inherent mode.  */
        !          2414:       if (inherent_size < total_size)
        !          2415:        adjust += (total_size - inherent_size);
        !          2416: #endif /* BYTES_BIG_ENDIAN */
        !          2417: 
        !          2418:       /* If we have any adjustment to make, or if the stack slot is the
        !          2419:         wrong mode, make a new stack slot.  */
        !          2420:       if (adjust != 0 || GET_MODE (x) != GET_MODE (regno_reg_rtx[i]))
        !          2421:        {
        !          2422:          x = gen_rtx (MEM, GET_MODE (regno_reg_rtx[i]),
        !          2423:                       plus_constant (XEXP (x, 0), adjust));
        !          2424:          RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[i]);
        !          2425:        }
        !          2426: 
        !          2427:       /* Save the stack slot for later.   */
        !          2428:       reg_equiv_memory_loc[i] = x;
        !          2429:     }
        !          2430: }
        !          2431: 
        !          2432: /* Mark the slots in regs_ever_live for the hard regs
        !          2433:    used by pseudo-reg number REGNO.  */
        !          2434: 
        !          2435: void
        !          2436: mark_home_live (regno)
        !          2437:      int regno;
        !          2438: {
        !          2439:   register int i, lim;
        !          2440:   i = reg_renumber[regno];
        !          2441:   if (i < 0)
        !          2442:     return;
        !          2443:   lim = i + HARD_REGNO_NREGS (i, PSEUDO_REGNO_MODE (regno));
        !          2444:   while (i < lim)
        !          2445:     regs_ever_live[i++] = 1;
        !          2446: }
        !          2447: 
        !          2448: /* Mark the registers used in SCRATCH as being live.  */
        !          2449: 
        !          2450: static void
        !          2451: mark_scratch_live (scratch)
        !          2452:      rtx scratch;
        !          2453: {
        !          2454:   register int i;
        !          2455:   int regno = REGNO (scratch);
        !          2456:   int lim = regno + HARD_REGNO_NREGS (regno, GET_MODE (scratch));
        !          2457: 
        !          2458:   for (i = regno; i < lim; i++)
        !          2459:     regs_ever_live[i] = 1;
        !          2460: }
        !          2461: 
        !          2462: /* This function handles the tracking of elimination offsets around branches.
        !          2463: 
        !          2464:    X is a piece of RTL being scanned.
        !          2465: 
        !          2466:    INSN is the insn that it came from, if any.
        !          2467: 
        !          2468:    INITIAL_P is non-zero if we are to set the offset to be the initial
        !          2469:    offset and zero if we are setting the offset of the label to be the
        !          2470:    current offset.  */
        !          2471: 
        !          2472: static void
        !          2473: set_label_offsets (x, insn, initial_p)
        !          2474:      rtx x;
        !          2475:      rtx insn;
        !          2476:      int initial_p;
        !          2477: {
        !          2478:   enum rtx_code code = GET_CODE (x);
        !          2479:   rtx tem;
        !          2480:   int i;
        !          2481:   struct elim_table *p;
        !          2482: 
        !          2483:   switch (code)
        !          2484:     {
        !          2485:     case LABEL_REF:
        !          2486:       if (LABEL_REF_NONLOCAL_P (x))
        !          2487:        return;
        !          2488: 
        !          2489:       x = XEXP (x, 0);
        !          2490: 
        !          2491:       /* ... fall through ... */
        !          2492: 
        !          2493:     case CODE_LABEL:
        !          2494:       /* If we know nothing about this label, set the desired offsets.  Note
        !          2495:         that this sets the offset at a label to be the offset before a label
        !          2496:         if we don't know anything about the label.  This is not correct for
        !          2497:         the label after a BARRIER, but is the best guess we can make.  If
        !          2498:         we guessed wrong, we will suppress an elimination that might have
        !          2499:         been possible had we been able to guess correctly.  */
        !          2500: 
        !          2501:       if (! offsets_known_at[CODE_LABEL_NUMBER (x)])
        !          2502:        {
        !          2503:          for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          2504:            offsets_at[CODE_LABEL_NUMBER (x)][i]
        !          2505:              = (initial_p ? reg_eliminate[i].initial_offset
        !          2506:                 : reg_eliminate[i].offset);
        !          2507:          offsets_known_at[CODE_LABEL_NUMBER (x)] = 1;
        !          2508:        }
        !          2509: 
        !          2510:       /* Otherwise, if this is the definition of a label and it is
        !          2511:         preceded by a BARRIER, set our offsets to the known offset of
        !          2512:         that label.  */
        !          2513: 
        !          2514:       else if (x == insn
        !          2515:               && (tem = prev_nonnote_insn (insn)) != 0
        !          2516:               && GET_CODE (tem) == BARRIER)
        !          2517:        {
        !          2518:          num_not_at_initial_offset = 0;
        !          2519:          for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          2520:            {
        !          2521:              reg_eliminate[i].offset = reg_eliminate[i].previous_offset
        !          2522:                = offsets_at[CODE_LABEL_NUMBER (x)][i];
        !          2523:              if (reg_eliminate[i].can_eliminate
        !          2524:                  && (reg_eliminate[i].offset
        !          2525:                      != reg_eliminate[i].initial_offset))
        !          2526:                num_not_at_initial_offset++;
        !          2527:            }
        !          2528:        }
        !          2529: 
        !          2530:       else
        !          2531:        /* If neither of the above cases is true, compare each offset
        !          2532:           with those previously recorded and suppress any eliminations
        !          2533:           where the offsets disagree.  */
        !          2534: 
        !          2535:        for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          2536:          if (offsets_at[CODE_LABEL_NUMBER (x)][i]
        !          2537:              != (initial_p ? reg_eliminate[i].initial_offset
        !          2538:                  : reg_eliminate[i].offset))
        !          2539:            reg_eliminate[i].can_eliminate = 0;
        !          2540: 
        !          2541:       return;
        !          2542: 
        !          2543:     case JUMP_INSN:
        !          2544:       set_label_offsets (PATTERN (insn), insn, initial_p);
        !          2545: 
        !          2546:       /* ... fall through ... */
        !          2547: 
        !          2548:     case INSN:
        !          2549:     case CALL_INSN:
        !          2550:       /* Any labels mentioned in REG_LABEL notes can be branched to indirectly
        !          2551:         and hence must have all eliminations at their initial offsets.  */
        !          2552:       for (tem = REG_NOTES (x); tem; tem = XEXP (tem, 1))
        !          2553:        if (REG_NOTE_KIND (tem) == REG_LABEL)
        !          2554:          set_label_offsets (XEXP (tem, 0), insn, 1);
        !          2555:       return;
        !          2556: 
        !          2557:     case ADDR_VEC:
        !          2558:     case ADDR_DIFF_VEC:
        !          2559:       /* Each of the labels in the address vector must be at their initial
        !          2560:         offsets.  We want the first first for ADDR_VEC and the second
        !          2561:         field for ADDR_DIFF_VEC.  */
        !          2562: 
        !          2563:       for (i = 0; i < XVECLEN (x, code == ADDR_DIFF_VEC); i++)
        !          2564:        set_label_offsets (XVECEXP (x, code == ADDR_DIFF_VEC, i),
        !          2565:                           insn, initial_p);
        !          2566:       return;
        !          2567: 
        !          2568:     case SET:
        !          2569:       /* We only care about setting PC.  If the source is not RETURN,
        !          2570:         IF_THEN_ELSE, or a label, disable any eliminations not at
        !          2571:         their initial offsets.  Similarly if any arm of the IF_THEN_ELSE
        !          2572:         isn't one of those possibilities.  For branches to a label,
        !          2573:         call ourselves recursively.
        !          2574: 
        !          2575:         Note that this can disable elimination unnecessarily when we have
        !          2576:         a non-local goto since it will look like a non-constant jump to
        !          2577:         someplace in the current function.  This isn't a significant
        !          2578:         problem since such jumps will normally be when all elimination
        !          2579:         pairs are back to their initial offsets.  */
        !          2580: 
        !          2581:       if (SET_DEST (x) != pc_rtx)
        !          2582:        return;
        !          2583: 
        !          2584:       switch (GET_CODE (SET_SRC (x)))
        !          2585:        {
        !          2586:        case PC:
        !          2587:        case RETURN:
        !          2588:          return;
        !          2589: 
        !          2590:        case LABEL_REF:
        !          2591:          set_label_offsets (XEXP (SET_SRC (x), 0), insn, initial_p);
        !          2592:          return;
        !          2593: 
        !          2594:        case IF_THEN_ELSE:
        !          2595:          tem = XEXP (SET_SRC (x), 1);
        !          2596:          if (GET_CODE (tem) == LABEL_REF)
        !          2597:            set_label_offsets (XEXP (tem, 0), insn, initial_p);
        !          2598:          else if (GET_CODE (tem) != PC && GET_CODE (tem) != RETURN)
        !          2599:            break;
        !          2600: 
        !          2601:          tem = XEXP (SET_SRC (x), 2);
        !          2602:          if (GET_CODE (tem) == LABEL_REF)
        !          2603:            set_label_offsets (XEXP (tem, 0), insn, initial_p);
        !          2604:          else if (GET_CODE (tem) != PC && GET_CODE (tem) != RETURN)
        !          2605:            break;
        !          2606:          return;
        !          2607:        }
        !          2608: 
        !          2609:       /* If we reach here, all eliminations must be at their initial
        !          2610:         offset because we are doing a jump to a variable address.  */
        !          2611:       for (p = reg_eliminate; p < &reg_eliminate[NUM_ELIMINABLE_REGS]; p++)
        !          2612:        if (p->offset != p->initial_offset)
        !          2613:          p->can_eliminate = 0;
        !          2614:     }
        !          2615: }
        !          2616: 
        !          2617: /* Used for communication between the next two function to properly share
        !          2618:    the vector for an ASM_OPERANDS.  */
        !          2619: 
        !          2620: static struct rtvec_def *old_asm_operands_vec, *new_asm_operands_vec;
        !          2621: 
        !          2622: /* Scan X and replace any eliminable registers (such as fp) with a
        !          2623:    replacement (such as sp), plus an offset.
        !          2624: 
        !          2625:    MEM_MODE is the mode of an enclosing MEM.  We need this to know how
        !          2626:    much to adjust a register for, e.g., PRE_DEC.  Also, if we are inside a
        !          2627:    MEM, we are allowed to replace a sum of a register and the constant zero
        !          2628:    with the register, which we cannot do outside a MEM.  In addition, we need
        !          2629:    to record the fact that a register is referenced outside a MEM.
        !          2630: 
        !          2631:    If INSN is an insn, it is the insn containing X.  If we replace a REG
        !          2632:    in a SET_DEST with an equivalent MEM and INSN is non-zero, write a
        !          2633:    CLOBBER of the pseudo after INSN so find_equiv_regs will know that
        !          2634:    that the REG is being modified.
        !          2635: 
        !          2636:    Alternatively, INSN may be a note (an EXPR_LIST or INSN_LIST).
        !          2637:    That's used when we eliminate in expressions stored in notes.
        !          2638:    This means, do not set ref_outside_mem even if the reference
        !          2639:    is outside of MEMs.
        !          2640: 
        !          2641:    If we see a modification to a register we know about, take the
        !          2642:    appropriate action (see case SET, below).
        !          2643: 
        !          2644:    REG_EQUIV_MEM and REG_EQUIV_ADDRESS contain address that have had
        !          2645:    replacements done assuming all offsets are at their initial values.  If
        !          2646:    they are not, or if REG_EQUIV_ADDRESS is nonzero for a pseudo we
        !          2647:    encounter, return the actual location so that find_reloads will do
        !          2648:    the proper thing.  */
        !          2649: 
        !          2650: rtx
        !          2651: eliminate_regs (x, mem_mode, insn)
        !          2652:      rtx x;
        !          2653:      enum machine_mode mem_mode;
        !          2654:      rtx insn;
        !          2655: {
        !          2656:   enum rtx_code code = GET_CODE (x);
        !          2657:   struct elim_table *ep;
        !          2658:   int regno;
        !          2659:   rtx new;
        !          2660:   int i, j;
        !          2661:   char *fmt;
        !          2662:   int copied = 0;
        !          2663: 
        !          2664:   switch (code)
        !          2665:     {
        !          2666:     case CONST_INT:
        !          2667:     case CONST_DOUBLE:
        !          2668:     case CONST:
        !          2669:     case SYMBOL_REF:
        !          2670:     case CODE_LABEL:
        !          2671:     case PC:
        !          2672:     case CC0:
        !          2673:     case ASM_INPUT:
        !          2674:     case ADDR_VEC:
        !          2675:     case ADDR_DIFF_VEC:
        !          2676:     case RETURN:
        !          2677:       return x;
        !          2678: 
        !          2679:     case REG:
        !          2680:       regno = REGNO (x);
        !          2681: 
        !          2682:       /* First handle the case where we encounter a bare register that
        !          2683:         is eliminable.  Replace it with a PLUS.  */
        !          2684:       if (regno < FIRST_PSEUDO_REGISTER)
        !          2685:        {
        !          2686:          for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
        !          2687:               ep++)
        !          2688:            if (ep->from_rtx == x && ep->can_eliminate)
        !          2689:              {
        !          2690:                if (! mem_mode
        !          2691:                    /* Refs inside notes don't count for this purpose.  */
        !          2692:                    && ! (insn != 0 && (GET_CODE (insn) == EXPR_LIST
        !          2693:                                        || GET_CODE (insn) == INSN_LIST)))
        !          2694:                  ep->ref_outside_mem = 1;
        !          2695:                return plus_constant (ep->to_rtx, ep->previous_offset);
        !          2696:              }
        !          2697: 
        !          2698:        }
        !          2699:       else if (reg_equiv_memory_loc && reg_equiv_memory_loc[regno]
        !          2700:               && (reg_equiv_address[regno] || num_not_at_initial_offset))
        !          2701:        {
        !          2702:          /* In this case, find_reloads would attempt to either use an
        !          2703:             incorrect address (if something is not at its initial offset)
        !          2704:             or substitute an replaced address into an insn (which loses
        !          2705:             if the offset is changed by some later action).  So we simply
        !          2706:             return the replaced stack slot (assuming it is changed by
        !          2707:             elimination) and ignore the fact that this is actually a
        !          2708:             reference to the pseudo.  Ensure we make a copy of the
        !          2709:             address in case it is shared.  */
        !          2710:          new = eliminate_regs (reg_equiv_memory_loc[regno],
        !          2711:                                mem_mode, insn);
        !          2712:          if (new != reg_equiv_memory_loc[regno])
        !          2713:            {
        !          2714:              cannot_omit_stores[regno] = 1;
        !          2715:              return copy_rtx (new);
        !          2716:            }
        !          2717:        }
        !          2718:       return x;
        !          2719: 
        !          2720:     case PLUS:
        !          2721:       /* If this is the sum of an eliminable register and a constant, rework
        !          2722:         the sum.   */
        !          2723:       if (GET_CODE (XEXP (x, 0)) == REG
        !          2724:          && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
        !          2725:          && CONSTANT_P (XEXP (x, 1)))
        !          2726:        {
        !          2727:          for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
        !          2728:               ep++)
        !          2729:            if (ep->from_rtx == XEXP (x, 0) && ep->can_eliminate)
        !          2730:              {
        !          2731:                if (! mem_mode
        !          2732:                    /* Refs inside notes don't count for this purpose.  */
        !          2733:                    && ! (insn != 0 && (GET_CODE (insn) == EXPR_LIST
        !          2734:                                        || GET_CODE (insn) == INSN_LIST)))
        !          2735:                  ep->ref_outside_mem = 1;
        !          2736: 
        !          2737:                /* The only time we want to replace a PLUS with a REG (this
        !          2738:                   occurs when the constant operand of the PLUS is the negative
        !          2739:                   of the offset) is when we are inside a MEM.  We won't want
        !          2740:                   to do so at other times because that would change the
        !          2741:                   structure of the insn in a way that reload can't handle.
        !          2742:                   We special-case the commonest situation in
        !          2743:                   eliminate_regs_in_insn, so just replace a PLUS with a
        !          2744:                   PLUS here, unless inside a MEM.  */
        !          2745:                if (mem_mode != 0 && GET_CODE (XEXP (x, 1)) == CONST_INT
        !          2746:                    && INTVAL (XEXP (x, 1)) == - ep->previous_offset)
        !          2747:                  return ep->to_rtx;
        !          2748:                else
        !          2749:                  return gen_rtx (PLUS, Pmode, ep->to_rtx,
        !          2750:                                  plus_constant (XEXP (x, 1),
        !          2751:                                                 ep->previous_offset));
        !          2752:              }
        !          2753: 
        !          2754:          /* If the register is not eliminable, we are done since the other
        !          2755:             operand is a constant.  */
        !          2756:          return x;
        !          2757:        }
        !          2758: 
        !          2759:       /* If this is part of an address, we want to bring any constant to the
        !          2760:         outermost PLUS.  We will do this by doing register replacement in
        !          2761:         our operands and seeing if a constant shows up in one of them.
        !          2762: 
        !          2763:         We assume here this is part of an address (or a "load address" insn)
        !          2764:         since an eliminable register is not likely to appear in any other
        !          2765:         context.
        !          2766: 
        !          2767:         If we have (plus (eliminable) (reg)), we want to produce
        !          2768:         (plus (plus (replacement) (reg) (const))).  If this was part of a
        !          2769:         normal add insn, (plus (replacement) (reg)) will be pushed as a
        !          2770:         reload.  This is the desired action.  */
        !          2771: 
        !          2772:       {
        !          2773:        rtx new0 = eliminate_regs (XEXP (x, 0), mem_mode, insn);
        !          2774:        rtx new1 = eliminate_regs (XEXP (x, 1), mem_mode, insn);
        !          2775: 
        !          2776:        if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
        !          2777:          {
        !          2778:            /* If one side is a PLUS and the other side is a pseudo that
        !          2779:               didn't get a hard register but has a reg_equiv_constant,
        !          2780:               we must replace the constant here since it may no longer
        !          2781:               be in the position of any operand.  */
        !          2782:            if (GET_CODE (new0) == PLUS && GET_CODE (new1) == REG
        !          2783:                && REGNO (new1) >= FIRST_PSEUDO_REGISTER
        !          2784:                && reg_renumber[REGNO (new1)] < 0
        !          2785:                && reg_equiv_constant != 0
        !          2786:                && reg_equiv_constant[REGNO (new1)] != 0)
        !          2787:              new1 = reg_equiv_constant[REGNO (new1)];
        !          2788:            else if (GET_CODE (new1) == PLUS && GET_CODE (new0) == REG
        !          2789:                     && REGNO (new0) >= FIRST_PSEUDO_REGISTER
        !          2790:                     && reg_renumber[REGNO (new0)] < 0
        !          2791:                     && reg_equiv_constant[REGNO (new0)] != 0)
        !          2792:              new0 = reg_equiv_constant[REGNO (new0)];
        !          2793: 
        !          2794:            new = form_sum (new0, new1);
        !          2795: 
        !          2796:            /* As above, if we are not inside a MEM we do not want to
        !          2797:               turn a PLUS into something else.  We might try to do so here
        !          2798:               for an addition of 0 if we aren't optimizing.  */
        !          2799:            if (! mem_mode && GET_CODE (new) != PLUS)
        !          2800:              return gen_rtx (PLUS, GET_MODE (x), new, const0_rtx);
        !          2801:            else
        !          2802:              return new;
        !          2803:          }
        !          2804:       }
        !          2805:       return x;
        !          2806: 
        !          2807:     case EXPR_LIST:
        !          2808:       /* If we have something in XEXP (x, 0), the usual case, eliminate it.  */
        !          2809:       if (XEXP (x, 0))
        !          2810:        {
        !          2811:          new = eliminate_regs (XEXP (x, 0), mem_mode, insn);
        !          2812:          if (new != XEXP (x, 0))
        !          2813:            x = gen_rtx (EXPR_LIST, REG_NOTE_KIND (x), new, XEXP (x, 1));
        !          2814:        }
        !          2815: 
        !          2816:       /* ... fall through ... */
        !          2817: 
        !          2818:     case INSN_LIST:
        !          2819:       /* Now do eliminations in the rest of the chain.  If this was
        !          2820:         an EXPR_LIST, this might result in allocating more memory than is
        !          2821:         strictly needed, but it simplifies the code.  */
        !          2822:       if (XEXP (x, 1))
        !          2823:        {
        !          2824:          new = eliminate_regs (XEXP (x, 1), mem_mode, insn);
        !          2825:          if (new != XEXP (x, 1))
        !          2826:            return gen_rtx (INSN_LIST, GET_MODE (x), XEXP (x, 0), new);
        !          2827:        }
        !          2828:       return x;
        !          2829: 
        !          2830:     case CALL:
        !          2831:     case COMPARE:
        !          2832:     case MINUS:
        !          2833:     case MULT:
        !          2834:     case DIV:      case UDIV:
        !          2835:     case MOD:      case UMOD:
        !          2836:     case AND:      case IOR:      case XOR:
        !          2837:     case LSHIFT:   case ASHIFT:   case ROTATE:
        !          2838:     case ASHIFTRT: case LSHIFTRT: case ROTATERT:
        !          2839:     case NE:       case EQ:
        !          2840:     case GE:       case GT:       case GEU:    case GTU:
        !          2841:     case LE:       case LT:       case LEU:    case LTU:
        !          2842:       {
        !          2843:        rtx new0 = eliminate_regs (XEXP (x, 0), mem_mode, insn);
        !          2844:        rtx new1
        !          2845:          = XEXP (x, 1) ? eliminate_regs (XEXP (x, 1), mem_mode, insn) : 0;
        !          2846: 
        !          2847:        if (new0 != XEXP (x, 0) || new1 != XEXP (x, 1))
        !          2848:          return gen_rtx (code, GET_MODE (x), new0, new1);
        !          2849:       }
        !          2850:       return x;
        !          2851: 
        !          2852:     case PRE_INC:
        !          2853:     case POST_INC:
        !          2854:     case PRE_DEC:
        !          2855:     case POST_DEC:
        !          2856:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          2857:        if (ep->to_rtx == XEXP (x, 0))
        !          2858:          {
        !          2859:            int size = GET_MODE_SIZE (mem_mode);
        !          2860: 
        !          2861:            /* If more bytes than MEM_MODE are pushed, account for them.  */
        !          2862: #ifdef PUSH_ROUNDING
        !          2863:            if (ep->to_rtx == stack_pointer_rtx)
        !          2864:              size = PUSH_ROUNDING (size);
        !          2865: #endif
        !          2866:            if (code == PRE_DEC || code == POST_DEC)
        !          2867:              ep->offset += size;
        !          2868:            else
        !          2869:              ep->offset -= size;
        !          2870:          }
        !          2871: 
        !          2872:       /* Fall through to generic unary operation case.  */
        !          2873:     case USE:
        !          2874:     case STRICT_LOW_PART:
        !          2875:     case NEG:          case NOT:
        !          2876:     case SIGN_EXTEND:  case ZERO_EXTEND:
        !          2877:     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
        !          2878:     case FLOAT:        case FIX:
        !          2879:     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
        !          2880:     case ABS:
        !          2881:     case SQRT:
        !          2882:     case FFS:
        !          2883:       new = eliminate_regs (XEXP (x, 0), mem_mode, insn);
        !          2884:       if (new != XEXP (x, 0))
        !          2885:        return gen_rtx (code, GET_MODE (x), new);
        !          2886:       return x;
        !          2887: 
        !          2888:     case SUBREG:
        !          2889:       /* Similar to above processing, but preserve SUBREG_WORD.
        !          2890:         Convert (subreg (mem)) to (mem) if not paradoxical.
        !          2891:         Also, if we have a non-paradoxical (subreg (pseudo)) and the
        !          2892:         pseudo didn't get a hard reg, we must replace this with the
        !          2893:         eliminated version of the memory location because push_reloads
        !          2894:         may do the replacement in certain circumstances.  */
        !          2895:       if (GET_CODE (SUBREG_REG (x)) == REG
        !          2896:          && (GET_MODE_SIZE (GET_MODE (x))
        !          2897:              <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
        !          2898:          && reg_equiv_memory_loc != 0
        !          2899:          && reg_equiv_memory_loc[REGNO (SUBREG_REG (x))] != 0)
        !          2900:        {
        !          2901:          new = eliminate_regs (reg_equiv_memory_loc[REGNO (SUBREG_REG (x))],
        !          2902:                                mem_mode, insn);
        !          2903: 
        !          2904:          /* If we didn't change anything, we must retain the pseudo.  */
        !          2905:          if (new == reg_equiv_memory_loc[REGNO (SUBREG_REG (x))])
        !          2906:            new = XEXP (x, 0);
        !          2907:          else
        !          2908:            /* Otherwise, ensure NEW isn't shared in case we have to reload
        !          2909:               it.  */
        !          2910:            new = copy_rtx (new);
        !          2911:        }
        !          2912:       else
        !          2913:        new = eliminate_regs (SUBREG_REG (x), mem_mode, insn);
        !          2914: 
        !          2915:       if (new != XEXP (x, 0))
        !          2916:        {
        !          2917:          if (GET_CODE (new) == MEM
        !          2918:              && (GET_MODE_SIZE (GET_MODE (x))
        !          2919:                  <= GET_MODE_SIZE (GET_MODE (new)))
        !          2920: #ifdef LOAD_EXTEND_OP
        !          2921:              /* On these machines we will be reloading what is
        !          2922:                 inside the SUBREG if it originally was a pseudo and
        !          2923:                 the inner and outer modes are both a word or
        !          2924:                 smaller.  So leave the SUBREG then.  */
        !          2925:              && ! (GET_CODE (SUBREG_REG (x)) == REG
        !          2926:                    && GET_MODE_SIZE (GET_MODE (x)) <= UNITS_PER_WORD
        !          2927:                    && GET_MODE_SIZE (GET_MODE (new)) <= UNITS_PER_WORD)
        !          2928: #endif
        !          2929:              )
        !          2930:            {
        !          2931:              int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
        !          2932:              enum machine_mode mode = GET_MODE (x);
        !          2933: 
        !          2934: #if BYTES_BIG_ENDIAN
        !          2935:              offset += (MIN (UNITS_PER_WORD,
        !          2936:                              GET_MODE_SIZE (GET_MODE (new)))
        !          2937:                         - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
        !          2938: #endif
        !          2939: 
        !          2940:              PUT_MODE (new, mode);
        !          2941:              XEXP (new, 0) = plus_constant (XEXP (new, 0), offset);
        !          2942:              return new;
        !          2943:            }
        !          2944:          else
        !          2945:            return gen_rtx (SUBREG, GET_MODE (x), new, SUBREG_WORD (x));
        !          2946:        }
        !          2947: 
        !          2948:       return x;
        !          2949: 
        !          2950:     case CLOBBER:
        !          2951:       /* If clobbering a register that is the replacement register for an
        !          2952:         elimination we still think can be performed, note that it cannot
        !          2953:         be performed.  Otherwise, we need not be concerned about it.  */
        !          2954:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          2955:        if (ep->to_rtx == XEXP (x, 0))
        !          2956:          ep->can_eliminate = 0;
        !          2957: 
        !          2958:       new = eliminate_regs (XEXP (x, 0), mem_mode, insn);
        !          2959:       if (new != XEXP (x, 0))
        !          2960:        return gen_rtx (code, GET_MODE (x), new);
        !          2961:       return x;
        !          2962: 
        !          2963:     case ASM_OPERANDS:
        !          2964:       {
        !          2965:        rtx *temp_vec;
        !          2966:        /* Properly handle sharing input and constraint vectors.  */
        !          2967:        if (ASM_OPERANDS_INPUT_VEC (x) != old_asm_operands_vec)
        !          2968:          {
        !          2969:            /* When we come to a new vector not seen before,
        !          2970:               scan all its elements; keep the old vector if none
        !          2971:               of them changes; otherwise, make a copy.  */
        !          2972:            old_asm_operands_vec = ASM_OPERANDS_INPUT_VEC (x);
        !          2973:            temp_vec = (rtx *) alloca (XVECLEN (x, 3) * sizeof (rtx));
        !          2974:            for (i = 0; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
        !          2975:              temp_vec[i] = eliminate_regs (ASM_OPERANDS_INPUT (x, i),
        !          2976:                                            mem_mode, insn);
        !          2977: 
        !          2978:            for (i = 0; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
        !          2979:              if (temp_vec[i] != ASM_OPERANDS_INPUT (x, i))
        !          2980:                break;
        !          2981: 
        !          2982:            if (i == ASM_OPERANDS_INPUT_LENGTH (x))
        !          2983:              new_asm_operands_vec = old_asm_operands_vec;
        !          2984:            else
        !          2985:              new_asm_operands_vec
        !          2986:                = gen_rtvec_v (ASM_OPERANDS_INPUT_LENGTH (x), temp_vec);
        !          2987:          }
        !          2988: 
        !          2989:        /* If we had to copy the vector, copy the entire ASM_OPERANDS.  */
        !          2990:        if (new_asm_operands_vec == old_asm_operands_vec)
        !          2991:          return x;
        !          2992: 
        !          2993:        new = gen_rtx (ASM_OPERANDS, VOIDmode, ASM_OPERANDS_TEMPLATE (x),
        !          2994:                       ASM_OPERANDS_OUTPUT_CONSTRAINT (x),
        !          2995:                       ASM_OPERANDS_OUTPUT_IDX (x), new_asm_operands_vec,
        !          2996:                       ASM_OPERANDS_INPUT_CONSTRAINT_VEC (x),
        !          2997:                       ASM_OPERANDS_SOURCE_FILE (x),
        !          2998:                       ASM_OPERANDS_SOURCE_LINE (x));
        !          2999:        new->volatil = x->volatil;
        !          3000:        return new;
        !          3001:       }
        !          3002: 
        !          3003:     case SET:
        !          3004:       /* Check for setting a register that we know about.  */
        !          3005:       if (GET_CODE (SET_DEST (x)) == REG)
        !          3006:        {
        !          3007:          /* See if this is setting the replacement register for an
        !          3008:             elimination.
        !          3009: 
        !          3010:             If DEST is the hard frame pointer, we do nothing because we
        !          3011:             assume that all assignments to the frame pointer are for
        !          3012:             non-local gotos and are being done at a time when they are valid
        !          3013:             and do not disturb anything else.  Some machines want to
        !          3014:             eliminate a fake argument pointer (or even a fake frame pointer)
        !          3015:             with either the real frame or the stack pointer.  Assignments to
        !          3016:             the hard frame pointer must not prevent this elimination.  */
        !          3017: 
        !          3018:          for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
        !          3019:               ep++)
        !          3020:            if (ep->to_rtx == SET_DEST (x)
        !          3021:                && SET_DEST (x) != hard_frame_pointer_rtx)
        !          3022:              {
        !          3023:                /* If it is being incremented, adjust the offset.  Otherwise,
        !          3024:                   this elimination can't be done.  */
        !          3025:                rtx src = SET_SRC (x);
        !          3026: 
        !          3027:                if (GET_CODE (src) == PLUS
        !          3028:                    && XEXP (src, 0) == SET_DEST (x)
        !          3029:                    && GET_CODE (XEXP (src, 1)) == CONST_INT)
        !          3030:                  ep->offset -= INTVAL (XEXP (src, 1));
        !          3031:                else
        !          3032:                  ep->can_eliminate = 0;
        !          3033:              }
        !          3034: 
        !          3035:          /* Now check to see we are assigning to a register that can be
        !          3036:             eliminated.  If so, it must be as part of a PARALLEL, since we
        !          3037:             will not have been called if this is a single SET.  So indicate
        !          3038:             that we can no longer eliminate this reg.  */
        !          3039:          for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
        !          3040:               ep++)
        !          3041:            if (ep->from_rtx == SET_DEST (x) && ep->can_eliminate)
        !          3042:              ep->can_eliminate = 0;
        !          3043:        }
        !          3044: 
        !          3045:       /* Now avoid the loop below in this common case.  */
        !          3046:       {
        !          3047:        rtx new0 = eliminate_regs (SET_DEST (x), 0, insn);
        !          3048:        rtx new1 = eliminate_regs (SET_SRC (x), 0, insn);
        !          3049: 
        !          3050:        /* If SET_DEST changed from a REG to a MEM and INSN is an insn,
        !          3051:           write a CLOBBER insn.  */
        !          3052:        if (GET_CODE (SET_DEST (x)) == REG && GET_CODE (new0) == MEM
        !          3053:            && insn != 0 && GET_CODE (insn) != EXPR_LIST
        !          3054:            && GET_CODE (insn) != INSN_LIST)
        !          3055:          emit_insn_after (gen_rtx (CLOBBER, VOIDmode, SET_DEST (x)), insn);
        !          3056: 
        !          3057:        if (new0 != SET_DEST (x) || new1 != SET_SRC (x))
        !          3058:          return gen_rtx (SET, VOIDmode, new0, new1);
        !          3059:       }
        !          3060: 
        !          3061:       return x;
        !          3062: 
        !          3063:     case MEM:
        !          3064:       /* Our only special processing is to pass the mode of the MEM to our
        !          3065:         recursive call and copy the flags.  While we are here, handle this
        !          3066:         case more efficiently.  */
        !          3067:       new = eliminate_regs (XEXP (x, 0), GET_MODE (x), insn);
        !          3068:       if (new != XEXP (x, 0))
        !          3069:        {
        !          3070:          new = gen_rtx (MEM, GET_MODE (x), new);
        !          3071:          new->volatil = x->volatil;
        !          3072:          new->unchanging = x->unchanging;
        !          3073:          new->in_struct = x->in_struct;
        !          3074:          return new;
        !          3075:        }
        !          3076:       else
        !          3077:        return x;
        !          3078:     }
        !          3079: 
        !          3080:   /* Process each of our operands recursively.  If any have changed, make a
        !          3081:      copy of the rtx.  */
        !          3082:   fmt = GET_RTX_FORMAT (code);
        !          3083:   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
        !          3084:     {
        !          3085:       if (*fmt == 'e')
        !          3086:        {
        !          3087:          new = eliminate_regs (XEXP (x, i), mem_mode, insn);
        !          3088:          if (new != XEXP (x, i) && ! copied)
        !          3089:            {
        !          3090:              rtx new_x = rtx_alloc (code);
        !          3091:              bcopy (x, new_x, (sizeof (*new_x) - sizeof (new_x->fld)
        !          3092:                                + (sizeof (new_x->fld[0])
        !          3093:                                   * GET_RTX_LENGTH (code))));
        !          3094:              x = new_x;
        !          3095:              copied = 1;
        !          3096:            }
        !          3097:          XEXP (x, i) = new;
        !          3098:        }
        !          3099:       else if (*fmt == 'E')
        !          3100:        {
        !          3101:          int copied_vec = 0;
        !          3102:          for (j = 0; j < XVECLEN (x, i); j++)
        !          3103:            {
        !          3104:              new = eliminate_regs (XVECEXP (x, i, j), mem_mode, insn);
        !          3105:              if (new != XVECEXP (x, i, j) && ! copied_vec)
        !          3106:                {
        !          3107:                  rtvec new_v = gen_rtvec_v (XVECLEN (x, i),
        !          3108:                                             &XVECEXP (x, i, 0));
        !          3109:                  if (! copied)
        !          3110:                    {
        !          3111:                      rtx new_x = rtx_alloc (code);
        !          3112:                      bcopy (x, new_x, (sizeof (*new_x) - sizeof (new_x->fld)
        !          3113:                                        + (sizeof (new_x->fld[0])
        !          3114:                                           * GET_RTX_LENGTH (code))));
        !          3115:                      x = new_x;
        !          3116:                      copied = 1;
        !          3117:                    }
        !          3118:                  XVEC (x, i) = new_v;
        !          3119:                  copied_vec = 1;
        !          3120:                }
        !          3121:              XVECEXP (x, i, j) = new;
        !          3122:            }
        !          3123:        }
        !          3124:     }
        !          3125: 
        !          3126:   return x;
        !          3127: }
        !          3128: 
        !          3129: /* Scan INSN and eliminate all eliminable registers in it.
        !          3130: 
        !          3131:    If REPLACE is nonzero, do the replacement destructively.  Also
        !          3132:    delete the insn as dead it if it is setting an eliminable register.
        !          3133: 
        !          3134:    If REPLACE is zero, do all our allocations in reload_obstack.
        !          3135: 
        !          3136:    If no eliminations were done and this insn doesn't require any elimination
        !          3137:    processing (these are not identical conditions: it might be updating sp,
        !          3138:    but not referencing fp; this needs to be seen during reload_as_needed so
        !          3139:    that the offset between fp and sp can be taken into consideration), zero
        !          3140:    is returned.  Otherwise, 1 is returned.  */
        !          3141: 
        !          3142: static int
        !          3143: eliminate_regs_in_insn (insn, replace)
        !          3144:      rtx insn;
        !          3145:      int replace;
        !          3146: {
        !          3147:   rtx old_body = PATTERN (insn);
        !          3148:   rtx new_body;
        !          3149:   int val = 0;
        !          3150:   struct elim_table *ep;
        !          3151: 
        !          3152:   if (! replace)
        !          3153:     push_obstacks (&reload_obstack, &reload_obstack);
        !          3154: 
        !          3155:   if (GET_CODE (old_body) == SET && GET_CODE (SET_DEST (old_body)) == REG
        !          3156:       && REGNO (SET_DEST (old_body)) < FIRST_PSEUDO_REGISTER)
        !          3157:     {
        !          3158:       /* Check for setting an eliminable register.  */
        !          3159:       for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          3160:        if (ep->from_rtx == SET_DEST (old_body) && ep->can_eliminate)
        !          3161:          {
        !          3162:            /* In this case this insn isn't serving a useful purpose.  We
        !          3163:               will delete it in reload_as_needed once we know that this
        !          3164:               elimination is, in fact, being done.
        !          3165: 
        !          3166:               If REPLACE isn't set, we can't delete this insn, but neededn't
        !          3167:               process it since it won't be used unless something changes.  */
        !          3168:            if (replace)
        !          3169:              delete_dead_insn (insn);
        !          3170:            val = 1;
        !          3171:            goto done;
        !          3172:          }
        !          3173: 
        !          3174:       /* Check for (set (reg) (plus (reg from) (offset))) where the offset
        !          3175:         in the insn is the negative of the offset in FROM.  Substitute
        !          3176:         (set (reg) (reg to)) for the insn and change its code.
        !          3177: 
        !          3178:         We have to do this here, rather than in eliminate_regs, do that we can
        !          3179:         change the insn code.  */
        !          3180: 
        !          3181:       if (GET_CODE (SET_SRC (old_body)) == PLUS
        !          3182:          && GET_CODE (XEXP (SET_SRC (old_body), 0)) == REG
        !          3183:          && GET_CODE (XEXP (SET_SRC (old_body), 1)) == CONST_INT)
        !          3184:        for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
        !          3185:             ep++)
        !          3186:          if (ep->from_rtx == XEXP (SET_SRC (old_body), 0)
        !          3187:              && ep->can_eliminate)
        !          3188:            {
        !          3189:              /* We must stop at the first elimination that will be used.
        !          3190:                 If this one would replace the PLUS with a REG, do it
        !          3191:                 now.  Otherwise, quit the loop and let eliminate_regs
        !          3192:                 do its normal replacement.  */
        !          3193:              if (ep->offset == - INTVAL (XEXP (SET_SRC (old_body), 1)))
        !          3194:                {
        !          3195:                  PATTERN (insn) = gen_rtx (SET, VOIDmode,
        !          3196:                                            SET_DEST (old_body), ep->to_rtx);
        !          3197:                  INSN_CODE (insn) = -1;
        !          3198:                  val = 1;
        !          3199:                  goto done;
        !          3200:                }
        !          3201: 
        !          3202:              break;
        !          3203:            }
        !          3204:     }
        !          3205: 
        !          3206:   old_asm_operands_vec = 0;
        !          3207: 
        !          3208:   /* Replace the body of this insn with a substituted form.  If we changed
        !          3209:      something, return non-zero.  
        !          3210: 
        !          3211:      If we are replacing a body that was a (set X (plus Y Z)), try to
        !          3212:      re-recognize the insn.  We do this in case we had a simple addition
        !          3213:      but now can do this as a load-address.  This saves an insn in this
        !          3214:      common case. */
        !          3215: 
        !          3216:   new_body = eliminate_regs (old_body, 0, replace ? insn : NULL_RTX);
        !          3217:   if (new_body != old_body)
        !          3218:     {
        !          3219:       /* If we aren't replacing things permanently and we changed something,
        !          3220:         make another copy to ensure that all the RTL is new.  Otherwise
        !          3221:         things can go wrong if find_reload swaps commutative operands
        !          3222:         and one is inside RTL that has been copied while the other is not. */
        !          3223: 
        !          3224:       /* Don't copy an asm_operands because (1) there's no need and (2)
        !          3225:         copy_rtx can't do it properly when there are multiple outputs.  */
        !          3226:       if (! replace && asm_noperands (old_body) < 0)
        !          3227:        new_body = copy_rtx (new_body);
        !          3228: 
        !          3229:       /* If we had a move insn but now we don't, rerecognize it.  */
        !          3230:       if ((GET_CODE (old_body) == SET && GET_CODE (SET_SRC (old_body)) == REG
        !          3231:           && (GET_CODE (new_body) != SET
        !          3232:               || GET_CODE (SET_SRC (new_body)) != REG))
        !          3233:          /* If this was a load from or store to memory, compare
        !          3234:             the MEM in recog_operand to the one in the insn.  If they
        !          3235:             are not equal, then rerecognize the insn.  */
        !          3236:          || (GET_CODE (old_body) == SET
        !          3237:              && ((GET_CODE (SET_SRC (old_body)) == MEM
        !          3238:                   && SET_SRC (old_body) != recog_operand[1])
        !          3239:                  || (GET_CODE (SET_DEST (old_body)) == MEM
        !          3240:                      && SET_DEST (old_body) != recog_operand[0])))
        !          3241:          /* If this was an add insn before, rerecognize.  */
        !          3242:          ||
        !          3243:          (GET_CODE (old_body) == SET
        !          3244:           && GET_CODE (SET_SRC (old_body)) == PLUS))
        !          3245:        {
        !          3246:          if (! validate_change (insn, &PATTERN (insn), new_body, 0))
        !          3247:            /* If recognition fails, store the new body anyway.
        !          3248:               It's normal to have recognition failures here
        !          3249:               due to bizarre memory addresses; reloading will fix them.  */
        !          3250:            PATTERN (insn) = new_body;
        !          3251:        }
        !          3252:       else
        !          3253:        PATTERN (insn) = new_body;
        !          3254: 
        !          3255:       val = 1;
        !          3256:     }
        !          3257: 
        !          3258:   /* Loop through all elimination pairs.  See if any have changed and
        !          3259:      recalculate the number not at initial offset.
        !          3260: 
        !          3261:      Compute the maximum offset (minimum offset if the stack does not
        !          3262:      grow downward) for each elimination pair.
        !          3263: 
        !          3264:      We also detect a cases where register elimination cannot be done,
        !          3265:      namely, if a register would be both changed and referenced outside a MEM
        !          3266:      in the resulting insn since such an insn is often undefined and, even if
        !          3267:      not, we cannot know what meaning will be given to it.  Note that it is
        !          3268:      valid to have a register used in an address in an insn that changes it
        !          3269:      (presumably with a pre- or post-increment or decrement).
        !          3270: 
        !          3271:      If anything changes, return nonzero.  */
        !          3272: 
        !          3273:   num_not_at_initial_offset = 0;
        !          3274:   for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
        !          3275:     {
        !          3276:       if (ep->previous_offset != ep->offset && ep->ref_outside_mem)
        !          3277:        ep->can_eliminate = 0;
        !          3278: 
        !          3279:       ep->ref_outside_mem = 0;
        !          3280: 
        !          3281:       if (ep->previous_offset != ep->offset)
        !          3282:        val = 1;
        !          3283: 
        !          3284:       ep->previous_offset = ep->offset;
        !          3285:       if (ep->can_eliminate && ep->offset != ep->initial_offset)
        !          3286:        num_not_at_initial_offset++;
        !          3287: 
        !          3288: #ifdef STACK_GROWS_DOWNWARD
        !          3289:       ep->max_offset = MAX (ep->max_offset, ep->offset);
        !          3290: #else
        !          3291:       ep->max_offset = MIN (ep->max_offset, ep->offset);
        !          3292: #endif
        !          3293:     }
        !          3294: 
        !          3295:  done:
        !          3296:   /* If we changed something, perform elmination in REG_NOTES.  This is
        !          3297:      needed even when REPLACE is zero because a REG_DEAD note might refer
        !          3298:      to a register that we eliminate and could cause a different number
        !          3299:      of spill registers to be needed in the final reload pass than in
        !          3300:      the pre-passes.  */
        !          3301:   if (val && REG_NOTES (insn) != 0)
        !          3302:     REG_NOTES (insn) = eliminate_regs (REG_NOTES (insn), 0, REG_NOTES (insn));
        !          3303: 
        !          3304:   if (! replace)
        !          3305:     pop_obstacks ();
        !          3306: 
        !          3307:   return val;
        !          3308: }
        !          3309: 
        !          3310: /* Given X, a SET or CLOBBER of DEST, if DEST is the target of a register
        !          3311:    replacement we currently believe is valid, mark it as not eliminable if X
        !          3312:    modifies DEST in any way other than by adding a constant integer to it.
        !          3313: 
        !          3314:    If DEST is the frame pointer, we do nothing because we assume that
        !          3315:    all assignments to the hard frame pointer are nonlocal gotos and are being
        !          3316:    done at a time when they are valid and do not disturb anything else.
        !          3317:    Some machines want to eliminate a fake argument pointer with either the
        !          3318:    frame or stack pointer.  Assignments to the hard frame pointer must not
        !          3319:    prevent this elimination.
        !          3320: 
        !          3321:    Called via note_stores from reload before starting its passes to scan
        !          3322:    the insns of the function.  */
        !          3323: 
        !          3324: static void
        !          3325: mark_not_eliminable (dest, x)
        !          3326:      rtx dest;
        !          3327:      rtx x;
        !          3328: {
        !          3329:   register int i;
        !          3330: 
        !          3331:   /* A SUBREG of a hard register here is just changing its mode.  We should
        !          3332:      not see a SUBREG of an eliminable hard register, but check just in
        !          3333:      case.  */
        !          3334:   if (GET_CODE (dest) == SUBREG)
        !          3335:     dest = SUBREG_REG (dest);
        !          3336: 
        !          3337:   if (dest == hard_frame_pointer_rtx)
        !          3338:     return;
        !          3339: 
        !          3340:   for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          3341:     if (reg_eliminate[i].can_eliminate && dest == reg_eliminate[i].to_rtx
        !          3342:        && (GET_CODE (x) != SET
        !          3343:            || GET_CODE (SET_SRC (x)) != PLUS
        !          3344:            || XEXP (SET_SRC (x), 0) != dest
        !          3345:            || GET_CODE (XEXP (SET_SRC (x), 1)) != CONST_INT))
        !          3346:       {
        !          3347:        reg_eliminate[i].can_eliminate_previous
        !          3348:          = reg_eliminate[i].can_eliminate = 0;
        !          3349:        num_eliminable--;
        !          3350:       }
        !          3351: }
        !          3352: 
        !          3353: /* Kick all pseudos out of hard register REGNO.
        !          3354:    If GLOBAL is nonzero, try to find someplace else to put them.
        !          3355:    If DUMPFILE is nonzero, log actions taken on that file.
        !          3356: 
        !          3357:    If CANT_ELIMINATE is nonzero, it means that we are doing this spill
        !          3358:    because we found we can't eliminate some register.  In the case, no pseudos
        !          3359:    are allowed to be in the register, even if they are only in a block that
        !          3360:    doesn't require spill registers, unlike the case when we are spilling this
        !          3361:    hard reg to produce another spill register.
        !          3362: 
        !          3363:    Return nonzero if any pseudos needed to be kicked out.  */
        !          3364: 
        !          3365: static int
        !          3366: spill_hard_reg (regno, global, dumpfile, cant_eliminate)
        !          3367:      register int regno;
        !          3368:      int global;
        !          3369:      FILE *dumpfile;
        !          3370:      int cant_eliminate;
        !          3371: {
        !          3372:   enum reg_class class = REGNO_REG_CLASS (regno);
        !          3373:   int something_changed = 0;
        !          3374:   register int i;
        !          3375: 
        !          3376:   SET_HARD_REG_BIT (forbidden_regs, regno);
        !          3377: 
        !          3378:   /* Spill every pseudo reg that was allocated to this reg
        !          3379:      or to something that overlaps this reg.  */
        !          3380: 
        !          3381:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !          3382:     if (reg_renumber[i] >= 0
        !          3383:        && reg_renumber[i] <= regno
        !          3384:        && (reg_renumber[i]
        !          3385:            + HARD_REGNO_NREGS (reg_renumber[i],
        !          3386:                                PSEUDO_REGNO_MODE (i))
        !          3387:            > regno))
        !          3388:       {
        !          3389:        /* If this register belongs solely to a basic block which needed no
        !          3390:           spilling of any class that this register is contained in,
        !          3391:           leave it be, unless we are spilling this register because
        !          3392:           it was a hard register that can't be eliminated.   */
        !          3393: 
        !          3394:        if (! cant_eliminate
        !          3395:            && basic_block_needs[0]
        !          3396:            && reg_basic_block[i] >= 0
        !          3397:            && basic_block_needs[(int) class][reg_basic_block[i]] == 0)
        !          3398:          {
        !          3399:            enum reg_class *p;
        !          3400: 
        !          3401:            for (p = reg_class_superclasses[(int) class];
        !          3402:                 *p != LIM_REG_CLASSES; p++)
        !          3403:              if (basic_block_needs[(int) *p][reg_basic_block[i]] > 0)
        !          3404:                break;
        !          3405: 
        !          3406:            if (*p == LIM_REG_CLASSES)
        !          3407:              continue;
        !          3408:          }
        !          3409: 
        !          3410:        /* Mark it as no longer having a hard register home.  */
        !          3411:        reg_renumber[i] = -1;
        !          3412:        /* We will need to scan everything again.  */
        !          3413:        something_changed = 1;
        !          3414:        if (global)
        !          3415:            retry_global_alloc (i, forbidden_regs);
        !          3416: 
        !          3417:        alter_reg (i, regno);
        !          3418:        if (dumpfile)
        !          3419:          {
        !          3420:            if (reg_renumber[i] == -1)
        !          3421:              fprintf (dumpfile, " Register %d now on stack.\n\n", i);
        !          3422:            else
        !          3423:              fprintf (dumpfile, " Register %d now in %d.\n\n",
        !          3424:                       i, reg_renumber[i]);
        !          3425:          }
        !          3426:       }
        !          3427:   for (i = 0; i < scratch_list_length; i++)
        !          3428:     {
        !          3429:       if (scratch_list[i] && REGNO (scratch_list[i]) == regno)
        !          3430:        {
        !          3431:          if (! cant_eliminate && basic_block_needs[0]
        !          3432:              && ! basic_block_needs[(int) class][scratch_block[i]])
        !          3433:            {
        !          3434:              enum reg_class *p;
        !          3435: 
        !          3436:              for (p = reg_class_superclasses[(int) class];
        !          3437:                   *p != LIM_REG_CLASSES; p++)
        !          3438:                if (basic_block_needs[(int) *p][scratch_block[i]] > 0)
        !          3439:                  break;
        !          3440: 
        !          3441:              if (*p == LIM_REG_CLASSES)
        !          3442:                continue;
        !          3443:            }
        !          3444:          PUT_CODE (scratch_list[i], SCRATCH);
        !          3445:          scratch_list[i] = 0;
        !          3446:          something_changed = 1;
        !          3447:          continue;
        !          3448:        }
        !          3449:     }
        !          3450: 
        !          3451:   return something_changed;
        !          3452: }
        !          3453: 
        !          3454: /* Find all paradoxical subregs within X and update reg_max_ref_width.  */
        !          3455: 
        !          3456: static void
        !          3457: scan_paradoxical_subregs (x)
        !          3458:      register rtx x;
        !          3459: {
        !          3460:   register int i;
        !          3461:   register char *fmt;
        !          3462:   register enum rtx_code code = GET_CODE (x);
        !          3463: 
        !          3464:   switch (code)
        !          3465:     {
        !          3466:     case CONST_INT:
        !          3467:     case CONST:
        !          3468:     case SYMBOL_REF:
        !          3469:     case LABEL_REF:
        !          3470:     case CONST_DOUBLE:
        !          3471:     case CC0:
        !          3472:     case PC:
        !          3473:     case REG:
        !          3474:     case USE:
        !          3475:     case CLOBBER:
        !          3476:       return;
        !          3477: 
        !          3478:     case SUBREG:
        !          3479:       if (GET_CODE (SUBREG_REG (x)) == REG
        !          3480:          && GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
        !          3481:        reg_max_ref_width[REGNO (SUBREG_REG (x))]
        !          3482:          = GET_MODE_SIZE (GET_MODE (x));
        !          3483:       return;
        !          3484:     }
        !          3485: 
        !          3486:   fmt = GET_RTX_FORMAT (code);
        !          3487:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
        !          3488:     {
        !          3489:       if (fmt[i] == 'e')
        !          3490:        scan_paradoxical_subregs (XEXP (x, i));
        !          3491:       else if (fmt[i] == 'E')
        !          3492:        {
        !          3493:          register int j;
        !          3494:          for (j = XVECLEN (x, i) - 1; j >=0; j--)
        !          3495:            scan_paradoxical_subregs (XVECEXP (x, i, j));
        !          3496:        }
        !          3497:     }
        !          3498: }
        !          3499: 
        !          3500: static int
        !          3501: hard_reg_use_compare (p1, p2)
        !          3502:      struct hard_reg_n_uses *p1, *p2;
        !          3503: {
        !          3504:   int tem = p1->uses - p2->uses;
        !          3505:   if (tem != 0) return tem;
        !          3506:   /* If regs are equally good, sort by regno,
        !          3507:      so that the results of qsort leave nothing to chance.  */
        !          3508:   return p1->regno - p2->regno;
        !          3509: }
        !          3510: 
        !          3511: /* Choose the order to consider regs for use as reload registers
        !          3512:    based on how much trouble would be caused by spilling one.
        !          3513:    Store them in order of decreasing preference in potential_reload_regs.  */
        !          3514: 
        !          3515: static void
        !          3516: order_regs_for_reload ()
        !          3517: {
        !          3518:   register int i;
        !          3519:   register int o = 0;
        !          3520:   int large = 0;
        !          3521: 
        !          3522:   struct hard_reg_n_uses hard_reg_n_uses[FIRST_PSEUDO_REGISTER];
        !          3523: 
        !          3524:   CLEAR_HARD_REG_SET (bad_spill_regs);
        !          3525: 
        !          3526:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3527:     potential_reload_regs[i] = -1;
        !          3528: 
        !          3529:   /* Count number of uses of each hard reg by pseudo regs allocated to it
        !          3530:      and then order them by decreasing use.  */
        !          3531: 
        !          3532:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3533:     {
        !          3534:       hard_reg_n_uses[i].uses = 0;
        !          3535:       hard_reg_n_uses[i].regno = i;
        !          3536:     }
        !          3537: 
        !          3538:   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
        !          3539:     {
        !          3540:       int regno = reg_renumber[i];
        !          3541:       if (regno >= 0)
        !          3542:        {
        !          3543:          int lim = regno + HARD_REGNO_NREGS (regno, PSEUDO_REGNO_MODE (i));
        !          3544:          while (regno < lim)
        !          3545:            hard_reg_n_uses[regno++].uses += reg_n_refs[i];
        !          3546:        }
        !          3547:       large += reg_n_refs[i];
        !          3548:     }
        !          3549: 
        !          3550:   /* Now fixed registers (which cannot safely be used for reloading)
        !          3551:      get a very high use count so they will be considered least desirable.
        !          3552:      Registers used explicitly in the rtl code are almost as bad.  */
        !          3553: 
        !          3554:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3555:     {
        !          3556:       if (fixed_regs[i])
        !          3557:        {
        !          3558:          hard_reg_n_uses[i].uses += 2 * large + 2;
        !          3559:          SET_HARD_REG_BIT (bad_spill_regs, i);
        !          3560:        }
        !          3561:       else if (regs_explicitly_used[i])
        !          3562:        {
        !          3563:          hard_reg_n_uses[i].uses += large + 1;
        !          3564: #ifndef SMALL_REGISTER_CLASSES
        !          3565:          /* ??? We are doing this here because of the potential that
        !          3566:             bad code may be generated if a register explicitly used in
        !          3567:             an insn was used as a spill register for that insn.  But
        !          3568:             not using these are spill registers may lose on some machine.
        !          3569:             We'll have to see how this works out.  */
        !          3570:          SET_HARD_REG_BIT (bad_spill_regs, i);
        !          3571: #endif
        !          3572:        }
        !          3573:     }
        !          3574:   hard_reg_n_uses[HARD_FRAME_POINTER_REGNUM].uses += 2 * large + 2;
        !          3575:   SET_HARD_REG_BIT (bad_spill_regs, HARD_FRAME_POINTER_REGNUM);
        !          3576: 
        !          3577: #ifdef ELIMINABLE_REGS
        !          3578:   /* If registers other than the frame pointer are eliminable, mark them as
        !          3579:      poor choices.  */
        !          3580:   for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          3581:     {
        !          3582:       hard_reg_n_uses[reg_eliminate[i].from].uses += 2 * large + 2;
        !          3583:       SET_HARD_REG_BIT (bad_spill_regs, reg_eliminate[i].from);
        !          3584:     }
        !          3585: #endif
        !          3586: 
        !          3587:   /* Prefer registers not so far used, for use in temporary loading.
        !          3588:      Among them, if REG_ALLOC_ORDER is defined, use that order.
        !          3589:      Otherwise, prefer registers not preserved by calls.  */
        !          3590: 
        !          3591: #ifdef REG_ALLOC_ORDER
        !          3592:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3593:     {
        !          3594:       int regno = reg_alloc_order[i];
        !          3595: 
        !          3596:       if (hard_reg_n_uses[regno].uses == 0)
        !          3597:        potential_reload_regs[o++] = regno;
        !          3598:     }
        !          3599: #else
        !          3600:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3601:     {
        !          3602:       if (hard_reg_n_uses[i].uses == 0 && call_used_regs[i])
        !          3603:        potential_reload_regs[o++] = i;
        !          3604:     }
        !          3605:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3606:     {
        !          3607:       if (hard_reg_n_uses[i].uses == 0 && ! call_used_regs[i])
        !          3608:        potential_reload_regs[o++] = i;
        !          3609:     }
        !          3610: #endif
        !          3611: 
        !          3612:   qsort (hard_reg_n_uses, FIRST_PSEUDO_REGISTER,
        !          3613:         sizeof hard_reg_n_uses[0], hard_reg_use_compare);
        !          3614: 
        !          3615:   /* Now add the regs that are already used,
        !          3616:      preferring those used less often.  The fixed and otherwise forbidden
        !          3617:      registers will be at the end of this list.  */
        !          3618: 
        !          3619:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          3620:     if (hard_reg_n_uses[i].uses != 0)
        !          3621:       potential_reload_regs[o++] = hard_reg_n_uses[i].regno;
        !          3622: }
        !          3623: 
        !          3624: /* Reload pseudo-registers into hard regs around each insn as needed.
        !          3625:    Additional register load insns are output before the insn that needs it
        !          3626:    and perhaps store insns after insns that modify the reloaded pseudo reg.
        !          3627: 
        !          3628:    reg_last_reload_reg and reg_reloaded_contents keep track of
        !          3629:    which registers are already available in reload registers.
        !          3630:    We update these for the reloads that we perform,
        !          3631:    as the insns are scanned.  */
        !          3632: 
        !          3633: static void
        !          3634: reload_as_needed (first, live_known)
        !          3635:      rtx first;
        !          3636:      int live_known;
        !          3637: {
        !          3638:   register rtx insn;
        !          3639:   register int i;
        !          3640:   int this_block = 0;
        !          3641:   rtx x;
        !          3642:   rtx after_call = 0;
        !          3643: 
        !          3644:   bzero (spill_reg_rtx, sizeof spill_reg_rtx);
        !          3645:   reg_last_reload_reg = (rtx *) alloca (max_regno * sizeof (rtx));
        !          3646:   bzero (reg_last_reload_reg, max_regno * sizeof (rtx));
        !          3647:   reg_has_output_reload = (char *) alloca (max_regno);
        !          3648:   for (i = 0; i < n_spills; i++)
        !          3649:     {
        !          3650:       reg_reloaded_contents[i] = -1;
        !          3651:       reg_reloaded_insn[i] = 0;
        !          3652:     }
        !          3653: 
        !          3654:   /* Reset all offsets on eliminable registers to their initial values.  */
        !          3655: #ifdef ELIMINABLE_REGS
        !          3656:   for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          3657:     {
        !          3658:       INITIAL_ELIMINATION_OFFSET (reg_eliminate[i].from, reg_eliminate[i].to,
        !          3659:                                  reg_eliminate[i].initial_offset);
        !          3660:       reg_eliminate[i].previous_offset
        !          3661:        = reg_eliminate[i].offset = reg_eliminate[i].initial_offset;
        !          3662:     }
        !          3663: #else
        !          3664:   INITIAL_FRAME_POINTER_OFFSET (reg_eliminate[0].initial_offset);
        !          3665:   reg_eliminate[0].previous_offset
        !          3666:     = reg_eliminate[0].offset = reg_eliminate[0].initial_offset;
        !          3667: #endif
        !          3668: 
        !          3669:   num_not_at_initial_offset = 0;
        !          3670: 
        !          3671:   for (insn = first; insn;)
        !          3672:     {
        !          3673:       register rtx next = NEXT_INSN (insn);
        !          3674: 
        !          3675:       /* Notice when we move to a new basic block.  */
        !          3676:       if (live_known && this_block + 1 < n_basic_blocks
        !          3677:          && insn == basic_block_head[this_block+1])
        !          3678:        ++this_block;
        !          3679: 
        !          3680:       /* If we pass a label, copy the offsets from the label information
        !          3681:         into the current offsets of each elimination.  */
        !          3682:       if (GET_CODE (insn) == CODE_LABEL)
        !          3683:        {
        !          3684:          num_not_at_initial_offset = 0;
        !          3685:          for (i = 0; i < NUM_ELIMINABLE_REGS; i++)
        !          3686:            {
        !          3687:              reg_eliminate[i].offset = reg_eliminate[i].previous_offset
        !          3688:                = offsets_at[CODE_LABEL_NUMBER (insn)][i];
        !          3689:              if (reg_eliminate[i].can_eliminate
        !          3690:                  && (reg_eliminate[i].offset
        !          3691:                      != reg_eliminate[i].initial_offset))
        !          3692:                num_not_at_initial_offset++;
        !          3693:            }
        !          3694:        }
        !          3695: 
        !          3696:       else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
        !          3697:        {
        !          3698:          rtx avoid_return_reg = 0;
        !          3699: 
        !          3700: #ifdef SMALL_REGISTER_CLASSES
        !          3701:          /* Set avoid_return_reg if this is an insn
        !          3702:             that might use the value of a function call.  */
        !          3703:          if (GET_CODE (insn) == CALL_INSN)
        !          3704:            {
        !          3705:              if (GET_CODE (PATTERN (insn)) == SET)
        !          3706:                after_call = SET_DEST (PATTERN (insn));
        !          3707:              else if (GET_CODE (PATTERN (insn)) == PARALLEL
        !          3708:                       && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
        !          3709:                after_call = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
        !          3710:              else
        !          3711:                after_call = 0;
        !          3712:            }
        !          3713:          else if (after_call != 0
        !          3714:                   && !(GET_CODE (PATTERN (insn)) == SET
        !          3715:                        && SET_DEST (PATTERN (insn)) == stack_pointer_rtx))
        !          3716:            {
        !          3717:              if (reg_mentioned_p (after_call, PATTERN (insn)))
        !          3718:                avoid_return_reg = after_call;
        !          3719:              after_call = 0;
        !          3720:            }
        !          3721: #endif /* SMALL_REGISTER_CLASSES */
        !          3722: 
        !          3723:          /* If this is a USE and CLOBBER of a MEM, ensure that any
        !          3724:             references to eliminable registers have been removed.  */
        !          3725: 
        !          3726:          if ((GET_CODE (PATTERN (insn)) == USE
        !          3727:               || GET_CODE (PATTERN (insn)) == CLOBBER)
        !          3728:              && GET_CODE (XEXP (PATTERN (insn), 0)) == MEM)
        !          3729:            XEXP (XEXP (PATTERN (insn), 0), 0)
        !          3730:              = eliminate_regs (XEXP (XEXP (PATTERN (insn), 0), 0),
        !          3731:                                GET_MODE (XEXP (PATTERN (insn), 0)), NULL_RTX);
        !          3732: 
        !          3733:          /* If we need to do register elimination processing, do so.
        !          3734:             This might delete the insn, in which case we are done.  */
        !          3735:          if (num_eliminable && GET_MODE (insn) == QImode)
        !          3736:            {
        !          3737:              eliminate_regs_in_insn (insn, 1);
        !          3738:              if (GET_CODE (insn) == NOTE)
        !          3739:                {
        !          3740:                  insn = next;
        !          3741:                  continue;
        !          3742:                }
        !          3743:            }
        !          3744: 
        !          3745:          if (GET_MODE (insn) == VOIDmode)
        !          3746:            n_reloads = 0;
        !          3747:          /* First find the pseudo regs that must be reloaded for this insn.
        !          3748:             This info is returned in the tables reload_... (see reload.h).
        !          3749:             Also modify the body of INSN by substituting RELOAD
        !          3750:             rtx's for those pseudo regs.  */
        !          3751:          else
        !          3752:            {
        !          3753:              bzero (reg_has_output_reload, max_regno);
        !          3754:              CLEAR_HARD_REG_SET (reg_is_output_reload);
        !          3755: 
        !          3756:              find_reloads (insn, 1, spill_indirect_levels, live_known,
        !          3757:                            spill_reg_order);
        !          3758:            }
        !          3759: 
        !          3760:          if (n_reloads > 0)
        !          3761:            {
        !          3762:              rtx prev = PREV_INSN (insn), next = NEXT_INSN (insn);
        !          3763:              rtx p;
        !          3764:              int class;
        !          3765: 
        !          3766:              /* If this block has not had spilling done for a
        !          3767:                 particular clas and we have any non-optionals that need a
        !          3768:                 spill reg in that class, abort.  */
        !          3769: 
        !          3770:              for (class = 0; class < N_REG_CLASSES; class++)
        !          3771:                if (basic_block_needs[class] != 0
        !          3772:                    && basic_block_needs[class][this_block] == 0)
        !          3773:                  for (i = 0; i < n_reloads; i++)
        !          3774:                    if (class == (int) reload_reg_class[i]
        !          3775:                        && reload_reg_rtx[i] == 0
        !          3776:                        && ! reload_optional[i]
        !          3777:                        && (reload_in[i] != 0 || reload_out[i] != 0
        !          3778:                            || reload_secondary_p[i] != 0))
        !          3779:                      abort ();
        !          3780: 
        !          3781:              /* Now compute which reload regs to reload them into.  Perhaps
        !          3782:                 reusing reload regs from previous insns, or else output
        !          3783:                 load insns to reload them.  Maybe output store insns too.
        !          3784:                 Record the choices of reload reg in reload_reg_rtx.  */
        !          3785:              choose_reload_regs (insn, avoid_return_reg);
        !          3786: 
        !          3787: #ifdef SMALL_REGISTER_CLASSES
        !          3788:              /* Merge any reloads that we didn't combine for fear of 
        !          3789:                 increasing the number of spill registers needed but now
        !          3790:                 discover can be safely merged.  */
        !          3791:              merge_assigned_reloads (insn);
        !          3792: #endif
        !          3793: 
        !          3794:              /* Generate the insns to reload operands into or out of
        !          3795:                 their reload regs.  */
        !          3796:              emit_reload_insns (insn);
        !          3797: 
        !          3798:              /* Substitute the chosen reload regs from reload_reg_rtx
        !          3799:                 into the insn's body (or perhaps into the bodies of other
        !          3800:                 load and store insn that we just made for reloading
        !          3801:                 and that we moved the structure into).  */
        !          3802:              subst_reloads ();
        !          3803: 
        !          3804:              /* If this was an ASM, make sure that all the reload insns
        !          3805:                 we have generated are valid.  If not, give an error
        !          3806:                 and delete them.  */
        !          3807: 
        !          3808:              if (asm_noperands (PATTERN (insn)) >= 0)
        !          3809:                for (p = NEXT_INSN (prev); p != next; p = NEXT_INSN (p))
        !          3810:                  if (p != insn && GET_RTX_CLASS (GET_CODE (p)) == 'i'
        !          3811:                      && (recog_memoized (p) < 0
        !          3812:                          || (insn_extract (p),
        !          3813:                              ! constrain_operands (INSN_CODE (p), 1))))
        !          3814:                    {
        !          3815:                      error_for_asm (insn,
        !          3816:                                     "`asm' operand requires impossible reload");
        !          3817:                      PUT_CODE (p, NOTE);
        !          3818:                      NOTE_SOURCE_FILE (p) = 0;
        !          3819:                      NOTE_LINE_NUMBER (p) = NOTE_INSN_DELETED;
        !          3820:                    }
        !          3821:            }
        !          3822:          /* Any previously reloaded spilled pseudo reg, stored in this insn,
        !          3823:             is no longer validly lying around to save a future reload.
        !          3824:             Note that this does not detect pseudos that were reloaded
        !          3825:             for this insn in order to be stored in
        !          3826:             (obeying register constraints).  That is correct; such reload
        !          3827:             registers ARE still valid.  */
        !          3828:          note_stores (PATTERN (insn), forget_old_reloads_1);
        !          3829: 
        !          3830:          /* There may have been CLOBBER insns placed after INSN.  So scan
        !          3831:             between INSN and NEXT and use them to forget old reloads.  */
        !          3832:          for (x = NEXT_INSN (insn); x != next; x = NEXT_INSN (x))
        !          3833:            if (GET_CODE (x) == INSN && GET_CODE (PATTERN (x)) == CLOBBER)
        !          3834:              note_stores (PATTERN (x), forget_old_reloads_1);
        !          3835: 
        !          3836: #ifdef AUTO_INC_DEC
        !          3837:          /* Likewise for regs altered by auto-increment in this insn.
        !          3838:             But note that the reg-notes are not changed by reloading:
        !          3839:             they still contain the pseudo-regs, not the spill regs.  */
        !          3840:          for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
        !          3841:            if (REG_NOTE_KIND (x) == REG_INC)
        !          3842:              {
        !          3843:                /* See if this pseudo reg was reloaded in this insn.
        !          3844:                   If so, its last-reload info is still valid
        !          3845:                   because it is based on this insn's reload.  */
        !          3846:                for (i = 0; i < n_reloads; i++)
        !          3847:                  if (reload_out[i] == XEXP (x, 0))
        !          3848:                    break;
        !          3849: 
        !          3850:                if (i == n_reloads)
        !          3851:                  forget_old_reloads_1 (XEXP (x, 0), NULL_RTX);
        !          3852:              }
        !          3853: #endif
        !          3854:        }
        !          3855:       /* A reload reg's contents are unknown after a label.  */
        !          3856:       if (GET_CODE (insn) == CODE_LABEL)
        !          3857:        for (i = 0; i < n_spills; i++)
        !          3858:          {
        !          3859:            reg_reloaded_contents[i] = -1;
        !          3860:            reg_reloaded_insn[i] = 0;
        !          3861:          }
        !          3862: 
        !          3863:       /* Don't assume a reload reg is still good after a call insn
        !          3864:         if it is a call-used reg.  */
        !          3865:       else if (GET_CODE (insn) == CALL_INSN)
        !          3866:        for (i = 0; i < n_spills; i++)
        !          3867:          if (call_used_regs[spill_regs[i]])
        !          3868:            {
        !          3869:              reg_reloaded_contents[i] = -1;
        !          3870:              reg_reloaded_insn[i] = 0;
        !          3871:            }
        !          3872: 
        !          3873:       /* In case registers overlap, allow certain insns to invalidate
        !          3874:         particular hard registers.  */
        !          3875: 
        !          3876: #ifdef INSN_CLOBBERS_REGNO_P
        !          3877:       for (i = 0 ; i < n_spills ; i++)
        !          3878:        if (INSN_CLOBBERS_REGNO_P (insn, spill_regs[i]))
        !          3879:          {
        !          3880:            reg_reloaded_contents[i] = -1;
        !          3881:            reg_reloaded_insn[i] = 0;
        !          3882:          }
        !          3883: #endif
        !          3884: 
        !          3885:       insn = next;
        !          3886: 
        !          3887: #ifdef USE_C_ALLOCA
        !          3888:       alloca (0);
        !          3889: #endif
        !          3890:     }
        !          3891: }
        !          3892: 
        !          3893: /* Discard all record of any value reloaded from X,
        !          3894:    or reloaded in X from someplace else;
        !          3895:    unless X is an output reload reg of the current insn.
        !          3896: 
        !          3897:    X may be a hard reg (the reload reg)
        !          3898:    or it may be a pseudo reg that was reloaded from.  */
        !          3899: 
        !          3900: static void
        !          3901: forget_old_reloads_1 (x, ignored)
        !          3902:      rtx x;
        !          3903:      rtx ignored;
        !          3904: {
        !          3905:   register int regno;
        !          3906:   int nr;
        !          3907:   int offset = 0;
        !          3908: 
        !          3909:   /* note_stores does give us subregs of hard regs.  */
        !          3910:   while (GET_CODE (x) == SUBREG)
        !          3911:     {
        !          3912:       offset += SUBREG_WORD (x);
        !          3913:       x = SUBREG_REG (x);
        !          3914:     }
        !          3915: 
        !          3916:   if (GET_CODE (x) != REG)
        !          3917:     return;
        !          3918: 
        !          3919:   regno = REGNO (x) + offset;
        !          3920: 
        !          3921:   if (regno >= FIRST_PSEUDO_REGISTER)
        !          3922:     nr = 1;
        !          3923:   else
        !          3924:     {
        !          3925:       int i;
        !          3926:       nr = HARD_REGNO_NREGS (regno, GET_MODE (x));
        !          3927:       /* Storing into a spilled-reg invalidates its contents.
        !          3928:         This can happen if a block-local pseudo is allocated to that reg
        !          3929:         and it wasn't spilled because this block's total need is 0.
        !          3930:         Then some insn might have an optional reload and use this reg.  */
        !          3931:       for (i = 0; i < nr; i++)
        !          3932:        if (spill_reg_order[regno + i] >= 0
        !          3933:            /* But don't do this if the reg actually serves as an output
        !          3934:               reload reg in the current instruction.  */
        !          3935:            && (n_reloads == 0
        !          3936:                || ! TEST_HARD_REG_BIT (reg_is_output_reload, regno + i)))
        !          3937:          {
        !          3938:            reg_reloaded_contents[spill_reg_order[regno + i]] = -1;
        !          3939:            reg_reloaded_insn[spill_reg_order[regno + i]] = 0;
        !          3940:          }
        !          3941:     }
        !          3942: 
        !          3943:   /* Since value of X has changed,
        !          3944:      forget any value previously copied from it.  */
        !          3945: 
        !          3946:   while (nr-- > 0)
        !          3947:     /* But don't forget a copy if this is the output reload
        !          3948:        that establishes the copy's validity.  */
        !          3949:     if (n_reloads == 0 || reg_has_output_reload[regno + nr] == 0)
        !          3950:       reg_last_reload_reg[regno + nr] = 0;
        !          3951: }
        !          3952: 
        !          3953: /* For each reload, the mode of the reload register.  */
        !          3954: static enum machine_mode reload_mode[MAX_RELOADS];
        !          3955: 
        !          3956: /* For each reload, the largest number of registers it will require.  */
        !          3957: static int reload_nregs[MAX_RELOADS];
        !          3958: 
        !          3959: /* Comparison function for qsort to decide which of two reloads
        !          3960:    should be handled first.  *P1 and *P2 are the reload numbers.  */
        !          3961: 
        !          3962: static int
        !          3963: reload_reg_class_lower (p1, p2)
        !          3964:      short *p1, *p2;
        !          3965: {
        !          3966:   register int r1 = *p1, r2 = *p2;
        !          3967:   register int t;
        !          3968: 
        !          3969:   /* Consider required reloads before optional ones.  */
        !          3970:   t = reload_optional[r1] - reload_optional[r2];
        !          3971:   if (t != 0)
        !          3972:     return t;
        !          3973: 
        !          3974:   /* Count all solitary classes before non-solitary ones.  */
        !          3975:   t = ((reg_class_size[(int) reload_reg_class[r2]] == 1)
        !          3976:        - (reg_class_size[(int) reload_reg_class[r1]] == 1));
        !          3977:   if (t != 0)
        !          3978:     return t;
        !          3979: 
        !          3980:   /* Aside from solitaires, consider all multi-reg groups first.  */
        !          3981:   t = reload_nregs[r2] - reload_nregs[r1];
        !          3982:   if (t != 0)
        !          3983:     return t;
        !          3984: 
        !          3985:   /* Consider reloads in order of increasing reg-class number.  */
        !          3986:   t = (int) reload_reg_class[r1] - (int) reload_reg_class[r2];
        !          3987:   if (t != 0)
        !          3988:     return t;
        !          3989: 
        !          3990:   /* If reloads are equally urgent, sort by reload number,
        !          3991:      so that the results of qsort leave nothing to chance.  */
        !          3992:   return r1 - r2;
        !          3993: }
        !          3994: 
        !          3995: /* The following HARD_REG_SETs indicate when each hard register is
        !          3996:    used for a reload of various parts of the current insn.  */
        !          3997: 
        !          3998: /* If reg is in use as a reload reg for a RELOAD_OTHER reload.  */
        !          3999: static HARD_REG_SET reload_reg_used;
        !          4000: /* If reg is in use for a RELOAD_FOR_INPUT_ADDRESS reload for operand I.  */
        !          4001: static HARD_REG_SET reload_reg_used_in_input_addr[MAX_RECOG_OPERANDS];
        !          4002: /* If reg is in use for a RELOAD_FOR_OUTPUT_ADDRESS reload for operand I.  */
        !          4003: static HARD_REG_SET reload_reg_used_in_output_addr[MAX_RECOG_OPERANDS];
        !          4004: /* If reg is in use for a RELOAD_FOR_INPUT reload for operand I.  */
        !          4005: static HARD_REG_SET reload_reg_used_in_input[MAX_RECOG_OPERANDS];
        !          4006: /* If reg is in use for a RELOAD_FOR_OUTPUT reload for operand I.  */
        !          4007: static HARD_REG_SET reload_reg_used_in_output[MAX_RECOG_OPERANDS];
        !          4008: /* If reg is in use for a RELOAD_FOR_OPERAND_ADDRESS reload.  */
        !          4009: static HARD_REG_SET reload_reg_used_in_op_addr;
        !          4010: /* If reg is in use for a RELOAD_FOR_INSN reload.  */
        !          4011: static HARD_REG_SET reload_reg_used_in_insn;
        !          4012: /* If reg is in use for a RELOAD_FOR_OTHER_ADDRESS reload.  */
        !          4013: static HARD_REG_SET reload_reg_used_in_other_addr;
        !          4014: 
        !          4015: /* If reg is in use as a reload reg for any sort of reload.  */
        !          4016: static HARD_REG_SET reload_reg_used_at_all;
        !          4017: 
        !          4018: /* If reg is use as an inherited reload.  We just mark the first register
        !          4019:    in the group.  */
        !          4020: static HARD_REG_SET reload_reg_used_for_inherit;
        !          4021: 
        !          4022: /* Mark reg REGNO as in use for a reload of the sort spec'd by OPNUM and
        !          4023:    TYPE. MODE is used to indicate how many consecutive regs are
        !          4024:    actually used.  */
        !          4025: 
        !          4026: static void
        !          4027: mark_reload_reg_in_use (regno, opnum, type, mode)
        !          4028:      int regno;
        !          4029:      int opnum;
        !          4030:      enum reload_type type;
        !          4031:      enum machine_mode mode;
        !          4032: {
        !          4033:   int nregs = HARD_REGNO_NREGS (regno, mode);
        !          4034:   int i;
        !          4035: 
        !          4036:   for (i = regno; i < nregs + regno; i++)
        !          4037:     {
        !          4038:       switch (type)
        !          4039:        {
        !          4040:        case RELOAD_OTHER:
        !          4041:          SET_HARD_REG_BIT (reload_reg_used, i);
        !          4042:          break;
        !          4043: 
        !          4044:        case RELOAD_FOR_INPUT_ADDRESS:
        !          4045:          SET_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], i);
        !          4046:          break;
        !          4047: 
        !          4048:        case RELOAD_FOR_OUTPUT_ADDRESS:
        !          4049:          SET_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], i);
        !          4050:          break;
        !          4051: 
        !          4052:        case RELOAD_FOR_OPERAND_ADDRESS:
        !          4053:          SET_HARD_REG_BIT (reload_reg_used_in_op_addr, i);
        !          4054:          break;
        !          4055: 
        !          4056:        case RELOAD_FOR_OTHER_ADDRESS:
        !          4057:          SET_HARD_REG_BIT (reload_reg_used_in_other_addr, i);
        !          4058:          break;
        !          4059: 
        !          4060:        case RELOAD_FOR_INPUT:
        !          4061:          SET_HARD_REG_BIT (reload_reg_used_in_input[opnum], i);
        !          4062:          break;
        !          4063: 
        !          4064:        case RELOAD_FOR_OUTPUT:
        !          4065:          SET_HARD_REG_BIT (reload_reg_used_in_output[opnum], i);
        !          4066:          break;
        !          4067: 
        !          4068:        case RELOAD_FOR_INSN:
        !          4069:          SET_HARD_REG_BIT (reload_reg_used_in_insn, i);
        !          4070:          break;
        !          4071:        }
        !          4072: 
        !          4073:       SET_HARD_REG_BIT (reload_reg_used_at_all, i);
        !          4074:     }
        !          4075: }
        !          4076: 
        !          4077: /* Similarly, but show REGNO is no longer in use for a reload.  */
        !          4078: 
        !          4079: static void
        !          4080: clear_reload_reg_in_use (regno, opnum, type, mode)
        !          4081:      int regno;
        !          4082:      int opnum;
        !          4083:      enum reload_type type;
        !          4084:      enum machine_mode mode;
        !          4085: {
        !          4086:   int nregs = HARD_REGNO_NREGS (regno, mode);
        !          4087:   int i;
        !          4088: 
        !          4089:   for (i = regno; i < nregs + regno; i++)
        !          4090:     {
        !          4091:       switch (type)
        !          4092:        {
        !          4093:        case RELOAD_OTHER:
        !          4094:          CLEAR_HARD_REG_BIT (reload_reg_used, i);
        !          4095:          break;
        !          4096: 
        !          4097:        case RELOAD_FOR_INPUT_ADDRESS:
        !          4098:          CLEAR_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], i);
        !          4099:          break;
        !          4100: 
        !          4101:        case RELOAD_FOR_OUTPUT_ADDRESS:
        !          4102:          CLEAR_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], i);
        !          4103:          break;
        !          4104: 
        !          4105:        case RELOAD_FOR_OPERAND_ADDRESS:
        !          4106:          CLEAR_HARD_REG_BIT (reload_reg_used_in_op_addr, i);
        !          4107:          break;
        !          4108: 
        !          4109:        case RELOAD_FOR_OTHER_ADDRESS:
        !          4110:          CLEAR_HARD_REG_BIT (reload_reg_used_in_other_addr, i);
        !          4111:          break;
        !          4112: 
        !          4113:        case RELOAD_FOR_INPUT:
        !          4114:          CLEAR_HARD_REG_BIT (reload_reg_used_in_input[opnum], i);
        !          4115:          break;
        !          4116: 
        !          4117:        case RELOAD_FOR_OUTPUT:
        !          4118:          CLEAR_HARD_REG_BIT (reload_reg_used_in_output[opnum], i);
        !          4119:          break;
        !          4120: 
        !          4121:        case RELOAD_FOR_INSN:
        !          4122:          CLEAR_HARD_REG_BIT (reload_reg_used_in_insn, i);
        !          4123:          break;
        !          4124:        }
        !          4125:     }
        !          4126: }
        !          4127: 
        !          4128: /* 1 if reg REGNO is free as a reload reg for a reload of the sort
        !          4129:    specified by OPNUM and TYPE.  */
        !          4130: 
        !          4131: static int
        !          4132: reload_reg_free_p (regno, opnum, type)
        !          4133:      int regno;
        !          4134:      int opnum;
        !          4135:      enum reload_type type;
        !          4136: {
        !          4137:   int i;
        !          4138: 
        !          4139:   /* In use for a RELOAD_OTHER means it's not available for anything except
        !          4140:      RELOAD_FOR_OTHER_ADDRESS.  Recall that RELOAD_FOR_OTHER_ADDRESS is known
        !          4141:      to be used only for inputs.  */
        !          4142: 
        !          4143:   if (type != RELOAD_FOR_OTHER_ADDRESS
        !          4144:       && TEST_HARD_REG_BIT (reload_reg_used, regno))
        !          4145:     return 0;
        !          4146: 
        !          4147:   switch (type)
        !          4148:     {
        !          4149:     case RELOAD_OTHER:
        !          4150:       /* In use for anything means not available for a RELOAD_OTHER.  */
        !          4151:       return ! TEST_HARD_REG_BIT (reload_reg_used_at_all, regno);
        !          4152: 
        !          4153:       /* The other kinds of use can sometimes share a register.  */
        !          4154:     case RELOAD_FOR_INPUT:
        !          4155:       if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
        !          4156:          || TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno))
        !          4157:        return 0;
        !          4158: 
        !          4159:       /* If it is used for some other input, can't use it.  */
        !          4160:       for (i = 0; i < reload_n_operands; i++)
        !          4161:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4162:          return 0;
        !          4163: 
        !          4164:       /* If it is used in a later operand's address, can't use it.  */
        !          4165:       for (i = opnum + 1; i < reload_n_operands; i++)
        !          4166:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno))
        !          4167:          return 0;
        !          4168: 
        !          4169:       return 1;
        !          4170: 
        !          4171:     case RELOAD_FOR_INPUT_ADDRESS:
        !          4172:       /* Can't use a register if it is used for an input address for this
        !          4173:         operand or used as an input in an earlier one.  */
        !          4174:       if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], regno))
        !          4175:        return 0;
        !          4176: 
        !          4177:       for (i = 0; i < opnum; i++)
        !          4178:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4179:          return 0;
        !          4180: 
        !          4181:       return 1;
        !          4182: 
        !          4183:     case RELOAD_FOR_OUTPUT_ADDRESS:
        !          4184:       /* Can't use a register if it is used for an output address for this
        !          4185:         operand or used as an output in this or a later operand.  */
        !          4186:       if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], regno))
        !          4187:        return 0;
        !          4188: 
        !          4189:       for (i = opnum; i < reload_n_operands; i++)
        !          4190:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4191:          return 0;
        !          4192: 
        !          4193:       return 1;
        !          4194: 
        !          4195:     case RELOAD_FOR_OPERAND_ADDRESS:
        !          4196:       for (i = 0; i < reload_n_operands; i++)
        !          4197:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4198:          return 0;
        !          4199: 
        !          4200:       return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
        !          4201:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
        !          4202: 
        !          4203:     case RELOAD_FOR_OUTPUT:
        !          4204:       /* This cannot share a register with RELOAD_FOR_INSN reloads, other
        !          4205:         outputs, or an operand address for this or an earlier output.  */
        !          4206:       if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
        !          4207:        return 0;
        !          4208: 
        !          4209:       for (i = 0; i < reload_n_operands; i++)
        !          4210:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4211:          return 0;
        !          4212: 
        !          4213:       for (i = 0; i <= opnum; i++)
        !          4214:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno))
        !          4215:          return 0;
        !          4216: 
        !          4217:       return 1;
        !          4218: 
        !          4219:     case RELOAD_FOR_INSN:
        !          4220:       for (i = 0; i < reload_n_operands; i++)
        !          4221:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno)
        !          4222:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4223:          return 0;
        !          4224: 
        !          4225:       return (! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
        !          4226:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
        !          4227: 
        !          4228:     case RELOAD_FOR_OTHER_ADDRESS:
        !          4229:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4230:     }
        !          4231:   abort ();
        !          4232: }
        !          4233: 
        !          4234: /* Return 1 if the value in reload reg REGNO, as used by a reload
        !          4235:    needed for the part of the insn specified by OPNUM and TYPE,
        !          4236:    is not in use for a reload in any prior part of the insn.
        !          4237: 
        !          4238:    We can assume that the reload reg was already tested for availability
        !          4239:    at the time it is needed, and we should not check this again,
        !          4240:    in case the reg has already been marked in use.  */
        !          4241: 
        !          4242: static int
        !          4243: reload_reg_free_before_p (regno, opnum, type)
        !          4244:      int regno;
        !          4245:      int opnum;
        !          4246:      enum reload_type type;
        !          4247: {
        !          4248:   int i;
        !          4249: 
        !          4250:   switch (type)
        !          4251:     {
        !          4252:     case RELOAD_FOR_OTHER_ADDRESS:
        !          4253:       /* These always come first.  */
        !          4254:       return 1;
        !          4255: 
        !          4256:     case RELOAD_OTHER:
        !          4257:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4258: 
        !          4259:       /* If this use is for part of the insn,
        !          4260:         check the reg is not in use for any prior part.  It is tempting
        !          4261:         to try to do this by falling through from objecs that occur
        !          4262:         later in the insn to ones that occur earlier, but that will not
        !          4263:         correctly take into account the fact that here we MUST ignore
        !          4264:         things that would prevent the register from being allocated in
        !          4265:         the first place, since we know that it was allocated.  */
        !          4266: 
        !          4267:     case RELOAD_FOR_OUTPUT_ADDRESS:
        !          4268:       /* Earlier reloads are for earlier outputs or their addresses,
        !          4269:         any RELOAD_FOR_INSN reloads, any inputs or their addresses, or any
        !          4270:         RELOAD_FOR_OTHER_ADDRESS reloads (we know it can't conflict with
        !          4271:         RELOAD_OTHER)..  */
        !          4272:       for (i = 0; i < opnum; i++)
        !          4273:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
        !          4274:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4275:          return 0;
        !          4276: 
        !          4277:       if (TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno))
        !          4278:        return 0;
        !          4279: 
        !          4280:       for (i = 0; i < reload_n_operands; i++)
        !          4281:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
        !          4282:            || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4283:          return 0;
        !          4284: 
        !          4285:       return (! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno)
        !          4286:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
        !          4287:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno));
        !          4288:                                   
        !          4289:     case RELOAD_FOR_OUTPUT:
        !          4290:       /* This can't be used in the output address for this operand and
        !          4291:         anything that can't be used for it, except that we've already
        !          4292:         tested for RELOAD_FOR_INSN objects.  */
        !          4293: 
        !          4294:       if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[opnum], regno))
        !          4295:        return 0;
        !          4296: 
        !          4297:       for (i = 0; i < opnum; i++)
        !          4298:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
        !          4299:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4300:          return 0;
        !          4301: 
        !          4302:       for (i = 0; i < reload_n_operands; i++)
        !          4303:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
        !          4304:            || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno)
        !          4305:            || TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno))
        !          4306:          return 0;
        !          4307: 
        !          4308:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4309: 
        !          4310:     case RELOAD_FOR_OPERAND_ADDRESS:
        !          4311:     case RELOAD_FOR_INSN:
        !          4312:       /* These can't conflict with inputs, or each other, so all we have to
        !          4313:         test is input addresses and the addresses of OTHER items.  */
        !          4314: 
        !          4315:       for (i = 0; i < reload_n_operands; i++)
        !          4316:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno))
        !          4317:          return 0;
        !          4318: 
        !          4319:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4320: 
        !          4321:     case RELOAD_FOR_INPUT:
        !          4322:       /* The only things earlier are the address for this and
        !          4323:         earlier inputs, other inputs (which we know we don't conflict
        !          4324:         with), and addresses of RELOAD_OTHER objects.  */
        !          4325: 
        !          4326:       for (i = 0; i <= opnum; i++)
        !          4327:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno))
        !          4328:          return 0;
        !          4329: 
        !          4330:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4331: 
        !          4332:     case RELOAD_FOR_INPUT_ADDRESS:
        !          4333:       /* Similarly, all we have to check is for use in earlier inputs'
        !          4334:         addresses.  */
        !          4335:       for (i = 0; i < opnum; i++)
        !          4336:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno))
        !          4337:          return 0;
        !          4338: 
        !          4339:       return ! TEST_HARD_REG_BIT (reload_reg_used_in_other_addr, regno);
        !          4340:     }
        !          4341:   abort ();
        !          4342: }
        !          4343: 
        !          4344: /* Return 1 if the value in reload reg REGNO, as used by a reload
        !          4345:    needed for the part of the insn specified by OPNUM and TYPE,
        !          4346:    is still available in REGNO at the end of the insn.
        !          4347: 
        !          4348:    We can assume that the reload reg was already tested for availability
        !          4349:    at the time it is needed, and we should not check this again,
        !          4350:    in case the reg has already been marked in use.  */
        !          4351: 
        !          4352: static int
        !          4353: reload_reg_reaches_end_p (regno, opnum, type)
        !          4354:      int regno;
        !          4355:      int opnum;
        !          4356:      enum reload_type type;
        !          4357: {
        !          4358:   int i;
        !          4359: 
        !          4360:   switch (type)
        !          4361:     {
        !          4362:     case RELOAD_OTHER:
        !          4363:       /* Since a RELOAD_OTHER reload claims the reg for the entire insn,
        !          4364:         its value must reach the end.  */
        !          4365:       return 1;
        !          4366: 
        !          4367:       /* If this use is for part of the insn,
        !          4368:         its value reaches if no subsequent part uses the same register. 
        !          4369:         Just like the above function, don't try to do this with lots
        !          4370:         of fallthroughs.  */
        !          4371: 
        !          4372:     case RELOAD_FOR_OTHER_ADDRESS:
        !          4373:       /* Here we check for everything else, since these don't conflict
        !          4374:         with anything else and everything comes later.  */
        !          4375: 
        !          4376:       for (i = 0; i < reload_n_operands; i++)
        !          4377:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
        !          4378:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno)
        !          4379:            || TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
        !          4380:            || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4381:          return 0;
        !          4382: 
        !          4383:       return (! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
        !          4384:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno)
        !          4385:              && ! TEST_HARD_REG_BIT (reload_reg_used, regno));
        !          4386: 
        !          4387:     case RELOAD_FOR_INPUT_ADDRESS:
        !          4388:       /* Similar, except that we check only for this and subsequent inputs
        !          4389:         and the address of only subsequent inputs and we do not need
        !          4390:         to check for RELOAD_OTHER objects since they are known not to
        !          4391:         conflict.  */
        !          4392: 
        !          4393:       for (i = opnum; i < reload_n_operands; i++)
        !          4394:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4395:          return 0;
        !          4396: 
        !          4397:       for (i = opnum + 1; i < reload_n_operands; i++)
        !          4398:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno))
        !          4399:          return 0;
        !          4400: 
        !          4401:       for (i = 0; i < reload_n_operands; i++)
        !          4402:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
        !          4403:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4404:          return 0;
        !          4405: 
        !          4406:       return (! TEST_HARD_REG_BIT (reload_reg_used_in_op_addr, regno)
        !          4407:              && ! TEST_HARD_REG_BIT (reload_reg_used_in_insn, regno));
        !          4408: 
        !          4409:     case RELOAD_FOR_INPUT:
        !          4410:       /* Similar to input address, except we start at the next operand for
        !          4411:         both input and input address and we do not check for 
        !          4412:         RELOAD_FOR_OPERAND_ADDRESS and RELOAD_FOR_INSN since these
        !          4413:         would conflict.  */
        !          4414: 
        !          4415:       for (i = opnum + 1; i < reload_n_operands; i++)
        !          4416:        if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno)
        !          4417:            || TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno))
        !          4418:          return 0;
        !          4419: 
        !          4420:       /* ... fall through ... */
        !          4421: 
        !          4422:     case RELOAD_FOR_OPERAND_ADDRESS:
        !          4423:       /* Check outputs and their addresses.  */
        !          4424: 
        !          4425:       for (i = 0; i < reload_n_operands; i++)
        !          4426:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno)
        !          4427:            || TEST_HARD_REG_BIT (reload_reg_used_in_output[i], regno))
        !          4428:          return 0;
        !          4429: 
        !          4430:       return 1;
        !          4431: 
        !          4432:     case RELOAD_FOR_INSN:
        !          4433:       /* These conflict with other outputs with with RELOAD_OTHER.  So
        !          4434:         we need only check for output addresses.  */
        !          4435: 
        !          4436:       opnum = -1;
        !          4437: 
        !          4438:       /* ... fall through ... */
        !          4439: 
        !          4440:     case RELOAD_FOR_OUTPUT:
        !          4441:     case RELOAD_FOR_OUTPUT_ADDRESS:
        !          4442:       /* We already know these can't conflict with a later output.  So the
        !          4443:         only thing to check are later output addresses.  */
        !          4444:       for (i = opnum + 1; i < reload_n_operands; i++)
        !          4445:        if (TEST_HARD_REG_BIT (reload_reg_used_in_output_addr[i], regno))
        !          4446:          return 0;
        !          4447: 
        !          4448:       return 1;
        !          4449:     }
        !          4450: 
        !          4451:   abort ();
        !          4452: }
        !          4453: 
        !          4454: /* Vector of reload-numbers showing the order in which the reloads should
        !          4455:    be processed.  */
        !          4456: short reload_order[MAX_RELOADS];
        !          4457: 
        !          4458: /* Indexed by reload number, 1 if incoming value
        !          4459:    inherited from previous insns.  */
        !          4460: char reload_inherited[MAX_RELOADS];
        !          4461: 
        !          4462: /* For an inherited reload, this is the insn the reload was inherited from,
        !          4463:    if we know it.  Otherwise, this is 0.  */
        !          4464: rtx reload_inheritance_insn[MAX_RELOADS];
        !          4465: 
        !          4466: /* If non-zero, this is a place to get the value of the reload,
        !          4467:    rather than using reload_in.  */
        !          4468: rtx reload_override_in[MAX_RELOADS];
        !          4469: 
        !          4470: /* For each reload, the index in spill_regs of the spill register used,
        !          4471:    or -1 if we did not need one of the spill registers for this reload.  */
        !          4472: int reload_spill_index[MAX_RELOADS];
        !          4473: 
        !          4474: /* Index of last register assigned as a spill register.  We allocate in
        !          4475:    a round-robin fashio.  */
        !          4476: 
        !          4477: static int last_spill_reg = 0;
        !          4478: 
        !          4479: /* Find a spill register to use as a reload register for reload R.
        !          4480:    LAST_RELOAD is non-zero if this is the last reload for the insn being
        !          4481:    processed.
        !          4482: 
        !          4483:    Set reload_reg_rtx[R] to the register allocated.
        !          4484: 
        !          4485:    If NOERROR is nonzero, we return 1 if successful,
        !          4486:    or 0 if we couldn't find a spill reg and we didn't change anything.  */
        !          4487: 
        !          4488: static int
        !          4489: allocate_reload_reg (r, insn, last_reload, noerror)
        !          4490:      int r;
        !          4491:      rtx insn;
        !          4492:      int last_reload;
        !          4493:      int noerror;
        !          4494: {
        !          4495:   int i;
        !          4496:   int pass;
        !          4497:   int count;
        !          4498:   rtx new;
        !          4499:   int regno;
        !          4500: 
        !          4501:   /* If we put this reload ahead, thinking it is a group,
        !          4502:      then insist on finding a group.  Otherwise we can grab a
        !          4503:      reg that some other reload needs.
        !          4504:      (That can happen when we have a 68000 DATA_OR_FP_REG
        !          4505:      which is a group of data regs or one fp reg.)
        !          4506:      We need not be so restrictive if there are no more reloads
        !          4507:      for this insn.
        !          4508: 
        !          4509:      ??? Really it would be nicer to have smarter handling
        !          4510:      for that kind of reg class, where a problem like this is normal.
        !          4511:      Perhaps those classes should be avoided for reloading
        !          4512:      by use of more alternatives.  */
        !          4513: 
        !          4514:   int force_group = reload_nregs[r] > 1 && ! last_reload;
        !          4515: 
        !          4516:   /* If we want a single register and haven't yet found one,
        !          4517:      take any reg in the right class and not in use.
        !          4518:      If we want a consecutive group, here is where we look for it.
        !          4519: 
        !          4520:      We use two passes so we can first look for reload regs to
        !          4521:      reuse, which are already in use for other reloads in this insn,
        !          4522:      and only then use additional registers.
        !          4523:      I think that maximizing reuse is needed to make sure we don't
        !          4524:      run out of reload regs.  Suppose we have three reloads, and
        !          4525:      reloads A and B can share regs.  These need two regs.
        !          4526:      Suppose A and B are given different regs.
        !          4527:      That leaves none for C.  */
        !          4528:   for (pass = 0; pass < 2; pass++)
        !          4529:     {
        !          4530:       /* I is the index in spill_regs.
        !          4531:         We advance it round-robin between insns to use all spill regs
        !          4532:         equally, so that inherited reloads have a chance
        !          4533:         of leapfrogging each other.  */
        !          4534: 
        !          4535:       for (count = 0, i = last_spill_reg; count < n_spills; count++)
        !          4536:        {
        !          4537:          int class = (int) reload_reg_class[r];
        !          4538: 
        !          4539:          i = (i + 1) % n_spills;
        !          4540: 
        !          4541:          if (reload_reg_free_p (spill_regs[i], reload_opnum[r],
        !          4542:                                 reload_when_needed[r])
        !          4543:              && TEST_HARD_REG_BIT (reg_class_contents[class], spill_regs[i])
        !          4544:              && HARD_REGNO_MODE_OK (spill_regs[i], reload_mode[r])
        !          4545:              /* Look first for regs to share, then for unshared.  But
        !          4546:                 don't share regs used for inherited reloads; they are
        !          4547:                 the ones we want to preserve.  */
        !          4548:              && (pass
        !          4549:                  || (TEST_HARD_REG_BIT (reload_reg_used_at_all,
        !          4550:                                         spill_regs[i])
        !          4551:                      && ! TEST_HARD_REG_BIT (reload_reg_used_for_inherit,
        !          4552:                                              spill_regs[i]))))
        !          4553:            {
        !          4554:              int nr = HARD_REGNO_NREGS (spill_regs[i], reload_mode[r]);
        !          4555:              /* Avoid the problem where spilling a GENERAL_OR_FP_REG
        !          4556:                 (on 68000) got us two FP regs.  If NR is 1,
        !          4557:                 we would reject both of them.  */
        !          4558:              if (force_group)
        !          4559:                nr = CLASS_MAX_NREGS (reload_reg_class[r], reload_mode[r]);
        !          4560:              /* If we need only one reg, we have already won.  */
        !          4561:              if (nr == 1)
        !          4562:                {
        !          4563:                  /* But reject a single reg if we demand a group.  */
        !          4564:                  if (force_group)
        !          4565:                    continue;
        !          4566:                  break;
        !          4567:                }
        !          4568:              /* Otherwise check that as many consecutive regs as we need
        !          4569:                 are available here.
        !          4570:                 Also, don't use for a group registers that are
        !          4571:                 needed for nongroups.  */
        !          4572:              if (! TEST_HARD_REG_BIT (counted_for_nongroups, spill_regs[i]))
        !          4573:                while (nr > 1)
        !          4574:                  {
        !          4575:                    regno = spill_regs[i] + nr - 1;
        !          4576:                    if (!(TEST_HARD_REG_BIT (reg_class_contents[class], regno)
        !          4577:                          && spill_reg_order[regno] >= 0
        !          4578:                          && reload_reg_free_p (regno, reload_opnum[r],
        !          4579:                                                reload_when_needed[r])
        !          4580:                          && ! TEST_HARD_REG_BIT (counted_for_nongroups,
        !          4581:                                                  regno)))
        !          4582:                      break;
        !          4583:                    nr--;
        !          4584:                  }
        !          4585:              if (nr == 1)
        !          4586:                break;
        !          4587:            }
        !          4588:        }
        !          4589: 
        !          4590:       /* If we found something on pass 1, omit pass 2.  */
        !          4591:       if (count < n_spills)
        !          4592:        break;
        !          4593:     }
        !          4594: 
        !          4595:   /* We should have found a spill register by now.  */
        !          4596:   if (count == n_spills)
        !          4597:     {
        !          4598:       if (noerror)
        !          4599:        return 0;
        !          4600:       goto failure;
        !          4601:     }
        !          4602: 
        !          4603:   /* I is the index in SPILL_REG_RTX of the reload register we are to
        !          4604:      allocate.  Get an rtx for it and find its register number.  */
        !          4605: 
        !          4606:   new = spill_reg_rtx[i];
        !          4607: 
        !          4608:   if (new == 0 || GET_MODE (new) != reload_mode[r])
        !          4609:     spill_reg_rtx[i] = new
        !          4610:       = gen_rtx (REG, reload_mode[r], spill_regs[i]);
        !          4611:            
        !          4612:   regno = true_regnum (new);
        !          4613: 
        !          4614:   /* Detect when the reload reg can't hold the reload mode.
        !          4615:      This used to be one `if', but Sequent compiler can't handle that.  */
        !          4616:   if (HARD_REGNO_MODE_OK (regno, reload_mode[r]))
        !          4617:     {
        !          4618:       enum machine_mode test_mode = VOIDmode;
        !          4619:       if (reload_in[r])
        !          4620:        test_mode = GET_MODE (reload_in[r]);
        !          4621:       /* If reload_in[r] has VOIDmode, it means we will load it
        !          4622:         in whatever mode the reload reg has: to wit, reload_mode[r].
        !          4623:         We have already tested that for validity.  */
        !          4624:       /* Aside from that, we need to test that the expressions
        !          4625:         to reload from or into have modes which are valid for this
        !          4626:         reload register.  Otherwise the reload insns would be invalid.  */
        !          4627:       if (! (reload_in[r] != 0 && test_mode != VOIDmode
        !          4628:             && ! HARD_REGNO_MODE_OK (regno, test_mode)))
        !          4629:        if (! (reload_out[r] != 0
        !          4630:               && ! HARD_REGNO_MODE_OK (regno, GET_MODE (reload_out[r]))))
        !          4631:          {
        !          4632:            /* The reg is OK.  */
        !          4633:            last_spill_reg = i;
        !          4634: 
        !          4635:            /* Mark as in use for this insn the reload regs we use
        !          4636:               for this.  */
        !          4637:            mark_reload_reg_in_use (spill_regs[i], reload_opnum[r],
        !          4638:                                    reload_when_needed[r], reload_mode[r]);
        !          4639: 
        !          4640:            reload_reg_rtx[r] = new;
        !          4641:            reload_spill_index[r] = i;
        !          4642:            return 1;
        !          4643:          }
        !          4644:     }
        !          4645: 
        !          4646:   /* The reg is not OK.  */
        !          4647:   if (noerror)
        !          4648:     return 0;
        !          4649: 
        !          4650:  failure:
        !          4651:   if (asm_noperands (PATTERN (insn)) < 0)
        !          4652:     /* It's the compiler's fault.  */
        !          4653:     abort ();
        !          4654: 
        !          4655:   /* It's the user's fault; the operand's mode and constraint
        !          4656:      don't match.  Disable this reload so we don't crash in final.  */
        !          4657:   error_for_asm (insn,
        !          4658:                 "`asm' operand constraint incompatible with operand size");
        !          4659:   reload_in[r] = 0;
        !          4660:   reload_out[r] = 0;
        !          4661:   reload_reg_rtx[r] = 0;
        !          4662:   reload_optional[r] = 1;
        !          4663:   reload_secondary_p[r] = 1;
        !          4664: 
        !          4665:   return 1;
        !          4666: }
        !          4667: 
        !          4668: /* Assign hard reg targets for the pseudo-registers we must reload
        !          4669:    into hard regs for this insn.
        !          4670:    Also output the instructions to copy them in and out of the hard regs.
        !          4671: 
        !          4672:    For machines with register classes, we are responsible for
        !          4673:    finding a reload reg in the proper class.  */
        !          4674: 
        !          4675: static void
        !          4676: choose_reload_regs (insn, avoid_return_reg)
        !          4677:      rtx insn;
        !          4678:      rtx avoid_return_reg;
        !          4679: {
        !          4680:   register int i, j;
        !          4681:   int max_group_size = 1;
        !          4682:   enum reg_class group_class = NO_REGS;
        !          4683:   int inheritance;
        !          4684: 
        !          4685:   rtx save_reload_reg_rtx[MAX_RELOADS];
        !          4686:   char save_reload_inherited[MAX_RELOADS];
        !          4687:   rtx save_reload_inheritance_insn[MAX_RELOADS];
        !          4688:   rtx save_reload_override_in[MAX_RELOADS];
        !          4689:   int save_reload_spill_index[MAX_RELOADS];
        !          4690:   HARD_REG_SET save_reload_reg_used;
        !          4691:   HARD_REG_SET save_reload_reg_used_in_input_addr[MAX_RECOG_OPERANDS];
        !          4692:   HARD_REG_SET save_reload_reg_used_in_output_addr[MAX_RECOG_OPERANDS];
        !          4693:   HARD_REG_SET save_reload_reg_used_in_input[MAX_RECOG_OPERANDS];
        !          4694:   HARD_REG_SET save_reload_reg_used_in_output[MAX_RECOG_OPERANDS];
        !          4695:   HARD_REG_SET save_reload_reg_used_in_op_addr;
        !          4696:   HARD_REG_SET save_reload_reg_used_in_insn;
        !          4697:   HARD_REG_SET save_reload_reg_used_in_other_addr;
        !          4698:   HARD_REG_SET save_reload_reg_used_at_all;
        !          4699: 
        !          4700:   bzero (reload_inherited, MAX_RELOADS);
        !          4701:   bzero (reload_inheritance_insn, MAX_RELOADS * sizeof (rtx));
        !          4702:   bzero (reload_override_in, MAX_RELOADS * sizeof (rtx));
        !          4703: 
        !          4704:   CLEAR_HARD_REG_SET (reload_reg_used);
        !          4705:   CLEAR_HARD_REG_SET (reload_reg_used_at_all);
        !          4706:   CLEAR_HARD_REG_SET (reload_reg_used_in_op_addr);
        !          4707:   CLEAR_HARD_REG_SET (reload_reg_used_in_insn);
        !          4708:   CLEAR_HARD_REG_SET (reload_reg_used_in_other_addr);
        !          4709: 
        !          4710:   for (i = 0; i < reload_n_operands; i++)
        !          4711:     {
        !          4712:       CLEAR_HARD_REG_SET (reload_reg_used_in_output[i]);
        !          4713:       CLEAR_HARD_REG_SET (reload_reg_used_in_input[i]);
        !          4714:       CLEAR_HARD_REG_SET (reload_reg_used_in_input_addr[i]);
        !          4715:       CLEAR_HARD_REG_SET (reload_reg_used_in_output_addr[i]);
        !          4716:     }
        !          4717: 
        !          4718: #ifdef SMALL_REGISTER_CLASSES
        !          4719:   /* Don't bother with avoiding the return reg
        !          4720:      if we have no mandatory reload that could use it.  */
        !          4721:   if (avoid_return_reg)
        !          4722:     {
        !          4723:       int do_avoid = 0;
        !          4724:       int regno = REGNO (avoid_return_reg);
        !          4725:       int nregs
        !          4726:        = HARD_REGNO_NREGS (regno, GET_MODE (avoid_return_reg));
        !          4727:       int r;
        !          4728: 
        !          4729:       for (r = regno; r < regno + nregs; r++)
        !          4730:        if (spill_reg_order[r] >= 0)
        !          4731:          for (j = 0; j < n_reloads; j++)
        !          4732:            if (!reload_optional[j] && reload_reg_rtx[j] == 0
        !          4733:                && (reload_in[j] != 0 || reload_out[j] != 0
        !          4734:                    || reload_secondary_p[j])
        !          4735:                &&
        !          4736:                TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[j]], r))
        !          4737:              do_avoid = 1;
        !          4738:       if (!do_avoid)
        !          4739:        avoid_return_reg = 0;
        !          4740:     }
        !          4741: #endif /* SMALL_REGISTER_CLASSES */
        !          4742: 
        !          4743: #if 0  /* Not needed, now that we can always retry without inheritance.  */
        !          4744:   /* See if we have more mandatory reloads than spill regs.
        !          4745:      If so, then we cannot risk optimizations that could prevent
        !          4746:      reloads from sharing one spill register.
        !          4747: 
        !          4748:      Since we will try finding a better register than reload_reg_rtx
        !          4749:      unless it is equal to reload_in or reload_out, count such reloads.  */
        !          4750: 
        !          4751:   {
        !          4752:     int tem = 0;
        !          4753: #ifdef SMALL_REGISTER_CLASSES
        !          4754:     int tem = (avoid_return_reg != 0);
        !          4755: #endif
        !          4756:     for (j = 0; j < n_reloads; j++)
        !          4757:       if (! reload_optional[j]
        !          4758:          && (reload_in[j] != 0 || reload_out[j] != 0 || reload_secondary_p[j])
        !          4759:          && (reload_reg_rtx[j] == 0
        !          4760:              || (! rtx_equal_p (reload_reg_rtx[j], reload_in[j])
        !          4761:                  && ! rtx_equal_p (reload_reg_rtx[j], reload_out[j]))))
        !          4762:        tem++;
        !          4763:     if (tem > n_spills)
        !          4764:       must_reuse = 1;
        !          4765:   }
        !          4766: #endif
        !          4767: 
        !          4768: #ifdef SMALL_REGISTER_CLASSES
        !          4769:   /* Don't use the subroutine call return reg for a reload
        !          4770:      if we are supposed to avoid it.  */
        !          4771:   if (avoid_return_reg)
        !          4772:     {
        !          4773:       int regno = REGNO (avoid_return_reg);
        !          4774:       int nregs
        !          4775:        = HARD_REGNO_NREGS (regno, GET_MODE (avoid_return_reg));
        !          4776:       int r;
        !          4777: 
        !          4778:       for (r = regno; r < regno + nregs; r++)
        !          4779:        if (spill_reg_order[r] >= 0)
        !          4780:          SET_HARD_REG_BIT (reload_reg_used, r);
        !          4781:     }
        !          4782: #endif /* SMALL_REGISTER_CLASSES */
        !          4783: 
        !          4784:   /* In order to be certain of getting the registers we need,
        !          4785:      we must sort the reloads into order of increasing register class.
        !          4786:      Then our grabbing of reload registers will parallel the process
        !          4787:      that provided the reload registers.
        !          4788: 
        !          4789:      Also note whether any of the reloads wants a consecutive group of regs.
        !          4790:      If so, record the maximum size of the group desired and what
        !          4791:      register class contains all the groups needed by this insn.  */
        !          4792: 
        !          4793:   for (j = 0; j < n_reloads; j++)
        !          4794:     {
        !          4795:       reload_order[j] = j;
        !          4796:       reload_spill_index[j] = -1;
        !          4797: 
        !          4798:       reload_mode[j]
        !          4799:        = (reload_inmode[j] == VOIDmode
        !          4800:           || (GET_MODE_SIZE (reload_outmode[j])
        !          4801:               > GET_MODE_SIZE (reload_inmode[j])))
        !          4802:          ? reload_outmode[j] : reload_inmode[j];
        !          4803: 
        !          4804:       reload_nregs[j] = CLASS_MAX_NREGS (reload_reg_class[j], reload_mode[j]);
        !          4805: 
        !          4806:       if (reload_nregs[j] > 1)
        !          4807:        {
        !          4808:          max_group_size = MAX (reload_nregs[j], max_group_size);
        !          4809:          group_class = reg_class_superunion[(int)reload_reg_class[j]][(int)group_class];
        !          4810:        }
        !          4811: 
        !          4812:       /* If we have already decided to use a certain register,
        !          4813:         don't use it in another way.  */
        !          4814:       if (reload_reg_rtx[j])
        !          4815:        mark_reload_reg_in_use (REGNO (reload_reg_rtx[j]), reload_opnum[j],
        !          4816:                                reload_when_needed[j], reload_mode[j]);
        !          4817:     }
        !          4818: 
        !          4819:   if (n_reloads > 1)
        !          4820:     qsort (reload_order, n_reloads, sizeof (short), reload_reg_class_lower);
        !          4821: 
        !          4822:   bcopy (reload_reg_rtx, save_reload_reg_rtx, sizeof reload_reg_rtx);
        !          4823:   bcopy (reload_inherited, save_reload_inherited, sizeof reload_inherited);
        !          4824:   bcopy (reload_inheritance_insn, save_reload_inheritance_insn,
        !          4825:         sizeof reload_inheritance_insn);
        !          4826:   bcopy (reload_override_in, save_reload_override_in,
        !          4827:         sizeof reload_override_in);
        !          4828:   bcopy (reload_spill_index, save_reload_spill_index,
        !          4829:         sizeof reload_spill_index);
        !          4830:   COPY_HARD_REG_SET (save_reload_reg_used, reload_reg_used);
        !          4831:   COPY_HARD_REG_SET (save_reload_reg_used_at_all, reload_reg_used_at_all);
        !          4832:   COPY_HARD_REG_SET (save_reload_reg_used_in_op_addr,
        !          4833:                     reload_reg_used_in_op_addr);
        !          4834:   COPY_HARD_REG_SET (save_reload_reg_used_in_insn,
        !          4835:                     reload_reg_used_in_insn);
        !          4836:   COPY_HARD_REG_SET (save_reload_reg_used_in_other_addr,
        !          4837:                     reload_reg_used_in_other_addr);
        !          4838: 
        !          4839:   for (i = 0; i < reload_n_operands; i++)
        !          4840:     {
        !          4841:       COPY_HARD_REG_SET (save_reload_reg_used_in_output[i],
        !          4842:                         reload_reg_used_in_output[i]);
        !          4843:       COPY_HARD_REG_SET (save_reload_reg_used_in_input[i],
        !          4844:                         reload_reg_used_in_input[i]);
        !          4845:       COPY_HARD_REG_SET (save_reload_reg_used_in_input_addr[i],
        !          4846:                         reload_reg_used_in_input_addr[i]);
        !          4847:       COPY_HARD_REG_SET (save_reload_reg_used_in_output_addr[i],
        !          4848:                         reload_reg_used_in_output_addr[i]);
        !          4849:     }
        !          4850: 
        !          4851:   /* If -O, try first with inheritance, then turning it off.
        !          4852:      If not -O, don't do inheritance.
        !          4853:      Using inheritance when not optimizing leads to paradoxes
        !          4854:      with fp on the 68k: fp numbers (not NaNs) fail to be equal to themselves
        !          4855:      because one side of the comparison might be inherited.  */
        !          4856: 
        !          4857:   for (inheritance = optimize > 0; inheritance >= 0; inheritance--)
        !          4858:     {
        !          4859:       /* Process the reloads in order of preference just found.
        !          4860:         Beyond this point, subregs can be found in reload_reg_rtx.
        !          4861: 
        !          4862:         This used to look for an existing reloaded home for all
        !          4863:         of the reloads, and only then perform any new reloads.
        !          4864:         But that could lose if the reloads were done out of reg-class order
        !          4865:         because a later reload with a looser constraint might have an old
        !          4866:         home in a register needed by an earlier reload with a tighter constraint.
        !          4867: 
        !          4868:         To solve this, we make two passes over the reloads, in the order
        !          4869:         described above.  In the first pass we try to inherit a reload
        !          4870:         from a previous insn.  If there is a later reload that needs a
        !          4871:         class that is a proper subset of the class being processed, we must
        !          4872:         also allocate a spill register during the first pass.
        !          4873: 
        !          4874:         Then make a second pass over the reloads to allocate any reloads
        !          4875:         that haven't been given registers yet.  */
        !          4876: 
        !          4877:       CLEAR_HARD_REG_SET (reload_reg_used_for_inherit);
        !          4878: 
        !          4879:       for (j = 0; j < n_reloads; j++)
        !          4880:        {
        !          4881:          register int r = reload_order[j];
        !          4882: 
        !          4883:          /* Ignore reloads that got marked inoperative.  */
        !          4884:          if (reload_out[r] == 0 && reload_in[r] == 0 && ! reload_secondary_p[r])
        !          4885:            continue;
        !          4886: 
        !          4887:          /* If find_reloads chose a to use reload_in or reload_out as a reload
        !          4888:             register, we don't need to chose one.  Otherwise, try even if it found
        !          4889:             one since we might save an insn if we find the value lying around.  */
        !          4890:          if (reload_in[r] != 0 && reload_reg_rtx[r] != 0
        !          4891:              && (rtx_equal_p (reload_in[r], reload_reg_rtx[r])
        !          4892:                  || rtx_equal_p (reload_out[r], reload_reg_rtx[r])))
        !          4893:            continue;
        !          4894: 
        !          4895: #if 0 /* No longer needed for correct operation.
        !          4896:         It might give better code, or might not; worth an experiment?  */
        !          4897:          /* If this is an optional reload, we can't inherit from earlier insns
        !          4898:             until we are sure that any non-optional reloads have been allocated.
        !          4899:             The following code takes advantage of the fact that optional reloads
        !          4900:             are at the end of reload_order.  */
        !          4901:          if (reload_optional[r] != 0)
        !          4902:            for (i = 0; i < j; i++)
        !          4903:              if ((reload_out[reload_order[i]] != 0
        !          4904:                   || reload_in[reload_order[i]] != 0
        !          4905:                   || reload_secondary_p[reload_order[i]])
        !          4906:                  && ! reload_optional[reload_order[i]]
        !          4907:                  && reload_reg_rtx[reload_order[i]] == 0)
        !          4908:                allocate_reload_reg (reload_order[i], insn, 0, inheritance);
        !          4909: #endif
        !          4910: 
        !          4911:          /* First see if this pseudo is already available as reloaded
        !          4912:             for a previous insn.  We cannot try to inherit for reloads
        !          4913:             that are smaller than the maximum number of registers needed
        !          4914:             for groups unless the register we would allocate cannot be used
        !          4915:             for the groups.
        !          4916: 
        !          4917:             We could check here to see if this is a secondary reload for
        !          4918:             an object that is already in a register of the desired class.
        !          4919:             This would avoid the need for the secondary reload register.
        !          4920:             But this is complex because we can't easily determine what
        !          4921:             objects might want to be loaded via this reload.  So let a register
        !          4922:             be allocated here.  In `emit_reload_insns' we suppress one of the
        !          4923:             loads in the case described above.  */
        !          4924: 
        !          4925:          if (inheritance)
        !          4926:            {
        !          4927:              register int regno = -1;
        !          4928:              enum machine_mode mode;
        !          4929: 
        !          4930:              if (reload_in[r] == 0)
        !          4931:                ;
        !          4932:              else if (GET_CODE (reload_in[r]) == REG)
        !          4933:                {
        !          4934:                  regno = REGNO (reload_in[r]);
        !          4935:                  mode = GET_MODE (reload_in[r]);
        !          4936:                }
        !          4937:              else if (GET_CODE (reload_in_reg[r]) == REG)
        !          4938:                {
        !          4939:                  regno = REGNO (reload_in_reg[r]);
        !          4940:                  mode = GET_MODE (reload_in_reg[r]);
        !          4941:                }
        !          4942: #if 0
        !          4943:              /* This won't work, since REGNO can be a pseudo reg number.
        !          4944:                 Also, it takes much more hair to keep track of all the things
        !          4945:                 that can invalidate an inherited reload of part of a pseudoreg.  */
        !          4946:              else if (GET_CODE (reload_in[r]) == SUBREG
        !          4947:                       && GET_CODE (SUBREG_REG (reload_in[r])) == REG)
        !          4948:                regno = REGNO (SUBREG_REG (reload_in[r])) + SUBREG_WORD (reload_in[r]);
        !          4949: #endif
        !          4950: 
        !          4951:              if (regno >= 0 && reg_last_reload_reg[regno] != 0)
        !          4952:                {
        !          4953:                  i = spill_reg_order[REGNO (reg_last_reload_reg[regno])];
        !          4954: 
        !          4955:                  if (reg_reloaded_contents[i] == regno
        !          4956:                      && (GET_MODE_SIZE (GET_MODE (reg_last_reload_reg[regno]))
        !          4957:                          >= GET_MODE_SIZE (mode))
        !          4958:                      && HARD_REGNO_MODE_OK (spill_regs[i], reload_mode[r])
        !          4959:                      && TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]],
        !          4960:                                            spill_regs[i])
        !          4961:                      && (reload_nregs[r] == max_group_size
        !          4962:                          || ! TEST_HARD_REG_BIT (reg_class_contents[(int) group_class],
        !          4963:                                                  spill_regs[i]))
        !          4964:                      && reload_reg_free_p (spill_regs[i], reload_opnum[r],
        !          4965:                                            reload_when_needed[r])
        !          4966:                      && reload_reg_free_before_p (spill_regs[i],
        !          4967:                                                   reload_opnum[r],
        !          4968:                                                   reload_when_needed[r]))
        !          4969:                    {
        !          4970:                      /* If a group is needed, verify that all the subsequent
        !          4971:                         registers still have their values intact. */
        !          4972:                      int nr
        !          4973:                        = HARD_REGNO_NREGS (spill_regs[i], reload_mode[r]);
        !          4974:                      int k;
        !          4975: 
        !          4976:                      for (k = 1; k < nr; k++)
        !          4977:                        if (reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]]
        !          4978:                            != regno)
        !          4979:                          break;
        !          4980: 
        !          4981:                      if (k == nr)
        !          4982:                        {
        !          4983:                          int i1;
        !          4984: 
        !          4985:                          /* We found a register that contains the
        !          4986:                             value we need.  If this register is the
        !          4987:                             same as an `earlyclobber' operand of the
        !          4988:                             current insn, just mark it as a place to
        !          4989:                             reload from since we can't use it as the
        !          4990:                             reload register itself.  */
        !          4991: 
        !          4992:                          for (i1 = 0; i1 < n_earlyclobbers; i1++)
        !          4993:                            if (reg_overlap_mentioned_for_reload_p
        !          4994:                                (reg_last_reload_reg[regno],
        !          4995:                                 reload_earlyclobbers[i1]))
        !          4996:                              break;
        !          4997: 
        !          4998:                          if (i1 != n_earlyclobbers
        !          4999:                              /* Don't really use the inherited spill reg
        !          5000:                                 if we need it wider than we've got it.  */
        !          5001:                              || (GET_MODE_SIZE (reload_mode[r])
        !          5002:                                  > GET_MODE_SIZE (mode)))
        !          5003:                            reload_override_in[r] = reg_last_reload_reg[regno];
        !          5004:                          else
        !          5005:                            {
        !          5006:                              int k;
        !          5007:                              /* We can use this as a reload reg.  */
        !          5008:                              /* Mark the register as in use for this part of
        !          5009:                                 the insn.  */
        !          5010:                              mark_reload_reg_in_use (spill_regs[i],
        !          5011:                                                      reload_opnum[r],
        !          5012:                                                      reload_when_needed[r],
        !          5013:                                                      reload_mode[r]);
        !          5014:                              reload_reg_rtx[r] = reg_last_reload_reg[regno];
        !          5015:                              reload_inherited[r] = 1;
        !          5016:                              reload_inheritance_insn[r]
        !          5017:                                = reg_reloaded_insn[i];
        !          5018:                              reload_spill_index[r] = i;
        !          5019:                              for (k = 0; k < nr; k++)
        !          5020:                                SET_HARD_REG_BIT (reload_reg_used_for_inherit,
        !          5021:                                                  spill_regs[i + k]);
        !          5022:                            }
        !          5023:                        }
        !          5024:                    }
        !          5025:                }
        !          5026:            }
        !          5027: 
        !          5028:          /* Here's another way to see if the value is already lying around.  */
        !          5029:          if (inheritance
        !          5030:              && reload_in[r] != 0
        !          5031:              && ! reload_inherited[r]
        !          5032:              && reload_out[r] == 0
        !          5033:              && (CONSTANT_P (reload_in[r])
        !          5034:                  || GET_CODE (reload_in[r]) == PLUS
        !          5035:                  || GET_CODE (reload_in[r]) == REG
        !          5036:                  || GET_CODE (reload_in[r]) == MEM)
        !          5037:              && (reload_nregs[r] == max_group_size
        !          5038:                  || ! reg_classes_intersect_p (reload_reg_class[r], group_class)))
        !          5039:            {
        !          5040:              register rtx equiv
        !          5041:                = find_equiv_reg (reload_in[r], insn, reload_reg_class[r],
        !          5042:                                  -1, NULL_PTR, 0, reload_mode[r]);
        !          5043:              int regno;
        !          5044: 
        !          5045:              if (equiv != 0)
        !          5046:                {
        !          5047:                  if (GET_CODE (equiv) == REG)
        !          5048:                    regno = REGNO (equiv);
        !          5049:                  else if (GET_CODE (equiv) == SUBREG)
        !          5050:                    {
        !          5051:                      regno = REGNO (SUBREG_REG (equiv));
        !          5052:                      if (regno < FIRST_PSEUDO_REGISTER)
        !          5053:                        regno += SUBREG_WORD (equiv);
        !          5054:                    }
        !          5055:                  else
        !          5056:                    abort ();
        !          5057:                }
        !          5058: 
        !          5059:              /* If we found a spill reg, reject it unless it is free
        !          5060:                 and of the desired class.  */
        !          5061:              if (equiv != 0
        !          5062:                  && ((spill_reg_order[regno] >= 0
        !          5063:                       && ! reload_reg_free_before_p (regno, reload_opnum[r],
        !          5064:                                                      reload_when_needed[r]))
        !          5065:                      || ! TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]],
        !          5066:                                              regno)))
        !          5067:                equiv = 0;
        !          5068: 
        !          5069:              if (equiv != 0 && TEST_HARD_REG_BIT (reload_reg_used_at_all, regno))
        !          5070:                equiv = 0;
        !          5071: 
        !          5072:              if (equiv != 0 && ! HARD_REGNO_MODE_OK (regno, reload_mode[r]))
        !          5073:                equiv = 0;
        !          5074: 
        !          5075:              /* We found a register that contains the value we need.
        !          5076:                 If this register is the same as an `earlyclobber' operand
        !          5077:                 of the current insn, just mark it as a place to reload from
        !          5078:                 since we can't use it as the reload register itself.  */
        !          5079: 
        !          5080:              if (equiv != 0)
        !          5081:                for (i = 0; i < n_earlyclobbers; i++)
        !          5082:                  if (reg_overlap_mentioned_for_reload_p (equiv,
        !          5083:                                                          reload_earlyclobbers[i]))
        !          5084:                    {
        !          5085:                      reload_override_in[r] = equiv;
        !          5086:                      equiv = 0;
        !          5087:                      break;
        !          5088:                    }
        !          5089: 
        !          5090:              /* JRV: If the equiv register we have found is explicitly
        !          5091:                 clobbered in the current insn, mark but don't use, as above. */
        !          5092: 
        !          5093:              if (equiv != 0 && regno_clobbered_p (regno, insn))
        !          5094:                {
        !          5095:                  reload_override_in[r] = equiv;
        !          5096:                  equiv = 0;
        !          5097:                }
        !          5098: 
        !          5099:              /* If we found an equivalent reg, say no code need be generated
        !          5100:                 to load it, and use it as our reload reg.  */
        !          5101:              if (equiv != 0 && regno != HARD_FRAME_POINTER_REGNUM)
        !          5102:                {
        !          5103:                  reload_reg_rtx[r] = equiv;
        !          5104:                  reload_inherited[r] = 1;
        !          5105:                  /* If it is a spill reg,
        !          5106:                     mark the spill reg as in use for this insn.  */
        !          5107:                  i = spill_reg_order[regno];
        !          5108:                  if (i >= 0)
        !          5109:                    {
        !          5110:                      int nr = HARD_REGNO_NREGS (regno, reload_mode[r]);
        !          5111:                      int k;
        !          5112:                      mark_reload_reg_in_use (regno, reload_opnum[r],
        !          5113:                                              reload_when_needed[r],
        !          5114:                                              reload_mode[r]);
        !          5115:                      for (k = 0; k < nr; k++)
        !          5116:                        SET_HARD_REG_BIT (reload_reg_used_for_inherit, regno + k);
        !          5117:                    }
        !          5118:                }
        !          5119:            }
        !          5120: 
        !          5121:          /* If we found a register to use already, or if this is an optional
        !          5122:             reload, we are done.  */
        !          5123:          if (reload_reg_rtx[r] != 0 || reload_optional[r] != 0)
        !          5124:            continue;
        !          5125: 
        !          5126: #if 0 /* No longer needed for correct operation.  Might or might not
        !          5127:         give better code on the average.  Want to experiment?  */
        !          5128: 
        !          5129:          /* See if there is a later reload that has a class different from our
        !          5130:             class that intersects our class or that requires less register
        !          5131:             than our reload.  If so, we must allocate a register to this
        !          5132:             reload now, since that reload might inherit a previous reload
        !          5133:             and take the only available register in our class.  Don't do this
        !          5134:             for optional reloads since they will force all previous reloads
        !          5135:             to be allocated.  Also don't do this for reloads that have been
        !          5136:             turned off.  */
        !          5137: 
        !          5138:          for (i = j + 1; i < n_reloads; i++)
        !          5139:            {
        !          5140:              int s = reload_order[i];
        !          5141: 
        !          5142:              if ((reload_in[s] == 0 && reload_out[s] == 0
        !          5143:                   && ! reload_secondary_p[s])
        !          5144:                  || reload_optional[s])
        !          5145:                continue;
        !          5146: 
        !          5147:              if ((reload_reg_class[s] != reload_reg_class[r]
        !          5148:                   && reg_classes_intersect_p (reload_reg_class[r],
        !          5149:                                               reload_reg_class[s]))
        !          5150:                  || reload_nregs[s] < reload_nregs[r])
        !          5151:              break;
        !          5152:            }
        !          5153: 
        !          5154:          if (i == n_reloads)
        !          5155:            continue;
        !          5156: 
        !          5157:          allocate_reload_reg (r, insn, j == n_reloads - 1, inheritance);
        !          5158: #endif
        !          5159:        }
        !          5160: 
        !          5161:       /* Now allocate reload registers for anything non-optional that
        !          5162:         didn't get one yet.  */
        !          5163:       for (j = 0; j < n_reloads; j++)
        !          5164:        {
        !          5165:          register int r = reload_order[j];
        !          5166: 
        !          5167:          /* Ignore reloads that got marked inoperative.  */
        !          5168:          if (reload_out[r] == 0 && reload_in[r] == 0 && ! reload_secondary_p[r])
        !          5169:            continue;
        !          5170: 
        !          5171:          /* Skip reloads that already have a register allocated or are
        !          5172:             optional. */
        !          5173:          if (reload_reg_rtx[r] != 0 || reload_optional[r])
        !          5174:            continue;
        !          5175: 
        !          5176:          if (! allocate_reload_reg (r, insn, j == n_reloads - 1, inheritance))
        !          5177:            break;
        !          5178:        }
        !          5179: 
        !          5180:       /* If that loop got all the way, we have won.  */
        !          5181:       if (j == n_reloads)
        !          5182:        break;
        !          5183: 
        !          5184:     fail:
        !          5185:       /* Loop around and try without any inheritance.  */
        !          5186:       /* First undo everything done by the failed attempt
        !          5187:         to allocate with inheritance.  */
        !          5188:       bcopy (save_reload_reg_rtx, reload_reg_rtx, sizeof reload_reg_rtx);
        !          5189:       bcopy (save_reload_inherited, reload_inherited, sizeof reload_inherited);
        !          5190:       bcopy (save_reload_inheritance_insn, reload_inheritance_insn,
        !          5191:             sizeof reload_inheritance_insn);
        !          5192:       bcopy (save_reload_override_in, reload_override_in,
        !          5193:             sizeof reload_override_in);
        !          5194:       bcopy (save_reload_spill_index, reload_spill_index,
        !          5195:             sizeof reload_spill_index);
        !          5196:       COPY_HARD_REG_SET (reload_reg_used, save_reload_reg_used);
        !          5197:       COPY_HARD_REG_SET (reload_reg_used_at_all, save_reload_reg_used_at_all);
        !          5198:       COPY_HARD_REG_SET (reload_reg_used_in_op_addr,
        !          5199:                         save_reload_reg_used_in_op_addr);
        !          5200:       COPY_HARD_REG_SET (reload_reg_used_in_insn,
        !          5201:                         save_reload_reg_used_in_insn);
        !          5202:       COPY_HARD_REG_SET (reload_reg_used_in_other_addr,
        !          5203:                         save_reload_reg_used_in_other_addr);
        !          5204: 
        !          5205:       for (i = 0; i < reload_n_operands; i++)
        !          5206:        {
        !          5207:          COPY_HARD_REG_SET (reload_reg_used_in_input[i],
        !          5208:                             save_reload_reg_used_in_input[i]);
        !          5209:          COPY_HARD_REG_SET (reload_reg_used_in_output[i],
        !          5210:                             save_reload_reg_used_in_output[i]);
        !          5211:          COPY_HARD_REG_SET (reload_reg_used_in_input_addr[i],
        !          5212:                             save_reload_reg_used_in_input_addr[i]);
        !          5213:          COPY_HARD_REG_SET (reload_reg_used_in_output_addr[i],
        !          5214:                             save_reload_reg_used_in_output_addr[i]);
        !          5215:        }
        !          5216:     }
        !          5217: 
        !          5218:   /* If we thought we could inherit a reload, because it seemed that
        !          5219:      nothing else wanted the same reload register earlier in the insn,
        !          5220:      verify that assumption, now that all reloads have been assigned.  */
        !          5221: 
        !          5222:   for (j = 0; j < n_reloads; j++)
        !          5223:     {
        !          5224:       register int r = reload_order[j];
        !          5225: 
        !          5226:       if (reload_inherited[r] && reload_reg_rtx[r] != 0
        !          5227:          && ! reload_reg_free_before_p (true_regnum (reload_reg_rtx[r]),
        !          5228:                                         reload_opnum[r],
        !          5229:                                         reload_when_needed[r]))
        !          5230:        reload_inherited[r] = 0;
        !          5231: 
        !          5232:       /* If we found a better place to reload from,
        !          5233:         validate it in the same fashion, if it is a reload reg.  */
        !          5234:       if (reload_override_in[r]
        !          5235:          && (GET_CODE (reload_override_in[r]) == REG
        !          5236:              || GET_CODE (reload_override_in[r]) == SUBREG))
        !          5237:        {
        !          5238:          int regno = true_regnum (reload_override_in[r]);
        !          5239:          if (spill_reg_order[regno] >= 0
        !          5240:              && ! reload_reg_free_before_p (regno, reload_opnum[r],
        !          5241:                                             reload_when_needed[r]))
        !          5242:            reload_override_in[r] = 0;
        !          5243:        }
        !          5244:     }
        !          5245: 
        !          5246:   /* Now that reload_override_in is known valid,
        !          5247:      actually override reload_in.  */
        !          5248:   for (j = 0; j < n_reloads; j++)
        !          5249:     if (reload_override_in[j])
        !          5250:       reload_in[j] = reload_override_in[j];
        !          5251: 
        !          5252:   /* If this reload won't be done because it has been cancelled or is
        !          5253:      optional and not inherited, clear reload_reg_rtx so other
        !          5254:      routines (such as subst_reloads) don't get confused.  */
        !          5255:   for (j = 0; j < n_reloads; j++)
        !          5256:     if (reload_reg_rtx[j] != 0
        !          5257:        && ((reload_optional[j] && ! reload_inherited[j])
        !          5258:            || (reload_in[j] == 0 && reload_out[j] == 0
        !          5259:                && ! reload_secondary_p[j])))
        !          5260:       {
        !          5261:        int regno = true_regnum (reload_reg_rtx[j]);
        !          5262: 
        !          5263:        if (spill_reg_order[regno] >= 0)
        !          5264:          clear_reload_reg_in_use (regno, reload_opnum[j],
        !          5265:                                   reload_when_needed[j], reload_mode[j]);
        !          5266:        reload_reg_rtx[j] = 0;
        !          5267:       }
        !          5268: 
        !          5269:   /* Record which pseudos and which spill regs have output reloads.  */
        !          5270:   for (j = 0; j < n_reloads; j++)
        !          5271:     {
        !          5272:       register int r = reload_order[j];
        !          5273: 
        !          5274:       i = reload_spill_index[r];
        !          5275: 
        !          5276:       /* I is nonneg if this reload used one of the spill regs.
        !          5277:         If reload_reg_rtx[r] is 0, this is an optional reload
        !          5278:         that we opted to ignore.  */
        !          5279:       if (reload_out[r] != 0 && GET_CODE (reload_out[r]) == REG
        !          5280:          && reload_reg_rtx[r] != 0)
        !          5281:        {
        !          5282:          register int nregno = REGNO (reload_out[r]);
        !          5283:          int nr = 1;
        !          5284: 
        !          5285:          if (nregno < FIRST_PSEUDO_REGISTER)
        !          5286:            nr = HARD_REGNO_NREGS (nregno, reload_mode[r]);
        !          5287: 
        !          5288:          while (--nr >= 0)
        !          5289:            reg_has_output_reload[nregno + nr] = 1;
        !          5290: 
        !          5291:          if (i >= 0)
        !          5292:            {
        !          5293:              nr = HARD_REGNO_NREGS (spill_regs[i], reload_mode[r]);
        !          5294:              while (--nr >= 0)
        !          5295:                SET_HARD_REG_BIT (reg_is_output_reload, spill_regs[i] + nr);
        !          5296:            }
        !          5297: 
        !          5298:          if (reload_when_needed[r] != RELOAD_OTHER
        !          5299:              && reload_when_needed[r] != RELOAD_FOR_OUTPUT
        !          5300:              && reload_when_needed[r] != RELOAD_FOR_INSN)
        !          5301:            abort ();
        !          5302:        }
        !          5303:     }
        !          5304: }
        !          5305: 
        !          5306: /* If SMALL_REGISTER_CLASSES are defined, we may not have merged two
        !          5307:    reloads of the same item for fear that we might not have enough reload
        !          5308:    registers. However, normally they will get the same reload register
        !          5309:    and hence actually need not be loaded twice.  
        !          5310: 
        !          5311:    Here we check for the most common case of this phenomenon: when we have
        !          5312:    a number of reloads for the same object, each of which were allocated
        !          5313:    the same reload_reg_rtx, that reload_reg_rtx is not used for any other
        !          5314:    reload, and is not modified in the insn itself.  If we find such,
        !          5315:    merge all the reloads and set the resulting reload to RELOAD_OTHER.
        !          5316:    This will not increase the number of spill registers needed and will
        !          5317:    prevent redundant code.  */
        !          5318: 
        !          5319: #ifdef SMALL_REGISTER_CLASSES
        !          5320: 
        !          5321: static void
        !          5322: merge_assigned_reloads (insn)
        !          5323:      rtx insn;
        !          5324: {
        !          5325:   int i, j;
        !          5326: 
        !          5327:   /* Scan all the reloads looking for ones that only load values and
        !          5328:      are not already RELOAD_OTHER and ones whose reload_reg_rtx are
        !          5329:      assigned and not modified by INSN.  */
        !          5330: 
        !          5331:   for (i = 0; i < n_reloads; i++)
        !          5332:     {
        !          5333:       if (reload_in[i] == 0 || reload_when_needed[i] == RELOAD_OTHER
        !          5334:          || reload_out[i] != 0 || reload_reg_rtx[i] == 0
        !          5335:          || reg_set_p (reload_reg_rtx[i], insn))
        !          5336:        continue;
        !          5337: 
        !          5338:       /* Look at all other reloads.  Ensure that the only use of this
        !          5339:         reload_reg_rtx is in a reload that just loads the same value
        !          5340:         as we do.  Note that any secondary reloads must be of the identical
        !          5341:         class since the values, modes, and result registers are the
        !          5342:         same, so we need not do anything with any secondary reloads.  */
        !          5343: 
        !          5344:       for (j = 0; j < n_reloads; j++)
        !          5345:        {
        !          5346:          if (i == j || reload_reg_rtx[j] == 0
        !          5347:              || ! reg_overlap_mentioned_p (reload_reg_rtx[j],
        !          5348:                                            reload_reg_rtx[i]))
        !          5349:            continue;
        !          5350: 
        !          5351:          /* If the reload regs aren't exactly the same (e.g, different modes)
        !          5352:             or if the values are different, we can't merge anything with this
        !          5353:             reload register.  */
        !          5354: 
        !          5355:          if (! rtx_equal_p (reload_reg_rtx[i], reload_reg_rtx[j])
        !          5356:              || reload_out[j] != 0 || reload_in[j] == 0
        !          5357:              || ! rtx_equal_p (reload_in[i], reload_in[j]))
        !          5358:            break;
        !          5359:        }
        !          5360: 
        !          5361:       /* If all is OK, merge the reloads.  Only set this to RELOAD_OTHER if
        !          5362:         we, in fact, found any matching reloads.  */
        !          5363: 
        !          5364:       if (j == n_reloads)
        !          5365:        {
        !          5366:          for (j = 0; j < n_reloads; j++)
        !          5367:            if (i != j && reload_reg_rtx[j] != 0
        !          5368:                && rtx_equal_p (reload_reg_rtx[i], reload_reg_rtx[j]))
        !          5369:              {
        !          5370:                reload_when_needed[i] = RELOAD_OTHER;
        !          5371:                reload_in[j] = 0;
        !          5372:                transfer_replacements (i, j);
        !          5373:              }
        !          5374: 
        !          5375:          /* If this is now RELOAD_OTHER, look for any reloads that load
        !          5376:             parts of this operand and set them to RELOAD_FOR_OTHER_ADDRESS
        !          5377:             if they were for inputs, RELOAD_OTHER for outputs.  Note that
        !          5378:             this test is equivalent to looking for reloads for this operand
        !          5379:             number.  */
        !          5380: 
        !          5381:          if (reload_when_needed[i] == RELOAD_OTHER)
        !          5382:            for (j = 0; j < n_reloads; j++)
        !          5383:              if (reload_in[j] != 0
        !          5384:                  && reload_when_needed[i] != RELOAD_OTHER
        !          5385:                  && reg_overlap_mentioned_for_reload_p (reload_in[j],
        !          5386:                                                         reload_in[i]))
        !          5387:                reload_when_needed[j]
        !          5388:                  = reload_when_needed[i] == RELOAD_FOR_INPUT_ADDRESS
        !          5389:                    ? RELOAD_FOR_OTHER_ADDRESS : RELOAD_OTHER;
        !          5390:        }
        !          5391:     }
        !          5392: }          
        !          5393: #endif /* SMALL_RELOAD_CLASSES */
        !          5394: 
        !          5395: /* Output insns to reload values in and out of the chosen reload regs.  */
        !          5396: 
        !          5397: static void
        !          5398: emit_reload_insns (insn)
        !          5399:      rtx insn;
        !          5400: {
        !          5401:   register int j;
        !          5402:   rtx input_reload_insns[MAX_RECOG_OPERANDS];
        !          5403:   rtx other_input_address_reload_insns = 0;
        !          5404:   rtx other_input_reload_insns = 0;
        !          5405:   rtx input_address_reload_insns[MAX_RECOG_OPERANDS];
        !          5406:   rtx output_reload_insns[MAX_RECOG_OPERANDS];
        !          5407:   rtx output_address_reload_insns[MAX_RECOG_OPERANDS];
        !          5408:   rtx operand_reload_insns = 0;
        !          5409:   rtx following_insn = NEXT_INSN (insn);
        !          5410:   rtx before_insn = insn;
        !          5411:   int special;
        !          5412:   /* Values to be put in spill_reg_store are put here first.  */
        !          5413:   rtx new_spill_reg_store[FIRST_PSEUDO_REGISTER];
        !          5414: 
        !          5415:   for (j = 0; j < reload_n_operands; j++)
        !          5416:     input_reload_insns[j] = input_address_reload_insns[j]
        !          5417:       = output_reload_insns[j] = output_address_reload_insns[j] = 0;
        !          5418: 
        !          5419:   /* If this is a CALL_INSN preceded by USE insns, any reload insns
        !          5420:      must go in front of the first USE insn, not in front of INSN.  */
        !          5421: 
        !          5422:   if (GET_CODE (insn) == CALL_INSN && GET_CODE (PREV_INSN (insn)) == INSN
        !          5423:       && GET_CODE (PATTERN (PREV_INSN (insn))) == USE)
        !          5424:     while (GET_CODE (PREV_INSN (before_insn)) == INSN
        !          5425:           && GET_CODE (PATTERN (PREV_INSN (before_insn))) == USE)
        !          5426:       before_insn = PREV_INSN (before_insn);
        !          5427: 
        !          5428:   /* If INSN is followed by any CLOBBER insns made by find_reloads,
        !          5429:      put our reloads after them since they may otherwise be 
        !          5430:      misinterpreted.  */
        !          5431: 
        !          5432:   while (GET_CODE (following_insn) == INSN
        !          5433:         && GET_MODE (following_insn) == DImode
        !          5434:         && GET_CODE (PATTERN (following_insn)) == CLOBBER
        !          5435:         && NEXT_INSN (following_insn) != 0)
        !          5436:     following_insn = NEXT_INSN (following_insn);
        !          5437: 
        !          5438:   /* Now output the instructions to copy the data into and out of the
        !          5439:      reload registers.  Do these in the order that the reloads were reported,
        !          5440:      since reloads of base and index registers precede reloads of operands
        !          5441:      and the operands may need the base and index registers reloaded.  */
        !          5442: 
        !          5443:   for (j = 0; j < n_reloads; j++)
        !          5444:     {
        !          5445:       register rtx old;
        !          5446:       rtx oldequiv_reg = 0;
        !          5447:       rtx store_insn = 0;
        !          5448: 
        !          5449:       old = reload_in[j];
        !          5450:       if (old != 0 && ! reload_inherited[j]
        !          5451:          && ! rtx_equal_p (reload_reg_rtx[j], old)
        !          5452:          && reload_reg_rtx[j] != 0)
        !          5453:        {
        !          5454:          register rtx reloadreg = reload_reg_rtx[j];
        !          5455:          rtx oldequiv = 0;
        !          5456:          enum machine_mode mode;
        !          5457:          rtx *where;
        !          5458: 
        !          5459:          /* Determine the mode to reload in.
        !          5460:             This is very tricky because we have three to choose from.
        !          5461:             There is the mode the insn operand wants (reload_inmode[J]).
        !          5462:             There is the mode of the reload register RELOADREG.
        !          5463:             There is the intrinsic mode of the operand, which we could find
        !          5464:             by stripping some SUBREGs.
        !          5465:             It turns out that RELOADREG's mode is irrelevant:
        !          5466:             we can change that arbitrarily.
        !          5467: 
        !          5468:             Consider (SUBREG:SI foo:QI) as an operand that must be SImode;
        !          5469:             then the reload reg may not support QImode moves, so use SImode.
        !          5470:             If foo is in memory due to spilling a pseudo reg, this is safe,
        !          5471:             because the QImode value is in the least significant part of a
        !          5472:             slot big enough for a SImode.  If foo is some other sort of
        !          5473:             memory reference, then it is impossible to reload this case,
        !          5474:             so previous passes had better make sure this never happens.
        !          5475: 
        !          5476:             Then consider a one-word union which has SImode and one of its
        !          5477:             members is a float, being fetched as (SUBREG:SF union:SI).
        !          5478:             We must fetch that as SFmode because we could be loading into
        !          5479:             a float-only register.  In this case OLD's mode is correct.
        !          5480: 
        !          5481:             Consider an immediate integer: it has VOIDmode.  Here we need
        !          5482:             to get a mode from something else.
        !          5483: 
        !          5484:             In some cases, there is a fourth mode, the operand's
        !          5485:             containing mode.  If the insn specifies a containing mode for
        !          5486:             this operand, it overrides all others.
        !          5487: 
        !          5488:             I am not sure whether the algorithm here is always right,
        !          5489:             but it does the right things in those cases.  */
        !          5490: 
        !          5491:          mode = GET_MODE (old);
        !          5492:          if (mode == VOIDmode)
        !          5493:            mode = reload_inmode[j];
        !          5494: 
        !          5495: #ifdef SECONDARY_INPUT_RELOAD_CLASS
        !          5496:          /* If we need a secondary register for this operation, see if
        !          5497:             the value is already in a register in that class.  Don't
        !          5498:             do this if the secondary register will be used as a scratch
        !          5499:             register.  */
        !          5500: 
        !          5501:          if (reload_secondary_reload[j] >= 0
        !          5502:              && reload_secondary_icode[j] == CODE_FOR_nothing
        !          5503:              && optimize)
        !          5504:            oldequiv
        !          5505:              = find_equiv_reg (old, insn,
        !          5506:                                reload_reg_class[reload_secondary_reload[j]],
        !          5507:                                -1, NULL_PTR, 0, mode);
        !          5508: #endif
        !          5509: 
        !          5510:          /* If reloading from memory, see if there is a register
        !          5511:             that already holds the same value.  If so, reload from there.
        !          5512:             We can pass 0 as the reload_reg_p argument because
        !          5513:             any other reload has either already been emitted,
        !          5514:             in which case find_equiv_reg will see the reload-insn,
        !          5515:             or has yet to be emitted, in which case it doesn't matter
        !          5516:             because we will use this equiv reg right away.  */
        !          5517: 
        !          5518:          if (oldequiv == 0 && optimize
        !          5519:              && (GET_CODE (old) == MEM
        !          5520:                  || (GET_CODE (old) == REG
        !          5521:                      && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          5522:                      && reg_renumber[REGNO (old)] < 0)))
        !          5523:            oldequiv = find_equiv_reg (old, insn, ALL_REGS,
        !          5524:                                       -1, NULL_PTR, 0, mode);
        !          5525: 
        !          5526:          if (oldequiv)
        !          5527:            {
        !          5528:              int regno = true_regnum (oldequiv);
        !          5529: 
        !          5530:              /* If OLDEQUIV is a spill register, don't use it for this
        !          5531:                 if any other reload needs it at an earlier stage of this insn
        !          5532:                 or at this stage.  */
        !          5533:              if (spill_reg_order[regno] >= 0
        !          5534:                  && (! reload_reg_free_p (regno, reload_opnum[j],
        !          5535:                                           reload_when_needed[j])
        !          5536:                      || ! reload_reg_free_before_p (regno, reload_opnum[j],
        !          5537:                                                     reload_when_needed[j])))
        !          5538:                oldequiv = 0;
        !          5539: 
        !          5540:              /* If OLDEQUIV is not a spill register,
        !          5541:                 don't use it if any other reload wants it.  */
        !          5542:              if (spill_reg_order[regno] < 0)
        !          5543:                {
        !          5544:                  int k;
        !          5545:                  for (k = 0; k < n_reloads; k++)
        !          5546:                    if (reload_reg_rtx[k] != 0 && k != j
        !          5547:                        && reg_overlap_mentioned_for_reload_p (reload_reg_rtx[k],
        !          5548:                                                               oldequiv))
        !          5549:                      {
        !          5550:                        oldequiv = 0;
        !          5551:                        break;
        !          5552:                      }
        !          5553:                }
        !          5554: 
        !          5555:              /* If it is no cheaper to copy from OLDEQUIV into the
        !          5556:                 reload register than it would be to move from memory,
        !          5557:                 don't use it. Likewise, if we need a secondary register
        !          5558:                 or memory.   */
        !          5559: 
        !          5560:              if (oldequiv != 0
        !          5561:                  && ((REGNO_REG_CLASS (regno) != reload_reg_class[j]
        !          5562:                       && (REGISTER_MOVE_COST (REGNO_REG_CLASS (regno),
        !          5563:                                               reload_reg_class[j])
        !          5564:                           >= MEMORY_MOVE_COST (mode)))
        !          5565: #ifdef SECONDARY_INPUT_RELOAD_CLASS
        !          5566:                      || (SECONDARY_INPUT_RELOAD_CLASS (reload_reg_class[j],
        !          5567:                                                        mode, oldequiv)
        !          5568:                          != NO_REGS)
        !          5569: #endif
        !          5570: #ifdef SECONDARY_MEMORY_NEEDED
        !          5571:                      || SECONDARY_MEMORY_NEEDED (reload_reg_class[j],
        !          5572:                                                  REGNO_REG_CLASS (regno),
        !          5573:                                                  mode)
        !          5574: #endif
        !          5575:                      ))
        !          5576:                oldequiv = 0;
        !          5577:            }
        !          5578: 
        !          5579:          if (oldequiv == 0)
        !          5580:            oldequiv = old;
        !          5581:          else if (GET_CODE (oldequiv) == REG)
        !          5582:            oldequiv_reg = oldequiv;
        !          5583:          else if (GET_CODE (oldequiv) == SUBREG)
        !          5584:            oldequiv_reg = SUBREG_REG (oldequiv);
        !          5585: 
        !          5586:          /* Encapsulate both RELOADREG and OLDEQUIV into that mode,
        !          5587:             then load RELOADREG from OLDEQUIV.  Note that we cannot use
        !          5588:             gen_lowpart_common since it can do the wrong thing when
        !          5589:             RELOADREG has a multi-word mode.  Note that RELOADREG
        !          5590:             must always be a REG here.  */
        !          5591: 
        !          5592:          if (GET_MODE (reloadreg) != mode)
        !          5593:            reloadreg = gen_rtx (REG, mode, REGNO (reloadreg));
        !          5594:          while (GET_CODE (oldequiv) == SUBREG && GET_MODE (oldequiv) != mode)
        !          5595:            oldequiv = SUBREG_REG (oldequiv);
        !          5596:          if (GET_MODE (oldequiv) != VOIDmode
        !          5597:              && mode != GET_MODE (oldequiv))
        !          5598:            oldequiv = gen_rtx (SUBREG, mode, oldequiv, 0);
        !          5599: 
        !          5600:          /* Switch to the right place to emit the reload insns.  */
        !          5601:          switch (reload_when_needed[j])
        !          5602:            {
        !          5603:            case RELOAD_OTHER:
        !          5604:              where = &other_input_reload_insns;
        !          5605:              break;
        !          5606:            case RELOAD_FOR_INPUT:
        !          5607:              where = &input_reload_insns[reload_opnum[j]];
        !          5608:              break;
        !          5609:            case RELOAD_FOR_INPUT_ADDRESS:
        !          5610:              where = &input_address_reload_insns[reload_opnum[j]];
        !          5611:              break;
        !          5612:            case RELOAD_FOR_OUTPUT_ADDRESS:
        !          5613:              where = &output_address_reload_insns[reload_opnum[j]];
        !          5614:              break;
        !          5615:            case RELOAD_FOR_OPERAND_ADDRESS:
        !          5616:              where = &operand_reload_insns;
        !          5617:              break;
        !          5618:            case RELOAD_FOR_OTHER_ADDRESS:
        !          5619:              where = &other_input_address_reload_insns;
        !          5620:              break;
        !          5621:            default:
        !          5622:              abort ();
        !          5623:            }
        !          5624: 
        !          5625:          push_to_sequence (*where);
        !          5626:          special = 0;
        !          5627: 
        !          5628:          /* Auto-increment addresses must be reloaded in a special way.  */
        !          5629:          if (GET_CODE (oldequiv) == POST_INC
        !          5630:              || GET_CODE (oldequiv) == POST_DEC
        !          5631:              || GET_CODE (oldequiv) == PRE_INC
        !          5632:              || GET_CODE (oldequiv) == PRE_DEC)
        !          5633:            {
        !          5634:              /* We are not going to bother supporting the case where a
        !          5635:                 incremented register can't be copied directly from
        !          5636:                 OLDEQUIV since this seems highly unlikely.  */
        !          5637:              if (reload_secondary_reload[j] >= 0)
        !          5638:                abort ();
        !          5639:              /* Prevent normal processing of this reload.  */
        !          5640:              special = 1;
        !          5641:              /* Output a special code sequence for this case.  */
        !          5642:              inc_for_reload (reloadreg, oldequiv, reload_inc[j]);
        !          5643:            }
        !          5644: 
        !          5645:          /* If we are reloading a pseudo-register that was set by the previous
        !          5646:             insn, see if we can get rid of that pseudo-register entirely
        !          5647:             by redirecting the previous insn into our reload register.  */
        !          5648: 
        !          5649:          else if (optimize && GET_CODE (old) == REG
        !          5650:                   && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          5651:                   && dead_or_set_p (insn, old)
        !          5652:                   /* This is unsafe if some other reload
        !          5653:                      uses the same reg first.  */
        !          5654:                   && reload_reg_free_before_p (REGNO (reloadreg),
        !          5655:                                                reload_opnum[j],
        !          5656:                                                reload_when_needed[j]))
        !          5657:            {
        !          5658:              rtx temp = PREV_INSN (insn);
        !          5659:              while (temp && GET_CODE (temp) == NOTE)
        !          5660:                temp = PREV_INSN (temp);
        !          5661:              if (temp
        !          5662:                  && GET_CODE (temp) == INSN
        !          5663:                  && GET_CODE (PATTERN (temp)) == SET
        !          5664:                  && SET_DEST (PATTERN (temp)) == old
        !          5665:                  /* Make sure we can access insn_operand_constraint.  */
        !          5666:                  && asm_noperands (PATTERN (temp)) < 0
        !          5667:                  /* This is unsafe if prev insn rejects our reload reg.  */
        !          5668:                  && constraint_accepts_reg_p (insn_operand_constraint[recog_memoized (temp)][0],
        !          5669:                                               reloadreg)
        !          5670:                  /* This is unsafe if operand occurs more than once in current
        !          5671:                     insn.  Perhaps some occurrences aren't reloaded.  */
        !          5672:                  && count_occurrences (PATTERN (insn), old) == 1
        !          5673:                  /* Don't risk splitting a matching pair of operands.  */
        !          5674:                  && ! reg_mentioned_p (old, SET_SRC (PATTERN (temp))))
        !          5675:                {
        !          5676:                  /* Store into the reload register instead of the pseudo.  */
        !          5677:                  SET_DEST (PATTERN (temp)) = reloadreg;
        !          5678:                  /* If these are the only uses of the pseudo reg,
        !          5679:                     pretend for GDB it lives in the reload reg we used.  */
        !          5680:                  if (reg_n_deaths[REGNO (old)] == 1
        !          5681:                      && reg_n_sets[REGNO (old)] == 1)
        !          5682:                    {
        !          5683:                      reg_renumber[REGNO (old)] = REGNO (reload_reg_rtx[j]);
        !          5684:                      alter_reg (REGNO (old), -1);
        !          5685:                    }
        !          5686:                  special = 1;
        !          5687:                }
        !          5688:            }
        !          5689: 
        !          5690:          /* We can't do that, so output an insn to load RELOADREG.  */
        !          5691: 
        !          5692:          if (! special)
        !          5693:            {
        !          5694: #ifdef SECONDARY_INPUT_RELOAD_CLASS
        !          5695:              rtx second_reload_reg = 0;
        !          5696:              enum insn_code icode;
        !          5697: 
        !          5698:              /* If we have a secondary reload, pick up the secondary register
        !          5699:                 and icode, if any.  If OLDEQUIV and OLD are different or
        !          5700:                 if this is an in-out reload, recompute whether or not we
        !          5701:                 still need a secondary register and what the icode should
        !          5702:                 be.  If we still need a secondary register and the class or
        !          5703:                 icode is different, go back to reloading from OLD if using
        !          5704:                 OLDEQUIV means that we got the wrong type of register.  We
        !          5705:                 cannot have different class or icode due to an in-out reload
        !          5706:                 because we don't make such reloads when both the input and
        !          5707:                 output need secondary reload registers.  */
        !          5708: 
        !          5709:              if (reload_secondary_reload[j] >= 0)
        !          5710:                {
        !          5711:                  int secondary_reload = reload_secondary_reload[j];
        !          5712:                  rtx real_oldequiv = oldequiv;
        !          5713:                  rtx real_old = old;
        !          5714: 
        !          5715:                  /* If OLDEQUIV is a pseudo with a MEM, get the real MEM
        !          5716:                     and similarly for OLD.
        !          5717:                     See comments in find_secondary_reload in reload.c.  */
        !          5718:                  if (GET_CODE (oldequiv) == REG
        !          5719:                      && REGNO (oldequiv) >= FIRST_PSEUDO_REGISTER
        !          5720:                      && reg_equiv_mem[REGNO (oldequiv)] != 0)
        !          5721:                    real_oldequiv = reg_equiv_mem[REGNO (oldequiv)];
        !          5722: 
        !          5723:                  if (GET_CODE (old) == REG
        !          5724:                      && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          5725:                      && reg_equiv_mem[REGNO (old)] != 0)
        !          5726:                    real_old = reg_equiv_mem[REGNO (old)];
        !          5727: 
        !          5728:                  second_reload_reg = reload_reg_rtx[secondary_reload];
        !          5729:                  icode = reload_secondary_icode[j];
        !          5730: 
        !          5731:                  if ((old != oldequiv && ! rtx_equal_p (old, oldequiv))
        !          5732:                      || (reload_in[j] != 0 && reload_out[j] != 0))
        !          5733:                    {
        !          5734:                      enum reg_class new_class
        !          5735:                        = SECONDARY_INPUT_RELOAD_CLASS (reload_reg_class[j],
        !          5736:                                                        mode, real_oldequiv);
        !          5737: 
        !          5738:                      if (new_class == NO_REGS)
        !          5739:                        second_reload_reg = 0;
        !          5740:                      else
        !          5741:                        {
        !          5742:                          enum insn_code new_icode;
        !          5743:                          enum machine_mode new_mode;
        !          5744: 
        !          5745:                          if (! TEST_HARD_REG_BIT (reg_class_contents[(int) new_class],
        !          5746:                                                   REGNO (second_reload_reg)))
        !          5747:                            oldequiv = old, real_oldequiv = real_old;
        !          5748:                          else
        !          5749:                            {
        !          5750:                              new_icode = reload_in_optab[(int) mode];
        !          5751:                              if (new_icode != CODE_FOR_nothing
        !          5752:                                  && ((insn_operand_predicate[(int) new_icode][0]
        !          5753:                                       && ! ((*insn_operand_predicate[(int) new_icode][0])
        !          5754:                                             (reloadreg, mode)))
        !          5755:                                      || (insn_operand_predicate[(int) new_icode][1]
        !          5756:                                          && ! ((*insn_operand_predicate[(int) new_icode][1])
        !          5757:                                                (real_oldequiv, mode)))))
        !          5758:                                new_icode = CODE_FOR_nothing;
        !          5759: 
        !          5760:                              if (new_icode == CODE_FOR_nothing)
        !          5761:                                new_mode = mode;
        !          5762:                              else
        !          5763:                                new_mode = insn_operand_mode[(int) new_icode][2];
        !          5764: 
        !          5765:                              if (GET_MODE (second_reload_reg) != new_mode)
        !          5766:                                {
        !          5767:                                  if (!HARD_REGNO_MODE_OK (REGNO (second_reload_reg),
        !          5768:                                                           new_mode))
        !          5769:                                    oldequiv = old, real_oldequiv = real_old;
        !          5770:                                  else
        !          5771:                                    second_reload_reg
        !          5772:                                      = gen_rtx (REG, new_mode,
        !          5773:                                                 REGNO (second_reload_reg));
        !          5774:                                }
        !          5775:                            }
        !          5776:                        }
        !          5777:                    }
        !          5778: 
        !          5779:                  /* If we still need a secondary reload register, check
        !          5780:                     to see if it is being used as a scratch or intermediate
        !          5781:                     register and generate code appropriately.  If we need
        !          5782:                     a scratch register, use REAL_OLDEQUIV since the form of
        !          5783:                     the insn may depend on the actual address if it is 
        !          5784:                     a MEM.  */
        !          5785: 
        !          5786:                  if (second_reload_reg)
        !          5787:                    {
        !          5788:                      if (icode != CODE_FOR_nothing)
        !          5789:                        {
        !          5790:                          emit_insn (GEN_FCN (icode) (reloadreg, real_oldequiv,
        !          5791:                                                      second_reload_reg));
        !          5792:                          special = 1;
        !          5793:                        }
        !          5794:                      else
        !          5795:                        {
        !          5796:                          /* See if we need a scratch register to load the
        !          5797:                             intermediate register (a tertiary reload).  */
        !          5798:                          enum insn_code tertiary_icode
        !          5799:                            = reload_secondary_icode[secondary_reload];
        !          5800: 
        !          5801:                          if (tertiary_icode != CODE_FOR_nothing)
        !          5802:                            {
        !          5803:                              rtx third_reload_reg
        !          5804:                                = reload_reg_rtx[reload_secondary_reload[secondary_reload]];
        !          5805: 
        !          5806:                              emit_insn ((GEN_FCN (tertiary_icode)
        !          5807:                                          (second_reload_reg, real_oldequiv,
        !          5808:                                           third_reload_reg)));
        !          5809:                            }
        !          5810:                          else
        !          5811:                            gen_input_reload (second_reload_reg, oldequiv,
        !          5812:                                              reload_opnum[j],
        !          5813:                                              reload_when_needed[j]);
        !          5814: 
        !          5815:                          oldequiv = second_reload_reg;
        !          5816:                        }
        !          5817:                    }
        !          5818:                }
        !          5819: #endif
        !          5820: 
        !          5821:              if (! special)
        !          5822:                gen_input_reload (reloadreg, oldequiv, reload_opnum[j],
        !          5823:                                  reload_when_needed[j]);
        !          5824: 
        !          5825: #if defined(SECONDARY_INPUT_RELOAD_CLASS) && defined(PRESERVE_DEATH_INFO_REGNO_P)
        !          5826:              /* We may have to make a REG_DEAD note for the secondary reload
        !          5827:                 register in the insns we just made.  Find the last insn that
        !          5828:                 mentioned the register.  */
        !          5829:              if (! special && second_reload_reg
        !          5830:                  && PRESERVE_DEATH_INFO_REGNO_P (REGNO (second_reload_reg)))
        !          5831:                {
        !          5832:                  rtx prev;
        !          5833: 
        !          5834:                  for (prev = get_last_insn (); prev;
        !          5835:                       prev = PREV_INSN (prev))
        !          5836:                    if (GET_RTX_CLASS (GET_CODE (prev) == 'i')
        !          5837:                        && reg_overlap_mentioned_for_reload_p (second_reload_reg,
        !          5838:                                                               PATTERN (prev)))
        !          5839:                      {
        !          5840:                        REG_NOTES (prev) = gen_rtx (EXPR_LIST, REG_DEAD,
        !          5841:                                                    second_reload_reg,
        !          5842:                                                    REG_NOTES (prev));
        !          5843:                        break;
        !          5844:                      }
        !          5845:                }
        !          5846: #endif
        !          5847:            }
        !          5848: 
        !          5849:          /* End this sequence.  */
        !          5850:          *where = get_insns ();
        !          5851:          end_sequence ();
        !          5852:        }
        !          5853: 
        !          5854:       /* Add a note saying the input reload reg
        !          5855:         dies in this insn, if anyone cares.  */
        !          5856: #ifdef PRESERVE_DEATH_INFO_REGNO_P
        !          5857:       if (old != 0
        !          5858:          && reload_reg_rtx[j] != old
        !          5859:          && reload_reg_rtx[j] != 0
        !          5860:          && reload_out[j] == 0
        !          5861:          && ! reload_inherited[j]
        !          5862:          && PRESERVE_DEATH_INFO_REGNO_P (REGNO (reload_reg_rtx[j])))
        !          5863:        {
        !          5864:          register rtx reloadreg = reload_reg_rtx[j];
        !          5865: 
        !          5866: #if 0
        !          5867:          /* We can't abort here because we need to support this for sched.c.
        !          5868:             It's not terrible to miss a REG_DEAD note, but we should try
        !          5869:             to figure out how to do this correctly.  */
        !          5870:          /* The code below is incorrect for address-only reloads.  */
        !          5871:          if (reload_when_needed[j] != RELOAD_OTHER
        !          5872:              && reload_when_needed[j] != RELOAD_FOR_INPUT)
        !          5873:            abort ();
        !          5874: #endif
        !          5875: 
        !          5876:          /* Add a death note to this insn, for an input reload.  */
        !          5877: 
        !          5878:          if ((reload_when_needed[j] == RELOAD_OTHER
        !          5879:               || reload_when_needed[j] == RELOAD_FOR_INPUT)
        !          5880:              && ! dead_or_set_p (insn, reloadreg))
        !          5881:            REG_NOTES (insn)
        !          5882:              = gen_rtx (EXPR_LIST, REG_DEAD,
        !          5883:                         reloadreg, REG_NOTES (insn));
        !          5884:        }
        !          5885: 
        !          5886:       /* When we inherit a reload, the last marked death of the reload reg
        !          5887:         may no longer really be a death.  */
        !          5888:       if (reload_reg_rtx[j] != 0
        !          5889:          && PRESERVE_DEATH_INFO_REGNO_P (REGNO (reload_reg_rtx[j]))
        !          5890:          && reload_inherited[j])
        !          5891:        {
        !          5892:          /* Handle inheriting an output reload.
        !          5893:             Remove the death note from the output reload insn.  */
        !          5894:          if (reload_spill_index[j] >= 0
        !          5895:              && GET_CODE (reload_in[j]) == REG
        !          5896:              && spill_reg_store[reload_spill_index[j]] != 0
        !          5897:              && find_regno_note (spill_reg_store[reload_spill_index[j]],
        !          5898:                                  REG_DEAD, REGNO (reload_reg_rtx[j])))
        !          5899:            remove_death (REGNO (reload_reg_rtx[j]),
        !          5900:                          spill_reg_store[reload_spill_index[j]]);
        !          5901:          /* Likewise for input reloads that were inherited.  */
        !          5902:          else if (reload_spill_index[j] >= 0
        !          5903:                   && GET_CODE (reload_in[j]) == REG
        !          5904:                   && spill_reg_store[reload_spill_index[j]] == 0
        !          5905:                   && reload_inheritance_insn[j] != 0
        !          5906:                   && find_regno_note (reload_inheritance_insn[j], REG_DEAD,
        !          5907:                                       REGNO (reload_reg_rtx[j])))
        !          5908:            remove_death (REGNO (reload_reg_rtx[j]),
        !          5909:                          reload_inheritance_insn[j]);
        !          5910:          else
        !          5911:            {
        !          5912:              rtx prev;
        !          5913: 
        !          5914:              /* We got this register from find_equiv_reg.
        !          5915:                 Search back for its last death note and get rid of it.
        !          5916:                 But don't search back too far.
        !          5917:                 Don't go past a place where this reg is set,
        !          5918:                 since a death note before that remains valid.  */
        !          5919:              for (prev = PREV_INSN (insn);
        !          5920:                   prev && GET_CODE (prev) != CODE_LABEL;
        !          5921:                   prev = PREV_INSN (prev))
        !          5922:                if (GET_RTX_CLASS (GET_CODE (prev)) == 'i'
        !          5923:                    && dead_or_set_p (prev, reload_reg_rtx[j]))
        !          5924:                  {
        !          5925:                    if (find_regno_note (prev, REG_DEAD,
        !          5926:                                         REGNO (reload_reg_rtx[j])))
        !          5927:                      remove_death (REGNO (reload_reg_rtx[j]), prev);
        !          5928:                    break;
        !          5929:                  }
        !          5930:            }
        !          5931:        }
        !          5932: 
        !          5933:       /* We might have used find_equiv_reg above to choose an alternate
        !          5934:         place from which to reload.  If so, and it died, we need to remove
        !          5935:         that death and move it to one of the insns we just made.  */
        !          5936: 
        !          5937:       if (oldequiv_reg != 0
        !          5938:          && PRESERVE_DEATH_INFO_REGNO_P (true_regnum (oldequiv_reg)))
        !          5939:        {
        !          5940:          rtx prev, prev1;
        !          5941: 
        !          5942:          for (prev = PREV_INSN (insn); prev && GET_CODE (prev) != CODE_LABEL;
        !          5943:               prev = PREV_INSN (prev))
        !          5944:            if (GET_RTX_CLASS (GET_CODE (prev)) == 'i'
        !          5945:                && dead_or_set_p (prev, oldequiv_reg))
        !          5946:              {
        !          5947:                if (find_regno_note (prev, REG_DEAD, REGNO (oldequiv_reg)))
        !          5948:                  {
        !          5949:                    for (prev1 = this_reload_insn;
        !          5950:                         prev1; prev1 = PREV_INSN (prev1))
        !          5951:                      if (GET_RTX_CLASS (GET_CODE (prev1) == 'i')
        !          5952:                        && reg_overlap_mentioned_for_reload_p (oldequiv_reg,
        !          5953:                                                               PATTERN (prev1)))
        !          5954:                      {
        !          5955:                        REG_NOTES (prev1) = gen_rtx (EXPR_LIST, REG_DEAD,
        !          5956:                                                     oldequiv_reg,
        !          5957:                                                     REG_NOTES (prev1));
        !          5958:                        break;
        !          5959:                      }
        !          5960:                    remove_death (REGNO (oldequiv_reg), prev);
        !          5961:                  }
        !          5962:                break;
        !          5963:              }
        !          5964:        }
        !          5965: #endif
        !          5966: 
        !          5967:       /* If we are reloading a register that was recently stored in with an
        !          5968:         output-reload, see if we can prove there was
        !          5969:         actually no need to store the old value in it.  */
        !          5970: 
        !          5971:       if (optimize && reload_inherited[j] && reload_spill_index[j] >= 0
        !          5972:          && reload_in[j] != 0
        !          5973:          && GET_CODE (reload_in[j]) == REG
        !          5974: #if 0
        !          5975:          /* There doesn't seem to be any reason to restrict this to pseudos
        !          5976:             and doing so loses in the case where we are copying from a
        !          5977:             register of the wrong class.  */
        !          5978:          && REGNO (reload_in[j]) >= FIRST_PSEUDO_REGISTER
        !          5979: #endif
        !          5980:          && spill_reg_store[reload_spill_index[j]] != 0
        !          5981:          /* This is unsafe if some other reload uses the same reg first.  */
        !          5982:          && reload_reg_free_before_p (spill_regs[reload_spill_index[j]],
        !          5983:                                       reload_opnum[j], reload_when_needed[j])
        !          5984:          && dead_or_set_p (insn, reload_in[j])
        !          5985:          /* This is unsafe if operand occurs more than once in current
        !          5986:             insn.  Perhaps some occurrences weren't reloaded.  */
        !          5987:          && count_occurrences (PATTERN (insn), reload_in[j]) == 1)
        !          5988:        delete_output_reload (insn, j,
        !          5989:                              spill_reg_store[reload_spill_index[j]]);
        !          5990: 
        !          5991:       /* Input-reloading is done.  Now do output-reloading,
        !          5992:         storing the value from the reload-register after the main insn
        !          5993:         if reload_out[j] is nonzero.
        !          5994: 
        !          5995:         ??? At some point we need to support handling output reloads of
        !          5996:         JUMP_INSNs or insns that set cc0.  */
        !          5997:       old = reload_out[j];
        !          5998:       if (old != 0
        !          5999:          && reload_reg_rtx[j] != old
        !          6000:          && reload_reg_rtx[j] != 0)
        !          6001:        {
        !          6002:          register rtx reloadreg = reload_reg_rtx[j];
        !          6003:          register rtx second_reloadreg = 0;
        !          6004:          rtx note, p;
        !          6005:          enum machine_mode mode;
        !          6006:          int special = 0;
        !          6007: 
        !          6008:          /* An output operand that dies right away does need a reload,
        !          6009:             but need not be copied from it.  Show the new location in the
        !          6010:             REG_UNUSED note.  */
        !          6011:          if ((GET_CODE (old) == REG || GET_CODE (old) == SCRATCH)
        !          6012:              && (note = find_reg_note (insn, REG_UNUSED, old)) != 0)
        !          6013:            {
        !          6014:              XEXP (note, 0) = reload_reg_rtx[j];
        !          6015:              continue;
        !          6016:            }
        !          6017:          else if (GET_CODE (old) == SCRATCH)
        !          6018:            /* If we aren't optimizing, there won't be a REG_UNUSED note,
        !          6019:               but we don't want to make an output reload.  */
        !          6020:            continue;
        !          6021: 
        !          6022: #if 0
        !          6023:          /* Strip off of OLD any size-increasing SUBREGs such as
        !          6024:             (SUBREG:SI foo:QI 0).  */
        !          6025: 
        !          6026:          while (GET_CODE (old) == SUBREG && SUBREG_WORD (old) == 0
        !          6027:                 && (GET_MODE_SIZE (GET_MODE (old))
        !          6028:                     > GET_MODE_SIZE (GET_MODE (SUBREG_REG (old)))))
        !          6029:            old = SUBREG_REG (old);
        !          6030: #endif
        !          6031: 
        !          6032:          /* If is a JUMP_INSN, we can't support output reloads yet.  */
        !          6033:          if (GET_CODE (insn) == JUMP_INSN)
        !          6034:            abort ();
        !          6035: 
        !          6036:          push_to_sequence (output_reload_insns[reload_opnum[j]]);
        !          6037: 
        !          6038:          /* Determine the mode to reload in.
        !          6039:             See comments above (for input reloading).  */
        !          6040: 
        !          6041:          mode = GET_MODE (old);
        !          6042:          if (mode == VOIDmode)
        !          6043:            {
        !          6044:              /* VOIDmode should never happen for an output.  */
        !          6045:              if (asm_noperands (PATTERN (insn)) < 0)
        !          6046:                /* It's the compiler's fault.  */
        !          6047:                abort ();
        !          6048:              error_for_asm (insn, "output operand is constant in `asm'");
        !          6049:              /* Prevent crash--use something we know is valid.  */
        !          6050:              mode = word_mode;
        !          6051:              old = gen_rtx (REG, mode, REGNO (reloadreg));
        !          6052:            }
        !          6053: 
        !          6054:          if (GET_MODE (reloadreg) != mode)
        !          6055:            reloadreg = gen_rtx (REG, mode, REGNO (reloadreg));
        !          6056: 
        !          6057: #ifdef SECONDARY_OUTPUT_RELOAD_CLASS
        !          6058: 
        !          6059:          /* If we need two reload regs, set RELOADREG to the intermediate
        !          6060:             one, since it will be stored into OUT.  We might need a secondary
        !          6061:             register only for an input reload, so check again here.  */
        !          6062: 
        !          6063:          if (reload_secondary_reload[j] >= 0)
        !          6064:            {
        !          6065:              rtx real_old = old;
        !          6066: 
        !          6067:              if (GET_CODE (old) == REG && REGNO (old) >= FIRST_PSEUDO_REGISTER
        !          6068:                  && reg_equiv_mem[REGNO (old)] != 0)
        !          6069:                real_old = reg_equiv_mem[REGNO (old)];
        !          6070: 
        !          6071:              if((SECONDARY_OUTPUT_RELOAD_CLASS (reload_reg_class[j],
        !          6072:                                                 mode, real_old)
        !          6073:                  != NO_REGS))
        !          6074:                {
        !          6075:                  second_reloadreg = reloadreg;
        !          6076:                  reloadreg = reload_reg_rtx[reload_secondary_reload[j]];
        !          6077: 
        !          6078:                  /* See if RELOADREG is to be used as a scratch register
        !          6079:                     or as an intermediate register.  */
        !          6080:                  if (reload_secondary_icode[j] != CODE_FOR_nothing)
        !          6081:                    {
        !          6082:                      emit_insn ((GEN_FCN (reload_secondary_icode[j])
        !          6083:                                  (real_old, second_reloadreg, reloadreg)));
        !          6084:                      special = 1;
        !          6085:                    }
        !          6086:                  else
        !          6087:                    {
        !          6088:                      /* See if we need both a scratch and intermediate reload
        !          6089:                         register.  */
        !          6090:                      int secondary_reload = reload_secondary_reload[j];
        !          6091:                      enum insn_code tertiary_icode
        !          6092:                        = reload_secondary_icode[secondary_reload];
        !          6093:                      rtx pat;
        !          6094: 
        !          6095:                      if (GET_MODE (reloadreg) != mode)
        !          6096:                        reloadreg = gen_rtx (REG, mode, REGNO (reloadreg));
        !          6097: 
        !          6098:                      if (tertiary_icode != CODE_FOR_nothing)
        !          6099:                        {
        !          6100:                          rtx third_reloadreg
        !          6101:                            = reload_reg_rtx[reload_secondary_reload[secondary_reload]];
        !          6102:                          pat = (GEN_FCN (tertiary_icode)
        !          6103:                                 (reloadreg, second_reloadreg, third_reloadreg));
        !          6104:                        }
        !          6105: #ifdef SECONDARY_MEMORY_NEEDED
        !          6106:                      /* If we need a memory location to do the move, do it that way.  */
        !          6107:                      else if (GET_CODE (reloadreg) == REG
        !          6108:                               && REGNO (reloadreg) < FIRST_PSEUDO_REGISTER
        !          6109:                               && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (reloadreg)),
        !          6110:                                           REGNO_REG_CLASS (REGNO (second_reloadreg)),
        !          6111:                                           GET_MODE (second_reloadreg)))
        !          6112:                        {
        !          6113:                          /* Get the memory to use and rewrite both registers
        !          6114:                             to its mode.  */
        !          6115:                          rtx loc
        !          6116:                            = get_secondary_mem (reloadreg,
        !          6117:                                                 GET_MODE (second_reloadreg),
        !          6118:                                                 reload_opnum[j],
        !          6119:                                                 reload_when_needed[j]);
        !          6120:                          rtx tmp_reloadreg;
        !          6121:                            
        !          6122:                          if (GET_MODE (loc) != GET_MODE (second_reloadreg))
        !          6123:                            second_reloadreg = gen_rtx (REG, GET_MODE (loc),
        !          6124:                                                        REGNO (second_reloadreg));
        !          6125:                          
        !          6126:                          if (GET_MODE (loc) != GET_MODE (reloadreg))
        !          6127:                            tmp_reloadreg = gen_rtx (REG, GET_MODE (loc),
        !          6128:                                                     REGNO (reloadreg));
        !          6129:                          else
        !          6130:                            tmp_reloadreg = reloadreg;
        !          6131:                          
        !          6132:                          emit_move_insn (loc, second_reloadreg);
        !          6133:                          pat = gen_move_insn (tmp_reloadreg, loc);
        !          6134:                        }
        !          6135: #endif
        !          6136:                      else
        !          6137:                        pat = gen_move_insn (reloadreg, second_reloadreg);
        !          6138: 
        !          6139:                      emit_insn (pat);
        !          6140:                    }
        !          6141:                }
        !          6142:            }
        !          6143: #endif
        !          6144: 
        !          6145:          /* Output the last reload insn.  */
        !          6146:          if (! special)
        !          6147:            {
        !          6148: #ifdef SECONDARY_MEMORY_NEEDED
        !          6149:              /* If we need a memory location to do the move, do it that way.  */
        !          6150:              if (GET_CODE (old) == REG && REGNO (old) < FIRST_PSEUDO_REGISTER
        !          6151:                  && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (old)),
        !          6152:                                              REGNO_REG_CLASS (REGNO (reloadreg)),
        !          6153:                                              GET_MODE (reloadreg)))
        !          6154:                {
        !          6155:                  /* Get the memory to use and rewrite both registers to
        !          6156:                     its mode.  */
        !          6157:                  rtx loc = get_secondary_mem (old, GET_MODE (reloadreg),
        !          6158:                                               reload_opnum[j],
        !          6159:                                               reload_when_needed[j]);
        !          6160: 
        !          6161:                  if (GET_MODE (loc) != GET_MODE (reloadreg))
        !          6162:                    reloadreg = gen_rtx (REG, GET_MODE (loc),
        !          6163:                                         REGNO (reloadreg));
        !          6164: 
        !          6165:                  if (GET_MODE (loc) != GET_MODE (old))
        !          6166:                    old = gen_rtx (REG, GET_MODE (loc), REGNO (old));
        !          6167: 
        !          6168:                  emit_insn (gen_move_insn (loc, reloadreg));
        !          6169:                  emit_insn (gen_move_insn (old, loc));
        !          6170:                }
        !          6171:              else
        !          6172: #endif
        !          6173:                emit_insn (gen_move_insn (old, reloadreg));
        !          6174:            }
        !          6175: 
        !          6176: #ifdef PRESERVE_DEATH_INFO_REGNO_P
        !          6177:          /* If final will look at death notes for this reg,
        !          6178:             put one on the last output-reload insn to use it.  Similarly
        !          6179:             for any secondary register.  */
        !          6180:          if (PRESERVE_DEATH_INFO_REGNO_P (REGNO (reloadreg)))
        !          6181:            for (p = get_last_insn (); p; p = PREV_INSN (p))
        !          6182:              if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
        !          6183:                  && reg_overlap_mentioned_for_reload_p (reloadreg,
        !          6184:                                                         PATTERN (p)))
        !          6185:                REG_NOTES (p) = gen_rtx (EXPR_LIST, REG_DEAD,
        !          6186:                                         reloadreg, REG_NOTES (p));
        !          6187: 
        !          6188: #ifdef SECONDARY_OUTPUT_RELOAD_CLASS
        !          6189:          if (! special
        !          6190:              && PRESERVE_DEATH_INFO_REGNO_P (REGNO (second_reloadreg)))
        !          6191:            for (p = get_last_insn (); p; p = PREV_INSN (p))
        !          6192:              if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
        !          6193:                  && reg_overlap_mentioned_for_reload_p (second_reloadreg,
        !          6194:                                                         PATTERN (p)))
        !          6195:                REG_NOTES (p) = gen_rtx (EXPR_LIST, REG_DEAD,
        !          6196:                                         second_reloadreg, REG_NOTES (p));
        !          6197: #endif
        !          6198: #endif
        !          6199:          /* Look at all insns we emitted, just to be safe.  */
        !          6200:          for (p = get_insns (); p; p = NEXT_INSN (p))
        !          6201:            if (GET_RTX_CLASS (GET_CODE (p)) == 'i')
        !          6202:              {
        !          6203:                /* If this output reload doesn't come from a spill reg,
        !          6204:                   clear any memory of reloaded copies of the pseudo reg.
        !          6205:                   If this output reload comes from a spill reg,
        !          6206:                   reg_has_output_reload will make this do nothing.  */
        !          6207:                note_stores (PATTERN (p), forget_old_reloads_1);
        !          6208: 
        !          6209:                if (reg_mentioned_p (reload_reg_rtx[j], PATTERN (p)))
        !          6210:                  store_insn = p;
        !          6211:              }
        !          6212: 
        !          6213:          output_reload_insns[reload_opnum[j]] = get_insns ();
        !          6214:          end_sequence ();
        !          6215: 
        !          6216:        }
        !          6217: 
        !          6218:       if (reload_spill_index[j] >= 0)
        !          6219:        new_spill_reg_store[reload_spill_index[j]] = store_insn;
        !          6220:     }
        !          6221: 
        !          6222:   /* Now write all the insns we made for reloads in the order expected by
        !          6223:      the allocation functions.  Prior to the insn being reloaded, we write
        !          6224:      the following reloads:
        !          6225: 
        !          6226:      RELOAD_FOR_OTHER_ADDRESS reloads for input addresses.
        !          6227: 
        !          6228:      RELOAD_OTHER reloads.
        !          6229: 
        !          6230:      For each operand, any RELOAD_FOR_INPUT_ADDRESS reloads followed by
        !          6231:      the RELOAD_FOR_INPUT reload for the operand.
        !          6232: 
        !          6233:      RELOAD_FOR_OPERAND_ADDRESS reloads.
        !          6234: 
        !          6235:      After the insn being reloaded, we write the following:
        !          6236: 
        !          6237:      For each operand, any RELOAD_FOR_OUTPUT_ADDRESS reload followed by
        !          6238:      the RELOAD_FOR_OUTPUT reload for that operand.  */
        !          6239: 
        !          6240:   emit_insns_before (other_input_address_reload_insns, before_insn);
        !          6241:   emit_insns_before (other_input_reload_insns, before_insn);
        !          6242: 
        !          6243:   for (j = 0; j < reload_n_operands; j++)
        !          6244:     {
        !          6245:       emit_insns_before (input_address_reload_insns[j], before_insn);
        !          6246:       emit_insns_before (input_reload_insns[j], before_insn);
        !          6247:     }
        !          6248: 
        !          6249:   emit_insns_before (operand_reload_insns, before_insn);
        !          6250: 
        !          6251:   for (j = 0; j < reload_n_operands; j++)
        !          6252:     {
        !          6253:       emit_insns_before (output_address_reload_insns[j], following_insn);
        !          6254:       emit_insns_before (output_reload_insns[j], following_insn);
        !          6255:     }
        !          6256: 
        !          6257:   /* Move death notes from INSN
        !          6258:      to output-operand-address and output reload insns.  */
        !          6259: #ifdef PRESERVE_DEATH_INFO_REGNO_P
        !          6260:   {
        !          6261:     rtx insn1;
        !          6262:     /* Loop over those insns, last ones first.  */
        !          6263:     for (insn1 = PREV_INSN (following_insn); insn1 != insn;
        !          6264:         insn1 = PREV_INSN (insn1))
        !          6265:       if (GET_CODE (insn1) == INSN && GET_CODE (PATTERN (insn1)) == SET)
        !          6266:        {
        !          6267:          rtx source = SET_SRC (PATTERN (insn1));
        !          6268:          rtx dest = SET_DEST (PATTERN (insn1));
        !          6269: 
        !          6270:          /* The note we will examine next.  */
        !          6271:          rtx reg_notes = REG_NOTES (insn);
        !          6272:          /* The place that pointed to this note.  */
        !          6273:          rtx *prev_reg_note = &REG_NOTES (insn);
        !          6274: 
        !          6275:          /* If the note is for something used in the source of this
        !          6276:             reload insn, or in the output address, move the note.  */
        !          6277:          while (reg_notes)
        !          6278:            {
        !          6279:              rtx next_reg_notes = XEXP (reg_notes, 1);
        !          6280:              if (REG_NOTE_KIND (reg_notes) == REG_DEAD
        !          6281:                  && GET_CODE (XEXP (reg_notes, 0)) == REG
        !          6282:                  && ((GET_CODE (dest) != REG
        !          6283:                       && reg_overlap_mentioned_for_reload_p (XEXP (reg_notes, 0),
        !          6284:                                                              dest))
        !          6285:                      || reg_overlap_mentioned_for_reload_p (XEXP (reg_notes, 0),
        !          6286:                                                             source)))
        !          6287:                {
        !          6288:                  *prev_reg_note = next_reg_notes;
        !          6289:                  XEXP (reg_notes, 1) = REG_NOTES (insn1);
        !          6290:                  REG_NOTES (insn1) = reg_notes;
        !          6291:                }
        !          6292:              else
        !          6293:                prev_reg_note = &XEXP (reg_notes, 1);
        !          6294: 
        !          6295:              reg_notes = next_reg_notes;
        !          6296:            }
        !          6297:        }
        !          6298:   }
        !          6299: #endif
        !          6300: 
        !          6301:   /* For all the spill regs newly reloaded in this instruction,
        !          6302:      record what they were reloaded from, so subsequent instructions
        !          6303:      can inherit the reloads.
        !          6304: 
        !          6305:      Update spill_reg_store for the reloads of this insn.
        !          6306:      Copy the elements that were updated in the loop above.  */
        !          6307: 
        !          6308:   for (j = 0; j < n_reloads; j++)
        !          6309:     {
        !          6310:       register int r = reload_order[j];
        !          6311:       register int i = reload_spill_index[r];
        !          6312: 
        !          6313:       /* I is nonneg if this reload used one of the spill regs.
        !          6314:         If reload_reg_rtx[r] is 0, this is an optional reload
        !          6315:         that we opted to ignore.
        !          6316: 
        !          6317:         Also ignore reloads that don't reach the end of the insn,
        !          6318:         since we will eventually see the one that does.  */
        !          6319: 
        !          6320:       if (i >= 0 && reload_reg_rtx[r] != 0
        !          6321:          && reload_reg_reaches_end_p (spill_regs[i], reload_opnum[r],
        !          6322:                                       reload_when_needed[r]))
        !          6323:        {
        !          6324:          /* First, clear out memory of what used to be in this spill reg.
        !          6325:             If consecutive registers are used, clear them all.  */
        !          6326:          int nr
        !          6327:            = HARD_REGNO_NREGS (spill_regs[i], GET_MODE (reload_reg_rtx[r]));
        !          6328:          int k;
        !          6329: 
        !          6330:          for (k = 0; k < nr; k++)
        !          6331:            {
        !          6332:              reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]] = -1;
        !          6333:              reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]] = 0;
        !          6334:            }
        !          6335: 
        !          6336:          /* Maybe the spill reg contains a copy of reload_out.  */
        !          6337:          if (reload_out[r] != 0 && GET_CODE (reload_out[r]) == REG)
        !          6338:            {
        !          6339:              register int nregno = REGNO (reload_out[r]);
        !          6340:              int nnr = (nregno >= FIRST_PSEUDO_REGISTER ? 1
        !          6341:                         : HARD_REGNO_NREGS (nregno,
        !          6342:                                             GET_MODE (reload_reg_rtx[r])));
        !          6343: 
        !          6344:              spill_reg_store[i] = new_spill_reg_store[i];
        !          6345:              reg_last_reload_reg[nregno] = reload_reg_rtx[r];
        !          6346: 
        !          6347:              /* If NREGNO is a hard register, it may occupy more than
        !          6348:                 one register.  If it does, say what is in the 
        !          6349:                 rest of the registers assuming that both registers
        !          6350:                 agree on how many words the object takes.  If not,
        !          6351:                 invalidate the subsequent registers.  */
        !          6352: 
        !          6353:              if (nregno < FIRST_PSEUDO_REGISTER)
        !          6354:                for (k = 1; k < nnr; k++)
        !          6355:                  reg_last_reload_reg[nregno + k]
        !          6356:                    = (nr == nnr ? gen_rtx (REG, word_mode,
        !          6357:                                            REGNO (reload_reg_rtx[r]) + k)
        !          6358:                       : 0);
        !          6359: 
        !          6360:              /* Now do the inverse operation.  */
        !          6361:              for (k = 0; k < nr; k++)
        !          6362:                {
        !          6363:                  reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]]
        !          6364:                    = (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr ? nregno
        !          6365:                       : nregno + k);
        !          6366:                  reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]] = insn;
        !          6367:                }
        !          6368:            }
        !          6369: 
        !          6370:          /* Maybe the spill reg contains a copy of reload_in.  Only do
        !          6371:             something if there will not be an output reload for
        !          6372:             the register being reloaded.  */
        !          6373:          else if (reload_out[r] == 0
        !          6374:                   && reload_in[r] != 0
        !          6375:                   && ((GET_CODE (reload_in[r]) == REG
        !          6376:                        && ! reg_has_output_reload[REGNO (reload_in[r])]
        !          6377:                       || (GET_CODE (reload_in_reg[r]) == REG
        !          6378:                           && ! reg_has_output_reload[REGNO (reload_in_reg[r])]))))
        !          6379:            {
        !          6380:              register int nregno;
        !          6381:              int nnr;
        !          6382: 
        !          6383:              if (GET_CODE (reload_in[r]) == REG)
        !          6384:                nregno = REGNO (reload_in[r]);
        !          6385:              else
        !          6386:                nregno = REGNO (reload_in_reg[r]);
        !          6387: 
        !          6388:              nnr = (nregno >= FIRST_PSEUDO_REGISTER ? 1
        !          6389:                     : HARD_REGNO_NREGS (nregno,
        !          6390:                                         GET_MODE (reload_reg_rtx[r])));
        !          6391: 
        !          6392:              reg_last_reload_reg[nregno] = reload_reg_rtx[r];
        !          6393: 
        !          6394:              if (nregno < FIRST_PSEUDO_REGISTER)
        !          6395:                for (k = 1; k < nnr; k++)
        !          6396:                  reg_last_reload_reg[nregno + k]
        !          6397:                    = (nr == nnr ? gen_rtx (REG, word_mode,
        !          6398:                                            REGNO (reload_reg_rtx[r]) + k)
        !          6399:                       : 0);
        !          6400: 
        !          6401:              /* Unless we inherited this reload, show we haven't
        !          6402:                 recently done a store.  */
        !          6403:              if (! reload_inherited[r])
        !          6404:                spill_reg_store[i] = 0;
        !          6405: 
        !          6406:              for (k = 0; k < nr; k++)
        !          6407:                {
        !          6408:                  reg_reloaded_contents[spill_reg_order[spill_regs[i] + k]]
        !          6409:                    = (nregno >= FIRST_PSEUDO_REGISTER || nr != nnr ? nregno
        !          6410:                       : nregno + k);
        !          6411:                  reg_reloaded_insn[spill_reg_order[spill_regs[i] + k]]
        !          6412:                    = insn;
        !          6413:                }
        !          6414:            }
        !          6415:        }
        !          6416: 
        !          6417:       /* The following if-statement was #if 0'd in 1.34 (or before...).
        !          6418:         It's reenabled in 1.35 because supposedly nothing else
        !          6419:         deals with this problem.  */
        !          6420: 
        !          6421:       /* If a register gets output-reloaded from a non-spill register,
        !          6422:         that invalidates any previous reloaded copy of it.
        !          6423:         But forget_old_reloads_1 won't get to see it, because
        !          6424:         it thinks only about the original insn.  So invalidate it here.  */
        !          6425:       if (i < 0 && reload_out[r] != 0 && GET_CODE (reload_out[r]) == REG)
        !          6426:        {
        !          6427:          register int nregno = REGNO (reload_out[r]);
        !          6428:          reg_last_reload_reg[nregno] = 0;
        !          6429:        }
        !          6430:     }
        !          6431: }
        !          6432: 
        !          6433: /* Emit code to perform an input reload of IN to RELOADREG.  IN is from
        !          6434:    operand OPNUM with reload type TYPE. 
        !          6435: 
        !          6436:    Returns first insn emitted.  */
        !          6437: 
        !          6438: rtx
        !          6439: gen_input_reload (reloadreg, in, opnum, type)
        !          6440:      rtx reloadreg;
        !          6441:      rtx in;
        !          6442:      int opnum;
        !          6443:      enum reload_type type;
        !          6444: {
        !          6445:   rtx last = get_last_insn ();
        !          6446: 
        !          6447:   /* How to do this reload can get quite tricky.  Normally, we are being
        !          6448:      asked to reload a simple operand, such as a MEM, a constant, or a pseudo
        !          6449:      register that didn't get a hard register.  In that case we can just
        !          6450:      call emit_move_insn.
        !          6451: 
        !          6452:      We can also be asked to reload a PLUS that adds a register or a MEM to
        !          6453:      another register, constant or MEM.  This can occur during frame pointer
        !          6454:      elimination and while reloading addresses.  This case is handled by
        !          6455:      trying to emit a single insn to perform the add.  If it is not valid,
        !          6456:      we use a two insn sequence.
        !          6457: 
        !          6458:      Finally, we could be called to handle an 'o' constraint by putting
        !          6459:      an address into a register.  In that case, we first try to do this
        !          6460:      with a named pattern of "reload_load_address".  If no such pattern
        !          6461:      exists, we just emit a SET insn and hope for the best (it will normally
        !          6462:      be valid on machines that use 'o').
        !          6463: 
        !          6464:      This entire process is made complex because reload will never
        !          6465:      process the insns we generate here and so we must ensure that
        !          6466:      they will fit their constraints and also by the fact that parts of
        !          6467:      IN might be being reloaded separately and replaced with spill registers.
        !          6468:      Because of this, we are, in some sense, just guessing the right approach
        !          6469:      here.  The one listed above seems to work.
        !          6470: 
        !          6471:      ??? At some point, this whole thing needs to be rethought.  */
        !          6472: 
        !          6473:   if (GET_CODE (in) == PLUS
        !          6474:       && (GET_CODE (XEXP (in, 0)) == REG
        !          6475:          || GET_CODE (XEXP (in, 0)) == MEM)
        !          6476:       && (GET_CODE (XEXP (in, 1)) == REG
        !          6477:          || CONSTANT_P (XEXP (in, 1))
        !          6478:          || GET_CODE (XEXP (in, 1)) == MEM))
        !          6479:     {
        !          6480:       /* We need to compute the sum of a register or a MEM and another
        !          6481:         register, constant, or MEM, and put it into the reload
        !          6482:         register.  The best possible way of doing this is if the machine
        !          6483:         has a three-operand ADD insn that accepts the required operands.
        !          6484: 
        !          6485:         The simplest approach is to try to generate such an insn and see if it
        !          6486:         is recognized and matches its constraints.  If so, it can be used.
        !          6487: 
        !          6488:         It might be better not to actually emit the insn unless it is valid,
        !          6489:         but we need to pass the insn as an operand to `recog' and
        !          6490:         `insn_extract' and it is simpler to emit and then delete the insn if
        !          6491:         not valid than to dummy things up.  */
        !          6492: 
        !          6493:       rtx op0, op1, tem, insn;
        !          6494:       int code;
        !          6495: 
        !          6496:       op0 = find_replacement (&XEXP (in, 0));
        !          6497:       op1 = find_replacement (&XEXP (in, 1));
        !          6498: 
        !          6499:       /* Since constraint checking is strict, commutativity won't be
        !          6500:         checked, so we need to do that here to avoid spurious failure
        !          6501:         if the add instruction is two-address and the second operand
        !          6502:         of the add is the same as the reload reg, which is frequently
        !          6503:         the case.  If the insn would be A = B + A, rearrange it so
        !          6504:         it will be A = A + B as constrain_operands expects. */
        !          6505: 
        !          6506:       if (GET_CODE (XEXP (in, 1)) == REG
        !          6507:          && REGNO (reloadreg) == REGNO (XEXP (in, 1)))
        !          6508:        tem = op0, op0 = op1, op1 = tem;
        !          6509: 
        !          6510:       if (op0 != XEXP (in, 0) || op1 != XEXP (in, 1))
        !          6511:        in = gen_rtx (PLUS, GET_MODE (in), op0, op1);
        !          6512: 
        !          6513:       insn = emit_insn (gen_rtx (SET, VOIDmode, reloadreg, in));
        !          6514:       code = recog_memoized (insn);
        !          6515: 
        !          6516:       if (code >= 0)
        !          6517:        {
        !          6518:          insn_extract (insn);
        !          6519:          /* We want constrain operands to treat this insn strictly in
        !          6520:             its validity determination, i.e., the way it would after reload
        !          6521:             has completed.  */
        !          6522:          if (constrain_operands (code, 1))
        !          6523:            return insn;
        !          6524:        }
        !          6525: 
        !          6526:       delete_insns_since (last);
        !          6527: 
        !          6528:       /* If that failed, we must use a conservative two-insn sequence.
        !          6529:         use move to copy constant, MEM, or pseudo register to the reload
        !          6530:         register since "move" will be able to handle an arbitrary operand,
        !          6531:         unlike add which can't, in general.  Then add the registers.
        !          6532: 
        !          6533:         If there is another way to do this for a specific machine, a
        !          6534:         DEFINE_PEEPHOLE should be specified that recognizes the sequence
        !          6535:         we emit below.  */
        !          6536: 
        !          6537:       if (CONSTANT_P (op1) || GET_CODE (op1) == MEM
        !          6538:          || (GET_CODE (op1) == REG
        !          6539:              && REGNO (op1) >= FIRST_PSEUDO_REGISTER))
        !          6540:        tem = op0, op0 = op1, op1 = tem;
        !          6541: 
        !          6542:       emit_insn (gen_move_insn (reloadreg, op0));
        !          6543: 
        !          6544:       /* If OP0 and OP1 are the same, we can use RELOADREG for OP1.
        !          6545:         This fixes a problem on the 32K where the stack pointer cannot
        !          6546:         be used as an operand of an add insn.  */
        !          6547: 
        !          6548:       if (rtx_equal_p (op0, op1))
        !          6549:        op1 = reloadreg;
        !          6550: 
        !          6551:       emit_insn (gen_add2_insn (reloadreg, op1));
        !          6552:     }
        !          6553: 
        !          6554: #ifdef SECONDARY_MEMORY_NEEDED
        !          6555:   /* If we need a memory location to do the move, do it that way.  */
        !          6556:   else if (GET_CODE (in) == REG && REGNO (in) < FIRST_PSEUDO_REGISTER
        !          6557:           && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (in)),
        !          6558:                                       REGNO_REG_CLASS (REGNO (reloadreg)),
        !          6559:                                       GET_MODE (reloadreg)))
        !          6560:     {
        !          6561:       /* Get the memory to use and rewrite both registers to its mode.  */
        !          6562:       rtx loc = get_secondary_mem (in, GET_MODE (reloadreg), opnum, type);
        !          6563: 
        !          6564:       if (GET_MODE (loc) != GET_MODE (reloadreg))
        !          6565:        reloadreg = gen_rtx (REG, GET_MODE (loc), REGNO (reloadreg));
        !          6566: 
        !          6567:       if (GET_MODE (loc) != GET_MODE (in))
        !          6568:        in = gen_rtx (REG, GET_MODE (loc), REGNO (in));
        !          6569: 
        !          6570:       emit_insn (gen_move_insn (loc, in));
        !          6571:       emit_insn (gen_move_insn (reloadreg, loc));
        !          6572:     }
        !          6573: #endif
        !          6574: 
        !          6575:   /* If IN is a simple operand, use gen_move_insn.  */
        !          6576:   else if (GET_RTX_CLASS (GET_CODE (in)) == 'o' || GET_CODE (in) == SUBREG)
        !          6577:     emit_insn (gen_move_insn (reloadreg, in));
        !          6578: 
        !          6579: #ifdef HAVE_reload_load_address
        !          6580:   else if (HAVE_reload_load_address)
        !          6581:     emit_insn (gen_reload_load_address (reloadreg, in));
        !          6582: #endif
        !          6583: 
        !          6584:   /* Otherwise, just write (set REGLOADREG IN) and hope for the best.  */
        !          6585:   else
        !          6586:     emit_insn (gen_rtx (SET, VOIDmode, reloadreg, in));
        !          6587: 
        !          6588:   /* Return the first insn emitted.
        !          6589:      We can not just return get_last_insn, because there may have
        !          6590:      been multiple instructions emitted.  Also note that gen_move_insn may
        !          6591:      emit more than one insn itself, so we can not assume that there is one
        !          6592:      insn emitted per emit_insn_before call.  */
        !          6593: 
        !          6594:   return last ? NEXT_INSN (last) : get_insns ();
        !          6595: }
        !          6596: 
        !          6597: /* Delete a previously made output-reload
        !          6598:    whose result we now believe is not needed.
        !          6599:    First we double-check.
        !          6600: 
        !          6601:    INSN is the insn now being processed.
        !          6602:    OUTPUT_RELOAD_INSN is the insn of the output reload.
        !          6603:    J is the reload-number for this insn.  */
        !          6604: 
        !          6605: static void
        !          6606: delete_output_reload (insn, j, output_reload_insn)
        !          6607:      rtx insn;
        !          6608:      int j;
        !          6609:      rtx output_reload_insn;
        !          6610: {
        !          6611:   register rtx i1;
        !          6612: 
        !          6613:   /* Get the raw pseudo-register referred to.  */
        !          6614: 
        !          6615:   rtx reg = reload_in[j];
        !          6616:   while (GET_CODE (reg) == SUBREG)
        !          6617:     reg = SUBREG_REG (reg);
        !          6618: 
        !          6619:   /* If the pseudo-reg we are reloading is no longer referenced
        !          6620:      anywhere between the store into it and here,
        !          6621:      and no jumps or labels intervene, then the value can get
        !          6622:      here through the reload reg alone.
        !          6623:      Otherwise, give up--return.  */
        !          6624:   for (i1 = NEXT_INSN (output_reload_insn);
        !          6625:        i1 != insn; i1 = NEXT_INSN (i1))
        !          6626:     {
        !          6627:       if (GET_CODE (i1) == CODE_LABEL || GET_CODE (i1) == JUMP_INSN)
        !          6628:        return;
        !          6629:       if ((GET_CODE (i1) == INSN || GET_CODE (i1) == CALL_INSN)
        !          6630:          && reg_mentioned_p (reg, PATTERN (i1)))
        !          6631:        return;
        !          6632:     }
        !          6633: 
        !          6634:   if (cannot_omit_stores[REGNO (reg)])
        !          6635:     return;
        !          6636: 
        !          6637:   /* If this insn will store in the pseudo again,
        !          6638:      the previous store can be removed.  */
        !          6639:   if (reload_out[j] == reload_in[j])
        !          6640:     delete_insn (output_reload_insn);
        !          6641: 
        !          6642:   /* See if the pseudo reg has been completely replaced
        !          6643:      with reload regs.  If so, delete the store insn
        !          6644:      and forget we had a stack slot for the pseudo.  */
        !          6645:   else if (reg_n_deaths[REGNO (reg)] == 1
        !          6646:           && reg_basic_block[REGNO (reg)] >= 0
        !          6647:           && find_regno_note (insn, REG_DEAD, REGNO (reg)))
        !          6648:     {
        !          6649:       rtx i2;
        !          6650: 
        !          6651:       /* We know that it was used only between here
        !          6652:         and the beginning of the current basic block.
        !          6653:         (We also know that the last use before INSN was
        !          6654:         the output reload we are thinking of deleting, but never mind that.)
        !          6655:         Search that range; see if any ref remains.  */
        !          6656:       for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2))
        !          6657:        {
        !          6658:          rtx set = single_set (i2);
        !          6659: 
        !          6660:          /* Uses which just store in the pseudo don't count,
        !          6661:             since if they are the only uses, they are dead.  */
        !          6662:          if (set != 0 && SET_DEST (set) == reg)
        !          6663:            continue;
        !          6664:          if (GET_CODE (i2) == CODE_LABEL
        !          6665:              || GET_CODE (i2) == JUMP_INSN)
        !          6666:            break;
        !          6667:          if ((GET_CODE (i2) == INSN || GET_CODE (i2) == CALL_INSN)
        !          6668:              && reg_mentioned_p (reg, PATTERN (i2)))
        !          6669:            /* Some other ref remains;
        !          6670:               we can't do anything.  */
        !          6671:            return;
        !          6672:        }
        !          6673: 
        !          6674:       /* Delete the now-dead stores into this pseudo.  */
        !          6675:       for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2))
        !          6676:        {
        !          6677:          rtx set = single_set (i2);
        !          6678: 
        !          6679:          if (set != 0 && SET_DEST (set) == reg)
        !          6680:            delete_insn (i2);
        !          6681:          if (GET_CODE (i2) == CODE_LABEL
        !          6682:              || GET_CODE (i2) == JUMP_INSN)
        !          6683:            break;
        !          6684:        }
        !          6685: 
        !          6686:       /* For the debugging info,
        !          6687:         say the pseudo lives in this reload reg.  */
        !          6688:       reg_renumber[REGNO (reg)] = REGNO (reload_reg_rtx[j]);
        !          6689:       alter_reg (REGNO (reg), -1);
        !          6690:     }
        !          6691: }
        !          6692: 
        !          6693: /* Output reload-insns to reload VALUE into RELOADREG.
        !          6694:    VALUE is an autoincrement or autodecrement RTX whose operand
        !          6695:    is a register or memory location;
        !          6696:    so reloading involves incrementing that location.
        !          6697: 
        !          6698:    INC_AMOUNT is the number to increment or decrement by (always positive).
        !          6699:    This cannot be deduced from VALUE.  */
        !          6700: 
        !          6701: static void
        !          6702: inc_for_reload (reloadreg, value, inc_amount)
        !          6703:      rtx reloadreg;
        !          6704:      rtx value;
        !          6705:      int inc_amount;
        !          6706: {
        !          6707:   /* REG or MEM to be copied and incremented.  */
        !          6708:   rtx incloc = XEXP (value, 0);
        !          6709:   /* Nonzero if increment after copying.  */
        !          6710:   int post = (GET_CODE (value) == POST_DEC || GET_CODE (value) == POST_INC);
        !          6711:   rtx last;
        !          6712:   rtx inc;
        !          6713:   rtx add_insn;
        !          6714:   int code;
        !          6715: 
        !          6716:   /* No hard register is equivalent to this register after
        !          6717:      inc/dec operation.  If REG_LAST_RELOAD_REG were non-zero,
        !          6718:      we could inc/dec that register as well (maybe even using it for
        !          6719:      the source), but I'm not sure it's worth worrying about.  */
        !          6720:   if (GET_CODE (incloc) == REG)
        !          6721:     reg_last_reload_reg[REGNO (incloc)] = 0;
        !          6722: 
        !          6723:   if (GET_CODE (value) == PRE_DEC || GET_CODE (value) == POST_DEC)
        !          6724:     inc_amount = - inc_amount;
        !          6725: 
        !          6726:   inc = GEN_INT (inc_amount);
        !          6727: 
        !          6728:   /* If this is post-increment, first copy the location to the reload reg.  */
        !          6729:   if (post)
        !          6730:     emit_insn (gen_move_insn (reloadreg, incloc));
        !          6731: 
        !          6732:   /* See if we can directly increment INCLOC.  Use a method similar to that
        !          6733:      in gen_input_reload.  */
        !          6734: 
        !          6735:   last = get_last_insn ();
        !          6736:   add_insn = emit_insn (gen_rtx (SET, VOIDmode, incloc,
        !          6737:                                 gen_rtx (PLUS, GET_MODE (incloc),
        !          6738:                                          incloc, inc)));
        !          6739:                                                          
        !          6740:   code = recog_memoized (add_insn);
        !          6741:   if (code >= 0)
        !          6742:     {
        !          6743:       insn_extract (add_insn);
        !          6744:       if (constrain_operands (code, 1))
        !          6745:        {
        !          6746:          /* If this is a pre-increment and we have incremented the value
        !          6747:             where it lives, copy the incremented value to RELOADREG to
        !          6748:             be used as an address.  */
        !          6749: 
        !          6750:          if (! post)
        !          6751:            emit_insn (gen_move_insn (reloadreg, incloc));
        !          6752: 
        !          6753:          return;
        !          6754:        }
        !          6755:     }
        !          6756: 
        !          6757:   delete_insns_since (last);
        !          6758: 
        !          6759:   /* If couldn't do the increment directly, must increment in RELOADREG.
        !          6760:      The way we do this depends on whether this is pre- or post-increment.
        !          6761:      For pre-increment, copy INCLOC to the reload register, increment it
        !          6762:      there, then save back.  */
        !          6763: 
        !          6764:   if (! post)
        !          6765:     {
        !          6766:       emit_insn (gen_move_insn (reloadreg, incloc));
        !          6767:       emit_insn (gen_add2_insn (reloadreg, inc));
        !          6768:       emit_insn (gen_move_insn (incloc, reloadreg));
        !          6769:     }
        !          6770:   else
        !          6771:     {
        !          6772:       /* Postincrement.
        !          6773:         Because this might be a jump insn or a compare, and because RELOADREG
        !          6774:         may not be available after the insn in an input reload, we must do
        !          6775:         the incrementation before the insn being reloaded for.
        !          6776: 
        !          6777:         We have already copied INCLOC to RELOADREG.  Increment the copy in
        !          6778:         RELOADREG, save that back, then decrement RELOADREG so it has
        !          6779:         the original value.  */
        !          6780: 
        !          6781:       emit_insn (gen_add2_insn (reloadreg, inc));
        !          6782:       emit_insn (gen_move_insn (incloc, reloadreg));
        !          6783:       emit_insn (gen_add2_insn (reloadreg, GEN_INT (-inc_amount)));
        !          6784:     }
        !          6785: 
        !          6786:   return;
        !          6787: }
        !          6788: 
        !          6789: /* Return 1 if we are certain that the constraint-string STRING allows
        !          6790:    the hard register REG.  Return 0 if we can't be sure of this.  */
        !          6791: 
        !          6792: static int
        !          6793: constraint_accepts_reg_p (string, reg)
        !          6794:      char *string;
        !          6795:      rtx reg;
        !          6796: {
        !          6797:   int value = 0;
        !          6798:   int regno = true_regnum (reg);
        !          6799:   int c;
        !          6800: 
        !          6801:   /* Initialize for first alternative.  */
        !          6802:   value = 0;
        !          6803:   /* Check that each alternative contains `g' or `r'.  */
        !          6804:   while (1)
        !          6805:     switch (c = *string++)
        !          6806:       {
        !          6807:       case 0:
        !          6808:        /* If an alternative lacks `g' or `r', we lose.  */
        !          6809:        return value;
        !          6810:       case ',':
        !          6811:        /* If an alternative lacks `g' or `r', we lose.  */
        !          6812:        if (value == 0)
        !          6813:          return 0;
        !          6814:        /* Initialize for next alternative.  */
        !          6815:        value = 0;
        !          6816:        break;
        !          6817:       case 'g':
        !          6818:       case 'r':
        !          6819:        /* Any general reg wins for this alternative.  */
        !          6820:        if (TEST_HARD_REG_BIT (reg_class_contents[(int) GENERAL_REGS], regno))
        !          6821:          value = 1;
        !          6822:        break;
        !          6823:       default:
        !          6824:        /* Any reg in specified class wins for this alternative.  */
        !          6825:        {
        !          6826:          enum reg_class class = REG_CLASS_FROM_LETTER (c);
        !          6827: 
        !          6828:          if (TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno))
        !          6829:            value = 1;
        !          6830:        }
        !          6831:       }
        !          6832: }
        !          6833: 
        !          6834: /* Return the number of places FIND appears within X, but don't count
        !          6835:    an occurrence if some SET_DEST is FIND.  */
        !          6836: 
        !          6837: static int
        !          6838: count_occurrences (x, find)
        !          6839:      register rtx x, find;
        !          6840: {
        !          6841:   register int i, j;
        !          6842:   register enum rtx_code code;
        !          6843:   register char *format_ptr;
        !          6844:   int count;
        !          6845: 
        !          6846:   if (x == find)
        !          6847:     return 1;
        !          6848:   if (x == 0)
        !          6849:     return 0;
        !          6850: 
        !          6851:   code = GET_CODE (x);
        !          6852: 
        !          6853:   switch (code)
        !          6854:     {
        !          6855:     case REG:
        !          6856:     case QUEUED:
        !          6857:     case CONST_INT:
        !          6858:     case CONST_DOUBLE:
        !          6859:     case SYMBOL_REF:
        !          6860:     case CODE_LABEL:
        !          6861:     case PC:
        !          6862:     case CC0:
        !          6863:       return 0;
        !          6864: 
        !          6865:     case SET:
        !          6866:       if (SET_DEST (x) == find)
        !          6867:        return count_occurrences (SET_SRC (x), find);
        !          6868:       break;
        !          6869:     }
        !          6870: 
        !          6871:   format_ptr = GET_RTX_FORMAT (code);
        !          6872:   count = 0;
        !          6873: 
        !          6874:   for (i = 0; i < GET_RTX_LENGTH (code); i++)
        !          6875:     {
        !          6876:       switch (*format_ptr++)
        !          6877:        {
        !          6878:        case 'e':
        !          6879:          count += count_occurrences (XEXP (x, i), find);
        !          6880:          break;
        !          6881: 
        !          6882:        case 'E':
        !          6883:          if (XVEC (x, i) != NULL)
        !          6884:            {
        !          6885:              for (j = 0; j < XVECLEN (x, i); j++)
        !          6886:                count += count_occurrences (XVECEXP (x, i, j), find);
        !          6887:            }
        !          6888:          break;
        !          6889:        }
        !          6890:     }
        !          6891:   return count;
        !          6892: }

unix.superglobalmegacorp.com

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