OSDN Git Service

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