Annotation of gcc/combine.c, revision 1.1.1.5

1.1       root        1: /* Optimize by combining instructions for GNU compiler.
1.1.1.5 ! root        2:    Copyright (C) 1987, 1988, 1992, 1993 Free Software Foundation, Inc.
1.1       root        3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: /* This module is essentially the "combiner" phase of the U. of Arizona
                     22:    Portable Optimizer, but redone to work on our list-structured
                     23:    representation for RTL instead of their string representation.
                     24: 
                     25:    The LOG_LINKS of each insn identify the most recent assignment
                     26:    to each REG used in the insn.  It is a list of previous insns,
                     27:    each of which contains a SET for a REG that is used in this insn
                     28:    and not used or set in between.  LOG_LINKs never cross basic blocks.
                     29:    They were set up by the preceding pass (lifetime analysis).
                     30: 
                     31:    We try to combine each pair of insns joined by a logical link.
                     32:    We also try to combine triples of insns A, B and C when
                     33:    C has a link back to B and B has a link back to A.
                     34: 
                     35:    LOG_LINKS does not have links for use of the CC0.  They don't
                     36:    need to, because the insn that sets the CC0 is always immediately
                     37:    before the insn that tests it.  So we always regard a branch
                     38:    insn as having a logical link to the preceding insn.  The same is true
                     39:    for an insn explicitly using CC0.
                     40: 
                     41:    We check (with use_crosses_set_p) to avoid combining in such a way
                     42:    as to move a computation to a place where its value would be different.
                     43: 
                     44:    Combination is done by mathematically substituting the previous
                     45:    insn(s) values for the regs they set into the expressions in
                     46:    the later insns that refer to these regs.  If the result is a valid insn
                     47:    for our target machine, according to the machine description,
                     48:    we install it, delete the earlier insns, and update the data flow
                     49:    information (LOG_LINKS and REG_NOTES) for what we did.
                     50: 
                     51:    There are a few exceptions where the dataflow information created by
                     52:    flow.c aren't completely updated:
                     53: 
                     54:    - reg_live_length is not updated
                     55:    - reg_n_refs is not adjusted in the rare case when a register is
                     56:      no longer required in a computation
                     57:    - there are extremely rare cases (see distribute_regnotes) when a
                     58:      REG_DEAD note is lost
                     59:    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
                     60:      removed because there is no way to know which register it was 
                     61:      linking
                     62: 
                     63:    To simplify substitution, we combine only when the earlier insn(s)
                     64:    consist of only a single assignment.  To simplify updating afterward,
                     65:    we never combine when a subroutine call appears in the middle.
                     66: 
                     67:    Since we do not represent assignments to CC0 explicitly except when that
                     68:    is all an insn does, there is no LOG_LINKS entry in an insn that uses
                     69:    the condition code for the insn that set the condition code.
                     70:    Fortunately, these two insns must be consecutive.
                     71:    Therefore, every JUMP_INSN is taken to have an implicit logical link
                     72:    to the preceding insn.  This is not quite right, since non-jumps can
                     73:    also use the condition code; but in practice such insns would not
                     74:    combine anyway.  */
                     75: 
                     76: #include "config.h"
                     77: #include "gvarargs.h"
                     78: #include "rtl.h"
                     79: #include "flags.h"
                     80: #include "regs.h"
1.1.1.5 ! root       81: #include "hard-reg-set.h"
1.1       root       82: #include "expr.h"
                     83: #include "basic-block.h"
                     84: #include "insn-config.h"
                     85: #include "insn-flags.h"
                     86: #include "insn-codes.h"
                     87: #include "insn-attr.h"
                     88: #include "recog.h"
                     89: #include "real.h"
1.1.1.4   root       90: #include <stdio.h>
1.1       root       91: 
                     92: /* It is not safe to use ordinary gen_lowpart in combine.
                     93:    Use gen_lowpart_for_combine instead.  See comments there.  */
                     94: #define gen_lowpart dont_use_gen_lowpart_you_dummy
                     95: 
1.1.1.5 ! root       96: /* If byte loads either zero- or sign- extend, define BYTE_LOADS_EXTEND
        !            97:    for cases when we don't care which is true.  Define LOAD_EXTEND to
        !            98:    be ZERO_EXTEND or SIGN_EXTEND, depending on which was defined.  */
        !            99: 
        !           100: #ifdef BYTE_LOADS_ZERO_EXTEND
        !           101: #define BYTE_LOADS_EXTEND
        !           102: #define LOAD_EXTEND ZERO_EXTEND
        !           103: #endif
        !           104: 
        !           105: #ifdef BYTE_LOADS_SIGN_EXTEND
        !           106: #define BYTE_LOADS_EXTEND
        !           107: #define LOAD_EXTEND SIGN_EXTEND
        !           108: #endif
        !           109: 
1.1       root      110: /* Number of attempts to combine instructions in this function.  */
                    111: 
                    112: static int combine_attempts;
                    113: 
                    114: /* Number of attempts that got as far as substitution in this function.  */
                    115: 
                    116: static int combine_merges;
                    117: 
                    118: /* Number of instructions combined with added SETs in this function.  */
                    119: 
                    120: static int combine_extras;
                    121: 
                    122: /* Number of instructions combined in this function.  */
                    123: 
                    124: static int combine_successes;
                    125: 
                    126: /* Totals over entire compilation.  */
                    127: 
                    128: static int total_attempts, total_merges, total_extras, total_successes;
                    129: 
                    130: /* Vector mapping INSN_UIDs to cuids.
1.1.1.2   root      131:    The cuids are like uids but increase monotonically always.
1.1       root      132:    Combine always uses cuids so that it can compare them.
                    133:    But actually renumbering the uids, which we used to do,
                    134:    proves to be a bad idea because it makes it hard to compare
                    135:    the dumps produced by earlier passes with those from later passes.  */
                    136: 
                    137: static int *uid_cuid;
                    138: 
                    139: /* Get the cuid of an insn.  */
                    140: 
                    141: #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
                    142: 
                    143: /* Maximum register number, which is the size of the tables below.  */
                    144: 
                    145: static int combine_max_regno;
                    146: 
                    147: /* Record last point of death of (hard or pseudo) register n.  */
                    148: 
                    149: static rtx *reg_last_death;
                    150: 
                    151: /* Record last point of modification of (hard or pseudo) register n.  */
                    152: 
                    153: static rtx *reg_last_set;
                    154: 
                    155: /* Record the cuid of the last insn that invalidated memory
                    156:    (anything that writes memory, and subroutine calls, but not pushes).  */
                    157: 
                    158: static int mem_last_set;
                    159: 
                    160: /* Record the cuid of the last CALL_INSN
                    161:    so we can tell whether a potential combination crosses any calls.  */
                    162: 
                    163: static int last_call_cuid;
                    164: 
                    165: /* When `subst' is called, this is the insn that is being modified
                    166:    (by combining in a previous insn).  The PATTERN of this insn
                    167:    is still the old pattern partially modified and it should not be
                    168:    looked at, but this may be used to examine the successors of the insn
                    169:    to judge whether a simplification is valid.  */
                    170: 
                    171: static rtx subst_insn;
                    172: 
                    173: /* This is the lowest CUID that `subst' is currently dealing with.
                    174:    get_last_value will not return a value if the register was set at or
                    175:    after this CUID.  If not for this mechanism, we could get confused if
                    176:    I2 or I1 in try_combine were an insn that used the old value of a register
                    177:    to obtain a new value.  In that case, we might erroneously get the
                    178:    new value of the register when we wanted the old one.  */
                    179: 
                    180: static int subst_low_cuid;
                    181: 
                    182: /* This is the value of undobuf.num_undo when we started processing this 
                    183:    substitution.  This will prevent gen_rtx_combine from re-used a piece
                    184:    from the previous expression.  Doing so can produce circular rtl
                    185:    structures.  */
                    186: 
                    187: static int previous_num_undos;
                    188: 
                    189: /* The next group of arrays allows the recording of the last value assigned
                    190:    to (hard or pseudo) register n.  We use this information to see if a
1.1.1.2   root      191:    operation being processed is redundant given a prior operation performed
1.1       root      192:    on the register.  For example, an `and' with a constant is redundant if
                    193:    all the zero bits are already known to be turned off.
                    194: 
                    195:    We use an approach similar to that used by cse, but change it in the
                    196:    following ways:
                    197: 
                    198:    (1) We do not want to reinitialize at each label.
                    199:    (2) It is useful, but not critical, to know the actual value assigned
                    200:        to a register.  Often just its form is helpful.
                    201: 
                    202:    Therefore, we maintain the following arrays:
                    203: 
                    204:    reg_last_set_value          the last value assigned
                    205:    reg_last_set_label          records the value of label_tick when the
                    206:                                register was assigned
                    207:    reg_last_set_table_tick     records the value of label_tick when a
                    208:                                value using the register is assigned
                    209:    reg_last_set_invalid                set to non-zero when it is not valid
                    210:                                to use the value of this register in some
                    211:                                register's value
                    212: 
                    213:    To understand the usage of these tables, it is important to understand
                    214:    the distinction between the value in reg_last_set_value being valid
                    215:    and the register being validly contained in some other expression in the
                    216:    table.
                    217: 
                    218:    Entry I in reg_last_set_value is valid if it is non-zero, and either
                    219:    reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
                    220: 
                    221:    Register I may validly appear in any expression returned for the value
                    222:    of another register if reg_n_sets[i] is 1.  It may also appear in the
                    223:    value for register J if reg_last_set_label[i] < reg_last_set_label[j] or
                    224:    reg_last_set_invalid[j] is zero.
                    225: 
                    226:    If an expression is found in the table containing a register which may
                    227:    not validly appear in an expression, the register is replaced by
                    228:    something that won't match, (clobber (const_int 0)).
                    229: 
                    230:    reg_last_set_invalid[i] is set non-zero when register I is being assigned
                    231:    to and reg_last_set_table_tick[i] == label_tick.  */
                    232: 
                    233: /* Record last value assigned to (hard or pseudo) register n. */
                    234: 
                    235: static rtx *reg_last_set_value;
                    236: 
                    237: /* Record the value of label_tick when the value for register n is placed in
                    238:    reg_last_set_value[n].  */
                    239: 
1.1.1.5 ! root      240: static int *reg_last_set_label;
1.1       root      241: 
                    242: /* Record the value of label_tick when an expression involving register n
                    243:    is placed in reg_last_set_value. */
                    244: 
1.1.1.5 ! root      245: static int *reg_last_set_table_tick;
1.1       root      246: 
                    247: /* Set non-zero if references to register n in expressions should not be
                    248:    used.  */
                    249: 
                    250: static char *reg_last_set_invalid;
                    251: 
                    252: /* Incremented for each label. */
                    253: 
1.1.1.5 ! root      254: static int label_tick;
1.1       root      255: 
                    256: /* Some registers that are set more than once and used in more than one
                    257:    basic block are nevertheless always set in similar ways.  For example,
                    258:    a QImode register may be loaded from memory in two places on a machine
                    259:    where byte loads zero extend.
                    260: 
1.1.1.5 ! root      261:    We record in the following array what we know about the nonzero
1.1       root      262:    bits of a register, specifically which bits are known to be zero.
                    263: 
                    264:    If an entry is zero, it means that we don't know anything special.  */
                    265: 
1.1.1.5 ! root      266: static unsigned HOST_WIDE_INT *reg_nonzero_bits;
1.1       root      267: 
1.1.1.5 ! root      268: /* Mode used to compute significance in reg_nonzero_bits.  It is the largest
1.1.1.4   root      269:    integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
1.1       root      270: 
1.1.1.5 ! root      271: static enum machine_mode nonzero_bits_mode;
1.1       root      272: 
1.1.1.4   root      273: /* Nonzero if we know that a register has some leading bits that are always
                    274:    equal to the sign bit.  */
                    275: 
                    276: static char *reg_sign_bit_copies;
                    277: 
1.1.1.5 ! root      278: /* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used.
1.1.1.4   root      279:    It is zero while computing them and after combine has completed.  This
                    280:    former test prevents propagating values based on previously set values,
                    281:    which can be incorrect if a variable is modified in a loop.  */
1.1       root      282: 
1.1.1.5 ! root      283: static int nonzero_sign_valid;
        !           284: 
        !           285: /* These arrays are maintained in parallel with reg_last_set_value
        !           286:    and are used to store the mode in which the register was last set,
        !           287:    the bits that were known to be zero when it was last set, and the
        !           288:    number of sign bits copies it was known to have when it was last set.  */
        !           289: 
        !           290: static enum machine_mode *reg_last_set_mode;
        !           291: static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits;
        !           292: static char *reg_last_set_sign_bit_copies;
1.1       root      293: 
                    294: /* Record one modification to rtl structure
                    295:    to be undone by storing old_contents into *where.
                    296:    is_int is 1 if the contents are an int.  */
                    297: 
                    298: struct undo
                    299: {
                    300:   int is_int;
1.1.1.4   root      301:   union {rtx rtx; int i;} old_contents;
                    302:   union {rtx *rtx; int *i;} where;
1.1       root      303: };
                    304: 
                    305: /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
                    306:    num_undo says how many are currently recorded.
                    307: 
                    308:    storage is nonzero if we must undo the allocation of new storage.
                    309:    The value of storage is what to pass to obfree.
                    310: 
                    311:    other_insn is nonzero if we have modified some other insn in the process
                    312:    of working on subst_insn.  It must be verified too.  */
                    313: 
                    314: #define MAX_UNDO 50
                    315: 
                    316: struct undobuf
                    317: {
                    318:   int num_undo;
                    319:   char *storage;
                    320:   struct undo undo[MAX_UNDO];
                    321:   rtx other_insn;
                    322: };
                    323: 
                    324: static struct undobuf undobuf;
                    325: 
1.1.1.4   root      326: /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
1.1       root      327:    insn.  The substitution can be undone by undo_all.  If INTO is already
1.1.1.4   root      328:    set to NEWVAL, do not record this change.  Because computing NEWVAL might
                    329:    also call SUBST, we have to compute it before we put anything into
                    330:    the undo table.  */
1.1       root      331: 
                    332: #define SUBST(INTO, NEWVAL)  \
1.1.1.4   root      333:  do { rtx _new = (NEWVAL);                                             \
                    334:       if (undobuf.num_undo < MAX_UNDO)                                 \
1.1       root      335:        {                                                               \
                    336:          undobuf.undo[undobuf.num_undo].is_int = 0;                    \
1.1.1.4   root      337:          undobuf.undo[undobuf.num_undo].where.rtx = &INTO;             \
                    338:          undobuf.undo[undobuf.num_undo].old_contents.rtx = INTO;       \
                    339:          INTO = _new;                                                  \
                    340:          if (undobuf.undo[undobuf.num_undo].old_contents.rtx != INTO)  \
1.1       root      341:            undobuf.num_undo++;                                         \
                    342:        }                                                               \
                    343:     } while (0)
                    344: 
                    345: /* Similar to SUBST, but NEWVAL is an int.  INTO will normally be an XINT
                    346:    expression.
                    347:    Note that substitution for the value of a CONST_INT is not safe.  */
                    348: 
                    349: #define SUBST_INT(INTO, NEWVAL)  \
                    350:  do { if (undobuf.num_undo < MAX_UNDO)                                 \
                    351: {                                                                      \
1.1.1.4   root      352:          undobuf.undo[undobuf.num_undo].is_int = 1;                    \
                    353:          undobuf.undo[undobuf.num_undo].where.i = (int *) &INTO;       \
                    354:          undobuf.undo[undobuf.num_undo].old_contents.i = INTO;         \
1.1       root      355:          INTO = NEWVAL;                                                \
1.1.1.4   root      356:          if (undobuf.undo[undobuf.num_undo].old_contents.i != INTO)    \
1.1       root      357:            undobuf.num_undo++;                                         \
                    358:        }                                                               \
                    359:      } while (0)
                    360: 
                    361: /* Number of times the pseudo being substituted for
                    362:    was found and replaced.  */
                    363: 
                    364: static int n_occurrences;
                    365: 
1.1.1.5 ! root      366: static void set_nonzero_bits_and_sign_copies ();
        !           367: static void setup_incoming_promotions ();
1.1       root      368: static void move_deaths ();
                    369: rtx remove_death ();
                    370: static void record_value_for_reg ();
                    371: static void record_dead_and_set_regs ();
                    372: static int use_crosses_set_p ();
                    373: static rtx try_combine ();
                    374: static rtx *find_split_point ();
                    375: static rtx subst ();
                    376: static void undo_all ();
                    377: static int reg_dead_at_p ();
                    378: static rtx expand_compound_operation ();
                    379: static rtx expand_field_assignment ();
                    380: static rtx make_extraction ();
                    381: static int get_pos_from_mask ();
1.1.1.4   root      382: static rtx force_to_mode ();
                    383: static rtx known_cond ();
1.1       root      384: static rtx make_field_assignment ();
                    385: static rtx make_compound_operation ();
                    386: static rtx apply_distributive_law ();
                    387: static rtx simplify_and_const_int ();
1.1.1.5 ! root      388: static unsigned HOST_WIDE_INT nonzero_bits ();
1.1.1.4   root      389: static int num_sign_bit_copies ();
1.1       root      390: static int merge_outer_ops ();
                    391: static rtx simplify_shift_const ();
                    392: static int recog_for_combine ();
                    393: static rtx gen_lowpart_for_combine ();
                    394: static rtx gen_rtx_combine ();
                    395: static rtx gen_binary ();
                    396: static rtx gen_unary ();
                    397: static enum rtx_code simplify_comparison ();
                    398: static int reversible_comparison_p ();
                    399: static int get_last_value_validate ();
                    400: static rtx get_last_value ();
                    401: static void distribute_notes ();
                    402: static void distribute_links ();
                    403: 
                    404: /* Main entry point for combiner.  F is the first insn of the function.
                    405:    NREGS is the first unused pseudo-reg number.  */
                    406: 
                    407: void
                    408: combine_instructions (f, nregs)
                    409:      rtx f;
                    410:      int nregs;
                    411: {
                    412:   register rtx insn, next, prev;
                    413:   register int i;
                    414:   register rtx links, nextlinks;
                    415: 
                    416:   combine_attempts = 0;
                    417:   combine_merges = 0;
                    418:   combine_extras = 0;
                    419:   combine_successes = 0;
1.1.1.5 ! root      420:   undobuf.num_undo = previous_num_undos = 0;
1.1       root      421: 
                    422:   combine_max_regno = nregs;
                    423: 
                    424:   reg_last_death = (rtx *) alloca (nregs * sizeof (rtx));
                    425:   reg_last_set = (rtx *) alloca (nregs * sizeof (rtx));
                    426:   reg_last_set_value = (rtx *) alloca (nregs * sizeof (rtx));
1.1.1.5 ! root      427:   reg_last_set_table_tick = (int *) alloca (nregs * sizeof (int));
        !           428:   reg_last_set_label = (int *) alloca (nregs * sizeof (int));
1.1.1.4   root      429:   reg_last_set_invalid = (char *) alloca (nregs * sizeof (char));
1.1.1.5 ! root      430:   reg_last_set_mode
        !           431:     = (enum machine_mode *) alloca (nregs * sizeof (enum machine_mode));
        !           432:   reg_last_set_nonzero_bits
        !           433:     = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT));
        !           434:   reg_last_set_sign_bit_copies
        !           435:     = (char *) alloca (nregs * sizeof (char));
        !           436: 
        !           437:   reg_nonzero_bits
        !           438:     = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT));
1.1.1.4   root      439:   reg_sign_bit_copies = (char *) alloca (nregs * sizeof (char));
1.1       root      440: 
                    441:   bzero (reg_last_death, nregs * sizeof (rtx));
                    442:   bzero (reg_last_set, nregs * sizeof (rtx));
                    443:   bzero (reg_last_set_value, nregs * sizeof (rtx));
1.1.1.5 ! root      444:   bzero (reg_last_set_table_tick, nregs * sizeof (int));
        !           445:   bzero (reg_last_set_label, nregs * sizeof (int));
1.1       root      446:   bzero (reg_last_set_invalid, nregs * sizeof (char));
1.1.1.5 ! root      447:   bzero (reg_last_set_mode, nregs * sizeof (enum machine_mode));
        !           448:   bzero (reg_last_set_nonzero_bits, nregs * sizeof (HOST_WIDE_INT));
        !           449:   bzero (reg_last_set_sign_bit_copies, nregs * sizeof (char));
        !           450:   bzero (reg_nonzero_bits, nregs * sizeof (HOST_WIDE_INT));
1.1.1.4   root      451:   bzero (reg_sign_bit_copies, nregs * sizeof (char));
1.1       root      452: 
                    453:   init_recog_no_volatile ();
                    454: 
                    455:   /* Compute maximum uid value so uid_cuid can be allocated.  */
                    456: 
                    457:   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
                    458:     if (INSN_UID (insn) > i)
                    459:       i = INSN_UID (insn);
                    460: 
                    461:   uid_cuid = (int *) alloca ((i + 1) * sizeof (int));
                    462: 
1.1.1.5 ! root      463:   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
1.1       root      464: 
1.1.1.5 ! root      465:   /* Don't use reg_nonzero_bits when computing it.  This can cause problems
1.1       root      466:      when, for example, we have j <<= 1 in a loop.  */
                    467: 
1.1.1.5 ! root      468:   nonzero_sign_valid = 0;
1.1       root      469: 
                    470:   /* Compute the mapping from uids to cuids.
                    471:      Cuids are numbers assigned to insns, like uids,
                    472:      except that cuids increase monotonically through the code. 
                    473: 
                    474:      Scan all SETs and see if we can deduce anything about what
1.1.1.5 ! root      475:      bits are known to be zero for some registers and how many copies
        !           476:      of the sign bit are known to exist for those registers.
        !           477: 
        !           478:      Also set any known values so that we can use it while searching
        !           479:      for what bits are known to be set.  */
        !           480: 
        !           481:   label_tick = 1;
        !           482: 
        !           483:   setup_incoming_promotions ();
1.1       root      484: 
                    485:   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
                    486:     {
                    487:       INSN_CUID (insn) = ++i;
1.1.1.5 ! root      488:       subst_low_cuid = i;
        !           489:       subst_insn = insn;
        !           490: 
1.1       root      491:       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1.1.1.5 ! root      492:        {
        !           493:          note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies);
        !           494:          record_dead_and_set_regs (insn);
        !           495:        }
        !           496: 
        !           497:       if (GET_CODE (insn) == CODE_LABEL)
        !           498:        label_tick++;
1.1       root      499:     }
                    500: 
1.1.1.5 ! root      501:   nonzero_sign_valid = 1;
1.1       root      502: 
                    503:   /* Now scan all the insns in forward order.  */
                    504: 
                    505:   label_tick = 1;
                    506:   last_call_cuid = 0;
                    507:   mem_last_set = 0;
1.1.1.5 ! root      508:   bzero (reg_last_death, nregs * sizeof (rtx));
        !           509:   bzero (reg_last_set, nregs * sizeof (rtx));
        !           510:   bzero (reg_last_set_value, nregs * sizeof (rtx));
        !           511:   bzero (reg_last_set_table_tick, nregs * sizeof (int));
        !           512:   bzero (reg_last_set_label, nregs * sizeof (int));
        !           513:   bzero (reg_last_set_invalid, nregs * sizeof (char));
        !           514: 
        !           515:   setup_incoming_promotions ();
1.1       root      516: 
                    517:   for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
                    518:     {
                    519:       next = 0;
                    520: 
                    521:       if (GET_CODE (insn) == CODE_LABEL)
                    522:        label_tick++;
                    523: 
                    524:       else if (GET_CODE (insn) == INSN
                    525:               || GET_CODE (insn) == CALL_INSN
                    526:               || GET_CODE (insn) == JUMP_INSN)
                    527:        {
                    528:          /* Try this insn with each insn it links back to.  */
                    529: 
                    530:          for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
1.1.1.4   root      531:            if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX)) != 0)
1.1       root      532:              goto retry;
                    533: 
                    534:          /* Try each sequence of three linked insns ending with this one.  */
                    535: 
                    536:          for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
                    537:            for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks;
                    538:                 nextlinks = XEXP (nextlinks, 1))
                    539:              if ((next = try_combine (insn, XEXP (links, 0),
                    540:                                       XEXP (nextlinks, 0))) != 0)
                    541:                goto retry;
                    542: 
                    543: #ifdef HAVE_cc0
                    544:          /* Try to combine a jump insn that uses CC0
                    545:             with a preceding insn that sets CC0, and maybe with its
                    546:             logical predecessor as well.
                    547:             This is how we make decrement-and-branch insns.
                    548:             We need this special code because data flow connections
                    549:             via CC0 do not get entered in LOG_LINKS.  */
                    550: 
                    551:          if (GET_CODE (insn) == JUMP_INSN
                    552:              && (prev = prev_nonnote_insn (insn)) != 0
                    553:              && GET_CODE (prev) == INSN
                    554:              && sets_cc0_p (PATTERN (prev)))
                    555:            {
1.1.1.4   root      556:              if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
1.1       root      557:                goto retry;
                    558: 
                    559:              for (nextlinks = LOG_LINKS (prev); nextlinks;
                    560:                   nextlinks = XEXP (nextlinks, 1))
                    561:                if ((next = try_combine (insn, prev,
                    562:                                         XEXP (nextlinks, 0))) != 0)
                    563:                  goto retry;
                    564:            }
                    565: 
                    566:          /* Do the same for an insn that explicitly references CC0.  */
                    567:          if (GET_CODE (insn) == INSN
                    568:              && (prev = prev_nonnote_insn (insn)) != 0
                    569:              && GET_CODE (prev) == INSN
                    570:              && sets_cc0_p (PATTERN (prev))
                    571:              && GET_CODE (PATTERN (insn)) == SET
                    572:              && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
                    573:            {
1.1.1.4   root      574:              if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
1.1       root      575:                goto retry;
                    576: 
                    577:              for (nextlinks = LOG_LINKS (prev); nextlinks;
                    578:                   nextlinks = XEXP (nextlinks, 1))
                    579:                if ((next = try_combine (insn, prev,
                    580:                                         XEXP (nextlinks, 0))) != 0)
                    581:                  goto retry;
                    582:            }
                    583: 
                    584:          /* Finally, see if any of the insns that this insn links to
                    585:             explicitly references CC0.  If so, try this insn, that insn,
1.1.1.2   root      586:             and its predecessor if it sets CC0.  */
1.1       root      587:          for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
                    588:            if (GET_CODE (XEXP (links, 0)) == INSN
                    589:                && GET_CODE (PATTERN (XEXP (links, 0))) == SET
                    590:                && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
                    591:                && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
                    592:                && GET_CODE (prev) == INSN
                    593:                && sets_cc0_p (PATTERN (prev))
                    594:                && (next = try_combine (insn, XEXP (links, 0), prev)) != 0)
                    595:              goto retry;
                    596: #endif
                    597: 
                    598:          /* Try combining an insn with two different insns whose results it
                    599:             uses.  */
                    600:          for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
                    601:            for (nextlinks = XEXP (links, 1); nextlinks;
                    602:                 nextlinks = XEXP (nextlinks, 1))
                    603:              if ((next = try_combine (insn, XEXP (links, 0),
                    604:                                       XEXP (nextlinks, 0))) != 0)
                    605:                goto retry;
                    606: 
                    607:          if (GET_CODE (insn) != NOTE)
                    608:            record_dead_and_set_regs (insn);
                    609: 
                    610:        retry:
                    611:          ;
                    612:        }
                    613:     }
                    614: 
                    615:   total_attempts += combine_attempts;
                    616:   total_merges += combine_merges;
                    617:   total_extras += combine_extras;
                    618:   total_successes += combine_successes;
1.1.1.4   root      619: 
1.1.1.5 ! root      620:   nonzero_sign_valid = 0;
        !           621: }
        !           622: 
        !           623: /* Set up any promoted values for incoming argument registers.  */
        !           624: 
        !           625: static void
        !           626: setup_incoming_promotions ()
        !           627: {
        !           628: #ifdef PROMOTE_FUNCTION_ARGS
        !           629:   int regno;
        !           630:   rtx reg;
        !           631:   enum machine_mode mode;
        !           632:   int unsignedp;
        !           633:   rtx first = get_insns ();
        !           634: 
        !           635:   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
        !           636:     if (FUNCTION_ARG_REGNO_P (regno)
        !           637:        && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
        !           638:       record_value_for_reg (reg, first,
        !           639:                            gen_rtx (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
        !           640:                                     GET_MODE (reg),
        !           641:                                     gen_rtx (CLOBBER, mode, const0_rtx)));
        !           642: #endif
1.1       root      643: }
                    644: 
                    645: /* Called via note_stores.  If X is a pseudo that is used in more than
1.1.1.4   root      646:    one basic block, is narrower that HOST_BITS_PER_WIDE_INT, and is being
1.1.1.5 ! root      647:    set, record what bits are known zero.  If we are clobbering X,
1.1       root      648:    ignore this "set" because the clobbered value won't be used. 
                    649: 
                    650:    If we are setting only a portion of X and we can't figure out what
                    651:    portion, assume all bits will be used since we don't know what will
1.1.1.4   root      652:    be happening.
                    653: 
                    654:    Similarly, set how many bits of X are known to be copies of the sign bit
                    655:    at all locations in the function.  This is the smallest number implied 
                    656:    by any set of X.  */
1.1       root      657: 
                    658: static void
1.1.1.5 ! root      659: set_nonzero_bits_and_sign_copies (x, set)
1.1       root      660:      rtx x;
                    661:      rtx set;
                    662: {
1.1.1.4   root      663:   int num;
                    664: 
1.1       root      665:   if (GET_CODE (x) == REG
                    666:       && REGNO (x) >= FIRST_PSEUDO_REGISTER
                    667:       && reg_n_sets[REGNO (x)] > 1
                    668:       && reg_basic_block[REGNO (x)] < 0
1.1.1.5 ! root      669:       /* If this register is undefined at the start of the file, we can't
        !           670:         say what its contents were.  */
        !           671:       && ! (basic_block_live_at_start[0][REGNO (x) / REGSET_ELT_BITS]
        !           672:            & ((REGSET_ELT_TYPE) 1 << (REGNO (x) % REGSET_ELT_BITS)))
1.1.1.4   root      673:       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
1.1       root      674:     {
                    675:       if (GET_CODE (set) == CLOBBER)
1.1.1.5 ! root      676:        {
        !           677:          reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
        !           678:          reg_sign_bit_copies[REGNO (x)] = 0;
        !           679:          return;
        !           680:        }
1.1       root      681: 
                    682:       /* If this is a complex assignment, see if we can convert it into a
1.1.1.2   root      683:         simple assignment.  */
1.1       root      684:       set = expand_field_assignment (set);
1.1.1.5 ! root      685: 
        !           686:       /* If this is a simple assignment, or we have a paradoxical SUBREG,
        !           687:         set what we know about X.  */
        !           688: 
        !           689:       if (SET_DEST (set) == x
        !           690:          || (GET_CODE (SET_DEST (set)) == SUBREG
        !           691:              && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
        !           692:                  > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
        !           693:              && SUBREG_REG (SET_DEST (set)) == x))
        !           694:        {
        !           695:          rtx src = SET_SRC (set);
        !           696: 
        !           697: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
        !           698:          /* If X is narrower than a word and SRC is a non-negative
        !           699:             constant that would appear negative in the mode of X,
        !           700:             sign-extend it for use in reg_nonzero_bits because some
        !           701:             machines (maybe most) will actually do the sign-extension
        !           702:             and this is the conservative approach. 
        !           703: 
        !           704:             ??? For 2.5, try to tighten up the MD files in this regard
        !           705:             instead of this kludge.  */
        !           706: 
        !           707:          if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
        !           708:              && GET_CODE (src) == CONST_INT
        !           709:              && INTVAL (src) > 0
        !           710:              && 0 != (INTVAL (src)
        !           711:                       & ((HOST_WIDE_INT) 1
        !           712:                          << GET_MODE_BITSIZE (GET_MODE (x)))))
        !           713:            src = GEN_INT (INTVAL (src)
        !           714:                           | ((HOST_WIDE_INT) (-1)
        !           715:                              << GET_MODE_BITSIZE (GET_MODE (x))));
        !           716: #endif
        !           717: 
        !           718:          reg_nonzero_bits[REGNO (x)]
        !           719:            |= nonzero_bits (src, nonzero_bits_mode);
1.1.1.4   root      720:          num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
                    721:          if (reg_sign_bit_copies[REGNO (x)] == 0
                    722:              || reg_sign_bit_copies[REGNO (x)] > num)
                    723:            reg_sign_bit_copies[REGNO (x)] = num;
                    724:        }
1.1       root      725:       else
1.1.1.4   root      726:        {
1.1.1.5 ! root      727:          reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
1.1.1.4   root      728:          reg_sign_bit_copies[REGNO (x)] = 0;
                    729:        }
1.1       root      730:     }
                    731: }
                    732: 
                    733: /* See if INSN can be combined into I3.  PRED and SUCC are optionally
                    734:    insns that were previously combined into I3 or that will be combined
                    735:    into the merger of INSN and I3.
                    736: 
                    737:    Return 0 if the combination is not allowed for any reason.
                    738: 
                    739:    If the combination is allowed, *PDEST will be set to the single 
                    740:    destination of INSN and *PSRC to the single source, and this function
                    741:    will return 1.  */
                    742: 
                    743: static int
                    744: can_combine_p (insn, i3, pred, succ, pdest, psrc)
                    745:      rtx insn;
                    746:      rtx i3;
                    747:      rtx pred, succ;
                    748:      rtx *pdest, *psrc;
                    749: {
                    750:   int i;
                    751:   rtx set = 0, src, dest;
                    752:   rtx p, link;
                    753:   int all_adjacent = (succ ? (next_active_insn (insn) == succ
                    754:                              && next_active_insn (succ) == i3)
                    755:                      : next_active_insn (insn) == i3);
                    756: 
                    757:   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
                    758:      or a PARALLEL consisting of such a SET and CLOBBERs. 
                    759: 
                    760:      If INSN has CLOBBER parallel parts, ignore them for our processing.
                    761:      By definition, these happen during the execution of the insn.  When it
                    762:      is merged with another insn, all bets are off.  If they are, in fact,
                    763:      needed and aren't also supplied in I3, they may be added by
                    764:      recog_for_combine.  Otherwise, it won't match. 
                    765: 
                    766:      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
                    767:      note.
                    768: 
                    769:      Get the source and destination of INSN.  If more than one, can't 
                    770:      combine.  */
                    771:      
                    772:   if (GET_CODE (PATTERN (insn)) == SET)
                    773:     set = PATTERN (insn);
                    774:   else if (GET_CODE (PATTERN (insn)) == PARALLEL
                    775:           && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
                    776:     {
                    777:       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
                    778:        {
                    779:          rtx elt = XVECEXP (PATTERN (insn), 0, i);
                    780: 
                    781:          switch (GET_CODE (elt))
                    782:            {
                    783:              /* We can ignore CLOBBERs.  */
                    784:            case CLOBBER:
                    785:              break;
                    786: 
                    787:            case SET:
                    788:              /* Ignore SETs whose result isn't used but not those that
                    789:                 have side-effects.  */
                    790:              if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
                    791:                  && ! side_effects_p (elt))
                    792:                break;
                    793: 
                    794:              /* If we have already found a SET, this is a second one and
                    795:                 so we cannot combine with this insn.  */
                    796:              if (set)
                    797:                return 0;
                    798: 
                    799:              set = elt;
                    800:              break;
                    801: 
                    802:            default:
                    803:              /* Anything else means we can't combine.  */
                    804:              return 0;
                    805:            }
                    806:        }
                    807: 
                    808:       if (set == 0
                    809:          /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
                    810:             so don't do anything with it.  */
                    811:          || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
                    812:        return 0;
                    813:     }
                    814:   else
                    815:     return 0;
                    816: 
                    817:   if (set == 0)
                    818:     return 0;
                    819: 
                    820:   set = expand_field_assignment (set);
                    821:   src = SET_SRC (set), dest = SET_DEST (set);
                    822: 
                    823:   /* Don't eliminate a store in the stack pointer.  */
                    824:   if (dest == stack_pointer_rtx
                    825:       /* Don't install a subreg involving two modes not tieable.
                    826:         It can worsen register allocation, and can even make invalid reload
                    827:         insns, since the reg inside may need to be copied from in the
                    828:         outside mode, and that may be invalid if it is an fp reg copied in
1.1.1.2   root      829:         integer mode.  As a special exception, we can allow this if
                    830:         I3 is simply copying DEST, a REG,  to CC0.  */
1.1       root      831:       || (GET_CODE (src) == SUBREG
1.1.1.2   root      832:          && ! MODES_TIEABLE_P (GET_MODE (src), GET_MODE (SUBREG_REG (src)))
                    833: #ifdef HAVE_cc0
                    834:          && ! (GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
                    835:                && SET_DEST (PATTERN (i3)) == cc0_rtx
                    836:                && GET_CODE (dest) == REG && dest == SET_SRC (PATTERN (i3)))
                    837: #endif
                    838:          )
1.1       root      839:       /* If we couldn't eliminate a field assignment, we can't combine.  */
                    840:       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
                    841:       /* Don't combine with an insn that sets a register to itself if it has
                    842:         a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
1.1.1.4   root      843:       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
1.1       root      844:       /* Can't merge a function call.  */
                    845:       || GET_CODE (src) == CALL
                    846:       /* Don't substitute into an incremented register.  */
                    847:       || FIND_REG_INC_NOTE (i3, dest)
                    848:       || (succ && FIND_REG_INC_NOTE (succ, dest))
                    849:       /* Don't combine the end of a libcall into anything.  */
1.1.1.4   root      850:       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1.1       root      851:       /* Make sure that DEST is not used after SUCC but before I3.  */
                    852:       || (succ && ! all_adjacent
                    853:          && reg_used_between_p (dest, succ, i3))
                    854:       /* Make sure that the value that is to be substituted for the register
                    855:         does not use any registers whose values alter in between.  However,
                    856:         If the insns are adjacent, a use can't cross a set even though we
                    857:         think it might (this can happen for a sequence of insns each setting
                    858:         the same destination; reg_last_set of that register might point to
1.1.1.5 ! root      859:         a NOTE).  Also, don't move a volatile asm or UNSPEC_VOLATILE across
        !           860:         any other insns.  */
1.1       root      861:       || (! all_adjacent
                    862:          && (use_crosses_set_p (src, INSN_CUID (insn))
1.1.1.5 ! root      863:              || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
        !           864:              || GET_CODE (src) == UNSPEC_VOLATILE))
1.1       root      865:       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
                    866:         better register allocation by not doing the combine.  */
                    867:       || find_reg_note (i3, REG_NO_CONFLICT, dest)
                    868:       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
                    869:       /* Don't combine across a CALL_INSN, because that would possibly
                    870:         change whether the life span of some REGs crosses calls or not,
                    871:         and it is a pain to update that information.
                    872:         Exception: if source is a constant, moving it later can't hurt.
                    873:         Accept that special case, because it helps -fforce-addr a lot.  */
                    874:       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
                    875:     return 0;
                    876: 
                    877:   /* DEST must either be a REG or CC0.  */
                    878:   if (GET_CODE (dest) == REG)
                    879:     {
                    880:       /* If register alignment is being enforced for multi-word items in all
                    881:         cases except for parameters, it is possible to have a register copy
                    882:         insn referencing a hard register that is not allowed to contain the
                    883:         mode being copied and which would not be valid as an operand of most
                    884:         insns.  Eliminate this problem by not combining with such an insn.
                    885: 
                    886:         Also, on some machines we don't want to extend the life of a hard
                    887:         register.  */
                    888: 
                    889:       if (GET_CODE (src) == REG
                    890:          && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
                    891:               && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
                    892: #ifdef SMALL_REGISTER_CLASSES
                    893:              /* Don't extend the life of a hard register.  */
                    894:              || REGNO (src) < FIRST_PSEUDO_REGISTER
                    895: #else
                    896:              || (REGNO (src) < FIRST_PSEUDO_REGISTER
                    897:                  && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))
                    898: #endif
                    899:          ))
                    900:        return 0;
                    901:     }
                    902:   else if (GET_CODE (dest) != CC0)
                    903:     return 0;
                    904: 
1.1.1.4   root      905:   /* Don't substitute for a register intended as a clobberable operand.
                    906:      Similarly, don't substitute an expression containing a register that
                    907:      will be clobbered in I3.  */
1.1       root      908:   if (GET_CODE (PATTERN (i3)) == PARALLEL)
                    909:     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
                    910:       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
1.1.1.4   root      911:          && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
                    912:                                       src)
                    913:              || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
1.1       root      914:        return 0;
                    915: 
                    916:   /* If INSN contains anything volatile, or is an `asm' (whether volatile
                    917:      or not), reject, unless nothing volatile comes between it and I3,
                    918:      with the exception of SUCC.  */
                    919: 
                    920:   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
                    921:     for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
                    922:       if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
                    923:          && p != succ && volatile_refs_p (PATTERN (p)))
                    924:        return 0;
                    925: 
                    926:   /* If INSN or I2 contains an autoincrement or autodecrement,
                    927:      make sure that register is not used between there and I3,
                    928:      and not already used in I3 either.
                    929:      Also insist that I3 not be a jump; if it were one
                    930:      and the incremented register were spilled, we would lose.  */
                    931: 
                    932: #ifdef AUTO_INC_DEC
                    933:   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
                    934:     if (REG_NOTE_KIND (link) == REG_INC
                    935:        && (GET_CODE (i3) == JUMP_INSN
                    936:            || reg_used_between_p (XEXP (link, 0), insn, i3)
                    937:            || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
                    938:       return 0;
                    939: #endif
                    940: 
                    941: #ifdef HAVE_cc0
                    942:   /* Don't combine an insn that follows a CC0-setting insn.
                    943:      An insn that uses CC0 must not be separated from the one that sets it.
                    944:      We do, however, allow I2 to follow a CC0-setting insn if that insn
                    945:      is passed as I1; in that case it will be deleted also.
                    946:      We also allow combining in this case if all the insns are adjacent
                    947:      because that would leave the two CC0 insns adjacent as well.
                    948:      It would be more logical to test whether CC0 occurs inside I1 or I2,
                    949:      but that would be much slower, and this ought to be equivalent.  */
                    950: 
                    951:   p = prev_nonnote_insn (insn);
                    952:   if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
                    953:       && ! all_adjacent)
                    954:     return 0;
                    955: #endif
                    956: 
                    957:   /* If we get here, we have passed all the tests and the combination is
                    958:      to be allowed.  */
                    959: 
                    960:   *pdest = dest;
                    961:   *psrc = src;
                    962: 
                    963:   return 1;
                    964: }
                    965: 
                    966: /* LOC is the location within I3 that contains its pattern or the component
                    967:    of a PARALLEL of the pattern.  We validate that it is valid for combining.
                    968: 
                    969:    One problem is if I3 modifies its output, as opposed to replacing it
                    970:    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
                    971:    so would produce an insn that is not equivalent to the original insns.
                    972: 
                    973:    Consider:
                    974: 
                    975:          (set (reg:DI 101) (reg:DI 100))
                    976:         (set (subreg:SI (reg:DI 101) 0) <foo>)
                    977: 
                    978:    This is NOT equivalent to:
                    979: 
                    980:          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
                    981:                    (set (reg:DI 101) (reg:DI 100))])
                    982: 
                    983:    Not only does this modify 100 (in which case it might still be valid
                    984:    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100. 
                    985: 
                    986:    We can also run into a problem if I2 sets a register that I1
                    987:    uses and I1 gets directly substituted into I3 (not via I2).  In that
                    988:    case, we would be getting the wrong value of I2DEST into I3, so we
                    989:    must reject the combination.  This case occurs when I2 and I1 both
                    990:    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
                    991:    If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
                    992:    of a SET must prevent combination from occurring.
                    993: 
                    994:    On machines where SMALL_REGISTER_CLASSES is defined, we don't combine
                    995:    if the destination of a SET is a hard register.
                    996: 
                    997:    Before doing the above check, we first try to expand a field assignment
                    998:    into a set of logical operations.
                    999: 
                   1000:    If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
                   1001:    we place a register that is both set and used within I3.  If more than one
                   1002:    such register is detected, we fail.
                   1003: 
                   1004:    Return 1 if the combination is valid, zero otherwise.  */
                   1005: 
                   1006: static int
                   1007: combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
                   1008:      rtx i3;
                   1009:      rtx *loc;
                   1010:      rtx i2dest;
                   1011:      rtx i1dest;
                   1012:      int i1_not_in_src;
                   1013:      rtx *pi3dest_killed;
                   1014: {
                   1015:   rtx x = *loc;
                   1016: 
                   1017:   if (GET_CODE (x) == SET)
                   1018:     {
                   1019:       rtx set = expand_field_assignment (x);
                   1020:       rtx dest = SET_DEST (set);
                   1021:       rtx src = SET_SRC (set);
                   1022:       rtx inner_dest = dest, inner_src = src;
                   1023: 
                   1024:       SUBST (*loc, set);
                   1025: 
                   1026:       while (GET_CODE (inner_dest) == STRICT_LOW_PART
                   1027:             || GET_CODE (inner_dest) == SUBREG
                   1028:             || GET_CODE (inner_dest) == ZERO_EXTRACT)
                   1029:        inner_dest = XEXP (inner_dest, 0);
                   1030: 
                   1031:   /* We probably don't need this any more now that LIMIT_RELOAD_CLASS
                   1032:      was added.  */
                   1033: #if 0
                   1034:       while (GET_CODE (inner_src) == STRICT_LOW_PART
                   1035:             || GET_CODE (inner_src) == SUBREG
                   1036:             || GET_CODE (inner_src) == ZERO_EXTRACT)
                   1037:        inner_src = XEXP (inner_src, 0);
                   1038: 
                   1039:       /* If it is better that two different modes keep two different pseudos,
                   1040:         avoid combining them.  This avoids producing the following pattern
                   1041:         on a 386:
                   1042:          (set (subreg:SI (reg/v:QI 21) 0)
                   1043:               (lshiftrt:SI (reg/v:SI 20)
                   1044:                   (const_int 24)))
                   1045:         If that were made, reload could not handle the pair of
                   1046:         reg 20/21, since it would try to get any GENERAL_REGS
                   1047:         but some of them don't handle QImode.  */
                   1048: 
                   1049:       if (rtx_equal_p (inner_src, i2dest)
                   1050:          && GET_CODE (inner_dest) == REG
                   1051:          && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
                   1052:        return 0;
                   1053: #endif
                   1054: 
                   1055:       /* Check for the case where I3 modifies its output, as
                   1056:         discussed above.  */
                   1057:       if ((inner_dest != dest
                   1058:           && (reg_overlap_mentioned_p (i2dest, inner_dest)
                   1059:               || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1.1.1.3   root     1060:          /* This is the same test done in can_combine_p except that we
                   1061:             allow a hard register with SMALL_REGISTER_CLASSES if SRC is a
                   1062:             CALL operation.  */
1.1       root     1063:          || (GET_CODE (inner_dest) == REG
1.1.1.2   root     1064:              && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1.1.1.3   root     1065: #ifdef SMALL_REGISTER_CLASSES
                   1066:              && GET_CODE (src) != CALL
                   1067: #else
1.1.1.2   root     1068:              && ! HARD_REGNO_MODE_OK (REGNO (inner_dest),
                   1069:                                       GET_MODE (inner_dest))
1.1       root     1070: #endif
1.1.1.2   root     1071:              )
                   1072: 
1.1       root     1073:          || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
                   1074:        return 0;
                   1075: 
                   1076:       /* If DEST is used in I3, it is being killed in this insn,
1.1.1.5 ! root     1077:         so record that for later. 
        !          1078:         Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
        !          1079:         STACK_POINTER_REGNUM, since these are always considered to be
        !          1080:         live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1.1       root     1081:       if (pi3dest_killed && GET_CODE (dest) == REG
1.1.1.5 ! root     1082:          && reg_referenced_p (dest, PATTERN (i3))
        !          1083:          && REGNO (dest) != FRAME_POINTER_REGNUM
        !          1084: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
        !          1085:          && (REGNO (dest) != ARG_POINTER_REGNUM
        !          1086:              || ! fixed_regs [REGNO (dest)])
        !          1087: #endif
        !          1088:          && REGNO (dest) != STACK_POINTER_REGNUM)
1.1       root     1089:        {
                   1090:          if (*pi3dest_killed)
                   1091:            return 0;
                   1092: 
                   1093:          *pi3dest_killed = dest;
                   1094:        }
                   1095:     }
                   1096: 
                   1097:   else if (GET_CODE (x) == PARALLEL)
                   1098:     {
                   1099:       int i;
                   1100: 
                   1101:       for (i = 0; i < XVECLEN (x, 0); i++)
                   1102:        if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
                   1103:                                i1_not_in_src, pi3dest_killed))
                   1104:          return 0;
                   1105:     }
                   1106: 
                   1107:   return 1;
                   1108: }
                   1109: 
                   1110: /* Try to combine the insns I1 and I2 into I3.
                   1111:    Here I1 and I2 appear earlier than I3.
                   1112:    I1 can be zero; then we combine just I2 into I3.
                   1113:  
                   1114:    It we are combining three insns and the resulting insn is not recognized,
                   1115:    try splitting it into two insns.  If that happens, I2 and I3 are retained
                   1116:    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
                   1117:    are pseudo-deleted.
                   1118: 
                   1119:    If we created two insns, return I2; otherwise return I3.
                   1120:    Return 0 if the combination does not work.  Then nothing is changed.  */
                   1121: 
                   1122: static rtx
                   1123: try_combine (i3, i2, i1)
                   1124:      register rtx i3, i2, i1;
                   1125: {
                   1126:   /* New patterns for I3 and I3, respectively.  */
                   1127:   rtx newpat, newi2pat = 0;
                   1128:   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
                   1129:   int added_sets_1, added_sets_2;
                   1130:   /* Total number of SETs to put into I3.  */
                   1131:   int total_sets;
                   1132:   /* Nonzero is I2's body now appears in I3.  */
                   1133:   int i2_is_used;
                   1134:   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
                   1135:   int insn_code_number, i2_code_number, other_code_number;
                   1136:   /* Contains I3 if the destination of I3 is used in its source, which means
                   1137:      that the old life of I3 is being killed.  If that usage is placed into
                   1138:      I2 and not in I3, a REG_DEAD note must be made.  */
                   1139:   rtx i3dest_killed = 0;
                   1140:   /* SET_DEST and SET_SRC of I2 and I1.  */
                   1141:   rtx i2dest, i2src, i1dest = 0, i1src = 0;
                   1142:   /* PATTERN (I2), or a copy of it in certain cases.  */
                   1143:   rtx i2pat;
                   1144:   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
                   1145:   int i2dest_in_i2src, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
                   1146:   int i1_feeds_i3 = 0;
                   1147:   /* Notes that must be added to REG_NOTES in I3 and I2.  */
                   1148:   rtx new_i3_notes, new_i2_notes;
                   1149: 
                   1150:   int maxreg;
                   1151:   rtx temp;
                   1152:   register rtx link;
                   1153:   int i;
                   1154: 
                   1155:   /* If any of I1, I2, and I3 isn't really an insn, we can't do anything.
                   1156:      This can occur when flow deletes an insn that it has merged into an
                   1157:      auto-increment address.  We also can't do anything if I3 has a
                   1158:      REG_LIBCALL note since we don't want to disrupt the contiguity of a
                   1159:      libcall.  */
                   1160: 
                   1161:   if (GET_RTX_CLASS (GET_CODE (i3)) != 'i'
                   1162:       || GET_RTX_CLASS (GET_CODE (i2)) != 'i'
                   1163:       || (i1 && GET_RTX_CLASS (GET_CODE (i1)) != 'i')
1.1.1.4   root     1164:       || find_reg_note (i3, REG_LIBCALL, NULL_RTX))
1.1       root     1165:     return 0;
                   1166: 
                   1167:   combine_attempts++;
                   1168: 
                   1169:   undobuf.num_undo = previous_num_undos = 0;
                   1170:   undobuf.other_insn = 0;
                   1171: 
                   1172:   /* Save the current high-water-mark so we can free storage if we didn't
                   1173:      accept this combination.  */
                   1174:   undobuf.storage = (char *) oballoc (0);
                   1175: 
                   1176:   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
                   1177:      code below, set I1 to be the earlier of the two insns.  */
                   1178:   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
                   1179:     temp = i1, i1 = i2, i2 = temp;
                   1180: 
                   1181:   /* First check for one important special-case that the code below will
                   1182:      not handle.  Namely, the case where I1 is zero, I2 has multiple sets,
                   1183:      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
                   1184:      we may be able to replace that destination with the destination of I3.
                   1185:      This occurs in the common code where we compute both a quotient and
                   1186:      remainder into a structure, in which case we want to do the computation
                   1187:      directly into the structure to avoid register-register copies.
                   1188: 
                   1189:      We make very conservative checks below and only try to handle the
                   1190:      most common cases of this.  For example, we only handle the case
                   1191:      where I2 and I3 are adjacent to avoid making difficult register
                   1192:      usage tests.  */
                   1193: 
                   1194:   if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
                   1195:       && GET_CODE (SET_SRC (PATTERN (i3))) == REG
                   1196:       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
                   1197: #ifdef SMALL_REGISTER_CLASSES
                   1198:       && (GET_CODE (SET_DEST (PATTERN (i3))) != REG
                   1199:          || REGNO (SET_DEST (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER)
                   1200: #endif
                   1201:       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
                   1202:       && GET_CODE (PATTERN (i2)) == PARALLEL
                   1203:       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1.1.1.2   root     1204:       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
                   1205:         below would need to check what is inside (and reg_overlap_mentioned_p
                   1206:         doesn't support those codes anyway).  Don't allow those destinations;
                   1207:         the resulting insn isn't likely to be recognized anyway.  */
                   1208:       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
                   1209:       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1.1       root     1210:       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
                   1211:                                    SET_DEST (PATTERN (i3)))
                   1212:       && next_real_insn (i2) == i3)
1.1.1.2   root     1213:     {
                   1214:       rtx p2 = PATTERN (i2);
1.1       root     1215: 
1.1.1.2   root     1216:       /* Make sure that the destination of I3,
                   1217:         which we are going to substitute into one output of I2,
                   1218:         is not used within another output of I2.  We must avoid making this:
                   1219:         (parallel [(set (mem (reg 69)) ...)
                   1220:                    (set (reg 69) ...)])
                   1221:         which is not well-defined as to order of actions.
                   1222:         (Besides, reload can't handle output reloads for this.)
                   1223: 
                   1224:         The problem can also happen if the dest of I3 is a memory ref,
                   1225:         if another dest in I2 is an indirect memory ref.  */
                   1226:       for (i = 0; i < XVECLEN (p2, 0); i++)
                   1227:        if (GET_CODE (XVECEXP (p2, 0, i)) == SET
                   1228:            && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
                   1229:                                        SET_DEST (XVECEXP (p2, 0, i))))
                   1230:          break;
                   1231: 
                   1232:       if (i == XVECLEN (p2, 0))
                   1233:        for (i = 0; i < XVECLEN (p2, 0); i++)
                   1234:          if (SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
                   1235:            {
                   1236:              combine_merges++;
                   1237: 
                   1238:              subst_insn = i3;
                   1239:              subst_low_cuid = INSN_CUID (i2);
                   1240: 
                   1241:              added_sets_2 = 0;
                   1242:              i2dest = SET_SRC (PATTERN (i3));
                   1243: 
                   1244:              /* Replace the dest in I2 with our dest and make the resulting
                   1245:                 insn the new pattern for I3.  Then skip to where we
                   1246:                 validate the pattern.  Everything was set up above.  */
                   1247:              SUBST (SET_DEST (XVECEXP (p2, 0, i)), 
                   1248:                     SET_DEST (PATTERN (i3)));
1.1       root     1249: 
1.1.1.2   root     1250:              newpat = p2;
                   1251:              goto validate_replacement;
                   1252:            }
                   1253:     }
1.1       root     1254: 
                   1255: #ifndef HAVE_cc0
                   1256:   /* If we have no I1 and I2 looks like:
                   1257:        (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
                   1258:                   (set Y OP)])
                   1259:      make up a dummy I1 that is
                   1260:        (set Y OP)
                   1261:      and change I2 to be
                   1262:         (set (reg:CC X) (compare:CC Y (const_int 0)))
                   1263: 
                   1264:      (We can ignore any trailing CLOBBERs.)
                   1265: 
                   1266:      This undoes a previous combination and allows us to match a branch-and-
                   1267:      decrement insn.  */
                   1268: 
                   1269:   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
                   1270:       && XVECLEN (PATTERN (i2), 0) >= 2
                   1271:       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
                   1272:       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
                   1273:          == MODE_CC)
                   1274:       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
                   1275:       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
                   1276:       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
                   1277:       && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
                   1278:       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
                   1279:                      SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
                   1280:     {
                   1281:       for (i =  XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
                   1282:        if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
                   1283:          break;
                   1284: 
                   1285:       if (i == 1)
                   1286:        {
                   1287:          /* We make I1 with the same INSN_UID as I2.  This gives it
                   1288:             the same INSN_CUID for value tracking.  Our fake I1 will
                   1289:             never appear in the insn stream so giving it the same INSN_UID
                   1290:             as I2 will not cause a problem.  */
                   1291: 
                   1292:          i1 = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2,
                   1293:                        XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0);
                   1294: 
                   1295:          SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
                   1296:          SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
                   1297:                 SET_DEST (PATTERN (i1)));
                   1298:        }
                   1299:     }
                   1300: #endif
                   1301: 
                   1302:   /* Verify that I2 and I1 are valid for combining.  */
1.1.1.4   root     1303:   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
                   1304:       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1.1       root     1305:     {
                   1306:       undo_all ();
                   1307:       return 0;
                   1308:     }
                   1309: 
                   1310:   /* Record whether I2DEST is used in I2SRC and similarly for the other
                   1311:      cases.  Knowing this will help in register status updating below.  */
                   1312:   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
                   1313:   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
                   1314:   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
                   1315: 
1.1.1.3   root     1316:   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1.1       root     1317:      in I2SRC.  */
                   1318:   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
                   1319: 
                   1320:   /* Ensure that I3's pattern can be the destination of combines.  */
                   1321:   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
                   1322:                          i1 && i2dest_in_i1src && i1_feeds_i3,
                   1323:                          &i3dest_killed))
                   1324:     {
                   1325:       undo_all ();
                   1326:       return 0;
                   1327:     }
                   1328: 
                   1329:   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
                   1330:      We used to do this EXCEPT in one case: I3 has a post-inc in an
                   1331:      output operand.  However, that exception can give rise to insns like
                   1332:        mov r3,(r3)+
                   1333:      which is a famous insn on the PDP-11 where the value of r3 used as the
1.1.1.2   root     1334:      source was model-dependent.  Avoid this sort of thing.  */
1.1       root     1335: 
                   1336: #if 0
                   1337:   if (!(GET_CODE (PATTERN (i3)) == SET
                   1338:        && GET_CODE (SET_SRC (PATTERN (i3))) == REG
                   1339:        && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
                   1340:        && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
                   1341:            || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
                   1342:     /* It's not the exception.  */
                   1343: #endif
                   1344: #ifdef AUTO_INC_DEC
                   1345:     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
                   1346:       if (REG_NOTE_KIND (link) == REG_INC
                   1347:          && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
                   1348:              || (i1 != 0
                   1349:                  && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
                   1350:        {
                   1351:          undo_all ();
                   1352:          return 0;
                   1353:        }
                   1354: #endif
                   1355: 
                   1356:   /* See if the SETs in I1 or I2 need to be kept around in the merged
                   1357:      instruction: whenever the value set there is still needed past I3.
                   1358:      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
                   1359: 
                   1360:      For the SET in I1, we have two cases:  If I1 and I2 independently
                   1361:      feed into I3, the set in I1 needs to be kept around if I1DEST dies
                   1362:      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
                   1363:      in I1 needs to be kept around unless I1DEST dies or is set in either
                   1364:      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
                   1365:      I1DEST.  If so, we know I1 feeds into I2.  */
                   1366: 
                   1367:   added_sets_2 = ! dead_or_set_p (i3, i2dest);
                   1368: 
                   1369:   added_sets_1
                   1370:     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
                   1371:               : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
                   1372: 
                   1373:   /* If the set in I2 needs to be kept around, we must make a copy of
                   1374:      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1.1.1.2   root     1375:      PATTERN (I2), we are only substituting for the original I1DEST, not into
1.1       root     1376:      an already-substituted copy.  This also prevents making self-referential
                   1377:      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
                   1378:      I2DEST.  */
                   1379: 
                   1380:   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
                   1381:           ? gen_rtx (SET, VOIDmode, i2dest, i2src)
                   1382:           : PATTERN (i2));
                   1383: 
                   1384:   if (added_sets_2)
                   1385:     i2pat = copy_rtx (i2pat);
                   1386: 
                   1387:   combine_merges++;
                   1388: 
                   1389:   /* Substitute in the latest insn for the regs set by the earlier ones.  */
                   1390: 
                   1391:   maxreg = max_reg_num ();
                   1392: 
                   1393:   subst_insn = i3;
                   1394: 
                   1395:   /* It is possible that the source of I2 or I1 may be performing an
                   1396:      unneeded operation, such as a ZERO_EXTEND of something that is known
                   1397:      to have the high part zero.  Handle that case by letting subst look at
                   1398:      the innermost one of them.
                   1399: 
                   1400:      Another way to do this would be to have a function that tries to
                   1401:      simplify a single insn instead of merging two or more insns.  We don't
                   1402:      do this because of the potential of infinite loops and because
                   1403:      of the potential extra memory required.  However, doing it the way
                   1404:      we are is a bit of a kludge and doesn't catch all cases.
                   1405: 
                   1406:      But only do this if -fexpensive-optimizations since it slows things down
                   1407:      and doesn't usually win.  */
                   1408: 
                   1409:   if (flag_expensive_optimizations)
                   1410:     {
                   1411:       /* Pass pc_rtx so no substitutions are done, just simplifications.
                   1412:         The cases that we are interested in here do not involve the few
                   1413:         cases were is_replaced is checked.  */
                   1414:       if (i1)
1.1.1.4   root     1415:        {
                   1416:          subst_low_cuid = INSN_CUID (i1);
                   1417:          i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
                   1418:        }
1.1       root     1419:       else
1.1.1.4   root     1420:        {
                   1421:          subst_low_cuid = INSN_CUID (i2);
                   1422:          i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
                   1423:        }
1.1       root     1424: 
                   1425:       previous_num_undos = undobuf.num_undo;
                   1426:     }
                   1427: 
                   1428: #ifndef HAVE_cc0
                   1429:   /* Many machines that don't use CC0 have insns that can both perform an
                   1430:      arithmetic operation and set the condition code.  These operations will
                   1431:      be represented as a PARALLEL with the first element of the vector
                   1432:      being a COMPARE of an arithmetic operation with the constant zero.
                   1433:      The second element of the vector will set some pseudo to the result
                   1434:      of the same arithmetic operation.  If we simplify the COMPARE, we won't
                   1435:      match such a pattern and so will generate an extra insn.   Here we test
                   1436:      for this case, where both the comparison and the operation result are
                   1437:      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
                   1438:      I2SRC.  Later we will make the PARALLEL that contains I2.  */
                   1439: 
                   1440:   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
                   1441:       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
                   1442:       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
                   1443:       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
                   1444:     {
                   1445:       rtx *cc_use;
                   1446:       enum machine_mode compare_mode;
                   1447: 
                   1448:       newpat = PATTERN (i3);
                   1449:       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
                   1450: 
                   1451:       i2_is_used = 1;
                   1452: 
                   1453: #ifdef EXTRA_CC_MODES
                   1454:       /* See if a COMPARE with the operand we substituted in should be done
                   1455:         with the mode that is currently being used.  If not, do the same
                   1456:         processing we do in `subst' for a SET; namely, if the destination
                   1457:         is used only once, try to replace it with a register of the proper
                   1458:         mode and also replace the COMPARE.  */
                   1459:       if (undobuf.other_insn == 0
                   1460:          && (cc_use = find_single_use (SET_DEST (newpat), i3,
                   1461:                                        &undobuf.other_insn))
1.1.1.4   root     1462:          && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
                   1463:                                              i2src, const0_rtx))
1.1       root     1464:              != GET_MODE (SET_DEST (newpat))))
                   1465:        {
                   1466:          int regno = REGNO (SET_DEST (newpat));
                   1467:          rtx new_dest = gen_rtx (REG, compare_mode, regno);
                   1468: 
                   1469:          if (regno < FIRST_PSEUDO_REGISTER
                   1470:              || (reg_n_sets[regno] == 1 && ! added_sets_2
                   1471:                  && ! REG_USERVAR_P (SET_DEST (newpat))))
                   1472:            {
                   1473:              if (regno >= FIRST_PSEUDO_REGISTER)
                   1474:                SUBST (regno_reg_rtx[regno], new_dest);
                   1475: 
                   1476:              SUBST (SET_DEST (newpat), new_dest);
                   1477:              SUBST (XEXP (*cc_use, 0), new_dest);
                   1478:              SUBST (SET_SRC (newpat),
                   1479:                     gen_rtx_combine (COMPARE, compare_mode,
                   1480:                                      i2src, const0_rtx));
                   1481:            }
                   1482:          else
                   1483:            undobuf.other_insn = 0;
                   1484:        }
                   1485: #endif   
                   1486:     }
                   1487:   else
                   1488: #endif
                   1489:     {
                   1490:       n_occurrences = 0;               /* `subst' counts here */
                   1491: 
                   1492:       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
                   1493:         need to make a unique copy of I2SRC each time we substitute it
                   1494:         to avoid self-referential rtl.  */
                   1495: 
1.1.1.4   root     1496:       subst_low_cuid = INSN_CUID (i2);
1.1       root     1497:       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
                   1498:                      ! i1_feeds_i3 && i1dest_in_i1src);
                   1499:       previous_num_undos = undobuf.num_undo;
                   1500: 
                   1501:       /* Record whether i2's body now appears within i3's body.  */
                   1502:       i2_is_used = n_occurrences;
                   1503:     }
                   1504: 
                   1505:   /* If we already got a failure, don't try to do more.  Otherwise,
                   1506:      try to substitute in I1 if we have it.  */
                   1507: 
                   1508:   if (i1 && GET_CODE (newpat) != CLOBBER)
                   1509:     {
                   1510:       /* Before we can do this substitution, we must redo the test done
                   1511:         above (see detailed comments there) that ensures  that I1DEST
                   1512:         isn't mentioned in any SETs in NEWPAT that are field assignments. */
                   1513: 
1.1.1.4   root     1514:       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
                   1515:                              0, NULL_PTR))
1.1       root     1516:        {
                   1517:          undo_all ();
                   1518:          return 0;
                   1519:        }
                   1520: 
                   1521:       n_occurrences = 0;
1.1.1.4   root     1522:       subst_low_cuid = INSN_CUID (i1);
1.1       root     1523:       newpat = subst (newpat, i1dest, i1src, 0, 0);
                   1524:       previous_num_undos = undobuf.num_undo;
                   1525:     }
                   1526: 
1.1.1.3   root     1527:   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
                   1528:      to count all the ways that I2SRC and I1SRC can be used.  */
1.1.1.4   root     1529:   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
1.1.1.3   root     1530:        && i2_is_used + added_sets_2 > 1)
1.1.1.4   root     1531:       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
1.1.1.3   root     1532:          && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
                   1533:              > 1))
1.1       root     1534:       /* Fail if we tried to make a new register (we used to abort, but there's
                   1535:         really no reason to).  */
                   1536:       || max_reg_num () != maxreg
                   1537:       /* Fail if we couldn't do something and have a CLOBBER.  */
                   1538:       || GET_CODE (newpat) == CLOBBER)
                   1539:     {
                   1540:       undo_all ();
                   1541:       return 0;
                   1542:     }
                   1543: 
                   1544:   /* If the actions of the earlier insns must be kept
                   1545:      in addition to substituting them into the latest one,
                   1546:      we must make a new PARALLEL for the latest insn
                   1547:      to hold additional the SETs.  */
                   1548: 
                   1549:   if (added_sets_1 || added_sets_2)
                   1550:     {
                   1551:       combine_extras++;
                   1552: 
                   1553:       if (GET_CODE (newpat) == PARALLEL)
                   1554:        {
                   1555:          rtvec old = XVEC (newpat, 0);
                   1556:          total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
                   1557:          newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets));
                   1558:          bcopy (&old->elem[0], &XVECEXP (newpat, 0, 0),
                   1559:                 sizeof (old->elem[0]) * old->num_elem);
                   1560:        }
                   1561:       else
                   1562:        {
                   1563:          rtx old = newpat;
                   1564:          total_sets = 1 + added_sets_1 + added_sets_2;
                   1565:          newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets));
                   1566:          XVECEXP (newpat, 0, 0) = old;
                   1567:        }
                   1568: 
                   1569:      if (added_sets_1)
                   1570:        XVECEXP (newpat, 0, --total_sets)
                   1571:         = (GET_CODE (PATTERN (i1)) == PARALLEL
                   1572:            ? gen_rtx (SET, VOIDmode, i1dest, i1src) : PATTERN (i1));
                   1573: 
                   1574:      if (added_sets_2)
                   1575:        {
                   1576:          /* If there is no I1, use I2's body as is.  We used to also not do
                   1577:             the subst call below if I2 was substituted into I3,
                   1578:             but that could lose a simplification.  */
                   1579:          if (i1 == 0)
                   1580:            XVECEXP (newpat, 0, --total_sets) = i2pat;
                   1581:          else
                   1582:            /* See comment where i2pat is assigned.  */
                   1583:            XVECEXP (newpat, 0, --total_sets)
                   1584:              = subst (i2pat, i1dest, i1src, 0, 0);
                   1585:        }
                   1586:     }
                   1587: 
                   1588:   /* We come here when we are replacing a destination in I2 with the
                   1589:      destination of I3.  */
                   1590:  validate_replacement:
                   1591: 
                   1592:   /* Is the result of combination a valid instruction?  */
                   1593:   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
                   1594: 
                   1595:   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
                   1596:      the second SET's destination is a register that is unused.  In that case,
                   1597:      we just need the first SET.   This can occur when simplifying a divmod
                   1598:      insn.  We *must* test for this case here because the code below that
                   1599:      splits two independent SETs doesn't handle this case correctly when it
                   1600:      updates the register status.  Also check the case where the first
                   1601:      SET's destination is unused.  That would not cause incorrect code, but
                   1602:      does cause an unneeded insn to remain.  */
                   1603: 
                   1604:   if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
                   1605:       && XVECLEN (newpat, 0) == 2
                   1606:       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
                   1607:       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
                   1608:       && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG
                   1609:       && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1)))
                   1610:       && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1)))
                   1611:       && asm_noperands (newpat) < 0)
                   1612:     {
                   1613:       newpat = XVECEXP (newpat, 0, 0);
                   1614:       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
                   1615:     }
                   1616: 
                   1617:   else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
                   1618:           && XVECLEN (newpat, 0) == 2
                   1619:           && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
                   1620:           && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
                   1621:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG
                   1622:           && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0)))
                   1623:           && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0)))
                   1624:           && asm_noperands (newpat) < 0)
                   1625:     {
                   1626:       newpat = XVECEXP (newpat, 0, 1);
                   1627:       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
                   1628:     }
                   1629: 
1.1.1.4   root     1630:   /* See if this is an XOR.  If so, perhaps the problem is that the
                   1631:      constant is out of range.  Replace it with a complemented XOR with
                   1632:      a complemented constant; it might be in range.  */
                   1633: 
                   1634:   else if (insn_code_number < 0 && GET_CODE (newpat) == SET
                   1635:           && GET_CODE (SET_SRC (newpat)) == XOR
                   1636:           && GET_CODE (XEXP (SET_SRC (newpat), 1)) == CONST_INT
                   1637:           && ((temp = simplify_unary_operation (NOT,
                   1638:                                                 GET_MODE (SET_SRC (newpat)),
                   1639:                                                 XEXP (SET_SRC (newpat), 1),
                   1640:                                                 GET_MODE (SET_SRC (newpat))))
                   1641:               != 0))
                   1642:     {
                   1643:       enum machine_mode i_mode = GET_MODE (SET_SRC (newpat));
                   1644:       rtx pat
                   1645:        = gen_rtx_combine (SET, VOIDmode, SET_DEST (newpat),
                   1646:                           gen_unary (NOT, i_mode,
                   1647:                                      gen_binary (XOR, i_mode,
                   1648:                                                  XEXP (SET_SRC (newpat), 0),
                   1649:                                                  temp)));
                   1650: 
                   1651:       insn_code_number = recog_for_combine (&pat, i3, &new_i3_notes);
                   1652:       if (insn_code_number >= 0)
                   1653:        newpat = pat;
                   1654:     }
                   1655:                                                        
1.1       root     1656:   /* If we were combining three insns and the result is a simple SET
                   1657:      with no ASM_OPERANDS that wasn't recognized, try to split it into two
1.1.1.3   root     1658:      insns.  There are two ways to do this.  It can be split using a 
                   1659:      machine-specific method (like when you have an addition of a large
                   1660:      constant) or by combine in the function find_split_point.  */
                   1661: 
1.1       root     1662:   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
                   1663:       && asm_noperands (newpat) < 0)
                   1664:     {
1.1.1.3   root     1665:       rtx m_split, *split;
1.1.1.4   root     1666:       rtx ni2dest = i2dest;
1.1.1.3   root     1667: 
                   1668:       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
1.1.1.4   root     1669:         use I2DEST as a scratch register will help.  In the latter case,
                   1670:         convert I2DEST to the mode of the source of NEWPAT if we can.  */
1.1.1.3   root     1671: 
                   1672:       m_split = split_insns (newpat, i3);
1.1.1.4   root     1673: 
                   1674:       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
                   1675:         inputs of NEWPAT.  */
                   1676: 
                   1677:       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
                   1678:         possible to try that as a scratch reg.  This would require adding
                   1679:         more code to make it work though.  */
                   1680: 
                   1681:       if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
                   1682:        {
                   1683:          /* If I2DEST is a hard register or the only use of a pseudo,
                   1684:             we can change its mode.  */
                   1685:          if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
                   1686:              && GET_MODE (SET_DEST (newpat)) != VOIDmode
                   1687:              && GET_CODE (i2dest) == REG
                   1688:              && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
                   1689:                  || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2
                   1690:                      && ! REG_USERVAR_P (i2dest))))
                   1691:            ni2dest = gen_rtx (REG, GET_MODE (SET_DEST (newpat)),
                   1692:                               REGNO (i2dest));
                   1693: 
                   1694:          m_split = split_insns (gen_rtx (PARALLEL, VOIDmode,
                   1695:                                          gen_rtvec (2, newpat,
                   1696:                                                     gen_rtx (CLOBBER,
                   1697:                                                              VOIDmode,
                   1698:                                                              ni2dest))),
                   1699:                                 i3);
                   1700:        }
1.1.1.3   root     1701: 
                   1702:       if (m_split && GET_CODE (m_split) == SEQUENCE
                   1703:          && XVECLEN (m_split, 0) == 2
                   1704:          && (next_real_insn (i2) == i3
                   1705:              || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)),
                   1706:                                      INSN_CUID (i2))))
                   1707:        {
1.1.1.4   root     1708:          rtx i2set, i3set;
                   1709:          rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1));
1.1.1.3   root     1710:          newi2pat = PATTERN (XVECEXP (m_split, 0, 0));
1.1.1.4   root     1711: 
                   1712:          i3set = single_set (XVECEXP (m_split, 0, 1));
                   1713:          i2set = single_set (XVECEXP (m_split, 0, 0));
                   1714: 
                   1715:          /* In case we changed the mode of I2DEST, replace it in the
                   1716:             pseudo-register table here.  We can't do it above in case this
                   1717:             code doesn't get executed and we do a split the other way.  */
                   1718: 
                   1719:          if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
                   1720:            SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
1.1.1.3   root     1721: 
                   1722:          i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1.1.1.4   root     1723: 
                   1724:          /* If I2 or I3 has multiple SETs, we won't know how to track
                   1725:             register status, so don't use these insns.  */
                   1726: 
                   1727:          if (i2_code_number >= 0 && i2set && i3set)
                   1728:            insn_code_number = recog_for_combine (&newi3pat, i3,
                   1729:                                                  &new_i3_notes);
                   1730: 
                   1731:          if (insn_code_number >= 0)
                   1732:            newpat = newi3pat;
                   1733: 
                   1734:          /* It is possible that both insns now set the destination of I3.
                   1735:             If so, we must show an extra use of it.  */
                   1736: 
                   1737:          if (insn_code_number >= 0 && GET_CODE (SET_DEST (i3set)) == REG
                   1738:              && GET_CODE (SET_DEST (i2set)) == REG
                   1739:              && REGNO (SET_DEST (i3set)) == REGNO (SET_DEST (i2set)))
                   1740:            reg_n_sets[REGNO (SET_DEST (i2set))]++;
1.1.1.3   root     1741:        }
1.1       root     1742: 
                   1743:       /* If we can split it and use I2DEST, go ahead and see if that
                   1744:         helps things be recognized.  Verify that none of the registers
                   1745:         are set between I2 and I3.  */
1.1.1.4   root     1746:       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
1.1       root     1747: #ifdef HAVE_cc0
                   1748:          && GET_CODE (i2dest) == REG
                   1749: #endif
                   1750:          /* We need I2DEST in the proper mode.  If it is a hard register
                   1751:             or the only use of a pseudo, we can change its mode.  */
                   1752:          && (GET_MODE (*split) == GET_MODE (i2dest)
                   1753:              || GET_MODE (*split) == VOIDmode
                   1754:              || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
                   1755:              || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2
                   1756:                  && ! REG_USERVAR_P (i2dest)))
                   1757:          && (next_real_insn (i2) == i3
                   1758:              || ! use_crosses_set_p (*split, INSN_CUID (i2)))
                   1759:          /* We can't overwrite I2DEST if its value is still used by
                   1760:             NEWPAT.  */
                   1761:          && ! reg_referenced_p (i2dest, newpat))
                   1762:        {
                   1763:          rtx newdest = i2dest;
                   1764: 
                   1765:          /* Get NEWDEST as a register in the proper mode.  We have already
                   1766:             validated that we can do this.  */
                   1767:          if (GET_MODE (i2dest) != GET_MODE (*split)
                   1768:              && GET_MODE (*split) != VOIDmode)
                   1769:            {
                   1770:              newdest = gen_rtx (REG, GET_MODE (*split), REGNO (i2dest));
                   1771: 
                   1772:              if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
                   1773:                SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
                   1774:            }
                   1775: 
                   1776:          /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
                   1777:             an ASHIFT.  This can occur if it was inside a PLUS and hence
                   1778:             appeared to be a memory address.  This is a kludge.  */
                   1779:          if (GET_CODE (*split) == MULT
                   1780:              && GET_CODE (XEXP (*split, 1)) == CONST_INT
                   1781:              && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
                   1782:            SUBST (*split, gen_rtx_combine (ASHIFT, GET_MODE (*split),
1.1.1.4   root     1783:                                            XEXP (*split, 0), GEN_INT (i)));
1.1       root     1784: 
                   1785: #ifdef INSN_SCHEDULING
                   1786:          /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
                   1787:             be written as a ZERO_EXTEND.  */
                   1788:          if (GET_CODE (*split) == SUBREG
                   1789:              && GET_CODE (SUBREG_REG (*split)) == MEM)
                   1790:            SUBST (*split, gen_rtx_combine (ZERO_EXTEND, GET_MODE (*split),
                   1791:                                            XEXP (*split, 0)));
                   1792: #endif
                   1793: 
                   1794:          newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split);
                   1795:          SUBST (*split, newdest);
                   1796:          i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
                   1797:          if (i2_code_number >= 0)
                   1798:            insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
                   1799:        }
                   1800:     }
                   1801: 
                   1802:   /* Check for a case where we loaded from memory in a narrow mode and
                   1803:      then sign extended it, but we need both registers.  In that case,
                   1804:      we have a PARALLEL with both loads from the same memory location.
                   1805:      We can split this into a load from memory followed by a register-register
                   1806:      copy.  This saves at least one insn, more if register allocation can
                   1807:      eliminate the copy.  */
                   1808: 
                   1809:   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
                   1810:           && GET_CODE (newpat) == PARALLEL
                   1811:           && XVECLEN (newpat, 0) == 2
                   1812:           && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
                   1813:           && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
                   1814:           && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
                   1815:           && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
                   1816:                           XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
                   1817:           && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
                   1818:                                   INSN_CUID (i2))
                   1819:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
                   1820:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
                   1821:           && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
                   1822:                                         SET_SRC (XVECEXP (newpat, 0, 1)))
                   1823:           && ! find_reg_note (i3, REG_UNUSED,
                   1824:                               SET_DEST (XVECEXP (newpat, 0, 0))))
                   1825:     {
1.1.1.4   root     1826:       rtx ni2dest;
                   1827: 
1.1       root     1828:       newi2pat = XVECEXP (newpat, 0, 0);
1.1.1.4   root     1829:       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
1.1       root     1830:       newpat = XVECEXP (newpat, 0, 1);
                   1831:       SUBST (SET_SRC (newpat),
1.1.1.4   root     1832:             gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest));
1.1       root     1833:       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
                   1834:       if (i2_code_number >= 0)
                   1835:        insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1.1.1.2   root     1836: 
                   1837:       if (insn_code_number >= 0)
                   1838:        {
                   1839:          rtx insn;
                   1840:          rtx link;
                   1841: 
                   1842:          /* If we will be able to accept this, we have made a change to the
                   1843:             destination of I3.  This can invalidate a LOG_LINKS pointing
                   1844:             to I3.  No other part of combine.c makes such a transformation.
                   1845: 
                   1846:             The new I3 will have a destination that was previously the
                   1847:             destination of I1 or I2 and which was used in i2 or I3.  Call
                   1848:             distribute_links to make a LOG_LINK from the next use of
                   1849:             that destination.  */
                   1850: 
                   1851:          PATTERN (i3) = newpat;
1.1.1.4   root     1852:          distribute_links (gen_rtx (INSN_LIST, VOIDmode, i3, NULL_RTX));
1.1.1.2   root     1853: 
                   1854:          /* I3 now uses what used to be its destination and which is
                   1855:             now I2's destination.  That means we need a LOG_LINK from
                   1856:             I3 to I2.  But we used to have one, so we still will.
                   1857: 
                   1858:             However, some later insn might be using I2's dest and have
                   1859:             a LOG_LINK pointing at I3.  We must remove this link.
                   1860:             The simplest way to remove the link is to point it at I1,
                   1861:             which we know will be a NOTE.  */
                   1862: 
                   1863:          for (insn = NEXT_INSN (i3);
                   1864:               insn && GET_CODE (insn) != CODE_LABEL
                   1865:               && GET_CODE (PREV_INSN (insn)) != JUMP_INSN;
                   1866:               insn = NEXT_INSN (insn))
                   1867:            {
                   1868:              if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
1.1.1.4   root     1869:                  && reg_referenced_p (ni2dest, PATTERN (insn)))
1.1.1.2   root     1870:                {
                   1871:                  for (link = LOG_LINKS (insn); link;
                   1872:                       link = XEXP (link, 1))
                   1873:                    if (XEXP (link, 0) == i3)
                   1874:                      XEXP (link, 0) = i1;
                   1875: 
                   1876:                  break;
                   1877:                }
                   1878:            }
                   1879:        }
1.1       root     1880:     }
                   1881:            
                   1882:   /* Similarly, check for a case where we have a PARALLEL of two independent
                   1883:      SETs but we started with three insns.  In this case, we can do the sets
                   1884:      as two separate insns.  This case occurs when some SET allows two
                   1885:      other insns to combine, but the destination of that SET is still live.  */
                   1886: 
                   1887:   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
                   1888:           && GET_CODE (newpat) == PARALLEL
                   1889:           && XVECLEN (newpat, 0) == 2
                   1890:           && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
                   1891:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
                   1892:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
                   1893:           && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
                   1894:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
                   1895:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
                   1896:           && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
                   1897:                                   INSN_CUID (i2))
                   1898:           /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
                   1899:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
                   1900:           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
                   1901:           && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
                   1902:                                  XVECEXP (newpat, 0, 0))
                   1903:           && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
                   1904:                                  XVECEXP (newpat, 0, 1)))
                   1905:     {
                   1906:       newi2pat = XVECEXP (newpat, 0, 1);
                   1907:       newpat = XVECEXP (newpat, 0, 0);
                   1908: 
                   1909:       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
                   1910:       if (i2_code_number >= 0)
                   1911:        insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
                   1912:     }
                   1913: 
                   1914:   /* If it still isn't recognized, fail and change things back the way they
                   1915:      were.  */
                   1916:   if ((insn_code_number < 0
                   1917:        /* Is the result a reasonable ASM_OPERANDS?  */
                   1918:        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
                   1919:     {
                   1920:       undo_all ();
                   1921:       return 0;
                   1922:     }
                   1923: 
                   1924:   /* If we had to change another insn, make sure it is valid also.  */
                   1925:   if (undobuf.other_insn)
                   1926:     {
                   1927:       rtx other_notes = REG_NOTES (undobuf.other_insn);
                   1928:       rtx other_pat = PATTERN (undobuf.other_insn);
                   1929:       rtx new_other_notes;
                   1930:       rtx note, next;
                   1931: 
                   1932:       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
                   1933:                                             &new_other_notes);
                   1934: 
                   1935:       if (other_code_number < 0 && ! check_asm_operands (other_pat))
                   1936:        {
                   1937:          undo_all ();
                   1938:          return 0;
                   1939:        }
                   1940: 
                   1941:       PATTERN (undobuf.other_insn) = other_pat;
                   1942: 
                   1943:       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
                   1944:         are still valid.  Then add any non-duplicate notes added by
                   1945:         recog_for_combine.  */
                   1946:       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
                   1947:        {
                   1948:          next = XEXP (note, 1);
                   1949: 
                   1950:          if (REG_NOTE_KIND (note) == REG_UNUSED
                   1951:              && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
1.1.1.4   root     1952:            {
                   1953:              if (GET_CODE (XEXP (note, 0)) == REG)
                   1954:                reg_n_deaths[REGNO (XEXP (note, 0))]--;
                   1955: 
                   1956:              remove_note (undobuf.other_insn, note);
                   1957:            }
1.1       root     1958:        }
                   1959: 
1.1.1.4   root     1960:       for (note = new_other_notes; note; note = XEXP (note, 1))
                   1961:        if (GET_CODE (XEXP (note, 0)) == REG)
                   1962:          reg_n_deaths[REGNO (XEXP (note, 0))]++;
                   1963: 
1.1       root     1964:       distribute_notes (new_other_notes, undobuf.other_insn,
1.1.1.4   root     1965:                        undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
1.1       root     1966:     }
                   1967: 
                   1968:   /* We now know that we can do this combination.  Merge the insns and 
                   1969:      update the status of registers and LOG_LINKS.  */
                   1970: 
                   1971:   {
                   1972:     rtx i3notes, i2notes, i1notes = 0;
                   1973:     rtx i3links, i2links, i1links = 0;
                   1974:     rtx midnotes = 0;
                   1975:     int all_adjacent = (next_real_insn (i2) == i3
                   1976:                        && (i1 == 0 || next_real_insn (i1) == i2));
                   1977:     register int regno;
                   1978:     /* Compute which registers we expect to eliminate.  */
                   1979:     rtx elim_i2 = (newi2pat || i2dest_in_i2src || i2dest_in_i1src
                   1980:                   ? 0 : i2dest);
                   1981:     rtx elim_i1 = i1 == 0 || i1dest_in_i1src ? 0 : i1dest;
                   1982: 
                   1983:     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
                   1984:        clear them.  */
                   1985:     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
                   1986:     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
                   1987:     if (i1)
                   1988:       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
                   1989: 
                   1990:     /* Ensure that we do not have something that should not be shared but
                   1991:        occurs multiple times in the new insns.  Check this by first
1.1.1.2   root     1992:        resetting all the `used' flags and then copying anything is shared.  */
1.1       root     1993: 
                   1994:     reset_used_flags (i3notes);
                   1995:     reset_used_flags (i2notes);
                   1996:     reset_used_flags (i1notes);
                   1997:     reset_used_flags (newpat);
                   1998:     reset_used_flags (newi2pat);
                   1999:     if (undobuf.other_insn)
                   2000:       reset_used_flags (PATTERN (undobuf.other_insn));
                   2001: 
                   2002:     i3notes = copy_rtx_if_shared (i3notes);
                   2003:     i2notes = copy_rtx_if_shared (i2notes);
                   2004:     i1notes = copy_rtx_if_shared (i1notes);
                   2005:     newpat = copy_rtx_if_shared (newpat);
                   2006:     newi2pat = copy_rtx_if_shared (newi2pat);
                   2007:     if (undobuf.other_insn)
                   2008:       reset_used_flags (PATTERN (undobuf.other_insn));
                   2009: 
                   2010:     INSN_CODE (i3) = insn_code_number;
                   2011:     PATTERN (i3) = newpat;
                   2012:     if (undobuf.other_insn)
                   2013:       INSN_CODE (undobuf.other_insn) = other_code_number;
                   2014: 
                   2015:     /* We had one special case above where I2 had more than one set and
                   2016:        we replaced a destination of one of those sets with the destination
                   2017:        of I3.  In that case, we have to update LOG_LINKS of insns later
                   2018:        in this basic block.  Note that this (expensive) case is rare.  */
                   2019: 
                   2020:     if (GET_CODE (PATTERN (i2)) == PARALLEL)
                   2021:       for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
                   2022:        if (GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
                   2023:            && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
                   2024:            && ! find_reg_note (i2, REG_UNUSED,
                   2025:                                SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
                   2026:          {
                   2027:            register rtx insn;
                   2028: 
                   2029:            for (insn = NEXT_INSN (i2); insn; insn = NEXT_INSN (insn))
                   2030:              {
                   2031:                if (insn != i3 && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
                   2032:                  for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
                   2033:                    if (XEXP (link, 0) == i2)
                   2034:                      XEXP (link, 0) = i3;
                   2035: 
                   2036:                if (GET_CODE (insn) == CODE_LABEL
                   2037:                    || GET_CODE (insn) == JUMP_INSN)
                   2038:                  break;
                   2039:              }
                   2040:          }
                   2041: 
                   2042:     LOG_LINKS (i3) = 0;
                   2043:     REG_NOTES (i3) = 0;
                   2044:     LOG_LINKS (i2) = 0;
                   2045:     REG_NOTES (i2) = 0;
                   2046: 
                   2047:     if (newi2pat)
                   2048:       {
                   2049:        INSN_CODE (i2) = i2_code_number;
                   2050:        PATTERN (i2) = newi2pat;
                   2051:       }
                   2052:     else
                   2053:       {
                   2054:        PUT_CODE (i2, NOTE);
                   2055:        NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
                   2056:        NOTE_SOURCE_FILE (i2) = 0;
                   2057:       }
                   2058: 
                   2059:     if (i1)
                   2060:       {
                   2061:        LOG_LINKS (i1) = 0;
                   2062:        REG_NOTES (i1) = 0;
                   2063:        PUT_CODE (i1, NOTE);
                   2064:        NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
                   2065:        NOTE_SOURCE_FILE (i1) = 0;
                   2066:       }
                   2067: 
                   2068:     /* Get death notes for everything that is now used in either I3 or
                   2069:        I2 and used to die in a previous insn.  */
                   2070: 
                   2071:     move_deaths (newpat, i1 ? INSN_CUID (i1) : INSN_CUID (i2), i3, &midnotes);
                   2072:     if (newi2pat)
                   2073:       move_deaths (newi2pat, INSN_CUID (i1), i2, &midnotes);
                   2074: 
                   2075:     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
                   2076:     if (i3notes)
1.1.1.4   root     2077:       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
                   2078:                        elim_i2, elim_i1);
1.1       root     2079:     if (i2notes)
1.1.1.4   root     2080:       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
                   2081:                        elim_i2, elim_i1);
1.1       root     2082:     if (i1notes)
1.1.1.4   root     2083:       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
                   2084:                        elim_i2, elim_i1);
1.1       root     2085:     if (midnotes)
1.1.1.4   root     2086:       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
                   2087:                        elim_i2, elim_i1);
1.1       root     2088: 
                   2089:     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
                   2090:        know these are REG_UNUSED and want them to go to the desired insn,
1.1.1.4   root     2091:        so we always pass it as i3.  We have not counted the notes in 
                   2092:        reg_n_deaths yet, so we need to do so now.  */
                   2093: 
1.1       root     2094:     if (newi2pat && new_i2_notes)
1.1.1.4   root     2095:       {
                   2096:        for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
                   2097:          if (GET_CODE (XEXP (temp, 0)) == REG)
                   2098:            reg_n_deaths[REGNO (XEXP (temp, 0))]++;
                   2099:        
                   2100:        distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
                   2101:       }
                   2102: 
1.1       root     2103:     if (new_i3_notes)
1.1.1.4   root     2104:       {
                   2105:        for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
                   2106:          if (GET_CODE (XEXP (temp, 0)) == REG)
                   2107:            reg_n_deaths[REGNO (XEXP (temp, 0))]++;
                   2108:        
                   2109:        distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
                   2110:       }
1.1       root     2111: 
                   2112:     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
1.1.1.4   root     2113:        put a REG_DEAD note for it somewhere.  Similarly for I2 and I1.
                   2114:        Show an additional death due to the REG_DEAD note we make here.  If
                   2115:        we discard it in distribute_notes, we will decrement it again.  */
                   2116: 
1.1       root     2117:     if (i3dest_killed)
1.1.1.4   root     2118:       {
                   2119:        if (GET_CODE (i3dest_killed) == REG)
                   2120:          reg_n_deaths[REGNO (i3dest_killed)]++;
                   2121: 
                   2122:        distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i3dest_killed,
                   2123:                                   NULL_RTX),
                   2124:                          NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
                   2125:                          NULL_RTX, NULL_RTX);
                   2126:       }
                   2127: 
                   2128:     /* For I2 and I1, we have to be careful.  If NEWI2PAT exists and sets
                   2129:        I2DEST or I1DEST, the death must be somewhere before I2, not I3.  If
                   2130:        we passed I3 in that case, it might delete I2.  */
                   2131: 
1.1       root     2132:     if (i2dest_in_i2src)
1.1.1.4   root     2133:       {
                   2134:        if (GET_CODE (i2dest) == REG)
                   2135:          reg_n_deaths[REGNO (i2dest)]++;
                   2136: 
                   2137:        if (newi2pat && reg_set_p (i2dest, newi2pat))
                   2138:          distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
                   2139:                            NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
                   2140:        else
                   2141:          distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
                   2142:                            NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
                   2143:                            NULL_RTX, NULL_RTX);
                   2144:       }
                   2145: 
1.1       root     2146:     if (i1dest_in_i1src)
1.1.1.4   root     2147:       {
                   2148:        if (GET_CODE (i1dest) == REG)
                   2149:          reg_n_deaths[REGNO (i1dest)]++;
                   2150: 
                   2151:        if (newi2pat && reg_set_p (i1dest, newi2pat))
                   2152:          distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
                   2153:                            NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
                   2154:        else
                   2155:          distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
                   2156:                            NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
                   2157:                            NULL_RTX, NULL_RTX);
                   2158:       }
1.1       root     2159: 
                   2160:     distribute_links (i3links);
                   2161:     distribute_links (i2links);
                   2162:     distribute_links (i1links);
                   2163: 
                   2164:     if (GET_CODE (i2dest) == REG)
                   2165:       {
1.1.1.4   root     2166:        rtx link;
                   2167:        rtx i2_insn = 0, i2_val = 0, set;
                   2168: 
                   2169:        /* The insn that used to set this register doesn't exist, and
                   2170:           this life of the register may not exist either.  See if one of
                   2171:           I3's links points to an insn that sets I2DEST.  If it does, 
                   2172:           that is now the last known value for I2DEST. If we don't update
                   2173:           this and I2 set the register to a value that depended on its old
1.1       root     2174:           contents, we will get confused.  If this insn is used, thing
                   2175:           will be set correctly in combine_instructions.  */
1.1.1.4   root     2176: 
                   2177:        for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
                   2178:          if ((set = single_set (XEXP (link, 0))) != 0
                   2179:              && rtx_equal_p (i2dest, SET_DEST (set)))
                   2180:            i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
                   2181: 
                   2182:        record_value_for_reg (i2dest, i2_insn, i2_val);
1.1       root     2183: 
                   2184:        /* If the reg formerly set in I2 died only once and that was in I3,
                   2185:           zero its use count so it won't make `reload' do any work.  */
                   2186:        if (! added_sets_2 && newi2pat == 0)
                   2187:          {
                   2188:            regno = REGNO (i2dest);
                   2189:            reg_n_sets[regno]--;
                   2190:            if (reg_n_sets[regno] == 0
1.1.1.4   root     2191:                && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS]
                   2192:                      & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS))))
1.1       root     2193:              reg_n_refs[regno] = 0;
                   2194:          }
                   2195:       }
                   2196: 
                   2197:     if (i1 && GET_CODE (i1dest) == REG)
                   2198:       {
1.1.1.4   root     2199:        rtx link;
                   2200:        rtx i1_insn = 0, i1_val = 0, set;
                   2201: 
                   2202:        for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
                   2203:          if ((set = single_set (XEXP (link, 0))) != 0
                   2204:              && rtx_equal_p (i1dest, SET_DEST (set)))
                   2205:            i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
                   2206: 
                   2207:        record_value_for_reg (i1dest, i1_insn, i1_val);
                   2208: 
1.1       root     2209:        regno = REGNO (i1dest);
                   2210:        if (! added_sets_1)
                   2211:          {
                   2212:            reg_n_sets[regno]--;
                   2213:            if (reg_n_sets[regno] == 0
1.1.1.4   root     2214:                && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS]
                   2215:                      & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS))))
1.1       root     2216:              reg_n_refs[regno] = 0;
                   2217:          }
                   2218:       }
                   2219: 
1.1.1.5 ! root     2220:     /* Update reg_nonzero_bits et al for any changes that may have been made
1.1.1.4   root     2221:        to this insn.  */
                   2222: 
1.1.1.5 ! root     2223:     note_stores (newpat, set_nonzero_bits_and_sign_copies);
1.1.1.4   root     2224:     if (newi2pat)
1.1.1.5 ! root     2225:       note_stores (newi2pat, set_nonzero_bits_and_sign_copies);
1.1.1.4   root     2226: 
1.1       root     2227:     /* If I3 is now an unconditional jump, ensure that it has a 
                   2228:        BARRIER following it since it may have initially been a
1.1.1.4   root     2229:        conditional jump.  It may also be the last nonnote insn.  */
1.1       root     2230: 
                   2231:     if ((GET_CODE (newpat) == RETURN || simplejump_p (i3))
1.1.1.4   root     2232:        && ((temp = next_nonnote_insn (i3)) == NULL_RTX
                   2233:            || GET_CODE (temp) != BARRIER))
1.1       root     2234:       emit_barrier_after (i3);
                   2235:   }
                   2236: 
                   2237:   combine_successes++;
                   2238: 
                   2239:   return newi2pat ? i2 : i3;
                   2240: }
                   2241: 
                   2242: /* Undo all the modifications recorded in undobuf.  */
                   2243: 
                   2244: static void
                   2245: undo_all ()
                   2246: {
                   2247:   register int i;
                   2248:   if (undobuf.num_undo > MAX_UNDO)
                   2249:     undobuf.num_undo = MAX_UNDO;
                   2250:   for (i = undobuf.num_undo - 1; i >= 0; i--)
1.1.1.4   root     2251:     {
                   2252:       if (undobuf.undo[i].is_int)
                   2253:        *undobuf.undo[i].where.i = undobuf.undo[i].old_contents.i;
                   2254:       else
                   2255:        *undobuf.undo[i].where.rtx = undobuf.undo[i].old_contents.rtx;
                   2256:       
                   2257:     }
1.1       root     2258: 
                   2259:   obfree (undobuf.storage);
                   2260:   undobuf.num_undo = 0;
                   2261: }
                   2262: 
                   2263: /* Find the innermost point within the rtx at LOC, possibly LOC itself,
1.1.1.4   root     2264:    where we have an arithmetic expression and return that point.  LOC will
                   2265:    be inside INSN.
1.1       root     2266: 
                   2267:    try_combine will call this function to see if an insn can be split into
                   2268:    two insns.  */
                   2269: 
                   2270: static rtx *
1.1.1.4   root     2271: find_split_point (loc, insn)
1.1       root     2272:      rtx *loc;
1.1.1.4   root     2273:      rtx insn;
1.1       root     2274: {
                   2275:   rtx x = *loc;
                   2276:   enum rtx_code code = GET_CODE (x);
                   2277:   rtx *split;
                   2278:   int len = 0, pos, unsignedp;
                   2279:   rtx inner;
                   2280: 
                   2281:   /* First special-case some codes.  */
                   2282:   switch (code)
                   2283:     {
                   2284:     case SUBREG:
                   2285: #ifdef INSN_SCHEDULING
                   2286:       /* If we are making a paradoxical SUBREG invalid, it becomes a split
                   2287:         point.  */
                   2288:       if (GET_CODE (SUBREG_REG (x)) == MEM)
                   2289:        return loc;
                   2290: #endif
1.1.1.4   root     2291:       return find_split_point (&SUBREG_REG (x), insn);
1.1       root     2292: 
                   2293:     case MEM:
1.1.1.3   root     2294: #ifdef HAVE_lo_sum
1.1       root     2295:       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
                   2296:         using LO_SUM and HIGH.  */
                   2297:       if (GET_CODE (XEXP (x, 0)) == CONST
                   2298:          || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
                   2299:        {
                   2300:          SUBST (XEXP (x, 0),
                   2301:                 gen_rtx_combine (LO_SUM, Pmode,
                   2302:                                  gen_rtx_combine (HIGH, Pmode, XEXP (x, 0)),
                   2303:                                  XEXP (x, 0)));
                   2304:          return &XEXP (XEXP (x, 0), 0);
                   2305:        }
                   2306: #endif
                   2307: 
1.1.1.3   root     2308:       /* If we have a PLUS whose second operand is a constant and the
                   2309:         address is not valid, perhaps will can split it up using
                   2310:         the machine-specific way to split large constants.  We use
                   2311:         the first psuedo-reg (one of the virtual regs) as a placeholder;
                   2312:         it will not remain in the result.  */
                   2313:       if (GET_CODE (XEXP (x, 0)) == PLUS
                   2314:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   2315:          && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
                   2316:        {
                   2317:          rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
                   2318:          rtx seq = split_insns (gen_rtx (SET, VOIDmode, reg, XEXP (x, 0)),
                   2319:                                 subst_insn);
                   2320: 
                   2321:          /* This should have produced two insns, each of which sets our
                   2322:             placeholder.  If the source of the second is a valid address,
                   2323:             we can make put both sources together and make a split point
                   2324:             in the middle.  */
                   2325: 
                   2326:          if (seq && XVECLEN (seq, 0) == 2
                   2327:              && GET_CODE (XVECEXP (seq, 0, 0)) == INSN
                   2328:              && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET
                   2329:              && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg
                   2330:              && ! reg_mentioned_p (reg,
                   2331:                                    SET_SRC (PATTERN (XVECEXP (seq, 0, 0))))
                   2332:              && GET_CODE (XVECEXP (seq, 0, 1)) == INSN
                   2333:              && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET
                   2334:              && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg
                   2335:              && memory_address_p (GET_MODE (x),
                   2336:                                   SET_SRC (PATTERN (XVECEXP (seq, 0, 1)))))
                   2337:            {
                   2338:              rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0)));
                   2339:              rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1)));
                   2340: 
                   2341:              /* Replace the placeholder in SRC2 with SRC1.  If we can
                   2342:                 find where in SRC2 it was placed, that can become our
                   2343:                 split point and we can replace this address with SRC2.
                   2344:                 Just try two obvious places.  */
                   2345: 
                   2346:              src2 = replace_rtx (src2, reg, src1);
                   2347:              split = 0;
                   2348:              if (XEXP (src2, 0) == src1)
                   2349:                split = &XEXP (src2, 0);
                   2350:              else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
                   2351:                       && XEXP (XEXP (src2, 0), 0) == src1)
                   2352:                split = &XEXP (XEXP (src2, 0), 0);
                   2353: 
                   2354:              if (split)
                   2355:                {
                   2356:                  SUBST (XEXP (x, 0), src2);
                   2357:                  return split;
                   2358:                }
                   2359:            }
1.1.1.4   root     2360:          
                   2361:          /* If that didn't work, perhaps the first operand is complex and
                   2362:             needs to be computed separately, so make a split point there.
                   2363:             This will occur on machines that just support REG + CONST
                   2364:             and have a constant moved through some previous computation.  */
                   2365: 
                   2366:          else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o'
                   2367:                   && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
                   2368:                         && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0))))
                   2369:                             == 'o')))
                   2370:            return &XEXP (XEXP (x, 0), 0);
1.1.1.3   root     2371:        }
                   2372:       break;
                   2373: 
1.1       root     2374:     case SET:
                   2375: #ifdef HAVE_cc0
                   2376:       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
                   2377:         ZERO_EXTRACT, the most likely reason why this doesn't match is that
                   2378:         we need to put the operand into a register.  So split at that
                   2379:         point.  */
                   2380: 
                   2381:       if (SET_DEST (x) == cc0_rtx
                   2382:          && GET_CODE (SET_SRC (x)) != COMPARE
                   2383:          && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
                   2384:          && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o'
                   2385:          && ! (GET_CODE (SET_SRC (x)) == SUBREG
                   2386:                && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o'))
                   2387:        return &SET_SRC (x);
                   2388: #endif
                   2389: 
                   2390:       /* See if we can split SET_SRC as it stands.  */
1.1.1.4   root     2391:       split = find_split_point (&SET_SRC (x), insn);
1.1       root     2392:       if (split && split != &SET_SRC (x))
                   2393:        return split;
                   2394: 
                   2395:       /* See if this is a bitfield assignment with everything constant.  If
                   2396:         so, this is an IOR of an AND, so split it into that.  */
                   2397:       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
                   2398:          && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
1.1.1.4   root     2399:              <= HOST_BITS_PER_WIDE_INT)
1.1       root     2400:          && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
                   2401:          && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
                   2402:          && GET_CODE (SET_SRC (x)) == CONST_INT
                   2403:          && ((INTVAL (XEXP (SET_DEST (x), 1))
                   2404:              + INTVAL (XEXP (SET_DEST (x), 2)))
                   2405:              <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
                   2406:          && ! side_effects_p (XEXP (SET_DEST (x), 0)))
                   2407:        {
                   2408:          int pos = INTVAL (XEXP (SET_DEST (x), 2));
                   2409:          int len = INTVAL (XEXP (SET_DEST (x), 1));
                   2410:          int src = INTVAL (SET_SRC (x));
                   2411:          rtx dest = XEXP (SET_DEST (x), 0);
                   2412:          enum machine_mode mode = GET_MODE (dest);
1.1.1.4   root     2413:          unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
1.1       root     2414: 
                   2415: #if BITS_BIG_ENDIAN
                   2416:          pos = GET_MODE_BITSIZE (mode) - len - pos;
                   2417: #endif
                   2418: 
                   2419:          if (src == mask)
                   2420:            SUBST (SET_SRC (x),
1.1.1.4   root     2421:                   gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
1.1       root     2422:          else
                   2423:            SUBST (SET_SRC (x),
                   2424:                   gen_binary (IOR, mode,
                   2425:                               gen_binary (AND, mode, dest, 
1.1.1.4   root     2426:                                           GEN_INT (~ (mask << pos)
                   2427:                                                    & GET_MODE_MASK (mode))),
                   2428:                               GEN_INT (src << pos)));
1.1       root     2429: 
                   2430:          SUBST (SET_DEST (x), dest);
                   2431: 
1.1.1.4   root     2432:          split = find_split_point (&SET_SRC (x), insn);
1.1       root     2433:          if (split && split != &SET_SRC (x))
                   2434:            return split;
                   2435:        }
                   2436: 
                   2437:       /* Otherwise, see if this is an operation that we can split into two.
                   2438:         If so, try to split that.  */
                   2439:       code = GET_CODE (SET_SRC (x));
                   2440: 
                   2441:       switch (code)
                   2442:        {
1.1.1.4   root     2443:        case AND:
                   2444:          /* If we are AND'ing with a large constant that is only a single
                   2445:             bit and the result is only being used in a context where we
                   2446:             need to know if it is zero or non-zero, replace it with a bit
                   2447:             extraction.  This will avoid the large constant, which might
                   2448:             have taken more than one insn to make.  If the constant were
                   2449:             not a valid argument to the AND but took only one insn to make,
                   2450:             this is no worse, but if it took more than one insn, it will
                   2451:             be better.  */
                   2452: 
                   2453:          if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
                   2454:              && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
                   2455:              && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
                   2456:              && GET_CODE (SET_DEST (x)) == REG
                   2457:              && (split = find_single_use (SET_DEST (x), insn, NULL_PTR)) != 0
                   2458:              && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
                   2459:              && XEXP (*split, 0) == SET_DEST (x)
                   2460:              && XEXP (*split, 1) == const0_rtx)
                   2461:            {
                   2462:              SUBST (SET_SRC (x),
                   2463:                     make_extraction (GET_MODE (SET_DEST (x)),
                   2464:                                      XEXP (SET_SRC (x), 0),
                   2465:                                      pos, NULL_RTX, 1, 1, 0, 0));
                   2466:              return find_split_point (loc, insn);
                   2467:            }
                   2468:          break;
                   2469: 
1.1       root     2470:        case SIGN_EXTEND:
                   2471:          inner = XEXP (SET_SRC (x), 0);
                   2472:          pos = 0;
                   2473:          len = GET_MODE_BITSIZE (GET_MODE (inner));
                   2474:          unsignedp = 0;
                   2475:          break;
                   2476: 
                   2477:        case SIGN_EXTRACT:
                   2478:        case ZERO_EXTRACT:
                   2479:          if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
                   2480:              && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
                   2481:            {
                   2482:              inner = XEXP (SET_SRC (x), 0);
                   2483:              len = INTVAL (XEXP (SET_SRC (x), 1));
                   2484:              pos = INTVAL (XEXP (SET_SRC (x), 2));
                   2485: 
                   2486: #if BITS_BIG_ENDIAN
                   2487:              pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
                   2488: #endif
                   2489:              unsignedp = (code == ZERO_EXTRACT);
                   2490:            }
                   2491:          break;
                   2492:        }
                   2493: 
                   2494:       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
                   2495:        {
                   2496:          enum machine_mode mode = GET_MODE (SET_SRC (x));
                   2497: 
1.1.1.4   root     2498:          /* For unsigned, we have a choice of a shift followed by an
                   2499:             AND or two shifts.  Use two shifts for field sizes where the
                   2500:             constant might be too large.  We assume here that we can
                   2501:             always at least get 8-bit constants in an AND insn, which is
                   2502:             true for every current RISC.  */
                   2503: 
                   2504:          if (unsignedp && len <= 8)
1.1       root     2505:            {
                   2506:              SUBST (SET_SRC (x),
                   2507:                     gen_rtx_combine
                   2508:                     (AND, mode,
                   2509:                      gen_rtx_combine (LSHIFTRT, mode,
                   2510:                                       gen_lowpart_for_combine (mode, inner),
1.1.1.4   root     2511:                                       GEN_INT (pos)),
                   2512:                      GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
1.1       root     2513: 
1.1.1.4   root     2514:              split = find_split_point (&SET_SRC (x), insn);
1.1       root     2515:              if (split && split != &SET_SRC (x))
                   2516:                return split;
                   2517:            }
                   2518:          else
                   2519:            {
                   2520:              SUBST (SET_SRC (x),
                   2521:                     gen_rtx_combine
1.1.1.4   root     2522:                     (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
1.1       root     2523:                      gen_rtx_combine (ASHIFT, mode,
                   2524:                                       gen_lowpart_for_combine (mode, inner),
1.1.1.4   root     2525:                                       GEN_INT (GET_MODE_BITSIZE (mode)
                   2526:                                                - len - pos)),
                   2527:                      GEN_INT (GET_MODE_BITSIZE (mode) - len)));
1.1       root     2528: 
1.1.1.4   root     2529:              split = find_split_point (&SET_SRC (x), insn);
1.1       root     2530:              if (split && split != &SET_SRC (x))
                   2531:                return split;
                   2532:            }
                   2533:        }
                   2534: 
                   2535:       /* See if this is a simple operation with a constant as the second
                   2536:         operand.  It might be that this constant is out of range and hence
                   2537:         could be used as a split point.  */
                   2538:       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
                   2539:           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
                   2540:           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<')
                   2541:          && CONSTANT_P (XEXP (SET_SRC (x), 1))
                   2542:          && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o'
                   2543:              || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
                   2544:                  && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0))))
                   2545:                      == 'o'))))
                   2546:        return &XEXP (SET_SRC (x), 1);
                   2547: 
                   2548:       /* Finally, see if this is a simple operation with its first operand
                   2549:         not in a register.  The operation might require this operand in a
                   2550:         register, so return it as a split point.  We can always do this
                   2551:         because if the first operand were another operation, we would have
                   2552:         already found it as a split point.  */
                   2553:       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
                   2554:           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
                   2555:           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<'
                   2556:           || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1')
                   2557:          && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
                   2558:        return &XEXP (SET_SRC (x), 0);
                   2559: 
                   2560:       return 0;
                   2561: 
                   2562:     case AND:
                   2563:     case IOR:
                   2564:       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
                   2565:         it is better to write this as (not (ior A B)) so we can split it.
                   2566:         Similarly for IOR.  */
                   2567:       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
                   2568:        {
                   2569:          SUBST (*loc,
                   2570:                 gen_rtx_combine (NOT, GET_MODE (x),
                   2571:                                  gen_rtx_combine (code == IOR ? AND : IOR,
                   2572:                                                   GET_MODE (x),
                   2573:                                                   XEXP (XEXP (x, 0), 0),
                   2574:                                                   XEXP (XEXP (x, 1), 0))));
1.1.1.4   root     2575:          return find_split_point (loc, insn);
1.1       root     2576:        }
                   2577: 
                   2578:       /* Many RISC machines have a large set of logical insns.  If the
                   2579:         second operand is a NOT, put it first so we will try to split the
                   2580:         other operand first.  */
                   2581:       if (GET_CODE (XEXP (x, 1)) == NOT)
                   2582:        {
                   2583:          rtx tem = XEXP (x, 0);
                   2584:          SUBST (XEXP (x, 0), XEXP (x, 1));
                   2585:          SUBST (XEXP (x, 1), tem);
                   2586:        }
                   2587:       break;
                   2588:     }
                   2589: 
                   2590:   /* Otherwise, select our actions depending on our rtx class.  */
                   2591:   switch (GET_RTX_CLASS (code))
                   2592:     {
                   2593:     case 'b':                  /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
                   2594:     case '3':
1.1.1.4   root     2595:       split = find_split_point (&XEXP (x, 2), insn);
1.1       root     2596:       if (split)
                   2597:        return split;
                   2598:       /* ... fall through ... */
                   2599:     case '2':
                   2600:     case 'c':
                   2601:     case '<':
1.1.1.4   root     2602:       split = find_split_point (&XEXP (x, 1), insn);
1.1       root     2603:       if (split)
                   2604:        return split;
                   2605:       /* ... fall through ... */
                   2606:     case '1':
                   2607:       /* Some machines have (and (shift ...) ...) insns.  If X is not
                   2608:         an AND, but XEXP (X, 0) is, use it as our split point.  */
                   2609:       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
                   2610:        return &XEXP (x, 0);
                   2611: 
1.1.1.4   root     2612:       split = find_split_point (&XEXP (x, 0), insn);
1.1       root     2613:       if (split)
                   2614:        return split;
                   2615:       return loc;
                   2616:     }
                   2617: 
                   2618:   /* Otherwise, we don't have a split point.  */
                   2619:   return 0;
                   2620: }
                   2621: 
                   2622: /* Throughout X, replace FROM with TO, and return the result.
                   2623:    The result is TO if X is FROM;
                   2624:    otherwise the result is X, but its contents may have been modified.
                   2625:    If they were modified, a record was made in undobuf so that
                   2626:    undo_all will (among other things) return X to its original state.
                   2627: 
                   2628:    If the number of changes necessary is too much to record to undo,
                   2629:    the excess changes are not made, so the result is invalid.
                   2630:    The changes already made can still be undone.
                   2631:    undobuf.num_undo is incremented for such changes, so by testing that
                   2632:    the caller can tell whether the result is valid.
                   2633: 
                   2634:    `n_occurrences' is incremented each time FROM is replaced.
                   2635:    
                   2636:    IN_DEST is non-zero if we are processing the SET_DEST of a SET.
                   2637: 
1.1.1.2   root     2638:    UNIQUE_COPY is non-zero if each substitution must be unique.  We do this
1.1       root     2639:    by copying if `n_occurrences' is non-zero.  */
                   2640: 
                   2641: static rtx
                   2642: subst (x, from, to, in_dest, unique_copy)
                   2643:      register rtx x, from, to;
                   2644:      int in_dest;
                   2645:      int unique_copy;
                   2646: {
                   2647:   register char *fmt;
                   2648:   register int len, i;
                   2649:   register enum rtx_code code = GET_CODE (x), orig_code = code;
                   2650:   rtx temp;
                   2651:   enum machine_mode mode = GET_MODE (x);
                   2652:   enum machine_mode op0_mode = VOIDmode;
                   2653:   rtx other_insn;
                   2654:   rtx *cc_use;
                   2655:   int n_restarts = 0;
                   2656: 
                   2657: /* FAKE_EXTEND_SAFE_P (MODE, FROM) is 1 if (subreg:MODE FROM 0) is a safe
                   2658:    replacement for (zero_extend:MODE FROM) or (sign_extend:MODE FROM).
                   2659:    If it is 0, that cannot be done.  We can now do this for any MEM
                   2660:    because (SUBREG (MEM...)) is guaranteed to cause the MEM to be reloaded.
                   2661:    If not for that, MEM's would very rarely be safe.  */
                   2662: 
                   2663: /* Reject MODEs bigger than a word, because we might not be able
                   2664:    to reference a two-register group starting with an arbitrary register
                   2665:    (and currently gen_lowpart might crash for a SUBREG).  */
                   2666: 
                   2667: #define FAKE_EXTEND_SAFE_P(MODE, FROM) \
                   2668:   (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD)
                   2669: 
                   2670: /* Two expressions are equal if they are identical copies of a shared
                   2671:    RTX or if they are both registers with the same register number
                   2672:    and mode.  */
                   2673: 
                   2674: #define COMBINE_RTX_EQUAL_P(X,Y)                       \
                   2675:   ((X) == (Y)                                          \
                   2676:    || (GET_CODE (X) == REG && GET_CODE (Y) == REG      \
                   2677:        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
                   2678: 
                   2679:   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
                   2680:     {
                   2681:       n_occurrences++;
                   2682:       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
                   2683:     }
                   2684: 
                   2685:   /* If X and FROM are the same register but different modes, they will
                   2686:      not have been seen as equal above.  However, flow.c will make a 
                   2687:      LOG_LINKS entry for that case.  If we do nothing, we will try to
                   2688:      rerecognize our original insn and, when it succeeds, we will
                   2689:      delete the feeding insn, which is incorrect.
                   2690: 
                   2691:      So force this insn not to match in this (rare) case.  */
                   2692:   if (! in_dest && code == REG && GET_CODE (from) == REG
                   2693:       && REGNO (x) == REGNO (from))
                   2694:     return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
                   2695: 
                   2696:   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
                   2697:      of which may contain things that can be combined.  */
                   2698:   if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o')
                   2699:     return x;
                   2700: 
                   2701:   /* It is possible to have a subexpression appear twice in the insn.
                   2702:      Suppose that FROM is a register that appears within TO.
                   2703:      Then, after that subexpression has been scanned once by `subst',
                   2704:      the second time it is scanned, TO may be found.  If we were
                   2705:      to scan TO here, we would find FROM within it and create a
                   2706:      self-referent rtl structure which is completely wrong.  */
                   2707:   if (COMBINE_RTX_EQUAL_P (x, to))
                   2708:     return to;
                   2709: 
                   2710:   len = GET_RTX_LENGTH (code);
                   2711:   fmt = GET_RTX_FORMAT (code);
                   2712: 
                   2713:   /* We don't need to process a SET_DEST that is a register, CC0, or PC, so
                   2714:      set up to skip this common case.  All other cases where we want to
                   2715:      suppress replacing something inside a SET_SRC are handled via the
                   2716:      IN_DEST operand.  */
                   2717:   if (code == SET
                   2718:       && (GET_CODE (SET_DEST (x)) == REG
                   2719:         || GET_CODE (SET_DEST (x)) == CC0
                   2720:         || GET_CODE (SET_DEST (x)) == PC))
                   2721:     fmt = "ie";
                   2722: 
                   2723:   /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a constant. */
                   2724:   if (fmt[0] == 'e')
                   2725:     op0_mode = GET_MODE (XEXP (x, 0));
                   2726: 
                   2727:   for (i = 0; i < len; i++)
                   2728:     {
                   2729:       if (fmt[i] == 'E')
                   2730:        {
                   2731:          register int j;
                   2732:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   2733:            {
                   2734:              register rtx new;
                   2735:              if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
                   2736:                {
                   2737:                  new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
                   2738:                  n_occurrences++;
                   2739:                }
                   2740:              else
                   2741:                {
                   2742:                  new = subst (XVECEXP (x, i, j), from, to, 0, unique_copy);
                   2743: 
                   2744:                  /* If this substitution failed, this whole thing fails.  */
                   2745:                  if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
                   2746:                    return new;
                   2747:                }
                   2748: 
                   2749:              SUBST (XVECEXP (x, i, j), new);
                   2750:            }
                   2751:        }
                   2752:       else if (fmt[i] == 'e')
                   2753:        {
                   2754:          register rtx new;
                   2755: 
                   2756:          if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
                   2757:            {
                   2758:              new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
                   2759:              n_occurrences++;
                   2760:            }
                   2761:          else
                   2762:            /* If we are in a SET_DEST, suppress most cases unless we
                   2763:               have gone inside a MEM, in which case we want to
                   2764:               simplify the address.  We assume here that things that
                   2765:               are actually part of the destination have their inner
                   2766:               parts in the first expression.  This is true for SUBREG, 
                   2767:               STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
                   2768:               things aside from REG and MEM that should appear in a
                   2769:               SET_DEST.  */
                   2770:            new = subst (XEXP (x, i), from, to,
                   2771:                         (((in_dest
                   2772:                            && (code == SUBREG || code == STRICT_LOW_PART
                   2773:                                || code == ZERO_EXTRACT))
                   2774:                           || code == SET)
                   2775:                          && i == 0), unique_copy);
                   2776: 
                   2777:          /* If we found that we will have to reject this combination,
                   2778:             indicate that by returning the CLOBBER ourselves, rather than
                   2779:             an expression containing it.  This will speed things up as
                   2780:             well as prevent accidents where two CLOBBERs are considered
                   2781:             to be equal, thus producing an incorrect simplification.  */
                   2782: 
                   2783:          if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
                   2784:            return new;
                   2785: 
                   2786:          SUBST (XEXP (x, i), new);
                   2787:        }
                   2788:     }
                   2789: 
1.1.1.4   root     2790:   /* We come back to here if we have replaced the expression with one of
                   2791:      a different code and it is likely that further simplification will be
                   2792:      possible.  */
                   2793: 
                   2794:  restart:
                   2795: 
                   2796:   /* If we have restarted more than 4 times, we are probably looping, so
                   2797:      give up.  */
                   2798:   if (++n_restarts > 4)
                   2799:     return x;
                   2800: 
                   2801:   /* If we are restarting at all, it means that we no longer know the
                   2802:      original mode of operand 0 (since we have probably changed the
                   2803:      form of X).  */
                   2804: 
                   2805:   if (n_restarts > 1)
                   2806:     op0_mode = VOIDmode;
                   2807: 
                   2808:   code = GET_CODE (x);
                   2809: 
1.1       root     2810:   /* If this is a commutative operation, put a constant last and a complex
                   2811:      expression first.  We don't need to do this for comparisons here.  */
                   2812:   if (GET_RTX_CLASS (code) == 'c'
                   2813:       && ((CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT)
                   2814:          || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'o'
                   2815:              && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')
                   2816:          || (GET_CODE (XEXP (x, 0)) == SUBREG
                   2817:              && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o'
                   2818:              && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')))
                   2819:     {
                   2820:       temp = XEXP (x, 0);
                   2821:       SUBST (XEXP (x, 0), XEXP (x, 1));
                   2822:       SUBST (XEXP (x, 1), temp);
                   2823:     }
                   2824: 
1.1.1.4   root     2825:   /* If this is a PLUS, MINUS, or MULT, and the first operand is the
                   2826:      sign extension of a PLUS with a constant, reverse the order of the sign
                   2827:      extension and the addition. Note that this not the same as the original
                   2828:      code, but overflow is undefined for signed values.  Also note that the
                   2829:      PLUS will have been partially moved "inside" the sign-extension, so that
                   2830:      the first operand of X will really look like:
                   2831:          (ashiftrt (plus (ashift A C4) C5) C4).
                   2832:      We convert this to
                   2833:          (plus (ashiftrt (ashift A C4) C2) C4)
                   2834:      and replace the first operand of X with that expression.  Later parts
                   2835:      of this function may simplify the expression further.
                   2836: 
                   2837:      For example, if we start with (mult (sign_extend (plus A C1)) C2),
                   2838:      we swap the SIGN_EXTEND and PLUS.  Later code will apply the
                   2839:      distributive law to produce (plus (mult (sign_extend X) C1) C3).
                   2840: 
                   2841:      We do this to simplify address expressions.  */
                   2842: 
                   2843:   if ((code == PLUS || code == MINUS || code == MULT)
                   2844:       && GET_CODE (XEXP (x, 0)) == ASHIFTRT
                   2845:       && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
                   2846:       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
                   2847:       && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
                   2848:       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   2849:       && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
                   2850:       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
                   2851:       && (temp = simplify_binary_operation (ASHIFTRT, mode,
                   2852:                                            XEXP (XEXP (XEXP (x, 0), 0), 1),
                   2853:                                            XEXP (XEXP (x, 0), 1))) != 0)
                   2854:     {
                   2855:       rtx new
                   2856:        = simplify_shift_const (NULL_RTX, ASHIFT, mode,
                   2857:                                XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
                   2858:                                INTVAL (XEXP (XEXP (x, 0), 1)));
                   2859: 
                   2860:       new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
                   2861:                                  INTVAL (XEXP (XEXP (x, 0), 1)));
                   2862: 
                   2863:       SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
                   2864:     }
                   2865: 
                   2866:   /* If this is a simple operation applied to an IF_THEN_ELSE, try 
                   2867:      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
                   2868:      things.  Don't deal with operations that change modes here.  */
                   2869: 
                   2870:   if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c')
                   2871:       && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE)
                   2872:     {
                   2873:       /* Don't do this by using SUBST inside X since we might be messing
                   2874:         up a shared expression.  */
                   2875:       rtx cond = XEXP (XEXP (x, 0), 0);
                   2876:       rtx t_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1),
                   2877:                                     XEXP (x, 1)),
                   2878:                         pc_rtx, pc_rtx, 0, 0);
                   2879:       rtx f_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2),
                   2880:                                     XEXP (x, 1)),
                   2881:                         pc_rtx, pc_rtx, 0, 0);
                   2882: 
                   2883: 
                   2884:       x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
                   2885:       goto restart;
                   2886:     }
                   2887: 
                   2888:   else if (GET_RTX_CLASS (code) == '1'
                   2889:           && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE
                   2890:           && GET_MODE (XEXP (x, 0)) == mode)
                   2891:     {
                   2892:       rtx cond = XEXP (XEXP (x, 0), 0);
                   2893:       rtx t_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)),
                   2894:                         pc_rtx, pc_rtx, 0, 0);
                   2895:       rtx f_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)),
                   2896:                         pc_rtx, pc_rtx, 0, 0);
                   2897: 
                   2898:       x = gen_rtx_combine (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
                   2899:       goto restart;
                   2900:     }
                   2901: 
1.1       root     2902:   /* Try to fold this expression in case we have constants that weren't
                   2903:      present before.  */
                   2904:   temp = 0;
                   2905:   switch (GET_RTX_CLASS (code))
                   2906:     {
                   2907:     case '1':
                   2908:       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
                   2909:       break;
                   2910:     case '<':
                   2911:       temp = simplify_relational_operation (code, op0_mode,
                   2912:                                            XEXP (x, 0), XEXP (x, 1));
1.1.1.4   root     2913: #ifdef FLOAT_STORE_FLAG_VALUE
                   2914:       if (temp != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
                   2915:        temp = ((temp == const0_rtx) ? CONST0_RTX (GET_MODE (x))
                   2916:                : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x)));
                   2917: #endif
1.1       root     2918:       break;
                   2919:     case 'c':
                   2920:     case '2':
                   2921:       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
                   2922:       break;
                   2923:     case 'b':
                   2924:     case '3':
                   2925:       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
                   2926:                                         XEXP (x, 1), XEXP (x, 2));
                   2927:       break;
                   2928:     }
                   2929: 
                   2930:   if (temp)
1.1.1.4   root     2931:     x = temp, code = GET_CODE (temp);
1.1       root     2932: 
                   2933:   /* First see if we can apply the inverse distributive law.  */
                   2934:   if (code == PLUS || code == MINUS || code == IOR || code == XOR)
                   2935:     {
                   2936:       x = apply_distributive_law (x);
                   2937:       code = GET_CODE (x);
                   2938:     }
                   2939: 
                   2940:   /* If CODE is an associative operation not otherwise handled, see if we
                   2941:      can associate some operands.  This can win if they are constants or
                   2942:      if they are logically related (i.e. (a & b) & a.  */
                   2943:   if ((code == PLUS || code == MINUS
                   2944:        || code == MULT || code == AND || code == IOR || code == XOR
                   2945:        || code == DIV || code == UDIV
                   2946:        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
                   2947:       && GET_MODE_CLASS (mode) == MODE_INT)
                   2948:     {
                   2949:       if (GET_CODE (XEXP (x, 0)) == code)
                   2950:        {
                   2951:          rtx other = XEXP (XEXP (x, 0), 0);
                   2952:          rtx inner_op0 = XEXP (XEXP (x, 0), 1);
                   2953:          rtx inner_op1 = XEXP (x, 1);
                   2954:          rtx inner;
                   2955:          
                   2956:          /* Make sure we pass the constant operand if any as the second
                   2957:             one if this is a commutative operation.  */
                   2958:          if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
                   2959:            {
                   2960:              rtx tem = inner_op0;
                   2961:              inner_op0 = inner_op1;
                   2962:              inner_op1 = tem;
                   2963:            }
                   2964:          inner = simplify_binary_operation (code == MINUS ? PLUS
                   2965:                                             : code == DIV ? MULT
                   2966:                                             : code == UDIV ? MULT
                   2967:                                             : code,
                   2968:                                             mode, inner_op0, inner_op1);
                   2969: 
                   2970:          /* For commutative operations, try the other pair if that one
                   2971:             didn't simplify.  */
                   2972:          if (inner == 0 && GET_RTX_CLASS (code) == 'c')
                   2973:            {
                   2974:              other = XEXP (XEXP (x, 0), 1);
                   2975:              inner = simplify_binary_operation (code, mode,
                   2976:                                                 XEXP (XEXP (x, 0), 0),
                   2977:                                                 XEXP (x, 1));
                   2978:            }
                   2979: 
                   2980:          if (inner)
                   2981:            {
                   2982:              x = gen_binary (code, mode, other, inner);
                   2983:              goto restart;
                   2984:            
                   2985:            }
                   2986:        }
                   2987:     }
                   2988: 
                   2989:   /* A little bit of algebraic simplification here.  */
                   2990:   switch (code)
                   2991:     {
                   2992:     case MEM:
                   2993:       /* Ensure that our address has any ASHIFTs converted to MULT in case
                   2994:         address-recognizing predicates are called later.  */
                   2995:       temp = make_compound_operation (XEXP (x, 0), MEM);
                   2996:       SUBST (XEXP (x, 0), temp);
                   2997:       break;
                   2998: 
                   2999:     case SUBREG:
                   3000:       /* (subreg:A (mem:B X) N) becomes a modified MEM unless the SUBREG
                   3001:         is paradoxical.  If we can't do that safely, then it becomes
                   3002:         something nonsensical so that this combination won't take place.  */
                   3003: 
                   3004:       if (GET_CODE (SUBREG_REG (x)) == MEM
                   3005:          && (GET_MODE_SIZE (mode)
                   3006:              <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
                   3007:        {
                   3008:          rtx inner = SUBREG_REG (x);
                   3009:          int endian_offset = 0;
                   3010:          /* Don't change the mode of the MEM
                   3011:             if that would change the meaning of the address.  */
                   3012:          if (MEM_VOLATILE_P (SUBREG_REG (x))
                   3013:              || mode_dependent_address_p (XEXP (inner, 0)))
                   3014:            return gen_rtx (CLOBBER, mode, const0_rtx);
                   3015: 
                   3016: #if BYTES_BIG_ENDIAN
                   3017:          if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
                   3018:            endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (mode);
                   3019:          if (GET_MODE_SIZE (GET_MODE (inner)) < UNITS_PER_WORD)
                   3020:            endian_offset -= UNITS_PER_WORD - GET_MODE_SIZE (GET_MODE (inner));
                   3021: #endif
                   3022:          /* Note if the plus_constant doesn't make a valid address
                   3023:             then this combination won't be accepted.  */
                   3024:          x = gen_rtx (MEM, mode,
                   3025:                       plus_constant (XEXP (inner, 0),
                   3026:                                      (SUBREG_WORD (x) * UNITS_PER_WORD
                   3027:                                       + endian_offset)));
                   3028:          MEM_VOLATILE_P (x) = MEM_VOLATILE_P (inner);
                   3029:          RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (inner);
                   3030:          MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (inner);
                   3031:          return x;
                   3032:        }
                   3033: 
                   3034:       /* If we are in a SET_DEST, these other cases can't apply.  */
                   3035:       if (in_dest)
                   3036:        return x;
                   3037: 
                   3038:       /* Changing mode twice with SUBREG => just change it once,
                   3039:         or not at all if changing back to starting mode.  */
                   3040:       if (GET_CODE (SUBREG_REG (x)) == SUBREG)
                   3041:        {
                   3042:          if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x)))
                   3043:              && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0)
                   3044:            return SUBREG_REG (SUBREG_REG (x));
                   3045: 
                   3046:          SUBST_INT (SUBREG_WORD (x),
                   3047:                     SUBREG_WORD (x) + SUBREG_WORD (SUBREG_REG (x)));
                   3048:          SUBST (SUBREG_REG (x), SUBREG_REG (SUBREG_REG (x)));
                   3049:        }
                   3050: 
                   3051:       /* SUBREG of a hard register => just change the register number
                   3052:         and/or mode.  If the hard register is not valid in that mode,
1.1.1.4   root     3053:         suppress this combination.  If the hard register is the stack,
                   3054:         frame, or argument pointer, leave this as a SUBREG.  */
1.1       root     3055: 
                   3056:       if (GET_CODE (SUBREG_REG (x)) == REG
1.1.1.4   root     3057:          && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
                   3058:          && REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM
                   3059: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
                   3060:          && REGNO (SUBREG_REG (x)) != ARG_POINTER_REGNUM
                   3061: #endif
                   3062:          && REGNO (SUBREG_REG (x)) != STACK_POINTER_REGNUM)
1.1       root     3063:        {
                   3064:          if (HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (x)) + SUBREG_WORD (x),
                   3065:                                  mode))
                   3066:            return gen_rtx (REG, mode,
                   3067:                            REGNO (SUBREG_REG (x)) + SUBREG_WORD (x));
                   3068:          else
                   3069:            return gen_rtx (CLOBBER, mode, const0_rtx);
                   3070:        }
                   3071: 
                   3072:       /* For a constant, try to pick up the part we want.  Handle a full
1.1.1.3   root     3073:         word and low-order part.  Only do this if we are narrowing
                   3074:         the constant; if it is being widened, we have no idea what
                   3075:         the extra bits will have been set to.  */
1.1       root     3076: 
                   3077:       if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode
                   3078:          && GET_MODE_SIZE (mode) == UNITS_PER_WORD
1.1.1.3   root     3079:          && GET_MODE_SIZE (op0_mode) < UNITS_PER_WORD
1.1       root     3080:          && GET_MODE_CLASS (mode) == MODE_INT)
                   3081:        {
                   3082:          temp = operand_subword (SUBREG_REG (x), SUBREG_WORD (x),
1.1.1.4   root     3083:                                  0, op0_mode);
1.1       root     3084:          if (temp)
                   3085:            return temp;
                   3086:        }
                   3087:        
1.1.1.5 ! root     3088:       /* If we want a subreg of a constant, at offset 0,
        !          3089:         take the low bits.  On a little-endian machine, that's
        !          3090:         always valid.  On a big-endian machine, it's valid
        !          3091:         only if the constant's mode fits in one word.  */
1.1.1.3   root     3092:       if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x)
1.1.1.5 ! root     3093:          && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode)
        !          3094: #if WORDS_BIG_ENDIAN
        !          3095:          && GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD
        !          3096: #endif
        !          3097:          )
1.1       root     3098:        return gen_lowpart_for_combine (mode, SUBREG_REG (x));
                   3099: 
                   3100:       /* If we are narrowing the object, we need to see if we can simplify
                   3101:         the expression for the object knowing that we only need the
1.1.1.4   root     3102:         low-order bits.  */
                   3103: 
1.1       root     3104:       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
1.1.1.4   root     3105:          && subreg_lowpart_p (x))
                   3106:        return force_to_mode (SUBREG_REG (x), mode, GET_MODE_BITSIZE (mode),
                   3107:                              NULL_RTX);
1.1       root     3108:       break;
                   3109: 
                   3110:     case NOT:
                   3111:       /* (not (plus X -1)) can become (neg X).  */
                   3112:       if (GET_CODE (XEXP (x, 0)) == PLUS
                   3113:          && XEXP (XEXP (x, 0), 1) == constm1_rtx)
                   3114:        {
                   3115:          x = gen_rtx_combine (NEG, mode, XEXP (XEXP (x, 0), 0));
                   3116:          goto restart;
                   3117:        }
                   3118: 
                   3119:       /* Similarly, (not (neg X)) is (plus X -1).  */
                   3120:       if (GET_CODE (XEXP (x, 0)) == NEG)
                   3121:        {
                   3122:          x = gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
                   3123:          goto restart;
                   3124:        }
                   3125: 
1.1.1.4   root     3126:       /* (not (xor X C)) for C constant is (xor X D) with D = ~ C.  */
                   3127:       if (GET_CODE (XEXP (x, 0)) == XOR
                   3128:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   3129:          && (temp = simplify_unary_operation (NOT, mode,
                   3130:                                               XEXP (XEXP (x, 0), 1),
                   3131:                                               mode)) != 0)
                   3132:        {
                   3133:          SUBST (XEXP (XEXP (x, 0), 1), temp);
                   3134:          return XEXP (x, 0);
                   3135:        }
                   3136:              
1.1       root     3137:       /* (not (ashift 1 X)) is (rotate ~1 X).  We used to do this for operands
                   3138:         other than 1, but that is not valid.  We could do a similar
                   3139:         simplification for (not (lshiftrt C X)) where C is just the sign bit,
                   3140:         but this doesn't seem common enough to bother with.  */
                   3141:       if (GET_CODE (XEXP (x, 0)) == ASHIFT
                   3142:          && XEXP (XEXP (x, 0), 0) == const1_rtx)
                   3143:        {
                   3144:          x = gen_rtx (ROTATE, mode, gen_unary (NOT, mode, const1_rtx),
                   3145:                       XEXP (XEXP (x, 0), 1));
                   3146:          goto restart;
                   3147:        }
                   3148:                                            
                   3149:       if (GET_CODE (XEXP (x, 0)) == SUBREG
                   3150:          && subreg_lowpart_p (XEXP (x, 0))
                   3151:          && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
                   3152:              < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
                   3153:          && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
                   3154:          && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
                   3155:        {
                   3156:          enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
                   3157: 
                   3158:          x = gen_rtx (ROTATE, inner_mode,
                   3159:                       gen_unary (NOT, inner_mode, const1_rtx),
                   3160:                       XEXP (SUBREG_REG (XEXP (x, 0)), 1));
                   3161:          x = gen_lowpart_for_combine (mode, x);
                   3162:          goto restart;
                   3163:        }
                   3164:                                            
                   3165: #if STORE_FLAG_VALUE == -1
                   3166:       /* (not (comparison foo bar)) can be done by reversing the comparison
                   3167:         code if valid.  */
                   3168:       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   3169:          && reversible_comparison_p (XEXP (x, 0)))
                   3170:        return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
                   3171:                                mode, XEXP (XEXP (x, 0), 0),
                   3172:                                XEXP (XEXP (x, 0), 1));
1.1.1.5 ! root     3173: 
        !          3174:       /* (ashiftrt foo C) where C is the number of bits in FOO minus 1
        !          3175:         is (lt foo (const_int 0)), so we can perform the above
        !          3176:         simplification.  */
        !          3177: 
        !          3178:       if (XEXP (x, 1) == const1_rtx
        !          3179:          && GET_CODE (XEXP (x, 0)) == ASHIFTRT
        !          3180:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
        !          3181:          && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1)
        !          3182:        return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx);
1.1       root     3183: #endif
                   3184: 
                   3185:       /* Apply De Morgan's laws to reduce number of patterns for machines
                   3186:         with negating logical insns (and-not, nand, etc.).  If result has
                   3187:         only one NOT, put it first, since that is how the patterns are
                   3188:         coded.  */
                   3189: 
                   3190:       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
                   3191:        {
                   3192:         rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
                   3193: 
                   3194:         if (GET_CODE (in1) == NOT)
                   3195:           in1 = XEXP (in1, 0);
                   3196:         else
                   3197:           in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1);
                   3198: 
                   3199:         if (GET_CODE (in2) == NOT)
                   3200:           in2 = XEXP (in2, 0);
                   3201:         else if (GET_CODE (in2) == CONST_INT
1.1.1.4   root     3202:                  && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
                   3203:           in2 = GEN_INT (GET_MODE_MASK (mode) & ~ INTVAL (in2));
1.1       root     3204:         else
                   3205:           in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2);
                   3206: 
                   3207:         if (GET_CODE (in2) == NOT)
                   3208:           {
                   3209:             rtx tem = in2;
                   3210:             in2 = in1; in1 = tem;
                   3211:           }
                   3212: 
                   3213:         x = gen_rtx_combine (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
                   3214:                              mode, in1, in2);
                   3215:         goto restart;
                   3216:        } 
                   3217:       break;
                   3218: 
                   3219:     case NEG:
                   3220:       /* (neg (plus X 1)) can become (not X).  */
                   3221:       if (GET_CODE (XEXP (x, 0)) == PLUS
                   3222:          && XEXP (XEXP (x, 0), 1) == const1_rtx)
                   3223:        {
                   3224:          x = gen_rtx_combine (NOT, mode, XEXP (XEXP (x, 0), 0));
                   3225:          goto restart;
                   3226:        }
                   3227: 
                   3228:       /* Similarly, (neg (not X)) is (plus X 1).  */
                   3229:       if (GET_CODE (XEXP (x, 0)) == NOT)
                   3230:        {
                   3231:          x = gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), const1_rtx);
                   3232:          goto restart;
                   3233:        }
                   3234: 
                   3235:       /* (neg (minus X Y)) can become (minus Y X).  */
                   3236:       if (GET_CODE (XEXP (x, 0)) == MINUS
                   3237:          && (GET_MODE_CLASS (mode) != MODE_FLOAT
                   3238:              /* x-y != -(y-x) with IEEE floating point. */
                   3239:              || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT))
                   3240:        {
                   3241:          x = gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1),
                   3242:                          XEXP (XEXP (x, 0), 0));
                   3243:          goto restart;
                   3244:        }
                   3245: 
1.1.1.4   root     3246:       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
                   3247:       if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
1.1.1.5 ! root     3248:          && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
1.1.1.4   root     3249:        {
                   3250:          x = gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
                   3251:          goto restart;
                   3252:        }
                   3253: 
1.1       root     3254:       /* NEG commutes with ASHIFT since it is multiplication.  Only do this
                   3255:         if we can then eliminate the NEG (e.g.,
                   3256:         if the operand is a constant).  */
                   3257: 
                   3258:       if (GET_CODE (XEXP (x, 0)) == ASHIFT)
                   3259:        {
                   3260:          temp = simplify_unary_operation (NEG, mode,
                   3261:                                           XEXP (XEXP (x, 0), 0), mode);
                   3262:          if (temp)
                   3263:            {
                   3264:              SUBST (XEXP (XEXP (x, 0), 0), temp);
                   3265:              return XEXP (x, 0);
                   3266:            }
                   3267:        }
                   3268: 
                   3269:       temp = expand_compound_operation (XEXP (x, 0));
                   3270: 
                   3271:       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
                   3272:         replaced by (lshiftrt X C).  This will convert
                   3273:         (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
                   3274: 
                   3275:       if (GET_CODE (temp) == ASHIFTRT
                   3276:          && GET_CODE (XEXP (temp, 1)) == CONST_INT
                   3277:          && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
                   3278:        {
                   3279:          x = simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
                   3280:                                    INTVAL (XEXP (temp, 1)));
                   3281:          goto restart;
                   3282:        }
                   3283: 
1.1.1.5 ! root     3284:       /* If X has only a single bit that might be nonzero, say, bit I, convert
1.1       root     3285:         (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
                   3286:         MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
                   3287:         (sign_extract X 1 Y).  But only do this if TEMP isn't a register
                   3288:         or a SUBREG of one since we'd be making the expression more
                   3289:         complex if it was just a register.  */
                   3290: 
                   3291:       if (GET_CODE (temp) != REG
                   3292:          && ! (GET_CODE (temp) == SUBREG
                   3293:                && GET_CODE (SUBREG_REG (temp)) == REG)
1.1.1.5 ! root     3294:          && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
1.1       root     3295:        {
                   3296:          rtx temp1 = simplify_shift_const
1.1.1.4   root     3297:            (NULL_RTX, ASHIFTRT, mode,
                   3298:             simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
1.1       root     3299:                                   GET_MODE_BITSIZE (mode) - 1 - i),
                   3300:             GET_MODE_BITSIZE (mode) - 1 - i);
                   3301: 
                   3302:          /* If all we did was surround TEMP with the two shifts, we
                   3303:             haven't improved anything, so don't use it.  Otherwise,
                   3304:             we are better off with TEMP1.  */
                   3305:          if (GET_CODE (temp1) != ASHIFTRT
                   3306:              || GET_CODE (XEXP (temp1, 0)) != ASHIFT
                   3307:              || XEXP (XEXP (temp1, 0), 0) != temp)
                   3308:            {
                   3309:              x = temp1;
                   3310:              goto restart;
                   3311:            }
                   3312:        }
                   3313:       break;
                   3314: 
                   3315:     case FLOAT_TRUNCATE:
                   3316:       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
                   3317:       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
                   3318:          && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
                   3319:        return XEXP (XEXP (x, 0), 0);
                   3320:       break;  
                   3321: 
                   3322: #ifdef HAVE_cc0
                   3323:     case COMPARE:
                   3324:       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
                   3325:         using cc0, in which case we want to leave it as a COMPARE
                   3326:         so we can distinguish it from a register-register-copy.  */
                   3327:       if (XEXP (x, 1) == const0_rtx)
                   3328:        return XEXP (x, 0);
                   3329: 
                   3330:       /* In IEEE floating point, x-0 is not the same as x.  */
                   3331:       if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
                   3332:           || GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_INT)
                   3333:          && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
                   3334:        return XEXP (x, 0);
                   3335:       break;
                   3336: #endif
                   3337: 
                   3338:     case CONST:
                   3339:       /* (const (const X)) can become (const X).  Do it this way rather than
                   3340:         returning the inner CONST since CONST can be shared with a
                   3341:         REG_EQUAL note.  */
                   3342:       if (GET_CODE (XEXP (x, 0)) == CONST)
                   3343:        SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
                   3344:       break;
                   3345: 
                   3346: #ifdef HAVE_lo_sum
                   3347:     case LO_SUM:
                   3348:       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
                   3349:         can add in an offset.  find_split_point will split this address up
                   3350:         again if it doesn't match.  */
                   3351:       if (GET_CODE (XEXP (x, 0)) == HIGH
                   3352:          && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
                   3353:        return XEXP (x, 1);
                   3354:       break;
                   3355: #endif
                   3356: 
                   3357:     case PLUS:
                   3358:       /* If we have (plus (plus (A const) B)), associate it so that CONST is
                   3359:         outermost.  That's because that's the way indexed addresses are
                   3360:         supposed to appear.  This code used to check many more cases, but
                   3361:         they are now checked elsewhere.  */
                   3362:       if (GET_CODE (XEXP (x, 0)) == PLUS
                   3363:          && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
                   3364:        return gen_binary (PLUS, mode,
                   3365:                           gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
                   3366:                                       XEXP (x, 1)),
                   3367:                           XEXP (XEXP (x, 0), 1));
                   3368: 
                   3369:       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
                   3370:         when c is (const_int (pow2 + 1) / 2) is a sign extension of a
                   3371:         bit-field and can be replaced by either a sign_extend or a
                   3372:         sign_extract.  The `and' may be a zero_extend.  */
                   3373:       if (GET_CODE (XEXP (x, 0)) == XOR
                   3374:          && GET_CODE (XEXP (x, 1)) == CONST_INT
                   3375:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   3376:          && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1))
                   3377:          && (i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
1.1.1.4   root     3378:          && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1.1       root     3379:          && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
                   3380:               && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
                   3381:               && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
1.1.1.4   root     3382:                   == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
1.1       root     3383:              || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
                   3384:                  && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
                   3385:                      == i + 1))))
                   3386:        {
                   3387:          x = simplify_shift_const
1.1.1.4   root     3388:            (NULL_RTX, ASHIFTRT, mode,
                   3389:             simplify_shift_const (NULL_RTX, ASHIFT, mode,
1.1       root     3390:                                   XEXP (XEXP (XEXP (x, 0), 0), 0),
                   3391:                                   GET_MODE_BITSIZE (mode) - (i + 1)),
                   3392:             GET_MODE_BITSIZE (mode) - (i + 1));
                   3393:          goto restart;
                   3394:        }
                   3395: 
1.1.1.5 ! root     3396:       /* If only the low-order bit of X is possible nonzero, (plus x -1)
1.1       root     3397:         can become (ashiftrt (ashift (xor x 1) C) C) where C is
                   3398:         the bitsize of the mode - 1.  This allows simplification of
                   3399:         "a = (b & 8) == 0;"  */
                   3400:       if (XEXP (x, 1) == constm1_rtx
                   3401:          && GET_CODE (XEXP (x, 0)) != REG
                   3402:          && ! (GET_CODE (XEXP (x,0)) == SUBREG
                   3403:                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
1.1.1.5 ! root     3404:          && nonzero_bits (XEXP (x, 0), mode) == 1)
1.1       root     3405:        {
                   3406:          x = simplify_shift_const
1.1.1.4   root     3407:            (NULL_RTX, ASHIFTRT, mode,
                   3408:             simplify_shift_const (NULL_RTX, ASHIFT, mode,
1.1       root     3409:                                   gen_rtx_combine (XOR, mode,
                   3410:                                                    XEXP (x, 0), const1_rtx),
                   3411:                                   GET_MODE_BITSIZE (mode) - 1),
                   3412:             GET_MODE_BITSIZE (mode) - 1);
                   3413:          goto restart;
                   3414:        }
1.1.1.4   root     3415: 
                   3416:       /* If we are adding two things that have no bits in common, convert
                   3417:         the addition into an IOR.  This will often be further simplified,
                   3418:         for example in cases like ((a & 1) + (a & 2)), which can
                   3419:         become a & 3.  */
                   3420: 
                   3421:       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     3422:          && (nonzero_bits (XEXP (x, 0), mode)
        !          3423:              & nonzero_bits (XEXP (x, 1), mode)) == 0)
1.1.1.4   root     3424:        {
                   3425:          x = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
                   3426:          goto restart;
                   3427:        }
1.1       root     3428:       break;
                   3429: 
                   3430:     case MINUS:
                   3431:       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
                   3432:         (and <foo> (const_int pow2-1))  */
                   3433:       if (GET_CODE (XEXP (x, 1)) == AND
                   3434:          && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
                   3435:          && exact_log2 (- INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
                   3436:          && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
                   3437:        {
1.1.1.4   root     3438:          x = simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
1.1       root     3439:                                      - INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
                   3440:          goto restart;
                   3441:        }
                   3442:       break;
                   3443: 
                   3444:     case MULT:
                   3445:       /* If we have (mult (plus A B) C), apply the distributive law and then
                   3446:         the inverse distributive law to see if things simplify.  This
                   3447:         occurs mostly in addresses, often when unrolling loops.  */
                   3448: 
                   3449:       if (GET_CODE (XEXP (x, 0)) == PLUS)
                   3450:        {
                   3451:          x = apply_distributive_law
                   3452:            (gen_binary (PLUS, mode,
                   3453:                         gen_binary (MULT, mode,
                   3454:                                     XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
                   3455:                         gen_binary (MULT, mode,
                   3456:                                     XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
                   3457: 
                   3458:          if (GET_CODE (x) != MULT)
                   3459:            goto restart;
                   3460:        }
                   3461: 
                   3462:       /* If this is multiplication by a power of two and its first operand is
                   3463:         a shift, treat the multiply as a shift to allow the shifts to
                   3464:         possibly combine.  */
                   3465:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   3466:          && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
                   3467:          && (GET_CODE (XEXP (x, 0)) == ASHIFT
                   3468:              || GET_CODE (XEXP (x, 0)) == LSHIFTRT
                   3469:              || GET_CODE (XEXP (x, 0)) == ASHIFTRT
                   3470:              || GET_CODE (XEXP (x, 0)) == ROTATE
                   3471:              || GET_CODE (XEXP (x, 0)) == ROTATERT))
                   3472:        {
1.1.1.4   root     3473:          x = simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0), i);
1.1       root     3474:          goto restart;
                   3475:        }
                   3476: 
                   3477:       /* Convert (mult (ashift (const_int 1) A) B) to (ashift B A).  */
                   3478:       if (GET_CODE (XEXP (x, 0)) == ASHIFT
                   3479:          && XEXP (XEXP (x, 0), 0) == const1_rtx)
                   3480:        return gen_rtx_combine (ASHIFT, mode, XEXP (x, 1),
                   3481:                                XEXP (XEXP (x, 0), 1));
                   3482:       break;
                   3483: 
                   3484:     case UDIV:
                   3485:       /* If this is a divide by a power of two, treat it as a shift if
                   3486:         its first operand is a shift.  */
                   3487:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   3488:          && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
                   3489:          && (GET_CODE (XEXP (x, 0)) == ASHIFT
                   3490:              || GET_CODE (XEXP (x, 0)) == LSHIFTRT
                   3491:              || GET_CODE (XEXP (x, 0)) == ASHIFTRT
                   3492:              || GET_CODE (XEXP (x, 0)) == ROTATE
                   3493:              || GET_CODE (XEXP (x, 0)) == ROTATERT))
                   3494:        {
1.1.1.4   root     3495:          x = simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
1.1       root     3496:          goto restart;
                   3497:        }
                   3498:       break;
                   3499: 
                   3500:     case EQ:  case NE:
                   3501:     case GT:  case GTU:  case GE:  case GEU:
                   3502:     case LT:  case LTU:  case LE:  case LEU:
                   3503:       /* If the first operand is a condition code, we can't do anything
                   3504:         with it.  */
                   3505:       if (GET_CODE (XEXP (x, 0)) == COMPARE
                   3506:          || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
                   3507: #ifdef HAVE_cc0
                   3508:              && XEXP (x, 0) != cc0_rtx
                   3509: #endif
                   3510:               ))
                   3511:        {
                   3512:          rtx op0 = XEXP (x, 0);
                   3513:          rtx op1 = XEXP (x, 1);
                   3514:          enum rtx_code new_code;
                   3515: 
                   3516:          if (GET_CODE (op0) == COMPARE)
                   3517:            op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
                   3518: 
                   3519:          /* Simplify our comparison, if possible.  */
                   3520:          new_code = simplify_comparison (code, &op0, &op1);
                   3521: 
                   3522: #if STORE_FLAG_VALUE == 1
                   3523:          /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
1.1.1.5 ! root     3524:             if only the low-order bit is possibly nonzero in X (such as when
1.1       root     3525:             X is a ZERO_EXTRACT of one bit.  Similarly, we can convert
1.1.1.5 ! root     3526:             EQ to (xor X 1).  Remove any ZERO_EXTRACT we made when thinking
        !          3527:             this was a comparison.  It may now be simpler to use, e.g., an
        !          3528:             AND.  If a ZERO_EXTRACT is indeed appropriate, it will
        !          3529:             be placed back by the call to make_compound_operation in the
        !          3530:             SET case.  */
1.1.1.3   root     3531:          if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
1.1       root     3532:              && op1 == const0_rtx
1.1.1.5 ! root     3533:              && nonzero_bits (op0, GET_MODE (op0)) == 1)
        !          3534:            return gen_lowpart_for_combine (mode,
        !          3535:                                            expand_compound_operation (op0));
1.1.1.3   root     3536:          else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
1.1       root     3537:                   && op1 == const0_rtx
1.1.1.5 ! root     3538:                   && nonzero_bits (op0, GET_MODE (op0)) == 1)
        !          3539:            {
        !          3540:              op0 = expand_compound_operation (op0);
        !          3541: 
        !          3542:              x = gen_rtx_combine (XOR, mode,
        !          3543:                                   gen_lowpart_for_combine (mode, op0),
        !          3544:                                   const1_rtx);
        !          3545:              goto restart;
        !          3546:            }
1.1       root     3547: #endif
                   3548: 
                   3549: #if STORE_FLAG_VALUE == -1
                   3550:          /* If STORE_FLAG_VALUE is -1, we can convert (ne x 0)
1.1.1.5 ! root     3551:             to (neg x) if only the low-order bit of X can be nonzero.
1.1       root     3552:             This converts (ne (zero_extract X 1 Y) 0) to
                   3553:             (sign_extract X 1 Y).  */
1.1.1.3   root     3554:          if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
1.1       root     3555:              && op1 == const0_rtx
1.1.1.5 ! root     3556:              && nonzero_bits (op0, GET_MODE (op0)) == 1)
1.1       root     3557:            {
1.1.1.5 ! root     3558:              op0 = expand_compound_operation (op0);
1.1       root     3559:              x = gen_rtx_combine (NEG, mode,
                   3560:                                   gen_lowpart_for_combine (mode, op0));
                   3561:              goto restart;
                   3562:            }
                   3563: #endif
                   3564: 
                   3565:          /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
1.1.1.5 ! root     3566:             one bit that might be nonzero, we can convert (ne x 0) to
        !          3567:             (ashift x c) where C puts the bit in the sign bit.  Remove any
        !          3568:             AND with STORE_FLAG_VALUE when we are done, since we are only
        !          3569:             going to test the sign bit.  */
1.1.1.3   root     3570:          if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
1.1.1.4   root     3571:              && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
                   3572:              && (STORE_FLAG_VALUE
                   3573:                  == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
1.1       root     3574:              && op1 == const0_rtx
                   3575:              && mode == GET_MODE (op0)
1.1.1.5 ! root     3576:              && (i = exact_log2 (nonzero_bits (op0, GET_MODE (op0)))) >= 0)
1.1       root     3577:            {
1.1.1.5 ! root     3578:              x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
        !          3579:                                        expand_compound_operation (op0),
1.1       root     3580:                                        GET_MODE_BITSIZE (mode) - 1 - i);
                   3581:              if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
                   3582:                return XEXP (x, 0);
                   3583:              else
                   3584:                return x;
                   3585:            }
                   3586: 
                   3587:          /* If the code changed, return a whole new comparison.  */
                   3588:          if (new_code != code)
                   3589:            return gen_rtx_combine (new_code, mode, op0, op1);
                   3590: 
                   3591:          /* Otherwise, keep this operation, but maybe change its operands.  
                   3592:             This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
                   3593:          SUBST (XEXP (x, 0), op0);
                   3594:          SUBST (XEXP (x, 1), op1);
                   3595:        }
                   3596:       break;
                   3597:          
                   3598:     case IF_THEN_ELSE:
1.1.1.4   root     3599:       /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register
                   3600:         used in it is being compared against certain values.  Get the
                   3601:         true and false comparisons and see if that says anything about the
                   3602:         value of each arm.  */
                   3603: 
                   3604:       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   3605:          && reversible_comparison_p (XEXP (x, 0))
                   3606:          && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG)
                   3607:        {
1.1.1.5 ! root     3608:          HOST_WIDE_INT nzb;
1.1.1.4   root     3609:          rtx from = XEXP (XEXP (x, 0), 0);
                   3610:          enum rtx_code true_code = GET_CODE (XEXP (x, 0));
                   3611:          enum rtx_code false_code = reverse_condition (true_code);
                   3612:          rtx true_val = XEXP (XEXP (x, 0), 1);
                   3613:          rtx false_val = true_val;
                   3614:          rtx true_arm = XEXP (x, 1);
                   3615:          rtx false_arm = XEXP (x, 2);
                   3616:          int swapped = 0;
                   3617: 
                   3618:          /* If FALSE_CODE is EQ, swap the codes and arms.  */
                   3619: 
                   3620:          if (false_code == EQ)
                   3621:            {
                   3622:              swapped = 1, true_code = EQ, false_code = NE;
                   3623:              true_arm = XEXP (x, 2), false_arm = XEXP (x, 1);
                   3624:            }
                   3625: 
                   3626:          /* If we are comparing against zero and the expression being tested
1.1.1.5 ! root     3627:             has only a single bit that might be nonzero, that is its value
        !          3628:             when it is not equal to zero.  Similarly if it is known to be
        !          3629:             -1 or 0.  */
1.1.1.4   root     3630: 
                   3631:          if (true_code == EQ && true_val == const0_rtx
1.1.1.5 ! root     3632:              && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
        !          3633:            false_code = EQ, false_val = GEN_INT (nzb);
1.1.1.4   root     3634:          else if (true_code == EQ && true_val == const0_rtx
                   3635:                   && (num_sign_bit_copies (from, GET_MODE (from))
                   3636:                       == GET_MODE_BITSIZE (GET_MODE (from))))
                   3637:            false_code = EQ, false_val = constm1_rtx;
                   3638: 
                   3639:          /* Now simplify an arm if we know the value of the register
                   3640:             in the branch and it is used in the arm.  Be carefull due to
                   3641:             the potential of locally-shared RTL.  */
                   3642: 
                   3643:          if (reg_mentioned_p (from, true_arm))
                   3644:            true_arm = subst (known_cond (copy_rtx (true_arm), true_code,
                   3645:                                          from, true_val),
                   3646:                              pc_rtx, pc_rtx, 0, 0);
                   3647:          if (reg_mentioned_p (from, false_arm))
                   3648:            false_arm = subst (known_cond (copy_rtx (false_arm), false_code,
                   3649:                                           from, false_val),
                   3650:                               pc_rtx, pc_rtx, 0, 0);
                   3651: 
                   3652:          SUBST (XEXP (x, 1), swapped ? false_arm : true_arm);
                   3653:          SUBST (XEXP (x, 2), swapped ? true_arm : false_arm);
                   3654:        }
                   3655:       
1.1       root     3656:       /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
                   3657:         reversed, do so to avoid needing two sets of patterns for
1.1.1.4   root     3658:         subtract-and-branch insns.  Similarly if we have a constant in that
                   3659:         position or if the third operand is the same as the first operand
                   3660:         of the comparison.  */
                   3661: 
                   3662:       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   3663:          && reversible_comparison_p (XEXP (x, 0))
                   3664:          && (XEXP (x, 1) == pc_rtx || GET_CODE (XEXP (x, 1)) == CONST_INT
                   3665:              || rtx_equal_p (XEXP (x, 2), XEXP (XEXP (x, 0), 0))))
1.1       root     3666:        {
                   3667:          SUBST (XEXP (x, 0),
1.1.1.4   root     3668:                 gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))),
                   3669:                             GET_MODE (XEXP (x, 0)),
                   3670:                             XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 0), 1)));
                   3671: 
                   3672:          temp = XEXP (x, 1);
1.1       root     3673:          SUBST (XEXP (x, 1), XEXP (x, 2));
1.1.1.4   root     3674:          SUBST (XEXP (x, 2), temp);
                   3675:        }
                   3676: 
                   3677:       /* If the two arms are identical, we don't need the comparison.  */
                   3678: 
                   3679:       if (rtx_equal_p (XEXP (x, 1), XEXP (x, 2))
                   3680:          && ! side_effects_p (XEXP (x, 0)))
                   3681:        return XEXP (x, 1);
                   3682: 
                   3683:       /* Look for cases where we have (abs x) or (neg (abs X)).  */
                   3684: 
                   3685:       if (GET_MODE_CLASS (mode) == MODE_INT
                   3686:          && GET_CODE (XEXP (x, 2)) == NEG
                   3687:          && rtx_equal_p (XEXP (x, 1), XEXP (XEXP (x, 2), 0))
                   3688:          && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   3689:          && rtx_equal_p (XEXP (x, 1), XEXP (XEXP (x, 0), 0))
                   3690:          && ! side_effects_p (XEXP (x, 1)))
                   3691:        switch (GET_CODE (XEXP (x, 0)))
                   3692:          {
                   3693:          case GT:
                   3694:          case GE:
                   3695:            x = gen_unary (ABS, mode, XEXP (x, 1));
                   3696:            goto restart;
                   3697:          case LT:
                   3698:          case LE:
                   3699:            x = gen_unary (NEG, mode, gen_unary (ABS, mode, XEXP (x, 1)));
                   3700:            goto restart;
                   3701:          }
                   3702: 
                   3703:       /* Look for MIN or MAX.  */
                   3704: 
                   3705:       if (GET_MODE_CLASS (mode) == MODE_INT
                   3706:          && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   3707:          && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
                   3708:          && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 2))
                   3709:          && ! side_effects_p (XEXP (x, 0)))
                   3710:        switch (GET_CODE (XEXP (x, 0)))
                   3711:          {
                   3712:          case GE:
                   3713:          case GT:
                   3714:            x = gen_binary (SMAX, mode, XEXP (x, 1), XEXP (x, 2));
                   3715:            goto restart;
                   3716:          case LE:
                   3717:          case LT:
                   3718:            x = gen_binary (SMIN, mode, XEXP (x, 1), XEXP (x, 2));
                   3719:            goto restart;
                   3720:          case GEU:
                   3721:          case GTU:
                   3722:            x = gen_binary (UMAX, mode, XEXP (x, 1), XEXP (x, 2));
                   3723:            goto restart;
                   3724:          case LEU:
                   3725:          case LTU:
                   3726:            x = gen_binary (UMIN, mode, XEXP (x, 1), XEXP (x, 2));
                   3727:            goto restart;
                   3728:          }
                   3729: 
                   3730:       /* If we have something like (if_then_else (ne A 0) (OP X C) X),
                   3731:         A is known to be either 0 or 1, and OP is an identity when its
                   3732:         second operand is zero, this can be done as (OP X (mult A C)).
                   3733:         Similarly if A is known to be 0 or -1 and also similarly if we have
                   3734:         a ZERO_EXTEND or SIGN_EXTEND as long as X is already extended (so
                   3735:         we don't destroy it).  */
                   3736: 
                   3737:       if (mode != VOIDmode
                   3738:          && (GET_CODE (XEXP (x, 0)) == EQ || GET_CODE (XEXP (x, 0)) == NE)
                   3739:          && XEXP (XEXP (x, 0), 1) == const0_rtx
1.1.1.5 ! root     3740:          && (nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1
1.1.1.4   root     3741:              || (num_sign_bit_copies (XEXP (XEXP (x, 0), 0), mode)
                   3742:                  == GET_MODE_BITSIZE (mode))))
                   3743:        {
                   3744:          rtx nz = make_compound_operation (GET_CODE (XEXP (x, 0)) == NE
                   3745:                                            ? XEXP (x, 1) : XEXP (x, 2));
                   3746:          rtx z = GET_CODE (XEXP (x, 0)) == NE ? XEXP (x, 2) : XEXP (x, 1);
1.1.1.5 ! root     3747:          rtx dir = (nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1
1.1.1.4   root     3748:                     ? const1_rtx : constm1_rtx);
                   3749:          rtx c = 0;
                   3750:          enum machine_mode m = mode;
                   3751:          enum rtx_code op, extend_op = 0;
                   3752: 
                   3753:          if ((GET_CODE (nz) == PLUS || GET_CODE (nz) == MINUS
                   3754:               || GET_CODE (nz) == IOR || GET_CODE (nz) == XOR
                   3755:               || GET_CODE (nz) == ASHIFT
                   3756:               || GET_CODE (nz) == LSHIFTRT || GET_CODE (nz) == ASHIFTRT)
                   3757:              && rtx_equal_p (XEXP (nz, 0), z))
                   3758:            c = XEXP (nz, 1), op = GET_CODE (nz);
                   3759:          else if (GET_CODE (nz) == SIGN_EXTEND
                   3760:                   && (GET_CODE (XEXP (nz, 0)) == PLUS
                   3761:                       || GET_CODE (XEXP (nz, 0)) == MINUS
                   3762:                       || GET_CODE (XEXP (nz, 0)) == IOR
                   3763:                       || GET_CODE (XEXP (nz, 0)) == XOR
                   3764:                       || GET_CODE (XEXP (nz, 0)) == ASHIFT
                   3765:                       || GET_CODE (XEXP (nz, 0)) == LSHIFTRT
                   3766:                       || GET_CODE (XEXP (nz, 0)) == ASHIFTRT)
                   3767:                   && GET_CODE (XEXP (XEXP (nz, 0), 0)) == SUBREG
                   3768:                   && subreg_lowpart_p (XEXP (XEXP (nz, 0), 0))
                   3769:                   && rtx_equal_p (SUBREG_REG (XEXP (XEXP (nz, 0), 0)), z)
                   3770:                   && (num_sign_bit_copies (z, GET_MODE (z))
                   3771:                       >= (GET_MODE_BITSIZE (mode)
                   3772:                           - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (nz, 0), 0))))))
                   3773:            {
                   3774:              c = XEXP (XEXP (nz, 0), 1);
                   3775:              op = GET_CODE (XEXP (nz, 0));
                   3776:              extend_op = SIGN_EXTEND;
                   3777:              m = GET_MODE (XEXP (nz, 0));
                   3778:            }
                   3779:          else if (GET_CODE (nz) == ZERO_EXTEND
                   3780:                   && (GET_CODE (XEXP (nz, 0)) == PLUS
                   3781:                       || GET_CODE (XEXP (nz, 0)) == MINUS
                   3782:                       || GET_CODE (XEXP (nz, 0)) == IOR
                   3783:                       || GET_CODE (XEXP (nz, 0)) == XOR
                   3784:                       || GET_CODE (XEXP (nz, 0)) == ASHIFT
                   3785:                       || GET_CODE (XEXP (nz, 0)) == LSHIFTRT
                   3786:                       || GET_CODE (XEXP (nz, 0)) == ASHIFTRT)
                   3787:                   && GET_CODE (XEXP (XEXP (nz, 0), 0)) == SUBREG
                   3788:                   && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
                   3789:                   && subreg_lowpart_p (XEXP (XEXP (nz, 0), 0))
                   3790:                   && rtx_equal_p (SUBREG_REG (XEXP (XEXP (nz, 0), 0)), z)
1.1.1.5 ! root     3791:                   && ((nonzero_bits (z, GET_MODE (z))
1.1.1.4   root     3792:                        & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (nz, 0), 0))))
                   3793:                       == 0))
                   3794:            {
                   3795:              c = XEXP (XEXP (nz, 0), 1);
                   3796:              op = GET_CODE (XEXP (nz, 0));
                   3797:              extend_op = ZERO_EXTEND;
                   3798:              m = GET_MODE (XEXP (nz, 0));
                   3799:            }
                   3800: 
                   3801:          if (c && ! side_effects_p (c) && ! side_effects_p (z))
                   3802:            {
                   3803:              temp
                   3804:                = gen_binary (MULT, m,
                   3805:                              gen_lowpart_for_combine (m,
                   3806:                                                       XEXP (XEXP (x, 0), 0)),
                   3807:                              gen_binary (MULT, m, c, dir));
                   3808: 
                   3809:              temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp);
                   3810: 
                   3811:              if (extend_op != 0)
                   3812:                temp = gen_unary (extend_op, mode, temp);
                   3813: 
                   3814:              return temp;
                   3815:            }
1.1       root     3816:        }
                   3817:       break;
                   3818:          
                   3819:     case ZERO_EXTRACT:
                   3820:     case SIGN_EXTRACT:
                   3821:     case ZERO_EXTEND:
                   3822:     case SIGN_EXTEND:
                   3823:       /* If we are processing SET_DEST, we are done. */
                   3824:       if (in_dest)
                   3825:        return x;
                   3826: 
                   3827:       x = expand_compound_operation (x);
                   3828:       if (GET_CODE (x) != code)
                   3829:        goto restart;
                   3830:       break;
                   3831: 
                   3832:     case SET:
                   3833:       /* (set (pc) (return)) gets written as (return).  */
                   3834:       if (GET_CODE (SET_DEST (x)) == PC && GET_CODE (SET_SRC (x)) == RETURN)
                   3835:        return SET_SRC (x);
                   3836: 
                   3837:       /* Convert this into a field assignment operation, if possible.  */
                   3838:       x = make_field_assignment (x);
                   3839: 
                   3840:       /* If we are setting CC0 or if the source is a COMPARE, look for the
                   3841:         use of the comparison result and try to simplify it unless we already
                   3842:         have used undobuf.other_insn.  */
                   3843:       if ((GET_CODE (SET_SRC (x)) == COMPARE
                   3844: #ifdef HAVE_cc0
                   3845:           || SET_DEST (x) == cc0_rtx
                   3846: #endif
                   3847:           )
                   3848:          && (cc_use = find_single_use (SET_DEST (x), subst_insn,
                   3849:                                        &other_insn)) != 0
                   3850:          && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
                   3851:          && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
                   3852:          && XEXP (*cc_use, 0) == SET_DEST (x))
                   3853:        {
                   3854:          enum rtx_code old_code = GET_CODE (*cc_use);
                   3855:          enum rtx_code new_code;
                   3856:          rtx op0, op1;
                   3857:          int other_changed = 0;
                   3858:          enum machine_mode compare_mode = GET_MODE (SET_DEST (x));
                   3859: 
                   3860:          if (GET_CODE (SET_SRC (x)) == COMPARE)
                   3861:            op0 = XEXP (SET_SRC (x), 0), op1 = XEXP (SET_SRC (x), 1);
                   3862:          else
                   3863:            op0 = SET_SRC (x), op1 = const0_rtx;
                   3864: 
                   3865:          /* Simplify our comparison, if possible.  */
                   3866:          new_code = simplify_comparison (old_code, &op0, &op1);
                   3867: 
1.1.1.5 ! root     3868: #ifdef EXTRA_CC_MODES
1.1       root     3869:          /* If this machine has CC modes other than CCmode, check to see
                   3870:             if we need to use a different CC mode here.  */
1.1.1.4   root     3871:          compare_mode = SELECT_CC_MODE (new_code, op0, op1);
1.1.1.5 ! root     3872: #endif /* EXTRA_CC_MODES */
1.1       root     3873: 
1.1.1.5 ! root     3874: #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES)
1.1       root     3875:          /* If the mode changed, we have to change SET_DEST, the mode
                   3876:             in the compare, and the mode in the place SET_DEST is used.
                   3877:             If SET_DEST is a hard register, just build new versions with
                   3878:             the proper mode.  If it is a pseudo, we lose unless it is only
                   3879:             time we set the pseudo, in which case we can safely change
                   3880:             its mode.  */
                   3881:          if (compare_mode != GET_MODE (SET_DEST (x)))
                   3882:            {
                   3883:              int regno = REGNO (SET_DEST (x));
                   3884:              rtx new_dest = gen_rtx (REG, compare_mode, regno);
                   3885: 
                   3886:              if (regno < FIRST_PSEUDO_REGISTER
                   3887:                  || (reg_n_sets[regno] == 1
                   3888:                      && ! REG_USERVAR_P (SET_DEST (x))))
                   3889:                {
                   3890:                  if (regno >= FIRST_PSEUDO_REGISTER)
                   3891:                    SUBST (regno_reg_rtx[regno], new_dest);
                   3892: 
                   3893:                  SUBST (SET_DEST (x), new_dest);
                   3894:                  SUBST (XEXP (*cc_use, 0), new_dest);
                   3895:                  other_changed = 1;
                   3896:                }
                   3897:            }
                   3898: #endif
                   3899: 
                   3900:          /* If the code changed, we have to build a new comparison
                   3901:             in undobuf.other_insn.  */
                   3902:          if (new_code != old_code)
                   3903:            {
1.1.1.5 ! root     3904:              unsigned HOST_WIDE_INT mask;
1.1       root     3905: 
                   3906:              SUBST (*cc_use, gen_rtx_combine (new_code, GET_MODE (*cc_use),
                   3907:                                               SET_DEST (x), const0_rtx));
                   3908: 
                   3909:              /* If the only change we made was to change an EQ into an
1.1.1.5 ! root     3910:                 NE or vice versa, OP0 has only one bit that might be nonzero,
1.1       root     3911:                 and OP1 is zero, check if changing the user of the condition
                   3912:                 code will produce a valid insn.  If it won't, we can keep
                   3913:                 the original code in that insn by surrounding our operation
                   3914:                 with an XOR.  */
                   3915: 
                   3916:              if (((old_code == NE && new_code == EQ)
                   3917:                   || (old_code == EQ && new_code == NE))
                   3918:                  && ! other_changed && op1 == const0_rtx
1.1.1.4   root     3919:                  && (GET_MODE_BITSIZE (GET_MODE (op0))
                   3920:                      <= HOST_BITS_PER_WIDE_INT)
1.1.1.5 ! root     3921:                  && (exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0)))
1.1       root     3922:                      >= 0))
                   3923:                {
                   3924:                  rtx pat = PATTERN (other_insn), note = 0;
                   3925: 
1.1.1.5 ! root     3926:                  if ((recog_for_combine (&pat, other_insn, &note) < 0
1.1       root     3927:                       && ! check_asm_operands (pat)))
                   3928:                    {
                   3929:                      PUT_CODE (*cc_use, old_code);
                   3930:                      other_insn = 0;
                   3931: 
                   3932:                      op0 = gen_binary (XOR, GET_MODE (op0), op0,
1.1.1.4   root     3933:                                        GEN_INT (mask));
1.1       root     3934:                    }
                   3935:                }
                   3936: 
                   3937:              other_changed = 1;
                   3938:            }
                   3939: 
                   3940:          if (other_changed)
                   3941:            undobuf.other_insn = other_insn;
                   3942: 
                   3943: #ifdef HAVE_cc0
                   3944:          /* If we are now comparing against zero, change our source if
                   3945:             needed.  If we do not use cc0, we always have a COMPARE.  */
                   3946:          if (op1 == const0_rtx && SET_DEST (x) == cc0_rtx)
                   3947:            SUBST (SET_SRC (x), op0);
                   3948:          else
                   3949: #endif
                   3950: 
                   3951:          /* Otherwise, if we didn't previously have a COMPARE in the
                   3952:             correct mode, we need one.  */
                   3953:          if (GET_CODE (SET_SRC (x)) != COMPARE
                   3954:              || GET_MODE (SET_SRC (x)) != compare_mode)
                   3955:            SUBST (SET_SRC (x), gen_rtx_combine (COMPARE, compare_mode,
                   3956:                                                 op0, op1));
                   3957:          else
                   3958:            {
                   3959:              /* Otherwise, update the COMPARE if needed.  */
                   3960:              SUBST (XEXP (SET_SRC (x), 0), op0);
                   3961:              SUBST (XEXP (SET_SRC (x), 1), op1);
                   3962:            }
                   3963:        }
                   3964:       else
                   3965:        {
                   3966:          /* Get SET_SRC in a form where we have placed back any
                   3967:             compound expressions.  Then do the checks below.  */
                   3968:          temp = make_compound_operation (SET_SRC (x), SET);
                   3969:          SUBST (SET_SRC (x), temp);
                   3970:        }
                   3971: 
1.1.1.4   root     3972:       /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some
                   3973:         operation, and X being a REG or (subreg (reg)), we may be able to
                   3974:         convert this to (set (subreg:m2 x) (op)).
                   3975: 
                   3976:         We can always do this if M1 is narrower than M2 because that
                   3977:         means that we only care about the low bits of the result.
                   3978: 
1.1.1.5 ! root     3979:         However, on most machines (those with neither BYTE_LOADS_ZERO_EXTEND
        !          3980:         nor BYTES_LOADS_SIGN_EXTEND defined), we cannot perform a
1.1.1.4   root     3981:         narrower operation that requested since the high-order bits will
                   3982:         be undefined.  On machine where BYTE_LOADS_*_EXTEND is defined,
                   3983:         however, this transformation is safe as long as M1 and M2 have
                   3984:         the same number of words.  */
                   3985:  
                   3986:       if (GET_CODE (SET_SRC (x)) == SUBREG
                   3987:          && subreg_lowpart_p (SET_SRC (x))
                   3988:          && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) != 'o'
                   3989:          && (((GET_MODE_SIZE (GET_MODE (SET_SRC (x))) + (UNITS_PER_WORD - 1))
                   3990:               / UNITS_PER_WORD)
                   3991:              == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x))))
                   3992:                   + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
1.1.1.5 ! root     3993: #ifndef BYTE_LOADS_EXTEND
1.1.1.4   root     3994:          && (GET_MODE_SIZE (GET_MODE (SET_SRC (x)))
                   3995:              < GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x)))))
                   3996: #endif
                   3997:          && (GET_CODE (SET_DEST (x)) == REG
                   3998:              || (GET_CODE (SET_DEST (x)) == SUBREG
                   3999:                  && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG)))
                   4000:        {
                   4001:          SUBST (SET_DEST (x),
                   4002:                 gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_SRC (x))),
                   4003:                                          SET_DEST (x)));
                   4004:          SUBST (SET_SRC (x), SUBREG_REG (SET_SRC (x)));
                   4005:        }
                   4006: 
1.1.1.5 ! root     4007: #ifdef BYTE_LOADS_EXTEND
1.1       root     4008:       /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with
                   4009:         M wider than N, this would require a paradoxical subreg.
                   4010:         Replace the subreg with a zero_extend to avoid the reload that
                   4011:         would otherwise be required. */
1.1.1.5 ! root     4012: 
1.1       root     4013:       if (GET_CODE (SET_SRC (x)) == SUBREG
                   4014:          && subreg_lowpart_p (SET_SRC (x))
                   4015:          && SUBREG_WORD (SET_SRC (x)) == 0
                   4016:          && (GET_MODE_SIZE (GET_MODE (SET_SRC (x)))
                   4017:              > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x)))))
                   4018:          && GET_CODE (SUBREG_REG (SET_SRC (x))) == MEM)
1.1.1.5 ! root     4019:        SUBST (SET_SRC (x), gen_rtx_combine (LOAD_EXTEND,
1.1       root     4020:                                             GET_MODE (SET_SRC (x)),
                   4021:                                             XEXP (SET_SRC (x), 0)));
                   4022: #endif
                   4023: 
1.1.1.4   root     4024: #ifndef HAVE_conditional_move
                   4025: 
                   4026:       /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE,
                   4027:         and we are comparing an item known to be 0 or -1 against 0, use a
                   4028:         logical operation instead. Check for one of the arms being an IOR
                   4029:         of the other arm with some value.  We compute three terms to be
                   4030:         IOR'ed together.  In practice, at most two will be nonzero.  Then
                   4031:         we do the IOR's.  */
                   4032: 
                   4033:       if (GET_CODE (SET_DEST (x)) != PC
                   4034:          && GET_CODE (SET_SRC (x)) == IF_THEN_ELSE
                   4035:          && (GET_CODE (XEXP (SET_SRC (x), 0)) == EQ
                   4036:              || GET_CODE (XEXP (SET_SRC (x), 0)) == NE)
                   4037:          && XEXP (XEXP (SET_SRC (x), 0), 1) == const0_rtx
                   4038:          && (num_sign_bit_copies (XEXP (XEXP (SET_SRC (x), 0), 0),
                   4039:                                   GET_MODE (XEXP (XEXP (SET_SRC (x), 0), 0)))
                   4040:              == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (SET_SRC (x), 0), 0))))
                   4041:          && ! side_effects_p (SET_SRC (x)))
                   4042:        {
                   4043:          rtx true = (GET_CODE (XEXP (SET_SRC (x), 0)) == NE
                   4044:                      ? XEXP (SET_SRC (x), 1) : XEXP (SET_SRC (x), 2));
                   4045:          rtx false = (GET_CODE (XEXP (SET_SRC (x), 0)) == NE
                   4046:                       ? XEXP (SET_SRC (x), 2) : XEXP (SET_SRC (x), 1));
                   4047:          rtx term1 = const0_rtx, term2, term3;
                   4048: 
                   4049:          if (GET_CODE (true) == IOR && rtx_equal_p (XEXP (true, 0), false))
                   4050:            term1 = false, true = XEXP (true, 1), false = const0_rtx;
                   4051:          else if (GET_CODE (true) == IOR
                   4052:                   && rtx_equal_p (XEXP (true, 1), false))
                   4053:            term1 = false, true = XEXP (true, 0), false = const0_rtx;
                   4054:          else if (GET_CODE (false) == IOR
                   4055:                   && rtx_equal_p (XEXP (false, 0), true))
                   4056:            term1 = true, false = XEXP (false, 1), true = const0_rtx;
                   4057:          else if (GET_CODE (false) == IOR
                   4058:                   && rtx_equal_p (XEXP (false, 1), true))
                   4059:            term1 = true, false = XEXP (false, 0), true = const0_rtx;
                   4060: 
                   4061:          term2 = gen_binary (AND, GET_MODE (SET_SRC (x)),
                   4062:                              XEXP (XEXP (SET_SRC (x), 0), 0), true);
                   4063:          term3 = gen_binary (AND, GET_MODE (SET_SRC (x)),
                   4064:                              gen_unary (NOT, GET_MODE (SET_SRC (x)),
                   4065:                                         XEXP (XEXP (SET_SRC (x), 0), 0)),
                   4066:                              false);
                   4067: 
                   4068:          SUBST (SET_SRC (x),
                   4069:                 gen_binary (IOR, GET_MODE (SET_SRC (x)),
                   4070:                             gen_binary (IOR, GET_MODE (SET_SRC (x)),
                   4071:                                         term1, term2),
                   4072:                             term3));
                   4073:        }
                   4074: #endif
1.1       root     4075:       break;
                   4076: 
                   4077:     case AND:
                   4078:       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
                   4079:        {
                   4080:          x = simplify_and_const_int (x, mode, XEXP (x, 0),
                   4081:                                      INTVAL (XEXP (x, 1)));
                   4082: 
                   4083:          /* If we have (ior (and (X C1) C2)) and the next restart would be
                   4084:             the last, simplify this by making C1 as small as possible
                   4085:             and then exit. */
                   4086:          if (n_restarts >= 3 && GET_CODE (x) == IOR
                   4087:              && GET_CODE (XEXP (x, 0)) == AND
                   4088:              && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   4089:              && GET_CODE (XEXP (x, 1)) == CONST_INT)
                   4090:            {
                   4091:              temp = gen_binary (AND, mode, XEXP (XEXP (x, 0), 0),
1.1.1.4   root     4092:                                 GEN_INT (INTVAL (XEXP (XEXP (x, 0), 1))
                   4093:                                          & ~ INTVAL (XEXP (x, 1))));
1.1       root     4094:              return gen_binary (IOR, mode, temp, XEXP (x, 1));
                   4095:            }
                   4096: 
                   4097:          if (GET_CODE (x) != AND)
                   4098:            goto restart;
                   4099:        }
                   4100: 
                   4101:       /* Convert (A | B) & A to A.  */
                   4102:       if (GET_CODE (XEXP (x, 0)) == IOR
                   4103:          && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
                   4104:              || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)))
                   4105:          && ! side_effects_p (XEXP (XEXP (x, 0), 0))
                   4106:          && ! side_effects_p (XEXP (XEXP (x, 0), 1)))
                   4107:        return XEXP (x, 1);
                   4108: 
                   4109:       /* Convert (A ^ B) & A to A & (~ B) since the latter is often a single
                   4110:         insn (and may simplify more).  */
                   4111:       else if (GET_CODE (XEXP (x, 0)) == XOR
                   4112:          && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
                   4113:          && ! side_effects_p (XEXP (x, 1)))
                   4114:        {
                   4115:          x = gen_binary (AND, mode,
                   4116:                          gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)),
                   4117:                          XEXP (x, 1));
                   4118:          goto restart;
                   4119:        }
                   4120:       else if (GET_CODE (XEXP (x, 0)) == XOR
                   4121:               && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))
                   4122:               && ! side_effects_p (XEXP (x, 1)))
                   4123:        {
                   4124:          x = gen_binary (AND, mode,
                   4125:                          gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)),
                   4126:                          XEXP (x, 1));
                   4127:          goto restart;
                   4128:        }
                   4129: 
                   4130:       /* Similarly for (~ (A ^ B)) & A.  */
                   4131:       else if (GET_CODE (XEXP (x, 0)) == NOT
                   4132:               && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR
                   4133:               && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 0), XEXP (x, 1))
                   4134:               && ! side_effects_p (XEXP (x, 1)))
                   4135:        {
                   4136:          x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 1),
                   4137:                          XEXP (x, 1));
                   4138:          goto restart;
                   4139:        }
                   4140:       else if (GET_CODE (XEXP (x, 0)) == NOT
                   4141:               && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR
                   4142:               && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 1), XEXP (x, 1))
                   4143:               && ! side_effects_p (XEXP (x, 1)))
                   4144:        {
                   4145:          x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 0),
                   4146:                          XEXP (x, 1));
                   4147:          goto restart;
                   4148:        }
                   4149: 
1.1.1.4   root     4150:       /* If we have (and A B) with A not an object but that is known to
                   4151:         be -1 or 0, this is equivalent to the expression
                   4152:         (if_then_else (ne A (const_int 0)) B (const_int 0))
                   4153:         We make this conversion because it may allow further
                   4154:         simplifications and then allow use of conditional move insns.
                   4155:         If the machine doesn't have condition moves, code in case SET
                   4156:         will convert the IF_THEN_ELSE back to the logical operation.
                   4157:         We build the IF_THEN_ELSE here in case further simplification
                   4158:         is possible (e.g., we can convert it to ABS).  */
                   4159: 
                   4160:       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
                   4161:          && ! (GET_CODE (XEXP (x, 0)) == SUBREG
                   4162:                && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o')
                   4163:          && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
                   4164:              == GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
                   4165:        {
                   4166:          rtx op0 = XEXP (x, 0);
                   4167:          rtx op1 = const0_rtx;
                   4168:          enum rtx_code comp_code
                   4169:            = simplify_comparison (NE, &op0, &op1);
                   4170: 
                   4171:          x =  gen_rtx_combine (IF_THEN_ELSE, mode,
                   4172:                                gen_binary (comp_code, VOIDmode, op0, op1),
                   4173:                                XEXP (x, 1), const0_rtx);
                   4174:          goto restart;
                   4175:        }
                   4176: 
                   4177:       /* In the following group of tests (and those in case IOR below),
1.1       root     4178:         we start with some combination of logical operations and apply
                   4179:         the distributive law followed by the inverse distributive law.
                   4180:         Most of the time, this results in no change.  However, if some of
                   4181:         the operands are the same or inverses of each other, simplifications
                   4182:         will result.
                   4183: 
                   4184:         For example, (and (ior A B) (not B)) can occur as the result of
                   4185:         expanding a bit field assignment.  When we apply the distributive
                   4186:         law to this, we get (ior (and (A (not B))) (and (B (not B)))),
                   4187:         which then simplifies to (and (A (not B))).  */
                   4188: 
                   4189:       /* If we have (and (ior A B) C), apply the distributive law and then
                   4190:         the inverse distributive law to see if things simplify.  */
                   4191: 
                   4192:       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == XOR)
                   4193:        {
                   4194:          x = apply_distributive_law
                   4195:            (gen_binary (GET_CODE (XEXP (x, 0)), mode,
                   4196:                         gen_binary (AND, mode,
                   4197:                                     XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
                   4198:                         gen_binary (AND, mode,
                   4199:                                     XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
                   4200:          if (GET_CODE (x) != AND)
                   4201:            goto restart;
                   4202:        }
                   4203: 
                   4204:       if (GET_CODE (XEXP (x, 1)) == IOR || GET_CODE (XEXP (x, 1)) == XOR)
                   4205:        {
                   4206:          x = apply_distributive_law
                   4207:            (gen_binary (GET_CODE (XEXP (x, 1)), mode,
                   4208:                         gen_binary (AND, mode,
                   4209:                                     XEXP (XEXP (x, 1), 0), XEXP (x, 0)),
                   4210:                         gen_binary (AND, mode,
                   4211:                                     XEXP (XEXP (x, 1), 1), XEXP (x, 0))));
                   4212:          if (GET_CODE (x) != AND)
                   4213:            goto restart;
                   4214:        }
                   4215: 
                   4216:       /* Similarly, taking advantage of the fact that
                   4217:         (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
                   4218: 
                   4219:       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == XOR)
                   4220:        {
                   4221:          x = apply_distributive_law
                   4222:            (gen_binary (XOR, mode,
                   4223:                         gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0),
                   4224:                                     XEXP (XEXP (x, 1), 0)),
                   4225:                         gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0),
                   4226:                                     XEXP (XEXP (x, 1), 1))));
                   4227:          if (GET_CODE (x) != AND)
                   4228:            goto restart;
                   4229:        }
                   4230:                                                            
                   4231:       else if (GET_CODE (XEXP (x, 1)) == NOT && GET_CODE (XEXP (x, 0)) == XOR)
                   4232:        {
                   4233:          x = apply_distributive_law
                   4234:            (gen_binary (XOR, mode,
                   4235:                         gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0),
                   4236:                                     XEXP (XEXP (x, 0), 0)),
                   4237:                         gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0),
                   4238:                                     XEXP (XEXP (x, 0), 1))));
                   4239:          if (GET_CODE (x) != AND)
                   4240:            goto restart;
                   4241:        }
                   4242:       break;
                   4243: 
                   4244:     case IOR:
1.1.1.5 ! root     4245:       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
1.1.1.4   root     4246:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   4247:          && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     4248:          && (nonzero_bits (XEXP (x, 0), mode) & ~ INTVAL (XEXP (x, 1))) == 0)
1.1.1.4   root     4249:        return XEXP (x, 1);
                   4250: 
1.1       root     4251:       /* Convert (A & B) | A to A.  */
                   4252:       if (GET_CODE (XEXP (x, 0)) == AND
                   4253:          && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
                   4254:              || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)))
                   4255:          && ! side_effects_p (XEXP (XEXP (x, 0), 0))
                   4256:          && ! side_effects_p (XEXP (XEXP (x, 0), 1)))
                   4257:        return XEXP (x, 1);
                   4258: 
                   4259:       /* If we have (ior (and A B) C), apply the distributive law and then
                   4260:         the inverse distributive law to see if things simplify.  */
                   4261: 
                   4262:       if (GET_CODE (XEXP (x, 0)) == AND)
                   4263:        {
                   4264:          x = apply_distributive_law
                   4265:            (gen_binary (AND, mode,
                   4266:                         gen_binary (IOR, mode,
                   4267:                                     XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
                   4268:                         gen_binary (IOR, mode,
                   4269:                                     XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
                   4270: 
                   4271:          if (GET_CODE (x) != IOR)
                   4272:            goto restart;
                   4273:        }
                   4274: 
                   4275:       if (GET_CODE (XEXP (x, 1)) == AND)
                   4276:        {
                   4277:          x = apply_distributive_law
                   4278:            (gen_binary (AND, mode,
                   4279:                         gen_binary (IOR, mode,
                   4280:                                     XEXP (XEXP (x, 1), 0), XEXP (x, 0)),
                   4281:                         gen_binary (IOR, mode,
                   4282:                                     XEXP (XEXP (x, 1), 1), XEXP (x, 0))));
                   4283: 
                   4284:          if (GET_CODE (x) != IOR)
                   4285:            goto restart;
                   4286:        }
                   4287: 
                   4288:       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
                   4289:         mode size to (rotate A CX).  */
                   4290: 
                   4291:       if (((GET_CODE (XEXP (x, 0)) == ASHIFT
                   4292:            && GET_CODE (XEXP (x, 1)) == LSHIFTRT)
                   4293:           || (GET_CODE (XEXP (x, 1)) == ASHIFT
                   4294:               && GET_CODE (XEXP (x, 0)) == LSHIFTRT))
                   4295:          && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 1), 0))
                   4296:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   4297:          && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
                   4298:          && (INTVAL (XEXP (XEXP (x, 0), 1)) + INTVAL (XEXP (XEXP (x, 1), 1))
                   4299:              == GET_MODE_BITSIZE (mode)))
                   4300:        {
                   4301:          rtx shift_count;
                   4302: 
                   4303:          if (GET_CODE (XEXP (x, 0)) == ASHIFT)
                   4304:            shift_count = XEXP (XEXP (x, 0), 1);
                   4305:          else
                   4306:            shift_count = XEXP (XEXP (x, 1), 1);
                   4307:          x = gen_rtx (ROTATE, mode, XEXP (XEXP (x, 0), 0), shift_count);
                   4308:          goto restart;
                   4309:        }
                   4310:       break;
                   4311: 
                   4312:     case XOR:
                   4313:       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
                   4314:         Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
                   4315:         (NOT y).  */
                   4316:       {
                   4317:        int num_negated = 0;
                   4318:        rtx in1 = XEXP (x, 0), in2 = XEXP (x, 1);
                   4319: 
                   4320:        if (GET_CODE (in1) == NOT)
                   4321:          num_negated++, in1 = XEXP (in1, 0);
                   4322:        if (GET_CODE (in2) == NOT)
                   4323:          num_negated++, in2 = XEXP (in2, 0);
                   4324: 
                   4325:        if (num_negated == 2)
                   4326:          {
                   4327:            SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
                   4328:            SUBST (XEXP (x, 1), XEXP (XEXP (x, 1), 0));
                   4329:          }
                   4330:        else if (num_negated == 1)
1.1.1.4   root     4331:          {
                   4332:            x =  gen_unary (NOT, mode,
                   4333:                            gen_binary (XOR, mode, in1, in2));
                   4334:            goto restart;
                   4335:          }
1.1       root     4336:       }
                   4337: 
                   4338:       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
                   4339:         correspond to a machine insn or result in further simplifications
                   4340:         if B is a constant.  */
                   4341: 
                   4342:       if (GET_CODE (XEXP (x, 0)) == AND
                   4343:          && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))
                   4344:          && ! side_effects_p (XEXP (x, 1)))
                   4345:        {
                   4346:          x = gen_binary (AND, mode,
                   4347:                          gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)),
                   4348:                          XEXP (x, 1));
                   4349:          goto restart;
                   4350:        }
                   4351:       else if (GET_CODE (XEXP (x, 0)) == AND
                   4352:               && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
                   4353:               && ! side_effects_p (XEXP (x, 1)))
                   4354:        {
                   4355:          x = gen_binary (AND, mode,
                   4356:                          gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)),
                   4357:                          XEXP (x, 1));
                   4358:          goto restart;
                   4359:        }
                   4360: 
                   4361: 
                   4362: #if STORE_FLAG_VALUE == 1
                   4363:       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
                   4364:         comparison.  */
                   4365:       if (XEXP (x, 1) == const1_rtx
                   4366:          && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   4367:          && reversible_comparison_p (XEXP (x, 0)))
                   4368:        return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
                   4369:                                mode, XEXP (XEXP (x, 0), 0),
                   4370:                                XEXP (XEXP (x, 0), 1));
1.1.1.5 ! root     4371: 
        !          4372:       /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
        !          4373:         is (lt foo (const_int 0)), so we can perform the above
        !          4374:         simplification.  */
        !          4375: 
        !          4376:       if (XEXP (x, 1) == const1_rtx
        !          4377:          && GET_CODE (XEXP (x, 0)) == LSHIFTRT
        !          4378:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
        !          4379:          && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1)
        !          4380:        return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx);
1.1       root     4381: #endif
                   4382: 
                   4383:       /* (xor (comparison foo bar) (const_int sign-bit))
                   4384:         when STORE_FLAG_VALUE is the sign bit.  */
1.1.1.4   root     4385:       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
                   4386:          && (STORE_FLAG_VALUE
                   4387:              == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
1.1       root     4388:          && XEXP (x, 1) == const_true_rtx
                   4389:          && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
                   4390:          && reversible_comparison_p (XEXP (x, 0)))
                   4391:        return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
                   4392:                                mode, XEXP (XEXP (x, 0), 0),
                   4393:                                XEXP (XEXP (x, 0), 1));
                   4394:       break;
                   4395: 
                   4396:     case ABS:
                   4397:       /* (abs (neg <foo>)) -> (abs <foo>) */
                   4398:       if (GET_CODE (XEXP (x, 0)) == NEG)
                   4399:        SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
                   4400: 
                   4401:       /* If operand is something known to be positive, ignore the ABS.  */
                   4402:       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
1.1.1.4   root     4403:          || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
                   4404:               <= HOST_BITS_PER_WIDE_INT)
1.1.1.5 ! root     4405:              && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
1.1.1.4   root     4406:                   & ((HOST_WIDE_INT) 1
                   4407:                      << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
1.1       root     4408:                  == 0)))
                   4409:        return XEXP (x, 0);
                   4410: 
                   4411: 
                   4412:       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
1.1.1.4   root     4413:       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
1.1       root     4414:        {
                   4415:          x = gen_rtx_combine (NEG, mode, XEXP (x, 0));
                   4416:          goto restart;
                   4417:        }
                   4418:       break;
                   4419: 
1.1.1.3   root     4420:     case FFS:
                   4421:       /* (ffs (*_extend <X>)) = (ffs <X>) */
                   4422:       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
                   4423:          || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
                   4424:        SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
                   4425:       break;
                   4426: 
1.1       root     4427:     case FLOAT:
                   4428:       /* (float (sign_extend <X>)) = (float <X>).  */
                   4429:       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
                   4430:        SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
                   4431:       break;
                   4432: 
                   4433:     case LSHIFT:
                   4434:     case ASHIFT:
                   4435:     case LSHIFTRT:
                   4436:     case ASHIFTRT:
                   4437:     case ROTATE:
                   4438:     case ROTATERT:
                   4439:       /* If this is a shift by a constant amount, simplify it.  */
                   4440:       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
                   4441:        {
                   4442:          x = simplify_shift_const (x, code, mode, XEXP (x, 0), 
                   4443:                                    INTVAL (XEXP (x, 1)));
                   4444:          if (GET_CODE (x) != code)
                   4445:            goto restart;
                   4446:        }
1.1.1.4   root     4447: 
                   4448: #ifdef SHIFT_COUNT_TRUNCATED
                   4449:       else if (GET_CODE (XEXP (x, 1)) != REG)
                   4450:        SUBST (XEXP (x, 1),
                   4451:               force_to_mode (XEXP (x, 1), GET_MODE (x),
                   4452:                              exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))),
                   4453:                              NULL_RTX));
                   4454: #endif
                   4455: 
1.1       root     4456:       break;
                   4457:     }
                   4458: 
                   4459:   return x;
                   4460: }
                   4461: 
                   4462: /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
                   4463:    operations" because they can be replaced with two more basic operations.
                   4464:    ZERO_EXTEND is also considered "compound" because it can be replaced with
                   4465:    an AND operation, which is simpler, though only one operation.
                   4466: 
                   4467:    The function expand_compound_operation is called with an rtx expression
                   4468:    and will convert it to the appropriate shifts and AND operations, 
                   4469:    simplifying at each stage.
                   4470: 
                   4471:    The function make_compound_operation is called to convert an expression
                   4472:    consisting of shifts and ANDs into the equivalent compound expression.
                   4473:    It is the inverse of this function, loosely speaking.  */
                   4474: 
                   4475: static rtx
                   4476: expand_compound_operation (x)
                   4477:      rtx x;
                   4478: {
                   4479:   int pos = 0, len;
                   4480:   int unsignedp = 0;
                   4481:   int modewidth;
                   4482:   rtx tem;
                   4483: 
                   4484:   switch (GET_CODE (x))
                   4485:     {
                   4486:     case ZERO_EXTEND:
                   4487:       unsignedp = 1;
                   4488:     case SIGN_EXTEND:
1.1.1.3   root     4489:       /* We can't necessarily use a const_int for a multiword mode;
                   4490:         it depends on implicitly extending the value.
                   4491:         Since we don't know the right way to extend it,
                   4492:         we can't tell whether the implicit way is right.
                   4493: 
                   4494:         Even for a mode that is no wider than a const_int,
                   4495:         we can't win, because we need to sign extend one of its bits through
                   4496:         the rest of it, and we don't know which bit.  */
1.1       root     4497:       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
1.1.1.3   root     4498:        return x;
1.1       root     4499: 
                   4500:       if (! FAKE_EXTEND_SAFE_P (GET_MODE (XEXP (x, 0)), XEXP (x, 0)))
                   4501:        return x;
                   4502: 
                   4503:       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
                   4504:       /* If the inner object has VOIDmode (the only way this can happen
                   4505:         is if it is a ASM_OPERANDS), we can't do anything since we don't
                   4506:         know how much masking to do.  */
                   4507:       if (len == 0)
                   4508:        return x;
                   4509: 
                   4510:       break;
                   4511: 
                   4512:     case ZERO_EXTRACT:
                   4513:       unsignedp = 1;
                   4514:     case SIGN_EXTRACT:
                   4515:       /* If the operand is a CLOBBER, just return it.  */
                   4516:       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
                   4517:        return XEXP (x, 0);
                   4518: 
                   4519:       if (GET_CODE (XEXP (x, 1)) != CONST_INT
                   4520:          || GET_CODE (XEXP (x, 2)) != CONST_INT
                   4521:          || GET_MODE (XEXP (x, 0)) == VOIDmode)
                   4522:        return x;
                   4523: 
                   4524:       len = INTVAL (XEXP (x, 1));
                   4525:       pos = INTVAL (XEXP (x, 2));
                   4526: 
                   4527:       /* If this goes outside the object being extracted, replace the object
                   4528:         with a (use (mem ...)) construct that only combine understands
                   4529:         and is used only for this purpose.  */
                   4530:       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
                   4531:        SUBST (XEXP (x, 0), gen_rtx (USE, GET_MODE (x), XEXP (x, 0)));
                   4532: 
                   4533: #if BITS_BIG_ENDIAN
                   4534:       pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
                   4535: #endif
                   4536:       break;
                   4537: 
                   4538:     default:
                   4539:       return x;
                   4540:     }
                   4541: 
                   4542:   /* If we reach here, we want to return a pair of shifts.  The inner
                   4543:      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
                   4544:      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
                   4545:      logical depending on the value of UNSIGNEDP.
                   4546: 
                   4547:      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
                   4548:      converted into an AND of a shift.
                   4549: 
                   4550:      We must check for the case where the left shift would have a negative
                   4551:      count.  This can happen in a case like (x >> 31) & 255 on machines
                   4552:      that can't shift by a constant.  On those machines, we would first
                   4553:      combine the shift with the AND to produce a variable-position 
                   4554:      extraction.  Then the constant of 31 would be substituted in to produce
                   4555:      a such a position.  */
                   4556: 
                   4557:   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
                   4558:   if (modewidth >= pos - len)
1.1.1.4   root     4559:     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
1.1       root     4560:                                GET_MODE (x),
1.1.1.4   root     4561:                                simplify_shift_const (NULL_RTX, ASHIFT,
                   4562:                                                      GET_MODE (x),
1.1       root     4563:                                                      XEXP (x, 0),
                   4564:                                                      modewidth - pos - len),
                   4565:                                modewidth - len);
                   4566: 
1.1.1.4   root     4567:   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
                   4568:     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
                   4569:                                  simplify_shift_const (NULL_RTX, LSHIFTRT,
1.1       root     4570:                                                        GET_MODE (x),
                   4571:                                                        XEXP (x, 0), pos),
1.1.1.4   root     4572:                                  ((HOST_WIDE_INT) 1 << len) - 1);
1.1       root     4573:   else
                   4574:     /* Any other cases we can't handle.  */
                   4575:     return x;
                   4576:     
                   4577: 
                   4578:   /* If we couldn't do this for some reason, return the original
                   4579:      expression.  */
                   4580:   if (GET_CODE (tem) == CLOBBER)
                   4581:     return x;
                   4582: 
                   4583:   return tem;
                   4584: }
                   4585: 
                   4586: /* X is a SET which contains an assignment of one object into
                   4587:    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
                   4588:    or certain SUBREGS). If possible, convert it into a series of
                   4589:    logical operations.
                   4590: 
                   4591:    We half-heartedly support variable positions, but do not at all
                   4592:    support variable lengths.  */
                   4593: 
                   4594: static rtx
                   4595: expand_field_assignment (x)
                   4596:      rtx x;
                   4597: {
                   4598:   rtx inner;
                   4599:   rtx pos;                     /* Always counts from low bit. */
                   4600:   int len;
                   4601:   rtx mask;
                   4602:   enum machine_mode compute_mode;
                   4603: 
                   4604:   /* Loop until we find something we can't simplify.  */
                   4605:   while (1)
                   4606:     {
                   4607:       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
                   4608:          && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
                   4609:        {
                   4610:          inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
                   4611:          len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
                   4612:          pos = const0_rtx;
                   4613:        }
                   4614:       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
                   4615:               && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
                   4616:        {
                   4617:          inner = XEXP (SET_DEST (x), 0);
                   4618:          len = INTVAL (XEXP (SET_DEST (x), 1));
                   4619:          pos = XEXP (SET_DEST (x), 2);
                   4620: 
                   4621:          /* If the position is constant and spans the width of INNER,
                   4622:             surround INNER  with a USE to indicate this.  */
                   4623:          if (GET_CODE (pos) == CONST_INT
                   4624:              && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
                   4625:            inner = gen_rtx (USE, GET_MODE (SET_DEST (x)), inner);
                   4626: 
                   4627: #if BITS_BIG_ENDIAN
                   4628:          if (GET_CODE (pos) == CONST_INT)
1.1.1.4   root     4629:            pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
                   4630:                           - INTVAL (pos));
1.1       root     4631:          else if (GET_CODE (pos) == MINUS
                   4632:                   && GET_CODE (XEXP (pos, 1)) == CONST_INT
                   4633:                   && (INTVAL (XEXP (pos, 1))
                   4634:                       == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
                   4635:            /* If position is ADJUST - X, new position is X.  */
                   4636:            pos = XEXP (pos, 0);
                   4637:          else
                   4638:            pos = gen_binary (MINUS, GET_MODE (pos),
1.1.1.4   root     4639:                              GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
                   4640:                                       - len),
                   4641:                              pos);
1.1       root     4642: #endif
                   4643:        }
                   4644: 
                   4645:       /* A SUBREG between two modes that occupy the same numbers of words
                   4646:         can be done by moving the SUBREG to the source.  */
                   4647:       else if (GET_CODE (SET_DEST (x)) == SUBREG
                   4648:               && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
                   4649:                     + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
                   4650:                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
                   4651:                        + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
                   4652:        {
                   4653:          x = gen_rtx (SET, VOIDmode, SUBREG_REG (SET_DEST (x)),
                   4654:                       gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_DEST (x))),
                   4655:                                                SET_SRC (x)));
                   4656:          continue;
                   4657:        }
                   4658:       else
                   4659:        break;
                   4660: 
                   4661:       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
                   4662:        inner = SUBREG_REG (inner);
                   4663: 
                   4664:       compute_mode = GET_MODE (inner);
                   4665: 
                   4666:       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
1.1.1.4   root     4667:       if (len < HOST_BITS_PER_WIDE_INT)
                   4668:        mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
1.1       root     4669:       else
                   4670:        break;
                   4671: 
                   4672:       /* Now compute the equivalent expression.  Make a copy of INNER
                   4673:         for the SET_DEST in case it is a MEM into which we will substitute;
                   4674:         we don't want shared RTL in that case.  */
                   4675:       x = gen_rtx (SET, VOIDmode, copy_rtx (inner),
                   4676:                   gen_binary (IOR, compute_mode,
                   4677:                               gen_binary (AND, compute_mode,
                   4678:                                           gen_unary (NOT, compute_mode,
                   4679:                                                      gen_binary (ASHIFT,
                   4680:                                                                  compute_mode,
                   4681:                                                                  mask, pos)),
                   4682:                                           inner),
                   4683:                               gen_binary (ASHIFT, compute_mode,
                   4684:                                           gen_binary (AND, compute_mode,
                   4685:                                                       gen_lowpart_for_combine
                   4686:                                                       (compute_mode,
                   4687:                                                        SET_SRC (x)),
                   4688:                                                       mask),
                   4689:                                           pos)));
                   4690:     }
                   4691: 
                   4692:   return x;
                   4693: }
                   4694: 
1.1.1.5 ! root     4695: /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
        !          4696:    it is an RTX that represents a variable starting position; otherwise,
        !          4697:    POS is the (constant) starting bit position (counted from the LSB).
1.1       root     4698: 
                   4699:    INNER may be a USE.  This will occur when we started with a bitfield
                   4700:    that went outside the boundary of the object in memory, which is
                   4701:    allowed on most machines.  To isolate this case, we produce a USE
                   4702:    whose mode is wide enough and surround the MEM with it.  The only
                   4703:    code that understands the USE is this routine.  If it is not removed,
                   4704:    it will cause the resulting insn not to match.
                   4705: 
                   4706:    UNSIGNEDP is non-zero for an unsigned reference and zero for a 
                   4707:    signed reference.
                   4708: 
                   4709:    IN_DEST is non-zero if this is a reference in the destination of a
                   4710:    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If non-zero,
                   4711:    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
                   4712:    be used.
                   4713: 
                   4714:    IN_COMPARE is non-zero if we are in a COMPARE.  This means that a
                   4715:    ZERO_EXTRACT should be built even for bits starting at bit 0.
                   4716: 
                   4717:    MODE is the desired mode of the result (if IN_DEST == 0).  */
                   4718: 
                   4719: static rtx
                   4720: make_extraction (mode, inner, pos, pos_rtx, len,
                   4721:                 unsignedp, in_dest, in_compare)
                   4722:      enum machine_mode mode;
                   4723:      rtx inner;
                   4724:      int pos;
                   4725:      rtx pos_rtx;
                   4726:      int len;
                   4727:      int unsignedp;
                   4728:      int in_dest, in_compare;
                   4729: {
1.1.1.4   root     4730:   /* This mode describes the size of the storage area
                   4731:      to fetch the overall value from.  Within that, we
                   4732:      ignore the POS lowest bits, etc.  */
1.1       root     4733:   enum machine_mode is_mode = GET_MODE (inner);
                   4734:   enum machine_mode inner_mode;
                   4735:   enum machine_mode wanted_mem_mode = byte_mode;
                   4736:   enum machine_mode pos_mode = word_mode;
                   4737:   enum machine_mode extraction_mode = word_mode;
                   4738:   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
                   4739:   int spans_byte = 0;
                   4740:   rtx new = 0;
1.1.1.5 ! root     4741:   rtx orig_pos_rtx = pos_rtx;
1.1       root     4742: 
                   4743:   /* Get some information about INNER and get the innermost object.  */
                   4744:   if (GET_CODE (inner) == USE)
1.1.1.4   root     4745:     /* (use:SI (mem:QI foo)) stands for (mem:SI foo).  */
1.1       root     4746:     /* We don't need to adjust the position because we set up the USE
                   4747:        to pretend that it was a full-word object.  */
                   4748:     spans_byte = 1, inner = XEXP (inner, 0);
                   4749:   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
1.1.1.4   root     4750:     {
                   4751:       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
                   4752:         consider just the QI as the memory to extract from.
                   4753:         The subreg adds or removes high bits; its mode is
                   4754:         irrelevant to the meaning of this extraction,
                   4755:         since POS and LEN count from the lsb.  */
                   4756:       if (GET_CODE (SUBREG_REG (inner)) == MEM)
                   4757:        is_mode = GET_MODE (SUBREG_REG (inner));
                   4758:       inner = SUBREG_REG (inner);
                   4759:     }
1.1       root     4760: 
                   4761:   inner_mode = GET_MODE (inner);
                   4762: 
                   4763:   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
1.1.1.5 ! root     4764:     pos = INTVAL (pos_rtx), pos_rtx = 0;
1.1       root     4765: 
                   4766:   /* See if this can be done without an extraction.  We never can if the
                   4767:      width of the field is not the same as that of some integer mode. For
                   4768:      registers, we can only avoid the extraction if the position is at the
                   4769:      low-order bit and this is either not in the destination or we have the
                   4770:      appropriate STRICT_LOW_PART operation available.
                   4771: 
                   4772:      For MEM, we can avoid an extract if the field starts on an appropriate
                   4773:      boundary and we can change the mode of the memory reference.  However,
                   4774:      we cannot directly access the MEM if we have a USE and the underlying
                   4775:      MEM is not TMODE.  This combination means that MEM was being used in a
                   4776:      context where bits outside its mode were being referenced; that is only
                   4777:      valid in bit-field insns.  */
                   4778: 
                   4779:   if (tmode != BLKmode
                   4780:       && ! (spans_byte && inner_mode != tmode)
1.1.1.5 ! root     4781:       && ((pos_rtx == 0 && pos == 0 && GET_CODE (inner) != MEM
1.1       root     4782:           && (! in_dest
1.1.1.4   root     4783:               || (GET_CODE (inner) == REG
                   4784:                   && (movstrict_optab->handlers[(int) tmode].insn_code
                   4785:                       != CODE_FOR_nothing))))
1.1.1.5 ! root     4786:          || (GET_CODE (inner) == MEM && pos_rtx == 0
1.1.1.2   root     4787:              && (pos
                   4788:                  % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
                   4789:                     : BITS_PER_UNIT)) == 0
1.1       root     4790:              /* We can't do this if we are widening INNER_MODE (it
                   4791:                 may not be aligned, for one thing).  */
                   4792:              && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
                   4793:              && (inner_mode == tmode
                   4794:                  || (! mode_dependent_address_p (XEXP (inner, 0))
                   4795:                      && ! MEM_VOLATILE_P (inner))))))
                   4796:     {
                   4797:       /* If INNER is a MEM, make a new MEM that encompasses just the desired
                   4798:         field.  If the original and current mode are the same, we need not
                   4799:         adjust the offset.  Otherwise, we do if bytes big endian.  
                   4800: 
                   4801:         If INNER is not a MEM, get a piece consisting of the just the field
1.1.1.4   root     4802:         of interest (in this case POS must be 0).  */
1.1       root     4803: 
                   4804:       if (GET_CODE (inner) == MEM)
                   4805:        {
1.1.1.4   root     4806:          int offset;
                   4807:          /* POS counts from lsb, but make OFFSET count in memory order.  */
                   4808:          if (BYTES_BIG_ENDIAN)
                   4809:            offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
                   4810:          else
                   4811:            offset = pos / BITS_PER_UNIT;
1.1       root     4812: 
                   4813:          new = gen_rtx (MEM, tmode, plus_constant (XEXP (inner, 0), offset));
                   4814:          RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (inner);
                   4815:          MEM_VOLATILE_P (new) = MEM_VOLATILE_P (inner);
                   4816:          MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (inner);
                   4817:        }
1.1.1.4   root     4818:       else if (GET_CODE (inner) == REG)
                   4819:        /* We can't call gen_lowpart_for_combine here since we always want
                   4820:           a SUBREG and it would sometimes return a new hard register.  */
                   4821:        new = gen_rtx (SUBREG, tmode, inner,
                   4822:                       (WORDS_BIG_ENDIAN
                   4823:                        && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD
                   4824:                        ? ((GET_MODE_SIZE (inner_mode) - GET_MODE_SIZE (tmode))
                   4825:                           / UNITS_PER_WORD)
                   4826:                        : 0));
1.1       root     4827:       else
1.1.1.4   root     4828:        new = force_to_mode (inner, tmode, len, NULL_RTX);
1.1       root     4829: 
                   4830:       /* If this extraction is going into the destination of a SET, 
                   4831:         make a STRICT_LOW_PART unless we made a MEM.  */
                   4832: 
                   4833:       if (in_dest)
                   4834:        return (GET_CODE (new) == MEM ? new
1.1.1.4   root     4835:                : (GET_CODE (new) != SUBREG
                   4836:                   ? gen_rtx (CLOBBER, tmode, const0_rtx)
                   4837:                   : gen_rtx_combine (STRICT_LOW_PART, VOIDmode, new)));
1.1       root     4838: 
                   4839:       /* Otherwise, sign- or zero-extend unless we already are in the
                   4840:         proper mode.  */
                   4841: 
                   4842:       return (mode == tmode ? new
                   4843:              : gen_rtx_combine (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
                   4844:                                 mode, new));
                   4845:     }
                   4846: 
1.1.1.4   root     4847:   /* Unless this is a COMPARE or we have a funny memory reference,
                   4848:      don't do anything with zero-extending field extracts starting at
                   4849:      the low-order bit since they are simple AND operations.  */
1.1.1.5 ! root     4850:   if (pos_rtx == 0 && pos == 0 && ! in_dest
        !          4851:       && ! in_compare && ! spans_byte && unsignedp)
1.1       root     4852:     return 0;
                   4853: 
                   4854:   /* Get the mode to use should INNER be a MEM, the mode for the position,
                   4855:      and the mode for the result.  */
                   4856: #ifdef HAVE_insv
                   4857:   if (in_dest)
                   4858:     {
                   4859:       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_insv][0];
                   4860:       pos_mode = insn_operand_mode[(int) CODE_FOR_insv][2];
                   4861:       extraction_mode = insn_operand_mode[(int) CODE_FOR_insv][3];
                   4862:     }
                   4863: #endif
                   4864: 
                   4865: #ifdef HAVE_extzv
                   4866:   if (! in_dest && unsignedp)
                   4867:     {
                   4868:       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
                   4869:       pos_mode = insn_operand_mode[(int) CODE_FOR_extzv][3];
                   4870:       extraction_mode = insn_operand_mode[(int) CODE_FOR_extzv][0];
                   4871:     }
                   4872: #endif
                   4873: 
                   4874: #ifdef HAVE_extv
                   4875:   if (! in_dest && ! unsignedp)
                   4876:     {
                   4877:       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
                   4878:       pos_mode = insn_operand_mode[(int) CODE_FOR_extv][3];
                   4879:       extraction_mode = insn_operand_mode[(int) CODE_FOR_extv][0];
                   4880:     }
                   4881: #endif
                   4882: 
                   4883:   /* Never narrow an object, since that might not be safe.  */
                   4884: 
                   4885:   if (mode != VOIDmode
                   4886:       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
                   4887:     extraction_mode = mode;
                   4888: 
                   4889:   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
                   4890:       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
                   4891:     pos_mode = GET_MODE (pos_rtx);
                   4892: 
                   4893:   /* If this is not from memory or we have to change the mode of memory and
                   4894:      cannot, the desired mode is EXTRACTION_MODE.  */
                   4895:   if (GET_CODE (inner) != MEM
                   4896:       || (inner_mode != wanted_mem_mode
                   4897:          && (mode_dependent_address_p (XEXP (inner, 0))
                   4898:              || MEM_VOLATILE_P (inner))))
                   4899:     wanted_mem_mode = extraction_mode;
                   4900: 
                   4901: #if BITS_BIG_ENDIAN
                   4902:   /* If position is constant, compute new position.  Otherwise, build
                   4903:      subtraction.  */
1.1.1.5 ! root     4904:   if (pos_rtx == 0)
1.1       root     4905:     pos = (MAX (GET_MODE_BITSIZE (is_mode), GET_MODE_BITSIZE (wanted_mem_mode))
                   4906:           - len - pos);
                   4907:   else
                   4908:     pos_rtx
                   4909:       = gen_rtx_combine (MINUS, GET_MODE (pos_rtx),
1.1.1.4   root     4910:                         GEN_INT (MAX (GET_MODE_BITSIZE (is_mode),
                   4911:                                       GET_MODE_BITSIZE (wanted_mem_mode))
                   4912:                                  - len),
                   4913:                         pos_rtx);
1.1       root     4914: #endif
                   4915: 
                   4916:   /* If INNER has a wider mode, make it smaller.  If this is a constant
                   4917:      extract, try to adjust the byte to point to the byte containing
                   4918:      the value.  */
                   4919:   if (wanted_mem_mode != VOIDmode
                   4920:       && GET_MODE_SIZE (wanted_mem_mode) < GET_MODE_SIZE (is_mode)
                   4921:       && ((GET_CODE (inner) == MEM
                   4922:           && (inner_mode == wanted_mem_mode
                   4923:               || (! mode_dependent_address_p (XEXP (inner, 0))
                   4924:                   && ! MEM_VOLATILE_P (inner))))))
                   4925:     {
                   4926:       int offset = 0;
                   4927: 
                   4928:       /* The computations below will be correct if the machine is big
                   4929:         endian in both bits and bytes or little endian in bits and bytes.
                   4930:         If it is mixed, we must adjust.  */
                   4931:             
                   4932:       /* If bytes are big endian and we had a paradoxical SUBREG, we must
                   4933:         adjust OFFSET to compensate. */
                   4934: #if BYTES_BIG_ENDIAN
                   4935:       if (! spans_byte
                   4936:          && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
                   4937:        offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
                   4938: #endif
                   4939: 
                   4940:       /* If this is a constant position, we can move to the desired byte.  */
1.1.1.5 ! root     4941:       if (pos_rtx == 0)
1.1       root     4942:        {
                   4943:          offset += pos / BITS_PER_UNIT;
                   4944:          pos %= GET_MODE_BITSIZE (wanted_mem_mode);
                   4945:        }
                   4946: 
1.1.1.5 ! root     4947: #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
        !          4948:       if (! spans_byte && is_mode != wanted_mem_mode)
        !          4949:        offset = (GET_MODE_SIZE (is_mode)
        !          4950:                  - GET_MODE_SIZE (wanted_mem_mode) - offset);
        !          4951: #endif
        !          4952: 
1.1       root     4953:       if (offset != 0 || inner_mode != wanted_mem_mode)
                   4954:        {
                   4955:          rtx newmem = gen_rtx (MEM, wanted_mem_mode,
                   4956:                                plus_constant (XEXP (inner, 0), offset));
                   4957:          RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (inner);
                   4958:          MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (inner);
                   4959:          MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (inner);
                   4960:          inner = newmem;
                   4961:        }
                   4962:     }
                   4963: 
                   4964:   /* If INNER is not memory, we can always get it into the proper mode. */
                   4965:   else if (GET_CODE (inner) != MEM)
1.1.1.4   root     4966:     inner = force_to_mode (inner, extraction_mode,
                   4967:                           (pos < 0 ? GET_MODE_BITSIZE (extraction_mode)
                   4968:                            : len + pos),
                   4969:                           NULL_RTX);
1.1       root     4970: 
                   4971:   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
                   4972:      have to zero extend.  Otherwise, we can just use a SUBREG.  */
1.1.1.5 ! root     4973:   if (pos_rtx != 0
1.1       root     4974:       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
                   4975:     pos_rtx = gen_rtx_combine (ZERO_EXTEND, pos_mode, pos_rtx);
1.1.1.5 ! root     4976:   else if (pos_rtx != 0
1.1       root     4977:           && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
                   4978:     pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx);
                   4979: 
1.1.1.5 ! root     4980:   /* Make POS_RTX unless we already have it and it is correct.  If we don't
        !          4981:      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
        !          4982:      be a CONST_INT. */
        !          4983:   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
        !          4984:     pos_rtx = orig_pos_rtx;
        !          4985: 
        !          4986:   else if (pos_rtx == 0)
1.1.1.4   root     4987:     pos_rtx = GEN_INT (pos);
1.1       root     4988: 
                   4989:   /* Make the required operation.  See if we can use existing rtx.  */
                   4990:   new = gen_rtx_combine (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
1.1.1.4   root     4991:                         extraction_mode, inner, GEN_INT (len), pos_rtx);
1.1       root     4992:   if (! in_dest)
                   4993:     new = gen_lowpart_for_combine (mode, new);
                   4994: 
                   4995:   return new;
                   4996: }
                   4997: 
                   4998: /* Look at the expression rooted at X.  Look for expressions
                   4999:    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
                   5000:    Form these expressions.
                   5001: 
                   5002:    Return the new rtx, usually just X.
                   5003: 
                   5004:    Also, for machines like the Vax that don't have logical shift insns,
                   5005:    try to convert logical to arithmetic shift operations in cases where
                   5006:    they are equivalent.  This undoes the canonicalizations to logical
                   5007:    shifts done elsewhere.
                   5008: 
                   5009:    We try, as much as possible, to re-use rtl expressions to save memory.
                   5010: 
                   5011:    IN_CODE says what kind of expression we are processing.  Normally, it is
1.1.1.4   root     5012:    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
                   5013:    being kludges), it is MEM.  When processing the arguments of a comparison
1.1       root     5014:    or a COMPARE against zero, it is COMPARE.  */
                   5015: 
                   5016: static rtx
                   5017: make_compound_operation (x, in_code)
                   5018:      rtx x;
                   5019:      enum rtx_code in_code;
                   5020: {
                   5021:   enum rtx_code code = GET_CODE (x);
                   5022:   enum machine_mode mode = GET_MODE (x);
                   5023:   int mode_width = GET_MODE_BITSIZE (mode);
                   5024:   enum rtx_code next_code;
1.1.1.4   root     5025:   int i, count;
1.1       root     5026:   rtx new = 0;
1.1.1.5 ! root     5027:   rtx tem;
1.1       root     5028:   char *fmt;
                   5029: 
                   5030:   /* Select the code to be used in recursive calls.  Once we are inside an
                   5031:      address, we stay there.  If we have a comparison, set to COMPARE,
                   5032:      but once inside, go back to our default of SET.  */
                   5033: 
1.1.1.4   root     5034:   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
1.1       root     5035:               : ((code == COMPARE || GET_RTX_CLASS (code) == '<')
                   5036:                  && XEXP (x, 1) == const0_rtx) ? COMPARE
                   5037:               : in_code == COMPARE ? SET : in_code);
                   5038: 
                   5039:   /* Process depending on the code of this operation.  If NEW is set
                   5040:      non-zero, it will be returned.  */
                   5041: 
                   5042:   switch (code)
                   5043:     {
                   5044:     case ASHIFT:
                   5045:     case LSHIFT:
                   5046:       /* Convert shifts by constants into multiplications if inside
                   5047:         an address.  */
                   5048:       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
1.1.1.4   root     5049:          && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
1.1       root     5050:          && INTVAL (XEXP (x, 1)) >= 0)
1.1.1.5 ! root     5051:        {
        !          5052:          new = make_compound_operation (XEXP (x, 0), next_code);
        !          5053:          new = gen_rtx_combine (MULT, mode, new,
        !          5054:                                 GEN_INT ((HOST_WIDE_INT) 1
        !          5055:                                          << INTVAL (XEXP (x, 1))));
        !          5056:        }
1.1       root     5057:       break;
                   5058: 
                   5059:     case AND:
                   5060:       /* If the second operand is not a constant, we can't do anything
                   5061:         with it.  */
                   5062:       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
                   5063:        break;
                   5064: 
                   5065:       /* If the constant is a power of two minus one and the first operand
                   5066:         is a logical right shift, make an extraction.  */
                   5067:       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
                   5068:          && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
1.1.1.5 ! root     5069:        {
        !          5070:          new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
        !          5071:          new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
        !          5072:                                 0, in_code == COMPARE);
        !          5073:        }
1.1.1.2   root     5074: 
1.1       root     5075:       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
                   5076:       else if (GET_CODE (XEXP (x, 0)) == SUBREG
                   5077:               && subreg_lowpart_p (XEXP (x, 0))
                   5078:               && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
                   5079:               && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
1.1.1.5 ! root     5080:        {
        !          5081:          new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
        !          5082:                                         next_code);
        !          5083:          new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
        !          5084:                                 XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
        !          5085:                                 0, in_code == COMPARE);
        !          5086:        }
1.1.1.3   root     5087: 
                   5088:       /* If we are have (and (rotate X C) M) and C is larger than the number
                   5089:         of bits in M, this is an extraction.  */
                   5090: 
                   5091:       else if (GET_CODE (XEXP (x, 0)) == ROTATE
                   5092:               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   5093:               && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
                   5094:               && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
1.1.1.5 ! root     5095:        {
        !          5096:          new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
        !          5097:          new = make_extraction (mode, new,
        !          5098:                                 (GET_MODE_BITSIZE (mode)
        !          5099:                                  - INTVAL (XEXP (XEXP (x, 0), 1))),
        !          5100:                                 NULL_RTX, i, 1, 0, in_code == COMPARE);
        !          5101:        }
1.1.1.3   root     5102: 
                   5103:       /* On machines without logical shifts, if the operand of the AND is
1.1       root     5104:         a logical shift and our mask turns off all the propagated sign
                   5105:         bits, we can replace the logical shift with an arithmetic shift.  */
1.1.1.4   root     5106:       else if (ashr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
                   5107:               && (lshr_optab->handlers[(int) mode].insn_code
                   5108:                   == CODE_FOR_nothing)
1.1       root     5109:               && GET_CODE (XEXP (x, 0)) == LSHIFTRT
                   5110:               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   5111:               && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
1.1.1.4   root     5112:               && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
                   5113:               && mode_width <= HOST_BITS_PER_WIDE_INT)
1.1       root     5114:        {
1.1.1.4   root     5115:          unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
1.1       root     5116: 
                   5117:          mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
                   5118:          if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
                   5119:            SUBST (XEXP (x, 0),
1.1.1.5 ! root     5120:                   gen_rtx_combine (ASHIFTRT, mode,
        !          5121:                                    make_compound_operation (XEXP (XEXP (x, 0), 0),
        !          5122:                                                             next_code),
1.1       root     5123:                                    XEXP (XEXP (x, 0), 1)));
                   5124:        }
                   5125: 
                   5126:       /* If the constant is one less than a power of two, this might be
                   5127:         representable by an extraction even if no shift is present.
                   5128:         If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
                   5129:         we are in a COMPARE.  */
                   5130:       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
1.1.1.5 ! root     5131:        new = make_extraction (mode,
        !          5132:                               make_compound_operation (XEXP (x, 0),
        !          5133:                                                        next_code),
        !          5134:                               0, NULL_RTX, i, 1, 0, in_code == COMPARE);
1.1       root     5135: 
                   5136:       /* If we are in a comparison and this is an AND with a power of two,
                   5137:         convert this into the appropriate bit extract.  */
                   5138:       else if (in_code == COMPARE
                   5139:               && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
1.1.1.5 ! root     5140:        new = make_extraction (mode,
        !          5141:                               make_compound_operation (XEXP (x, 0),
        !          5142:                                                        next_code),
        !          5143:                               i, NULL_RTX, 1, 1, 0, 1);
1.1       root     5144: 
                   5145:       break;
                   5146: 
                   5147:     case LSHIFTRT:
                   5148:       /* If the sign bit is known to be zero, replace this with an
                   5149:         arithmetic shift.  */
1.1.1.4   root     5150:       if (ashr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing
                   5151:          && lshr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
                   5152:          && mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     5153:          && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
1.1       root     5154:        {
1.1.1.5 ! root     5155:          new = gen_rtx_combine (ASHIFTRT, mode,
        !          5156:                                 make_compound_operation (XEXP (x, 0),
        !          5157:                                                          next_code),
        !          5158:                                 XEXP (x, 1));
1.1       root     5159:          break;
                   5160:        }
                   5161: 
                   5162:       /* ... fall through ... */
                   5163: 
                   5164:     case ASHIFTRT:
                   5165:       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
                   5166:         this is a SIGN_EXTRACT.  */
                   5167:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
1.1.1.4   root     5168:          && GET_CODE (XEXP (x, 0)) == ASHIFT
                   5169:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   5170:          && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (x, 0), 1)))
1.1.1.5 ! root     5171:        {
        !          5172:          new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
        !          5173:          new = make_extraction (mode, new,
        !          5174:                                 (INTVAL (XEXP (x, 1))
        !          5175:                                  - INTVAL (XEXP (XEXP (x, 0), 1))),
        !          5176:                                 NULL_RTX, mode_width - INTVAL (XEXP (x, 1)),
        !          5177:                                 code == LSHIFTRT, 0, in_code == COMPARE);
        !          5178:        }
1.1.1.4   root     5179: 
                   5180:       /* Similarly if we have (ashifrt (OP (ashift foo C1) C3) C2).  In these
                   5181:         cases, we are better off returning a SIGN_EXTEND of the operation.  */
                   5182: 
                   5183:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   5184:          && (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND
                   5185:              || GET_CODE (XEXP (x, 0)) == XOR
                   5186:              || GET_CODE (XEXP (x, 0)) == PLUS)
                   5187:          && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
                   5188:          && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
                   5189:          && INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) < HOST_BITS_PER_WIDE_INT
1.1       root     5190:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1.1.1.5 ! root     5191:          && 0 == (INTVAL (XEXP (XEXP (x, 0), 1))
        !          5192:                   & (((HOST_WIDE_INT) 1
        !          5193:                       << (MIN (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)),
        !          5194:                                INTVAL (XEXP (x, 1)))
        !          5195:                           - 1)))))
        !          5196:        {
        !          5197:          rtx c1 = XEXP (XEXP (XEXP (x, 0), 0), 1);
        !          5198:          rtx c2 = XEXP (x, 1);
        !          5199:          rtx c3 = XEXP (XEXP (x, 0), 1);
        !          5200:          HOST_WIDE_INT newop1;
        !          5201:          rtx inner = XEXP (XEXP (XEXP (x, 0), 0), 0);
        !          5202: 
        !          5203:          /* If C1 > C2, INNER needs to have the shift performed on it
        !          5204:             for C1-C2 bits.  */
        !          5205:          if (INTVAL (c1) > INTVAL (c2))
        !          5206:            {
        !          5207:              inner = gen_binary (ASHIFT, mode, inner,
        !          5208:                                  GEN_INT (INTVAL (c1) - INTVAL (c2)));
        !          5209:              c1 = c2;
        !          5210:            }
        !          5211: 
        !          5212:          newop1 = INTVAL (c3) >> INTVAL (c1);
        !          5213:          new = make_compound_operation (inner,
        !          5214:                                         GET_CODE (XEXP (x, 0)) == PLUS
        !          5215:                                         ? MEM : GET_CODE (XEXP (x, 0)));
1.1.1.4   root     5216:          new = make_extraction (mode,
1.1.1.5 ! root     5217:                                 gen_binary (GET_CODE (XEXP (x, 0)), mode, new,
1.1.1.4   root     5218:                                             GEN_INT (newop1)),
1.1.1.5 ! root     5219:                                 INTVAL (c2) - INTVAL (c1),
        !          5220:                                 NULL_RTX, mode_width - INTVAL (c2),
1.1.1.4   root     5221:                                 code == LSHIFTRT, 0, in_code == COMPARE);
                   5222:        }
                   5223: 
                   5224:       /* Similarly for (ashiftrt (neg (ashift FOO C1)) C2).  */
                   5225:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   5226:          && GET_CODE (XEXP (x, 0)) == NEG
                   5227:          && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
                   5228:          && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
                   5229:          && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)))
1.1.1.5 ! root     5230:        {
        !          5231:          new = make_compound_operation (XEXP (XEXP (XEXP (x, 0), 0), 0),
        !          5232:                                         next_code);
        !          5233:          new = make_extraction (mode,
        !          5234:                                 gen_unary (GET_CODE (XEXP (x, 0)), mode,
        !          5235:                                            new, 0),
        !          5236:                                 (INTVAL (XEXP (x, 1))
        !          5237:                                  - INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))),
        !          5238:                                 NULL_RTX, mode_width - INTVAL (XEXP (x, 1)),
        !          5239:                                 code == LSHIFTRT, 0, in_code == COMPARE);
        !          5240:        }
1.1       root     5241:       break;
1.1.1.5 ! root     5242: 
        !          5243:     case SUBREG:
        !          5244:       /* Call ourselves recursively on the inner expression.  If we are
        !          5245:         narrowing the object and it has a different RTL code from
        !          5246:         what it originally did, do this SUBREG as a force_to_mode.  */
        !          5247: 
        !          5248:       tem = make_compound_operation (SUBREG_REG (x), in_code);
        !          5249:       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
        !          5250:          && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
        !          5251:          && subreg_lowpart_p (x))
        !          5252:        {
        !          5253:          rtx newer = force_to_mode (tem, mode,
        !          5254:                                     GET_MODE_BITSIZE (mode), NULL_RTX);
        !          5255: 
        !          5256:          /* If we have something other than a SUBREG, we might have
        !          5257:             done an expansion, so rerun outselves.  */
        !          5258:          if (GET_CODE (newer) != SUBREG)
        !          5259:            newer = make_compound_operation (newer, in_code);
        !          5260: 
        !          5261:          return newer;
        !          5262:        }
1.1       root     5263:     }
                   5264: 
                   5265:   if (new)
                   5266:     {
1.1.1.4   root     5267:       x = gen_lowpart_for_combine (mode, new);
1.1       root     5268:       code = GET_CODE (x);
                   5269:     }
                   5270: 
                   5271:   /* Now recursively process each operand of this operation.  */
                   5272:   fmt = GET_RTX_FORMAT (code);
                   5273:   for (i = 0; i < GET_RTX_LENGTH (code); i++)
                   5274:     if (fmt[i] == 'e')
                   5275:       {
                   5276:        new = make_compound_operation (XEXP (x, i), next_code);
                   5277:        SUBST (XEXP (x, i), new);
                   5278:       }
                   5279: 
                   5280:   return x;
                   5281: }
                   5282: 
                   5283: /* Given M see if it is a value that would select a field of bits
                   5284:     within an item, but not the entire word.  Return -1 if not.
                   5285:     Otherwise, return the starting position of the field, where 0 is the
                   5286:     low-order bit.
                   5287: 
                   5288:    *PLEN is set to the length of the field.  */
                   5289: 
                   5290: static int
                   5291: get_pos_from_mask (m, plen)
1.1.1.4   root     5292:      unsigned HOST_WIDE_INT m;
1.1       root     5293:      int *plen;
                   5294: {
                   5295:   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
                   5296:   int pos = exact_log2 (m & - m);
                   5297: 
                   5298:   if (pos < 0)
                   5299:     return -1;
                   5300: 
                   5301:   /* Now shift off the low-order zero bits and see if we have a power of
                   5302:      two minus 1.  */
                   5303:   *plen = exact_log2 ((m >> pos) + 1);
                   5304: 
                   5305:   if (*plen <= 0)
                   5306:     return -1;
                   5307: 
                   5308:   return pos;
                   5309: }
                   5310: 
1.1.1.2   root     5311: /* Rewrite X so that it is an expression in MODE.  We only care about the
                   5312:    low-order BITS bits so we can ignore AND operations that just clear
                   5313:    higher-order bits.
                   5314: 
                   5315:    Also, if REG is non-zero and X is a register equal in value to REG, 
                   5316:    replace X with REG.  */
                   5317: 
                   5318: static rtx
                   5319: force_to_mode (x, mode, bits, reg)
                   5320:      rtx x;
                   5321:      enum machine_mode mode;
                   5322:      int bits;
                   5323:      rtx reg;
                   5324: {
                   5325:   enum rtx_code code = GET_CODE (x);
1.1.1.4   root     5326:   enum machine_mode op_mode = mode;
1.1.1.2   root     5327: 
                   5328:   /* If X is narrower than MODE or if BITS is larger than the size of MODE,
                   5329:      just get X in the proper mode.  */
                   5330: 
                   5331:   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
                   5332:       || bits > GET_MODE_BITSIZE (mode))
                   5333:     return gen_lowpart_for_combine (mode, x);
                   5334: 
                   5335:   switch (code)
                   5336:     {
                   5337:     case SIGN_EXTEND:
                   5338:     case ZERO_EXTEND:
                   5339:     case ZERO_EXTRACT:
                   5340:     case SIGN_EXTRACT:
                   5341:       x = expand_compound_operation (x);
                   5342:       if (GET_CODE (x) != code)
                   5343:        return force_to_mode (x, mode, bits, reg);
                   5344:       break;
                   5345: 
                   5346:     case REG:
                   5347:       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
                   5348:                       || rtx_equal_p (reg, get_last_value (x))))
                   5349:        x = reg;
                   5350:       break;
                   5351: 
                   5352:     case CONST_INT:
1.1.1.4   root     5353:       if (bits < HOST_BITS_PER_WIDE_INT)
                   5354:        x = GEN_INT (INTVAL (x) & (((HOST_WIDE_INT) 1 << bits) - 1));
1.1.1.2   root     5355:       return x;
                   5356: 
                   5357:     case SUBREG:
                   5358:       /* Ignore low-order SUBREGs. */
                   5359:       if (subreg_lowpart_p (x))
                   5360:        return force_to_mode (SUBREG_REG (x), mode, bits, reg);
                   5361:       break;
                   5362: 
                   5363:     case AND:
                   5364:       /* If this is an AND with a constant.  Otherwise, we fall through to
                   5365:         do the general binary case.  */
                   5366: 
                   5367:       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
                   5368:        {
1.1.1.4   root     5369:          HOST_WIDE_INT mask = INTVAL (XEXP (x, 1));
1.1.1.2   root     5370:          int len = exact_log2 (mask + 1);
                   5371:          rtx op = XEXP (x, 0);
                   5372: 
                   5373:          /* If this is masking some low-order bits, we may be able to
                   5374:             impose a stricter constraint on what bits of the operand are
                   5375:             required.  */
                   5376: 
                   5377:          op = force_to_mode (op, mode, len > 0 ? MIN (len, bits) : bits,
                   5378:                              reg);
                   5379: 
1.1.1.4   root     5380:          if (bits < HOST_BITS_PER_WIDE_INT)
                   5381:            mask &= ((HOST_WIDE_INT) 1 << bits) - 1;
1.1.1.2   root     5382: 
1.1.1.4   root     5383:          /* If we have no AND in MODE, use the original mode for the
                   5384:             operation.  */
                   5385: 
                   5386:          if (and_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5387:            op_mode = GET_MODE (x);
                   5388: 
                   5389:          x = simplify_and_const_int (x, op_mode, op, mask);
1.1.1.2   root     5390: 
                   5391:          /* If X is still an AND, see if it is an AND with a mask that
                   5392:             is just some low-order bits.  If so, and it is BITS wide (it
                   5393:             can't be wider), we don't need it.  */
                   5394: 
                   5395:          if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
1.1.1.4   root     5396:              && bits < HOST_BITS_PER_WIDE_INT
                   5397:              && INTVAL (XEXP (x, 1)) == ((HOST_WIDE_INT) 1 << bits) - 1)
1.1.1.2   root     5398:            x = XEXP (x, 0);
1.1.1.4   root     5399: 
                   5400:          break;
1.1.1.2   root     5401:        }
                   5402: 
                   5403:       /* ... fall through ... */
                   5404: 
                   5405:     case PLUS:
                   5406:     case MINUS:
                   5407:     case MULT:
                   5408:     case IOR:
                   5409:     case XOR:
                   5410:       /* For most binary operations, just propagate into the operation and
1.1.1.4   root     5411:         change the mode if we have an operation of that mode.  */
1.1.1.2   root     5412: 
1.1.1.4   root     5413:       if ((code == PLUS
                   5414:           && add_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5415:          || (code == MINUS
                   5416:              && sub_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5417:          || (code == MULT && (smul_optab->handlers[(int) mode].insn_code
                   5418:                               == CODE_FOR_nothing))
                   5419:          || (code == AND
                   5420:              && and_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5421:          || (code == IOR
                   5422:              && ior_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5423:          || (code == XOR && (xor_optab->handlers[(int) mode].insn_code
                   5424:                              == CODE_FOR_nothing)))
                   5425:        op_mode = GET_MODE (x);
                   5426: 
                   5427:       x = gen_binary (code, op_mode,
                   5428:                      gen_lowpart_for_combine (op_mode,
                   5429:                                               force_to_mode (XEXP (x, 0),
                   5430:                                                              mode, bits,
                   5431:                                                              reg)),
                   5432:                      gen_lowpart_for_combine (op_mode,
                   5433:                                               force_to_mode (XEXP (x, 1),
                   5434:                                                              mode, bits,
                   5435:                                                              reg)));
                   5436:       break;
1.1.1.2   root     5437: 
                   5438:     case ASHIFT:
                   5439:     case LSHIFT:
                   5440:       /* For left shifts, do the same, but just for the first operand.
1.1.1.5 ! root     5441:         However, we cannot do anything with shifts where we cannot
        !          5442:         guarantee that the counts are smaller than the size of the mode
        !          5443:         because such a count will have a different meaning in a
        !          5444:         wider mode.
        !          5445: 
        !          5446:         If we can narrow the shift and know the count, we need even fewer
        !          5447:         bits of the first operand.  */
        !          5448: 
        !          5449:       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
        !          5450:             && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
        !          5451:          && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
        !          5452:                && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
        !          5453:                    < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
        !          5454:        break;
        !          5455:        
1.1.1.2   root     5456:       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) < bits)
                   5457:        bits -= INTVAL (XEXP (x, 1));
                   5458: 
1.1.1.4   root     5459:       if ((code == ASHIFT
                   5460:           && ashl_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5461:          || (code == LSHIFT && (lshl_optab->handlers[(int) mode].insn_code
                   5462:                                 == CODE_FOR_nothing)))
                   5463:        op_mode = GET_MODE (x);
                   5464: 
                   5465:       x =  gen_binary (code, op_mode,
                   5466:                       gen_lowpart_for_combine (op_mode,
                   5467:                                                force_to_mode (XEXP (x, 0),
                   5468:                                                               mode, bits,
                   5469:                                                               reg)),
                   5470:                       XEXP (x, 1));
                   5471:       break;
1.1.1.2   root     5472: 
                   5473:     case LSHIFTRT:
                   5474:       /* Here we can only do something if the shift count is a constant and
1.1.1.5 ! root     5475:         the count plus BITS is no larger than the width of MODE.  In that
        !          5476:         case, we can do the shift in MODE.  */
1.1.1.2   root     5477: 
                   5478:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   5479:          && INTVAL (XEXP (x, 1)) + bits <= GET_MODE_BITSIZE (mode))
1.1.1.4   root     5480:        {
                   5481:          rtx inner = force_to_mode (XEXP (x, 0), mode,
                   5482:                                     bits + INTVAL (XEXP (x, 1)), reg);
                   5483: 
                   5484:          if (lshr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5485:            op_mode = GET_MODE (x);
                   5486: 
                   5487:          x = gen_binary (LSHIFTRT, op_mode,
                   5488:                          gen_lowpart_for_combine (op_mode, inner),
                   5489:                          XEXP (x, 1));
                   5490:        }
                   5491:       break;
                   5492: 
                   5493:     case ASHIFTRT:
                   5494:       /* If this is a sign-extension operation that just affects bits
                   5495:         we don't care about, remove it.  */
                   5496: 
                   5497:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   5498:          && INTVAL (XEXP (x, 1)) >= 0
                   5499:          && INTVAL (XEXP (x, 1)) <= GET_MODE_BITSIZE (GET_MODE (x)) - bits
                   5500:          && GET_CODE (XEXP (x, 0)) == ASHIFT
                   5501:          && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
                   5502:          && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1)))
                   5503:        return force_to_mode (XEXP (XEXP (x, 0), 0), mode, bits, reg);
1.1.1.2   root     5504:       break;
                   5505: 
                   5506:     case NEG:
                   5507:     case NOT:
1.1.1.4   root     5508:       if ((code == NEG
                   5509:           && neg_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   5510:          || (code == NOT && (one_cmpl_optab->handlers[(int) mode].insn_code
                   5511:                              == CODE_FOR_nothing)))
                   5512:        op_mode = GET_MODE (x);
                   5513: 
1.1.1.2   root     5514:       /* Handle these similarly to the way we handle most binary operations. */
1.1.1.4   root     5515:       x = gen_unary (code, op_mode,
                   5516:                     gen_lowpart_for_combine (op_mode,
                   5517:                                              force_to_mode (XEXP (x, 0), mode,
                   5518:                                                             bits, reg)));
                   5519:       break;
                   5520: 
                   5521:     case IF_THEN_ELSE:
                   5522:       /* We have no way of knowing if the IF_THEN_ELSE can itself be
                   5523:         written in a narrower mode.  We play it safe and do not do so.  */
                   5524: 
                   5525:       SUBST (XEXP (x, 1),
                   5526:             gen_lowpart_for_combine (GET_MODE (x),
                   5527:                                      force_to_mode (XEXP (x, 1), mode,
                   5528:                                                     bits, reg)));
                   5529:       SUBST (XEXP (x, 2),
                   5530:             gen_lowpart_for_combine (GET_MODE (x),
                   5531:                                      force_to_mode (XEXP (x, 2), mode,
                   5532:                                                     bits, reg)));
                   5533:       break;
1.1.1.2   root     5534:     }
                   5535: 
1.1.1.4   root     5536:   /* Ensure we return a value of the proper mode.  */
1.1.1.2   root     5537:   return gen_lowpart_for_combine (mode, x);
                   5538: }
                   5539: 
1.1.1.4   root     5540: /* Return the value of expression X given the fact that condition COND
                   5541:    is known to be true when applied to REG as its first operand and VAL
                   5542:    as its second.  X is known to not be shared and so can be modified in
                   5543:    place.
                   5544: 
                   5545:    We only handle the simplest cases, and specifically those cases that
                   5546:    arise with IF_THEN_ELSE expressions.  */
                   5547: 
                   5548: static rtx
                   5549: known_cond (x, cond, reg, val)
                   5550:      rtx x;
                   5551:      enum rtx_code cond;
                   5552:      rtx reg, val;
                   5553: {
                   5554:   enum rtx_code code = GET_CODE (x);
                   5555:   rtx new, temp;
                   5556:   char *fmt;
                   5557:   int i, j;
                   5558: 
                   5559:   if (side_effects_p (x))
                   5560:     return x;
                   5561: 
                   5562:   if (cond == EQ && rtx_equal_p (x, reg))
                   5563:     return val;
                   5564: 
                   5565:   /* If X is (abs REG) and we know something about REG's relationship
                   5566:      with zero, we may be able to simplify this.  */
                   5567: 
                   5568:   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
                   5569:     switch (cond)
                   5570:       {
                   5571:       case GE:  case GT:  case EQ:
                   5572:        return XEXP (x, 0);
                   5573:       case LT:  case LE:
                   5574:        return gen_unary (NEG, GET_MODE (XEXP (x, 0)), XEXP (x, 0));
                   5575:       }
                   5576: 
                   5577:   /* The only other cases we handle are MIN, MAX, and comparisons if the
                   5578:      operands are the same as REG and VAL.  */
                   5579: 
                   5580:   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
                   5581:     {
                   5582:       if (rtx_equal_p (XEXP (x, 0), val))
                   5583:        cond = swap_condition (cond), temp = val, val = reg, reg = temp;
                   5584: 
                   5585:       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
                   5586:        {
                   5587:          if (GET_RTX_CLASS (code) == '<')
                   5588:            return (comparison_dominates_p (cond, code) ? const_true_rtx
                   5589:                    : (comparison_dominates_p (cond,
                   5590:                                               reverse_condition (code))
                   5591:                       ? const0_rtx : x));
                   5592: 
                   5593:          else if (code == SMAX || code == SMIN
                   5594:                   || code == UMIN || code == UMAX)
                   5595:            {
                   5596:              int unsignedp = (code == UMIN || code == UMAX);
                   5597: 
                   5598:              if (code == SMAX || code == UMAX)
                   5599:                cond = reverse_condition (cond);
                   5600: 
                   5601:              switch (cond)
                   5602:                {
                   5603:                case GE:   case GT:
                   5604:                  return unsignedp ? x : XEXP (x, 1);
                   5605:                case LE:   case LT:
                   5606:                  return unsignedp ? x : XEXP (x, 0);
                   5607:                case GEU:  case GTU:
                   5608:                  return unsignedp ? XEXP (x, 1) : x;
                   5609:                case LEU:  case LTU:
                   5610:                  return unsignedp ? XEXP (x, 0) : x;
                   5611:                }
                   5612:            }
                   5613:        }
                   5614:     }
                   5615: 
                   5616:   fmt = GET_RTX_FORMAT (code);
                   5617:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   5618:     {
                   5619:       if (fmt[i] == 'e')
                   5620:        SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
                   5621:       else if (fmt[i] == 'E')
                   5622:        for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   5623:          SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
                   5624:                                                cond, reg, val));
                   5625:     }
                   5626: 
                   5627:   return x;
                   5628: }
                   5629: 
1.1       root     5630: /* See if X, a SET operation, can be rewritten as a bit-field assignment.
                   5631:    Return that assignment if so.
                   5632: 
                   5633:    We only handle the most common cases.  */
                   5634: 
                   5635: static rtx
                   5636: make_field_assignment (x)
                   5637:      rtx x;
                   5638: {
                   5639:   rtx dest = SET_DEST (x);
                   5640:   rtx src = SET_SRC (x);
1.1.1.2   root     5641:   rtx ourdest;
                   5642:   rtx assign;
1.1.1.4   root     5643:   HOST_WIDE_INT c1;
                   5644:   int pos, len;
1.1.1.2   root     5645:   rtx other;
                   5646:   enum machine_mode mode;
1.1       root     5647: 
                   5648:   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
                   5649:      a clear of a one-bit field.  We will have changed it to
                   5650:      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
                   5651:      for a SUBREG.  */
                   5652: 
                   5653:   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
                   5654:       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
                   5655:       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
1.1.1.2   root     5656:       && (rtx_equal_p (dest, XEXP (src, 1))
                   5657:          || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
                   5658:          || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
1.1       root     5659:     {
1.1.1.5 ! root     5660:       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
1.1       root     5661:                                1, 1, 1, 0);
1.1.1.2   root     5662:       return gen_rtx (SET, VOIDmode, assign, const0_rtx);
1.1       root     5663:     }
                   5664: 
                   5665:   else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
                   5666:           && subreg_lowpart_p (XEXP (src, 0))
                   5667:           && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) 
                   5668:               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
                   5669:           && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
                   5670:           && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
1.1.1.2   root     5671:           && (rtx_equal_p (dest, XEXP (src, 1))
                   5672:               || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
                   5673:               || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
1.1       root     5674:     {
1.1.1.5 ! root     5675:       assign = make_extraction (VOIDmode, dest, 0,
1.1       root     5676:                                XEXP (SUBREG_REG (XEXP (src, 0)), 1),
                   5677:                                1, 1, 1, 0);
1.1.1.2   root     5678:       return gen_rtx (SET, VOIDmode, assign, const0_rtx);
1.1       root     5679:     }
                   5680: 
                   5681:   /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a
                   5682:      one-bit field.  */
                   5683:   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
                   5684:           && XEXP (XEXP (src, 0), 0) == const1_rtx
1.1.1.2   root     5685:           && (rtx_equal_p (dest, XEXP (src, 1))
                   5686:               || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
                   5687:               || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
1.1       root     5688:     {
1.1.1.5 ! root     5689:       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
1.1       root     5690:                                1, 1, 1, 0);
1.1.1.2   root     5691:       return gen_rtx (SET, VOIDmode, assign, const1_rtx);
1.1       root     5692:     }
                   5693: 
1.1.1.2   root     5694:   /* The other case we handle is assignments into a constant-position
                   5695:      field.  They look like (ior (and DEST C1) OTHER).  If C1 represents
                   5696:      a mask that has all one bits except for a group of zero bits and
                   5697:      OTHER is known to have zeros where C1 has ones, this is such an
                   5698:      assignment.  Compute the position and length from C1.  Shift OTHER
                   5699:      to the appropriate position, force it to the required mode, and
                   5700:      make the extraction.  Check for the AND in both operands.  */
                   5701: 
                   5702:   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == AND
                   5703:       && GET_CODE (XEXP (XEXP (src, 0), 1)) == CONST_INT
                   5704:       && (rtx_equal_p (XEXP (XEXP (src, 0), 0), dest)
                   5705:          || rtx_equal_p (XEXP (XEXP (src, 0), 0), get_last_value (dest))
                   5706:          || rtx_equal_p (get_last_value (XEXP (XEXP (src, 0), 1)), dest)))
                   5707:     c1 = INTVAL (XEXP (XEXP (src, 0), 1)), other = XEXP (src, 1);
                   5708:   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 1)) == AND
                   5709:           && GET_CODE (XEXP (XEXP (src, 1), 1)) == CONST_INT
                   5710:           && (rtx_equal_p (XEXP (XEXP (src, 1), 0), dest)
                   5711:               || rtx_equal_p (XEXP (XEXP (src, 1), 0), get_last_value (dest))
                   5712:               || rtx_equal_p (get_last_value (XEXP (XEXP (src, 1), 0)),
                   5713:                               dest)))
                   5714:     c1 = INTVAL (XEXP (XEXP (src, 1), 1)), other = XEXP (src, 0);
                   5715:   else
                   5716:     return x;
1.1       root     5717: 
1.1.1.2   root     5718:   pos = get_pos_from_mask (~c1, &len);
                   5719:   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
1.1.1.4   root     5720:       || (GET_MODE_BITSIZE (GET_MODE (other)) <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     5721:          && (c1 & nonzero_bits (other, GET_MODE (other))) != 0))
1.1.1.2   root     5722:     return x;
1.1       root     5723: 
1.1.1.4   root     5724:   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
1.1       root     5725: 
1.1.1.2   root     5726:   /* The mode to use for the source is the mode of the assignment, or of
                   5727:      what is inside a possible STRICT_LOW_PART.  */
                   5728:   mode = (GET_CODE (assign) == STRICT_LOW_PART 
                   5729:          ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
1.1       root     5730: 
1.1.1.2   root     5731:   /* Shift OTHER right POS places and make it the source, restricting it
                   5732:      to the proper length and mode.  */
1.1       root     5733: 
1.1.1.4   root     5734:   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
                   5735:                                             GET_MODE (src), other, pos),
1.1.1.2   root     5736:                       mode, len, dest);
1.1       root     5737: 
1.1.1.2   root     5738:   return gen_rtx_combine (SET, VOIDmode, assign, src);
1.1       root     5739: }
                   5740: 
                   5741: /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
                   5742:    if so.  */
                   5743: 
                   5744: static rtx
                   5745: apply_distributive_law (x)
                   5746:      rtx x;
                   5747: {
                   5748:   enum rtx_code code = GET_CODE (x);
                   5749:   rtx lhs, rhs, other;
                   5750:   rtx tem;
                   5751:   enum rtx_code inner_code;
                   5752: 
1.1.1.5 ! root     5753:   /* Distributivity is not true for floating point.
        !          5754:      It can change the value.  So don't do it.
        !          5755:      -- rms and [email protected].  */
        !          5756:   if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
        !          5757:     return x;
        !          5758: 
1.1       root     5759:   /* The outer operation can only be one of the following:  */
                   5760:   if (code != IOR && code != AND && code != XOR
                   5761:       && code != PLUS && code != MINUS)
                   5762:     return x;
                   5763: 
                   5764:   lhs = XEXP (x, 0), rhs = XEXP (x, 1);
                   5765: 
1.1.1.2   root     5766:   /* If either operand is a primitive we can't do anything, so get out fast. */
1.1       root     5767:   if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o'
1.1.1.2   root     5768:       || GET_RTX_CLASS (GET_CODE (rhs)) == 'o')
1.1       root     5769:     return x;
                   5770: 
                   5771:   lhs = expand_compound_operation (lhs);
                   5772:   rhs = expand_compound_operation (rhs);
                   5773:   inner_code = GET_CODE (lhs);
                   5774:   if (inner_code != GET_CODE (rhs))
                   5775:     return x;
                   5776: 
                   5777:   /* See if the inner and outer operations distribute.  */
                   5778:   switch (inner_code)
                   5779:     {
                   5780:     case LSHIFTRT:
                   5781:     case ASHIFTRT:
                   5782:     case AND:
                   5783:     case IOR:
                   5784:       /* These all distribute except over PLUS.  */
                   5785:       if (code == PLUS || code == MINUS)
                   5786:        return x;
                   5787:       break;
                   5788: 
                   5789:     case MULT:
                   5790:       if (code != PLUS && code != MINUS)
                   5791:        return x;
                   5792:       break;
                   5793: 
                   5794:     case ASHIFT:
                   5795:     case LSHIFT:
                   5796:       /* These are also multiplies, so they distribute over everything.  */
                   5797:       break;
                   5798: 
                   5799:     case SUBREG:
1.1.1.2   root     5800:       /* Non-paradoxical SUBREGs distributes over all operations, provided
                   5801:         the inner modes and word numbers are the same, this is an extraction
1.1.1.3   root     5802:         of a low-order part, we don't convert an fp operation to int or
                   5803:         vice versa, and we would not be converting a single-word
1.1.1.2   root     5804:         operation into a multi-word operation.  The latter test is not
1.1.1.3   root     5805:         required, but it prevents generating unneeded multi-word operations.
1.1.1.2   root     5806:         Some of the previous tests are redundant given the latter test, but
                   5807:         are retained because they are required for correctness.
                   5808: 
                   5809:         We produce the result slightly differently in this case.  */
                   5810: 
                   5811:       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
                   5812:          || SUBREG_WORD (lhs) != SUBREG_WORD (rhs)
                   5813:          || ! subreg_lowpart_p (lhs)
1.1.1.3   root     5814:          || (GET_MODE_CLASS (GET_MODE (lhs))
                   5815:              != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
1.1.1.2   root     5816:          || (GET_MODE_SIZE (GET_MODE (lhs))
                   5817:              < GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
                   5818:          || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
1.1       root     5819:        return x;
                   5820: 
                   5821:       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
                   5822:                        SUBREG_REG (lhs), SUBREG_REG (rhs));
                   5823:       return gen_lowpart_for_combine (GET_MODE (x), tem);
                   5824: 
                   5825:     default:
                   5826:       return x;
                   5827:     }
                   5828: 
                   5829:   /* Set LHS and RHS to the inner operands (A and B in the example
                   5830:      above) and set OTHER to the common operand (C in the example).
                   5831:      These is only one way to do this unless the inner operation is
                   5832:      commutative.  */
                   5833:   if (GET_RTX_CLASS (inner_code) == 'c'
                   5834:       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
                   5835:     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
                   5836:   else if (GET_RTX_CLASS (inner_code) == 'c'
                   5837:           && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
                   5838:     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
                   5839:   else if (GET_RTX_CLASS (inner_code) == 'c'
                   5840:           && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
                   5841:     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
                   5842:   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
                   5843:     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
                   5844:   else
                   5845:     return x;
                   5846: 
                   5847:   /* Form the new inner operation, seeing if it simplifies first.  */
                   5848:   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
                   5849: 
                   5850:   /* There is one exception to the general way of distributing:
                   5851:      (a ^ b) | (a ^ c) -> (~a) & (b ^ c)  */
                   5852:   if (code == XOR && inner_code == IOR)
                   5853:     {
                   5854:       inner_code = AND;
                   5855:       other = gen_unary (NOT, GET_MODE (x), other);
                   5856:     }
                   5857: 
                   5858:   /* We may be able to continuing distributing the result, so call
                   5859:      ourselves recursively on the inner operation before forming the
                   5860:      outer operation, which we return.  */
                   5861:   return gen_binary (inner_code, GET_MODE (x),
                   5862:                     apply_distributive_law (tem), other);
                   5863: }
                   5864: 
                   5865: /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
                   5866:    in MODE.
                   5867: 
                   5868:    Return an equivalent form, if different from X.  Otherwise, return X.  If
                   5869:    X is zero, we are to always construct the equivalent form.  */
                   5870: 
                   5871: static rtx
                   5872: simplify_and_const_int (x, mode, varop, constop)
                   5873:      rtx x;
                   5874:      enum machine_mode mode;
                   5875:      rtx varop;
1.1.1.4   root     5876:      unsigned HOST_WIDE_INT constop;
1.1       root     5877: {
                   5878:   register enum machine_mode tmode;
                   5879:   register rtx temp;
1.1.1.5 ! root     5880:   unsigned HOST_WIDE_INT nonzero;
1.1       root     5881: 
                   5882:   /* There is a large class of optimizations based on the principle that
                   5883:      some operations produce results where certain bits are known to be zero,
                   5884:      and hence are not significant to the AND.  For example, if we have just
                   5885:      done a left shift of one bit, the low-order bit is known to be zero and
                   5886:      hence an AND with a mask of ~1 would not do anything.
                   5887: 
                   5888:      At the end of the following loop, we set:
                   5889: 
                   5890:      VAROP to be the item to be AND'ed with;
                   5891:      CONSTOP to the constant value to AND it with.  */
                   5892: 
                   5893:   while (1)
                   5894:     {
1.1.1.4   root     5895:       /* If we ever encounter a mode wider than the host machine's widest
                   5896:         integer size, we can't compute the masks accurately, so give up.  */
                   5897:       if (GET_MODE_BITSIZE (GET_MODE (varop)) > HOST_BITS_PER_WIDE_INT)
1.1       root     5898:        break;
                   5899: 
                   5900:       /* Unless one of the cases below does a `continue',
                   5901:         a `break' will be executed to exit the loop.  */
                   5902: 
                   5903:       switch (GET_CODE (varop))
                   5904:        {
                   5905:        case CLOBBER:
                   5906:          /* If VAROP is a (clobber (const_int)), return it since we know
                   5907:             we are generating something that won't match. */
                   5908:          return varop;
                   5909: 
                   5910: #if ! BITS_BIG_ENDIAN
                   5911:        case USE:
                   5912:          /* VAROP is a (use (mem ..)) that was made from a bit-field
                   5913:             extraction that spanned the boundary of the MEM.  If we are
                   5914:             now masking so it is within that boundary, we don't need the
                   5915:             USE any more.  */
                   5916:          if ((constop & ~ GET_MODE_MASK (GET_MODE (XEXP (varop, 0)))) == 0)
                   5917:            {
                   5918:              varop = XEXP (varop, 0);
                   5919:              continue;
                   5920:            }
                   5921:          break;
                   5922: #endif
                   5923: 
                   5924:        case SUBREG:
                   5925:          if (subreg_lowpart_p (varop)
                   5926:              /* We can ignore the effect this SUBREG if it narrows the mode
1.1.1.4   root     5927:                 or, on machines where byte operations extend, if the
1.1       root     5928:                 constant masks to zero all the bits the mode doesn't have.  */
                   5929:              && ((GET_MODE_SIZE (GET_MODE (varop))
                   5930:                   < GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))))
1.1.1.5 ! root     5931: #ifdef BYTE_LOADS_EXTEND
1.1       root     5932:                  || (0 == (constop
                   5933:                            & GET_MODE_MASK (GET_MODE (varop))
                   5934:                            & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (varop)))))
                   5935: #endif
                   5936:                  ))
                   5937:            {
                   5938:              varop = SUBREG_REG (varop);
                   5939:              continue;
                   5940:            }
                   5941:          break;
                   5942: 
                   5943:        case ZERO_EXTRACT:
                   5944:        case SIGN_EXTRACT:
                   5945:        case ZERO_EXTEND:
                   5946:        case SIGN_EXTEND:
                   5947:          /* Try to expand these into a series of shifts and then work
                   5948:             with that result.  If we can't, for example, if the extract
                   5949:             isn't at a fixed position, give up.  */
                   5950:          temp = expand_compound_operation (varop);
                   5951:          if (temp != varop)
                   5952:            {
                   5953:              varop = temp;
                   5954:              continue;
                   5955:            }
                   5956:          break;
                   5957: 
                   5958:        case AND:
                   5959:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT)
                   5960:            {
                   5961:              constop &= INTVAL (XEXP (varop, 1));
                   5962:              varop = XEXP (varop, 0);
                   5963:              continue;
                   5964:            }
                   5965:          break;
                   5966: 
                   5967:        case IOR:
                   5968:        case XOR:
                   5969:          /* If VAROP is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
                   5970:             LSHIFT so we end up with an (and (lshiftrt (ior ...) ...) ...)
1.1.1.5 ! root     5971:             operation which may be a bitfield extraction.  Ensure
        !          5972:             that the constant we form is not wider than the mode of
        !          5973:             VAROP.  */
1.1       root     5974: 
                   5975:          if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT
                   5976:              && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
                   5977:              && INTVAL (XEXP (XEXP (varop, 0), 1)) >= 0
1.1.1.4   root     5978:              && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT
1.1       root     5979:              && GET_CODE (XEXP (varop, 1)) == CONST_INT
1.1.1.5 ! root     5980:              && ((INTVAL (XEXP (XEXP (varop, 0), 1))
        !          5981:                  + floor_log2 (INTVAL (XEXP (varop, 1))))
        !          5982:                  < GET_MODE_BITSIZE (GET_MODE (varop)))
1.1       root     5983:              && (INTVAL (XEXP (varop, 1))
1.1.1.5 ! root     5984:                  & ~ nonzero_bits (XEXP (varop, 0), GET_MODE (varop)) == 0))
1.1       root     5985:            {
1.1.1.4   root     5986:              temp = GEN_INT ((INTVAL (XEXP (varop, 1)) & constop)
                   5987:                              << INTVAL (XEXP (XEXP (varop, 0), 1)));
1.1       root     5988:              temp = gen_binary (GET_CODE (varop), GET_MODE (varop),
                   5989:                                 XEXP (XEXP (varop, 0), 0), temp);
                   5990:              varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
                   5991:                                       temp, XEXP (varop, 1));
                   5992:              continue;
                   5993:            }
                   5994: 
                   5995:          /* Apply the AND to both branches of the IOR or XOR, then try to
                   5996:             apply the distributive law.  This may eliminate operations 
                   5997:             if either branch can be simplified because of the AND.
                   5998:             It may also make some cases more complex, but those cases
                   5999:             probably won't match a pattern either with or without this.  */
                   6000:          return 
                   6001:            gen_lowpart_for_combine
                   6002:              (mode, apply_distributive_law
                   6003:               (gen_rtx_combine
                   6004:                (GET_CODE (varop), GET_MODE (varop),
1.1.1.4   root     6005:                 simplify_and_const_int (NULL_RTX, GET_MODE (varop),
1.1       root     6006:                                         XEXP (varop, 0), constop),
1.1.1.4   root     6007:                 simplify_and_const_int (NULL_RTX, GET_MODE (varop),
1.1       root     6008:                                         XEXP (varop, 1), constop))));
                   6009: 
                   6010:        case NOT:
1.1.1.5 ! root     6011:          /* (and (not FOO)) is (and (xor FOO CONST)), so if FOO is an
        !          6012:             LSHIFTRT, we can do the same as above.  Ensure that the constant
        !          6013:             we form is not wider than the mode of VAROP.  */
1.1       root     6014: 
                   6015:          if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT
                   6016:              && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
                   6017:              && INTVAL (XEXP (XEXP (varop, 0), 1)) >= 0
1.1.1.5 ! root     6018:              && (INTVAL (XEXP (XEXP (varop, 0), 1)) + floor_log2 (constop)
        !          6019:                  < GET_MODE_BITSIZE (GET_MODE (varop)))
1.1.1.4   root     6020:              && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT)
1.1       root     6021:            {
1.1.1.4   root     6022:              temp = GEN_INT (constop << INTVAL (XEXP (XEXP (varop, 0), 1)));
1.1       root     6023:              temp = gen_binary (XOR, GET_MODE (varop),
                   6024:                                 XEXP (XEXP (varop, 0), 0), temp);
                   6025:              varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
                   6026:                                       temp, XEXP (XEXP (varop, 0), 1));
                   6027:              continue;
                   6028:            }
                   6029:          break;
                   6030: 
                   6031:        case ASHIFTRT:
                   6032:          /* If we are just looking for the sign bit, we don't need this
                   6033:             shift at all, even if it has a variable count.  */
1.1.1.4   root     6034:          if (constop == ((HOST_WIDE_INT) 1
                   6035:                          << (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)))
1.1       root     6036:            {
                   6037:              varop = XEXP (varop, 0);
                   6038:              continue;
                   6039:            }
                   6040: 
                   6041:          /* If this is a shift by a constant, get a mask that contains
                   6042:             those bits that are not copies of the sign bit.  We then have
                   6043:             two cases:  If CONSTOP only includes those bits, this can be
                   6044:             a logical shift, which may allow simplifications.  If CONSTOP
                   6045:             is a single-bit field not within those bits, we are requesting
                   6046:             a copy of the sign bit and hence can shift the sign bit to
                   6047:             the appropriate location.  */
                   6048:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   6049:              && INTVAL (XEXP (varop, 1)) >= 0
1.1.1.4   root     6050:              && INTVAL (XEXP (varop, 1)) < HOST_BITS_PER_WIDE_INT)
1.1       root     6051:            {
                   6052:              int i = -1;
                   6053: 
1.1.1.5 ! root     6054:              nonzero = GET_MODE_MASK (GET_MODE (varop));
        !          6055:              nonzero >>= INTVAL (XEXP (varop, 1));
1.1       root     6056: 
1.1.1.5 ! root     6057:              if ((constop & ~ nonzero) == 0
1.1       root     6058:                  || (i = exact_log2 (constop)) >= 0)
                   6059:                {
                   6060:                  varop = simplify_shift_const
                   6061:                    (varop, LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
                   6062:                     i < 0 ? INTVAL (XEXP (varop, 1))
                   6063:                     : GET_MODE_BITSIZE (GET_MODE (varop)) - 1 - i);
                   6064:                  if (GET_CODE (varop) != ASHIFTRT)
                   6065:                    continue;
                   6066:                }
                   6067:            }
                   6068: 
                   6069:          /* If our mask is 1, convert this to a LSHIFTRT.  This can be done
                   6070:             even if the shift count isn't a constant.  */
                   6071:          if (constop == 1)
                   6072:            varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
                   6073:                                     XEXP (varop, 0), XEXP (varop, 1));
                   6074:          break;
                   6075: 
1.1.1.5 ! root     6076:        case LSHIFTRT:
        !          6077:          /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
        !          6078:             shift and AND produces only copies of the sign bit (C2 is one less
        !          6079:             than a power of two), we can do this with just a shift.  */
        !          6080: 
        !          6081:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
        !          6082:              && ((INTVAL (XEXP (varop, 1))
        !          6083:                   + num_sign_bit_copies (XEXP (varop, 0),
        !          6084:                                          GET_MODE (XEXP (varop, 0))))
        !          6085:                  >= GET_MODE_BITSIZE (GET_MODE (varop)))
        !          6086:              && exact_log2 (constop + 1) >= 0)
        !          6087:            varop
        !          6088:              = gen_rtx_combine (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
        !          6089:                                 GEN_INT (GET_MODE_BITSIZE (GET_MODE (varop))
        !          6090:                                          - exact_log2 (constop + 1)));
        !          6091:          break;
        !          6092: 
1.1       root     6093:        case NE:
                   6094:          /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is
1.1.1.5 ! root     6095:             included in STORE_FLAG_VALUE and FOO has no bits that might be
        !          6096:             nonzero not in CONST.  */
1.1       root     6097:          if ((constop & ~ STORE_FLAG_VALUE) == 0
                   6098:              && XEXP (varop, 0) == const0_rtx
1.1.1.5 ! root     6099:              && (nonzero_bits (XEXP (varop, 0), mode) & ~ constop) == 0)
1.1       root     6100:            {
                   6101:              varop = XEXP (varop, 0);
                   6102:              continue;
                   6103:            }
                   6104:          break;
                   6105: 
                   6106:        case PLUS:
                   6107:          /* In (and (plus FOO C1) M), if M is a mask that just turns off
                   6108:             low-order bits (as in an alignment operation) and FOO is already
                   6109:             aligned to that boundary, we can convert remove this AND
                   6110:             and possibly the PLUS if it is now adding zero.  */
                   6111:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   6112:              && exact_log2 (-constop) >= 0
1.1.1.5 ! root     6113:              && (nonzero_bits (XEXP (varop, 0), mode) & ~ constop) == 0)
1.1       root     6114:            {
                   6115:              varop = plus_constant (XEXP (varop, 0),
                   6116:                                     INTVAL (XEXP (varop, 1)) & constop);
                   6117:              constop = ~0;
                   6118:              break;
                   6119:            }
                   6120: 
                   6121:          /* ... fall through ... */
                   6122: 
                   6123:        case MINUS:
                   6124:          /* In (and (plus (and FOO M1) BAR) M2), if M1 and M2 are one
                   6125:             less than powers of two and M2 is narrower than M1, we can
                   6126:             eliminate the inner AND.  This occurs when incrementing
                   6127:             bit fields.  */
                   6128: 
                   6129:          if (GET_CODE (XEXP (varop, 0)) == ZERO_EXTRACT
                   6130:              || GET_CODE (XEXP (varop, 0)) == ZERO_EXTEND)
                   6131:            SUBST (XEXP (varop, 0),
                   6132:                   expand_compound_operation (XEXP (varop, 0)));
                   6133: 
                   6134:          if (GET_CODE (XEXP (varop, 0)) == AND
                   6135:              && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
                   6136:              && exact_log2 (constop + 1) >= 0
                   6137:              && exact_log2 (INTVAL (XEXP (XEXP (varop, 0), 1)) + 1) >= 0
                   6138:              && (~ INTVAL (XEXP (XEXP (varop, 0), 1)) & constop) == 0)
                   6139:            SUBST (XEXP (varop, 0), XEXP (XEXP (varop, 0), 0));
                   6140:          break;
                   6141:        }
                   6142: 
                   6143:       break;
                   6144:     }
                   6145: 
                   6146:   /* If we have reached a constant, this whole thing is constant.  */
                   6147:   if (GET_CODE (varop) == CONST_INT)
1.1.1.4   root     6148:     return GEN_INT (constop & INTVAL (varop));
1.1       root     6149: 
1.1.1.5 ! root     6150:   /* See what bits may be nonzero in VAROP.  Unlike the general case of
        !          6151:      a call to nonzero_bits, here we don't care about bits outside
        !          6152:      MODE.  */
        !          6153: 
        !          6154:   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
1.1       root     6155: 
                   6156:   /* Turn off all bits in the constant that are known to already be zero.
1.1.1.5 ! root     6157:      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
1.1       root     6158:      which is tested below.  */
                   6159: 
1.1.1.5 ! root     6160:   constop &= nonzero;
1.1       root     6161: 
                   6162:   /* If we don't have any bits left, return zero.  */
                   6163:   if (constop == 0)
                   6164:     return const0_rtx;
                   6165: 
                   6166:   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
                   6167:      if we already had one (just check for the simplest cases).  */
                   6168:   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
                   6169:       && GET_MODE (XEXP (x, 0)) == mode
                   6170:       && SUBREG_REG (XEXP (x, 0)) == varop)
                   6171:     varop = XEXP (x, 0);
                   6172:   else
                   6173:     varop = gen_lowpart_for_combine (mode, varop);
                   6174: 
                   6175:   /* If we can't make the SUBREG, try to return what we were given. */
                   6176:   if (GET_CODE (varop) == CLOBBER)
                   6177:     return x ? x : varop;
                   6178: 
                   6179:   /* If we are only masking insignificant bits, return VAROP.  */
1.1.1.5 ! root     6180:   if (constop == nonzero)
1.1       root     6181:     x = varop;
                   6182: 
                   6183:   /* Otherwise, return an AND.  See how much, if any, of X we can use.  */
                   6184:   else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
1.1.1.4   root     6185:     x = gen_rtx_combine (AND, mode, varop, GEN_INT (constop));
1.1       root     6186: 
                   6187:   else
                   6188:     {
                   6189:       if (GET_CODE (XEXP (x, 1)) != CONST_INT
                   6190:          || INTVAL (XEXP (x, 1)) != constop)
1.1.1.4   root     6191:        SUBST (XEXP (x, 1), GEN_INT (constop));
1.1       root     6192: 
                   6193:       SUBST (XEXP (x, 0), varop);
                   6194:     }
                   6195: 
                   6196:   return x;
                   6197: }
                   6198: 
                   6199: /* Given an expression, X, compute which bits in X can be non-zero.
                   6200:    We don't care about bits outside of those defined in MODE.
                   6201: 
                   6202:    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
                   6203:    a shift, AND, or zero_extract, we can do better.  */
                   6204: 
1.1.1.4   root     6205: static unsigned HOST_WIDE_INT
1.1.1.5 ! root     6206: nonzero_bits (x, mode)
1.1       root     6207:      rtx x;
                   6208:      enum machine_mode mode;
                   6209: {
1.1.1.5 ! root     6210:   unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
        !          6211:   unsigned HOST_WIDE_INT inner_nz;
1.1       root     6212:   enum rtx_code code;
                   6213:   int mode_width = GET_MODE_BITSIZE (mode);
                   6214:   rtx tem;
                   6215: 
                   6216:   /* If X is wider than MODE, use its mode instead.  */
                   6217:   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
                   6218:     {
                   6219:       mode = GET_MODE (x);
1.1.1.5 ! root     6220:       nonzero = GET_MODE_MASK (mode);
1.1       root     6221:       mode_width = GET_MODE_BITSIZE (mode);
                   6222:     }
                   6223: 
1.1.1.4   root     6224:   if (mode_width > HOST_BITS_PER_WIDE_INT)
1.1       root     6225:     /* Our only callers in this case look for single bit values.  So
                   6226:        just return the mode mask.  Those tests will then be false.  */
1.1.1.5 ! root     6227:     return nonzero;
1.1       root     6228: 
                   6229:   code = GET_CODE (x);
                   6230:   switch (code)
                   6231:     {
                   6232:     case REG:
                   6233: #ifdef STACK_BOUNDARY
                   6234:       /* If this is the stack pointer, we may know something about its
                   6235:         alignment.  If PUSH_ROUNDING is defined, it is possible for the
                   6236:         stack to be momentarily aligned only to that amount, so we pick
                   6237:         the least alignment.  */
                   6238: 
                   6239:       if (x == stack_pointer_rtx)
                   6240:        {
                   6241:          int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
                   6242: 
                   6243: #ifdef PUSH_ROUNDING
                   6244:          sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
                   6245: #endif
                   6246: 
1.1.1.5 ! root     6247:          return nonzero & ~ (sp_alignment - 1);
1.1       root     6248:        }
                   6249: #endif
                   6250: 
1.1.1.5 ! root     6251:       /* If X is a register whose nonzero bits value is current, use it.
        !          6252:         Otherwise, if X is a register whose value we can find, use that
        !          6253:         value.  Otherwise, use the previously-computed global nonzero bits
        !          6254:         for this register.  */
        !          6255: 
        !          6256:       if (reg_last_set_value[REGNO (x)] != 0
        !          6257:          && reg_last_set_mode[REGNO (x)] == mode
        !          6258:          && (reg_n_sets[REGNO (x)] == 1
        !          6259:              || reg_last_set_label[REGNO (x)] == label_tick)
        !          6260:          && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
        !          6261:        return reg_last_set_nonzero_bits[REGNO (x)];
1.1       root     6262: 
                   6263:       tem = get_last_value (x);
1.1.1.5 ! root     6264: 
1.1       root     6265:       if (tem)
1.1.1.5 ! root     6266:        {
        !          6267: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
        !          6268:          /* If X is narrower than MODE and TEM is a non-negative
        !          6269:             constant that would appear negative in the mode of X,
        !          6270:             sign-extend it for use in reg_nonzero_bits because some
        !          6271:             machines (maybe most) will actually do the sign-extension
        !          6272:             and this is the conservative approach. 
        !          6273: 
        !          6274:             ??? For 2.5, try to tighten up the MD files in this regard
        !          6275:             instead of this kludge.  */
        !          6276: 
        !          6277:          if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width
        !          6278:              && GET_CODE (tem) == CONST_INT
        !          6279:              && INTVAL (tem) > 0
        !          6280:              && 0 != (INTVAL (tem)
        !          6281:                       & ((HOST_WIDE_INT) 1
        !          6282:                          << GET_MODE_BITSIZE (GET_MODE (x)))))
        !          6283:            tem = GEN_INT (INTVAL (tem)
        !          6284:                           | ((HOST_WIDE_INT) (-1)
        !          6285:                              << GET_MODE_BITSIZE (GET_MODE (x))));
        !          6286: #endif
        !          6287:          return nonzero_bits (tem, mode);
        !          6288:        }
        !          6289:       else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)])
        !          6290:        return reg_nonzero_bits[REGNO (x)] & nonzero;
1.1       root     6291:       else
1.1.1.5 ! root     6292:        return nonzero;
1.1       root     6293: 
                   6294:     case CONST_INT:
1.1.1.5 ! root     6295: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
        !          6296:       /* If X is negative in MODE, sign-extend the value.  */
        !          6297:       if (INTVAL (x) > 0
        !          6298:          && 0 != (INTVAL (x)
        !          6299:                   & ((HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (GET_MODE (x)))))
        !          6300:        return (INTVAL (x)
        !          6301:                | ((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (GET_MODE (x))));
        !          6302: #endif
        !          6303: 
1.1       root     6304:       return INTVAL (x);
                   6305: 
                   6306: #ifdef BYTE_LOADS_ZERO_EXTEND
                   6307:     case MEM:
                   6308:       /* In many, if not most, RISC machines, reading a byte from memory
                   6309:         zeros the rest of the register.  Noticing that fact saves a lot
                   6310:         of extra zero-extends.  */
1.1.1.5 ! root     6311:       nonzero &= GET_MODE_MASK (GET_MODE (x));
1.1       root     6312:       break;
                   6313: #endif
                   6314: 
                   6315: #if STORE_FLAG_VALUE == 1
                   6316:     case EQ:  case NE:
                   6317:     case GT:  case GTU:
                   6318:     case LT:  case LTU:
                   6319:     case GE:  case GEU:
                   6320:     case LE:  case LEU:
1.1.1.3   root     6321: 
                   6322:       if (GET_MODE_CLASS (mode) == MODE_INT)
1.1.1.5 ! root     6323:        nonzero = 1;
1.1       root     6324: 
                   6325:       /* A comparison operation only sets the bits given by its mode.  The
                   6326:         rest are set undefined.  */
                   6327:       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
1.1.1.5 ! root     6328:        nonzero |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)));
1.1       root     6329:       break;
                   6330: #endif
                   6331: 
                   6332:     case NEG:
1.1.1.4   root     6333:       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
                   6334:          == GET_MODE_BITSIZE (GET_MODE (x)))
1.1.1.5 ! root     6335:        nonzero = 1;
1.1       root     6336: 
                   6337:       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
1.1.1.5 ! root     6338:        nonzero |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)));
1.1       root     6339:       break;
1.1.1.4   root     6340: 
                   6341:     case ABS:
                   6342:       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
                   6343:          == GET_MODE_BITSIZE (GET_MODE (x)))
1.1.1.5 ! root     6344:        nonzero = 1;
1.1.1.4   root     6345:       break;
1.1       root     6346: 
                   6347:     case TRUNCATE:
1.1.1.5 ! root     6348:       nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode));
1.1       root     6349:       break;
                   6350: 
                   6351:     case ZERO_EXTEND:
1.1.1.5 ! root     6352:       nonzero &= nonzero_bits (XEXP (x, 0), mode);
1.1       root     6353:       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
1.1.1.5 ! root     6354:        nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
1.1       root     6355:       break;
                   6356: 
                   6357:     case SIGN_EXTEND:
                   6358:       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
                   6359:         Otherwise, show all the bits in the outer mode but not the inner
                   6360:         may be non-zero.  */
1.1.1.5 ! root     6361:       inner_nz = nonzero_bits (XEXP (x, 0), mode);
1.1       root     6362:       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
                   6363:        {
1.1.1.5 ! root     6364:          inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
        !          6365:          if (inner_nz &
1.1.1.4   root     6366:              (((HOST_WIDE_INT) 1
                   6367:                << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
1.1.1.5 ! root     6368:            inner_nz |= (GET_MODE_MASK (mode)
1.1       root     6369:                          & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
                   6370:        }
                   6371: 
1.1.1.5 ! root     6372:       nonzero &= inner_nz;
1.1       root     6373:       break;
                   6374: 
                   6375:     case AND:
1.1.1.5 ! root     6376:       nonzero &= (nonzero_bits (XEXP (x, 0), mode)
        !          6377:                  & nonzero_bits (XEXP (x, 1), mode));
1.1       root     6378:       break;
                   6379: 
1.1.1.4   root     6380:     case XOR:   case IOR:
                   6381:     case UMIN:  case UMAX:  case SMIN:  case SMAX:
1.1.1.5 ! root     6382:       nonzero &= (nonzero_bits (XEXP (x, 0), mode)
        !          6383:                  | nonzero_bits (XEXP (x, 1), mode));
1.1       root     6384:       break;
                   6385: 
                   6386:     case PLUS:  case MINUS:
                   6387:     case MULT:
                   6388:     case DIV:   case UDIV:
                   6389:     case MOD:   case UMOD:
                   6390:       /* We can apply the rules of arithmetic to compute the number of
                   6391:         high- and low-order zero bits of these operations.  We start by
                   6392:         computing the width (position of the highest-order non-zero bit)
                   6393:         and the number of low-order zero bits for each value.  */
                   6394:       {
1.1.1.5 ! root     6395:        unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode);
        !          6396:        unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode);
        !          6397:        int width0 = floor_log2 (nz0) + 1;
        !          6398:        int width1 = floor_log2 (nz1) + 1;
        !          6399:        int low0 = floor_log2 (nz0 & -nz0);
        !          6400:        int low1 = floor_log2 (nz1 & -nz1);
        !          6401:        int op0_maybe_minusp = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
        !          6402:        int op1_maybe_minusp = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
1.1       root     6403:        int result_width = mode_width;
                   6404:        int result_low = 0;
                   6405: 
                   6406:        switch (code)
                   6407:          {
                   6408:          case PLUS:
                   6409:            result_width = MAX (width0, width1) + 1;
                   6410:            result_low = MIN (low0, low1);
                   6411:            break;
                   6412:          case MINUS:
                   6413:            result_low = MIN (low0, low1);
                   6414:            break;
                   6415:          case MULT:
                   6416:            result_width = width0 + width1;
                   6417:            result_low = low0 + low1;
                   6418:            break;
                   6419:          case DIV:
                   6420:            if (! op0_maybe_minusp && ! op1_maybe_minusp)
                   6421:              result_width = width0;
                   6422:            break;
                   6423:          case UDIV:
                   6424:            result_width = width0;
                   6425:            break;
                   6426:          case MOD:
                   6427:            if (! op0_maybe_minusp && ! op1_maybe_minusp)
                   6428:              result_width = MIN (width0, width1);
                   6429:            result_low = MIN (low0, low1);
                   6430:            break;
                   6431:          case UMOD:
                   6432:            result_width = MIN (width0, width1);
                   6433:            result_low = MIN (low0, low1);
                   6434:            break;
                   6435:          }
                   6436: 
                   6437:        if (result_width < mode_width)
1.1.1.5 ! root     6438:          nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
1.1       root     6439: 
                   6440:        if (result_low > 0)
1.1.1.5 ! root     6441:          nonzero &= ~ (((HOST_WIDE_INT) 1 << result_low) - 1);
1.1       root     6442:       }
                   6443:       break;
                   6444: 
                   6445:     case ZERO_EXTRACT:
                   6446:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
1.1.1.4   root     6447:          && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
1.1.1.5 ! root     6448:        nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
1.1       root     6449:       break;
                   6450: 
                   6451:     case SUBREG:
1.1.1.4   root     6452:       /* If this is a SUBREG formed for a promoted variable that has
                   6453:         been zero-extended, we know that at least the high-order bits
                   6454:         are zero, though others might be too.  */
                   6455: 
                   6456:       if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x))
1.1.1.5 ! root     6457:        nonzero = (GET_MODE_MASK (GET_MODE (x))
        !          6458:                   & nonzero_bits (SUBREG_REG (x), GET_MODE (x)));
1.1.1.4   root     6459: 
1.1       root     6460:       /* If the inner mode is a single word for both the host and target
                   6461:         machines, we can compute this from which bits of the inner
1.1.1.5 ! root     6462:         object might be nonzero.  */
1.1       root     6463:       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
1.1.1.4   root     6464:          && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
                   6465:              <= HOST_BITS_PER_WIDE_INT))
1.1       root     6466:        {
1.1.1.5 ! root     6467:          nonzero &= nonzero_bits (SUBREG_REG (x), mode);
        !          6468: #ifndef BYTE_LOADS_EXTEND
1.1       root     6469:          /* On many CISC machines, accessing an object in a wider mode
                   6470:             causes the high-order bits to become undefined.  So they are
                   6471:             not known to be zero.  */
                   6472:          if (GET_MODE_SIZE (GET_MODE (x))
                   6473:              > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
1.1.1.5 ! root     6474:            nonzero |= (GET_MODE_MASK (GET_MODE (x))
        !          6475:                        & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
1.1       root     6476: #endif
                   6477:        }
                   6478:       break;
                   6479: 
                   6480:     case ASHIFTRT:
                   6481:     case LSHIFTRT:
                   6482:     case ASHIFT:
                   6483:     case LSHIFT:
                   6484:     case ROTATE:
1.1.1.5 ! root     6485:       /* The nonzero bits are in two classes: any bits within MODE
1.1       root     6486:         that aren't in GET_MODE (x) are always significant.  The rest of the
1.1.1.5 ! root     6487:         nonzero bits are those that are significant in the operand of
1.1       root     6488:         the shift when shifted the appropriate number of bits.  This
                   6489:         shows that high-order bits are cleared by the right shift and
                   6490:         low-order bits by left shifts.  */
                   6491:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   6492:          && INTVAL (XEXP (x, 1)) >= 0
1.1.1.4   root     6493:          && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
1.1       root     6494:        {
                   6495:          enum machine_mode inner_mode = GET_MODE (x);
                   6496:          int width = GET_MODE_BITSIZE (inner_mode);
                   6497:          int count = INTVAL (XEXP (x, 1));
1.1.1.4   root     6498:          unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
1.1.1.5 ! root     6499:          unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode);
        !          6500:          unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
1.1.1.4   root     6501:          unsigned HOST_WIDE_INT outer = 0;
1.1       root     6502: 
                   6503:          if (mode_width > width)
1.1.1.5 ! root     6504:            outer = (op_nonzero & nonzero & ~ mode_mask);
1.1       root     6505: 
                   6506:          if (code == LSHIFTRT)
                   6507:            inner >>= count;
                   6508:          else if (code == ASHIFTRT)
                   6509:            {
                   6510:              inner >>= count;
                   6511: 
1.1.1.5 ! root     6512:              /* If the sign bit may have been nonzero before the shift, we
1.1       root     6513:                 need to mark all the places it could have been copied to
1.1.1.5 ! root     6514:                 by the shift as possibly nonzero.  */
1.1.1.4   root     6515:              if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
                   6516:                inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
1.1       root     6517:            }
                   6518:          else if (code == LSHIFT || code == ASHIFT)
                   6519:            inner <<= count;
                   6520:          else
                   6521:            inner = ((inner << (count % width)
                   6522:                      | (inner >> (width - (count % width)))) & mode_mask);
                   6523: 
1.1.1.5 ! root     6524:          nonzero &= (outer | inner);
1.1       root     6525:        }
                   6526:       break;
                   6527: 
                   6528:     case FFS:
                   6529:       /* This is at most the number of bits in the mode.  */
1.1.1.5 ! root     6530:       nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1;
1.1.1.4   root     6531:       break;
                   6532: 
                   6533:     case IF_THEN_ELSE:
1.1.1.5 ! root     6534:       nonzero &= (nonzero_bits (XEXP (x, 1), mode)
        !          6535:                  | nonzero_bits (XEXP (x, 2), mode));
1.1       root     6536:       break;
                   6537:     }
                   6538: 
1.1.1.5 ! root     6539:   return nonzero;
1.1       root     6540: }
                   6541: 
1.1.1.4   root     6542: /* Return the number of bits at the high-order end of X that are known to
                   6543:    be equal to the sign bit.  This number will always be between 1 and
                   6544:    the number of bits in the mode of X.  MODE is the mode to be used
                   6545:    if X is VOIDmode.  */
                   6546: 
                   6547: static int
                   6548: num_sign_bit_copies (x, mode)
                   6549:      rtx x;
                   6550:      enum machine_mode mode;
                   6551: {
                   6552:   enum rtx_code code = GET_CODE (x);
                   6553:   int bitwidth;
                   6554:   int num0, num1, result;
1.1.1.5 ! root     6555:   unsigned HOST_WIDE_INT nonzero;
1.1.1.4   root     6556:   rtx tem;
                   6557: 
                   6558:   /* If we weren't given a mode, use the mode of X.  If the mode is still
                   6559:      VOIDmode, we don't know anything.  */
                   6560: 
                   6561:   if (mode == VOIDmode)
                   6562:     mode = GET_MODE (x);
                   6563: 
                   6564:   if (mode == VOIDmode)
                   6565:     return 1;
                   6566: 
                   6567:   bitwidth = GET_MODE_BITSIZE (mode);
                   6568: 
                   6569:   switch (code)
                   6570:     {
                   6571:     case REG:
1.1.1.5 ! root     6572: 
        !          6573:       if (reg_last_set_value[REGNO (x)] != 0
        !          6574:          && reg_last_set_mode[REGNO (x)] == mode
        !          6575:          && (reg_n_sets[REGNO (x)] == 1
        !          6576:              || reg_last_set_label[REGNO (x)] == label_tick)
        !          6577:          && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
        !          6578:        return reg_last_set_sign_bit_copies[REGNO (x)];
1.1.1.4   root     6579: 
                   6580:       tem =  get_last_value (x);
                   6581:       if (tem != 0)
                   6582:        return num_sign_bit_copies (tem, mode);
1.1.1.5 ! root     6583: 
        !          6584:       if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0)
        !          6585:        return reg_sign_bit_copies[REGNO (x)];
1.1.1.4   root     6586:       break;
                   6587: 
                   6588: #ifdef BYTE_LOADS_SIGN_EXTEND
                   6589:     case MEM:
                   6590:       /* Some RISC machines sign-extend all loads of smaller than a word.  */
                   6591:       return MAX (1, bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1);
                   6592: #endif
                   6593: 
                   6594:     case CONST_INT:
                   6595:       /* If the constant is negative, take its 1's complement and remask.
                   6596:         Then see how many zero bits we have.  */
1.1.1.5 ! root     6597:       nonzero = INTVAL (x) & GET_MODE_MASK (mode);
1.1.1.4   root     6598:       if (bitwidth <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     6599:          && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
        !          6600:        nonzero = (~ nonzero) & GET_MODE_MASK (mode);
1.1.1.4   root     6601: 
1.1.1.5 ! root     6602:       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
1.1.1.4   root     6603: 
                   6604:     case SUBREG:
                   6605:       /* If this is a SUBREG for a promoted object that is sign-extended
                   6606:         and we are looking at it in a wider mode, we know that at least the
                   6607:         high-order bits are known to be sign bit copies.  */
                   6608: 
                   6609:       if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
1.1.1.5 ! root     6610:        return MAX (bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1,
        !          6611:                    num_sign_bit_copies (SUBREG_REG (x), mode));
1.1.1.4   root     6612: 
                   6613:       /* For a smaller object, just ignore the high bits. */
                   6614:       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
                   6615:        {
                   6616:          num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode);
                   6617:          return MAX (1, (num0
                   6618:                          - (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
                   6619:                             - bitwidth)));
                   6620:        }
                   6621: 
1.1.1.5 ! root     6622: #ifdef BYTE_LOADS_EXTEND
1.1.1.4   root     6623:       /* For paradoxical SUBREGs, just look inside since, on machines with
                   6624:         one of these defined, we assume that operations are actually 
                   6625:         performed on the full register.  Note that we are passing MODE
                   6626:         to the recursive call, so the number of sign bit copies will
                   6627:         remain relative to that mode, not the inner mode.  */
                   6628: 
                   6629:       if (GET_MODE_SIZE (GET_MODE (x))
                   6630:          > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
                   6631:        return num_sign_bit_copies (SUBREG_REG (x), mode);
                   6632: #endif
                   6633: 
                   6634:       break;
                   6635: 
                   6636:     case SIGN_EXTRACT:
                   6637:       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
                   6638:        return MAX (1, bitwidth - INTVAL (XEXP (x, 1)));
                   6639:       break;
                   6640: 
                   6641:     case SIGN_EXTEND: 
                   6642:       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
                   6643:              + num_sign_bit_copies (XEXP (x, 0), VOIDmode));
                   6644: 
                   6645:     case TRUNCATE:
                   6646:       /* For a smaller object, just ignore the high bits. */
                   6647:       num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode);
                   6648:       return MAX (1, (num0 - (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
                   6649:                              - bitwidth)));
                   6650: 
                   6651:     case NOT:
                   6652:       return num_sign_bit_copies (XEXP (x, 0), mode);
                   6653: 
                   6654:     case ROTATE:       case ROTATERT:
                   6655:       /* If we are rotating left by a number of bits less than the number
                   6656:         of sign bit copies, we can just subtract that amount from the
                   6657:         number.  */
                   6658:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   6659:          && INTVAL (XEXP (x, 1)) >= 0 && INTVAL (XEXP (x, 1)) < bitwidth)
                   6660:        {
                   6661:          num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6662:          return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
                   6663:                                 : bitwidth - INTVAL (XEXP (x, 1))));
                   6664:        }
                   6665:       break;
                   6666: 
                   6667:     case NEG:
                   6668:       /* In general, this subtracts one sign bit copy.  But if the value
                   6669:         is known to be positive, the number of sign bit copies is the
1.1.1.5 ! root     6670:         same as that of the input.  Finally, if the input has just one bit
        !          6671:         that might be nonzero, all the bits are copies of the sign bit.  */
        !          6672:       nonzero = nonzero_bits (XEXP (x, 0), mode);
        !          6673:       if (nonzero == 1)
1.1.1.4   root     6674:        return bitwidth;
                   6675: 
                   6676:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6677:       if (num0 > 1
                   6678:          && bitwidth <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     6679:          && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
1.1.1.4   root     6680:        num0--;
                   6681: 
                   6682:       return num0;
                   6683: 
                   6684:     case IOR:   case AND:   case XOR:
                   6685:     case SMIN:  case SMAX:  case UMIN:  case UMAX:
                   6686:       /* Logical operations will preserve the number of sign-bit copies.
                   6687:         MIN and MAX operations always return one of the operands.  */
                   6688:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6689:       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
                   6690:       return MIN (num0, num1);
                   6691: 
                   6692:     case PLUS:  case MINUS:
                   6693:       /* For addition and subtraction, we can have a 1-bit carry.  However,
                   6694:         if we are subtracting 1 from a positive number, there will not
                   6695:         be such a carry.  Furthermore, if the positive number is known to
                   6696:         be 0 or 1, we know the result is either -1 or 0.  */
                   6697: 
                   6698:       if (code == PLUS && XEXP (x, 1) == constm1_rtx
1.1.1.5 ! root     6699:          && bitwidth <= HOST_BITS_PER_WIDE_INT)
        !          6700:        {
        !          6701:          nonzero = nonzero_bits (XEXP (x, 0), mode);
        !          6702:          if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
        !          6703:            return (nonzero == 1 || nonzero == 0 ? bitwidth
        !          6704:                    : bitwidth - floor_log2 (nonzero) - 1);
1.1.1.4   root     6705:        }
                   6706: 
                   6707:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6708:       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
                   6709:       return MAX (1, MIN (num0, num1) - 1);
                   6710:       
                   6711:     case MULT:
                   6712:       /* The number of bits of the product is the sum of the number of
                   6713:         bits of both terms.  However, unless one of the terms if known
                   6714:         to be positive, we must allow for an additional bit since negating
                   6715:         a negative number can remove one sign bit copy.  */
                   6716: 
                   6717:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6718:       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
                   6719: 
                   6720:       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
                   6721:       if (result > 0
1.1.1.5 ! root     6722:          && bitwidth <= HOST_BITS_PER_WIDE_INT
        !          6723:          && ((nonzero_bits (XEXP (x, 0), mode)
1.1.1.4   root     6724:               & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
1.1.1.5 ! root     6725:          && (nonzero_bits (XEXP (x, 1), mode)
1.1.1.4   root     6726:              & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) != 0))
                   6727:        result--;
                   6728: 
                   6729:       return MAX (1, result);
                   6730: 
                   6731:     case UDIV:
                   6732:       /* The result must be <= the first operand.  */
                   6733:       return num_sign_bit_copies (XEXP (x, 0), mode);
                   6734: 
                   6735:     case UMOD:
                   6736:       /* The result must be <= the scond operand.  */
                   6737:       return num_sign_bit_copies (XEXP (x, 1), mode);
                   6738: 
                   6739:     case DIV:
                   6740:       /* Similar to unsigned division, except that we have to worry about
                   6741:         the case where the divisor is negative, in which case we have
                   6742:         to add 1.  */
                   6743:       result = num_sign_bit_copies (XEXP (x, 0), mode);
                   6744:       if (result > 1
                   6745:          && bitwidth <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     6746:          && (nonzero_bits (XEXP (x, 1), mode)
1.1.1.4   root     6747:              & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
                   6748:        result --;
                   6749: 
                   6750:       return result;
                   6751: 
                   6752:     case MOD:
                   6753:       result = num_sign_bit_copies (XEXP (x, 1), mode);
                   6754:       if (result > 1
                   6755:          && bitwidth <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     6756:          && (nonzero_bits (XEXP (x, 1), mode)
1.1.1.4   root     6757:              & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
                   6758:        result --;
                   6759: 
                   6760:       return result;
                   6761: 
                   6762:     case ASHIFTRT:
                   6763:       /* Shifts by a constant add to the number of bits equal to the
                   6764:         sign bit.  */
                   6765:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6766:       if (GET_CODE (XEXP (x, 1)) == CONST_INT
                   6767:          && INTVAL (XEXP (x, 1)) > 0)
                   6768:        num0 = MIN (bitwidth, num0 + INTVAL (XEXP (x, 1)));
                   6769: 
                   6770:       return num0;
                   6771: 
                   6772:     case ASHIFT:
                   6773:     case LSHIFT:
                   6774:       /* Left shifts destroy copies.  */
                   6775:       if (GET_CODE (XEXP (x, 1)) != CONST_INT
                   6776:          || INTVAL (XEXP (x, 1)) < 0
                   6777:          || INTVAL (XEXP (x, 1)) >= bitwidth)
                   6778:        return 1;
                   6779: 
                   6780:       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
                   6781:       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
                   6782: 
                   6783:     case IF_THEN_ELSE:
                   6784:       num0 = num_sign_bit_copies (XEXP (x, 1), mode);
                   6785:       num1 = num_sign_bit_copies (XEXP (x, 2), mode);
                   6786:       return MIN (num0, num1);
                   6787: 
                   6788: #if STORE_FLAG_VALUE == -1
                   6789:     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
                   6790:     case GEU: case GTU: case LEU: case LTU:
                   6791:       return bitwidth;
                   6792: #endif
                   6793:     }
                   6794: 
                   6795:   /* If we haven't been able to figure it out by one of the above rules,
                   6796:      see if some of the high-order bits are known to be zero.  If so,
                   6797:      count those bits and return one less than that amount.  If we can't
                   6798:      safely compute the mask for this mode, always return BITWIDTH.  */
                   6799: 
                   6800:   if (bitwidth > HOST_BITS_PER_WIDE_INT)
                   6801:     return 1;
                   6802: 
1.1.1.5 ! root     6803:   nonzero = nonzero_bits (x, mode);
        !          6804:   return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
        !          6805:          ? 1 : bitwidth - floor_log2 (nonzero) - 1);
1.1.1.4   root     6806: }
                   6807: 
                   6808: /* Return the number of "extended" bits there are in X, when interpreted
                   6809:    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
                   6810:    unsigned quantities, this is the number of high-order zero bits.
                   6811:    For signed quantities, this is the number of copies of the sign bit
                   6812:    minus 1.  In both case, this function returns the number of "spare"
                   6813:    bits.  For example, if two quantities for which this function returns
                   6814:    at least 1 are added, the addition is known not to overflow.
                   6815: 
                   6816:    This function will always return 0 unless called during combine, which
                   6817:    implies that it must be called from a define_split.  */
                   6818: 
                   6819: int
                   6820: extended_count (x, mode, unsignedp)
                   6821:      rtx x;
                   6822:      enum machine_mode mode;
                   6823:      int unsignedp;
                   6824: {
1.1.1.5 ! root     6825:   if (nonzero_sign_valid == 0)
1.1.1.4   root     6826:     return 0;
                   6827: 
                   6828:   return (unsignedp
                   6829:          ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
                   6830:             && (GET_MODE_BITSIZE (mode) - 1
1.1.1.5 ! root     6831:                 - floor_log2 (nonzero_bits (x, mode))))
1.1.1.4   root     6832:          : num_sign_bit_copies (x, mode) - 1);
                   6833: }
                   6834: 
1.1       root     6835: /* This function is called from `simplify_shift_const' to merge two
                   6836:    outer operations.  Specifically, we have already found that we need
                   6837:    to perform operation *POP0 with constant *PCONST0 at the outermost
                   6838:    position.  We would now like to also perform OP1 with constant CONST1
                   6839:    (with *POP0 being done last).
                   6840: 
                   6841:    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
                   6842:    the resulting operation.  *PCOMP_P is set to 1 if we would need to 
                   6843:    complement the innermost operand, otherwise it is unchanged.
                   6844: 
                   6845:    MODE is the mode in which the operation will be done.  No bits outside
                   6846:    the width of this mode matter.  It is assumed that the width of this mode
1.1.1.4   root     6847:    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
1.1       root     6848: 
                   6849:    If *POP0 or OP1 are NIL, it means no operation is required.  Only NEG, PLUS,
                   6850:    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
                   6851:    result is simply *PCONST0.
                   6852: 
                   6853:    If the resulting operation cannot be expressed as one operation, we
                   6854:    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
                   6855: 
                   6856: static int
                   6857: merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
                   6858:      enum rtx_code *pop0;
1.1.1.4   root     6859:      HOST_WIDE_INT *pconst0;
1.1       root     6860:      enum rtx_code op1;
1.1.1.4   root     6861:      HOST_WIDE_INT const1;
1.1       root     6862:      enum machine_mode mode;
                   6863:      int *pcomp_p;
                   6864: {
                   6865:   enum rtx_code op0 = *pop0;
1.1.1.4   root     6866:   HOST_WIDE_INT const0 = *pconst0;
1.1       root     6867: 
                   6868:   const0 &= GET_MODE_MASK (mode);
                   6869:   const1 &= GET_MODE_MASK (mode);
                   6870: 
                   6871:   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
                   6872:   if (op0 == AND)
                   6873:     const1 &= const0;
                   6874: 
                   6875:   /* If OP0 or OP1 is NIL, this is easy.  Similarly if they are the same or
                   6876:      if OP0 is SET.  */
                   6877: 
                   6878:   if (op1 == NIL || op0 == SET)
                   6879:     return 1;
                   6880: 
                   6881:   else if (op0 == NIL)
                   6882:     op0 = op1, const0 = const1;
                   6883: 
                   6884:   else if (op0 == op1)
                   6885:     {
                   6886:       switch (op0)
                   6887:        {
                   6888:        case AND:
                   6889:          const0 &= const1;
                   6890:          break;
                   6891:        case IOR:
                   6892:          const0 |= const1;
                   6893:          break;
                   6894:        case XOR:
                   6895:          const0 ^= const1;
                   6896:          break;
                   6897:        case PLUS:
                   6898:          const0 += const1;
                   6899:          break;
                   6900:        case NEG:
                   6901:          op0 = NIL;
                   6902:          break;
                   6903:        }
                   6904:     }
                   6905: 
                   6906:   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
                   6907:   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
                   6908:     return 0;
                   6909: 
                   6910:   /* If the two constants aren't the same, we can't do anything.  The
                   6911:      remaining six cases can all be done.  */
                   6912:   else if (const0 != const1)
                   6913:     return 0;
                   6914: 
                   6915:   else
                   6916:     switch (op0)
                   6917:       {
                   6918:       case IOR:
                   6919:        if (op1 == AND)
                   6920:          /* (a & b) | b == b */
                   6921:          op0 = SET;
                   6922:        else /* op1 == XOR */
                   6923:          /* (a ^ b) | b == a | b */
                   6924:          ;
                   6925:        break;
                   6926: 
                   6927:       case XOR:
                   6928:        if (op1 == AND)
                   6929:          /* (a & b) ^ b == (~a) & b */
                   6930:          op0 = AND, *pcomp_p = 1;
                   6931:        else /* op1 == IOR */
                   6932:          /* (a | b) ^ b == a & ~b */
                   6933:          op0 = AND, *pconst0 = ~ const0;
                   6934:        break;
                   6935: 
                   6936:       case AND:
                   6937:        if (op1 == IOR)
                   6938:          /* (a | b) & b == b */
                   6939:        op0 = SET;
                   6940:        else /* op1 == XOR */
                   6941:          /* (a ^ b) & b) == (~a) & b */
                   6942:          *pcomp_p = 1;
                   6943:        break;
                   6944:       }
                   6945: 
                   6946:   /* Check for NO-OP cases.  */
                   6947:   const0 &= GET_MODE_MASK (mode);
                   6948:   if (const0 == 0
                   6949:       && (op0 == IOR || op0 == XOR || op0 == PLUS))
                   6950:     op0 = NIL;
                   6951:   else if (const0 == 0 && op0 == AND)
                   6952:     op0 = SET;
                   6953:   else if (const0 == GET_MODE_MASK (mode) && op0 == AND)
                   6954:     op0 = NIL;
                   6955: 
                   6956:   *pop0 = op0;
                   6957:   *pconst0 = const0;
                   6958: 
                   6959:   return 1;
                   6960: }
                   6961: 
                   6962: /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
                   6963:    The result of the shift is RESULT_MODE.  X, if non-zero, is an expression
                   6964:    that we started with.
                   6965: 
                   6966:    The shift is normally computed in the widest mode we find in VAROP, as
                   6967:    long as it isn't a different number of words than RESULT_MODE.  Exceptions
                   6968:    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
                   6969: 
                   6970: static rtx
                   6971: simplify_shift_const (x, code, result_mode, varop, count)
                   6972:      rtx x;
                   6973:      enum rtx_code code;
                   6974:      enum machine_mode result_mode;
                   6975:      rtx varop;
                   6976:      int count;
                   6977: {
                   6978:   enum rtx_code orig_code = code;
                   6979:   int orig_count = count;
                   6980:   enum machine_mode mode = result_mode;
                   6981:   enum machine_mode shift_mode, tmode;
                   6982:   int mode_words
                   6983:     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
                   6984:   /* We form (outer_op (code varop count) (outer_const)).  */
                   6985:   enum rtx_code outer_op = NIL;
1.1.1.4   root     6986:   HOST_WIDE_INT outer_const;
1.1       root     6987:   rtx const_rtx;
                   6988:   int complement_p = 0;
                   6989:   rtx new;
                   6990: 
                   6991:   /* If we were given an invalid count, don't do anything except exactly
                   6992:      what was requested.  */
                   6993: 
                   6994:   if (count < 0 || count > GET_MODE_BITSIZE (mode))
                   6995:     {
                   6996:       if (x)
                   6997:        return x;
                   6998: 
1.1.1.4   root     6999:       return gen_rtx (code, mode, varop, GEN_INT (count));
1.1       root     7000:     }
                   7001: 
                   7002:   /* Unless one of the branches of the `if' in this loop does a `continue',
                   7003:      we will `break' the loop after the `if'.  */
                   7004: 
                   7005:   while (count != 0)
                   7006:     {
                   7007:       /* If we have an operand of (clobber (const_int 0)), just return that
                   7008:         value.  */
                   7009:       if (GET_CODE (varop) == CLOBBER)
                   7010:        return varop;
                   7011: 
                   7012:       /* If we discovered we had to complement VAROP, leave.  Making a NOT
                   7013:         here would cause an infinite loop.  */
                   7014:       if (complement_p)
                   7015:        break;
                   7016: 
                   7017:       /* Convert ROTATETRT to ROTATE.  */
                   7018:       if (code == ROTATERT)
                   7019:        code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
                   7020: 
                   7021:       /* Canonicalize LSHIFT to ASHIFT.  */
                   7022:       if (code == LSHIFT)
                   7023:        code = ASHIFT;
                   7024: 
                   7025:       /* We need to determine what mode we will do the shift in.  If the
                   7026:         shift is a ASHIFTRT or ROTATE, we must always do it in the mode it
                   7027:         was originally done in.  Otherwise, we can do it in MODE, the widest
                   7028:         mode encountered. */
                   7029:       shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode);
                   7030: 
                   7031:       /* Handle cases where the count is greater than the size of the mode
                   7032:         minus 1.  For ASHIFT, use the size minus one as the count (this can
                   7033:         occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
                   7034:         take the count modulo the size.  For other shifts, the result is
                   7035:         zero.
                   7036: 
                   7037:         Since these shifts are being produced by the compiler by combining
                   7038:         multiple operations, each of which are defined, we know what the
                   7039:         result is supposed to be.  */
                   7040:         
                   7041:       if (count > GET_MODE_BITSIZE (shift_mode) - 1)
                   7042:        {
                   7043:          if (code == ASHIFTRT)
                   7044:            count = GET_MODE_BITSIZE (shift_mode) - 1;
                   7045:          else if (code == ROTATE || code == ROTATERT)
                   7046:            count %= GET_MODE_BITSIZE (shift_mode);
                   7047:          else
                   7048:            {
                   7049:              /* We can't simply return zero because there may be an
                   7050:                 outer op.  */
                   7051:              varop = const0_rtx;
                   7052:              count = 0;
                   7053:              break;
                   7054:            }
                   7055:        }
                   7056: 
                   7057:       /* Negative counts are invalid and should not have been made (a
                   7058:         programmer-specified negative count should have been handled
                   7059:         above). */
                   7060:       else if (count < 0)
                   7061:        abort ();
                   7062: 
1.1.1.4   root     7063:       /* An arithmetic right shift of a quantity known to be -1 or 0
                   7064:         is a no-op.  */
                   7065:       if (code == ASHIFTRT
                   7066:          && (num_sign_bit_copies (varop, shift_mode)
                   7067:              == GET_MODE_BITSIZE (shift_mode)))
                   7068:        {
                   7069:          count = 0;
                   7070:          break;
                   7071:        }
                   7072: 
1.1.1.5 ! root     7073:       /* If we are doing an arithmetic right shift and discarding all but
        !          7074:         the sign bit copies, this is equivalent to doing a shift by the
        !          7075:         bitsize minus one.  Convert it into that shift because it will often
        !          7076:         allow other simplifications.  */
        !          7077: 
        !          7078:       if (code == ASHIFTRT
        !          7079:          && (count + num_sign_bit_copies (varop, shift_mode)
        !          7080:              >= GET_MODE_BITSIZE (shift_mode)))
        !          7081:        count = GET_MODE_BITSIZE (shift_mode) - 1;
        !          7082: 
1.1       root     7083:       /* We simplify the tests below and elsewhere by converting
                   7084:         ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
                   7085:         `make_compound_operation' will convert it to a ASHIFTRT for
                   7086:         those machines (such as Vax) that don't have a LSHIFTRT.  */
1.1.1.4   root     7087:       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
1.1       root     7088:          && code == ASHIFTRT
1.1.1.5 ! root     7089:          && ((nonzero_bits (varop, shift_mode)
1.1.1.4   root     7090:               & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
                   7091:              == 0))
1.1       root     7092:        code = LSHIFTRT;
                   7093: 
                   7094:       switch (GET_CODE (varop))
                   7095:        {
                   7096:        case SIGN_EXTEND:
                   7097:        case ZERO_EXTEND:
                   7098:        case SIGN_EXTRACT:
                   7099:        case ZERO_EXTRACT:
                   7100:          new = expand_compound_operation (varop);
                   7101:          if (new != varop)
                   7102:            {
                   7103:              varop = new;
                   7104:              continue;
                   7105:            }
                   7106:          break;
                   7107: 
                   7108:        case MEM:
                   7109:          /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
                   7110:             minus the width of a smaller mode, we can do this with a
                   7111:             SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
                   7112:          if ((code == ASHIFTRT || code == LSHIFTRT)
                   7113:              && ! mode_dependent_address_p (XEXP (varop, 0))
                   7114:              && ! MEM_VOLATILE_P (varop)
                   7115:              && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
                   7116:                                         MODE_INT, 1)) != BLKmode)
                   7117:            {
                   7118: #if BYTES_BIG_ENDIAN
                   7119:              new = gen_rtx (MEM, tmode, XEXP (varop, 0));
                   7120: #else
                   7121:              new = gen_rtx (MEM, tmode,
                   7122:                             plus_constant (XEXP (varop, 0),
                   7123:                                            count / BITS_PER_UNIT));
                   7124:              RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (varop);
                   7125:              MEM_VOLATILE_P (new) = MEM_VOLATILE_P (varop);
                   7126:              MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (varop);
                   7127: #endif
                   7128:              varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
                   7129:                                       : ZERO_EXTEND, mode, new);
                   7130:              count = 0;
                   7131:              continue;
                   7132:            }
                   7133:          break;
                   7134: 
                   7135:        case USE:
                   7136:          /* Similar to the case above, except that we can only do this if
                   7137:             the resulting mode is the same as that of the underlying
                   7138:             MEM and adjust the address depending on the *bits* endianness
                   7139:             because of the way that bit-field extract insns are defined.  */
                   7140:          if ((code == ASHIFTRT || code == LSHIFTRT)
                   7141:              && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
                   7142:                                         MODE_INT, 1)) != BLKmode
                   7143:              && tmode == GET_MODE (XEXP (varop, 0)))
                   7144:            {
                   7145: #if BITS_BIG_ENDIAN
                   7146:              new = XEXP (varop, 0);
                   7147: #else
                   7148:              new = copy_rtx (XEXP (varop, 0));
                   7149:              SUBST (XEXP (new, 0), 
                   7150:                     plus_constant (XEXP (new, 0),
                   7151:                                    count / BITS_PER_UNIT));
                   7152: #endif
                   7153: 
                   7154:              varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
                   7155:                                       : ZERO_EXTEND, mode, new);
                   7156:              count = 0;
                   7157:              continue;
                   7158:            }
                   7159:          break;
                   7160: 
                   7161:        case SUBREG:
                   7162:          /* If VAROP is a SUBREG, strip it as long as the inner operand has
                   7163:             the same number of words as what we've seen so far.  Then store
                   7164:             the widest mode in MODE.  */
1.1.1.4   root     7165:          if (subreg_lowpart_p (varop)
                   7166:              && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
                   7167:                  > GET_MODE_SIZE (GET_MODE (varop)))
1.1       root     7168:              && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
                   7169:                    + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
                   7170:                  == mode_words))
                   7171:            {
                   7172:              varop = SUBREG_REG (varop);
                   7173:              if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
                   7174:                mode = GET_MODE (varop);
                   7175:              continue;
                   7176:            }
                   7177:          break;
                   7178: 
                   7179:        case MULT:
                   7180:          /* Some machines use MULT instead of ASHIFT because MULT
                   7181:             is cheaper.  But it is still better on those machines to
                   7182:             merge two shifts into one.  */
                   7183:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   7184:              && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
                   7185:            {
                   7186:              varop = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
1.1.1.4   root     7187:                                  GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));;
1.1       root     7188:              continue;
                   7189:            }
                   7190:          break;
                   7191: 
                   7192:        case UDIV:
                   7193:          /* Similar, for when divides are cheaper.  */
                   7194:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   7195:              && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
                   7196:            {
                   7197:              varop = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
1.1.1.4   root     7198:                                  GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
1.1       root     7199:              continue;
                   7200:            }
                   7201:          break;
                   7202: 
                   7203:        case ASHIFTRT:
                   7204:          /* If we are extracting just the sign bit of an arithmetic right 
                   7205:             shift, that shift is not needed.  */
                   7206:          if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1)
                   7207:            {
                   7208:              varop = XEXP (varop, 0);
                   7209:              continue;
                   7210:            }
                   7211: 
                   7212:          /* ... fall through ... */
                   7213: 
                   7214:        case LSHIFTRT:
                   7215:        case ASHIFT:
                   7216:        case LSHIFT:
                   7217:        case ROTATE:
                   7218:          /* Here we have two nested shifts.  The result is usually the
                   7219:             AND of a new shift with a mask.  We compute the result below.  */
                   7220:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   7221:              && INTVAL (XEXP (varop, 1)) >= 0
                   7222:              && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
1.1.1.4   root     7223:              && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
                   7224:              && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
1.1       root     7225:            {
                   7226:              enum rtx_code first_code = GET_CODE (varop);
                   7227:              int first_count = INTVAL (XEXP (varop, 1));
1.1.1.4   root     7228:              unsigned HOST_WIDE_INT mask;
1.1       root     7229:              rtx mask_rtx;
                   7230:              rtx inner;
                   7231: 
                   7232:              if (first_code == LSHIFT)
                   7233:                first_code = ASHIFT;
                   7234: 
                   7235:              /* We have one common special case.  We can't do any merging if
                   7236:                 the inner code is an ASHIFTRT of a smaller mode.  However, if
                   7237:                 we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
                   7238:                 with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
                   7239:                 we can convert it to
                   7240:                 (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
                   7241:                 This simplifies certain SIGN_EXTEND operations.  */
                   7242:              if (code == ASHIFT && first_code == ASHIFTRT
                   7243:                  && (GET_MODE_BITSIZE (result_mode)
                   7244:                      - GET_MODE_BITSIZE (GET_MODE (varop))) == count)
                   7245:                {
                   7246:                  /* C3 has the low-order C1 bits zero.  */
                   7247:                  
1.1.1.4   root     7248:                  mask = (GET_MODE_MASK (mode)
                   7249:                          & ~ (((HOST_WIDE_INT) 1 << first_count) - 1));
1.1       root     7250: 
1.1.1.4   root     7251:                  varop = simplify_and_const_int (NULL_RTX, result_mode,
1.1       root     7252:                                                  XEXP (varop, 0), mask);
1.1.1.4   root     7253:                  varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
1.1       root     7254:                                                varop, count);
                   7255:                  count = first_count;
                   7256:                  code = ASHIFTRT;
                   7257:                  continue;
                   7258:                }
                   7259:              
1.1.1.4   root     7260:              /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
                   7261:                 than C1 high-order bits equal to the sign bit, we can convert
                   7262:                 this to either an ASHIFT or a ASHIFTRT depending on the
                   7263:                 two counts. 
1.1       root     7264: 
                   7265:                 We cannot do this if VAROP's mode is not SHIFT_MODE.  */
                   7266: 
                   7267:              if (code == ASHIFTRT && first_code == ASHIFT
                   7268:                  && GET_MODE (varop) == shift_mode
1.1.1.4   root     7269:                  && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
                   7270:                      > first_count))
1.1       root     7271:                {
1.1.1.4   root     7272:                  count -= first_count;
                   7273:                  if (count < 0)
                   7274:                    count = - count, code = ASHIFT;
                   7275:                  varop = XEXP (varop, 0);
                   7276:                  continue;
1.1       root     7277:                }
                   7278: 
                   7279:              /* There are some cases we can't do.  If CODE is ASHIFTRT,
                   7280:                 we can only do this if FIRST_CODE is also ASHIFTRT.
                   7281: 
                   7282:                 We can't do the case when CODE is ROTATE and FIRST_CODE is
                   7283:                 ASHIFTRT.
                   7284: 
                   7285:                 If the mode of this shift is not the mode of the outer shift,
                   7286:                 we can't do this if either shift is ASHIFTRT or ROTATE.
                   7287: 
                   7288:                 Finally, we can't do any of these if the mode is too wide
                   7289:                 unless the codes are the same.
                   7290: 
                   7291:                 Handle the case where the shift codes are the same
                   7292:                 first.  */
                   7293: 
                   7294:              if (code == first_code)
                   7295:                {
                   7296:                  if (GET_MODE (varop) != result_mode
                   7297:                      && (code == ASHIFTRT || code == ROTATE))
                   7298:                    break;
                   7299: 
                   7300:                  count += first_count;
                   7301:                  varop = XEXP (varop, 0);
                   7302:                  continue;
                   7303:                }
                   7304: 
                   7305:              if (code == ASHIFTRT
                   7306:                  || (code == ROTATE && first_code == ASHIFTRT)
1.1.1.4   root     7307:                  || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
1.1       root     7308:                  || (GET_MODE (varop) != result_mode
                   7309:                      && (first_code == ASHIFTRT || first_code == ROTATE
                   7310:                          || code == ROTATE)))
                   7311:                break;
                   7312: 
                   7313:              /* To compute the mask to apply after the shift, shift the
1.1.1.5 ! root     7314:                 nonzero bits of the inner shift the same way the 
1.1       root     7315:                 outer shift will.  */
                   7316: 
1.1.1.5 ! root     7317:              mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
1.1       root     7318: 
                   7319:              mask_rtx
                   7320:                = simplify_binary_operation (code, result_mode, mask_rtx,
1.1.1.4   root     7321:                                             GEN_INT (count));
1.1       root     7322:                                  
                   7323:              /* Give up if we can't compute an outer operation to use.  */
                   7324:              if (mask_rtx == 0
                   7325:                  || GET_CODE (mask_rtx) != CONST_INT
                   7326:                  || ! merge_outer_ops (&outer_op, &outer_const, AND,
                   7327:                                        INTVAL (mask_rtx),
                   7328:                                        result_mode, &complement_p))
                   7329:                break;
                   7330: 
                   7331:              /* If the shifts are in the same direction, we add the
                   7332:                 counts.  Otherwise, we subtract them.  */
                   7333:              if ((code == ASHIFTRT || code == LSHIFTRT)
                   7334:                  == (first_code == ASHIFTRT || first_code == LSHIFTRT))
                   7335:                count += first_count;
                   7336:              else
                   7337:                count -= first_count;
                   7338: 
                   7339:              /* If COUNT is positive, the new shift is usually CODE, 
                   7340:                 except for the two exceptions below, in which case it is
                   7341:                 FIRST_CODE.  If the count is negative, FIRST_CODE should
                   7342:                 always be used  */
                   7343:              if (count > 0
                   7344:                  && ((first_code == ROTATE && code == ASHIFT)
                   7345:                      || (first_code == ASHIFTRT && code == LSHIFTRT)))
                   7346:                code = first_code;
                   7347:              else if (count < 0)
                   7348:                code = first_code, count = - count;
                   7349: 
                   7350:              varop = XEXP (varop, 0);
                   7351:              continue;
                   7352:            }
                   7353: 
                   7354:          /* If we have (A << B << C) for any shift, we can convert this to
                   7355:             (A << C << B).  This wins if A is a constant.  Only try this if
                   7356:             B is not a constant.  */
                   7357: 
                   7358:          else if (GET_CODE (varop) == code
                   7359:                   && GET_CODE (XEXP (varop, 1)) != CONST_INT
                   7360:                   && 0 != (new
                   7361:                            = simplify_binary_operation (code, mode,
                   7362:                                                         XEXP (varop, 0),
1.1.1.4   root     7363:                                                         GEN_INT (count))))
1.1       root     7364:            {
                   7365:              varop = gen_rtx_combine (code, mode, new, XEXP (varop, 1));
                   7366:              count = 0;
                   7367:              continue;
                   7368:            }
                   7369:          break;
                   7370: 
                   7371:        case NOT:
                   7372:          /* Make this fit the case below.  */
                   7373:          varop = gen_rtx_combine (XOR, mode, XEXP (varop, 0),
1.1.1.4   root     7374:                                   GEN_INT (GET_MODE_MASK (mode)));
1.1       root     7375:          continue;
                   7376: 
                   7377:        case IOR:
                   7378:        case AND:
                   7379:        case XOR:
                   7380:          /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
                   7381:             with C the size of VAROP - 1 and the shift is logical if
                   7382:             STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
                   7383:             we have an (le X 0) operation.   If we have an arithmetic shift
                   7384:             and STORE_FLAG_VALUE is 1 or we have a logical shift with
                   7385:             STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
                   7386: 
                   7387:          if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
                   7388:              && XEXP (XEXP (varop, 0), 1) == constm1_rtx
                   7389:              && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
                   7390:              && (code == LSHIFTRT || code == ASHIFTRT)
                   7391:              && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
                   7392:              && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
                   7393:            {
                   7394:              count = 0;
                   7395:              varop = gen_rtx_combine (LE, GET_MODE (varop), XEXP (varop, 1),
                   7396:                                       const0_rtx);
                   7397: 
                   7398:              if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
                   7399:                varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
                   7400: 
                   7401:              continue;
                   7402:            }
                   7403: 
                   7404:          /* If we have (shift (logical)), move the logical to the outside
                   7405:             to allow it to possibly combine with another logical and the
                   7406:             shift to combine with another shift.  This also canonicalizes to
                   7407:             what a ZERO_EXTRACT looks like.  Also, some machines have
                   7408:             (and (shift)) insns.  */
                   7409: 
                   7410:          if (GET_CODE (XEXP (varop, 1)) == CONST_INT
                   7411:              && (new = simplify_binary_operation (code, result_mode,
                   7412:                                                   XEXP (varop, 1),
1.1.1.4   root     7413:                                                   GEN_INT (count))) != 0
1.1       root     7414:              && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
                   7415:                                  INTVAL (new), result_mode, &complement_p))
                   7416:            {
                   7417:              varop = XEXP (varop, 0);
                   7418:              continue;
                   7419:            }
                   7420: 
                   7421:          /* If we can't do that, try to simplify the shift in each arm of the
                   7422:             logical expression, make a new logical expression, and apply
                   7423:             the inverse distributive law.  */
                   7424:          {
1.1.1.4   root     7425:            rtx lhs = simplify_shift_const (NULL_RTX, code, result_mode,
1.1       root     7426:                                            XEXP (varop, 0), count);
1.1.1.4   root     7427:            rtx rhs = simplify_shift_const (NULL_RTX, code, result_mode,
1.1       root     7428:                                            XEXP (varop, 1), count);
                   7429: 
                   7430:            varop = gen_binary (GET_CODE (varop), result_mode, lhs, rhs);
                   7431:            varop = apply_distributive_law (varop);
                   7432: 
                   7433:            count = 0;
                   7434:          }
                   7435:          break;
                   7436: 
                   7437:        case EQ:
                   7438:          /* convert (lshift (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
                   7439:             says that the sign bit can be tested, FOO has mode MODE, C is
                   7440:             GET_MODE_BITSIZE (MODE) - 1, and FOO has only the low-order bit
1.1.1.5 ! root     7441:             may be nonzero.  */
1.1       root     7442:          if (code == LSHIFT
                   7443:              && XEXP (varop, 1) == const0_rtx
                   7444:              && GET_MODE (XEXP (varop, 0)) == result_mode
                   7445:              && count == GET_MODE_BITSIZE (result_mode) - 1
1.1.1.4   root     7446:              && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
1.1       root     7447:              && ((STORE_FLAG_VALUE
1.1.1.4   root     7448:                   & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1))))
1.1.1.5 ! root     7449:              && nonzero_bits (XEXP (varop, 0), result_mode) == 1
1.1.1.4   root     7450:              && merge_outer_ops (&outer_op, &outer_const, XOR,
                   7451:                                  (HOST_WIDE_INT) 1, result_mode,
                   7452:                                  &complement_p))
1.1       root     7453:            {
                   7454:              varop = XEXP (varop, 0);
                   7455:              count = 0;
                   7456:              continue;
                   7457:            }
                   7458:          break;
                   7459: 
                   7460:        case NEG:
1.1.1.4   root     7461:          /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
                   7462:             than the number of bits in the mode is equivalent to A.  */
                   7463:          if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
1.1.1.5 ! root     7464:              && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
1.1       root     7465:            {
1.1.1.4   root     7466:              varop = XEXP (varop, 0);
1.1       root     7467:              count = 0;
                   7468:              continue;
                   7469:            }
                   7470: 
                   7471:          /* NEG commutes with ASHIFT since it is multiplication.  Move the
                   7472:             NEG outside to allow shifts to combine.  */
                   7473:          if (code == ASHIFT
1.1.1.4   root     7474:              && merge_outer_ops (&outer_op, &outer_const, NEG,
                   7475:                                  (HOST_WIDE_INT) 0, result_mode,
                   7476:                                  &complement_p))
1.1       root     7477:            {
                   7478:              varop = XEXP (varop, 0);
                   7479:              continue;
                   7480:            }
                   7481:          break;
                   7482: 
                   7483:        case PLUS:
1.1.1.4   root     7484:          /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
                   7485:             is one less than the number of bits in the mode is
                   7486:             equivalent to (xor A 1).  */
1.1       root     7487:          if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
                   7488:              && XEXP (varop, 1) == constm1_rtx
1.1.1.5 ! root     7489:              && nonzero_bits (XEXP (varop, 0), result_mode) == 1
1.1.1.4   root     7490:              && merge_outer_ops (&outer_op, &outer_const, XOR,
                   7491:                                  (HOST_WIDE_INT) 1, result_mode,
                   7492:                                  &complement_p))
1.1       root     7493:            {
                   7494:              count = 0;
                   7495:              varop = XEXP (varop, 0);
                   7496:              continue;
                   7497:            }
                   7498: 
1.1.1.3   root     7499:          /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
1.1.1.5 ! root     7500:             that might be nonzero in BAR are those being shifted out and those
1.1.1.3   root     7501:             bits are known zero in FOO, we can replace the PLUS with FOO.
                   7502:             Similarly in the other operand order.  This code occurs when
                   7503:             we are computing the size of a variable-size array.  */
                   7504: 
                   7505:          if ((code == ASHIFTRT || code == LSHIFTRT)
1.1.1.4   root     7506:              && count < HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     7507:              && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
        !          7508:              && (nonzero_bits (XEXP (varop, 1), result_mode)
        !          7509:                  & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
1.1.1.3   root     7510:            {
                   7511:              varop = XEXP (varop, 0);
                   7512:              continue;
                   7513:            }
                   7514:          else if ((code == ASHIFTRT || code == LSHIFTRT)
1.1.1.4   root     7515:                   && count < HOST_BITS_PER_WIDE_INT
                   7516:                   && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     7517:                   && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
1.1.1.3   root     7518:                            >> count)
1.1.1.5 ! root     7519:                   && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
        !          7520:                            & nonzero_bits (XEXP (varop, 1),
1.1.1.3   root     7521:                                                 result_mode)))
                   7522:            {
                   7523:              varop = XEXP (varop, 1);
                   7524:              continue;
                   7525:            }
                   7526: 
1.1       root     7527:          /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
                   7528:          if (code == ASHIFT
                   7529:              && GET_CODE (XEXP (varop, 1)) == CONST_INT
                   7530:              && (new = simplify_binary_operation (ASHIFT, result_mode,
                   7531:                                                   XEXP (varop, 1),
1.1.1.4   root     7532:                                                   GEN_INT (count))) != 0
1.1       root     7533:              && merge_outer_ops (&outer_op, &outer_const, PLUS,
                   7534:                                  INTVAL (new), result_mode, &complement_p))
                   7535:            {
                   7536:              varop = XEXP (varop, 0);
                   7537:              continue;
                   7538:            }
                   7539:          break;
                   7540: 
                   7541:        case MINUS:
                   7542:          /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
                   7543:             with C the size of VAROP - 1 and the shift is logical if
                   7544:             STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
                   7545:             we have a (gt X 0) operation.  If the shift is arithmetic with
                   7546:             STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
                   7547:             we have a (neg (gt X 0)) operation.  */
                   7548: 
                   7549:          if (GET_CODE (XEXP (varop, 0)) == ASHIFTRT
                   7550:              && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
                   7551:              && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
                   7552:              && (code == LSHIFTRT || code == ASHIFTRT)
                   7553:              && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
                   7554:              && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
                   7555:              && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
                   7556:            {
                   7557:              count = 0;
                   7558:              varop = gen_rtx_combine (GT, GET_MODE (varop), XEXP (varop, 1),
                   7559:                                       const0_rtx);
                   7560: 
                   7561:              if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
                   7562:                varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
                   7563: 
                   7564:              continue;
                   7565:            }
                   7566:          break;
                   7567:        }
                   7568: 
                   7569:       break;
                   7570:     }
                   7571: 
                   7572:   /* We need to determine what mode to do the shift in.  If the shift is
                   7573:      a ASHIFTRT or ROTATE, we must always do it in the mode it was originally
                   7574:      done in.  Otherwise, we can do it in MODE, the widest mode encountered.
                   7575:      The code we care about is that of the shift that will actually be done,
                   7576:      not the shift that was originally requested.  */
                   7577:   shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode);
                   7578: 
                   7579:   /* We have now finished analyzing the shift.  The result should be
                   7580:      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
                   7581:      OUTER_OP is non-NIL, it is an operation that needs to be applied
                   7582:      to the result of the shift.  OUTER_CONST is the relevant constant,
                   7583:      but we must turn off all bits turned off in the shift.
                   7584: 
                   7585:      If we were passed a value for X, see if we can use any pieces of
                   7586:      it.  If not, make new rtx.  */
                   7587: 
                   7588:   if (x && GET_RTX_CLASS (GET_CODE (x)) == '2'
                   7589:       && GET_CODE (XEXP (x, 1)) == CONST_INT
                   7590:       && INTVAL (XEXP (x, 1)) == count)
                   7591:     const_rtx = XEXP (x, 1);
                   7592:   else
1.1.1.4   root     7593:     const_rtx = GEN_INT (count);
1.1       root     7594: 
                   7595:   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
                   7596:       && GET_MODE (XEXP (x, 0)) == shift_mode
                   7597:       && SUBREG_REG (XEXP (x, 0)) == varop)
                   7598:     varop = XEXP (x, 0);
                   7599:   else if (GET_MODE (varop) != shift_mode)
                   7600:     varop = gen_lowpart_for_combine (shift_mode, varop);
                   7601: 
                   7602:   /* If we can't make the SUBREG, try to return what we were given. */
                   7603:   if (GET_CODE (varop) == CLOBBER)
                   7604:     return x ? x : varop;
                   7605: 
                   7606:   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
                   7607:   if (new != 0)
                   7608:     x = new;
                   7609:   else
                   7610:     {
                   7611:       if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode)
                   7612:        x = gen_rtx_combine (code, shift_mode, varop, const_rtx);
                   7613: 
                   7614:       SUBST (XEXP (x, 0), varop);
                   7615:       SUBST (XEXP (x, 1), const_rtx);
                   7616:     }
                   7617: 
                   7618:   /* If we were doing a LSHIFTRT in a wider mode than it was originally,
                   7619:      turn off all the bits that the shift would have turned off.  */
                   7620:   if (orig_code == LSHIFTRT && result_mode != shift_mode)
1.1.1.4   root     7621:     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
1.1       root     7622:                                GET_MODE_MASK (result_mode) >> orig_count);
                   7623:       
                   7624:   /* Do the remainder of the processing in RESULT_MODE.  */
                   7625:   x = gen_lowpart_for_combine (result_mode, x);
                   7626: 
                   7627:   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
                   7628:      operation.  */
                   7629:   if (complement_p)
                   7630:     x = gen_unary (NOT, result_mode, x);
                   7631: 
                   7632:   if (outer_op != NIL)
                   7633:     {
1.1.1.4   root     7634:       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
1.1       root     7635:        outer_const &= GET_MODE_MASK (result_mode);
                   7636: 
                   7637:       if (outer_op == AND)
1.1.1.4   root     7638:        x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
1.1       root     7639:       else if (outer_op == SET)
                   7640:        /* This means that we have determined that the result is
                   7641:           equivalent to a constant.  This should be rare.  */
1.1.1.4   root     7642:        x = GEN_INT (outer_const);
1.1       root     7643:       else if (GET_RTX_CLASS (outer_op) == '1')
                   7644:        x = gen_unary (outer_op, result_mode, x);
                   7645:       else
1.1.1.4   root     7646:        x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
1.1       root     7647:     }
                   7648: 
                   7649:   return x;
                   7650: }  
                   7651: 
                   7652: /* Like recog, but we receive the address of a pointer to a new pattern.
                   7653:    We try to match the rtx that the pointer points to.
                   7654:    If that fails, we may try to modify or replace the pattern,
                   7655:    storing the replacement into the same pointer object.
                   7656: 
                   7657:    Modifications include deletion or addition of CLOBBERs.
                   7658: 
                   7659:    PNOTES is a pointer to a location where any REG_UNUSED notes added for
                   7660:    the CLOBBERs are placed.
                   7661: 
                   7662:    The value is the final insn code from the pattern ultimately matched,
                   7663:    or -1.  */
                   7664: 
                   7665: static int
                   7666: recog_for_combine (pnewpat, insn, pnotes)
                   7667:      rtx *pnewpat;
                   7668:      rtx insn;
                   7669:      rtx *pnotes;
                   7670: {
                   7671:   register rtx pat = *pnewpat;
                   7672:   int insn_code_number;
                   7673:   int num_clobbers_to_add = 0;
                   7674:   int i;
                   7675:   rtx notes = 0;
                   7676: 
                   7677:   /* Is the result of combination a valid instruction?  */
                   7678:   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
                   7679: 
                   7680:   /* If it isn't, there is the possibility that we previously had an insn
                   7681:      that clobbered some register as a side effect, but the combined
                   7682:      insn doesn't need to do that.  So try once more without the clobbers
                   7683:      unless this represents an ASM insn.  */
                   7684: 
                   7685:   if (insn_code_number < 0 && ! check_asm_operands (pat)
                   7686:       && GET_CODE (pat) == PARALLEL)
                   7687:     {
                   7688:       int pos;
                   7689: 
                   7690:       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
                   7691:        if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
                   7692:          {
                   7693:            if (i != pos)
                   7694:              SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
                   7695:            pos++;
                   7696:          }
                   7697: 
                   7698:       SUBST_INT (XVECLEN (pat, 0), pos);
                   7699: 
                   7700:       if (pos == 1)
                   7701:        pat = XVECEXP (pat, 0, 0);
                   7702: 
                   7703:       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
                   7704:     }
                   7705: 
                   7706:   /* If we had any clobbers to add, make a new pattern than contains
                   7707:      them.  Then check to make sure that all of them are dead.  */
                   7708:   if (num_clobbers_to_add)
                   7709:     {
                   7710:       rtx newpat = gen_rtx (PARALLEL, VOIDmode,
                   7711:                            gen_rtvec (GET_CODE (pat) == PARALLEL
                   7712:                                       ? XVECLEN (pat, 0) + num_clobbers_to_add
                   7713:                                       : num_clobbers_to_add + 1));
                   7714: 
                   7715:       if (GET_CODE (pat) == PARALLEL)
                   7716:        for (i = 0; i < XVECLEN (pat, 0); i++)
                   7717:          XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
                   7718:       else
                   7719:        XVECEXP (newpat, 0, 0) = pat;
                   7720: 
                   7721:       add_clobbers (newpat, insn_code_number);
                   7722: 
                   7723:       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
                   7724:           i < XVECLEN (newpat, 0); i++)
                   7725:        {
                   7726:          if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
                   7727:              && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
                   7728:            return -1;
                   7729:          notes = gen_rtx (EXPR_LIST, REG_UNUSED,
                   7730:                           XEXP (XVECEXP (newpat, 0, i), 0), notes);
                   7731:        }
                   7732:       pat = newpat;
                   7733:     }
                   7734: 
                   7735:   *pnewpat = pat;
                   7736:   *pnotes = notes;
                   7737: 
                   7738:   return insn_code_number;
                   7739: }
                   7740: 
                   7741: /* Like gen_lowpart but for use by combine.  In combine it is not possible
                   7742:    to create any new pseudoregs.  However, it is safe to create
                   7743:    invalid memory addresses, because combine will try to recognize
                   7744:    them and all they will do is make the combine attempt fail.
                   7745: 
                   7746:    If for some reason this cannot do its job, an rtx
                   7747:    (clobber (const_int 0)) is returned.
                   7748:    An insn containing that will not be recognized.  */
                   7749: 
                   7750: #undef gen_lowpart
                   7751: 
                   7752: static rtx
                   7753: gen_lowpart_for_combine (mode, x)
                   7754:      enum machine_mode mode;
                   7755:      register rtx x;
                   7756: {
                   7757:   rtx result;
                   7758: 
                   7759:   if (GET_MODE (x) == mode)
                   7760:     return x;
                   7761: 
1.1.1.5 ! root     7762:   /* We can only support MODE being wider than a word if X is a
        !          7763:      constant integer or has a mode the same size.  */
        !          7764: 
        !          7765:   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
        !          7766:       && ! ((GET_MODE (x) == VOIDmode
        !          7767:             && (GET_CODE (x) == CONST_INT
        !          7768:                 || GET_CODE (x) == CONST_DOUBLE))
        !          7769:            || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
1.1       root     7770:     return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
                   7771: 
                   7772:   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
                   7773:      won't know what to do.  So we will strip off the SUBREG here and
                   7774:      process normally.  */
                   7775:   if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
                   7776:     {
                   7777:       x = SUBREG_REG (x);
                   7778:       if (GET_MODE (x) == mode)
                   7779:        return x;
                   7780:     }
                   7781: 
                   7782:   result = gen_lowpart_common (mode, x);
                   7783:   if (result)
                   7784:     return result;
                   7785: 
                   7786:   if (GET_CODE (x) == MEM)
                   7787:     {
                   7788:       register int offset = 0;
                   7789:       rtx new;
                   7790: 
                   7791:       /* Refuse to work on a volatile memory ref or one with a mode-dependent
                   7792:         address.  */
                   7793:       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
                   7794:        return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
                   7795: 
                   7796:       /* If we want to refer to something bigger than the original memref,
                   7797:         generate a perverse subreg instead.  That will force a reload
                   7798:         of the original memref X.  */
                   7799:       if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
                   7800:        return gen_rtx (SUBREG, mode, x, 0);
                   7801: 
                   7802: #if WORDS_BIG_ENDIAN
                   7803:       offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
                   7804:                - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
                   7805: #endif
                   7806: #if BYTES_BIG_ENDIAN
                   7807:       /* Adjust the address so that the address-after-the-data
                   7808:         is unchanged.  */
                   7809:       offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
                   7810:                 - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
                   7811: #endif
                   7812:       new = gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), offset));
                   7813:       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
                   7814:       MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
                   7815:       MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
                   7816:       return new;
                   7817:     }
                   7818: 
                   7819:   /* If X is a comparison operator, rewrite it in a new mode.  This
                   7820:      probably won't match, but may allow further simplifications.  */
                   7821:   else if (GET_RTX_CLASS (GET_CODE (x)) == '<')
                   7822:     return gen_rtx_combine (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
                   7823: 
                   7824:   /* If we couldn't simplify X any other way, just enclose it in a
                   7825:      SUBREG.  Normally, this SUBREG won't match, but some patterns may
1.1.1.3   root     7826:      include an explicit SUBREG or we may simplify it further in combine.  */
1.1       root     7827:   else
1.1.1.2   root     7828:     {
                   7829:       int word = 0;
                   7830: 
                   7831:       if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
                   7832:        word = ((GET_MODE_SIZE (GET_MODE (x))
                   7833:                 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
                   7834:                / UNITS_PER_WORD);
                   7835:       return gen_rtx (SUBREG, mode, x, word);
                   7836:     }
1.1       root     7837: }
                   7838: 
                   7839: /* Make an rtx expression.  This is a subset of gen_rtx and only supports
                   7840:    expressions of 1, 2, or 3 operands, each of which are rtx expressions.
                   7841: 
                   7842:    If the identical expression was previously in the insn (in the undobuf),
                   7843:    it will be returned.  Only if it is not found will a new expression
                   7844:    be made.  */
                   7845: 
                   7846: /*VARARGS2*/
                   7847: static rtx
                   7848: gen_rtx_combine (va_alist)
                   7849:      va_dcl
                   7850: {
                   7851:   va_list p;
                   7852:   enum rtx_code code;
                   7853:   enum machine_mode mode;
                   7854:   int n_args;
                   7855:   rtx args[3];
                   7856:   int i, j;
                   7857:   char *fmt;
                   7858:   rtx rt;
                   7859: 
                   7860:   va_start (p);
                   7861:   code = va_arg (p, enum rtx_code);
                   7862:   mode = va_arg (p, enum machine_mode);
                   7863:   n_args = GET_RTX_LENGTH (code);
                   7864:   fmt = GET_RTX_FORMAT (code);
                   7865: 
                   7866:   if (n_args == 0 || n_args > 3)
                   7867:     abort ();
                   7868: 
                   7869:   /* Get each arg and verify that it is supposed to be an expression.  */
                   7870:   for (j = 0; j < n_args; j++)
                   7871:     {
                   7872:       if (*fmt++ != 'e')
                   7873:        abort ();
                   7874: 
                   7875:       args[j] = va_arg (p, rtx);
                   7876:     }
                   7877: 
                   7878:   /* See if this is in undobuf.  Be sure we don't use objects that came
                   7879:      from another insn; this could produce circular rtl structures.  */
                   7880: 
                   7881:   for (i = previous_num_undos; i < undobuf.num_undo; i++)
                   7882:     if (!undobuf.undo[i].is_int
1.1.1.4   root     7883:        && GET_CODE (undobuf.undo[i].old_contents.rtx) == code
                   7884:        && GET_MODE (undobuf.undo[i].old_contents.rtx) == mode)
1.1       root     7885:       {
                   7886:        for (j = 0; j < n_args; j++)
1.1.1.4   root     7887:          if (XEXP (undobuf.undo[i].old_contents.rtx, j) != args[j])
1.1       root     7888:            break;
                   7889: 
                   7890:        if (j == n_args)
1.1.1.4   root     7891:          return undobuf.undo[i].old_contents.rtx;
1.1       root     7892:       }
                   7893: 
                   7894:   /* Otherwise make a new rtx.  We know we have 1, 2, or 3 args.
                   7895:      Use rtx_alloc instead of gen_rtx because it's faster on RISC.  */
                   7896:   rt = rtx_alloc (code);
                   7897:   PUT_MODE (rt, mode);
                   7898:   XEXP (rt, 0) = args[0];
                   7899:   if (n_args > 1)
                   7900:     {
                   7901:       XEXP (rt, 1) = args[1];
                   7902:       if (n_args > 2)
                   7903:        XEXP (rt, 2) = args[2];
                   7904:     }
                   7905:   return rt;
                   7906: }
                   7907: 
                   7908: /* These routines make binary and unary operations by first seeing if they
                   7909:    fold; if not, a new expression is allocated.  */
                   7910: 
                   7911: static rtx
                   7912: gen_binary (code, mode, op0, op1)
                   7913:      enum rtx_code code;
                   7914:      enum machine_mode mode;
                   7915:      rtx op0, op1;
                   7916: {
                   7917:   rtx result;
1.1.1.4   root     7918:   rtx tem;
                   7919: 
                   7920:   if (GET_RTX_CLASS (code) == 'c'
                   7921:       && (GET_CODE (op0) == CONST_INT
                   7922:          || (CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)))
                   7923:     tem = op0, op0 = op1, op1 = tem;
1.1       root     7924: 
                   7925:   if (GET_RTX_CLASS (code) == '<') 
                   7926:     {
                   7927:       enum machine_mode op_mode = GET_MODE (op0);
                   7928:       if (op_mode == VOIDmode)
                   7929:        op_mode = GET_MODE (op1);
                   7930:       result = simplify_relational_operation (code, op_mode, op0, op1);
                   7931:     }
                   7932:   else
                   7933:     result = simplify_binary_operation (code, mode, op0, op1);
                   7934: 
                   7935:   if (result)
                   7936:     return result;
                   7937: 
                   7938:   /* Put complex operands first and constants second.  */
                   7939:   if (GET_RTX_CLASS (code) == 'c'
                   7940:       && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
                   7941:          || (GET_RTX_CLASS (GET_CODE (op0)) == 'o'
                   7942:              && GET_RTX_CLASS (GET_CODE (op1)) != 'o')
                   7943:          || (GET_CODE (op0) == SUBREG
                   7944:              && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o'
                   7945:              && GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
                   7946:     return gen_rtx_combine (code, mode, op1, op0);
                   7947: 
                   7948:   return gen_rtx_combine (code, mode, op0, op1);
                   7949: }
                   7950: 
                   7951: static rtx
                   7952: gen_unary (code, mode, op0)
                   7953:      enum rtx_code code;
                   7954:      enum machine_mode mode;
                   7955:      rtx op0;
                   7956: {
                   7957:   rtx result = simplify_unary_operation (code, mode, op0, mode);
                   7958: 
                   7959:   if (result)
                   7960:     return result;
                   7961: 
                   7962:   return gen_rtx_combine (code, mode, op0);
                   7963: }
                   7964: 
                   7965: /* Simplify a comparison between *POP0 and *POP1 where CODE is the
                   7966:    comparison code that will be tested.
                   7967: 
                   7968:    The result is a possibly different comparison code to use.  *POP0 and
                   7969:    *POP1 may be updated.
                   7970: 
                   7971:    It is possible that we might detect that a comparison is either always
                   7972:    true or always false.  However, we do not perform general constant
1.1.1.2   root     7973:    folding in combine, so this knowledge isn't useful.  Such tautologies
1.1       root     7974:    should have been detected earlier.  Hence we ignore all such cases.  */
                   7975: 
                   7976: static enum rtx_code
                   7977: simplify_comparison (code, pop0, pop1)
                   7978:      enum rtx_code code;
                   7979:      rtx *pop0;
                   7980:      rtx *pop1;
                   7981: {
                   7982:   rtx op0 = *pop0;
                   7983:   rtx op1 = *pop1;
                   7984:   rtx tem, tem1;
                   7985:   int i;
                   7986:   enum machine_mode mode, tmode;
                   7987: 
                   7988:   /* Try a few ways of applying the same transformation to both operands.  */
                   7989:   while (1)
                   7990:     {
                   7991:       /* If both operands are the same constant shift, see if we can ignore the
                   7992:         shift.  We can if the shift is a rotate or if the bits shifted out of
1.1.1.5 ! root     7993:         this shift are known to be zero for both inputs and if the type of
1.1       root     7994:         comparison is compatible with the shift.  */
                   7995:       if (GET_CODE (op0) == GET_CODE (op1)
1.1.1.4   root     7996:          && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
1.1       root     7997:          && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
                   7998:              || ((GET_CODE (op0) == LSHIFTRT
                   7999:                   || GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT)
                   8000:                  && (code != GT && code != LT && code != GE && code != LE))
                   8001:              || (GET_CODE (op0) == ASHIFTRT
                   8002:                  && (code != GTU && code != LTU
                   8003:                      && code != GEU && code != GEU)))
                   8004:          && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8005:          && INTVAL (XEXP (op0, 1)) >= 0
1.1.1.4   root     8006:          && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
1.1       root     8007:          && XEXP (op0, 1) == XEXP (op1, 1))
                   8008:        {
                   8009:          enum machine_mode mode = GET_MODE (op0);
1.1.1.4   root     8010:          unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
1.1       root     8011:          int shift_count = INTVAL (XEXP (op0, 1));
                   8012: 
                   8013:          if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
                   8014:            mask &= (mask >> shift_count) << shift_count;
                   8015:          else if (GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT)
                   8016:            mask = (mask & (mask << shift_count)) >> shift_count;
                   8017: 
1.1.1.5 ! root     8018:          if ((nonzero_bits (XEXP (op0, 0), mode) & ~ mask) == 0
        !          8019:              && (nonzero_bits (XEXP (op1, 0), mode) & ~ mask) == 0)
1.1       root     8020:            op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
                   8021:          else
                   8022:            break;
                   8023:        }
                   8024: 
                   8025:       /* If both operands are AND's of a paradoxical SUBREG by constant, the
                   8026:         SUBREGs are of the same mode, and, in both cases, the AND would
                   8027:         be redundant if the comparison was done in the narrower mode,
                   8028:         do the comparison in the narrower mode (e.g., we are AND'ing with 1
1.1.1.5 ! root     8029:         and the operand's possibly nonzero bits are 0xffffff01; in that case
        !          8030:         if we only care about QImode, we don't need the AND).  This case
        !          8031:         occurs if the output mode of an scc insn is not SImode and
1.1       root     8032:         STORE_FLAG_VALUE == 1 (e.g., the 386).  */
                   8033: 
                   8034:       else if  (GET_CODE (op0) == AND && GET_CODE (op1) == AND
                   8035:                && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8036:                && GET_CODE (XEXP (op1, 1)) == CONST_INT
                   8037:                && GET_CODE (XEXP (op0, 0)) == SUBREG
                   8038:                && GET_CODE (XEXP (op1, 0)) == SUBREG
                   8039:                && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)))
                   8040:                    > GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
                   8041:                && (GET_MODE (SUBREG_REG (XEXP (op0, 0)))
                   8042:                    == GET_MODE (SUBREG_REG (XEXP (op1, 0))))
1.1.1.4   root     8043:                && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
                   8044:                    <= HOST_BITS_PER_WIDE_INT)
1.1.1.5 ! root     8045:                && (nonzero_bits (SUBREG_REG (XEXP (op0, 0)),
1.1       root     8046:                                      GET_MODE (SUBREG_REG (XEXP (op0, 0))))
                   8047:                    & ~ INTVAL (XEXP (op0, 1))) == 0
1.1.1.5 ! root     8048:                && (nonzero_bits (SUBREG_REG (XEXP (op1, 0)),
1.1       root     8049:                                      GET_MODE (SUBREG_REG (XEXP (op1, 0))))
                   8050:                    & ~ INTVAL (XEXP (op1, 1))) == 0)
                   8051:        {
                   8052:          op0 = SUBREG_REG (XEXP (op0, 0));
                   8053:          op1 = SUBREG_REG (XEXP (op1, 0));
                   8054: 
                   8055:          /* the resulting comparison is always unsigned since we masked off
                   8056:             the original sign bit. */
                   8057:          code = unsigned_condition (code);
                   8058:        }
                   8059:       else
                   8060:        break;
                   8061:     }
                   8062:      
                   8063:   /* If the first operand is a constant, swap the operands and adjust the
                   8064:      comparison code appropriately.  */
                   8065:   if (CONSTANT_P (op0))
                   8066:     {
                   8067:       tem = op0, op0 = op1, op1 = tem;
                   8068:       code = swap_condition (code);
                   8069:     }
                   8070: 
                   8071:   /* We now enter a loop during which we will try to simplify the comparison.
                   8072:      For the most part, we only are concerned with comparisons with zero,
                   8073:      but some things may really be comparisons with zero but not start
                   8074:      out looking that way.  */
                   8075: 
                   8076:   while (GET_CODE (op1) == CONST_INT)
                   8077:     {
                   8078:       enum machine_mode mode = GET_MODE (op0);
                   8079:       int mode_width = GET_MODE_BITSIZE (mode);
1.1.1.4   root     8080:       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
1.1       root     8081:       int equality_comparison_p;
                   8082:       int sign_bit_comparison_p;
                   8083:       int unsigned_comparison_p;
1.1.1.4   root     8084:       HOST_WIDE_INT const_op;
1.1       root     8085: 
                   8086:       /* We only want to handle integral modes.  This catches VOIDmode,
                   8087:         CCmode, and the floating-point modes.  An exception is that we
                   8088:         can handle VOIDmode if OP0 is a COMPARE or a comparison
                   8089:         operation.  */
                   8090: 
                   8091:       if (GET_MODE_CLASS (mode) != MODE_INT
                   8092:          && ! (mode == VOIDmode
                   8093:                && (GET_CODE (op0) == COMPARE
                   8094:                    || GET_RTX_CLASS (GET_CODE (op0)) == '<')))
                   8095:        break;
                   8096: 
                   8097:       /* Get the constant we are comparing against and turn off all bits
                   8098:         not on in our mode.  */
                   8099:       const_op = INTVAL (op1);
1.1.1.4   root     8100:       if (mode_width <= HOST_BITS_PER_WIDE_INT)
1.1.1.3   root     8101:        const_op &= mask;
1.1       root     8102: 
                   8103:       /* If we are comparing against a constant power of two and the value
1.1.1.5 ! root     8104:         being compared can only have that single bit nonzero (e.g., it was
1.1       root     8105:         `and'ed with that bit), we can replace this with a comparison
                   8106:         with zero.  */
                   8107:       if (const_op
                   8108:          && (code == EQ || code == NE || code == GE || code == GEU
                   8109:              || code == LT || code == LTU)
1.1.1.4   root     8110:          && mode_width <= HOST_BITS_PER_WIDE_INT
1.1       root     8111:          && exact_log2 (const_op) >= 0
1.1.1.5 ! root     8112:          && nonzero_bits (op0, mode) == const_op)
1.1       root     8113:        {
                   8114:          code = (code == EQ || code == GE || code == GEU ? NE : EQ);
                   8115:          op1 = const0_rtx, const_op = 0;
                   8116:        }
                   8117: 
1.1.1.4   root     8118:       /* Similarly, if we are comparing a value known to be either -1 or
                   8119:         0 with -1, change it to the opposite comparison against zero.  */
                   8120: 
                   8121:       if (const_op == -1
                   8122:          && (code == EQ || code == NE || code == GT || code == LE
                   8123:              || code == GEU || code == LTU)
                   8124:          && num_sign_bit_copies (op0, mode) == mode_width)
                   8125:        {
                   8126:          code = (code == EQ || code == LE || code == GEU ? NE : EQ);
                   8127:          op1 = const0_rtx, const_op = 0;
                   8128:        }
                   8129: 
1.1       root     8130:       /* Do some canonicalizations based on the comparison code.  We prefer
1.1.1.3   root     8131:         comparisons against zero and then prefer equality comparisons.  
                   8132:         If we can reduce the size of a constant, we will do that too.  */
1.1       root     8133: 
                   8134:       switch (code)
                   8135:        {
                   8136:        case LT:
1.1.1.3   root     8137:          /* < C is equivalent to <= (C - 1) */
                   8138:          if (const_op > 0)
1.1       root     8139:            {
1.1.1.3   root     8140:              const_op -= 1;
1.1.1.4   root     8141:              op1 = GEN_INT (const_op);
1.1       root     8142:              code = LE;
                   8143:              /* ... fall through to LE case below.  */
                   8144:            }
                   8145:          else
                   8146:            break;
                   8147: 
                   8148:        case LE:
1.1.1.3   root     8149:          /* <= C is equivalent to < (C + 1); we do this for C < 0  */
                   8150:          if (const_op < 0)
                   8151:            {
                   8152:              const_op += 1;
1.1.1.4   root     8153:              op1 = GEN_INT (const_op);
1.1.1.3   root     8154:              code = LT;
                   8155:            }
1.1       root     8156: 
                   8157:          /* If we are doing a <= 0 comparison on a value known to have
                   8158:             a zero sign bit, we can replace this with == 0.  */
                   8159:          else if (const_op == 0
1.1.1.4   root     8160:                   && mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     8161:                   && (nonzero_bits (op0, mode)
1.1.1.4   root     8162:                       & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
1.1       root     8163:            code = EQ;
                   8164:          break;
                   8165: 
                   8166:        case GE:
1.1.1.3   root     8167:          /* >= C is equivalent to > (C - 1). */
                   8168:          if (const_op > 0)
1.1       root     8169:            {
1.1.1.3   root     8170:              const_op -= 1;
1.1.1.4   root     8171:              op1 = GEN_INT (const_op);
1.1       root     8172:              code = GT;
                   8173:              /* ... fall through to GT below.  */
                   8174:            }
                   8175:          else
                   8176:            break;
                   8177: 
                   8178:        case GT:
1.1.1.3   root     8179:          /* > C is equivalent to >= (C + 1); we do this for C < 0*/
                   8180:          if (const_op < 0)
                   8181:            {
                   8182:              const_op += 1;
1.1.1.4   root     8183:              op1 = GEN_INT (const_op);
1.1.1.3   root     8184:              code = GE;
                   8185:            }
1.1       root     8186: 
                   8187:          /* If we are doing a > 0 comparison on a value known to have
                   8188:             a zero sign bit, we can replace this with != 0.  */
                   8189:          else if (const_op == 0
1.1.1.4   root     8190:                   && mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     8191:                   && (nonzero_bits (op0, mode)
1.1.1.4   root     8192:                       & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
1.1       root     8193:            code = NE;
                   8194:          break;
                   8195: 
                   8196:        case LTU:
1.1.1.3   root     8197:          /* < C is equivalent to <= (C - 1).  */
                   8198:          if (const_op > 0)
                   8199:            {
                   8200:              const_op -= 1;
1.1.1.4   root     8201:              op1 = GEN_INT (const_op);
1.1.1.3   root     8202:              code = LEU;
                   8203:              /* ... fall through ... */
                   8204:            }
1.1.1.4   root     8205: 
                   8206:          /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
                   8207:          else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1))
                   8208:            {
                   8209:              const_op = 0, op1 = const0_rtx;
                   8210:              code = GE;
                   8211:              break;
                   8212:            }
1.1.1.3   root     8213:          else
                   8214:            break;
1.1       root     8215: 
                   8216:        case LEU:
                   8217:          /* unsigned <= 0 is equivalent to == 0 */
                   8218:          if (const_op == 0)
                   8219:            code = EQ;
1.1.1.4   root     8220: 
                   8221:          /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
                   8222:          else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
                   8223:            {
                   8224:              const_op = 0, op1 = const0_rtx;
                   8225:              code = GE;
                   8226:            }
1.1       root     8227:          break;
                   8228: 
1.1.1.3   root     8229:        case GEU:
                   8230:          /* >= C is equivalent to < (C - 1).  */
                   8231:          if (const_op > 1)
                   8232:            {
                   8233:              const_op -= 1;
1.1.1.4   root     8234:              op1 = GEN_INT (const_op);
1.1.1.3   root     8235:              code = GTU;
                   8236:              /* ... fall through ... */
                   8237:            }
1.1.1.4   root     8238: 
                   8239:          /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
                   8240:          else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1))
                   8241:            {
                   8242:              const_op = 0, op1 = const0_rtx;
                   8243:              code = LT;
                   8244:            }
1.1.1.3   root     8245:          else
                   8246:            break;
                   8247: 
1.1       root     8248:        case GTU:
                   8249:          /* unsigned > 0 is equivalent to != 0 */
                   8250:          if (const_op == 0)
                   8251:            code = NE;
1.1.1.4   root     8252: 
                   8253:          /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
                   8254:          else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
                   8255:            {
                   8256:              const_op = 0, op1 = const0_rtx;
                   8257:              code = LT;
                   8258:            }
1.1       root     8259:          break;
                   8260:        }
                   8261: 
                   8262:       /* Compute some predicates to simplify code below.  */
                   8263: 
                   8264:       equality_comparison_p = (code == EQ || code == NE);
                   8265:       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
                   8266:       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
                   8267:                               || code == LEU);
                   8268: 
                   8269:       /* Now try cases based on the opcode of OP0.  If none of the cases
                   8270:         does a "continue", we exit this loop immediately after the
                   8271:         switch.  */
                   8272: 
                   8273:       switch (GET_CODE (op0))
                   8274:        {
                   8275:        case ZERO_EXTRACT:
                   8276:          /* If we are extracting a single bit from a variable position in
                   8277:             a constant that has only a single bit set and are comparing it
                   8278:             with zero, we can convert this into an equality comparison 
                   8279:             between the position and the location of the single bit.  We can't
                   8280:             do this if bit endian and we don't have an extzv since we then
                   8281:             can't know what mode to use for the endianness adjustment.  */
                   8282: 
                   8283: #if ! BITS_BIG_ENDIAN || defined (HAVE_extzv)
                   8284:          if (GET_CODE (XEXP (op0, 0)) == CONST_INT
                   8285:              && XEXP (op0, 1) == const1_rtx
                   8286:              && equality_comparison_p && const_op == 0
                   8287:              && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
                   8288:            {
                   8289: #if BITS_BIG_ENDIAN
                   8290:              i = (GET_MODE_BITSIZE
                   8291:                   (insn_operand_mode[(int) CODE_FOR_extzv][1]) - 1 - i);
                   8292: #endif
                   8293: 
                   8294:              op0 = XEXP (op0, 2);
1.1.1.4   root     8295:              op1 = GEN_INT (i);
1.1       root     8296:              const_op = i;
                   8297: 
                   8298:              /* Result is nonzero iff shift count is equal to I.  */
                   8299:              code = reverse_condition (code);
                   8300:              continue;
                   8301:            }
                   8302: #endif
                   8303: 
                   8304:          /* ... fall through ... */
                   8305: 
                   8306:        case SIGN_EXTRACT:
                   8307:          tem = expand_compound_operation (op0);
                   8308:          if (tem != op0)
                   8309:            {
                   8310:              op0 = tem;
                   8311:              continue;
                   8312:            }
                   8313:          break;
                   8314: 
                   8315:        case NOT:
                   8316:          /* If testing for equality, we can take the NOT of the constant.  */
                   8317:          if (equality_comparison_p
                   8318:              && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
                   8319:            {
                   8320:              op0 = XEXP (op0, 0);
                   8321:              op1 = tem;
                   8322:              continue;
                   8323:            }
                   8324: 
                   8325:          /* If just looking at the sign bit, reverse the sense of the
                   8326:             comparison.  */
                   8327:          if (sign_bit_comparison_p)
                   8328:            {
                   8329:              op0 = XEXP (op0, 0);
                   8330:              code = (code == GE ? LT : GE);
                   8331:              continue;
                   8332:            }
                   8333:          break;
                   8334: 
                   8335:        case NEG:
                   8336:          /* If testing for equality, we can take the NEG of the constant.  */
                   8337:          if (equality_comparison_p
                   8338:              && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
                   8339:            {
                   8340:              op0 = XEXP (op0, 0);
                   8341:              op1 = tem;
                   8342:              continue;
                   8343:            }
                   8344: 
                   8345:          /* The remaining cases only apply to comparisons with zero.  */
                   8346:          if (const_op != 0)
                   8347:            break;
                   8348: 
                   8349:          /* When X is ABS or is known positive,
                   8350:             (neg X) is < 0 if and only if X != 0.  */
                   8351: 
                   8352:          if (sign_bit_comparison_p
                   8353:              && (GET_CODE (XEXP (op0, 0)) == ABS
1.1.1.4   root     8354:                  || (mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     8355:                      && (nonzero_bits (XEXP (op0, 0), mode)
1.1.1.4   root     8356:                          & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
1.1       root     8357:            {
                   8358:              op0 = XEXP (op0, 0);
                   8359:              code = (code == LT ? NE : EQ);
                   8360:              continue;
                   8361:            }
                   8362: 
1.1.1.5 ! root     8363:          /* If we have NEG of something whose two high-order bits are the
        !          8364:             same, we know that "(-a) < 0" is equivalent to "a > 0". */
        !          8365:          if (num_sign_bit_copies (op0, mode) >= 2)
1.1       root     8366:            {
                   8367:              op0 = XEXP (op0, 0);
                   8368:              code = swap_condition (code);
                   8369:              continue;
                   8370:            }
                   8371:          break;
                   8372: 
                   8373:        case ROTATE:
                   8374:          /* If we are testing equality and our count is a constant, we
                   8375:             can perform the inverse operation on our RHS.  */
                   8376:          if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8377:              && (tem = simplify_binary_operation (ROTATERT, mode,
                   8378:                                                   op1, XEXP (op0, 1))) != 0)
                   8379:            {
                   8380:              op0 = XEXP (op0, 0);
                   8381:              op1 = tem;
                   8382:              continue;
                   8383:            }
                   8384: 
                   8385:          /* If we are doing a < 0 or >= 0 comparison, it means we are testing
                   8386:             a particular bit.  Convert it to an AND of a constant of that
                   8387:             bit.  This will be converted into a ZERO_EXTRACT.  */
                   8388:          if (const_op == 0 && sign_bit_comparison_p
                   8389:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
1.1.1.4   root     8390:              && mode_width <= HOST_BITS_PER_WIDE_INT)
1.1       root     8391:            {
1.1.1.4   root     8392:              op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
                   8393:                                            ((HOST_WIDE_INT) 1
                   8394:                                             << (mode_width - 1
                   8395:                                                 - INTVAL (XEXP (op0, 1)))));
1.1       root     8396:              code = (code == LT ? NE : EQ);
                   8397:              continue;
                   8398:            }
                   8399: 
                   8400:          /* ... fall through ... */
                   8401: 
                   8402:        case ABS:
                   8403:          /* ABS is ignorable inside an equality comparison with zero.  */
                   8404:          if (const_op == 0 && equality_comparison_p)
                   8405:            {
                   8406:              op0 = XEXP (op0, 0);
                   8407:              continue;
                   8408:            }
                   8409:          break;
                   8410:          
                   8411: 
                   8412:        case SIGN_EXTEND:
                   8413:          /* Can simplify (compare (zero/sign_extend FOO) CONST)
                   8414:             to (compare FOO CONST) if CONST fits in FOO's mode and we 
                   8415:             are either testing inequality or have an unsigned comparison
                   8416:             with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
                   8417:          if (! unsigned_comparison_p
                   8418:              && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
1.1.1.4   root     8419:                  <= HOST_BITS_PER_WIDE_INT)
                   8420:              && ((unsigned HOST_WIDE_INT) const_op
                   8421:                  < (((HOST_WIDE_INT) 1
                   8422:                      << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
1.1       root     8423:            {
                   8424:              op0 = XEXP (op0, 0);
                   8425:              continue;
                   8426:            }
                   8427:          break;
                   8428: 
                   8429:        case SUBREG:
1.1.1.4   root     8430:          /* Check for the case where we are comparing A - C1 with C2,
                   8431:             both constants are smaller than 1/2 the maxium positive
                   8432:             value in MODE, and the comparison is equality or unsigned.
                   8433:             In that case, if A is either zero-extended to MODE or has
                   8434:             sufficient sign bits so that the high-order bit in MODE
                   8435:             is a copy of the sign in the inner mode, we can prove that it is
                   8436:             safe to do the operation in the wider mode.  This simplifies
                   8437:             many range checks.  */
                   8438: 
                   8439:          if (mode_width <= HOST_BITS_PER_WIDE_INT
                   8440:              && subreg_lowpart_p (op0)
                   8441:              && GET_CODE (SUBREG_REG (op0)) == PLUS
                   8442:              && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
                   8443:              && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
                   8444:              && (- INTVAL (XEXP (SUBREG_REG (op0), 1))
                   8445:                  < GET_MODE_MASK (mode) / 2)
1.1.1.5 ! root     8446:              && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
        !          8447:              && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
        !          8448:                                      GET_MODE (SUBREG_REG (op0)))
1.1.1.4   root     8449:                        & ~ GET_MODE_MASK (mode))
                   8450:                  || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
                   8451:                                           GET_MODE (SUBREG_REG (op0)))
                   8452:                      > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
                   8453:                         - GET_MODE_BITSIZE (mode)))))
                   8454:            {
                   8455:              op0 = SUBREG_REG (op0);
                   8456:              continue;
                   8457:            }
                   8458: 
                   8459:          /* If the inner mode is narrower and we are extracting the low part,
                   8460:             we can treat the SUBREG as if it were a ZERO_EXTEND.  */
                   8461:          if (subreg_lowpart_p (op0)
                   8462:              && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
                   8463:            /* Fall through */ ;
                   8464:          else
1.1       root     8465:            break;
                   8466: 
                   8467:          /* ... fall through ... */
                   8468: 
                   8469:        case ZERO_EXTEND:
                   8470:          if ((unsigned_comparison_p || equality_comparison_p)
                   8471:              && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
1.1.1.4   root     8472:                  <= HOST_BITS_PER_WIDE_INT)
                   8473:              && ((unsigned HOST_WIDE_INT) const_op
1.1       root     8474:                  < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
                   8475:            {
                   8476:              op0 = XEXP (op0, 0);
                   8477:              continue;
                   8478:            }
                   8479:          break;
                   8480: 
                   8481:        case PLUS:
1.1.1.5 ! root     8482:          /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
1.1.1.2   root     8483:             this for equality comparisons due to pathological cases involving
1.1       root     8484:             overflows.  */
1.1.1.5 ! root     8485:          if (equality_comparison_p
        !          8486:              && 0 != (tem = simplify_binary_operation (MINUS, mode,
        !          8487:                                                        op1, XEXP (op0, 1))))
1.1       root     8488:            {
                   8489:              op0 = XEXP (op0, 0);
                   8490:              op1 = tem;
                   8491:              continue;
                   8492:            }
                   8493: 
                   8494:          /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
                   8495:          if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
                   8496:              && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
                   8497:            {
                   8498:              op0 = XEXP (XEXP (op0, 0), 0);
                   8499:              code = (code == LT ? EQ : NE);
                   8500:              continue;
                   8501:            }
                   8502:          break;
                   8503: 
                   8504:        case MINUS:
1.1.1.5 ! root     8505:          /* (eq (minus A B) C) -> (eq A (plus B C)) or
        !          8506:             (eq B (minus A C)), whichever simplifies.  We can only do
        !          8507:             this for equality comparisons due to pathological cases involving
        !          8508:             overflows.  */
        !          8509:          if (equality_comparison_p
        !          8510:              && 0 != (tem = simplify_binary_operation (PLUS, mode,
        !          8511:                                                        XEXP (op0, 1), op1)))
        !          8512:            {
        !          8513:              op0 = XEXP (op0, 0);
        !          8514:              op1 = tem;
        !          8515:              continue;
        !          8516:            }
        !          8517: 
        !          8518:          if (equality_comparison_p
        !          8519:              && 0 != (tem = simplify_binary_operation (MINUS, mode,
        !          8520:                                                        XEXP (op0, 0), op1)))
        !          8521:            {
        !          8522:              op0 = XEXP (op0, 1);
        !          8523:              op1 = tem;
        !          8524:              continue;
        !          8525:            }
        !          8526: 
1.1       root     8527:          /* The sign bit of (minus (ashiftrt X C) X), where C is the number
                   8528:             of bits in X minus 1, is one iff X > 0.  */
                   8529:          if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
                   8530:              && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
                   8531:              && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
                   8532:              && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
                   8533:            {
                   8534:              op0 = XEXP (op0, 1);
                   8535:              code = (code == GE ? LE : GT);
                   8536:              continue;
                   8537:            }
                   8538:          break;
                   8539: 
                   8540:        case XOR:
                   8541:          /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
                   8542:             if C is zero or B is a constant.  */
                   8543:          if (equality_comparison_p
                   8544:              && 0 != (tem = simplify_binary_operation (XOR, mode,
                   8545:                                                        XEXP (op0, 1), op1)))
                   8546:            {
                   8547:              op0 = XEXP (op0, 0);
                   8548:              op1 = tem;
                   8549:              continue;
                   8550:            }
                   8551:          break;
                   8552: 
                   8553:        case EQ:  case NE:
                   8554:        case LT:  case LTU:  case LE:  case LEU:
                   8555:        case GT:  case GTU:  case GE:  case GEU:
                   8556:          /* We can't do anything if OP0 is a condition code value, rather
                   8557:             than an actual data value.  */
                   8558:          if (const_op != 0
                   8559: #ifdef HAVE_cc0
                   8560:              || XEXP (op0, 0) == cc0_rtx
                   8561: #endif
                   8562:              || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
                   8563:            break;
                   8564: 
                   8565:          /* Get the two operands being compared.  */
                   8566:          if (GET_CODE (XEXP (op0, 0)) == COMPARE)
                   8567:            tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
                   8568:          else
                   8569:            tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
                   8570: 
                   8571:          /* Check for the cases where we simply want the result of the
                   8572:             earlier test or the opposite of that result.  */
                   8573:          if (code == NE
                   8574:              || (code == EQ && reversible_comparison_p (op0))
1.1.1.4   root     8575:              || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
1.1.1.3   root     8576:                  && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
1.1       root     8577:                  && (STORE_FLAG_VALUE
1.1.1.4   root     8578:                      & (((HOST_WIDE_INT) 1
                   8579:                          << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
1.1       root     8580:                  && (code == LT
                   8581:                      || (code == GE && reversible_comparison_p (op0)))))
                   8582:            {
                   8583:              code = (code == LT || code == NE
                   8584:                      ? GET_CODE (op0) : reverse_condition (GET_CODE (op0)));
                   8585:              op0 = tem, op1 = tem1;
                   8586:              continue;
                   8587:            }
                   8588:          break;
                   8589: 
                   8590:        case IOR:
                   8591:          /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
                   8592:             iff X <= 0.  */
                   8593:          if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
                   8594:              && XEXP (XEXP (op0, 0), 1) == constm1_rtx
                   8595:              && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
                   8596:            {
                   8597:              op0 = XEXP (op0, 1);
                   8598:              code = (code == GE ? GT : LE);
                   8599:              continue;
                   8600:            }
                   8601:          break;
                   8602: 
                   8603:        case AND:
                   8604:          /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
                   8605:             will be converted to a ZERO_EXTRACT later.  */
                   8606:          if (const_op == 0 && equality_comparison_p
                   8607:              && (GET_CODE (XEXP (op0, 0)) == ASHIFT
                   8608:                  || GET_CODE (XEXP (op0, 0)) == LSHIFT)
                   8609:              && XEXP (XEXP (op0, 0), 0) == const1_rtx)
                   8610:            {
                   8611:              op0 = simplify_and_const_int
                   8612:                (op0, mode, gen_rtx_combine (LSHIFTRT, mode,
                   8613:                                             XEXP (op0, 1),
                   8614:                                             XEXP (XEXP (op0, 0), 1)),
1.1.1.4   root     8615:                 (HOST_WIDE_INT) 1);
1.1       root     8616:              continue;
                   8617:            }
                   8618: 
                   8619:          /* If we are comparing (and (lshiftrt X C1) C2) for equality with
                   8620:             zero and X is a comparison and C1 and C2 describe only bits set
                   8621:             in STORE_FLAG_VALUE, we can compare with X.  */
                   8622:          if (const_op == 0 && equality_comparison_p
1.1.1.4   root     8623:              && mode_width <= HOST_BITS_PER_WIDE_INT
1.1       root     8624:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8625:              && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
                   8626:              && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
                   8627:              && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
1.1.1.4   root     8628:              && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
1.1       root     8629:            {
                   8630:              mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
                   8631:                      << INTVAL (XEXP (XEXP (op0, 0), 1)));
                   8632:              if ((~ STORE_FLAG_VALUE & mask) == 0
                   8633:                  && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<'
                   8634:                      || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
                   8635:                          && GET_RTX_CLASS (GET_CODE (tem)) == '<')))
                   8636:                {
                   8637:                  op0 = XEXP (XEXP (op0, 0), 0);
                   8638:                  continue;
                   8639:                }
                   8640:            }
                   8641: 
                   8642:          /* If we are doing an equality comparison of an AND of a bit equal
                   8643:             to the sign bit, replace this with a LT or GE comparison of
                   8644:             the underlying value.  */
                   8645:          if (equality_comparison_p
                   8646:              && const_op == 0
                   8647:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
1.1.1.4   root     8648:              && mode_width <= HOST_BITS_PER_WIDE_INT
1.1       root     8649:              && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
1.1.1.4   root     8650:                  == (HOST_WIDE_INT) 1 << (mode_width - 1)))
1.1       root     8651:            {
                   8652:              op0 = XEXP (op0, 0);
                   8653:              code = (code == EQ ? GE : LT);
                   8654:              continue;
                   8655:            }
                   8656: 
                   8657:          /* If this AND operation is really a ZERO_EXTEND from a narrower
                   8658:             mode, the constant fits within that mode, and this is either an
                   8659:             equality or unsigned comparison, try to do this comparison in
                   8660:             the narrower mode.  */
                   8661:          if ((equality_comparison_p || unsigned_comparison_p)
                   8662:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8663:              && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
                   8664:                                   & GET_MODE_MASK (mode))
                   8665:                                  + 1)) >= 0
                   8666:              && const_op >> i == 0
                   8667:              && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
                   8668:            {
                   8669:              op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
                   8670:              continue;
                   8671:            }
                   8672:          break;
                   8673: 
                   8674:        case ASHIFT:
                   8675:        case LSHIFT:
                   8676:          /* If we have (compare (xshift FOO N) (const_int C)) and
                   8677:             the high order N bits of FOO (N+1 if an inequality comparison)
1.1.1.5 ! root     8678:             are known to be zero, we can do this by comparing FOO with C
1.1       root     8679:             shifted right N bits so long as the low-order N bits of C are
                   8680:             zero.  */
                   8681:          if (GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8682:              && INTVAL (XEXP (op0, 1)) >= 0
                   8683:              && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
1.1.1.4   root     8684:                  < HOST_BITS_PER_WIDE_INT)
                   8685:              && ((const_op
                   8686:                   &  ((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1) == 0)
                   8687:              && mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     8688:              && (nonzero_bits (XEXP (op0, 0), mode)
1.1       root     8689:                  & ~ (mask >> (INTVAL (XEXP (op0, 1))
                   8690:                                + ! equality_comparison_p))) == 0)
                   8691:            {
                   8692:              const_op >>= INTVAL (XEXP (op0, 1));
1.1.1.4   root     8693:              op1 = GEN_INT (const_op);
1.1       root     8694:              op0 = XEXP (op0, 0);
                   8695:              continue;
                   8696:            }
                   8697: 
1.1.1.2   root     8698:          /* If we are doing a sign bit comparison, it means we are testing
1.1       root     8699:             a particular bit.  Convert it to the appropriate AND.  */
1.1.1.2   root     8700:          if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
1.1.1.4   root     8701:              && mode_width <= HOST_BITS_PER_WIDE_INT)
1.1       root     8702:            {
1.1.1.4   root     8703:              op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
                   8704:                                            ((HOST_WIDE_INT) 1
                   8705:                                             << (mode_width - 1
                   8706:                                                 - INTVAL (XEXP (op0, 1)))));
1.1       root     8707:              code = (code == LT ? NE : EQ);
                   8708:              continue;
                   8709:            }
1.1.1.2   root     8710: 
                   8711:          /* If this an equality comparison with zero and we are shifting
                   8712:             the low bit to the sign bit, we can convert this to an AND of the
                   8713:             low-order bit.  */
                   8714:          if (const_op == 0 && equality_comparison_p
                   8715:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8716:              && INTVAL (XEXP (op0, 1)) == mode_width - 1)
                   8717:            {
1.1.1.4   root     8718:              op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
                   8719:                                            (HOST_WIDE_INT) 1);
1.1.1.2   root     8720:              continue;
                   8721:            }
1.1       root     8722:          break;
                   8723: 
                   8724:        case ASHIFTRT:
1.1.1.4   root     8725:          /* If this is an equality comparison with zero, we can do this
                   8726:             as a logical shift, which might be much simpler.  */
                   8727:          if (equality_comparison_p && const_op == 0
                   8728:              && GET_CODE (XEXP (op0, 1)) == CONST_INT)
                   8729:            {
                   8730:              op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
                   8731:                                          XEXP (op0, 0),
                   8732:                                          INTVAL (XEXP (op0, 1)));
                   8733:              continue;
                   8734:            }
                   8735: 
1.1       root     8736:          /* If OP0 is a sign extension and CODE is not an unsigned comparison,
                   8737:             do the comparison in a narrower mode.  */
                   8738:          if (! unsigned_comparison_p
                   8739:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8740:              && GET_CODE (XEXP (op0, 0)) == ASHIFT
                   8741:              && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
                   8742:              && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
1.1.1.4   root     8743:                                         MODE_INT, 1)) != BLKmode
                   8744:              && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
                   8745:                  || ((unsigned HOST_WIDE_INT) - const_op
                   8746:                      <= GET_MODE_MASK (tmode))))
1.1       root     8747:            {
                   8748:              op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
                   8749:              continue;
                   8750:            }
                   8751: 
                   8752:          /* ... fall through ... */
                   8753:        case LSHIFTRT:
                   8754:          /* If we have (compare (xshiftrt FOO N) (const_int C)) and
1.1.1.5 ! root     8755:             the low order N bits of FOO are known to be zero, we can do this
1.1       root     8756:             by comparing FOO with C shifted left N bits so long as no
                   8757:             overflow occurs.  */
                   8758:          if (GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8759:              && INTVAL (XEXP (op0, 1)) >= 0
1.1.1.4   root     8760:              && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
                   8761:              && mode_width <= HOST_BITS_PER_WIDE_INT
1.1.1.5 ! root     8762:              && (nonzero_bits (XEXP (op0, 0), mode)
1.1.1.4   root     8763:                  & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
1.1       root     8764:              && (const_op == 0
                   8765:                  || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
                   8766:                      < mode_width)))
                   8767:            {
                   8768:              const_op <<= INTVAL (XEXP (op0, 1));
1.1.1.4   root     8769:              op1 = GEN_INT (const_op);
1.1       root     8770:              op0 = XEXP (op0, 0);
                   8771:              continue;
                   8772:            }
                   8773: 
                   8774:          /* If we are using this shift to extract just the sign bit, we
                   8775:             can replace this with an LT or GE comparison.  */
                   8776:          if (const_op == 0
                   8777:              && (equality_comparison_p || sign_bit_comparison_p)
                   8778:              && GET_CODE (XEXP (op0, 1)) == CONST_INT
                   8779:              && INTVAL (XEXP (op0, 1)) == mode_width - 1)
                   8780:            {
                   8781:              op0 = XEXP (op0, 0);
                   8782:              code = (code == NE || code == GT ? LT : GE);
                   8783:              continue;
                   8784:            }
                   8785:          break;
                   8786:        }
                   8787: 
                   8788:       break;
                   8789:     }
                   8790: 
                   8791:   /* Now make any compound operations involved in this comparison.  Then,
                   8792:      check for an outmost SUBREG on OP0 that isn't doing anything or is
                   8793:      paradoxical.  The latter case can only occur when it is known that the
                   8794:      "extra" bits will be zero.  Therefore, it is safe to remove the SUBREG.
                   8795:      We can never remove a SUBREG for a non-equality comparison because the
                   8796:      sign bit is in a different place in the underlying object.  */
                   8797: 
                   8798:   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
                   8799:   op1 = make_compound_operation (op1, SET);
                   8800: 
                   8801:   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
                   8802:       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
                   8803:       && (code == NE || code == EQ)
                   8804:       && ((GET_MODE_SIZE (GET_MODE (op0))
                   8805:           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))))
                   8806:     {
                   8807:       op0 = SUBREG_REG (op0);
                   8808:       op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
                   8809:     }
                   8810: 
                   8811:   else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
                   8812:           && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
                   8813:           && (code == NE || code == EQ)
1.1.1.4   root     8814:           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
                   8815:               <= HOST_BITS_PER_WIDE_INT)
1.1.1.5 ! root     8816:           && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0)))
1.1       root     8817:               & ~ GET_MODE_MASK (GET_MODE (op0))) == 0
                   8818:           && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)),
                   8819:                                              op1),
1.1.1.5 ! root     8820:               (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
1.1       root     8821:                & ~ GET_MODE_MASK (GET_MODE (op0))) == 0))
                   8822:     op0 = SUBREG_REG (op0), op1 = tem;
                   8823: 
                   8824:   /* We now do the opposite procedure: Some machines don't have compare
                   8825:      insns in all modes.  If OP0's mode is an integer mode smaller than a
                   8826:      word and we can't do a compare in that mode, see if there is a larger
1.1.1.4   root     8827:      mode for which we can do the compare.  There are a number of cases in
                   8828:      which we can use the wider mode.  */
1.1       root     8829: 
                   8830:   mode = GET_MODE (op0);
                   8831:   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
                   8832:       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
                   8833:       && cmp_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
                   8834:     for (tmode = GET_MODE_WIDER_MODE (mode);
1.1.1.4   root     8835:         (tmode != VOIDmode
                   8836:          && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
1.1       root     8837:         tmode = GET_MODE_WIDER_MODE (tmode))
1.1.1.4   root     8838:       if (cmp_optab->handlers[(int) tmode].insn_code != CODE_FOR_nothing)
                   8839:        {
1.1.1.5 ! root     8840:          /* If the only nonzero bits in OP0 and OP1 are those in the
1.1.1.4   root     8841:             narrower mode and this is an equality or unsigned comparison,
                   8842:             we can use the wider mode.  Similarly for sign-extended
                   8843:             values and equality or signed comparisons.  */
                   8844:          if (((code == EQ || code == NE
                   8845:                || code == GEU || code == GTU || code == LEU || code == LTU)
1.1.1.5 ! root     8846:               && (nonzero_bits (op0, tmode) & ~ GET_MODE_MASK (mode)) == 0
        !          8847:               && (nonzero_bits (op1, tmode) & ~ GET_MODE_MASK (mode)) == 0)
1.1.1.4   root     8848:              || ((code == EQ || code == NE
                   8849:                   || code == GE || code == GT || code == LE || code == LT)
                   8850:                  && (num_sign_bit_copies (op0, tmode)
                   8851:                      > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
                   8852:                  && (num_sign_bit_copies (op1, tmode)
                   8853:                      > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
                   8854:            {
                   8855:              op0 = gen_lowpart_for_combine (tmode, op0);
                   8856:              op1 = gen_lowpart_for_combine (tmode, op1);
                   8857:              break;
1.1       root     8858:            }
                   8859: 
1.1.1.4   root     8860:          /* If this is a test for negative, we can make an explicit
                   8861:             test of the sign bit.  */
                   8862: 
                   8863:          if (op1 == const0_rtx && (code == LT || code == GE)
                   8864:              && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
                   8865:            {
                   8866:              op0 = gen_binary (AND, tmode,
                   8867:                                gen_lowpart_for_combine (tmode, op0),
                   8868:                                GEN_INT ((HOST_WIDE_INT) 1
                   8869:                                         << (GET_MODE_BITSIZE (mode) - 1)));
                   8870:              code = (code == LT) ? NE : EQ;
                   8871:              break;
                   8872:            }
1.1       root     8873:        }
                   8874: 
                   8875:   *pop0 = op0;
                   8876:   *pop1 = op1;
                   8877: 
                   8878:   return code;
                   8879: }
                   8880: 
                   8881: /* Return 1 if we know that X, a comparison operation, is not operating
                   8882:    on a floating-point value or is EQ or NE, meaning that we can safely
                   8883:    reverse it.  */
                   8884: 
                   8885: static int
                   8886: reversible_comparison_p (x)
                   8887:      rtx x;
                   8888: {
                   8889:   if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
                   8890:       || GET_CODE (x) == NE || GET_CODE (x) == EQ)
                   8891:     return 1;
                   8892: 
                   8893:   switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))))
                   8894:     {
                   8895:     case MODE_INT:
                   8896:       return 1;
                   8897: 
                   8898:     case MODE_CC:
                   8899:       x = get_last_value (XEXP (x, 0));
                   8900:       return (x && GET_CODE (x) == COMPARE
                   8901:              && GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_INT);
                   8902:     }
                   8903: 
                   8904:   return 0;
                   8905: }
                   8906: 
                   8907: /* Utility function for following routine.  Called when X is part of a value
                   8908:    being stored into reg_last_set_value.  Sets reg_last_set_table_tick
                   8909:    for each register mentioned.  Similar to mention_regs in cse.c  */
                   8910: 
                   8911: static void
                   8912: update_table_tick (x)
                   8913:      rtx x;
                   8914: {
                   8915:   register enum rtx_code code = GET_CODE (x);
                   8916:   register char *fmt = GET_RTX_FORMAT (code);
                   8917:   register int i;
                   8918: 
                   8919:   if (code == REG)
                   8920:     {
                   8921:       int regno = REGNO (x);
                   8922:       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
                   8923:                              ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
                   8924: 
                   8925:       for (i = regno; i < endregno; i++)
                   8926:        reg_last_set_table_tick[i] = label_tick;
                   8927: 
                   8928:       return;
                   8929:     }
                   8930:   
                   8931:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   8932:     /* Note that we can't have an "E" in values stored; see
                   8933:        get_last_value_validate.  */
                   8934:     if (fmt[i] == 'e')
                   8935:       update_table_tick (XEXP (x, i));
                   8936: }
                   8937: 
                   8938: /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
                   8939:    are saying that the register is clobbered and we no longer know its
1.1.1.5 ! root     8940:    value.  If INSN is zero, don't update reg_last_set; this is only permitted
        !          8941:    with VALUE also zero and is used to invalidate the register.  */
1.1       root     8942: 
                   8943: static void
                   8944: record_value_for_reg (reg, insn, value)
                   8945:      rtx reg;
                   8946:      rtx insn;
                   8947:      rtx value;
                   8948: {
                   8949:   int regno = REGNO (reg);
                   8950:   int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
                   8951:                          ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1);
                   8952:   int i;
                   8953: 
                   8954:   /* If VALUE contains REG and we have a previous value for REG, substitute
                   8955:      the previous value.  */
                   8956:   if (value && insn && reg_overlap_mentioned_p (reg, value))
                   8957:     {
                   8958:       rtx tem;
                   8959: 
                   8960:       /* Set things up so get_last_value is allowed to see anything set up to
                   8961:         our insn.  */
                   8962:       subst_low_cuid = INSN_CUID (insn);
                   8963:       tem = get_last_value (reg);      
                   8964: 
                   8965:       if (tem)
                   8966:        value = replace_rtx (copy_rtx (value), reg, tem);
                   8967:     }
                   8968: 
                   8969:   /* For each register modified, show we don't know its value, that
                   8970:      its value has been updated, and that we don't know the location of
                   8971:      the death of the register.  */
                   8972:   for (i = regno; i < endregno; i ++)
                   8973:     {
                   8974:       if (insn)
                   8975:        reg_last_set[i] = insn;
                   8976:       reg_last_set_value[i] = 0;
                   8977:       reg_last_death[i] = 0;
                   8978:     }
                   8979: 
                   8980:   /* Mark registers that are being referenced in this value.  */
                   8981:   if (value)
                   8982:     update_table_tick (value);
                   8983: 
                   8984:   /* Now update the status of each register being set.
                   8985:      If someone is using this register in this block, set this register
                   8986:      to invalid since we will get confused between the two lives in this
                   8987:      basic block.  This makes using this register always invalid.  In cse, we
                   8988:      scan the table to invalidate all entries using this register, but this
                   8989:      is too much work for us.  */
                   8990: 
                   8991:   for (i = regno; i < endregno; i++)
                   8992:     {
                   8993:       reg_last_set_label[i] = label_tick;
                   8994:       if (value && reg_last_set_table_tick[i] == label_tick)
                   8995:        reg_last_set_invalid[i] = 1;
                   8996:       else
                   8997:        reg_last_set_invalid[i] = 0;
                   8998:     }
                   8999: 
                   9000:   /* The value being assigned might refer to X (like in "x++;").  In that
                   9001:      case, we must replace it with (clobber (const_int 0)) to prevent
                   9002:      infinite loops.  */
                   9003:   if (value && ! get_last_value_validate (&value,
                   9004:                                          reg_last_set_label[regno], 0))
                   9005:     {
                   9006:       value = copy_rtx (value);
                   9007:       if (! get_last_value_validate (&value, reg_last_set_label[regno], 1))
                   9008:        value = 0;
                   9009:     }
                   9010: 
1.1.1.5 ! root     9011:   /* For the main register being modified, update the value, the mode, the
        !          9012:      nonzero bits, and the number of sign bit copies.  */
        !          9013: 
1.1       root     9014:   reg_last_set_value[regno] = value;
                   9015: 
1.1.1.5 ! root     9016:   if (value)
        !          9017:     {
        !          9018:       subst_low_cuid = INSN_CUID (insn);
        !          9019:       reg_last_set_mode[regno] = GET_MODE (reg);
        !          9020:       reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg));
        !          9021:       reg_last_set_sign_bit_copies[regno]
        !          9022:        = num_sign_bit_copies (value, GET_MODE (reg));
        !          9023:     }
1.1       root     9024: }
                   9025: 
                   9026: /* Used for communication between the following two routines.  */
                   9027: static rtx record_dead_insn;
                   9028: 
                   9029: /* Called via note_stores from record_dead_and_set_regs to handle one
                   9030:    SET or CLOBBER in an insn.  */
                   9031: 
                   9032: static void
                   9033: record_dead_and_set_regs_1 (dest, setter)
                   9034:      rtx dest, setter;
                   9035: {
                   9036:   if (GET_CODE (dest) == REG)
                   9037:     {
                   9038:       /* If we are setting the whole register, we know its value.  Otherwise
                   9039:         show that we don't know the value.  We can handle SUBREG in
                   9040:         some cases.  */
                   9041:       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
                   9042:        record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
                   9043:       else if (GET_CODE (setter) == SET
                   9044:               && GET_CODE (SET_DEST (setter)) == SUBREG
                   9045:               && SUBREG_REG (SET_DEST (setter)) == dest
                   9046:               && subreg_lowpart_p (SET_DEST (setter)))
1.1.1.4   root     9047:        record_value_for_reg (dest, record_dead_insn,
                   9048:                              gen_lowpart_for_combine (GET_MODE (dest),
                   9049:                                                       SET_SRC (setter)));
1.1       root     9050:       else
1.1.1.4   root     9051:        record_value_for_reg (dest, record_dead_insn, NULL_RTX);
1.1       root     9052:     }
                   9053:   else if (GET_CODE (dest) == MEM
                   9054:           /* Ignore pushes, they clobber nothing.  */
                   9055:           && ! push_operand (dest, GET_MODE (dest)))
                   9056:     mem_last_set = INSN_CUID (record_dead_insn);
                   9057: }
                   9058: 
                   9059: /* Update the records of when each REG was most recently set or killed
                   9060:    for the things done by INSN.  This is the last thing done in processing
                   9061:    INSN in the combiner loop.
                   9062: 
                   9063:    We update reg_last_set, reg_last_set_value, reg_last_death, and also the
                   9064:    similar information mem_last_set (which insn most recently modified memory)
                   9065:    and last_call_cuid (which insn was the most recent subroutine call).  */
                   9066: 
                   9067: static void
                   9068: record_dead_and_set_regs (insn)
                   9069:      rtx insn;
                   9070: {
                   9071:   register rtx link;
1.1.1.5 ! root     9072:   int i;
        !          9073: 
1.1       root     9074:   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
                   9075:     {
1.1.1.5 ! root     9076:       if (REG_NOTE_KIND (link) == REG_DEAD
        !          9077:          && GET_CODE (XEXP (link, 0)) == REG)
        !          9078:        {
        !          9079:          int regno = REGNO (XEXP (link, 0));
        !          9080:          int endregno
        !          9081:            = regno + (regno < FIRST_PSEUDO_REGISTER
        !          9082:                       ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0)))
        !          9083:                       : 1);
        !          9084: 
        !          9085:          for (i = regno; i < endregno; i++)
        !          9086:            reg_last_death[i] = insn;
        !          9087:        }
1.1       root     9088:       else if (REG_NOTE_KIND (link) == REG_INC)
1.1.1.4   root     9089:        record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
1.1       root     9090:     }
                   9091: 
                   9092:   if (GET_CODE (insn) == CALL_INSN)
1.1.1.5 ! root     9093:     {
        !          9094:       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !          9095:        if (call_used_regs[i])
        !          9096:          {
        !          9097:            reg_last_set_value[i] = 0;
        !          9098:            reg_last_death[i] = 0;
        !          9099:          }
        !          9100: 
        !          9101:       last_call_cuid = mem_last_set = INSN_CUID (insn);
        !          9102:     }
1.1       root     9103: 
                   9104:   record_dead_insn = insn;
                   9105:   note_stores (PATTERN (insn), record_dead_and_set_regs_1);
                   9106: }
                   9107: 
                   9108: /* Utility routine for the following function.  Verify that all the registers
                   9109:    mentioned in *LOC are valid when *LOC was part of a value set when
                   9110:    label_tick == TICK.  Return 0 if some are not.
                   9111: 
                   9112:    If REPLACE is non-zero, replace the invalid reference with
                   9113:    (clobber (const_int 0)) and return 1.  This replacement is useful because
                   9114:    we often can get useful information about the form of a value (e.g., if
                   9115:    it was produced by a shift that always produces -1 or 0) even though
                   9116:    we don't know exactly what registers it was produced from.  */
                   9117: 
                   9118: static int
                   9119: get_last_value_validate (loc, tick, replace)
                   9120:      rtx *loc;
                   9121:      int tick;
                   9122:      int replace;
                   9123: {
                   9124:   rtx x = *loc;
                   9125:   char *fmt = GET_RTX_FORMAT (GET_CODE (x));
                   9126:   int len = GET_RTX_LENGTH (GET_CODE (x));
                   9127:   int i;
                   9128: 
                   9129:   if (GET_CODE (x) == REG)
                   9130:     {
                   9131:       int regno = REGNO (x);
                   9132:       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
                   9133:                              ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
                   9134:       int j;
                   9135: 
                   9136:       for (j = regno; j < endregno; j++)
                   9137:        if (reg_last_set_invalid[j]
                   9138:            /* If this is a pseudo-register that was only set once, it is
                   9139:               always valid.  */
                   9140:            || (! (regno >= FIRST_PSEUDO_REGISTER && reg_n_sets[regno] == 1)
                   9141:                && reg_last_set_label[j] > tick))
                   9142:          {
                   9143:            if (replace)
                   9144:              *loc = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
                   9145:            return replace;
                   9146:          }
                   9147: 
                   9148:       return 1;
                   9149:     }
                   9150: 
                   9151:   for (i = 0; i < len; i++)
                   9152:     if ((fmt[i] == 'e'
                   9153:         && get_last_value_validate (&XEXP (x, i), tick, replace) == 0)
                   9154:        /* Don't bother with these.  They shouldn't occur anyway.  */
                   9155:        || fmt[i] == 'E')
                   9156:       return 0;
                   9157: 
                   9158:   /* If we haven't found a reason for it to be invalid, it is valid.  */
                   9159:   return 1;
                   9160: }
                   9161: 
                   9162: /* Get the last value assigned to X, if known.  Some registers
                   9163:    in the value may be replaced with (clobber (const_int 0)) if their value
                   9164:    is known longer known reliably.  */
                   9165: 
                   9166: static rtx
                   9167: get_last_value (x)
                   9168:      rtx x;
                   9169: {
                   9170:   int regno;
                   9171:   rtx value;
                   9172: 
                   9173:   /* If this is a non-paradoxical SUBREG, get the value of its operand and
                   9174:      then convert it to the desired mode.  If this is a paradoxical SUBREG,
                   9175:      we cannot predict what values the "extra" bits might have. */
                   9176:   if (GET_CODE (x) == SUBREG
                   9177:       && subreg_lowpart_p (x)
                   9178:       && (GET_MODE_SIZE (GET_MODE (x))
                   9179:          <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
                   9180:       && (value = get_last_value (SUBREG_REG (x))) != 0)
                   9181:     return gen_lowpart_for_combine (GET_MODE (x), value);
                   9182: 
                   9183:   if (GET_CODE (x) != REG)
                   9184:     return 0;
                   9185: 
                   9186:   regno = REGNO (x);
                   9187:   value = reg_last_set_value[regno];
                   9188: 
1.1.1.4   root     9189:   /* If we don't have a value or if it isn't for this basic block, return 0. */
1.1       root     9190: 
                   9191:   if (value == 0
                   9192:       || (reg_n_sets[regno] != 1
1.1.1.5 ! root     9193:          && reg_last_set_label[regno] != label_tick))
1.1       root     9194:     return 0;
                   9195: 
1.1.1.4   root     9196:   /* If the value was set in a later insn that the ones we are processing,
                   9197:      we can't use it even if the register was only set once, but make a quick
                   9198:      check to see if the previous insn set it to something.  This is commonly
                   9199:      the case when the same pseudo is used by repeated insns.  */
                   9200: 
                   9201:   if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
                   9202:     {
                   9203:       rtx insn, set;
                   9204: 
                   9205:       for (insn = prev_nonnote_insn (subst_insn);
                   9206:           insn && INSN_CUID (insn) >= subst_low_cuid;
                   9207:           insn = prev_nonnote_insn (insn))
                   9208:        ;
                   9209: 
                   9210:       if (insn
                   9211:          && (set = single_set (insn)) != 0
                   9212:          && rtx_equal_p (SET_DEST (set), x))
                   9213:        {
                   9214:          value = SET_SRC (set);
                   9215: 
                   9216:          /* Make sure that VALUE doesn't reference X.  Replace any
                   9217:             expliit references with a CLOBBER.  If there are any remaining
                   9218:             references (rare), don't use the value.  */
                   9219: 
                   9220:          if (reg_mentioned_p (x, value))
                   9221:            value = replace_rtx (copy_rtx (value), x,
                   9222:                                 gen_rtx (CLOBBER, GET_MODE (x), const0_rtx));
                   9223: 
                   9224:          if (reg_overlap_mentioned_p (x, value))
                   9225:            return 0;
                   9226:        }
                   9227:       else
                   9228:        return 0;
                   9229:     }
                   9230: 
                   9231:   /* If the value has all its registers valid, return it.  */
1.1       root     9232:   if (get_last_value_validate (&value, reg_last_set_label[regno], 0))
                   9233:     return value;
                   9234: 
                   9235:   /* Otherwise, make a copy and replace any invalid register with
                   9236:      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
                   9237: 
                   9238:   value = copy_rtx (value);
                   9239:   if (get_last_value_validate (&value, reg_last_set_label[regno], 1))
                   9240:     return value;
                   9241: 
                   9242:   return 0;
                   9243: }
                   9244: 
                   9245: /* Return nonzero if expression X refers to a REG or to memory
                   9246:    that is set in an instruction more recent than FROM_CUID.  */
                   9247: 
                   9248: static int
                   9249: use_crosses_set_p (x, from_cuid)
                   9250:      register rtx x;
                   9251:      int from_cuid;
                   9252: {
                   9253:   register char *fmt;
                   9254:   register int i;
                   9255:   register enum rtx_code code = GET_CODE (x);
                   9256: 
                   9257:   if (code == REG)
                   9258:     {
                   9259:       register int regno = REGNO (x);
                   9260: #ifdef PUSH_ROUNDING
                   9261:       /* Don't allow uses of the stack pointer to be moved,
                   9262:         because we don't know whether the move crosses a push insn.  */
                   9263:       if (regno == STACK_POINTER_REGNUM)
                   9264:        return 1;
                   9265: #endif
                   9266:       return (reg_last_set[regno]
                   9267:              && INSN_CUID (reg_last_set[regno]) > from_cuid);
                   9268:     }
                   9269: 
                   9270:   if (code == MEM && mem_last_set > from_cuid)
                   9271:     return 1;
                   9272: 
                   9273:   fmt = GET_RTX_FORMAT (code);
                   9274: 
                   9275:   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
                   9276:     {
                   9277:       if (fmt[i] == 'E')
                   9278:        {
                   9279:          register int j;
                   9280:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   9281:            if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
                   9282:              return 1;
                   9283:        }
                   9284:       else if (fmt[i] == 'e'
                   9285:               && use_crosses_set_p (XEXP (x, i), from_cuid))
                   9286:        return 1;
                   9287:     }
                   9288:   return 0;
                   9289: }
                   9290: 
                   9291: /* Define three variables used for communication between the following
                   9292:    routines.  */
                   9293: 
                   9294: static int reg_dead_regno, reg_dead_endregno;
                   9295: static int reg_dead_flag;
                   9296: 
                   9297: /* Function called via note_stores from reg_dead_at_p.
                   9298: 
                   9299:    If DEST is within [reg_dead_rengno, reg_dead_endregno), set 
                   9300:    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
                   9301: 
                   9302: static void
                   9303: reg_dead_at_p_1 (dest, x)
                   9304:      rtx dest;
                   9305:      rtx x;
                   9306: {
                   9307:   int regno, endregno;
                   9308: 
                   9309:   if (GET_CODE (dest) != REG)
                   9310:     return;
                   9311: 
                   9312:   regno = REGNO (dest);
                   9313:   endregno = regno + (regno < FIRST_PSEUDO_REGISTER 
                   9314:                      ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1);
                   9315: 
                   9316:   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
                   9317:     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
                   9318: }
                   9319: 
                   9320: /* Return non-zero if REG is known to be dead at INSN.
                   9321: 
                   9322:    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
                   9323:    referencing REG, it is dead.  If we hit a SET referencing REG, it is
                   9324:    live.  Otherwise, see if it is live or dead at the start of the basic
                   9325:    block we are in.  */
                   9326: 
                   9327: static int
                   9328: reg_dead_at_p (reg, insn)
                   9329:      rtx reg;
                   9330:      rtx insn;
                   9331: {
                   9332:   int block, i;
                   9333: 
                   9334:   /* Set variables for reg_dead_at_p_1.  */
                   9335:   reg_dead_regno = REGNO (reg);
                   9336:   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
                   9337:                                        ? HARD_REGNO_NREGS (reg_dead_regno,
                   9338:                                                            GET_MODE (reg))
                   9339:                                        : 1);
                   9340: 
                   9341:   reg_dead_flag = 0;
                   9342: 
                   9343:   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
                   9344:      beginning of function.  */
                   9345:   for (; insn && GET_CODE (insn) != CODE_LABEL;
                   9346:        insn = prev_nonnote_insn (insn))
                   9347:     {
                   9348:       note_stores (PATTERN (insn), reg_dead_at_p_1);
                   9349:       if (reg_dead_flag)
                   9350:        return reg_dead_flag == 1 ? 1 : 0;
                   9351: 
                   9352:       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
                   9353:        return 1;
                   9354:     }
                   9355: 
                   9356:   /* Get the basic block number that we were in.  */
                   9357:   if (insn == 0)
                   9358:     block = 0;
                   9359:   else
                   9360:     {
                   9361:       for (block = 0; block < n_basic_blocks; block++)
                   9362:        if (insn == basic_block_head[block])
                   9363:          break;
                   9364: 
                   9365:       if (block == n_basic_blocks)
                   9366:        return 0;
                   9367:     }
                   9368: 
                   9369:   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
1.1.1.4   root     9370:     if (basic_block_live_at_start[block][i / REGSET_ELT_BITS]
                   9371:        & ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)))
1.1       root     9372:       return 0;
                   9373: 
                   9374:   return 1;
                   9375: }
                   9376: 
                   9377: /* Remove register number REGNO from the dead registers list of INSN.
                   9378: 
                   9379:    Return the note used to record the death, if there was one.  */
                   9380: 
                   9381: rtx
                   9382: remove_death (regno, insn)
                   9383:      int regno;
                   9384:      rtx insn;
                   9385: {
                   9386:   register rtx note = find_regno_note (insn, REG_DEAD, regno);
                   9387: 
                   9388:   if (note)
1.1.1.4   root     9389:     {
                   9390:       reg_n_deaths[regno]--;
                   9391:       remove_note (insn, note);
                   9392:     }
1.1       root     9393: 
                   9394:   return note;
                   9395: }
                   9396: 
                   9397: /* For each register (hardware or pseudo) used within expression X, if its
                   9398:    death is in an instruction with cuid between FROM_CUID (inclusive) and
                   9399:    TO_INSN (exclusive), put a REG_DEAD note for that register in the
                   9400:    list headed by PNOTES. 
                   9401: 
                   9402:    This is done when X is being merged by combination into TO_INSN.  These
                   9403:    notes will then be distributed as needed.  */
                   9404: 
                   9405: static void
                   9406: move_deaths (x, from_cuid, to_insn, pnotes)
                   9407:      rtx x;
                   9408:      int from_cuid;
                   9409:      rtx to_insn;
                   9410:      rtx *pnotes;
                   9411: {
                   9412:   register char *fmt;
                   9413:   register int len, i;
                   9414:   register enum rtx_code code = GET_CODE (x);
                   9415: 
                   9416:   if (code == REG)
                   9417:     {
                   9418:       register int regno = REGNO (x);
                   9419:       register rtx where_dead = reg_last_death[regno];
                   9420: 
                   9421:       if (where_dead && INSN_CUID (where_dead) >= from_cuid
                   9422:          && INSN_CUID (where_dead) < INSN_CUID (to_insn))
                   9423:        {
1.1.1.5 ! root     9424:          rtx note = remove_death (regno, where_dead);
1.1       root     9425: 
                   9426:          /* It is possible for the call above to return 0.  This can occur
                   9427:             when reg_last_death points to I2 or I1 that we combined with.
1.1.1.5 ! root     9428:             In that case make a new note.
1.1       root     9429: 
1.1.1.5 ! root     9430:             We must also check for the case where X is a hard register
        !          9431:             and NOTE is a death note for a range of hard registers
        !          9432:             including X.  In that case, we must put REG_DEAD notes for
        !          9433:             the remaining registers in place of NOTE.  */
        !          9434: 
        !          9435:          if (note != 0 && regno < FIRST_PSEUDO_REGISTER
        !          9436:              && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
        !          9437:                  != GET_MODE_SIZE (GET_MODE (x))))
        !          9438:            {
        !          9439:              int deadregno = REGNO (XEXP (note, 0));
        !          9440:              int deadend
        !          9441:                = (deadregno + HARD_REGNO_NREGS (deadregno,
        !          9442:                                                 GET_MODE (XEXP (note, 0))));
        !          9443:              int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
        !          9444:              int i;
        !          9445: 
        !          9446:              for (i = deadregno; i < deadend; i++)
        !          9447:                if (i < regno || i >= ourend)
        !          9448:                  REG_NOTES (where_dead)
        !          9449:                    = gen_rtx (EXPR_LIST, REG_DEAD,
        !          9450:                               gen_rtx (REG, word_mode, i),
        !          9451:                               REG_NOTES (where_dead));
        !          9452:            }
        !          9453: 
        !          9454:          if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
1.1       root     9455:            {
                   9456:              XEXP (note, 1) = *pnotes;
                   9457:              *pnotes = note;
                   9458:            }
                   9459:          else
                   9460:            *pnotes = gen_rtx (EXPR_LIST, REG_DEAD, x, *pnotes);
1.1.1.4   root     9461: 
                   9462:          reg_n_deaths[regno]++;
1.1       root     9463:        }
                   9464: 
                   9465:       return;
                   9466:     }
                   9467: 
                   9468:   else if (GET_CODE (x) == SET)
                   9469:     {
                   9470:       rtx dest = SET_DEST (x);
                   9471: 
                   9472:       move_deaths (SET_SRC (x), from_cuid, to_insn, pnotes);
                   9473: 
1.1.1.3   root     9474:       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
                   9475:         that accesses one word of a multi-word item, some
                   9476:         piece of everything register in the expression is used by
                   9477:         this insn, so remove any old death.  */
                   9478: 
                   9479:       if (GET_CODE (dest) == ZERO_EXTRACT
                   9480:          || GET_CODE (dest) == STRICT_LOW_PART
                   9481:          || (GET_CODE (dest) == SUBREG
                   9482:              && (((GET_MODE_SIZE (GET_MODE (dest))
                   9483:                    + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
                   9484:                  == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
                   9485:                       + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
                   9486:        {
                   9487:          move_deaths (dest, from_cuid, to_insn, pnotes);
                   9488:          return;
                   9489:        }
                   9490: 
                   9491:       /* If this is some other SUBREG, we know it replaces the entire
                   9492:         value, so use that as the destination.  */
                   9493:       if (GET_CODE (dest) == SUBREG)
                   9494:        dest = SUBREG_REG (dest);
                   9495: 
                   9496:       /* If this is a MEM, adjust deaths of anything used in the address.
                   9497:         For a REG (the only other possibility), the entire value is
                   9498:         being replaced so the old value is not used in this insn.  */
1.1       root     9499: 
                   9500:       if (GET_CODE (dest) == MEM)
                   9501:        move_deaths (XEXP (dest, 0), from_cuid, to_insn, pnotes);
                   9502:       return;
                   9503:     }
                   9504: 
                   9505:   else if (GET_CODE (x) == CLOBBER)
                   9506:     return;
                   9507: 
                   9508:   len = GET_RTX_LENGTH (code);
                   9509:   fmt = GET_RTX_FORMAT (code);
                   9510: 
                   9511:   for (i = 0; i < len; i++)
                   9512:     {
                   9513:       if (fmt[i] == 'E')
                   9514:        {
                   9515:          register int j;
                   9516:          for (j = XVECLEN (x, i) - 1; j >= 0; j--)
                   9517:            move_deaths (XVECEXP (x, i, j), from_cuid, to_insn, pnotes);
                   9518:        }
                   9519:       else if (fmt[i] == 'e')
                   9520:        move_deaths (XEXP (x, i), from_cuid, to_insn, pnotes);
                   9521:     }
                   9522: }
                   9523: 
1.1.1.3   root     9524: /* Return 1 if X is the target of a bit-field assignment in BODY, the
                   9525:    pattern of an insn.  X must be a REG.  */
1.1       root     9526: 
                   9527: static int
1.1.1.3   root     9528: reg_bitfield_target_p (x, body)
                   9529:      rtx x;
1.1       root     9530:      rtx body;
                   9531: {
                   9532:   int i;
                   9533: 
                   9534:   if (GET_CODE (body) == SET)
1.1.1.3   root     9535:     {
                   9536:       rtx dest = SET_DEST (body);
                   9537:       rtx target;
                   9538:       int regno, tregno, endregno, endtregno;
                   9539: 
                   9540:       if (GET_CODE (dest) == ZERO_EXTRACT)
                   9541:        target = XEXP (dest, 0);
                   9542:       else if (GET_CODE (dest) == STRICT_LOW_PART)
                   9543:        target = SUBREG_REG (XEXP (dest, 0));
                   9544:       else
                   9545:        return 0;
                   9546: 
                   9547:       if (GET_CODE (target) == SUBREG)
                   9548:        target = SUBREG_REG (target);
                   9549: 
                   9550:       if (GET_CODE (target) != REG)
                   9551:        return 0;
                   9552: 
                   9553:       tregno = REGNO (target), regno = REGNO (x);
                   9554:       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
                   9555:        return target == x;
                   9556: 
                   9557:       endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target));
                   9558:       endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
                   9559: 
                   9560:       return endregno > tregno && regno < endtregno;
                   9561:     }
1.1       root     9562: 
                   9563:   else if (GET_CODE (body) == PARALLEL)
                   9564:     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
1.1.1.3   root     9565:       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
1.1       root     9566:        return 1;
                   9567: 
                   9568:   return 0;
                   9569: }      
                   9570: 
                   9571: /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
                   9572:    as appropriate.  I3 and I2 are the insns resulting from the combination
                   9573:    insns including FROM (I2 may be zero).
                   9574: 
                   9575:    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
                   9576:    not need REG_DEAD notes because they are being substituted for.  This
                   9577:    saves searching in the most common cases.
                   9578: 
                   9579:    Each note in the list is either ignored or placed on some insns, depending
                   9580:    on the type of note.  */
                   9581: 
                   9582: static void
                   9583: distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
                   9584:      rtx notes;
                   9585:      rtx from_insn;
                   9586:      rtx i3, i2;
                   9587:      rtx elim_i2, elim_i1;
                   9588: {
                   9589:   rtx note, next_note;
                   9590:   rtx tem;
                   9591: 
                   9592:   for (note = notes; note; note = next_note)
                   9593:     {
                   9594:       rtx place = 0, place2 = 0;
                   9595: 
                   9596:       /* If this NOTE references a pseudo register, ensure it references
                   9597:         the latest copy of that register.  */
                   9598:       if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
                   9599:          && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
                   9600:        XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
                   9601: 
                   9602:       next_note = XEXP (note, 1);
                   9603:       switch (REG_NOTE_KIND (note))
                   9604:        {
                   9605:        case REG_UNUSED:
                   9606:          /* If this register is set or clobbered in I3, put the note there
                   9607:             unless there is one already.  */
                   9608:          if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
                   9609:            {
                   9610:              if (! (GET_CODE (XEXP (note, 0)) == REG
                   9611:                     ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
                   9612:                     : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
                   9613:                place = i3;
                   9614:            }
                   9615:          /* Otherwise, if this register is used by I3, then this register
                   9616:             now dies here, so we must put a REG_DEAD note here unless there
                   9617:             is one already.  */
                   9618:          else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
                   9619:                   && ! (GET_CODE (XEXP (note, 0)) == REG
                   9620:                         ? find_regno_note (i3, REG_DEAD, REGNO (XEXP (note, 0)))
                   9621:                         : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
                   9622:            {
                   9623:              PUT_REG_NOTE_KIND (note, REG_DEAD);
                   9624:              place = i3;
                   9625:            }
                   9626:          break;
                   9627: 
                   9628:        case REG_EQUAL:
                   9629:        case REG_EQUIV:
                   9630:        case REG_NONNEG:
                   9631:          /* These notes say something about results of an insn.  We can
                   9632:             only support them if they used to be on I3 in which case they
1.1.1.4   root     9633:             remain on I3.  Otherwise they are ignored.
                   9634: 
                   9635:             If the note refers to an expression that is not a constant, we
                   9636:             must also ignore the note since we cannot tell whether the
                   9637:             equivalence is still true.  It might be possible to do
                   9638:             slightly better than this (we only have a problem if I2DEST
                   9639:             or I1DEST is present in the expression), but it doesn't
                   9640:             seem worth the trouble.  */
                   9641: 
                   9642:          if (from_insn == i3
                   9643:              && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
1.1       root     9644:            place = i3;
                   9645:          break;
                   9646: 
                   9647:        case REG_INC:
                   9648:        case REG_NO_CONFLICT:
                   9649:        case REG_LABEL:
                   9650:          /* These notes say something about how a register is used.  They must
                   9651:             be present on any use of the register in I2 or I3.  */
                   9652:          if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
                   9653:            place = i3;
                   9654: 
                   9655:          if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
                   9656:            {
                   9657:              if (place)
                   9658:                place2 = i2;
                   9659:              else
                   9660:                place = i2;
                   9661:            }
                   9662:          break;
                   9663: 
                   9664:        case REG_WAS_0:
                   9665:          /* It is too much trouble to try to see if this note is still
                   9666:             correct in all situations.  It is better to simply delete it.  */
                   9667:          break;
                   9668: 
                   9669:        case REG_RETVAL:
                   9670:          /* If the insn previously containing this note still exists,
                   9671:             put it back where it was.  Otherwise move it to the previous
                   9672:             insn.  Adjust the corresponding REG_LIBCALL note.  */
                   9673:          if (GET_CODE (from_insn) != NOTE)
                   9674:            place = from_insn;
                   9675:          else
                   9676:            {
1.1.1.4   root     9677:              tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
1.1       root     9678:              place = prev_real_insn (from_insn);
                   9679:              if (tem && place)
                   9680:                XEXP (tem, 0) = place;
                   9681:            }
                   9682:          break;
                   9683: 
                   9684:        case REG_LIBCALL:
                   9685:          /* This is handled similarly to REG_RETVAL.  */
                   9686:          if (GET_CODE (from_insn) != NOTE)
                   9687:            place = from_insn;
                   9688:          else
                   9689:            {
1.1.1.4   root     9690:              tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
1.1       root     9691:              place = next_real_insn (from_insn);
                   9692:              if (tem && place)
                   9693:                XEXP (tem, 0) = place;
                   9694:            }
                   9695:          break;
                   9696: 
                   9697:        case REG_DEAD:
                   9698:          /* If the register is used as an input in I3, it dies there.
                   9699:             Similarly for I2, if it is non-zero and adjacent to I3.
                   9700: 
                   9701:             If the register is not used as an input in either I3 or I2
                   9702:             and it is not one of the registers we were supposed to eliminate,
                   9703:             there are two possibilities.  We might have a non-adjacent I2
                   9704:             or we might have somehow eliminated an additional register
                   9705:             from a computation.  For example, we might have had A & B where
                   9706:             we discover that B will always be zero.  In this case we will
                   9707:             eliminate the reference to A.
                   9708: 
                   9709:             In both cases, we must search to see if we can find a previous
                   9710:             use of A and put the death note there.  */
                   9711: 
                   9712:          if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
                   9713:            place = i3;
                   9714:          else if (i2 != 0 && next_nonnote_insn (i2) == i3
                   9715:                   && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
                   9716:            place = i2;
                   9717: 
                   9718:          if (XEXP (note, 0) == elim_i2 || XEXP (note, 0) == elim_i1)
                   9719:            break;
                   9720: 
1.1.1.4   root     9721:          /* If the register is used in both I2 and I3 and it dies in I3, 
                   9722:             we might have added another reference to it.  If reg_n_refs
                   9723:             was 2, bump it to 3.  This has to be correct since the 
                   9724:             register must have been set somewhere.  The reason this is
                   9725:             done is because local-alloc.c treats 2 references as a 
                   9726:             special case.  */
                   9727: 
                   9728:          if (place == i3 && i2 != 0 && GET_CODE (XEXP (note, 0)) == REG
                   9729:              && reg_n_refs[REGNO (XEXP (note, 0))]== 2
                   9730:              && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
                   9731:            reg_n_refs[REGNO (XEXP (note, 0))] = 3;
                   9732: 
1.1       root     9733:          if (place == 0)
                   9734:            for (tem = prev_nonnote_insn (i3);
                   9735:                 tem && (GET_CODE (tem) == INSN
                   9736:                         || GET_CODE (tem) == CALL_INSN);
                   9737:                 tem = prev_nonnote_insn (tem))
                   9738:              {
                   9739:                /* If the register is being set at TEM, see if that is all
                   9740:                   TEM is doing.  If so, delete TEM.  Otherwise, make this
                   9741:                   into a REG_UNUSED note instead.  */
                   9742:                if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
                   9743:                  {
                   9744:                    rtx set = single_set (tem);
                   9745: 
1.1.1.2   root     9746:                    /* Verify that it was the set, and not a clobber that
                   9747:                       modified the register.  */
                   9748: 
                   9749:                    if (set != 0 && ! side_effects_p (SET_SRC (set))
                   9750:                        && rtx_equal_p (XEXP (note, 0), SET_DEST (set)))
1.1       root     9751:                      {
                   9752:                        /* Move the notes and links of TEM elsewhere.
                   9753:                           This might delete other dead insns recursively. 
                   9754:                           First set the pattern to something that won't use
                   9755:                           any register.  */
                   9756: 
                   9757:                        PATTERN (tem) = pc_rtx;
                   9758: 
1.1.1.4   root     9759:                        distribute_notes (REG_NOTES (tem), tem, tem,
                   9760:                                          NULL_RTX, NULL_RTX, NULL_RTX);
1.1       root     9761:                        distribute_links (LOG_LINKS (tem));
                   9762: 
                   9763:                        PUT_CODE (tem, NOTE);
                   9764:                        NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
                   9765:                        NOTE_SOURCE_FILE (tem) = 0;
                   9766:                      }
                   9767:                    else
                   9768:                      {
                   9769:                        PUT_REG_NOTE_KIND (note, REG_UNUSED);
                   9770: 
                   9771:                        /*  If there isn't already a REG_UNUSED note, put one
                   9772:                            here.  */
                   9773:                        if (! find_regno_note (tem, REG_UNUSED,
                   9774:                                               REGNO (XEXP (note, 0))))
                   9775:                          place = tem;
                   9776:                        break;
                   9777:                      }
                   9778:                  }
                   9779:                else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem)))
                   9780:                  {
                   9781:                    place = tem;
                   9782:                    break;
                   9783:                  }
                   9784:              }
                   9785: 
                   9786:          /* If the register is set or already dead at PLACE, we needn't do
                   9787:             anything with this note if it is still a REG_DEAD note.  
                   9788: 
                   9789:             Note that we cannot use just `dead_or_set_p' here since we can
                   9790:             convert an assignment to a register into a bit-field assignment.
                   9791:             Therefore, we must also omit the note if the register is the 
                   9792:             target of a bitfield assignment.  */
                   9793:             
                   9794:          if (place && REG_NOTE_KIND (note) == REG_DEAD)
                   9795:            {
                   9796:              int regno = REGNO (XEXP (note, 0));
                   9797: 
                   9798:              if (dead_or_set_p (place, XEXP (note, 0))
                   9799:                  || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
                   9800:                {
                   9801:                  /* Unless the register previously died in PLACE, clear
                   9802:                     reg_last_death.  [I no longer understand why this is
                   9803:                     being done.] */
                   9804:                  if (reg_last_death[regno] != place)
                   9805:                    reg_last_death[regno] = 0;
                   9806:                  place = 0;
                   9807:                }
                   9808:              else
                   9809:                reg_last_death[regno] = place;
                   9810: 
                   9811:              /* If this is a death note for a hard reg that is occupying
                   9812:                 multiple registers, ensure that we are still using all
                   9813:                 parts of the object.  If we find a piece of the object
                   9814:                 that is unused, we must add a USE for that piece before
                   9815:                 PLACE and put the appropriate REG_DEAD note on it.
                   9816: 
                   9817:                 An alternative would be to put a REG_UNUSED for the pieces
                   9818:                 on the insn that set the register, but that can't be done if
                   9819:                 it is not in the same block.  It is simpler, though less
                   9820:                 efficient, to add the USE insns.  */
                   9821: 
                   9822:              if (place && regno < FIRST_PSEUDO_REGISTER
                   9823:                  && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1)
                   9824:                {
                   9825:                  int endregno
                   9826:                    = regno + HARD_REGNO_NREGS (regno,
                   9827:                                                GET_MODE (XEXP (note, 0)));
                   9828:                  int all_used = 1;
                   9829:                  int i;
                   9830: 
                   9831:                  for (i = regno; i < endregno; i++)
                   9832:                    if (! refers_to_regno_p (i, i + 1, PATTERN (place), 0))
                   9833:                      {
                   9834:                        rtx piece = gen_rtx (REG, word_mode, i);
1.1.1.3   root     9835:                        rtx p;
                   9836: 
                   9837:                        /* See if we already placed a USE note for this
                   9838:                           register in front of PLACE.  */
                   9839:                        for (p = place;
                   9840:                             GET_CODE (PREV_INSN (p)) == INSN
                   9841:                             && GET_CODE (PATTERN (PREV_INSN (p))) == USE;
                   9842:                             p = PREV_INSN (p))
                   9843:                          if (rtx_equal_p (piece,
                   9844:                                           XEXP (PATTERN (PREV_INSN (p)), 0)))
                   9845:                            {
                   9846:                              p = 0;
                   9847:                              break;
                   9848:                            }
                   9849: 
                   9850:                        if (p)
                   9851:                          {
                   9852:                            rtx use_insn
                   9853:                              = emit_insn_before (gen_rtx (USE, VOIDmode,
                   9854:                                                           piece),
                   9855:                                                  p);
                   9856:                            REG_NOTES (use_insn)
                   9857:                              = gen_rtx (EXPR_LIST, REG_DEAD, piece,
                   9858:                                         REG_NOTES (use_insn));
                   9859:                          }
1.1       root     9860: 
1.1.1.2   root     9861:                        all_used = 0;
1.1       root     9862:                      }
                   9863: 
1.1.1.5 ! root     9864:                  /* Check for the case where the register dying partially
        !          9865:                     overlaps the register set by this insn.  */
        !          9866:                  if (all_used)
        !          9867:                    for (i = regno; i < endregno; i++)
        !          9868:                      if (dead_or_set_regno_p (place, i))
        !          9869:                          {
        !          9870:                            all_used = 0;
        !          9871:                            break;
        !          9872:                          }
        !          9873: 
1.1       root     9874:                  if (! all_used)
                   9875:                    {
                   9876:                      /* Put only REG_DEAD notes for pieces that are
                   9877:                         still used and that are not already dead or set.  */
                   9878: 
                   9879:                      for (i = regno; i < endregno; i++)
                   9880:                        {
                   9881:                          rtx piece = gen_rtx (REG, word_mode, i);
                   9882: 
                   9883:                          if (reg_referenced_p (piece, PATTERN (place))
                   9884:                              && ! dead_or_set_p (place, piece)
                   9885:                              && ! reg_bitfield_target_p (piece,
                   9886:                                                          PATTERN (place)))
                   9887:                            REG_NOTES (place) = gen_rtx (EXPR_LIST, REG_DEAD,
                   9888:                                                         piece,
                   9889:                                                         REG_NOTES (place));
                   9890:                        }
                   9891: 
                   9892:                      place = 0;
                   9893:                    }
                   9894:                }
                   9895:            }
                   9896:          break;
                   9897: 
                   9898:        default:
                   9899:          /* Any other notes should not be present at this point in the
                   9900:             compilation.  */
                   9901:          abort ();
                   9902:        }
                   9903: 
                   9904:       if (place)
                   9905:        {
                   9906:          XEXP (note, 1) = REG_NOTES (place);
                   9907:          REG_NOTES (place) = note;
                   9908:        }
1.1.1.4   root     9909:       else if ((REG_NOTE_KIND (note) == REG_DEAD
                   9910:                || REG_NOTE_KIND (note) == REG_UNUSED)
                   9911:               && GET_CODE (XEXP (note, 0)) == REG)
                   9912:        reg_n_deaths[REGNO (XEXP (note, 0))]--;
1.1       root     9913: 
                   9914:       if (place2)
1.1.1.4   root     9915:        {
                   9916:          if ((REG_NOTE_KIND (note) == REG_DEAD
                   9917:               || REG_NOTE_KIND (note) == REG_UNUSED)
                   9918:              && GET_CODE (XEXP (note, 0)) == REG)
                   9919:            reg_n_deaths[REGNO (XEXP (note, 0))]++;
                   9920: 
                   9921:          REG_NOTES (place2) = gen_rtx (GET_CODE (note), REG_NOTE_KIND (note),
                   9922:                                        XEXP (note, 0), REG_NOTES (place2));
                   9923:        }
1.1       root     9924:     }
                   9925: }
                   9926: 
                   9927: /* Similarly to above, distribute the LOG_LINKS that used to be present on
1.1.1.2   root     9928:    I3, I2, and I1 to new locations.  This is also called in one case to
                   9929:    add a link pointing at I3 when I3's destination is changed.  */
1.1       root     9930: 
                   9931: static void
                   9932: distribute_links (links)
                   9933:      rtx links;
                   9934: {
                   9935:   rtx link, next_link;
                   9936: 
                   9937:   for (link = links; link; link = next_link)
                   9938:     {
                   9939:       rtx place = 0;
                   9940:       rtx insn;
                   9941:       rtx set, reg;
                   9942: 
                   9943:       next_link = XEXP (link, 1);
                   9944: 
                   9945:       /* If the insn that this link points to is a NOTE or isn't a single
                   9946:         set, ignore it.  In the latter case, it isn't clear what we
                   9947:         can do other than ignore the link, since we can't tell which 
                   9948:         register it was for.  Such links wouldn't be used by combine
                   9949:         anyway.
                   9950: 
                   9951:         It is not possible for the destination of the target of the link to
                   9952:         have been changed by combine.  The only potential of this is if we
                   9953:         replace I3, I2, and I1 by I3 and I2.  But in that case the
                   9954:         destination of I2 also remains unchanged.  */
                   9955: 
                   9956:       if (GET_CODE (XEXP (link, 0)) == NOTE
                   9957:          || (set = single_set (XEXP (link, 0))) == 0)
                   9958:        continue;
                   9959: 
                   9960:       reg = SET_DEST (set);
                   9961:       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
                   9962:             || GET_CODE (reg) == SIGN_EXTRACT
                   9963:             || GET_CODE (reg) == STRICT_LOW_PART)
                   9964:        reg = XEXP (reg, 0);
                   9965: 
                   9966:       /* A LOG_LINK is defined as being placed on the first insn that uses
                   9967:         a register and points to the insn that sets the register.  Start
                   9968:         searching at the next insn after the target of the link and stop
                   9969:         when we reach a set of the register or the end of the basic block.
                   9970: 
                   9971:         Note that this correctly handles the link that used to point from
1.1.1.2   root     9972:         I3 to I2.  Also note that not much searching is typically done here
1.1       root     9973:         since most links don't point very far away.  */
                   9974: 
                   9975:       for (insn = NEXT_INSN (XEXP (link, 0));
                   9976:           (insn && GET_CODE (insn) != CODE_LABEL
                   9977:            && GET_CODE (PREV_INSN (insn)) != JUMP_INSN);
                   9978:           insn = NEXT_INSN (insn))
                   9979:        if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
                   9980:            && reg_overlap_mentioned_p (reg, PATTERN (insn)))
                   9981:          {
                   9982:            if (reg_referenced_p (reg, PATTERN (insn)))
                   9983:              place = insn;
                   9984:            break;
                   9985:          }
                   9986: 
                   9987:       /* If we found a place to put the link, place it there unless there
                   9988:         is already a link to the same insn as LINK at that point.  */
                   9989: 
                   9990:       if (place)
                   9991:        {
                   9992:          rtx link2;
                   9993: 
                   9994:          for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
                   9995:            if (XEXP (link2, 0) == XEXP (link, 0))
                   9996:              break;
                   9997: 
                   9998:          if (link2 == 0)
                   9999:            {
                   10000:              XEXP (link, 1) = LOG_LINKS (place);
                   10001:              LOG_LINKS (place) = link;
                   10002:            }
                   10003:        }
                   10004:     }
                   10005: }
                   10006: 
                   10007: void
                   10008: dump_combine_stats (file)
                   10009:      FILE *file;
                   10010: {
                   10011:   fprintf
                   10012:     (file,
                   10013:      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
                   10014:      combine_attempts, combine_merges, combine_extras, combine_successes);
                   10015: }
                   10016: 
                   10017: void
                   10018: dump_combine_total_stats (file)
                   10019:      FILE *file;
                   10020: {
                   10021:   fprintf
                   10022:     (file,
                   10023:      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
                   10024:      total_attempts, total_merges, total_extras, total_successes);
                   10025: }

unix.superglobalmegacorp.com

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