OSDN Git Service

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