OSDN Git Service

(try_combine): Make change missing from last modification to splitting
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 1988, 1992 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 /* 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"
81 #include "expr.h"
82 #include "basic-block.h"
83 #include "insn-config.h"
84 #include "insn-flags.h"
85 #include "insn-codes.h"
86 #include "insn-attr.h"
87 #include "recog.h"
88 #include "real.h"
89 #include <stdio.h>
90
91 /* It is not safe to use ordinary gen_lowpart in combine.
92    Use gen_lowpart_for_combine instead.  See comments there.  */
93 #define gen_lowpart dont_use_gen_lowpart_you_dummy
94
95 /* Number of attempts to combine instructions in this function.  */
96
97 static int combine_attempts;
98
99 /* Number of attempts that got as far as substitution in this function.  */
100
101 static int combine_merges;
102
103 /* Number of instructions combined with added SETs in this function.  */
104
105 static int combine_extras;
106
107 /* Number of instructions combined in this function.  */
108
109 static int combine_successes;
110
111 /* Totals over entire compilation.  */
112
113 static int total_attempts, total_merges, total_extras, total_successes;
114 \f
115 /* Vector mapping INSN_UIDs to cuids.
116    The cuids are like uids but increase monotonically always.
117    Combine always uses cuids so that it can compare them.
118    But actually renumbering the uids, which we used to do,
119    proves to be a bad idea because it makes it hard to compare
120    the dumps produced by earlier passes with those from later passes.  */
121
122 static int *uid_cuid;
123
124 /* Get the cuid of an insn.  */
125
126 #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)])
127
128 /* Maximum register number, which is the size of the tables below.  */
129
130 static int combine_max_regno;
131
132 /* Record last point of death of (hard or pseudo) register n.  */
133
134 static rtx *reg_last_death;
135
136 /* Record last point of modification of (hard or pseudo) register n.  */
137
138 static rtx *reg_last_set;
139
140 /* Record the cuid of the last insn that invalidated memory
141    (anything that writes memory, and subroutine calls, but not pushes).  */
142
143 static int mem_last_set;
144
145 /* Record the cuid of the last CALL_INSN
146    so we can tell whether a potential combination crosses any calls.  */
147
148 static int last_call_cuid;
149
150 /* When `subst' is called, this is the insn that is being modified
151    (by combining in a previous insn).  The PATTERN of this insn
152    is still the old pattern partially modified and it should not be
153    looked at, but this may be used to examine the successors of the insn
154    to judge whether a simplification is valid.  */
155
156 static rtx subst_insn;
157
158 /* This is the lowest CUID that `subst' is currently dealing with.
159    get_last_value will not return a value if the register was set at or
160    after this CUID.  If not for this mechanism, we could get confused if
161    I2 or I1 in try_combine were an insn that used the old value of a register
162    to obtain a new value.  In that case, we might erroneously get the
163    new value of the register when we wanted the old one.  */
164
165 static int subst_low_cuid;
166
167 /* This is the value of undobuf.num_undo when we started processing this 
168    substitution.  This will prevent gen_rtx_combine from re-used a piece
169    from the previous expression.  Doing so can produce circular rtl
170    structures.  */
171
172 static int previous_num_undos;
173 \f
174 /* The next group of arrays allows the recording of the last value assigned
175    to (hard or pseudo) register n.  We use this information to see if a
176    operation being processed is redundant given a prior operation performed
177    on the register.  For example, an `and' with a constant is redundant if
178    all the zero bits are already known to be turned off.
179
180    We use an approach similar to that used by cse, but change it in the
181    following ways:
182
183    (1) We do not want to reinitialize at each label.
184    (2) It is useful, but not critical, to know the actual value assigned
185        to a register.  Often just its form is helpful.
186
187    Therefore, we maintain the following arrays:
188
189    reg_last_set_value           the last value assigned
190    reg_last_set_label           records the value of label_tick when the
191                                 register was assigned
192    reg_last_set_table_tick      records the value of label_tick when a
193                                 value using the register is assigned
194    reg_last_set_invalid         set to non-zero when it is not valid
195                                 to use the value of this register in some
196                                 register's value
197
198    To understand the usage of these tables, it is important to understand
199    the distinction between the value in reg_last_set_value being valid
200    and the register being validly contained in some other expression in the
201    table.
202
203    Entry I in reg_last_set_value is valid if it is non-zero, and either
204    reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
205
206    Register I may validly appear in any expression returned for the value
207    of another register if reg_n_sets[i] is 1.  It may also appear in the
208    value for register J if reg_last_set_label[i] < reg_last_set_label[j] or
209    reg_last_set_invalid[j] is zero.
210
211    If an expression is found in the table containing a register which may
212    not validly appear in an expression, the register is replaced by
213    something that won't match, (clobber (const_int 0)).
214
215    reg_last_set_invalid[i] is set non-zero when register I is being assigned
216    to and reg_last_set_table_tick[i] == label_tick.  */
217
218 /* Record last value assigned to (hard or pseudo) register n. */
219
220 static rtx *reg_last_set_value;
221
222 /* Record the value of label_tick when the value for register n is placed in
223    reg_last_set_value[n].  */
224
225 static short *reg_last_set_label;
226
227 /* Record the value of label_tick when an expression involving register n
228    is placed in reg_last_set_value. */
229
230 static short *reg_last_set_table_tick;
231
232 /* Set non-zero if references to register n in expressions should not be
233    used.  */
234
235 static char *reg_last_set_invalid;
236
237 /* Incremented for each label. */
238
239 static short label_tick;
240
241 /* Some registers that are set more than once and used in more than one
242    basic block are nevertheless always set in similar ways.  For example,
243    a QImode register may be loaded from memory in two places on a machine
244    where byte loads zero extend.
245
246    We record in the following array what we know about the significant
247    bits of a register, specifically which bits are known to be zero.
248
249    If an entry is zero, it means that we don't know anything special.  */
250
251 static HOST_WIDE_INT *reg_significant;
252
253 /* Mode used to compute significance in reg_significant.  It is the largest
254    integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
255
256 static enum machine_mode significant_mode;
257
258 /* Nonzero if we know that a register has some leading bits that are always
259    equal to the sign bit.  */
260
261 static char *reg_sign_bit_copies;
262
263 /* Nonzero when reg_significant and reg_sign_bit_copies can be safely used.
264    It is zero while computing them.  This prevents propagating values based
265    on previously set values, which can be incorrect if a variable
266    is modified in a loop.  */
267
268 static int significant_valid;
269 \f
270 /* Record one modification to rtl structure
271    to be undone by storing old_contents into *where.
272    is_int is 1 if the contents are an int.  */
273
274 struct undo
275 {
276   int is_int;
277   union {rtx rtx; int i;} old_contents;
278   union {rtx *rtx; int *i;} where;
279 };
280
281 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
282    num_undo says how many are currently recorded.
283
284    storage is nonzero if we must undo the allocation of new storage.
285    The value of storage is what to pass to obfree.
286
287    other_insn is nonzero if we have modified some other insn in the process
288    of working on subst_insn.  It must be verified too.  */
289
290 #define MAX_UNDO 50
291
292 struct undobuf
293 {
294   int num_undo;
295   char *storage;
296   struct undo undo[MAX_UNDO];
297   rtx other_insn;
298 };
299
300 static struct undobuf undobuf;
301
302 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
303    insn.  The substitution can be undone by undo_all.  If INTO is already
304    set to NEWVAL, do not record this change.  Because computing NEWVAL might
305    also call SUBST, we have to compute it before we put anything into
306    the undo table.  */
307
308 #define SUBST(INTO, NEWVAL)  \
309  do { rtx _new = (NEWVAL);                                              \
310       if (undobuf.num_undo < MAX_UNDO)                                  \
311         {                                                               \
312           undobuf.undo[undobuf.num_undo].is_int = 0;                    \
313           undobuf.undo[undobuf.num_undo].where.rtx = &INTO;             \
314           undobuf.undo[undobuf.num_undo].old_contents.rtx = INTO;       \
315           INTO = _new;                                                  \
316           if (undobuf.undo[undobuf.num_undo].old_contents.rtx != INTO)  \
317             undobuf.num_undo++;                                         \
318         }                                                               \
319     } while (0)
320
321 /* Similar to SUBST, but NEWVAL is an int.  INTO will normally be an XINT
322    expression.
323    Note that substitution for the value of a CONST_INT is not safe.  */
324
325 #define SUBST_INT(INTO, NEWVAL)  \
326  do { if (undobuf.num_undo < MAX_UNDO)                                  \
327 {                                                                       \
328           undobuf.undo[undobuf.num_undo].is_int = 1;                    \
329           undobuf.undo[undobuf.num_undo].where.i = (int *) &INTO;       \
330           undobuf.undo[undobuf.num_undo].old_contents.i = INTO;         \
331           INTO = NEWVAL;                                                \
332           if (undobuf.undo[undobuf.num_undo].old_contents.i != INTO)    \
333             undobuf.num_undo++;                                         \
334         }                                                               \
335      } while (0)
336
337 /* Number of times the pseudo being substituted for
338    was found and replaced.  */
339
340 static int n_occurrences;
341
342 static void set_significant ();
343 static void move_deaths ();
344 rtx remove_death ();
345 static void record_value_for_reg ();
346 static void record_dead_and_set_regs ();
347 static int use_crosses_set_p ();
348 static rtx try_combine ();
349 static rtx *find_split_point ();
350 static rtx subst ();
351 static void undo_all ();
352 static int reg_dead_at_p ();
353 static rtx expand_compound_operation ();
354 static rtx expand_field_assignment ();
355 static rtx make_extraction ();
356 static int get_pos_from_mask ();
357 static rtx force_to_mode ();
358 static rtx make_field_assignment ();
359 static rtx make_compound_operation ();
360 static rtx apply_distributive_law ();
361 static rtx simplify_and_const_int ();
362 static unsigned HOST_WIDE_INT significant_bits ();
363 static int num_sign_bit_copies ();
364 static int merge_outer_ops ();
365 static rtx simplify_shift_const ();
366 static int recog_for_combine ();
367 static rtx gen_lowpart_for_combine ();
368 static rtx gen_rtx_combine ();
369 static rtx gen_binary ();
370 static rtx gen_unary ();
371 static enum rtx_code simplify_comparison ();
372 static int reversible_comparison_p ();
373 static int get_last_value_validate ();
374 static rtx get_last_value ();
375 static void distribute_notes ();
376 static void distribute_links ();
377 \f
378 /* Main entry point for combiner.  F is the first insn of the function.
379    NREGS is the first unused pseudo-reg number.  */
380
381 void
382 combine_instructions (f, nregs)
383      rtx f;
384      int nregs;
385 {
386   register rtx insn, next, prev;
387   register int i;
388   register rtx links, nextlinks;
389
390   combine_attempts = 0;
391   combine_merges = 0;
392   combine_extras = 0;
393   combine_successes = 0;
394
395   combine_max_regno = nregs;
396
397   reg_last_death = (rtx *) alloca (nregs * sizeof (rtx));
398   reg_last_set = (rtx *) alloca (nregs * sizeof (rtx));
399   reg_last_set_value = (rtx *) alloca (nregs * sizeof (rtx));
400   reg_last_set_table_tick = (short *) alloca (nregs * sizeof (short));
401   reg_last_set_label = (short *) alloca (nregs * sizeof (short));
402   reg_last_set_invalid = (char *) alloca (nregs * sizeof (char));
403   reg_significant = (HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT));
404   reg_sign_bit_copies = (char *) alloca (nregs * sizeof (char));
405
406   bzero (reg_last_death, nregs * sizeof (rtx));
407   bzero (reg_last_set, nregs * sizeof (rtx));
408   bzero (reg_last_set_value, nregs * sizeof (rtx));
409   bzero (reg_last_set_table_tick, nregs * sizeof (short));
410   bzero (reg_last_set_invalid, nregs * sizeof (char));
411   bzero (reg_significant, nregs * sizeof (HOST_WIDE_INT));
412   bzero (reg_sign_bit_copies, nregs * sizeof (char));
413
414   init_recog_no_volatile ();
415
416   /* Compute maximum uid value so uid_cuid can be allocated.  */
417
418   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
419     if (INSN_UID (insn) > i)
420       i = INSN_UID (insn);
421
422   uid_cuid = (int *) alloca ((i + 1) * sizeof (int));
423
424   significant_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
425
426   /* Don't use reg_significant when computing it.  This can cause problems
427      when, for example, we have j <<= 1 in a loop.  */
428
429   significant_valid = 0;
430
431   /* Compute the mapping from uids to cuids.
432      Cuids are numbers assigned to insns, like uids,
433      except that cuids increase monotonically through the code. 
434
435      Scan all SETs and see if we can deduce anything about what
436      bits are significant for some registers.  */
437
438   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
439     {
440       INSN_CUID (insn) = ++i;
441       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
442         note_stores (PATTERN (insn), set_significant);
443     }
444
445   significant_valid = 1;
446
447   /* Now scan all the insns in forward order.  */
448
449   label_tick = 1;
450   last_call_cuid = 0;
451   mem_last_set = 0;
452
453   for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
454     {
455       next = 0;
456
457       if (GET_CODE (insn) == CODE_LABEL)
458         label_tick++;
459
460       else if (GET_CODE (insn) == INSN
461                || GET_CODE (insn) == CALL_INSN
462                || GET_CODE (insn) == JUMP_INSN)
463         {
464           /* Try this insn with each insn it links back to.  */
465
466           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
467             if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX)) != 0)
468               goto retry;
469
470           /* Try each sequence of three linked insns ending with this one.  */
471
472           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
473             for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks;
474                  nextlinks = XEXP (nextlinks, 1))
475               if ((next = try_combine (insn, XEXP (links, 0),
476                                        XEXP (nextlinks, 0))) != 0)
477                 goto retry;
478
479 #ifdef HAVE_cc0
480           /* Try to combine a jump insn that uses CC0
481              with a preceding insn that sets CC0, and maybe with its
482              logical predecessor as well.
483              This is how we make decrement-and-branch insns.
484              We need this special code because data flow connections
485              via CC0 do not get entered in LOG_LINKS.  */
486
487           if (GET_CODE (insn) == JUMP_INSN
488               && (prev = prev_nonnote_insn (insn)) != 0
489               && GET_CODE (prev) == INSN
490               && sets_cc0_p (PATTERN (prev)))
491             {
492               if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
493                 goto retry;
494
495               for (nextlinks = LOG_LINKS (prev); nextlinks;
496                    nextlinks = XEXP (nextlinks, 1))
497                 if ((next = try_combine (insn, prev,
498                                          XEXP (nextlinks, 0))) != 0)
499                   goto retry;
500             }
501
502           /* Do the same for an insn that explicitly references CC0.  */
503           if (GET_CODE (insn) == INSN
504               && (prev = prev_nonnote_insn (insn)) != 0
505               && GET_CODE (prev) == INSN
506               && sets_cc0_p (PATTERN (prev))
507               && GET_CODE (PATTERN (insn)) == SET
508               && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
509             {
510               if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
511                 goto retry;
512
513               for (nextlinks = LOG_LINKS (prev); nextlinks;
514                    nextlinks = XEXP (nextlinks, 1))
515                 if ((next = try_combine (insn, prev,
516                                          XEXP (nextlinks, 0))) != 0)
517                   goto retry;
518             }
519
520           /* Finally, see if any of the insns that this insn links to
521              explicitly references CC0.  If so, try this insn, that insn,
522              and its predecessor if it sets CC0.  */
523           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
524             if (GET_CODE (XEXP (links, 0)) == INSN
525                 && GET_CODE (PATTERN (XEXP (links, 0))) == SET
526                 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
527                 && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
528                 && GET_CODE (prev) == INSN
529                 && sets_cc0_p (PATTERN (prev))
530                 && (next = try_combine (insn, XEXP (links, 0), prev)) != 0)
531               goto retry;
532 #endif
533
534           /* Try combining an insn with two different insns whose results it
535              uses.  */
536           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
537             for (nextlinks = XEXP (links, 1); 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           if (GET_CODE (insn) != NOTE)
544             record_dead_and_set_regs (insn);
545
546         retry:
547           ;
548         }
549     }
550
551   total_attempts += combine_attempts;
552   total_merges += combine_merges;
553   total_extras += combine_extras;
554   total_successes += combine_successes;
555 }
556 \f
557 /* Called via note_stores.  If X is a pseudo that is used in more than
558    one basic block, is narrower that HOST_BITS_PER_WIDE_INT, and is being
559    set, record what bits are significant.  If we are clobbering X,
560    ignore this "set" because the clobbered value won't be used. 
561
562    If we are setting only a portion of X and we can't figure out what
563    portion, assume all bits will be used since we don't know what will
564    be happening.
565
566    Similarly, set how many bits of X are known to be copies of the sign bit
567    at all locations in the function.  This is the smallest number implied 
568    by any set of X.  */
569
570 static void
571 set_significant (x, set)
572      rtx x;
573      rtx set;
574 {
575   int num;
576
577   if (GET_CODE (x) == REG
578       && REGNO (x) >= FIRST_PSEUDO_REGISTER
579       && reg_n_sets[REGNO (x)] > 1
580       && reg_basic_block[REGNO (x)] < 0
581       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
582     {
583       if (GET_CODE (set) == CLOBBER)
584         return;
585
586       /* If this is a complex assignment, see if we can convert it into a
587          simple assignment.  */
588       set = expand_field_assignment (set);
589       if (SET_DEST (set) == x)
590         {
591           reg_significant[REGNO (x)]
592             |= significant_bits (SET_SRC (set), significant_mode);
593           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
594           if (reg_sign_bit_copies[REGNO (x)] == 0
595               || reg_sign_bit_copies[REGNO (x)] > num)
596             reg_sign_bit_copies[REGNO (x)] = num;
597         }
598       else
599         {
600           reg_significant[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
601           reg_sign_bit_copies[REGNO (x)] = 0;
602         }
603     }
604 }
605 \f
606 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
607    insns that were previously combined into I3 or that will be combined
608    into the merger of INSN and I3.
609
610    Return 0 if the combination is not allowed for any reason.
611
612    If the combination is allowed, *PDEST will be set to the single 
613    destination of INSN and *PSRC to the single source, and this function
614    will return 1.  */
615
616 static int
617 can_combine_p (insn, i3, pred, succ, pdest, psrc)
618      rtx insn;
619      rtx i3;
620      rtx pred, succ;
621      rtx *pdest, *psrc;
622 {
623   int i;
624   rtx set = 0, src, dest;
625   rtx p, link;
626   int all_adjacent = (succ ? (next_active_insn (insn) == succ
627                               && next_active_insn (succ) == i3)
628                       : next_active_insn (insn) == i3);
629
630   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
631      or a PARALLEL consisting of such a SET and CLOBBERs. 
632
633      If INSN has CLOBBER parallel parts, ignore them for our processing.
634      By definition, these happen during the execution of the insn.  When it
635      is merged with another insn, all bets are off.  If they are, in fact,
636      needed and aren't also supplied in I3, they may be added by
637      recog_for_combine.  Otherwise, it won't match. 
638
639      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
640      note.
641
642      Get the source and destination of INSN.  If more than one, can't 
643      combine.  */
644      
645   if (GET_CODE (PATTERN (insn)) == SET)
646     set = PATTERN (insn);
647   else if (GET_CODE (PATTERN (insn)) == PARALLEL
648            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
649     {
650       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
651         {
652           rtx elt = XVECEXP (PATTERN (insn), 0, i);
653
654           switch (GET_CODE (elt))
655             {
656               /* We can ignore CLOBBERs.  */
657             case CLOBBER:
658               break;
659
660             case SET:
661               /* Ignore SETs whose result isn't used but not those that
662                  have side-effects.  */
663               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
664                   && ! side_effects_p (elt))
665                 break;
666
667               /* If we have already found a SET, this is a second one and
668                  so we cannot combine with this insn.  */
669               if (set)
670                 return 0;
671
672               set = elt;
673               break;
674
675             default:
676               /* Anything else means we can't combine.  */
677               return 0;
678             }
679         }
680
681       if (set == 0
682           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
683              so don't do anything with it.  */
684           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
685         return 0;
686     }
687   else
688     return 0;
689
690   if (set == 0)
691     return 0;
692
693   set = expand_field_assignment (set);
694   src = SET_SRC (set), dest = SET_DEST (set);
695
696   /* Don't eliminate a store in the stack pointer.  */
697   if (dest == stack_pointer_rtx
698       /* Don't install a subreg involving two modes not tieable.
699          It can worsen register allocation, and can even make invalid reload
700          insns, since the reg inside may need to be copied from in the
701          outside mode, and that may be invalid if it is an fp reg copied in
702          integer mode.  As a special exception, we can allow this if
703          I3 is simply copying DEST, a REG,  to CC0.  */
704       || (GET_CODE (src) == SUBREG
705           && ! MODES_TIEABLE_P (GET_MODE (src), GET_MODE (SUBREG_REG (src)))
706 #ifdef HAVE_cc0
707           && ! (GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
708                 && SET_DEST (PATTERN (i3)) == cc0_rtx
709                 && GET_CODE (dest) == REG && dest == SET_SRC (PATTERN (i3)))
710 #endif
711           )
712       /* If we couldn't eliminate a field assignment, we can't combine.  */
713       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
714       /* Don't combine with an insn that sets a register to itself if it has
715          a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
716       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
717       /* Can't merge a function call.  */
718       || GET_CODE (src) == CALL
719       /* Don't substitute into an incremented register.  */
720       || FIND_REG_INC_NOTE (i3, dest)
721       || (succ && FIND_REG_INC_NOTE (succ, dest))
722       /* Don't combine the end of a libcall into anything.  */
723       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
724       /* Make sure that DEST is not used after SUCC but before I3.  */
725       || (succ && ! all_adjacent
726           && reg_used_between_p (dest, succ, i3))
727       /* Make sure that the value that is to be substituted for the register
728          does not use any registers whose values alter in between.  However,
729          If the insns are adjacent, a use can't cross a set even though we
730          think it might (this can happen for a sequence of insns each setting
731          the same destination; reg_last_set of that register might point to
732          a NOTE).  Also, don't move a volatile asm across any other insns.  */
733       || (! all_adjacent
734           && (use_crosses_set_p (src, INSN_CUID (insn))
735               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))))
736       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
737          better register allocation by not doing the combine.  */
738       || find_reg_note (i3, REG_NO_CONFLICT, dest)
739       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
740       /* Don't combine across a CALL_INSN, because that would possibly
741          change whether the life span of some REGs crosses calls or not,
742          and it is a pain to update that information.
743          Exception: if source is a constant, moving it later can't hurt.
744          Accept that special case, because it helps -fforce-addr a lot.  */
745       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
746     return 0;
747
748   /* DEST must either be a REG or CC0.  */
749   if (GET_CODE (dest) == REG)
750     {
751       /* If register alignment is being enforced for multi-word items in all
752          cases except for parameters, it is possible to have a register copy
753          insn referencing a hard register that is not allowed to contain the
754          mode being copied and which would not be valid as an operand of most
755          insns.  Eliminate this problem by not combining with such an insn.
756
757          Also, on some machines we don't want to extend the life of a hard
758          register.  */
759
760       if (GET_CODE (src) == REG
761           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
762                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
763 #ifdef SMALL_REGISTER_CLASSES
764               /* Don't extend the life of a hard register.  */
765               || REGNO (src) < FIRST_PSEUDO_REGISTER
766 #else
767               || (REGNO (src) < FIRST_PSEUDO_REGISTER
768                   && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)))
769 #endif
770           ))
771         return 0;
772     }
773   else if (GET_CODE (dest) != CC0)
774     return 0;
775
776   /* Don't substitute for a register intended as a clobberable operand.  */
777   if (GET_CODE (PATTERN (i3)) == PARALLEL)
778     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
779       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
780           && rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest))
781         return 0;
782
783   /* If INSN contains anything volatile, or is an `asm' (whether volatile
784      or not), reject, unless nothing volatile comes between it and I3,
785      with the exception of SUCC.  */
786
787   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
788     for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
789       if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
790           && p != succ && volatile_refs_p (PATTERN (p)))
791         return 0;
792
793   /* If INSN or I2 contains an autoincrement or autodecrement,
794      make sure that register is not used between there and I3,
795      and not already used in I3 either.
796      Also insist that I3 not be a jump; if it were one
797      and the incremented register were spilled, we would lose.  */
798
799 #ifdef AUTO_INC_DEC
800   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
801     if (REG_NOTE_KIND (link) == REG_INC
802         && (GET_CODE (i3) == JUMP_INSN
803             || reg_used_between_p (XEXP (link, 0), insn, i3)
804             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
805       return 0;
806 #endif
807
808 #ifdef HAVE_cc0
809   /* Don't combine an insn that follows a CC0-setting insn.
810      An insn that uses CC0 must not be separated from the one that sets it.
811      We do, however, allow I2 to follow a CC0-setting insn if that insn
812      is passed as I1; in that case it will be deleted also.
813      We also allow combining in this case if all the insns are adjacent
814      because that would leave the two CC0 insns adjacent as well.
815      It would be more logical to test whether CC0 occurs inside I1 or I2,
816      but that would be much slower, and this ought to be equivalent.  */
817
818   p = prev_nonnote_insn (insn);
819   if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
820       && ! all_adjacent)
821     return 0;
822 #endif
823
824   /* If we get here, we have passed all the tests and the combination is
825      to be allowed.  */
826
827   *pdest = dest;
828   *psrc = src;
829
830   return 1;
831 }
832 \f
833 /* LOC is the location within I3 that contains its pattern or the component
834    of a PARALLEL of the pattern.  We validate that it is valid for combining.
835
836    One problem is if I3 modifies its output, as opposed to replacing it
837    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
838    so would produce an insn that is not equivalent to the original insns.
839
840    Consider:
841
842          (set (reg:DI 101) (reg:DI 100))
843          (set (subreg:SI (reg:DI 101) 0) <foo>)
844
845    This is NOT equivalent to:
846
847          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
848                     (set (reg:DI 101) (reg:DI 100))])
849
850    Not only does this modify 100 (in which case it might still be valid
851    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100. 
852
853    We can also run into a problem if I2 sets a register that I1
854    uses and I1 gets directly substituted into I3 (not via I2).  In that
855    case, we would be getting the wrong value of I2DEST into I3, so we
856    must reject the combination.  This case occurs when I2 and I1 both
857    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
858    If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
859    of a SET must prevent combination from occurring.
860
861    On machines where SMALL_REGISTER_CLASSES is defined, we don't combine
862    if the destination of a SET is a hard register.
863
864    Before doing the above check, we first try to expand a field assignment
865    into a set of logical operations.
866
867    If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
868    we place a register that is both set and used within I3.  If more than one
869    such register is detected, we fail.
870
871    Return 1 if the combination is valid, zero otherwise.  */
872
873 static int
874 combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
875      rtx i3;
876      rtx *loc;
877      rtx i2dest;
878      rtx i1dest;
879      int i1_not_in_src;
880      rtx *pi3dest_killed;
881 {
882   rtx x = *loc;
883
884   if (GET_CODE (x) == SET)
885     {
886       rtx set = expand_field_assignment (x);
887       rtx dest = SET_DEST (set);
888       rtx src = SET_SRC (set);
889       rtx inner_dest = dest, inner_src = src;
890
891       SUBST (*loc, set);
892
893       while (GET_CODE (inner_dest) == STRICT_LOW_PART
894              || GET_CODE (inner_dest) == SUBREG
895              || GET_CODE (inner_dest) == ZERO_EXTRACT)
896         inner_dest = XEXP (inner_dest, 0);
897
898   /* We probably don't need this any more now that LIMIT_RELOAD_CLASS
899      was added.  */
900 #if 0
901       while (GET_CODE (inner_src) == STRICT_LOW_PART
902              || GET_CODE (inner_src) == SUBREG
903              || GET_CODE (inner_src) == ZERO_EXTRACT)
904         inner_src = XEXP (inner_src, 0);
905
906       /* If it is better that two different modes keep two different pseudos,
907          avoid combining them.  This avoids producing the following pattern
908          on a 386:
909           (set (subreg:SI (reg/v:QI 21) 0)
910                (lshiftrt:SI (reg/v:SI 20)
911                    (const_int 24)))
912          If that were made, reload could not handle the pair of
913          reg 20/21, since it would try to get any GENERAL_REGS
914          but some of them don't handle QImode.  */
915
916       if (rtx_equal_p (inner_src, i2dest)
917           && GET_CODE (inner_dest) == REG
918           && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
919         return 0;
920 #endif
921
922       /* Check for the case where I3 modifies its output, as
923          discussed above.  */
924       if ((inner_dest != dest
925            && (reg_overlap_mentioned_p (i2dest, inner_dest)
926                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
927           /* This is the same test done in can_combine_p except that we
928              allow a hard register with SMALL_REGISTER_CLASSES if SRC is a
929              CALL operation.  */
930           || (GET_CODE (inner_dest) == REG
931               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
932 #ifdef SMALL_REGISTER_CLASSES
933               && GET_CODE (src) != CALL
934 #else
935               && ! HARD_REGNO_MODE_OK (REGNO (inner_dest),
936                                        GET_MODE (inner_dest))
937 #endif
938               )
939
940           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
941         return 0;
942
943       /* If DEST is used in I3, it is being killed in this insn,
944          so record that for later.  */
945       if (pi3dest_killed && GET_CODE (dest) == REG
946           && reg_referenced_p (dest, PATTERN (i3)))
947         {
948           if (*pi3dest_killed)
949             return 0;
950
951           *pi3dest_killed = dest;
952         }
953     }
954
955   else if (GET_CODE (x) == PARALLEL)
956     {
957       int i;
958
959       for (i = 0; i < XVECLEN (x, 0); i++)
960         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
961                                 i1_not_in_src, pi3dest_killed))
962           return 0;
963     }
964
965   return 1;
966 }
967 \f
968 /* Try to combine the insns I1 and I2 into I3.
969    Here I1 and I2 appear earlier than I3.
970    I1 can be zero; then we combine just I2 into I3.
971  
972    It we are combining three insns and the resulting insn is not recognized,
973    try splitting it into two insns.  If that happens, I2 and I3 are retained
974    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
975    are pseudo-deleted.
976
977    If we created two insns, return I2; otherwise return I3.
978    Return 0 if the combination does not work.  Then nothing is changed.  */
979
980 static rtx
981 try_combine (i3, i2, i1)
982      register rtx i3, i2, i1;
983 {
984   /* New patterns for I3 and I3, respectively.  */
985   rtx newpat, newi2pat = 0;
986   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
987   int added_sets_1, added_sets_2;
988   /* Total number of SETs to put into I3.  */
989   int total_sets;
990   /* Nonzero is I2's body now appears in I3.  */
991   int i2_is_used;
992   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
993   int insn_code_number, i2_code_number, other_code_number;
994   /* Contains I3 if the destination of I3 is used in its source, which means
995      that the old life of I3 is being killed.  If that usage is placed into
996      I2 and not in I3, a REG_DEAD note must be made.  */
997   rtx i3dest_killed = 0;
998   /* SET_DEST and SET_SRC of I2 and I1.  */
999   rtx i2dest, i2src, i1dest = 0, i1src = 0;
1000   /* PATTERN (I2), or a copy of it in certain cases.  */
1001   rtx i2pat;
1002   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
1003   int i2dest_in_i2src, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1004   int i1_feeds_i3 = 0;
1005   /* Notes that must be added to REG_NOTES in I3 and I2.  */
1006   rtx new_i3_notes, new_i2_notes;
1007
1008   int maxreg;
1009   rtx temp;
1010   register rtx link;
1011   int i;
1012
1013   /* If any of I1, I2, and I3 isn't really an insn, we can't do anything.
1014      This can occur when flow deletes an insn that it has merged into an
1015      auto-increment address.  We also can't do anything if I3 has a
1016      REG_LIBCALL note since we don't want to disrupt the contiguity of a
1017      libcall.  */
1018
1019   if (GET_RTX_CLASS (GET_CODE (i3)) != 'i'
1020       || GET_RTX_CLASS (GET_CODE (i2)) != 'i'
1021       || (i1 && GET_RTX_CLASS (GET_CODE (i1)) != 'i')
1022       || find_reg_note (i3, REG_LIBCALL, NULL_RTX))
1023     return 0;
1024
1025   combine_attempts++;
1026
1027   undobuf.num_undo = previous_num_undos = 0;
1028   undobuf.other_insn = 0;
1029
1030   /* Save the current high-water-mark so we can free storage if we didn't
1031      accept this combination.  */
1032   undobuf.storage = (char *) oballoc (0);
1033
1034   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
1035      code below, set I1 to be the earlier of the two insns.  */
1036   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1037     temp = i1, i1 = i2, i2 = temp;
1038
1039   /* First check for one important special-case that the code below will
1040      not handle.  Namely, the case where I1 is zero, I2 has multiple sets,
1041      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
1042      we may be able to replace that destination with the destination of I3.
1043      This occurs in the common code where we compute both a quotient and
1044      remainder into a structure, in which case we want to do the computation
1045      directly into the structure to avoid register-register copies.
1046
1047      We make very conservative checks below and only try to handle the
1048      most common cases of this.  For example, we only handle the case
1049      where I2 and I3 are adjacent to avoid making difficult register
1050      usage tests.  */
1051
1052   if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
1053       && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1054       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1055 #ifdef SMALL_REGISTER_CLASSES
1056       && (GET_CODE (SET_DEST (PATTERN (i3))) != REG
1057           || REGNO (SET_DEST (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER)
1058 #endif
1059       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1060       && GET_CODE (PATTERN (i2)) == PARALLEL
1061       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1062       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1063          below would need to check what is inside (and reg_overlap_mentioned_p
1064          doesn't support those codes anyway).  Don't allow those destinations;
1065          the resulting insn isn't likely to be recognized anyway.  */
1066       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1067       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1068       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1069                                     SET_DEST (PATTERN (i3)))
1070       && next_real_insn (i2) == i3)
1071     {
1072       rtx p2 = PATTERN (i2);
1073
1074       /* Make sure that the destination of I3,
1075          which we are going to substitute into one output of I2,
1076          is not used within another output of I2.  We must avoid making this:
1077          (parallel [(set (mem (reg 69)) ...)
1078                     (set (reg 69) ...)])
1079          which is not well-defined as to order of actions.
1080          (Besides, reload can't handle output reloads for this.)
1081
1082          The problem can also happen if the dest of I3 is a memory ref,
1083          if another dest in I2 is an indirect memory ref.  */
1084       for (i = 0; i < XVECLEN (p2, 0); i++)
1085         if (GET_CODE (XVECEXP (p2, 0, i)) == SET
1086             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1087                                         SET_DEST (XVECEXP (p2, 0, i))))
1088           break;
1089
1090       if (i == XVECLEN (p2, 0))
1091         for (i = 0; i < XVECLEN (p2, 0); i++)
1092           if (SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1093             {
1094               combine_merges++;
1095
1096               subst_insn = i3;
1097               subst_low_cuid = INSN_CUID (i2);
1098
1099               added_sets_2 = 0;
1100               i2dest = SET_SRC (PATTERN (i3));
1101
1102               /* Replace the dest in I2 with our dest and make the resulting
1103                  insn the new pattern for I3.  Then skip to where we
1104                  validate the pattern.  Everything was set up above.  */
1105               SUBST (SET_DEST (XVECEXP (p2, 0, i)), 
1106                      SET_DEST (PATTERN (i3)));
1107
1108               newpat = p2;
1109               goto validate_replacement;
1110             }
1111     }
1112
1113 #ifndef HAVE_cc0
1114   /* If we have no I1 and I2 looks like:
1115         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1116                    (set Y OP)])
1117      make up a dummy I1 that is
1118         (set Y OP)
1119      and change I2 to be
1120         (set (reg:CC X) (compare:CC Y (const_int 0)))
1121
1122      (We can ignore any trailing CLOBBERs.)
1123
1124      This undoes a previous combination and allows us to match a branch-and-
1125      decrement insn.  */
1126
1127   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1128       && XVECLEN (PATTERN (i2), 0) >= 2
1129       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1130       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1131           == MODE_CC)
1132       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1133       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1134       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1135       && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
1136       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1137                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1138     {
1139       for (i =  XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1140         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1141           break;
1142
1143       if (i == 1)
1144         {
1145           /* We make I1 with the same INSN_UID as I2.  This gives it
1146              the same INSN_CUID for value tracking.  Our fake I1 will
1147              never appear in the insn stream so giving it the same INSN_UID
1148              as I2 will not cause a problem.  */
1149
1150           i1 = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2,
1151                         XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0);
1152
1153           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1154           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1155                  SET_DEST (PATTERN (i1)));
1156         }
1157     }
1158 #endif
1159
1160   /* Verify that I2 and I1 are valid for combining.  */
1161   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1162       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1163     {
1164       undo_all ();
1165       return 0;
1166     }
1167
1168   /* Record whether I2DEST is used in I2SRC and similarly for the other
1169      cases.  Knowing this will help in register status updating below.  */
1170   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1171   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1172   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1173
1174   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1175      in I2SRC.  */
1176   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1177
1178   /* Ensure that I3's pattern can be the destination of combines.  */
1179   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1180                           i1 && i2dest_in_i1src && i1_feeds_i3,
1181                           &i3dest_killed))
1182     {
1183       undo_all ();
1184       return 0;
1185     }
1186
1187   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1188      We used to do this EXCEPT in one case: I3 has a post-inc in an
1189      output operand.  However, that exception can give rise to insns like
1190         mov r3,(r3)+
1191      which is a famous insn on the PDP-11 where the value of r3 used as the
1192      source was model-dependent.  Avoid this sort of thing.  */
1193
1194 #if 0
1195   if (!(GET_CODE (PATTERN (i3)) == SET
1196         && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1197         && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
1198         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1199             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1200     /* It's not the exception.  */
1201 #endif
1202 #ifdef AUTO_INC_DEC
1203     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1204       if (REG_NOTE_KIND (link) == REG_INC
1205           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1206               || (i1 != 0
1207                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1208         {
1209           undo_all ();
1210           return 0;
1211         }
1212 #endif
1213
1214   /* See if the SETs in I1 or I2 need to be kept around in the merged
1215      instruction: whenever the value set there is still needed past I3.
1216      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1217
1218      For the SET in I1, we have two cases:  If I1 and I2 independently
1219      feed into I3, the set in I1 needs to be kept around if I1DEST dies
1220      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
1221      in I1 needs to be kept around unless I1DEST dies or is set in either
1222      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
1223      I1DEST.  If so, we know I1 feeds into I2.  */
1224
1225   added_sets_2 = ! dead_or_set_p (i3, i2dest);
1226
1227   added_sets_1
1228     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1229                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1230
1231   /* If the set in I2 needs to be kept around, we must make a copy of
1232      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1233      PATTERN (I2), we are only substituting for the original I1DEST, not into
1234      an already-substituted copy.  This also prevents making self-referential
1235      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1236      I2DEST.  */
1237
1238   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
1239            ? gen_rtx (SET, VOIDmode, i2dest, i2src)
1240            : PATTERN (i2));
1241
1242   if (added_sets_2)
1243     i2pat = copy_rtx (i2pat);
1244
1245   combine_merges++;
1246
1247   /* Substitute in the latest insn for the regs set by the earlier ones.  */
1248
1249   maxreg = max_reg_num ();
1250
1251   subst_insn = i3;
1252
1253   /* It is possible that the source of I2 or I1 may be performing an
1254      unneeded operation, such as a ZERO_EXTEND of something that is known
1255      to have the high part zero.  Handle that case by letting subst look at
1256      the innermost one of them.
1257
1258      Another way to do this would be to have a function that tries to
1259      simplify a single insn instead of merging two or more insns.  We don't
1260      do this because of the potential of infinite loops and because
1261      of the potential extra memory required.  However, doing it the way
1262      we are is a bit of a kludge and doesn't catch all cases.
1263
1264      But only do this if -fexpensive-optimizations since it slows things down
1265      and doesn't usually win.  */
1266
1267   if (flag_expensive_optimizations)
1268     {
1269       /* Pass pc_rtx so no substitutions are done, just simplifications.
1270          The cases that we are interested in here do not involve the few
1271          cases were is_replaced is checked.  */
1272       if (i1)
1273         {
1274           subst_low_cuid = INSN_CUID (i1);
1275           i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1276         }
1277       else
1278         {
1279           subst_low_cuid = INSN_CUID (i2);
1280           i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1281         }
1282
1283       previous_num_undos = undobuf.num_undo;
1284     }
1285
1286 #ifndef HAVE_cc0
1287   /* Many machines that don't use CC0 have insns that can both perform an
1288      arithmetic operation and set the condition code.  These operations will
1289      be represented as a PARALLEL with the first element of the vector
1290      being a COMPARE of an arithmetic operation with the constant zero.
1291      The second element of the vector will set some pseudo to the result
1292      of the same arithmetic operation.  If we simplify the COMPARE, we won't
1293      match such a pattern and so will generate an extra insn.   Here we test
1294      for this case, where both the comparison and the operation result are
1295      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1296      I2SRC.  Later we will make the PARALLEL that contains I2.  */
1297
1298   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1299       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1300       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1301       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1302     {
1303       rtx *cc_use;
1304       enum machine_mode compare_mode;
1305
1306       newpat = PATTERN (i3);
1307       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
1308
1309       i2_is_used = 1;
1310
1311 #ifdef EXTRA_CC_MODES
1312       /* See if a COMPARE with the operand we substituted in should be done
1313          with the mode that is currently being used.  If not, do the same
1314          processing we do in `subst' for a SET; namely, if the destination
1315          is used only once, try to replace it with a register of the proper
1316          mode and also replace the COMPARE.  */
1317       if (undobuf.other_insn == 0
1318           && (cc_use = find_single_use (SET_DEST (newpat), i3,
1319                                         &undobuf.other_insn))
1320           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
1321                                               i2src, const0_rtx))
1322               != GET_MODE (SET_DEST (newpat))))
1323         {
1324           int regno = REGNO (SET_DEST (newpat));
1325           rtx new_dest = gen_rtx (REG, compare_mode, regno);
1326
1327           if (regno < FIRST_PSEUDO_REGISTER
1328               || (reg_n_sets[regno] == 1 && ! added_sets_2
1329                   && ! REG_USERVAR_P (SET_DEST (newpat))))
1330             {
1331               if (regno >= FIRST_PSEUDO_REGISTER)
1332                 SUBST (regno_reg_rtx[regno], new_dest);
1333
1334               SUBST (SET_DEST (newpat), new_dest);
1335               SUBST (XEXP (*cc_use, 0), new_dest);
1336               SUBST (SET_SRC (newpat),
1337                      gen_rtx_combine (COMPARE, compare_mode,
1338                                       i2src, const0_rtx));
1339             }
1340           else
1341             undobuf.other_insn = 0;
1342         }
1343 #endif    
1344     }
1345   else
1346 #endif
1347     {
1348       n_occurrences = 0;                /* `subst' counts here */
1349
1350       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
1351          need to make a unique copy of I2SRC each time we substitute it
1352          to avoid self-referential rtl.  */
1353
1354       subst_low_cuid = INSN_CUID (i2);
1355       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
1356                       ! i1_feeds_i3 && i1dest_in_i1src);
1357       previous_num_undos = undobuf.num_undo;
1358
1359       /* Record whether i2's body now appears within i3's body.  */
1360       i2_is_used = n_occurrences;
1361     }
1362
1363   /* If we already got a failure, don't try to do more.  Otherwise,
1364      try to substitute in I1 if we have it.  */
1365
1366   if (i1 && GET_CODE (newpat) != CLOBBER)
1367     {
1368       /* Before we can do this substitution, we must redo the test done
1369          above (see detailed comments there) that ensures  that I1DEST
1370          isn't mentioned in any SETs in NEWPAT that are field assignments. */
1371
1372       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
1373                               0, NULL_PTR))
1374         {
1375           undo_all ();
1376           return 0;
1377         }
1378
1379       n_occurrences = 0;
1380       subst_low_cuid = INSN_CUID (i1);
1381       newpat = subst (newpat, i1dest, i1src, 0, 0);
1382       previous_num_undos = undobuf.num_undo;
1383     }
1384
1385   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
1386      to count all the ways that I2SRC and I1SRC can be used.  */
1387   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
1388        && i2_is_used + added_sets_2 > 1)
1389       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
1390           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
1391               > 1))
1392       /* Fail if we tried to make a new register (we used to abort, but there's
1393          really no reason to).  */
1394       || max_reg_num () != maxreg
1395       /* Fail if we couldn't do something and have a CLOBBER.  */
1396       || GET_CODE (newpat) == CLOBBER)
1397     {
1398       undo_all ();
1399       return 0;
1400     }
1401
1402   /* If the actions of the earlier insns must be kept
1403      in addition to substituting them into the latest one,
1404      we must make a new PARALLEL for the latest insn
1405      to hold additional the SETs.  */
1406
1407   if (added_sets_1 || added_sets_2)
1408     {
1409       combine_extras++;
1410
1411       if (GET_CODE (newpat) == PARALLEL)
1412         {
1413           rtvec old = XVEC (newpat, 0);
1414           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
1415           newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets));
1416           bcopy (&old->elem[0], &XVECEXP (newpat, 0, 0),
1417                  sizeof (old->elem[0]) * old->num_elem);
1418         }
1419       else
1420         {
1421           rtx old = newpat;
1422           total_sets = 1 + added_sets_1 + added_sets_2;
1423           newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets));
1424           XVECEXP (newpat, 0, 0) = old;
1425         }
1426
1427      if (added_sets_1)
1428        XVECEXP (newpat, 0, --total_sets)
1429          = (GET_CODE (PATTERN (i1)) == PARALLEL
1430             ? gen_rtx (SET, VOIDmode, i1dest, i1src) : PATTERN (i1));
1431
1432      if (added_sets_2)
1433         {
1434           /* If there is no I1, use I2's body as is.  We used to also not do
1435              the subst call below if I2 was substituted into I3,
1436              but that could lose a simplification.  */
1437           if (i1 == 0)
1438             XVECEXP (newpat, 0, --total_sets) = i2pat;
1439           else
1440             /* See comment where i2pat is assigned.  */
1441             XVECEXP (newpat, 0, --total_sets)
1442               = subst (i2pat, i1dest, i1src, 0, 0);
1443         }
1444     }
1445
1446   /* We come here when we are replacing a destination in I2 with the
1447      destination of I3.  */
1448  validate_replacement:
1449
1450   /* Is the result of combination a valid instruction?  */
1451   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1452
1453   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
1454      the second SET's destination is a register that is unused.  In that case,
1455      we just need the first SET.   This can occur when simplifying a divmod
1456      insn.  We *must* test for this case here because the code below that
1457      splits two independent SETs doesn't handle this case correctly when it
1458      updates the register status.  Also check the case where the first
1459      SET's destination is unused.  That would not cause incorrect code, but
1460      does cause an unneeded insn to remain.  */
1461
1462   if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
1463       && XVECLEN (newpat, 0) == 2
1464       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1465       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1466       && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG
1467       && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1)))
1468       && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1)))
1469       && asm_noperands (newpat) < 0)
1470     {
1471       newpat = XVECEXP (newpat, 0, 0);
1472       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1473     }
1474
1475   else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
1476            && XVECLEN (newpat, 0) == 2
1477            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1478            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1479            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG
1480            && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0)))
1481            && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0)))
1482            && asm_noperands (newpat) < 0)
1483     {
1484       newpat = XVECEXP (newpat, 0, 1);
1485       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1486     }
1487
1488   /* See if this is an XOR.  If so, perhaps the problem is that the
1489      constant is out of range.  Replace it with a complemented XOR with
1490      a complemented constant; it might be in range.  */
1491
1492   else if (insn_code_number < 0 && GET_CODE (newpat) == SET
1493            && GET_CODE (SET_SRC (newpat)) == XOR
1494            && GET_CODE (XEXP (SET_SRC (newpat), 1)) == CONST_INT
1495            && ((temp = simplify_unary_operation (NOT,
1496                                                  GET_MODE (SET_SRC (newpat)),
1497                                                  XEXP (SET_SRC (newpat), 1),
1498                                                  GET_MODE (SET_SRC (newpat))))
1499                != 0))
1500     {
1501       enum machine_mode i_mode = GET_MODE (SET_SRC (newpat));
1502       rtx pat
1503         = gen_rtx_combine (SET, VOIDmode, SET_DEST (newpat),
1504                            gen_unary (NOT, i_mode,
1505                                       gen_binary (XOR, i_mode,
1506                                                   XEXP (SET_SRC (newpat), 0),
1507                                                   temp)));
1508
1509       insn_code_number = recog_for_combine (&pat, i3, &new_i3_notes);
1510       if (insn_code_number >= 0)
1511         newpat = pat;
1512     }
1513                                                         
1514   /* If we were combining three insns and the result is a simple SET
1515      with no ASM_OPERANDS that wasn't recognized, try to split it into two
1516      insns.  There are two ways to do this.  It can be split using a 
1517      machine-specific method (like when you have an addition of a large
1518      constant) or by combine in the function find_split_point.  */
1519
1520   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
1521       && asm_noperands (newpat) < 0)
1522     {
1523       rtx m_split, *split;
1524       rtx ni2dest = i2dest;
1525
1526       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
1527          use I2DEST as a scratch register will help.  In the latter case,
1528          convert I2DEST to the mode of the source of NEWPAT if we can.  */
1529
1530       m_split = split_insns (newpat, i3);
1531       if (m_split == 0)
1532         {
1533           /* If I2DEST is a hard register or the only use of a pseudo,
1534              we can change its mode.  */
1535           if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
1536               && GET_MODE (SET_DEST (newpat)) != VOIDmode
1537               && GET_CODE (i2dest) == REG
1538               && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
1539                   || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2
1540                       && ! REG_USERVAR_P (i2dest))))
1541             ni2dest = gen_rtx (REG, GET_MODE (SET_DEST (newpat)),
1542                                REGNO (i2dest));
1543
1544           m_split = split_insns (gen_rtx (PARALLEL, VOIDmode,
1545                                           gen_rtvec (2, newpat,
1546                                                      gen_rtx (CLOBBER,
1547                                                               VOIDmode,
1548                                                               ni2dest))),
1549                                  i3);
1550         }
1551
1552       if (m_split && GET_CODE (m_split) == SEQUENCE
1553           && XVECLEN (m_split, 0) == 2
1554           && (next_real_insn (i2) == i3
1555               || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)),
1556                                       INSN_CUID (i2))))
1557         {
1558           rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1));
1559           newi2pat = PATTERN (XVECEXP (m_split, 0, 0));
1560
1561           /* In case we changed the mode of I2DEST, replace it in the
1562              pseudo-register table here.  We can't do it above in case this
1563              code doesn't get executed and we do a split the other way.  */
1564
1565           if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
1566             SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
1567
1568           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1569           if (i2_code_number >= 0)
1570             insn_code_number = recog_for_combine (&newi3pat, i3,
1571                                                   &new_i3_notes);
1572
1573           if (insn_code_number >= 0)
1574             newpat = newi3pat;
1575
1576           /* It is possible that both insns now set the destination of I3.
1577              If so, we must show an extra use of it and update
1578              reg_significant.  */
1579
1580           if (insn_code_number >= 0 && GET_CODE (SET_DEST (newpat)) == REG
1581               && GET_CODE (SET_DEST (newi2pat)) == REG
1582               && REGNO (SET_DEST (newpat)) == REGNO (SET_DEST (newi2pat)))
1583             {
1584               reg_n_sets[REGNO (SET_DEST (newpat))]++;
1585               set_significant (SET_DEST (newi2pat), newi2pat);
1586               set_significant (SET_DEST (newpat), newpat);
1587             }
1588         }
1589
1590       /* If we can split it and use I2DEST, go ahead and see if that
1591          helps things be recognized.  Verify that none of the registers
1592          are set between I2 and I3.  */
1593       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
1594 #ifdef HAVE_cc0
1595           && GET_CODE (i2dest) == REG
1596 #endif
1597           /* We need I2DEST in the proper mode.  If it is a hard register
1598              or the only use of a pseudo, we can change its mode.  */
1599           && (GET_MODE (*split) == GET_MODE (i2dest)
1600               || GET_MODE (*split) == VOIDmode
1601               || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
1602               || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2
1603                   && ! REG_USERVAR_P (i2dest)))
1604           && (next_real_insn (i2) == i3
1605               || ! use_crosses_set_p (*split, INSN_CUID (i2)))
1606           /* We can't overwrite I2DEST if its value is still used by
1607              NEWPAT.  */
1608           && ! reg_referenced_p (i2dest, newpat))
1609         {
1610           rtx newdest = i2dest;
1611
1612           /* Get NEWDEST as a register in the proper mode.  We have already
1613              validated that we can do this.  */
1614           if (GET_MODE (i2dest) != GET_MODE (*split)
1615               && GET_MODE (*split) != VOIDmode)
1616             {
1617               newdest = gen_rtx (REG, GET_MODE (*split), REGNO (i2dest));
1618
1619               if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
1620                 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
1621             }
1622
1623           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
1624              an ASHIFT.  This can occur if it was inside a PLUS and hence
1625              appeared to be a memory address.  This is a kludge.  */
1626           if (GET_CODE (*split) == MULT
1627               && GET_CODE (XEXP (*split, 1)) == CONST_INT
1628               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
1629             SUBST (*split, gen_rtx_combine (ASHIFT, GET_MODE (*split),
1630                                             XEXP (*split, 0), GEN_INT (i)));
1631
1632 #ifdef INSN_SCHEDULING
1633           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
1634              be written as a ZERO_EXTEND.  */
1635           if (GET_CODE (*split) == SUBREG
1636               && GET_CODE (SUBREG_REG (*split)) == MEM)
1637             SUBST (*split, gen_rtx_combine (ZERO_EXTEND, GET_MODE (*split),
1638                                             XEXP (*split, 0)));
1639 #endif
1640
1641           newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split);
1642           SUBST (*split, newdest);
1643           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1644           if (i2_code_number >= 0)
1645             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1646         }
1647     }
1648
1649   /* Check for a case where we loaded from memory in a narrow mode and
1650      then sign extended it, but we need both registers.  In that case,
1651      we have a PARALLEL with both loads from the same memory location.
1652      We can split this into a load from memory followed by a register-register
1653      copy.  This saves at least one insn, more if register allocation can
1654      eliminate the copy.  */
1655
1656   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
1657            && GET_CODE (newpat) == PARALLEL
1658            && XVECLEN (newpat, 0) == 2
1659            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1660            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
1661            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1662            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
1663                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
1664            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
1665                                    INSN_CUID (i2))
1666            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
1667            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
1668            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
1669                                          SET_SRC (XVECEXP (newpat, 0, 1)))
1670            && ! find_reg_note (i3, REG_UNUSED,
1671                                SET_DEST (XVECEXP (newpat, 0, 0))))
1672     {
1673       newi2pat = XVECEXP (newpat, 0, 0);
1674       newpat = XVECEXP (newpat, 0, 1);
1675       SUBST (SET_SRC (newpat),
1676              gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)),
1677                                       SET_DEST (newi2pat)));
1678       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1679       if (i2_code_number >= 0)
1680         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1681
1682       if (insn_code_number >= 0)
1683         {
1684           rtx insn;
1685           rtx link;
1686
1687           /* If we will be able to accept this, we have made a change to the
1688              destination of I3.  This can invalidate a LOG_LINKS pointing
1689              to I3.  No other part of combine.c makes such a transformation.
1690
1691              The new I3 will have a destination that was previously the
1692              destination of I1 or I2 and which was used in i2 or I3.  Call
1693              distribute_links to make a LOG_LINK from the next use of
1694              that destination.  */
1695
1696           PATTERN (i3) = newpat;
1697           distribute_links (gen_rtx (INSN_LIST, VOIDmode, i3, NULL_RTX));
1698
1699           /* I3 now uses what used to be its destination and which is
1700              now I2's destination.  That means we need a LOG_LINK from
1701              I3 to I2.  But we used to have one, so we still will.
1702
1703              However, some later insn might be using I2's dest and have
1704              a LOG_LINK pointing at I3.  We must remove this link.
1705              The simplest way to remove the link is to point it at I1,
1706              which we know will be a NOTE.  */
1707
1708           for (insn = NEXT_INSN (i3);
1709                insn && GET_CODE (insn) != CODE_LABEL
1710                && GET_CODE (PREV_INSN (insn)) != JUMP_INSN;
1711                insn = NEXT_INSN (insn))
1712             {
1713               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
1714                   && reg_referenced_p (SET_DEST (newi2pat), PATTERN (insn)))
1715                 {
1716                   for (link = LOG_LINKS (insn); link;
1717                        link = XEXP (link, 1))
1718                     if (XEXP (link, 0) == i3)
1719                       XEXP (link, 0) = i1;
1720
1721                   break;
1722                 }
1723             }
1724         }
1725     }
1726             
1727   /* Similarly, check for a case where we have a PARALLEL of two independent
1728      SETs but we started with three insns.  In this case, we can do the sets
1729      as two separate insns.  This case occurs when some SET allows two
1730      other insns to combine, but the destination of that SET is still live.  */
1731
1732   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
1733            && GET_CODE (newpat) == PARALLEL
1734            && XVECLEN (newpat, 0) == 2
1735            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1736            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
1737            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
1738            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1739            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
1740            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
1741            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
1742                                    INSN_CUID (i2))
1743            /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
1744            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
1745            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
1746            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
1747                                   XVECEXP (newpat, 0, 0))
1748            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
1749                                   XVECEXP (newpat, 0, 1)))
1750     {
1751       newi2pat = XVECEXP (newpat, 0, 1);
1752       newpat = XVECEXP (newpat, 0, 0);
1753
1754       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1755       if (i2_code_number >= 0)
1756         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1757     }
1758
1759   /* If it still isn't recognized, fail and change things back the way they
1760      were.  */
1761   if ((insn_code_number < 0
1762        /* Is the result a reasonable ASM_OPERANDS?  */
1763        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
1764     {
1765       undo_all ();
1766       return 0;
1767     }
1768
1769   /* If we had to change another insn, make sure it is valid also.  */
1770   if (undobuf.other_insn)
1771     {
1772       rtx other_notes = REG_NOTES (undobuf.other_insn);
1773       rtx other_pat = PATTERN (undobuf.other_insn);
1774       rtx new_other_notes;
1775       rtx note, next;
1776
1777       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
1778                                              &new_other_notes);
1779
1780       if (other_code_number < 0 && ! check_asm_operands (other_pat))
1781         {
1782           undo_all ();
1783           return 0;
1784         }
1785
1786       PATTERN (undobuf.other_insn) = other_pat;
1787
1788       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
1789          are still valid.  Then add any non-duplicate notes added by
1790          recog_for_combine.  */
1791       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
1792         {
1793           next = XEXP (note, 1);
1794
1795           if (REG_NOTE_KIND (note) == REG_UNUSED
1796               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
1797             remove_note (undobuf.other_insn, note);
1798         }
1799
1800       distribute_notes (new_other_notes, undobuf.other_insn,
1801                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
1802     }
1803
1804   /* We now know that we can do this combination.  Merge the insns and 
1805      update the status of registers and LOG_LINKS.  */
1806
1807   {
1808     rtx i3notes, i2notes, i1notes = 0;
1809     rtx i3links, i2links, i1links = 0;
1810     rtx midnotes = 0;
1811     int all_adjacent = (next_real_insn (i2) == i3
1812                         && (i1 == 0 || next_real_insn (i1) == i2));
1813     register int regno;
1814     /* Compute which registers we expect to eliminate.  */
1815     rtx elim_i2 = (newi2pat || i2dest_in_i2src || i2dest_in_i1src
1816                    ? 0 : i2dest);
1817     rtx elim_i1 = i1 == 0 || i1dest_in_i1src ? 0 : i1dest;
1818
1819     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
1820        clear them.  */
1821     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
1822     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
1823     if (i1)
1824       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
1825
1826     /* Ensure that we do not have something that should not be shared but
1827        occurs multiple times in the new insns.  Check this by first
1828        resetting all the `used' flags and then copying anything is shared.  */
1829
1830     reset_used_flags (i3notes);
1831     reset_used_flags (i2notes);
1832     reset_used_flags (i1notes);
1833     reset_used_flags (newpat);
1834     reset_used_flags (newi2pat);
1835     if (undobuf.other_insn)
1836       reset_used_flags (PATTERN (undobuf.other_insn));
1837
1838     i3notes = copy_rtx_if_shared (i3notes);
1839     i2notes = copy_rtx_if_shared (i2notes);
1840     i1notes = copy_rtx_if_shared (i1notes);
1841     newpat = copy_rtx_if_shared (newpat);
1842     newi2pat = copy_rtx_if_shared (newi2pat);
1843     if (undobuf.other_insn)
1844       reset_used_flags (PATTERN (undobuf.other_insn));
1845
1846     INSN_CODE (i3) = insn_code_number;
1847     PATTERN (i3) = newpat;
1848     if (undobuf.other_insn)
1849       INSN_CODE (undobuf.other_insn) = other_code_number;
1850
1851     /* We had one special case above where I2 had more than one set and
1852        we replaced a destination of one of those sets with the destination
1853        of I3.  In that case, we have to update LOG_LINKS of insns later
1854        in this basic block.  Note that this (expensive) case is rare.  */
1855
1856     if (GET_CODE (PATTERN (i2)) == PARALLEL)
1857       for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
1858         if (GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
1859             && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
1860             && ! find_reg_note (i2, REG_UNUSED,
1861                                 SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
1862           {
1863             register rtx insn;
1864
1865             for (insn = NEXT_INSN (i2); insn; insn = NEXT_INSN (insn))
1866               {
1867                 if (insn != i3 && GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1868                   for (link = LOG_LINKS (insn); link; link = XEXP (link, 1))
1869                     if (XEXP (link, 0) == i2)
1870                       XEXP (link, 0) = i3;
1871
1872                 if (GET_CODE (insn) == CODE_LABEL
1873                     || GET_CODE (insn) == JUMP_INSN)
1874                   break;
1875               }
1876           }
1877
1878     LOG_LINKS (i3) = 0;
1879     REG_NOTES (i3) = 0;
1880     LOG_LINKS (i2) = 0;
1881     REG_NOTES (i2) = 0;
1882
1883     if (newi2pat)
1884       {
1885         INSN_CODE (i2) = i2_code_number;
1886         PATTERN (i2) = newi2pat;
1887       }
1888     else
1889       {
1890         PUT_CODE (i2, NOTE);
1891         NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
1892         NOTE_SOURCE_FILE (i2) = 0;
1893       }
1894
1895     if (i1)
1896       {
1897         LOG_LINKS (i1) = 0;
1898         REG_NOTES (i1) = 0;
1899         PUT_CODE (i1, NOTE);
1900         NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
1901         NOTE_SOURCE_FILE (i1) = 0;
1902       }
1903
1904     /* Get death notes for everything that is now used in either I3 or
1905        I2 and used to die in a previous insn.  */
1906
1907     move_deaths (newpat, i1 ? INSN_CUID (i1) : INSN_CUID (i2), i3, &midnotes);
1908     if (newi2pat)
1909       move_deaths (newi2pat, INSN_CUID (i1), i2, &midnotes);
1910
1911     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
1912     if (i3notes)
1913       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
1914                         elim_i2, elim_i1);
1915     if (i2notes)
1916       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
1917                         elim_i2, elim_i1);
1918     if (i1notes)
1919       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
1920                         elim_i2, elim_i1);
1921     if (midnotes)
1922       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
1923                         elim_i2, elim_i1);
1924
1925     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
1926        know these are REG_UNUSED and want them to go to the desired insn,
1927        so we always pass it as i3.  */
1928     if (newi2pat && new_i2_notes)
1929       distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
1930     if (new_i3_notes)
1931       distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
1932
1933     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
1934        put a REG_DEAD note for it somewhere.  Similarly for I2 and I1.  */
1935
1936     if (i3dest_killed)
1937       distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i3dest_killed, NULL_RTX),
1938                         NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
1939                         NULL_RTX, NULL_RTX);
1940
1941     /* For I2 and I1, we have to be careful.  If NEWI2PAT exists and sets
1942        I2DEST or I1DEST, the death must be somewhere before I2, not I3.  If
1943        we passed I3 in that case, it might delete I2.  */
1944
1945     if (i2dest_in_i2src)
1946       {
1947         if (newi2pat && reg_set_p (i2dest, newi2pat))
1948           distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
1949                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
1950         else
1951           distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX),
1952                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
1953                             NULL_RTX, NULL_RTX);
1954       }
1955
1956     if (i1dest_in_i1src)
1957       {
1958         if (newi2pat && reg_set_p (i1dest, newi2pat))
1959           distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
1960                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
1961         else
1962           distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX),
1963                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
1964                             NULL_RTX, NULL_RTX);
1965       }
1966
1967     distribute_links (i3links);
1968     distribute_links (i2links);
1969     distribute_links (i1links);
1970
1971     if (GET_CODE (i2dest) == REG)
1972       {
1973         rtx link;
1974         rtx i2_insn = 0, i2_val = 0, set;
1975
1976         /* The insn that used to set this register doesn't exist, and
1977            this life of the register may not exist either.  See if one of
1978            I3's links points to an insn that sets I2DEST.  If it does, 
1979            that is now the last known value for I2DEST. If we don't update
1980            this and I2 set the register to a value that depended on its old
1981            contents, we will get confused.  If this insn is used, thing
1982            will be set correctly in combine_instructions.  */
1983
1984         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
1985           if ((set = single_set (XEXP (link, 0))) != 0
1986               && rtx_equal_p (i2dest, SET_DEST (set)))
1987             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
1988
1989         record_value_for_reg (i2dest, i2_insn, i2_val);
1990
1991         /* If the reg formerly set in I2 died only once and that was in I3,
1992            zero its use count so it won't make `reload' do any work.  */
1993         if (! added_sets_2 && newi2pat == 0)
1994           {
1995             regno = REGNO (i2dest);
1996             reg_n_sets[regno]--;
1997             if (reg_n_sets[regno] == 0
1998                 && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS]
1999                       & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS))))
2000               reg_n_refs[regno] = 0;
2001           }
2002       }
2003
2004     if (i1 && GET_CODE (i1dest) == REG)
2005       {
2006         rtx link;
2007         rtx i1_insn = 0, i1_val = 0, set;
2008
2009         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2010           if ((set = single_set (XEXP (link, 0))) != 0
2011               && rtx_equal_p (i1dest, SET_DEST (set)))
2012             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2013
2014         record_value_for_reg (i1dest, i1_insn, i1_val);
2015
2016         regno = REGNO (i1dest);
2017         if (! added_sets_1)
2018           {
2019             reg_n_sets[regno]--;
2020             if (reg_n_sets[regno] == 0
2021                 && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS]
2022                       & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS))))
2023               reg_n_refs[regno] = 0;
2024           }
2025       }
2026
2027     /* If I3 is now an unconditional jump, ensure that it has a 
2028        BARRIER following it since it may have initially been a
2029        conditional jump.  */
2030
2031     if ((GET_CODE (newpat) == RETURN || simplejump_p (i3))
2032         && GET_CODE (next_nonnote_insn (i3)) != BARRIER)
2033       emit_barrier_after (i3);
2034   }
2035
2036   combine_successes++;
2037
2038   return newi2pat ? i2 : i3;
2039 }
2040 \f
2041 /* Undo all the modifications recorded in undobuf.  */
2042
2043 static void
2044 undo_all ()
2045 {
2046   register int i;
2047   if (undobuf.num_undo > MAX_UNDO)
2048     undobuf.num_undo = MAX_UNDO;
2049   for (i = undobuf.num_undo - 1; i >= 0; i--)
2050     {
2051       if (undobuf.undo[i].is_int)
2052         *undobuf.undo[i].where.i = undobuf.undo[i].old_contents.i;
2053       else
2054         *undobuf.undo[i].where.rtx = undobuf.undo[i].old_contents.rtx;
2055       
2056     }
2057
2058   obfree (undobuf.storage);
2059   undobuf.num_undo = 0;
2060 }
2061 \f
2062 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
2063    where we have an arithmetic expression and return that point.  LOC will
2064    be inside INSN.
2065
2066    try_combine will call this function to see if an insn can be split into
2067    two insns.  */
2068
2069 static rtx *
2070 find_split_point (loc, insn)
2071      rtx *loc;
2072      rtx insn;
2073 {
2074   rtx x = *loc;
2075   enum rtx_code code = GET_CODE (x);
2076   rtx *split;
2077   int len = 0, pos, unsignedp;
2078   rtx inner;
2079
2080   /* First special-case some codes.  */
2081   switch (code)
2082     {
2083     case SUBREG:
2084 #ifdef INSN_SCHEDULING
2085       /* If we are making a paradoxical SUBREG invalid, it becomes a split
2086          point.  */
2087       if (GET_CODE (SUBREG_REG (x)) == MEM)
2088         return loc;
2089 #endif
2090       return find_split_point (&SUBREG_REG (x), insn);
2091
2092     case MEM:
2093 #ifdef HAVE_lo_sum
2094       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
2095          using LO_SUM and HIGH.  */
2096       if (GET_CODE (XEXP (x, 0)) == CONST
2097           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2098         {
2099           SUBST (XEXP (x, 0),
2100                  gen_rtx_combine (LO_SUM, Pmode,
2101                                   gen_rtx_combine (HIGH, Pmode, XEXP (x, 0)),
2102                                   XEXP (x, 0)));
2103           return &XEXP (XEXP (x, 0), 0);
2104         }
2105 #endif
2106
2107       /* If we have a PLUS whose second operand is a constant and the
2108          address is not valid, perhaps will can split it up using
2109          the machine-specific way to split large constants.  We use
2110          the first psuedo-reg (one of the virtual regs) as a placeholder;
2111          it will not remain in the result.  */
2112       if (GET_CODE (XEXP (x, 0)) == PLUS
2113           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2114           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2115         {
2116           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
2117           rtx seq = split_insns (gen_rtx (SET, VOIDmode, reg, XEXP (x, 0)),
2118                                  subst_insn);
2119
2120           /* This should have produced two insns, each of which sets our
2121              placeholder.  If the source of the second is a valid address,
2122              we can make put both sources together and make a split point
2123              in the middle.  */
2124
2125           if (seq && XVECLEN (seq, 0) == 2
2126               && GET_CODE (XVECEXP (seq, 0, 0)) == INSN
2127               && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET
2128               && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg
2129               && ! reg_mentioned_p (reg,
2130                                     SET_SRC (PATTERN (XVECEXP (seq, 0, 0))))
2131               && GET_CODE (XVECEXP (seq, 0, 1)) == INSN
2132               && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET
2133               && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg
2134               && memory_address_p (GET_MODE (x),
2135                                    SET_SRC (PATTERN (XVECEXP (seq, 0, 1)))))
2136             {
2137               rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0)));
2138               rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1)));
2139
2140               /* Replace the placeholder in SRC2 with SRC1.  If we can
2141                  find where in SRC2 it was placed, that can become our
2142                  split point and we can replace this address with SRC2.
2143                  Just try two obvious places.  */
2144
2145               src2 = replace_rtx (src2, reg, src1);
2146               split = 0;
2147               if (XEXP (src2, 0) == src1)
2148                 split = &XEXP (src2, 0);
2149               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
2150                        && XEXP (XEXP (src2, 0), 0) == src1)
2151                 split = &XEXP (XEXP (src2, 0), 0);
2152
2153               if (split)
2154                 {
2155                   SUBST (XEXP (x, 0), src2);
2156                   return split;
2157                 }
2158             }
2159         }
2160       break;
2161
2162     case SET:
2163 #ifdef HAVE_cc0
2164       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
2165          ZERO_EXTRACT, the most likely reason why this doesn't match is that
2166          we need to put the operand into a register.  So split at that
2167          point.  */
2168
2169       if (SET_DEST (x) == cc0_rtx
2170           && GET_CODE (SET_SRC (x)) != COMPARE
2171           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
2172           && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o'
2173           && ! (GET_CODE (SET_SRC (x)) == SUBREG
2174                 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o'))
2175         return &SET_SRC (x);
2176 #endif
2177
2178       /* See if we can split SET_SRC as it stands.  */
2179       split = find_split_point (&SET_SRC (x), insn);
2180       if (split && split != &SET_SRC (x))
2181         return split;
2182
2183       /* See if this is a bitfield assignment with everything constant.  If
2184          so, this is an IOR of an AND, so split it into that.  */
2185       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
2186           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
2187               <= HOST_BITS_PER_WIDE_INT)
2188           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
2189           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
2190           && GET_CODE (SET_SRC (x)) == CONST_INT
2191           && ((INTVAL (XEXP (SET_DEST (x), 1))
2192               + INTVAL (XEXP (SET_DEST (x), 2)))
2193               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
2194           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
2195         {
2196           int pos = INTVAL (XEXP (SET_DEST (x), 2));
2197           int len = INTVAL (XEXP (SET_DEST (x), 1));
2198           int src = INTVAL (SET_SRC (x));
2199           rtx dest = XEXP (SET_DEST (x), 0);
2200           enum machine_mode mode = GET_MODE (dest);
2201           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
2202
2203 #if BITS_BIG_ENDIAN
2204           pos = GET_MODE_BITSIZE (mode) - len - pos;
2205 #endif
2206
2207           if (src == mask)
2208             SUBST (SET_SRC (x),
2209                    gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
2210           else
2211             SUBST (SET_SRC (x),
2212                    gen_binary (IOR, mode,
2213                                gen_binary (AND, mode, dest, 
2214                                            GEN_INT (~ (mask << pos)
2215                                                     & GET_MODE_MASK (mode))),
2216                                GEN_INT (src << pos)));
2217
2218           SUBST (SET_DEST (x), dest);
2219
2220           split = find_split_point (&SET_SRC (x), insn);
2221           if (split && split != &SET_SRC (x))
2222             return split;
2223         }
2224
2225       /* Otherwise, see if this is an operation that we can split into two.
2226          If so, try to split that.  */
2227       code = GET_CODE (SET_SRC (x));
2228
2229       switch (code)
2230         {
2231         case AND:
2232           /* If we are AND'ing with a large constant that is only a single
2233              bit and the result is only being used in a context where we
2234              need to know if it is zero or non-zero, replace it with a bit
2235              extraction.  This will avoid the large constant, which might
2236              have taken more than one insn to make.  If the constant were
2237              not a valid argument to the AND but took only one insn to make,
2238              this is no worse, but if it took more than one insn, it will
2239              be better.  */
2240
2241           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
2242               && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
2243               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
2244               && GET_CODE (SET_DEST (x)) == REG
2245               && (split = find_single_use (SET_DEST (x), insn, NULL_PTR)) != 0
2246               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
2247               && XEXP (*split, 0) == SET_DEST (x)
2248               && XEXP (*split, 1) == const0_rtx)
2249             {
2250               SUBST (SET_SRC (x),
2251                      make_extraction (GET_MODE (SET_DEST (x)),
2252                                       XEXP (SET_SRC (x), 0),
2253                                       pos, NULL_RTX, 1, 1, 0, 0));
2254               return find_split_point (loc, insn);
2255             }
2256           break;
2257
2258         case SIGN_EXTEND:
2259           inner = XEXP (SET_SRC (x), 0);
2260           pos = 0;
2261           len = GET_MODE_BITSIZE (GET_MODE (inner));
2262           unsignedp = 0;
2263           break;
2264
2265         case SIGN_EXTRACT:
2266         case ZERO_EXTRACT:
2267           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
2268               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
2269             {
2270               inner = XEXP (SET_SRC (x), 0);
2271               len = INTVAL (XEXP (SET_SRC (x), 1));
2272               pos = INTVAL (XEXP (SET_SRC (x), 2));
2273
2274 #if BITS_BIG_ENDIAN
2275               pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
2276 #endif
2277               unsignedp = (code == ZERO_EXTRACT);
2278             }
2279           break;
2280         }
2281
2282       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
2283         {
2284           enum machine_mode mode = GET_MODE (SET_SRC (x));
2285
2286           /* For unsigned, we have a choice of a shift followed by an
2287              AND or two shifts.  Use two shifts for field sizes where the
2288              constant might be too large.  We assume here that we can
2289              always at least get 8-bit constants in an AND insn, which is
2290              true for every current RISC.  */
2291
2292           if (unsignedp && len <= 8)
2293             {
2294               SUBST (SET_SRC (x),
2295                      gen_rtx_combine
2296                      (AND, mode,
2297                       gen_rtx_combine (LSHIFTRT, mode,
2298                                        gen_lowpart_for_combine (mode, inner),
2299                                        GEN_INT (pos)),
2300                       GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
2301
2302               split = find_split_point (&SET_SRC (x), insn);
2303               if (split && split != &SET_SRC (x))
2304                 return split;
2305             }
2306           else
2307             {
2308               SUBST (SET_SRC (x),
2309                      gen_rtx_combine
2310                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
2311                       gen_rtx_combine (ASHIFT, mode,
2312                                        gen_lowpart_for_combine (mode, inner),
2313                                        GEN_INT (GET_MODE_BITSIZE (mode)
2314                                                 - len - pos)),
2315                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
2316
2317               split = find_split_point (&SET_SRC (x), insn);
2318               if (split && split != &SET_SRC (x))
2319                 return split;
2320             }
2321         }
2322
2323       /* See if this is a simple operation with a constant as the second
2324          operand.  It might be that this constant is out of range and hence
2325          could be used as a split point.  */
2326       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
2327            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
2328            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<')
2329           && CONSTANT_P (XEXP (SET_SRC (x), 1))
2330           && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o'
2331               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
2332                   && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0))))
2333                       == 'o'))))
2334         return &XEXP (SET_SRC (x), 1);
2335
2336       /* Finally, see if this is a simple operation with its first operand
2337          not in a register.  The operation might require this operand in a
2338          register, so return it as a split point.  We can always do this
2339          because if the first operand were another operation, we would have
2340          already found it as a split point.  */
2341       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
2342            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
2343            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<'
2344            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1')
2345           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
2346         return &XEXP (SET_SRC (x), 0);
2347
2348       return 0;
2349
2350     case AND:
2351     case IOR:
2352       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
2353          it is better to write this as (not (ior A B)) so we can split it.
2354          Similarly for IOR.  */
2355       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
2356         {
2357           SUBST (*loc,
2358                  gen_rtx_combine (NOT, GET_MODE (x),
2359                                   gen_rtx_combine (code == IOR ? AND : IOR,
2360                                                    GET_MODE (x),
2361                                                    XEXP (XEXP (x, 0), 0),
2362                                                    XEXP (XEXP (x, 1), 0))));
2363           return find_split_point (loc, insn);
2364         }
2365
2366       /* Many RISC machines have a large set of logical insns.  If the
2367          second operand is a NOT, put it first so we will try to split the
2368          other operand first.  */
2369       if (GET_CODE (XEXP (x, 1)) == NOT)
2370         {
2371           rtx tem = XEXP (x, 0);
2372           SUBST (XEXP (x, 0), XEXP (x, 1));
2373           SUBST (XEXP (x, 1), tem);
2374         }
2375       break;
2376     }
2377
2378   /* Otherwise, select our actions depending on our rtx class.  */
2379   switch (GET_RTX_CLASS (code))
2380     {
2381     case 'b':                   /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
2382     case '3':
2383       split = find_split_point (&XEXP (x, 2), insn);
2384       if (split)
2385         return split;
2386       /* ... fall through ... */
2387     case '2':
2388     case 'c':
2389     case '<':
2390       split = find_split_point (&XEXP (x, 1), insn);
2391       if (split)
2392         return split;
2393       /* ... fall through ... */
2394     case '1':
2395       /* Some machines have (and (shift ...) ...) insns.  If X is not
2396          an AND, but XEXP (X, 0) is, use it as our split point.  */
2397       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
2398         return &XEXP (x, 0);
2399
2400       split = find_split_point (&XEXP (x, 0), insn);
2401       if (split)
2402         return split;
2403       return loc;
2404     }
2405
2406   /* Otherwise, we don't have a split point.  */
2407   return 0;
2408 }
2409 \f
2410 /* Throughout X, replace FROM with TO, and return the result.
2411    The result is TO if X is FROM;
2412    otherwise the result is X, but its contents may have been modified.
2413    If they were modified, a record was made in undobuf so that
2414    undo_all will (among other things) return X to its original state.
2415
2416    If the number of changes necessary is too much to record to undo,
2417    the excess changes are not made, so the result is invalid.
2418    The changes already made can still be undone.
2419    undobuf.num_undo is incremented for such changes, so by testing that
2420    the caller can tell whether the result is valid.
2421
2422    `n_occurrences' is incremented each time FROM is replaced.
2423    
2424    IN_DEST is non-zero if we are processing the SET_DEST of a SET.
2425
2426    UNIQUE_COPY is non-zero if each substitution must be unique.  We do this
2427    by copying if `n_occurrences' is non-zero.  */
2428
2429 static rtx
2430 subst (x, from, to, in_dest, unique_copy)
2431      register rtx x, from, to;
2432      int in_dest;
2433      int unique_copy;
2434 {
2435   register char *fmt;
2436   register int len, i;
2437   register enum rtx_code code = GET_CODE (x), orig_code = code;
2438   rtx temp;
2439   enum machine_mode mode = GET_MODE (x);
2440   enum machine_mode op0_mode = VOIDmode;
2441   rtx other_insn;
2442   rtx *cc_use;
2443   int n_restarts = 0;
2444
2445 /* FAKE_EXTEND_SAFE_P (MODE, FROM) is 1 if (subreg:MODE FROM 0) is a safe
2446    replacement for (zero_extend:MODE FROM) or (sign_extend:MODE FROM).
2447    If it is 0, that cannot be done.  We can now do this for any MEM
2448    because (SUBREG (MEM...)) is guaranteed to cause the MEM to be reloaded.
2449    If not for that, MEM's would very rarely be safe.  */
2450
2451 /* Reject MODEs bigger than a word, because we might not be able
2452    to reference a two-register group starting with an arbitrary register
2453    (and currently gen_lowpart might crash for a SUBREG).  */
2454
2455 #define FAKE_EXTEND_SAFE_P(MODE, FROM) \
2456   (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD)
2457
2458 /* Two expressions are equal if they are identical copies of a shared
2459    RTX or if they are both registers with the same register number
2460    and mode.  */
2461
2462 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
2463   ((X) == (Y)                                           \
2464    || (GET_CODE (X) == REG && GET_CODE (Y) == REG       \
2465        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
2466
2467   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
2468     {
2469       n_occurrences++;
2470       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
2471     }
2472
2473   /* If X and FROM are the same register but different modes, they will
2474      not have been seen as equal above.  However, flow.c will make a 
2475      LOG_LINKS entry for that case.  If we do nothing, we will try to
2476      rerecognize our original insn and, when it succeeds, we will
2477      delete the feeding insn, which is incorrect.
2478
2479      So force this insn not to match in this (rare) case.  */
2480   if (! in_dest && code == REG && GET_CODE (from) == REG
2481       && REGNO (x) == REGNO (from))
2482     return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
2483
2484   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
2485      of which may contain things that can be combined.  */
2486   if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o')
2487     return x;
2488
2489   /* It is possible to have a subexpression appear twice in the insn.
2490      Suppose that FROM is a register that appears within TO.
2491      Then, after that subexpression has been scanned once by `subst',
2492      the second time it is scanned, TO may be found.  If we were
2493      to scan TO here, we would find FROM within it and create a
2494      self-referent rtl structure which is completely wrong.  */
2495   if (COMBINE_RTX_EQUAL_P (x, to))
2496     return to;
2497
2498   len = GET_RTX_LENGTH (code);
2499   fmt = GET_RTX_FORMAT (code);
2500
2501   /* We don't need to process a SET_DEST that is a register, CC0, or PC, so
2502      set up to skip this common case.  All other cases where we want to
2503      suppress replacing something inside a SET_SRC are handled via the
2504      IN_DEST operand.  */
2505   if (code == SET
2506       && (GET_CODE (SET_DEST (x)) == REG
2507         || GET_CODE (SET_DEST (x)) == CC0
2508         || GET_CODE (SET_DEST (x)) == PC))
2509     fmt = "ie";
2510
2511   /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a constant. */
2512   if (fmt[0] == 'e')
2513     op0_mode = GET_MODE (XEXP (x, 0));
2514
2515   for (i = 0; i < len; i++)
2516     {
2517       if (fmt[i] == 'E')
2518         {
2519           register int j;
2520           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2521             {
2522               register rtx new;
2523               if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
2524                 {
2525                   new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
2526                   n_occurrences++;
2527                 }
2528               else
2529                 {
2530                   new = subst (XVECEXP (x, i, j), from, to, 0, unique_copy);
2531
2532                   /* If this substitution failed, this whole thing fails.  */
2533                   if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
2534                     return new;
2535                 }
2536
2537               SUBST (XVECEXP (x, i, j), new);
2538             }
2539         }
2540       else if (fmt[i] == 'e')
2541         {
2542           register rtx new;
2543
2544           if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
2545             {
2546               new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
2547               n_occurrences++;
2548             }
2549           else
2550             /* If we are in a SET_DEST, suppress most cases unless we
2551                have gone inside a MEM, in which case we want to
2552                simplify the address.  We assume here that things that
2553                are actually part of the destination have their inner
2554                parts in the first expression.  This is true for SUBREG, 
2555                STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
2556                things aside from REG and MEM that should appear in a
2557                SET_DEST.  */
2558             new = subst (XEXP (x, i), from, to,
2559                          (((in_dest
2560                             && (code == SUBREG || code == STRICT_LOW_PART
2561                                 || code == ZERO_EXTRACT))
2562                            || code == SET)
2563                           && i == 0), unique_copy);
2564
2565           /* If we found that we will have to reject this combination,
2566              indicate that by returning the CLOBBER ourselves, rather than
2567              an expression containing it.  This will speed things up as
2568              well as prevent accidents where two CLOBBERs are considered
2569              to be equal, thus producing an incorrect simplification.  */
2570
2571           if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
2572             return new;
2573
2574           SUBST (XEXP (x, i), new);
2575         }
2576     }
2577
2578   /* We come back to here if we have replaced the expression with one of
2579      a different code and it is likely that further simplification will be
2580      possible.  */
2581
2582  restart:
2583
2584   /* If we have restarted more than 4 times, we are probably looping, so
2585      give up.  */
2586   if (++n_restarts > 4)
2587     return x;
2588
2589   /* If we are restarting at all, it means that we no longer know the
2590      original mode of operand 0 (since we have probably changed the
2591      form of X).  */
2592
2593   if (n_restarts > 1)
2594     op0_mode = VOIDmode;
2595
2596   code = GET_CODE (x);
2597
2598   /* If this is a commutative operation, put a constant last and a complex
2599      expression first.  We don't need to do this for comparisons here.  */
2600   if (GET_RTX_CLASS (code) == 'c'
2601       && ((CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT)
2602           || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'o'
2603               && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')
2604           || (GET_CODE (XEXP (x, 0)) == SUBREG
2605               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o'
2606               && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')))
2607     {
2608       temp = XEXP (x, 0);
2609       SUBST (XEXP (x, 0), XEXP (x, 1));
2610       SUBST (XEXP (x, 1), temp);
2611     }
2612
2613   /* If this is a simple operation applied to an IF_THEN_ELSE, try 
2614      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
2615      things.  Don't deal with operations that change modes here.  */
2616
2617   if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c')
2618       && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE)
2619     {
2620       /* Don't do this by using SUBST inside X since we might be messing
2621          up a shared expression.  */
2622       rtx cond = XEXP (XEXP (x, 0), 0);
2623       rtx t_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1),
2624                                      XEXP (x, 1)),
2625                          pc_rtx, pc_rtx, 0);
2626       rtx f_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2),
2627                                      XEXP (x, 1)),
2628                          pc_rtx, pc_rtx, 0);
2629
2630
2631       x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
2632       goto restart;
2633     }
2634
2635   else if (GET_RTX_CLASS (code) == '1'
2636            && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE
2637            && GET_MODE (XEXP (x, 0)) == mode)
2638     {
2639       rtx cond = XEXP (XEXP (x, 0), 0);
2640       rtx t_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)),
2641                          pc_rtx, pc_rtx, 0);
2642       rtx f_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)),
2643                          pc_rtx, pc_rtx, 0);
2644
2645       x = gen_rtx_combine (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
2646       goto restart;
2647     }
2648
2649   /* Try to fold this expression in case we have constants that weren't
2650      present before.  */
2651   temp = 0;
2652   switch (GET_RTX_CLASS (code))
2653     {
2654     case '1':
2655       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
2656       break;
2657     case '<':
2658       temp = simplify_relational_operation (code, op0_mode,
2659                                             XEXP (x, 0), XEXP (x, 1));
2660 #ifdef FLOAT_STORE_FLAG_VALUE
2661       if (temp != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2662         temp = ((temp == const0_rtx) ? CONST0_RTX (GET_MODE (x))
2663                 : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x)));
2664 #endif
2665       break;
2666     case 'c':
2667     case '2':
2668       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
2669       break;
2670     case 'b':
2671     case '3':
2672       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
2673                                          XEXP (x, 1), XEXP (x, 2));
2674       break;
2675     }
2676
2677   if (temp)
2678     x = temp, code = GET_CODE (temp);
2679
2680   /* First see if we can apply the inverse distributive law.  */
2681   if (code == PLUS || code == MINUS || code == IOR || code == XOR)
2682     {
2683       x = apply_distributive_law (x);
2684       code = GET_CODE (x);
2685     }
2686
2687   /* If CODE is an associative operation not otherwise handled, see if we
2688      can associate some operands.  This can win if they are constants or
2689      if they are logically related (i.e. (a & b) & a.  */
2690   if ((code == PLUS || code == MINUS
2691        || code == MULT || code == AND || code == IOR || code == XOR
2692        || code == DIV || code == UDIV
2693        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
2694       && GET_MODE_CLASS (mode) == MODE_INT)
2695     {
2696       if (GET_CODE (XEXP (x, 0)) == code)
2697         {
2698           rtx other = XEXP (XEXP (x, 0), 0);
2699           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
2700           rtx inner_op1 = XEXP (x, 1);
2701           rtx inner;
2702           
2703           /* Make sure we pass the constant operand if any as the second
2704              one if this is a commutative operation.  */
2705           if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
2706             {
2707               rtx tem = inner_op0;
2708               inner_op0 = inner_op1;
2709               inner_op1 = tem;
2710             }
2711           inner = simplify_binary_operation (code == MINUS ? PLUS
2712                                              : code == DIV ? MULT
2713                                              : code == UDIV ? MULT
2714                                              : code,
2715                                              mode, inner_op0, inner_op1);
2716
2717           /* For commutative operations, try the other pair if that one
2718              didn't simplify.  */
2719           if (inner == 0 && GET_RTX_CLASS (code) == 'c')
2720             {
2721               other = XEXP (XEXP (x, 0), 1);
2722               inner = simplify_binary_operation (code, mode,
2723                                                  XEXP (XEXP (x, 0), 0),
2724                                                  XEXP (x, 1));
2725             }
2726
2727           if (inner)
2728             {
2729               x = gen_binary (code, mode, other, inner);
2730               goto restart;
2731             
2732             }
2733         }
2734     }
2735
2736   /* A little bit of algebraic simplification here.  */
2737   switch (code)
2738     {
2739     case MEM:
2740       /* Ensure that our address has any ASHIFTs converted to MULT in case
2741          address-recognizing predicates are called later.  */
2742       temp = make_compound_operation (XEXP (x, 0), MEM);
2743       SUBST (XEXP (x, 0), temp);
2744       break;
2745
2746     case SUBREG:
2747       /* (subreg:A (mem:B X) N) becomes a modified MEM unless the SUBREG
2748          is paradoxical.  If we can't do that safely, then it becomes
2749          something nonsensical so that this combination won't take place.  */
2750
2751       if (GET_CODE (SUBREG_REG (x)) == MEM
2752           && (GET_MODE_SIZE (mode)
2753               <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
2754         {
2755           rtx inner = SUBREG_REG (x);
2756           int endian_offset = 0;
2757           /* Don't change the mode of the MEM
2758              if that would change the meaning of the address.  */
2759           if (MEM_VOLATILE_P (SUBREG_REG (x))
2760               || mode_dependent_address_p (XEXP (inner, 0)))
2761             return gen_rtx (CLOBBER, mode, const0_rtx);
2762
2763 #if BYTES_BIG_ENDIAN
2764           if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
2765             endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (mode);
2766           if (GET_MODE_SIZE (GET_MODE (inner)) < UNITS_PER_WORD)
2767             endian_offset -= UNITS_PER_WORD - GET_MODE_SIZE (GET_MODE (inner));
2768 #endif
2769           /* Note if the plus_constant doesn't make a valid address
2770              then this combination won't be accepted.  */
2771           x = gen_rtx (MEM, mode,
2772                        plus_constant (XEXP (inner, 0),
2773                                       (SUBREG_WORD (x) * UNITS_PER_WORD
2774                                        + endian_offset)));
2775           MEM_VOLATILE_P (x) = MEM_VOLATILE_P (inner);
2776           RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (inner);
2777           MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (inner);
2778           return x;
2779         }
2780
2781       /* If we are in a SET_DEST, these other cases can't apply.  */
2782       if (in_dest)
2783         return x;
2784
2785       /* Changing mode twice with SUBREG => just change it once,
2786          or not at all if changing back to starting mode.  */
2787       if (GET_CODE (SUBREG_REG (x)) == SUBREG)
2788         {
2789           if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x)))
2790               && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0)
2791             return SUBREG_REG (SUBREG_REG (x));
2792
2793           SUBST_INT (SUBREG_WORD (x),
2794                      SUBREG_WORD (x) + SUBREG_WORD (SUBREG_REG (x)));
2795           SUBST (SUBREG_REG (x), SUBREG_REG (SUBREG_REG (x)));
2796         }
2797
2798       /* SUBREG of a hard register => just change the register number
2799          and/or mode.  If the hard register is not valid in that mode,
2800          suppress this combination.  */
2801
2802       if (GET_CODE (SUBREG_REG (x)) == REG
2803           && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER)
2804         {
2805           if (HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (x)) + SUBREG_WORD (x),
2806                                   mode))
2807             return gen_rtx (REG, mode,
2808                             REGNO (SUBREG_REG (x)) + SUBREG_WORD (x));
2809           else
2810             return gen_rtx (CLOBBER, mode, const0_rtx);
2811         }
2812
2813       /* For a constant, try to pick up the part we want.  Handle a full
2814          word and low-order part.  Only do this if we are narrowing
2815          the constant; if it is being widened, we have no idea what
2816          the extra bits will have been set to.  */
2817
2818       if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode
2819           && GET_MODE_SIZE (mode) == UNITS_PER_WORD
2820           && GET_MODE_SIZE (op0_mode) < UNITS_PER_WORD
2821           && GET_MODE_CLASS (mode) == MODE_INT)
2822         {
2823           temp = operand_subword (SUBREG_REG (x), SUBREG_WORD (x),
2824                                   0, op0_mode);
2825           if (temp)
2826             return temp;
2827         }
2828         
2829       if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x)
2830           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode))
2831         return gen_lowpart_for_combine (mode, SUBREG_REG (x));
2832
2833       /* If we are narrowing the object, we need to see if we can simplify
2834          the expression for the object knowing that we only need the
2835          low-order bits.  */
2836
2837       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
2838           && subreg_lowpart_p (x))
2839         return force_to_mode (SUBREG_REG (x), mode, GET_MODE_BITSIZE (mode),
2840                               NULL_RTX);
2841       break;
2842
2843     case NOT:
2844       /* (not (plus X -1)) can become (neg X).  */
2845       if (GET_CODE (XEXP (x, 0)) == PLUS
2846           && XEXP (XEXP (x, 0), 1) == constm1_rtx)
2847         {
2848           x = gen_rtx_combine (NEG, mode, XEXP (XEXP (x, 0), 0));
2849           goto restart;
2850         }
2851
2852       /* Similarly, (not (neg X)) is (plus X -1).  */
2853       if (GET_CODE (XEXP (x, 0)) == NEG)
2854         {
2855           x = gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
2856           goto restart;
2857         }
2858
2859       /* (not (xor X C)) for C constant is (xor X D) with D = ~ C.  */
2860       if (GET_CODE (XEXP (x, 0)) == XOR
2861           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2862           && (temp = simplify_unary_operation (NOT, mode,
2863                                                XEXP (XEXP (x, 0), 1),
2864                                                mode)) != 0)
2865         {
2866           SUBST (XEXP (XEXP (x, 0), 1), temp);
2867           return XEXP (x, 0);
2868         }
2869               
2870       /* (not (ashift 1 X)) is (rotate ~1 X).  We used to do this for operands
2871          other than 1, but that is not valid.  We could do a similar
2872          simplification for (not (lshiftrt C X)) where C is just the sign bit,
2873          but this doesn't seem common enough to bother with.  */
2874       if (GET_CODE (XEXP (x, 0)) == ASHIFT
2875           && XEXP (XEXP (x, 0), 0) == const1_rtx)
2876         {
2877           x = gen_rtx (ROTATE, mode, gen_unary (NOT, mode, const1_rtx),
2878                        XEXP (XEXP (x, 0), 1));
2879           goto restart;
2880         }
2881                                             
2882       if (GET_CODE (XEXP (x, 0)) == SUBREG
2883           && subreg_lowpart_p (XEXP (x, 0))
2884           && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
2885               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
2886           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
2887           && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
2888         {
2889           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
2890
2891           x = gen_rtx (ROTATE, inner_mode,
2892                        gen_unary (NOT, inner_mode, const1_rtx),
2893                        XEXP (SUBREG_REG (XEXP (x, 0)), 1));
2894           x = gen_lowpart_for_combine (mode, x);
2895           goto restart;
2896         }
2897                                             
2898 #if STORE_FLAG_VALUE == -1
2899       /* (not (comparison foo bar)) can be done by reversing the comparison
2900          code if valid.  */
2901       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
2902           && reversible_comparison_p (XEXP (x, 0)))
2903         return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
2904                                 mode, XEXP (XEXP (x, 0), 0),
2905                                 XEXP (XEXP (x, 0), 1));
2906 #endif
2907
2908       /* Apply De Morgan's laws to reduce number of patterns for machines
2909          with negating logical insns (and-not, nand, etc.).  If result has
2910          only one NOT, put it first, since that is how the patterns are
2911          coded.  */
2912
2913       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
2914         {
2915          rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
2916
2917          if (GET_CODE (in1) == NOT)
2918            in1 = XEXP (in1, 0);
2919          else
2920            in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1);
2921
2922          if (GET_CODE (in2) == NOT)
2923            in2 = XEXP (in2, 0);
2924          else if (GET_CODE (in2) == CONST_INT
2925                   && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
2926            in2 = GEN_INT (GET_MODE_MASK (mode) & ~ INTVAL (in2));
2927          else
2928            in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2);
2929
2930          if (GET_CODE (in2) == NOT)
2931            {
2932              rtx tem = in2;
2933              in2 = in1; in1 = tem;
2934            }
2935
2936          x = gen_rtx_combine (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
2937                               mode, in1, in2);
2938          goto restart;
2939        } 
2940       break;
2941
2942     case NEG:
2943       /* (neg (plus X 1)) can become (not X).  */
2944       if (GET_CODE (XEXP (x, 0)) == PLUS
2945           && XEXP (XEXP (x, 0), 1) == const1_rtx)
2946         {
2947           x = gen_rtx_combine (NOT, mode, XEXP (XEXP (x, 0), 0));
2948           goto restart;
2949         }
2950
2951       /* Similarly, (neg (not X)) is (plus X 1).  */
2952       if (GET_CODE (XEXP (x, 0)) == NOT)
2953         {
2954           x = gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), const1_rtx);
2955           goto restart;
2956         }
2957
2958       /* (neg (minus X Y)) can become (minus Y X).  */
2959       if (GET_CODE (XEXP (x, 0)) == MINUS
2960           && (GET_MODE_CLASS (mode) != MODE_FLOAT
2961               /* x-y != -(y-x) with IEEE floating point. */
2962               || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT))
2963         {
2964           x = gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1),
2965                           XEXP (XEXP (x, 0), 0));
2966           goto restart;
2967         }
2968
2969       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */
2970       if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
2971           && significant_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
2972         {
2973           x = gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
2974           goto restart;
2975         }
2976
2977       /* NEG commutes with ASHIFT since it is multiplication.  Only do this
2978          if we can then eliminate the NEG (e.g.,
2979          if the operand is a constant).  */
2980
2981       if (GET_CODE (XEXP (x, 0)) == ASHIFT)
2982         {
2983           temp = simplify_unary_operation (NEG, mode,
2984                                            XEXP (XEXP (x, 0), 0), mode);
2985           if (temp)
2986             {
2987               SUBST (XEXP (XEXP (x, 0), 0), temp);
2988               return XEXP (x, 0);
2989             }
2990         }
2991
2992       temp = expand_compound_operation (XEXP (x, 0));
2993
2994       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
2995          replaced by (lshiftrt X C).  This will convert
2996          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
2997
2998       if (GET_CODE (temp) == ASHIFTRT
2999           && GET_CODE (XEXP (temp, 1)) == CONST_INT
3000           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
3001         {
3002           x = simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
3003                                     INTVAL (XEXP (temp, 1)));
3004           goto restart;
3005         }
3006
3007       /* If X has only a single bit significant, say, bit I, convert
3008          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
3009          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
3010          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
3011          or a SUBREG of one since we'd be making the expression more
3012          complex if it was just a register.  */
3013
3014       if (GET_CODE (temp) != REG
3015           && ! (GET_CODE (temp) == SUBREG
3016                 && GET_CODE (SUBREG_REG (temp)) == REG)
3017           && (i = exact_log2 (significant_bits (temp, mode))) >= 0)
3018         {
3019           rtx temp1 = simplify_shift_const
3020             (NULL_RTX, ASHIFTRT, mode,
3021              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
3022                                    GET_MODE_BITSIZE (mode) - 1 - i),
3023              GET_MODE_BITSIZE (mode) - 1 - i);
3024
3025           /* If all we did was surround TEMP with the two shifts, we
3026              haven't improved anything, so don't use it.  Otherwise,
3027              we are better off with TEMP1.  */
3028           if (GET_CODE (temp1) != ASHIFTRT
3029               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
3030               || XEXP (XEXP (temp1, 0), 0) != temp)
3031             {
3032               x = temp1;
3033               goto restart;
3034             }
3035         }
3036       break;
3037
3038     case FLOAT_TRUNCATE:
3039       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
3040       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
3041           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
3042         return XEXP (XEXP (x, 0), 0);
3043       break;  
3044
3045 #ifdef HAVE_cc0
3046     case COMPARE:
3047       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
3048          using cc0, in which case we want to leave it as a COMPARE
3049          so we can distinguish it from a register-register-copy.  */
3050       if (XEXP (x, 1) == const0_rtx)
3051         return XEXP (x, 0);
3052
3053       /* In IEEE floating point, x-0 is not the same as x.  */
3054       if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3055            || GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_INT)
3056           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
3057         return XEXP (x, 0);
3058       break;
3059 #endif
3060
3061     case CONST:
3062       /* (const (const X)) can become (const X).  Do it this way rather than
3063          returning the inner CONST since CONST can be shared with a
3064          REG_EQUAL note.  */
3065       if (GET_CODE (XEXP (x, 0)) == CONST)
3066         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3067       break;
3068
3069 #ifdef HAVE_lo_sum
3070     case LO_SUM:
3071       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
3072          can add in an offset.  find_split_point will split this address up
3073          again if it doesn't match.  */
3074       if (GET_CODE (XEXP (x, 0)) == HIGH
3075           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
3076         return XEXP (x, 1);
3077       break;
3078 #endif
3079
3080     case PLUS:
3081       /* If we have (plus (plus (A const) B)), associate it so that CONST is
3082          outermost.  That's because that's the way indexed addresses are
3083          supposed to appear.  This code used to check many more cases, but
3084          they are now checked elsewhere.  */
3085       if (GET_CODE (XEXP (x, 0)) == PLUS
3086           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
3087         return gen_binary (PLUS, mode,
3088                            gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
3089                                        XEXP (x, 1)),
3090                            XEXP (XEXP (x, 0), 1));
3091
3092       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
3093          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
3094          bit-field and can be replaced by either a sign_extend or a
3095          sign_extract.  The `and' may be a zero_extend.  */
3096       if (GET_CODE (XEXP (x, 0)) == XOR
3097           && GET_CODE (XEXP (x, 1)) == CONST_INT
3098           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3099           && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1))
3100           && (i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
3101           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3102           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
3103                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3104                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
3105                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
3106               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
3107                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
3108                       == i + 1))))
3109         {
3110           x = simplify_shift_const
3111             (NULL_RTX, ASHIFTRT, mode,
3112              simplify_shift_const (NULL_RTX, ASHIFT, mode,
3113                                    XEXP (XEXP (XEXP (x, 0), 0), 0),
3114                                    GET_MODE_BITSIZE (mode) - (i + 1)),
3115              GET_MODE_BITSIZE (mode) - (i + 1));
3116           goto restart;
3117         }
3118
3119       /* If only the low-order bit of X is significant, (plus x -1)
3120          can become (ashiftrt (ashift (xor x 1) C) C) where C is
3121          the bitsize of the mode - 1.  This allows simplification of
3122          "a = (b & 8) == 0;"  */
3123       if (XEXP (x, 1) == constm1_rtx
3124           && GET_CODE (XEXP (x, 0)) != REG
3125           && ! (GET_CODE (XEXP (x,0)) == SUBREG
3126                 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
3127           && significant_bits (XEXP (x, 0), mode) == 1)
3128         {
3129           x = simplify_shift_const
3130             (NULL_RTX, ASHIFTRT, mode,
3131              simplify_shift_const (NULL_RTX, ASHIFT, mode,
3132                                    gen_rtx_combine (XOR, mode,
3133                                                     XEXP (x, 0), const1_rtx),
3134                                    GET_MODE_BITSIZE (mode) - 1),
3135              GET_MODE_BITSIZE (mode) - 1);
3136           goto restart;
3137         }
3138
3139       /* If we are adding two things that have no bits in common, convert
3140          the addition into an IOR.  This will often be further simplified,
3141          for example in cases like ((a & 1) + (a & 2)), which can
3142          become a & 3.  */
3143
3144       if ((significant_bits (XEXP (x, 0), mode)
3145            & significant_bits (XEXP (x, 1), mode)) == 0)
3146         {
3147           x = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
3148           goto restart;
3149         }
3150       break;
3151
3152     case MINUS:
3153       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
3154          (and <foo> (const_int pow2-1))  */
3155       if (GET_CODE (XEXP (x, 1)) == AND
3156           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
3157           && exact_log2 (- INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
3158           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
3159         {
3160           x = simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
3161                                       - INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
3162           goto restart;
3163         }
3164       break;
3165
3166     case MULT:
3167       /* If we have (mult (plus A B) C), apply the distributive law and then
3168          the inverse distributive law to see if things simplify.  This
3169          occurs mostly in addresses, often when unrolling loops.  */
3170
3171       if (GET_CODE (XEXP (x, 0)) == PLUS)
3172         {
3173           x = apply_distributive_law
3174             (gen_binary (PLUS, mode,
3175                          gen_binary (MULT, mode,
3176                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
3177                          gen_binary (MULT, mode,
3178                                      XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
3179
3180           if (GET_CODE (x) != MULT)
3181             goto restart;
3182         }
3183
3184       /* If this is multiplication by a power of two and its first operand is
3185          a shift, treat the multiply as a shift to allow the shifts to
3186          possibly combine.  */
3187       if (GET_CODE (XEXP (x, 1)) == CONST_INT
3188           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
3189           && (GET_CODE (XEXP (x, 0)) == ASHIFT
3190               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
3191               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
3192               || GET_CODE (XEXP (x, 0)) == ROTATE
3193               || GET_CODE (XEXP (x, 0)) == ROTATERT))
3194         {
3195           x = simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0), i);
3196           goto restart;
3197         }
3198
3199       /* Convert (mult (ashift (const_int 1) A) B) to (ashift B A).  */
3200       if (GET_CODE (XEXP (x, 0)) == ASHIFT
3201           && XEXP (XEXP (x, 0), 0) == const1_rtx)
3202         return gen_rtx_combine (ASHIFT, mode, XEXP (x, 1),
3203                                 XEXP (XEXP (x, 0), 1));
3204       break;
3205
3206     case UDIV:
3207       /* If this is a divide by a power of two, treat it as a shift if
3208          its first operand is a shift.  */
3209       if (GET_CODE (XEXP (x, 1)) == CONST_INT
3210           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
3211           && (GET_CODE (XEXP (x, 0)) == ASHIFT
3212               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
3213               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
3214               || GET_CODE (XEXP (x, 0)) == ROTATE
3215               || GET_CODE (XEXP (x, 0)) == ROTATERT))
3216         {
3217           x = simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
3218           goto restart;
3219         }
3220       break;
3221
3222     case EQ:  case NE:
3223     case GT:  case GTU:  case GE:  case GEU:
3224     case LT:  case LTU:  case LE:  case LEU:
3225       /* If the first operand is a condition code, we can't do anything
3226          with it.  */
3227       if (GET_CODE (XEXP (x, 0)) == COMPARE
3228           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
3229 #ifdef HAVE_cc0
3230               && XEXP (x, 0) != cc0_rtx
3231 #endif
3232                ))
3233         {
3234           rtx op0 = XEXP (x, 0);
3235           rtx op1 = XEXP (x, 1);
3236           enum rtx_code new_code;
3237
3238           if (GET_CODE (op0) == COMPARE)
3239             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
3240
3241           /* Simplify our comparison, if possible.  */
3242           new_code = simplify_comparison (code, &op0, &op1);
3243
3244 #if STORE_FLAG_VALUE == 1
3245           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
3246              if only the low-order bit is significant in X (such as when
3247              X is a ZERO_EXTRACT of one bit.  Similarly, we can convert
3248              EQ to (xor X 1).  */
3249           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
3250               && op1 == const0_rtx
3251               && significant_bits (op0, GET_MODE (op0)) == 1)
3252             return gen_lowpart_for_combine (mode, op0);
3253           else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
3254                    && op1 == const0_rtx
3255                    && significant_bits (op0, GET_MODE (op0)) == 1)
3256             return gen_rtx_combine (XOR, mode,
3257                                     gen_lowpart_for_combine (mode, op0),
3258                                     const1_rtx);
3259 #endif
3260
3261 #if STORE_FLAG_VALUE == -1
3262           /* If STORE_FLAG_VALUE is -1, we can convert (ne x 0)
3263              to (neg x) if only the low-order bit of X is significant.
3264              This converts (ne (zero_extract X 1 Y) 0) to
3265              (sign_extract X 1 Y).  */
3266           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
3267               && op1 == const0_rtx
3268               && significant_bits (op0, GET_MODE (op0)) == 1)
3269             {
3270               x = gen_rtx_combine (NEG, mode,
3271                                    gen_lowpart_for_combine (mode, op0));
3272               goto restart;
3273             }
3274 #endif
3275
3276           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
3277              one significant bit, we can convert (ne x 0) to (ashift x c)
3278              where C puts the bit in the sign bit.  Remove any AND with
3279              STORE_FLAG_VALUE when we are done, since we are only going to
3280              test the sign bit.  */
3281           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
3282               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3283               && (STORE_FLAG_VALUE
3284                   == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
3285               && op1 == const0_rtx
3286               && mode == GET_MODE (op0)
3287               && (i = exact_log2 (significant_bits (op0, GET_MODE (op0)))) >= 0)
3288             {
3289               x = simplify_shift_const (NULL_RTX, ASHIFT, mode, op0,
3290                                         GET_MODE_BITSIZE (mode) - 1 - i);
3291               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
3292                 return XEXP (x, 0);
3293               else
3294                 return x;
3295             }
3296
3297           /* If the code changed, return a whole new comparison.  */
3298           if (new_code != code)
3299             return gen_rtx_combine (new_code, mode, op0, op1);
3300
3301           /* Otherwise, keep this operation, but maybe change its operands.  
3302              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
3303           SUBST (XEXP (x, 0), op0);
3304           SUBST (XEXP (x, 1), op1);
3305         }
3306       break;
3307           
3308     case IF_THEN_ELSE:
3309       /* If we are testing a register for equality see if that register is
3310          used in one of the arms.  If so, and we know something about its
3311          value in that arm, try to simplify it.  */
3312
3313       if ((GET_CODE (XEXP (x, 0)) == EQ || GET_CODE (XEXP (x, 0)) == NE)
3314           && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG)
3315         {
3316           /* Get the value being compared and the value it has on the equal
3317              branch.  */
3318           HOST_WIDE_INT sig;
3319           rtx from = XEXP (XEXP (x, 0), 0);
3320           rtx val_if_eq = XEXP (XEXP (x, 0), 1);
3321           rtx val_if_ne = from;
3322           int is_eq = (GET_CODE (XEXP (x, 0)) == EQ);
3323
3324           /* If we are comparing against zero and the expressiond being tested
3325              has only a single significant bit, that is it's value when it is 
3326              not equal to zero.  Simplilarly if it is known to be -1 or 0.  */
3327
3328           if (val_if_eq == const0_rtx
3329               && exact_log2 (sig = significant_bits (from,
3330                                                      GET_MODE (from))) >= 0)
3331             val_if_ne = GEN_INT (sig);
3332           else if (val_if_eq == const0_rtx
3333                    && (num_sign_bit_copies (from, GET_MODE (from))
3334                        == GET_MODE_BITSIZE (GET_MODE (from))))
3335             val_if_ne = constm1_rtx;
3336
3337           /* Now simplify an arm if we know the value of the register
3338              in the branch and it is used in the arm.  Be carefull due to
3339              the potential of locally-shared RTL.  */
3340
3341           if ((is_eq || val_if_ne != from)
3342               && reg_mentioned_p (from, XEXP (x, 1)))
3343             SUBST (XEXP (x, 1), subst (copy_rtx (XEXP (x, 1)), from,
3344                                        is_eq ? val_if_eq : val_if_ne, 0));
3345
3346           if ((! is_eq || val_if_ne != from)
3347               && reg_mentioned_p (from, XEXP (x, 2)))
3348             SUBST (XEXP (x, 2), subst (XEXP (x, 2), from,
3349                                        is_eq ? val_if_ne : val_if_eq, 0));
3350         }
3351       
3352       /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
3353          reversed, do so to avoid needing two sets of patterns for
3354          subtract-and-branch insns.  Similarly if we have a constant in that
3355          position.  */
3356       if ((XEXP (x, 1) == pc_rtx || GET_CODE (XEXP (x, 1)) == CONST_INT)
3357           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3358           && reversible_comparison_p (XEXP (x, 0)))
3359         {
3360           SUBST (XEXP (x, 0),
3361                  gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))),
3362                              GET_MODE (XEXP (x, 0)),
3363                              XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 0), 1)));
3364
3365           temp = XEXP (x, 1);
3366           SUBST (XEXP (x, 1), XEXP (x, 2));
3367           SUBST (XEXP (x, 2), temp);
3368         }
3369       break;
3370           
3371     case ZERO_EXTRACT:
3372     case SIGN_EXTRACT:
3373     case ZERO_EXTEND:
3374     case SIGN_EXTEND:
3375       /* If we are processing SET_DEST, we are done. */
3376       if (in_dest)
3377         return x;
3378
3379       x = expand_compound_operation (x);
3380       if (GET_CODE (x) != code)
3381         goto restart;
3382       break;
3383
3384     case SET:
3385       /* (set (pc) (return)) gets written as (return).  */
3386       if (GET_CODE (SET_DEST (x)) == PC && GET_CODE (SET_SRC (x)) == RETURN)
3387         return SET_SRC (x);
3388
3389       /* Convert this into a field assignment operation, if possible.  */
3390       x = make_field_assignment (x);
3391
3392       /* If we are setting CC0 or if the source is a COMPARE, look for the
3393          use of the comparison result and try to simplify it unless we already
3394          have used undobuf.other_insn.  */
3395       if ((GET_CODE (SET_SRC (x)) == COMPARE
3396 #ifdef HAVE_cc0
3397            || SET_DEST (x) == cc0_rtx
3398 #endif
3399            )
3400           && (cc_use = find_single_use (SET_DEST (x), subst_insn,
3401                                         &other_insn)) != 0
3402           && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
3403           && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
3404           && XEXP (*cc_use, 0) == SET_DEST (x))
3405         {
3406           enum rtx_code old_code = GET_CODE (*cc_use);
3407           enum rtx_code new_code;
3408           rtx op0, op1;
3409           int other_changed = 0;
3410           enum machine_mode compare_mode = GET_MODE (SET_DEST (x));
3411
3412           if (GET_CODE (SET_SRC (x)) == COMPARE)
3413             op0 = XEXP (SET_SRC (x), 0), op1 = XEXP (SET_SRC (x), 1);
3414           else
3415             op0 = SET_SRC (x), op1 = const0_rtx;
3416
3417           /* Simplify our comparison, if possible.  */
3418           new_code = simplify_comparison (old_code, &op0, &op1);
3419
3420 #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES)
3421           /* If this machine has CC modes other than CCmode, check to see
3422              if we need to use a different CC mode here.  */
3423           compare_mode = SELECT_CC_MODE (new_code, op0, op1);
3424
3425           /* If the mode changed, we have to change SET_DEST, the mode
3426              in the compare, and the mode in the place SET_DEST is used.
3427              If SET_DEST is a hard register, just build new versions with
3428              the proper mode.  If it is a pseudo, we lose unless it is only
3429              time we set the pseudo, in which case we can safely change
3430              its mode.  */
3431           if (compare_mode != GET_MODE (SET_DEST (x)))
3432             {
3433               int regno = REGNO (SET_DEST (x));
3434               rtx new_dest = gen_rtx (REG, compare_mode, regno);
3435
3436               if (regno < FIRST_PSEUDO_REGISTER
3437                   || (reg_n_sets[regno] == 1
3438                       && ! REG_USERVAR_P (SET_DEST (x))))
3439                 {
3440                   if (regno >= FIRST_PSEUDO_REGISTER)
3441                     SUBST (regno_reg_rtx[regno], new_dest);
3442
3443                   SUBST (SET_DEST (x), new_dest);
3444                   SUBST (XEXP (*cc_use, 0), new_dest);
3445                   other_changed = 1;
3446                 }
3447             }
3448 #endif
3449
3450           /* If the code changed, we have to build a new comparison
3451              in undobuf.other_insn.  */
3452           if (new_code != old_code)
3453             {
3454               unsigned mask;
3455
3456               SUBST (*cc_use, gen_rtx_combine (new_code, GET_MODE (*cc_use),
3457                                                SET_DEST (x), const0_rtx));
3458
3459               /* If the only change we made was to change an EQ into an
3460                  NE or vice versa, OP0 has only one significant bit,
3461                  and OP1 is zero, check if changing the user of the condition
3462                  code will produce a valid insn.  If it won't, we can keep
3463                  the original code in that insn by surrounding our operation
3464                  with an XOR.  */
3465
3466               if (((old_code == NE && new_code == EQ)
3467                    || (old_code == EQ && new_code == NE))
3468                   && ! other_changed && op1 == const0_rtx
3469                   && (GET_MODE_BITSIZE (GET_MODE (op0))
3470                       <= HOST_BITS_PER_WIDE_INT)
3471                   && (exact_log2 (mask = significant_bits (op0,
3472                                                            GET_MODE (op0)))
3473                       >= 0))
3474                 {
3475                   rtx pat = PATTERN (other_insn), note = 0;
3476
3477                   if ((recog_for_combine (&pat, undobuf.other_insn, &note) < 0
3478                        && ! check_asm_operands (pat)))
3479                     {
3480                       PUT_CODE (*cc_use, old_code);
3481                       other_insn = 0;
3482
3483                       op0 = gen_binary (XOR, GET_MODE (op0), op0,
3484                                         GEN_INT (mask));
3485                     }
3486                 }
3487
3488               other_changed = 1;
3489             }
3490
3491           if (other_changed)
3492             undobuf.other_insn = other_insn;
3493
3494 #ifdef HAVE_cc0
3495           /* If we are now comparing against zero, change our source if
3496              needed.  If we do not use cc0, we always have a COMPARE.  */
3497           if (op1 == const0_rtx && SET_DEST (x) == cc0_rtx)
3498             SUBST (SET_SRC (x), op0);
3499           else
3500 #endif
3501
3502           /* Otherwise, if we didn't previously have a COMPARE in the
3503              correct mode, we need one.  */
3504           if (GET_CODE (SET_SRC (x)) != COMPARE
3505               || GET_MODE (SET_SRC (x)) != compare_mode)
3506             SUBST (SET_SRC (x), gen_rtx_combine (COMPARE, compare_mode,
3507                                                  op0, op1));
3508           else
3509             {
3510               /* Otherwise, update the COMPARE if needed.  */
3511               SUBST (XEXP (SET_SRC (x), 0), op0);
3512               SUBST (XEXP (SET_SRC (x), 1), op1);
3513             }
3514         }
3515       else
3516         {
3517           /* Get SET_SRC in a form where we have placed back any
3518              compound expressions.  Then do the checks below.  */
3519           temp = make_compound_operation (SET_SRC (x), SET);
3520           SUBST (SET_SRC (x), temp);
3521         }
3522
3523       /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some
3524          operation, and X being a REG or (subreg (reg)), we may be able to
3525          convert this to (set (subreg:m2 x) (op)).
3526
3527          We can always do this if M1 is narrower than M2 because that
3528          means that we only care about the low bits of the result.
3529
3530          However, on most machines (those with BYTE_LOADS_ZERO_EXTEND
3531          not defined), we cannot perform a narrower operation that
3532          requested since the high-order bits will be undefined.  On
3533          machine where BYTE_LOADS_ZERO_EXTEND are defined, however, this
3534          transformation is safe as long as M1 and M2 have the same number
3535          of words.  */
3536  
3537       if (GET_CODE (SET_SRC (x)) == SUBREG
3538           && subreg_lowpart_p (SET_SRC (x))
3539           && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) != 'o'
3540           && (((GET_MODE_SIZE (GET_MODE (SET_SRC (x))) + (UNITS_PER_WORD - 1))
3541                / UNITS_PER_WORD)
3542               == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x))))
3543                    + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
3544 #ifndef BYTE_LOADS_ZERO_EXTEND
3545           && (GET_MODE_SIZE (GET_MODE (SET_SRC (x)))
3546               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x)))))
3547 #endif
3548           && (GET_CODE (SET_DEST (x)) == REG
3549               || (GET_CODE (SET_DEST (x)) == SUBREG
3550                   && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG)))
3551         {
3552           SUBST (SET_DEST (x),
3553                  gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_SRC (x))),
3554                                           SET_DEST (x)));
3555           SUBST (SET_SRC (x), SUBREG_REG (SET_SRC (x)));
3556         }
3557
3558 #ifdef BYTE_LOADS_ZERO_EXTEND
3559       /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with
3560          M wider than N, this would require a paradoxical subreg.
3561          Replace the subreg with a zero_extend to avoid the reload that
3562          would otherwise be required. */
3563       if (GET_CODE (SET_SRC (x)) == SUBREG
3564           && subreg_lowpart_p (SET_SRC (x))
3565           && SUBREG_WORD (SET_SRC (x)) == 0
3566           && (GET_MODE_SIZE (GET_MODE (SET_SRC (x)))
3567               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x)))))
3568           && GET_CODE (SUBREG_REG (SET_SRC (x))) == MEM)
3569         SUBST (SET_SRC (x), gen_rtx_combine (ZERO_EXTEND,
3570                                              GET_MODE (SET_SRC (x)),
3571                                              XEXP (SET_SRC (x), 0)));
3572 #endif
3573
3574       break;
3575
3576     case AND:
3577       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
3578         {
3579           x = simplify_and_const_int (x, mode, XEXP (x, 0),
3580                                       INTVAL (XEXP (x, 1)));
3581
3582           /* If we have (ior (and (X C1) C2)) and the next restart would be
3583              the last, simplify this by making C1 as small as possible
3584              and then exit. */
3585           if (n_restarts >= 3 && GET_CODE (x) == IOR
3586               && GET_CODE (XEXP (x, 0)) == AND
3587               && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3588               && GET_CODE (XEXP (x, 1)) == CONST_INT)
3589             {
3590               temp = gen_binary (AND, mode, XEXP (XEXP (x, 0), 0),
3591                                  GEN_INT (INTVAL (XEXP (XEXP (x, 0), 1))
3592                                           & ~ INTVAL (XEXP (x, 1))));
3593               return gen_binary (IOR, mode, temp, XEXP (x, 1));
3594             }
3595
3596           if (GET_CODE (x) != AND)
3597             goto restart;
3598         }
3599
3600       /* Convert (A | B) & A to A.  */
3601       if (GET_CODE (XEXP (x, 0)) == IOR
3602           && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
3603               || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)))
3604           && ! side_effects_p (XEXP (XEXP (x, 0), 0))
3605           && ! side_effects_p (XEXP (XEXP (x, 0), 1)))
3606         return XEXP (x, 1);
3607
3608       /* Convert (A ^ B) & A to A & (~ B) since the latter is often a single
3609          insn (and may simplify more).  */
3610       else if (GET_CODE (XEXP (x, 0)) == XOR
3611           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
3612           && ! side_effects_p (XEXP (x, 1)))
3613         {
3614           x = gen_binary (AND, mode,
3615                           gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)),
3616                           XEXP (x, 1));
3617           goto restart;
3618         }
3619       else if (GET_CODE (XEXP (x, 0)) == XOR
3620                && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))
3621                && ! side_effects_p (XEXP (x, 1)))
3622         {
3623           x = gen_binary (AND, mode,
3624                           gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)),
3625                           XEXP (x, 1));
3626           goto restart;
3627         }
3628
3629       /* Similarly for (~ (A ^ B)) & A.  */
3630       else if (GET_CODE (XEXP (x, 0)) == NOT
3631                && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR
3632                && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 0), XEXP (x, 1))
3633                && ! side_effects_p (XEXP (x, 1)))
3634         {
3635           x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 1),
3636                           XEXP (x, 1));
3637           goto restart;
3638         }
3639       else if (GET_CODE (XEXP (x, 0)) == NOT
3640                && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR
3641                && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 1), XEXP (x, 1))
3642                && ! side_effects_p (XEXP (x, 1)))
3643         {
3644           x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 0),
3645                           XEXP (x, 1));
3646           goto restart;
3647         }
3648
3649 #ifdef HAVE_conditional_move
3650
3651       /* If we have (and A B) with A not an object but that is known to
3652          be -1 or 0, this is equivalent to the expression
3653          (if_then_else (ne A (const_int 0)) B (const_int 0))
3654          We make this conversion because it may allow further
3655          simplifications and then allow use of conditional move insns.  */
3656
3657       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3658           && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3659                 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o')
3660           && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
3661               == GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
3662         {
3663           rtx op0 = XEXP (x, 0);
3664           rtx op1 = const0_rtx;
3665           enum rtx_code comp_code
3666             = simplify_comparison (NE, &op0, &op1);
3667
3668           x =  gen_rtx_combine (IF_THEN_ELSE, mode,
3669                                 gen_binary (comp_code, VOIDmode, op0, op1),
3670                                 XEXP (x, 1), const0_rtx);
3671           goto restart;
3672         }
3673 #endif
3674
3675       /* In the following group of tests (and those in case IOR below),
3676          we start with some combination of logical operations and apply
3677          the distributive law followed by the inverse distributive law.
3678          Most of the time, this results in no change.  However, if some of
3679          the operands are the same or inverses of each other, simplifications
3680          will result.
3681
3682          For example, (and (ior A B) (not B)) can occur as the result of
3683          expanding a bit field assignment.  When we apply the distributive
3684          law to this, we get (ior (and (A (not B))) (and (B (not B)))),
3685          which then simplifies to (and (A (not B))).  */
3686
3687       /* If we have (and (ior A B) C), apply the distributive law and then
3688          the inverse distributive law to see if things simplify.  */
3689
3690       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == XOR)
3691         {
3692           x = apply_distributive_law
3693             (gen_binary (GET_CODE (XEXP (x, 0)), mode,
3694                          gen_binary (AND, mode,
3695                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
3696                          gen_binary (AND, mode,
3697                                      XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
3698           if (GET_CODE (x) != AND)
3699             goto restart;
3700         }
3701
3702       if (GET_CODE (XEXP (x, 1)) == IOR || GET_CODE (XEXP (x, 1)) == XOR)
3703         {
3704           x = apply_distributive_law
3705             (gen_binary (GET_CODE (XEXP (x, 1)), mode,
3706                          gen_binary (AND, mode,
3707                                      XEXP (XEXP (x, 1), 0), XEXP (x, 0)),
3708                          gen_binary (AND, mode,
3709                                      XEXP (XEXP (x, 1), 1), XEXP (x, 0))));
3710           if (GET_CODE (x) != AND)
3711             goto restart;
3712         }
3713
3714       /* Similarly, taking advantage of the fact that
3715          (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
3716
3717       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == XOR)
3718         {
3719           x = apply_distributive_law
3720             (gen_binary (XOR, mode,
3721                          gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0),
3722                                      XEXP (XEXP (x, 1), 0)),
3723                          gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0),
3724                                      XEXP (XEXP (x, 1), 1))));
3725           if (GET_CODE (x) != AND)
3726             goto restart;
3727         }
3728                                                             
3729       else if (GET_CODE (XEXP (x, 1)) == NOT && GET_CODE (XEXP (x, 0)) == XOR)
3730         {
3731           x = apply_distributive_law
3732             (gen_binary (XOR, mode,
3733                          gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0),
3734                                      XEXP (XEXP (x, 0), 0)),
3735                          gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0),
3736                                      XEXP (XEXP (x, 0), 1))));
3737           if (GET_CODE (x) != AND)
3738             goto restart;
3739         }
3740       break;
3741
3742     case IOR:
3743       /* (ior A C) is C if all significant bits of A are on in C.  */
3744       if (GET_CODE (XEXP (x, 1)) == CONST_INT
3745           && (significant_bits (XEXP (x, 0), mode)
3746               & ~ INTVAL (XEXP (x, 1))) == 0)
3747         return XEXP (x, 1);
3748
3749       /* Convert (A & B) | A to A.  */
3750       if (GET_CODE (XEXP (x, 0)) == AND
3751           && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
3752               || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)))
3753           && ! side_effects_p (XEXP (XEXP (x, 0), 0))
3754           && ! side_effects_p (XEXP (XEXP (x, 0), 1)))
3755         return XEXP (x, 1);
3756
3757       /* If we have (ior (and A B) C), apply the distributive law and then
3758          the inverse distributive law to see if things simplify.  */
3759
3760       if (GET_CODE (XEXP (x, 0)) == AND)
3761         {
3762           x = apply_distributive_law
3763             (gen_binary (AND, mode,
3764                          gen_binary (IOR, mode,
3765                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
3766                          gen_binary (IOR, mode,
3767                                      XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
3768
3769           if (GET_CODE (x) != IOR)
3770             goto restart;
3771         }
3772
3773       if (GET_CODE (XEXP (x, 1)) == AND)
3774         {
3775           x = apply_distributive_law
3776             (gen_binary (AND, mode,
3777                          gen_binary (IOR, mode,
3778                                      XEXP (XEXP (x, 1), 0), XEXP (x, 0)),
3779                          gen_binary (IOR, mode,
3780                                      XEXP (XEXP (x, 1), 1), XEXP (x, 0))));
3781
3782           if (GET_CODE (x) != IOR)
3783             goto restart;
3784         }
3785
3786       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
3787          mode size to (rotate A CX).  */
3788
3789       if (((GET_CODE (XEXP (x, 0)) == ASHIFT
3790             && GET_CODE (XEXP (x, 1)) == LSHIFTRT)
3791            || (GET_CODE (XEXP (x, 1)) == ASHIFT
3792                && GET_CODE (XEXP (x, 0)) == LSHIFTRT))
3793           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 1), 0))
3794           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3795           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
3796           && (INTVAL (XEXP (XEXP (x, 0), 1)) + INTVAL (XEXP (XEXP (x, 1), 1))
3797               == GET_MODE_BITSIZE (mode)))
3798         {
3799           rtx shift_count;
3800
3801           if (GET_CODE (XEXP (x, 0)) == ASHIFT)
3802             shift_count = XEXP (XEXP (x, 0), 1);
3803           else
3804             shift_count = XEXP (XEXP (x, 1), 1);
3805           x = gen_rtx (ROTATE, mode, XEXP (XEXP (x, 0), 0), shift_count);
3806           goto restart;
3807         }
3808       break;
3809
3810     case XOR:
3811       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
3812          Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
3813          (NOT y).  */
3814       {
3815         int num_negated = 0;
3816         rtx in1 = XEXP (x, 0), in2 = XEXP (x, 1);
3817
3818         if (GET_CODE (in1) == NOT)
3819           num_negated++, in1 = XEXP (in1, 0);
3820         if (GET_CODE (in2) == NOT)
3821           num_negated++, in2 = XEXP (in2, 0);
3822
3823         if (num_negated == 2)
3824           {
3825             SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3826             SUBST (XEXP (x, 1), XEXP (XEXP (x, 1), 0));
3827           }
3828         else if (num_negated == 1)
3829           {
3830             x =  gen_unary (NOT, mode,
3831                             gen_binary (XOR, mode, in1, in2));
3832             goto restart;
3833           }
3834       }
3835
3836       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
3837          correspond to a machine insn or result in further simplifications
3838          if B is a constant.  */
3839
3840       if (GET_CODE (XEXP (x, 0)) == AND
3841           && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))
3842           && ! side_effects_p (XEXP (x, 1)))
3843         {
3844           x = gen_binary (AND, mode,
3845                           gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)),
3846                           XEXP (x, 1));
3847           goto restart;
3848         }
3849       else if (GET_CODE (XEXP (x, 0)) == AND
3850                && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))
3851                && ! side_effects_p (XEXP (x, 1)))
3852         {
3853           x = gen_binary (AND, mode,
3854                           gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)),
3855                           XEXP (x, 1));
3856           goto restart;
3857         }
3858
3859
3860 #if STORE_FLAG_VALUE == 1
3861       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
3862          comparison.  */
3863       if (XEXP (x, 1) == const1_rtx
3864           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3865           && reversible_comparison_p (XEXP (x, 0)))
3866         return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
3867                                 mode, XEXP (XEXP (x, 0), 0),
3868                                 XEXP (XEXP (x, 0), 1));
3869 #endif
3870
3871       /* (xor (comparison foo bar) (const_int sign-bit))
3872          when STORE_FLAG_VALUE is the sign bit.  */
3873       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3874           && (STORE_FLAG_VALUE
3875               == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
3876           && XEXP (x, 1) == const_true_rtx
3877           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3878           && reversible_comparison_p (XEXP (x, 0)))
3879         return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
3880                                 mode, XEXP (XEXP (x, 0), 0),
3881                                 XEXP (XEXP (x, 0), 1));
3882       break;
3883
3884     case ABS:
3885       /* (abs (neg <foo>)) -> (abs <foo>) */
3886       if (GET_CODE (XEXP (x, 0)) == NEG)
3887         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3888
3889       /* If operand is something known to be positive, ignore the ABS.  */
3890       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
3891           || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
3892                <= HOST_BITS_PER_WIDE_INT)
3893               && ((significant_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
3894                    & ((HOST_WIDE_INT) 1
3895                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
3896                   == 0)))
3897         return XEXP (x, 0);
3898
3899
3900       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
3901       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
3902         {
3903           x = gen_rtx_combine (NEG, mode, XEXP (x, 0));
3904           goto restart;
3905         }
3906       break;
3907
3908     case FFS:
3909       /* (ffs (*_extend <X>)) = (ffs <X>) */
3910       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
3911           || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
3912         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3913       break;
3914
3915     case FLOAT:
3916       /* (float (sign_extend <X>)) = (float <X>).  */
3917       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
3918         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3919       break;
3920
3921     case LSHIFT:
3922     case ASHIFT:
3923     case LSHIFTRT:
3924     case ASHIFTRT:
3925     case ROTATE:
3926     case ROTATERT:
3927       /* If this is a shift by a constant amount, simplify it.  */
3928       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
3929         {
3930           x = simplify_shift_const (x, code, mode, XEXP (x, 0), 
3931                                     INTVAL (XEXP (x, 1)));
3932           if (GET_CODE (x) != code)
3933             goto restart;
3934         }
3935
3936 #ifdef SHIFT_COUNT_TRUNCATED
3937       else if (GET_CODE (XEXP (x, 1)) != REG)
3938         SUBST (XEXP (x, 1),
3939                force_to_mode (XEXP (x, 1), GET_MODE (x),
3940                               exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))),
3941                               NULL_RTX));
3942 #endif
3943
3944       break;
3945     }
3946
3947   return x;
3948 }
3949 \f
3950 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
3951    operations" because they can be replaced with two more basic operations.
3952    ZERO_EXTEND is also considered "compound" because it can be replaced with
3953    an AND operation, which is simpler, though only one operation.
3954
3955    The function expand_compound_operation is called with an rtx expression
3956    and will convert it to the appropriate shifts and AND operations, 
3957    simplifying at each stage.
3958
3959    The function make_compound_operation is called to convert an expression
3960    consisting of shifts and ANDs into the equivalent compound expression.
3961    It is the inverse of this function, loosely speaking.  */
3962
3963 static rtx
3964 expand_compound_operation (x)
3965      rtx x;
3966 {
3967   int pos = 0, len;
3968   int unsignedp = 0;
3969   int modewidth;
3970   rtx tem;
3971
3972   switch (GET_CODE (x))
3973     {
3974     case ZERO_EXTEND:
3975       unsignedp = 1;
3976     case SIGN_EXTEND:
3977       /* We can't necessarily use a const_int for a multiword mode;
3978          it depends on implicitly extending the value.
3979          Since we don't know the right way to extend it,
3980          we can't tell whether the implicit way is right.
3981
3982          Even for a mode that is no wider than a const_int,
3983          we can't win, because we need to sign extend one of its bits through
3984          the rest of it, and we don't know which bit.  */
3985       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
3986         return x;
3987
3988       if (! FAKE_EXTEND_SAFE_P (GET_MODE (XEXP (x, 0)), XEXP (x, 0)))
3989         return x;
3990
3991       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
3992       /* If the inner object has VOIDmode (the only way this can happen
3993          is if it is a ASM_OPERANDS), we can't do anything since we don't
3994          know how much masking to do.  */
3995       if (len == 0)
3996         return x;
3997
3998       break;
3999
4000     case ZERO_EXTRACT:
4001       unsignedp = 1;
4002     case SIGN_EXTRACT:
4003       /* If the operand is a CLOBBER, just return it.  */
4004       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
4005         return XEXP (x, 0);
4006
4007       if (GET_CODE (XEXP (x, 1)) != CONST_INT
4008           || GET_CODE (XEXP (x, 2)) != CONST_INT
4009           || GET_MODE (XEXP (x, 0)) == VOIDmode)
4010         return x;
4011
4012       len = INTVAL (XEXP (x, 1));
4013       pos = INTVAL (XEXP (x, 2));
4014
4015       /* If this goes outside the object being extracted, replace the object
4016          with a (use (mem ...)) construct that only combine understands
4017          and is used only for this purpose.  */
4018       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
4019         SUBST (XEXP (x, 0), gen_rtx (USE, GET_MODE (x), XEXP (x, 0)));
4020
4021 #if BITS_BIG_ENDIAN
4022       pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
4023 #endif
4024       break;
4025
4026     default:
4027       return x;
4028     }
4029
4030   /* If we reach here, we want to return a pair of shifts.  The inner
4031      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
4032      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
4033      logical depending on the value of UNSIGNEDP.
4034
4035      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
4036      converted into an AND of a shift.
4037
4038      We must check for the case where the left shift would have a negative
4039      count.  This can happen in a case like (x >> 31) & 255 on machines
4040      that can't shift by a constant.  On those machines, we would first
4041      combine the shift with the AND to produce a variable-position 
4042      extraction.  Then the constant of 31 would be substituted in to produce
4043      a such a position.  */
4044
4045   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
4046   if (modewidth >= pos - len)
4047     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
4048                                 GET_MODE (x),
4049                                 simplify_shift_const (NULL_RTX, ASHIFT,
4050                                                       GET_MODE (x),
4051                                                       XEXP (x, 0),
4052                                                       modewidth - pos - len),
4053                                 modewidth - len);
4054
4055   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
4056     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
4057                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
4058                                                         GET_MODE (x),
4059                                                         XEXP (x, 0), pos),
4060                                   ((HOST_WIDE_INT) 1 << len) - 1);
4061   else
4062     /* Any other cases we can't handle.  */
4063     return x;
4064     
4065
4066   /* If we couldn't do this for some reason, return the original
4067      expression.  */
4068   if (GET_CODE (tem) == CLOBBER)
4069     return x;
4070
4071   return tem;
4072 }
4073 \f
4074 /* X is a SET which contains an assignment of one object into
4075    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
4076    or certain SUBREGS). If possible, convert it into a series of
4077    logical operations.
4078
4079    We half-heartedly support variable positions, but do not at all
4080    support variable lengths.  */
4081
4082 static rtx
4083 expand_field_assignment (x)
4084      rtx x;
4085 {
4086   rtx inner;
4087   rtx pos;                      /* Always counts from low bit. */
4088   int len;
4089   rtx mask;
4090   enum machine_mode compute_mode;
4091
4092   /* Loop until we find something we can't simplify.  */
4093   while (1)
4094     {
4095       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
4096           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
4097         {
4098           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
4099           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
4100           pos = const0_rtx;
4101         }
4102       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
4103                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
4104         {
4105           inner = XEXP (SET_DEST (x), 0);
4106           len = INTVAL (XEXP (SET_DEST (x), 1));
4107           pos = XEXP (SET_DEST (x), 2);
4108
4109           /* If the position is constant and spans the width of INNER,
4110              surround INNER  with a USE to indicate this.  */
4111           if (GET_CODE (pos) == CONST_INT
4112               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
4113             inner = gen_rtx (USE, GET_MODE (SET_DEST (x)), inner);
4114
4115 #if BITS_BIG_ENDIAN
4116           if (GET_CODE (pos) == CONST_INT)
4117             pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
4118                            - INTVAL (pos));
4119           else if (GET_CODE (pos) == MINUS
4120                    && GET_CODE (XEXP (pos, 1)) == CONST_INT
4121                    && (INTVAL (XEXP (pos, 1))
4122                        == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
4123             /* If position is ADJUST - X, new position is X.  */
4124             pos = XEXP (pos, 0);
4125           else
4126             pos = gen_binary (MINUS, GET_MODE (pos),
4127                               GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
4128                                        - len),
4129                               pos);
4130 #endif
4131         }
4132
4133       /* A SUBREG between two modes that occupy the same numbers of words
4134          can be done by moving the SUBREG to the source.  */
4135       else if (GET_CODE (SET_DEST (x)) == SUBREG
4136                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
4137                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
4138                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
4139                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
4140         {
4141           x = gen_rtx (SET, VOIDmode, SUBREG_REG (SET_DEST (x)),
4142                        gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_DEST (x))),
4143                                                 SET_SRC (x)));
4144           continue;
4145         }
4146       else
4147         break;
4148
4149       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
4150         inner = SUBREG_REG (inner);
4151
4152       compute_mode = GET_MODE (inner);
4153
4154       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
4155       if (len < HOST_BITS_PER_WIDE_INT)
4156         mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
4157       else
4158         break;
4159
4160       /* Now compute the equivalent expression.  Make a copy of INNER
4161          for the SET_DEST in case it is a MEM into which we will substitute;
4162          we don't want shared RTL in that case.  */
4163       x = gen_rtx (SET, VOIDmode, copy_rtx (inner),
4164                    gen_binary (IOR, compute_mode,
4165                                gen_binary (AND, compute_mode,
4166                                            gen_unary (NOT, compute_mode,
4167                                                       gen_binary (ASHIFT,
4168                                                                   compute_mode,
4169                                                                   mask, pos)),
4170                                            inner),
4171                                gen_binary (ASHIFT, compute_mode,
4172                                            gen_binary (AND, compute_mode,
4173                                                        gen_lowpart_for_combine
4174                                                        (compute_mode,
4175                                                         SET_SRC (x)),
4176                                                        mask),
4177                                            pos)));
4178     }
4179
4180   return x;
4181 }
4182 \f
4183 /* Return an RTX for a reference to LEN bits of INNER.  POS is the starting
4184    bit position (counted from the LSB) if >= 0; otherwise POS_RTX represents
4185    the starting bit position.
4186
4187    INNER may be a USE.  This will occur when we started with a bitfield
4188    that went outside the boundary of the object in memory, which is
4189    allowed on most machines.  To isolate this case, we produce a USE
4190    whose mode is wide enough and surround the MEM with it.  The only
4191    code that understands the USE is this routine.  If it is not removed,
4192    it will cause the resulting insn not to match.
4193
4194    UNSIGNEDP is non-zero for an unsigned reference and zero for a 
4195    signed reference.
4196
4197    IN_DEST is non-zero if this is a reference in the destination of a
4198    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If non-zero,
4199    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
4200    be used.
4201
4202    IN_COMPARE is non-zero if we are in a COMPARE.  This means that a
4203    ZERO_EXTRACT should be built even for bits starting at bit 0.
4204
4205    MODE is the desired mode of the result (if IN_DEST == 0).  */
4206
4207 static rtx
4208 make_extraction (mode, inner, pos, pos_rtx, len,
4209                  unsignedp, in_dest, in_compare)
4210      enum machine_mode mode;
4211      rtx inner;
4212      int pos;
4213      rtx pos_rtx;
4214      int len;
4215      int unsignedp;
4216      int in_dest, in_compare;
4217 {
4218   enum machine_mode is_mode = GET_MODE (inner);
4219   enum machine_mode inner_mode;
4220   enum machine_mode wanted_mem_mode = byte_mode;
4221   enum machine_mode pos_mode = word_mode;
4222   enum machine_mode extraction_mode = word_mode;
4223   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
4224   int spans_byte = 0;
4225   rtx new = 0;
4226
4227   /* Get some information about INNER and get the innermost object.  */
4228   if (GET_CODE (inner) == USE)
4229     /* We don't need to adjust the position because we set up the USE
4230        to pretend that it was a full-word object.  */
4231     spans_byte = 1, inner = XEXP (inner, 0);
4232   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
4233     inner = SUBREG_REG (inner);
4234
4235   inner_mode = GET_MODE (inner);
4236
4237   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
4238     pos = INTVAL (pos_rtx);
4239
4240   /* See if this can be done without an extraction.  We never can if the
4241      width of the field is not the same as that of some integer mode. For
4242      registers, we can only avoid the extraction if the position is at the
4243      low-order bit and this is either not in the destination or we have the
4244      appropriate STRICT_LOW_PART operation available.
4245
4246      For MEM, we can avoid an extract if the field starts on an appropriate
4247      boundary and we can change the mode of the memory reference.  However,
4248      we cannot directly access the MEM if we have a USE and the underlying
4249      MEM is not TMODE.  This combination means that MEM was being used in a
4250      context where bits outside its mode were being referenced; that is only
4251      valid in bit-field insns.  */
4252
4253   if (tmode != BLKmode
4254       && ! (spans_byte && inner_mode != tmode)
4255       && ((pos == 0 && GET_CODE (inner) != MEM
4256            && (! in_dest
4257                || (GET_CODE (inner) == REG
4258                    && (movstrict_optab->handlers[(int) tmode].insn_code
4259                        != CODE_FOR_nothing))))
4260           || (GET_CODE (inner) == MEM && pos >= 0
4261               && (pos
4262                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
4263                      : BITS_PER_UNIT)) == 0
4264               /* We can't do this if we are widening INNER_MODE (it
4265                  may not be aligned, for one thing).  */
4266               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
4267               && (inner_mode == tmode
4268                   || (! mode_dependent_address_p (XEXP (inner, 0))
4269                       && ! MEM_VOLATILE_P (inner))))))
4270     {
4271       int offset = pos / BITS_PER_UNIT;
4272           
4273       /* If INNER is a MEM, make a new MEM that encompasses just the desired
4274          field.  If the original and current mode are the same, we need not
4275          adjust the offset.  Otherwise, we do if bytes big endian.  
4276
4277          If INNER is not a MEM, get a piece consisting of the just the field
4278          of interest (in this case POS must be 0).  */
4279
4280       if (GET_CODE (inner) == MEM)
4281         {
4282 #if BYTES_BIG_ENDIAN
4283           if (inner_mode != tmode)
4284             offset = (GET_MODE_SIZE (inner_mode)
4285                       - GET_MODE_SIZE (tmode) - offset);
4286 #endif
4287
4288           new = gen_rtx (MEM, tmode, plus_constant (XEXP (inner, 0), offset));
4289           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (inner);
4290           MEM_VOLATILE_P (new) = MEM_VOLATILE_P (inner);
4291           MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (inner);
4292         }
4293       else if (GET_CODE (inner) == REG)
4294         /* We can't call gen_lowpart_for_combine here since we always want
4295            a SUBREG and it would sometimes return a new hard register.  */
4296         new = gen_rtx (SUBREG, tmode, inner,
4297                        (WORDS_BIG_ENDIAN
4298                         && GET_MODE_SIZE (is_mode) > UNITS_PER_WORD)
4299                        ? ((GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (tmode)
4300                            / UNITS_PER_WORD))
4301                        : 0);
4302       else
4303         new = force_to_mode (inner, tmode, len, NULL_RTX);
4304
4305       /* If this extraction is going into the destination of a SET, 
4306          make a STRICT_LOW_PART unless we made a MEM.  */
4307
4308       if (in_dest)
4309         return (GET_CODE (new) == MEM ? new
4310                 : (GET_CODE (new) != SUBREG
4311                    ? gen_rtx (CLOBBER, tmode, const0_rtx)
4312                    : gen_rtx_combine (STRICT_LOW_PART, VOIDmode, new)));
4313
4314       /* Otherwise, sign- or zero-extend unless we already are in the
4315          proper mode.  */
4316
4317       return (mode == tmode ? new
4318               : gen_rtx_combine (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
4319                                  mode, new));
4320     }
4321
4322   /* Unless this isin a COMPARE or we have a funny memory reference,
4323      don't do anything with field extracts starting at the low-order
4324      bit since they are simple AND operations.  */
4325   if (pos == 0 && ! in_dest && ! in_compare && ! spans_byte)
4326     return 0;
4327
4328   /* Get the mode to use should INNER be a MEM, the mode for the position,
4329      and the mode for the result.  */
4330 #ifdef HAVE_insv
4331   if (in_dest)
4332     {
4333       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_insv][0];
4334       pos_mode = insn_operand_mode[(int) CODE_FOR_insv][2];
4335       extraction_mode = insn_operand_mode[(int) CODE_FOR_insv][3];
4336     }
4337 #endif
4338
4339 #ifdef HAVE_extzv
4340   if (! in_dest && unsignedp)
4341     {
4342       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
4343       pos_mode = insn_operand_mode[(int) CODE_FOR_extzv][3];
4344       extraction_mode = insn_operand_mode[(int) CODE_FOR_extzv][0];
4345     }
4346 #endif
4347
4348 #ifdef HAVE_extv
4349   if (! in_dest && ! unsignedp)
4350     {
4351       wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
4352       pos_mode = insn_operand_mode[(int) CODE_FOR_extv][3];
4353       extraction_mode = insn_operand_mode[(int) CODE_FOR_extv][0];
4354     }
4355 #endif
4356
4357   /* Never narrow an object, since that might not be safe.  */
4358
4359   if (mode != VOIDmode
4360       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
4361     extraction_mode = mode;
4362
4363   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
4364       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
4365     pos_mode = GET_MODE (pos_rtx);
4366
4367   /* If this is not from memory or we have to change the mode of memory and
4368      cannot, the desired mode is EXTRACTION_MODE.  */
4369   if (GET_CODE (inner) != MEM
4370       || (inner_mode != wanted_mem_mode
4371           && (mode_dependent_address_p (XEXP (inner, 0))
4372               || MEM_VOLATILE_P (inner))))
4373     wanted_mem_mode = extraction_mode;
4374
4375 #if BITS_BIG_ENDIAN
4376   /* If position is constant, compute new position.  Otherwise, build
4377      subtraction.  */
4378   if (pos >= 0)
4379     pos = (MAX (GET_MODE_BITSIZE (is_mode), GET_MODE_BITSIZE (wanted_mem_mode))
4380            - len - pos);
4381   else
4382     pos_rtx
4383       = gen_rtx_combine (MINUS, GET_MODE (pos_rtx),
4384                          GEN_INT (MAX (GET_MODE_BITSIZE (is_mode),
4385                                        GET_MODE_BITSIZE (wanted_mem_mode))
4386                                   - len),
4387                          pos_rtx);
4388 #endif
4389
4390   /* If INNER has a wider mode, make it smaller.  If this is a constant
4391      extract, try to adjust the byte to point to the byte containing
4392      the value.  */
4393   if (wanted_mem_mode != VOIDmode
4394       && GET_MODE_SIZE (wanted_mem_mode) < GET_MODE_SIZE (is_mode)
4395       && ((GET_CODE (inner) == MEM
4396            && (inner_mode == wanted_mem_mode
4397                || (! mode_dependent_address_p (XEXP (inner, 0))
4398                    && ! MEM_VOLATILE_P (inner))))))
4399     {
4400       int offset = 0;
4401
4402       /* The computations below will be correct if the machine is big
4403          endian in both bits and bytes or little endian in bits and bytes.
4404          If it is mixed, we must adjust.  */
4405              
4406 #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
4407       if (! spans_byte && is_mode != wanted_mem_mode)
4408         offset = (GET_MODE_SIZE (is_mode)
4409                   - GET_MODE_SIZE (wanted_mem_mode) - offset);
4410 #endif
4411
4412       /* If bytes are big endian and we had a paradoxical SUBREG, we must
4413          adjust OFFSET to compensate. */
4414 #if BYTES_BIG_ENDIAN
4415       if (! spans_byte
4416           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
4417         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
4418 #endif
4419
4420       /* If this is a constant position, we can move to the desired byte.  */
4421       if (pos >= 0)
4422         {
4423           offset += pos / BITS_PER_UNIT;
4424           pos %= GET_MODE_BITSIZE (wanted_mem_mode);
4425         }
4426
4427       if (offset != 0 || inner_mode != wanted_mem_mode)
4428         {
4429           rtx newmem = gen_rtx (MEM, wanted_mem_mode,
4430                                 plus_constant (XEXP (inner, 0), offset));
4431           RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (inner);
4432           MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (inner);
4433           MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (inner);
4434           inner = newmem;
4435         }
4436     }
4437
4438   /* If INNER is not memory, we can always get it into the proper mode. */
4439   else if (GET_CODE (inner) != MEM)
4440     inner = force_to_mode (inner, extraction_mode,
4441                            (pos < 0 ? GET_MODE_BITSIZE (extraction_mode)
4442                             : len + pos),
4443                            NULL_RTX);
4444
4445   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
4446      have to zero extend.  Otherwise, we can just use a SUBREG.  */
4447   if (pos < 0
4448       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
4449     pos_rtx = gen_rtx_combine (ZERO_EXTEND, pos_mode, pos_rtx);
4450   else if (pos < 0
4451            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
4452     pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx);
4453
4454   /* Make POS_RTX unless we already have it and it is correct.  */
4455   if (pos_rtx == 0 || (pos >= 0 && INTVAL (pos_rtx) != pos))
4456     pos_rtx = GEN_INT (pos);
4457
4458   /* Make the required operation.  See if we can use existing rtx.  */
4459   new = gen_rtx_combine (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
4460                          extraction_mode, inner, GEN_INT (len), pos_rtx);
4461   if (! in_dest)
4462     new = gen_lowpart_for_combine (mode, new);
4463
4464   return new;
4465 }
4466 \f
4467 /* Look at the expression rooted at X.  Look for expressions
4468    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
4469    Form these expressions.
4470
4471    Return the new rtx, usually just X.
4472
4473    Also, for machines like the Vax that don't have logical shift insns,
4474    try to convert logical to arithmetic shift operations in cases where
4475    they are equivalent.  This undoes the canonicalizations to logical
4476    shifts done elsewhere.
4477
4478    We try, as much as possible, to re-use rtl expressions to save memory.
4479
4480    IN_CODE says what kind of expression we are processing.  Normally, it is
4481    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
4482    being kludges), it is MEM.  When processing the arguments of a comparison
4483    or a COMPARE against zero, it is COMPARE.  */
4484
4485 static rtx
4486 make_compound_operation (x, in_code)
4487      rtx x;
4488      enum rtx_code in_code;
4489 {
4490   enum rtx_code code = GET_CODE (x);
4491   enum machine_mode mode = GET_MODE (x);
4492   int mode_width = GET_MODE_BITSIZE (mode);
4493   enum rtx_code next_code;
4494   int i, count;
4495   rtx new = 0;
4496   char *fmt;
4497
4498   /* Select the code to be used in recursive calls.  Once we are inside an
4499      address, we stay there.  If we have a comparison, set to COMPARE,
4500      but once inside, go back to our default of SET.  */
4501
4502   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
4503                : ((code == COMPARE || GET_RTX_CLASS (code) == '<')
4504                   && XEXP (x, 1) == const0_rtx) ? COMPARE
4505                : in_code == COMPARE ? SET : in_code);
4506
4507   /* Process depending on the code of this operation.  If NEW is set
4508      non-zero, it will be returned.  */
4509
4510   switch (code)
4511     {
4512     case ASHIFT:
4513     case LSHIFT:
4514       /* Convert shifts by constants into multiplications if inside
4515          an address.  */
4516       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
4517           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
4518           && INTVAL (XEXP (x, 1)) >= 0)
4519         new = gen_rtx_combine (MULT, mode, XEXP (x, 0),
4520                                GEN_INT ((HOST_WIDE_INT) 1
4521                                         << INTVAL (XEXP (x, 1))));
4522       break;
4523
4524     case AND:
4525       /* If the second operand is not a constant, we can't do anything
4526          with it.  */
4527       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
4528         break;
4529
4530       /* If the constant is a power of two minus one and the first operand
4531          is a logical right shift, make an extraction.  */
4532       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
4533           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
4534         new = make_extraction (mode, XEXP (XEXP (x, 0), 0), -1,
4535                                XEXP (XEXP (x, 0), 1), i, 1,
4536                                0, in_code == COMPARE);
4537
4538       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
4539       else if (GET_CODE (XEXP (x, 0)) == SUBREG
4540                && subreg_lowpart_p (XEXP (x, 0))
4541                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
4542                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
4543         new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))),
4544                                XEXP (SUBREG_REG (XEXP (x, 0)), 0), -1,
4545                                XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
4546                                0, in_code == COMPARE);
4547
4548
4549       /* If we are have (and (rotate X C) M) and C is larger than the number
4550          of bits in M, this is an extraction.  */
4551
4552       else if (GET_CODE (XEXP (x, 0)) == ROTATE
4553                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4554                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
4555                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
4556         new = make_extraction (mode, XEXP (XEXP (x, 0), 0),
4557                                (GET_MODE_BITSIZE (mode)
4558                                 - INTVAL (XEXP (XEXP (x, 0), 1))),
4559                                NULL_RTX, i, 1, 0, in_code == COMPARE);
4560
4561       /* On machines without logical shifts, if the operand of the AND is
4562          a logical shift and our mask turns off all the propagated sign
4563          bits, we can replace the logical shift with an arithmetic shift.  */
4564       else if (ashr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
4565                && (lshr_optab->handlers[(int) mode].insn_code
4566                    == CODE_FOR_nothing)
4567                && GET_CODE (XEXP (x, 0)) == LSHIFTRT
4568                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4569                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
4570                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
4571                && mode_width <= HOST_BITS_PER_WIDE_INT)
4572         {
4573           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
4574
4575           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
4576           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
4577             SUBST (XEXP (x, 0),
4578                    gen_rtx_combine (ASHIFTRT, mode, XEXP (XEXP (x, 0), 0),
4579                                     XEXP (XEXP (x, 0), 1)));
4580         }
4581
4582       /* If the constant is one less than a power of two, this might be
4583          representable by an extraction even if no shift is present.
4584          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
4585          we are in a COMPARE.  */
4586       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
4587         new = make_extraction (mode, XEXP (x, 0), 0, NULL_RTX, i, 1,
4588                                0, in_code == COMPARE);
4589
4590       /* If we are in a comparison and this is an AND with a power of two,
4591          convert this into the appropriate bit extract.  */
4592       else if (in_code == COMPARE
4593                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
4594         new = make_extraction (mode, XEXP (x, 0), i, NULL_RTX, 1, 1, 0, 1);
4595
4596       break;
4597
4598     case LSHIFTRT:
4599       /* If the sign bit is known to be zero, replace this with an
4600          arithmetic shift.  */
4601       if (ashr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing
4602           && lshr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
4603           && mode_width <= HOST_BITS_PER_WIDE_INT
4604           && (significant_bits (XEXP (x, 0), mode)
4605               & (1 << (mode_width - 1))) == 0)
4606         {
4607           new = gen_rtx_combine (ASHIFTRT, mode, XEXP (x, 0), XEXP (x, 1));
4608           break;
4609         }
4610
4611       /* ... fall through ... */
4612
4613     case ASHIFTRT:
4614       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
4615          this is a SIGN_EXTRACT.  */
4616       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4617           && GET_CODE (XEXP (x, 0)) == ASHIFT
4618           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4619           && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (x, 0), 1)))
4620         new = make_extraction (mode, XEXP (XEXP (x, 0), 0),
4621                                (INTVAL (XEXP (x, 1))
4622                                 - INTVAL (XEXP (XEXP (x, 0), 1))),
4623                                NULL_RTX, mode_width - INTVAL (XEXP (x, 1)),
4624                                code == LSHIFTRT, 0, in_code == COMPARE);
4625
4626       /* Similarly if we have (ashifrt (OP (ashift foo C1) C3) C2).  In these
4627          cases, we are better off returning a SIGN_EXTEND of the operation.  */
4628
4629       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4630           && (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND
4631               || GET_CODE (XEXP (x, 0)) == XOR
4632               || GET_CODE (XEXP (x, 0)) == PLUS)
4633           && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
4634           && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4635           && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
4636           && INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) < HOST_BITS_PER_WIDE_INT
4637           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4638           && (INTVAL (XEXP (XEXP (x, 0), 1))
4639               & (((HOST_WIDE_INT) 1
4640                   << INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))) - 1)) == 0)
4641         {
4642           HOST_WIDE_INT newop1
4643             = (INTVAL (XEXP (XEXP (x, 0), 1))
4644                >> INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)));
4645
4646           new = make_extraction (mode,
4647                                  gen_binary (GET_CODE (XEXP (x, 0)), mode,
4648                                              XEXP (XEXP (XEXP (x, 0), 0), 0),
4649                                              GEN_INT (newop1)),
4650                                  (INTVAL (XEXP (x, 1))
4651                                   - INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))),
4652                                  NULL_RTX, mode_width - INTVAL (XEXP (x, 1)),
4653                                  code == LSHIFTRT, 0, in_code == COMPARE);
4654         }
4655
4656       /* Similarly for (ashiftrt (neg (ashift FOO C1)) C2).  */
4657       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4658           && GET_CODE (XEXP (x, 0)) == NEG
4659           && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
4660           && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
4661           && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)))
4662         new = make_extraction (mode,
4663                                gen_unary (GET_CODE (XEXP (x, 0)), mode,
4664                                           XEXP (XEXP (XEXP (x, 0), 0), 0)),
4665                                (INTVAL (XEXP (x, 1))
4666                                 - INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))),
4667                                NULL_RTX, mode_width - INTVAL (XEXP (x, 1)),
4668                                code == LSHIFTRT, 0, in_code == COMPARE);
4669       break;
4670     }
4671
4672   if (new)
4673     {
4674       x = gen_lowpart_for_combine (mode, new);
4675       code = GET_CODE (x);
4676     }
4677
4678   /* Now recursively process each operand of this operation.  */
4679   fmt = GET_RTX_FORMAT (code);
4680   for (i = 0; i < GET_RTX_LENGTH (code); i++)
4681     if (fmt[i] == 'e')
4682       {
4683         new = make_compound_operation (XEXP (x, i), next_code);
4684         SUBST (XEXP (x, i), new);
4685       }
4686
4687   return x;
4688 }
4689 \f
4690 /* Given M see if it is a value that would select a field of bits
4691     within an item, but not the entire word.  Return -1 if not.
4692     Otherwise, return the starting position of the field, where 0 is the
4693     low-order bit.
4694
4695    *PLEN is set to the length of the field.  */
4696
4697 static int
4698 get_pos_from_mask (m, plen)
4699      unsigned HOST_WIDE_INT m;
4700      int *plen;
4701 {
4702   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
4703   int pos = exact_log2 (m & - m);
4704
4705   if (pos < 0)
4706     return -1;
4707
4708   /* Now shift off the low-order zero bits and see if we have a power of
4709      two minus 1.  */
4710   *plen = exact_log2 ((m >> pos) + 1);
4711
4712   if (*plen <= 0)
4713     return -1;
4714
4715   return pos;
4716 }
4717 \f
4718 /* Rewrite X so that it is an expression in MODE.  We only care about the
4719    low-order BITS bits so we can ignore AND operations that just clear
4720    higher-order bits.
4721
4722    Also, if REG is non-zero and X is a register equal in value to REG, 
4723    replace X with REG.  */
4724
4725 static rtx
4726 force_to_mode (x, mode, bits, reg)
4727      rtx x;
4728      enum machine_mode mode;
4729      int bits;
4730      rtx reg;
4731 {
4732   enum rtx_code code = GET_CODE (x);
4733   enum machine_mode op_mode = mode;
4734
4735   /* If X is narrower than MODE or if BITS is larger than the size of MODE,
4736      just get X in the proper mode.  */
4737
4738   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
4739       || bits > GET_MODE_BITSIZE (mode))
4740     return gen_lowpart_for_combine (mode, x);
4741
4742   switch (code)
4743     {
4744     case SIGN_EXTEND:
4745     case ZERO_EXTEND:
4746     case ZERO_EXTRACT:
4747     case SIGN_EXTRACT:
4748       x = expand_compound_operation (x);
4749       if (GET_CODE (x) != code)
4750         return force_to_mode (x, mode, bits, reg);
4751       break;
4752
4753     case REG:
4754       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
4755                        || rtx_equal_p (reg, get_last_value (x))))
4756         x = reg;
4757       break;
4758
4759     case CONST_INT:
4760       if (bits < HOST_BITS_PER_WIDE_INT)
4761         x = GEN_INT (INTVAL (x) & (((HOST_WIDE_INT) 1 << bits) - 1));
4762       return x;
4763
4764     case SUBREG:
4765       /* Ignore low-order SUBREGs. */
4766       if (subreg_lowpart_p (x))
4767         return force_to_mode (SUBREG_REG (x), mode, bits, reg);
4768       break;
4769
4770     case AND:
4771       /* If this is an AND with a constant.  Otherwise, we fall through to
4772          do the general binary case.  */
4773
4774       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4775         {
4776           HOST_WIDE_INT mask = INTVAL (XEXP (x, 1));
4777           int len = exact_log2 (mask + 1);
4778           rtx op = XEXP (x, 0);
4779
4780           /* If this is masking some low-order bits, we may be able to
4781              impose a stricter constraint on what bits of the operand are
4782              required.  */
4783
4784           op = force_to_mode (op, mode, len > 0 ? MIN (len, bits) : bits,
4785                               reg);
4786
4787           if (bits < HOST_BITS_PER_WIDE_INT)
4788             mask &= ((HOST_WIDE_INT) 1 << bits) - 1;
4789
4790           /* If we have no AND in MODE, use the original mode for the
4791              operation.  */
4792
4793           if (and_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4794             op_mode = GET_MODE (x);
4795
4796           x = simplify_and_const_int (x, op_mode, op, mask);
4797
4798           /* If X is still an AND, see if it is an AND with a mask that
4799              is just some low-order bits.  If so, and it is BITS wide (it
4800              can't be wider), we don't need it.  */
4801
4802           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
4803               && bits < HOST_BITS_PER_WIDE_INT
4804               && INTVAL (XEXP (x, 1)) == ((HOST_WIDE_INT) 1 << bits) - 1)
4805             x = XEXP (x, 0);
4806
4807           break;
4808         }
4809
4810       /* ... fall through ... */
4811
4812     case PLUS:
4813     case MINUS:
4814     case MULT:
4815     case IOR:
4816     case XOR:
4817       /* For most binary operations, just propagate into the operation and
4818          change the mode if we have an operation of that mode.  */
4819
4820       if ((code == PLUS
4821            && add_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4822           || (code == MINUS
4823               && sub_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4824           || (code == MULT && (smul_optab->handlers[(int) mode].insn_code
4825                                == CODE_FOR_nothing))
4826           || (code == AND
4827               && and_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4828           || (code == IOR
4829               && ior_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4830           || (code == XOR && (xor_optab->handlers[(int) mode].insn_code
4831                               == CODE_FOR_nothing)))
4832         op_mode = GET_MODE (x);
4833
4834       x = gen_binary (code, op_mode,
4835                       gen_lowpart_for_combine (op_mode,
4836                                                force_to_mode (XEXP (x, 0),
4837                                                               mode, bits,
4838                                                               reg)),
4839                       gen_lowpart_for_combine (op_mode,
4840                                                force_to_mode (XEXP (x, 1),
4841                                                               mode, bits,
4842                                                               reg)));
4843       break;
4844
4845     case ASHIFT:
4846     case LSHIFT:
4847       /* For left shifts, do the same, but just for the first operand.
4848          If the shift count is a constant, we need even fewer bits of the
4849          first operand.  */
4850
4851       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) < bits)
4852         bits -= INTVAL (XEXP (x, 1));
4853
4854       if ((code == ASHIFT
4855            && ashl_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4856           || (code == LSHIFT && (lshl_optab->handlers[(int) mode].insn_code
4857                                  == CODE_FOR_nothing)))
4858         op_mode = GET_MODE (x);
4859
4860       x =  gen_binary (code, op_mode,
4861                        gen_lowpart_for_combine (op_mode,
4862                                                 force_to_mode (XEXP (x, 0),
4863                                                                mode, bits,
4864                                                                reg)),
4865                        XEXP (x, 1));
4866       break;
4867
4868     case LSHIFTRT:
4869       /* Here we can only do something if the shift count is a constant and
4870          the count plus BITS is no larger than the width of MODE, we can do
4871          the shift in MODE.  */
4872
4873       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4874           && INTVAL (XEXP (x, 1)) + bits <= GET_MODE_BITSIZE (mode))
4875         {
4876           rtx inner = force_to_mode (XEXP (x, 0), mode,
4877                                      bits + INTVAL (XEXP (x, 1)), reg);
4878
4879           if (lshr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4880             op_mode = GET_MODE (x);
4881
4882           x = gen_binary (LSHIFTRT, op_mode,
4883                           gen_lowpart_for_combine (op_mode, inner),
4884                           XEXP (x, 1));
4885         }
4886       break;
4887
4888     case ASHIFTRT:
4889       /* If this is a sign-extension operation that just affects bits
4890          we don't care about, remove it.  */
4891
4892       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4893           && INTVAL (XEXP (x, 1)) >= 0
4894           && INTVAL (XEXP (x, 1)) <= GET_MODE_BITSIZE (GET_MODE (x)) - bits
4895           && GET_CODE (XEXP (x, 0)) == ASHIFT
4896           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
4897           && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1)))
4898         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, bits, reg);
4899       break;
4900
4901     case NEG:
4902     case NOT:
4903       if ((code == NEG
4904            && neg_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
4905           || (code == NOT && (one_cmpl_optab->handlers[(int) mode].insn_code
4906                               == CODE_FOR_nothing)))
4907         op_mode = GET_MODE (x);
4908
4909       /* Handle these similarly to the way we handle most binary operations. */
4910       x = gen_unary (code, op_mode,
4911                      gen_lowpart_for_combine (op_mode,
4912                                               force_to_mode (XEXP (x, 0), mode,
4913                                                              bits, reg)));
4914       break;
4915
4916     case IF_THEN_ELSE:
4917       /* We have no way of knowing if the IF_THEN_ELSE can itself be
4918          written in a narrower mode.  We play it safe and do not do so.  */
4919
4920       SUBST (XEXP (x, 1),
4921              gen_lowpart_for_combine (GET_MODE (x),
4922                                       force_to_mode (XEXP (x, 1), mode,
4923                                                      bits, reg)));
4924       SUBST (XEXP (x, 2),
4925              gen_lowpart_for_combine (GET_MODE (x),
4926                                       force_to_mode (XEXP (x, 2), mode,
4927                                                      bits, reg)));
4928       break;
4929     }
4930
4931   /* Ensure we return a value of the proper mode.  */
4932   return gen_lowpart_for_combine (mode, x);
4933 }
4934 \f
4935 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
4936    Return that assignment if so.
4937
4938    We only handle the most common cases.  */
4939
4940 static rtx
4941 make_field_assignment (x)
4942      rtx x;
4943 {
4944   rtx dest = SET_DEST (x);
4945   rtx src = SET_SRC (x);
4946   rtx ourdest;
4947   rtx assign;
4948   HOST_WIDE_INT c1;
4949   int pos, len;
4950   rtx other;
4951   enum machine_mode mode;
4952
4953   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
4954      a clear of a one-bit field.  We will have changed it to
4955      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
4956      for a SUBREG.  */
4957
4958   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
4959       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
4960       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
4961       && (rtx_equal_p (dest, XEXP (src, 1))
4962           || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
4963           || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
4964     {
4965       assign = make_extraction (VOIDmode, dest, -1, XEXP (XEXP (src, 0), 1),
4966                                 1, 1, 1, 0);
4967       return gen_rtx (SET, VOIDmode, assign, const0_rtx);
4968     }
4969
4970   else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
4971            && subreg_lowpart_p (XEXP (src, 0))
4972            && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) 
4973                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
4974            && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
4975            && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
4976            && (rtx_equal_p (dest, XEXP (src, 1))
4977                || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
4978                || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
4979     {
4980       assign = make_extraction (VOIDmode, dest, -1,
4981                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
4982                                 1, 1, 1, 0);
4983       return gen_rtx (SET, VOIDmode, assign, const0_rtx);
4984     }
4985
4986   /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a
4987      one-bit field.  */
4988   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
4989            && XEXP (XEXP (src, 0), 0) == const1_rtx
4990            && (rtx_equal_p (dest, XEXP (src, 1))
4991                || rtx_equal_p (dest, get_last_value (XEXP (src, 1)))
4992                || rtx_equal_p (get_last_value (dest), XEXP (src, 1))))
4993     {
4994       assign = make_extraction (VOIDmode, dest, -1, XEXP (XEXP (src, 0), 1),
4995                                 1, 1, 1, 0);
4996       return gen_rtx (SET, VOIDmode, assign, const1_rtx);
4997     }
4998
4999   /* The other case we handle is assignments into a constant-position
5000      field.  They look like (ior (and DEST C1) OTHER).  If C1 represents
5001      a mask that has all one bits except for a group of zero bits and
5002      OTHER is known to have zeros where C1 has ones, this is such an
5003      assignment.  Compute the position and length from C1.  Shift OTHER
5004      to the appropriate position, force it to the required mode, and
5005      make the extraction.  Check for the AND in both operands.  */
5006
5007   if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == AND
5008       && GET_CODE (XEXP (XEXP (src, 0), 1)) == CONST_INT
5009       && (rtx_equal_p (XEXP (XEXP (src, 0), 0), dest)
5010           || rtx_equal_p (XEXP (XEXP (src, 0), 0), get_last_value (dest))
5011           || rtx_equal_p (get_last_value (XEXP (XEXP (src, 0), 1)), dest)))
5012     c1 = INTVAL (XEXP (XEXP (src, 0), 1)), other = XEXP (src, 1);
5013   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 1)) == AND
5014            && GET_CODE (XEXP (XEXP (src, 1), 1)) == CONST_INT
5015            && (rtx_equal_p (XEXP (XEXP (src, 1), 0), dest)
5016                || rtx_equal_p (XEXP (XEXP (src, 1), 0), get_last_value (dest))
5017                || rtx_equal_p (get_last_value (XEXP (XEXP (src, 1), 0)),
5018                                dest)))
5019     c1 = INTVAL (XEXP (XEXP (src, 1), 1)), other = XEXP (src, 0);
5020   else
5021     return x;
5022
5023   pos = get_pos_from_mask (~c1, &len);
5024   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
5025       || (c1 & significant_bits (other, GET_MODE (other))) != 0)
5026     return x;
5027
5028   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
5029
5030   /* The mode to use for the source is the mode of the assignment, or of
5031      what is inside a possible STRICT_LOW_PART.  */
5032   mode = (GET_CODE (assign) == STRICT_LOW_PART 
5033           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
5034
5035   /* Shift OTHER right POS places and make it the source, restricting it
5036      to the proper length and mode.  */
5037
5038   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
5039                                              GET_MODE (src), other, pos),
5040                        mode, len, dest);
5041
5042   return gen_rtx_combine (SET, VOIDmode, assign, src);
5043 }
5044 \f
5045 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
5046    if so.  */
5047
5048 static rtx
5049 apply_distributive_law (x)
5050      rtx x;
5051 {
5052   enum rtx_code code = GET_CODE (x);
5053   rtx lhs, rhs, other;
5054   rtx tem;
5055   enum rtx_code inner_code;
5056
5057   /* The outer operation can only be one of the following:  */
5058   if (code != IOR && code != AND && code != XOR
5059       && code != PLUS && code != MINUS)
5060     return x;
5061
5062   lhs = XEXP (x, 0), rhs = XEXP (x, 1);
5063
5064   /* If either operand is a primitive we can't do anything, so get out fast. */
5065   if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o'
5066       || GET_RTX_CLASS (GET_CODE (rhs)) == 'o')
5067     return x;
5068
5069   lhs = expand_compound_operation (lhs);
5070   rhs = expand_compound_operation (rhs);
5071   inner_code = GET_CODE (lhs);
5072   if (inner_code != GET_CODE (rhs))
5073     return x;
5074
5075   /* See if the inner and outer operations distribute.  */
5076   switch (inner_code)
5077     {
5078     case LSHIFTRT:
5079     case ASHIFTRT:
5080     case AND:
5081     case IOR:
5082       /* These all distribute except over PLUS.  */
5083       if (code == PLUS || code == MINUS)
5084         return x;
5085       break;
5086
5087     case MULT:
5088       if (code != PLUS && code != MINUS)
5089         return x;
5090       break;
5091
5092     case ASHIFT:
5093     case LSHIFT:
5094       /* These are also multiplies, so they distribute over everything.  */
5095       break;
5096
5097     case SUBREG:
5098       /* Non-paradoxical SUBREGs distributes over all operations, provided
5099          the inner modes and word numbers are the same, this is an extraction
5100          of a low-order part, we don't convert an fp operation to int or
5101          vice versa, and we would not be converting a single-word
5102          operation into a multi-word operation.  The latter test is not
5103          required, but it prevents generating unneeded multi-word operations.
5104          Some of the previous tests are redundant given the latter test, but
5105          are retained because they are required for correctness.
5106
5107          We produce the result slightly differently in this case.  */
5108
5109       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
5110           || SUBREG_WORD (lhs) != SUBREG_WORD (rhs)
5111           || ! subreg_lowpart_p (lhs)
5112           || (GET_MODE_CLASS (GET_MODE (lhs))
5113               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
5114           || (GET_MODE_SIZE (GET_MODE (lhs))
5115               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
5116           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
5117         return x;
5118
5119       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
5120                         SUBREG_REG (lhs), SUBREG_REG (rhs));
5121       return gen_lowpart_for_combine (GET_MODE (x), tem);
5122
5123     default:
5124       return x;
5125     }
5126
5127   /* Set LHS and RHS to the inner operands (A and B in the example
5128      above) and set OTHER to the common operand (C in the example).
5129      These is only one way to do this unless the inner operation is
5130      commutative.  */
5131   if (GET_RTX_CLASS (inner_code) == 'c'
5132       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
5133     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
5134   else if (GET_RTX_CLASS (inner_code) == 'c'
5135            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
5136     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
5137   else if (GET_RTX_CLASS (inner_code) == 'c'
5138            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
5139     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
5140   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
5141     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
5142   else
5143     return x;
5144
5145   /* Form the new inner operation, seeing if it simplifies first.  */
5146   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
5147
5148   /* There is one exception to the general way of distributing:
5149      (a ^ b) | (a ^ c) -> (~a) & (b ^ c)  */
5150   if (code == XOR && inner_code == IOR)
5151     {
5152       inner_code = AND;
5153       other = gen_unary (NOT, GET_MODE (x), other);
5154     }
5155
5156   /* We may be able to continuing distributing the result, so call
5157      ourselves recursively on the inner operation before forming the
5158      outer operation, which we return.  */
5159   return gen_binary (inner_code, GET_MODE (x),
5160                      apply_distributive_law (tem), other);
5161 }
5162 \f
5163 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
5164    in MODE.
5165
5166    Return an equivalent form, if different from X.  Otherwise, return X.  If
5167    X is zero, we are to always construct the equivalent form.  */
5168
5169 static rtx
5170 simplify_and_const_int (x, mode, varop, constop)
5171      rtx x;
5172      enum machine_mode mode;
5173      rtx varop;
5174      unsigned HOST_WIDE_INT constop;
5175 {
5176   register enum machine_mode tmode;
5177   register rtx temp;
5178   unsigned HOST_WIDE_INT significant;
5179
5180   /* There is a large class of optimizations based on the principle that
5181      some operations produce results where certain bits are known to be zero,
5182      and hence are not significant to the AND.  For example, if we have just
5183      done a left shift of one bit, the low-order bit is known to be zero and
5184      hence an AND with a mask of ~1 would not do anything.
5185
5186      At the end of the following loop, we set:
5187
5188      VAROP to be the item to be AND'ed with;
5189      CONSTOP to the constant value to AND it with.  */
5190
5191   while (1)
5192     {
5193       /* If we ever encounter a mode wider than the host machine's widest
5194          integer size, we can't compute the masks accurately, so give up.  */
5195       if (GET_MODE_BITSIZE (GET_MODE (varop)) > HOST_BITS_PER_WIDE_INT)
5196         break;
5197
5198       /* Unless one of the cases below does a `continue',
5199          a `break' will be executed to exit the loop.  */
5200
5201       switch (GET_CODE (varop))
5202         {
5203         case CLOBBER:
5204           /* If VAROP is a (clobber (const_int)), return it since we know
5205              we are generating something that won't match. */
5206           return varop;
5207
5208 #if ! BITS_BIG_ENDIAN
5209         case USE:
5210           /* VAROP is a (use (mem ..)) that was made from a bit-field
5211              extraction that spanned the boundary of the MEM.  If we are
5212              now masking so it is within that boundary, we don't need the
5213              USE any more.  */
5214           if ((constop & ~ GET_MODE_MASK (GET_MODE (XEXP (varop, 0)))) == 0)
5215             {
5216               varop = XEXP (varop, 0);
5217               continue;
5218             }
5219           break;
5220 #endif
5221
5222         case SUBREG:
5223           if (subreg_lowpart_p (varop)
5224               /* We can ignore the effect this SUBREG if it narrows the mode
5225                  or, on machines where byte operations zero extend, if the
5226                  constant masks to zero all the bits the mode doesn't have.  */
5227               && ((GET_MODE_SIZE (GET_MODE (varop))
5228                    < GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))))
5229 #ifdef BYTE_LOADS_ZERO_EXTEND
5230                   || (0 == (constop
5231                             & GET_MODE_MASK (GET_MODE (varop))
5232                             & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (varop)))))
5233 #endif
5234                   ))
5235             {
5236               varop = SUBREG_REG (varop);
5237               continue;
5238             }
5239           break;
5240
5241         case ZERO_EXTRACT:
5242         case SIGN_EXTRACT:
5243         case ZERO_EXTEND:
5244         case SIGN_EXTEND:
5245           /* Try to expand these into a series of shifts and then work
5246              with that result.  If we can't, for example, if the extract
5247              isn't at a fixed position, give up.  */
5248           temp = expand_compound_operation (varop);
5249           if (temp != varop)
5250             {
5251               varop = temp;
5252               continue;
5253             }
5254           break;
5255
5256         case AND:
5257           if (GET_CODE (XEXP (varop, 1)) == CONST_INT)
5258             {
5259               constop &= INTVAL (XEXP (varop, 1));
5260               varop = XEXP (varop, 0);
5261               continue;
5262             }
5263           break;
5264
5265         case IOR:
5266         case XOR:
5267           /* If VAROP is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
5268              LSHIFT so we end up with an (and (lshiftrt (ior ...) ...) ...)
5269              operation which may be a bitfield extraction.  */
5270
5271           if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT
5272               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
5273               && INTVAL (XEXP (XEXP (varop, 0), 1)) >= 0
5274               && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT
5275               && GET_CODE (XEXP (varop, 1)) == CONST_INT
5276               && (INTVAL (XEXP (varop, 1))
5277                   & ~ significant_bits (XEXP (varop, 0),
5278                                         GET_MODE (varop)) == 0))
5279             {
5280               temp = GEN_INT ((INTVAL (XEXP (varop, 1)) & constop)
5281                               << INTVAL (XEXP (XEXP (varop, 0), 1)));
5282               temp = gen_binary (GET_CODE (varop), GET_MODE (varop),
5283                                  XEXP (XEXP (varop, 0), 0), temp);
5284               varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
5285                                        temp, XEXP (varop, 1));
5286               continue;
5287             }
5288
5289           /* Apply the AND to both branches of the IOR or XOR, then try to
5290              apply the distributive law.  This may eliminate operations 
5291              if either branch can be simplified because of the AND.
5292              It may also make some cases more complex, but those cases
5293              probably won't match a pattern either with or without this.  */
5294           return 
5295             gen_lowpart_for_combine
5296               (mode, apply_distributive_law
5297                (gen_rtx_combine
5298                 (GET_CODE (varop), GET_MODE (varop),
5299                  simplify_and_const_int (NULL_RTX, GET_MODE (varop),
5300                                          XEXP (varop, 0), constop),
5301                  simplify_and_const_int (NULL_RTX, GET_MODE (varop),
5302                                          XEXP (varop, 1), constop))));
5303
5304         case NOT:
5305           /* (and (not FOO)) is (and (xor FOO CONST_OP)) so if FOO is an
5306              LSHIFTRT we can do the same as above.  */
5307
5308           if (GET_CODE (XEXP (varop, 0)) == LSHIFTRT
5309               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
5310               && INTVAL (XEXP (XEXP (varop, 0), 1)) >= 0
5311               && INTVAL (XEXP (XEXP (varop, 0), 1)) < HOST_BITS_PER_WIDE_INT)
5312             {
5313               temp = GEN_INT (constop << INTVAL (XEXP (XEXP (varop, 0), 1)));
5314               temp = gen_binary (XOR, GET_MODE (varop),
5315                                  XEXP (XEXP (varop, 0), 0), temp);
5316               varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
5317                                        temp, XEXP (XEXP (varop, 0), 1));
5318               continue;
5319             }
5320           break;
5321
5322         case ASHIFTRT:
5323           /* If we are just looking for the sign bit, we don't need this
5324              shift at all, even if it has a variable count.  */
5325           if (constop == ((HOST_WIDE_INT) 1
5326                           << (GET_MODE_BITSIZE (GET_MODE (varop)) - 1)))
5327             {
5328               varop = XEXP (varop, 0);
5329               continue;
5330             }
5331
5332           /* If this is a shift by a constant, get a mask that contains
5333              those bits that are not copies of the sign bit.  We then have
5334              two cases:  If CONSTOP only includes those bits, this can be
5335              a logical shift, which may allow simplifications.  If CONSTOP
5336              is a single-bit field not within those bits, we are requesting
5337              a copy of the sign bit and hence can shift the sign bit to
5338              the appropriate location.  */
5339           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
5340               && INTVAL (XEXP (varop, 1)) >= 0
5341               && INTVAL (XEXP (varop, 1)) < HOST_BITS_PER_WIDE_INT)
5342             {
5343               int i = -1;
5344
5345               significant = GET_MODE_MASK (GET_MODE (varop));
5346               significant >>= INTVAL (XEXP (varop, 1));
5347
5348               if ((constop & ~significant) == 0
5349                   || (i = exact_log2 (constop)) >= 0)
5350                 {
5351                   varop = simplify_shift_const
5352                     (varop, LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
5353                      i < 0 ? INTVAL (XEXP (varop, 1))
5354                      : GET_MODE_BITSIZE (GET_MODE (varop)) - 1 - i);
5355                   if (GET_CODE (varop) != ASHIFTRT)
5356                     continue;
5357                 }
5358             }
5359
5360           /* If our mask is 1, convert this to a LSHIFTRT.  This can be done
5361              even if the shift count isn't a constant.  */
5362           if (constop == 1)
5363             varop = gen_rtx_combine (LSHIFTRT, GET_MODE (varop),
5364                                      XEXP (varop, 0), XEXP (varop, 1));
5365           break;
5366
5367         case NE:
5368           /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is
5369              included in STORE_FLAG_VALUE and FOO has no significant bits
5370              not in CONST.  */
5371           if ((constop & ~ STORE_FLAG_VALUE) == 0
5372               && XEXP (varop, 0) == const0_rtx
5373               && (significant_bits (XEXP (varop, 0), mode) & ~ constop) == 0)
5374             {
5375               varop = XEXP (varop, 0);
5376               continue;
5377             }
5378           break;
5379
5380         case PLUS:
5381           /* In (and (plus FOO C1) M), if M is a mask that just turns off
5382              low-order bits (as in an alignment operation) and FOO is already
5383              aligned to that boundary, we can convert remove this AND
5384              and possibly the PLUS if it is now adding zero.  */
5385           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
5386               && exact_log2 (-constop) >= 0
5387               && (significant_bits (XEXP (varop, 0), mode) & ~ constop) == 0)
5388             {
5389               varop = plus_constant (XEXP (varop, 0),
5390                                      INTVAL (XEXP (varop, 1)) & constop);
5391               constop = ~0;
5392               break;
5393             }
5394
5395           /* ... fall through ... */
5396
5397         case MINUS:
5398           /* In (and (plus (and FOO M1) BAR) M2), if M1 and M2 are one
5399              less than powers of two and M2 is narrower than M1, we can
5400              eliminate the inner AND.  This occurs when incrementing
5401              bit fields.  */
5402
5403           if (GET_CODE (XEXP (varop, 0)) == ZERO_EXTRACT
5404               || GET_CODE (XEXP (varop, 0)) == ZERO_EXTEND)
5405             SUBST (XEXP (varop, 0),
5406                    expand_compound_operation (XEXP (varop, 0)));
5407
5408           if (GET_CODE (XEXP (varop, 0)) == AND
5409               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
5410               && exact_log2 (constop + 1) >= 0
5411               && exact_log2 (INTVAL (XEXP (XEXP (varop, 0), 1)) + 1) >= 0
5412               && (~ INTVAL (XEXP (XEXP (varop, 0), 1)) & constop) == 0)
5413             SUBST (XEXP (varop, 0), XEXP (XEXP (varop, 0), 0));
5414           break;
5415         }
5416
5417       break;
5418     }
5419
5420   /* If we have reached a constant, this whole thing is constant.  */
5421   if (GET_CODE (varop) == CONST_INT)
5422     return GEN_INT (constop & INTVAL (varop));
5423
5424   /* See what bits are significant in VAROP.  */
5425   significant = significant_bits (varop, mode);
5426
5427   /* Turn off all bits in the constant that are known to already be zero.
5428      Thus, if the AND isn't needed at all, we will have CONSTOP == SIGNIFICANT
5429      which is tested below.  */
5430
5431   constop &= significant;
5432
5433   /* If we don't have any bits left, return zero.  */
5434   if (constop == 0)
5435     return const0_rtx;
5436
5437   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
5438      if we already had one (just check for the simplest cases).  */
5439   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
5440       && GET_MODE (XEXP (x, 0)) == mode
5441       && SUBREG_REG (XEXP (x, 0)) == varop)
5442     varop = XEXP (x, 0);
5443   else
5444     varop = gen_lowpart_for_combine (mode, varop);
5445
5446   /* If we can't make the SUBREG, try to return what we were given. */
5447   if (GET_CODE (varop) == CLOBBER)
5448     return x ? x : varop;
5449
5450   /* If we are only masking insignificant bits, return VAROP.  */
5451   if (constop == significant)
5452     x = varop;
5453
5454   /* Otherwise, return an AND.  See how much, if any, of X we can use.  */
5455   else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
5456     x = gen_rtx_combine (AND, mode, varop, GEN_INT (constop));
5457
5458   else
5459     {
5460       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5461           || INTVAL (XEXP (x, 1)) != constop)
5462         SUBST (XEXP (x, 1), GEN_INT (constop));
5463
5464       SUBST (XEXP (x, 0), varop);
5465     }
5466
5467   return x;
5468 }
5469 \f
5470 /* Given an expression, X, compute which bits in X can be non-zero.
5471    We don't care about bits outside of those defined in MODE.
5472
5473    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
5474    a shift, AND, or zero_extract, we can do better.  */
5475
5476 static unsigned HOST_WIDE_INT
5477 significant_bits (x, mode)
5478      rtx x;
5479      enum machine_mode mode;
5480 {
5481   unsigned HOST_WIDE_INT significant = GET_MODE_MASK (mode);
5482   unsigned HOST_WIDE_INT inner_sig;
5483   enum rtx_code code;
5484   int mode_width = GET_MODE_BITSIZE (mode);
5485   rtx tem;
5486
5487   /* If X is wider than MODE, use its mode instead.  */
5488   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
5489     {
5490       mode = GET_MODE (x);
5491       significant = GET_MODE_MASK (mode);
5492       mode_width = GET_MODE_BITSIZE (mode);
5493     }
5494
5495   if (mode_width > HOST_BITS_PER_WIDE_INT)
5496     /* Our only callers in this case look for single bit values.  So
5497        just return the mode mask.  Those tests will then be false.  */
5498     return significant;
5499
5500   code = GET_CODE (x);
5501   switch (code)
5502     {
5503     case REG:
5504 #ifdef STACK_BOUNDARY
5505       /* If this is the stack pointer, we may know something about its
5506          alignment.  If PUSH_ROUNDING is defined, it is possible for the
5507          stack to be momentarily aligned only to that amount, so we pick
5508          the least alignment.  */
5509
5510       if (x == stack_pointer_rtx)
5511         {
5512           int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
5513
5514 #ifdef PUSH_ROUNDING
5515           sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
5516 #endif
5517
5518           return significant & ~ (sp_alignment - 1);
5519         }
5520 #endif
5521
5522       /* If X is a register whose value we can find, use that value.  
5523          Otherwise, use the previously-computed significant bits for this
5524          register.  */
5525
5526       tem = get_last_value (x);
5527       if (tem)
5528         return significant_bits (tem, mode);
5529       else if (significant_valid && reg_significant[REGNO (x)])
5530         return reg_significant[REGNO (x)] & significant;
5531       else
5532         return significant;
5533
5534     case CONST_INT:
5535       return INTVAL (x);
5536
5537 #ifdef BYTE_LOADS_ZERO_EXTEND
5538     case MEM:
5539       /* In many, if not most, RISC machines, reading a byte from memory
5540          zeros the rest of the register.  Noticing that fact saves a lot
5541          of extra zero-extends.  */
5542       significant &= GET_MODE_MASK (GET_MODE (x));
5543       break;
5544 #endif
5545
5546 #if STORE_FLAG_VALUE == 1
5547     case EQ:  case NE:
5548     case GT:  case GTU:
5549     case LT:  case LTU:
5550     case GE:  case GEU:
5551     case LE:  case LEU:
5552
5553       if (GET_MODE_CLASS (mode) == MODE_INT)
5554         significant = 1;
5555
5556       /* A comparison operation only sets the bits given by its mode.  The
5557          rest are set undefined.  */
5558       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
5559         significant |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)));
5560       break;
5561 #endif
5562
5563     case NEG:
5564       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
5565           == GET_MODE_BITSIZE (GET_MODE (x)))
5566         significant = 1;
5567
5568       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
5569         significant |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)));
5570       break;
5571
5572     case ABS:
5573       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
5574           == GET_MODE_BITSIZE (GET_MODE (x)))
5575         significant = 1;
5576       break;
5577
5578     case TRUNCATE:
5579       significant &= (significant_bits (XEXP (x, 0), mode)
5580                       & GET_MODE_MASK (mode));
5581       break;
5582
5583     case ZERO_EXTEND:
5584       significant &= significant_bits (XEXP (x, 0), mode);
5585       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
5586         significant &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
5587       break;
5588
5589     case SIGN_EXTEND:
5590       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
5591          Otherwise, show all the bits in the outer mode but not the inner
5592          may be non-zero.  */
5593       inner_sig = significant_bits (XEXP (x, 0), mode);
5594       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
5595         {
5596           inner_sig &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
5597           if (inner_sig &
5598               (((HOST_WIDE_INT) 1
5599                 << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
5600             inner_sig |= (GET_MODE_MASK (mode)
5601                           & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
5602         }
5603
5604       significant &= inner_sig;
5605       break;
5606
5607     case AND:
5608       significant &= (significant_bits (XEXP (x, 0), mode)
5609                       & significant_bits (XEXP (x, 1), mode));
5610       break;
5611
5612     case XOR:   case IOR:
5613     case UMIN:  case UMAX:  case SMIN:  case SMAX:
5614       significant &= (significant_bits (XEXP (x, 0), mode)
5615                       | significant_bits (XEXP (x, 1), mode));
5616       break;
5617
5618     case PLUS:  case MINUS:
5619     case MULT:
5620     case DIV:   case UDIV:
5621     case MOD:   case UMOD:
5622       /* We can apply the rules of arithmetic to compute the number of
5623          high- and low-order zero bits of these operations.  We start by
5624          computing the width (position of the highest-order non-zero bit)
5625          and the number of low-order zero bits for each value.  */
5626       {
5627         unsigned HOST_WIDE_INT sig0 = significant_bits (XEXP (x, 0), mode);
5628         unsigned HOST_WIDE_INT sig1 = significant_bits (XEXP (x, 1), mode);
5629         int width0 = floor_log2 (sig0) + 1;
5630         int width1 = floor_log2 (sig1) + 1;
5631         int low0 = floor_log2 (sig0 & -sig0);
5632         int low1 = floor_log2 (sig1 & -sig1);
5633         int op0_maybe_minusp = (sig0 & (1 << (mode_width - 1)));
5634         int op1_maybe_minusp = (sig1 & (1 << (mode_width - 1)));
5635         int result_width = mode_width;
5636         int result_low = 0;
5637
5638         switch (code)
5639           {
5640           case PLUS:
5641             result_width = MAX (width0, width1) + 1;
5642             result_low = MIN (low0, low1);
5643             break;
5644           case MINUS:
5645             result_low = MIN (low0, low1);
5646             break;
5647           case MULT:
5648             result_width = width0 + width1;
5649             result_low = low0 + low1;
5650             break;
5651           case DIV:
5652             if (! op0_maybe_minusp && ! op1_maybe_minusp)
5653               result_width = width0;
5654             break;
5655           case UDIV:
5656             result_width = width0;
5657             break;
5658           case MOD:
5659             if (! op0_maybe_minusp && ! op1_maybe_minusp)
5660               result_width = MIN (width0, width1);
5661             result_low = MIN (low0, low1);
5662             break;
5663           case UMOD:
5664             result_width = MIN (width0, width1);
5665             result_low = MIN (low0, low1);
5666             break;
5667           }
5668
5669         if (result_width < mode_width)
5670           significant &= ((HOST_WIDE_INT) 1 << result_width) - 1;
5671
5672         if (result_low > 0)
5673           significant &= ~ (((HOST_WIDE_INT) 1 << result_low) - 1);
5674       }
5675       break;
5676
5677     case ZERO_EXTRACT:
5678       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5679           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
5680         significant &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
5681       break;
5682
5683     case SUBREG:
5684       /* If the inner mode is a single word for both the host and target
5685          machines, we can compute this from which bits of the inner
5686          object are known significant.  */
5687       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
5688           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
5689               <= HOST_BITS_PER_WIDE_INT))
5690         {
5691           significant &= significant_bits (SUBREG_REG (x), mode);
5692 #ifndef BYTE_LOADS_ZERO_EXTEND
5693           /* On many CISC machines, accessing an object in a wider mode
5694              causes the high-order bits to become undefined.  So they are
5695              not known to be zero.  */
5696           if (GET_MODE_SIZE (GET_MODE (x))
5697               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
5698             significant |= (GET_MODE_MASK (GET_MODE (x))
5699                             & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
5700 #endif
5701         }
5702       break;
5703
5704     case ASHIFTRT:
5705     case LSHIFTRT:
5706     case ASHIFT:
5707     case LSHIFT:
5708     case ROTATE:
5709       /* The significant bits are in two classes: any bits within MODE
5710          that aren't in GET_MODE (x) are always significant.  The rest of the
5711          significant bits are those that are significant in the operand of
5712          the shift when shifted the appropriate number of bits.  This
5713          shows that high-order bits are cleared by the right shift and
5714          low-order bits by left shifts.  */
5715       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5716           && INTVAL (XEXP (x, 1)) >= 0
5717           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
5718         {
5719           enum machine_mode inner_mode = GET_MODE (x);
5720           int width = GET_MODE_BITSIZE (inner_mode);
5721           int count = INTVAL (XEXP (x, 1));
5722           unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
5723           unsigned HOST_WIDE_INT op_significant
5724             = significant_bits (XEXP (x, 0), mode);
5725           unsigned HOST_WIDE_INT inner = op_significant & mode_mask;
5726           unsigned HOST_WIDE_INT outer = 0;
5727
5728           if (mode_width > width)
5729             outer = (op_significant & significant & ~ mode_mask);
5730
5731           if (code == LSHIFTRT)
5732             inner >>= count;
5733           else if (code == ASHIFTRT)
5734             {
5735               inner >>= count;
5736
5737               /* If the sign bit was significant at before the shift, we
5738                  need to mark all the places it could have been copied to
5739                  by the shift significant.  */
5740               if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
5741                 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
5742             }
5743           else if (code == LSHIFT || code == ASHIFT)
5744             inner <<= count;
5745           else
5746             inner = ((inner << (count % width)
5747                       | (inner >> (width - (count % width)))) & mode_mask);
5748
5749           significant &= (outer | inner);
5750         }
5751       break;
5752
5753     case FFS:
5754       /* This is at most the number of bits in the mode.  */
5755       significant = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1;
5756       break;
5757
5758     case IF_THEN_ELSE:
5759       significant &= (significant_bits (XEXP (x, 1), mode)
5760                       | significant_bits (XEXP (x, 2), mode));
5761       break;
5762     }
5763
5764   return significant;
5765 }
5766 \f
5767 /* Return the number of bits at the high-order end of X that are known to
5768    be equal to the sign bit.  This number will always be between 1 and
5769    the number of bits in the mode of X.  MODE is the mode to be used
5770    if X is VOIDmode.  */
5771
5772 static int
5773 num_sign_bit_copies (x, mode)
5774      rtx x;
5775      enum machine_mode mode;
5776 {
5777   enum rtx_code code = GET_CODE (x);
5778   int bitwidth;
5779   int num0, num1, result;
5780   unsigned HOST_WIDE_INT sig;
5781   rtx tem;
5782
5783   /* If we weren't given a mode, use the mode of X.  If the mode is still
5784      VOIDmode, we don't know anything.  */
5785
5786   if (mode == VOIDmode)
5787     mode = GET_MODE (x);
5788
5789   if (mode == VOIDmode)
5790     return 0;
5791
5792   bitwidth = GET_MODE_BITSIZE (mode);
5793
5794   switch (code)
5795     {
5796     case REG:
5797       if (significant_valid && reg_sign_bit_copies[REGNO (x)] != 0)
5798         return reg_sign_bit_copies[REGNO (x)];
5799
5800       tem =  get_last_value (x);
5801       if (tem != 0)
5802         return num_sign_bit_copies (tem, mode);
5803       break;
5804
5805     case CONST_INT:
5806       /* If the constant is negative, take its 1's complement and remask.
5807          Then see how many zero bits we have.  */
5808       sig = INTVAL (x) & GET_MODE_MASK (mode);
5809       if (sig & ((HOST_WIDE_INT) 1 << (bitwidth - 1)))
5810         sig = (~ sig) & GET_MODE_MASK (mode);
5811
5812       return (sig == 0 ? bitwidth : bitwidth - floor_log2 (sig) - 1);
5813
5814     case SUBREG:
5815       /* For a smaller object, just ignore the high bits. */
5816       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
5817         {
5818           num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode);
5819           return MAX (1, (num0
5820                           - (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
5821                              - bitwidth)));
5822         }
5823       break;
5824
5825     case SIGN_EXTRACT:
5826       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
5827         return MAX (1, bitwidth - INTVAL (XEXP (x, 1)));
5828       break;
5829
5830     case SIGN_EXTEND: 
5831       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5832               + num_sign_bit_copies (XEXP (x, 0), VOIDmode));
5833
5834     case TRUNCATE:
5835       /* For a smaller object, just ignore the high bits. */
5836       num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode);
5837       return MAX (1, (num0 - (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5838                               - bitwidth)));
5839
5840     case NOT:
5841       return num_sign_bit_copies (XEXP (x, 0), mode);
5842
5843     case ROTATE:       case ROTATERT:
5844       /* If we are rotating left by a number of bits less than the number
5845          of sign bit copies, we can just subtract that amount from the
5846          number.  */
5847       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5848           && INTVAL (XEXP (x, 1)) >= 0 && INTVAL (XEXP (x, 1)) < bitwidth)
5849         {
5850           num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5851           return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
5852                                  : bitwidth - INTVAL (XEXP (x, 1))));
5853         }
5854       break;
5855
5856     case NEG:
5857       /* In general, this subtracts one sign bit copy.  But if the value
5858          is known to be positive, the number of sign bit copies is the
5859          same as that of the input.  Finally, if the input has just one
5860          significant bit, all the bits are copies of the sign bit.  */
5861       sig = significant_bits (XEXP (x, 0), mode);
5862       if (sig == 1)
5863         return bitwidth;
5864
5865       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5866       if (num0 > 1
5867           && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & sig))
5868         num0--;
5869
5870       return num0;
5871
5872     case IOR:   case AND:   case XOR:
5873     case SMIN:  case SMAX:  case UMIN:  case UMAX:
5874       /* Logical operations will preserve the number of sign-bit copies.
5875          MIN and MAX operations always return one of the operands.  */
5876       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5877       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
5878       return MIN (num0, num1);
5879
5880     case PLUS:  case MINUS:
5881       /* For addition and subtraction, we can have a 1-bit carry.  However,
5882          if we are subtracting 1 from a positive number, there will not
5883          be such a carry.  Furthermore, if the positive number is known to
5884          be 0 or 1, we know the result is either -1 or 0.  */
5885
5886       if (code == PLUS && XEXP (x, 1) == constm1_rtx)
5887         {
5888           sig = significant_bits (XEXP (x, 0), mode);
5889           if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & sig) == 0)
5890             return (sig == 1 || sig == 0 ? bitwidth
5891                     : bitwidth - floor_log2 (sig));
5892         }
5893
5894       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5895       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
5896       return MAX (1, MIN (num0, num1) - 1);
5897       
5898     case MULT:
5899       /* The number of bits of the product is the sum of the number of
5900          bits of both terms.  However, unless one of the terms if known
5901          to be positive, we must allow for an additional bit since negating
5902          a negative number can remove one sign bit copy.  */
5903
5904       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5905       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
5906
5907       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
5908       if (result > 0
5909           && ((significant_bits (XEXP (x, 0), mode)
5910                & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
5911           && (significant_bits (XEXP (x, 1), mode)
5912               & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) != 0))
5913         result--;
5914
5915       return MAX (1, result);
5916
5917     case UDIV:
5918       /* The result must be <= the first operand.  */
5919       return num_sign_bit_copies (XEXP (x, 0), mode);
5920
5921     case UMOD:
5922       /* The result must be <= the scond operand.  */
5923       return num_sign_bit_copies (XEXP (x, 1), mode);
5924
5925     case DIV:
5926       /* Similar to unsigned division, except that we have to worry about
5927          the case where the divisor is negative, in which case we have
5928          to add 1.  */
5929       result = num_sign_bit_copies (XEXP (x, 0), mode);
5930       if (result > 1
5931           && (significant_bits (XEXP (x, 1), mode)
5932               & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
5933         result --;
5934
5935       return result;
5936
5937     case MOD:
5938       result = num_sign_bit_copies (XEXP (x, 1), mode);
5939       if (result > 1
5940           && (significant_bits (XEXP (x, 1), mode)
5941               & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
5942         result --;
5943
5944       return result;
5945
5946     case ASHIFTRT:
5947       /* Shifts by a constant add to the number of bits equal to the
5948          sign bit.  */
5949       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5950       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5951           && INTVAL (XEXP (x, 1)) > 0)
5952         num0 = MIN (bitwidth, num0 + INTVAL (XEXP (x, 1)));
5953
5954       return num0;
5955
5956     case ASHIFT:
5957     case LSHIFT:
5958       /* Left shifts destroy copies.  */
5959       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5960           || INTVAL (XEXP (x, 1)) < 0
5961           || INTVAL (XEXP (x, 1)) >= bitwidth)
5962         return 1;
5963
5964       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
5965       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
5966
5967     case IF_THEN_ELSE:
5968       num0 = num_sign_bit_copies (XEXP (x, 1), mode);
5969       num1 = num_sign_bit_copies (XEXP (x, 2), mode);
5970       return MIN (num0, num1);
5971
5972 #if STORE_FLAG_VALUE == -1
5973     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
5974     case GEU: case GTU: case LEU: case LTU:
5975       return bitwidth;
5976 #endif
5977     }
5978
5979   /* If we haven't been able to figure it out by one of the above rules,
5980      see if some of the high-order bits are known to be zero.  If so,
5981      count those bits and return one less than that amount.  */
5982
5983   sig = significant_bits (x, mode);
5984   return sig == GET_MODE_MASK (mode) ? 1 : bitwidth - floor_log2 (sig) - 1;
5985 }
5986 \f
5987 /* This function is called from `simplify_shift_const' to merge two
5988    outer operations.  Specifically, we have already found that we need
5989    to perform operation *POP0 with constant *PCONST0 at the outermost
5990    position.  We would now like to also perform OP1 with constant CONST1
5991    (with *POP0 being done last).
5992
5993    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
5994    the resulting operation.  *PCOMP_P is set to 1 if we would need to 
5995    complement the innermost operand, otherwise it is unchanged.
5996
5997    MODE is the mode in which the operation will be done.  No bits outside
5998    the width of this mode matter.  It is assumed that the width of this mode
5999    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
6000
6001    If *POP0 or OP1 are NIL, it means no operation is required.  Only NEG, PLUS,
6002    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
6003    result is simply *PCONST0.
6004
6005    If the resulting operation cannot be expressed as one operation, we
6006    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
6007
6008 static int
6009 merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
6010      enum rtx_code *pop0;
6011      HOST_WIDE_INT *pconst0;
6012      enum rtx_code op1;
6013      HOST_WIDE_INT const1;
6014      enum machine_mode mode;
6015      int *pcomp_p;
6016 {
6017   enum rtx_code op0 = *pop0;
6018   HOST_WIDE_INT const0 = *pconst0;
6019
6020   const0 &= GET_MODE_MASK (mode);
6021   const1 &= GET_MODE_MASK (mode);
6022
6023   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
6024   if (op0 == AND)
6025     const1 &= const0;
6026
6027   /* If OP0 or OP1 is NIL, this is easy.  Similarly if they are the same or
6028      if OP0 is SET.  */
6029
6030   if (op1 == NIL || op0 == SET)
6031     return 1;
6032
6033   else if (op0 == NIL)
6034     op0 = op1, const0 = const1;
6035
6036   else if (op0 == op1)
6037     {
6038       switch (op0)
6039         {
6040         case AND:
6041           const0 &= const1;
6042           break;
6043         case IOR:
6044           const0 |= const1;
6045           break;
6046         case XOR:
6047           const0 ^= const1;
6048           break;
6049         case PLUS:
6050           const0 += const1;
6051           break;
6052         case NEG:
6053           op0 = NIL;
6054           break;
6055         }
6056     }
6057
6058   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
6059   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
6060     return 0;
6061
6062   /* If the two constants aren't the same, we can't do anything.  The
6063      remaining six cases can all be done.  */
6064   else if (const0 != const1)
6065     return 0;
6066
6067   else
6068     switch (op0)
6069       {
6070       case IOR:
6071         if (op1 == AND)
6072           /* (a & b) | b == b */
6073           op0 = SET;
6074         else /* op1 == XOR */
6075           /* (a ^ b) | b == a | b */
6076           ;
6077         break;
6078
6079       case XOR:
6080         if (op1 == AND)
6081           /* (a & b) ^ b == (~a) & b */
6082           op0 = AND, *pcomp_p = 1;
6083         else /* op1 == IOR */
6084           /* (a | b) ^ b == a & ~b */
6085           op0 = AND, *pconst0 = ~ const0;
6086         break;
6087
6088       case AND:
6089         if (op1 == IOR)
6090           /* (a | b) & b == b */
6091         op0 = SET;
6092         else /* op1 == XOR */
6093           /* (a ^ b) & b) == (~a) & b */
6094           *pcomp_p = 1;
6095         break;
6096       }
6097
6098   /* Check for NO-OP cases.  */
6099   const0 &= GET_MODE_MASK (mode);
6100   if (const0 == 0
6101       && (op0 == IOR || op0 == XOR || op0 == PLUS))
6102     op0 = NIL;
6103   else if (const0 == 0 && op0 == AND)
6104     op0 = SET;
6105   else if (const0 == GET_MODE_MASK (mode) && op0 == AND)
6106     op0 = NIL;
6107
6108   *pop0 = op0;
6109   *pconst0 = const0;
6110
6111   return 1;
6112 }
6113 \f
6114 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
6115    The result of the shift is RESULT_MODE.  X, if non-zero, is an expression
6116    that we started with.
6117
6118    The shift is normally computed in the widest mode we find in VAROP, as
6119    long as it isn't a different number of words than RESULT_MODE.  Exceptions
6120    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
6121
6122 static rtx
6123 simplify_shift_const (x, code, result_mode, varop, count)
6124      rtx x;
6125      enum rtx_code code;
6126      enum machine_mode result_mode;
6127      rtx varop;
6128      int count;
6129 {
6130   enum rtx_code orig_code = code;
6131   int orig_count = count;
6132   enum machine_mode mode = result_mode;
6133   enum machine_mode shift_mode, tmode;
6134   int mode_words
6135     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
6136   /* We form (outer_op (code varop count) (outer_const)).  */
6137   enum rtx_code outer_op = NIL;
6138   HOST_WIDE_INT outer_const;
6139   rtx const_rtx;
6140   int complement_p = 0;
6141   rtx new;
6142
6143   /* If we were given an invalid count, don't do anything except exactly
6144      what was requested.  */
6145
6146   if (count < 0 || count > GET_MODE_BITSIZE (mode))
6147     {
6148       if (x)
6149         return x;
6150
6151       return gen_rtx (code, mode, varop, GEN_INT (count));
6152     }
6153
6154   /* Unless one of the branches of the `if' in this loop does a `continue',
6155      we will `break' the loop after the `if'.  */
6156
6157   while (count != 0)
6158     {
6159       /* If we have an operand of (clobber (const_int 0)), just return that
6160          value.  */
6161       if (GET_CODE (varop) == CLOBBER)
6162         return varop;
6163
6164       /* If we discovered we had to complement VAROP, leave.  Making a NOT
6165          here would cause an infinite loop.  */
6166       if (complement_p)
6167         break;
6168
6169       /* Convert ROTATETRT to ROTATE.  */
6170       if (code == ROTATERT)
6171         code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
6172
6173       /* Canonicalize LSHIFT to ASHIFT.  */
6174       if (code == LSHIFT)
6175         code = ASHIFT;
6176
6177       /* We need to determine what mode we will do the shift in.  If the
6178          shift is a ASHIFTRT or ROTATE, we must always do it in the mode it
6179          was originally done in.  Otherwise, we can do it in MODE, the widest
6180          mode encountered. */
6181       shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode);
6182
6183       /* Handle cases where the count is greater than the size of the mode
6184          minus 1.  For ASHIFT, use the size minus one as the count (this can
6185          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
6186          take the count modulo the size.  For other shifts, the result is
6187          zero.
6188
6189          Since these shifts are being produced by the compiler by combining
6190          multiple operations, each of which are defined, we know what the
6191          result is supposed to be.  */
6192          
6193       if (count > GET_MODE_BITSIZE (shift_mode) - 1)
6194         {
6195           if (code == ASHIFTRT)
6196             count = GET_MODE_BITSIZE (shift_mode) - 1;
6197           else if (code == ROTATE || code == ROTATERT)
6198             count %= GET_MODE_BITSIZE (shift_mode);
6199           else
6200             {
6201               /* We can't simply return zero because there may be an
6202                  outer op.  */
6203               varop = const0_rtx;
6204               count = 0;
6205               break;
6206             }
6207         }
6208
6209       /* Negative counts are invalid and should not have been made (a
6210          programmer-specified negative count should have been handled
6211          above). */
6212       else if (count < 0)
6213         abort ();
6214
6215       /* An arithmetic right shift of a quantity known to be -1 or 0
6216          is a no-op.  */
6217       if (code == ASHIFTRT
6218           && (num_sign_bit_copies (varop, shift_mode)
6219               == GET_MODE_BITSIZE (shift_mode)))
6220         {
6221           count = 0;
6222           break;
6223         }
6224
6225       /* We simplify the tests below and elsewhere by converting
6226          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
6227          `make_compound_operation' will convert it to a ASHIFTRT for
6228          those machines (such as Vax) that don't have a LSHIFTRT.  */
6229       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
6230           && code == ASHIFTRT
6231           && ((significant_bits (varop, shift_mode)
6232                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
6233               == 0))
6234         code = LSHIFTRT;
6235
6236       switch (GET_CODE (varop))
6237         {
6238         case SIGN_EXTEND:
6239         case ZERO_EXTEND:
6240         case SIGN_EXTRACT:
6241         case ZERO_EXTRACT:
6242           new = expand_compound_operation (varop);
6243           if (new != varop)
6244             {
6245               varop = new;
6246               continue;
6247             }
6248           break;
6249
6250         case MEM:
6251           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
6252              minus the width of a smaller mode, we can do this with a
6253              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
6254           if ((code == ASHIFTRT || code == LSHIFTRT)
6255               && ! mode_dependent_address_p (XEXP (varop, 0))
6256               && ! MEM_VOLATILE_P (varop)
6257               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
6258                                          MODE_INT, 1)) != BLKmode)
6259             {
6260 #if BYTES_BIG_ENDIAN
6261               new = gen_rtx (MEM, tmode, XEXP (varop, 0));
6262 #else
6263               new = gen_rtx (MEM, tmode,
6264                              plus_constant (XEXP (varop, 0),
6265                                             count / BITS_PER_UNIT));
6266               RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (varop);
6267               MEM_VOLATILE_P (new) = MEM_VOLATILE_P (varop);
6268               MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (varop);
6269 #endif
6270               varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
6271                                        : ZERO_EXTEND, mode, new);
6272               count = 0;
6273               continue;
6274             }
6275           break;
6276
6277         case USE:
6278           /* Similar to the case above, except that we can only do this if
6279              the resulting mode is the same as that of the underlying
6280              MEM and adjust the address depending on the *bits* endianness
6281              because of the way that bit-field extract insns are defined.  */
6282           if ((code == ASHIFTRT || code == LSHIFTRT)
6283               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
6284                                          MODE_INT, 1)) != BLKmode
6285               && tmode == GET_MODE (XEXP (varop, 0)))
6286             {
6287 #if BITS_BIG_ENDIAN
6288               new = XEXP (varop, 0);
6289 #else
6290               new = copy_rtx (XEXP (varop, 0));
6291               SUBST (XEXP (new, 0), 
6292                      plus_constant (XEXP (new, 0),
6293                                     count / BITS_PER_UNIT));
6294 #endif
6295
6296               varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
6297                                        : ZERO_EXTEND, mode, new);
6298               count = 0;
6299               continue;
6300             }
6301           break;
6302
6303         case SUBREG:
6304           /* If VAROP is a SUBREG, strip it as long as the inner operand has
6305              the same number of words as what we've seen so far.  Then store
6306              the widest mode in MODE.  */
6307           if (SUBREG_WORD (varop) == 0
6308               && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
6309                     + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
6310                   == mode_words))
6311             {
6312               varop = SUBREG_REG (varop);
6313               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
6314                 mode = GET_MODE (varop);
6315               continue;
6316             }
6317           break;
6318
6319         case MULT:
6320           /* Some machines use MULT instead of ASHIFT because MULT
6321              is cheaper.  But it is still better on those machines to
6322              merge two shifts into one.  */
6323           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
6324               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
6325             {
6326               varop = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
6327                                   GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));;
6328               continue;
6329             }
6330           break;
6331
6332         case UDIV:
6333           /* Similar, for when divides are cheaper.  */
6334           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
6335               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
6336             {
6337               varop = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
6338                                   GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
6339               continue;
6340             }
6341           break;
6342
6343         case ASHIFTRT:
6344           /* If we are extracting just the sign bit of an arithmetic right 
6345              shift, that shift is not needed.  */
6346           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1)
6347             {
6348               varop = XEXP (varop, 0);
6349               continue;
6350             }
6351
6352           /* ... fall through ... */
6353
6354         case LSHIFTRT:
6355         case ASHIFT:
6356         case LSHIFT:
6357         case ROTATE:
6358           /* Here we have two nested shifts.  The result is usually the
6359              AND of a new shift with a mask.  We compute the result below.  */
6360           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
6361               && INTVAL (XEXP (varop, 1)) >= 0
6362               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
6363               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
6364               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
6365             {
6366               enum rtx_code first_code = GET_CODE (varop);
6367               int first_count = INTVAL (XEXP (varop, 1));
6368               unsigned HOST_WIDE_INT mask;
6369               rtx mask_rtx;
6370               rtx inner;
6371
6372               if (first_code == LSHIFT)
6373                 first_code = ASHIFT;
6374
6375               /* We have one common special case.  We can't do any merging if
6376                  the inner code is an ASHIFTRT of a smaller mode.  However, if
6377                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
6378                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
6379                  we can convert it to
6380                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
6381                  This simplifies certain SIGN_EXTEND operations.  */
6382               if (code == ASHIFT && first_code == ASHIFTRT
6383                   && (GET_MODE_BITSIZE (result_mode)
6384                       - GET_MODE_BITSIZE (GET_MODE (varop))) == count)
6385                 {
6386                   /* C3 has the low-order C1 bits zero.  */
6387                   
6388                   mask = (GET_MODE_MASK (mode)
6389                           & ~ (((HOST_WIDE_INT) 1 << first_count) - 1));
6390
6391                   varop = simplify_and_const_int (NULL_RTX, result_mode,
6392                                                   XEXP (varop, 0), mask);
6393                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
6394                                                 varop, count);
6395                   count = first_count;
6396                   code = ASHIFTRT;
6397                   continue;
6398                 }
6399               
6400               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
6401                  than C1 high-order bits equal to the sign bit, we can convert
6402                  this to either an ASHIFT or a ASHIFTRT depending on the
6403                  two counts. 
6404
6405                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
6406
6407               if (code == ASHIFTRT && first_code == ASHIFT
6408                   && GET_MODE (varop) == shift_mode
6409                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
6410                       > first_count))
6411                 {
6412                   count -= first_count;
6413                   if (count < 0)
6414                     count = - count, code = ASHIFT;
6415                   varop = XEXP (varop, 0);
6416                   continue;
6417                 }
6418
6419               /* There are some cases we can't do.  If CODE is ASHIFTRT,
6420                  we can only do this if FIRST_CODE is also ASHIFTRT.
6421
6422                  We can't do the case when CODE is ROTATE and FIRST_CODE is
6423                  ASHIFTRT.
6424
6425                  If the mode of this shift is not the mode of the outer shift,
6426                  we can't do this if either shift is ASHIFTRT or ROTATE.
6427
6428                  Finally, we can't do any of these if the mode is too wide
6429                  unless the codes are the same.
6430
6431                  Handle the case where the shift codes are the same
6432                  first.  */
6433
6434               if (code == first_code)
6435                 {
6436                   if (GET_MODE (varop) != result_mode
6437                       && (code == ASHIFTRT || code == ROTATE))
6438                     break;
6439
6440                   count += first_count;
6441                   varop = XEXP (varop, 0);
6442                   continue;
6443                 }
6444
6445               if (code == ASHIFTRT
6446                   || (code == ROTATE && first_code == ASHIFTRT)
6447                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
6448                   || (GET_MODE (varop) != result_mode
6449                       && (first_code == ASHIFTRT || first_code == ROTATE
6450                           || code == ROTATE)))
6451                 break;
6452
6453               /* To compute the mask to apply after the shift, shift the
6454                  significant bits of the inner shift the same way the 
6455                  outer shift will.  */
6456
6457               mask_rtx = GEN_INT (significant_bits (varop, GET_MODE (varop)));
6458
6459               mask_rtx
6460                 = simplify_binary_operation (code, result_mode, mask_rtx,
6461                                              GEN_INT (count));
6462                                   
6463               /* Give up if we can't compute an outer operation to use.  */
6464               if (mask_rtx == 0
6465                   || GET_CODE (mask_rtx) != CONST_INT
6466                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
6467                                         INTVAL (mask_rtx),
6468                                         result_mode, &complement_p))
6469                 break;
6470
6471               /* If the shifts are in the same direction, we add the
6472                  counts.  Otherwise, we subtract them.  */
6473               if ((code == ASHIFTRT || code == LSHIFTRT)
6474                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
6475                 count += first_count;
6476               else
6477                 count -= first_count;
6478
6479               /* If COUNT is positive, the new shift is usually CODE, 
6480                  except for the two exceptions below, in which case it is
6481                  FIRST_CODE.  If the count is negative, FIRST_CODE should
6482                  always be used  */
6483               if (count > 0
6484                   && ((first_code == ROTATE && code == ASHIFT)
6485                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
6486                 code = first_code;
6487               else if (count < 0)
6488                 code = first_code, count = - count;
6489
6490               varop = XEXP (varop, 0);
6491               continue;
6492             }
6493
6494           /* If we have (A << B << C) for any shift, we can convert this to
6495              (A << C << B).  This wins if A is a constant.  Only try this if
6496              B is not a constant.  */
6497
6498           else if (GET_CODE (varop) == code
6499                    && GET_CODE (XEXP (varop, 1)) != CONST_INT
6500                    && 0 != (new
6501                             = simplify_binary_operation (code, mode,
6502                                                          XEXP (varop, 0),
6503                                                          GEN_INT (count))))
6504             {
6505               varop = gen_rtx_combine (code, mode, new, XEXP (varop, 1));
6506               count = 0;
6507               continue;
6508             }
6509           break;
6510
6511         case NOT:
6512           /* Make this fit the case below.  */
6513           varop = gen_rtx_combine (XOR, mode, XEXP (varop, 0),
6514                                    GEN_INT (GET_MODE_MASK (mode)));
6515           continue;
6516
6517         case IOR:
6518         case AND:
6519         case XOR:
6520           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
6521              with C the size of VAROP - 1 and the shift is logical if
6522              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
6523              we have an (le X 0) operation.   If we have an arithmetic shift
6524              and STORE_FLAG_VALUE is 1 or we have a logical shift with
6525              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
6526
6527           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
6528               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
6529               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6530               && (code == LSHIFTRT || code == ASHIFTRT)
6531               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
6532               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
6533             {
6534               count = 0;
6535               varop = gen_rtx_combine (LE, GET_MODE (varop), XEXP (varop, 1),
6536                                        const0_rtx);
6537
6538               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
6539                 varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
6540
6541               continue;
6542             }
6543
6544           /* If we have (shift (logical)), move the logical to the outside
6545              to allow it to possibly combine with another logical and the
6546              shift to combine with another shift.  This also canonicalizes to
6547              what a ZERO_EXTRACT looks like.  Also, some machines have
6548              (and (shift)) insns.  */
6549
6550           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
6551               && (new = simplify_binary_operation (code, result_mode,
6552                                                    XEXP (varop, 1),
6553                                                    GEN_INT (count))) != 0
6554               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
6555                                   INTVAL (new), result_mode, &complement_p))
6556             {
6557               varop = XEXP (varop, 0);
6558               continue;
6559             }
6560
6561           /* If we can't do that, try to simplify the shift in each arm of the
6562              logical expression, make a new logical expression, and apply
6563              the inverse distributive law.  */
6564           {
6565             rtx lhs = simplify_shift_const (NULL_RTX, code, result_mode,
6566                                             XEXP (varop, 0), count);
6567             rtx rhs = simplify_shift_const (NULL_RTX, code, result_mode,
6568                                             XEXP (varop, 1), count);
6569
6570             varop = gen_binary (GET_CODE (varop), result_mode, lhs, rhs);
6571             varop = apply_distributive_law (varop);
6572
6573             count = 0;
6574           }
6575           break;
6576
6577         case EQ:
6578           /* convert (lshift (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
6579              says that the sign bit can be tested, FOO has mode MODE, C is
6580              GET_MODE_BITSIZE (MODE) - 1, and FOO has only the low-order bit
6581              significant.  */
6582           if (code == LSHIFT
6583               && XEXP (varop, 1) == const0_rtx
6584               && GET_MODE (XEXP (varop, 0)) == result_mode
6585               && count == GET_MODE_BITSIZE (result_mode) - 1
6586               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
6587               && ((STORE_FLAG_VALUE
6588                    & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1))))
6589               && significant_bits (XEXP (varop, 0), result_mode) == 1
6590               && merge_outer_ops (&outer_op, &outer_const, XOR,
6591                                   (HOST_WIDE_INT) 1, result_mode,
6592                                   &complement_p))
6593             {
6594               varop = XEXP (varop, 0);
6595               count = 0;
6596               continue;
6597             }
6598           break;
6599
6600         case NEG:
6601           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
6602              than the number of bits in the mode is equivalent to A.  */
6603           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
6604               && significant_bits (XEXP (varop, 0), result_mode) == 1)
6605             {
6606               varop = XEXP (varop, 0);
6607               count = 0;
6608               continue;
6609             }
6610
6611           /* NEG commutes with ASHIFT since it is multiplication.  Move the
6612              NEG outside to allow shifts to combine.  */
6613           if (code == ASHIFT
6614               && merge_outer_ops (&outer_op, &outer_const, NEG,
6615                                   (HOST_WIDE_INT) 0, result_mode,
6616                                   &complement_p))
6617             {
6618               varop = XEXP (varop, 0);
6619               continue;
6620             }
6621           break;
6622
6623         case PLUS:
6624           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
6625              is one less than the number of bits in the mode is
6626              equivalent to (xor A 1).  */
6627           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
6628               && XEXP (varop, 1) == constm1_rtx
6629               && significant_bits (XEXP (varop, 0), result_mode) == 1
6630               && merge_outer_ops (&outer_op, &outer_const, XOR,
6631                                   (HOST_WIDE_INT) 1, result_mode,
6632                                   &complement_p))
6633             {
6634               count = 0;
6635               varop = XEXP (varop, 0);
6636               continue;
6637             }
6638
6639           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
6640              significant in BAR are those being shifted out and those
6641              bits are known zero in FOO, we can replace the PLUS with FOO.
6642              Similarly in the other operand order.  This code occurs when
6643              we are computing the size of a variable-size array.  */
6644
6645           if ((code == ASHIFTRT || code == LSHIFTRT)
6646               && count < HOST_BITS_PER_WIDE_INT
6647               && significant_bits (XEXP (varop, 1), result_mode) >> count == 0
6648               && (significant_bits (XEXP (varop, 1), result_mode)
6649                   & significant_bits (XEXP (varop, 0), result_mode)) == 0)
6650             {
6651               varop = XEXP (varop, 0);
6652               continue;
6653             }
6654           else if ((code == ASHIFTRT || code == LSHIFTRT)
6655                    && count < HOST_BITS_PER_WIDE_INT
6656                    && 0 == (significant_bits (XEXP (varop, 0), result_mode)
6657                             >> count)
6658                    && 0 == (significant_bits (XEXP (varop, 0), result_mode)
6659                             & significant_bits (XEXP (varop, 1),
6660                                                  result_mode)))
6661             {
6662               varop = XEXP (varop, 1);
6663               continue;
6664             }
6665
6666           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
6667           if (code == ASHIFT
6668               && GET_CODE (XEXP (varop, 1)) == CONST_INT
6669               && (new = simplify_binary_operation (ASHIFT, result_mode,
6670                                                    XEXP (varop, 1),
6671                                                    GEN_INT (count))) != 0
6672               && merge_outer_ops (&outer_op, &outer_const, PLUS,
6673                                   INTVAL (new), result_mode, &complement_p))
6674             {
6675               varop = XEXP (varop, 0);
6676               continue;
6677             }
6678           break;
6679
6680         case MINUS:
6681           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
6682              with C the size of VAROP - 1 and the shift is logical if
6683              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
6684              we have a (gt X 0) operation.  If the shift is arithmetic with
6685              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
6686              we have a (neg (gt X 0)) operation.  */
6687
6688           if (GET_CODE (XEXP (varop, 0)) == ASHIFTRT
6689               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
6690               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6691               && (code == LSHIFTRT || code == ASHIFTRT)
6692               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
6693               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
6694               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
6695             {
6696               count = 0;
6697               varop = gen_rtx_combine (GT, GET_MODE (varop), XEXP (varop, 1),
6698                                        const0_rtx);
6699
6700               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
6701                 varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
6702
6703               continue;
6704             }
6705           break;
6706         }
6707
6708       break;
6709     }
6710
6711   /* We need to determine what mode to do the shift in.  If the shift is
6712      a ASHIFTRT or ROTATE, we must always do it in the mode it was originally
6713      done in.  Otherwise, we can do it in MODE, the widest mode encountered.
6714      The code we care about is that of the shift that will actually be done,
6715      not the shift that was originally requested.  */
6716   shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode);
6717
6718   /* We have now finished analyzing the shift.  The result should be
6719      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
6720      OUTER_OP is non-NIL, it is an operation that needs to be applied
6721      to the result of the shift.  OUTER_CONST is the relevant constant,
6722      but we must turn off all bits turned off in the shift.
6723
6724      If we were passed a value for X, see if we can use any pieces of
6725      it.  If not, make new rtx.  */
6726
6727   if (x && GET_RTX_CLASS (GET_CODE (x)) == '2'
6728       && GET_CODE (XEXP (x, 1)) == CONST_INT
6729       && INTVAL (XEXP (x, 1)) == count)
6730     const_rtx = XEXP (x, 1);
6731   else
6732     const_rtx = GEN_INT (count);
6733
6734   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
6735       && GET_MODE (XEXP (x, 0)) == shift_mode
6736       && SUBREG_REG (XEXP (x, 0)) == varop)
6737     varop = XEXP (x, 0);
6738   else if (GET_MODE (varop) != shift_mode)
6739     varop = gen_lowpart_for_combine (shift_mode, varop);
6740
6741   /* If we can't make the SUBREG, try to return what we were given. */
6742   if (GET_CODE (varop) == CLOBBER)
6743     return x ? x : varop;
6744
6745   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
6746   if (new != 0)
6747     x = new;
6748   else
6749     {
6750       if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode)
6751         x = gen_rtx_combine (code, shift_mode, varop, const_rtx);
6752
6753       SUBST (XEXP (x, 0), varop);
6754       SUBST (XEXP (x, 1), const_rtx);
6755     }
6756
6757   /* If we were doing a LSHIFTRT in a wider mode than it was originally,
6758      turn off all the bits that the shift would have turned off.  */
6759   if (orig_code == LSHIFTRT && result_mode != shift_mode)
6760     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
6761                                 GET_MODE_MASK (result_mode) >> orig_count);
6762       
6763   /* Do the remainder of the processing in RESULT_MODE.  */
6764   x = gen_lowpart_for_combine (result_mode, x);
6765
6766   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
6767      operation.  */
6768   if (complement_p)
6769     x = gen_unary (NOT, result_mode, x);
6770
6771   if (outer_op != NIL)
6772     {
6773       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
6774         outer_const &= GET_MODE_MASK (result_mode);
6775
6776       if (outer_op == AND)
6777         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
6778       else if (outer_op == SET)
6779         /* This means that we have determined that the result is
6780            equivalent to a constant.  This should be rare.  */
6781         x = GEN_INT (outer_const);
6782       else if (GET_RTX_CLASS (outer_op) == '1')
6783         x = gen_unary (outer_op, result_mode, x);
6784       else
6785         x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
6786     }
6787
6788   return x;
6789 }  
6790 \f
6791 /* Like recog, but we receive the address of a pointer to a new pattern.
6792    We try to match the rtx that the pointer points to.
6793    If that fails, we may try to modify or replace the pattern,
6794    storing the replacement into the same pointer object.
6795
6796    Modifications include deletion or addition of CLOBBERs.
6797
6798    PNOTES is a pointer to a location where any REG_UNUSED notes added for
6799    the CLOBBERs are placed.
6800
6801    The value is the final insn code from the pattern ultimately matched,
6802    or -1.  */
6803
6804 static int
6805 recog_for_combine (pnewpat, insn, pnotes)
6806      rtx *pnewpat;
6807      rtx insn;
6808      rtx *pnotes;
6809 {
6810   register rtx pat = *pnewpat;
6811   int insn_code_number;
6812   int num_clobbers_to_add = 0;
6813   int i;
6814   rtx notes = 0;
6815
6816   /* Is the result of combination a valid instruction?  */
6817   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
6818
6819   /* If it isn't, there is the possibility that we previously had an insn
6820      that clobbered some register as a side effect, but the combined
6821      insn doesn't need to do that.  So try once more without the clobbers
6822      unless this represents an ASM insn.  */
6823
6824   if (insn_code_number < 0 && ! check_asm_operands (pat)
6825       && GET_CODE (pat) == PARALLEL)
6826     {
6827       int pos;
6828
6829       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
6830         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
6831           {
6832             if (i != pos)
6833               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
6834             pos++;
6835           }
6836
6837       SUBST_INT (XVECLEN (pat, 0), pos);
6838
6839       if (pos == 1)
6840         pat = XVECEXP (pat, 0, 0);
6841
6842       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
6843     }
6844
6845   /* If we had any clobbers to add, make a new pattern than contains
6846      them.  Then check to make sure that all of them are dead.  */
6847   if (num_clobbers_to_add)
6848     {
6849       rtx newpat = gen_rtx (PARALLEL, VOIDmode,
6850                             gen_rtvec (GET_CODE (pat) == PARALLEL
6851                                        ? XVECLEN (pat, 0) + num_clobbers_to_add
6852                                        : num_clobbers_to_add + 1));
6853
6854       if (GET_CODE (pat) == PARALLEL)
6855         for (i = 0; i < XVECLEN (pat, 0); i++)
6856           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
6857       else
6858         XVECEXP (newpat, 0, 0) = pat;
6859
6860       add_clobbers (newpat, insn_code_number);
6861
6862       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
6863            i < XVECLEN (newpat, 0); i++)
6864         {
6865           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
6866               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
6867             return -1;
6868           notes = gen_rtx (EXPR_LIST, REG_UNUSED,
6869                            XEXP (XVECEXP (newpat, 0, i), 0), notes);
6870         }
6871       pat = newpat;
6872     }
6873
6874   *pnewpat = pat;
6875   *pnotes = notes;
6876
6877   return insn_code_number;
6878 }
6879 \f
6880 /* Like gen_lowpart but for use by combine.  In combine it is not possible
6881    to create any new pseudoregs.  However, it is safe to create
6882    invalid memory addresses, because combine will try to recognize
6883    them and all they will do is make the combine attempt fail.
6884
6885    If for some reason this cannot do its job, an rtx
6886    (clobber (const_int 0)) is returned.
6887    An insn containing that will not be recognized.  */
6888
6889 #undef gen_lowpart
6890
6891 static rtx
6892 gen_lowpart_for_combine (mode, x)
6893      enum machine_mode mode;
6894      register rtx x;
6895 {
6896   rtx result;
6897
6898   if (GET_MODE (x) == mode)
6899     return x;
6900
6901   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
6902     return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
6903
6904   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
6905      won't know what to do.  So we will strip off the SUBREG here and
6906      process normally.  */
6907   if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
6908     {
6909       x = SUBREG_REG (x);
6910       if (GET_MODE (x) == mode)
6911         return x;
6912     }
6913
6914   result = gen_lowpart_common (mode, x);
6915   if (result)
6916     return result;
6917
6918   if (GET_CODE (x) == MEM)
6919     {
6920       register int offset = 0;
6921       rtx new;
6922
6923       /* Refuse to work on a volatile memory ref or one with a mode-dependent
6924          address.  */
6925       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
6926         return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
6927
6928       /* If we want to refer to something bigger than the original memref,
6929          generate a perverse subreg instead.  That will force a reload
6930          of the original memref X.  */
6931       if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
6932         return gen_rtx (SUBREG, mode, x, 0);
6933
6934 #if WORDS_BIG_ENDIAN
6935       offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
6936                 - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
6937 #endif
6938 #if BYTES_BIG_ENDIAN
6939       /* Adjust the address so that the address-after-the-data
6940          is unchanged.  */
6941       offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
6942                  - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
6943 #endif
6944       new = gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), offset));
6945       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
6946       MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x);
6947       MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x);
6948       return new;
6949     }
6950
6951   /* If X is a comparison operator, rewrite it in a new mode.  This
6952      probably won't match, but may allow further simplifications.  */
6953   else if (GET_RTX_CLASS (GET_CODE (x)) == '<')
6954     return gen_rtx_combine (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
6955
6956   /* If we couldn't simplify X any other way, just enclose it in a
6957      SUBREG.  Normally, this SUBREG won't match, but some patterns may
6958      include an explicit SUBREG or we may simplify it further in combine.  */
6959   else
6960     {
6961       int word = 0;
6962
6963       if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
6964         word = ((GET_MODE_SIZE (GET_MODE (x))
6965                  - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
6966                 / UNITS_PER_WORD);
6967       return gen_rtx (SUBREG, mode, x, word);
6968     }
6969 }
6970 \f
6971 /* Make an rtx expression.  This is a subset of gen_rtx and only supports
6972    expressions of 1, 2, or 3 operands, each of which are rtx expressions.
6973
6974    If the identical expression was previously in the insn (in the undobuf),
6975    it will be returned.  Only if it is not found will a new expression
6976    be made.  */
6977
6978 /*VARARGS2*/
6979 static rtx
6980 gen_rtx_combine (va_alist)
6981      va_dcl
6982 {
6983   va_list p;
6984   enum rtx_code code;
6985   enum machine_mode mode;
6986   int n_args;
6987   rtx args[3];
6988   int i, j;
6989   char *fmt;
6990   rtx rt;
6991
6992   va_start (p);
6993   code = va_arg (p, enum rtx_code);
6994   mode = va_arg (p, enum machine_mode);
6995   n_args = GET_RTX_LENGTH (code);
6996   fmt = GET_RTX_FORMAT (code);
6997
6998   if (n_args == 0 || n_args > 3)
6999     abort ();
7000
7001   /* Get each arg and verify that it is supposed to be an expression.  */
7002   for (j = 0; j < n_args; j++)
7003     {
7004       if (*fmt++ != 'e')
7005         abort ();
7006
7007       args[j] = va_arg (p, rtx);
7008     }
7009
7010   /* See if this is in undobuf.  Be sure we don't use objects that came
7011      from another insn; this could produce circular rtl structures.  */
7012
7013   for (i = previous_num_undos; i < undobuf.num_undo; i++)
7014     if (!undobuf.undo[i].is_int
7015         && GET_CODE (undobuf.undo[i].old_contents.rtx) == code
7016         && GET_MODE (undobuf.undo[i].old_contents.rtx) == mode)
7017       {
7018         for (j = 0; j < n_args; j++)
7019           if (XEXP (undobuf.undo[i].old_contents.rtx, j) != args[j])
7020             break;
7021
7022         if (j == n_args)
7023           return undobuf.undo[i].old_contents.rtx;
7024       }
7025
7026   /* Otherwise make a new rtx.  We know we have 1, 2, or 3 args.
7027      Use rtx_alloc instead of gen_rtx because it's faster on RISC.  */
7028   rt = rtx_alloc (code);
7029   PUT_MODE (rt, mode);
7030   XEXP (rt, 0) = args[0];
7031   if (n_args > 1)
7032     {
7033       XEXP (rt, 1) = args[1];
7034       if (n_args > 2)
7035         XEXP (rt, 2) = args[2];
7036     }
7037   return rt;
7038 }
7039
7040 /* These routines make binary and unary operations by first seeing if they
7041    fold; if not, a new expression is allocated.  */
7042
7043 static rtx
7044 gen_binary (code, mode, op0, op1)
7045      enum rtx_code code;
7046      enum machine_mode mode;
7047      rtx op0, op1;
7048 {
7049   rtx result;
7050
7051   if (GET_RTX_CLASS (code) == '<') 
7052     {
7053       enum machine_mode op_mode = GET_MODE (op0);
7054       if (op_mode == VOIDmode)
7055         op_mode = GET_MODE (op1);
7056       result = simplify_relational_operation (code, op_mode, op0, op1);
7057     }
7058   else
7059     result = simplify_binary_operation (code, mode, op0, op1);
7060
7061   if (result)
7062     return result;
7063
7064   /* Put complex operands first and constants second.  */
7065   if (GET_RTX_CLASS (code) == 'c'
7066       && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
7067           || (GET_RTX_CLASS (GET_CODE (op0)) == 'o'
7068               && GET_RTX_CLASS (GET_CODE (op1)) != 'o')
7069           || (GET_CODE (op0) == SUBREG
7070               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o'
7071               && GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
7072     return gen_rtx_combine (code, mode, op1, op0);
7073
7074   return gen_rtx_combine (code, mode, op0, op1);
7075 }
7076
7077 static rtx
7078 gen_unary (code, mode, op0)
7079      enum rtx_code code;
7080      enum machine_mode mode;
7081      rtx op0;
7082 {
7083   rtx result = simplify_unary_operation (code, mode, op0, mode);
7084
7085   if (result)
7086     return result;
7087
7088   return gen_rtx_combine (code, mode, op0);
7089 }
7090 \f
7091 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
7092    comparison code that will be tested.
7093
7094    The result is a possibly different comparison code to use.  *POP0 and
7095    *POP1 may be updated.
7096
7097    It is possible that we might detect that a comparison is either always
7098    true or always false.  However, we do not perform general constant
7099    folding in combine, so this knowledge isn't useful.  Such tautologies
7100    should have been detected earlier.  Hence we ignore all such cases.  */
7101
7102 static enum rtx_code
7103 simplify_comparison (code, pop0, pop1)
7104      enum rtx_code code;
7105      rtx *pop0;
7106      rtx *pop1;
7107 {
7108   rtx op0 = *pop0;
7109   rtx op1 = *pop1;
7110   rtx tem, tem1;
7111   int i;
7112   enum machine_mode mode, tmode;
7113
7114   /* Try a few ways of applying the same transformation to both operands.  */
7115   while (1)
7116     {
7117       /* If both operands are the same constant shift, see if we can ignore the
7118          shift.  We can if the shift is a rotate or if the bits shifted out of
7119          this shift are not significant for either input and if the type of
7120          comparison is compatible with the shift.  */
7121       if (GET_CODE (op0) == GET_CODE (op1)
7122           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
7123           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
7124               || ((GET_CODE (op0) == LSHIFTRT
7125                    || GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT)
7126                   && (code != GT && code != LT && code != GE && code != LE))
7127               || (GET_CODE (op0) == ASHIFTRT
7128                   && (code != GTU && code != LTU
7129                       && code != GEU && code != GEU)))
7130           && GET_CODE (XEXP (op0, 1)) == CONST_INT
7131           && INTVAL (XEXP (op0, 1)) >= 0
7132           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
7133           && XEXP (op0, 1) == XEXP (op1, 1))
7134         {
7135           enum machine_mode mode = GET_MODE (op0);
7136           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7137           int shift_count = INTVAL (XEXP (op0, 1));
7138
7139           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
7140             mask &= (mask >> shift_count) << shift_count;
7141           else if (GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT)
7142             mask = (mask & (mask << shift_count)) >> shift_count;
7143
7144           if ((significant_bits (XEXP (op0, 0), mode) & ~ mask) == 0
7145               && (significant_bits (XEXP (op1, 0), mode) & ~ mask) == 0)
7146             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
7147           else
7148             break;
7149         }
7150
7151       /* If both operands are AND's of a paradoxical SUBREG by constant, the
7152          SUBREGs are of the same mode, and, in both cases, the AND would
7153          be redundant if the comparison was done in the narrower mode,
7154          do the comparison in the narrower mode (e.g., we are AND'ing with 1
7155          and the operand's significant bits are 0xffffff01; in that case if
7156          we only care about QImode, we don't need the AND).  This case occurs
7157          if the output mode of an scc insn is not SImode and
7158          STORE_FLAG_VALUE == 1 (e.g., the 386).  */
7159
7160       else if  (GET_CODE (op0) == AND && GET_CODE (op1) == AND
7161                 && GET_CODE (XEXP (op0, 1)) == CONST_INT
7162                 && GET_CODE (XEXP (op1, 1)) == CONST_INT
7163                 && GET_CODE (XEXP (op0, 0)) == SUBREG
7164                 && GET_CODE (XEXP (op1, 0)) == SUBREG
7165                 && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)))
7166                     > GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
7167                 && (GET_MODE (SUBREG_REG (XEXP (op0, 0)))
7168                     == GET_MODE (SUBREG_REG (XEXP (op1, 0))))
7169                 && (significant_bits (SUBREG_REG (XEXP (op0, 0)),
7170                                       GET_MODE (SUBREG_REG (XEXP (op0, 0))))
7171                     & ~ INTVAL (XEXP (op0, 1))) == 0
7172                 && (significant_bits (SUBREG_REG (XEXP (op1, 0)),
7173                                       GET_MODE (SUBREG_REG (XEXP (op1, 0))))
7174                     & ~ INTVAL (XEXP (op1, 1))) == 0)
7175         {
7176           op0 = SUBREG_REG (XEXP (op0, 0));
7177           op1 = SUBREG_REG (XEXP (op1, 0));
7178
7179           /* the resulting comparison is always unsigned since we masked off
7180              the original sign bit. */
7181           code = unsigned_condition (code);
7182         }
7183       else
7184         break;
7185     }
7186      
7187   /* If the first operand is a constant, swap the operands and adjust the
7188      comparison code appropriately.  */
7189   if (CONSTANT_P (op0))
7190     {
7191       tem = op0, op0 = op1, op1 = tem;
7192       code = swap_condition (code);
7193     }
7194
7195   /* We now enter a loop during which we will try to simplify the comparison.
7196      For the most part, we only are concerned with comparisons with zero,
7197      but some things may really be comparisons with zero but not start
7198      out looking that way.  */
7199
7200   while (GET_CODE (op1) == CONST_INT)
7201     {
7202       enum machine_mode mode = GET_MODE (op0);
7203       int mode_width = GET_MODE_BITSIZE (mode);
7204       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
7205       int equality_comparison_p;
7206       int sign_bit_comparison_p;
7207       int unsigned_comparison_p;
7208       HOST_WIDE_INT const_op;
7209
7210       /* We only want to handle integral modes.  This catches VOIDmode,
7211          CCmode, and the floating-point modes.  An exception is that we
7212          can handle VOIDmode if OP0 is a COMPARE or a comparison
7213          operation.  */
7214
7215       if (GET_MODE_CLASS (mode) != MODE_INT
7216           && ! (mode == VOIDmode
7217                 && (GET_CODE (op0) == COMPARE
7218                     || GET_RTX_CLASS (GET_CODE (op0)) == '<')))
7219         break;
7220
7221       /* Get the constant we are comparing against and turn off all bits
7222          not on in our mode.  */
7223       const_op = INTVAL (op1);
7224       if (mode_width <= HOST_BITS_PER_WIDE_INT)
7225         const_op &= mask;
7226
7227       /* If we are comparing against a constant power of two and the value
7228          being compared has only that single significant bit (e.g., it was
7229          `and'ed with that bit), we can replace this with a comparison
7230          with zero.  */
7231       if (const_op
7232           && (code == EQ || code == NE || code == GE || code == GEU
7233               || code == LT || code == LTU)
7234           && mode_width <= HOST_BITS_PER_WIDE_INT
7235           && exact_log2 (const_op) >= 0
7236           && significant_bits (op0, mode) == const_op)
7237         {
7238           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
7239           op1 = const0_rtx, const_op = 0;
7240         }
7241
7242       /* Similarly, if we are comparing a value known to be either -1 or
7243          0 with -1, change it to the opposite comparison against zero.  */
7244
7245       if (const_op == -1
7246           && (code == EQ || code == NE || code == GT || code == LE
7247               || code == GEU || code == LTU)
7248           && num_sign_bit_copies (op0, mode) == mode_width)
7249         {
7250           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
7251           op1 = const0_rtx, const_op = 0;
7252         }
7253
7254       /* Do some canonicalizations based on the comparison code.  We prefer
7255          comparisons against zero and then prefer equality comparisons.  
7256          If we can reduce the size of a constant, we will do that too.  */
7257
7258       switch (code)
7259         {
7260         case LT:
7261           /* < C is equivalent to <= (C - 1) */
7262           if (const_op > 0)
7263             {
7264               const_op -= 1;
7265               op1 = GEN_INT (const_op);
7266               code = LE;
7267               /* ... fall through to LE case below.  */
7268             }
7269           else
7270             break;
7271
7272         case LE:
7273           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
7274           if (const_op < 0)
7275             {
7276               const_op += 1;
7277               op1 = GEN_INT (const_op);
7278               code = LT;
7279             }
7280
7281           /* If we are doing a <= 0 comparison on a value known to have
7282              a zero sign bit, we can replace this with == 0.  */
7283           else if (const_op == 0
7284                    && mode_width <= HOST_BITS_PER_WIDE_INT
7285                    && (significant_bits (op0, mode)
7286                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
7287             code = EQ;
7288           break;
7289
7290         case GE:
7291           /* >= C is equivalent to > (C - 1). */
7292           if (const_op > 0)
7293             {
7294               const_op -= 1;
7295               op1 = GEN_INT (const_op);
7296               code = GT;
7297               /* ... fall through to GT below.  */
7298             }
7299           else
7300             break;
7301
7302         case GT:
7303           /* > C is equivalent to >= (C + 1); we do this for C < 0*/
7304           if (const_op < 0)
7305             {
7306               const_op += 1;
7307               op1 = GEN_INT (const_op);
7308               code = GE;
7309             }
7310
7311           /* If we are doing a > 0 comparison on a value known to have
7312              a zero sign bit, we can replace this with != 0.  */
7313           else if (const_op == 0
7314                    && mode_width <= HOST_BITS_PER_WIDE_INT
7315                    && (significant_bits (op0, mode)
7316                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
7317             code = NE;
7318           break;
7319
7320         case LTU:
7321           /* < C is equivalent to <= (C - 1).  */
7322           if (const_op > 0)
7323             {
7324               const_op -= 1;
7325               op1 = GEN_INT (const_op);
7326               code = LEU;
7327               /* ... fall through ... */
7328             }
7329
7330           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
7331           else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1))
7332             {
7333               const_op = 0, op1 = const0_rtx;
7334               code = GE;
7335               break;
7336             }
7337           else
7338             break;
7339
7340         case LEU:
7341           /* unsigned <= 0 is equivalent to == 0 */
7342           if (const_op == 0)
7343             code = EQ;
7344
7345           /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */
7346           else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
7347             {
7348               const_op = 0, op1 = const0_rtx;
7349               code = GE;
7350             }
7351           break;
7352
7353         case GEU:
7354           /* >= C is equivalent to < (C - 1).  */
7355           if (const_op > 1)
7356             {
7357               const_op -= 1;
7358               op1 = GEN_INT (const_op);
7359               code = GTU;
7360               /* ... fall through ... */
7361             }
7362
7363           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
7364           else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1))
7365             {
7366               const_op = 0, op1 = const0_rtx;
7367               code = LT;
7368             }
7369           else
7370             break;
7371
7372         case GTU:
7373           /* unsigned > 0 is equivalent to != 0 */
7374           if (const_op == 0)
7375             code = NE;
7376
7377           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
7378           else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1)
7379             {
7380               const_op = 0, op1 = const0_rtx;
7381               code = LT;
7382             }
7383           break;
7384         }
7385
7386       /* Compute some predicates to simplify code below.  */
7387
7388       equality_comparison_p = (code == EQ || code == NE);
7389       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
7390       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
7391                                || code == LEU);
7392
7393       /* Now try cases based on the opcode of OP0.  If none of the cases
7394          does a "continue", we exit this loop immediately after the
7395          switch.  */
7396
7397       switch (GET_CODE (op0))
7398         {
7399         case ZERO_EXTRACT:
7400           /* If we are extracting a single bit from a variable position in
7401              a constant that has only a single bit set and are comparing it
7402              with zero, we can convert this into an equality comparison 
7403              between the position and the location of the single bit.  We can't
7404              do this if bit endian and we don't have an extzv since we then
7405              can't know what mode to use for the endianness adjustment.  */
7406
7407 #if ! BITS_BIG_ENDIAN || defined (HAVE_extzv)
7408           if (GET_CODE (XEXP (op0, 0)) == CONST_INT
7409               && XEXP (op0, 1) == const1_rtx
7410               && equality_comparison_p && const_op == 0
7411               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
7412             {
7413 #if BITS_BIG_ENDIAN
7414               i = (GET_MODE_BITSIZE
7415                    (insn_operand_mode[(int) CODE_FOR_extzv][1]) - 1 - i);
7416 #endif
7417
7418               op0 = XEXP (op0, 2);
7419               op1 = GEN_INT (i);
7420               const_op = i;
7421
7422               /* Result is nonzero iff shift count is equal to I.  */
7423               code = reverse_condition (code);
7424               continue;
7425             }
7426 #endif
7427
7428           /* ... fall through ... */
7429
7430         case SIGN_EXTRACT:
7431           tem = expand_compound_operation (op0);
7432           if (tem != op0)
7433             {
7434               op0 = tem;
7435               continue;
7436             }
7437           break;
7438
7439         case NOT:
7440           /* If testing for equality, we can take the NOT of the constant.  */
7441           if (equality_comparison_p
7442               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
7443             {
7444               op0 = XEXP (op0, 0);
7445               op1 = tem;
7446               continue;
7447             }
7448
7449           /* If just looking at the sign bit, reverse the sense of the
7450              comparison.  */
7451           if (sign_bit_comparison_p)
7452             {
7453               op0 = XEXP (op0, 0);
7454               code = (code == GE ? LT : GE);
7455               continue;
7456             }
7457           break;
7458
7459         case NEG:
7460           /* If testing for equality, we can take the NEG of the constant.  */
7461           if (equality_comparison_p
7462               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
7463             {
7464               op0 = XEXP (op0, 0);
7465               op1 = tem;
7466               continue;
7467             }
7468
7469           /* The remaining cases only apply to comparisons with zero.  */
7470           if (const_op != 0)
7471             break;
7472
7473           /* When X is ABS or is known positive,
7474              (neg X) is < 0 if and only if X != 0.  */
7475
7476           if (sign_bit_comparison_p
7477               && (GET_CODE (XEXP (op0, 0)) == ABS
7478                   || (mode_width <= HOST_BITS_PER_WIDE_INT
7479                       && (significant_bits (XEXP (op0, 0), mode)
7480                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
7481             {
7482               op0 = XEXP (op0, 0);
7483               code = (code == LT ? NE : EQ);
7484               continue;
7485             }
7486
7487           /* If we have NEG of something that is the result of a
7488              SIGN_EXTEND, SIGN_EXTRACT, or ASHIFTRT, we know that the
7489              two high-order bits must be the same and hence that
7490              "(-a) < 0" is equivalent to "a > 0".  Otherwise, we can't
7491              do this.  */
7492           if (GET_CODE (XEXP (op0, 0)) == SIGN_EXTEND
7493               || (GET_CODE (XEXP (op0, 0)) == SIGN_EXTRACT
7494                   && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
7495                   && (INTVAL (XEXP (XEXP (op0, 0), 1))
7496                       < GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (op0, 0), 0)))))
7497               || (GET_CODE (XEXP (op0, 0)) == ASHIFTRT
7498                   && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
7499                   && XEXP (XEXP (op0, 0), 1) != const0_rtx)
7500               || ((tem = get_last_value (XEXP (op0, 0))) != 0
7501                   && (GET_CODE (tem) == SIGN_EXTEND
7502                       || (GET_CODE (tem) == SIGN_EXTRACT
7503                           && GET_CODE (XEXP (tem, 1)) == CONST_INT
7504                           && (INTVAL (XEXP (tem, 1))
7505                               < GET_MODE_BITSIZE (GET_MODE (XEXP (tem, 0)))))
7506                       || (GET_CODE (tem) == ASHIFTRT
7507                           && GET_CODE (XEXP (tem, 1)) == CONST_INT
7508                           && XEXP (tem, 1) != const0_rtx))))
7509             {
7510               op0 = XEXP (op0, 0);
7511               code = swap_condition (code);
7512               continue;
7513             }
7514           break;
7515
7516         case ROTATE:
7517           /* If we are testing equality and our count is a constant, we
7518              can perform the inverse operation on our RHS.  */
7519           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
7520               && (tem = simplify_binary_operation (ROTATERT, mode,
7521                                                    op1, XEXP (op0, 1))) != 0)
7522             {
7523               op0 = XEXP (op0, 0);
7524               op1 = tem;
7525               continue;
7526             }
7527
7528           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
7529              a particular bit.  Convert it to an AND of a constant of that
7530              bit.  This will be converted into a ZERO_EXTRACT.  */
7531           if (const_op == 0 && sign_bit_comparison_p
7532               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7533               && mode_width <= HOST_BITS_PER_WIDE_INT)
7534             {
7535               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
7536                                             ((HOST_WIDE_INT) 1
7537                                              << (mode_width - 1
7538                                                  - INTVAL (XEXP (op0, 1)))));
7539               code = (code == LT ? NE : EQ);
7540               continue;
7541             }
7542
7543           /* ... fall through ... */
7544
7545         case ABS:
7546           /* ABS is ignorable inside an equality comparison with zero.  */
7547           if (const_op == 0 && equality_comparison_p)
7548             {
7549               op0 = XEXP (op0, 0);
7550               continue;
7551             }
7552           break;
7553           
7554
7555         case SIGN_EXTEND:
7556           /* Can simplify (compare (zero/sign_extend FOO) CONST)
7557              to (compare FOO CONST) if CONST fits in FOO's mode and we 
7558              are either testing inequality or have an unsigned comparison
7559              with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
7560           if (! unsigned_comparison_p
7561               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
7562                   <= HOST_BITS_PER_WIDE_INT)
7563               && ((unsigned HOST_WIDE_INT) const_op
7564                   < (((HOST_WIDE_INT) 1
7565                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
7566             {
7567               op0 = XEXP (op0, 0);
7568               continue;
7569             }
7570           break;
7571
7572         case SUBREG:
7573           /* Check for the case where we are comparing A - C1 with C2,
7574              both constants are smaller than 1/2 the maxium positive
7575              value in MODE, and the comparison is equality or unsigned.
7576              In that case, if A is either zero-extended to MODE or has
7577              sufficient sign bits so that the high-order bit in MODE
7578              is a copy of the sign in the inner mode, we can prove that it is
7579              safe to do the operation in the wider mode.  This simplifies
7580              many range checks.  */
7581
7582           if (mode_width <= HOST_BITS_PER_WIDE_INT
7583               && subreg_lowpart_p (op0)
7584               && GET_CODE (SUBREG_REG (op0)) == PLUS
7585               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
7586               && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
7587               && (- INTVAL (XEXP (SUBREG_REG (op0), 1))
7588                   < GET_MODE_MASK (mode) / 2)
7589               && (unsigned) const_op < GET_MODE_MASK (mode) / 2
7590               && (0 == (significant_bits (XEXP (SUBREG_REG (op0), 0),
7591                                           GET_MODE (SUBREG_REG (op0)))
7592                         & ~ GET_MODE_MASK (mode))
7593                   || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
7594                                            GET_MODE (SUBREG_REG (op0)))
7595                       > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
7596                          - GET_MODE_BITSIZE (mode)))))
7597             {
7598               op0 = SUBREG_REG (op0);
7599               continue;
7600             }
7601
7602           /* If the inner mode is narrower and we are extracting the low part,
7603              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
7604           if (subreg_lowpart_p (op0)
7605               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
7606             /* Fall through */ ;
7607           else
7608             break;
7609
7610           /* ... fall through ... */
7611
7612         case ZERO_EXTEND:
7613           if ((unsigned_comparison_p || equality_comparison_p)
7614               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
7615                   <= HOST_BITS_PER_WIDE_INT)
7616               && ((unsigned HOST_WIDE_INT) const_op
7617                   < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
7618             {
7619               op0 = XEXP (op0, 0);
7620               continue;
7621             }
7622           break;
7623
7624         case PLUS:
7625           /* (eq (plus X C1) C2) -> (eq X (minus C2 C1)).  We can only do
7626              this for equality comparisons due to pathological cases involving
7627              overflows.  */
7628           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
7629               && (tem = simplify_binary_operation (MINUS, mode, op1,
7630                                                    XEXP (op0, 1))) != 0)
7631             {
7632               op0 = XEXP (op0, 0);
7633               op1 = tem;
7634               continue;
7635             }
7636
7637           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
7638           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
7639               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
7640             {
7641               op0 = XEXP (XEXP (op0, 0), 0);
7642               code = (code == LT ? EQ : NE);
7643               continue;
7644             }
7645           break;
7646
7647         case MINUS:
7648           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
7649              of bits in X minus 1, is one iff X > 0.  */
7650           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
7651               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
7652               && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
7653               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
7654             {
7655               op0 = XEXP (op0, 1);
7656               code = (code == GE ? LE : GT);
7657               continue;
7658             }
7659           break;
7660
7661         case XOR:
7662           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
7663              if C is zero or B is a constant.  */
7664           if (equality_comparison_p
7665               && 0 != (tem = simplify_binary_operation (XOR, mode,
7666                                                         XEXP (op0, 1), op1)))
7667             {
7668               op0 = XEXP (op0, 0);
7669               op1 = tem;
7670               continue;
7671             }
7672           break;
7673
7674         case EQ:  case NE:
7675         case LT:  case LTU:  case LE:  case LEU:
7676         case GT:  case GTU:  case GE:  case GEU:
7677           /* We can't do anything if OP0 is a condition code value, rather
7678              than an actual data value.  */
7679           if (const_op != 0
7680 #ifdef HAVE_cc0
7681               || XEXP (op0, 0) == cc0_rtx
7682 #endif
7683               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
7684             break;
7685
7686           /* Get the two operands being compared.  */
7687           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
7688             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
7689           else
7690             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
7691
7692           /* Check for the cases where we simply want the result of the
7693              earlier test or the opposite of that result.  */
7694           if (code == NE
7695               || (code == EQ && reversible_comparison_p (op0))
7696               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
7697                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
7698                   && (STORE_FLAG_VALUE
7699                       & (((HOST_WIDE_INT) 1
7700                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
7701                   && (code == LT
7702                       || (code == GE && reversible_comparison_p (op0)))))
7703             {
7704               code = (code == LT || code == NE
7705                       ? GET_CODE (op0) : reverse_condition (GET_CODE (op0)));
7706               op0 = tem, op1 = tem1;
7707               continue;
7708             }
7709           break;
7710
7711         case IOR:
7712           /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
7713              iff X <= 0.  */
7714           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
7715               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
7716               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
7717             {
7718               op0 = XEXP (op0, 1);
7719               code = (code == GE ? GT : LE);
7720               continue;
7721             }
7722           break;
7723
7724         case AND:
7725           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
7726              will be converted to a ZERO_EXTRACT later.  */
7727           if (const_op == 0 && equality_comparison_p
7728               && (GET_CODE (XEXP (op0, 0)) == ASHIFT
7729                   || GET_CODE (XEXP (op0, 0)) == LSHIFT)
7730               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
7731             {
7732               op0 = simplify_and_const_int
7733                 (op0, mode, gen_rtx_combine (LSHIFTRT, mode,
7734                                              XEXP (op0, 1),
7735                                              XEXP (XEXP (op0, 0), 1)),
7736                  (HOST_WIDE_INT) 1);
7737               continue;
7738             }
7739
7740           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
7741              zero and X is a comparison and C1 and C2 describe only bits set
7742              in STORE_FLAG_VALUE, we can compare with X.  */
7743           if (const_op == 0 && equality_comparison_p
7744               && mode_width <= HOST_BITS_PER_WIDE_INT
7745               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7746               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
7747               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
7748               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
7749               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
7750             {
7751               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
7752                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
7753               if ((~ STORE_FLAG_VALUE & mask) == 0
7754                   && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<'
7755                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
7756                           && GET_RTX_CLASS (GET_CODE (tem)) == '<')))
7757                 {
7758                   op0 = XEXP (XEXP (op0, 0), 0);
7759                   continue;
7760                 }
7761             }
7762
7763           /* If we are doing an equality comparison of an AND of a bit equal
7764              to the sign bit, replace this with a LT or GE comparison of
7765              the underlying value.  */
7766           if (equality_comparison_p
7767               && const_op == 0
7768               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7769               && mode_width <= HOST_BITS_PER_WIDE_INT
7770               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
7771                   == (HOST_WIDE_INT) 1 << (mode_width - 1)))
7772             {
7773               op0 = XEXP (op0, 0);
7774               code = (code == EQ ? GE : LT);
7775               continue;
7776             }
7777
7778           /* If this AND operation is really a ZERO_EXTEND from a narrower
7779              mode, the constant fits within that mode, and this is either an
7780              equality or unsigned comparison, try to do this comparison in
7781              the narrower mode.  */
7782           if ((equality_comparison_p || unsigned_comparison_p)
7783               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7784               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
7785                                    & GET_MODE_MASK (mode))
7786                                   + 1)) >= 0
7787               && const_op >> i == 0
7788               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
7789             {
7790               op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
7791               continue;
7792             }
7793           break;
7794
7795         case ASHIFT:
7796         case LSHIFT:
7797           /* If we have (compare (xshift FOO N) (const_int C)) and
7798              the high order N bits of FOO (N+1 if an inequality comparison)
7799              are not significant, we can do this by comparing FOO with C
7800              shifted right N bits so long as the low-order N bits of C are
7801              zero.  */
7802           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
7803               && INTVAL (XEXP (op0, 1)) >= 0
7804               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
7805                   < HOST_BITS_PER_WIDE_INT)
7806               && ((const_op
7807                    &  ~ (((HOST_WIDE_INT) 1
7808                           << INTVAL (XEXP (op0, 1))) - 1)) == 0)
7809               && mode_width <= HOST_BITS_PER_WIDE_INT
7810               && (significant_bits (XEXP (op0, 0), mode)
7811                   & ~ (mask >> (INTVAL (XEXP (op0, 1))
7812                                 + ! equality_comparison_p))) == 0)
7813             {
7814               const_op >>= INTVAL (XEXP (op0, 1));
7815               op1 = GEN_INT (const_op);
7816               op0 = XEXP (op0, 0);
7817               continue;
7818             }
7819
7820           /* If we are doing a sign bit comparison, it means we are testing
7821              a particular bit.  Convert it to the appropriate AND.  */
7822           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
7823               && mode_width <= HOST_BITS_PER_WIDE_INT)
7824             {
7825               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
7826                                             ((HOST_WIDE_INT) 1
7827                                              << (mode_width - 1
7828                                                  - INTVAL (XEXP (op0, 1)))));
7829               code = (code == LT ? NE : EQ);
7830               continue;
7831             }
7832
7833           /* If this an equality comparison with zero and we are shifting
7834              the low bit to the sign bit, we can convert this to an AND of the
7835              low-order bit.  */
7836           if (const_op == 0 && equality_comparison_p
7837               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7838               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
7839             {
7840               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
7841                                             (HOST_WIDE_INT) 1);
7842               continue;
7843             }
7844           break;
7845
7846         case ASHIFTRT:
7847           /* If this is an equality comparison with zero, we can do this
7848              as a logical shift, which might be much simpler.  */
7849           if (equality_comparison_p && const_op == 0
7850               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
7851             {
7852               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
7853                                           XEXP (op0, 0),
7854                                           INTVAL (XEXP (op0, 1)));
7855               continue;
7856             }
7857
7858           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
7859              do the comparison in a narrower mode.  */
7860           if (! unsigned_comparison_p
7861               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7862               && GET_CODE (XEXP (op0, 0)) == ASHIFT
7863               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
7864               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
7865                                          MODE_INT, 1)) != VOIDmode
7866               && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
7867                   || ((unsigned HOST_WIDE_INT) - const_op
7868                       <= GET_MODE_MASK (tmode))))
7869             {
7870               op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
7871               continue;
7872             }
7873
7874           /* ... fall through ... */
7875         case LSHIFTRT:
7876           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
7877              the low order N bits of FOO are not significant, we can do this
7878              by comparing FOO with C shifted left N bits so long as no
7879              overflow occurs.  */
7880           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
7881               && INTVAL (XEXP (op0, 1)) >= 0
7882               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
7883               && mode_width <= HOST_BITS_PER_WIDE_INT
7884               && (significant_bits (XEXP (op0, 0), mode)
7885                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
7886               && (const_op == 0
7887                   || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
7888                       < mode_width)))
7889             {
7890               const_op <<= INTVAL (XEXP (op0, 1));
7891               op1 = GEN_INT (const_op);
7892               op0 = XEXP (op0, 0);
7893               continue;
7894             }
7895
7896           /* If we are using this shift to extract just the sign bit, we
7897              can replace this with an LT or GE comparison.  */
7898           if (const_op == 0
7899               && (equality_comparison_p || sign_bit_comparison_p)
7900               && GET_CODE (XEXP (op0, 1)) == CONST_INT
7901               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
7902             {
7903               op0 = XEXP (op0, 0);
7904               code = (code == NE || code == GT ? LT : GE);
7905               continue;
7906             }
7907           break;
7908         }
7909
7910       break;
7911     }
7912
7913   /* Now make any compound operations involved in this comparison.  Then,
7914      check for an outmost SUBREG on OP0 that isn't doing anything or is
7915      paradoxical.  The latter case can only occur when it is known that the
7916      "extra" bits will be zero.  Therefore, it is safe to remove the SUBREG.
7917      We can never remove a SUBREG for a non-equality comparison because the
7918      sign bit is in a different place in the underlying object.  */
7919
7920   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
7921   op1 = make_compound_operation (op1, SET);
7922
7923   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
7924       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
7925       && (code == NE || code == EQ)
7926       && ((GET_MODE_SIZE (GET_MODE (op0))
7927            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))))
7928     {
7929       op0 = SUBREG_REG (op0);
7930       op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
7931     }
7932
7933   else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
7934            && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
7935            && (code == NE || code == EQ)
7936            && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
7937            && (significant_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0)))
7938                & ~ GET_MODE_MASK (GET_MODE (op0))) == 0
7939            && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)),
7940                                               op1),
7941                (significant_bits (tem, GET_MODE (SUBREG_REG (op0)))
7942                 & ~ GET_MODE_MASK (GET_MODE (op0))) == 0))
7943     op0 = SUBREG_REG (op0), op1 = tem;
7944
7945   /* We now do the opposite procedure: Some machines don't have compare
7946      insns in all modes.  If OP0's mode is an integer mode smaller than a
7947      word and we can't do a compare in that mode, see if there is a larger
7948      mode for which we can do the compare.  There are a number of cases in
7949      which we can use the wider mode.  */
7950
7951   mode = GET_MODE (op0);
7952   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
7953       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
7954       && cmp_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
7955     for (tmode = GET_MODE_WIDER_MODE (mode);
7956          (tmode != VOIDmode
7957           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
7958          tmode = GET_MODE_WIDER_MODE (tmode))
7959       if (cmp_optab->handlers[(int) tmode].insn_code != CODE_FOR_nothing)
7960         {
7961           /* If the only significant bits in OP0 and OP1 are those in the
7962              narrower mode and this is an equality or unsigned comparison,
7963              we can use the wider mode.  Similarly for sign-extended
7964              values and equality or signed comparisons.  */
7965           if (((code == EQ || code == NE
7966                 || code == GEU || code == GTU || code == LEU || code == LTU)
7967                && ((significant_bits (op0, tmode) & ~ GET_MODE_MASK (mode))
7968                    == 0)
7969                && ((significant_bits (op1, tmode) & ~ GET_MODE_MASK (mode))
7970                    == 0))
7971               || ((code == EQ || code == NE
7972                    || code == GE || code == GT || code == LE || code == LT)
7973                   && (num_sign_bit_copies (op0, tmode)
7974                       > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
7975                   && (num_sign_bit_copies (op1, tmode)
7976                       > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
7977             {
7978               op0 = gen_lowpart_for_combine (tmode, op0);
7979               op1 = gen_lowpart_for_combine (tmode, op1);
7980               break;
7981             }
7982
7983           /* If this is a test for negative, we can make an explicit
7984              test of the sign bit.  */
7985
7986           if (op1 == const0_rtx && (code == LT || code == GE)
7987               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
7988             {
7989               op0 = gen_binary (AND, tmode,
7990                                 gen_lowpart_for_combine (tmode, op0),
7991                                 GEN_INT ((HOST_WIDE_INT) 1
7992                                          << (GET_MODE_BITSIZE (mode) - 1)));
7993               code = (code == LT) ? NE : EQ;
7994               break;
7995             }
7996         }
7997
7998   *pop0 = op0;
7999   *pop1 = op1;
8000
8001   return code;
8002 }
8003 \f
8004 /* Return 1 if we know that X, a comparison operation, is not operating
8005    on a floating-point value or is EQ or NE, meaning that we can safely
8006    reverse it.  */
8007
8008 static int
8009 reversible_comparison_p (x)
8010      rtx x;
8011 {
8012   if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
8013       || GET_CODE (x) == NE || GET_CODE (x) == EQ)
8014     return 1;
8015
8016   switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))))
8017     {
8018     case MODE_INT:
8019       return 1;
8020
8021     case MODE_CC:
8022       x = get_last_value (XEXP (x, 0));
8023       return (x && GET_CODE (x) == COMPARE
8024               && GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) == MODE_INT);
8025     }
8026
8027   return 0;
8028 }
8029 \f
8030 /* Utility function for following routine.  Called when X is part of a value
8031    being stored into reg_last_set_value.  Sets reg_last_set_table_tick
8032    for each register mentioned.  Similar to mention_regs in cse.c  */
8033
8034 static void
8035 update_table_tick (x)
8036      rtx x;
8037 {
8038   register enum rtx_code code = GET_CODE (x);
8039   register char *fmt = GET_RTX_FORMAT (code);
8040   register int i;
8041
8042   if (code == REG)
8043     {
8044       int regno = REGNO (x);
8045       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
8046                               ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
8047
8048       for (i = regno; i < endregno; i++)
8049         reg_last_set_table_tick[i] = label_tick;
8050
8051       return;
8052     }
8053   
8054   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8055     /* Note that we can't have an "E" in values stored; see
8056        get_last_value_validate.  */
8057     if (fmt[i] == 'e')
8058       update_table_tick (XEXP (x, i));
8059 }
8060
8061 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
8062    are saying that the register is clobbered and we no longer know its
8063    value.  If INSN is zero, don't update reg_last_set; this call is normally
8064    done with VALUE also zero to invalidate the register.  */
8065
8066 static void
8067 record_value_for_reg (reg, insn, value)
8068      rtx reg;
8069      rtx insn;
8070      rtx value;
8071 {
8072   int regno = REGNO (reg);
8073   int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
8074                           ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1);
8075   int i;
8076
8077   /* If VALUE contains REG and we have a previous value for REG, substitute
8078      the previous value.  */
8079   if (value && insn && reg_overlap_mentioned_p (reg, value))
8080     {
8081       rtx tem;
8082
8083       /* Set things up so get_last_value is allowed to see anything set up to
8084          our insn.  */
8085       subst_low_cuid = INSN_CUID (insn);
8086       tem = get_last_value (reg);      
8087
8088       if (tem)
8089         value = replace_rtx (copy_rtx (value), reg, tem);
8090     }
8091
8092   /* For each register modified, show we don't know its value, that
8093      its value has been updated, and that we don't know the location of
8094      the death of the register.  */
8095   for (i = regno; i < endregno; i ++)
8096     {
8097       if (insn)
8098         reg_last_set[i] = insn;
8099       reg_last_set_value[i] = 0;
8100       reg_last_death[i] = 0;
8101     }
8102
8103   /* Mark registers that are being referenced in this value.  */
8104   if (value)
8105     update_table_tick (value);
8106
8107   /* Now update the status of each register being set.
8108      If someone is using this register in this block, set this register
8109      to invalid since we will get confused between the two lives in this
8110      basic block.  This makes using this register always invalid.  In cse, we
8111      scan the table to invalidate all entries using this register, but this
8112      is too much work for us.  */
8113
8114   for (i = regno; i < endregno; i++)
8115     {
8116       reg_last_set_label[i] = label_tick;
8117       if (value && reg_last_set_table_tick[i] == label_tick)
8118         reg_last_set_invalid[i] = 1;
8119       else
8120         reg_last_set_invalid[i] = 0;
8121     }
8122
8123   /* The value being assigned might refer to X (like in "x++;").  In that
8124      case, we must replace it with (clobber (const_int 0)) to prevent
8125      infinite loops.  */
8126   if (value && ! get_last_value_validate (&value,
8127                                           reg_last_set_label[regno], 0))
8128     {
8129       value = copy_rtx (value);
8130       if (! get_last_value_validate (&value, reg_last_set_label[regno], 1))
8131         value = 0;
8132     }
8133
8134   /* For the main register being modified, update the value.  */
8135   reg_last_set_value[regno] = value;
8136
8137 }
8138
8139 /* Used for communication between the following two routines.  */
8140 static rtx record_dead_insn;
8141
8142 /* Called via note_stores from record_dead_and_set_regs to handle one
8143    SET or CLOBBER in an insn.  */
8144
8145 static void
8146 record_dead_and_set_regs_1 (dest, setter)
8147      rtx dest, setter;
8148 {
8149   if (GET_CODE (dest) == REG)
8150     {
8151       /* If we are setting the whole register, we know its value.  Otherwise
8152          show that we don't know the value.  We can handle SUBREG in
8153          some cases.  */
8154       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
8155         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
8156       else if (GET_CODE (setter) == SET
8157                && GET_CODE (SET_DEST (setter)) == SUBREG
8158                && SUBREG_REG (SET_DEST (setter)) == dest
8159                && subreg_lowpart_p (SET_DEST (setter)))
8160         record_value_for_reg (dest, record_dead_insn,
8161                               gen_lowpart_for_combine (GET_MODE (dest),
8162                                                        SET_SRC (setter)));
8163       else
8164         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
8165     }
8166   else if (GET_CODE (dest) == MEM
8167            /* Ignore pushes, they clobber nothing.  */
8168            && ! push_operand (dest, GET_MODE (dest)))
8169     mem_last_set = INSN_CUID (record_dead_insn);
8170 }
8171
8172 /* Update the records of when each REG was most recently set or killed
8173    for the things done by INSN.  This is the last thing done in processing
8174    INSN in the combiner loop.
8175
8176    We update reg_last_set, reg_last_set_value, reg_last_death, and also the
8177    similar information mem_last_set (which insn most recently modified memory)
8178    and last_call_cuid (which insn was the most recent subroutine call).  */
8179
8180 static void
8181 record_dead_and_set_regs (insn)
8182      rtx insn;
8183 {
8184   register rtx link;
8185   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
8186     {
8187       if (REG_NOTE_KIND (link) == REG_DEAD)
8188         reg_last_death[REGNO (XEXP (link, 0))] = insn;
8189       else if (REG_NOTE_KIND (link) == REG_INC)
8190         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
8191     }
8192
8193   if (GET_CODE (insn) == CALL_INSN)
8194     last_call_cuid = mem_last_set = INSN_CUID (insn);
8195
8196   record_dead_insn = insn;
8197   note_stores (PATTERN (insn), record_dead_and_set_regs_1);
8198 }
8199 \f
8200 /* Utility routine for the following function.  Verify that all the registers
8201    mentioned in *LOC are valid when *LOC was part of a value set when
8202    label_tick == TICK.  Return 0 if some are not.
8203
8204    If REPLACE is non-zero, replace the invalid reference with
8205    (clobber (const_int 0)) and return 1.  This replacement is useful because
8206    we often can get useful information about the form of a value (e.g., if
8207    it was produced by a shift that always produces -1 or 0) even though
8208    we don't know exactly what registers it was produced from.  */
8209
8210 static int
8211 get_last_value_validate (loc, tick, replace)
8212      rtx *loc;
8213      int tick;
8214      int replace;
8215 {
8216   rtx x = *loc;
8217   char *fmt = GET_RTX_FORMAT (GET_CODE (x));
8218   int len = GET_RTX_LENGTH (GET_CODE (x));
8219   int i;
8220
8221   if (GET_CODE (x) == REG)
8222     {
8223       int regno = REGNO (x);
8224       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
8225                               ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
8226       int j;
8227
8228       for (j = regno; j < endregno; j++)
8229         if (reg_last_set_invalid[j]
8230             /* If this is a pseudo-register that was only set once, it is
8231                always valid.  */
8232             || (! (regno >= FIRST_PSEUDO_REGISTER && reg_n_sets[regno] == 1)
8233                 && reg_last_set_label[j] > tick))
8234           {
8235             if (replace)
8236               *loc = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx);
8237             return replace;
8238           }
8239
8240       return 1;
8241     }
8242
8243   for (i = 0; i < len; i++)
8244     if ((fmt[i] == 'e'
8245          && get_last_value_validate (&XEXP (x, i), tick, replace) == 0)
8246         /* Don't bother with these.  They shouldn't occur anyway.  */
8247         || fmt[i] == 'E')
8248       return 0;
8249
8250   /* If we haven't found a reason for it to be invalid, it is valid.  */
8251   return 1;
8252 }
8253
8254 /* Get the last value assigned to X, if known.  Some registers
8255    in the value may be replaced with (clobber (const_int 0)) if their value
8256    is known longer known reliably.  */
8257
8258 static rtx
8259 get_last_value (x)
8260      rtx x;
8261 {
8262   int regno;
8263   rtx value;
8264
8265   /* If this is a non-paradoxical SUBREG, get the value of its operand and
8266      then convert it to the desired mode.  If this is a paradoxical SUBREG,
8267      we cannot predict what values the "extra" bits might have. */
8268   if (GET_CODE (x) == SUBREG
8269       && subreg_lowpart_p (x)
8270       && (GET_MODE_SIZE (GET_MODE (x))
8271           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8272       && (value = get_last_value (SUBREG_REG (x))) != 0)
8273     return gen_lowpart_for_combine (GET_MODE (x), value);
8274
8275   if (GET_CODE (x) != REG)
8276     return 0;
8277
8278   regno = REGNO (x);
8279   value = reg_last_set_value[regno];
8280
8281   /* If we don't have a value or if it isn't for this basic block, return 0. */
8282
8283   if (value == 0
8284       || (reg_n_sets[regno] != 1
8285           && (reg_last_set_label[regno] != label_tick)))
8286     return 0;
8287
8288   /* If the value was set in a later insn that the ones we are processing,
8289      we can't use it, but make a quick check to see if the previous insn
8290      set it to something.  This is commonly the case when the same pseudo
8291      is used by repeated insns.  */
8292
8293   if (reg_n_sets[regno] != 1
8294       && INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
8295     {
8296       rtx insn, set;
8297
8298       for (insn = prev_nonnote_insn (subst_insn);
8299            insn && INSN_CUID (insn) >= subst_low_cuid;
8300            insn = prev_nonnote_insn (insn))
8301         ;
8302
8303       if (insn
8304           && (set = single_set (insn)) != 0
8305           && rtx_equal_p (SET_DEST (set), x))
8306         {
8307           value = SET_SRC (set);
8308
8309           /* Make sure that VALUE doesn't reference X.  Replace any
8310              expliit references with a CLOBBER.  If there are any remaining
8311              references (rare), don't use the value.  */
8312
8313           if (reg_mentioned_p (x, value))
8314             value = replace_rtx (copy_rtx (value), x,
8315                                  gen_rtx (CLOBBER, GET_MODE (x), const0_rtx));
8316
8317           if (reg_overlap_mentioned_p (x, value))
8318             return 0;
8319         }
8320       else
8321         return 0;
8322     }
8323
8324   /* If the value has all its registers valid, return it.  */
8325   if (get_last_value_validate (&value, reg_last_set_label[regno], 0))
8326     return value;
8327
8328   /* Otherwise, make a copy and replace any invalid register with
8329      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
8330
8331   value = copy_rtx (value);
8332   if (get_last_value_validate (&value, reg_last_set_label[regno], 1))
8333     return value;
8334
8335   return 0;
8336 }
8337 \f
8338 /* Return nonzero if expression X refers to a REG or to memory
8339    that is set in an instruction more recent than FROM_CUID.  */
8340
8341 static int
8342 use_crosses_set_p (x, from_cuid)
8343      register rtx x;
8344      int from_cuid;
8345 {
8346   register char *fmt;
8347   register int i;
8348   register enum rtx_code code = GET_CODE (x);
8349
8350   if (code == REG)
8351     {
8352       register int regno = REGNO (x);
8353 #ifdef PUSH_ROUNDING
8354       /* Don't allow uses of the stack pointer to be moved,
8355          because we don't know whether the move crosses a push insn.  */
8356       if (regno == STACK_POINTER_REGNUM)
8357         return 1;
8358 #endif
8359       return (reg_last_set[regno]
8360               && INSN_CUID (reg_last_set[regno]) > from_cuid);
8361     }
8362
8363   if (code == MEM && mem_last_set > from_cuid)
8364     return 1;
8365
8366   fmt = GET_RTX_FORMAT (code);
8367
8368   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8369     {
8370       if (fmt[i] == 'E')
8371         {
8372           register int j;
8373           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8374             if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
8375               return 1;
8376         }
8377       else if (fmt[i] == 'e'
8378                && use_crosses_set_p (XEXP (x, i), from_cuid))
8379         return 1;
8380     }
8381   return 0;
8382 }
8383 \f
8384 /* Define three variables used for communication between the following
8385    routines.  */
8386
8387 static int reg_dead_regno, reg_dead_endregno;
8388 static int reg_dead_flag;
8389
8390 /* Function called via note_stores from reg_dead_at_p.
8391
8392    If DEST is within [reg_dead_rengno, reg_dead_endregno), set 
8393    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
8394
8395 static void
8396 reg_dead_at_p_1 (dest, x)
8397      rtx dest;
8398      rtx x;
8399 {
8400   int regno, endregno;
8401
8402   if (GET_CODE (dest) != REG)
8403     return;
8404
8405   regno = REGNO (dest);
8406   endregno = regno + (regno < FIRST_PSEUDO_REGISTER 
8407                       ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1);
8408
8409   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
8410     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
8411 }
8412
8413 /* Return non-zero if REG is known to be dead at INSN.
8414
8415    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
8416    referencing REG, it is dead.  If we hit a SET referencing REG, it is
8417    live.  Otherwise, see if it is live or dead at the start of the basic
8418    block we are in.  */
8419
8420 static int
8421 reg_dead_at_p (reg, insn)
8422      rtx reg;
8423      rtx insn;
8424 {
8425   int block, i;
8426
8427   /* Set variables for reg_dead_at_p_1.  */
8428   reg_dead_regno = REGNO (reg);
8429   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
8430                                         ? HARD_REGNO_NREGS (reg_dead_regno,
8431                                                             GET_MODE (reg))
8432                                         : 1);
8433
8434   reg_dead_flag = 0;
8435
8436   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
8437      beginning of function.  */
8438   for (; insn && GET_CODE (insn) != CODE_LABEL;
8439        insn = prev_nonnote_insn (insn))
8440     {
8441       note_stores (PATTERN (insn), reg_dead_at_p_1);
8442       if (reg_dead_flag)
8443         return reg_dead_flag == 1 ? 1 : 0;
8444
8445       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
8446         return 1;
8447     }
8448
8449   /* Get the basic block number that we were in.  */
8450   if (insn == 0)
8451     block = 0;
8452   else
8453     {
8454       for (block = 0; block < n_basic_blocks; block++)
8455         if (insn == basic_block_head[block])
8456           break;
8457
8458       if (block == n_basic_blocks)
8459         return 0;
8460     }
8461
8462   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
8463     if (basic_block_live_at_start[block][i / REGSET_ELT_BITS]
8464         & ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS)))
8465       return 0;
8466
8467   return 1;
8468 }
8469 \f
8470 /* Remove register number REGNO from the dead registers list of INSN.
8471
8472    Return the note used to record the death, if there was one.  */
8473
8474 rtx
8475 remove_death (regno, insn)
8476      int regno;
8477      rtx insn;
8478 {
8479   register rtx note = find_regno_note (insn, REG_DEAD, regno);
8480
8481   if (note)
8482     remove_note (insn, note);
8483
8484   return note;
8485 }
8486
8487 /* For each register (hardware or pseudo) used within expression X, if its
8488    death is in an instruction with cuid between FROM_CUID (inclusive) and
8489    TO_INSN (exclusive), put a REG_DEAD note for that register in the
8490    list headed by PNOTES. 
8491
8492    This is done when X is being merged by combination into TO_INSN.  These
8493    notes will then be distributed as needed.  */
8494
8495 static void
8496 move_deaths (x, from_cuid, to_insn, pnotes)
8497      rtx x;
8498      int from_cuid;
8499      rtx to_insn;
8500      rtx *pnotes;
8501 {
8502   register char *fmt;
8503   register int len, i;
8504   register enum rtx_code code = GET_CODE (x);
8505
8506   if (code == REG)
8507     {
8508       register int regno = REGNO (x);
8509       register rtx where_dead = reg_last_death[regno];
8510
8511       if (where_dead && INSN_CUID (where_dead) >= from_cuid
8512           && INSN_CUID (where_dead) < INSN_CUID (to_insn))
8513         {
8514           rtx note = remove_death (regno, reg_last_death[regno]);
8515
8516           /* It is possible for the call above to return 0.  This can occur
8517              when reg_last_death points to I2 or I1 that we combined with.
8518              In that case make a new note.  */
8519
8520           if (note)
8521             {
8522               XEXP (note, 1) = *pnotes;
8523               *pnotes = note;
8524             }
8525           else
8526             *pnotes = gen_rtx (EXPR_LIST, REG_DEAD, x, *pnotes);
8527         }
8528
8529       return;
8530     }
8531
8532   else if (GET_CODE (x) == SET)
8533     {
8534       rtx dest = SET_DEST (x);
8535
8536       move_deaths (SET_SRC (x), from_cuid, to_insn, pnotes);
8537
8538       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
8539          that accesses one word of a multi-word item, some
8540          piece of everything register in the expression is used by
8541          this insn, so remove any old death.  */
8542
8543       if (GET_CODE (dest) == ZERO_EXTRACT
8544           || GET_CODE (dest) == STRICT_LOW_PART
8545           || (GET_CODE (dest) == SUBREG
8546               && (((GET_MODE_SIZE (GET_MODE (dest))
8547                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
8548                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
8549                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
8550         {
8551           move_deaths (dest, from_cuid, to_insn, pnotes);
8552           return;
8553         }
8554
8555       /* If this is some other SUBREG, we know it replaces the entire
8556          value, so use that as the destination.  */
8557       if (GET_CODE (dest) == SUBREG)
8558         dest = SUBREG_REG (dest);
8559
8560       /* If this is a MEM, adjust deaths of anything used in the address.
8561          For a REG (the only other possibility), the entire value is
8562          being replaced so the old value is not used in this insn.  */
8563
8564       if (GET_CODE (dest) == MEM)
8565         move_deaths (XEXP (dest, 0), from_cuid, to_insn, pnotes);
8566       return;
8567     }
8568
8569   else if (GET_CODE (x) == CLOBBER)
8570     return;
8571
8572   len = GET_RTX_LENGTH (code);
8573   fmt = GET_RTX_FORMAT (code);
8574
8575   for (i = 0; i < len; i++)
8576     {
8577       if (fmt[i] == 'E')
8578         {
8579           register int j;
8580           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
8581             move_deaths (XVECEXP (x, i, j), from_cuid, to_insn, pnotes);
8582         }
8583       else if (fmt[i] == 'e')
8584         move_deaths (XEXP (x, i), from_cuid, to_insn, pnotes);
8585     }
8586 }
8587 \f
8588 /* Return 1 if X is the target of a bit-field assignment in BODY, the
8589    pattern of an insn.  X must be a REG.  */
8590
8591 static int
8592 reg_bitfield_target_p (x, body)
8593      rtx x;
8594      rtx body;
8595 {
8596   int i;
8597
8598   if (GET_CODE (body) == SET)
8599     {
8600       rtx dest = SET_DEST (body);
8601       rtx target;
8602       int regno, tregno, endregno, endtregno;
8603
8604       if (GET_CODE (dest) == ZERO_EXTRACT)
8605         target = XEXP (dest, 0);
8606       else if (GET_CODE (dest) == STRICT_LOW_PART)
8607         target = SUBREG_REG (XEXP (dest, 0));
8608       else
8609         return 0;
8610
8611       if (GET_CODE (target) == SUBREG)
8612         target = SUBREG_REG (target);
8613
8614       if (GET_CODE (target) != REG)
8615         return 0;
8616
8617       tregno = REGNO (target), regno = REGNO (x);
8618       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
8619         return target == x;
8620
8621       endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target));
8622       endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
8623
8624       return endregno > tregno && regno < endtregno;
8625     }
8626
8627   else if (GET_CODE (body) == PARALLEL)
8628     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
8629       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
8630         return 1;
8631
8632   return 0;
8633 }      
8634 \f
8635 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
8636    as appropriate.  I3 and I2 are the insns resulting from the combination
8637    insns including FROM (I2 may be zero).
8638
8639    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
8640    not need REG_DEAD notes because they are being substituted for.  This
8641    saves searching in the most common cases.
8642
8643    Each note in the list is either ignored or placed on some insns, depending
8644    on the type of note.  */
8645
8646 static void
8647 distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
8648      rtx notes;
8649      rtx from_insn;
8650      rtx i3, i2;
8651      rtx elim_i2, elim_i1;
8652 {
8653   rtx note, next_note;
8654   rtx tem;
8655
8656   for (note = notes; note; note = next_note)
8657     {
8658       rtx place = 0, place2 = 0;
8659
8660       /* If this NOTE references a pseudo register, ensure it references
8661          the latest copy of that register.  */
8662       if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
8663           && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
8664         XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
8665
8666       next_note = XEXP (note, 1);
8667       switch (REG_NOTE_KIND (note))
8668         {
8669         case REG_UNUSED:
8670           /* If this register is set or clobbered in I3, put the note there
8671              unless there is one already.  */
8672           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
8673             {
8674               if (! (GET_CODE (XEXP (note, 0)) == REG
8675                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
8676                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
8677                 place = i3;
8678             }
8679           /* Otherwise, if this register is used by I3, then this register
8680              now dies here, so we must put a REG_DEAD note here unless there
8681              is one already.  */
8682           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
8683                    && ! (GET_CODE (XEXP (note, 0)) == REG
8684                          ? find_regno_note (i3, REG_DEAD, REGNO (XEXP (note, 0)))
8685                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
8686             {
8687               PUT_REG_NOTE_KIND (note, REG_DEAD);
8688               place = i3;
8689             }
8690           break;
8691
8692         case REG_EQUAL:
8693         case REG_EQUIV:
8694         case REG_NONNEG:
8695           /* These notes say something about results of an insn.  We can
8696              only support them if they used to be on I3 in which case they
8697              remain on I3.  Otherwise they are ignored.
8698
8699              If the note refers to an expression that is not a constant, we
8700              must also ignore the note since we cannot tell whether the
8701              equivalence is still true.  It might be possible to do
8702              slightly better than this (we only have a problem if I2DEST
8703              or I1DEST is present in the expression), but it doesn't
8704              seem worth the trouble.  */
8705
8706           if (from_insn == i3
8707               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
8708             place = i3;
8709           break;
8710
8711         case REG_INC:
8712         case REG_NO_CONFLICT:
8713         case REG_LABEL:
8714           /* These notes say something about how a register is used.  They must
8715              be present on any use of the register in I2 or I3.  */
8716           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
8717             place = i3;
8718
8719           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
8720             {
8721               if (place)
8722                 place2 = i2;
8723               else
8724                 place = i2;
8725             }
8726           break;
8727
8728         case REG_WAS_0:
8729           /* It is too much trouble to try to see if this note is still
8730              correct in all situations.  It is better to simply delete it.  */
8731           break;
8732
8733         case REG_RETVAL:
8734           /* If the insn previously containing this note still exists,
8735              put it back where it was.  Otherwise move it to the previous
8736              insn.  Adjust the corresponding REG_LIBCALL note.  */
8737           if (GET_CODE (from_insn) != NOTE)
8738             place = from_insn;
8739           else
8740             {
8741               tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
8742               place = prev_real_insn (from_insn);
8743               if (tem && place)
8744                 XEXP (tem, 0) = place;
8745             }
8746           break;
8747
8748         case REG_LIBCALL:
8749           /* This is handled similarly to REG_RETVAL.  */
8750           if (GET_CODE (from_insn) != NOTE)
8751             place = from_insn;
8752           else
8753             {
8754               tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
8755               place = next_real_insn (from_insn);
8756               if (tem && place)
8757                 XEXP (tem, 0) = place;
8758             }
8759           break;
8760
8761         case REG_DEAD:
8762           /* If the register is used as an input in I3, it dies there.
8763              Similarly for I2, if it is non-zero and adjacent to I3.
8764
8765              If the register is not used as an input in either I3 or I2
8766              and it is not one of the registers we were supposed to eliminate,
8767              there are two possibilities.  We might have a non-adjacent I2
8768              or we might have somehow eliminated an additional register
8769              from a computation.  For example, we might have had A & B where
8770              we discover that B will always be zero.  In this case we will
8771              eliminate the reference to A.
8772
8773              In both cases, we must search to see if we can find a previous
8774              use of A and put the death note there.  */
8775
8776           if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
8777             place = i3;
8778           else if (i2 != 0 && next_nonnote_insn (i2) == i3
8779                    && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
8780             place = i2;
8781
8782           if (XEXP (note, 0) == elim_i2 || XEXP (note, 0) == elim_i1)
8783             break;
8784
8785           /* If the register is used in both I2 and I3 and it dies in I3, 
8786              we might have added another reference to it.  If reg_n_refs
8787              was 2, bump it to 3.  This has to be correct since the 
8788              register must have been set somewhere.  The reason this is
8789              done is because local-alloc.c treats 2 references as a 
8790              special case.  */
8791
8792           if (place == i3 && i2 != 0 && GET_CODE (XEXP (note, 0)) == REG
8793               && reg_n_refs[REGNO (XEXP (note, 0))]== 2
8794               && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
8795             reg_n_refs[REGNO (XEXP (note, 0))] = 3;
8796
8797           if (place == 0)
8798             for (tem = prev_nonnote_insn (i3);
8799                  tem && (GET_CODE (tem) == INSN
8800                          || GET_CODE (tem) == CALL_INSN);
8801                  tem = prev_nonnote_insn (tem))
8802               {
8803                 /* If the register is being set at TEM, see if that is all
8804                    TEM is doing.  If so, delete TEM.  Otherwise, make this
8805                    into a REG_UNUSED note instead.  */
8806                 if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
8807                   {
8808                     rtx set = single_set (tem);
8809
8810                     /* Verify that it was the set, and not a clobber that
8811                        modified the register.  */
8812
8813                     if (set != 0 && ! side_effects_p (SET_SRC (set))
8814                         && rtx_equal_p (XEXP (note, 0), SET_DEST (set)))
8815                       {
8816                         /* Move the notes and links of TEM elsewhere.
8817                            This might delete other dead insns recursively. 
8818                            First set the pattern to something that won't use
8819                            any register.  */
8820
8821                         PATTERN (tem) = pc_rtx;
8822
8823                         distribute_notes (REG_NOTES (tem), tem, tem,
8824                                           NULL_RTX, NULL_RTX, NULL_RTX);
8825                         distribute_links (LOG_LINKS (tem));
8826
8827                         PUT_CODE (tem, NOTE);
8828                         NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
8829                         NOTE_SOURCE_FILE (tem) = 0;
8830                       }
8831                     else
8832                       {
8833                         PUT_REG_NOTE_KIND (note, REG_UNUSED);
8834
8835                         /*  If there isn't already a REG_UNUSED note, put one
8836                             here.  */
8837                         if (! find_regno_note (tem, REG_UNUSED,
8838                                                REGNO (XEXP (note, 0))))
8839                           place = tem;
8840                         break;
8841                       }
8842                   }
8843                 else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem)))
8844                   {
8845                     place = tem;
8846                     break;
8847                   }
8848               }
8849
8850           /* If the register is set or already dead at PLACE, we needn't do
8851              anything with this note if it is still a REG_DEAD note.  
8852
8853              Note that we cannot use just `dead_or_set_p' here since we can
8854              convert an assignment to a register into a bit-field assignment.
8855              Therefore, we must also omit the note if the register is the 
8856              target of a bitfield assignment.  */
8857              
8858           if (place && REG_NOTE_KIND (note) == REG_DEAD)
8859             {
8860               int regno = REGNO (XEXP (note, 0));
8861
8862               if (dead_or_set_p (place, XEXP (note, 0))
8863                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
8864                 {
8865                   /* Unless the register previously died in PLACE, clear
8866                      reg_last_death.  [I no longer understand why this is
8867                      being done.] */
8868                   if (reg_last_death[regno] != place)
8869                     reg_last_death[regno] = 0;
8870                   place = 0;
8871                 }
8872               else
8873                 reg_last_death[regno] = place;
8874
8875               /* If this is a death note for a hard reg that is occupying
8876                  multiple registers, ensure that we are still using all
8877                  parts of the object.  If we find a piece of the object
8878                  that is unused, we must add a USE for that piece before
8879                  PLACE and put the appropriate REG_DEAD note on it.
8880
8881                  An alternative would be to put a REG_UNUSED for the pieces
8882                  on the insn that set the register, but that can't be done if
8883                  it is not in the same block.  It is simpler, though less
8884                  efficient, to add the USE insns.  */
8885
8886               if (place && regno < FIRST_PSEUDO_REGISTER
8887                   && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1)
8888                 {
8889                   int endregno
8890                     = regno + HARD_REGNO_NREGS (regno,
8891                                                 GET_MODE (XEXP (note, 0)));
8892                   int all_used = 1;
8893                   int i;
8894
8895                   for (i = regno; i < endregno; i++)
8896                     if (! refers_to_regno_p (i, i + 1, PATTERN (place), 0))
8897                       {
8898                         rtx piece = gen_rtx (REG, word_mode, i);
8899                         rtx p;
8900
8901                         /* See if we already placed a USE note for this
8902                            register in front of PLACE.  */
8903                         for (p = place;
8904                              GET_CODE (PREV_INSN (p)) == INSN
8905                              && GET_CODE (PATTERN (PREV_INSN (p))) == USE;
8906                              p = PREV_INSN (p))
8907                           if (rtx_equal_p (piece,
8908                                            XEXP (PATTERN (PREV_INSN (p)), 0)))
8909                             {
8910                               p = 0;
8911                               break;
8912                             }
8913
8914                         if (p)
8915                           {
8916                             rtx use_insn
8917                               = emit_insn_before (gen_rtx (USE, VOIDmode,
8918                                                            piece),
8919                                                   p);
8920                             REG_NOTES (use_insn)
8921                               = gen_rtx (EXPR_LIST, REG_DEAD, piece,
8922                                          REG_NOTES (use_insn));
8923                           }
8924
8925                         all_used = 0;
8926                       }
8927
8928                   if (! all_used)
8929                     {
8930                       /* Put only REG_DEAD notes for pieces that are
8931                          still used and that are not already dead or set.  */
8932
8933                       for (i = regno; i < endregno; i++)
8934                         {
8935                           rtx piece = gen_rtx (REG, word_mode, i);
8936
8937                           if (reg_referenced_p (piece, PATTERN (place))
8938                               && ! dead_or_set_p (place, piece)
8939                               && ! reg_bitfield_target_p (piece,
8940                                                           PATTERN (place)))
8941                             REG_NOTES (place) = gen_rtx (EXPR_LIST, REG_DEAD,
8942                                                          piece,
8943                                                          REG_NOTES (place));
8944                         }
8945
8946                       place = 0;
8947                     }
8948                 }
8949             }
8950           break;
8951
8952         default:
8953           /* Any other notes should not be present at this point in the
8954              compilation.  */
8955           abort ();
8956         }
8957
8958       if (place)
8959         {
8960           XEXP (note, 1) = REG_NOTES (place);
8961           REG_NOTES (place) = note;
8962         }
8963
8964       if (place2)
8965         REG_NOTES (place2) = gen_rtx (GET_CODE (note), REG_NOTE_KIND (note),
8966                                       XEXP (note, 0), REG_NOTES (place2));
8967     }
8968 }
8969 \f
8970 /* Similarly to above, distribute the LOG_LINKS that used to be present on
8971    I3, I2, and I1 to new locations.  This is also called in one case to
8972    add a link pointing at I3 when I3's destination is changed.  */
8973
8974 static void
8975 distribute_links (links)
8976      rtx links;
8977 {
8978   rtx link, next_link;
8979
8980   for (link = links; link; link = next_link)
8981     {
8982       rtx place = 0;
8983       rtx insn;
8984       rtx set, reg;
8985
8986       next_link = XEXP (link, 1);
8987
8988       /* If the insn that this link points to is a NOTE or isn't a single
8989          set, ignore it.  In the latter case, it isn't clear what we
8990          can do other than ignore the link, since we can't tell which 
8991          register it was for.  Such links wouldn't be used by combine
8992          anyway.
8993
8994          It is not possible for the destination of the target of the link to
8995          have been changed by combine.  The only potential of this is if we
8996          replace I3, I2, and I1 by I3 and I2.  But in that case the
8997          destination of I2 also remains unchanged.  */
8998
8999       if (GET_CODE (XEXP (link, 0)) == NOTE
9000           || (set = single_set (XEXP (link, 0))) == 0)
9001         continue;
9002
9003       reg = SET_DEST (set);
9004       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
9005              || GET_CODE (reg) == SIGN_EXTRACT
9006              || GET_CODE (reg) == STRICT_LOW_PART)
9007         reg = XEXP (reg, 0);
9008
9009       /* A LOG_LINK is defined as being placed on the first insn that uses
9010          a register and points to the insn that sets the register.  Start
9011          searching at the next insn after the target of the link and stop
9012          when we reach a set of the register or the end of the basic block.
9013
9014          Note that this correctly handles the link that used to point from
9015          I3 to I2.  Also note that not much searching is typically done here
9016          since most links don't point very far away.  */
9017
9018       for (insn = NEXT_INSN (XEXP (link, 0));
9019            (insn && GET_CODE (insn) != CODE_LABEL
9020             && GET_CODE (PREV_INSN (insn)) != JUMP_INSN);
9021            insn = NEXT_INSN (insn))
9022         if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
9023             && reg_overlap_mentioned_p (reg, PATTERN (insn)))
9024           {
9025             if (reg_referenced_p (reg, PATTERN (insn)))
9026               place = insn;
9027             break;
9028           }
9029
9030       /* If we found a place to put the link, place it there unless there
9031          is already a link to the same insn as LINK at that point.  */
9032
9033       if (place)
9034         {
9035           rtx link2;
9036
9037           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
9038             if (XEXP (link2, 0) == XEXP (link, 0))
9039               break;
9040
9041           if (link2 == 0)
9042             {
9043               XEXP (link, 1) = LOG_LINKS (place);
9044               LOG_LINKS (place) = link;
9045             }
9046         }
9047     }
9048 }
9049 \f
9050 void
9051 dump_combine_stats (file)
9052      FILE *file;
9053 {
9054   fprintf
9055     (file,
9056      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
9057      combine_attempts, combine_merges, combine_extras, combine_successes);
9058 }
9059
9060 void
9061 dump_combine_total_stats (file)
9062      FILE *file;
9063 {
9064   fprintf
9065     (file,
9066      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
9067      total_attempts, total_merges, total_extras, total_successes);
9068 }