Annotation of researchv10dc/cmd/gcc/reload.c, revision 1.1.1.1

1.1       root        1: /* Search an insn for pseudo regs that must be in hard regs and are not.
                      2:    Copyright (C) 1987, 1988 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU CC General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU CC, but only under the conditions described in the
                     15: GNU CC General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU CC so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: 
                     22: /* This file contains subroutines used only from the file reload1.c.
                     23:    It knows how to scan one insn for operands and values
                     24:    that need to be copied into registers to make valid code.
                     25:    It also finds other operands and values which are valid
                     26:    but for which equivalent values in registers exist and
                     27:    ought to be used instead.
                     28: 
                     29:    Before processing the first insn of the function, call `init_reload'.
                     30: 
                     31:    To scan an insn, call `find_reloads'.  This does two things:
                     32:    1. sets up tables describing which values must be reloaded
                     33:    for this insn, and what kind of hard regs they must be reloaded into;
                     34:    2. optionally record the locations where those values appear in
                     35:    the data, so they can be replaced properly later.
                     36:    This is done only if the second arg to `find_reloads' is nonzero.
                     37: 
                     38:    The third arg to `find_reloads' specifies the value of `indirect_ok'.
                     39: 
                     40:    Then you must choose the hard regs to reload those pseudo regs into,
                     41:    and generate appropriate load insns before this insn and perhaps
                     42:    also store insns after this insn.  Set up the array `reload_reg_rtx'
                     43:    to contain the REG rtx's for the registers you used.  In some
                     44:    cases `find_reloads' will return a nonzero value in `reload_reg_rtx'
                     45:    for certain reloads.  Then that tells you which register to use,
                     46:    so you do not need to allocate one.  But you still do need to add extra
                     47:    instructions to copy the value into and out of that register.
                     48: 
                     49:    Finally you must call `subst_reloads' to substitute the reload reg rtx's
                     50:    into the locations already recorded.
                     51: 
                     52: NOTE SIDE EFFECTS:
                     53: 
                     54:    find_reloads can alter the operands of the instruction it is called on.
                     55: 
                     56:    1. Two operands of any sort may be interchanged, if they are in a
                     57:    commutative instruction.
                     58:    This happens only if find_reloads thinks the instruction will compile
                     59:    better that way.
                     60: 
                     61:    2. Pseudo-registers that are equivalent to constants are replaced
                     62:    with those constants if they are not in hard registers.
                     63: 
                     64: 1 happens every time find_reloads is called.
                     65: 2 happens only when REPLACE is 1, which is only when
                     66: actually doing the reloads, not when just counting them.
                     67: */
                     68: 
                     69: #define REG_OK_STRICT
                     70: 
                     71: #include "config.h"
                     72: #include "rtl.h"
                     73: #include "insn-config.h"
                     74: #include "recog.h"
                     75: #include "reload.h"
                     76: #include "regs.h"
                     77: #include "hard-reg-set.h"
                     78: 
                     79: /* The variables set up by `find_reloads' are:
                     80: 
                     81:    n_reloads             number of distinct reloads needed; max reload # + 1
                     82:        tables indexed by reload number
                     83:    reload_in             rtx for value to reload from
                     84:    reload_out            rtx for where to store reload-reg afterward if nec
                     85:                           (often the same as reload_in)
                     86:    reload_reg_class      enum reg_class, saying what regs to reload into
                     87:    reload_inmode         enum machine_mode; mode this operand should have
                     88:                           when reloaded, on input.
                     89:    reload_outmode        enum machine_mode; mode this operand should have
                     90:                           when reloaded, on output.
                     91:    reload_strict_low     char; 1 if this reload is inside a STRICT_LOW_PART.
                     92:    reload_optional       char, nonzero for an optional reload.
                     93:                           Optional reloads are ignored unless the
                     94:                           value is already sitting in a register.
                     95:    reload_inc            int, amount to increment reload_in by
                     96:                           before this insn.
                     97:    reload_reg_rtx        rtx.  This is the register to reload into.
                     98:                           If it is zero when `find_reloads' returns,
                     99:                           you must find a suitable register in the class
                    100:                           specified by reload_reg_class, and store here
                    101:                           an rtx for that register with mode from
                    102:                           reload_inmode or reload_outmode.
                    103:    reload_nocombine      char, nonzero if this reload shouldn't be
                    104:                           combined with another reload.  */
                    105: 
                    106: int n_reloads;
                    107: 
                    108: rtx reload_in[FIRST_PSEUDO_REGISTER];
                    109: rtx reload_out[FIRST_PSEUDO_REGISTER];
                    110: enum reg_class reload_reg_class[FIRST_PSEUDO_REGISTER];
                    111: enum machine_mode reload_inmode[FIRST_PSEUDO_REGISTER];
                    112: enum machine_mode reload_outmode[FIRST_PSEUDO_REGISTER];
                    113: char reload_strict_low[FIRST_PSEUDO_REGISTER];
                    114: rtx reload_reg_rtx[FIRST_PSEUDO_REGISTER];
                    115: char reload_optional[FIRST_PSEUDO_REGISTER];
                    116: int reload_inc[FIRST_PSEUDO_REGISTER];
                    117: char reload_nocombine[FIRST_PSEUDO_REGISTER];
                    118: 
                    119: /* Replacing reloads.
                    120: 
                    121:    If `replace_reloads' is nonzero, then as each reload is recorded
                    122:    an entry is made for it in the table `replacements'.
                    123:    Then later `subst_reloads' can look through that table and
                    124:    perform all the replacements needed.  */
                    125: 
                    126: /* Nonzero means record the places to replace.  */
                    127: static int replace_reloads;
                    128: 
                    129: /* Each replacement is recorded with a structure like this.  */
                    130: struct replacement
                    131: {
                    132:   rtx *where;                  /* Location to store in */
                    133:   int what;                    /* which reload this is for */
                    134:   enum machine_mode mode;      /* mode it must have */
                    135: };
                    136: 
                    137: static struct replacement replacements[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)];
                    138: 
                    139: /* Number of replacements currently recorded.  */
                    140: static int n_replacements;
                    141: 
                    142: /* MEM-rtx's created for pseudo-regs in stack slots not directly addressable;
                    143:    (see reg_equiv_address).  */
                    144: static rtx memlocs[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)];
                    145: static int n_memlocs;
                    146: 
                    147: /* The instruction we are doing reloads for;
                    148:    so we can test whether a register dies in it.  */
                    149: static rtx this_insn;
                    150: 
                    151: /* Nonzero means (MEM (REG n)) is valid even if (REG n) is spilled.  */
                    152: static int indirect_ok;
                    153: 
                    154: /* If hard_regs_live_known is nonzero,
                    155:    we can tell which hard regs are currently live,
                    156:    at least enough to succeed in choosing dummy reloads.  */
                    157: static int hard_regs_live_known;
                    158: 
                    159: /* Indexed by hard reg number,
                    160:    element is nonegative if hard reg has been spilled.
                    161:    This vector is passed to `find_reloads' as an argument
                    162:    and is not changed here.  */
                    163: static short *static_reload_reg_p;
                    164: 
                    165: static rtx find_dummy_reload ();
                    166: static rtx find_reloads_toplev ();
                    167: static void find_reloads_address ();
                    168: static void find_reloads_address_1 ();
                    169: static int hard_reg_set_here_p ();
                    170: static int refers_to_regno_p ();
                    171: static rtx forget_volatility ();
                    172: static rtx subst_reg_equivs ();
                    173: static rtx subst_indexed_address ();
                    174: rtx find_equiv_reg ();
                    175: static int find_inc_amount ();
                    176: 
                    177: /* Record one reload that needs to be performed.
                    178:    IN is an rtx saying where the data are to be found before this instruction.
                    179:    OUT says where they must be stored after the instruction.
                    180:    (IN is zero for data not read, and OUT is zero for data not written.)
                    181:    INLOC and OUTLOC point to the places in the instructions where
                    182:    IN and OUT were found.
                    183:    CLASS is a register class required for the reloaded data.
                    184:    INMODE is the machine mode that the instruction requires
                    185:    for the reg that replaces IN and OUTMODE is likewise for OUT.
                    186: 
                    187:    If IN is zero, then OUT's location and mode should be passed as
                    188:    INLOC and INMODE.
                    189: 
                    190:    STRICT_LOW is the 1 if there is a containing STRICT_LOW_PART rtx.
                    191: 
                    192:    OPTIONAL nonzero means this reload does not need to be performed:
                    193:    it can be discarded if that is more convenient.  */
                    194:    
                    195: static int
                    196: push_reload (in, out, inloc, outloc, class,
                    197:             inmode, outmode, strict_low, optional)
                    198:      register rtx in, out;
                    199:      rtx *inloc, *outloc;
                    200:      enum reg_class class;
                    201:      enum machine_mode inmode, outmode;
                    202:      int strict_low;
                    203:      int optional;
                    204: {
                    205:   register int i;
                    206:   int noshare = 0;
                    207: 
                    208:   /* Compare two RTX's.  */
                    209: #define MATCHES(x, y) (x == y || (x != 0 && GET_CODE (x) != REG && rtx_equal_p (x, y)))
                    210: 
                    211:   /* If IN is a pseudo register everywhere-equivalent to a constant, and 
                    212:      it is not in a hard register, reload straight from the constant,
                    213:      since we want to get rid of such pseudo registers.  */
                    214:   if (in != 0 && GET_CODE (in) == REG)
                    215:     {
                    216:       register int regno = REGNO (in);
                    217: 
                    218:       if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                    219:          && reg_equiv_constant[regno] != 0)
                    220:        in = reg_equiv_constant[regno];
                    221:     }
                    222: 
                    223:   /* Likewise for OUT.  Of course, OUT will never be equivalent to
                    224:      an actual constant, but it might be equivalent to a memory location
                    225:      (in the case of a parameter).  */
                    226:   if (out != 0 && GET_CODE (out) == REG)
                    227:     {
                    228:       register int regno = REGNO (out);
                    229: 
                    230:       if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                    231:          && reg_equiv_constant[regno] != 0)
                    232:        out = reg_equiv_constant[regno];
                    233:     }
                    234: 
                    235:   /* If we have a read-write operand with an address side-effect,
                    236:      change either IN or OUT so the side-effect happens only once.  */
                    237:   if (in != 0 && out != 0 && GET_CODE (in) == MEM && rtx_equal_p (in, out))
                    238:     {
                    239:       if (GET_CODE (XEXP (in, 0)) == POST_INC
                    240:          || GET_CODE (XEXP (in, 0)) == POST_DEC)
                    241:        in = gen_rtx (MEM, GET_MODE (in), XEXP (XEXP (in, 0), 0));
                    242:       if (GET_CODE (XEXP (in, 0)) == PRE_INC
                    243:          || GET_CODE (XEXP (in, 0)) == PRE_DEC)
                    244:        out = gen_rtx (MEM, GET_MODE (out), XEXP (XEXP (out, 0), 0));
                    245:     }
                    246: 
                    247:   /* If IN appears in OUT, we can't share any input-only reload for IN.  */
                    248:   if (in != 0 && out != 0 && reg_mentioned_p (in, out))
                    249:     noshare = 1;
                    250: 
                    251:   if (class == NO_REGS)
                    252:     abort ();
                    253: 
                    254:   /* Narrow down the class of register wanted if that is
                    255:      desirable on this machine for efficiency.  */
                    256:   if (in != 0)
                    257:     class = PREFERRED_RELOAD_CLASS(in, class);
                    258: 
                    259:   /* We can use an existing reload if the class is right
                    260:      and at least one of IN and OUT is a match
                    261:      and the other is at worst neutral.
                    262:      (A zero compared against anything is neutral.)  */
                    263:   for (i = 0; i < n_reloads; i++)
                    264:     if (reload_reg_class[i] == class
                    265:        && reload_strict_low[i] == strict_low
                    266:        && ((in != 0 && MATCHES (reload_in[i], in) && ! noshare
                    267:             && (out == 0 || reload_out[i] == 0 || MATCHES (reload_out[i], out)))
                    268:            ||
                    269:            (out != 0 && MATCHES (reload_out[i], out)
                    270:             && (in == 0 || reload_in[i] == 0 || MATCHES (reload_in[i], in)))))
                    271:       break;
                    272: 
                    273:   if (i == n_reloads)
                    274:     {
                    275:       /* We found no existing reload suitable for re-use.
                    276:         So add an additional reload.  */
                    277: 
                    278:       reload_in[i] = in;
                    279:       reload_out[i] = out;
                    280:       reload_reg_class[i] = class;
                    281:       reload_inmode[i] = inmode;
                    282:       reload_outmode[i] = outmode;
                    283:       reload_reg_rtx[i] = 0;
                    284:       reload_optional[i] = optional;
                    285:       reload_inc[i] = 0;
                    286:       reload_strict_low[i] = strict_low;
                    287:       reload_nocombine[i] = 0;
                    288: 
                    289:       n_reloads++;
                    290:     }
                    291:   else
                    292:     {
                    293:       /* We are reusing an existing reload,
                    294:         but we may have additional information for it.
                    295:         For example, we may now have both IN and OUT
                    296:         while the old one may have just one of them.  */
                    297: 
                    298:       if (inmode != VOIDmode)
                    299:        reload_inmode[i] = inmode;
                    300:       if (outmode != VOIDmode)
                    301:        reload_outmode[i] = outmode;
                    302:       if (in != 0)
                    303:        reload_in[i] = in;
                    304:       if (out != 0)
                    305:        reload_out[i] = out;
                    306:       reload_optional[i] &= optional;
                    307:     }
                    308: 
                    309:   /* If the ostensible rtx being reload differs from the rtx found
                    310:      in the location to substitute, this reload is not safe to combine
                    311:      because we cannot reliably tell whether it appears in the insn.  */
                    312: 
                    313:   if (in != 0 && in != *inloc)
                    314:     reload_nocombine[i] = 1;
                    315: 
                    316:   /* If this is an IN/OUT reload in an insn that sets the CC,
                    317:      it must be for an autoincrement.  It doesn't work to store
                    318:      the incremented value after the insn because that would clobber the CC.
                    319:      So we must do the increment of the value reloaded from,
                    320:      increment it, store it back, then decrement again.  */
                    321:   if (out != 0 && GET_CODE (PATTERN (this_insn)) == SET
                    322:       && SET_DEST (PATTERN (this_insn)) == cc0_rtx)
                    323:     {
                    324:       out = 0;
                    325:       reload_out[i] = 0;
                    326:       reload_inc[i] = find_inc_amount (PATTERN (this_insn), in);
                    327:       /* If we did not find a nonzero amount-to-increment-by,
                    328:         that contradicts the belief that IN is being incremented
                    329:         in an address in this insn.  */
                    330:       if (reload_inc[i] == 0)
                    331:        abort ();
                    332:     }
                    333: 
                    334:   /* If we will replace IN and OUT with the reload-reg,
                    335:      record where they are located so that substitution need
                    336:      not do a tree walk.  */
                    337: 
                    338:   if (replace_reloads)
                    339:     {
                    340:       if (inloc != 0)
                    341:        {
                    342:          register struct replacement *r = &replacements[n_replacements++];
                    343:          r->what = i;
                    344:          r->where = inloc;
                    345:          r->mode = inmode;
                    346:        }
                    347:       if (outloc != 0 && outloc != inloc)
                    348:        {
                    349:          register struct replacement *r = &replacements[n_replacements++];
                    350:          r->what = i;
                    351:          r->where = outloc;
                    352:          r->mode = outmode;
                    353:        }
                    354:     }
                    355: 
                    356:   /* If this reload is just being introduced and it has both
                    357:      an incoming quantity and an outgoing quantity that are
                    358:      supposed to be made to match, see if either one of the two
                    359:      can serve as the place to reload into.
                    360: 
                    361:      If one of them is acceptable, set reload_reg_rtx[i]
                    362:      to that one.  */
                    363: 
                    364:   if (in != 0 && out != 0 && in != out && reload_reg_rtx[i] == 0)
                    365:     {
                    366:       reload_reg_rtx[i] = find_dummy_reload (in, out, inloc, outloc,
                    367:                                             reload_reg_class[i], i);
                    368: 
                    369:       /* If the outgoing register already contains the same value
                    370:         as the incoming one, we can dispense with loading it.
                    371:         The easiest way to tell the caller that is to give a phony
                    372:         value for the incoming operand (same as outgoing one).  */
                    373:       if (reload_reg_rtx[i] == out
                    374:          && (GET_CODE (in) == REG || CONSTANT_P (in))
                    375:          && 0 != find_equiv_reg (in, this_insn, 0, REGNO (out),
                    376:                                  static_reload_reg_p, i))
                    377:        reload_in[i] = out;
                    378:     }
                    379: 
                    380:   return i;
                    381: }
                    382: 
                    383: /* Record an additional place we must replace a value
                    384:    for which we have already recorded a reload.
                    385:    RELOADNUM is the value returned by push_reload
                    386:    when the reload was recorded.
                    387:    This is used in insn patterns that use match_dup.  */
                    388: 
                    389: static void
                    390: push_replacement (loc, reloadnum, mode)
                    391:      rtx *loc;
                    392:      int reloadnum;
                    393:      enum machine_mode mode;
                    394: {
                    395:   if (replace_reloads)
                    396:     {
                    397:       register struct replacement *r = &replacements[n_replacements++];
                    398:       r->what = reloadnum;
                    399:       r->where = loc;
                    400:       r->mode = mode;
                    401:     }
                    402: }
                    403: 
                    404: /* If there is only one output reload, try to combine it
                    405:    with a (logically unrelated) input reload
                    406:    to reduce the number of reload registers needed.
                    407: 
                    408:    This is safe if the input reload does not appear in
                    409:    the value being output-reloaded, because this implies
                    410:    it is not needed any more once the original insn completes.  */
                    411: 
                    412: static void
                    413: combine_reloads ()
                    414: {
                    415:   int i;
                    416:   int output_reload = -1;
                    417: 
                    418:   /* Find the output reload; return unless there is exactly one
                    419:      and that one is mandatory.  */
                    420: 
                    421:   for (i = 0; i < n_reloads; i++)
                    422:     if (reload_out[i] != 0)
                    423:       {
                    424:        if (output_reload >= 0)
                    425:          return;
                    426:        output_reload = i;
                    427:       }
                    428: 
                    429:   if (output_reload < 0 || reload_optional[output_reload])
                    430:     return;
                    431: 
                    432:   /* An input-output reload isn't combinable.  */
                    433: 
                    434:   if (reload_in[output_reload] != 0)
                    435:     return;
                    436: 
                    437:   /* Check each input reload; can we combine it?  */
                    438: 
                    439:   for (i = 0; i < n_reloads; i++)
                    440:     if (reload_in[i] && ! reload_optional[i] && ! reload_nocombine[i]
                    441:        && reload_inmode[i] == reload_outmode[output_reload]
                    442:        && reload_inc[i] == 0
                    443:        && reload_reg_rtx[i] == 0
                    444:        && reload_strict_low[i] == 0
                    445:        && reload_reg_class[i] == reload_reg_class[output_reload]
                    446:        && ! reg_mentioned_p (reload_in[i], reload_out[output_reload]))
                    447:       {
                    448:        int j;
                    449: 
                    450:        /* We have found a reload to combine with!  */
                    451:        reload_out[i] = reload_out[output_reload];
                    452:        reload_outmode[i] = reload_outmode[output_reload];
                    453:        /* Mark the old output reload as inoperative.  */
                    454:        reload_out[output_reload] = 0;
                    455: 
                    456:        /* Transfer all replacements from the old reload to the combined.  */
                    457:        for (j = 0; j < n_replacements; j++)
                    458:          if (replacements[j].what == output_reload)
                    459:            replacements[j].what = i;
                    460: 
                    461:        return;
                    462:       }
                    463: }
                    464: 
                    465: /* Try to find a reload register for an in-out reload (expressions IN and OUT).
                    466:    See if one of IN and OUT is a register that may be used;
                    467:    this is desirable since a spill-register won't be needed.
                    468:    If so, return the register rtx that proves acceptable.
                    469: 
                    470:    INLOC and OUTLOC are locations where IN and OUT appear in the insn.
                    471:    CLASS is the register class required for the reload.
                    472: 
                    473:    If FOR_REAL is >= 0, it is the number of the reload,
                    474:    and in some cases when it can be discovered that OUT doesn't need
                    475:    to be computed, clear out reload_out[FOR_REAL].
                    476: 
                    477:    If FOR_REAL is -1, this should not be done, because this call
                    478:    is just to see if a register can be found, not to find and install it.  */
                    479: 
                    480: static rtx
                    481: find_dummy_reload (in, out, inloc, outloc, class, for_real)
                    482:      rtx in, out;
                    483:      rtx *inloc, *outloc;
                    484:      enum reg_class class;
                    485:      int for_real;
                    486: {
                    487:   rtx value = 0;
                    488:   rtx orig_in = in;
                    489: 
                    490:   while (GET_CODE (out) == SUBREG)
                    491:     out = SUBREG_REG (out);
                    492:   while (GET_CODE (in) == SUBREG)
                    493:     in = SUBREG_REG (in);
                    494: 
                    495:   /* If operands exceed a word, we can't use either of them
                    496:      unless they have the same size.  */
                    497:   if (GET_MODE_SIZE (GET_MODE (out)) != GET_MODE_SIZE (GET_MODE (in))
                    498:       && (GET_MODE_SIZE (GET_MODE (out)) > UNITS_PER_WORD
                    499:          || GET_MODE_SIZE (GET_MODE (in)) > UNITS_PER_WORD))
                    500:     return 0;
                    501: 
                    502:   /* See if OUT will do.  */
                    503:   if (GET_CODE (out) == REG)
                    504:     {
                    505:       register int regno = REGNO (out);
                    506: 
                    507:       /* When we consider whether the insn uses OUT,
                    508:         ignore references within IN.  They don't prevent us
                    509:         from copying IN into OUT, because those refs would
                    510:         move into the insn that reloads IN.
                    511: 
                    512:         However, we only ignore IN in its role as this operand.
                    513:         If the insn uses IN elsewhere and it contains OUT,
                    514:         that counts.  We can't be sure it's the "same" operand
                    515:         so it might not go through this reload.  */
                    516:       *inloc = const0_rtx;
                    517: 
                    518:       if (reg_renumber[regno] >= 0)
                    519:        regno = reg_renumber[regno];
                    520:       if (regno < FIRST_PSEUDO_REGISTER
                    521:          && ! refers_to_regno_p (regno, PATTERN (this_insn), outloc)
                    522:          && TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno))
                    523:        value = out;
                    524: 
                    525:       *inloc = orig_in;
                    526:     }
                    527: 
                    528:   /* Consider using IN if OUT was not acceptable
                    529:      or if OUT dies in this insn (like the quotient in a divmod insn).
                    530:      We can't use IN unless it is free after this insn,
                    531:      which means we must know accurately which hard regs are live.
                    532:      Also, the result can't go in IN if IN is used within OUT.  */
                    533:   if (hard_regs_live_known
                    534:       && GET_CODE (in) == REG
                    535:       && (value == 0
                    536:          || find_regno_note (this_insn, REG_DEAD, REGNO (value))))
                    537:     {
                    538:       register int regno = REGNO (in);
                    539:       if (find_regno_note (this_insn, REG_DEAD, regno))
                    540:        {
                    541:          if (reg_renumber[regno] >= 0)
                    542:            regno = reg_renumber[regno];
                    543:          if (regno < FIRST_PSEUDO_REGISTER
                    544:              && ! refers_to_regno_p (regno, out, 0)
                    545:              && ! hard_reg_set_here_p (regno, PATTERN (this_insn))
                    546:              && TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno))
                    547:            {
                    548:              /* If we were going to use OUT as the reload reg
                    549:                 and changed our mind, it means OUT is a dummy that
                    550:                 dies here.  So don't bother copying value to it.  */
                    551:              if (for_real >= 0 && value == out)
                    552:                reload_out[for_real] = 0;
                    553:              value = in;
                    554:            }
                    555:        }
                    556:     }
                    557: 
                    558:   return value;
                    559: }
                    560: 
                    561: /* This page contains subroutines used mainly for determining
                    562:    whether the IN or an OUT of a reload can serve as the
                    563:    reload register.  */
                    564: 
                    565: /* Return 1 if hard reg number REGNO is stored in by expression X,
                    566:    either explicitly or in the guise of a pseudo-reg allocated to REGNO.
                    567:    X should be the body of an instruction.  */
                    568: 
                    569: static int
                    570: hard_reg_set_here_p (regno, x)
                    571:      register int regno;
                    572:      rtx x;
                    573: {
                    574:   if (GET_CODE (x) == SET)
                    575:     {
                    576:       register rtx op0 = SET_DEST (x);
                    577:       if (GET_CODE (op0) == REG)
                    578:        {
                    579:          register int r = REGNO (op0);
                    580:          if (reg_renumber[r] >= 0)
                    581:            r = reg_renumber[r];
                    582:          if (r == regno)
                    583:            return 1;
                    584:        }
                    585:     }
                    586:   else if (GET_CODE (x) == PARALLEL)
                    587:     {
                    588:       register int i = XVECLEN (x, 0) - 1;
                    589:       for (; i >= 0; i--)
                    590:        if (hard_reg_set_here_p (regno, XVECEXP (x, 0, i)))
                    591:          return 1;
                    592:     }
                    593: 
                    594:   return 0;
                    595: }
                    596: 
                    597: /* Return nonzero if hard register REGNO appears 
                    598:    either explicitly or implicitly in X
                    599:    other than being stored into.
                    600: 
                    601:    References contained within the substructure at LOC do not count.
                    602:    LOC may be zero, meaning don't ignore anything.  */
                    603: 
                    604: static int
                    605: refers_to_regno_p (regno, x, loc)
                    606:      int regno;
                    607:      rtx x;
                    608:      rtx *loc;
                    609: {
                    610:   register int i;
                    611:   register RTX_CODE code;
                    612:   register char *fmt;
                    613: 
                    614:  repeat:
                    615:   code = GET_CODE (x);
                    616:   if (code == REG)
                    617:     {
                    618:       i = REGNO (x);
                    619:       if (reg_renumber[i] >= 0)
                    620:        i = reg_renumber[i];
                    621:       return i == regno;
                    622:     }
                    623: 
                    624:   if (code == SET)
                    625:     {
                    626:       if (GET_CODE (SET_DEST (x)) != REG
                    627:          && refers_to_regno_p (regno, SET_DEST (x), loc))
                    628:        return 1;
                    629:       if (loc == &SET_SRC (x))
                    630:        return 0;
                    631:       x = SET_SRC (x);
                    632:       goto repeat;
                    633:     }
                    634: 
                    635:   /* X does not match, so try its subexpressions.  */
                    636: 
                    637:   fmt = GET_RTX_FORMAT (code);
                    638:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                    639:     {
                    640:       if (fmt[i] == 'e' && loc != &XEXP (x, i))
                    641:        {
                    642:          if (i == 0)
                    643:            {
                    644:              x = XEXP (x, 0);
                    645:              goto repeat;
                    646:            }
                    647:          else
                    648:            if (refers_to_regno_p (regno, XEXP (x, i), loc))
                    649:              return 1;
                    650:        }
                    651:       else if (fmt[i] == 'E')
                    652:        {
                    653:          register int j;
                    654:          for (j = XVECLEN (x, i) - 1; j >=0; j--)
                    655:            if (loc != &XVECEXP (x, i, j)
                    656:                && refers_to_regno_p (regno, XVECEXP (x, i, j), loc))
                    657:              return 1;
                    658:        }
                    659:     }
                    660:   return 0;
                    661: }
                    662: 
                    663: /* Return 1 if ADDR is a valid memory address for mode MODE,
                    664:    and check that each pseudo reg has the proper kind of
                    665:    hard reg.  */
                    666: 
                    667: int
                    668: strict_memory_address_p (mode, addr)
                    669:      enum machine_mode mode;
                    670:      register rtx addr;
                    671: {
                    672:   GO_IF_LEGITIMATE_ADDRESS (mode, addr, win);
                    673:   return 0;
                    674: 
                    675:  win:
                    676:   return 1;
                    677: }
                    678: 
                    679: 
                    680: /* Like rtx_equal_p except that it considers two REGs as equal
                    681:    if they renumber to the same value and has special hacks for
                    682:    autoincrement and autodecrement.
                    683:    This is specifically intended for find_reloads to use
                    684:    in determining whether two operands match.
                    685:    X is the operand whose number is the lower of the two.
                    686: 
                    687:    The value is 2 if Y contains a pre-increment that matches
                    688:    a non-incrementing address in X.  */
                    689: 
                    690: /* ??? To be completely correct, we should arrange to pass
                    691:    for X the output operand and for Y the input operand.
                    692:    For now, we assume that the output operand has the lower number
                    693:    because that is natural in (SET output (... input ...)).  */
                    694: 
                    695: int
                    696: operands_match_p (x, y)
                    697:      rtx x, y;
                    698: {
                    699:   register int i;
                    700:   register RTX_CODE code = GET_CODE (x);
                    701:   register char *fmt;
                    702:   int success_2;
                    703:       
                    704:   if (x == y)
                    705:     return 1;
                    706:   if ((code == REG || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG))
                    707:       && (GET_CODE (y) == REG || (GET_CODE (y) == SUBREG
                    708:                                  && GET_CODE (SUBREG_REG (y)) == REG)))
                    709:     {
                    710:       register int j;
                    711:       if (code == SUBREG)
                    712:        {
                    713:          i = REGNO (SUBREG_REG (x));
                    714:          if (reg_renumber[i] >= 0)
                    715:            i = reg_renumber[i];
                    716:          i += SUBREG_WORD (x);
                    717:        }
                    718:       else
                    719:        {
                    720:          i = REGNO (x);
                    721:          if (reg_renumber[i] >= 0)
                    722:            i = reg_renumber[i];
                    723:        }
                    724:       if (GET_CODE (y) == SUBREG)
                    725:        {
                    726:          j = REGNO (SUBREG_REG (y));
                    727:          if (reg_renumber[j] >= 0)
                    728:            j = reg_renumber[j];
                    729:          j += SUBREG_WORD (y);
                    730:        }
                    731:       else
                    732:        {
                    733:          j = REGNO (y);
                    734:          if (reg_renumber[j] >= 0)
                    735:            j = reg_renumber[j];
                    736:        }
                    737:       return i == j;
                    738:     }
                    739:   /* If two operands must match, because they are really a single
                    740:      operand of an assembler insn, then two postincrements are invalid
                    741:      because the assembler insn would increment only once.
                    742:      On the other hand, an postincrement matches ordinary indexing
                    743:      if the postincrement is the output operand.  */
                    744:   if (code == POST_DEC || code == POST_INC)
                    745:     return operands_match_p (XEXP (x, 0), y);
                    746:   /* Two preincrements are invalid
                    747:      because the assembler insn would increment only once.
                    748:      On the other hand, an preincrement matches ordinary indexing
                    749:      if the preincrement is the input operand.
                    750:      In this case, return 2, since some callers need to do special
                    751:      things when this happens.  */
                    752:   if (GET_CODE (y) == PRE_DEC || GET_CODE (y) == PRE_INC)
                    753:     return operands_match_p (x, XEXP (y, 0)) ? 2 : 0;
                    754:   /* Now we have disposed of all the cases 
                    755:      in which different rtx codes can match.  */
                    756:   if (code != GET_CODE (y))
                    757:     return 0;
                    758:   if (code == LABEL_REF)
                    759:     return XEXP (x, 0) == XEXP (y, 0);
                    760:   if (code == SYMBOL_REF)
                    761:     return XSTR (x, 0) == XSTR (y, 0);
                    762: 
                    763:   /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent.  */
                    764: 
                    765:   if (GET_MODE (x) != GET_MODE (y))
                    766:     return 0;
                    767: 
                    768:   /* Compare the elements.  If any pair of corresponding elements
                    769:      fail to match, return 0 for the whole things.  */
                    770: 
                    771:   success_2 = 0;
                    772:   fmt = GET_RTX_FORMAT (code);
                    773:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                    774:     {
                    775:       int val;
                    776:       switch (fmt[i])
                    777:        {
                    778:        case 'i':
                    779:          if (XINT (x, i) != XINT (y, i))
                    780:            return 0;
                    781:          break;
                    782: 
                    783:        case 'e':
                    784:          val = operands_match_p (XEXP (x, i), XEXP (y, i));
                    785:          if (val == 0)
                    786:            return 0;
                    787:          /* If any subexpression returns 2,
                    788:             we should return 2 if we are successful.  */
                    789:          if (val == 2)
                    790:            success_2 = 1;
                    791:          break;
                    792: 
                    793:        case '0':
                    794:          break;
                    795: 
                    796:          /* It is believed that rtx's at this level will never
                    797:             contain anything but integers and other rtx's,
                    798:             except for within LABEL_REFs and SYMBOL_REFs.  */
                    799:        default:
                    800:          abort ();
                    801:        }
                    802:     }
                    803:   return 1 + success_2;
                    804: }
                    805: 
                    806: /* Main entry point of this file: search the body of INSN
                    807:    for values that need reloading and record them with push_reload.
                    808:    REPLACE nonzero means record also where the values occur
                    809:    so that subst_reloads can be used.
                    810:    IND_OK says that a memory reference is a valid memory address.
                    811: 
                    812:    LIVE_KNOWN says we have valid information about which hard
                    813:    regs are live at each point in the program; this is true when
                    814:    we are called from global_alloc but false when stupid register
                    815:    allocation has been done.
                    816: 
                    817:    RELOAD_REG_P if nonzero is a vector indexed by hard reg number
                    818:    which is nonzero if the reg has been commandeered for reloading into.
                    819:    It is copied into STATIC_RELOAD_REG_P and referenced from there
                    820:    by various subroutines.  */
                    821: 
                    822: void
                    823: find_reloads (insn, replace, ind_ok, live_known, reload_reg_p)
                    824:      rtx insn;
                    825:      int replace, ind_ok;
                    826:      int live_known;
                    827:      short *reload_reg_p;
                    828: {
                    829: #ifdef REGISTER_CONSTRAINTS
                    830: 
                    831:   enum reload_modified { RELOAD_NOTHING, RELOAD_READ, RELOAD_READ_WRITE, RELOAD_WRITE };
                    832: 
                    833:   register int insn_code_number;
                    834:   register int i;
                    835:   int noperands;
                    836:   /* These are the constraints for the insn.  We don't change them.  */
                    837:   char *constraints1[MAX_RECOG_OPERANDS];
                    838:   /* These start out as the constraints for the insn
                    839:      and they are chewed up as we consider alternatives.  */
                    840:   char *constraints[MAX_RECOG_OPERANDS];
                    841:   int this_alternative[MAX_RECOG_OPERANDS];
                    842:   char this_alternative_win[MAX_RECOG_OPERANDS];
                    843:   char this_alternative_offmemok[MAX_RECOG_OPERANDS];
                    844:   char this_alternative_earlyclobber[MAX_RECOG_OPERANDS];
                    845:   int this_alternative_matches[MAX_RECOG_OPERANDS];
                    846:   int swapped;
                    847:   int goal_alternative[MAX_RECOG_OPERANDS];
                    848:   int this_alternative_number;
                    849:   int goal_alternative_number;
                    850:   int operand_reloadnum[MAX_RECOG_OPERANDS];
                    851:   int goal_alternative_matches[MAX_RECOG_OPERANDS];
                    852:   int goal_alternative_matched[MAX_RECOG_OPERANDS];
                    853:   char goal_alternative_win[MAX_RECOG_OPERANDS];
                    854:   char goal_alternative_offmemok[MAX_RECOG_OPERANDS];
                    855:   int goal_alternative_swapped;
                    856:   enum reload_modified modified[MAX_RECOG_OPERANDS];
                    857:   int best;
                    858:   int commutative;
                    859:   char operands_match[MAX_RECOG_OPERANDS][MAX_RECOG_OPERANDS];
                    860:   rtx substed_operand[MAX_RECOG_OPERANDS];
                    861:   rtx body = PATTERN (insn);
                    862:   int goal_earlyclobber, this_earlyclobber;
                    863:   enum machine_mode operand_mode[MAX_RECOG_OPERANDS];
                    864: 
                    865:   this_insn = insn;
                    866:   n_reloads = 0;
                    867:   n_replacements = 0;
                    868:   n_memlocs = 0;
                    869:   replace_reloads = replace;
                    870:   indirect_ok = ind_ok;
                    871:   hard_regs_live_known = live_known;
                    872:   static_reload_reg_p = reload_reg_p;
                    873: 
                    874:   /* Find what kind of insn this is.  NOPERANDS gets number of operands.
                    875:      Make OPERANDS point to a vector of operand values.
                    876:      Make OPERAND_LOCS point to a vector of pointers to
                    877:      where the operands were found.
                    878:      Fill CONSTRAINTS and CONSTRAINTS1 with pointers to the
                    879:      constraint-strings for this insn.
                    880:      Return if the insn needs no reload processing.  */
                    881: 
                    882:   switch (GET_CODE (body))
                    883:     {
                    884:     case USE:
                    885:     case CLOBBER:
                    886:     case ASM_INPUT:
                    887:     case ADDR_VEC:
                    888:     case ADDR_DIFF_VEC:
                    889:       return;
                    890: 
                    891:     case PARALLEL:
                    892:     case SET:
                    893:       noperands = asm_noperands (body);
                    894:       if (noperands > 0)
                    895:        {
                    896:          /* This insn is an `asm' with operands.  */
                    897: 
                    898:          insn_code_number = -1;
                    899: 
                    900:          /* expand_asm_operands makes sure there aren't too many operands.  */
                    901:          if (noperands > MAX_RECOG_OPERANDS)
                    902:            abort ();
                    903: 
                    904:          /* Now get the operand values and constraints out of the insn.  */
                    905: 
                    906:          decode_asm_operands (body, recog_operand, recog_operand_loc,
                    907:                               constraints, operand_mode);
                    908:          bcopy (constraints, constraints1, noperands * sizeof (char *));
                    909:          break;
                    910:        }
                    911: 
                    912:     default:
                    913:       /* Ordinary insn: recognize it, allocate space for operands and
                    914:         constraints, and get them out via insn_extract.  */
                    915: 
                    916:       insn_code_number = recog_memoized (insn);
                    917:       noperands = insn_n_operands[insn_code_number];
                    918:       insn_extract (insn);
                    919:       for (i = 0; i < noperands; i++)
                    920:        {
                    921:          constraints[i] = constraints1[i]
                    922:            = insn_operand_constraint[insn_code_number][i];
                    923:          operand_mode[i] = insn_operand_mode[insn_code_number][i];
                    924:        }
                    925:     }
                    926: 
                    927:   if (noperands == 0)
                    928:     return;
                    929: 
                    930:   commutative = -1;
                    931: 
                    932:   /* If we will need to know, later, whether some pair of operands
                    933:      are the same, we must compare them now and save the result.
                    934:      Reloading the base and index registers will clobber them
                    935:      and afterward they will fail to match.  */
                    936: 
                    937:   for (i = 0; i < noperands; i++)
                    938:     {
                    939:       register char *p;
                    940:       register int c;
                    941: 
                    942:       substed_operand[i] = recog_operand[i];
                    943:       p = constraints[i];
                    944: 
                    945:       /* Scan this operand's constraint to see if it should match another.  */
                    946: 
                    947:       while (c = *p++)
                    948:        if (c == '%')
                    949:          commutative = i;
                    950:        else if (c >= '0' && c <= '9')
                    951:          {
                    952:            c -= '0';
                    953:            operands_match[c][i]
                    954:              = operands_match_p (recog_operand[c], recog_operand[i]);
                    955:            /* If C can be commuted with C+1, and C might need to match I,
                    956:               then C+1 might also need to match I.  */
                    957:            if (commutative >= 0)
                    958:              {
                    959:                if (c == commutative || c == commutative + 1)
                    960:                  {
                    961:                    int other = c + (c == commutative ? 1 : -1);
                    962:                    operands_match[other][i]
                    963:                      = operands_match_p (recog_operand[other], recog_operand[i]);
                    964:                  }
                    965:                if (i == commutative || i == commutative + 1)
                    966:                  {
                    967:                    int other = i + (i == commutative ? 1 : -1);
                    968:                    operands_match[c][other]
                    969:                    = operands_match_p (recog_operand[c], recog_operand[other]);
                    970:                  }
                    971:                /* Note that C is supposed to be less than I.
                    972:                   No need to consider altering both C and I
                    973:                   because in that case we would alter one into the other.  */
                    974:              }
                    975:          }
                    976:     }
                    977: 
                    978:   /* Examine each operand that is a memory reference or memory address
                    979:      and reload parts of the addresses into index registers.
                    980:      While we are at it, initialize the array `modified'.
                    981:      Also here any references to pseudo regs that didn't get hard regs
                    982:      but are equivalent to constants get replaced in the insn itself
                    983:      with those constants.  Nobody will ever see them again.  */
                    984: 
                    985:   for (i = 0; i < noperands; i++)
                    986:     {
                    987:       register RTX_CODE code = GET_CODE (recog_operand[i]);
                    988:       modified[i] = RELOAD_READ;
                    989:       if (constraints[i][0] == 'p')
                    990:        {
                    991:          find_reloads_address (VOIDmode, 0,
                    992:                                recog_operand[i], recog_operand_loc[i]);
                    993:          substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
                    994:        }
                    995:       else if (code == MEM)
                    996:        {
                    997:          find_reloads_address (GET_MODE (recog_operand[i]),
                    998:                                recog_operand_loc[i],
                    999:                                XEXP (recog_operand[i], 0),
                   1000:                                &XEXP (recog_operand[i], 0));
                   1001:          substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
                   1002:        }
                   1003:       else if (code == SUBREG)
                   1004:        find_reloads_toplev (recog_operand[i]);
                   1005:       else if (code == REG)
                   1006:        {
                   1007:          /* This is equivalent to calling find_reloads_toplev.
                   1008:             The code is duplicated for speed.  */
                   1009:          register int regno = REGNO (recog_operand[i]);
                   1010:          if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1011:              && reg_equiv_constant[regno] != 0)
                   1012:            substed_operand[i] = recog_operand[i]
                   1013:              = reg_equiv_constant[regno];
                   1014:          if (reg_equiv_address[regno] != 0)
                   1015:            {
                   1016:              *recog_operand_loc[i] = recog_operand[i]
                   1017:                = gen_rtx (MEM, GET_MODE (recog_operand[i]),
                   1018:                           reg_equiv_address[regno]);
                   1019:              find_reloads_address (GET_MODE (recog_operand[i]),
                   1020:                                    recog_operand_loc[i],
                   1021:                                    XEXP (recog_operand[i], 0),
                   1022:                                    &XEXP (recog_operand[i], 0));
                   1023:              substed_operand[i] = recog_operand[i] = *recog_operand_loc[i];
                   1024:            }
                   1025:        }
                   1026:     }
                   1027: 
                   1028:   /* Now see what we need for pseudo-regs that didn't get hard regs
                   1029:      or got the wrong kind of hard reg.  For this, we must consider
                   1030:      all the operands together against the register constraints.  */
                   1031: 
                   1032:   best = MAX_RECOG_OPERANDS + 100;
                   1033: 
                   1034:   swapped = 0;
                   1035:  try_swapped:
                   1036:   this_alternative_number = 0;
                   1037:   /* The constraints are made of several alternatives.
                   1038:      Each operand's constraint looks like foo,bar,... with commas
                   1039:      separating the alternatives.  The first alternatives for all
                   1040:      operands go together, the second alternatives go together, etc.
                   1041: 
                   1042:      First loop over alternatives.  */
                   1043: 
                   1044:   while (*constraints[0])
                   1045:     {
                   1046:       /* Loop over operands for one constraint alternative.  */
                   1047:       /* LOSERS counts those that don't fit this alternative
                   1048:         and would require loading.  */
                   1049:       int losers = 0;
                   1050:       /* BAD is set to 1 if it some operand can't fit this alternative
                   1051:         even after reloading.  */
                   1052:       int bad = 0;
                   1053:       /* REJECT is a count of how undesirable this alternative says it is
                   1054:         if any reloading is required.  If the alternative matches exactly
                   1055:         then REJECT is ignored, but otherwise it gets this much
                   1056:         counted against it in addition to the reloading needed.  */
                   1057:       int reject = 0;
                   1058: 
                   1059:       this_earlyclobber = 0;
                   1060: 
                   1061:       for (i = 0; i < noperands; i++)
                   1062:        {
                   1063:          register char *p = constraints[i];
                   1064:          register int win = 0;
                   1065:          int badop = 1;
                   1066:          int c;
                   1067:          register rtx operand = recog_operand[i];
                   1068:          int offset = 0;
                   1069:          int force_reload = 0;
                   1070:          int offmemok = 0;
                   1071:          int earlyclobber = 0;
                   1072: 
                   1073:          /* If the operand is a SUBREG, extract
                   1074:             the REG or MEM within.  */
                   1075: 
                   1076:          while (GET_CODE (operand) == SUBREG)
                   1077:            {
                   1078:              offset += SUBREG_WORD (operand);
                   1079:              operand = SUBREG_REG (operand);
                   1080:              if (GET_CODE (operand) == MEM
                   1081: /*** This is overcautious, as for BYTES_BIG_ENDIAN it is still possible
                   1082:      to avoid setting force_reload if the mode of the subreg
                   1083:      is SImode or bigger.  */
                   1084: #ifndef BYTES_BIG_ENDIAN
                   1085:                  && offset != 0
                   1086: #endif
                   1087:                  && !offsetable_memref_p (operand))
                   1088:                force_reload = 1;
                   1089:            }
                   1090: 
                   1091:          this_alternative[i] = (int) NO_REGS;
                   1092:          this_alternative_win[i] = 0;
                   1093:          this_alternative_offmemok[i] = 0;
                   1094:          this_alternative_earlyclobber[i] = 0;
                   1095:          this_alternative_matches[i] = -1;
                   1096: 
                   1097:          /* Scan this alternative's specs for this operand;
                   1098:             set WIN if the operand fits any letter in this alternative.
                   1099:             Otherwise, clear BADOP if this operand could
                   1100:             fit some letter after reloads. */
                   1101: 
                   1102:          while (*p && (c = *p++) != ',')
                   1103:            switch (c)
                   1104:              {
                   1105:              case '=':
                   1106:                modified[i] = RELOAD_WRITE;
                   1107:                break;
                   1108: 
                   1109:              case '+':
                   1110:                modified[i] = RELOAD_READ_WRITE;
                   1111:                break;
                   1112: 
                   1113:              case '*':
                   1114:                break;
                   1115: 
                   1116:              case '%':
                   1117:                commutative = i;
                   1118:                break;
                   1119: 
                   1120:              case '?':
                   1121:                reject++;
                   1122:                break;
                   1123: 
                   1124:              case '!':
                   1125:                reject = 100;
                   1126:                break;
                   1127: 
                   1128:              case '#':
                   1129:                /* Ignore rest of this alternative as far as
                   1130:                   reloading is concerned.  */
                   1131:                while (*p && *p != ',') p++;
                   1132:                break;
                   1133: 
                   1134:              case '0':
                   1135:              case '1':
                   1136:              case '2':
                   1137:              case '3':
                   1138:              case '4':
                   1139:                c -= '0';
                   1140:                this_alternative_matches[i] = c;
                   1141:                /* We are supposed to match a previous operand.
                   1142:                   If we do, we win if that one did.
                   1143:                   If we do not, count both of the operands as losers.
                   1144:                   (This is too conservative, since most of the time
                   1145:                   only a single reload insn will be needed to make
                   1146:                   the two operands win.  As a result, this alternative
                   1147:                   may be rejected when it is actually desirable.)  */
                   1148:                if ((swapped && (c != commutative || i != commutative + 1))
                   1149:                    /* If we are matching as if two operands were swapped,
                   1150:                       also pretend that operands_match had been computed
                   1151:                       with swapped.
                   1152:                       But if I is the second of those and C is the first,
                   1153:                       don't exchange them, because operands_match is valid
                   1154:                       only on one side of its diagonal.  */
                   1155:                    ? (operands_match
                   1156:                        [(c == commutative || c == commutative + 1)
                   1157:                         ? 2*commutative + 1 - c : c]
                   1158:                        [(i == commutative || i == commutative + 1)
                   1159:                         ? 2*commutative + 1 - i : i])
                   1160:                    : operands_match[c][i])
                   1161:                  win = this_alternative_win[c];
                   1162:                else
                   1163:                  {
                   1164:                    /* Operands don't match.  */
                   1165:                    rtx value;
                   1166:                    /* Retroactively mark the operand we had to match
                   1167:                       as a loser, if it wasn't already.  */
                   1168:                    if (this_alternative_win[c])
                   1169:                      losers++;
                   1170:                    this_alternative_win[c] = 0;
                   1171:                    if (this_alternative[c] == (int) NO_REGS)
                   1172:                      bad = 1;
                   1173:                    /* But count the pair only once in the total badness of
                   1174:                       this alternative, if the pair can be a dummy reload.  */
                   1175:                    value
                   1176:                      = find_dummy_reload (recog_operand[i], recog_operand[c],
                   1177:                                           recog_operand_loc[i], recog_operand_loc[c],
                   1178:                                           this_alternative[c], -1);
                   1179: 
                   1180:                    if (value != 0)
                   1181:                      losers--;
                   1182:                  }
                   1183:                /* This can be fixed with reloads if the operand
                   1184:                   we are supposed to match can be fixed with reloads.  */
                   1185:                badop = 0;
                   1186:                break;
                   1187: 
                   1188:              case 'p':
                   1189:                /* All necessary reloads for an address_operand
                   1190:                   were handled in find_reloads_address.  */
                   1191:                this_alternative[i] = (int) ALL_REGS;
                   1192:                win = 1;
                   1193:                break;
                   1194: 
                   1195:              case 'm':
                   1196:                if (GET_CODE (operand) == MEM
                   1197:                    || (GET_CODE (operand) == REG
                   1198:                        && REGNO (operand) >= FIRST_PSEUDO_REGISTER
                   1199:                        && reg_renumber[REGNO (operand)] < 0))
                   1200:                  win = 1;
                   1201:                if (GET_CODE (operand) == CONST_DOUBLE)
                   1202:                  badop = 0;
                   1203:                break;
                   1204: 
                   1205:              case '<':
                   1206:                if (GET_CODE (operand) == MEM
                   1207:                    && (GET_CODE (XEXP (operand, 0)) == PRE_DEC
                   1208:                        || GET_CODE (XEXP (operand, 0)) == POST_DEC))
                   1209:                  win = 1;
                   1210:                break;
                   1211: 
                   1212:              case '>':
                   1213:                if (GET_CODE (operand) == MEM
                   1214:                    && (GET_CODE (XEXP (operand, 0)) == PRE_INC
                   1215:                        || GET_CODE (XEXP (operand, 0)) == POST_INC))
                   1216:                  win = 1;
                   1217:                break;
                   1218: 
                   1219:                /* Memory operand whose address is offsettable.  */
                   1220:              case 'o':
                   1221:                if ((GET_CODE (operand) == MEM
                   1222:                     && offsetable_memref_p (operand))
                   1223:                    || (GET_CODE (operand) == REG
                   1224:                        && REGNO (operand) >= FIRST_PSEUDO_REGISTER
                   1225:                        && reg_renumber[REGNO (operand)] < 0))
                   1226:                  win = 1;
                   1227:                if (GET_CODE (operand) == CONST_DOUBLE
                   1228:                    || (GET_CODE (operand) == MEM
                   1229:                        && GET_CODE (XEXP (operand, 0)) != POST_INC
                   1230:                        && GET_CODE (XEXP (operand, 0)) != POST_DEC
                   1231:                        && GET_CODE (XEXP (operand, 0)) != PRE_INC
                   1232:                        && GET_CODE (XEXP (operand, 0)) != PRE_DEC))
                   1233:                  badop = 0;
                   1234:                offmemok = 1;
                   1235:                break;
                   1236: 
                   1237:              case '&':
                   1238:                /* Output operand that is stored before the need for the
                   1239:                   input operands (and their index registers) is over.  */
                   1240:                if (GET_CODE (operand) == REG)
                   1241:                  earlyclobber = 1, this_earlyclobber = 1;
                   1242:                break;
                   1243: 
                   1244:              case 'F':
                   1245:                if (GET_CODE (operand) == CONST_DOUBLE)
                   1246:                  win = 1;
                   1247:                break;
                   1248: 
                   1249:              case 'G':
                   1250:              case 'H':
                   1251:                if (GET_CODE (operand) == CONST_DOUBLE
                   1252:                    && CONST_DOUBLE_OK_FOR_LETTER_P (operand, c))
                   1253:                  win = 1;
                   1254:                break;
                   1255: 
                   1256:              case 's':
                   1257:                if (GET_CODE (operand) == CONST_INT)
                   1258:                  break;
                   1259:              case 'i':
                   1260:                if (CONSTANT_P (operand))
                   1261:                  win = 1;
                   1262:                break;
                   1263: 
                   1264:              case 'n':
                   1265:                if (GET_CODE (operand) == CONST_INT)
                   1266:                  win = 1;
                   1267:                break;
                   1268: 
                   1269:              case 'I':
                   1270:              case 'J':
                   1271:              case 'K':
                   1272:              case 'L':
                   1273:              case 'M':
                   1274:                if (GET_CODE (operand) == CONST_INT
                   1275:                    && CONST_OK_FOR_LETTER_P (INTVAL (operand), c))
                   1276:                  win = 1;
                   1277:                break;
                   1278: 
                   1279:              case 'g':
                   1280:                if (GENERAL_REGS == ALL_REGS
                   1281:                    || GET_CODE (operand) != REG
                   1282:                    || (REGNO (operand) >= FIRST_PSEUDO_REGISTER
                   1283:                        && reg_renumber[REGNO (operand)] < 0))
                   1284:                  win = 1;
                   1285:                /* Drop through into 'r' case */
                   1286: 
                   1287:              case 'r':
                   1288:                this_alternative[i]
                   1289:                  = (int) reg_class_subunion[this_alternative[i]][(int) GENERAL_REGS];
                   1290:                goto reg;
                   1291: 
                   1292:              default:
                   1293:                this_alternative[i]
                   1294:                  = (int) reg_class_subunion[this_alternative[i]][(int) REG_CLASS_FROM_LETTER (c)];
                   1295: 
                   1296:              reg:
                   1297:                badop = 0;
                   1298:                if (GET_CODE (operand) == REG
                   1299:                    && reg_renumbered_fits_class_p (operand,
                   1300:                                                    this_alternative[i],
                   1301:                                                    offset, GET_MODE (recog_operand[i])))
                   1302:                  win = 1;
                   1303:                break;
                   1304:              }
                   1305:          constraints[i] = p;
                   1306: 
                   1307:          /* Record which operands fit this alternative.  */
                   1308:          this_alternative_earlyclobber[i] = earlyclobber;
                   1309:          if (win && ! force_reload)
                   1310:            this_alternative_win[i] = 1;
                   1311:          else
                   1312:            {
                   1313:              this_alternative_offmemok[i] = offmemok;
                   1314:              losers++;
                   1315:              if (badop)
                   1316:                bad = 1;
                   1317:            }
                   1318:        }
                   1319: 
                   1320:       /* Now see if any output operands that are marked "earlyclobber"
                   1321:         in this alternative conflict with any input operands
                   1322:         or any memory addresses.  */
                   1323: 
                   1324:       for (i = 0; i < noperands; i++)
                   1325:        if (this_alternative_earlyclobber[i]
                   1326:            && this_alternative_win[i])
                   1327:          {
                   1328:            int j;
                   1329:            for (j = 0; j < noperands; j++)
                   1330:              /* Is this an input operand or a memory ref?  */
                   1331:              if ((GET_CODE (recog_operand[j]) == MEM
                   1332:                   || modified[j] != RELOAD_WRITE)
                   1333:                  /* Does it refer to the earlyclobber operand?  */
                   1334:                  && refers_to_regno_p (REGNO (recog_operand[i]),
                   1335:                                        recog_operand[j], 0))
                   1336:                break;
                   1337:            /* If an earlyclobber operand conflicts with something,
                   1338:               it must be reloaded, so request this and count the cost.  */
                   1339:            if (j != noperands)
                   1340:              {
                   1341:                losers++;
                   1342:                this_alternative_win[i] = 0;
                   1343:              }
                   1344:          }
                   1345: 
                   1346:       /* If one alternative accepts all the operands, no reload required,
                   1347:         choose that alternative; don't consider the remaining ones.  */
                   1348:       if (losers == 0)
                   1349:        {
                   1350:          /* Unswap these so that they are never swapped at `finish'.  */
                   1351:          recog_operand[1] = substed_operand[1];
                   1352:          recog_operand[2] = substed_operand[2];
                   1353:          for (i = 0; i < noperands; i++)
                   1354:            goal_alternative_win[i] = 1;
                   1355:          bcopy (this_alternative, goal_alternative,
                   1356:                 sizeof this_alternative);
                   1357:          bcopy (this_alternative_offmemok, goal_alternative_offmemok,
                   1358:                 sizeof this_alternative_offmemok);
                   1359:          bcopy (this_alternative_matches, goal_alternative_matches,
                   1360:                 sizeof this_alternative_matches);
                   1361:          goal_alternative_number = this_alternative_number;
                   1362:          goal_alternative_swapped = swapped;
                   1363:          goal_earlyclobber = this_earlyclobber;
                   1364:          goto finish;
                   1365:        }
                   1366: 
                   1367:       /* REJECT, set by the ! and ? constraint characters,
                   1368:         discourages the use of this alternative for a reload goal.  */
                   1369:       if (reject > 0)
                   1370:        losers += reject;
                   1371: 
                   1372:       /* If this alternative can be made to work by reloading,
                   1373:         and it needs less reloading than the others checked so far,
                   1374:         record it as the chosen goal for reloading.  */
                   1375:       if (! bad && best > losers)
                   1376:        {
                   1377:          bcopy (this_alternative, goal_alternative,
                   1378:                 sizeof this_alternative);
                   1379:          bcopy (this_alternative_win, goal_alternative_win,
                   1380:                 sizeof this_alternative_win);
                   1381:          bcopy (this_alternative_offmemok, goal_alternative_offmemok,
                   1382:                 sizeof this_alternative_offmemok);
                   1383:          bcopy (this_alternative_matches, goal_alternative_matches,
                   1384:                 sizeof this_alternative_matches);
                   1385:          goal_alternative_swapped = swapped;
                   1386:          best = losers;
                   1387:          goal_alternative_number = this_alternative_number;
                   1388:          goal_earlyclobber = this_earlyclobber;
                   1389:        }
                   1390:       this_alternative_number++;
                   1391:     }
                   1392: 
                   1393:   /* If insn is commutative (it's safe to exchange a certain pair of operands)
                   1394:      then we need to try each alternative twice,
                   1395:      the second time matching those two operands
                   1396:      as if we had exchanged them.
                   1397:      To do this, really exchange them in operands.
                   1398: 
                   1399:      If we have just tried the alternatives the second time,
                   1400:      return operands to normal and drop through.  */
                   1401: 
                   1402:   if (commutative >= 0)
                   1403:     {
                   1404:       swapped = !swapped;
                   1405:       if (swapped)
                   1406:        {
                   1407:          recog_operand[commutative] = substed_operand[commutative + 1];
                   1408:          recog_operand[commutative + 1] = substed_operand[commutative];
                   1409: 
                   1410:          bcopy (constraints1, constraints, noperands * sizeof (char *));
                   1411:          goto try_swapped;
                   1412:        }
                   1413:       else
                   1414:        {
                   1415:          recog_operand[commutative] = substed_operand[commutative];
                   1416:          recog_operand[commutative + 1] = substed_operand[commutative + 1];
                   1417:        }
                   1418:     }
                   1419: 
                   1420:   /* The operands don't meet the constraints.
                   1421:      goal_alternative describes the alternative
                   1422:      that we could reach by reloading the fewest operands.
                   1423:      Reload so as to fit it.  */
                   1424: 
                   1425:   if (best == MAX_RECOG_OPERANDS + 100)
                   1426:     abort ();                  /* No alternative works with reloads??  */
                   1427: 
                   1428:   /* Jump to `finish' from above if all operands are valid already.
                   1429:      In that case, goal_alternative_win is all 1.  */
                   1430:  finish:
                   1431: 
                   1432:   /* Right now, for any pair of operands I and J that are required to match,
                   1433:      with I < J,
                   1434:      goal_alternative_matches[J] is I.
                   1435:      Set up goal_alternative_matched as the inverse function:
                   1436:      goal_alternative_matched[I] = J.  */
                   1437: 
                   1438:   for (i = 0; i < noperands; i++)
                   1439:     goal_alternative_matched[i] = -1;
                   1440: 
                   1441:   for (i = 0; i < noperands; i++)
                   1442:     if (! goal_alternative_win[i]
                   1443:        && goal_alternative_matches[i] >= 0)
                   1444:       goal_alternative_matched[goal_alternative_matches[i]] = i;
                   1445: 
                   1446:   /* If the best alternative is with operands 1 and 2 swapped,
                   1447:      consider them swapped before reporting the reloads.  */
                   1448: 
                   1449:   if (goal_alternative_swapped)
                   1450:     {
                   1451:       register rtx tem;
                   1452: 
                   1453:       tem = substed_operand[commutative];
                   1454:       substed_operand[commutative] = substed_operand[commutative + 1];
                   1455:       substed_operand[commutative + 1] = tem;
                   1456:       tem = recog_operand[commutative];
                   1457:       recog_operand[commutative] = recog_operand[commutative + 1];
                   1458:       recog_operand[commutative + 1] = tem;
                   1459:     }
                   1460: 
                   1461:   /* Perform whatever substitutions on the operands we are supposed
                   1462:      to make due to commutativity or replacement of registers
                   1463:      with equivalent constants or memory slots.  */
                   1464: 
                   1465:   for (i = 0; i < noperands; i++)
                   1466:     {
                   1467:       *recog_operand_loc[i] = substed_operand[i];
                   1468:       /* While we are looping on operands, initialize this.  */
                   1469:       operand_reloadnum[i] = -1;
                   1470:     }
                   1471: 
                   1472:   /* Now record reloads for all the operands that need them.  */
                   1473:   for (i = 0; i < noperands; i++)
                   1474:     if (! goal_alternative_win[i])
                   1475:       {
                   1476:        /* Operands that match previous ones have already been handled.  */
                   1477:        if (goal_alternative_matches[i] >= 0)
                   1478:          ;
                   1479:        /* This clause forces a double constant into memory
                   1480:           if necessary.  But right now it appears never necessary.
                   1481:           Perhaps there should be a heuristic here to detect cases
                   1482:           when it is desirable, even though not necessary, to move
                   1483:           the constant to memory.  I can't decide when it is desirable.  */
                   1484:        else if (GET_CODE (recog_operand[i]) == CONST_DOUBLE
                   1485:                 && alternative_allows_memconst (constraints1[i], goal_alternative_number)
                   1486:                 && goal_alternative[i] == (int) NO_REGS)
                   1487:          {
                   1488:            *recog_operand_loc[i] = recog_operand[i]
                   1489:              = force_const_double_mem (recog_operand[i]);
                   1490:            find_reloads_toplev (recog_operand[i]);
                   1491:          }
                   1492:        /* Handle an operand with a nonoffsetable address
                   1493:           appearing where an offsetable address will do
                   1494:           by reloading the address into a base register.  */
                   1495:        else if (goal_alternative_matched[i] == -1
                   1496:                 && goal_alternative_offmemok[i]
                   1497:                 && GET_CODE (recog_operand[i]) == MEM
                   1498:                 && GET_CODE (XEXP (recog_operand[i], 0)) != POST_INC
                   1499:                 && GET_CODE (XEXP (recog_operand[i], 0)) != POST_DEC
                   1500:                 && GET_CODE (XEXP (recog_operand[i], 0)) != PRE_INC
                   1501:                 && GET_CODE (XEXP (recog_operand[i], 0)) != PRE_DEC)
                   1502:          push_reload (XEXP (recog_operand[i], 0), 0,
                   1503:                       &XEXP (recog_operand[i], 0), 0,
                   1504:                       BASE_REG_CLASS, GET_MODE (XEXP (recog_operand[i], 0)),
                   1505:                       0, 0, 0);
                   1506:        else if (goal_alternative_matched[i] == -1)
                   1507:          operand_reloadnum[i] =
                   1508:            push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0,
                   1509:                         modified[i] != RELOAD_READ ? recog_operand[i] : 0,
                   1510:                         recog_operand_loc[i], 0,
                   1511:                         (enum reg_class) goal_alternative[i],
                   1512:                         (modified[i] == RELOAD_WRITE ? VOIDmode : operand_mode[i]),
                   1513:                         (modified[i] == RELOAD_READ ? VOIDmode : operand_mode[i]),
                   1514:                         (insn_code_number < 0 ? 0
                   1515:                          : insn_operand_strict_low[insn_code_number][i]),
                   1516:                         0);
                   1517:        /* In a matching pair of operands, one must be input only
                   1518:           and the other must be output only.
                   1519:           Pass the input operand as IN and the other as OUT.  */
                   1520:        else if (modified[i] == RELOAD_READ
                   1521:                 && modified[goal_alternative_matched[i]] == RELOAD_WRITE)
                   1522:          operand_reloadnum[goal_alternative_matched[i]]
                   1523:            = operand_reloadnum[i]
                   1524:            = push_reload (recog_operand[i],
                   1525:                           recog_operand[goal_alternative_matched[i]],
                   1526:                           recog_operand_loc[i],
                   1527:                           recog_operand_loc[goal_alternative_matched[i]],
                   1528:                           (enum reg_class) goal_alternative[i],
                   1529:                           operand_mode[i],
                   1530:                           operand_mode[goal_alternative_matched[i]],
                   1531:                           VOIDmode, 0);
                   1532:        else if (modified[i] == RELOAD_WRITE
                   1533:                 && modified[goal_alternative_matched[i]] == RELOAD_READ)
                   1534:          operand_reloadnum[goal_alternative_matched[i]]
                   1535:            = operand_reloadnum[i]
                   1536:            = push_reload (recog_operand[goal_alternative_matched[i]],
                   1537:                           recog_operand[i],
                   1538:                           recog_operand_loc[goal_alternative_matched[i]],
                   1539:                           recog_operand_loc[i],
                   1540:                           (enum reg_class) goal_alternative[i],
                   1541:                           operand_mode[goal_alternative_matched[i]],
                   1542:                           operand_mode[i],
                   1543:                           VOIDmode, 0);
                   1544:        else abort ();
                   1545:       }
                   1546:     else if (goal_alternative_matched[i] < 0
                   1547:             && goal_alternative_matches[i] < 0)
                   1548:       {
                   1549:        rtx operand = recog_operand[i];
                   1550:        /* For each non-matching operand that's a pseudo-register 
                   1551:           that didn't get a hard register, make an optional reload.
                   1552:           This may get done even if the insn needs no reloads otherwise.  */
                   1553:        /* (It would be safe to make an optional reload for a matching pair
                   1554:           of operands, but we don't bother yet.)  */
                   1555:        while (GET_CODE (operand) == SUBREG)
                   1556:          operand = XEXP (operand, 0);
                   1557:        if (GET_CODE (operand) == REG
                   1558:            && REGNO (operand) >= FIRST_PSEUDO_REGISTER
                   1559:            && reg_renumber[REGNO (operand)] < 0
                   1560:            && (enum reg_class) goal_alternative[i] != NO_REGS)
                   1561:          operand_reloadnum[i]
                   1562:            = push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0,
                   1563:                           modified[i] != RELOAD_READ ? recog_operand[i] : 0,
                   1564:                           recog_operand_loc[i], 0,
                   1565:                           (enum reg_class) goal_alternative[i],
                   1566:                           (modified[i] == RELOAD_WRITE ? VOIDmode : operand_mode[i]),
                   1567:                           (modified[i] == RELOAD_READ ? VOIDmode : operand_mode[i]),
                   1568:                           insn_operand_strict_low[insn_code_number][i],
                   1569:                           1);
                   1570:        else
                   1571:          operand_reloadnum[i] = -1;
                   1572:       }
                   1573: 
                   1574:   /* Perhaps an output reload can be combined with another
                   1575:      to reduce needs by one.  */
                   1576:   if (!goal_earlyclobber)
                   1577:     combine_reloads ();
                   1578: 
                   1579:   /* If this insn pattern contains any MATCH_DUP's, make sure that
                   1580:      they will be substituted if the operands they match are substituted.
                   1581:      Also do now any substitutions we already did on the operands.  */
                   1582:   if (insn_code_number >= 0)
                   1583:     for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
                   1584:       {
                   1585:        int opno = recog_dup_num[i];
                   1586:        *recog_dup_loc[i] = *recog_operand_loc[opno];
                   1587:        if (operand_reloadnum[opno] >= 0)
                   1588:          push_replacement (recog_dup_loc[i], operand_reloadnum[opno],
                   1589:                            insn_operand_mode[insn_code_number][opno]);
                   1590:       }
                   1591: 
                   1592:   /* For each reload of a reg into some other class of reg,
                   1593:      search for an existing equivalent reg (same value now) in the right class.
                   1594:      We can use it as long as we don't need to change its contents.  */
                   1595:   for (i = 0; i < n_reloads; i++)
                   1596:     if (reload_reg_rtx[i] == 0
                   1597:        && reload_in[i] != 0
                   1598:        && GET_CODE (reload_in[i]) == REG
                   1599:        && reload_out[i] == 0)
                   1600:       {
                   1601:        reload_reg_rtx[i]
                   1602:          = find_equiv_reg (reload_in[i], insn, reload_reg_class[i], -1,
                   1603:                            static_reload_reg_p, 0);
                   1604:        /* Prevent generation of insn to load the value
                   1605:           because the one we found already has the value.  */
                   1606:        if (reload_reg_rtx[i])
                   1607:          reload_in[i] = reload_reg_rtx[i];
                   1608:       }
                   1609: 
                   1610: #else /* no REGISTER_CONSTRAINTS */
                   1611:   int noperands;
                   1612:   int insn_code_number;
                   1613:   register int i;
                   1614:   rtx body = PATTERN (insn);
                   1615: 
                   1616:   n_reloads = 0;
                   1617:   n_replacements = 0;
                   1618:   replace_reloads = replace;
                   1619:   indirect_ok = ind_ok;
                   1620:   this_insn = insn;
                   1621: 
                   1622:   /* Find what kind of insn this is.  NOPERANDS gets number of operands.
                   1623:      Store the operand values in RECOG_OPERAND and the locations
                   1624:      of the words in the insn that point to them in RECOG_OPERAND_LOC.
                   1625:      Return if the insn needs no reload processing.  */
                   1626: 
                   1627:   switch (GET_CODE (body))
                   1628:     {
                   1629:     case USE:
                   1630:     case CLOBBER:
                   1631:     case ASM_INPUT:
                   1632:     case ADDR_VEC:
                   1633:     case ADDR_DIFF_VEC:
                   1634:       return;
                   1635: 
                   1636:     case PARALLEL:
                   1637:     case SET:
                   1638:       noperands = asm_noperands (body);
                   1639:       if (noperands > 0)
                   1640:        {
                   1641:          /* This insn is an `asm' with operands.
                   1642:             First, find out how many operands, and allocate space.  */
                   1643: 
                   1644:          insn_code_number = -1;
                   1645:          /* ??? This is a bug! ???
                   1646:             Give up and delete this insn if it has too many operands.  */
                   1647:          if (noperands > MAX_RECOG_OPERANDS)
                   1648:            abort ();
                   1649: 
                   1650:          /* Now get the operand values out of the insn.  */
                   1651: 
                   1652:          decode_asm_operands (body, recog_operand, recog_operand_loc, 0, 0);
                   1653:          break;
                   1654:        }
                   1655: 
                   1656:     default:
                   1657:       /* Ordinary insn: recognize it, allocate space for operands and
                   1658:         constraints, and get them out via insn_extract.  */
                   1659: 
                   1660:       insn_code_number = recog_memoized (insn);
                   1661:       noperands = insn_n_operands[insn_code_number];
                   1662:       insn_extract (insn);
                   1663:     }
                   1664: 
                   1665:   if (noperands == 0)
                   1666:     return;
                   1667: 
                   1668:   for (i = 0; i < noperands; i++)
                   1669:     {
                   1670:       register RTX_CODE code = GET_CODE (recog_operand[i]);
                   1671: 
                   1672:       if (insn_code_number >= 0)
                   1673:        if (insn_operand_address_p[insn_code_number][i])
                   1674:          find_reloads_address (VOIDmode, 0,
                   1675:                                recog_operand[i], recog_operand_loc[i]);
                   1676:       if (code == MEM)
                   1677:        find_reloads_address (GET_MODE (recog_operand[i]),
                   1678:                              recog_operand_loc[i],
                   1679:                              XEXP (recog_operand[i], 0),
                   1680:                              &XEXP (recog_operand[i], 0));
                   1681:       if (code == SUBREG)
                   1682:        find_reloads_toplev (recog_operand[i]);
                   1683:       if (code == REG)
                   1684:        {
                   1685:          register int regno = REGNO (recog_operand[i]);
                   1686:          if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1687:              && reg_equiv_constant[regno] != 0)
                   1688:            recog_operand[i] = *recog_operand_loc[i]
                   1689:              = reg_equiv_constant[regno];
                   1690:        }
                   1691:     }
                   1692: #endif /* no REGISTER_CONSTRAINTS */
                   1693: }
                   1694: 
                   1695: /* Return 1 if alternative number ALTNUM in constraint-string CONSTRAINT
                   1696:    accepts a memory operand with constant address.  */
                   1697: 
                   1698: static int
                   1699: alternative_allows_memconst (constraint, altnum)
                   1700:      char *constraint;
                   1701:      int altnum;
                   1702: {
                   1703:   register int c;
                   1704:   /* Skip alternatives before the one requested.  */
                   1705:   while (altnum > 0)
                   1706:     {
                   1707:       while (*constraint++ != ',');
                   1708:       altnum--;
                   1709:     }
                   1710:   /* Scan the requested alternative for 'm' or 'o'.
                   1711:      If one of them is present, this alternative accepts memory constants.  */
                   1712:   while ((c = *constraint++) && c != ',' && c != '#')
                   1713:     if (c == 'm' || c == 'o')
                   1714:       return 1;
                   1715:   return 0;
                   1716: }
                   1717: 
                   1718: /* Scan X for memory references and scan the addresses for reloading.
                   1719:    Also checks for references to "constant" regs that we want to eliminate
                   1720:    and replaces them with the values they stand for.
                   1721:    We may alter X descructively if it contains a reference to such.
                   1722:    If X is just a constant reg, we return the equivalent value
                   1723:    instead of X.  */
                   1724: 
                   1725: static rtx
                   1726: find_reloads_toplev (x)
                   1727:      rtx x;
                   1728: {
                   1729:   register RTX_CODE code = GET_CODE (x);
                   1730: 
                   1731:   register char *fmt = GET_RTX_FORMAT (code);
                   1732:   register int i;
                   1733: 
                   1734:   if (code == REG)
                   1735:     {
                   1736:       /* This code is duplicated for speed in find_reloads.  */
                   1737:       register int regno = REGNO (x);
                   1738:       if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1739:          && reg_equiv_constant[regno] != 0)
                   1740:        x = reg_equiv_constant[regno];
                   1741:       else if (reg_equiv_address[regno] != 0)
                   1742:        {
                   1743:          x = gen_rtx (MEM, GET_MODE (x),
                   1744:                       reg_equiv_address[regno]);
                   1745:          find_reloads_address (GET_MODE (x), 0,
                   1746:                                XEXP (x, 0),
                   1747:                                &XEXP (x, 0));
                   1748:        }
                   1749:       return x;
                   1750: 
                   1751: 
                   1752:     }
                   1753:   else if (code == MEM)
                   1754:     {
                   1755:       rtx tem = x;
                   1756:       find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0));
                   1757:       return tem;
                   1758:     }
                   1759:   else
                   1760:     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   1761:       {
                   1762:        if (fmt[i] == 'e')
                   1763:          XEXP (x, i) = find_reloads_toplev (XEXP (x, i));
                   1764:       }
                   1765:   return x;
                   1766: }
                   1767: 
                   1768: static rtx
                   1769: make_memloc (ad, regno)
                   1770:      rtx ad;
                   1771:      int regno;
                   1772: {
                   1773:   register int i;
                   1774:   rtx tem = reg_equiv_address[regno];
                   1775:   for (i = 0; i < n_memlocs; i++)
                   1776:     if (rtx_equal_p (tem, XEXP (memlocs[i], 0)))
                   1777:       return memlocs[i];
                   1778:   tem = gen_rtx (MEM, GET_MODE (ad), tem);
                   1779:   memlocs[n_memlocs++] = tem;
                   1780:   return tem;
                   1781: }
                   1782: 
                   1783: /* Record all reloads needed for handling memory address AD
                   1784:    which appears in *LOC in a memory reference to mode MODE
                   1785:    which itself is stored in location  *MEMREFLOC.
                   1786:    (MEMREFLOC may be zero, meaning don't ever bother to copy the memref.)
                   1787:    Note that we take shortcuts assuming that no multi-reg machine mode
                   1788:    occurs as part of an address.  */
                   1789: 
                   1790: static void
                   1791: find_reloads_address (mode, memrefloc, ad, loc)
                   1792:      enum machine_mode mode;
                   1793:      rtx *memrefloc;
                   1794:      rtx ad;
                   1795:      rtx *loc;
                   1796: {
                   1797:   register int regno;
                   1798:   rtx tem;
                   1799: 
                   1800:   if (GET_CODE (ad) == REG)
                   1801:     {
                   1802:       regno = REGNO (ad);
                   1803: 
                   1804:       if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1805:          && reg_equiv_constant[regno] != 0)
                   1806:        {
                   1807:          if (strict_memory_address_p (mode, reg_equiv_constant[regno]))
                   1808:            {
                   1809:              *loc = ad = reg_equiv_constant[regno];
                   1810:              return;
                   1811:            }
                   1812:        }
                   1813:       if (reg_equiv_address[regno] != 0)
                   1814:        {
                   1815:          rtx tem = make_memloc (ad, regno);
                   1816:          push_reload (XEXP (tem, 0), 0, &XEXP (tem, 0), 0,
                   1817:                       BASE_REG_CLASS,
                   1818:                       GET_MODE (XEXP (tem, 0)), 0, VOIDmode, 0);
                   1819:          push_reload (tem, 0, loc, 0, BASE_REG_CLASS,
                   1820:                       GET_MODE (ad), 0, VOIDmode, 0);
                   1821:          return;
                   1822:        }
                   1823:       if (! (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1824:             ? indirect_ok
                   1825:             : REGNO_OK_FOR_BASE_P (regno)))
                   1826:        push_reload (ad, 0, loc, 0, BASE_REG_CLASS,
                   1827:                     GET_MODE (ad), 0, VOIDmode, 0);
                   1828:       return;
                   1829:     }
                   1830: 
                   1831:   if (strict_memory_address_p (mode, ad))
                   1832:     {
                   1833:       /* The address appears valid, so reloads are not needed.
                   1834:         But the address may contain an eliminable register.
                   1835:         This can happen because a machine with indirect addressing
                   1836:         may consider a pseudo register by itself a valid address even when
                   1837:         it has failed to get a hard reg.
                   1838:         So do a tree-walk to find and eliminate all such regs.  */
                   1839: 
                   1840:       *loc = subst_reg_equivs (ad);
                   1841: 
                   1842:       /* Check result for validity after substitution.  */
                   1843:       if (strict_memory_address_p (mode, ad))
                   1844:        return;
                   1845:     }
                   1846: 
                   1847:   /* If we have address of a stack slot but it's not valid
                   1848:      (displacement is too large), compute the sum in a register.  */
                   1849:   if (GET_CODE (ad) == PLUS
                   1850:       && GET_CODE (XEXP (ad, 0)) == REG
                   1851:       && (REGNO (XEXP (ad, 0)) == FRAME_POINTER_REGNUM
                   1852:          || REGNO (XEXP (ad, 0)) == ARG_POINTER_REGNUM)
                   1853:       && GET_CODE (XEXP (ad, 1)) == CONST_INT)
                   1854:     {
                   1855:       /* Unshare the MEM rtx so we can safely alter it.  */
                   1856:       if (memrefloc)
                   1857:        {
                   1858:          *memrefloc = copy_rtx (*memrefloc);
                   1859:          loc = &XEXP (*memrefloc, 0);
                   1860:        }
                   1861:       push_reload (ad, 0, loc, 0, BASE_REG_CLASS,
                   1862:                   GET_MODE (ad), 0, VOIDmode, 0);
                   1863:       return;
                   1864:     }
                   1865: 
                   1866:   /* See if address becomes valid when an eliminable register
                   1867:      in a sum is replaced.  */
                   1868: 
                   1869:   tem = subst_indexed_address (ad);
                   1870:   if (tem != ad && strict_memory_address_p (mode, tem))
                   1871:     {
                   1872:       /* Ok, we win that way.  Replace any additional eliminable
                   1873:         registers.  */
                   1874: 
                   1875:       tem = subst_reg_equivs (tem);
                   1876: 
                   1877:       /* Make sure that didn't make the address invalid again.  */
                   1878: 
                   1879:       if (strict_memory_address_p (mode, tem))
                   1880:        {
                   1881:          *loc = tem;
                   1882:          return;
                   1883:        }
                   1884:     }
                   1885: 
                   1886:   /* If constants aren't valid addresses, reload the constant address
                   1887:      into a register.  */
                   1888:   if (CONSTANT_ADDRESS_P (ad) && ! strict_memory_address_p (mode, ad))
                   1889:     {
                   1890:       push_reload (ad, 0, loc, 0,
                   1891:                   BASE_REG_CLASS,
                   1892:                   GET_MODE (ad), 0, VOIDmode, 0);
                   1893:       return;
                   1894:     }
                   1895: 
                   1896:   find_reloads_address_1 (ad, 0, loc);
                   1897: }
                   1898: 
                   1899: /* Find all pseudo regs appearing in AD
                   1900:    that are eliminable in favor of equivalent values
                   1901:    and do not have hard regs; replace them by their equivalents.  */
                   1902: 
                   1903: static rtx
                   1904: subst_reg_equivs (ad)
                   1905:      rtx ad;
                   1906: {
                   1907:   register RTX_CODE code = GET_CODE (ad);
                   1908:   register int i;
                   1909:   register char *fmt;
                   1910: 
                   1911:   switch (code)
                   1912:     {
                   1913:     case CONST_INT:
                   1914:     case CONST:
                   1915:     case CONST_DOUBLE:
                   1916:     case SYMBOL_REF:
                   1917:     case LABEL_REF:
                   1918:     case PC:
                   1919:     case CC0:
                   1920:       return ad;
                   1921: 
                   1922:     case REG:
                   1923:       {
                   1924:        register int regno = REGNO (ad);
                   1925: 
                   1926:        if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   1927:            && reg_equiv_constant[regno] != 0)
                   1928:          return reg_equiv_constant[regno];
                   1929:       }
                   1930:       return ad;
                   1931:     }
                   1932: 
                   1933:   fmt = GET_RTX_FORMAT (code);
                   1934:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   1935:     if (fmt[i] == 'e')
                   1936:       XEXP (ad, i) = subst_reg_equivs (XEXP (ad, i));
                   1937:   return ad;
                   1938: }
                   1939: 
                   1940: /* If ADDR is a sum containing a pseudo register that should be
                   1941:    replaced with a constant (from reg_equiv_constant),
                   1942:    return the result of doing so, and also apply the associative
                   1943:    law so that the result is more likely to be a valid address.
                   1944:    (But it is not guaranteed to be one.)
                   1945: 
                   1946:    In all other cases, return ADDR.  */
                   1947: 
                   1948: static rtx
                   1949: subst_indexed_address (addr)
                   1950:      rtx addr;
                   1951: {
                   1952:   rtx const_part = 0;
                   1953:   rtx var_part = 0;
                   1954:   int regno;
                   1955: 
                   1956:   if (GET_CODE (addr) == PLUS)
                   1957:     {
                   1958:       if (CONSTANT_P (XEXP (addr, 0)))
                   1959:        const_part = XEXP (addr, 0),
                   1960:        var_part = XEXP (addr, 1);
                   1961:       else if (CONSTANT_P (XEXP (addr, 1)))
                   1962:        const_part = XEXP (addr, 1),
                   1963:        var_part = XEXP (addr, 0);
                   1964: 
                   1965:       if (const_part == 0)
                   1966:        return addr;
                   1967: 
                   1968:       if (GET_CODE (const_part) == CONST)
                   1969:        const_part = XEXP (const_part, 0);
                   1970: 
                   1971:       if (GET_CODE (var_part) == REG
                   1972:          && (regno = REGNO (var_part)) >= FIRST_PSEUDO_REGISTER
                   1973:          && reg_renumber[regno] < 0
                   1974:          && reg_equiv_constant[regno] != 0)
                   1975:        return gen_rtx (CONST, VOIDmode,
                   1976:                        gen_rtx (PLUS, Pmode, const_part,
                   1977:                                 reg_equiv_constant[regno]));
                   1978: 
                   1979:       if (GET_CODE (var_part) != PLUS)
                   1980:        return addr;
                   1981: 
                   1982:       if (GET_CODE (XEXP (var_part, 0)) == REG
                   1983:          && (regno = REGNO (XEXP (var_part, 0))) >= FIRST_PSEUDO_REGISTER
                   1984:          && reg_renumber[regno] < 0
                   1985:          && reg_equiv_constant[regno] != 0)
                   1986:        return gen_rtx (PLUS, Pmode, XEXP (var_part, 1),
                   1987:                        gen_rtx (CONST, VOIDmode,
                   1988:                                 gen_rtx (PLUS, Pmode, const_part,
                   1989:                                          reg_equiv_constant[regno])));
                   1990: 
                   1991:       if (GET_CODE (XEXP (var_part, 1)) == REG
                   1992:          && (regno = REGNO (XEXP (var_part, 1))) >= FIRST_PSEUDO_REGISTER
                   1993:          && reg_renumber[regno] < 0
                   1994:          && reg_equiv_constant[regno] != 0)
                   1995:        return gen_rtx (PLUS, Pmode, XEXP (var_part, 0),
                   1996:                        gen_rtx (CONST, VOIDmode,
                   1997:                                 gen_rtx (PLUS, Pmode, const_part,
                   1998:                                          reg_equiv_constant[regno])));
                   1999:     }
                   2000:   return addr;
                   2001: }
                   2002: 
                   2003: /* Record the pseudo registers we must reload into hard registers
                   2004:    in a subexpression of a memory address, X.
                   2005:    CONTEXT = 1 means we are considering regs as index regs,
                   2006:    = 0 means we are considering them as base regs.
                   2007: 
                   2008:    We return X, whose operands may have been altered,
                   2009:    or perhaps a RELOAD rtx if X itself was a REG that must be reloaded.  */
                   2010: 
                   2011: /* Note that we take shortcuts assuming that no multi-reg machine mode
                   2012:    occurs as part of an address.
                   2013:    Also, this is not fully machine-customizable; it works for machines
                   2014:    such as vaxes and 68000's and 32000's, but other possible machines
                   2015:    could have addressing modes that this does not handle right.  */
                   2016: 
                   2017: static void
                   2018: find_reloads_address_1 (x, context, loc)
                   2019:      rtx x;
                   2020:      int context;
                   2021:      rtx *loc;
                   2022: {
                   2023:   register RTX_CODE code = GET_CODE (x);
                   2024: 
                   2025:   if (code == PLUS)
                   2026:     {
                   2027:       register rtx op0 = XEXP (x, 0);
                   2028:       register rtx op1 = XEXP (x, 1);
                   2029:       register RTX_CODE code0 = GET_CODE (op0);
                   2030:       register RTX_CODE code1 = GET_CODE (op1);
                   2031:       if (code0 == MULT || code0 == SIGN_EXTEND || code1 == MEM)
                   2032:        {
                   2033:          find_reloads_address_1 (op0, 1, &XEXP (x, 0));
                   2034:          find_reloads_address_1 (op1, 0, &XEXP (x, 1));
                   2035:        }
                   2036:       else if (code1 == MULT || code1 == SIGN_EXTEND || code0 == MEM)
                   2037:        {
                   2038:          find_reloads_address_1 (op0, 0, &XEXP (x, 0));
                   2039:          find_reloads_address_1 (op1, 1, &XEXP (x, 1));
                   2040:        }
                   2041:       else if (code0 == CONST_INT || code0 == CONST
                   2042:               || code0 == SYMBOL_REF || code0 == LABEL_REF)
                   2043:        {
                   2044:          find_reloads_address_1 (op1, 0, &XEXP (x, 1));
                   2045:        }
                   2046:       else if (code1 == CONST_INT || code1 == CONST
                   2047:               || code1 == SYMBOL_REF || code1 == LABEL_REF)
                   2048:        {
                   2049:          find_reloads_address_1 (op0, 0, &XEXP (x, 0));
                   2050:        }
                   2051:       else if (code0 == REG && code1 == REG)
                   2052:        {
                   2053:          if (REG_OK_FOR_INDEX_P (op0)
                   2054:              && REG_OK_FOR_BASE_P (op1))
                   2055:            return;
                   2056:          else if (REG_OK_FOR_INDEX_P (op1)
                   2057:              && REG_OK_FOR_BASE_P (op0))
                   2058:            return;
                   2059:          else if (REG_OK_FOR_BASE_P (op1))
                   2060:            find_reloads_address_1 (op0, 1, &XEXP (x, 0));
                   2061:          else if (REG_OK_FOR_BASE_P (op0))
                   2062:            find_reloads_address_1 (op1, 1, &XEXP (x, 1));
                   2063:          else if (REG_OK_FOR_INDEX_P (op1))
                   2064:            find_reloads_address_1 (op0, 0, &XEXP (x, 0));
                   2065:          else if (REG_OK_FOR_INDEX_P (op0))
                   2066:            find_reloads_address_1 (op1, 0, &XEXP (x, 1));
                   2067:          else
                   2068:            {
                   2069:              find_reloads_address_1 (op0, 1, &XEXP (x, 0));
                   2070:              find_reloads_address_1 (op1, 0, &XEXP (x, 1));
                   2071:            }
                   2072:        }
                   2073:       else if (code0 == REG)
                   2074:        {
                   2075:          find_reloads_address_1 (op0, 1, &XEXP (x, 0));
                   2076:          find_reloads_address_1 (op1, 0, &XEXP (x, 1));
                   2077:        }
                   2078:       else if (code1 == REG)
                   2079:        {
                   2080:          find_reloads_address_1 (op1, 1, &XEXP (x, 1));
                   2081:          find_reloads_address_1 (op0, 0, &XEXP (x, 0));
                   2082:        }
                   2083:     }
                   2084:   else if (code == POST_INC || code == POST_DEC
                   2085:           || code == PRE_INC || code == PRE_DEC)
                   2086:     {
                   2087:       if (GET_CODE (XEXP (x, 0)) == REG)
                   2088:        {
                   2089:          register int regno = REGNO (XEXP (x, 0));
                   2090: 
                   2091:          /* A register that is incremented cannot be constant!  */
                   2092:          if (regno >= FIRST_PSEUDO_REGISTER
                   2093:              && reg_equiv_constant[regno] != 0)
                   2094:            abort ();
                   2095: 
                   2096:          /* Handle a register that is equivalent to a memory location
                   2097:             which cannot be addressed directly.  */
                   2098:          if (reg_equiv_address[regno] != 0)
                   2099:            {
                   2100:              rtx tem = make_memloc (XEXP (x, 0), regno);
                   2101:              /* First reload the memory location's address.  */
                   2102:              push_reload (XEXP (tem, 0), 0, &XEXP (tem, 0), 0,
                   2103:                           BASE_REG_CLASS,
                   2104:                           GET_MODE (XEXP (tem, 0)), 0, VOIDmode, 0);
                   2105:              /* Then reload the memory reference itself,
                   2106:                 pretending it is located in the PRE_INC or whatever.  */
                   2107:              push_reload (tem, tem, &XEXP (x, 0), 0,
                   2108:                           context ? INDEX_REG_CLASS : BASE_REG_CLASS,
                   2109:                           GET_MODE (tem), GET_MODE (tem), VOIDmode, 0);
                   2110:              return;
                   2111:            }
                   2112: 
                   2113:          /* Handle any other sort of register.  */
                   2114: 
                   2115:          if (reg_renumber[regno] >= 0)
                   2116:            regno = reg_renumber[regno];
                   2117:          if ((regno >= FIRST_PSEUDO_REGISTER
                   2118:               || !(context ? REGNO_OK_FOR_INDEX_P (regno)
                   2119:                    : REGNO_OK_FOR_BASE_P (regno))))
                   2120:            {
                   2121:              register rtx link;
                   2122:              int reloadnum
                   2123:                = push_reload (XEXP (x, 0), XEXP (x, 0),
                   2124:                               &XEXP (x, 0), 0,
                   2125:                               context ? INDEX_REG_CLASS : BASE_REG_CLASS,
                   2126:                               GET_MODE (XEXP (x, 0)),
                   2127:                               GET_MODE (XEXP (x, 0)), VOIDmode, 0);
                   2128: 
                   2129:              for (link = REG_NOTES (this_insn);
                   2130:                   link; link = XEXP (link, 1))
                   2131:                if (REG_NOTE_KIND (link) == REG_INC
                   2132:                    && REGNO (XEXP (link, 0)) == REGNO (XEXP (x, 0)))
                   2133:                  push_replacement (&XEXP (link, 0), reloadnum, VOIDmode);
                   2134:            }
                   2135:          return;
                   2136:        }
                   2137:     }
                   2138:   else if (code == REG)
                   2139:     {
                   2140:       register int regno = REGNO (x);
                   2141: 
                   2142:       if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0
                   2143:          && reg_equiv_constant[regno] != 0)
                   2144:        {
                   2145:          push_reload (reg_equiv_constant[regno], 0, loc, 0,
                   2146:                       context ? INDEX_REG_CLASS : BASE_REG_CLASS,
                   2147:                       GET_MODE (x), 0, VOIDmode, 0);
                   2148:          return;
                   2149:        }
                   2150: 
                   2151:       if (reg_equiv_address[regno] != 0)
                   2152:        {
                   2153:          x = make_memloc (x, regno);
                   2154:          push_reload (XEXP (x, 0), 0, &XEXP (x, 0), 0,
                   2155:                       BASE_REG_CLASS,
                   2156:                       GET_MODE (XEXP (x, 0)), 0, VOIDmode, 0);
                   2157:        }
                   2158: 
                   2159:       if (reg_renumber[regno] >= 0)
                   2160:        regno = reg_renumber[regno];
                   2161:       if ((regno >= FIRST_PSEUDO_REGISTER
                   2162:           || !(context ? REGNO_OK_FOR_INDEX_P (regno)
                   2163:                : REGNO_OK_FOR_BASE_P (regno))))
                   2164:        {
                   2165:          push_reload (x, 0, loc, 0,
                   2166:                       context ? INDEX_REG_CLASS : BASE_REG_CLASS,
                   2167:                       GET_MODE (x), 0, VOIDmode, 0);
                   2168:          return;
                   2169:        }
                   2170:     }
                   2171:   else
                   2172:     {
                   2173:       register char *fmt = GET_RTX_FORMAT (code);
                   2174:       register int i;
                   2175:       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   2176:        {
                   2177:          if (fmt[i] == 'e')
                   2178:            find_reloads_address_1 (XEXP (x, i), context, &XEXP (x, i));
                   2179:        }
                   2180:     }
                   2181: }
                   2182: 
                   2183: /* Substitute into X the registers into which we have reloaded
                   2184:    the things that need reloading.  The array `replacements'
                   2185:    says contains the locations of all pointers that must be changed
                   2186:    and says what to replace them with.
                   2187: 
                   2188:    Return the rtx that X translates into; usually X, but modified.  */
                   2189: 
                   2190: void
                   2191: subst_reloads ()
                   2192: {
                   2193:   register int i;
                   2194: 
                   2195:   for (i = 0; i < n_replacements; i++)
                   2196:     {
                   2197:       register struct replacement *r = &replacements[i];
                   2198:       register rtx reloadreg = reload_reg_rtx[r->what];
                   2199:       if (reloadreg)
                   2200:        {
                   2201:          /* Encapsulate RELOADREG so its machine mode matches what
                   2202:             used to be there.  */
                   2203:          if (GET_MODE (reloadreg) != r->mode && r->mode != VOIDmode)
                   2204:            reloadreg = gen_rtx (SUBREG, r->mode, reloadreg, 0);
                   2205:          *r->where = reloadreg;
                   2206:        }
                   2207:       /* If reload got no reg and isn't optional, something's wrong.  */
                   2208:       else if (! reload_optional[r->what])
                   2209:        abort ();
                   2210:     }
                   2211: }
                   2212: 
                   2213: #if 0
                   2214: 
                   2215: /* [[This function is currently obsolete, now that volatility
                   2216:    is represented by a special bit `volatil' so VOLATILE is never used;
                   2217:    and UNCHANGING has never been brought into use.]]
                   2218: 
                   2219:    Alter X by eliminating all VOLATILE and UNCHANGING expressions.
                   2220:    Each of them is replaced by its operand.
                   2221:    Thus, (PLUS (VOLATILE (MEM (REG 5))) (CONST_INT 4))
                   2222:    becomes (PLUS (MEM (REG 5)) (CONST_INT 4)).
                   2223: 
                   2224:    If X is itself a VOLATILE expression,
                   2225:    we return the expression that should replace it
                   2226:    but we do not modify X.  */
                   2227: 
                   2228: static rtx
                   2229: forget_volatility (x)
                   2230:      register rtx x;
                   2231: {
                   2232:   enum rtx_code code = GET_CODE (x);
                   2233:   register char *fmt;
                   2234:   register int i;
                   2235:   register rtx value = 0;
                   2236: 
                   2237:   switch (code)
                   2238:     {
                   2239:     case LABEL_REF:
                   2240:     case SYMBOL_REF:
                   2241:     case CONST_INT:
                   2242:     case CONST_DOUBLE:
                   2243:     case CONST:
                   2244:     case REG:
                   2245:     case CC0:
                   2246:     case PC:
                   2247:       return x;
                   2248: 
                   2249:     case VOLATILE:
                   2250:     case UNCHANGING:
                   2251:       return XEXP (x, 0);
                   2252:     }
                   2253: 
                   2254:   fmt = GET_RTX_FORMAT (code);
                   2255:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   2256:     {
                   2257:       if (fmt[i] == 'e')
                   2258:        XEXP (x, i) = forget_volatility (XEXP (x, i));
                   2259:       if (fmt[i] == 'E')
                   2260:        {
                   2261:          register int j;
                   2262:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   2263:            XVECEXP (x, i, j) = forget_volatility (XVECEXP (x, i, j));
                   2264:        }
                   2265:     }
                   2266: 
                   2267:   return x;
                   2268: }
                   2269: 
                   2270: #endif
                   2271: 
                   2272: /* Check the insns before INSN to see if there is a suitable register
                   2273:    containing the same value as GOAL.
                   2274:    If OTHER is -1, look for a register in class CLASS.
                   2275:    Otherwise, just see if register number OTHER shares GOAL's value.
                   2276: 
                   2277:    Return an rtx for the register found, or zero if none is found.
                   2278: 
                   2279:    If RELOAD_REG_P is (short *)1,
                   2280:    we reject any hard reg that appears in reload_reg_rtx
                   2281:    because such a hard reg is also needed coming into this insn.
                   2282: 
                   2283:    If RELOAD_REG_P is any other nonzero value,
                   2284:    it is a vector indexed by hard reg number
                   2285:    and we reject any hard reg whose element in the vector is nonnegative
                   2286:    as well as any that appears in reload_reg_rtx.
                   2287: 
                   2288:    If GOAL is zero, then GOALREG is a register number; we look
                   2289:    for an equivalent for that register.
                   2290: 
                   2291:    This function is used by jump.c as well as in the reload pass.
                   2292: 
                   2293:    If GOAL is a PLUS, we assume it adds the stack pointer to a constant.  */
                   2294: 
                   2295: rtx
                   2296: find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg)
                   2297:      register rtx goal;
                   2298:      rtx insn;
                   2299:      enum reg_class class;
                   2300:      register int other;
                   2301:      short *reload_reg_p;
                   2302:      int goalreg;
                   2303: {
                   2304:   register rtx p = insn;
                   2305:   rtx valtry, value, where;
                   2306:   register rtx pat;
                   2307:   register int regno = -1;
                   2308:   int valueno;
                   2309:   int goal_mem = 0;
                   2310:   int goal_const = 0;
                   2311: 
                   2312:   if (goal == 0)
                   2313:     regno = goalreg;
                   2314:   else if (GET_CODE (goal) == REG)
                   2315:     regno = REGNO (goal);
                   2316:   else if (GET_CODE (goal) == MEM)
                   2317:     goal_mem = 1;
                   2318:   else if (CONSTANT_P (goal))
                   2319:     goal_const = 1;
                   2320:   else
                   2321:     return 0;
                   2322: 
                   2323:   /* Scan insns back from INSN, looking for one that copies
                   2324:      a value into or out of GOAL.
                   2325:      Stop and give up if we reach a label.  */
                   2326: 
                   2327:   while (1)
                   2328:     {
                   2329:       p = PREV_INSN (p);
                   2330:       if (p == 0 || GET_CODE (p) == CODE_LABEL)
                   2331:        return 0;
                   2332:       if (GET_CODE (p) == INSN
                   2333:          /* If we don't want spill regs (true for all calls in this file) */
                   2334:          && (! (reload_reg_p != 0 && reload_reg_p != (short *)1)
                   2335:          /* then ignore insns introduced by reload; they aren't useful
                   2336:             and can cause results in reload_as_needed to be different
                   2337:             from what they were when calculating the need for spills.
                   2338:             If we notice an input-reload insn here, we will reject it below,
                   2339:             but it might hide a usable equivalent.  That makes bad code.
                   2340:             It may even abort: perhaps no reg was spilled for this insn
                   2341:             because it was assumed we would find that equivalent.  */
                   2342:              || INSN_UID (p) < reload_first_uid))
                   2343:        {
                   2344:          pat = PATTERN (p);
                   2345:          /* First check for something that sets some reg equal to GOAL.  */
                   2346:          if (GET_CODE (pat) == SET
                   2347:              && ((regno >= 0
                   2348:                   && GET_CODE (SET_SRC (pat)) == REG
                   2349:                   && (goal == 0 ? true_regnum (SET_SRC (pat)) : REGNO (SET_SRC (pat))) == regno
                   2350:                   && GET_CODE (valtry = SET_DEST (pat)) == REG)
                   2351:                  ||
                   2352:                  (regno >= 0
                   2353:                   && GET_CODE (SET_DEST (pat)) == REG
                   2354:                   && (goal == 0 ? true_regnum (SET_DEST (pat)) : REGNO (SET_DEST (pat))) == regno
                   2355:                   && GET_CODE (valtry = SET_SRC (pat)) == REG)
                   2356:                  ||
                   2357:                  (goal_const && rtx_equal_p (SET_SRC (pat), goal)
                   2358:                   && GET_CODE (valtry = SET_DEST (pat)) == REG)
                   2359:                  || (goal_mem
                   2360:                      && GET_CODE (valtry = SET_DEST (pat)) == REG
                   2361:                      && rtx_renumbered_equal_p (goal, SET_SRC (pat)))
                   2362:                  || (goal_mem
                   2363:                      && GET_CODE (valtry = SET_SRC (pat)) == REG
                   2364:                      && rtx_renumbered_equal_p (goal, SET_DEST (pat)))))
                   2365:            if (other >= 0
                   2366:                ? (goal == 0 ? true_regnum (valtry) : REGNO (valtry)) == other
                   2367:                : (valueno = REGNO (valtry),
                   2368:                   reg_renumber[valueno] >= 0 ? valueno = reg_renumber[valueno] : 0,
                   2369:                   valueno < FIRST_PSEUDO_REGISTER &&
                   2370:                   TEST_HARD_REG_BIT (reg_class_contents[(int) class],
                   2371:                                      valueno)))
                   2372:              {
                   2373:                value = valtry;
                   2374:                where = p;
                   2375:                break;
                   2376:              }
                   2377:        }
                   2378:     }
                   2379: 
                   2380:   /* We found a previous insn copying GOAL into a suitable other reg VALUE
                   2381:      (or copying VALUE into GOAL, if GOAL is also a register).
                   2382:      Now verify that VALUE is really valid.  */
                   2383: 
                   2384:   if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] >= 0)
                   2385:     regno = reg_renumber[regno];
                   2386: 
                   2387:   /* VALUENO gets the register number of VALUE;
                   2388:      for a pseudo reg, it gets the hard reg number that the pseudo has,
                   2389:      and we give up if the pseudo has no hard reg.  */
                   2390: 
                   2391:   valueno = REGNO (value);
                   2392:   if (valueno >= FIRST_PSEUDO_REGISTER)
                   2393:     valueno = reg_renumber[valueno];
                   2394: 
                   2395:   if (valueno < 0)
                   2396:     return 0;
                   2397: 
                   2398:   /* Don't find the sp as an equiv, since pushes that we don't notice
                   2399:      would invalidate it.  */
                   2400:   if (valueno == STACK_POINTER_REGNUM)
                   2401:     return 0;
                   2402: 
                   2403:   /* Reject VALUE if it was loaded from GOAL
                   2404:      and is also a register that appears in the address of GOAL.  */
                   2405: 
                   2406:   if (goal_mem && value == SET_DEST (PATTERN (where))
                   2407:       && refers_to_regno_p (valueno, goal, 0))
                   2408:     return 0;
                   2409: 
                   2410:   /* Reject VALUE if it is one of the regs reserved for reloads.
                   2411:      Reload1 knows how to reuse them anyway, and it would get
                   2412:      confused if we allocated one without its knowledge.
                   2413:      (Now that insns introduced by reload are ignored above,
                   2414:      this case shouldn't happen, but I'm not positive.)  */
                   2415: 
                   2416:   if (reload_reg_p != 0 && reload_reg_p != (short *)1
                   2417:       && reload_reg_p[valueno] >= 0)
                   2418:     return 0;
                   2419: 
                   2420:   /* Reject VALUE if it is a register being used for an input reload
                   2421:      even if it is not one of those reserved.  */
                   2422: 
                   2423:   if (reload_reg_p != 0)
                   2424:     {
                   2425:       int i;
                   2426:       for (i = 0; i < n_reloads; i++)
                   2427:        if (reload_reg_rtx[i] != 0 && reload_in[i])
                   2428:          {
                   2429:            int regno1 = REGNO (reload_reg_rtx[i]);
                   2430:            if (reg_renumber[regno1] >= 0)
                   2431:              regno1 = reg_renumber[regno1];
                   2432:            if (valueno == regno1)
                   2433:              return 0;
                   2434:          }
                   2435:     }
                   2436: 
                   2437:   /* Now verify that the values of GOAL and VALUE remain unaltered
                   2438:      until INSN is reached.  */
                   2439: 
                   2440:   p = insn;
                   2441:   while (1)
                   2442:     {
                   2443:       p = PREV_INSN (p);
                   2444:       if (p == where)
                   2445:        return value;
                   2446: 
                   2447:       /* Don't trust the conversion past a function call
                   2448:         if either of the two is in a call-clobbered register, or memory.  */
                   2449:       if (GET_CODE (p) == CALL_INSN
                   2450:          && ((regno >= 0 && regno < FIRST_PSEUDO_REGISTER
                   2451:               && call_used_regs[regno])
                   2452:              ||
                   2453:              (valueno >= 0 && valueno < FIRST_PSEUDO_REGISTER
                   2454:               && call_used_regs[valueno])
                   2455:              ||
                   2456:              goal_mem))
                   2457:        return 0;
                   2458: 
                   2459:       if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN
                   2460:          || GET_CODE (p) == CALL_INSN)
                   2461:        {
                   2462:          /* If this insn P stores in either GOAL or VALUE, return 0.
                   2463:             If GOAL is a memory ref and this insn writes memory, return 0.
                   2464:             If GOAL is a memory ref and its address is not constant,
                   2465:             and this insn P changes a register, return 0.
                   2466:             That is in lieue of checking whether GOAL uses this register.  */
                   2467: 
                   2468:          pat = PATTERN (p);
                   2469:          if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER)
                   2470:            {
                   2471:              register rtx dest = SET_DEST (pat);
                   2472:              while (GET_CODE (dest) == SUBREG
                   2473:                     || GET_CODE (dest) == ZERO_EXTRACT
                   2474:                     || GET_CODE (dest) == SIGN_EXTRACT
                   2475:                     || GET_CODE (dest) == STRICT_LOW_PART)
                   2476:                dest = XEXP (dest, 0);
                   2477:              if (GET_CODE (dest) == REG)
                   2478:                {
                   2479:                  register int xregno = REGNO (dest);
                   2480:                  if (reg_renumber[xregno] >= 0)
                   2481:                    xregno = reg_renumber[xregno];
                   2482:                  if (xregno == regno || xregno == valueno || goal_mem)
                   2483:                    return 0;
                   2484:                }
                   2485:              else if (goal_mem && GET_CODE (dest) == MEM
                   2486:                       && ! push_operand (dest, GET_MODE (dest)))
                   2487:                return 0;
                   2488:            }
                   2489:          else if (GET_CODE (pat) == PARALLEL)
                   2490:            {
                   2491:              register int i;
                   2492:              for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
                   2493:                {
                   2494:                  register rtx v1 = XVECEXP (pat, 0, i);
                   2495:                  if (GET_CODE (v1) == SET || GET_CODE (v1) == CLOBBER)
                   2496:                    {
                   2497:                      register rtx dest = SET_DEST (v1);
                   2498:                      while (GET_CODE (dest) == SUBREG
                   2499:                             || GET_CODE (dest) == ZERO_EXTRACT
                   2500:                             || GET_CODE (dest) == SIGN_EXTRACT
                   2501:                             || GET_CODE (dest) == STRICT_LOW_PART)
                   2502:                        dest = XEXP (dest, 0);
                   2503:                      if (GET_CODE (dest) == REG)
                   2504:                        {
                   2505:                          register int xregno = REGNO (dest);
                   2506:                          if (reg_renumber[xregno] >= 0)
                   2507:                            xregno = reg_renumber[xregno];
                   2508:                          if (xregno == regno || xregno == valueno || goal_mem)
                   2509:                            return 0;
                   2510:                        }
                   2511:                      else if (goal_mem && GET_CODE (dest) == MEM
                   2512:                               && ! push_operand (dest, GET_MODE (dest)))
                   2513:                        return 0;
                   2514:                    }
                   2515:                }
                   2516:            }
                   2517:          /* If this insn auto-increments or auto-decrements
                   2518:             either regno or valueno, return 0 now.
                   2519:             If GOAL is a memory ref and its address is not constant,
                   2520:             and this insn P increments a register, return 0.
                   2521:             That is in lieue of checking whether GOAL uses this register.  */
                   2522:          {
                   2523:            register rtx link;
                   2524: 
                   2525:            for (link = REG_NOTES (p); link; link = XEXP (link, 1))
                   2526:              if (REG_NOTE_KIND (link) == REG_INC)
                   2527:                {
                   2528:                  register int incno = REGNO (XEXP (link, 0));
                   2529:                  if (reg_renumber[incno] >= 0)
                   2530:                    incno = reg_renumber[incno];
                   2531:                  if (incno == regno || incno == valueno || goal_mem)
                   2532:                    return 0;
                   2533:                }
                   2534:          }
                   2535:        }
                   2536:     }
                   2537: }
                   2538: 
                   2539: /* Find a place where INCED appears in an increment or decrement operator
                   2540:    within X, and return the amount INCED is incremented by
                   2541:    (negative if decremented).  */
                   2542: 
                   2543: static int
                   2544: find_inc_amount (x, inced)
                   2545:      rtx x, inced;
                   2546: {
                   2547:   register enum rtx_code code = GET_CODE (x);
                   2548:   register char *fmt;
                   2549:   register int i;
                   2550: 
                   2551:   if (code == MEM)
                   2552:     {
                   2553:       register rtx addr = XEXP (x, 0);
                   2554:       if ((GET_CODE (addr) == PRE_DEC
                   2555:           || GET_CODE (addr) == POST_DEC)
                   2556:          && XEXP (addr, 0) == inced)
                   2557:        return - GET_MODE_SIZE (GET_MODE (x));
                   2558:       if ((GET_CODE (addr) == PRE_INC
                   2559:           || GET_CODE (addr) == POST_INC)
                   2560:          && XEXP (addr, 0) == inced)
                   2561:        return GET_MODE_SIZE (GET_MODE (x));
                   2562:     }
                   2563: 
                   2564:   fmt = GET_RTX_FORMAT (code);
                   2565:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   2566:     {
                   2567:       if (fmt[i] == 'e')
                   2568:        {
                   2569:          register int tem = find_inc_amount (XEXP (x, i), inced);
                   2570:          if (tem != 0)
                   2571:            return tem;
                   2572:        }
                   2573:       if (fmt[i] == 'E')
                   2574:        {
                   2575:          register int j;
                   2576:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   2577:            {
                   2578:              register int tem = find_inc_amount (XVECEXP (x, i, j), inced);
                   2579:              if (tem != 0)
                   2580:                return tem;
                   2581:            }
                   2582:        }
                   2583:     }
                   2584: 
                   2585:   return 0;
                   2586: }

unix.superglobalmegacorp.com

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