OSDN Git Service

Document that CC1_SPEC is used by cc1plus
[pf3gnuchains/gcc-fork.git] / gcc / combine.c
1 /* Optimize by combining instructions for GNU compiler.
2    Copyright (C) 1987, 88, 92-98, 1999 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, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21
22 /* This module is essentially the "combiner" phase of the U. of Arizona
23    Portable Optimizer, but redone to work on our list-structured
24    representation for RTL instead of their string representation.
25
26    The LOG_LINKS of each insn identify the most recent assignment
27    to each REG used in the insn.  It is a list of previous insns,
28    each of which contains a SET for a REG that is used in this insn
29    and not used or set in between.  LOG_LINKs never cross basic blocks.
30    They were set up by the preceding pass (lifetime analysis).
31
32    We try to combine each pair of insns joined by a logical link.
33    We also try to combine triples of insns A, B and C when
34    C has a link back to B and B has a link back to A.
35
36    LOG_LINKS does not have links for use of the CC0.  They don't
37    need to, because the insn that sets the CC0 is always immediately
38    before the insn that tests it.  So we always regard a branch
39    insn as having a logical link to the preceding insn.  The same is true
40    for an insn explicitly using CC0.
41
42    We check (with use_crosses_set_p) to avoid combining in such a way
43    as to move a computation to a place where its value would be different.
44
45    Combination is done by mathematically substituting the previous
46    insn(s) values for the regs they set into the expressions in
47    the later insns that refer to these regs.  If the result is a valid insn
48    for our target machine, according to the machine description,
49    we install it, delete the earlier insns, and update the data flow
50    information (LOG_LINKS and REG_NOTES) for what we did.
51
52    There are a few exceptions where the dataflow information created by
53    flow.c aren't completely updated:
54
55    - reg_live_length is not updated
56    - reg_n_refs is not adjusted in the rare case when a register is
57      no longer required in a computation
58    - there are extremely rare cases (see distribute_regnotes) when a
59      REG_DEAD note is lost
60    - a LOG_LINKS entry that refers to an insn with multiple SETs may be
61      removed because there is no way to know which register it was 
62      linking
63
64    To simplify substitution, we combine only when the earlier insn(s)
65    consist of only a single assignment.  To simplify updating afterward,
66    we never combine when a subroutine call appears in the middle.
67
68    Since we do not represent assignments to CC0 explicitly except when that
69    is all an insn does, there is no LOG_LINKS entry in an insn that uses
70    the condition code for the insn that set the condition code.
71    Fortunately, these two insns must be consecutive.
72    Therefore, every JUMP_INSN is taken to have an implicit logical link
73    to the preceding insn.  This is not quite right, since non-jumps can
74    also use the condition code; but in practice such insns would not
75    combine anyway.  */
76
77 #include "config.h"
78 #include "system.h"
79 #include "rtl.h"
80 #include "tm_p.h"
81 #include "flags.h"
82 #include "regs.h"
83 #include "hard-reg-set.h"
84 #include "basic-block.h"
85 #include "insn-config.h"
86 #include "function.h"
87 /* Include expr.h after insn-config.h so we get HAVE_conditional_move. */
88 #include "expr.h"
89 #include "insn-flags.h"
90 #include "insn-codes.h"
91 #include "insn-attr.h"
92 #include "recog.h"
93 #include "real.h"
94 #include "toplev.h"
95
96 /* It is not safe to use ordinary gen_lowpart in combine.
97    Use gen_lowpart_for_combine instead.  See comments there.  */
98 #define gen_lowpart dont_use_gen_lowpart_you_dummy
99
100 /* Number of attempts to combine instructions in this function.  */
101
102 static int combine_attempts;
103
104 /* Number of attempts that got as far as substitution in this function.  */
105
106 static int combine_merges;
107
108 /* Number of instructions combined with added SETs in this function.  */
109
110 static int combine_extras;
111
112 /* Number of instructions combined in this function.  */
113
114 static int combine_successes;
115
116 /* Totals over entire compilation.  */
117
118 static int total_attempts, total_merges, total_extras, total_successes;
119
120 /* Define a default value for REVERSIBLE_CC_MODE.
121    We can never assume that a condition code mode is safe to reverse unless
122    the md tells us so.  */
123 #ifndef REVERSIBLE_CC_MODE
124 #define REVERSIBLE_CC_MODE(MODE) 0
125 #endif
126 \f
127 /* Vector mapping INSN_UIDs to cuids.
128    The cuids are like uids but increase monotonically always.
129    Combine always uses cuids so that it can compare them.
130    But actually renumbering the uids, which we used to do,
131    proves to be a bad idea because it makes it hard to compare
132    the dumps produced by earlier passes with those from later passes.  */
133
134 static int *uid_cuid;
135 static int max_uid_cuid;
136
137 /* Get the cuid of an insn.  */
138
139 #define INSN_CUID(INSN) \
140 (INSN_UID (INSN) > max_uid_cuid ? 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 an insn that belongs before subst_insn, but is not currently
173    on the insn chain.  */
174
175 static rtx subst_prev_insn;
176
177 /* This is the lowest CUID that `subst' is currently dealing with.
178    get_last_value will not return a value if the register was set at or
179    after this CUID.  If not for this mechanism, we could get confused if
180    I2 or I1 in try_combine were an insn that used the old value of a register
181    to obtain a new value.  In that case, we might erroneously get the
182    new value of the register when we wanted the old one.  */
183
184 static int subst_low_cuid;
185
186 /* This contains any hard registers that are used in newpat; reg_dead_at_p
187    must consider all these registers to be always live.  */
188
189 static HARD_REG_SET newpat_used_regs;
190
191 /* This is an insn to which a LOG_LINKS entry has been added.  If this
192    insn is the earlier than I2 or I3, combine should rescan starting at
193    that location.  */
194
195 static rtx added_links_insn;
196
197 /* Basic block number of the block in which we are performing combines.  */
198 static int this_basic_block;
199
200 /* A bitmap indicating which blocks had registers go dead at entry.  
201    After combine, we'll need to re-do global life analysis with 
202    those blocks as starting points.  */
203 static sbitmap refresh_blocks;
204 static int need_refresh;
205 \f
206 /* The next group of arrays allows the recording of the last value assigned
207    to (hard or pseudo) register n.  We use this information to see if a
208    operation being processed is redundant given a prior operation performed
209    on the register.  For example, an `and' with a constant is redundant if
210    all the zero bits are already known to be turned off.
211
212    We use an approach similar to that used by cse, but change it in the
213    following ways:
214
215    (1) We do not want to reinitialize at each label.
216    (2) It is useful, but not critical, to know the actual value assigned
217        to a register.  Often just its form is helpful.
218
219    Therefore, we maintain the following arrays:
220
221    reg_last_set_value           the last value assigned
222    reg_last_set_label           records the value of label_tick when the
223                                 register was assigned
224    reg_last_set_table_tick      records the value of label_tick when a
225                                 value using the register is assigned
226    reg_last_set_invalid         set to non-zero when it is not valid
227                                 to use the value of this register in some
228                                 register's value
229
230    To understand the usage of these tables, it is important to understand
231    the distinction between the value in reg_last_set_value being valid
232    and the register being validly contained in some other expression in the
233    table.
234
235    Entry I in reg_last_set_value is valid if it is non-zero, and either
236    reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick.
237
238    Register I may validly appear in any expression returned for the value
239    of another register if reg_n_sets[i] is 1.  It may also appear in the
240    value for register J if reg_last_set_label[i] < reg_last_set_label[j] or
241    reg_last_set_invalid[j] is zero.
242
243    If an expression is found in the table containing a register which may
244    not validly appear in an expression, the register is replaced by
245    something that won't match, (clobber (const_int 0)).
246
247    reg_last_set_invalid[i] is set non-zero when register I is being assigned
248    to and reg_last_set_table_tick[i] == label_tick.  */
249
250 /* Record last value assigned to (hard or pseudo) register n.  */
251
252 static rtx *reg_last_set_value;
253
254 /* Record the value of label_tick when the value for register n is placed in
255    reg_last_set_value[n].  */
256
257 static int *reg_last_set_label;
258
259 /* Record the value of label_tick when an expression involving register n
260    is placed in reg_last_set_value.  */
261
262 static int *reg_last_set_table_tick;
263
264 /* Set non-zero if references to register n in expressions should not be
265    used.  */
266
267 static char *reg_last_set_invalid;
268
269 /* Incremented for each label.  */
270
271 static int label_tick;
272
273 /* Some registers that are set more than once and used in more than one
274    basic block are nevertheless always set in similar ways.  For example,
275    a QImode register may be loaded from memory in two places on a machine
276    where byte loads zero extend.
277
278    We record in the following array what we know about the nonzero
279    bits of a register, specifically which bits are known to be zero.
280
281    If an entry is zero, it means that we don't know anything special.  */
282
283 static unsigned HOST_WIDE_INT *reg_nonzero_bits;
284
285 /* Mode used to compute significance in reg_nonzero_bits.  It is the largest
286    integer mode that can fit in HOST_BITS_PER_WIDE_INT.  */
287
288 static enum machine_mode nonzero_bits_mode;
289
290 /* Nonzero if we know that a register has some leading bits that are always
291    equal to the sign bit.  */
292
293 static char *reg_sign_bit_copies;
294
295 /* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used.
296    It is zero while computing them and after combine has completed.  This
297    former test prevents propagating values based on previously set values,
298    which can be incorrect if a variable is modified in a loop.  */
299
300 static int nonzero_sign_valid;
301
302 /* These arrays are maintained in parallel with reg_last_set_value
303    and are used to store the mode in which the register was last set,
304    the bits that were known to be zero when it was last set, and the
305    number of sign bits copies it was known to have when it was last set.  */
306
307 static enum machine_mode *reg_last_set_mode;
308 static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits;
309 static char *reg_last_set_sign_bit_copies;
310 \f
311 /* Record one modification to rtl structure
312    to be undone by storing old_contents into *where.
313    is_int is 1 if the contents are an int.  */
314
315 struct undo
316 {
317   struct undo *next;
318   int is_int;
319   union {rtx r; int i;} old_contents;
320   union {rtx *r; int *i;} where;
321 };
322
323 /* Record a bunch of changes to be undone, up to MAX_UNDO of them.
324    num_undo says how many are currently recorded.
325
326    storage is nonzero if we must undo the allocation of new storage.
327    The value of storage is what to pass to obfree.
328
329    other_insn is nonzero if we have modified some other insn in the process
330    of working on subst_insn.  It must be verified too.
331
332    previous_undos is the value of undobuf.undos when we started processing
333    this substitution.  This will prevent gen_rtx_combine from re-used a piece
334    from the previous expression.  Doing so can produce circular rtl
335    structures.  */
336
337 struct undobuf
338 {
339   char *storage;
340   struct undo *undos;
341   struct undo *frees;
342   struct undo *previous_undos;
343   rtx other_insn;
344 };
345
346 static struct undobuf undobuf;
347
348 /* Number of times the pseudo being substituted for
349    was found and replaced.  */
350
351 static int n_occurrences;
352
353 static void do_SUBST                    PROTO((rtx *, rtx));
354 static void do_SUBST_INT                PROTO((int *, int));
355 static void init_reg_last_arrays        PROTO((void));
356 static void setup_incoming_promotions   PROTO((void));
357 static void set_nonzero_bits_and_sign_copies  PROTO((rtx, rtx, void *));
358 static int can_combine_p        PROTO((rtx, rtx, rtx, rtx, rtx *, rtx *));
359 static int sets_function_arg_p  PROTO((rtx));
360 static int combinable_i3pat     PROTO((rtx, rtx *, rtx, rtx, int, rtx *));
361 static rtx try_combine          PROTO((rtx, rtx, rtx));
362 static void undo_all            PROTO((void));
363 static rtx *find_split_point    PROTO((rtx *, rtx));
364 static rtx subst                PROTO((rtx, rtx, rtx, int, int));
365 static rtx simplify_rtx         PROTO((rtx, enum machine_mode, int, int));
366 static rtx simplify_if_then_else  PROTO((rtx));
367 static rtx simplify_set         PROTO((rtx));
368 static rtx simplify_logical     PROTO((rtx, int));
369 static rtx expand_compound_operation  PROTO((rtx));
370 static rtx expand_field_assignment  PROTO((rtx));
371 static rtx make_extraction      PROTO((enum machine_mode, rtx, int, rtx, int,
372                                        int, int, int));
373 static rtx extract_left_shift   PROTO((rtx, int));
374 static rtx make_compound_operation  PROTO((rtx, enum rtx_code));
375 static int get_pos_from_mask    PROTO((unsigned HOST_WIDE_INT, int *));
376 static rtx force_to_mode        PROTO((rtx, enum machine_mode,
377                                        unsigned HOST_WIDE_INT, rtx, int));
378 static rtx if_then_else_cond    PROTO((rtx, rtx *, rtx *));
379 static rtx known_cond           PROTO((rtx, enum rtx_code, rtx, rtx));
380 static int rtx_equal_for_field_assignment_p PROTO((rtx, rtx));
381 static rtx make_field_assignment  PROTO((rtx));
382 static rtx apply_distributive_law  PROTO((rtx));
383 static rtx simplify_and_const_int  PROTO((rtx, enum machine_mode, rtx,
384                                           unsigned HOST_WIDE_INT));
385 static unsigned HOST_WIDE_INT nonzero_bits  PROTO((rtx, enum machine_mode));
386 static int num_sign_bit_copies  PROTO((rtx, enum machine_mode));
387 static int merge_outer_ops      PROTO((enum rtx_code *, HOST_WIDE_INT *,
388                                        enum rtx_code, HOST_WIDE_INT,
389                                        enum machine_mode, int *));
390 static rtx simplify_shift_const PROTO((rtx, enum rtx_code, enum machine_mode,
391                                        rtx, int));
392 static int recog_for_combine    PROTO((rtx *, rtx, rtx *));
393 static rtx gen_lowpart_for_combine  PROTO((enum machine_mode, rtx));
394 static rtx gen_rtx_combine PVPROTO((enum rtx_code code, enum machine_mode mode,
395                                   ...));
396 static rtx gen_binary           PROTO((enum rtx_code, enum machine_mode,
397                                        rtx, rtx));
398 static rtx gen_unary            PROTO((enum rtx_code, enum machine_mode,
399                                        enum machine_mode, rtx));
400 static enum rtx_code simplify_comparison  PROTO((enum rtx_code, rtx *, rtx *));
401 static int reversible_comparison_p  PROTO((rtx));
402 static void update_table_tick   PROTO((rtx));
403 static void record_value_for_reg  PROTO((rtx, rtx, rtx));
404 static void record_dead_and_set_regs_1  PROTO((rtx, rtx, void *));
405 static void record_dead_and_set_regs  PROTO((rtx));
406 static int get_last_value_validate  PROTO((rtx *, rtx, int, int));
407 static rtx get_last_value       PROTO((rtx));
408 static int use_crosses_set_p    PROTO((rtx, int));
409 static void reg_dead_at_p_1     PROTO((rtx, rtx, void *));
410 static int reg_dead_at_p        PROTO((rtx, rtx));
411 static void move_deaths         PROTO((rtx, rtx, int, rtx, rtx *));
412 static int reg_bitfield_target_p  PROTO((rtx, rtx));
413 static void distribute_notes    PROTO((rtx, rtx, rtx, rtx, rtx, rtx));
414 static void distribute_links    PROTO((rtx));
415 static void mark_used_regs_combine PROTO((rtx));
416 static int insn_cuid            PROTO((rtx));
417 \f
418 /* Substitute NEWVAL, an rtx expression, into INTO, a place in some
419    insn.  The substitution can be undone by undo_all.  If INTO is already
420    set to NEWVAL, do not record this change.  Because computing NEWVAL might
421    also call SUBST, we have to compute it before we put anything into
422    the undo table.  */
423
424 static void
425 do_SUBST(into, newval)
426      rtx *into, newval;
427 {
428   struct undo *buf;
429   rtx oldval = *into;
430
431   if (oldval == newval)
432     return;
433
434   if (undobuf.frees)
435     buf = undobuf.frees, undobuf.frees = buf->next;
436   else
437     buf = (struct undo *) xmalloc (sizeof (struct undo));
438
439   buf->is_int = 0;
440   buf->where.r = into;
441   buf->old_contents.r = oldval;
442   *into = newval;
443
444   buf->next = undobuf.undos, undobuf.undos = buf;
445 }
446
447 #define SUBST(INTO, NEWVAL)     do_SUBST(&(INTO), (NEWVAL))
448
449 /* Similar to SUBST, but NEWVAL is an int expression.  Note that substitution
450    for the value of a HOST_WIDE_INT value (including CONST_INT) is
451    not safe.  */
452
453 static void
454 do_SUBST_INT(into, newval)
455      int *into, newval;
456 {
457   struct undo *buf;
458   int oldval = *into;
459
460   if (oldval == newval)
461     return;
462
463   if (undobuf.frees)
464     buf = undobuf.frees, undobuf.frees = buf->next;
465   else
466     buf = (struct undo *) xmalloc (sizeof (struct undo));
467
468   buf->is_int = 1;
469   buf->where.i = into;
470   buf->old_contents.i = oldval;
471   *into = newval;
472
473   buf->next = undobuf.undos, undobuf.undos = buf;
474 }
475
476 #define SUBST_INT(INTO, NEWVAL)  do_SUBST_INT(&(INTO), (NEWVAL))
477 \f
478 /* Main entry point for combiner.  F is the first insn of the function.
479    NREGS is the first unused pseudo-reg number.  */
480
481 void
482 combine_instructions (f, nregs)
483      rtx f;
484      int nregs;
485 {
486   register rtx insn, next;
487 #ifdef HAVE_cc0
488   register rtx prev;
489 #endif
490   register int i;
491   register rtx links, nextlinks;
492
493   combine_attempts = 0;
494   combine_merges = 0;
495   combine_extras = 0;
496   combine_successes = 0;
497   undobuf.undos = undobuf.previous_undos = 0;
498
499   combine_max_regno = nregs;
500
501   reg_nonzero_bits
502     = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT));
503   reg_sign_bit_copies = (char *) alloca (nregs * sizeof (char));
504
505   bzero ((char *) reg_nonzero_bits, nregs * sizeof (HOST_WIDE_INT));
506   bzero (reg_sign_bit_copies, nregs * sizeof (char));
507
508   reg_last_death = (rtx *) alloca (nregs * sizeof (rtx));
509   reg_last_set = (rtx *) alloca (nregs * sizeof (rtx));
510   reg_last_set_value = (rtx *) alloca (nregs * sizeof (rtx));
511   reg_last_set_table_tick = (int *) alloca (nregs * sizeof (int));
512   reg_last_set_label = (int *) alloca (nregs * sizeof (int));
513   reg_last_set_invalid = (char *) alloca (nregs * sizeof (char));
514   reg_last_set_mode
515     = (enum machine_mode *) alloca (nregs * sizeof (enum machine_mode));
516   reg_last_set_nonzero_bits
517     = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT));
518   reg_last_set_sign_bit_copies
519     = (char *) alloca (nregs * sizeof (char));
520
521   init_reg_last_arrays ();
522
523   init_recog_no_volatile ();
524
525   /* Compute maximum uid value so uid_cuid can be allocated.  */
526
527   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
528     if (INSN_UID (insn) > i)
529       i = INSN_UID (insn);
530
531   uid_cuid = (int *) alloca ((i + 1) * sizeof (int));
532   max_uid_cuid = i;
533
534   nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0);
535
536   /* Don't use reg_nonzero_bits when computing it.  This can cause problems
537      when, for example, we have j <<= 1 in a loop.  */
538
539   nonzero_sign_valid = 0;
540
541   /* Compute the mapping from uids to cuids.
542      Cuids are numbers assigned to insns, like uids,
543      except that cuids increase monotonically through the code. 
544
545      Scan all SETs and see if we can deduce anything about what
546      bits are known to be zero for some registers and how many copies
547      of the sign bit are known to exist for those registers.
548
549      Also set any known values so that we can use it while searching
550      for what bits are known to be set.  */
551
552   label_tick = 1;
553
554   /* We need to initialize it here, because record_dead_and_set_regs may call
555      get_last_value.  */
556   subst_prev_insn = NULL_RTX;
557
558   setup_incoming_promotions ();
559
560   refresh_blocks = sbitmap_alloc (n_basic_blocks);
561   sbitmap_zero (refresh_blocks);
562   need_refresh = 0;
563
564   for (insn = f, i = 0; insn; insn = NEXT_INSN (insn))
565     {
566       uid_cuid[INSN_UID (insn)] = ++i;
567       subst_low_cuid = i;
568       subst_insn = insn;
569
570       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
571         {
572           note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies, 
573                        NULL);
574           record_dead_and_set_regs (insn);
575
576 #ifdef AUTO_INC_DEC
577           for (links = REG_NOTES (insn); links; links = XEXP (links, 1))
578             if (REG_NOTE_KIND (links) == REG_INC)
579               set_nonzero_bits_and_sign_copies (XEXP (links, 0), NULL_RTX,
580                                                 NULL);
581 #endif
582         }
583
584       if (GET_CODE (insn) == CODE_LABEL)
585         label_tick++;
586     }
587
588   nonzero_sign_valid = 1;
589
590   /* Now scan all the insns in forward order.  */
591
592   this_basic_block = -1;
593   label_tick = 1;
594   last_call_cuid = 0;
595   mem_last_set = 0;
596   init_reg_last_arrays ();
597   setup_incoming_promotions ();
598
599   for (insn = f; insn; insn = next ? next : NEXT_INSN (insn))
600     {
601       next = 0;
602
603       /* If INSN starts a new basic block, update our basic block number.  */
604       if (this_basic_block + 1 < n_basic_blocks
605           && BLOCK_HEAD (this_basic_block + 1) == insn)
606         this_basic_block++;
607
608       if (GET_CODE (insn) == CODE_LABEL)
609         label_tick++;
610
611       else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
612         {
613           /* Try this insn with each insn it links back to.  */
614
615           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
616             if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX)) != 0)
617               goto retry;
618
619           /* Try each sequence of three linked insns ending with this one.  */
620
621           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
622             for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks;
623                  nextlinks = XEXP (nextlinks, 1))
624               if ((next = try_combine (insn, XEXP (links, 0),
625                                        XEXP (nextlinks, 0))) != 0)
626                 goto retry;
627
628 #ifdef HAVE_cc0
629           /* Try to combine a jump insn that uses CC0
630              with a preceding insn that sets CC0, and maybe with its
631              logical predecessor as well.
632              This is how we make decrement-and-branch insns.
633              We need this special code because data flow connections
634              via CC0 do not get entered in LOG_LINKS.  */
635
636           if (GET_CODE (insn) == JUMP_INSN
637               && (prev = prev_nonnote_insn (insn)) != 0
638               && GET_CODE (prev) == INSN
639               && sets_cc0_p (PATTERN (prev)))
640             {
641               if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
642                 goto retry;
643
644               for (nextlinks = LOG_LINKS (prev); nextlinks;
645                    nextlinks = XEXP (nextlinks, 1))
646                 if ((next = try_combine (insn, prev,
647                                          XEXP (nextlinks, 0))) != 0)
648                   goto retry;
649             }
650
651           /* Do the same for an insn that explicitly references CC0.  */
652           if (GET_CODE (insn) == INSN
653               && (prev = prev_nonnote_insn (insn)) != 0
654               && GET_CODE (prev) == INSN
655               && sets_cc0_p (PATTERN (prev))
656               && GET_CODE (PATTERN (insn)) == SET
657               && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn))))
658             {
659               if ((next = try_combine (insn, prev, NULL_RTX)) != 0)
660                 goto retry;
661
662               for (nextlinks = LOG_LINKS (prev); nextlinks;
663                    nextlinks = XEXP (nextlinks, 1))
664                 if ((next = try_combine (insn, prev,
665                                          XEXP (nextlinks, 0))) != 0)
666                   goto retry;
667             }
668
669           /* Finally, see if any of the insns that this insn links to
670              explicitly references CC0.  If so, try this insn, that insn,
671              and its predecessor if it sets CC0.  */
672           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
673             if (GET_CODE (XEXP (links, 0)) == INSN
674                 && GET_CODE (PATTERN (XEXP (links, 0))) == SET
675                 && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0))))
676                 && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0
677                 && GET_CODE (prev) == INSN
678                 && sets_cc0_p (PATTERN (prev))
679                 && (next = try_combine (insn, XEXP (links, 0), prev)) != 0)
680               goto retry;
681 #endif
682
683           /* Try combining an insn with two different insns whose results it
684              uses.  */
685           for (links = LOG_LINKS (insn); links; links = XEXP (links, 1))
686             for (nextlinks = XEXP (links, 1); nextlinks;
687                  nextlinks = XEXP (nextlinks, 1))
688               if ((next = try_combine (insn, XEXP (links, 0),
689                                        XEXP (nextlinks, 0))) != 0)
690                 goto retry;
691
692           if (GET_CODE (insn) != NOTE)
693             record_dead_and_set_regs (insn);
694
695         retry:
696           ;
697         }
698     }
699
700   if (need_refresh)
701     {
702       compute_bb_for_insn (get_max_uid ());
703       update_life_info (refresh_blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
704                         PROP_DEATH_NOTES);
705     }
706   sbitmap_free (refresh_blocks);
707
708   total_attempts += combine_attempts;
709   total_merges += combine_merges;
710   total_extras += combine_extras;
711   total_successes += combine_successes;
712
713   nonzero_sign_valid = 0;
714
715   /* Make recognizer allow volatile MEMs again.  */
716   init_recog ();
717 }
718
719 /* Wipe the reg_last_xxx arrays in preparation for another pass.  */
720
721 static void
722 init_reg_last_arrays ()
723 {
724   int nregs = combine_max_regno;
725
726   bzero ((char *) reg_last_death, nregs * sizeof (rtx));
727   bzero ((char *) reg_last_set, nregs * sizeof (rtx));
728   bzero ((char *) reg_last_set_value, nregs * sizeof (rtx));
729   bzero ((char *) reg_last_set_table_tick, nregs * sizeof (int));
730   bzero ((char *) reg_last_set_label, nregs * sizeof (int));
731   bzero (reg_last_set_invalid, nregs * sizeof (char));
732   bzero ((char *) reg_last_set_mode, nregs * sizeof (enum machine_mode));
733   bzero ((char *) reg_last_set_nonzero_bits, nregs * sizeof (HOST_WIDE_INT));
734   bzero (reg_last_set_sign_bit_copies, nregs * sizeof (char));
735 }
736 \f
737 /* Set up any promoted values for incoming argument registers.  */
738
739 static void
740 setup_incoming_promotions ()
741 {
742 #ifdef PROMOTE_FUNCTION_ARGS
743   int regno;
744   rtx reg;
745   enum machine_mode mode;
746   int unsignedp;
747   rtx first = get_insns ();
748
749   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
750     if (FUNCTION_ARG_REGNO_P (regno)
751         && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0)
752       {
753         record_value_for_reg
754           (reg, first, gen_rtx_fmt_e ((unsignedp ? ZERO_EXTEND
755                                        : SIGN_EXTEND),
756                                       GET_MODE (reg),
757                                       gen_rtx_CLOBBER (mode, const0_rtx)));
758       }
759 #endif
760 }
761 \f
762 /* Called via note_stores.  If X is a pseudo that is narrower than
763    HOST_BITS_PER_WIDE_INT and is being set, record what bits are known zero.
764
765    If we are setting only a portion of X and we can't figure out what
766    portion, assume all bits will be used since we don't know what will
767    be happening.
768
769    Similarly, set how many bits of X are known to be copies of the sign bit
770    at all locations in the function.  This is the smallest number implied 
771    by any set of X.  */
772
773 static void
774 set_nonzero_bits_and_sign_copies (x, set, data)
775      rtx x;
776      rtx set;
777      void *data ATTRIBUTE_UNUSED;
778 {
779   int num;
780
781   if (GET_CODE (x) == REG
782       && REGNO (x) >= FIRST_PSEUDO_REGISTER
783       /* If this register is undefined at the start of the file, we can't
784          say what its contents were.  */
785       && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, REGNO (x))
786       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
787     {
788       if (set == 0 || GET_CODE (set) == CLOBBER)
789         {
790           reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
791           reg_sign_bit_copies[REGNO (x)] = 1;
792           return;
793         }
794
795       /* If this is a complex assignment, see if we can convert it into a
796          simple assignment.  */
797       set = expand_field_assignment (set);
798
799       /* If this is a simple assignment, or we have a paradoxical SUBREG,
800          set what we know about X.  */
801
802       if (SET_DEST (set) == x
803           || (GET_CODE (SET_DEST (set)) == SUBREG
804               && (GET_MODE_SIZE (GET_MODE (SET_DEST (set)))
805                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set)))))
806               && SUBREG_REG (SET_DEST (set)) == x))
807         {
808           rtx src = SET_SRC (set);
809
810 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
811           /* If X is narrower than a word and SRC is a non-negative
812              constant that would appear negative in the mode of X,
813              sign-extend it for use in reg_nonzero_bits because some
814              machines (maybe most) will actually do the sign-extension
815              and this is the conservative approach. 
816
817              ??? For 2.5, try to tighten up the MD files in this regard
818              instead of this kludge.  */
819
820           if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
821               && GET_CODE (src) == CONST_INT
822               && INTVAL (src) > 0
823               && 0 != (INTVAL (src)
824                        & ((HOST_WIDE_INT) 1
825                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
826             src = GEN_INT (INTVAL (src)
827                            | ((HOST_WIDE_INT) (-1)
828                               << GET_MODE_BITSIZE (GET_MODE (x))));
829 #endif
830
831           reg_nonzero_bits[REGNO (x)]
832             |= nonzero_bits (src, nonzero_bits_mode);
833           num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x));
834           if (reg_sign_bit_copies[REGNO (x)] == 0
835               || reg_sign_bit_copies[REGNO (x)] > num)
836             reg_sign_bit_copies[REGNO (x)] = num;
837         }
838       else
839         {
840           reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x));
841           reg_sign_bit_copies[REGNO (x)] = 1;
842         }
843     }
844 }
845 \f
846 /* See if INSN can be combined into I3.  PRED and SUCC are optionally
847    insns that were previously combined into I3 or that will be combined
848    into the merger of INSN and I3.
849
850    Return 0 if the combination is not allowed for any reason.
851
852    If the combination is allowed, *PDEST will be set to the single 
853    destination of INSN and *PSRC to the single source, and this function
854    will return 1.  */
855
856 static int
857 can_combine_p (insn, i3, pred, succ, pdest, psrc)
858      rtx insn;
859      rtx i3;
860      rtx pred ATTRIBUTE_UNUSED;
861      rtx succ;
862      rtx *pdest, *psrc;
863 {
864   int i;
865   rtx set = 0, src, dest;
866   rtx p;
867 #ifdef AUTO_INC_DEC
868   rtx link;
869 #endif
870   int all_adjacent = (succ ? (next_active_insn (insn) == succ
871                               && next_active_insn (succ) == i3)
872                       : next_active_insn (insn) == i3);
873
874   /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0.
875      or a PARALLEL consisting of such a SET and CLOBBERs. 
876
877      If INSN has CLOBBER parallel parts, ignore them for our processing.
878      By definition, these happen during the execution of the insn.  When it
879      is merged with another insn, all bets are off.  If they are, in fact,
880      needed and aren't also supplied in I3, they may be added by
881      recog_for_combine.  Otherwise, it won't match. 
882
883      We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED
884      note.
885
886      Get the source and destination of INSN.  If more than one, can't 
887      combine.  */
888      
889   if (GET_CODE (PATTERN (insn)) == SET)
890     set = PATTERN (insn);
891   else if (GET_CODE (PATTERN (insn)) == PARALLEL
892            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
893     {
894       for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
895         {
896           rtx elt = XVECEXP (PATTERN (insn), 0, i);
897
898           switch (GET_CODE (elt))
899             {
900             /* This is important to combine floating point insns
901                for the SH4 port.  */
902             case USE:
903               /* Combining an isolated USE doesn't make sense.
904                  We depend here on combinable_i3_pat to reject them.  */
905               /* The code below this loop only verifies that the inputs of
906                  the SET in INSN do not change.  We call reg_set_between_p
907                  to verify that the REG in the USE does not change betweeen
908                  I3 and INSN.
909                  If the USE in INSN was for a pseudo register, the matching
910                  insn pattern will likely match any register; combining this
911                  with any other USE would only be safe if we knew that the
912                  used registers have identical values, or if there was
913                  something to tell them apart, e.g. different modes.  For
914                  now, we forgo such compilcated tests and simply disallow
915                  combining of USES of pseudo registers with any other USE.  */
916               if (GET_CODE (XEXP (elt, 0)) == REG
917                   && GET_CODE (PATTERN (i3)) == PARALLEL)
918                 {
919                   rtx i3pat = PATTERN (i3);
920                   int i = XVECLEN (i3pat, 0) - 1;
921                   int regno = REGNO (XEXP (elt, 0));
922                   do
923                     {
924                       rtx i3elt = XVECEXP (i3pat, 0, i);
925                       if (GET_CODE (i3elt) == USE
926                           && GET_CODE (XEXP (i3elt, 0)) == REG
927                           && (REGNO (XEXP (i3elt, 0)) == regno
928                               ? reg_set_between_p (XEXP (elt, 0),
929                                                    PREV_INSN (insn), i3)
930                               : regno >= FIRST_PSEUDO_REGISTER))
931                         return 0;
932                     }
933                   while (--i >= 0);
934                 }
935               break;
936
937               /* We can ignore CLOBBERs.  */
938             case CLOBBER:
939               break;
940
941             case SET:
942               /* Ignore SETs whose result isn't used but not those that
943                  have side-effects.  */
944               if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt))
945                   && ! side_effects_p (elt))
946                 break;
947
948               /* If we have already found a SET, this is a second one and
949                  so we cannot combine with this insn.  */
950               if (set)
951                 return 0;
952
953               set = elt;
954               break;
955
956             default:
957               /* Anything else means we can't combine.  */
958               return 0;
959             }
960         }
961
962       if (set == 0
963           /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs,
964              so don't do anything with it.  */
965           || GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
966         return 0;
967     }
968   else
969     return 0;
970
971   if (set == 0)
972     return 0;
973
974   set = expand_field_assignment (set);
975   src = SET_SRC (set), dest = SET_DEST (set);
976
977   /* Don't eliminate a store in the stack pointer.  */
978   if (dest == stack_pointer_rtx
979       /* If we couldn't eliminate a field assignment, we can't combine.  */
980       || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART
981       /* Don't combine with an insn that sets a register to itself if it has
982          a REG_EQUAL note.  This may be part of a REG_NO_CONFLICT sequence.  */
983       || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX))
984       /* Can't merge a function call.  */
985       || GET_CODE (src) == CALL
986       /* Don't eliminate a function call argument.  */
987       || (GET_CODE (i3) == CALL_INSN
988           && (find_reg_fusage (i3, USE, dest)
989               || (GET_CODE (dest) == REG
990                   && REGNO (dest) < FIRST_PSEUDO_REGISTER
991                   && global_regs[REGNO (dest)])))
992       /* Don't substitute into an incremented register.  */
993       || FIND_REG_INC_NOTE (i3, dest)
994       || (succ && FIND_REG_INC_NOTE (succ, dest))
995 #if 0
996       /* Don't combine the end of a libcall into anything.  */
997       /* ??? This gives worse code, and appears to be unnecessary, since no
998          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  Local-alloc does
999          use REG_RETVAL notes for noconflict blocks, but other code here
1000          makes sure that those insns don't disappear.  */
1001       || find_reg_note (insn, REG_RETVAL, NULL_RTX)
1002 #endif
1003       /* Make sure that DEST is not used after SUCC but before I3.  */
1004       || (succ && ! all_adjacent
1005           && reg_used_between_p (dest, succ, i3))
1006       /* Make sure that the value that is to be substituted for the register
1007          does not use any registers whose values alter in between.  However,
1008          If the insns are adjacent, a use can't cross a set even though we
1009          think it might (this can happen for a sequence of insns each setting
1010          the same destination; reg_last_set of that register might point to
1011          a NOTE).  If INSN has a REG_EQUIV note, the register is always
1012          equivalent to the memory so the substitution is valid even if there
1013          are intervening stores.  Also, don't move a volatile asm or
1014          UNSPEC_VOLATILE across any other insns.  */
1015       || (! all_adjacent
1016           && (((GET_CODE (src) != MEM
1017                 || ! find_reg_note (insn, REG_EQUIV, src))
1018                && use_crosses_set_p (src, INSN_CUID (insn)))
1019               || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src))
1020               || GET_CODE (src) == UNSPEC_VOLATILE))
1021       /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get
1022          better register allocation by not doing the combine.  */
1023       || find_reg_note (i3, REG_NO_CONFLICT, dest)
1024       || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest))
1025       /* Don't combine across a CALL_INSN, because that would possibly
1026          change whether the life span of some REGs crosses calls or not,
1027          and it is a pain to update that information.
1028          Exception: if source is a constant, moving it later can't hurt.
1029          Accept that special case, because it helps -fforce-addr a lot.  */
1030       || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src)))
1031     return 0;
1032
1033   /* DEST must either be a REG or CC0.  */
1034   if (GET_CODE (dest) == REG)
1035     {
1036       /* If register alignment is being enforced for multi-word items in all
1037          cases except for parameters, it is possible to have a register copy
1038          insn referencing a hard register that is not allowed to contain the
1039          mode being copied and which would not be valid as an operand of most
1040          insns.  Eliminate this problem by not combining with such an insn.
1041
1042          Also, on some machines we don't want to extend the life of a hard
1043          register.
1044
1045          This is the same test done in can_combine except that we don't test
1046          if SRC is a CALL operation to permit a hard register with
1047          SMALL_REGISTER_CLASSES, and that we have to take all_adjacent
1048          into account.  */
1049
1050       if (GET_CODE (src) == REG
1051           && ((REGNO (dest) < FIRST_PSEUDO_REGISTER
1052                && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest)))
1053               /* Don't extend the life of a hard register unless it is
1054                  user variable (if we have few registers) or it can't
1055                  fit into the desired register (meaning something special
1056                  is going on).
1057                  Also avoid substituting a return register into I3, because
1058                  reload can't handle a conflict with constraints of other
1059                  inputs.  */
1060               || (REGNO (src) < FIRST_PSEUDO_REGISTER
1061                   && (! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src))
1062                       || (SMALL_REGISTER_CLASSES
1063                           && ((! all_adjacent && ! REG_USERVAR_P (src))
1064                               || (FUNCTION_VALUE_REGNO_P (REGNO (src))
1065                                   && ! REG_USERVAR_P (src))))))))
1066         return 0;
1067     }
1068   else if (GET_CODE (dest) != CC0)
1069     return 0;
1070
1071   /* Don't substitute for a register intended as a clobberable operand.
1072      Similarly, don't substitute an expression containing a register that
1073      will be clobbered in I3.  */
1074   if (GET_CODE (PATTERN (i3)) == PARALLEL)
1075     for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--)
1076       if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER
1077           && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0),
1078                                        src)
1079               || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest)))
1080         return 0;
1081
1082   /* If INSN contains anything volatile, or is an `asm' (whether volatile
1083      or not), reject, unless nothing volatile comes between it and I3 */
1084
1085   if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src))
1086     {
1087       /* Make sure succ doesn't contain a volatile reference.  */
1088       if (succ != 0 && volatile_refs_p (PATTERN (succ)))
1089         return 0;
1090   
1091       for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1092         if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
1093           && p != succ && volatile_refs_p (PATTERN (p)))
1094         return 0;
1095     }
1096
1097   /* If INSN is an asm, and DEST is a hard register, reject, since it has
1098      to be an explicit register variable, and was chosen for a reason.  */
1099
1100   if (GET_CODE (src) == ASM_OPERANDS
1101       && GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER)
1102     return 0;
1103
1104   /* If there are any volatile insns between INSN and I3, reject, because
1105      they might affect machine state.  */
1106
1107   for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p))
1108     if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
1109         && p != succ && volatile_insn_p (PATTERN (p)))
1110       return 0;
1111
1112   /* If INSN or I2 contains an autoincrement or autodecrement,
1113      make sure that register is not used between there and I3,
1114      and not already used in I3 either.
1115      Also insist that I3 not be a jump; if it were one
1116      and the incremented register were spilled, we would lose.  */
1117
1118 #ifdef AUTO_INC_DEC
1119   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1120     if (REG_NOTE_KIND (link) == REG_INC
1121         && (GET_CODE (i3) == JUMP_INSN
1122             || reg_used_between_p (XEXP (link, 0), insn, i3)
1123             || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3))))
1124       return 0;
1125 #endif
1126
1127 #ifdef HAVE_cc0
1128   /* Don't combine an insn that follows a CC0-setting insn.
1129      An insn that uses CC0 must not be separated from the one that sets it.
1130      We do, however, allow I2 to follow a CC0-setting insn if that insn
1131      is passed as I1; in that case it will be deleted also.
1132      We also allow combining in this case if all the insns are adjacent
1133      because that would leave the two CC0 insns adjacent as well.
1134      It would be more logical to test whether CC0 occurs inside I1 or I2,
1135      but that would be much slower, and this ought to be equivalent.  */
1136
1137   p = prev_nonnote_insn (insn);
1138   if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p))
1139       && ! all_adjacent)
1140     return 0;
1141 #endif
1142
1143   /* If we get here, we have passed all the tests and the combination is
1144      to be allowed.  */
1145
1146   *pdest = dest;
1147   *psrc = src;
1148
1149   return 1;
1150 }
1151 \f
1152 /* Check if PAT is an insn - or a part of it - used to set up an
1153    argument for a function in a hard register.  */
1154
1155 static int
1156 sets_function_arg_p (pat)
1157      rtx pat;
1158 {
1159   int i;
1160   rtx inner_dest;
1161
1162   switch (GET_CODE (pat))
1163     {
1164     case INSN:
1165       return sets_function_arg_p (PATTERN (pat));
1166
1167     case PARALLEL:
1168       for (i = XVECLEN (pat, 0); --i >= 0;)
1169         if (sets_function_arg_p (XVECEXP (pat, 0, i)))
1170           return 1;
1171
1172       break;
1173
1174     case SET:
1175       inner_dest = SET_DEST (pat);
1176       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1177              || GET_CODE (inner_dest) == SUBREG
1178              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1179         inner_dest = XEXP (inner_dest, 0);
1180
1181       return (GET_CODE (inner_dest) == REG
1182               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1183               && FUNCTION_ARG_REGNO_P (REGNO (inner_dest)));
1184
1185     default:
1186       break;
1187     }
1188
1189   return 0;
1190 }
1191
1192 /* LOC is the location within I3 that contains its pattern or the component
1193    of a PARALLEL of the pattern.  We validate that it is valid for combining.
1194
1195    One problem is if I3 modifies its output, as opposed to replacing it
1196    entirely, we can't allow the output to contain I2DEST or I1DEST as doing
1197    so would produce an insn that is not equivalent to the original insns.
1198
1199    Consider:
1200
1201          (set (reg:DI 101) (reg:DI 100))
1202          (set (subreg:SI (reg:DI 101) 0) <foo>)
1203
1204    This is NOT equivalent to:
1205
1206          (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>)
1207                     (set (reg:DI 101) (reg:DI 100))])
1208
1209    Not only does this modify 100 (in which case it might still be valid
1210    if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100. 
1211
1212    We can also run into a problem if I2 sets a register that I1
1213    uses and I1 gets directly substituted into I3 (not via I2).  In that
1214    case, we would be getting the wrong value of I2DEST into I3, so we
1215    must reject the combination.  This case occurs when I2 and I1 both
1216    feed into I3, rather than when I1 feeds into I2, which feeds into I3.
1217    If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source
1218    of a SET must prevent combination from occurring.
1219
1220    On machines where SMALL_REGISTER_CLASSES is non-zero, we don't combine
1221    if the destination of a SET is a hard register that isn't a user
1222    variable.
1223
1224    Before doing the above check, we first try to expand a field assignment
1225    into a set of logical operations.
1226
1227    If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which
1228    we place a register that is both set and used within I3.  If more than one
1229    such register is detected, we fail.
1230
1231    Return 1 if the combination is valid, zero otherwise.  */
1232
1233 static int
1234 combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed)
1235      rtx i3;
1236      rtx *loc;
1237      rtx i2dest;
1238      rtx i1dest;
1239      int i1_not_in_src;
1240      rtx *pi3dest_killed;
1241 {
1242   rtx x = *loc;
1243
1244   if (GET_CODE (x) == SET)
1245     {
1246       rtx set = expand_field_assignment (x);
1247       rtx dest = SET_DEST (set);
1248       rtx src = SET_SRC (set);
1249       rtx inner_dest = dest;
1250  
1251 #if 0
1252       rtx inner_src = src;
1253 #endif
1254
1255       SUBST (*loc, set);
1256
1257       while (GET_CODE (inner_dest) == STRICT_LOW_PART
1258              || GET_CODE (inner_dest) == SUBREG
1259              || GET_CODE (inner_dest) == ZERO_EXTRACT)
1260         inner_dest = XEXP (inner_dest, 0);
1261
1262   /* We probably don't need this any more now that LIMIT_RELOAD_CLASS
1263      was added.  */
1264 #if 0
1265       while (GET_CODE (inner_src) == STRICT_LOW_PART
1266              || GET_CODE (inner_src) == SUBREG
1267              || GET_CODE (inner_src) == ZERO_EXTRACT)
1268         inner_src = XEXP (inner_src, 0);
1269
1270       /* If it is better that two different modes keep two different pseudos,
1271          avoid combining them.  This avoids producing the following pattern
1272          on a 386:
1273           (set (subreg:SI (reg/v:QI 21) 0)
1274                (lshiftrt:SI (reg/v:SI 20)
1275                    (const_int 24)))
1276          If that were made, reload could not handle the pair of
1277          reg 20/21, since it would try to get any GENERAL_REGS
1278          but some of them don't handle QImode.  */
1279
1280       if (rtx_equal_p (inner_src, i2dest)
1281           && GET_CODE (inner_dest) == REG
1282           && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest)))
1283         return 0;
1284 #endif
1285
1286       /* Check for the case where I3 modifies its output, as
1287          discussed above.  */
1288       if ((inner_dest != dest
1289            && (reg_overlap_mentioned_p (i2dest, inner_dest)
1290                || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest))))
1291
1292           /* This is the same test done in can_combine_p except that we
1293              allow a hard register with SMALL_REGISTER_CLASSES if SRC is a
1294              CALL operation. Moreover, we can't test all_adjacent; we don't
1295              have to, since this instruction will stay in place, thus we are
1296              not considering increasing the lifetime of INNER_DEST.
1297
1298              Also, if this insn sets a function argument, combining it with
1299              something that might need a spill could clobber a previous
1300              function argument; the all_adjacent test in can_combine_p also
1301              checks this; here, we do a more specific test for this case.  */
1302              
1303           || (GET_CODE (inner_dest) == REG
1304               && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER
1305               && (! HARD_REGNO_MODE_OK (REGNO (inner_dest),
1306                                         GET_MODE (inner_dest))
1307                  || (SMALL_REGISTER_CLASSES && GET_CODE (src) != CALL
1308                      && ! REG_USERVAR_P (inner_dest)
1309                      && (FUNCTION_VALUE_REGNO_P (REGNO (inner_dest))
1310                          || (FUNCTION_ARG_REGNO_P (REGNO (inner_dest))
1311                              && i3 != 0
1312                              && sets_function_arg_p (prev_nonnote_insn (i3)))))))
1313           || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src)))
1314         return 0;
1315
1316       /* If DEST is used in I3, it is being killed in this insn,
1317          so record that for later. 
1318          Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the
1319          STACK_POINTER_REGNUM, since these are always considered to be
1320          live.  Similarly for ARG_POINTER_REGNUM if it is fixed.  */
1321       if (pi3dest_killed && GET_CODE (dest) == REG
1322           && reg_referenced_p (dest, PATTERN (i3))
1323           && REGNO (dest) != FRAME_POINTER_REGNUM
1324 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
1325           && REGNO (dest) != HARD_FRAME_POINTER_REGNUM
1326 #endif
1327 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
1328           && (REGNO (dest) != ARG_POINTER_REGNUM
1329               || ! fixed_regs [REGNO (dest)])
1330 #endif
1331           && REGNO (dest) != STACK_POINTER_REGNUM)
1332         {
1333           if (*pi3dest_killed)
1334             return 0;
1335
1336           *pi3dest_killed = dest;
1337         }
1338     }
1339
1340   else if (GET_CODE (x) == PARALLEL)
1341     {
1342       int i;
1343
1344       for (i = 0; i < XVECLEN (x, 0); i++)
1345         if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest,
1346                                 i1_not_in_src, pi3dest_killed))
1347           return 0;
1348     }
1349
1350   return 1;
1351 }
1352 \f
1353 /* Try to combine the insns I1 and I2 into I3.
1354    Here I1 and I2 appear earlier than I3.
1355    I1 can be zero; then we combine just I2 into I3.
1356  
1357    It we are combining three insns and the resulting insn is not recognized,
1358    try splitting it into two insns.  If that happens, I2 and I3 are retained
1359    and I1 is pseudo-deleted by turning it into a NOTE.  Otherwise, I1 and I2
1360    are pseudo-deleted.
1361
1362    Return 0 if the combination does not work.  Then nothing is changed. 
1363    If we did the combination, return the insn at which combine should
1364    resume scanning.  */
1365
1366 static rtx
1367 try_combine (i3, i2, i1)
1368      register rtx i3, i2, i1;
1369 {
1370   /* New patterns for I3 and I3, respectively.  */
1371   rtx newpat, newi2pat = 0;
1372   /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead.  */
1373   int added_sets_1, added_sets_2;
1374   /* Total number of SETs to put into I3.  */
1375   int total_sets;
1376   /* Nonzero is I2's body now appears in I3.  */
1377   int i2_is_used;
1378   /* INSN_CODEs for new I3, new I2, and user of condition code.  */
1379   int insn_code_number, i2_code_number = 0, other_code_number = 0;
1380   /* Contains I3 if the destination of I3 is used in its source, which means
1381      that the old life of I3 is being killed.  If that usage is placed into
1382      I2 and not in I3, a REG_DEAD note must be made.  */
1383   rtx i3dest_killed = 0;
1384   /* SET_DEST and SET_SRC of I2 and I1.  */
1385   rtx i2dest, i2src, i1dest = 0, i1src = 0;
1386   /* PATTERN (I2), or a copy of it in certain cases.  */
1387   rtx i2pat;
1388   /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC.  */
1389   int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0;
1390   int i1_feeds_i3 = 0;
1391   /* Notes that must be added to REG_NOTES in I3 and I2.  */
1392   rtx new_i3_notes, new_i2_notes;
1393   /* Notes that we substituted I3 into I2 instead of the normal case.  */
1394   int i3_subst_into_i2 = 0;
1395   /* Notes that I1, I2 or I3 is a MULT operation.  */
1396   int have_mult = 0;
1397
1398   int maxreg;
1399   rtx temp;
1400   register rtx link;
1401   int i;
1402
1403   /* If any of I1, I2, and I3 isn't really an insn, we can't do anything.
1404      This can occur when flow deletes an insn that it has merged into an
1405      auto-increment address.  We also can't do anything if I3 has a
1406      REG_LIBCALL note since we don't want to disrupt the contiguity of a
1407      libcall.  */
1408
1409   if (GET_RTX_CLASS (GET_CODE (i3)) != 'i'
1410       || GET_RTX_CLASS (GET_CODE (i2)) != 'i'
1411       || (i1 && GET_RTX_CLASS (GET_CODE (i1)) != 'i')
1412 #if 0
1413       /* ??? This gives worse code, and appears to be unnecessary, since no
1414          pass after flow uses REG_LIBCALL/REG_RETVAL notes.  */
1415       || find_reg_note (i3, REG_LIBCALL, NULL_RTX)
1416 #endif
1417 )
1418     return 0;
1419
1420   combine_attempts++;
1421
1422   undobuf.undos = undobuf.previous_undos = 0;
1423   undobuf.other_insn = 0;
1424
1425   /* Save the current high-water-mark so we can free storage if we didn't
1426      accept this combination.  */
1427   undobuf.storage = (char *) oballoc (0);
1428
1429   /* Reset the hard register usage information.  */
1430   CLEAR_HARD_REG_SET (newpat_used_regs);
1431
1432   /* If I1 and I2 both feed I3, they can be in any order.  To simplify the
1433      code below, set I1 to be the earlier of the two insns.  */
1434   if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
1435     temp = i1, i1 = i2, i2 = temp;
1436
1437   added_links_insn = 0;
1438
1439   /* First check for one important special-case that the code below will
1440      not handle.  Namely, the case where I1 is zero, I2 has multiple sets,
1441      and I3 is a SET whose SET_SRC is a SET_DEST in I2.  In that case,
1442      we may be able to replace that destination with the destination of I3.
1443      This occurs in the common code where we compute both a quotient and
1444      remainder into a structure, in which case we want to do the computation
1445      directly into the structure to avoid register-register copies.
1446
1447      We make very conservative checks below and only try to handle the
1448      most common cases of this.  For example, we only handle the case
1449      where I2 and I3 are adjacent to avoid making difficult register
1450      usage tests.  */
1451
1452   if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET
1453       && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1454       && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1455       && (! SMALL_REGISTER_CLASSES
1456           || (GET_CODE (SET_DEST (PATTERN (i3))) != REG
1457               || REGNO (SET_DEST (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER
1458               || REG_USERVAR_P (SET_DEST (PATTERN (i3)))))
1459       && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3)))
1460       && GET_CODE (PATTERN (i2)) == PARALLEL
1461       && ! side_effects_p (SET_DEST (PATTERN (i3)))
1462       /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code
1463          below would need to check what is inside (and reg_overlap_mentioned_p
1464          doesn't support those codes anyway).  Don't allow those destinations;
1465          the resulting insn isn't likely to be recognized anyway.  */
1466       && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT
1467       && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART
1468       && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)),
1469                                     SET_DEST (PATTERN (i3)))
1470       && next_real_insn (i2) == i3)
1471     {
1472       rtx p2 = PATTERN (i2);
1473
1474       /* Make sure that the destination of I3,
1475          which we are going to substitute into one output of I2,
1476          is not used within another output of I2.  We must avoid making this:
1477          (parallel [(set (mem (reg 69)) ...)
1478                     (set (reg 69) ...)])
1479          which is not well-defined as to order of actions.
1480          (Besides, reload can't handle output reloads for this.)
1481
1482          The problem can also happen if the dest of I3 is a memory ref,
1483          if another dest in I2 is an indirect memory ref.  */
1484       for (i = 0; i < XVECLEN (p2, 0); i++)
1485         if ((GET_CODE (XVECEXP (p2, 0, i)) == SET
1486              || GET_CODE (XVECEXP (p2, 0, i)) == CLOBBER)
1487             && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)),
1488                                         SET_DEST (XVECEXP (p2, 0, i))))
1489           break;
1490
1491       if (i == XVECLEN (p2, 0))
1492         for (i = 0; i < XVECLEN (p2, 0); i++)
1493           if (SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3)))
1494             {
1495               combine_merges++;
1496
1497               subst_insn = i3;
1498               subst_low_cuid = INSN_CUID (i2);
1499
1500               added_sets_2 = added_sets_1 = 0;
1501               i2dest = SET_SRC (PATTERN (i3));
1502
1503               /* Replace the dest in I2 with our dest and make the resulting
1504                  insn the new pattern for I3.  Then skip to where we
1505                  validate the pattern.  Everything was set up above.  */
1506               SUBST (SET_DEST (XVECEXP (p2, 0, i)), 
1507                      SET_DEST (PATTERN (i3)));
1508
1509               newpat = p2;
1510               i3_subst_into_i2 = 1;
1511               goto validate_replacement;
1512             }
1513     }
1514
1515 #ifndef HAVE_cc0
1516   /* If we have no I1 and I2 looks like:
1517         (parallel [(set (reg:CC X) (compare:CC OP (const_int 0)))
1518                    (set Y OP)])
1519      make up a dummy I1 that is
1520         (set Y OP)
1521      and change I2 to be
1522         (set (reg:CC X) (compare:CC Y (const_int 0)))
1523
1524      (We can ignore any trailing CLOBBERs.)
1525
1526      This undoes a previous combination and allows us to match a branch-and-
1527      decrement insn.  */
1528
1529   if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL
1530       && XVECLEN (PATTERN (i2), 0) >= 2
1531       && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET
1532       && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0))))
1533           == MODE_CC)
1534       && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE
1535       && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx
1536       && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET
1537       && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG
1538       && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0),
1539                       SET_SRC (XVECEXP (PATTERN (i2), 0, 1))))
1540     {
1541       for (i =  XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--)
1542         if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER)
1543           break;
1544
1545       if (i == 1)
1546         {
1547           /* We make I1 with the same INSN_UID as I2.  This gives it
1548              the same INSN_CUID for value tracking.  Our fake I1 will
1549              never appear in the insn stream so giving it the same INSN_UID
1550              as I2 will not cause a problem.  */
1551
1552           subst_prev_insn = i1
1553             = gen_rtx_INSN (VOIDmode, INSN_UID (i2), NULL_RTX, i2,
1554                             XVECEXP (PATTERN (i2), 0, 1), -1, NULL_RTX,
1555                             NULL_RTX);
1556
1557           SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
1558           SUBST (XEXP (SET_SRC (PATTERN (i2)), 0),
1559                  SET_DEST (PATTERN (i1)));
1560         }
1561     }
1562 #endif
1563
1564   /* Verify that I2 and I1 are valid for combining.  */
1565   if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src)
1566       || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src)))
1567     {
1568       undo_all ();
1569       return 0;
1570     }
1571
1572   /* Record whether I2DEST is used in I2SRC and similarly for the other
1573      cases.  Knowing this will help in register status updating below.  */
1574   i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src);
1575   i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src);
1576   i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src);
1577
1578   /* See if I1 directly feeds into I3.  It does if I1DEST is not used
1579      in I2SRC.  */
1580   i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src);
1581
1582   /* Ensure that I3's pattern can be the destination of combines.  */
1583   if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest,
1584                           i1 && i2dest_in_i1src && i1_feeds_i3,
1585                           &i3dest_killed))
1586     {
1587       undo_all ();
1588       return 0;
1589     }
1590
1591   /* See if any of the insns is a MULT operation.  Unless one is, we will
1592      reject a combination that is, since it must be slower.  Be conservative
1593      here.  */
1594   if (GET_CODE (i2src) == MULT
1595       || (i1 != 0 && GET_CODE (i1src) == MULT)
1596       || (GET_CODE (PATTERN (i3)) == SET
1597           && GET_CODE (SET_SRC (PATTERN (i3))) == MULT))
1598     have_mult = 1;
1599
1600   /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd.
1601      We used to do this EXCEPT in one case: I3 has a post-inc in an
1602      output operand.  However, that exception can give rise to insns like
1603         mov r3,(r3)+
1604      which is a famous insn on the PDP-11 where the value of r3 used as the
1605      source was model-dependent.  Avoid this sort of thing.  */
1606
1607 #if 0
1608   if (!(GET_CODE (PATTERN (i3)) == SET
1609         && GET_CODE (SET_SRC (PATTERN (i3))) == REG
1610         && GET_CODE (SET_DEST (PATTERN (i3))) == MEM
1611         && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC
1612             || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC)))
1613     /* It's not the exception.  */
1614 #endif
1615 #ifdef AUTO_INC_DEC
1616     for (link = REG_NOTES (i3); link; link = XEXP (link, 1))
1617       if (REG_NOTE_KIND (link) == REG_INC
1618           && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2))
1619               || (i1 != 0
1620                   && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1)))))
1621         {
1622           undo_all ();
1623           return 0;
1624         }
1625 #endif
1626
1627   /* See if the SETs in I1 or I2 need to be kept around in the merged
1628      instruction: whenever the value set there is still needed past I3.
1629      For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3.
1630
1631      For the SET in I1, we have two cases:  If I1 and I2 independently
1632      feed into I3, the set in I1 needs to be kept around if I1DEST dies
1633      or is set in I3.  Otherwise (if I1 feeds I2 which feeds I3), the set
1634      in I1 needs to be kept around unless I1DEST dies or is set in either
1635      I2 or I3.  We can distinguish these cases by seeing if I2SRC mentions
1636      I1DEST.  If so, we know I1 feeds into I2.  */
1637
1638   added_sets_2 = ! dead_or_set_p (i3, i2dest);
1639
1640   added_sets_1
1641     = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest)
1642                : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest)));
1643
1644   /* If the set in I2 needs to be kept around, we must make a copy of
1645      PATTERN (I2), so that when we substitute I1SRC for I1DEST in
1646      PATTERN (I2), we are only substituting for the original I1DEST, not into
1647      an already-substituted copy.  This also prevents making self-referential
1648      rtx.  If I2 is a PARALLEL, we just need the piece that assigns I2SRC to
1649      I2DEST.  */
1650
1651   i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL
1652            ? gen_rtx_SET (VOIDmode, i2dest, i2src)
1653            : PATTERN (i2));
1654
1655   if (added_sets_2)
1656     i2pat = copy_rtx (i2pat);
1657
1658   combine_merges++;
1659
1660   /* Substitute in the latest insn for the regs set by the earlier ones.  */
1661
1662   maxreg = max_reg_num ();
1663
1664   subst_insn = i3;
1665
1666   /* It is possible that the source of I2 or I1 may be performing an
1667      unneeded operation, such as a ZERO_EXTEND of something that is known
1668      to have the high part zero.  Handle that case by letting subst look at
1669      the innermost one of them.
1670
1671      Another way to do this would be to have a function that tries to
1672      simplify a single insn instead of merging two or more insns.  We don't
1673      do this because of the potential of infinite loops and because
1674      of the potential extra memory required.  However, doing it the way
1675      we are is a bit of a kludge and doesn't catch all cases.
1676
1677      But only do this if -fexpensive-optimizations since it slows things down
1678      and doesn't usually win.  */
1679
1680   if (flag_expensive_optimizations)
1681     {
1682       /* Pass pc_rtx so no substitutions are done, just simplifications.
1683          The cases that we are interested in here do not involve the few
1684          cases were is_replaced is checked.  */
1685       if (i1)
1686         {
1687           subst_low_cuid = INSN_CUID (i1);
1688           i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0);
1689         }
1690       else
1691         {
1692           subst_low_cuid = INSN_CUID (i2);
1693           i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0);
1694         }
1695
1696       undobuf.previous_undos = undobuf.undos;
1697     }
1698
1699 #ifndef HAVE_cc0
1700   /* Many machines that don't use CC0 have insns that can both perform an
1701      arithmetic operation and set the condition code.  These operations will
1702      be represented as a PARALLEL with the first element of the vector
1703      being a COMPARE of an arithmetic operation with the constant zero.
1704      The second element of the vector will set some pseudo to the result
1705      of the same arithmetic operation.  If we simplify the COMPARE, we won't
1706      match such a pattern and so will generate an extra insn.   Here we test
1707      for this case, where both the comparison and the operation result are
1708      needed, and make the PARALLEL by just replacing I2DEST in I3SRC with
1709      I2SRC.  Later we will make the PARALLEL that contains I2.  */
1710
1711   if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET
1712       && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE
1713       && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx
1714       && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest))
1715     {
1716 #ifdef EXTRA_CC_MODES
1717       rtx *cc_use;
1718       enum machine_mode compare_mode;
1719 #endif
1720
1721       newpat = PATTERN (i3);
1722       SUBST (XEXP (SET_SRC (newpat), 0), i2src);
1723
1724       i2_is_used = 1;
1725
1726 #ifdef EXTRA_CC_MODES
1727       /* See if a COMPARE with the operand we substituted in should be done
1728          with the mode that is currently being used.  If not, do the same
1729          processing we do in `subst' for a SET; namely, if the destination
1730          is used only once, try to replace it with a register of the proper
1731          mode and also replace the COMPARE.  */
1732       if (undobuf.other_insn == 0
1733           && (cc_use = find_single_use (SET_DEST (newpat), i3,
1734                                         &undobuf.other_insn))
1735           && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use),
1736                                               i2src, const0_rtx))
1737               != GET_MODE (SET_DEST (newpat))))
1738         {
1739           int regno = REGNO (SET_DEST (newpat));
1740           rtx new_dest = gen_rtx_REG (compare_mode, regno);
1741
1742           if (regno < FIRST_PSEUDO_REGISTER
1743               || (REG_N_SETS (regno) == 1 && ! added_sets_2
1744                   && ! REG_USERVAR_P (SET_DEST (newpat))))
1745             {
1746               if (regno >= FIRST_PSEUDO_REGISTER)
1747                 SUBST (regno_reg_rtx[regno], new_dest);
1748
1749               SUBST (SET_DEST (newpat), new_dest);
1750               SUBST (XEXP (*cc_use, 0), new_dest);
1751               SUBST (SET_SRC (newpat),
1752                      gen_rtx_combine (COMPARE, compare_mode,
1753                                       i2src, const0_rtx));
1754             }
1755           else
1756             undobuf.other_insn = 0;
1757         }
1758 #endif    
1759     }
1760   else
1761 #endif
1762     {
1763       n_occurrences = 0;                /* `subst' counts here */
1764
1765       /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we
1766          need to make a unique copy of I2SRC each time we substitute it
1767          to avoid self-referential rtl.  */
1768
1769       subst_low_cuid = INSN_CUID (i2);
1770       newpat = subst (PATTERN (i3), i2dest, i2src, 0,
1771                       ! i1_feeds_i3 && i1dest_in_i1src);
1772       undobuf.previous_undos = undobuf.undos;
1773
1774       /* Record whether i2's body now appears within i3's body.  */
1775       i2_is_used = n_occurrences;
1776     }
1777
1778   /* If we already got a failure, don't try to do more.  Otherwise,
1779      try to substitute in I1 if we have it.  */
1780
1781   if (i1 && GET_CODE (newpat) != CLOBBER)
1782     {
1783       /* Before we can do this substitution, we must redo the test done
1784          above (see detailed comments there) that ensures  that I1DEST
1785          isn't mentioned in any SETs in NEWPAT that are field assignments.  */
1786
1787       if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
1788                               0, NULL_PTR))
1789         {
1790           undo_all ();
1791           return 0;
1792         }
1793
1794       n_occurrences = 0;
1795       subst_low_cuid = INSN_CUID (i1);
1796       newpat = subst (newpat, i1dest, i1src, 0, 0);
1797       undobuf.previous_undos = undobuf.undos;
1798     }
1799
1800   /* Fail if an autoincrement side-effect has been duplicated.  Be careful
1801      to count all the ways that I2SRC and I1SRC can be used.  */
1802   if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0
1803        && i2_is_used + added_sets_2 > 1)
1804       || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
1805           && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3)
1806               > 1))
1807       /* Fail if we tried to make a new register (we used to abort, but there's
1808          really no reason to).  */
1809       || max_reg_num () != maxreg
1810       /* Fail if we couldn't do something and have a CLOBBER.  */
1811       || GET_CODE (newpat) == CLOBBER
1812       /* Fail if this new pattern is a MULT and we didn't have one before
1813          at the outer level.  */
1814       || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT
1815           && ! have_mult))
1816     {
1817       undo_all ();
1818       return 0;
1819     }
1820
1821   /* If the actions of the earlier insns must be kept
1822      in addition to substituting them into the latest one,
1823      we must make a new PARALLEL for the latest insn
1824      to hold additional the SETs.  */
1825
1826   if (added_sets_1 || added_sets_2)
1827     {
1828       combine_extras++;
1829
1830       if (GET_CODE (newpat) == PARALLEL)
1831         {
1832           rtvec old = XVEC (newpat, 0);
1833           total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2;
1834           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
1835           bcopy ((char *) &old->elem[0], (char *) XVEC (newpat, 0)->elem,
1836                  sizeof (old->elem[0]) * old->num_elem);
1837         }
1838       else
1839         {
1840           rtx old = newpat;
1841           total_sets = 1 + added_sets_1 + added_sets_2;
1842           newpat = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (total_sets));
1843           XVECEXP (newpat, 0, 0) = old;
1844         }
1845
1846      if (added_sets_1)
1847        XVECEXP (newpat, 0, --total_sets)
1848          = (GET_CODE (PATTERN (i1)) == PARALLEL
1849             ? gen_rtx_SET (VOIDmode, i1dest, i1src) : PATTERN (i1));
1850
1851      if (added_sets_2)
1852        {
1853          /* If there is no I1, use I2's body as is.  We used to also not do
1854             the subst call below if I2 was substituted into I3,
1855             but that could lose a simplification.  */
1856          if (i1 == 0)
1857            XVECEXP (newpat, 0, --total_sets) = i2pat;
1858          else
1859            /* See comment where i2pat is assigned.  */
1860            XVECEXP (newpat, 0, --total_sets)
1861              = subst (i2pat, i1dest, i1src, 0, 0);
1862        }
1863     }
1864
1865   /* We come here when we are replacing a destination in I2 with the
1866      destination of I3.  */
1867  validate_replacement:
1868
1869   /* Note which hard regs this insn has as inputs.  */
1870   mark_used_regs_combine (newpat);
1871
1872   /* Is the result of combination a valid instruction?  */
1873   insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1874
1875   /* If the result isn't valid, see if it is a PARALLEL of two SETs where
1876      the second SET's destination is a register that is unused.  In that case,
1877      we just need the first SET.   This can occur when simplifying a divmod
1878      insn.  We *must* test for this case here because the code below that
1879      splits two independent SETs doesn't handle this case correctly when it
1880      updates the register status.  Also check the case where the first
1881      SET's destination is unused.  That would not cause incorrect code, but
1882      does cause an unneeded insn to remain.  */
1883
1884   if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
1885       && XVECLEN (newpat, 0) == 2
1886       && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1887       && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1888       && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG
1889       && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1)))
1890       && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1)))
1891       && asm_noperands (newpat) < 0)
1892     {
1893       newpat = XVECEXP (newpat, 0, 0);
1894       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1895     }
1896
1897   else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL
1898            && XVECLEN (newpat, 0) == 2
1899            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
1900            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
1901            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG
1902            && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0)))
1903            && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0)))
1904            && asm_noperands (newpat) < 0)
1905     {
1906       newpat = XVECEXP (newpat, 0, 1);
1907       insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
1908     }
1909
1910   /* If we were combining three insns and the result is a simple SET
1911      with no ASM_OPERANDS that wasn't recognized, try to split it into two
1912      insns.  There are two ways to do this.  It can be split using a 
1913      machine-specific method (like when you have an addition of a large
1914      constant) or by combine in the function find_split_point.  */
1915
1916   if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET
1917       && asm_noperands (newpat) < 0)
1918     {
1919       rtx m_split, *split;
1920       rtx ni2dest = i2dest;
1921
1922       /* See if the MD file can split NEWPAT.  If it can't, see if letting it
1923          use I2DEST as a scratch register will help.  In the latter case,
1924          convert I2DEST to the mode of the source of NEWPAT if we can.  */
1925
1926       m_split = split_insns (newpat, i3);
1927
1928       /* We can only use I2DEST as a scratch reg if it doesn't overlap any
1929          inputs of NEWPAT.  */
1930
1931       /* ??? If I2DEST is not safe, and I1DEST exists, then it would be
1932          possible to try that as a scratch reg.  This would require adding
1933          more code to make it work though.  */
1934
1935       if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat))
1936         {
1937           /* If I2DEST is a hard register or the only use of a pseudo,
1938              we can change its mode.  */
1939           if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest)
1940               && GET_MODE (SET_DEST (newpat)) != VOIDmode
1941               && GET_CODE (i2dest) == REG
1942               && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
1943                   || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
1944                       && ! REG_USERVAR_P (i2dest))))
1945             ni2dest = gen_rtx_REG (GET_MODE (SET_DEST (newpat)),
1946                                    REGNO (i2dest));
1947
1948           m_split = split_insns (gen_rtx_PARALLEL
1949                                  (VOIDmode,
1950                                   gen_rtvec (2, newpat,
1951                                              gen_rtx_CLOBBER (VOIDmode,
1952                                                               ni2dest))),
1953                                  i3);
1954         }
1955
1956       if (m_split && GET_CODE (m_split) == SEQUENCE
1957           && XVECLEN (m_split, 0) == 2
1958           && (next_real_insn (i2) == i3
1959               || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)),
1960                                       INSN_CUID (i2))))
1961         {
1962           rtx i2set, i3set;
1963           rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1));
1964           newi2pat = PATTERN (XVECEXP (m_split, 0, 0));
1965
1966           i3set = single_set (XVECEXP (m_split, 0, 1));
1967           i2set = single_set (XVECEXP (m_split, 0, 0));
1968
1969           /* In case we changed the mode of I2DEST, replace it in the
1970              pseudo-register table here.  We can't do it above in case this
1971              code doesn't get executed and we do a split the other way.  */
1972
1973           if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
1974             SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest);
1975
1976           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
1977
1978           /* If I2 or I3 has multiple SETs, we won't know how to track
1979              register status, so don't use these insns.  If I2's destination
1980              is used between I2 and I3, we also can't use these insns.  */
1981
1982           if (i2_code_number >= 0 && i2set && i3set
1983               && (next_real_insn (i2) == i3
1984                   || ! reg_used_between_p (SET_DEST (i2set), i2, i3)))
1985             insn_code_number = recog_for_combine (&newi3pat, i3,
1986                                                   &new_i3_notes);
1987           if (insn_code_number >= 0)
1988             newpat = newi3pat;
1989
1990           /* It is possible that both insns now set the destination of I3.
1991              If so, we must show an extra use of it.  */
1992
1993           if (insn_code_number >= 0)
1994             {
1995               rtx new_i3_dest = SET_DEST (i3set);
1996               rtx new_i2_dest = SET_DEST (i2set);
1997
1998               while (GET_CODE (new_i3_dest) == ZERO_EXTRACT
1999                      || GET_CODE (new_i3_dest) == STRICT_LOW_PART
2000                      || GET_CODE (new_i3_dest) == SUBREG)
2001                 new_i3_dest = XEXP (new_i3_dest, 0);
2002
2003               while (GET_CODE (new_i2_dest) == ZERO_EXTRACT
2004                      || GET_CODE (new_i2_dest) == STRICT_LOW_PART
2005                      || GET_CODE (new_i2_dest) == SUBREG)
2006                 new_i2_dest = XEXP (new_i2_dest, 0);
2007
2008               if (GET_CODE (new_i3_dest) == REG
2009                   && GET_CODE (new_i2_dest) == REG
2010                   && REGNO (new_i3_dest) == REGNO (new_i2_dest))
2011                 REG_N_SETS (REGNO (new_i2_dest))++;
2012             }
2013         }
2014
2015       /* If we can split it and use I2DEST, go ahead and see if that
2016          helps things be recognized.  Verify that none of the registers
2017          are set between I2 and I3.  */
2018       if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0
2019 #ifdef HAVE_cc0
2020           && GET_CODE (i2dest) == REG
2021 #endif
2022           /* We need I2DEST in the proper mode.  If it is a hard register
2023              or the only use of a pseudo, we can change its mode.  */
2024           && (GET_MODE (*split) == GET_MODE (i2dest)
2025               || GET_MODE (*split) == VOIDmode
2026               || REGNO (i2dest) < FIRST_PSEUDO_REGISTER
2027               || (REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
2028                   && ! REG_USERVAR_P (i2dest)))
2029           && (next_real_insn (i2) == i3
2030               || ! use_crosses_set_p (*split, INSN_CUID (i2)))
2031           /* We can't overwrite I2DEST if its value is still used by
2032              NEWPAT.  */
2033           && ! reg_referenced_p (i2dest, newpat))
2034         {
2035           rtx newdest = i2dest;
2036           enum rtx_code split_code = GET_CODE (*split);
2037           enum machine_mode split_mode = GET_MODE (*split);
2038
2039           /* Get NEWDEST as a register in the proper mode.  We have already
2040              validated that we can do this.  */
2041           if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode)
2042             {
2043               newdest = gen_rtx_REG (split_mode, REGNO (i2dest));
2044
2045               if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER)
2046                 SUBST (regno_reg_rtx[REGNO (i2dest)], newdest);
2047             }
2048
2049           /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to
2050              an ASHIFT.  This can occur if it was inside a PLUS and hence
2051              appeared to be a memory address.  This is a kludge.  */
2052           if (split_code == MULT
2053               && GET_CODE (XEXP (*split, 1)) == CONST_INT
2054               && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0)
2055             {
2056               SUBST (*split, gen_rtx_combine (ASHIFT, split_mode,
2057                                               XEXP (*split, 0), GEN_INT (i)));
2058               /* Update split_code because we may not have a multiply
2059                  anymore.  */
2060               split_code = GET_CODE (*split);
2061             }
2062
2063 #ifdef INSN_SCHEDULING
2064           /* If *SPLIT is a paradoxical SUBREG, when we split it, it should
2065              be written as a ZERO_EXTEND.  */
2066           if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM)
2067             SUBST (*split, gen_rtx_combine (ZERO_EXTEND, split_mode,
2068                                             XEXP (*split, 0)));
2069 #endif
2070
2071           newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split);
2072           SUBST (*split, newdest);
2073           i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2074
2075           /* If the split point was a MULT and we didn't have one before,
2076              don't use one now.  */
2077           if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult))
2078             insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2079         }
2080     }
2081
2082   /* Check for a case where we loaded from memory in a narrow mode and
2083      then sign extended it, but we need both registers.  In that case,
2084      we have a PARALLEL with both loads from the same memory location.
2085      We can split this into a load from memory followed by a register-register
2086      copy.  This saves at least one insn, more if register allocation can
2087      eliminate the copy.
2088
2089      We cannot do this if the destination of the second assignment is
2090      a register that we have already assumed is zero-extended.  Similarly
2091      for a SUBREG of such a register.  */
2092
2093   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2094            && GET_CODE (newpat) == PARALLEL
2095            && XVECLEN (newpat, 0) == 2
2096            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2097            && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND
2098            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2099            && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2100                            XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0))
2101            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2102                                    INSN_CUID (i2))
2103            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2104            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2105            && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)),
2106                  (GET_CODE (temp) == REG
2107                   && reg_nonzero_bits[REGNO (temp)] != 0
2108                   && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2109                   && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2110                   && (reg_nonzero_bits[REGNO (temp)]
2111                       != GET_MODE_MASK (word_mode))))
2112            && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG
2113                  && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))),
2114                      (GET_CODE (temp) == REG
2115                       && reg_nonzero_bits[REGNO (temp)] != 0
2116                       && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD
2117                       && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT
2118                       && (reg_nonzero_bits[REGNO (temp)]
2119                           != GET_MODE_MASK (word_mode)))))
2120            && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2121                                          SET_SRC (XVECEXP (newpat, 0, 1)))
2122            && ! find_reg_note (i3, REG_UNUSED,
2123                                SET_DEST (XVECEXP (newpat, 0, 0))))
2124     {
2125       rtx ni2dest;
2126
2127       newi2pat = XVECEXP (newpat, 0, 0);
2128       ni2dest = SET_DEST (XVECEXP (newpat, 0, 0));
2129       newpat = XVECEXP (newpat, 0, 1);
2130       SUBST (SET_SRC (newpat),
2131              gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest));
2132       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2133
2134       if (i2_code_number >= 0)
2135         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2136
2137       if (insn_code_number >= 0)
2138         {
2139           rtx insn;
2140           rtx link;
2141
2142           /* If we will be able to accept this, we have made a change to the
2143              destination of I3.  This can invalidate a LOG_LINKS pointing
2144              to I3.  No other part of combine.c makes such a transformation.
2145
2146              The new I3 will have a destination that was previously the
2147              destination of I1 or I2 and which was used in i2 or I3.  Call
2148              distribute_links to make a LOG_LINK from the next use of
2149              that destination.  */
2150
2151           PATTERN (i3) = newpat;
2152           distribute_links (gen_rtx_INSN_LIST (VOIDmode, i3, NULL_RTX));
2153
2154           /* I3 now uses what used to be its destination and which is
2155              now I2's destination.  That means we need a LOG_LINK from
2156              I3 to I2.  But we used to have one, so we still will.
2157
2158              However, some later insn might be using I2's dest and have
2159              a LOG_LINK pointing at I3.  We must remove this link.
2160              The simplest way to remove the link is to point it at I1,
2161              which we know will be a NOTE.  */
2162
2163           for (insn = NEXT_INSN (i3);
2164                insn && (this_basic_block == n_basic_blocks - 1
2165                         || insn != BLOCK_HEAD (this_basic_block + 1));
2166                insn = NEXT_INSN (insn))
2167             {
2168               if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
2169                   && reg_referenced_p (ni2dest, PATTERN (insn)))
2170                 {
2171                   for (link = LOG_LINKS (insn); link;
2172                        link = XEXP (link, 1))
2173                     if (XEXP (link, 0) == i3)
2174                       XEXP (link, 0) = i1;
2175
2176                   break;
2177                 }
2178             }
2179         }
2180     }
2181             
2182   /* Similarly, check for a case where we have a PARALLEL of two independent
2183      SETs but we started with three insns.  In this case, we can do the sets
2184      as two separate insns.  This case occurs when some SET allows two
2185      other insns to combine, but the destination of that SET is still live.  */
2186
2187   else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
2188            && GET_CODE (newpat) == PARALLEL
2189            && XVECLEN (newpat, 0) == 2
2190            && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
2191            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
2192            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
2193            && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
2194            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
2195            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
2196            && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)),
2197                                    INSN_CUID (i2))
2198            /* Don't pass sets with (USE (MEM ...)) dests to the following.  */
2199            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE
2200            && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE
2201            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
2202                                   XVECEXP (newpat, 0, 0))
2203            && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)),
2204                                   XVECEXP (newpat, 0, 1)))
2205     {
2206       /* Normally, it doesn't matter which of the two is done first,
2207          but it does if one references cc0.  In that case, it has to
2208          be first.  */
2209 #ifdef HAVE_cc0
2210       if (reg_referenced_p (cc0_rtx, XVECEXP (newpat, 0, 0)))
2211         {
2212           newi2pat = XVECEXP (newpat, 0, 0);
2213           newpat = XVECEXP (newpat, 0, 1);
2214         }
2215       else
2216 #endif
2217         {
2218           newi2pat = XVECEXP (newpat, 0, 1);
2219           newpat = XVECEXP (newpat, 0, 0);
2220         }
2221
2222       i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes);
2223
2224       if (i2_code_number >= 0)
2225         insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes);
2226     }
2227
2228   /* If it still isn't recognized, fail and change things back the way they
2229      were.  */
2230   if ((insn_code_number < 0
2231        /* Is the result a reasonable ASM_OPERANDS?  */
2232        && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2)))
2233     {
2234       undo_all ();
2235       return 0;
2236     }
2237
2238   /* If we had to change another insn, make sure it is valid also.  */
2239   if (undobuf.other_insn)
2240     {
2241       rtx other_pat = PATTERN (undobuf.other_insn);
2242       rtx new_other_notes;
2243       rtx note, next;
2244
2245       CLEAR_HARD_REG_SET (newpat_used_regs);
2246
2247       other_code_number = recog_for_combine (&other_pat, undobuf.other_insn,
2248                                              &new_other_notes);
2249
2250       if (other_code_number < 0 && ! check_asm_operands (other_pat))
2251         {
2252           undo_all ();
2253           return 0;
2254         }
2255
2256       PATTERN (undobuf.other_insn) = other_pat;
2257
2258       /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they
2259          are still valid.  Then add any non-duplicate notes added by
2260          recog_for_combine.  */
2261       for (note = REG_NOTES (undobuf.other_insn); note; note = next)
2262         {
2263           next = XEXP (note, 1);
2264
2265           if (REG_NOTE_KIND (note) == REG_UNUSED
2266               && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn)))
2267             {
2268               if (GET_CODE (XEXP (note, 0)) == REG)
2269                 REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
2270
2271               remove_note (undobuf.other_insn, note);
2272             }
2273         }
2274
2275       for (note = new_other_notes; note; note = XEXP (note, 1))
2276         if (GET_CODE (XEXP (note, 0)) == REG)
2277           REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
2278
2279       distribute_notes (new_other_notes, undobuf.other_insn,
2280                         undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX);
2281     }
2282
2283   /* We now know that we can do this combination.  Merge the insns and 
2284      update the status of registers and LOG_LINKS.  */
2285
2286   {
2287     rtx i3notes, i2notes, i1notes = 0;
2288     rtx i3links, i2links, i1links = 0;
2289     rtx midnotes = 0;
2290     register int regno;
2291     /* Compute which registers we expect to eliminate.  newi2pat may be setting
2292        either i3dest or i2dest, so we must check it.  Also, i1dest may be the
2293        same as i3dest, in which case newi2pat may be setting i1dest.  */
2294     rtx elim_i2 = ((newi2pat && reg_set_p (i2dest, newi2pat))
2295                    || i2dest_in_i2src || i2dest_in_i1src
2296                    ? 0 : i2dest);
2297     rtx elim_i1 = (i1 == 0 || i1dest_in_i1src
2298                    || (newi2pat && reg_set_p (i1dest, newi2pat))
2299                    ? 0 : i1dest);
2300
2301     /* Get the old REG_NOTES and LOG_LINKS from all our insns and
2302        clear them.  */
2303     i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3);
2304     i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2);
2305     if (i1)
2306       i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1);
2307
2308     /* Ensure that we do not have something that should not be shared but
2309        occurs multiple times in the new insns.  Check this by first
2310        resetting all the `used' flags and then copying anything is shared.  */
2311
2312     reset_used_flags (i3notes);
2313     reset_used_flags (i2notes);
2314     reset_used_flags (i1notes);
2315     reset_used_flags (newpat);
2316     reset_used_flags (newi2pat);
2317     if (undobuf.other_insn)
2318       reset_used_flags (PATTERN (undobuf.other_insn));
2319
2320     i3notes = copy_rtx_if_shared (i3notes);
2321     i2notes = copy_rtx_if_shared (i2notes);
2322     i1notes = copy_rtx_if_shared (i1notes);
2323     newpat = copy_rtx_if_shared (newpat);
2324     newi2pat = copy_rtx_if_shared (newi2pat);
2325     if (undobuf.other_insn)
2326       reset_used_flags (PATTERN (undobuf.other_insn));
2327
2328     INSN_CODE (i3) = insn_code_number;
2329     PATTERN (i3) = newpat;
2330     if (undobuf.other_insn)
2331       INSN_CODE (undobuf.other_insn) = other_code_number;
2332
2333     /* We had one special case above where I2 had more than one set and
2334        we replaced a destination of one of those sets with the destination
2335        of I3.  In that case, we have to update LOG_LINKS of insns later
2336        in this basic block.  Note that this (expensive) case is rare.
2337
2338        Also, in this case, we must pretend that all REG_NOTEs for I2
2339        actually came from I3, so that REG_UNUSED notes from I2 will be
2340        properly handled.  */
2341
2342     if (i3_subst_into_i2)
2343       {
2344         for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++)
2345           if (GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG
2346               && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest
2347               && ! find_reg_note (i2, REG_UNUSED,
2348                                   SET_DEST (XVECEXP (PATTERN (i2), 0, i))))
2349             for (temp = NEXT_INSN (i2);
2350                  temp && (this_basic_block == n_basic_blocks - 1
2351                           || BLOCK_HEAD (this_basic_block) != temp);
2352                  temp = NEXT_INSN (temp))
2353               if (temp != i3 && GET_RTX_CLASS (GET_CODE (temp)) == 'i')
2354                 for (link = LOG_LINKS (temp); link; link = XEXP (link, 1))
2355                   if (XEXP (link, 0) == i2)
2356                     XEXP (link, 0) = i3;
2357
2358         if (i3notes)
2359           {
2360             rtx link = i3notes;
2361             while (XEXP (link, 1))
2362               link = XEXP (link, 1);
2363             XEXP (link, 1) = i2notes;
2364           }
2365         else
2366           i3notes = i2notes;
2367         i2notes = 0;
2368       }
2369
2370     LOG_LINKS (i3) = 0;
2371     REG_NOTES (i3) = 0;
2372     LOG_LINKS (i2) = 0;
2373     REG_NOTES (i2) = 0;
2374
2375     if (newi2pat)
2376       {
2377         INSN_CODE (i2) = i2_code_number;
2378         PATTERN (i2) = newi2pat;
2379       }
2380     else
2381       {
2382         PUT_CODE (i2, NOTE);
2383         NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED;
2384         NOTE_SOURCE_FILE (i2) = 0;
2385       }
2386
2387     if (i1)
2388       {
2389         LOG_LINKS (i1) = 0;
2390         REG_NOTES (i1) = 0;
2391         PUT_CODE (i1, NOTE);
2392         NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED;
2393         NOTE_SOURCE_FILE (i1) = 0;
2394       }
2395
2396     /* Get death notes for everything that is now used in either I3 or
2397        I2 and used to die in a previous insn.  If we built two new 
2398        patterns, move from I1 to I2 then I2 to I3 so that we get the
2399        proper movement on registers that I2 modifies.  */
2400
2401     if (newi2pat)
2402       {
2403         move_deaths (newi2pat, NULL_RTX, INSN_CUID (i1), i2, &midnotes);
2404         move_deaths (newpat, newi2pat, INSN_CUID (i1), i3, &midnotes);
2405       }
2406     else
2407       move_deaths (newpat, NULL_RTX, i1 ? INSN_CUID (i1) : INSN_CUID (i2),
2408                    i3, &midnotes);
2409
2410     /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3.  */
2411     if (i3notes)
2412       distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX,
2413                         elim_i2, elim_i1);
2414     if (i2notes)
2415       distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX,
2416                         elim_i2, elim_i1);
2417     if (i1notes)
2418       distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX,
2419                         elim_i2, elim_i1);
2420     if (midnotes)
2421       distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2422                         elim_i2, elim_i1);
2423
2424     /* Distribute any notes added to I2 or I3 by recog_for_combine.  We
2425        know these are REG_UNUSED and want them to go to the desired insn,
2426        so we always pass it as i3.  We have not counted the notes in 
2427        reg_n_deaths yet, so we need to do so now.  */
2428
2429     if (newi2pat && new_i2_notes)
2430       {
2431         for (temp = new_i2_notes; temp; temp = XEXP (temp, 1))
2432           if (GET_CODE (XEXP (temp, 0)) == REG)
2433             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2434         
2435         distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2436       }
2437
2438     if (new_i3_notes)
2439       {
2440         for (temp = new_i3_notes; temp; temp = XEXP (temp, 1))
2441           if (GET_CODE (XEXP (temp, 0)) == REG)
2442             REG_N_DEATHS (REGNO (XEXP (temp, 0)))++;
2443         
2444         distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX);
2445       }
2446
2447     /* If I3DEST was used in I3SRC, it really died in I3.  We may need to
2448        put a REG_DEAD note for it somewhere.  If NEWI2PAT exists and sets
2449        I3DEST, the death must be somewhere before I2, not I3.  If we passed I3
2450        in that case, it might delete I2.  Similarly for I2 and I1.
2451        Show an additional death due to the REG_DEAD note we make here.  If
2452        we discard it in distribute_notes, we will decrement it again.  */
2453
2454     if (i3dest_killed)
2455       {
2456         if (GET_CODE (i3dest_killed) == REG)
2457           REG_N_DEATHS (REGNO (i3dest_killed))++;
2458
2459         if (newi2pat && reg_set_p (i3dest_killed, newi2pat))
2460           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2461                                                NULL_RTX),
2462                             NULL_RTX, i2, NULL_RTX, elim_i2, elim_i1);
2463         else
2464           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i3dest_killed,
2465                                                NULL_RTX),
2466                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2467                             elim_i2, elim_i1);
2468       }
2469
2470     if (i2dest_in_i2src)
2471       {
2472         if (GET_CODE (i2dest) == REG)
2473           REG_N_DEATHS (REGNO (i2dest))++;
2474
2475         if (newi2pat && reg_set_p (i2dest, newi2pat))
2476           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2477                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2478         else
2479           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i2dest, NULL_RTX),
2480                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2481                             NULL_RTX, NULL_RTX);
2482       }
2483
2484     if (i1dest_in_i1src)
2485       {
2486         if (GET_CODE (i1dest) == REG)
2487           REG_N_DEATHS (REGNO (i1dest))++;
2488
2489         if (newi2pat && reg_set_p (i1dest, newi2pat))
2490           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2491                             NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX);
2492         else
2493           distribute_notes (gen_rtx_EXPR_LIST (REG_DEAD, i1dest, NULL_RTX),
2494                             NULL_RTX, i3, newi2pat ? i2 : NULL_RTX,
2495                             NULL_RTX, NULL_RTX);
2496       }
2497
2498     distribute_links (i3links);
2499     distribute_links (i2links);
2500     distribute_links (i1links);
2501
2502     if (GET_CODE (i2dest) == REG)
2503       {
2504         rtx link;
2505         rtx i2_insn = 0, i2_val = 0, set;
2506
2507         /* The insn that used to set this register doesn't exist, and
2508            this life of the register may not exist either.  See if one of
2509            I3's links points to an insn that sets I2DEST.  If it does, 
2510            that is now the last known value for I2DEST. If we don't update
2511            this and I2 set the register to a value that depended on its old
2512            contents, we will get confused.  If this insn is used, thing
2513            will be set correctly in combine_instructions.  */
2514
2515         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2516           if ((set = single_set (XEXP (link, 0))) != 0
2517               && rtx_equal_p (i2dest, SET_DEST (set)))
2518             i2_insn = XEXP (link, 0), i2_val = SET_SRC (set);
2519
2520         record_value_for_reg (i2dest, i2_insn, i2_val);
2521
2522         /* If the reg formerly set in I2 died only once and that was in I3,
2523            zero its use count so it won't make `reload' do any work.  */
2524         if (! added_sets_2
2525             && (newi2pat == 0 || ! reg_mentioned_p (i2dest, newi2pat))
2526             && ! i2dest_in_i2src)
2527           {
2528             regno = REGNO (i2dest);
2529             REG_N_SETS (regno)--;
2530             if (REG_N_SETS (regno) == 0
2531                 && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
2532                                       regno))
2533               REG_N_REFS (regno) = 0;
2534           }
2535       }
2536
2537     if (i1 && GET_CODE (i1dest) == REG)
2538       {
2539         rtx link;
2540         rtx i1_insn = 0, i1_val = 0, set;
2541
2542         for (link = LOG_LINKS (i3); link; link = XEXP (link, 1))
2543           if ((set = single_set (XEXP (link, 0))) != 0
2544               && rtx_equal_p (i1dest, SET_DEST (set)))
2545             i1_insn = XEXP (link, 0), i1_val = SET_SRC (set);
2546
2547         record_value_for_reg (i1dest, i1_insn, i1_val);
2548
2549         regno = REGNO (i1dest);
2550         if (! added_sets_1 && ! i1dest_in_i1src)
2551           {
2552             REG_N_SETS (regno)--;
2553             if (REG_N_SETS (regno) == 0
2554                 && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
2555                                       regno))
2556               REG_N_REFS (regno) = 0;
2557           }
2558       }
2559
2560     /* Update reg_nonzero_bits et al for any changes that may have been made
2561        to this insn.  */
2562
2563     note_stores (newpat, set_nonzero_bits_and_sign_copies, NULL);
2564     if (newi2pat)
2565       note_stores (newi2pat, set_nonzero_bits_and_sign_copies, NULL);
2566
2567     /* If I3 is now an unconditional jump, ensure that it has a 
2568        BARRIER following it since it may have initially been a
2569        conditional jump.  It may also be the last nonnote insn.  */
2570
2571     if ((GET_CODE (newpat) == RETURN || simplejump_p (i3))
2572         && ((temp = next_nonnote_insn (i3)) == NULL_RTX
2573             || GET_CODE (temp) != BARRIER))
2574       emit_barrier_after (i3);
2575   }
2576
2577   combine_successes++;
2578
2579   /* Clear this here, so that subsequent get_last_value calls are not
2580      affected.  */
2581   subst_prev_insn = NULL_RTX;
2582
2583   if (added_links_insn
2584       && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2))
2585       && INSN_CUID (added_links_insn) < INSN_CUID (i3))
2586     return added_links_insn;
2587   else
2588     return newi2pat ? i2 : i3;
2589 }
2590 \f
2591 /* Undo all the modifications recorded in undobuf.  */
2592
2593 static void
2594 undo_all ()
2595 {
2596   struct undo *undo, *next;
2597
2598   for (undo = undobuf.undos; undo; undo = next)
2599     {
2600       next = undo->next;
2601       if (undo->is_int)
2602         *undo->where.i = undo->old_contents.i;
2603       else
2604         *undo->where.r = undo->old_contents.r;
2605
2606       undo->next = undobuf.frees;
2607       undobuf.frees = undo;
2608     }
2609
2610   obfree (undobuf.storage);
2611   undobuf.undos = undobuf.previous_undos = 0;
2612
2613   /* Clear this here, so that subsequent get_last_value calls are not
2614      affected.  */
2615   subst_prev_insn = NULL_RTX;
2616 }
2617 \f
2618 /* Find the innermost point within the rtx at LOC, possibly LOC itself,
2619    where we have an arithmetic expression and return that point.  LOC will
2620    be inside INSN.
2621
2622    try_combine will call this function to see if an insn can be split into
2623    two insns.  */
2624
2625 static rtx *
2626 find_split_point (loc, insn)
2627      rtx *loc;
2628      rtx insn;
2629 {
2630   rtx x = *loc;
2631   enum rtx_code code = GET_CODE (x);
2632   rtx *split;
2633   int len = 0, pos = 0, unsignedp = 0;
2634   rtx inner = NULL_RTX;
2635
2636   /* First special-case some codes.  */
2637   switch (code)
2638     {
2639     case SUBREG:
2640 #ifdef INSN_SCHEDULING
2641       /* If we are making a paradoxical SUBREG invalid, it becomes a split
2642          point.  */
2643       if (GET_CODE (SUBREG_REG (x)) == MEM)
2644         return loc;
2645 #endif
2646       return find_split_point (&SUBREG_REG (x), insn);
2647
2648     case MEM:
2649 #ifdef HAVE_lo_sum
2650       /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it
2651          using LO_SUM and HIGH.  */
2652       if (GET_CODE (XEXP (x, 0)) == CONST
2653           || GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
2654         {
2655           SUBST (XEXP (x, 0),
2656                  gen_rtx_combine (LO_SUM, Pmode,
2657                                   gen_rtx_combine (HIGH, Pmode, XEXP (x, 0)),
2658                                   XEXP (x, 0)));
2659           return &XEXP (XEXP (x, 0), 0);
2660         }
2661 #endif
2662
2663       /* If we have a PLUS whose second operand is a constant and the
2664          address is not valid, perhaps will can split it up using
2665          the machine-specific way to split large constants.  We use
2666          the first pseudo-reg (one of the virtual regs) as a placeholder;
2667          it will not remain in the result.  */
2668       if (GET_CODE (XEXP (x, 0)) == PLUS
2669           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2670           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2671         {
2672           rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER];
2673           rtx seq = split_insns (gen_rtx_SET (VOIDmode, reg, XEXP (x, 0)),
2674                                  subst_insn);
2675
2676           /* This should have produced two insns, each of which sets our
2677              placeholder.  If the source of the second is a valid address,
2678              we can make put both sources together and make a split point
2679              in the middle.  */
2680
2681           if (seq && XVECLEN (seq, 0) == 2
2682               && GET_CODE (XVECEXP (seq, 0, 0)) == INSN
2683               && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET
2684               && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg
2685               && ! reg_mentioned_p (reg,
2686                                     SET_SRC (PATTERN (XVECEXP (seq, 0, 0))))
2687               && GET_CODE (XVECEXP (seq, 0, 1)) == INSN
2688               && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET
2689               && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg
2690               && memory_address_p (GET_MODE (x),
2691                                    SET_SRC (PATTERN (XVECEXP (seq, 0, 1)))))
2692             {
2693               rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0)));
2694               rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1)));
2695
2696               /* Replace the placeholder in SRC2 with SRC1.  If we can
2697                  find where in SRC2 it was placed, that can become our
2698                  split point and we can replace this address with SRC2.
2699                  Just try two obvious places.  */
2700
2701               src2 = replace_rtx (src2, reg, src1);
2702               split = 0;
2703               if (XEXP (src2, 0) == src1)
2704                 split = &XEXP (src2, 0);
2705               else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e'
2706                        && XEXP (XEXP (src2, 0), 0) == src1)
2707                 split = &XEXP (XEXP (src2, 0), 0);
2708
2709               if (split)
2710                 {
2711                   SUBST (XEXP (x, 0), src2);
2712                   return split;
2713                 }
2714             }
2715           
2716           /* If that didn't work, perhaps the first operand is complex and
2717              needs to be computed separately, so make a split point there.
2718              This will occur on machines that just support REG + CONST
2719              and have a constant moved through some previous computation.  */
2720
2721           else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o'
2722                    && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG
2723                          && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0))))
2724                              == 'o')))
2725             return &XEXP (XEXP (x, 0), 0);
2726         }
2727       break;
2728
2729     case SET:
2730 #ifdef HAVE_cc0
2731       /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a
2732          ZERO_EXTRACT, the most likely reason why this doesn't match is that
2733          we need to put the operand into a register.  So split at that
2734          point.  */
2735
2736       if (SET_DEST (x) == cc0_rtx
2737           && GET_CODE (SET_SRC (x)) != COMPARE
2738           && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT
2739           && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o'
2740           && ! (GET_CODE (SET_SRC (x)) == SUBREG
2741                 && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o'))
2742         return &SET_SRC (x);
2743 #endif
2744
2745       /* See if we can split SET_SRC as it stands.  */
2746       split = find_split_point (&SET_SRC (x), insn);
2747       if (split && split != &SET_SRC (x))
2748         return split;
2749
2750       /* See if we can split SET_DEST as it stands.  */
2751       split = find_split_point (&SET_DEST (x), insn);
2752       if (split && split != &SET_DEST (x))
2753         return split;
2754
2755       /* See if this is a bitfield assignment with everything constant.  If
2756          so, this is an IOR of an AND, so split it into that.  */
2757       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
2758           && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
2759               <= HOST_BITS_PER_WIDE_INT)
2760           && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT
2761           && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT
2762           && GET_CODE (SET_SRC (x)) == CONST_INT
2763           && ((INTVAL (XEXP (SET_DEST (x), 1))
2764               + INTVAL (XEXP (SET_DEST (x), 2)))
2765               <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))))
2766           && ! side_effects_p (XEXP (SET_DEST (x), 0)))
2767         {
2768           int pos = INTVAL (XEXP (SET_DEST (x), 2));
2769           int len = INTVAL (XEXP (SET_DEST (x), 1));
2770           int src = INTVAL (SET_SRC (x));
2771           rtx dest = XEXP (SET_DEST (x), 0);
2772           enum machine_mode mode = GET_MODE (dest);
2773           unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1;
2774
2775           if (BITS_BIG_ENDIAN)
2776             pos = GET_MODE_BITSIZE (mode) - len - pos;
2777
2778           if ((unsigned HOST_WIDE_INT) src == mask)
2779             SUBST (SET_SRC (x),
2780                    gen_binary (IOR, mode, dest, GEN_INT (src << pos)));
2781           else
2782             SUBST (SET_SRC (x),
2783                    gen_binary (IOR, mode,
2784                                gen_binary (AND, mode, dest, 
2785                                            GEN_INT (~ (mask << pos)
2786                                                     & GET_MODE_MASK (mode))),
2787                                GEN_INT (src << pos)));
2788
2789           SUBST (SET_DEST (x), dest);
2790
2791           split = find_split_point (&SET_SRC (x), insn);
2792           if (split && split != &SET_SRC (x))
2793             return split;
2794         }
2795
2796       /* Otherwise, see if this is an operation that we can split into two.
2797          If so, try to split that.  */
2798       code = GET_CODE (SET_SRC (x));
2799
2800       switch (code)
2801         {
2802         case AND:
2803           /* If we are AND'ing with a large constant that is only a single
2804              bit and the result is only being used in a context where we
2805              need to know if it is zero or non-zero, replace it with a bit
2806              extraction.  This will avoid the large constant, which might
2807              have taken more than one insn to make.  If the constant were
2808              not a valid argument to the AND but took only one insn to make,
2809              this is no worse, but if it took more than one insn, it will
2810              be better.  */
2811
2812           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
2813               && GET_CODE (XEXP (SET_SRC (x), 0)) == REG
2814               && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7
2815               && GET_CODE (SET_DEST (x)) == REG
2816               && (split = find_single_use (SET_DEST (x), insn, NULL_PTR)) != 0
2817               && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE)
2818               && XEXP (*split, 0) == SET_DEST (x)
2819               && XEXP (*split, 1) == const0_rtx)
2820             {
2821               rtx extraction = make_extraction (GET_MODE (SET_DEST (x)),
2822                                                 XEXP (SET_SRC (x), 0),
2823                                                 pos, NULL_RTX, 1, 1, 0, 0);
2824               if (extraction != 0)
2825                 {
2826                   SUBST (SET_SRC (x), extraction);
2827                   return find_split_point (loc, insn);
2828                 }
2829             }
2830           break;
2831
2832         case NE:
2833           /* if STORE_FLAG_VALUE is -1, this is (NE X 0) and only one bit of X
2834              is known to be on, this can be converted into a NEG of a shift. */
2835           if (STORE_FLAG_VALUE == -1 && XEXP (SET_SRC (x), 1) == const0_rtx
2836               && GET_MODE (SET_SRC (x)) == GET_MODE (XEXP (SET_SRC (x), 0))
2837               && 1 <= (pos = exact_log2
2838                        (nonzero_bits (XEXP (SET_SRC (x), 0),
2839                                       GET_MODE (XEXP (SET_SRC (x), 0))))))
2840             {
2841               enum machine_mode mode = GET_MODE (XEXP (SET_SRC (x), 0));
2842
2843               SUBST (SET_SRC (x),
2844                      gen_rtx_combine (NEG, mode,
2845                                       gen_rtx_combine (LSHIFTRT, mode,
2846                                                        XEXP (SET_SRC (x), 0),
2847                                                        GEN_INT (pos))));
2848
2849               split = find_split_point (&SET_SRC (x), insn);
2850               if (split && split != &SET_SRC (x))
2851                 return split;
2852             }
2853           break;
2854
2855         case SIGN_EXTEND:
2856           inner = XEXP (SET_SRC (x), 0);
2857
2858           /* We can't optimize if either mode is a partial integer
2859              mode as we don't know how many bits are significant
2860              in those modes.  */
2861           if (GET_MODE_CLASS (GET_MODE (inner)) == MODE_PARTIAL_INT
2862               || GET_MODE_CLASS (GET_MODE (SET_SRC (x))) == MODE_PARTIAL_INT)
2863             break;
2864
2865           pos = 0;
2866           len = GET_MODE_BITSIZE (GET_MODE (inner));
2867           unsignedp = 0;
2868           break;
2869
2870         case SIGN_EXTRACT:
2871         case ZERO_EXTRACT:
2872           if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
2873               && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT)
2874             {
2875               inner = XEXP (SET_SRC (x), 0);
2876               len = INTVAL (XEXP (SET_SRC (x), 1));
2877               pos = INTVAL (XEXP (SET_SRC (x), 2));
2878
2879               if (BITS_BIG_ENDIAN)
2880                 pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos;
2881               unsignedp = (code == ZERO_EXTRACT);
2882             }
2883           break;
2884
2885         default:
2886           break;
2887         }
2888
2889       if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner)))
2890         {
2891           enum machine_mode mode = GET_MODE (SET_SRC (x));
2892
2893           /* For unsigned, we have a choice of a shift followed by an
2894              AND or two shifts.  Use two shifts for field sizes where the
2895              constant might be too large.  We assume here that we can
2896              always at least get 8-bit constants in an AND insn, which is
2897              true for every current RISC.  */
2898
2899           if (unsignedp && len <= 8)
2900             {
2901               SUBST (SET_SRC (x),
2902                      gen_rtx_combine
2903                      (AND, mode,
2904                       gen_rtx_combine (LSHIFTRT, mode,
2905                                        gen_lowpart_for_combine (mode, inner),
2906                                        GEN_INT (pos)),
2907                       GEN_INT (((HOST_WIDE_INT) 1 << len) - 1)));
2908
2909               split = find_split_point (&SET_SRC (x), insn);
2910               if (split && split != &SET_SRC (x))
2911                 return split;
2912             }
2913           else
2914             {
2915               SUBST (SET_SRC (x),
2916                      gen_rtx_combine
2917                      (unsignedp ? LSHIFTRT : ASHIFTRT, mode,
2918                       gen_rtx_combine (ASHIFT, mode,
2919                                        gen_lowpart_for_combine (mode, inner),
2920                                        GEN_INT (GET_MODE_BITSIZE (mode)
2921                                                 - len - pos)),
2922                       GEN_INT (GET_MODE_BITSIZE (mode) - len)));
2923
2924               split = find_split_point (&SET_SRC (x), insn);
2925               if (split && split != &SET_SRC (x))
2926                 return split;
2927             }
2928         }
2929
2930       /* See if this is a simple operation with a constant as the second
2931          operand.  It might be that this constant is out of range and hence
2932          could be used as a split point.  */
2933       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
2934            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
2935            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<')
2936           && CONSTANT_P (XEXP (SET_SRC (x), 1))
2937           && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o'
2938               || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG
2939                   && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0))))
2940                       == 'o'))))
2941         return &XEXP (SET_SRC (x), 1);
2942
2943       /* Finally, see if this is a simple operation with its first operand
2944          not in a register.  The operation might require this operand in a
2945          register, so return it as a split point.  We can always do this
2946          because if the first operand were another operation, we would have
2947          already found it as a split point.  */
2948       if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2'
2949            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c'
2950            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<'
2951            || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1')
2952           && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode))
2953         return &XEXP (SET_SRC (x), 0);
2954
2955       return 0;
2956
2957     case AND:
2958     case IOR:
2959       /* We write NOR as (and (not A) (not B)), but if we don't have a NOR,
2960          it is better to write this as (not (ior A B)) so we can split it.
2961          Similarly for IOR.  */
2962       if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT)
2963         {
2964           SUBST (*loc,
2965                  gen_rtx_combine (NOT, GET_MODE (x),
2966                                   gen_rtx_combine (code == IOR ? AND : IOR,
2967                                                    GET_MODE (x),
2968                                                    XEXP (XEXP (x, 0), 0),
2969                                                    XEXP (XEXP (x, 1), 0))));
2970           return find_split_point (loc, insn);
2971         }
2972
2973       /* Many RISC machines have a large set of logical insns.  If the
2974          second operand is a NOT, put it first so we will try to split the
2975          other operand first.  */
2976       if (GET_CODE (XEXP (x, 1)) == NOT)
2977         {
2978           rtx tem = XEXP (x, 0);
2979           SUBST (XEXP (x, 0), XEXP (x, 1));
2980           SUBST (XEXP (x, 1), tem);
2981         }
2982       break;
2983
2984     default:
2985       break;
2986     }
2987
2988   /* Otherwise, select our actions depending on our rtx class.  */
2989   switch (GET_RTX_CLASS (code))
2990     {
2991     case 'b':                   /* This is ZERO_EXTRACT and SIGN_EXTRACT.  */
2992     case '3':
2993       split = find_split_point (&XEXP (x, 2), insn);
2994       if (split)
2995         return split;
2996       /* ... fall through ...  */
2997     case '2':
2998     case 'c':
2999     case '<':
3000       split = find_split_point (&XEXP (x, 1), insn);
3001       if (split)
3002         return split;
3003       /* ... fall through ...  */
3004     case '1':
3005       /* Some machines have (and (shift ...) ...) insns.  If X is not
3006          an AND, but XEXP (X, 0) is, use it as our split point.  */
3007       if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND)
3008         return &XEXP (x, 0);
3009
3010       split = find_split_point (&XEXP (x, 0), insn);
3011       if (split)
3012         return split;
3013       return loc;
3014     }
3015
3016   /* Otherwise, we don't have a split point.  */
3017   return 0;
3018 }
3019 \f
3020 /* Throughout X, replace FROM with TO, and return the result.
3021    The result is TO if X is FROM;
3022    otherwise the result is X, but its contents may have been modified.
3023    If they were modified, a record was made in undobuf so that
3024    undo_all will (among other things) return X to its original state.
3025
3026    If the number of changes necessary is too much to record to undo,
3027    the excess changes are not made, so the result is invalid.
3028    The changes already made can still be undone.
3029    undobuf.num_undo is incremented for such changes, so by testing that
3030    the caller can tell whether the result is valid.
3031
3032    `n_occurrences' is incremented each time FROM is replaced.
3033    
3034    IN_DEST is non-zero if we are processing the SET_DEST of a SET.
3035
3036    UNIQUE_COPY is non-zero if each substitution must be unique.  We do this
3037    by copying if `n_occurrences' is non-zero.  */
3038
3039 static rtx
3040 subst (x, from, to, in_dest, unique_copy)
3041      register rtx x, from, to;
3042      int in_dest;
3043      int unique_copy;
3044 {
3045   register enum rtx_code code = GET_CODE (x);
3046   enum machine_mode op0_mode = VOIDmode;
3047   register const char *fmt;
3048   register int len, i;
3049   rtx new;
3050
3051 /* Two expressions are equal if they are identical copies of a shared
3052    RTX or if they are both registers with the same register number
3053    and mode.  */
3054
3055 #define COMBINE_RTX_EQUAL_P(X,Y)                        \
3056   ((X) == (Y)                                           \
3057    || (GET_CODE (X) == REG && GET_CODE (Y) == REG       \
3058        && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y)))
3059
3060   if (! in_dest && COMBINE_RTX_EQUAL_P (x, from))
3061     {
3062       n_occurrences++;
3063       return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to);
3064     }
3065
3066   /* If X and FROM are the same register but different modes, they will
3067      not have been seen as equal above.  However, flow.c will make a 
3068      LOG_LINKS entry for that case.  If we do nothing, we will try to
3069      rerecognize our original insn and, when it succeeds, we will
3070      delete the feeding insn, which is incorrect.
3071
3072      So force this insn not to match in this (rare) case.  */
3073   if (! in_dest && code == REG && GET_CODE (from) == REG
3074       && REGNO (x) == REGNO (from))
3075     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
3076
3077   /* If this is an object, we are done unless it is a MEM or LO_SUM, both
3078      of which may contain things that can be combined.  */
3079   if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o')
3080     return x;
3081
3082   /* It is possible to have a subexpression appear twice in the insn.
3083      Suppose that FROM is a register that appears within TO.
3084      Then, after that subexpression has been scanned once by `subst',
3085      the second time it is scanned, TO may be found.  If we were
3086      to scan TO here, we would find FROM within it and create a
3087      self-referent rtl structure which is completely wrong.  */
3088   if (COMBINE_RTX_EQUAL_P (x, to))
3089     return to;
3090
3091   /* Parallel asm_operands need special attention because all of the
3092      inputs are shared across the arms.  Furthermore, unsharing the
3093      rtl results in recognition failures.  Failure to handle this case
3094      specially can result in circular rtl.
3095
3096      Solve this by doing a normal pass across the first entry of the
3097      parallel, and only processing the SET_DESTs of the subsequent
3098      entries.  Ug.  */
3099
3100   if (code == PARALLEL
3101       && GET_CODE (XVECEXP (x, 0, 0)) == SET
3102       && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
3103     {
3104       new = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy);
3105
3106       /* If this substitution failed, this whole thing fails.  */
3107       if (GET_CODE (new) == CLOBBER
3108           && XEXP (new, 0) == const0_rtx)
3109         return new;
3110
3111       SUBST (XVECEXP (x, 0, 0), new);
3112
3113       for (i = XVECLEN (x, 0) - 1; i >= 1; i--)
3114         {
3115           rtx dest = SET_DEST (XVECEXP (x, 0, i));
3116           
3117           if (GET_CODE (dest) != REG
3118               && GET_CODE (dest) != CC0
3119               && GET_CODE (dest) != PC)
3120             {
3121               new = subst (dest, from, to, 0, unique_copy);
3122
3123               /* If this substitution failed, this whole thing fails.  */
3124               if (GET_CODE (new) == CLOBBER
3125                   && XEXP (new, 0) == const0_rtx)
3126                 return new;
3127
3128               SUBST (SET_DEST (XVECEXP (x, 0, i)), new);
3129             }
3130         }
3131     }
3132   else
3133     {
3134       len = GET_RTX_LENGTH (code);
3135       fmt = GET_RTX_FORMAT (code);
3136
3137       /* We don't need to process a SET_DEST that is a register, CC0,
3138          or PC, so set up to skip this common case.  All other cases
3139          where we want to suppress replacing something inside a
3140          SET_SRC are handled via the IN_DEST operand.  */
3141       if (code == SET
3142           && (GET_CODE (SET_DEST (x)) == REG
3143               || GET_CODE (SET_DEST (x)) == CC0
3144               || GET_CODE (SET_DEST (x)) == PC))
3145         fmt = "ie";
3146
3147       /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a
3148          constant.  */
3149       if (fmt[0] == 'e')
3150         op0_mode = GET_MODE (XEXP (x, 0));
3151
3152       for (i = 0; i < len; i++)
3153         {
3154           if (fmt[i] == 'E')
3155             {
3156               register int j;
3157               for (j = XVECLEN (x, i) - 1; j >= 0; j--)
3158                 {
3159                   if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from))
3160                     {
3161                       new = (unique_copy && n_occurrences
3162                              ? copy_rtx (to) : to);
3163                       n_occurrences++;
3164                     }
3165                   else
3166                     {
3167                       new = subst (XVECEXP (x, i, j), from, to, 0,
3168                                    unique_copy);
3169
3170                       /* If this substitution failed, this whole thing
3171                          fails.  */
3172                       if (GET_CODE (new) == CLOBBER
3173                           && XEXP (new, 0) == const0_rtx)
3174                         return new;
3175                     }
3176
3177                   SUBST (XVECEXP (x, i, j), new);
3178                 }
3179             }
3180           else if (fmt[i] == 'e')
3181             {
3182               if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from))
3183                 {
3184                   /* In general, don't install a subreg involving two
3185                      modes not tieable.  It can worsen register
3186                      allocation, and can even make invalid reload
3187                      insns, since the reg inside may need to be copied
3188                      from in the outside mode, and that may be invalid
3189                      if it is an fp reg copied in integer mode.
3190
3191                      We allow two exceptions to this: It is valid if
3192                      it is inside another SUBREG and the mode of that
3193                      SUBREG and the mode of the inside of TO is
3194                      tieable and it is valid if X is a SET that copies
3195                      FROM to CC0.  */
3196
3197                   if (GET_CODE (to) == SUBREG
3198                       && ! MODES_TIEABLE_P (GET_MODE (to),
3199                                             GET_MODE (SUBREG_REG (to)))
3200                       && ! (code == SUBREG
3201                             && MODES_TIEABLE_P (GET_MODE (x),
3202                                                 GET_MODE (SUBREG_REG (to))))
3203 #ifdef HAVE_cc0
3204                       && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx)
3205 #endif
3206                       )
3207                     return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
3208
3209                   new = (unique_copy && n_occurrences ? copy_rtx (to) : to);
3210                   n_occurrences++;
3211                 }
3212               else
3213                 /* If we are in a SET_DEST, suppress most cases unless we
3214                    have gone inside a MEM, in which case we want to
3215                    simplify the address.  We assume here that things that
3216                    are actually part of the destination have their inner
3217                    parts in the first expression.  This is true for SUBREG, 
3218                    STRICT_LOW_PART, and ZERO_EXTRACT, which are the only
3219                    things aside from REG and MEM that should appear in a
3220                    SET_DEST.  */
3221                 new = subst (XEXP (x, i), from, to,
3222                              (((in_dest
3223                                 && (code == SUBREG || code == STRICT_LOW_PART
3224                                     || code == ZERO_EXTRACT))
3225                                || code == SET)
3226                               && i == 0), unique_copy);
3227
3228               /* If we found that we will have to reject this combination,
3229                  indicate that by returning the CLOBBER ourselves, rather than
3230                  an expression containing it.  This will speed things up as
3231                  well as prevent accidents where two CLOBBERs are considered
3232                  to be equal, thus producing an incorrect simplification.  */
3233
3234               if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx)
3235                 return new;
3236
3237               SUBST (XEXP (x, i), new);
3238             }
3239         }
3240     }
3241
3242   /* Try to simplify X.  If the simplification changed the code, it is likely
3243      that further simplification will help, so loop, but limit the number
3244      of repetitions that will be performed.  */
3245
3246   for (i = 0; i < 4; i++)
3247     {
3248       /* If X is sufficiently simple, don't bother trying to do anything
3249          with it.  */
3250       if (code != CONST_INT && code != REG && code != CLOBBER)
3251         x = simplify_rtx (x, op0_mode, i == 3, in_dest);
3252
3253       if (GET_CODE (x) == code)
3254         break;
3255
3256       code = GET_CODE (x);
3257
3258       /* We no longer know the original mode of operand 0 since we
3259          have changed the form of X)  */
3260       op0_mode = VOIDmode;
3261     }
3262
3263   return x;
3264 }
3265 \f
3266 /* Simplify X, a piece of RTL.  We just operate on the expression at the
3267    outer level; call `subst' to simplify recursively.  Return the new
3268    expression.
3269
3270    OP0_MODE is the original mode of XEXP (x, 0); LAST is nonzero if this
3271    will be the iteration even if an expression with a code different from
3272    X is returned; IN_DEST is nonzero if we are inside a SET_DEST.  */
3273
3274 static rtx
3275 simplify_rtx (x, op0_mode, last, in_dest)
3276      rtx x;
3277      enum machine_mode op0_mode;
3278      int last;
3279      int in_dest;
3280 {
3281   enum rtx_code code = GET_CODE (x);
3282   enum machine_mode mode = GET_MODE (x);
3283   rtx temp;
3284   int i;
3285
3286   /* If this is a commutative operation, put a constant last and a complex
3287      expression first.  We don't need to do this for comparisons here.  */
3288   if (GET_RTX_CLASS (code) == 'c'
3289       && ((CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT)
3290           || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'o'
3291               && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')
3292           || (GET_CODE (XEXP (x, 0)) == SUBREG
3293               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o'
3294               && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o')))
3295     {
3296       temp = XEXP (x, 0);
3297       SUBST (XEXP (x, 0), XEXP (x, 1));
3298       SUBST (XEXP (x, 1), temp);
3299     }
3300
3301   /* If this is a PLUS, MINUS, or MULT, and the first operand is the
3302      sign extension of a PLUS with a constant, reverse the order of the sign
3303      extension and the addition. Note that this not the same as the original
3304      code, but overflow is undefined for signed values.  Also note that the
3305      PLUS will have been partially moved "inside" the sign-extension, so that
3306      the first operand of X will really look like:
3307          (ashiftrt (plus (ashift A C4) C5) C4).
3308      We convert this to
3309          (plus (ashiftrt (ashift A C4) C2) C4)
3310      and replace the first operand of X with that expression.  Later parts
3311      of this function may simplify the expression further.
3312
3313      For example, if we start with (mult (sign_extend (plus A C1)) C2),
3314      we swap the SIGN_EXTEND and PLUS.  Later code will apply the
3315      distributive law to produce (plus (mult (sign_extend X) C1) C3).
3316
3317      We do this to simplify address expressions.  */
3318
3319   if ((code == PLUS || code == MINUS || code == MULT)
3320       && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3321       && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS
3322       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT
3323       && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT
3324       && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3325       && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1)
3326       && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3327       && (temp = simplify_binary_operation (ASHIFTRT, mode,
3328                                             XEXP (XEXP (XEXP (x, 0), 0), 1),
3329                                             XEXP (XEXP (x, 0), 1))) != 0)
3330     {
3331       rtx new
3332         = simplify_shift_const (NULL_RTX, ASHIFT, mode,
3333                                 XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0),
3334                                 INTVAL (XEXP (XEXP (x, 0), 1)));
3335
3336       new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new,
3337                                   INTVAL (XEXP (XEXP (x, 0), 1)));
3338
3339       SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp));
3340     }
3341
3342   /* If this is a simple operation applied to an IF_THEN_ELSE, try 
3343      applying it to the arms of the IF_THEN_ELSE.  This often simplifies
3344      things.  Check for cases where both arms are testing the same
3345      condition.
3346
3347      Don't do anything if all operands are very simple.  */
3348
3349   if (((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c'
3350         || GET_RTX_CLASS (code) == '<')
3351        && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3352             && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3353                   && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3354                       == 'o')))
3355            || (GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o'
3356                && ! (GET_CODE (XEXP (x, 1)) == SUBREG
3357                      && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 1))))
3358                          == 'o')))))
3359       || (GET_RTX_CLASS (code) == '1'
3360           && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o'
3361                && ! (GET_CODE (XEXP (x, 0)) == SUBREG
3362                      && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0))))
3363                          == 'o'))))))
3364     {
3365       rtx cond, true, false;
3366
3367       cond = if_then_else_cond (x, &true, &false);
3368       if (cond != 0
3369           /* If everything is a comparison, what we have is highly unlikely
3370              to be simpler, so don't use it.  */
3371           && ! (GET_RTX_CLASS (code) == '<'
3372                 && (GET_RTX_CLASS (GET_CODE (true)) == '<'
3373                     || GET_RTX_CLASS (GET_CODE (false)) == '<')))
3374         {
3375           rtx cop1 = const0_rtx;
3376           enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1);
3377
3378           if (cond_code == NE && GET_RTX_CLASS (GET_CODE (cond)) == '<')
3379             return x;
3380
3381           /* Simplify the alternative arms; this may collapse the true and 
3382              false arms to store-flag values.  */
3383           true = subst (true, pc_rtx, pc_rtx, 0, 0);
3384           false = subst (false, pc_rtx, pc_rtx, 0, 0);
3385
3386           /* Restarting if we generate a store-flag expression will cause
3387              us to loop.  Just drop through in this case.  */
3388
3389           /* If the result values are STORE_FLAG_VALUE and zero, we can
3390              just make the comparison operation.  */
3391           if (true == const_true_rtx && false == const0_rtx)
3392             x = gen_binary (cond_code, mode, cond, cop1);
3393           else if (true == const0_rtx && false == const_true_rtx)
3394             x = gen_binary (reverse_condition (cond_code), mode, cond, cop1);
3395
3396           /* Likewise, we can make the negate of a comparison operation
3397              if the result values are - STORE_FLAG_VALUE and zero.  */
3398           else if (GET_CODE (true) == CONST_INT
3399                    && INTVAL (true) == - STORE_FLAG_VALUE
3400                    && false == const0_rtx)
3401             x = gen_unary (NEG, mode, mode,
3402                            gen_binary (cond_code, mode, cond, cop1));
3403           else if (GET_CODE (false) == CONST_INT
3404                    && INTVAL (false) == - STORE_FLAG_VALUE
3405                    && true == const0_rtx)
3406             x = gen_unary (NEG, mode, mode,
3407                            gen_binary (reverse_condition (cond_code), 
3408                                        mode, cond, cop1));
3409           else
3410             return gen_rtx_IF_THEN_ELSE (mode,
3411                                          gen_binary (cond_code, VOIDmode,
3412                                                      cond, cop1),
3413                                          true, false);
3414
3415           code = GET_CODE (x);
3416           op0_mode = VOIDmode;
3417         }
3418     }
3419
3420   /* Try to fold this expression in case we have constants that weren't
3421      present before.  */
3422   temp = 0;
3423   switch (GET_RTX_CLASS (code))
3424     {
3425     case '1':
3426       temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode);
3427       break;
3428     case '<':
3429       temp = simplify_relational_operation (code, op0_mode,
3430                                             XEXP (x, 0), XEXP (x, 1));
3431 #ifdef FLOAT_STORE_FLAG_VALUE
3432       if (temp != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
3433         temp = ((temp == const0_rtx) ? CONST0_RTX (GET_MODE (x))
3434                 : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x)));
3435 #endif
3436       break;
3437     case 'c':
3438     case '2':
3439       temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1));
3440       break;
3441     case 'b':
3442     case '3':
3443       temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0),
3444                                          XEXP (x, 1), XEXP (x, 2));
3445       break;
3446     }
3447
3448   if (temp)
3449     x = temp, code = GET_CODE (temp);
3450
3451   /* First see if we can apply the inverse distributive law.  */
3452   if (code == PLUS || code == MINUS
3453       || code == AND || code == IOR || code == XOR)
3454     {
3455       x = apply_distributive_law (x);
3456       code = GET_CODE (x);
3457     }
3458
3459   /* If CODE is an associative operation not otherwise handled, see if we
3460      can associate some operands.  This can win if they are constants or
3461      if they are logically related (i.e. (a & b) & a.  */
3462   if ((code == PLUS || code == MINUS
3463        || code == MULT || code == AND || code == IOR || code == XOR
3464        || code == DIV || code == UDIV
3465        || code == SMAX || code == SMIN || code == UMAX || code == UMIN)
3466       && INTEGRAL_MODE_P (mode))
3467     {
3468       if (GET_CODE (XEXP (x, 0)) == code)
3469         {
3470           rtx other = XEXP (XEXP (x, 0), 0);
3471           rtx inner_op0 = XEXP (XEXP (x, 0), 1);
3472           rtx inner_op1 = XEXP (x, 1);
3473           rtx inner;
3474           
3475           /* Make sure we pass the constant operand if any as the second
3476              one if this is a commutative operation.  */
3477           if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c')
3478             {
3479               rtx tem = inner_op0;
3480               inner_op0 = inner_op1;
3481               inner_op1 = tem;
3482             }
3483           inner = simplify_binary_operation (code == MINUS ? PLUS
3484                                              : code == DIV ? MULT
3485                                              : code == UDIV ? MULT
3486                                              : code,
3487                                              mode, inner_op0, inner_op1);
3488
3489           /* For commutative operations, try the other pair if that one
3490              didn't simplify.  */
3491           if (inner == 0 && GET_RTX_CLASS (code) == 'c')
3492             {
3493               other = XEXP (XEXP (x, 0), 1);
3494               inner = simplify_binary_operation (code, mode,
3495                                                  XEXP (XEXP (x, 0), 0),
3496                                                  XEXP (x, 1));
3497             }
3498
3499           if (inner)
3500             return gen_binary (code, mode, other, inner);
3501         }
3502     }
3503
3504   /* A little bit of algebraic simplification here.  */
3505   switch (code)
3506     {
3507     case MEM:
3508       /* Ensure that our address has any ASHIFTs converted to MULT in case
3509          address-recognizing predicates are called later.  */
3510       temp = make_compound_operation (XEXP (x, 0), MEM);
3511       SUBST (XEXP (x, 0), temp);
3512       break;
3513
3514     case SUBREG:
3515       /* (subreg:A (mem:B X) N) becomes a modified MEM unless the SUBREG
3516          is paradoxical.  If we can't do that safely, then it becomes
3517          something nonsensical so that this combination won't take place.  */
3518
3519       if (GET_CODE (SUBREG_REG (x)) == MEM
3520           && (GET_MODE_SIZE (mode)
3521               <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
3522         {
3523           rtx inner = SUBREG_REG (x);
3524           int endian_offset = 0;
3525           /* Don't change the mode of the MEM
3526              if that would change the meaning of the address.  */
3527           if (MEM_VOLATILE_P (SUBREG_REG (x))
3528               || mode_dependent_address_p (XEXP (inner, 0)))
3529             return gen_rtx_CLOBBER (mode, const0_rtx);
3530
3531           if (BYTES_BIG_ENDIAN)
3532             {
3533               if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
3534                 endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (mode);
3535               if (GET_MODE_SIZE (GET_MODE (inner)) < UNITS_PER_WORD)
3536                 endian_offset -= (UNITS_PER_WORD
3537                                   - GET_MODE_SIZE (GET_MODE (inner)));
3538             }
3539           /* Note if the plus_constant doesn't make a valid address
3540              then this combination won't be accepted.  */
3541           x = gen_rtx_MEM (mode,
3542                            plus_constant (XEXP (inner, 0),
3543                                           (SUBREG_WORD (x) * UNITS_PER_WORD
3544                                            + endian_offset)));
3545           RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (inner);
3546           MEM_COPY_ATTRIBUTES (x, inner);
3547           return x;
3548         }
3549
3550       /* If we are in a SET_DEST, these other cases can't apply.  */
3551       if (in_dest)
3552         return x;
3553
3554       /* Changing mode twice with SUBREG => just change it once,
3555          or not at all if changing back to starting mode.  */
3556       if (GET_CODE (SUBREG_REG (x)) == SUBREG)
3557         {
3558           if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x)))
3559               && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0)
3560             return SUBREG_REG (SUBREG_REG (x));
3561
3562           SUBST_INT (SUBREG_WORD (x),
3563                      SUBREG_WORD (x) + SUBREG_WORD (SUBREG_REG (x)));
3564           SUBST (SUBREG_REG (x), SUBREG_REG (SUBREG_REG (x)));
3565         }
3566
3567       /* SUBREG of a hard register => just change the register number
3568          and/or mode.  If the hard register is not valid in that mode,
3569          suppress this combination.  If the hard register is the stack,
3570          frame, or argument pointer, leave this as a SUBREG.  */
3571
3572       if (GET_CODE (SUBREG_REG (x)) == REG
3573           && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
3574           && REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM
3575 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
3576           && REGNO (SUBREG_REG (x)) != HARD_FRAME_POINTER_REGNUM
3577 #endif
3578 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3579           && REGNO (SUBREG_REG (x)) != ARG_POINTER_REGNUM
3580 #endif
3581           && REGNO (SUBREG_REG (x)) != STACK_POINTER_REGNUM)
3582         {
3583           if (HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (x)) + SUBREG_WORD (x),
3584                                   mode))
3585             return gen_rtx_REG (mode,
3586                                 REGNO (SUBREG_REG (x)) + SUBREG_WORD (x));
3587           else
3588             return gen_rtx_CLOBBER (mode, const0_rtx);
3589         }
3590
3591       /* For a constant, try to pick up the part we want.  Handle a full
3592          word and low-order part.  Only do this if we are narrowing
3593          the constant; if it is being widened, we have no idea what
3594          the extra bits will have been set to.  */
3595
3596       if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode
3597           && GET_MODE_SIZE (mode) == UNITS_PER_WORD
3598           && GET_MODE_SIZE (op0_mode) > UNITS_PER_WORD
3599           && GET_MODE_CLASS (mode) == MODE_INT)
3600         {
3601           temp = operand_subword (SUBREG_REG (x), SUBREG_WORD (x),
3602                                   0, op0_mode);
3603           if (temp)
3604             return temp;
3605         }
3606         
3607       /* If we want a subreg of a constant, at offset 0,
3608          take the low bits.  On a little-endian machine, that's
3609          always valid.  On a big-endian machine, it's valid
3610          only if the constant's mode fits in one word.   Note that we
3611          cannot use subreg_lowpart_p since SUBREG_REG may be VOIDmode.  */
3612       if (CONSTANT_P (SUBREG_REG (x))
3613           && ((GET_MODE_SIZE (op0_mode) <= UNITS_PER_WORD
3614               || ! WORDS_BIG_ENDIAN)
3615               ? SUBREG_WORD (x) == 0
3616               : (SUBREG_WORD (x)
3617                  == ((GET_MODE_SIZE (op0_mode)
3618                       - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
3619                      / UNITS_PER_WORD)))
3620           && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (op0_mode)
3621           && (! WORDS_BIG_ENDIAN
3622               || GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD))
3623         return gen_lowpart_for_combine (mode, SUBREG_REG (x));
3624
3625       /* A paradoxical SUBREG of a VOIDmode constant is the same constant,
3626          since we are saying that the high bits don't matter.  */
3627       if (CONSTANT_P (SUBREG_REG (x)) && GET_MODE (SUBREG_REG (x)) == VOIDmode
3628           && GET_MODE_SIZE (mode) > GET_MODE_SIZE (op0_mode))
3629         return SUBREG_REG (x);
3630
3631       /* Note that we cannot do any narrowing for non-constants since
3632          we might have been counting on using the fact that some bits were
3633          zero.  We now do this in the SET.  */
3634
3635       break;
3636
3637     case NOT:
3638       /* (not (plus X -1)) can become (neg X).  */
3639       if (GET_CODE (XEXP (x, 0)) == PLUS
3640           && XEXP (XEXP (x, 0), 1) == constm1_rtx)
3641         return gen_rtx_combine (NEG, mode, XEXP (XEXP (x, 0), 0));
3642
3643       /* Similarly, (not (neg X)) is (plus X -1).  */
3644       if (GET_CODE (XEXP (x, 0)) == NEG)
3645         return gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0),
3646                                 constm1_rtx);
3647
3648       /* (not (xor X C)) for C constant is (xor X D) with D = ~ C.  */
3649       if (GET_CODE (XEXP (x, 0)) == XOR
3650           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3651           && (temp = simplify_unary_operation (NOT, mode,
3652                                                XEXP (XEXP (x, 0), 1),
3653                                                mode)) != 0)
3654         return gen_binary (XOR, mode, XEXP (XEXP (x, 0), 0), temp);
3655               
3656       /* (not (ashift 1 X)) is (rotate ~1 X).  We used to do this for operands
3657          other than 1, but that is not valid.  We could do a similar
3658          simplification for (not (lshiftrt C X)) where C is just the sign bit,
3659          but this doesn't seem common enough to bother with.  */
3660       if (GET_CODE (XEXP (x, 0)) == ASHIFT
3661           && XEXP (XEXP (x, 0), 0) == const1_rtx)
3662         return gen_rtx_ROTATE (mode, gen_unary (NOT, mode, mode, const1_rtx),
3663                                XEXP (XEXP (x, 0), 1));
3664                                             
3665       if (GET_CODE (XEXP (x, 0)) == SUBREG
3666           && subreg_lowpart_p (XEXP (x, 0))
3667           && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0)))
3668               < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0)))))
3669           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT
3670           && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx)
3671         {
3672           enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0)));
3673
3674           x = gen_rtx_ROTATE (inner_mode,
3675                               gen_unary (NOT, inner_mode, inner_mode,
3676                                          const1_rtx),
3677                               XEXP (SUBREG_REG (XEXP (x, 0)), 1));
3678           return gen_lowpart_for_combine (mode, x);
3679         }
3680                                             
3681       /* If STORE_FLAG_VALUE is -1, (not (comparison foo bar)) can be done by
3682          reversing the comparison code if valid.  */
3683       if (STORE_FLAG_VALUE == -1
3684           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3685           && reversible_comparison_p (XEXP (x, 0)))
3686         return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))),
3687                                 mode, XEXP (XEXP (x, 0), 0),
3688                                 XEXP (XEXP (x, 0), 1));
3689
3690       /* (ashiftrt foo C) where C is the number of bits in FOO minus 1
3691          is (lt foo (const_int 0)) if STORE_FLAG_VALUE is -1, so we can
3692          perform the above simplification.  */
3693
3694       if (STORE_FLAG_VALUE == -1
3695           && XEXP (x, 1) == const1_rtx
3696           && GET_CODE (XEXP (x, 0)) == ASHIFTRT
3697           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3698           && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1)
3699         return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx);
3700
3701       /* Apply De Morgan's laws to reduce number of patterns for machines
3702          with negating logical insns (and-not, nand, etc.).  If result has
3703          only one NOT, put it first, since that is how the patterns are
3704          coded.  */
3705
3706       if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND)
3707         {
3708          rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1);
3709
3710          if (GET_CODE (in1) == NOT)
3711            in1 = XEXP (in1, 0);
3712          else
3713            in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1);
3714
3715          if (GET_CODE (in2) == NOT)
3716            in2 = XEXP (in2, 0);
3717          else if (GET_CODE (in2) == CONST_INT
3718                   && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
3719            in2 = GEN_INT (GET_MODE_MASK (mode) & ~ INTVAL (in2));
3720          else
3721            in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2);
3722
3723          if (GET_CODE (in2) == NOT)
3724            {
3725              rtx tem = in2;
3726              in2 = in1; in1 = tem;
3727            }
3728
3729          return gen_rtx_combine (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR,
3730                                  mode, in1, in2);
3731        } 
3732       break;
3733
3734     case NEG:
3735       /* (neg (plus X 1)) can become (not X).  */
3736       if (GET_CODE (XEXP (x, 0)) == PLUS
3737           && XEXP (XEXP (x, 0), 1) == const1_rtx)
3738         return gen_rtx_combine (NOT, mode, XEXP (XEXP (x, 0), 0));
3739
3740       /* Similarly, (neg (not X)) is (plus X 1).  */
3741       if (GET_CODE (XEXP (x, 0)) == NOT)
3742         return plus_constant (XEXP (XEXP (x, 0), 0), 1);
3743
3744       /* (neg (minus X Y)) can become (minus Y X).  */
3745       if (GET_CODE (XEXP (x, 0)) == MINUS
3746           && (! FLOAT_MODE_P (mode)
3747               /* x-y != -(y-x) with IEEE floating point.  */
3748               || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3749               || flag_fast_math))
3750         return gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1),
3751                            XEXP (XEXP (x, 0), 0));
3752
3753       /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1.  */
3754       if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx
3755           && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1)
3756         return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx);
3757
3758       /* NEG commutes with ASHIFT since it is multiplication.  Only do this
3759          if we can then eliminate the NEG (e.g.,
3760          if the operand is a constant).  */
3761
3762       if (GET_CODE (XEXP (x, 0)) == ASHIFT)
3763         {
3764           temp = simplify_unary_operation (NEG, mode,
3765                                            XEXP (XEXP (x, 0), 0), mode);
3766           if (temp)
3767             {
3768               SUBST (XEXP (XEXP (x, 0), 0), temp);
3769               return XEXP (x, 0);
3770             }
3771         }
3772
3773       temp = expand_compound_operation (XEXP (x, 0));
3774
3775       /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be
3776          replaced by (lshiftrt X C).  This will convert
3777          (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y).  */
3778
3779       if (GET_CODE (temp) == ASHIFTRT
3780           && GET_CODE (XEXP (temp, 1)) == CONST_INT
3781           && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1)
3782         return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0),
3783                                      INTVAL (XEXP (temp, 1)));
3784
3785       /* If X has only a single bit that might be nonzero, say, bit I, convert
3786          (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of
3787          MODE minus 1.  This will convert (neg (zero_extract X 1 Y)) to
3788          (sign_extract X 1 Y).  But only do this if TEMP isn't a register
3789          or a SUBREG of one since we'd be making the expression more
3790          complex if it was just a register.  */
3791
3792       if (GET_CODE (temp) != REG
3793           && ! (GET_CODE (temp) == SUBREG
3794                 && GET_CODE (SUBREG_REG (temp)) == REG)
3795           && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0)
3796         {
3797           rtx temp1 = simplify_shift_const
3798             (NULL_RTX, ASHIFTRT, mode,
3799              simplify_shift_const (NULL_RTX, ASHIFT, mode, temp,
3800                                    GET_MODE_BITSIZE (mode) - 1 - i),
3801              GET_MODE_BITSIZE (mode) - 1 - i);
3802
3803           /* If all we did was surround TEMP with the two shifts, we
3804              haven't improved anything, so don't use it.  Otherwise,
3805              we are better off with TEMP1.  */
3806           if (GET_CODE (temp1) != ASHIFTRT
3807               || GET_CODE (XEXP (temp1, 0)) != ASHIFT
3808               || XEXP (XEXP (temp1, 0), 0) != temp)
3809             return temp1;
3810         }
3811       break;
3812
3813     case TRUNCATE:
3814       /* We can't handle truncation to a partial integer mode here
3815          because we don't know the real bitsize of the partial
3816          integer mode.  */
3817       if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
3818         break;
3819
3820       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3821           && TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
3822                                     GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))))
3823         SUBST (XEXP (x, 0),
3824                force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)),
3825                               GET_MODE_MASK (mode), NULL_RTX, 0));
3826
3827       /* (truncate:SI ({sign,zero}_extend:DI foo:SI)) == foo:SI.  */
3828       if ((GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
3829            || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
3830           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
3831         return XEXP (XEXP (x, 0), 0);
3832
3833       /* (truncate:SI (OP:DI ({sign,zero}_extend:DI foo:SI))) is
3834          (OP:SI foo:SI) if OP is NEG or ABS.  */
3835       if ((GET_CODE (XEXP (x, 0)) == ABS
3836            || GET_CODE (XEXP (x, 0)) == NEG)
3837           && (GET_CODE (XEXP (XEXP (x, 0), 0)) == SIGN_EXTEND
3838               || GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND)
3839           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
3840         return gen_unary (GET_CODE (XEXP (x, 0)), mode, mode,
3841                           XEXP (XEXP (XEXP (x, 0), 0), 0));
3842
3843       /* (truncate:SI (subreg:DI (truncate:SI X) 0)) is
3844          (truncate:SI x).  */
3845       if (GET_CODE (XEXP (x, 0)) == SUBREG
3846           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == TRUNCATE
3847           && subreg_lowpart_p (XEXP (x, 0)))
3848         return SUBREG_REG (XEXP (x, 0));
3849
3850       /* If we know that the value is already truncated, we can
3851          replace the TRUNCATE with a SUBREG if TRULY_NOOP_TRUNCATION is
3852          nonzero for the corresponding modes.  */
3853       if (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
3854                                  GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
3855           && num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
3856              >= GET_MODE_BITSIZE (mode) + 1)
3857         return gen_lowpart_for_combine (mode, XEXP (x, 0));
3858
3859       /* A truncate of a comparison can be replaced with a subreg if
3860          STORE_FLAG_VALUE permits.  This is like the previous test,
3861          but it works even if the comparison is done in a mode larger
3862          than HOST_BITS_PER_WIDE_INT.  */
3863       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3864           && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3865           && ((HOST_WIDE_INT) STORE_FLAG_VALUE &~ GET_MODE_MASK (mode)) == 0)
3866         return gen_lowpart_for_combine (mode, XEXP (x, 0));
3867
3868       /* Similarly, a truncate of a register whose value is a
3869          comparison can be replaced with a subreg if STORE_FLAG_VALUE
3870          permits.  */
3871       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3872           && ((HOST_WIDE_INT) STORE_FLAG_VALUE &~ GET_MODE_MASK (mode)) == 0
3873           && (temp = get_last_value (XEXP (x, 0)))
3874           && GET_RTX_CLASS (GET_CODE (temp)) == '<')
3875         return gen_lowpart_for_combine (mode, XEXP (x, 0));
3876
3877       break;
3878
3879     case FLOAT_TRUNCATE:
3880       /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF.  */
3881       if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND
3882           && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode)
3883         return XEXP (XEXP (x, 0), 0);
3884
3885       /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is
3886          (OP:SF foo:SF) if OP is NEG or ABS.  */
3887       if ((GET_CODE (XEXP (x, 0)) == ABS
3888            || GET_CODE (XEXP (x, 0)) == NEG)
3889           && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND
3890           && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode)
3891         return gen_unary (GET_CODE (XEXP (x, 0)), mode, mode,
3892                           XEXP (XEXP (XEXP (x, 0), 0), 0));
3893
3894       /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0))
3895          is (float_truncate:SF x).  */
3896       if (GET_CODE (XEXP (x, 0)) == SUBREG
3897           && subreg_lowpart_p (XEXP (x, 0))
3898           && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE)
3899         return SUBREG_REG (XEXP (x, 0));
3900       break;  
3901
3902 #ifdef HAVE_cc0
3903     case COMPARE:
3904       /* Convert (compare FOO (const_int 0)) to FOO unless we aren't
3905          using cc0, in which case we want to leave it as a COMPARE
3906          so we can distinguish it from a register-register-copy.  */
3907       if (XEXP (x, 1) == const0_rtx)
3908         return XEXP (x, 0);
3909
3910       /* In IEEE floating point, x-0 is not the same as x.  */
3911       if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
3912            || ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))
3913            || flag_fast_math)
3914           && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0))))
3915         return XEXP (x, 0);
3916       break;
3917 #endif
3918
3919     case CONST:
3920       /* (const (const X)) can become (const X).  Do it this way rather than
3921          returning the inner CONST since CONST can be shared with a
3922          REG_EQUAL note.  */
3923       if (GET_CODE (XEXP (x, 0)) == CONST)
3924         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
3925       break;
3926
3927 #ifdef HAVE_lo_sum
3928     case LO_SUM:
3929       /* Convert (lo_sum (high FOO) FOO) to FOO.  This is necessary so we
3930          can add in an offset.  find_split_point will split this address up
3931          again if it doesn't match.  */
3932       if (GET_CODE (XEXP (x, 0)) == HIGH
3933           && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)))
3934         return XEXP (x, 1);
3935       break;
3936 #endif
3937
3938     case PLUS:
3939       /* If we have (plus (plus (A const) B)), associate it so that CONST is
3940          outermost.  That's because that's the way indexed addresses are
3941          supposed to appear.  This code used to check many more cases, but
3942          they are now checked elsewhere.  */
3943       if (GET_CODE (XEXP (x, 0)) == PLUS
3944           && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1)))
3945         return gen_binary (PLUS, mode,
3946                            gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0),
3947                                        XEXP (x, 1)),
3948                            XEXP (XEXP (x, 0), 1));
3949
3950       /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>)
3951          when c is (const_int (pow2 + 1) / 2) is a sign extension of a
3952          bit-field and can be replaced by either a sign_extend or a
3953          sign_extract.  The `and' may be a zero_extend and the two
3954          <c>, -<c> constants may be reversed.  */
3955       if (GET_CODE (XEXP (x, 0)) == XOR
3956           && GET_CODE (XEXP (x, 1)) == CONST_INT
3957           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3958           && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1))
3959           && ((i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0
3960               || (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
3961           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
3962           && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND
3963                && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT
3964                && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))
3965                    == ((HOST_WIDE_INT) 1 << (i + 1)) - 1))
3966               || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND
3967                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
3968                       == i + 1))))
3969         return simplify_shift_const
3970           (NULL_RTX, ASHIFTRT, mode,
3971            simplify_shift_const (NULL_RTX, ASHIFT, mode,
3972                                  XEXP (XEXP (XEXP (x, 0), 0), 0),
3973                                  GET_MODE_BITSIZE (mode) - (i + 1)),
3974            GET_MODE_BITSIZE (mode) - (i + 1));
3975
3976       /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if
3977          C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE
3978          is 1.  This produces better code than the alternative immediately
3979          below.  */
3980       if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
3981           && reversible_comparison_p (XEXP (x, 0))
3982           && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx)
3983               || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx)))
3984         return
3985           gen_unary (NEG, mode, mode,
3986                      gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))),
3987                                  mode, XEXP (XEXP (x, 0), 0),
3988                                  XEXP (XEXP (x, 0), 1)));
3989
3990       /* If only the low-order bit of X is possibly nonzero, (plus x -1)
3991          can become (ashiftrt (ashift (xor x 1) C) C) where C is
3992          the bitsize of the mode - 1.  This allows simplification of
3993          "a = (b & 8) == 0;"  */
3994       if (XEXP (x, 1) == constm1_rtx
3995           && GET_CODE (XEXP (x, 0)) != REG
3996           && ! (GET_CODE (XEXP (x,0)) == SUBREG
3997                 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG)
3998           && nonzero_bits (XEXP (x, 0), mode) == 1)
3999         return simplify_shift_const (NULL_RTX, ASHIFTRT, mode,
4000            simplify_shift_const (NULL_RTX, ASHIFT, mode,
4001                                  gen_rtx_combine (XOR, mode,
4002                                                   XEXP (x, 0), const1_rtx),
4003                                  GET_MODE_BITSIZE (mode) - 1),
4004            GET_MODE_BITSIZE (mode) - 1);
4005
4006       /* If we are adding two things that have no bits in common, convert
4007          the addition into an IOR.  This will often be further simplified,
4008          for example in cases like ((a & 1) + (a & 2)), which can
4009          become a & 3.  */
4010
4011       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4012           && (nonzero_bits (XEXP (x, 0), mode)
4013               & nonzero_bits (XEXP (x, 1), mode)) == 0)
4014         return gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
4015       break;
4016
4017     case MINUS:
4018       /* If STORE_FLAG_VALUE is 1, (minus 1 (comparison foo bar)) can be done
4019          by reversing the comparison code if valid.  */
4020       if (STORE_FLAG_VALUE == 1
4021           && XEXP (x, 0) == const1_rtx
4022           && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) == '<'
4023           && reversible_comparison_p (XEXP (x, 1)))
4024         return gen_binary (reverse_condition (GET_CODE (XEXP (x, 1))),
4025                            mode, XEXP (XEXP (x, 1), 0),
4026                                 XEXP (XEXP (x, 1), 1));
4027
4028       /* (minus <foo> (and <foo> (const_int -pow2))) becomes
4029          (and <foo> (const_int pow2-1))  */
4030       if (GET_CODE (XEXP (x, 1)) == AND
4031           && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT
4032           && exact_log2 (- INTVAL (XEXP (XEXP (x, 1), 1))) >= 0
4033           && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0)))
4034         return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0),
4035                                        - INTVAL (XEXP (XEXP (x, 1), 1)) - 1);
4036
4037       /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for
4038          integers.  */
4039       if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode))
4040         return gen_binary (MINUS, mode,
4041                            gen_binary (MINUS, mode, XEXP (x, 0),
4042                                        XEXP (XEXP (x, 1), 0)),
4043                            XEXP (XEXP (x, 1), 1));
4044       break;
4045
4046     case MULT:
4047       /* If we have (mult (plus A B) C), apply the distributive law and then
4048          the inverse distributive law to see if things simplify.  This
4049          occurs mostly in addresses, often when unrolling loops.  */
4050
4051       if (GET_CODE (XEXP (x, 0)) == PLUS)
4052         {
4053           x = apply_distributive_law
4054             (gen_binary (PLUS, mode,
4055                          gen_binary (MULT, mode,
4056                                      XEXP (XEXP (x, 0), 0), XEXP (x, 1)),
4057                          gen_binary (MULT, mode,
4058                                      XEXP (XEXP (x, 0), 1), XEXP (x, 1))));
4059
4060           if (GET_CODE (x) != MULT)
4061             return x;
4062         }
4063       break;
4064
4065     case UDIV:
4066       /* If this is a divide by a power of two, treat it as a shift if
4067          its first operand is a shift.  */
4068       if (GET_CODE (XEXP (x, 1)) == CONST_INT
4069           && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0
4070           && (GET_CODE (XEXP (x, 0)) == ASHIFT
4071               || GET_CODE (XEXP (x, 0)) == LSHIFTRT
4072               || GET_CODE (XEXP (x, 0)) == ASHIFTRT
4073               || GET_CODE (XEXP (x, 0)) == ROTATE
4074               || GET_CODE (XEXP (x, 0)) == ROTATERT))
4075         return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i);
4076       break;
4077
4078     case EQ:  case NE:
4079     case GT:  case GTU:  case GE:  case GEU:
4080     case LT:  case LTU:  case LE:  case LEU:
4081       /* If the first operand is a condition code, we can't do anything
4082          with it.  */
4083       if (GET_CODE (XEXP (x, 0)) == COMPARE
4084           || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC
4085 #ifdef HAVE_cc0
4086               && XEXP (x, 0) != cc0_rtx
4087 #endif
4088                ))
4089         {
4090           rtx op0 = XEXP (x, 0);
4091           rtx op1 = XEXP (x, 1);
4092           enum rtx_code new_code;
4093
4094           if (GET_CODE (op0) == COMPARE)
4095             op1 = XEXP (op0, 1), op0 = XEXP (op0, 0);
4096
4097           /* Simplify our comparison, if possible.  */
4098           new_code = simplify_comparison (code, &op0, &op1);
4099
4100           /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X
4101              if only the low-order bit is possibly nonzero in X (such as when
4102              X is a ZERO_EXTRACT of one bit).  Similarly, we can convert EQ to
4103              (xor X 1) or (minus 1 X); we use the former.  Finally, if X is
4104              known to be either 0 or -1, NE becomes a NEG and EQ becomes
4105              (plus X 1).
4106
4107              Remove any ZERO_EXTRACT we made when thinking this was a
4108              comparison.  It may now be simpler to use, e.g., an AND.  If a
4109              ZERO_EXTRACT is indeed appropriate, it will be placed back by
4110              the call to make_compound_operation in the SET case.  */
4111
4112           if (STORE_FLAG_VALUE == 1
4113               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4114               && op1 == const0_rtx && nonzero_bits (op0, mode) == 1)
4115             return gen_lowpart_for_combine (mode,
4116                                             expand_compound_operation (op0));
4117
4118           else if (STORE_FLAG_VALUE == 1
4119                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4120                    && op1 == const0_rtx
4121                    && (num_sign_bit_copies (op0, mode)
4122                        == GET_MODE_BITSIZE (mode)))
4123             {
4124               op0 = expand_compound_operation (op0);
4125               return gen_unary (NEG, mode, mode,
4126                                 gen_lowpart_for_combine (mode, op0));
4127             }
4128
4129           else if (STORE_FLAG_VALUE == 1
4130                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4131                    && op1 == const0_rtx
4132                    && nonzero_bits (op0, mode) == 1)
4133             {
4134               op0 = expand_compound_operation (op0);
4135               return gen_binary (XOR, mode,
4136                                  gen_lowpart_for_combine (mode, op0),
4137                                  const1_rtx);
4138             }
4139
4140           else if (STORE_FLAG_VALUE == 1
4141                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4142                    && op1 == const0_rtx
4143                    && (num_sign_bit_copies (op0, mode)
4144                        == GET_MODE_BITSIZE (mode)))
4145             {
4146               op0 = expand_compound_operation (op0);
4147               return plus_constant (gen_lowpart_for_combine (mode, op0), 1);
4148             }
4149
4150           /* If STORE_FLAG_VALUE is -1, we have cases similar to
4151              those above.  */
4152           if (STORE_FLAG_VALUE == -1
4153               && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4154               && op1 == const0_rtx
4155               && (num_sign_bit_copies (op0, mode)
4156                   == GET_MODE_BITSIZE (mode)))
4157             return gen_lowpart_for_combine (mode,
4158                                             expand_compound_operation (op0));
4159
4160           else if (STORE_FLAG_VALUE == -1
4161                    && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4162                    && op1 == const0_rtx
4163                    && nonzero_bits (op0, mode) == 1)
4164             {
4165               op0 = expand_compound_operation (op0);
4166               return gen_unary (NEG, mode, mode,
4167                                 gen_lowpart_for_combine (mode, op0));
4168             }
4169
4170           else if (STORE_FLAG_VALUE == -1
4171                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4172                    && op1 == const0_rtx
4173                    && (num_sign_bit_copies (op0, mode)
4174                        == GET_MODE_BITSIZE (mode)))
4175             {
4176               op0 = expand_compound_operation (op0);
4177               return gen_unary (NOT, mode, mode,
4178                                 gen_lowpart_for_combine (mode, op0));
4179             }
4180
4181           /* If X is 0/1, (eq X 0) is X-1.  */
4182           else if (STORE_FLAG_VALUE == -1
4183                    && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT
4184                    && op1 == const0_rtx
4185                    && nonzero_bits (op0, mode) == 1)
4186             {
4187               op0 = expand_compound_operation (op0);
4188               return plus_constant (gen_lowpart_for_combine (mode, op0), -1);
4189             }
4190
4191           /* If STORE_FLAG_VALUE says to just test the sign bit and X has just
4192              one bit that might be nonzero, we can convert (ne x 0) to
4193              (ashift x c) where C puts the bit in the sign bit.  Remove any
4194              AND with STORE_FLAG_VALUE when we are done, since we are only
4195              going to test the sign bit.  */
4196           if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
4197               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4198               && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
4199                   == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE(mode)-1))
4200               && op1 == const0_rtx
4201               && mode == GET_MODE (op0)
4202               && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0)
4203             {
4204               x = simplify_shift_const (NULL_RTX, ASHIFT, mode,
4205                                         expand_compound_operation (op0),
4206                                         GET_MODE_BITSIZE (mode) - 1 - i);
4207               if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx)
4208                 return XEXP (x, 0);
4209               else
4210                 return x;
4211             }
4212
4213           /* If the code changed, return a whole new comparison.  */
4214           if (new_code != code)
4215             return gen_rtx_combine (new_code, mode, op0, op1);
4216
4217           /* Otherwise, keep this operation, but maybe change its operands.  
4218              This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR).  */
4219           SUBST (XEXP (x, 0), op0);
4220           SUBST (XEXP (x, 1), op1);
4221         }
4222       break;
4223           
4224     case IF_THEN_ELSE:
4225       return simplify_if_then_else (x);
4226
4227     case ZERO_EXTRACT:
4228     case SIGN_EXTRACT:
4229     case ZERO_EXTEND:
4230     case SIGN_EXTEND:
4231       /* If we are processing SET_DEST, we are done.  */
4232       if (in_dest)
4233         return x;
4234
4235       return expand_compound_operation (x);
4236
4237     case SET:
4238       return simplify_set (x);
4239
4240     case AND:
4241     case IOR:
4242     case XOR:
4243       return simplify_logical (x, last);
4244
4245     case ABS:      
4246       /* (abs (neg <foo>)) -> (abs <foo>) */
4247       if (GET_CODE (XEXP (x, 0)) == NEG)
4248         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4249
4250       /* If the mode of the operand is VOIDmode (i.e. if it is ASM_OPERANDS),
4251          do nothing.  */
4252       if (GET_MODE (XEXP (x, 0)) == VOIDmode)
4253         break;
4254
4255       /* If operand is something known to be positive, ignore the ABS.  */
4256       if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS
4257           || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
4258                <= HOST_BITS_PER_WIDE_INT)
4259               && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
4260                    & ((HOST_WIDE_INT) 1
4261                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))
4262                   == 0)))
4263         return XEXP (x, 0);
4264
4265
4266       /* If operand is known to be only -1 or 0, convert ABS to NEG.  */
4267       if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode))
4268         return gen_rtx_combine (NEG, mode, XEXP (x, 0));
4269
4270       break;
4271
4272     case FFS:
4273       /* (ffs (*_extend <X>)) = (ffs <X>) */
4274       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND
4275           || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND)
4276         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4277       break;
4278
4279     case FLOAT:
4280       /* (float (sign_extend <X>)) = (float <X>).  */
4281       if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
4282         SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0));
4283       break;
4284
4285     case ASHIFT:
4286     case LSHIFTRT:
4287     case ASHIFTRT:
4288     case ROTATE:
4289     case ROTATERT:
4290       /* If this is a shift by a constant amount, simplify it.  */
4291       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
4292         return simplify_shift_const (x, code, mode, XEXP (x, 0), 
4293                                      INTVAL (XEXP (x, 1)));
4294
4295 #ifdef SHIFT_COUNT_TRUNCATED
4296       else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG)
4297         SUBST (XEXP (x, 1),
4298                force_to_mode (XEXP (x, 1), GET_MODE (x),
4299                               ((HOST_WIDE_INT) 1 
4300                                << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x))))
4301                               - 1,
4302                               NULL_RTX, 0));
4303 #endif
4304
4305       break;
4306
4307     default:
4308       break;
4309     }
4310
4311   return x;
4312 }
4313 \f
4314 /* Simplify X, an IF_THEN_ELSE expression.  Return the new expression.  */
4315
4316 static rtx
4317 simplify_if_then_else (x)
4318      rtx x;
4319 {
4320   enum machine_mode mode = GET_MODE (x);
4321   rtx cond = XEXP (x, 0);
4322   rtx true = XEXP (x, 1);
4323   rtx false = XEXP (x, 2);
4324   enum rtx_code true_code = GET_CODE (cond);
4325   int comparison_p = GET_RTX_CLASS (true_code) == '<';
4326   rtx temp;
4327   int i;
4328
4329   /* Simplify storing of the truth value.  */
4330   if (comparison_p && true == const_true_rtx && false == const0_rtx)
4331     return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1));
4332       
4333   /* Also when the truth value has to be reversed.  */
4334   if (comparison_p && reversible_comparison_p (cond)
4335       && true == const0_rtx && false == const_true_rtx)
4336     return gen_binary (reverse_condition (true_code),
4337                        mode, XEXP (cond, 0), XEXP (cond, 1));
4338
4339   /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used
4340      in it is being compared against certain values.  Get the true and false
4341      comparisons and see if that says anything about the value of each arm.  */
4342
4343   if (comparison_p && reversible_comparison_p (cond)
4344       && GET_CODE (XEXP (cond, 0)) == REG)
4345     {
4346       HOST_WIDE_INT nzb;
4347       rtx from = XEXP (cond, 0);
4348       enum rtx_code false_code = reverse_condition (true_code);
4349       rtx true_val = XEXP (cond, 1);
4350       rtx false_val = true_val;
4351       int swapped = 0;
4352
4353       /* If FALSE_CODE is EQ, swap the codes and arms.  */
4354
4355       if (false_code == EQ)
4356         {
4357           swapped = 1, true_code = EQ, false_code = NE;
4358           temp = true, true = false, false = temp;
4359         }
4360
4361       /* If we are comparing against zero and the expression being tested has
4362          only a single bit that might be nonzero, that is its value when it is
4363          not equal to zero.  Similarly if it is known to be -1 or 0.  */
4364
4365       if (true_code == EQ && true_val == const0_rtx
4366           && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0)
4367         false_code = EQ, false_val = GEN_INT (nzb);
4368       else if (true_code == EQ && true_val == const0_rtx
4369                && (num_sign_bit_copies (from, GET_MODE (from))
4370                    == GET_MODE_BITSIZE (GET_MODE (from))))
4371         false_code = EQ, false_val = constm1_rtx;
4372
4373       /* Now simplify an arm if we know the value of the register in the
4374          branch and it is used in the arm.  Be careful due to the potential
4375          of locally-shared RTL.  */
4376
4377       if (reg_mentioned_p (from, true))
4378         true = subst (known_cond (copy_rtx (true), true_code, from, true_val),
4379                       pc_rtx, pc_rtx, 0, 0);
4380       if (reg_mentioned_p (from, false))
4381         false = subst (known_cond (copy_rtx (false), false_code,
4382                                    from, false_val),
4383                        pc_rtx, pc_rtx, 0, 0);
4384
4385       SUBST (XEXP (x, 1), swapped ? false : true);
4386       SUBST (XEXP (x, 2), swapped ? true : false);
4387
4388       true = XEXP (x, 1), false = XEXP (x, 2), true_code = GET_CODE (cond);
4389     }
4390
4391   /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be
4392      reversed, do so to avoid needing two sets of patterns for
4393      subtract-and-branch insns.  Similarly if we have a constant in the true
4394      arm, the false arm is the same as the first operand of the comparison, or
4395      the false arm is more complicated than the true arm.  */
4396
4397   if (comparison_p && reversible_comparison_p (cond)
4398       && (true == pc_rtx 
4399           || (CONSTANT_P (true)
4400               && GET_CODE (false) != CONST_INT && false != pc_rtx)
4401           || true == const0_rtx
4402           || (GET_RTX_CLASS (GET_CODE (true)) == 'o'
4403               && GET_RTX_CLASS (GET_CODE (false)) != 'o')
4404           || (GET_CODE (true) == SUBREG
4405               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (true))) == 'o'
4406               && GET_RTX_CLASS (GET_CODE (false)) != 'o')
4407           || reg_mentioned_p (true, false)
4408           || rtx_equal_p (false, XEXP (cond, 0))))
4409     {
4410       true_code = reverse_condition (true_code);
4411       SUBST (XEXP (x, 0),
4412              gen_binary (true_code, GET_MODE (cond), XEXP (cond, 0),
4413                          XEXP (cond, 1)));
4414
4415       SUBST (XEXP (x, 1), false);
4416       SUBST (XEXP (x, 2), true);
4417
4418       temp = true, true = false, false = temp, cond = XEXP (x, 0);
4419
4420       /* It is possible that the conditional has been simplified out.  */
4421       true_code = GET_CODE (cond);
4422       comparison_p = GET_RTX_CLASS (true_code) == '<';
4423     }
4424
4425   /* If the two arms are identical, we don't need the comparison.  */
4426
4427   if (rtx_equal_p (true, false) && ! side_effects_p (cond))
4428     return true;
4429
4430   /* Convert a == b ? b : a to "a".  */
4431   if (true_code == EQ && ! side_effects_p (cond)
4432       && rtx_equal_p (XEXP (cond, 0), false)
4433       && rtx_equal_p (XEXP (cond, 1), true))
4434     return false;
4435   else if (true_code == NE && ! side_effects_p (cond)
4436            && rtx_equal_p (XEXP (cond, 0), true)
4437            && rtx_equal_p (XEXP (cond, 1), false))
4438     return true;
4439
4440   /* Look for cases where we have (abs x) or (neg (abs X)).  */
4441
4442   if (GET_MODE_CLASS (mode) == MODE_INT
4443       && GET_CODE (false) == NEG
4444       && rtx_equal_p (true, XEXP (false, 0))
4445       && comparison_p
4446       && rtx_equal_p (true, XEXP (cond, 0))
4447       && ! side_effects_p (true))
4448     switch (true_code)
4449       {
4450       case GT:
4451       case GE:
4452         return gen_unary (ABS, mode, mode, true);
4453       case LT:
4454       case LE:
4455         return gen_unary (NEG, mode, mode, gen_unary (ABS, mode, mode, true));
4456     default:
4457       break;
4458       }
4459
4460   /* Look for MIN or MAX.  */
4461
4462   if ((! FLOAT_MODE_P (mode) || flag_fast_math)
4463       && comparison_p
4464       && rtx_equal_p (XEXP (cond, 0), true)
4465       && rtx_equal_p (XEXP (cond, 1), false)
4466       && ! side_effects_p (cond))
4467     switch (true_code)
4468       {
4469       case GE:
4470       case GT:
4471         return gen_binary (SMAX, mode, true, false);
4472       case LE:
4473       case LT:
4474         return gen_binary (SMIN, mode, true, false);
4475       case GEU:
4476       case GTU:
4477         return gen_binary (UMAX, mode, true, false);
4478       case LEU:
4479       case LTU:
4480         return gen_binary (UMIN, mode, true, false);
4481       default:
4482         break;
4483       }
4484   
4485   /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its
4486      second operand is zero, this can be done as (OP Z (mult COND C2)) where
4487      C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or
4488      SIGN_EXTEND as long as Z is already extended (so we don't destroy it).
4489      We can do this kind of thing in some cases when STORE_FLAG_VALUE is
4490      neither 1 or -1, but it isn't worth checking for.  */
4491
4492   if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
4493       && comparison_p && mode != VOIDmode && ! side_effects_p (x))
4494     {
4495       rtx t = make_compound_operation (true, SET);
4496       rtx f = make_compound_operation (false, SET);
4497       rtx cond_op0 = XEXP (cond, 0);
4498       rtx cond_op1 = XEXP (cond, 1);
4499       enum rtx_code op = NIL, extend_op = NIL;
4500       enum machine_mode m = mode;
4501       rtx z = 0, c1 = NULL_RTX;
4502
4503       if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS
4504            || GET_CODE (t) == IOR || GET_CODE (t) == XOR
4505            || GET_CODE (t) == ASHIFT
4506            || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT)
4507           && rtx_equal_p (XEXP (t, 0), f))
4508         c1 = XEXP (t, 1), op = GET_CODE (t), z = f;
4509
4510       /* If an identity-zero op is commutative, check whether there
4511          would be a match if we swapped the operands.  */
4512       else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR
4513                 || GET_CODE (t) == XOR)
4514                && rtx_equal_p (XEXP (t, 1), f))
4515         c1 = XEXP (t, 0), op = GET_CODE (t), z = f;
4516       else if (GET_CODE (t) == SIGN_EXTEND
4517                && (GET_CODE (XEXP (t, 0)) == PLUS
4518                    || GET_CODE (XEXP (t, 0)) == MINUS
4519                    || GET_CODE (XEXP (t, 0)) == IOR
4520                    || GET_CODE (XEXP (t, 0)) == XOR
4521                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4522                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4523                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4524                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4525                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4526                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4527                && (num_sign_bit_copies (f, GET_MODE (f))
4528                    > (GET_MODE_BITSIZE (mode)
4529                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0))))))
4530         {
4531           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4532           extend_op = SIGN_EXTEND;
4533           m = GET_MODE (XEXP (t, 0));
4534         }
4535       else if (GET_CODE (t) == SIGN_EXTEND
4536                && (GET_CODE (XEXP (t, 0)) == PLUS
4537                    || GET_CODE (XEXP (t, 0)) == IOR
4538                    || GET_CODE (XEXP (t, 0)) == XOR)
4539                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4540                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4541                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4542                && (num_sign_bit_copies (f, GET_MODE (f))
4543                    > (GET_MODE_BITSIZE (mode)
4544                       - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1))))))
4545         {
4546           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4547           extend_op = SIGN_EXTEND;
4548           m = GET_MODE (XEXP (t, 0));
4549         }
4550       else if (GET_CODE (t) == ZERO_EXTEND
4551                && (GET_CODE (XEXP (t, 0)) == PLUS
4552                    || GET_CODE (XEXP (t, 0)) == MINUS
4553                    || GET_CODE (XEXP (t, 0)) == IOR
4554                    || GET_CODE (XEXP (t, 0)) == XOR
4555                    || GET_CODE (XEXP (t, 0)) == ASHIFT
4556                    || GET_CODE (XEXP (t, 0)) == LSHIFTRT
4557                    || GET_CODE (XEXP (t, 0)) == ASHIFTRT)
4558                && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG
4559                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4560                && subreg_lowpart_p (XEXP (XEXP (t, 0), 0))
4561                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f)
4562                && ((nonzero_bits (f, GET_MODE (f))
4563                     & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0))))
4564                    == 0))
4565         {
4566           c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0));
4567           extend_op = ZERO_EXTEND;
4568           m = GET_MODE (XEXP (t, 0));
4569         }
4570       else if (GET_CODE (t) == ZERO_EXTEND
4571                && (GET_CODE (XEXP (t, 0)) == PLUS
4572                    || GET_CODE (XEXP (t, 0)) == IOR
4573                    || GET_CODE (XEXP (t, 0)) == XOR)
4574                && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG
4575                && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
4576                && subreg_lowpart_p (XEXP (XEXP (t, 0), 1))
4577                && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f)
4578                && ((nonzero_bits (f, GET_MODE (f))
4579                     & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1))))
4580                    == 0))
4581         {
4582           c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0));
4583           extend_op = ZERO_EXTEND;
4584           m = GET_MODE (XEXP (t, 0));
4585         }
4586       
4587       if (z)
4588         {
4589           temp = subst (gen_binary (true_code, m, cond_op0, cond_op1),
4590                         pc_rtx, pc_rtx, 0, 0);
4591           temp = gen_binary (MULT, m, temp,
4592                              gen_binary (MULT, m, c1, const_true_rtx));
4593           temp = subst (temp, pc_rtx, pc_rtx, 0, 0);
4594           temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp);
4595
4596           if (extend_op != NIL)
4597             temp = gen_unary (extend_op, mode, m, temp);
4598
4599           return temp;
4600         }
4601     }
4602
4603   /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or
4604      1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the
4605      negation of a single bit, we can convert this operation to a shift.  We
4606      can actually do this more generally, but it doesn't seem worth it.  */
4607
4608   if (true_code == NE && XEXP (cond, 1) == const0_rtx
4609       && false == const0_rtx && GET_CODE (true) == CONST_INT
4610       && ((1 == nonzero_bits (XEXP (cond, 0), mode)
4611            && (i = exact_log2 (INTVAL (true))) >= 0)
4612           || ((num_sign_bit_copies (XEXP (cond, 0), mode)
4613                == GET_MODE_BITSIZE (mode))
4614               && (i = exact_log2 (- INTVAL (true))) >= 0)))
4615     return
4616       simplify_shift_const (NULL_RTX, ASHIFT, mode,
4617                             gen_lowpart_for_combine (mode, XEXP (cond, 0)), i);
4618
4619   return x;
4620 }
4621 \f
4622 /* Simplify X, a SET expression.  Return the new expression.  */
4623
4624 static rtx
4625 simplify_set (x)
4626      rtx x;
4627 {
4628   rtx src = SET_SRC (x);
4629   rtx dest = SET_DEST (x);
4630   enum machine_mode mode
4631     = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest);
4632   rtx other_insn;
4633   rtx *cc_use;
4634
4635   /* (set (pc) (return)) gets written as (return).  */
4636   if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN)
4637     return src;
4638
4639   /* Now that we know for sure which bits of SRC we are using, see if we can
4640      simplify the expression for the object knowing that we only need the
4641      low-order bits.  */
4642
4643   if (GET_MODE_CLASS (mode) == MODE_INT)
4644     {
4645       src = force_to_mode (src, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
4646       SUBST (SET_SRC (x), src);
4647     }
4648
4649   /* If we are setting CC0 or if the source is a COMPARE, look for the use of
4650      the comparison result and try to simplify it unless we already have used
4651      undobuf.other_insn.  */
4652   if ((GET_CODE (src) == COMPARE
4653 #ifdef HAVE_cc0
4654        || dest == cc0_rtx
4655 #endif
4656        )
4657       && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0
4658       && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn)
4659       && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<'
4660       && rtx_equal_p (XEXP (*cc_use, 0), dest))
4661     {
4662       enum rtx_code old_code = GET_CODE (*cc_use);
4663       enum rtx_code new_code;
4664       rtx op0, op1;
4665       int other_changed = 0;
4666       enum machine_mode compare_mode = GET_MODE (dest);
4667
4668       if (GET_CODE (src) == COMPARE)
4669         op0 = XEXP (src, 0), op1 = XEXP (src, 1);
4670       else
4671         op0 = src, op1 = const0_rtx;
4672
4673       /* Simplify our comparison, if possible.  */
4674       new_code = simplify_comparison (old_code, &op0, &op1);
4675
4676 #ifdef EXTRA_CC_MODES
4677       /* If this machine has CC modes other than CCmode, check to see if we
4678          need to use a different CC mode here.  */
4679       compare_mode = SELECT_CC_MODE (new_code, op0, op1);
4680 #endif /* EXTRA_CC_MODES */
4681
4682 #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES)
4683       /* If the mode changed, we have to change SET_DEST, the mode in the
4684          compare, and the mode in the place SET_DEST is used.  If SET_DEST is
4685          a hard register, just build new versions with the proper mode.  If it
4686          is a pseudo, we lose unless it is only time we set the pseudo, in
4687          which case we can safely change its mode.  */
4688       if (compare_mode != GET_MODE (dest))
4689         {
4690           int regno = REGNO (dest);
4691           rtx new_dest = gen_rtx_REG (compare_mode, regno);
4692
4693           if (regno < FIRST_PSEUDO_REGISTER
4694               || (REG_N_SETS (regno) == 1 && ! REG_USERVAR_P (dest)))
4695             {
4696               if (regno >= FIRST_PSEUDO_REGISTER)
4697                 SUBST (regno_reg_rtx[regno], new_dest);
4698
4699               SUBST (SET_DEST (x), new_dest);
4700               SUBST (XEXP (*cc_use, 0), new_dest);
4701               other_changed = 1;
4702
4703               dest = new_dest;
4704             }
4705         }
4706 #endif
4707
4708       /* If the code changed, we have to build a new comparison in
4709          undobuf.other_insn.  */
4710       if (new_code != old_code)
4711         {
4712           unsigned HOST_WIDE_INT mask;
4713
4714           SUBST (*cc_use, gen_rtx_combine (new_code, GET_MODE (*cc_use),
4715                                            dest, const0_rtx));
4716
4717           /* If the only change we made was to change an EQ into an NE or
4718              vice versa, OP0 has only one bit that might be nonzero, and OP1
4719              is zero, check if changing the user of the condition code will
4720              produce a valid insn.  If it won't, we can keep the original code
4721              in that insn by surrounding our operation with an XOR.  */
4722
4723           if (((old_code == NE && new_code == EQ)
4724                || (old_code == EQ && new_code == NE))
4725               && ! other_changed && op1 == const0_rtx
4726               && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
4727               && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0)
4728             {
4729               rtx pat = PATTERN (other_insn), note = 0;
4730
4731               if ((recog_for_combine (&pat, other_insn, &note) < 0
4732                    && ! check_asm_operands (pat)))
4733                 {
4734                   PUT_CODE (*cc_use, old_code);
4735                   other_insn = 0;
4736
4737                   op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask));
4738                 }
4739             }
4740
4741           other_changed = 1;
4742         }
4743
4744       if (other_changed)
4745         undobuf.other_insn = other_insn;
4746
4747 #ifdef HAVE_cc0
4748       /* If we are now comparing against zero, change our source if
4749          needed.  If we do not use cc0, we always have a COMPARE.  */
4750       if (op1 == const0_rtx && dest == cc0_rtx)
4751         {
4752           SUBST (SET_SRC (x), op0);
4753           src = op0;
4754         }
4755       else
4756 #endif
4757
4758       /* Otherwise, if we didn't previously have a COMPARE in the
4759          correct mode, we need one.  */
4760       if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode)
4761         {
4762           SUBST (SET_SRC (x),
4763                  gen_rtx_combine (COMPARE, compare_mode, op0, op1));
4764           src = SET_SRC (x);
4765         }
4766       else
4767         {
4768           /* Otherwise, update the COMPARE if needed.  */
4769           SUBST (XEXP (src, 0), op0);
4770           SUBST (XEXP (src, 1), op1);
4771         }
4772     }
4773   else
4774     {
4775       /* Get SET_SRC in a form where we have placed back any
4776          compound expressions.  Then do the checks below.  */
4777       src = make_compound_operation (src, SET);
4778       SUBST (SET_SRC (x), src);
4779     }
4780
4781   /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation,
4782      and X being a REG or (subreg (reg)), we may be able to convert this to
4783      (set (subreg:m2 x) (op)). 
4784
4785      We can always do this if M1 is narrower than M2 because that means that
4786      we only care about the low bits of the result.
4787
4788      However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot
4789      perform a narrower operation than requested since the high-order bits will
4790      be undefined.  On machine where it is defined, this transformation is safe
4791      as long as M1 and M2 have the same number of words.  */
4792  
4793   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
4794       && GET_RTX_CLASS (GET_CODE (SUBREG_REG (src))) != 'o'
4795       && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1))
4796            / UNITS_PER_WORD)
4797           == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))
4798                + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))
4799 #ifndef WORD_REGISTER_OPERATIONS
4800       && (GET_MODE_SIZE (GET_MODE (src))
4801           < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
4802 #endif
4803 #ifdef CLASS_CANNOT_CHANGE_SIZE
4804       && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER
4805             && (TEST_HARD_REG_BIT
4806                 (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
4807                  REGNO (dest)))
4808             && (GET_MODE_SIZE (GET_MODE (src))
4809                 != GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))))
4810 #endif                            
4811       && (GET_CODE (dest) == REG
4812           || (GET_CODE (dest) == SUBREG
4813               && GET_CODE (SUBREG_REG (dest)) == REG)))
4814     {
4815       SUBST (SET_DEST (x),
4816              gen_lowpart_for_combine (GET_MODE (SUBREG_REG (src)),
4817                                       dest));
4818       SUBST (SET_SRC (x), SUBREG_REG (src));
4819
4820       src = SET_SRC (x), dest = SET_DEST (x);
4821     }
4822
4823 #ifdef LOAD_EXTEND_OP
4824   /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this
4825      would require a paradoxical subreg.  Replace the subreg with a
4826      zero_extend to avoid the reload that would otherwise be required.  */
4827
4828   if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src)
4829       && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != NIL
4830       && SUBREG_WORD (src) == 0
4831       && (GET_MODE_SIZE (GET_MODE (src))
4832           > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))
4833       && GET_CODE (SUBREG_REG (src)) == MEM)
4834     {
4835       SUBST (SET_SRC (x),
4836              gen_rtx_combine (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))),
4837                               GET_MODE (src), XEXP (src, 0)));
4838
4839       src = SET_SRC (x);
4840     }
4841 #endif
4842
4843   /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we
4844      are comparing an item known to be 0 or -1 against 0, use a logical
4845      operation instead. Check for one of the arms being an IOR of the other
4846      arm with some value.  We compute three terms to be IOR'ed together.  In
4847      practice, at most two will be nonzero.  Then we do the IOR's.  */
4848
4849   if (GET_CODE (dest) != PC
4850       && GET_CODE (src) == IF_THEN_ELSE
4851       && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT
4852       && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE)
4853       && XEXP (XEXP (src, 0), 1) == const0_rtx
4854       && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0))
4855 #ifdef HAVE_conditional_move
4856       && ! can_conditionally_move_p (GET_MODE (src))
4857 #endif
4858       && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0),
4859                                GET_MODE (XEXP (XEXP (src, 0), 0)))
4860           == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0))))
4861       && ! side_effects_p (src))
4862     {
4863       rtx true = (GET_CODE (XEXP (src, 0)) == NE
4864                       ? XEXP (src, 1) : XEXP (src, 2));
4865       rtx false = (GET_CODE (XEXP (src, 0)) == NE
4866                    ? XEXP (src, 2) : XEXP (src, 1));
4867       rtx term1 = const0_rtx, term2, term3;
4868
4869       if (GET_CODE (true) == IOR && rtx_equal_p (XEXP (true, 0), false))
4870         term1 = false, true = XEXP (true, 1), false = const0_rtx;
4871       else if (GET_CODE (true) == IOR
4872                && rtx_equal_p (XEXP (true, 1), false))
4873         term1 = false, true = XEXP (true, 0), false = const0_rtx;
4874       else if (GET_CODE (false) == IOR
4875                && rtx_equal_p (XEXP (false, 0), true))
4876         term1 = true, false = XEXP (false, 1), true = const0_rtx;
4877       else if (GET_CODE (false) == IOR
4878                && rtx_equal_p (XEXP (false, 1), true))
4879         term1 = true, false = XEXP (false, 0), true = const0_rtx;
4880
4881       term2 = gen_binary (AND, GET_MODE (src), XEXP (XEXP (src, 0), 0), true);
4882       term3 = gen_binary (AND, GET_MODE (src),
4883                           gen_unary (NOT, GET_MODE (src), GET_MODE (src),
4884                                      XEXP (XEXP (src, 0), 0)),
4885                           false);
4886
4887       SUBST (SET_SRC (x),
4888              gen_binary (IOR, GET_MODE (src),
4889                          gen_binary (IOR, GET_MODE (src), term1, term2),
4890                          term3));
4891
4892       src = SET_SRC (x);
4893     }
4894
4895 #ifdef HAVE_conditional_arithmetic
4896   /* If we have conditional arithmetic and the operand of a SET is
4897      a conditional expression, replace this with an IF_THEN_ELSE.
4898      We can either have a conditional expression or a MULT of that expression
4899      with a constant.  */
4900   if ((GET_RTX_CLASS (GET_CODE (src)) == '1'
4901        || GET_RTX_CLASS (GET_CODE (src)) == '2'
4902        || GET_RTX_CLASS (GET_CODE (src)) == 'c')
4903       && (GET_RTX_CLASS (GET_CODE (XEXP (src, 0))) == '<'
4904           || (GET_CODE (XEXP (src, 0)) == MULT
4905               && GET_RTX_CLASS (GET_CODE (XEXP (XEXP (src, 0), 0))) == '<'
4906               && GET_CODE (XEXP (XEXP (src, 0), 1)) == CONST_INT)))
4907     {
4908       rtx cond = XEXP (src, 0);
4909       rtx true_val = const1_rtx;
4910       rtx false_arm, true_arm;
4911
4912       if (GET_CODE (cond) == MULT)
4913         {
4914           true_val = XEXP (cond, 1);
4915           cond = XEXP (cond, 0);
4916         }
4917
4918       if (GET_RTX_CLASS (GET_CODE (src)) == '1')
4919         {
4920           true_arm = gen_unary (GET_CODE (src), GET_MODE (src),
4921                                 GET_MODE (XEXP (src, 0)), true_val);
4922           false_arm = gen_unary (GET_CODE (src), GET_MODE (src),
4923                                  GET_MODE (XEXP (src, 0)), const0_rtx);
4924         }
4925       else
4926         {
4927           true_arm = gen_binary (GET_CODE (src), GET_MODE (src),
4928                                  true_val, XEXP (src, 1));
4929           false_arm = gen_binary (GET_CODE (src), GET_MODE (src),
4930                                   const0_rtx, XEXP (src, 1));
4931         }
4932
4933       /* Canonicalize if true_arm is the simpler one.  */
4934       if (GET_RTX_CLASS (GET_CODE (true_arm)) == 'o'
4935           && GET_RTX_CLASS (GET_CODE (false_arm)) != 'o'
4936           && reversible_comparison_p (cond))
4937         {
4938           rtx temp = true_arm;
4939
4940           true_arm = false_arm;
4941           false_arm = temp;
4942
4943           cond = gen_rtx_combine (reverse_condition (GET_CODE (cond)),
4944                                   GET_MODE (cond), XEXP (cond, 0),
4945                                   XEXP (cond, 1));
4946         }
4947
4948       src = gen_rtx_combine (IF_THEN_ELSE, GET_MODE (src),
4949                              gen_rtx_combine (GET_CODE (cond), VOIDmode,
4950                                               XEXP (cond, 0),
4951                                               XEXP (cond, 1)),
4952                              true_arm, false_arm);
4953       SUBST (SET_SRC (x), src);
4954     }
4955 #endif
4956
4957   /* If either SRC or DEST is a CLOBBER of (const_int 0), make this
4958      whole thing fail.  */
4959   if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx)
4960     return src;
4961   else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx)
4962     return dest;
4963   else
4964     /* Convert this into a field assignment operation, if possible.  */
4965     return make_field_assignment (x);
4966 }
4967 \f
4968 /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified
4969    result.  LAST is nonzero if this is the last retry.  */
4970
4971 static rtx
4972 simplify_logical (x, last)
4973      rtx x;
4974      int last;
4975 {
4976   enum machine_mode mode = GET_MODE (x);
4977   rtx op0 = XEXP (x, 0);
4978   rtx op1 = XEXP (x, 1);
4979
4980   switch (GET_CODE (x))
4981     {
4982     case AND:
4983       /* Convert (A ^ B) & A to A & (~ B) since the latter is often a single
4984          insn (and may simplify more).  */
4985       if (GET_CODE (op0) == XOR
4986           && rtx_equal_p (XEXP (op0, 0), op1)
4987           && ! side_effects_p (op1))
4988         x = gen_binary (AND, mode,
4989                         gen_unary (NOT, mode, mode, XEXP (op0, 1)), op1);
4990
4991       if (GET_CODE (op0) == XOR
4992           && rtx_equal_p (XEXP (op0, 1), op1)
4993           && ! side_effects_p (op1))
4994         x = gen_binary (AND, mode,
4995                         gen_unary (NOT, mode, mode, XEXP (op0, 0)), op1);
4996
4997       /* Similarly for (~ (A ^ B)) & A.  */
4998       if (GET_CODE (op0) == NOT
4999           && GET_CODE (XEXP (op0, 0)) == XOR
5000           && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1)
5001           && ! side_effects_p (op1))
5002         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1);
5003
5004       if (GET_CODE (op0) == NOT
5005           && GET_CODE (XEXP (op0, 0)) == XOR
5006           && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1)
5007           && ! side_effects_p (op1))
5008         x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1);
5009
5010       /* We can call simplify_and_const_int only if we don't lose
5011          any (sign) bits when converting INTVAL (op1) to
5012          "unsigned HOST_WIDE_INT".  */
5013       if (GET_CODE (op1) == CONST_INT
5014           && (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5015               || INTVAL (op1) > 0))
5016         {
5017           x = simplify_and_const_int (x, mode, op0, INTVAL (op1));
5018
5019           /* If we have (ior (and (X C1) C2)) and the next restart would be
5020              the last, simplify this by making C1 as small as possible
5021              and then exit.  */
5022           if (last
5023               && GET_CODE (x) == IOR && GET_CODE (op0) == AND
5024               && GET_CODE (XEXP (op0, 1)) == CONST_INT
5025               && GET_CODE (op1) == CONST_INT)
5026             return gen_binary (IOR, mode,
5027                                gen_binary (AND, mode, XEXP (op0, 0),
5028                                            GEN_INT (INTVAL (XEXP (op0, 1))
5029                                                     & ~ INTVAL (op1))), op1);
5030
5031           if (GET_CODE (x) != AND)
5032             return x;
5033
5034           if (GET_RTX_CLASS (GET_CODE (x)) == 'c' 
5035               || GET_RTX_CLASS (GET_CODE (x)) == '2')
5036             op0 = XEXP (x, 0), op1 = XEXP (x, 1);
5037         }
5038
5039       /* Convert (A | B) & A to A.  */
5040       if (GET_CODE (op0) == IOR
5041           && (rtx_equal_p (XEXP (op0, 0), op1)
5042               || rtx_equal_p (XEXP (op0, 1), op1))
5043           && ! side_effects_p (XEXP (op0, 0))
5044           && ! side_effects_p (XEXP (op0, 1)))
5045         return op1;
5046
5047       /* In the following group of tests (and those in case IOR below),
5048          we start with some combination of logical operations and apply
5049          the distributive law followed by the inverse distributive law.
5050          Most of the time, this results in no change.  However, if some of
5051          the operands are the same or inverses of each other, simplifications
5052          will result.
5053
5054          For example, (and (ior A B) (not B)) can occur as the result of
5055          expanding a bit field assignment.  When we apply the distributive
5056          law to this, we get (ior (and (A (not B))) (and (B (not B)))),
5057          which then simplifies to (and (A (not B))). 
5058
5059          If we have (and (ior A B) C), apply the distributive law and then
5060          the inverse distributive law to see if things simplify.  */
5061
5062       if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR)
5063         {
5064           x = apply_distributive_law
5065             (gen_binary (GET_CODE (op0), mode,
5066                          gen_binary (AND, mode, XEXP (op0, 0), op1),
5067                          gen_binary (AND, mode, XEXP (op0, 1), op1)));
5068           if (GET_CODE (x) != AND)
5069             return x;
5070         }
5071
5072       if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR)
5073         return apply_distributive_law
5074           (gen_binary (GET_CODE (op1), mode,
5075                        gen_binary (AND, mode, XEXP (op1, 0), op0),
5076                        gen_binary (AND, mode, XEXP (op1, 1), op0)));
5077
5078       /* Similarly, taking advantage of the fact that
5079          (and (not A) (xor B C)) == (xor (ior A B) (ior A C))  */
5080
5081       if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR)
5082         return apply_distributive_law
5083           (gen_binary (XOR, mode,
5084                        gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)),
5085                        gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 1))));
5086                                                             
5087       else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR)
5088         return apply_distributive_law
5089           (gen_binary (XOR, mode,
5090                        gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)),
5091                        gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 1))));
5092       break;
5093
5094     case IOR:
5095       /* (ior A C) is C if all bits of A that might be nonzero are on in C.  */
5096       if (GET_CODE (op1) == CONST_INT
5097           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5098           && (nonzero_bits (op0, mode) & ~ INTVAL (op1)) == 0)
5099         return op1;
5100
5101       /* Convert (A & B) | A to A.  */
5102       if (GET_CODE (op0) == AND
5103           && (rtx_equal_p (XEXP (op0, 0), op1)
5104               || rtx_equal_p (XEXP (op0, 1), op1))
5105           && ! side_effects_p (XEXP (op0, 0))
5106           && ! side_effects_p (XEXP (op0, 1)))
5107         return op1;
5108
5109       /* If we have (ior (and A B) C), apply the distributive law and then
5110          the inverse distributive law to see if things simplify.  */
5111
5112       if (GET_CODE (op0) == AND)
5113         {
5114           x = apply_distributive_law
5115             (gen_binary (AND, mode,
5116                          gen_binary (IOR, mode, XEXP (op0, 0), op1),
5117                          gen_binary (IOR, mode, XEXP (op0, 1), op1)));
5118
5119           if (GET_CODE (x) != IOR)
5120             return x;
5121         }
5122
5123       if (GET_CODE (op1) == AND)
5124         {
5125           x = apply_distributive_law
5126             (gen_binary (AND, mode,
5127                          gen_binary (IOR, mode, XEXP (op1, 0), op0),
5128                          gen_binary (IOR, mode, XEXP (op1, 1), op0)));
5129
5130           if (GET_CODE (x) != IOR)
5131             return x;
5132         }
5133
5134       /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the
5135          mode size to (rotate A CX).  */
5136
5137       if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT)
5138            || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT))
5139           && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0))
5140           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5141           && GET_CODE (XEXP (op1, 1)) == CONST_INT
5142           && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1))
5143               == GET_MODE_BITSIZE (mode)))
5144         return gen_rtx_ROTATE (mode, XEXP (op0, 0),
5145                                (GET_CODE (op0) == ASHIFT
5146                                 ? XEXP (op0, 1) : XEXP (op1, 1)));
5147
5148       /* If OP0 is (ashiftrt (plus ...) C), it might actually be
5149          a (sign_extend (plus ...)).  If so, OP1 is a CONST_INT, and the PLUS
5150          does not affect any of the bits in OP1, it can really be done
5151          as a PLUS and we can associate.  We do this by seeing if OP1
5152          can be safely shifted left C bits.  */
5153       if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT
5154           && GET_CODE (XEXP (op0, 0)) == PLUS
5155           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
5156           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5157           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT)
5158         {
5159           int count = INTVAL (XEXP (op0, 1));
5160           HOST_WIDE_INT mask = INTVAL (op1) << count;
5161
5162           if (mask >> count == INTVAL (op1)
5163               && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0)
5164             {
5165               SUBST (XEXP (XEXP (op0, 0), 1),
5166                      GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask));
5167               return op0;
5168             }
5169         }
5170       break;
5171
5172     case XOR:
5173       /* If we are XORing two things that have no bits in common,
5174          convert them into an IOR.  This helps to detect rotation encoded
5175          using those methods and possibly other simplifications.  */
5176
5177       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5178           && (nonzero_bits (op0, mode)
5179               & nonzero_bits (op1, mode)) == 0)
5180         return (gen_binary (IOR, mode, op0, op1));
5181
5182       /* Convert (XOR (NOT x) (NOT y)) to (XOR x y).
5183          Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for
5184          (NOT y).  */
5185       {
5186         int num_negated = 0;
5187
5188         if (GET_CODE (op0) == NOT)
5189           num_negated++, op0 = XEXP (op0, 0);
5190         if (GET_CODE (op1) == NOT)
5191           num_negated++, op1 = XEXP (op1, 0);
5192
5193         if (num_negated == 2)
5194           {
5195             SUBST (XEXP (x, 0), op0);
5196             SUBST (XEXP (x, 1), op1);
5197           }
5198         else if (num_negated == 1)
5199           return gen_unary (NOT, mode, mode, gen_binary (XOR, mode, op0, op1));
5200       }
5201
5202       /* Convert (xor (and A B) B) to (and (not A) B).  The latter may
5203          correspond to a machine insn or result in further simplifications
5204          if B is a constant.  */
5205
5206       if (GET_CODE (op0) == AND
5207           && rtx_equal_p (XEXP (op0, 1), op1)
5208           && ! side_effects_p (op1))
5209         return gen_binary (AND, mode,
5210                            gen_unary (NOT, mode, mode, XEXP (op0, 0)),
5211                            op1);
5212
5213       else if (GET_CODE (op0) == AND
5214                && rtx_equal_p (XEXP (op0, 0), op1)
5215                && ! side_effects_p (op1))
5216         return gen_binary (AND, mode,
5217                            gen_unary (NOT, mode, mode, XEXP (op0, 1)),
5218                            op1);
5219
5220       /* (xor (comparison foo bar) (const_int 1)) can become the reversed
5221          comparison if STORE_FLAG_VALUE is 1.  */
5222       if (STORE_FLAG_VALUE == 1
5223           && op1 == const1_rtx
5224           && GET_RTX_CLASS (GET_CODE (op0)) == '<'
5225           && reversible_comparison_p (op0))
5226         return gen_rtx_combine (reverse_condition (GET_CODE (op0)),
5227                                 mode, XEXP (op0, 0), XEXP (op0, 1));
5228
5229       /* (lshiftrt foo C) where C is the number of bits in FOO minus 1
5230          is (lt foo (const_int 0)), so we can perform the above
5231          simplification if STORE_FLAG_VALUE is 1.  */
5232
5233       if (STORE_FLAG_VALUE == 1
5234           && op1 == const1_rtx
5235           && GET_CODE (op0) == LSHIFTRT
5236           && GET_CODE (XEXP (op0, 1)) == CONST_INT
5237           && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1)
5238         return gen_rtx_combine (GE, mode, XEXP (op0, 0), const0_rtx);
5239
5240       /* (xor (comparison foo bar) (const_int sign-bit))
5241          when STORE_FLAG_VALUE is the sign bit.  */
5242       if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
5243           && ((STORE_FLAG_VALUE & GET_MODE_MASK (mode))
5244               == (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1))
5245           && op1 == const_true_rtx
5246           && GET_RTX_CLASS (GET_CODE (op0)) == '<'
5247           && reversible_comparison_p (op0))
5248         return gen_rtx_combine (reverse_condition (GET_CODE (op0)),
5249                                 mode, XEXP (op0, 0), XEXP (op0, 1));
5250
5251       break;
5252
5253     default:
5254       abort ();
5255     }
5256
5257   return x;
5258 }
5259 \f
5260 /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound
5261    operations" because they can be replaced with two more basic operations.
5262    ZERO_EXTEND is also considered "compound" because it can be replaced with
5263    an AND operation, which is simpler, though only one operation.
5264
5265    The function expand_compound_operation is called with an rtx expression
5266    and will convert it to the appropriate shifts and AND operations, 
5267    simplifying at each stage.
5268
5269    The function make_compound_operation is called to convert an expression
5270    consisting of shifts and ANDs into the equivalent compound expression.
5271    It is the inverse of this function, loosely speaking.  */
5272
5273 static rtx
5274 expand_compound_operation (x)
5275      rtx x;
5276 {
5277   int pos = 0, len;
5278   int unsignedp = 0;
5279   int modewidth;
5280   rtx tem;
5281
5282   switch (GET_CODE (x))
5283     {
5284     case ZERO_EXTEND:
5285       unsignedp = 1;
5286     case SIGN_EXTEND:
5287       /* We can't necessarily use a const_int for a multiword mode;
5288          it depends on implicitly extending the value.
5289          Since we don't know the right way to extend it,
5290          we can't tell whether the implicit way is right.
5291
5292          Even for a mode that is no wider than a const_int,
5293          we can't win, because we need to sign extend one of its bits through
5294          the rest of it, and we don't know which bit.  */
5295       if (GET_CODE (XEXP (x, 0)) == CONST_INT)
5296         return x;
5297
5298       /* Return if (subreg:MODE FROM 0) is not a safe replacement for
5299          (zero_extend:MODE FROM) or (sign_extend:MODE FROM).  It is for any MEM
5300          because (SUBREG (MEM...)) is guaranteed to cause the MEM to be
5301          reloaded. If not for that, MEM's would very rarely be safe.
5302
5303          Reject MODEs bigger than a word, because we might not be able
5304          to reference a two-register group starting with an arbitrary register
5305          (and currently gen_lowpart might crash for a SUBREG).  */
5306   
5307       if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
5308         return x;
5309
5310       len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
5311       /* If the inner object has VOIDmode (the only way this can happen
5312          is if it is a ASM_OPERANDS), we can't do anything since we don't
5313          know how much masking to do.  */
5314       if (len == 0)
5315         return x;
5316
5317       break;
5318
5319     case ZERO_EXTRACT:
5320       unsignedp = 1;
5321     case SIGN_EXTRACT:
5322       /* If the operand is a CLOBBER, just return it.  */
5323       if (GET_CODE (XEXP (x, 0)) == CLOBBER)
5324         return XEXP (x, 0);
5325
5326       if (GET_CODE (XEXP (x, 1)) != CONST_INT
5327           || GET_CODE (XEXP (x, 2)) != CONST_INT
5328           || GET_MODE (XEXP (x, 0)) == VOIDmode)
5329         return x;
5330
5331       len = INTVAL (XEXP (x, 1));
5332       pos = INTVAL (XEXP (x, 2));
5333
5334       /* If this goes outside the object being extracted, replace the object
5335          with a (use (mem ...)) construct that only combine understands
5336          and is used only for this purpose.  */
5337       if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))
5338         SUBST (XEXP (x, 0), gen_rtx_USE (GET_MODE (x), XEXP (x, 0)));
5339
5340       if (BITS_BIG_ENDIAN)
5341         pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos;
5342
5343       break;
5344
5345     default:
5346       return x;
5347     }
5348
5349   /* We can optimize some special cases of ZERO_EXTEND.  */
5350   if (GET_CODE (x) == ZERO_EXTEND)
5351     {
5352       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI if we
5353          know that the last value didn't have any inappropriate bits
5354          set.  */
5355       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5356           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5357           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5358           && (nonzero_bits (XEXP (XEXP (x, 0), 0), GET_MODE (x))
5359               & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5360         return XEXP (XEXP (x, 0), 0);
5361
5362       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5363       if (GET_CODE (XEXP (x, 0)) == SUBREG
5364           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5365           && subreg_lowpart_p (XEXP (x, 0))
5366           && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5367           && (nonzero_bits (SUBREG_REG (XEXP (x, 0)), GET_MODE (x))
5368               & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5369         return SUBREG_REG (XEXP (x, 0));
5370
5371       /* (zero_extend:DI (truncate:SI foo:DI)) is just foo:DI when foo
5372          is a comparison and STORE_FLAG_VALUE permits.  This is like
5373          the first case, but it works even when GET_MODE (x) is larger
5374          than HOST_WIDE_INT.  */
5375       if (GET_CODE (XEXP (x, 0)) == TRUNCATE
5376           && GET_MODE (XEXP (XEXP (x, 0), 0)) == GET_MODE (x)
5377           && GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) == '<'
5378           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5379               <= HOST_BITS_PER_WIDE_INT)
5380           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5381               & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5382         return XEXP (XEXP (x, 0), 0);
5383
5384       /* Likewise for (zero_extend:DI (subreg:SI foo:DI 0)).  */
5385       if (GET_CODE (XEXP (x, 0)) == SUBREG
5386           && GET_MODE (SUBREG_REG (XEXP (x, 0))) == GET_MODE (x)
5387           && subreg_lowpart_p (XEXP (x, 0))
5388           && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == '<'
5389           && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5390               <= HOST_BITS_PER_WIDE_INT)
5391           && ((HOST_WIDE_INT) STORE_FLAG_VALUE
5392               & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
5393         return SUBREG_REG (XEXP (x, 0));
5394
5395       /* If sign extension is cheaper than zero extension, then use it
5396          if we know that no extraneous bits are set, and that the high
5397          bit is not set.  */
5398       if (flag_expensive_optimizations
5399           && ((GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
5400                && ((nonzero_bits (XEXP (x, 0), GET_MODE (x))
5401                     & ~ (((unsigned HOST_WIDE_INT)
5402                           GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5403                          >> 1))
5404                    == 0))
5405               || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<'
5406                   && (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
5407                       <= HOST_BITS_PER_WIDE_INT)
5408                   && (((HOST_WIDE_INT) STORE_FLAG_VALUE
5409                        & ~ (((unsigned HOST_WIDE_INT)
5410                              GET_MODE_MASK (GET_MODE (XEXP (x, 0))))
5411                             >> 1))
5412                       == 0))))
5413         {
5414           rtx temp = gen_rtx_SIGN_EXTEND (GET_MODE (x), XEXP (x, 0));
5415
5416           if (rtx_cost (temp, SET) < rtx_cost (x, SET))
5417             return expand_compound_operation (temp);
5418         }
5419     }
5420
5421   /* If we reach here, we want to return a pair of shifts.  The inner
5422      shift is a left shift of BITSIZE - POS - LEN bits.  The outer
5423      shift is a right shift of BITSIZE - LEN bits.  It is arithmetic or
5424      logical depending on the value of UNSIGNEDP.
5425
5426      If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be
5427      converted into an AND of a shift.
5428
5429      We must check for the case where the left shift would have a negative
5430      count.  This can happen in a case like (x >> 31) & 255 on machines
5431      that can't shift by a constant.  On those machines, we would first
5432      combine the shift with the AND to produce a variable-position 
5433      extraction.  Then the constant of 31 would be substituted in to produce
5434      a such a position.  */
5435
5436   modewidth = GET_MODE_BITSIZE (GET_MODE (x));
5437   if (modewidth >= pos - len)
5438     tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT,
5439                                 GET_MODE (x),
5440                                 simplify_shift_const (NULL_RTX, ASHIFT,
5441                                                       GET_MODE (x),
5442                                                       XEXP (x, 0),
5443                                                       modewidth - pos - len),
5444                                 modewidth - len);
5445
5446   else if (unsignedp && len < HOST_BITS_PER_WIDE_INT)
5447     tem = simplify_and_const_int (NULL_RTX, GET_MODE (x),
5448                                   simplify_shift_const (NULL_RTX, LSHIFTRT,
5449                                                         GET_MODE (x),
5450                                                         XEXP (x, 0), pos),
5451                                   ((HOST_WIDE_INT) 1 << len) - 1);
5452   else
5453     /* Any other cases we can't handle.  */
5454     return x;
5455     
5456
5457   /* If we couldn't do this for some reason, return the original
5458      expression.  */
5459   if (GET_CODE (tem) == CLOBBER)
5460     return x;
5461
5462   return tem;
5463 }
5464 \f
5465 /* X is a SET which contains an assignment of one object into
5466    a part of another (such as a bit-field assignment, STRICT_LOW_PART,
5467    or certain SUBREGS). If possible, convert it into a series of
5468    logical operations.
5469
5470    We half-heartedly support variable positions, but do not at all
5471    support variable lengths.  */
5472
5473 static rtx
5474 expand_field_assignment (x)
5475      rtx x;
5476 {
5477   rtx inner;
5478   rtx pos;                      /* Always counts from low bit.  */
5479   int len;
5480   rtx mask;
5481   enum machine_mode compute_mode;
5482
5483   /* Loop until we find something we can't simplify.  */
5484   while (1)
5485     {
5486       if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART
5487           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG)
5488         {
5489           inner = SUBREG_REG (XEXP (SET_DEST (x), 0));
5490           len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)));
5491           pos = GEN_INT (BITS_PER_WORD * SUBREG_WORD (XEXP (SET_DEST (x), 0)));
5492         }
5493       else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
5494                && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT)
5495         {
5496           inner = XEXP (SET_DEST (x), 0);
5497           len = INTVAL (XEXP (SET_DEST (x), 1));
5498           pos = XEXP (SET_DEST (x), 2);
5499
5500           /* If the position is constant and spans the width of INNER,
5501              surround INNER  with a USE to indicate this.  */
5502           if (GET_CODE (pos) == CONST_INT
5503               && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner)))
5504             inner = gen_rtx_USE (GET_MODE (SET_DEST (x)), inner);
5505
5506           if (BITS_BIG_ENDIAN)
5507             {
5508               if (GET_CODE (pos) == CONST_INT)
5509                 pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len
5510                                - INTVAL (pos));
5511               else if (GET_CODE (pos) == MINUS
5512                        && GET_CODE (XEXP (pos, 1)) == CONST_INT
5513                        && (INTVAL (XEXP (pos, 1))
5514                            == GET_MODE_BITSIZE (GET_MODE (inner)) - len))
5515                 /* If position is ADJUST - X, new position is X.  */
5516                 pos = XEXP (pos, 0);
5517               else
5518                 pos = gen_binary (MINUS, GET_MODE (pos),
5519                                   GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner))
5520                                            - len),
5521                                   pos);
5522             }
5523         }
5524
5525       /* A SUBREG between two modes that occupy the same numbers of words
5526          can be done by moving the SUBREG to the source.  */
5527       else if (GET_CODE (SET_DEST (x)) == SUBREG
5528                && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
5529                      + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
5530                    == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x))))
5531                         + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))
5532         {
5533           x = gen_rtx_SET (VOIDmode, SUBREG_REG (SET_DEST (x)),
5534                            gen_lowpart_for_combine
5535                            (GET_MODE (SUBREG_REG (SET_DEST (x))),
5536                             SET_SRC (x)));
5537           continue;
5538         }
5539       else
5540         break;
5541
5542       while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5543         inner = SUBREG_REG (inner);
5544
5545       compute_mode = GET_MODE (inner);
5546
5547       /* Don't attempt bitwise arithmetic on non-integral modes.  */
5548       if (! INTEGRAL_MODE_P (compute_mode))
5549         {
5550           enum machine_mode imode;
5551
5552           /* Something is probably seriously wrong if this matches.  */
5553           if (! FLOAT_MODE_P (compute_mode))
5554             break;
5555
5556           /* Try to find an integral mode to pun with.  */
5557           imode = mode_for_size (GET_MODE_BITSIZE (compute_mode), MODE_INT, 0);
5558           if (imode == BLKmode)
5559             break;
5560
5561           compute_mode = imode;
5562           inner = gen_lowpart_for_combine (imode, inner);
5563         }
5564
5565       /* Compute a mask of LEN bits, if we can do this on the host machine.  */
5566       if (len < HOST_BITS_PER_WIDE_INT)
5567         mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1);
5568       else
5569         break;
5570
5571       /* Now compute the equivalent expression.  Make a copy of INNER
5572          for the SET_DEST in case it is a MEM into which we will substitute;
5573          we don't want shared RTL in that case.  */
5574       x = gen_rtx_SET
5575         (VOIDmode, copy_rtx (inner),
5576          gen_binary (IOR, compute_mode,
5577                      gen_binary (AND, compute_mode,
5578                                  gen_unary (NOT, compute_mode,
5579                                             compute_mode,
5580                                             gen_binary (ASHIFT,
5581                                                         compute_mode,
5582                                                         mask, pos)),
5583                                  inner),
5584                      gen_binary (ASHIFT, compute_mode,
5585                                  gen_binary (AND, compute_mode,
5586                                              gen_lowpart_for_combine
5587                                              (compute_mode, SET_SRC (x)),
5588                                              mask),
5589                                  pos)));
5590     }
5591
5592   return x;
5593 }
5594 \f
5595 /* Return an RTX for a reference to LEN bits of INNER.  If POS_RTX is nonzero,
5596    it is an RTX that represents a variable starting position; otherwise,
5597    POS is the (constant) starting bit position (counted from the LSB).
5598
5599    INNER may be a USE.  This will occur when we started with a bitfield
5600    that went outside the boundary of the object in memory, which is
5601    allowed on most machines.  To isolate this case, we produce a USE
5602    whose mode is wide enough and surround the MEM with it.  The only
5603    code that understands the USE is this routine.  If it is not removed,
5604    it will cause the resulting insn not to match.
5605
5606    UNSIGNEDP is non-zero for an unsigned reference and zero for a 
5607    signed reference.
5608
5609    IN_DEST is non-zero if this is a reference in the destination of a
5610    SET.  This is used when a ZERO_ or SIGN_EXTRACT isn't needed.  If non-zero,
5611    a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will
5612    be used.
5613
5614    IN_COMPARE is non-zero if we are in a COMPARE.  This means that a
5615    ZERO_EXTRACT should be built even for bits starting at bit 0.
5616
5617    MODE is the desired mode of the result (if IN_DEST == 0).
5618
5619    The result is an RTX for the extraction or NULL_RTX if the target
5620    can't handle it.  */
5621
5622 static rtx
5623 make_extraction (mode, inner, pos, pos_rtx, len,
5624                  unsignedp, in_dest, in_compare)
5625      enum machine_mode mode;
5626      rtx inner;
5627      int pos;
5628      rtx pos_rtx;
5629      int len;
5630      int unsignedp;
5631      int in_dest, in_compare;
5632 {
5633   /* This mode describes the size of the storage area
5634      to fetch the overall value from.  Within that, we
5635      ignore the POS lowest bits, etc.  */
5636   enum machine_mode is_mode = GET_MODE (inner);
5637   enum machine_mode inner_mode;
5638   enum machine_mode wanted_inner_mode = byte_mode;
5639   enum machine_mode wanted_inner_reg_mode = word_mode;
5640   enum machine_mode pos_mode = word_mode;
5641   enum machine_mode extraction_mode = word_mode;
5642   enum machine_mode tmode = mode_for_size (len, MODE_INT, 1);
5643   int spans_byte = 0;
5644   rtx new = 0;
5645   rtx orig_pos_rtx = pos_rtx;
5646   int orig_pos;
5647
5648   /* Get some information about INNER and get the innermost object.  */
5649   if (GET_CODE (inner) == USE)
5650     /* (use:SI (mem:QI foo)) stands for (mem:SI foo).  */
5651     /* We don't need to adjust the position because we set up the USE
5652        to pretend that it was a full-word object.  */
5653     spans_byte = 1, inner = XEXP (inner, 0);
5654   else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner))
5655     {
5656       /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...),
5657          consider just the QI as the memory to extract from.
5658          The subreg adds or removes high bits; its mode is
5659          irrelevant to the meaning of this extraction,
5660          since POS and LEN count from the lsb.  */
5661       if (GET_CODE (SUBREG_REG (inner)) == MEM)
5662         is_mode = GET_MODE (SUBREG_REG (inner));
5663       inner = SUBREG_REG (inner);
5664     }
5665
5666   inner_mode = GET_MODE (inner);
5667
5668   if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT)
5669     pos = INTVAL (pos_rtx), pos_rtx = 0;
5670
5671   /* See if this can be done without an extraction.  We never can if the
5672      width of the field is not the same as that of some integer mode. For
5673      registers, we can only avoid the extraction if the position is at the
5674      low-order bit and this is either not in the destination or we have the
5675      appropriate STRICT_LOW_PART operation available.
5676
5677      For MEM, we can avoid an extract if the field starts on an appropriate
5678      boundary and we can change the mode of the memory reference.  However,
5679      we cannot directly access the MEM if we have a USE and the underlying
5680      MEM is not TMODE.  This combination means that MEM was being used in a
5681      context where bits outside its mode were being referenced; that is only
5682      valid in bit-field insns.  */
5683
5684   if (tmode != BLKmode
5685       && ! (spans_byte && inner_mode != tmode)
5686       && ((pos_rtx == 0 && (pos % BITS_PER_WORD) == 0
5687            && GET_CODE (inner) != MEM
5688            && (! in_dest
5689                || (GET_CODE (inner) == REG
5690                    && (movstrict_optab->handlers[(int) tmode].insn_code
5691                        != CODE_FOR_nothing))))
5692           || (GET_CODE (inner) == MEM && pos_rtx == 0
5693               && (pos
5694                   % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode)
5695                      : BITS_PER_UNIT)) == 0
5696               /* We can't do this if we are widening INNER_MODE (it
5697                  may not be aligned, for one thing).  */
5698               && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode)
5699               && (inner_mode == tmode
5700                   || (! mode_dependent_address_p (XEXP (inner, 0))
5701                       && ! MEM_VOLATILE_P (inner))))))
5702     {
5703       /* If INNER is a MEM, make a new MEM that encompasses just the desired
5704          field.  If the original and current mode are the same, we need not
5705          adjust the offset.  Otherwise, we do if bytes big endian.  
5706
5707          If INNER is not a MEM, get a piece consisting of just the field
5708          of interest (in this case POS % BITS_PER_WORD must be 0).  */
5709
5710       if (GET_CODE (inner) == MEM)
5711         {
5712           int offset;
5713           /* POS counts from lsb, but make OFFSET count in memory order.  */
5714           if (BYTES_BIG_ENDIAN)
5715             offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT;
5716           else
5717             offset = pos / BITS_PER_UNIT;
5718
5719           new = gen_rtx_MEM (tmode, plus_constant (XEXP (inner, 0), offset));
5720           RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (inner);
5721           MEM_COPY_ATTRIBUTES (new, inner);
5722         }
5723       else if (GET_CODE (inner) == REG)
5724         {
5725           /* We can't call gen_lowpart_for_combine here since we always want
5726              a SUBREG and it would sometimes return a new hard register.  */
5727           if (tmode != inner_mode)
5728             new = gen_rtx_SUBREG (tmode, inner,
5729                                   (WORDS_BIG_ENDIAN
5730                                    && (GET_MODE_SIZE (inner_mode)
5731                                        > UNITS_PER_WORD)
5732                                    ? (((GET_MODE_SIZE (inner_mode)
5733                                         - GET_MODE_SIZE (tmode))
5734                                        / UNITS_PER_WORD)
5735                                       - pos / BITS_PER_WORD)
5736                                    : pos / BITS_PER_WORD));
5737           else
5738             new = inner;
5739         }
5740       else
5741         new = force_to_mode (inner, tmode,
5742                              len >= HOST_BITS_PER_WIDE_INT
5743                              ? GET_MODE_MASK (tmode)
5744                              : ((HOST_WIDE_INT) 1 << len) - 1,
5745                              NULL_RTX, 0);
5746
5747       /* If this extraction is going into the destination of a SET, 
5748          make a STRICT_LOW_PART unless we made a MEM.  */
5749
5750       if (in_dest)
5751         return (GET_CODE (new) == MEM ? new
5752                 : (GET_CODE (new) != SUBREG
5753                    ? gen_rtx_CLOBBER (tmode, const0_rtx)
5754                    : gen_rtx_combine (STRICT_LOW_PART, VOIDmode, new)));
5755
5756       /* Otherwise, sign- or zero-extend unless we already are in the
5757          proper mode.  */
5758
5759       return (mode == tmode ? new
5760               : gen_rtx_combine (unsignedp ? ZERO_EXTEND : SIGN_EXTEND,
5761                                  mode, new));
5762     }
5763
5764   /* Unless this is a COMPARE or we have a funny memory reference,
5765      don't do anything with zero-extending field extracts starting at
5766      the low-order bit since they are simple AND operations.  */
5767   if (pos_rtx == 0 && pos == 0 && ! in_dest
5768       && ! in_compare && ! spans_byte && unsignedp)
5769     return 0;
5770
5771   /* Unless we are allowed to span bytes or INNER is not MEM, reject this if
5772      we would be spanning bytes or if the position is not a constant and the
5773      length is not 1.  In all other cases, we would only be going outside
5774      our object in cases when an original shift would have been
5775      undefined.  */
5776   if (! spans_byte && GET_CODE (inner) == MEM
5777       && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode))
5778           || (pos_rtx != 0 && len != 1)))
5779     return 0;
5780
5781   /* Get the mode to use should INNER not be a MEM, the mode for the position,
5782      and the mode for the result.  */
5783 #ifdef HAVE_insv
5784   if (in_dest)
5785     {
5786       wanted_inner_reg_mode
5787         = insn_data[(int) CODE_FOR_insv].operand[0].mode;
5788       if (wanted_inner_reg_mode == VOIDmode)
5789         wanted_inner_reg_mode = word_mode;
5790
5791       pos_mode = insn_data[(int) CODE_FOR_insv].operand[2].mode;
5792       if (pos_mode == VOIDmode)
5793         pos_mode = word_mode;
5794
5795       extraction_mode = insn_data[(int) CODE_FOR_insv].operand[3].mode;
5796       if (extraction_mode == VOIDmode)
5797         extraction_mode = word_mode;
5798     }
5799 #endif
5800
5801 #ifdef HAVE_extzv
5802   if (! in_dest && unsignedp)
5803     {
5804       wanted_inner_reg_mode
5805         = insn_data[(int) CODE_FOR_extzv].operand[1].mode;
5806       if (wanted_inner_reg_mode == VOIDmode)
5807         wanted_inner_reg_mode = word_mode;
5808
5809       pos_mode = insn_data[(int) CODE_FOR_extzv].operand[3].mode;
5810       if (pos_mode == VOIDmode)
5811         pos_mode = word_mode;
5812
5813       extraction_mode = insn_data[(int) CODE_FOR_extzv].operand[0].mode;
5814       if (extraction_mode == VOIDmode)
5815         extraction_mode = word_mode;
5816     }
5817 #endif
5818
5819 #ifdef HAVE_extv
5820   if (! in_dest && ! unsignedp)
5821     {
5822       wanted_inner_reg_mode
5823         = insn_data[(int) CODE_FOR_extv].operand[1].mode;
5824       if (wanted_inner_reg_mode == VOIDmode)
5825         wanted_inner_reg_mode = word_mode;
5826
5827       pos_mode = insn_data[(int) CODE_FOR_extv].operand[3].mode;
5828       if (pos_mode == VOIDmode)
5829         pos_mode = word_mode;
5830
5831       extraction_mode = insn_data[(int) CODE_FOR_extv].operand[0].mode;
5832       if (extraction_mode == VOIDmode)
5833         extraction_mode = word_mode;
5834     }
5835 #endif
5836
5837   /* Never narrow an object, since that might not be safe.  */
5838
5839   if (mode != VOIDmode
5840       && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode))
5841     extraction_mode = mode;
5842
5843   if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode
5844       && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
5845     pos_mode = GET_MODE (pos_rtx);
5846
5847   /* If this is not from memory, the desired mode is wanted_inner_reg_mode;
5848      if we have to change the mode of memory and cannot, the desired mode is
5849      EXTRACTION_MODE.  */
5850   if (GET_CODE (inner) != MEM)
5851     wanted_inner_mode = wanted_inner_reg_mode;
5852   else if (inner_mode != wanted_inner_mode
5853            && (mode_dependent_address_p (XEXP (inner, 0))
5854                || MEM_VOLATILE_P (inner)))
5855     wanted_inner_mode = extraction_mode;
5856
5857   orig_pos = pos;
5858
5859   if (BITS_BIG_ENDIAN)
5860     {
5861       /* POS is passed as if BITS_BIG_ENDIAN == 0, so we need to convert it to
5862          BITS_BIG_ENDIAN style.  If position is constant, compute new
5863          position.  Otherwise, build subtraction.
5864          Note that POS is relative to the mode of the original argument.
5865          If it's a MEM we need to recompute POS relative to that.
5866          However, if we're extracting from (or inserting into) a register,
5867          we want to recompute POS relative to wanted_inner_mode.  */
5868       int width = (GET_CODE (inner) == MEM
5869                    ? GET_MODE_BITSIZE (is_mode)
5870                    : GET_MODE_BITSIZE (wanted_inner_mode));
5871
5872       if (pos_rtx == 0)
5873         pos = width - len - pos;
5874       else
5875         pos_rtx
5876           = gen_rtx_combine (MINUS, GET_MODE (pos_rtx),
5877                              GEN_INT (width - len), pos_rtx);
5878       /* POS may be less than 0 now, but we check for that below.
5879          Note that it can only be less than 0 if GET_CODE (inner) != MEM.  */
5880     }
5881
5882   /* If INNER has a wider mode, make it smaller.  If this is a constant
5883      extract, try to adjust the byte to point to the byte containing
5884      the value.  */
5885   if (wanted_inner_mode != VOIDmode
5886       && GET_MODE_SIZE (wanted_inner_mode) < GET_MODE_SIZE (is_mode)
5887       && ((GET_CODE (inner) == MEM
5888            && (inner_mode == wanted_inner_mode
5889                || (! mode_dependent_address_p (XEXP (inner, 0))
5890                    && ! MEM_VOLATILE_P (inner))))))
5891     {
5892       int offset = 0;
5893
5894       /* The computations below will be correct if the machine is big
5895          endian in both bits and bytes or little endian in bits and bytes.
5896          If it is mixed, we must adjust.  */
5897              
5898       /* If bytes are big endian and we had a paradoxical SUBREG, we must
5899          adjust OFFSET to compensate.  */
5900       if (BYTES_BIG_ENDIAN
5901           && ! spans_byte
5902           && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode))
5903         offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode);
5904
5905       /* If this is a constant position, we can move to the desired byte.  */
5906       if (pos_rtx == 0)
5907         {
5908           offset += pos / BITS_PER_UNIT;
5909           pos %= GET_MODE_BITSIZE (wanted_inner_mode);
5910         }
5911
5912       if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
5913           && ! spans_byte
5914           && is_mode != wanted_inner_mode)
5915         offset = (GET_MODE_SIZE (is_mode)
5916                   - GET_MODE_SIZE (wanted_inner_mode) - offset);
5917
5918       if (offset != 0 || inner_mode != wanted_inner_mode)
5919         {
5920           rtx newmem = gen_rtx_MEM (wanted_inner_mode,
5921                                     plus_constant (XEXP (inner, 0), offset));
5922           RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (inner);
5923           MEM_COPY_ATTRIBUTES (newmem, inner);
5924           inner = newmem;
5925         }
5926     }
5927
5928   /* If INNER is not memory, we can always get it into the proper mode.  If we
5929      are changing its mode, POS must be a constant and smaller than the size
5930      of the new mode.  */
5931   else if (GET_CODE (inner) != MEM)
5932     {
5933       if (GET_MODE (inner) != wanted_inner_mode
5934           && (pos_rtx != 0
5935               || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode)))
5936         return 0;
5937
5938       inner = force_to_mode (inner, wanted_inner_mode,
5939                              pos_rtx
5940                              || len + orig_pos >= HOST_BITS_PER_WIDE_INT
5941                              ? GET_MODE_MASK (wanted_inner_mode)
5942                              : (((HOST_WIDE_INT) 1 << len) - 1) << orig_pos,
5943                              NULL_RTX, 0);
5944     }
5945
5946   /* Adjust mode of POS_RTX, if needed.  If we want a wider mode, we
5947      have to zero extend.  Otherwise, we can just use a SUBREG.  */
5948   if (pos_rtx != 0
5949       && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx)))
5950     pos_rtx = gen_rtx_combine (ZERO_EXTEND, pos_mode, pos_rtx);
5951   else if (pos_rtx != 0
5952            && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx)))
5953     pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx);
5954
5955   /* Make POS_RTX unless we already have it and it is correct.  If we don't
5956      have a POS_RTX but we do have an ORIG_POS_RTX, the latter must
5957      be a CONST_INT.  */
5958   if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos)
5959     pos_rtx = orig_pos_rtx;
5960
5961   else if (pos_rtx == 0)
5962     pos_rtx = GEN_INT (pos);
5963
5964   /* Make the required operation.  See if we can use existing rtx.  */
5965   new = gen_rtx_combine (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT,
5966                          extraction_mode, inner, GEN_INT (len), pos_rtx);
5967   if (! in_dest)
5968     new = gen_lowpart_for_combine (mode, new);
5969
5970   return new;
5971 }
5972 \f
5973 /* See if X contains an ASHIFT of COUNT or more bits that can be commuted
5974    with any other operations in X.  Return X without that shift if so.  */
5975
5976 static rtx
5977 extract_left_shift (x, count)
5978      rtx x;
5979      int count;
5980 {
5981   enum rtx_code code = GET_CODE (x);
5982   enum machine_mode mode = GET_MODE (x);
5983   rtx tem;
5984
5985   switch (code)
5986     {
5987     case ASHIFT:
5988       /* This is the shift itself.  If it is wide enough, we will return
5989          either the value being shifted if the shift count is equal to
5990          COUNT or a shift for the difference.  */
5991       if (GET_CODE (XEXP (x, 1)) == CONST_INT
5992           && INTVAL (XEXP (x, 1)) >= count)
5993         return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0),
5994                                      INTVAL (XEXP (x, 1)) - count);
5995       break;
5996
5997     case NEG:  case NOT:
5998       if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0)
5999         return gen_unary (code, mode, mode, tem);
6000
6001       break;
6002
6003     case PLUS:  case IOR:  case XOR:  case AND:
6004       /* If we can safely shift this constant and we find the inner shift,
6005          make a new operation.  */
6006       if (GET_CODE (XEXP (x,1)) == CONST_INT
6007           && (INTVAL (XEXP (x, 1)) & ((((HOST_WIDE_INT) 1 << count)) - 1)) == 0
6008           && (tem = extract_left_shift (XEXP (x, 0), count)) != 0)
6009         return gen_binary (code, mode, tem, 
6010                            GEN_INT (INTVAL (XEXP (x, 1)) >> count));
6011
6012       break;
6013       
6014     default:
6015       break;
6016     }
6017
6018   return 0;
6019 }
6020 \f
6021 /* Look at the expression rooted at X.  Look for expressions
6022    equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND.
6023    Form these expressions.
6024
6025    Return the new rtx, usually just X.
6026
6027    Also, for machines like the Vax that don't have logical shift insns,
6028    try to convert logical to arithmetic shift operations in cases where
6029    they are equivalent.  This undoes the canonicalizations to logical
6030    shifts done elsewhere.
6031
6032    We try, as much as possible, to re-use rtl expressions to save memory.
6033
6034    IN_CODE says what kind of expression we are processing.  Normally, it is
6035    SET.  In a memory address (inside a MEM, PLUS or minus, the latter two
6036    being kludges), it is MEM.  When processing the arguments of a comparison
6037    or a COMPARE against zero, it is COMPARE.  */
6038
6039 static rtx
6040 make_compound_operation (x, in_code)
6041      rtx x;
6042      enum rtx_code in_code;
6043 {
6044   enum rtx_code code = GET_CODE (x);
6045   enum machine_mode mode = GET_MODE (x);
6046   int mode_width = GET_MODE_BITSIZE (mode);
6047   rtx rhs, lhs;
6048   enum rtx_code next_code;
6049   int i;
6050   rtx new = 0;
6051   rtx tem;
6052   const char *fmt;
6053
6054   /* Select the code to be used in recursive calls.  Once we are inside an
6055      address, we stay there.  If we have a comparison, set to COMPARE,
6056      but once inside, go back to our default of SET.  */
6057
6058   next_code = (code == MEM || code == PLUS || code == MINUS ? MEM
6059                : ((code == COMPARE || GET_RTX_CLASS (code) == '<')
6060                   && XEXP (x, 1) == const0_rtx) ? COMPARE
6061                : in_code == COMPARE ? SET : in_code);
6062
6063   /* Process depending on the code of this operation.  If NEW is set
6064      non-zero, it will be returned.  */
6065
6066   switch (code)
6067     {
6068     case ASHIFT:
6069       /* Convert shifts by constants into multiplications if inside
6070          an address.  */
6071       if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT
6072           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6073           && INTVAL (XEXP (x, 1)) >= 0)
6074         {
6075           new = make_compound_operation (XEXP (x, 0), next_code);
6076           new = gen_rtx_combine (MULT, mode, new,
6077                                  GEN_INT ((HOST_WIDE_INT) 1
6078                                           << INTVAL (XEXP (x, 1))));
6079         }
6080       break;
6081
6082     case AND:
6083       /* If the second operand is not a constant, we can't do anything
6084          with it.  */
6085       if (GET_CODE (XEXP (x, 1)) != CONST_INT)
6086         break;
6087
6088       /* If the constant is a power of two minus one and the first operand
6089          is a logical right shift, make an extraction.  */
6090       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6091           && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6092         {
6093           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6094           new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1,
6095                                  0, in_code == COMPARE);
6096         }
6097
6098       /* Same as previous, but for (subreg (lshiftrt ...)) in first op.  */
6099       else if (GET_CODE (XEXP (x, 0)) == SUBREG
6100                && subreg_lowpart_p (XEXP (x, 0))
6101                && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT
6102                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6103         {
6104           new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0),
6105                                          next_code);
6106           new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0,
6107                                  XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1,
6108                                  0, in_code == COMPARE);
6109         }
6110       /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)).  */
6111       else if ((GET_CODE (XEXP (x, 0)) == XOR
6112                 || GET_CODE (XEXP (x, 0)) == IOR)
6113                && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT
6114                && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT
6115                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6116         {
6117           /* Apply the distributive law, and then try to make extractions.  */
6118           new = gen_rtx_combine (GET_CODE (XEXP (x, 0)), mode,
6119                                  gen_rtx_AND (mode, XEXP (XEXP (x, 0), 0),
6120                                               XEXP (x, 1)),
6121                                  gen_rtx_AND (mode, XEXP (XEXP (x, 0), 1),
6122                                               XEXP (x, 1)));
6123           new = make_compound_operation (new, in_code);
6124         }
6125
6126       /* If we are have (and (rotate X C) M) and C is larger than the number
6127          of bits in M, this is an extraction.  */
6128
6129       else if (GET_CODE (XEXP (x, 0)) == ROTATE
6130                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6131                && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0
6132                && i <= INTVAL (XEXP (XEXP (x, 0), 1)))
6133         {
6134           new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code);
6135           new = make_extraction (mode, new,
6136                                  (GET_MODE_BITSIZE (mode)
6137                                   - INTVAL (XEXP (XEXP (x, 0), 1))),
6138                                  NULL_RTX, i, 1, 0, in_code == COMPARE);
6139         }
6140
6141       /* On machines without logical shifts, if the operand of the AND is
6142          a logical shift and our mask turns off all the propagated sign
6143          bits, we can replace the logical shift with an arithmetic shift.  */
6144       else if (ashr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
6145                && (lshr_optab->handlers[(int) mode].insn_code
6146                    == CODE_FOR_nothing)
6147                && GET_CODE (XEXP (x, 0)) == LSHIFTRT
6148                && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6149                && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6150                && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6151                && mode_width <= HOST_BITS_PER_WIDE_INT)
6152         {
6153           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
6154
6155           mask >>= INTVAL (XEXP (XEXP (x, 0), 1));
6156           if ((INTVAL (XEXP (x, 1)) & ~mask) == 0)
6157             SUBST (XEXP (x, 0),
6158                    gen_rtx_combine (ASHIFTRT, mode,
6159                                     make_compound_operation (XEXP (XEXP (x, 0), 0),
6160                                                              next_code),
6161                                     XEXP (XEXP (x, 0), 1)));
6162         }
6163
6164       /* If the constant is one less than a power of two, this might be
6165          representable by an extraction even if no shift is present.
6166          If it doesn't end up being a ZERO_EXTEND, we will ignore it unless
6167          we are in a COMPARE.  */
6168       else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0)
6169         new = make_extraction (mode,
6170                                make_compound_operation (XEXP (x, 0),
6171                                                         next_code),
6172                                0, NULL_RTX, i, 1, 0, in_code == COMPARE);
6173
6174       /* If we are in a comparison and this is an AND with a power of two,
6175          convert this into the appropriate bit extract.  */
6176       else if (in_code == COMPARE
6177                && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0)
6178         new = make_extraction (mode,
6179                                make_compound_operation (XEXP (x, 0),
6180                                                         next_code),
6181                                i, NULL_RTX, 1, 1, 0, 1);
6182
6183       break;
6184
6185     case LSHIFTRT:
6186       /* If the sign bit is known to be zero, replace this with an
6187          arithmetic shift.  */
6188       if (ashr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing
6189           && lshr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
6190           && mode_width <= HOST_BITS_PER_WIDE_INT
6191           && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0)
6192         {
6193           new = gen_rtx_combine (ASHIFTRT, mode,
6194                                  make_compound_operation (XEXP (x, 0),
6195                                                           next_code),
6196                                  XEXP (x, 1));
6197           break;
6198         }
6199
6200       /* ... fall through ...  */
6201
6202     case ASHIFTRT:
6203       lhs = XEXP (x, 0);
6204       rhs = XEXP (x, 1);
6205
6206       /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1,
6207          this is a SIGN_EXTRACT.  */
6208       if (GET_CODE (rhs) == CONST_INT
6209           && GET_CODE (lhs) == ASHIFT
6210           && GET_CODE (XEXP (lhs, 1)) == CONST_INT
6211           && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1)))
6212         {
6213           new = make_compound_operation (XEXP (lhs, 0), next_code);
6214           new = make_extraction (mode, new,
6215                                  INTVAL (rhs) - INTVAL (XEXP (lhs, 1)),
6216                                  NULL_RTX, mode_width - INTVAL (rhs),
6217                                  code == LSHIFTRT, 0, in_code == COMPARE);
6218         }
6219
6220       /* See if we have operations between an ASHIFTRT and an ASHIFT.
6221          If so, try to merge the shifts into a SIGN_EXTEND.  We could
6222          also do this for some cases of SIGN_EXTRACT, but it doesn't
6223          seem worth the effort; the case checked for occurs on Alpha.  */
6224       
6225       if (GET_RTX_CLASS (GET_CODE (lhs)) != 'o'
6226           && ! (GET_CODE (lhs) == SUBREG
6227                 && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (lhs))) == 'o'))
6228           && GET_CODE (rhs) == CONST_INT
6229           && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT
6230           && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0)
6231         new = make_extraction (mode, make_compound_operation (new, next_code),
6232                                0, NULL_RTX, mode_width - INTVAL (rhs),
6233                                code == LSHIFTRT, 0, in_code == COMPARE);
6234         
6235       break;
6236
6237     case SUBREG:
6238       /* Call ourselves recursively on the inner expression.  If we are
6239          narrowing the object and it has a different RTL code from
6240          what it originally did, do this SUBREG as a force_to_mode.  */
6241
6242       tem = make_compound_operation (SUBREG_REG (x), in_code);
6243       if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
6244           && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
6245           && subreg_lowpart_p (x))
6246         {
6247           rtx newer = force_to_mode (tem, mode,
6248                                      GET_MODE_MASK (mode), NULL_RTX, 0);
6249
6250           /* If we have something other than a SUBREG, we might have
6251              done an expansion, so rerun outselves.  */
6252           if (GET_CODE (newer) != SUBREG)
6253             newer = make_compound_operation (newer, in_code);
6254
6255           return newer;
6256         }
6257
6258       /* If this is a paradoxical subreg, and the new code is a sign or
6259          zero extension, omit the subreg and widen the extension.  If it
6260          is a regular subreg, we can still get rid of the subreg by not
6261          widening so much, or in fact removing the extension entirely.  */
6262       if ((GET_CODE (tem) == SIGN_EXTEND
6263            || GET_CODE (tem) == ZERO_EXTEND)
6264           && subreg_lowpart_p (x))
6265         {
6266           if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (tem))
6267               || (GET_MODE_SIZE (mode) >
6268                   GET_MODE_SIZE (GET_MODE (XEXP (tem, 0)))))
6269             tem = gen_rtx_combine (GET_CODE (tem), mode, XEXP (tem, 0));
6270           else
6271             tem = gen_lowpart_for_combine (mode, XEXP (tem, 0));
6272           return tem;
6273         }
6274       break;
6275       
6276     default:
6277       break;
6278     }
6279
6280   if (new)
6281     {
6282       x = gen_lowpart_for_combine (mode, new);
6283       code = GET_CODE (x);
6284     }
6285
6286   /* Now recursively process each operand of this operation.  */
6287   fmt = GET_RTX_FORMAT (code);
6288   for (i = 0; i < GET_RTX_LENGTH (code); i++)
6289     if (fmt[i] == 'e')
6290       {
6291         new = make_compound_operation (XEXP (x, i), next_code);
6292         SUBST (XEXP (x, i), new);
6293       }
6294
6295   return x;
6296 }
6297 \f
6298 /* Given M see if it is a value that would select a field of bits
6299     within an item, but not the entire word.  Return -1 if not.
6300     Otherwise, return the starting position of the field, where 0 is the
6301     low-order bit.
6302
6303    *PLEN is set to the length of the field.  */
6304
6305 static int
6306 get_pos_from_mask (m, plen)
6307      unsigned HOST_WIDE_INT m;
6308      int *plen;
6309 {
6310   /* Get the bit number of the first 1 bit from the right, -1 if none.  */
6311   int pos = exact_log2 (m & - m);
6312
6313   if (pos < 0)
6314     return -1;
6315
6316   /* Now shift off the low-order zero bits and see if we have a power of
6317      two minus 1.  */
6318   *plen = exact_log2 ((m >> pos) + 1);
6319
6320   if (*plen <= 0)
6321     return -1;
6322
6323   return pos;
6324 }
6325 \f
6326 /* See if X can be simplified knowing that we will only refer to it in
6327    MODE and will only refer to those bits that are nonzero in MASK.
6328    If other bits are being computed or if masking operations are done
6329    that select a superset of the bits in MASK, they can sometimes be
6330    ignored.
6331
6332    Return a possibly simplified expression, but always convert X to
6333    MODE.  If X is a CONST_INT, AND the CONST_INT with MASK.
6334
6335    Also, if REG is non-zero and X is a register equal in value to REG, 
6336    replace X with REG.
6337
6338    If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK
6339    are all off in X.  This is used when X will be complemented, by either
6340    NOT, NEG, or XOR.  */
6341
6342 static rtx
6343 force_to_mode (x, mode, mask, reg, just_select)
6344      rtx x;
6345      enum machine_mode mode;
6346      unsigned HOST_WIDE_INT mask;
6347      rtx reg;
6348      int just_select;
6349 {
6350   enum rtx_code code = GET_CODE (x);
6351   int next_select = just_select || code == XOR || code == NOT || code == NEG;
6352   enum machine_mode op_mode;
6353   unsigned HOST_WIDE_INT fuller_mask, nonzero;
6354   rtx op0, op1, temp;
6355
6356   /* If this is a CALL or ASM_OPERANDS, don't do anything.  Some of the
6357      code below will do the wrong thing since the mode of such an
6358      expression is VOIDmode. 
6359
6360      Also do nothing if X is a CLOBBER; this can happen if X was
6361      the return value from a call to gen_lowpart_for_combine.  */
6362   if (code == CALL || code == ASM_OPERANDS || code == CLOBBER)
6363     return x;
6364
6365   /* We want to perform the operation is its present mode unless we know
6366      that the operation is valid in MODE, in which case we do the operation
6367      in MODE.  */
6368   op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x))
6369               && code_to_optab[(int) code] != 0
6370               && (code_to_optab[(int) code]->handlers[(int) mode].insn_code
6371                   != CODE_FOR_nothing))
6372              ? mode : GET_MODE (x));
6373
6374   /* It is not valid to do a right-shift in a narrower mode
6375      than the one it came in with.  */
6376   if ((code == LSHIFTRT || code == ASHIFTRT)
6377       && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x)))
6378     op_mode = GET_MODE (x);
6379
6380   /* Truncate MASK to fit OP_MODE.  */
6381   if (op_mode)
6382     mask &= GET_MODE_MASK (op_mode);
6383
6384   /* When we have an arithmetic operation, or a shift whose count we
6385      do not know, we need to assume that all bit the up to the highest-order
6386      bit in MASK will be needed.  This is how we form such a mask.  */
6387   if (op_mode)
6388     fuller_mask = (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT
6389                    ? GET_MODE_MASK (op_mode)
6390                    : ((HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1)) - 1);
6391   else
6392     fuller_mask = ~ (HOST_WIDE_INT) 0;
6393
6394   /* Determine what bits of X are guaranteed to be (non)zero.  */
6395   nonzero = nonzero_bits (x, mode);
6396
6397   /* If none of the bits in X are needed, return a zero.  */
6398   if (! just_select && (nonzero & mask) == 0)
6399     return const0_rtx;
6400
6401   /* If X is a CONST_INT, return a new one.  Do this here since the
6402      test below will fail.  */
6403   if (GET_CODE (x) == CONST_INT)
6404     {
6405       HOST_WIDE_INT cval = INTVAL (x) & mask;
6406       int width = GET_MODE_BITSIZE (mode);
6407
6408       /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative
6409          number, sign extend it.  */
6410       if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6411           && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6412         cval |= (HOST_WIDE_INT) -1 << width;
6413         
6414       return GEN_INT (cval);
6415     }
6416
6417   /* If X is narrower than MODE and we want all the bits in X's mode, just
6418      get X in the proper mode.  */
6419   if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
6420       && (GET_MODE_MASK (GET_MODE (x)) & ~ mask) == 0)
6421     return gen_lowpart_for_combine (mode, x);
6422
6423   /* If we aren't changing the mode, X is not a SUBREG, and all zero bits in
6424      MASK are already known to be zero in X, we need not do anything.  */
6425   if (GET_MODE (x) == mode && code != SUBREG && (~ mask & nonzero) == 0)
6426     return x;
6427
6428   switch (code)
6429     {
6430     case CLOBBER:
6431       /* If X is a (clobber (const_int)), return it since we know we are
6432          generating something that won't match.  */
6433       return x;
6434
6435     case USE:
6436       /* X is a (use (mem ..)) that was made from a bit-field extraction that
6437          spanned the boundary of the MEM.  If we are now masking so it is
6438          within that boundary, we don't need the USE any more.  */
6439       if (! BITS_BIG_ENDIAN
6440           && (mask & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0)
6441         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6442       break;
6443
6444     case SIGN_EXTEND:
6445     case ZERO_EXTEND:
6446     case ZERO_EXTRACT:
6447     case SIGN_EXTRACT:
6448       x = expand_compound_operation (x);
6449       if (GET_CODE (x) != code)
6450         return force_to_mode (x, mode, mask, reg, next_select);
6451       break;
6452
6453     case REG:
6454       if (reg != 0 && (rtx_equal_p (get_last_value (reg), x)
6455                        || rtx_equal_p (reg, get_last_value (x))))
6456         x = reg;
6457       break;
6458
6459     case SUBREG:
6460       if (subreg_lowpart_p (x)
6461           /* We can ignore the effect of this SUBREG if it narrows the mode or
6462              if the constant masks to zero all the bits the mode doesn't
6463              have.  */
6464           && ((GET_MODE_SIZE (GET_MODE (x))
6465                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
6466               || (0 == (mask
6467                         & GET_MODE_MASK (GET_MODE (x))
6468                         & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))))))
6469         return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select);
6470       break;
6471
6472     case AND:
6473       /* If this is an AND with a constant, convert it into an AND
6474          whose constant is the AND of that constant with MASK.  If it
6475          remains an AND of MASK, delete it since it is redundant.  */
6476
6477       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
6478         {
6479           x = simplify_and_const_int (x, op_mode, XEXP (x, 0),
6480                                       mask & INTVAL (XEXP (x, 1)));
6481
6482           /* If X is still an AND, see if it is an AND with a mask that
6483              is just some low-order bits.  If so, and it is MASK, we don't
6484              need it.  */
6485
6486           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6487               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == mask)
6488             x = XEXP (x, 0);
6489
6490           /* If it remains an AND, try making another AND with the bits
6491              in the mode mask that aren't in MASK turned on.  If the
6492              constant in the AND is wide enough, this might make a
6493              cheaper constant.  */
6494
6495           if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT
6496               && GET_MODE_MASK (GET_MODE (x)) != mask
6497               && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT)
6498             {
6499               HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1))
6500                                     | (GET_MODE_MASK (GET_MODE (x)) & ~ mask));
6501               int width = GET_MODE_BITSIZE (GET_MODE (x));
6502               rtx y;
6503
6504               /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative
6505                  number, sign extend it.  */
6506               if (width > 0 && width < HOST_BITS_PER_WIDE_INT
6507                   && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6508                 cval |= (HOST_WIDE_INT) -1 << width;
6509
6510               y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval));
6511               if (rtx_cost (y, SET) < rtx_cost (x, SET))
6512                 x = y;
6513             }
6514
6515           break;
6516         }
6517
6518       goto binop;
6519
6520     case PLUS:
6521       /* In (and (plus FOO C1) M), if M is a mask that just turns off
6522          low-order bits (as in an alignment operation) and FOO is already
6523          aligned to that boundary, mask C1 to that boundary as well.
6524          This may eliminate that PLUS and, later, the AND.  */
6525
6526       {
6527         int width = GET_MODE_BITSIZE (mode);
6528         unsigned HOST_WIDE_INT smask = mask;
6529
6530         /* If MODE is narrower than HOST_WIDE_INT and mask is a negative
6531            number, sign extend it.  */
6532
6533         if (width < HOST_BITS_PER_WIDE_INT
6534             && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0)
6535           smask |= (HOST_WIDE_INT) -1 << width;
6536
6537         if (GET_CODE (XEXP (x, 1)) == CONST_INT
6538             && exact_log2 (- smask) >= 0)
6539           {
6540 #ifdef STACK_BIAS
6541             if (STACK_BIAS
6542                 && (XEXP (x, 0) == stack_pointer_rtx
6543                     || XEXP (x, 0) == frame_pointer_rtx))
6544               {
6545                 int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
6546                 unsigned HOST_WIDE_INT sp_mask = GET_MODE_MASK (mode);
6547           
6548                 sp_mask &= ~ (sp_alignment - 1);
6549                 if ((sp_mask & ~ smask) == 0
6550                     && ((INTVAL (XEXP (x, 1)) - STACK_BIAS) & ~ smask) != 0)
6551                   return force_to_mode (plus_constant (XEXP (x, 0),
6552                                                        ((INTVAL (XEXP (x, 1)) -
6553                                                          STACK_BIAS) & smask)
6554                                                        + STACK_BIAS),
6555                                         mode, smask, reg, next_select);
6556               }
6557 #endif
6558             if ((nonzero_bits (XEXP (x, 0), mode) & ~ smask) == 0
6559                 && (INTVAL (XEXP (x, 1)) & ~ smask) != 0)
6560               return force_to_mode (plus_constant (XEXP (x, 0),
6561                                                    (INTVAL (XEXP (x, 1))
6562                                                     & smask)),
6563                                     mode, smask, reg, next_select);
6564           }
6565       }
6566
6567       /* ... fall through ...  */
6568
6569     case MINUS:
6570     case MULT:
6571       /* For PLUS, MINUS and MULT, we need any bits less significant than the
6572          most significant bit in MASK since carries from those bits will
6573          affect the bits we are interested in.  */
6574       mask = fuller_mask;
6575       goto binop;
6576
6577     case IOR:
6578     case XOR:
6579       /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and
6580          LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...)
6581          operation which may be a bitfield extraction.  Ensure that the
6582          constant we form is not wider than the mode of X.  */
6583
6584       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6585           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6586           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6587           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT
6588           && GET_CODE (XEXP (x, 1)) == CONST_INT
6589           && ((INTVAL (XEXP (XEXP (x, 0), 1))
6590                + floor_log2 (INTVAL (XEXP (x, 1))))
6591               < GET_MODE_BITSIZE (GET_MODE (x)))
6592           && (INTVAL (XEXP (x, 1))
6593               & ~ nonzero_bits (XEXP (x, 0), GET_MODE (x))) == 0)
6594         {
6595           temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask)
6596                               << INTVAL (XEXP (XEXP (x, 0), 1)));
6597           temp = gen_binary (GET_CODE (x), GET_MODE (x),
6598                              XEXP (XEXP (x, 0), 0), temp);
6599           x = gen_binary (LSHIFTRT, GET_MODE (x), temp,
6600                           XEXP (XEXP (x, 0), 1));
6601           return force_to_mode (x, mode, mask, reg, next_select);
6602         }
6603
6604     binop:
6605       /* For most binary operations, just propagate into the operation and
6606          change the mode if we have an operation of that mode.   */
6607
6608       op0 = gen_lowpart_for_combine (op_mode,
6609                                      force_to_mode (XEXP (x, 0), mode, mask,
6610                                                     reg, next_select));
6611       op1 = gen_lowpart_for_combine (op_mode,
6612                                      force_to_mode (XEXP (x, 1), mode, mask,
6613                                                     reg, next_select));
6614
6615       /* If OP1 is a CONST_INT and X is an IOR or XOR, clear bits outside
6616          MASK since OP1 might have been sign-extended but we never want
6617          to turn on extra bits, since combine might have previously relied
6618          on them being off.  */
6619       if (GET_CODE (op1) == CONST_INT && (code == IOR || code == XOR)
6620           && (INTVAL (op1) & mask) != 0)
6621         op1 = GEN_INT (INTVAL (op1) & mask);
6622          
6623       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1))
6624         x = gen_binary (code, op_mode, op0, op1);
6625       break;
6626
6627     case ASHIFT:
6628       /* For left shifts, do the same, but just for the first operand.
6629          However, we cannot do anything with shifts where we cannot
6630          guarantee that the counts are smaller than the size of the mode
6631          because such a count will have a different meaning in a
6632          wider mode.  */
6633
6634       if (! (GET_CODE (XEXP (x, 1)) == CONST_INT
6635              && INTVAL (XEXP (x, 1)) >= 0
6636              && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode))
6637           && ! (GET_MODE (XEXP (x, 1)) != VOIDmode
6638                 && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1)))
6639                     < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode))))
6640         break;
6641         
6642       /* If the shift count is a constant and we can do arithmetic in
6643          the mode of the shift, refine which bits we need.  Otherwise, use the
6644          conservative form of the mask.  */
6645       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6646           && INTVAL (XEXP (x, 1)) >= 0
6647           && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode)
6648           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6649         mask >>= INTVAL (XEXP (x, 1));
6650       else
6651         mask = fuller_mask;
6652
6653       op0 = gen_lowpart_for_combine (op_mode,
6654                                      force_to_mode (XEXP (x, 0), op_mode,
6655                                                     mask, reg, next_select));
6656
6657       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
6658         x =  gen_binary (code, op_mode, op0, XEXP (x, 1));
6659       break;
6660
6661     case LSHIFTRT:
6662       /* Here we can only do something if the shift count is a constant,
6663          this shift constant is valid for the host, and we can do arithmetic
6664          in OP_MODE.  */
6665
6666       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6667           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT
6668           && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT)
6669         {
6670           rtx inner = XEXP (x, 0);
6671
6672           /* Select the mask of the bits we need for the shift operand.  */
6673           mask <<= INTVAL (XEXP (x, 1));
6674
6675           /* We can only change the mode of the shift if we can do arithmetic
6676              in the mode of the shift and MASK is no wider than the width of
6677              OP_MODE.  */
6678           if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT
6679               || (mask & ~ GET_MODE_MASK (op_mode)) != 0)
6680             op_mode = GET_MODE (x);
6681
6682           inner = force_to_mode (inner, op_mode, mask, reg, next_select);
6683
6684           if (GET_MODE (x) != op_mode || inner != XEXP (x, 0))
6685             x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1));
6686         }
6687
6688       /* If we have (and (lshiftrt FOO C1) C2) where the combination of the
6689          shift and AND produces only copies of the sign bit (C2 is one less
6690          than a power of two), we can do this with just a shift.  */
6691
6692       if (GET_CODE (x) == LSHIFTRT
6693           && GET_CODE (XEXP (x, 1)) == CONST_INT
6694           && ((INTVAL (XEXP (x, 1))
6695                + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
6696               >= GET_MODE_BITSIZE (GET_MODE (x)))
6697           && exact_log2 (mask + 1) >= 0
6698           && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))
6699               >= exact_log2 (mask + 1)))
6700         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0),
6701                         GEN_INT (GET_MODE_BITSIZE (GET_MODE (x))
6702                                  - exact_log2 (mask + 1)));
6703
6704       goto shiftrt;
6705
6706     case ASHIFTRT:
6707       /* If we are just looking for the sign bit, we don't need this shift at
6708          all, even if it has a variable count.  */
6709       if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
6710           && (mask == ((unsigned HOST_WIDE_INT) 1
6711                        << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
6712         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6713
6714       /* If this is a shift by a constant, get a mask that contains those bits
6715          that are not copies of the sign bit.  We then have two cases:  If
6716          MASK only includes those bits, this can be a logical shift, which may
6717          allow simplifications.  If MASK is a single-bit field not within
6718          those bits, we are requesting a copy of the sign bit and hence can
6719          shift the sign bit to the appropriate location.  */
6720
6721       if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0
6722           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
6723         {
6724           int i = -1;
6725
6726           /* If the considered data is wider then HOST_WIDE_INT, we can't
6727              represent a mask for all its bits in a single scalar.
6728              But we only care about the lower bits, so calculate these.  */
6729
6730           if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT)
6731             {
6732               nonzero = ~ (HOST_WIDE_INT) 0;
6733
6734               /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
6735                  is the number of bits a full-width mask would have set.
6736                  We need only shift if these are fewer than nonzero can
6737                  hold.  If not, we must keep all bits set in nonzero.  */
6738
6739               if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1))
6740                   < HOST_BITS_PER_WIDE_INT)
6741                 nonzero >>= INTVAL (XEXP (x, 1))
6742                             + HOST_BITS_PER_WIDE_INT
6743                             - GET_MODE_BITSIZE (GET_MODE (x)) ;
6744             }
6745           else
6746             {
6747               nonzero = GET_MODE_MASK (GET_MODE (x));
6748               nonzero >>= INTVAL (XEXP (x, 1));
6749             }
6750
6751           if ((mask & ~ nonzero) == 0
6752               || (i = exact_log2 (mask)) >= 0)
6753             {
6754               x = simplify_shift_const
6755                 (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0),
6756                  i < 0 ? INTVAL (XEXP (x, 1))
6757                  : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i);
6758
6759               if (GET_CODE (x) != ASHIFTRT)
6760                 return force_to_mode (x, mode, mask, reg, next_select);
6761             }
6762         }
6763
6764       /* If MASK is 1, convert this to a LSHIFTRT.  This can be done
6765          even if the shift count isn't a constant.  */
6766       if (mask == 1)
6767         x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1));
6768
6769     shiftrt:
6770
6771       /* If this is a zero- or sign-extension operation that just affects bits
6772          we don't care about, remove it.  Be sure the call above returned
6773          something that is still a shift.  */
6774
6775       if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT)
6776           && GET_CODE (XEXP (x, 1)) == CONST_INT
6777           && INTVAL (XEXP (x, 1)) >= 0
6778           && (INTVAL (XEXP (x, 1))
6779               <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1))
6780           && GET_CODE (XEXP (x, 0)) == ASHIFT
6781           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6782           && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1)))
6783         return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask,
6784                               reg, next_select);
6785
6786       break;
6787
6788     case ROTATE:
6789     case ROTATERT:
6790       /* If the shift count is constant and we can do computations
6791          in the mode of X, compute where the bits we care about are.
6792          Otherwise, we can't do anything.  Don't change the mode of
6793          the shift or propagate MODE into the shift, though.  */
6794       if (GET_CODE (XEXP (x, 1)) == CONST_INT
6795           && INTVAL (XEXP (x, 1)) >= 0)
6796         {
6797           temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE,
6798                                             GET_MODE (x), GEN_INT (mask),
6799                                             XEXP (x, 1));
6800           if (temp && GET_CODE(temp) == CONST_INT)
6801             SUBST (XEXP (x, 0),
6802                    force_to_mode (XEXP (x, 0), GET_MODE (x),
6803                                   INTVAL (temp), reg, next_select));
6804         }
6805       break;
6806         
6807     case NEG:
6808       /* If we just want the low-order bit, the NEG isn't needed since it
6809          won't change the low-order bit.    */
6810       if (mask == 1)
6811         return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select);
6812
6813       /* We need any bits less significant than the most significant bit in
6814          MASK since carries from those bits will affect the bits we are
6815          interested in.  */
6816       mask = fuller_mask;
6817       goto unop;
6818
6819     case NOT:
6820       /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the
6821          same as the XOR case above.  Ensure that the constant we form is not
6822          wider than the mode of X.  */
6823
6824       if (GET_CODE (XEXP (x, 0)) == LSHIFTRT
6825           && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
6826           && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0
6827           && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask)
6828               < GET_MODE_BITSIZE (GET_MODE (x)))
6829           && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT)
6830         {
6831           temp = GEN_INT (mask << INTVAL (XEXP (XEXP (x, 0), 1)));
6832           temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp);
6833           x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1));
6834
6835           return force_to_mode (x, mode, mask, reg, next_select);
6836         }
6837
6838       /* (and (not FOO) CONST) is (not (or FOO (not CONST))), so we must
6839          use the full mask inside the NOT.  */
6840       mask = fuller_mask;
6841
6842     unop:
6843       op0 = gen_lowpart_for_combine (op_mode,
6844                                      force_to_mode (XEXP (x, 0), mode, mask,
6845                                                     reg, next_select));
6846       if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0))
6847         x = gen_unary (code, op_mode, op_mode, op0);
6848       break;
6849
6850     case NE:
6851       /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included
6852          in STORE_FLAG_VALUE and FOO has a single bit that might be nonzero,
6853          which is equal to STORE_FLAG_VALUE.  */
6854       if ((mask & ~ STORE_FLAG_VALUE) == 0 && XEXP (x, 1) == const0_rtx
6855           && exact_log2 (nonzero_bits (XEXP (x, 0), mode)) >= 0
6856           && nonzero_bits (XEXP (x, 0), mode) == STORE_FLAG_VALUE)
6857         return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select);
6858
6859       break;
6860
6861     case IF_THEN_ELSE:
6862       /* We have no way of knowing if the IF_THEN_ELSE can itself be
6863          written in a narrower mode.  We play it safe and do not do so.  */
6864
6865       SUBST (XEXP (x, 1),
6866              gen_lowpart_for_combine (GET_MODE (x),
6867                                       force_to_mode (XEXP (x, 1), mode,
6868                                                      mask, reg, next_select)));
6869       SUBST (XEXP (x, 2),
6870              gen_lowpart_for_combine (GET_MODE (x),
6871                                       force_to_mode (XEXP (x, 2), mode,
6872                                                      mask, reg,next_select)));
6873       break;
6874       
6875     default:
6876       break;
6877     }
6878
6879   /* Ensure we return a value of the proper mode.  */
6880   return gen_lowpart_for_combine (mode, x);
6881 }
6882 \f
6883 /* Return nonzero if X is an expression that has one of two values depending on
6884    whether some other value is zero or nonzero.  In that case, we return the
6885    value that is being tested, *PTRUE is set to the value if the rtx being
6886    returned has a nonzero value, and *PFALSE is set to the other alternative.
6887
6888    If we return zero, we set *PTRUE and *PFALSE to X.  */
6889
6890 static rtx
6891 if_then_else_cond (x, ptrue, pfalse)
6892      rtx x;
6893      rtx *ptrue, *pfalse;
6894 {
6895   enum machine_mode mode = GET_MODE (x);
6896   enum rtx_code code = GET_CODE (x);
6897   int size = GET_MODE_BITSIZE (mode);
6898   rtx cond0, cond1, true0, true1, false0, false1;
6899   unsigned HOST_WIDE_INT nz;
6900
6901   /* If this is a unary operation whose operand has one of two values, apply
6902      our opcode to compute those values.  */
6903   if (GET_RTX_CLASS (code) == '1'
6904       && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0)
6905     {
6906       *ptrue = gen_unary (code, mode, GET_MODE (XEXP (x, 0)), true0);
6907       *pfalse = gen_unary (code, mode, GET_MODE (XEXP (x, 0)), false0);
6908       return cond0;
6909     }
6910
6911   /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would
6912      make can't possibly match and would suppress other optimizations.  */
6913   else if (code == COMPARE)
6914     ;
6915
6916   /* If this is a binary operation, see if either side has only one of two
6917      values.  If either one does or if both do and they are conditional on
6918      the same value, compute the new true and false values.  */
6919   else if (GET_RTX_CLASS (code) == 'c' || GET_RTX_CLASS (code) == '2'
6920            || GET_RTX_CLASS (code) == '<')
6921     {
6922       cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0);
6923       cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1);
6924
6925       if ((cond0 != 0 || cond1 != 0)
6926           && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1)))
6927         {
6928           /* If if_then_else_cond returned zero, then true/false are the
6929              same rtl.  We must copy one of them to prevent invalid rtl
6930              sharing.  */
6931           if (cond0 == 0)
6932             true0 = copy_rtx (true0);
6933           else if (cond1 == 0)
6934             true1 = copy_rtx (true1);
6935
6936           *ptrue = gen_binary (code, mode, true0, true1);
6937           *pfalse = gen_binary (code, mode, false0, false1);
6938           return cond0 ? cond0 : cond1;
6939         }
6940
6941       /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the
6942          operands is zero when the other is non-zero, and vice-versa,
6943          and STORE_FLAG_VALUE is 1 or -1.  */
6944
6945       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6946           && (code == PLUS || code == IOR || code == XOR || code == MINUS
6947            || code == UMAX)
6948           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
6949         {
6950           rtx op0 = XEXP (XEXP (x, 0), 1);
6951           rtx op1 = XEXP (XEXP (x, 1), 1);
6952
6953           cond0 = XEXP (XEXP (x, 0), 0);
6954           cond1 = XEXP (XEXP (x, 1), 0);
6955
6956           if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
6957               && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
6958               && reversible_comparison_p (cond1)
6959               && ((GET_CODE (cond0) == reverse_condition (GET_CODE (cond1))
6960                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
6961                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
6962                   || ((swap_condition (GET_CODE (cond0))
6963                        == reverse_condition (GET_CODE (cond1)))
6964                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
6965                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
6966               && ! side_effects_p (x))
6967             {
6968               *ptrue = gen_binary (MULT, mode, op0, const_true_rtx);
6969               *pfalse = gen_binary (MULT, mode, 
6970                                     (code == MINUS 
6971                                      ? gen_unary (NEG, mode, mode, op1) : op1),
6972                                     const_true_rtx);
6973               return cond0;
6974             }
6975         }
6976
6977       /* Similarly for MULT, AND and UMIN, execpt that for these the result
6978          is always zero.  */
6979       if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
6980           && (code == MULT || code == AND || code == UMIN)
6981           && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT)
6982         {
6983           cond0 = XEXP (XEXP (x, 0), 0);
6984           cond1 = XEXP (XEXP (x, 1), 0);
6985
6986           if (GET_RTX_CLASS (GET_CODE (cond0)) == '<'
6987               && GET_RTX_CLASS (GET_CODE (cond1)) == '<'
6988               && reversible_comparison_p (cond1)
6989               && ((GET_CODE (cond0) == reverse_condition (GET_CODE (cond1))
6990                    && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
6991                    && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
6992                   || ((swap_condition (GET_CODE (cond0))
6993                        == reverse_condition (GET_CODE (cond1)))
6994                       && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1))
6995                       && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0))))
6996               && ! side_effects_p (x))
6997             {
6998               *ptrue = *pfalse = const0_rtx;
6999               return cond0;
7000             }
7001         }
7002     }
7003
7004   else if (code == IF_THEN_ELSE)
7005     {
7006       /* If we have IF_THEN_ELSE already, extract the condition and
7007          canonicalize it if it is NE or EQ.  */
7008       cond0 = XEXP (x, 0);
7009       *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2);
7010       if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx)
7011         return XEXP (cond0, 0);
7012       else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx)
7013         {
7014           *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1);
7015           return XEXP (cond0, 0);
7016         }
7017       else
7018         return cond0;
7019     }
7020
7021   /* If X is a normal SUBREG with both inner and outer modes integral,
7022      we can narrow both the true and false values of the inner expression,
7023      if there is a condition.  */
7024   else if (code == SUBREG && GET_MODE_CLASS (mode) == MODE_INT
7025            && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT
7026            && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
7027            && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x),
7028                                                &true0, &false0)))
7029     {
7030       *ptrue = force_to_mode (true0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
7031       *pfalse
7032         = force_to_mode (false0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
7033
7034       return cond0;
7035     }
7036
7037   /* If X is a constant, this isn't special and will cause confusions
7038      if we treat it as such.  Likewise if it is equivalent to a constant.  */
7039   else if (CONSTANT_P (x)
7040            || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0)))
7041     ;
7042
7043   /* If X is known to be either 0 or -1, those are the true and 
7044      false values when testing X.  */
7045   else if (num_sign_bit_copies (x, mode) == size)
7046     {
7047       *ptrue = constm1_rtx, *pfalse = const0_rtx;
7048       return x;
7049     }
7050
7051   /* Likewise for 0 or a single bit.  */
7052   else if (exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
7053     {
7054       *ptrue = GEN_INT (nz), *pfalse = const0_rtx;
7055       return x;
7056     }
7057
7058   /* Otherwise fail; show no condition with true and false values the same.  */
7059   *ptrue = *pfalse = x;
7060   return 0;
7061 }
7062 \f
7063 /* Return the value of expression X given the fact that condition COND
7064    is known to be true when applied to REG as its first operand and VAL
7065    as its second.  X is known to not be shared and so can be modified in
7066    place.
7067
7068    We only handle the simplest cases, and specifically those cases that
7069    arise with IF_THEN_ELSE expressions.  */
7070
7071 static rtx
7072 known_cond (x, cond, reg, val)
7073      rtx x;
7074      enum rtx_code cond;
7075      rtx reg, val;
7076 {
7077   enum rtx_code code = GET_CODE (x);
7078   rtx temp;
7079   const char *fmt;
7080   int i, j;
7081
7082   if (side_effects_p (x))
7083     return x;
7084
7085   if (cond == EQ && rtx_equal_p (x, reg))
7086     return val;
7087
7088   /* If X is (abs REG) and we know something about REG's relationship
7089      with zero, we may be able to simplify this.  */
7090
7091   if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx)
7092     switch (cond)
7093       {
7094       case GE:  case GT:  case EQ:
7095         return XEXP (x, 0);
7096       case LT:  case LE:
7097         return gen_unary (NEG, GET_MODE (XEXP (x, 0)), GET_MODE (XEXP (x, 0)),
7098                           XEXP (x, 0));
7099       default:
7100         break;
7101       }
7102
7103   /* The only other cases we handle are MIN, MAX, and comparisons if the
7104      operands are the same as REG and VAL.  */
7105
7106   else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c')
7107     {
7108       if (rtx_equal_p (XEXP (x, 0), val))
7109         cond = swap_condition (cond), temp = val, val = reg, reg = temp;
7110
7111       if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val))
7112         {
7113           if (GET_RTX_CLASS (code) == '<')
7114             return (comparison_dominates_p (cond, code) ? const_true_rtx
7115                     : (comparison_dominates_p (cond,
7116                                                reverse_condition (code))
7117                        ? const0_rtx : x));
7118
7119           else if (code == SMAX || code == SMIN
7120                    || code == UMIN || code == UMAX)
7121             {
7122               int unsignedp = (code == UMIN || code == UMAX);
7123
7124               if (code == SMAX || code == UMAX)
7125                 cond = reverse_condition (cond);
7126
7127               switch (cond)
7128                 {
7129                 case GE:   case GT:
7130                   return unsignedp ? x : XEXP (x, 1);
7131                 case LE:   case LT:
7132                   return unsignedp ? x : XEXP (x, 0);
7133                 case GEU:  case GTU:
7134                   return unsignedp ? XEXP (x, 1) : x;
7135                 case LEU:  case LTU:
7136                   return unsignedp ? XEXP (x, 0) : x;
7137                 default:
7138                   break;
7139                 }
7140             }
7141         }
7142     }
7143
7144   fmt = GET_RTX_FORMAT (code);
7145   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7146     {
7147       if (fmt[i] == 'e')
7148         SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val));
7149       else if (fmt[i] == 'E')
7150         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
7151           SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j),
7152                                                 cond, reg, val));
7153     }
7154
7155   return x;
7156 }
7157 \f
7158 /* See if X and Y are equal for the purposes of seeing if we can rewrite an
7159    assignment as a field assignment.  */
7160
7161 static int
7162 rtx_equal_for_field_assignment_p (x, y)
7163      rtx x;
7164      rtx y;
7165 {
7166   if (x == y || rtx_equal_p (x, y))
7167     return 1;
7168
7169   if (x == 0 || y == 0 || GET_MODE (x) != GET_MODE (y))
7170     return 0;
7171
7172   /* Check for a paradoxical SUBREG of a MEM compared with the MEM.
7173      Note that all SUBREGs of MEM are paradoxical; otherwise they
7174      would have been rewritten.  */
7175   if (GET_CODE (x) == MEM && GET_CODE (y) == SUBREG
7176       && GET_CODE (SUBREG_REG (y)) == MEM
7177       && rtx_equal_p (SUBREG_REG (y),
7178                       gen_lowpart_for_combine (GET_MODE (SUBREG_REG (y)), x)))
7179     return 1;
7180
7181   if (GET_CODE (y) == MEM && GET_CODE (x) == SUBREG
7182       && GET_CODE (SUBREG_REG (x)) == MEM
7183       && rtx_equal_p (SUBREG_REG (x),
7184                       gen_lowpart_for_combine (GET_MODE (SUBREG_REG (x)), y)))
7185     return 1;
7186
7187   /* We used to see if get_last_value of X and Y were the same but that's
7188      not correct.  In one direction, we'll cause the assignment to have
7189      the wrong destination and in the case, we'll import a register into this
7190      insn that might have already have been dead.   So fail if none of the
7191      above cases are true.  */
7192   return 0;
7193 }
7194 \f
7195 /* See if X, a SET operation, can be rewritten as a bit-field assignment.
7196    Return that assignment if so.
7197
7198    We only handle the most common cases.  */
7199
7200 static rtx
7201 make_field_assignment (x)
7202      rtx x;
7203 {
7204   rtx dest = SET_DEST (x);
7205   rtx src = SET_SRC (x);
7206   rtx assign;
7207   rtx rhs, lhs;
7208   HOST_WIDE_INT c1;
7209   int pos, len;
7210   rtx other;
7211   enum machine_mode mode;
7212
7213   /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is
7214      a clear of a one-bit field.  We will have changed it to
7215      (and (rotate (const_int -2) POS) DEST), so check for that.  Also check
7216      for a SUBREG.  */
7217
7218   if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE
7219       && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT
7220       && INTVAL (XEXP (XEXP (src, 0), 0)) == -2
7221       && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7222     {
7223       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7224                                 1, 1, 1, 0);
7225       if (assign != 0)
7226         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7227       return x;
7228     }
7229
7230   else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG
7231            && subreg_lowpart_p (XEXP (src, 0))
7232            && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) 
7233                < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0)))))
7234            && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE
7235            && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2
7236            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7237     {
7238       assign = make_extraction (VOIDmode, dest, 0,
7239                                 XEXP (SUBREG_REG (XEXP (src, 0)), 1),
7240                                 1, 1, 1, 0);
7241       if (assign != 0)
7242         return gen_rtx_SET (VOIDmode, assign, const0_rtx);
7243       return x;
7244     }
7245
7246   /* If SRC is (ior (ashift (const_int 1) POS) DEST), this is a set of a
7247      one-bit field.  */
7248   else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT
7249            && XEXP (XEXP (src, 0), 0) == const1_rtx
7250            && rtx_equal_for_field_assignment_p (dest, XEXP (src, 1)))
7251     {
7252       assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1),
7253                                 1, 1, 1, 0);
7254       if (assign != 0)
7255         return gen_rtx_SET (VOIDmode, assign, const1_rtx);
7256       return x;
7257     }
7258
7259   /* The other case we handle is assignments into a constant-position
7260      field.  They look like (ior/xor (and DEST C1) OTHER).  If C1 represents
7261      a mask that has all one bits except for a group of zero bits and
7262      OTHER is known to have zeros where C1 has ones, this is such an
7263      assignment.  Compute the position and length from C1.  Shift OTHER
7264      to the appropriate position, force it to the required mode, and
7265      make the extraction.  Check for the AND in both operands.  */
7266
7267   if (GET_CODE (src) != IOR && GET_CODE (src) != XOR)
7268     return x;
7269
7270   rhs = expand_compound_operation (XEXP (src, 0));
7271   lhs = expand_compound_operation (XEXP (src, 1));
7272
7273   if (GET_CODE (rhs) == AND
7274       && GET_CODE (XEXP (rhs, 1)) == CONST_INT
7275       && rtx_equal_for_field_assignment_p (XEXP (rhs, 0), dest))
7276     c1 = INTVAL (XEXP (rhs, 1)), other = lhs;
7277   else if (GET_CODE (lhs) == AND
7278            && GET_CODE (XEXP (lhs, 1)) == CONST_INT
7279            && rtx_equal_for_field_assignment_p (XEXP (lhs, 0), dest))
7280     c1 = INTVAL (XEXP (lhs, 1)), other = rhs;
7281   else
7282     return x;
7283
7284   pos = get_pos_from_mask ((~ c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
7285   if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
7286       || GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
7287       || (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
7288     return x;
7289
7290   assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
7291   if (assign == 0)
7292     return x;
7293
7294   /* The mode to use for the source is the mode of the assignment, or of
7295      what is inside a possible STRICT_LOW_PART.  */
7296   mode = (GET_CODE (assign) == STRICT_LOW_PART 
7297           ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign));
7298
7299   /* Shift OTHER right POS places and make it the source, restricting it
7300      to the proper length and mode.  */
7301
7302   src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT,
7303                                              GET_MODE (src), other, pos),
7304                        mode,
7305                        GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT
7306                        ? GET_MODE_MASK (mode)
7307                        : ((HOST_WIDE_INT) 1 << len) - 1,
7308                        dest, 0);
7309
7310   return gen_rtx_combine (SET, VOIDmode, assign, src);
7311 }
7312 \f
7313 /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c)
7314    if so.  */
7315
7316 static rtx
7317 apply_distributive_law (x)
7318      rtx x;
7319 {
7320   enum rtx_code code = GET_CODE (x);
7321   rtx lhs, rhs, other;
7322   rtx tem;
7323   enum rtx_code inner_code;
7324
7325   /* Distributivity is not true for floating point.
7326      It can change the value.  So don't do it.
7327      -- rms and moshier@world.std.com.  */
7328   if (FLOAT_MODE_P (GET_MODE (x)))
7329     return x;
7330
7331   /* The outer operation can only be one of the following:  */
7332   if (code != IOR && code != AND && code != XOR
7333       && code != PLUS && code != MINUS)
7334     return x;
7335
7336   lhs = XEXP (x, 0), rhs = XEXP (x, 1);
7337
7338   /* If either operand is a primitive we can't do anything, so get out
7339      fast.  */
7340   if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o'
7341       || GET_RTX_CLASS (GET_CODE (rhs)) == 'o')
7342     return x;
7343
7344   lhs = expand_compound_operation (lhs);
7345   rhs = expand_compound_operation (rhs);
7346   inner_code = GET_CODE (lhs);
7347   if (inner_code != GET_CODE (rhs))
7348     return x;
7349
7350   /* See if the inner and outer operations distribute.  */
7351   switch (inner_code)
7352     {
7353     case LSHIFTRT:
7354     case ASHIFTRT:
7355     case AND:
7356     case IOR:
7357       /* These all distribute except over PLUS.  */
7358       if (code == PLUS || code == MINUS)
7359         return x;
7360       break;
7361
7362     case MULT:
7363       if (code != PLUS && code != MINUS)
7364         return x;
7365       break;
7366
7367     case ASHIFT:
7368       /* This is also a multiply, so it distributes over everything.  */
7369       break;
7370
7371     case SUBREG:
7372       /* Non-paradoxical SUBREGs distributes over all operations, provided
7373          the inner modes and word numbers are the same, this is an extraction
7374          of a low-order part, we don't convert an fp operation to int or
7375          vice versa, and we would not be converting a single-word
7376          operation into a multi-word operation.  The latter test is not
7377          required, but it prevents generating unneeded multi-word operations.
7378          Some of the previous tests are redundant given the latter test, but
7379          are retained because they are required for correctness.
7380
7381          We produce the result slightly differently in this case.  */
7382
7383       if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs))
7384           || SUBREG_WORD (lhs) != SUBREG_WORD (rhs)
7385           || ! subreg_lowpart_p (lhs)
7386           || (GET_MODE_CLASS (GET_MODE (lhs))
7387               != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs))))
7388           || (GET_MODE_SIZE (GET_MODE (lhs))
7389               > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))))
7390           || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD)
7391         return x;
7392
7393       tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)),
7394                         SUBREG_REG (lhs), SUBREG_REG (rhs));
7395       return gen_lowpart_for_combine (GET_MODE (x), tem);
7396
7397     default:
7398       return x;
7399     }
7400
7401   /* Set LHS and RHS to the inner operands (A and B in the example
7402      above) and set OTHER to the common operand (C in the example).
7403      These is only one way to do this unless the inner operation is
7404      commutative.  */
7405   if (GET_RTX_CLASS (inner_code) == 'c'
7406       && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0)))
7407     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1);
7408   else if (GET_RTX_CLASS (inner_code) == 'c'
7409            && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1)))
7410     other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0);
7411   else if (GET_RTX_CLASS (inner_code) == 'c'
7412            && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0)))
7413     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1);
7414   else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1)))
7415     other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0);
7416   else
7417     return x;
7418
7419   /* Form the new inner operation, seeing if it simplifies first.  */
7420   tem = gen_binary (code, GET_MODE (x), lhs, rhs);
7421
7422   /* There is one exception to the general way of distributing:
7423      (a ^ b) | (a ^ c) -> (~a) & (b ^ c)  */
7424   if (code == XOR && inner_code == IOR)
7425     {
7426       inner_code = AND;
7427       other = gen_unary (NOT, GET_MODE (x), GET_MODE (x), other);
7428     }
7429
7430   /* We may be able to continuing distributing the result, so call
7431      ourselves recursively on the inner operation before forming the
7432      outer operation, which we return.  */
7433   return gen_binary (inner_code, GET_MODE (x),
7434                      apply_distributive_law (tem), other);
7435 }
7436 \f
7437 /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done
7438    in MODE.
7439
7440    Return an equivalent form, if different from X.  Otherwise, return X.  If
7441    X is zero, we are to always construct the equivalent form.  */
7442
7443 static rtx
7444 simplify_and_const_int (x, mode, varop, constop)
7445      rtx x;
7446      enum machine_mode mode;
7447      rtx varop;
7448      unsigned HOST_WIDE_INT constop;
7449 {
7450   unsigned HOST_WIDE_INT nonzero;
7451   int i;
7452
7453   /* Simplify VAROP knowing that we will be only looking at some of the
7454      bits in it.  */
7455   varop = force_to_mode (varop, mode, constop, NULL_RTX, 0);
7456
7457   /* If VAROP is a CLOBBER, we will fail so return it; if it is a
7458      CONST_INT, we are done.  */
7459   if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT)
7460     return varop;
7461
7462   /* See what bits may be nonzero in VAROP.  Unlike the general case of
7463      a call to nonzero_bits, here we don't care about bits outside
7464      MODE.  */
7465
7466   nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode);
7467   nonzero = trunc_int_for_mode (nonzero, mode);
7468
7469   /* Turn off all bits in the constant that are known to already be zero.
7470      Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS
7471      which is tested below.  */
7472
7473   constop &= nonzero;
7474
7475   /* If we don't have any bits left, return zero.  */
7476   if (constop == 0)
7477     return const0_rtx;
7478
7479   /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is
7480      a power of two, we can replace this with a ASHIFT.  */
7481   if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1
7482       && (i = exact_log2 (constop)) >= 0)
7483     return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i);
7484                                  
7485   /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR
7486      or XOR, then try to apply the distributive law.  This may eliminate
7487      operations if either branch can be simplified because of the AND.
7488      It may also make some cases more complex, but those cases probably
7489      won't match a pattern either with or without this.  */
7490
7491   if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR)
7492     return
7493       gen_lowpart_for_combine
7494         (mode,
7495          apply_distributive_law
7496          (gen_binary (GET_CODE (varop), GET_MODE (varop),
7497                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7498                                               XEXP (varop, 0), constop),
7499                       simplify_and_const_int (NULL_RTX, GET_MODE (varop),
7500                                               XEXP (varop, 1), constop))));
7501
7502   /* Get VAROP in MODE.  Try to get a SUBREG if not.  Don't make a new SUBREG
7503      if we already had one (just check for the simplest cases).  */
7504   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
7505       && GET_MODE (XEXP (x, 0)) == mode
7506       && SUBREG_REG (XEXP (x, 0)) == varop)
7507     varop = XEXP (x, 0);
7508   else
7509     varop = gen_lowpart_for_combine (mode, varop);
7510
7511   /* If we can't make the SUBREG, try to return what we were given.  */
7512   if (GET_CODE (varop) == CLOBBER)
7513     return x ? x : varop;
7514
7515   /* If we are only masking insignificant bits, return VAROP.  */
7516   if (constop == nonzero)
7517     x = varop;
7518
7519   /* Otherwise, return an AND.  See how much, if any, of X we can use.  */
7520   else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode)
7521     x = gen_binary (AND, mode, varop, GEN_INT (constop));
7522
7523   else
7524     {
7525       if (GET_CODE (XEXP (x, 1)) != CONST_INT
7526           || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop)
7527         SUBST (XEXP (x, 1), GEN_INT (constop));
7528
7529       SUBST (XEXP (x, 0), varop);
7530     }
7531
7532   return x;
7533 }
7534 \f
7535 /* We let num_sign_bit_copies recur into nonzero_bits as that is useful.
7536    We don't let nonzero_bits recur into num_sign_bit_copies, because that
7537    is less useful.  We can't allow both, because that results in exponential
7538    run time recursion.  There is a nullstone testcase that triggered
7539    this.  This macro avoids accidental uses of num_sign_bit_copies.  */
7540 #define num_sign_bit_copies()
7541
7542 /* Given an expression, X, compute which bits in X can be non-zero.
7543    We don't care about bits outside of those defined in MODE.
7544
7545    For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is
7546    a shift, AND, or zero_extract, we can do better.  */
7547
7548 static unsigned HOST_WIDE_INT
7549 nonzero_bits (x, mode)
7550      rtx x;
7551      enum machine_mode mode;
7552 {
7553   unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode);
7554   unsigned HOST_WIDE_INT inner_nz;
7555   enum rtx_code code;
7556   int mode_width = GET_MODE_BITSIZE (mode);
7557   rtx tem;
7558
7559   /* For floating-point values, assume all bits are needed.  */
7560   if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode))
7561     return nonzero;
7562
7563   /* If X is wider than MODE, use its mode instead.  */
7564   if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width)
7565     {
7566       mode = GET_MODE (x);
7567       nonzero = GET_MODE_MASK (mode);
7568       mode_width = GET_MODE_BITSIZE (mode);
7569     }
7570
7571   if (mode_width > HOST_BITS_PER_WIDE_INT)
7572     /* Our only callers in this case look for single bit values.  So
7573        just return the mode mask.  Those tests will then be false.  */
7574     return nonzero;
7575
7576 #ifndef WORD_REGISTER_OPERATIONS
7577   /* If MODE is wider than X, but both are a single word for both the host
7578      and target machines, we can compute this from which bits of the 
7579      object might be nonzero in its own mode, taking into account the fact
7580      that on many CISC machines, accessing an object in a wider mode
7581      causes the high-order bits to become undefined.  So they are
7582      not known to be zero.  */
7583
7584   if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode
7585       && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD
7586       && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT
7587       && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x)))
7588     {
7589       nonzero &= nonzero_bits (x, GET_MODE (x));
7590       nonzero |= GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x));
7591       return nonzero;
7592     }
7593 #endif
7594
7595   code = GET_CODE (x);
7596   switch (code)
7597     {
7598     case REG:
7599 #ifdef POINTERS_EXTEND_UNSIGNED
7600       /* If pointers extend unsigned and this is a pointer in Pmode, say that
7601          all the bits above ptr_mode are known to be zero.  */
7602       if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode
7603           && REGNO_POINTER_FLAG (REGNO (x)))
7604         nonzero &= GET_MODE_MASK (ptr_mode);
7605 #endif
7606
7607 #ifdef STACK_BOUNDARY
7608       /* If this is the stack pointer, we may know something about its
7609          alignment.  If PUSH_ROUNDING is defined, it is possible for the
7610          stack to be momentarily aligned only to that amount, so we pick
7611          the least alignment.  */
7612
7613       /* We can't check for arg_pointer_rtx here, because it is not
7614          guaranteed to have as much alignment as the stack pointer.
7615          In particular, in the Irix6 n64 ABI, the stack has 128 bit
7616          alignment but the argument pointer has only 64 bit alignment.  */
7617
7618       if ((x == frame_pointer_rtx
7619            || x == stack_pointer_rtx
7620            || x == hard_frame_pointer_rtx
7621            || (REGNO (x) >= FIRST_VIRTUAL_REGISTER
7622                && REGNO (x) <= LAST_VIRTUAL_REGISTER))
7623 #ifdef STACK_BIAS
7624           && !STACK_BIAS
7625 #endif        
7626               )
7627         {
7628           int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
7629
7630 #ifdef PUSH_ROUNDING
7631           if (REGNO (x) == STACK_POINTER_REGNUM)
7632             sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment);
7633 #endif
7634
7635           /* We must return here, otherwise we may get a worse result from
7636              one of the choices below.  There is nothing useful below as
7637              far as the stack pointer is concerned.  */
7638           return nonzero &= ~ (sp_alignment - 1);
7639         }
7640 #endif
7641
7642       /* If X is a register whose nonzero bits value is current, use it.
7643          Otherwise, if X is a register whose value we can find, use that
7644          value.  Otherwise, use the previously-computed global nonzero bits
7645          for this register.  */
7646
7647       if (reg_last_set_value[REGNO (x)] != 0
7648           && reg_last_set_mode[REGNO (x)] == mode
7649           && (reg_last_set_label[REGNO (x)] == label_tick
7650               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
7651                   && REG_N_SETS (REGNO (x)) == 1
7652                   && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, 
7653                                         REGNO (x))))
7654           && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
7655         return reg_last_set_nonzero_bits[REGNO (x)];
7656
7657       tem = get_last_value (x);
7658
7659       if (tem)
7660         {
7661 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
7662           /* If X is narrower than MODE and TEM is a non-negative
7663              constant that would appear negative in the mode of X,
7664              sign-extend it for use in reg_nonzero_bits because some
7665              machines (maybe most) will actually do the sign-extension
7666              and this is the conservative approach. 
7667
7668              ??? For 2.5, try to tighten up the MD files in this regard
7669              instead of this kludge.  */
7670
7671           if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width
7672               && GET_CODE (tem) == CONST_INT
7673               && INTVAL (tem) > 0
7674               && 0 != (INTVAL (tem)
7675                        & ((HOST_WIDE_INT) 1
7676                           << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
7677             tem = GEN_INT (INTVAL (tem)
7678                            | ((HOST_WIDE_INT) (-1)
7679                               << GET_MODE_BITSIZE (GET_MODE (x))));
7680 #endif
7681           return nonzero_bits (tem, mode);
7682         }
7683       else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)])
7684         return reg_nonzero_bits[REGNO (x)] & nonzero;
7685       else
7686         return nonzero;
7687
7688     case CONST_INT:
7689 #ifdef SHORT_IMMEDIATES_SIGN_EXTEND
7690       /* If X is negative in MODE, sign-extend the value.  */
7691       if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
7692           && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
7693         return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
7694 #endif
7695
7696       return INTVAL (x);
7697
7698     case MEM:
7699 #ifdef LOAD_EXTEND_OP
7700       /* In many, if not most, RISC machines, reading a byte from memory
7701          zeros the rest of the register.  Noticing that fact saves a lot
7702          of extra zero-extends.  */
7703       if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND)
7704         nonzero &= GET_MODE_MASK (GET_MODE (x));
7705 #endif
7706       break;
7707
7708     case EQ:  case NE:
7709     case GT:  case GTU:
7710     case LT:  case LTU:
7711     case GE:  case GEU:
7712     case LE:  case LEU:
7713
7714       /* If this produces an integer result, we know which bits are set.
7715          Code here used to clear bits outside the mode of X, but that is
7716          now done above.  */
7717
7718       if (GET_MODE_CLASS (mode) == MODE_INT
7719           && mode_width <= HOST_BITS_PER_WIDE_INT)
7720         nonzero = STORE_FLAG_VALUE;
7721       break;
7722
7723     case NEG:
7724 #if 0
7725       /* Disabled to avoid exponential mutual recursion between nonzero_bits
7726          and num_sign_bit_copies.  */
7727       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
7728           == GET_MODE_BITSIZE (GET_MODE (x)))
7729         nonzero = 1;
7730 #endif
7731
7732       if (GET_MODE_SIZE (GET_MODE (x)) < mode_width)
7733         nonzero |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)));
7734       break;
7735
7736     case ABS:
7737 #if 0
7738       /* Disabled to avoid exponential mutual recursion between nonzero_bits
7739          and num_sign_bit_copies.  */
7740       if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x))
7741           == GET_MODE_BITSIZE (GET_MODE (x)))
7742         nonzero = 1;
7743 #endif
7744       break;
7745
7746     case TRUNCATE:
7747       nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode));
7748       break;
7749
7750     case ZERO_EXTEND:
7751       nonzero &= nonzero_bits (XEXP (x, 0), mode);
7752       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
7753         nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
7754       break;
7755
7756     case SIGN_EXTEND:
7757       /* If the sign bit is known clear, this is the same as ZERO_EXTEND.
7758          Otherwise, show all the bits in the outer mode but not the inner
7759          may be non-zero.  */
7760       inner_nz = nonzero_bits (XEXP (x, 0), mode);
7761       if (GET_MODE (XEXP (x, 0)) != VOIDmode)
7762         {
7763           inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0)));
7764           if (inner_nz
7765               & (((HOST_WIDE_INT) 1
7766                   << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))))
7767             inner_nz |= (GET_MODE_MASK (mode)
7768                           & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0))));
7769         }
7770
7771       nonzero &= inner_nz;
7772       break;
7773
7774     case AND:
7775       nonzero &= (nonzero_bits (XEXP (x, 0), mode)
7776                   & nonzero_bits (XEXP (x, 1), mode));
7777       break;
7778
7779     case XOR:   case IOR:
7780     case UMIN:  case UMAX:  case SMIN:  case SMAX:
7781       nonzero &= (nonzero_bits (XEXP (x, 0), mode)
7782                   | nonzero_bits (XEXP (x, 1), mode));
7783       break;
7784
7785     case PLUS:  case MINUS:
7786     case MULT:
7787     case DIV:   case UDIV:
7788     case MOD:   case UMOD:
7789       /* We can apply the rules of arithmetic to compute the number of
7790          high- and low-order zero bits of these operations.  We start by
7791          computing the width (position of the highest-order non-zero bit)
7792          and the number of low-order zero bits for each value.  */
7793       {
7794         unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode);
7795         unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode);
7796         int width0 = floor_log2 (nz0) + 1;
7797         int width1 = floor_log2 (nz1) + 1;
7798         int low0 = floor_log2 (nz0 & -nz0);
7799         int low1 = floor_log2 (nz1 & -nz1);
7800         HOST_WIDE_INT op0_maybe_minusp
7801           = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
7802         HOST_WIDE_INT op1_maybe_minusp
7803           = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1)));
7804         int result_width = mode_width;
7805         int result_low = 0;
7806
7807         switch (code)
7808           {
7809           case PLUS:
7810 #ifdef STACK_BIAS
7811             if (STACK_BIAS
7812                 && (XEXP (x, 0) == stack_pointer_rtx
7813                     || XEXP (x, 0) == frame_pointer_rtx)
7814                 && GET_CODE (XEXP (x, 1)) == CONST_INT)
7815               {
7816                 int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT;
7817
7818                 nz0 = (GET_MODE_MASK (mode) & ~ (sp_alignment - 1));
7819                 nz1 = INTVAL (XEXP (x, 1)) - STACK_BIAS;
7820                 width0 = floor_log2 (nz0) + 1;
7821                 width1 = floor_log2 (nz1) + 1;
7822                 low0 = floor_log2 (nz0 & -nz0);
7823                 low1 = floor_log2 (nz1 & -nz1);
7824               }
7825 #endif    
7826             result_width = MAX (width0, width1) + 1;
7827             result_low = MIN (low0, low1);
7828             break;
7829           case MINUS:
7830             result_low = MIN (low0, low1);
7831             break;
7832           case MULT:
7833             result_width = width0 + width1;
7834             result_low = low0 + low1;
7835             break;
7836           case DIV:
7837             if (! op0_maybe_minusp && ! op1_maybe_minusp)
7838               result_width = width0;
7839             break;
7840           case UDIV:
7841             result_width = width0;
7842             break;
7843           case MOD:
7844             if (! op0_maybe_minusp && ! op1_maybe_minusp)
7845               result_width = MIN (width0, width1);
7846             result_low = MIN (low0, low1);
7847             break;
7848           case UMOD:
7849             result_width = MIN (width0, width1);
7850             result_low = MIN (low0, low1);
7851             break;
7852           default:
7853             abort ();
7854           }
7855
7856         if (result_width < mode_width)
7857           nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1;
7858
7859         if (result_low > 0)
7860           nonzero &= ~ (((HOST_WIDE_INT) 1 << result_low) - 1);
7861       }
7862       break;
7863
7864     case ZERO_EXTRACT:
7865       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7866           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7867         nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1;
7868       break;
7869
7870     case SUBREG:
7871       /* If this is a SUBREG formed for a promoted variable that has
7872          been zero-extended, we know that at least the high-order bits
7873          are zero, though others might be too.  */
7874
7875       if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x))
7876         nonzero = (GET_MODE_MASK (GET_MODE (x))
7877                    & nonzero_bits (SUBREG_REG (x), GET_MODE (x)));
7878
7879       /* If the inner mode is a single word for both the host and target
7880          machines, we can compute this from which bits of the inner
7881          object might be nonzero.  */
7882       if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD
7883           && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
7884               <= HOST_BITS_PER_WIDE_INT))
7885         {
7886           nonzero &= nonzero_bits (SUBREG_REG (x), mode);
7887
7888 #if defined (WORD_REGISTER_OPERATIONS) && defined (LOAD_EXTEND_OP)
7889           /* If this is a typical RISC machine, we only have to worry
7890              about the way loads are extended.  */
7891           if (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND
7892               ? (nonzero
7893                  & (1L << (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) - 1)))
7894               : LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) != ZERO_EXTEND)
7895 #endif
7896             {
7897               /* On many CISC machines, accessing an object in a wider mode
7898                  causes the high-order bits to become undefined.  So they are
7899                  not known to be zero.  */
7900               if (GET_MODE_SIZE (GET_MODE (x))
7901                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
7902                 nonzero |= (GET_MODE_MASK (GET_MODE (x))
7903                             & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x))));
7904             }
7905         }
7906       break;
7907
7908     case ASHIFTRT:
7909     case LSHIFTRT:
7910     case ASHIFT:
7911     case ROTATE:
7912       /* The nonzero bits are in two classes: any bits within MODE
7913          that aren't in GET_MODE (x) are always significant.  The rest of the
7914          nonzero bits are those that are significant in the operand of
7915          the shift when shifted the appropriate number of bits.  This
7916          shows that high-order bits are cleared by the right shift and
7917          low-order bits by left shifts.  */
7918       if (GET_CODE (XEXP (x, 1)) == CONST_INT
7919           && INTVAL (XEXP (x, 1)) >= 0
7920           && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT)
7921         {
7922           enum machine_mode inner_mode = GET_MODE (x);
7923           int width = GET_MODE_BITSIZE (inner_mode);
7924           int count = INTVAL (XEXP (x, 1));
7925           unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode);
7926           unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode);
7927           unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask;
7928           unsigned HOST_WIDE_INT outer = 0;
7929
7930           if (mode_width > width)
7931             outer = (op_nonzero & nonzero & ~ mode_mask);
7932
7933           if (code == LSHIFTRT)
7934             inner >>= count;
7935           else if (code == ASHIFTRT)
7936             {
7937               inner >>= count;
7938
7939               /* If the sign bit may have been nonzero before the shift, we
7940                  need to mark all the places it could have been copied to
7941                  by the shift as possibly nonzero.  */
7942               if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count)))
7943                 inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count);
7944             }
7945           else if (code == ASHIFT)
7946             inner <<= count;
7947           else
7948             inner = ((inner << (count % width)
7949                       | (inner >> (width - (count % width)))) & mode_mask);
7950
7951           nonzero &= (outer | inner);
7952         }
7953       break;
7954
7955     case FFS:
7956       /* This is at most the number of bits in the mode.  */
7957       nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1;
7958       break;
7959
7960     case IF_THEN_ELSE:
7961       nonzero &= (nonzero_bits (XEXP (x, 1), mode)
7962                   | nonzero_bits (XEXP (x, 2), mode));
7963       break;
7964       
7965     default:
7966       break;
7967     }
7968
7969   return nonzero;
7970 }
7971
7972 /* See the macro definition above.  */
7973 #undef num_sign_bit_copies
7974 \f
7975 /* Return the number of bits at the high-order end of X that are known to
7976    be equal to the sign bit.  X will be used in mode MODE; if MODE is
7977    VOIDmode, X will be used in its own mode.  The returned value  will always
7978    be between 1 and the number of bits in MODE.  */
7979
7980 static int
7981 num_sign_bit_copies (x, mode)
7982      rtx x;
7983      enum machine_mode mode;
7984 {
7985   enum rtx_code code = GET_CODE (x);
7986   int bitwidth;
7987   int num0, num1, result;
7988   unsigned HOST_WIDE_INT nonzero;
7989   rtx tem;
7990
7991   /* If we weren't given a mode, use the mode of X.  If the mode is still
7992      VOIDmode, we don't know anything.  Likewise if one of the modes is
7993      floating-point.  */
7994
7995   if (mode == VOIDmode)
7996     mode = GET_MODE (x);
7997
7998   if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x)))
7999     return 1;
8000
8001   bitwidth = GET_MODE_BITSIZE (mode);
8002
8003   /* For a smaller object, just ignore the high bits.  */
8004   if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x)))
8005     return MAX (1, (num_sign_bit_copies (x, GET_MODE (x))
8006                     - (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth)));
8007      
8008   if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x)))
8009     {
8010 #ifndef WORD_REGISTER_OPERATIONS
8011   /* If this machine does not do all register operations on the entire
8012      register and MODE is wider than the mode of X, we can say nothing
8013      at all about the high-order bits.  */
8014       return 1;
8015 #else
8016       /* Likewise on machines that do, if the mode of the object is smaller
8017          than a word and loads of that size don't sign extend, we can say
8018          nothing about the high order bits.  */
8019       if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD
8020 #ifdef LOAD_EXTEND_OP
8021           && LOAD_EXTEND_OP (GET_MODE (x)) != SIGN_EXTEND
8022 #endif
8023           )
8024         return 1;
8025 #endif
8026     }
8027
8028   switch (code)
8029     {
8030     case REG:
8031
8032 #ifdef POINTERS_EXTEND_UNSIGNED
8033       /* If pointers extend signed and this is a pointer in Pmode, say that
8034          all the bits above ptr_mode are known to be sign bit copies.  */
8035       if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode
8036           && REGNO_POINTER_FLAG (REGNO (x)))
8037         return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1;
8038 #endif
8039
8040       if (reg_last_set_value[REGNO (x)] != 0
8041           && reg_last_set_mode[REGNO (x)] == mode
8042           && (reg_last_set_label[REGNO (x)] == label_tick
8043               || (REGNO (x) >= FIRST_PSEUDO_REGISTER
8044                   && REG_N_SETS (REGNO (x)) == 1
8045                   && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start,
8046                                         REGNO (x))))
8047           && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid)
8048         return reg_last_set_sign_bit_copies[REGNO (x)];
8049
8050       tem =  get_last_value (x);
8051       if (tem != 0)
8052         return num_sign_bit_copies (tem, mode);
8053
8054       if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0)
8055         return reg_sign_bit_copies[REGNO (x)];
8056       break;
8057
8058     case MEM:
8059 #ifdef LOAD_EXTEND_OP
8060       /* Some RISC machines sign-extend all loads of smaller than a word.  */
8061       if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND)
8062         return MAX (1, bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1);
8063 #endif
8064       break;
8065
8066     case CONST_INT:
8067       /* If the constant is negative, take its 1's complement and remask.
8068          Then see how many zero bits we have.  */
8069       nonzero = INTVAL (x) & GET_MODE_MASK (mode);
8070       if (bitwidth <= HOST_BITS_PER_WIDE_INT
8071           && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8072         nonzero = (~ nonzero) & GET_MODE_MASK (mode);
8073
8074       return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1);
8075
8076     case SUBREG:
8077       /* If this is a SUBREG for a promoted object that is sign-extended
8078          and we are looking at it in a wider mode, we know that at least the
8079          high-order bits are known to be sign bit copies.  */
8080
8081       if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x))
8082         return MAX (bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1,
8083                     num_sign_bit_copies (SUBREG_REG (x), mode));
8084
8085       /* For a smaller object, just ignore the high bits.  */
8086       if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))))
8087         {
8088           num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode);
8089           return MAX (1, (num0
8090                           - (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))
8091                              - bitwidth)));
8092         }
8093
8094 #ifdef WORD_REGISTER_OPERATIONS
8095 #ifdef LOAD_EXTEND_OP
8096       /* For paradoxical SUBREGs on machines where all register operations
8097          affect the entire register, just look inside.  Note that we are
8098          passing MODE to the recursive call, so the number of sign bit copies
8099          will remain relative to that mode, not the inner mode.  */
8100
8101       /* This works only if loads sign extend.  Otherwise, if we get a
8102          reload for the inner part, it may be loaded from the stack, and
8103          then we lose all sign bit copies that existed before the store
8104          to the stack.  */
8105
8106       if ((GET_MODE_SIZE (GET_MODE (x))
8107            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
8108           && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND)
8109         return num_sign_bit_copies (SUBREG_REG (x), mode);
8110 #endif
8111 #endif
8112       break;
8113
8114     case SIGN_EXTRACT:
8115       if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8116         return MAX (1, bitwidth - INTVAL (XEXP (x, 1)));
8117       break;
8118
8119     case SIGN_EXTEND: 
8120       return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8121               + num_sign_bit_copies (XEXP (x, 0), VOIDmode));
8122
8123     case TRUNCATE:
8124       /* For a smaller object, just ignore the high bits.  */
8125       num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode);
8126       return MAX (1, (num0 - (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))
8127                               - bitwidth)));
8128
8129     case NOT:
8130       return num_sign_bit_copies (XEXP (x, 0), mode);
8131
8132     case ROTATE:       case ROTATERT:
8133       /* If we are rotating left by a number of bits less than the number
8134          of sign bit copies, we can just subtract that amount from the
8135          number.  */
8136       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8137           && INTVAL (XEXP (x, 1)) >= 0 && INTVAL (XEXP (x, 1)) < bitwidth)
8138         {
8139           num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8140           return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1))
8141                                  : bitwidth - INTVAL (XEXP (x, 1))));
8142         }
8143       break;
8144
8145     case NEG:
8146       /* In general, this subtracts one sign bit copy.  But if the value
8147          is known to be positive, the number of sign bit copies is the
8148          same as that of the input.  Finally, if the input has just one bit
8149          that might be nonzero, all the bits are copies of the sign bit.  */
8150       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8151       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8152         return num0 > 1 ? num0 - 1 : 1;
8153
8154       nonzero = nonzero_bits (XEXP (x, 0), mode);
8155       if (nonzero == 1)
8156         return bitwidth;
8157
8158       if (num0 > 1
8159           && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero))
8160         num0--;
8161
8162       return num0;
8163
8164     case IOR:   case AND:   case XOR:
8165     case SMIN:  case SMAX:  case UMIN:  case UMAX:
8166       /* Logical operations will preserve the number of sign-bit copies.
8167          MIN and MAX operations always return one of the operands.  */
8168       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8169       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8170       return MIN (num0, num1);
8171
8172     case PLUS:  case MINUS:
8173       /* For addition and subtraction, we can have a 1-bit carry.  However,
8174          if we are subtracting 1 from a positive number, there will not
8175          be such a carry.  Furthermore, if the positive number is known to
8176          be 0 or 1, we know the result is either -1 or 0.  */
8177
8178       if (code == PLUS && XEXP (x, 1) == constm1_rtx
8179           && bitwidth <= HOST_BITS_PER_WIDE_INT)
8180         {
8181           nonzero = nonzero_bits (XEXP (x, 0), mode);
8182           if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0)
8183             return (nonzero == 1 || nonzero == 0 ? bitwidth
8184                     : bitwidth - floor_log2 (nonzero) - 1);
8185         }
8186
8187       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8188       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8189       return MAX (1, MIN (num0, num1) - 1);
8190       
8191     case MULT:
8192       /* The number of bits of the product is the sum of the number of
8193          bits of both terms.  However, unless one of the terms if known
8194          to be positive, we must allow for an additional bit since negating
8195          a negative number can remove one sign bit copy.  */
8196
8197       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8198       num1 = num_sign_bit_copies (XEXP (x, 1), mode);
8199
8200       result = bitwidth - (bitwidth - num0) - (bitwidth - num1);
8201       if (result > 0
8202           && (bitwidth > HOST_BITS_PER_WIDE_INT
8203               || (((nonzero_bits (XEXP (x, 0), mode)
8204                     & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8205                   && ((nonzero_bits (XEXP (x, 1), mode)
8206                        & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))))
8207         result--;
8208
8209       return MAX (1, result);
8210
8211     case UDIV:
8212       /* The result must be <= the first operand.  If the first operand
8213          has the high bit set, we know nothing about the number of sign
8214          bit copies.  */
8215       if (bitwidth > HOST_BITS_PER_WIDE_INT)
8216         return 1;
8217       else if ((nonzero_bits (XEXP (x, 0), mode)
8218                 & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0)
8219         return 1;
8220       else
8221         return num_sign_bit_copies (XEXP (x, 0), mode);
8222                                     
8223     case UMOD:
8224       /* The result must be <= the scond operand.  */
8225       return num_sign_bit_copies (XEXP (x, 1), mode);
8226
8227     case DIV:
8228       /* Similar to unsigned division, except that we have to worry about
8229          the case where the divisor is negative, in which case we have
8230          to add 1.  */
8231       result = num_sign_bit_copies (XEXP (x, 0), mode);
8232       if (result > 1
8233           && (bitwidth > HOST_BITS_PER_WIDE_INT
8234               || (nonzero_bits (XEXP (x, 1), mode)
8235                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8236         result--;
8237
8238       return result;
8239
8240     case MOD:
8241       result = num_sign_bit_copies (XEXP (x, 1), mode);
8242       if (result > 1
8243           && (bitwidth > HOST_BITS_PER_WIDE_INT
8244               || (nonzero_bits (XEXP (x, 1), mode)
8245                   & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0))
8246         result--;
8247
8248       return result;
8249
8250     case ASHIFTRT:
8251       /* Shifts by a constant add to the number of bits equal to the
8252          sign bit.  */
8253       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8254       if (GET_CODE (XEXP (x, 1)) == CONST_INT
8255           && INTVAL (XEXP (x, 1)) > 0)
8256         num0 = MIN (bitwidth, num0 + INTVAL (XEXP (x, 1)));
8257
8258       return num0;
8259
8260     case ASHIFT:
8261       /* Left shifts destroy copies.  */
8262       if (GET_CODE (XEXP (x, 1)) != CONST_INT
8263           || INTVAL (XEXP (x, 1)) < 0
8264           || INTVAL (XEXP (x, 1)) >= bitwidth)
8265         return 1;
8266
8267       num0 = num_sign_bit_copies (XEXP (x, 0), mode);
8268       return MAX (1, num0 - INTVAL (XEXP (x, 1)));
8269
8270     case IF_THEN_ELSE:
8271       num0 = num_sign_bit_copies (XEXP (x, 1), mode);
8272       num1 = num_sign_bit_copies (XEXP (x, 2), mode);
8273       return MIN (num0, num1);
8274
8275     case EQ:  case NE:  case GE:  case GT:  case LE:  case LT:
8276     case GEU: case GTU: case LEU: case LTU:
8277       if (STORE_FLAG_VALUE == -1)
8278         return bitwidth;
8279       break;
8280       
8281     default:
8282       break;
8283     }
8284
8285   /* If we haven't been able to figure it out by one of the above rules,
8286      see if some of the high-order bits are known to be zero.  If so,
8287      count those bits and return one less than that amount.  If we can't
8288      safely compute the mask for this mode, always return BITWIDTH.  */
8289
8290   if (bitwidth > HOST_BITS_PER_WIDE_INT)
8291     return 1;
8292
8293   nonzero = nonzero_bits (x, mode);
8294   return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))
8295           ? 1 : bitwidth - floor_log2 (nonzero) - 1);
8296 }
8297 \f
8298 /* Return the number of "extended" bits there are in X, when interpreted
8299    as a quantity in MODE whose signedness is indicated by UNSIGNEDP.  For
8300    unsigned quantities, this is the number of high-order zero bits.
8301    For signed quantities, this is the number of copies of the sign bit
8302    minus 1.  In both case, this function returns the number of "spare"
8303    bits.  For example, if two quantities for which this function returns
8304    at least 1 are added, the addition is known not to overflow.
8305
8306    This function will always return 0 unless called during combine, which
8307    implies that it must be called from a define_split.  */
8308
8309 int
8310 extended_count (x, mode, unsignedp)
8311      rtx x;
8312      enum machine_mode mode;
8313      int unsignedp;
8314 {
8315   if (nonzero_sign_valid == 0)
8316     return 0;
8317
8318   return (unsignedp
8319           ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
8320              && (GET_MODE_BITSIZE (mode) - 1
8321                  - floor_log2 (nonzero_bits (x, mode))))
8322           : num_sign_bit_copies (x, mode) - 1);
8323 }
8324 \f
8325 /* This function is called from `simplify_shift_const' to merge two
8326    outer operations.  Specifically, we have already found that we need
8327    to perform operation *POP0 with constant *PCONST0 at the outermost
8328    position.  We would now like to also perform OP1 with constant CONST1
8329    (with *POP0 being done last).
8330
8331    Return 1 if we can do the operation and update *POP0 and *PCONST0 with
8332    the resulting operation.  *PCOMP_P is set to 1 if we would need to 
8333    complement the innermost operand, otherwise it is unchanged.
8334
8335    MODE is the mode in which the operation will be done.  No bits outside
8336    the width of this mode matter.  It is assumed that the width of this mode
8337    is smaller than or equal to HOST_BITS_PER_WIDE_INT.
8338
8339    If *POP0 or OP1 are NIL, it means no operation is required.  Only NEG, PLUS,
8340    IOR, XOR, and AND are supported.  We may set *POP0 to SET if the proper
8341    result is simply *PCONST0.
8342
8343    If the resulting operation cannot be expressed as one operation, we
8344    return 0 and do not change *POP0, *PCONST0, and *PCOMP_P.  */
8345
8346 static int
8347 merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p)
8348      enum rtx_code *pop0;
8349      HOST_WIDE_INT *pconst0;
8350      enum rtx_code op1;
8351      HOST_WIDE_INT const1;
8352      enum machine_mode mode;
8353      int *pcomp_p;
8354 {
8355   enum rtx_code op0 = *pop0;
8356   HOST_WIDE_INT const0 = *pconst0;
8357
8358   const0 &= GET_MODE_MASK (mode);
8359   const1 &= GET_MODE_MASK (mode);
8360
8361   /* If OP0 is an AND, clear unimportant bits in CONST1.  */
8362   if (op0 == AND)
8363     const1 &= const0;
8364
8365   /* If OP0 or OP1 is NIL, this is easy.  Similarly if they are the same or
8366      if OP0 is SET.  */
8367
8368   if (op1 == NIL || op0 == SET)
8369     return 1;
8370
8371   else if (op0 == NIL)
8372     op0 = op1, const0 = const1;
8373
8374   else if (op0 == op1)
8375     {
8376       switch (op0)
8377         {
8378         case AND:
8379           const0 &= const1;
8380           break;
8381         case IOR:
8382           const0 |= const1;
8383           break;
8384         case XOR:
8385           const0 ^= const1;
8386           break;
8387         case PLUS:
8388           const0 += const1;
8389           break;
8390         case NEG:
8391           op0 = NIL;
8392           break;
8393         default:
8394           break;
8395         }
8396     }
8397
8398   /* Otherwise, if either is a PLUS or NEG, we can't do anything.  */
8399   else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG)
8400     return 0;
8401
8402   /* If the two constants aren't the same, we can't do anything.  The
8403      remaining six cases can all be done.  */
8404   else if (const0 != const1)
8405     return 0;
8406
8407   else
8408     switch (op0)
8409       {
8410       case IOR:
8411         if (op1 == AND)
8412           /* (a & b) | b == b */
8413           op0 = SET;
8414         else /* op1 == XOR */
8415           /* (a ^ b) | b == a | b */
8416           {;}
8417         break;
8418
8419       case XOR:
8420         if (op1 == AND)
8421           /* (a & b) ^ b == (~a) & b */
8422           op0 = AND, *pcomp_p = 1;
8423         else /* op1 == IOR */
8424           /* (a | b) ^ b == a & ~b */
8425           op0 = AND, *pconst0 = ~ const0;
8426         break;
8427
8428       case AND:
8429         if (op1 == IOR)
8430           /* (a | b) & b == b */
8431         op0 = SET;
8432         else /* op1 == XOR */
8433           /* (a ^ b) & b) == (~a) & b */
8434           *pcomp_p = 1;
8435         break;
8436       default:
8437         break;
8438       }
8439
8440   /* Check for NO-OP cases.  */
8441   const0 &= GET_MODE_MASK (mode);
8442   if (const0 == 0
8443       && (op0 == IOR || op0 == XOR || op0 == PLUS))
8444     op0 = NIL;
8445   else if (const0 == 0 && op0 == AND)
8446     op0 = SET;
8447   else if ((unsigned HOST_WIDE_INT) const0 == GET_MODE_MASK (mode)
8448            && op0 == AND)
8449     op0 = NIL;
8450
8451   /* ??? Slightly redundant with the above mask, but not entirely.
8452      Moving this above means we'd have to sign-extend the mode mask
8453      for the final test.  */
8454   const0 = trunc_int_for_mode (const0, mode);
8455
8456   *pop0 = op0;
8457   *pconst0 = const0;
8458
8459   return 1;
8460 }
8461 \f
8462 /* Simplify a shift of VAROP by COUNT bits.  CODE says what kind of shift.
8463    The result of the shift is RESULT_MODE.  X, if non-zero, is an expression
8464    that we started with.
8465
8466    The shift is normally computed in the widest mode we find in VAROP, as
8467    long as it isn't a different number of words than RESULT_MODE.  Exceptions
8468    are ASHIFTRT and ROTATE, which are always done in their original mode,  */
8469
8470 static rtx
8471 simplify_shift_const (x, code, result_mode, varop, count)
8472      rtx x;
8473      enum rtx_code code;
8474      enum machine_mode result_mode;
8475      rtx varop;
8476      int count;
8477 {
8478   enum rtx_code orig_code = code;
8479   int orig_count = count;
8480   enum machine_mode mode = result_mode;
8481   enum machine_mode shift_mode, tmode;
8482   int mode_words
8483     = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
8484   /* We form (outer_op (code varop count) (outer_const)).  */
8485   enum rtx_code outer_op = NIL;
8486   HOST_WIDE_INT outer_const = 0;
8487   rtx const_rtx;
8488   int complement_p = 0;
8489   rtx new;
8490
8491   /* If we were given an invalid count, don't do anything except exactly
8492      what was requested.  */
8493
8494   if (count < 0 || count > GET_MODE_BITSIZE (mode))
8495     {
8496       if (x)
8497         return x;
8498
8499       return gen_rtx_fmt_ee (code, mode, varop, GEN_INT (count));
8500     }
8501
8502   /* Unless one of the branches of the `if' in this loop does a `continue',
8503      we will `break' the loop after the `if'.  */
8504
8505   while (count != 0)
8506     {
8507       /* If we have an operand of (clobber (const_int 0)), just return that
8508          value.  */
8509       if (GET_CODE (varop) == CLOBBER)
8510         return varop;
8511
8512       /* If we discovered we had to complement VAROP, leave.  Making a NOT
8513          here would cause an infinite loop.  */
8514       if (complement_p)
8515         break;
8516
8517       /* Convert ROTATERT to ROTATE.  */
8518       if (code == ROTATERT)
8519         code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count;
8520
8521       /* We need to determine what mode we will do the shift in.  If the
8522          shift is a right shift or a ROTATE, we must always do it in the mode
8523          it was originally done in.  Otherwise, we can do it in MODE, the
8524          widest mode encountered.  */
8525       shift_mode
8526         = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
8527            ? result_mode : mode);
8528
8529       /* Handle cases where the count is greater than the size of the mode
8530          minus 1.  For ASHIFT, use the size minus one as the count (this can
8531          occur when simplifying (lshiftrt (ashiftrt ..))).  For rotates,
8532          take the count modulo the size.  For other shifts, the result is
8533          zero.
8534
8535          Since these shifts are being produced by the compiler by combining
8536          multiple operations, each of which are defined, we know what the
8537          result is supposed to be.  */
8538          
8539       if (count > GET_MODE_BITSIZE (shift_mode) - 1)
8540         {
8541           if (code == ASHIFTRT)
8542             count = GET_MODE_BITSIZE (shift_mode) - 1;
8543           else if (code == ROTATE || code == ROTATERT)
8544             count %= GET_MODE_BITSIZE (shift_mode);
8545           else
8546             {
8547               /* We can't simply return zero because there may be an
8548                  outer op.  */
8549               varop = const0_rtx;
8550               count = 0;
8551               break;
8552             }
8553         }
8554
8555       /* Negative counts are invalid and should not have been made (a
8556          programmer-specified negative count should have been handled
8557          above).  */
8558       else if (count < 0)
8559         abort ();
8560
8561       /* An arithmetic right shift of a quantity known to be -1 or 0
8562          is a no-op.  */
8563       if (code == ASHIFTRT
8564           && (num_sign_bit_copies (varop, shift_mode)
8565               == GET_MODE_BITSIZE (shift_mode)))
8566         {
8567           count = 0;
8568           break;
8569         }
8570
8571       /* If we are doing an arithmetic right shift and discarding all but
8572          the sign bit copies, this is equivalent to doing a shift by the
8573          bitsize minus one.  Convert it into that shift because it will often
8574          allow other simplifications.  */
8575
8576       if (code == ASHIFTRT
8577           && (count + num_sign_bit_copies (varop, shift_mode)
8578               >= GET_MODE_BITSIZE (shift_mode)))
8579         count = GET_MODE_BITSIZE (shift_mode) - 1;
8580
8581       /* We simplify the tests below and elsewhere by converting
8582          ASHIFTRT to LSHIFTRT if we know the sign bit is clear.
8583          `make_compound_operation' will convert it to a ASHIFTRT for
8584          those machines (such as Vax) that don't have a LSHIFTRT.  */
8585       if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT
8586           && code == ASHIFTRT
8587           && ((nonzero_bits (varop, shift_mode)
8588                & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1)))
8589               == 0))
8590         code = LSHIFTRT;
8591
8592       switch (GET_CODE (varop))
8593         {
8594         case SIGN_EXTEND:
8595         case ZERO_EXTEND:
8596         case SIGN_EXTRACT:
8597         case ZERO_EXTRACT:
8598           new = expand_compound_operation (varop);
8599           if (new != varop)
8600             {
8601               varop = new;
8602               continue;
8603             }
8604           break;
8605
8606         case MEM:
8607           /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH
8608              minus the width of a smaller mode, we can do this with a
8609              SIGN_EXTEND or ZERO_EXTEND from the narrower memory location.  */
8610           if ((code == ASHIFTRT || code == LSHIFTRT)
8611               && ! mode_dependent_address_p (XEXP (varop, 0))
8612               && ! MEM_VOLATILE_P (varop)
8613               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8614                                          MODE_INT, 1)) != BLKmode)
8615             {
8616               if (BYTES_BIG_ENDIAN)
8617                 new = gen_rtx_MEM (tmode, XEXP (varop, 0));
8618               else
8619                 new = gen_rtx_MEM (tmode,
8620                                    plus_constant (XEXP (varop, 0),
8621                                                   count / BITS_PER_UNIT));
8622               RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (varop);
8623               MEM_COPY_ATTRIBUTES (new, varop);
8624               varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
8625                                        : ZERO_EXTEND, mode, new);
8626               count = 0;
8627               continue;
8628             }
8629           break;
8630
8631         case USE:
8632           /* Similar to the case above, except that we can only do this if
8633              the resulting mode is the same as that of the underlying
8634              MEM and adjust the address depending on the *bits* endianness
8635              because of the way that bit-field extract insns are defined.  */
8636           if ((code == ASHIFTRT || code == LSHIFTRT)
8637               && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count,
8638                                          MODE_INT, 1)) != BLKmode
8639               && tmode == GET_MODE (XEXP (varop, 0)))
8640             {
8641               if (BITS_BIG_ENDIAN)
8642                 new = XEXP (varop, 0);
8643               else
8644                 {
8645                   new = copy_rtx (XEXP (varop, 0));
8646                   SUBST (XEXP (new, 0), 
8647                          plus_constant (XEXP (new, 0),
8648                                         count / BITS_PER_UNIT));
8649                 }
8650
8651               varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND
8652                                        : ZERO_EXTEND, mode, new);
8653               count = 0;
8654               continue;
8655             }
8656           break;
8657
8658         case SUBREG:
8659           /* If VAROP is a SUBREG, strip it as long as the inner operand has
8660              the same number of words as what we've seen so far.  Then store
8661              the widest mode in MODE.  */
8662           if (subreg_lowpart_p (varop)
8663               && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8664                   > GET_MODE_SIZE (GET_MODE (varop)))
8665               && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop)))
8666                     + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
8667                   == mode_words))
8668             {
8669               varop = SUBREG_REG (varop);
8670               if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode))
8671                 mode = GET_MODE (varop);
8672               continue;
8673             }
8674           break;
8675
8676         case MULT:
8677           /* Some machines use MULT instead of ASHIFT because MULT
8678              is cheaper.  But it is still better on those machines to
8679              merge two shifts into one.  */
8680           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8681               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8682             {
8683               varop = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0),
8684                                   GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
8685               continue;
8686             }
8687           break;
8688
8689         case UDIV:
8690           /* Similar, for when divides are cheaper.  */
8691           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8692               && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0)
8693             {
8694               varop = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0),
8695                                   GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));
8696               continue;
8697             }
8698           break;
8699
8700         case ASHIFTRT:
8701           /* If we are extracting just the sign bit of an arithmetic right 
8702              shift, that shift is not needed.  */
8703           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1)
8704             {
8705               varop = XEXP (varop, 0);
8706               continue;
8707             }
8708
8709           /* ... fall through ...  */
8710
8711         case LSHIFTRT:
8712         case ASHIFT:
8713         case ROTATE:
8714           /* Here we have two nested shifts.  The result is usually the
8715              AND of a new shift with a mask.  We compute the result below.  */
8716           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8717               && INTVAL (XEXP (varop, 1)) >= 0
8718               && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop))
8719               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
8720               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
8721             {
8722               enum rtx_code first_code = GET_CODE (varop);
8723               int first_count = INTVAL (XEXP (varop, 1));
8724               unsigned HOST_WIDE_INT mask;
8725               rtx mask_rtx;
8726
8727               /* We have one common special case.  We can't do any merging if
8728                  the inner code is an ASHIFTRT of a smaller mode.  However, if
8729                  we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2)
8730                  with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2),
8731                  we can convert it to
8732                  (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1).
8733                  This simplifies certain SIGN_EXTEND operations.  */
8734               if (code == ASHIFT && first_code == ASHIFTRT
8735                   && (GET_MODE_BITSIZE (result_mode)
8736                       - GET_MODE_BITSIZE (GET_MODE (varop))) == count)
8737                 {
8738                   /* C3 has the low-order C1 bits zero.  */
8739                   
8740                   mask = (GET_MODE_MASK (mode)
8741                           & ~ (((HOST_WIDE_INT) 1 << first_count) - 1));
8742
8743                   varop = simplify_and_const_int (NULL_RTX, result_mode,
8744                                                   XEXP (varop, 0), mask);
8745                   varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode,
8746                                                 varop, count);
8747                   count = first_count;
8748                   code = ASHIFTRT;
8749                   continue;
8750                 }
8751               
8752               /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more
8753                  than C1 high-order bits equal to the sign bit, we can convert
8754                  this to either an ASHIFT or a ASHIFTRT depending on the
8755                  two counts. 
8756
8757                  We cannot do this if VAROP's mode is not SHIFT_MODE.  */
8758
8759               if (code == ASHIFTRT && first_code == ASHIFT
8760                   && GET_MODE (varop) == shift_mode
8761                   && (num_sign_bit_copies (XEXP (varop, 0), shift_mode)
8762                       > first_count))
8763                 {
8764                   count -= first_count;
8765                   if (count < 0)
8766                     count = - count, code = ASHIFT;
8767                   varop = XEXP (varop, 0);
8768                   continue;
8769                 }
8770
8771               /* There are some cases we can't do.  If CODE is ASHIFTRT,
8772                  we can only do this if FIRST_CODE is also ASHIFTRT.
8773
8774                  We can't do the case when CODE is ROTATE and FIRST_CODE is
8775                  ASHIFTRT.
8776
8777                  If the mode of this shift is not the mode of the outer shift,
8778                  we can't do this if either shift is a right shift or ROTATE.
8779
8780                  Finally, we can't do any of these if the mode is too wide
8781                  unless the codes are the same.
8782
8783                  Handle the case where the shift codes are the same
8784                  first.  */
8785
8786               if (code == first_code)
8787                 {
8788                   if (GET_MODE (varop) != result_mode
8789                       && (code == ASHIFTRT || code == LSHIFTRT
8790                           || code == ROTATE))
8791                     break;
8792
8793                   count += first_count;
8794                   varop = XEXP (varop, 0);
8795                   continue;
8796                 }
8797
8798               if (code == ASHIFTRT
8799                   || (code == ROTATE && first_code == ASHIFTRT)
8800                   || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT
8801                   || (GET_MODE (varop) != result_mode
8802                       && (first_code == ASHIFTRT || first_code == LSHIFTRT
8803                           || first_code == ROTATE
8804                           || code == ROTATE)))
8805                 break;
8806
8807               /* To compute the mask to apply after the shift, shift the
8808                  nonzero bits of the inner shift the same way the 
8809                  outer shift will.  */
8810
8811               mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop)));
8812
8813               mask_rtx
8814                 = simplify_binary_operation (code, result_mode, mask_rtx,
8815                                              GEN_INT (count));
8816                                   
8817               /* Give up if we can't compute an outer operation to use.  */
8818               if (mask_rtx == 0
8819                   || GET_CODE (mask_rtx) != CONST_INT
8820                   || ! merge_outer_ops (&outer_op, &outer_const, AND,
8821                                         INTVAL (mask_rtx),
8822                                         result_mode, &complement_p))
8823                 break;
8824
8825               /* If the shifts are in the same direction, we add the
8826                  counts.  Otherwise, we subtract them.  */
8827               if ((code == ASHIFTRT || code == LSHIFTRT)
8828                   == (first_code == ASHIFTRT || first_code == LSHIFTRT))
8829                 count += first_count;
8830               else
8831                 count -= first_count;
8832
8833               /* If COUNT is positive, the new shift is usually CODE, 
8834                  except for the two exceptions below, in which case it is
8835                  FIRST_CODE.  If the count is negative, FIRST_CODE should
8836                  always be used  */
8837               if (count > 0
8838                   && ((first_code == ROTATE && code == ASHIFT)
8839                       || (first_code == ASHIFTRT && code == LSHIFTRT)))
8840                 code = first_code;
8841               else if (count < 0)
8842                 code = first_code, count = - count;
8843
8844               varop = XEXP (varop, 0);
8845               continue;
8846             }
8847
8848           /* If we have (A << B << C) for any shift, we can convert this to
8849              (A << C << B).  This wins if A is a constant.  Only try this if
8850              B is not a constant.  */
8851
8852           else if (GET_CODE (varop) == code
8853                    && GET_CODE (XEXP (varop, 1)) != CONST_INT
8854                    && 0 != (new
8855                             = simplify_binary_operation (code, mode,
8856                                                          XEXP (varop, 0),
8857                                                          GEN_INT (count))))
8858             {
8859               varop = gen_rtx_combine (code, mode, new, XEXP (varop, 1));
8860               count = 0;
8861               continue;
8862             }
8863           break;
8864
8865         case NOT:
8866           /* Make this fit the case below.  */
8867           varop = gen_rtx_combine (XOR, mode, XEXP (varop, 0),
8868                                    GEN_INT (GET_MODE_MASK (mode)));
8869           continue;
8870
8871         case IOR:
8872         case AND:
8873         case XOR:
8874           /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C)
8875              with C the size of VAROP - 1 and the shift is logical if
8876              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
8877              we have an (le X 0) operation.   If we have an arithmetic shift
8878              and STORE_FLAG_VALUE is 1 or we have a logical shift with
8879              STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation.  */
8880
8881           if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS
8882               && XEXP (XEXP (varop, 0), 1) == constm1_rtx
8883               && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
8884               && (code == LSHIFTRT || code == ASHIFTRT)
8885               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
8886               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
8887             {
8888               count = 0;
8889               varop = gen_rtx_combine (LE, GET_MODE (varop), XEXP (varop, 1),
8890                                        const0_rtx);
8891
8892               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
8893                 varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
8894
8895               continue;
8896             }
8897
8898           /* If we have (shift (logical)), move the logical to the outside
8899              to allow it to possibly combine with another logical and the
8900              shift to combine with another shift.  This also canonicalizes to
8901              what a ZERO_EXTRACT looks like.  Also, some machines have
8902              (and (shift)) insns.  */
8903
8904           if (GET_CODE (XEXP (varop, 1)) == CONST_INT
8905               && (new = simplify_binary_operation (code, result_mode,
8906                                                    XEXP (varop, 1),
8907                                                    GEN_INT (count))) != 0
8908               && GET_CODE(new) == CONST_INT
8909               && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop),
8910                                   INTVAL (new), result_mode, &complement_p))
8911             {
8912               varop = XEXP (varop, 0);
8913               continue;
8914             }
8915
8916           /* If we can't do that, try to simplify the shift in each arm of the
8917              logical expression, make a new logical expression, and apply
8918              the inverse distributive law.  */
8919           {
8920             rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode,
8921                                             XEXP (varop, 0), count);
8922             rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode,
8923                                             XEXP (varop, 1), count);
8924
8925             varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs);
8926             varop = apply_distributive_law (varop);
8927
8928             count = 0;
8929           }
8930           break;
8931
8932         case EQ:
8933           /* convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE
8934              says that the sign bit can be tested, FOO has mode MODE, C is
8935              GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit
8936              that may be nonzero.  */
8937           if (code == LSHIFTRT
8938               && XEXP (varop, 1) == const0_rtx
8939               && GET_MODE (XEXP (varop, 0)) == result_mode
8940               && count == GET_MODE_BITSIZE (result_mode) - 1
8941               && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
8942               && ((STORE_FLAG_VALUE
8943                    & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1))))
8944               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
8945               && merge_outer_ops (&outer_op, &outer_const, XOR,
8946                                   (HOST_WIDE_INT) 1, result_mode,
8947                                   &complement_p))
8948             {
8949               varop = XEXP (varop, 0);
8950               count = 0;
8951               continue;
8952             }
8953           break;
8954
8955         case NEG:
8956           /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less
8957              than the number of bits in the mode is equivalent to A.  */
8958           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
8959               && nonzero_bits (XEXP (varop, 0), result_mode) == 1)
8960             {
8961               varop = XEXP (varop, 0);
8962               count = 0;
8963               continue;
8964             }
8965
8966           /* NEG commutes with ASHIFT since it is multiplication.  Move the
8967              NEG outside to allow shifts to combine.  */
8968           if (code == ASHIFT
8969               && merge_outer_ops (&outer_op, &outer_const, NEG,
8970                                   (HOST_WIDE_INT) 0, result_mode,
8971                                   &complement_p))
8972             {
8973               varop = XEXP (varop, 0);
8974               continue;
8975             }
8976           break;
8977
8978         case PLUS:
8979           /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C
8980              is one less than the number of bits in the mode is
8981              equivalent to (xor A 1).  */
8982           if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1
8983               && XEXP (varop, 1) == constm1_rtx
8984               && nonzero_bits (XEXP (varop, 0), result_mode) == 1
8985               && merge_outer_ops (&outer_op, &outer_const, XOR,
8986                                   (HOST_WIDE_INT) 1, result_mode,
8987                                   &complement_p))
8988             {
8989               count = 0;
8990               varop = XEXP (varop, 0);
8991               continue;
8992             }
8993
8994           /* If we have (xshiftrt (plus FOO BAR) C), and the only bits
8995              that might be nonzero in BAR are those being shifted out and those
8996              bits are known zero in FOO, we can replace the PLUS with FOO.
8997              Similarly in the other operand order.  This code occurs when
8998              we are computing the size of a variable-size array.  */
8999
9000           if ((code == ASHIFTRT || code == LSHIFTRT)
9001               && count < HOST_BITS_PER_WIDE_INT
9002               && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0
9003               && (nonzero_bits (XEXP (varop, 1), result_mode)
9004                   & nonzero_bits (XEXP (varop, 0), result_mode)) == 0)
9005             {
9006               varop = XEXP (varop, 0);
9007               continue;
9008             }
9009           else if ((code == ASHIFTRT || code == LSHIFTRT)
9010                    && count < HOST_BITS_PER_WIDE_INT
9011                    && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT
9012                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9013                             >> count)
9014                    && 0 == (nonzero_bits (XEXP (varop, 0), result_mode)
9015                             & nonzero_bits (XEXP (varop, 1),
9016                                                  result_mode)))
9017             {
9018               varop = XEXP (varop, 1);
9019               continue;
9020             }
9021
9022           /* (ashift (plus foo C) N) is (plus (ashift foo N) C').  */
9023           if (code == ASHIFT
9024               && GET_CODE (XEXP (varop, 1)) == CONST_INT
9025               && (new = simplify_binary_operation (ASHIFT, result_mode,
9026                                                    XEXP (varop, 1),
9027                                                    GEN_INT (count))) != 0
9028               && GET_CODE(new) == CONST_INT
9029               && merge_outer_ops (&outer_op, &outer_const, PLUS,
9030                                   INTVAL (new), result_mode, &complement_p))
9031             {
9032               varop = XEXP (varop, 0);
9033               continue;
9034             }
9035           break;
9036
9037         case MINUS:
9038           /* If we have (xshiftrt (minus (ashiftrt X C)) X) C)
9039              with C the size of VAROP - 1 and the shift is logical if
9040              STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1,
9041              we have a (gt X 0) operation.  If the shift is arithmetic with
9042              STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1,
9043              we have a (neg (gt X 0)) operation.  */
9044
9045           if ((STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1)
9046               && GET_CODE (XEXP (varop, 0)) == ASHIFTRT
9047               && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1
9048               && (code == LSHIFTRT || code == ASHIFTRT)
9049               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9050               && INTVAL (XEXP (XEXP (varop, 0), 1)) == count
9051               && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1)))
9052             {
9053               count = 0;
9054               varop = gen_rtx_combine (GT, GET_MODE (varop), XEXP (varop, 1),
9055                                        const0_rtx);
9056
9057               if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT)
9058                 varop = gen_rtx_combine (NEG, GET_MODE (varop), varop);
9059
9060               continue;
9061             }
9062           break;
9063
9064         case TRUNCATE:
9065           /* Change (lshiftrt (truncate (lshiftrt))) to (truncate (lshiftrt))
9066              if the truncate does not affect the value.  */
9067           if (code == LSHIFTRT
9068               && GET_CODE (XEXP (varop, 0)) == LSHIFTRT
9069               && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT
9070               && (INTVAL (XEXP (XEXP (varop, 0), 1))
9071                   >= (GET_MODE_BITSIZE (GET_MODE (XEXP (varop, 0)))
9072                       - GET_MODE_BITSIZE (GET_MODE (varop)))))
9073             {
9074               rtx varop_inner = XEXP (varop, 0);
9075
9076               varop_inner = gen_rtx_combine (LSHIFTRT,
9077                                              GET_MODE (varop_inner),
9078                                              XEXP (varop_inner, 0),
9079                                              GEN_INT (count + INTVAL (XEXP (varop_inner, 1))));
9080               varop = gen_rtx_combine (TRUNCATE, GET_MODE (varop),
9081                                        varop_inner);
9082               count = 0;
9083               continue;
9084             }
9085           break;
9086           
9087         default:
9088           break;
9089         }
9090
9091       break;
9092     }
9093
9094   /* We need to determine what mode to do the shift in.  If the shift is
9095      a right shift or ROTATE, we must always do it in the mode it was
9096      originally done in.  Otherwise, we can do it in MODE, the widest mode
9097      encountered.  The code we care about is that of the shift that will
9098      actually be done, not the shift that was originally requested.  */
9099   shift_mode
9100     = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE
9101        ? result_mode : mode);
9102
9103   /* We have now finished analyzing the shift.  The result should be
9104      a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places.  If
9105      OUTER_OP is non-NIL, it is an operation that needs to be applied
9106      to the result of the shift.  OUTER_CONST is the relevant constant,
9107      but we must turn off all bits turned off in the shift.
9108
9109      If we were passed a value for X, see if we can use any pieces of
9110      it.  If not, make new rtx.  */
9111
9112   if (x && GET_RTX_CLASS (GET_CODE (x)) == '2'
9113       && GET_CODE (XEXP (x, 1)) == CONST_INT
9114       && INTVAL (XEXP (x, 1)) == count)
9115     const_rtx = XEXP (x, 1);
9116   else
9117     const_rtx = GEN_INT (count);
9118
9119   if (x && GET_CODE (XEXP (x, 0)) == SUBREG
9120       && GET_MODE (XEXP (x, 0)) == shift_mode
9121       && SUBREG_REG (XEXP (x, 0)) == varop)
9122     varop = XEXP (x, 0);
9123   else if (GET_MODE (varop) != shift_mode)
9124     varop = gen_lowpart_for_combine (shift_mode, varop);
9125
9126   /* If we can't make the SUBREG, try to return what we were given.  */
9127   if (GET_CODE (varop) == CLOBBER)
9128     return x ? x : varop;
9129
9130   new = simplify_binary_operation (code, shift_mode, varop, const_rtx);
9131   if (new != 0)
9132     x = new;
9133   else
9134     {
9135       if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode)
9136         x = gen_rtx_combine (code, shift_mode, varop, const_rtx);
9137
9138       SUBST (XEXP (x, 0), varop);
9139       SUBST (XEXP (x, 1), const_rtx);
9140     }
9141
9142   /* If we have an outer operation and we just made a shift, it is
9143      possible that we could have simplified the shift were it not
9144      for the outer operation.  So try to do the simplification
9145      recursively.  */
9146
9147   if (outer_op != NIL && GET_CODE (x) == code
9148       && GET_CODE (XEXP (x, 1)) == CONST_INT)
9149     x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0),
9150                               INTVAL (XEXP (x, 1)));
9151
9152   /* If we were doing a LSHIFTRT in a wider mode than it was originally,
9153      turn off all the bits that the shift would have turned off.  */
9154   if (orig_code == LSHIFTRT && result_mode != shift_mode)
9155     x = simplify_and_const_int (NULL_RTX, shift_mode, x,
9156                                 GET_MODE_MASK (result_mode) >> orig_count);
9157       
9158   /* Do the remainder of the processing in RESULT_MODE.  */
9159   x = gen_lowpart_for_combine (result_mode, x);
9160
9161   /* If COMPLEMENT_P is set, we have to complement X before doing the outer
9162      operation.  */
9163   if (complement_p)
9164     x = gen_unary (NOT, result_mode, result_mode, x);
9165
9166   if (outer_op != NIL)
9167     {
9168       if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT)
9169         outer_const = trunc_int_for_mode (outer_const, result_mode);
9170
9171       if (outer_op == AND)
9172         x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const);
9173       else if (outer_op == SET)
9174         /* This means that we have determined that the result is
9175            equivalent to a constant.  This should be rare.  */
9176         x = GEN_INT (outer_const);
9177       else if (GET_RTX_CLASS (outer_op) == '1')
9178         x = gen_unary (outer_op, result_mode, result_mode, x);
9179       else
9180         x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const));
9181     }
9182
9183   return x;
9184 }  
9185 \f
9186 /* Like recog, but we receive the address of a pointer to a new pattern.
9187    We try to match the rtx that the pointer points to.
9188    If that fails, we may try to modify or replace the pattern,
9189    storing the replacement into the same pointer object.
9190
9191    Modifications include deletion or addition of CLOBBERs.
9192
9193    PNOTES is a pointer to a location where any REG_UNUSED notes added for
9194    the CLOBBERs are placed.
9195
9196    The value is the final insn code from the pattern ultimately matched,
9197    or -1.  */
9198
9199 static int
9200 recog_for_combine (pnewpat, insn, pnotes)
9201      rtx *pnewpat;
9202      rtx insn;
9203      rtx *pnotes;
9204 {
9205   register rtx pat = *pnewpat;
9206   int insn_code_number;
9207   int num_clobbers_to_add = 0;
9208   int i;
9209   rtx notes = 0;
9210
9211   /* If PAT is a PARALLEL, check to see if it contains the CLOBBER
9212      we use to indicate that something didn't match.  If we find such a
9213      thing, force rejection.  */
9214   if (GET_CODE (pat) == PARALLEL)
9215     for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
9216       if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER
9217           && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
9218         return -1;
9219
9220   /* Is the result of combination a valid instruction?  */
9221   insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9222
9223   /* If it isn't, there is the possibility that we previously had an insn
9224      that clobbered some register as a side effect, but the combined
9225      insn doesn't need to do that.  So try once more without the clobbers
9226      unless this represents an ASM insn.  */
9227
9228   if (insn_code_number < 0 && ! check_asm_operands (pat)
9229       && GET_CODE (pat) == PARALLEL)
9230     {
9231       int pos;
9232
9233       for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++)
9234         if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
9235           {
9236             if (i != pos)
9237               SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i));
9238             pos++;
9239           }
9240
9241       SUBST_INT (XVECLEN (pat, 0), pos);
9242
9243       if (pos == 1)
9244         pat = XVECEXP (pat, 0, 0);
9245
9246       insn_code_number = recog (pat, insn, &num_clobbers_to_add);
9247     }
9248
9249   /* If we had any clobbers to add, make a new pattern than contains
9250      them.  Then check to make sure that all of them are dead.  */
9251   if (num_clobbers_to_add)
9252     {
9253       rtx newpat = gen_rtx_PARALLEL (VOIDmode,
9254                                      gen_rtvec (GET_CODE (pat) == PARALLEL
9255                                                 ? (XVECLEN (pat, 0)
9256                                                    + num_clobbers_to_add)
9257                                                 : num_clobbers_to_add + 1));
9258
9259       if (GET_CODE (pat) == PARALLEL)
9260         for (i = 0; i < XVECLEN (pat, 0); i++)
9261           XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i);
9262       else
9263         XVECEXP (newpat, 0, 0) = pat;
9264
9265       add_clobbers (newpat, insn_code_number);
9266
9267       for (i = XVECLEN (newpat, 0) - num_clobbers_to_add;
9268            i < XVECLEN (newpat, 0); i++)
9269         {
9270           if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG
9271               && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn))
9272             return -1;
9273           notes = gen_rtx_EXPR_LIST (REG_UNUSED,
9274                                      XEXP (XVECEXP (newpat, 0, i), 0), notes);
9275         }
9276       pat = newpat;
9277     }
9278
9279   *pnewpat = pat;
9280   *pnotes = notes;
9281
9282   return insn_code_number;
9283 }
9284 \f
9285 /* Like gen_lowpart but for use by combine.  In combine it is not possible
9286    to create any new pseudoregs.  However, it is safe to create
9287    invalid memory addresses, because combine will try to recognize
9288    them and all they will do is make the combine attempt fail.
9289
9290    If for some reason this cannot do its job, an rtx
9291    (clobber (const_int 0)) is returned.
9292    An insn containing that will not be recognized.  */
9293
9294 #undef gen_lowpart
9295
9296 static rtx
9297 gen_lowpart_for_combine (mode, x)
9298      enum machine_mode mode;
9299      register rtx x;
9300 {
9301   rtx result;
9302
9303   if (GET_MODE (x) == mode)
9304     return x;
9305
9306   /* We can only support MODE being wider than a word if X is a
9307      constant integer or has a mode the same size.  */
9308
9309   if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
9310       && ! ((GET_MODE (x) == VOIDmode
9311              && (GET_CODE (x) == CONST_INT
9312                  || GET_CODE (x) == CONST_DOUBLE))
9313             || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
9314     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9315
9316   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
9317      won't know what to do.  So we will strip off the SUBREG here and
9318      process normally.  */
9319   if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
9320     {
9321       x = SUBREG_REG (x);
9322       if (GET_MODE (x) == mode)
9323         return x;
9324     }
9325
9326   result = gen_lowpart_common (mode, x);
9327   if (result != 0
9328       && GET_CODE (result) == SUBREG
9329       && GET_CODE (SUBREG_REG (result)) == REG
9330       && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER
9331       && (GET_MODE_SIZE (GET_MODE (result))
9332           != GET_MODE_SIZE (GET_MODE (SUBREG_REG (result)))))
9333     REG_CHANGES_SIZE (REGNO (SUBREG_REG (result))) = 1;
9334
9335   if (result)
9336     return result;
9337
9338   if (GET_CODE (x) == MEM)
9339     {
9340       register int offset = 0;
9341       rtx new;
9342
9343       /* Refuse to work on a volatile memory ref or one with a mode-dependent
9344          address.  */
9345       if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0)))
9346         return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
9347
9348       /* If we want to refer to something bigger than the original memref,
9349          generate a perverse subreg instead.  That will force a reload
9350          of the original memref X.  */
9351       if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode))
9352         return gen_rtx_SUBREG (mode, x, 0);
9353
9354       if (WORDS_BIG_ENDIAN)
9355         offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD)
9356                   - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
9357
9358       if (BYTES_BIG_ENDIAN)
9359         {
9360           /* Adjust the address so that the address-after-the-data is
9361              unchanged.  */
9362           offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
9363                      - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x))));
9364         }
9365       new = gen_rtx_MEM (mode, plus_constant (XEXP (x, 0), offset));
9366       RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x);
9367       MEM_COPY_ATTRIBUTES (new, x);
9368       return new;
9369     }
9370
9371   /* If X is a comparison operator, rewrite it in a new mode.  This
9372      probably won't match, but may allow further simplifications.  */
9373   else if (GET_RTX_CLASS (GET_CODE (x)) == '<')
9374     return gen_rtx_combine (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1));
9375
9376   /* If we couldn't simplify X any other way, just enclose it in a
9377      SUBREG.  Normally, this SUBREG won't match, but some patterns may
9378      include an explicit SUBREG or we may simplify it further in combine.  */
9379   else
9380     {
9381       int word = 0;
9382
9383       if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
9384         word = ((GET_MODE_SIZE (GET_MODE (x))
9385                  - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD))
9386                 / UNITS_PER_WORD);
9387       return gen_rtx_SUBREG (mode, x, word);
9388     }
9389 }
9390 \f
9391 /* Make an rtx expression.  This is a subset of gen_rtx and only supports
9392    expressions of 1, 2, or 3 operands, each of which are rtx expressions.
9393
9394    If the identical expression was previously in the insn (in the undobuf),
9395    it will be returned.  Only if it is not found will a new expression
9396    be made.  */
9397
9398 /*VARARGS2*/
9399 static rtx
9400 gen_rtx_combine VPROTO((enum rtx_code code, enum machine_mode mode, ...))
9401 {
9402 #ifndef ANSI_PROTOTYPES
9403   enum rtx_code code;
9404   enum machine_mode mode;
9405 #endif
9406   va_list p;
9407   int n_args;
9408   rtx args[3];
9409   int j;
9410   const char *fmt;
9411   rtx rt;
9412   struct undo *undo;
9413
9414   VA_START (p, mode);
9415
9416 #ifndef ANSI_PROTOTYPES
9417   code = va_arg (p, enum rtx_code);
9418   mode = va_arg (p, enum machine_mode);
9419 #endif
9420
9421   n_args = GET_RTX_LENGTH (code);
9422   fmt = GET_RTX_FORMAT (code);
9423
9424   if (n_args == 0 || n_args > 3)
9425     abort ();
9426
9427   /* Get each arg and verify that it is supposed to be an expression.  */
9428   for (j = 0; j < n_args; j++)
9429     {
9430       if (*fmt++ != 'e')
9431         abort ();
9432
9433       args[j] = va_arg (p, rtx);
9434     }
9435
9436   va_end (p);
9437
9438   /* See if this is in undobuf.  Be sure we don't use objects that came
9439      from another insn; this could produce circular rtl structures.  */
9440
9441   for (undo = undobuf.undos; undo != undobuf.previous_undos; undo = undo->next)
9442     if (!undo->is_int
9443         && GET_CODE (undo->old_contents.r) == code
9444         && GET_MODE (undo->old_contents.r) == mode)
9445       {
9446         for (j = 0; j < n_args; j++)
9447           if (XEXP (undo->old_contents.r, j) != args[j])
9448             break;
9449
9450         if (j == n_args)
9451           return undo->old_contents.r;
9452       }
9453
9454   /* Otherwise make a new rtx.  We know we have 1, 2, or 3 args.
9455      Use rtx_alloc instead of gen_rtx because it's faster on RISC.  */
9456   rt = rtx_alloc (code);
9457   PUT_MODE (rt, mode);
9458   XEXP (rt, 0) = args[0];
9459   if (n_args > 1)
9460     {
9461       XEXP (rt, 1) = args[1];
9462       if (n_args > 2)
9463         XEXP (rt, 2) = args[2];
9464     }
9465   return rt;
9466 }
9467
9468 /* These routines make binary and unary operations by first seeing if they
9469    fold; if not, a new expression is allocated.  */
9470
9471 static rtx
9472 gen_binary (code, mode, op0, op1)
9473      enum rtx_code code;
9474      enum machine_mode mode;
9475      rtx op0, op1;
9476 {
9477   rtx result;
9478   rtx tem;
9479
9480   if (GET_RTX_CLASS (code) == 'c'
9481       && (GET_CODE (op0) == CONST_INT
9482           || (CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)))
9483     tem = op0, op0 = op1, op1 = tem;
9484
9485   if (GET_RTX_CLASS (code) == '<') 
9486     {
9487       enum machine_mode op_mode = GET_MODE (op0);
9488
9489       /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get 
9490          just (REL_OP X Y).  */
9491       if (GET_CODE (op0) == COMPARE && op1 == const0_rtx)
9492         {
9493           op1 = XEXP (op0, 1);
9494           op0 = XEXP (op0, 0);
9495           op_mode = GET_MODE (op0);
9496         }
9497
9498       if (op_mode == VOIDmode)
9499         op_mode = GET_MODE (op1);
9500       result = simplify_relational_operation (code, op_mode, op0, op1);
9501     }
9502   else
9503     result = simplify_binary_operation (code, mode, op0, op1);
9504
9505   if (result)
9506     return result;
9507
9508   /* Put complex operands first and constants second.  */
9509   if (GET_RTX_CLASS (code) == 'c'
9510       && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
9511           || (GET_RTX_CLASS (GET_CODE (op0)) == 'o'
9512               && GET_RTX_CLASS (GET_CODE (op1)) != 'o')
9513           || (GET_CODE (op0) == SUBREG
9514               && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o'
9515               && GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
9516     return gen_rtx_combine (code, mode, op1, op0);
9517
9518   /* If we are turning off bits already known off in OP0, we need not do
9519      an AND.  */
9520   else if (code == AND && GET_CODE (op1) == CONST_INT
9521            && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
9522            && (nonzero_bits (op0, mode) & ~ INTVAL (op1)) == 0)
9523     return op0;
9524
9525   return gen_rtx_combine (code, mode, op0, op1);
9526 }
9527
9528 static rtx
9529 gen_unary (code, mode, op0_mode, op0)
9530      enum rtx_code code;
9531      enum machine_mode mode, op0_mode;
9532      rtx op0;
9533 {
9534   rtx result = simplify_unary_operation (code, mode, op0, op0_mode);
9535
9536   if (result)
9537     return result;
9538
9539   return gen_rtx_combine (code, mode, op0);
9540 }
9541 \f
9542 /* Simplify a comparison between *POP0 and *POP1 where CODE is the
9543    comparison code that will be tested.
9544
9545    The result is a possibly different comparison code to use.  *POP0 and
9546    *POP1 may be updated.
9547
9548    It is possible that we might detect that a comparison is either always
9549    true or always false.  However, we do not perform general constant
9550    folding in combine, so this knowledge isn't useful.  Such tautologies
9551    should have been detected earlier.  Hence we ignore all such cases.  */
9552
9553 static enum rtx_code
9554 simplify_comparison (code, pop0, pop1)
9555      enum rtx_code code;
9556      rtx *pop0;
9557      rtx *pop1;
9558 {
9559   rtx op0 = *pop0;
9560   rtx op1 = *pop1;
9561   rtx tem, tem1;
9562   int i;
9563   enum machine_mode mode, tmode;
9564
9565   /* Try a few ways of applying the same transformation to both operands.  */
9566   while (1)
9567     {
9568 #ifndef WORD_REGISTER_OPERATIONS
9569       /* The test below this one won't handle SIGN_EXTENDs on these machines,
9570          so check specially.  */
9571       if (code != GTU && code != GEU && code != LTU && code != LEU
9572           && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT
9573           && GET_CODE (XEXP (op0, 0)) == ASHIFT
9574           && GET_CODE (XEXP (op1, 0)) == ASHIFT
9575           && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG
9576           && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG
9577           && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))
9578               == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0))))
9579           && GET_CODE (XEXP (op0, 1)) == CONST_INT
9580           && GET_CODE (XEXP (op1, 1)) == CONST_INT
9581           && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
9582           && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT
9583           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (op1, 1))
9584           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op0, 0), 1))
9585           && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op1, 0), 1))
9586           && (INTVAL (XEXP (op0, 1))
9587               == (GET_MODE_BITSIZE (GET_MODE (op0))
9588                   - (GET_MODE_BITSIZE
9589                      (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))))))))
9590         {
9591           op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0));
9592           op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0));
9593         }
9594 #endif
9595
9596       /* If both operands are the same constant shift, see if we can ignore the
9597          shift.  We can if the shift is a rotate or if the bits shifted out of
9598          this shift are known to be zero for both inputs and if the type of
9599          comparison is compatible with the shift.  */
9600       if (GET_CODE (op0) == GET_CODE (op1)
9601           && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
9602           && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ))
9603               || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT)
9604                   && (code != GT && code != LT && code != GE && code != LE))
9605               || (GET_CODE (op0) == ASHIFTRT
9606                   && (code != GTU && code != LTU
9607                       && code != GEU && code != GEU)))
9608           && GET_CODE (XEXP (op0, 1)) == CONST_INT
9609           && INTVAL (XEXP (op0, 1)) >= 0
9610           && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
9611           && XEXP (op0, 1) == XEXP (op1, 1))
9612         {
9613           enum machine_mode mode = GET_MODE (op0);
9614           unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9615           int shift_count = INTVAL (XEXP (op0, 1));
9616
9617           if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT)
9618             mask &= (mask >> shift_count) << shift_count;
9619           else if (GET_CODE (op0) == ASHIFT)
9620             mask = (mask & (mask << shift_count)) >> shift_count;
9621
9622           if ((nonzero_bits (XEXP (op0, 0), mode) & ~ mask) == 0
9623               && (nonzero_bits (XEXP (op1, 0), mode) & ~ mask) == 0)
9624             op0 = XEXP (op0, 0), op1 = XEXP (op1, 0);
9625           else
9626             break;
9627         }
9628
9629       /* If both operands are AND's of a paradoxical SUBREG by constant, the
9630          SUBREGs are of the same mode, and, in both cases, the AND would
9631          be redundant if the comparison was done in the narrower mode,
9632          do the comparison in the narrower mode (e.g., we are AND'ing with 1
9633          and the operand's possibly nonzero bits are 0xffffff01; in that case
9634          if we only care about QImode, we don't need the AND).  This case
9635          occurs if the output mode of an scc insn is not SImode and
9636          STORE_FLAG_VALUE == 1 (e.g., the 386).
9637
9638          Similarly, check for a case where the AND's are ZERO_EXTEND
9639          operations from some narrower mode even though a SUBREG is not
9640          present.  */
9641
9642       else if  (GET_CODE (op0) == AND && GET_CODE (op1) == AND
9643                 && GET_CODE (XEXP (op0, 1)) == CONST_INT
9644                 && GET_CODE (XEXP (op1, 1)) == CONST_INT)
9645         {
9646           rtx inner_op0 = XEXP (op0, 0);
9647           rtx inner_op1 = XEXP (op1, 0);
9648           HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1));
9649           HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1));
9650           int changed = 0;
9651                 
9652           if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG
9653               && (GET_MODE_SIZE (GET_MODE (inner_op0))
9654                   > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0))))
9655               && (GET_MODE (SUBREG_REG (inner_op0))
9656                   == GET_MODE (SUBREG_REG (inner_op1)))
9657               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (inner_op0)))
9658                   <= HOST_BITS_PER_WIDE_INT)
9659               && (0 == ((~c0) & nonzero_bits (SUBREG_REG (inner_op0),
9660                                              GET_MODE (SUBREG_REG (inner_op0)))))
9661               && (0 == ((~c1) & nonzero_bits (SUBREG_REG (inner_op1),
9662                                              GET_MODE (SUBREG_REG (inner_op1))))))
9663             {
9664               op0 = SUBREG_REG (inner_op0);
9665               op1 = SUBREG_REG (inner_op1);
9666
9667               /* The resulting comparison is always unsigned since we masked
9668                  off the original sign bit.  */
9669               code = unsigned_condition (code);
9670
9671               changed = 1;
9672             }
9673
9674           else if (c0 == c1)
9675             for (tmode = GET_CLASS_NARROWEST_MODE
9676                  (GET_MODE_CLASS (GET_MODE (op0)));
9677                  tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode))
9678               if ((unsigned HOST_WIDE_INT) c0 == GET_MODE_MASK (tmode))
9679                 {
9680                   op0 = gen_lowpart_for_combine (tmode, inner_op0);
9681                   op1 = gen_lowpart_for_combine (tmode, inner_op1);
9682                   code = unsigned_condition (code);
9683                   changed = 1;
9684                   break;
9685                 }
9686
9687           if (! changed)
9688             break;
9689         }
9690
9691       /* If both operands are NOT, we can strip off the outer operation
9692          and adjust the comparison code for swapped operands; similarly for
9693          NEG, except that this must be an equality comparison.  */
9694       else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT)
9695                || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG
9696                    && (code == EQ || code == NE)))
9697         op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code);
9698
9699       else
9700         break;
9701     }
9702      
9703   /* If the first operand is a constant, swap the operands and adjust the
9704      comparison code appropriately, but don't do this if the second operand
9705      is already a constant integer.  */
9706   if (CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT)
9707     {
9708       tem = op0, op0 = op1, op1 = tem;
9709       code = swap_condition (code);
9710     }
9711
9712   /* We now enter a loop during which we will try to simplify the comparison.
9713      For the most part, we only are concerned with comparisons with zero,
9714      but some things may really be comparisons with zero but not start
9715      out looking that way.  */
9716
9717   while (GET_CODE (op1) == CONST_INT)
9718     {
9719       enum machine_mode mode = GET_MODE (op0);
9720       int mode_width = GET_MODE_BITSIZE (mode);
9721       unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode);
9722       int equality_comparison_p;
9723       int sign_bit_comparison_p;
9724       int unsigned_comparison_p;
9725       HOST_WIDE_INT const_op;
9726
9727       /* We only want to handle integral modes.  This catches VOIDmode,
9728          CCmode, and the floating-point modes.  An exception is that we
9729          can handle VOIDmode if OP0 is a COMPARE or a comparison
9730          operation.  */
9731
9732       if (GET_MODE_CLASS (mode) != MODE_INT
9733           && ! (mode == VOIDmode
9734                 && (GET_CODE (op0) == COMPARE
9735                     || GET_RTX_CLASS (GET_CODE (op0)) == '<')))
9736         break;
9737
9738       /* Get the constant we are comparing against and turn off all bits
9739          not on in our mode.  */
9740       const_op = INTVAL (op1);
9741       if (mode_width <= HOST_BITS_PER_WIDE_INT)
9742         const_op &= mask;
9743
9744       /* If we are comparing against a constant power of two and the value
9745          being compared can only have that single bit nonzero (e.g., it was
9746          `and'ed with that bit), we can replace this with a comparison
9747          with zero.  */
9748       if (const_op
9749           && (code == EQ || code == NE || code == GE || code == GEU
9750               || code == LT || code == LTU)
9751           && mode_width <= HOST_BITS_PER_WIDE_INT
9752           && exact_log2 (const_op) >= 0
9753           && nonzero_bits (op0, mode) == (unsigned HOST_WIDE_INT) const_op)
9754         {
9755           code = (code == EQ || code == GE || code == GEU ? NE : EQ);
9756           op1 = const0_rtx, const_op = 0;
9757         }
9758
9759       /* Similarly, if we are comparing a value known to be either -1 or
9760          0 with -1, change it to the opposite comparison against zero.  */
9761
9762       if (const_op == -1
9763           && (code == EQ || code == NE || code == GT || code == LE
9764               || code == GEU || code == LTU)
9765           && num_sign_bit_copies (op0, mode) == mode_width)
9766         {
9767           code = (code == EQ || code == LE || code == GEU ? NE : EQ);
9768           op1 = const0_rtx, const_op = 0;
9769         }
9770
9771       /* Do some canonicalizations based on the comparison code.  We prefer
9772          comparisons against zero and then prefer equality comparisons.  
9773          If we can reduce the size of a constant, we will do that too.  */
9774
9775       switch (code)
9776         {
9777         case LT:
9778           /* < C is equivalent to <= (C - 1) */
9779           if (const_op > 0)
9780             {
9781               const_op -= 1;
9782               op1 = GEN_INT (const_op);
9783               code = LE;
9784               /* ... fall through to LE case below.  */
9785             }
9786           else
9787             break;
9788
9789         case LE:
9790           /* <= C is equivalent to < (C + 1); we do this for C < 0  */
9791           if (const_op < 0)
9792             {
9793               const_op += 1;
9794               op1 = GEN_INT (const_op);
9795               code = LT;
9796             }
9797
9798           /* If we are doing a <= 0 comparison on a value known to have
9799              a zero sign bit, we can replace this with == 0.  */
9800           else if (const_op == 0
9801                    && mode_width <= HOST_BITS_PER_WIDE_INT
9802                    && (nonzero_bits (op0, mode)
9803                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9804             code = EQ;
9805           break;
9806
9807         case GE:
9808           /* >= C is equivalent to > (C - 1).  */
9809           if (const_op > 0)
9810             {
9811               const_op -= 1;
9812               op1 = GEN_INT (const_op);
9813               code = GT;
9814               /* ... fall through to GT below.  */
9815             }
9816           else
9817             break;
9818
9819         case GT:
9820           /* > C is equivalent to >= (C + 1); we do this for C < 0*/
9821           if (const_op < 0)
9822             {
9823               const_op += 1;
9824               op1 = GEN_INT (const_op);
9825               code = GE;
9826             }
9827
9828           /* If we are doing a > 0 comparison on a value known to have
9829              a zero sign bit, we can replace this with != 0.  */
9830           else if (const_op == 0
9831                    && mode_width <= HOST_BITS_PER_WIDE_INT
9832                    && (nonzero_bits (op0, mode)
9833                        & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)
9834             code = NE;
9835           break;
9836
9837         case LTU:
9838           /* < C is equivalent to <= (C - 1).  */
9839           if (const_op > 0)
9840             {
9841               const_op -= 1;
9842               op1 = GEN_INT (const_op);
9843               code = LEU;
9844               /* ... fall through ...  */
9845             }
9846
9847           /* (unsigned) < 0x80000000 is equivalent to >= 0.  */
9848           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9849                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
9850             {
9851               const_op = 0, op1 = const0_rtx;
9852               code = GE;
9853               break;
9854             }
9855           else
9856             break;
9857
9858         case LEU:
9859           /* unsigned <= 0 is equivalent to == 0 */
9860           if (const_op == 0)
9861             code = EQ;
9862
9863           /* (unsigned) <= 0x7fffffff is equivalent to >= 0.  */
9864           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9865                    && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
9866             {
9867               const_op = 0, op1 = const0_rtx;
9868               code = GE;
9869             }
9870           break;
9871
9872         case GEU:
9873           /* >= C is equivalent to < (C - 1).  */
9874           if (const_op > 1)
9875             {
9876               const_op -= 1;
9877               op1 = GEN_INT (const_op);
9878               code = GTU;
9879               /* ... fall through ...  */
9880             }
9881
9882           /* (unsigned) >= 0x80000000 is equivalent to < 0.  */
9883           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9884                    && (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)))
9885             {
9886               const_op = 0, op1 = const0_rtx;
9887               code = LT;
9888               break;
9889             }
9890           else
9891             break;
9892
9893         case GTU:
9894           /* unsigned > 0 is equivalent to != 0 */
9895           if (const_op == 0)
9896             code = NE;
9897
9898           /* (unsigned) > 0x7fffffff is equivalent to < 0.  */
9899           else if ((mode_width <= HOST_BITS_PER_WIDE_INT)
9900                     && (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1))
9901             {
9902               const_op = 0, op1 = const0_rtx;
9903               code = LT;
9904             }
9905           break;
9906
9907         default:
9908           break;
9909         }
9910
9911       /* Compute some predicates to simplify code below.  */
9912
9913       equality_comparison_p = (code == EQ || code == NE);
9914       sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0);
9915       unsigned_comparison_p = (code == LTU || code == LEU || code == GTU
9916                                || code == LEU);
9917
9918       /* If this is a sign bit comparison and we can do arithmetic in
9919          MODE, say that we will only be needing the sign bit of OP0.  */
9920       if (sign_bit_comparison_p
9921           && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
9922         op0 = force_to_mode (op0, mode,
9923                              ((HOST_WIDE_INT) 1
9924                               << (GET_MODE_BITSIZE (mode) - 1)),
9925                              NULL_RTX, 0);
9926
9927       /* Now try cases based on the opcode of OP0.  If none of the cases
9928          does a "continue", we exit this loop immediately after the
9929          switch.  */
9930
9931       switch (GET_CODE (op0))
9932         {
9933         case ZERO_EXTRACT:
9934           /* If we are extracting a single bit from a variable position in
9935              a constant that has only a single bit set and are comparing it
9936              with zero, we can convert this into an equality comparison 
9937              between the position and the location of the single bit.  */
9938
9939           if (GET_CODE (XEXP (op0, 0)) == CONST_INT
9940               && XEXP (op0, 1) == const1_rtx
9941               && equality_comparison_p && const_op == 0
9942               && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0)
9943             {
9944               if (BITS_BIG_ENDIAN)
9945                 {
9946 #ifdef HAVE_extzv
9947                   mode = insn_data[(int) CODE_FOR_extzv].operand[1].mode;
9948                   if (mode == VOIDmode)
9949                     mode = word_mode;
9950                   i = (GET_MODE_BITSIZE (mode) - 1 - i);
9951 #else
9952                   i = BITS_PER_WORD - 1 - i;
9953 #endif
9954                 }
9955
9956               op0 = XEXP (op0, 2);
9957               op1 = GEN_INT (i);
9958               const_op = i;
9959
9960               /* Result is nonzero iff shift count is equal to I.  */
9961               code = reverse_condition (code);
9962               continue;
9963             }
9964
9965           /* ... fall through ...  */
9966
9967         case SIGN_EXTRACT:
9968           tem = expand_compound_operation (op0);
9969           if (tem != op0)
9970             {
9971               op0 = tem;
9972               continue;
9973             }
9974           break;
9975
9976         case NOT:
9977           /* If testing for equality, we can take the NOT of the constant.  */
9978           if (equality_comparison_p
9979               && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0)
9980             {
9981               op0 = XEXP (op0, 0);
9982               op1 = tem;
9983               continue;
9984             }
9985
9986           /* If just looking at the sign bit, reverse the sense of the
9987              comparison.  */
9988           if (sign_bit_comparison_p)
9989             {
9990               op0 = XEXP (op0, 0);
9991               code = (code == GE ? LT : GE);
9992               continue;
9993             }
9994           break;
9995
9996         case NEG:
9997           /* If testing for equality, we can take the NEG of the constant.  */
9998           if (equality_comparison_p
9999               && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0)
10000             {
10001               op0 = XEXP (op0, 0);
10002               op1 = tem;
10003               continue;
10004             }
10005
10006           /* The remaining cases only apply to comparisons with zero.  */
10007           if (const_op != 0)
10008             break;
10009
10010           /* When X is ABS or is known positive,
10011              (neg X) is < 0 if and only if X != 0.  */
10012
10013           if (sign_bit_comparison_p
10014               && (GET_CODE (XEXP (op0, 0)) == ABS
10015                   || (mode_width <= HOST_BITS_PER_WIDE_INT
10016                       && (nonzero_bits (XEXP (op0, 0), mode)
10017                           & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0)))
10018             {
10019               op0 = XEXP (op0, 0);
10020               code = (code == LT ? NE : EQ);
10021               continue;
10022             }
10023
10024           /* If we have NEG of something whose two high-order bits are the
10025              same, we know that "(-a) < 0" is equivalent to "a > 0".  */
10026           if (num_sign_bit_copies (op0, mode) >= 2)
10027             {
10028               op0 = XEXP (op0, 0);
10029               code = swap_condition (code);
10030               continue;
10031             }
10032           break;
10033
10034         case ROTATE:
10035           /* If we are testing equality and our count is a constant, we
10036              can perform the inverse operation on our RHS.  */
10037           if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10038               && (tem = simplify_binary_operation (ROTATERT, mode,
10039                                                    op1, XEXP (op0, 1))) != 0)
10040             {
10041               op0 = XEXP (op0, 0);
10042               op1 = tem;
10043               continue;
10044             }
10045
10046           /* If we are doing a < 0 or >= 0 comparison, it means we are testing
10047              a particular bit.  Convert it to an AND of a constant of that
10048              bit.  This will be converted into a ZERO_EXTRACT.  */
10049           if (const_op == 0 && sign_bit_comparison_p
10050               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10051               && mode_width <= HOST_BITS_PER_WIDE_INT)
10052             {
10053               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10054                                             ((HOST_WIDE_INT) 1
10055                                              << (mode_width - 1
10056                                                  - INTVAL (XEXP (op0, 1)))));
10057               code = (code == LT ? NE : EQ);
10058               continue;
10059             }
10060
10061           /* ... fall through ...  */
10062
10063         case ABS:
10064           /* ABS is ignorable inside an equality comparison with zero.  */
10065           if (const_op == 0 && equality_comparison_p)
10066             {
10067               op0 = XEXP (op0, 0);
10068               continue;
10069             }
10070           break;
10071           
10072
10073         case SIGN_EXTEND:
10074           /* Can simplify (compare (zero/sign_extend FOO) CONST)
10075              to (compare FOO CONST) if CONST fits in FOO's mode and we 
10076              are either testing inequality or have an unsigned comparison
10077              with ZERO_EXTEND or a signed comparison with SIGN_EXTEND.  */
10078           if (! unsigned_comparison_p
10079               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10080                   <= HOST_BITS_PER_WIDE_INT)
10081               && ((unsigned HOST_WIDE_INT) const_op
10082                   < (((unsigned HOST_WIDE_INT) 1
10083                       << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1)))))
10084             {
10085               op0 = XEXP (op0, 0);
10086               continue;
10087             }
10088           break;
10089
10090         case SUBREG:
10091           /* Check for the case where we are comparing A - C1 with C2,
10092              both constants are smaller than 1/2 the maximum positive
10093              value in MODE, and the comparison is equality or unsigned.
10094              In that case, if A is either zero-extended to MODE or has
10095              sufficient sign bits so that the high-order bit in MODE
10096              is a copy of the sign in the inner mode, we can prove that it is
10097              safe to do the operation in the wider mode.  This simplifies
10098              many range checks.  */
10099
10100           if (mode_width <= HOST_BITS_PER_WIDE_INT
10101               && subreg_lowpart_p (op0)
10102               && GET_CODE (SUBREG_REG (op0)) == PLUS
10103               && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT
10104               && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0
10105               && (- INTVAL (XEXP (SUBREG_REG (op0), 1))
10106                   < (HOST_WIDE_INT)(GET_MODE_MASK (mode) / 2))
10107               && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2
10108               && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0),
10109                                       GET_MODE (SUBREG_REG (op0)))
10110                         & ~ GET_MODE_MASK (mode))
10111                   || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0),
10112                                            GET_MODE (SUBREG_REG (op0)))
10113                       > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10114                          - GET_MODE_BITSIZE (mode)))))
10115             {
10116               op0 = SUBREG_REG (op0);
10117               continue;
10118             }
10119
10120           /* If the inner mode is narrower and we are extracting the low part,
10121              we can treat the SUBREG as if it were a ZERO_EXTEND.  */
10122           if (subreg_lowpart_p (op0)
10123               && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width)
10124             /* Fall through */ ;
10125           else
10126             break;
10127
10128           /* ... fall through ...  */
10129
10130         case ZERO_EXTEND:
10131           if ((unsigned_comparison_p || equality_comparison_p)
10132               && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0)))
10133                   <= HOST_BITS_PER_WIDE_INT)
10134               && ((unsigned HOST_WIDE_INT) const_op
10135                   < GET_MODE_MASK (GET_MODE (XEXP (op0, 0)))))
10136             {
10137               op0 = XEXP (op0, 0);
10138               continue;
10139             }
10140           break;
10141
10142         case PLUS:
10143           /* (eq (plus X A) B) -> (eq X (minus B A)).  We can only do
10144              this for equality comparisons due to pathological cases involving
10145              overflows.  */
10146           if (equality_comparison_p
10147               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10148                                                         op1, XEXP (op0, 1))))
10149             {
10150               op0 = XEXP (op0, 0);
10151               op1 = tem;
10152               continue;
10153             }
10154
10155           /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0.  */
10156           if (const_op == 0 && XEXP (op0, 1) == constm1_rtx
10157               && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p)
10158             {
10159               op0 = XEXP (XEXP (op0, 0), 0);
10160               code = (code == LT ? EQ : NE);
10161               continue;
10162             }
10163           break;
10164
10165         case MINUS:
10166           /* (eq (minus A B) C) -> (eq A (plus B C)) or
10167              (eq B (minus A C)), whichever simplifies.  We can only do
10168              this for equality comparisons due to pathological cases involving
10169              overflows.  */
10170           if (equality_comparison_p
10171               && 0 != (tem = simplify_binary_operation (PLUS, mode,
10172                                                         XEXP (op0, 1), op1)))
10173             {
10174               op0 = XEXP (op0, 0);
10175               op1 = tem;
10176               continue;
10177             }
10178
10179           if (equality_comparison_p
10180               && 0 != (tem = simplify_binary_operation (MINUS, mode,
10181                                                         XEXP (op0, 0), op1)))
10182             {
10183               op0 = XEXP (op0, 1);
10184               op1 = tem;
10185               continue;
10186             }
10187
10188           /* The sign bit of (minus (ashiftrt X C) X), where C is the number
10189              of bits in X minus 1, is one iff X > 0.  */
10190           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT
10191               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10192               && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1
10193               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10194             {
10195               op0 = XEXP (op0, 1);
10196               code = (code == GE ? LE : GT);
10197               continue;
10198             }
10199           break;
10200
10201         case XOR:
10202           /* (eq (xor A B) C) -> (eq A (xor B C)).  This is a simplification
10203              if C is zero or B is a constant.  */
10204           if (equality_comparison_p
10205               && 0 != (tem = simplify_binary_operation (XOR, mode,
10206                                                         XEXP (op0, 1), op1)))
10207             {
10208               op0 = XEXP (op0, 0);
10209               op1 = tem;
10210               continue;
10211             }
10212           break;
10213
10214         case EQ:  case NE:
10215         case LT:  case LTU:  case LE:  case LEU:
10216         case GT:  case GTU:  case GE:  case GEU:
10217           /* We can't do anything if OP0 is a condition code value, rather
10218              than an actual data value.  */
10219           if (const_op != 0
10220 #ifdef HAVE_cc0
10221               || XEXP (op0, 0) == cc0_rtx
10222 #endif
10223               || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC)
10224             break;
10225
10226           /* Get the two operands being compared.  */
10227           if (GET_CODE (XEXP (op0, 0)) == COMPARE)
10228             tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1);
10229           else
10230             tem = XEXP (op0, 0), tem1 = XEXP (op0, 1);
10231
10232           /* Check for the cases where we simply want the result of the
10233              earlier test or the opposite of that result.  */
10234           if (code == NE
10235               || (code == EQ && reversible_comparison_p (op0))
10236               || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT
10237                   && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10238                   && (STORE_FLAG_VALUE
10239                       & (((HOST_WIDE_INT) 1
10240                           << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1))))
10241                   && (code == LT
10242                       || (code == GE && reversible_comparison_p (op0)))))
10243             {
10244               code = (code == LT || code == NE
10245                       ? GET_CODE (op0) : reverse_condition (GET_CODE (op0)));
10246               op0 = tem, op1 = tem1;
10247               continue;
10248             }
10249           break;
10250
10251         case IOR:
10252           /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero
10253              iff X <= 0.  */
10254           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS
10255               && XEXP (XEXP (op0, 0), 1) == constm1_rtx
10256               && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1)))
10257             {
10258               op0 = XEXP (op0, 1);
10259               code = (code == GE ? GT : LE);
10260               continue;
10261             }
10262           break;
10263
10264         case AND:
10265           /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1).  This
10266              will be converted to a ZERO_EXTRACT later.  */
10267           if (const_op == 0 && equality_comparison_p
10268               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10269               && XEXP (XEXP (op0, 0), 0) == const1_rtx)
10270             {
10271               op0 = simplify_and_const_int
10272                 (op0, mode, gen_rtx_combine (LSHIFTRT, mode,
10273                                              XEXP (op0, 1),
10274                                              XEXP (XEXP (op0, 0), 1)),
10275                  (HOST_WIDE_INT) 1);
10276               continue;
10277             }
10278
10279           /* If we are comparing (and (lshiftrt X C1) C2) for equality with
10280              zero and X is a comparison and C1 and C2 describe only bits set
10281              in STORE_FLAG_VALUE, we can compare with X.  */
10282           if (const_op == 0 && equality_comparison_p
10283               && mode_width <= HOST_BITS_PER_WIDE_INT
10284               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10285               && GET_CODE (XEXP (op0, 0)) == LSHIFTRT
10286               && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT
10287               && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0
10288               && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT)
10289             {
10290               mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10291                       << INTVAL (XEXP (XEXP (op0, 0), 1)));
10292               if ((~ STORE_FLAG_VALUE & mask) == 0
10293                   && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<'
10294                       || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0
10295                           && GET_RTX_CLASS (GET_CODE (tem)) == '<')))
10296                 {
10297                   op0 = XEXP (XEXP (op0, 0), 0);
10298                   continue;
10299                 }
10300             }
10301
10302           /* If we are doing an equality comparison of an AND of a bit equal
10303              to the sign bit, replace this with a LT or GE comparison of
10304              the underlying value.  */
10305           if (equality_comparison_p
10306               && const_op == 0
10307               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10308               && mode_width <= HOST_BITS_PER_WIDE_INT
10309               && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode))
10310                   == (unsigned HOST_WIDE_INT) 1 << (mode_width - 1)))
10311             {
10312               op0 = XEXP (op0, 0);
10313               code = (code == EQ ? GE : LT);
10314               continue;
10315             }
10316
10317           /* If this AND operation is really a ZERO_EXTEND from a narrower
10318              mode, the constant fits within that mode, and this is either an
10319              equality or unsigned comparison, try to do this comparison in
10320              the narrower mode.  */
10321           if ((equality_comparison_p || unsigned_comparison_p)
10322               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10323               && (i = exact_log2 ((INTVAL (XEXP (op0, 1))
10324                                    & GET_MODE_MASK (mode))
10325                                   + 1)) >= 0
10326               && const_op >> i == 0
10327               && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode)
10328             {
10329               op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
10330               continue;
10331             }
10332
10333           /* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 fits
10334              in both M1 and M2 and the SUBREG is either paradoxical or
10335              represents the low part, permute the SUBREG and the AND and
10336              try again.  */
10337           if (GET_CODE (XEXP (op0, 0)) == SUBREG
10338               && (0
10339 #ifdef WORD_REGISTER_OPERATIONS
10340                   || ((mode_width
10341                        > (GET_MODE_BITSIZE
10342                            (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10343                       && mode_width <= BITS_PER_WORD)
10344 #endif
10345                   || ((mode_width
10346                        <= (GET_MODE_BITSIZE
10347                            (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10348                       && subreg_lowpart_p (XEXP (op0, 0))))
10349 #ifndef WORD_REGISTER_OPERATIONS
10350               /* It is unsafe to commute the AND into the SUBREG if the SUBREG
10351                  is paradoxical and WORD_REGISTER_OPERATIONS is not defined.
10352                  As originally written the upper bits have a defined value
10353                  due to the AND operation.  However, if we commute the AND
10354                  inside the SUBREG then they no longer have defined values
10355                  and the meaning of the code has been changed.  */
10356               && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0)))
10357                   <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
10358 #endif
10359               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10360               && mode_width <= HOST_BITS_PER_WIDE_INT
10361               && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
10362                   <= HOST_BITS_PER_WIDE_INT)
10363               && (INTVAL (XEXP (op0, 1)) & ~ mask) == 0
10364               && 0 == (~ GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
10365                        & INTVAL (XEXP (op0, 1)))
10366               && (unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1)) != mask
10367               && ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op0, 1))
10368                   != GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))))
10369                        
10370             {
10371               op0
10372                 = gen_lowpart_for_combine
10373                   (mode,
10374                    gen_binary (AND, GET_MODE (SUBREG_REG (XEXP (op0, 0))),
10375                                SUBREG_REG (XEXP (op0, 0)), XEXP (op0, 1)));
10376               continue;
10377             }
10378
10379           break;
10380
10381         case ASHIFT:
10382           /* If we have (compare (ashift FOO N) (const_int C)) and
10383              the high order N bits of FOO (N+1 if an inequality comparison)
10384              are known to be zero, we can do this by comparing FOO with C
10385              shifted right N bits so long as the low-order N bits of C are
10386              zero.  */
10387           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10388               && INTVAL (XEXP (op0, 1)) >= 0
10389               && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p)
10390                   < HOST_BITS_PER_WIDE_INT)
10391               && ((const_op
10392                    & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0)
10393               && mode_width <= HOST_BITS_PER_WIDE_INT
10394               && (nonzero_bits (XEXP (op0, 0), mode)
10395                   & ~ (mask >> (INTVAL (XEXP (op0, 1))
10396                                 + ! equality_comparison_p))) == 0)
10397             {
10398               /* We must perform a logical shift, not an arithmetic one,
10399                  as we want the top N bits of C to be zero.  */
10400               unsigned HOST_WIDE_INT temp = const_op & GET_MODE_MASK (mode);
10401               
10402               temp >>= INTVAL (XEXP (op0, 1));
10403               op1 = GEN_INT (trunc_int_for_mode (temp, mode));
10404               op0 = XEXP (op0, 0);
10405               continue;
10406             }
10407
10408           /* If we are doing a sign bit comparison, it means we are testing
10409              a particular bit.  Convert it to the appropriate AND.  */
10410           if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT
10411               && mode_width <= HOST_BITS_PER_WIDE_INT)
10412             {
10413               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10414                                             ((HOST_WIDE_INT) 1
10415                                              << (mode_width - 1
10416                                                  - INTVAL (XEXP (op0, 1)))));
10417               code = (code == LT ? NE : EQ);
10418               continue;
10419             }
10420
10421           /* If this an equality comparison with zero and we are shifting
10422              the low bit to the sign bit, we can convert this to an AND of the
10423              low-order bit.  */
10424           if (const_op == 0 && equality_comparison_p
10425               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10426               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10427             {
10428               op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0),
10429                                             (HOST_WIDE_INT) 1);
10430               continue;
10431             }
10432           break;
10433
10434         case ASHIFTRT:
10435           /* If this is an equality comparison with zero, we can do this
10436              as a logical shift, which might be much simpler.  */
10437           if (equality_comparison_p && const_op == 0
10438               && GET_CODE (XEXP (op0, 1)) == CONST_INT)
10439             {
10440               op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode,
10441                                           XEXP (op0, 0),
10442                                           INTVAL (XEXP (op0, 1)));
10443               continue;
10444             }
10445
10446           /* If OP0 is a sign extension and CODE is not an unsigned comparison,
10447              do the comparison in a narrower mode.  */
10448           if (! unsigned_comparison_p
10449               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10450               && GET_CODE (XEXP (op0, 0)) == ASHIFT
10451               && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1)
10452               && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)),
10453                                          MODE_INT, 1)) != BLKmode
10454               && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode)
10455                   || ((unsigned HOST_WIDE_INT) - const_op
10456                       <= GET_MODE_MASK (tmode))))
10457             {
10458               op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0));
10459               continue;
10460             }
10461
10462           /* ... fall through ...  */
10463         case LSHIFTRT:
10464           /* If we have (compare (xshiftrt FOO N) (const_int C)) and
10465              the low order N bits of FOO are known to be zero, we can do this
10466              by comparing FOO with C shifted left N bits so long as no
10467              overflow occurs.  */
10468           if (GET_CODE (XEXP (op0, 1)) == CONST_INT
10469               && INTVAL (XEXP (op0, 1)) >= 0
10470               && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT
10471               && mode_width <= HOST_BITS_PER_WIDE_INT
10472               && (nonzero_bits (XEXP (op0, 0), mode)
10473                   & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0
10474               && (const_op == 0
10475                   || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1))
10476                       < mode_width)))
10477             {
10478               const_op <<= INTVAL (XEXP (op0, 1));
10479               op1 = GEN_INT (const_op);
10480               op0 = XEXP (op0, 0);
10481               continue;
10482             }
10483
10484           /* If we are using this shift to extract just the sign bit, we
10485              can replace this with an LT or GE comparison.  */
10486           if (const_op == 0
10487               && (equality_comparison_p || sign_bit_comparison_p)
10488               && GET_CODE (XEXP (op0, 1)) == CONST_INT
10489               && INTVAL (XEXP (op0, 1)) == mode_width - 1)
10490             {
10491               op0 = XEXP (op0, 0);
10492               code = (code == NE || code == GT ? LT : GE);
10493               continue;
10494             }
10495           break;
10496           
10497         default:
10498           break;
10499         }
10500
10501       break;
10502     }
10503
10504   /* Now make any compound operations involved in this comparison.  Then,
10505      check for an outmost SUBREG on OP0 that is not doing anything or is
10506      paradoxical.  The latter case can only occur when it is known that the
10507      "extra" bits will be zero.  Therefore, it is safe to remove the SUBREG.
10508      We can never remove a SUBREG for a non-equality comparison because the
10509      sign bit is in a different place in the underlying object.  */
10510
10511   op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET);
10512   op1 = make_compound_operation (op1, SET);
10513
10514   if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10515       && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10516       && (code == NE || code == EQ)
10517       && ((GET_MODE_SIZE (GET_MODE (op0))
10518            > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0))))))
10519     {
10520       op0 = SUBREG_REG (op0);
10521       op1 = gen_lowpart_for_combine (GET_MODE (op0), op1);
10522     }
10523
10524   else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0)
10525            && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
10526            && (code == NE || code == EQ)
10527            && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0)))
10528                <= HOST_BITS_PER_WIDE_INT)
10529            && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0)))
10530                & ~ GET_MODE_MASK (GET_MODE (op0))) == 0
10531            && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)),
10532                                               op1),
10533                (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0)))
10534                 & ~ GET_MODE_MASK (GET_MODE (op0))) == 0))
10535     op0 = SUBREG_REG (op0), op1 = tem;
10536
10537   /* We now do the opposite procedure: Some machines don't have compare
10538      insns in all modes.  If OP0's mode is an integer mode smaller than a
10539      word and we can't do a compare in that mode, see if there is a larger
10540      mode for which we can do the compare.  There are a number of cases in
10541      which we can use the wider mode.  */
10542
10543   mode = GET_MODE (op0);
10544   if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT
10545       && GET_MODE_SIZE (mode) < UNITS_PER_WORD
10546       && cmp_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing)
10547     for (tmode = GET_MODE_WIDER_MODE (mode);
10548          (tmode != VOIDmode
10549           && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT);
10550          tmode = GET_MODE_WIDER_MODE (tmode))
10551       if (cmp_optab->handlers[(int) tmode].insn_code != CODE_FOR_nothing)
10552         {
10553           /* If the only nonzero bits in OP0 and OP1 are those in the
10554              narrower mode and this is an equality or unsigned comparison,
10555              we can use the wider mode.  Similarly for sign-extended
10556              values, in which case it is true for all comparisons.  */
10557           if (((code == EQ || code == NE
10558                 || code == GEU || code == GTU || code == LEU || code == LTU)
10559                && (nonzero_bits (op0, tmode) & ~ GET_MODE_MASK (mode)) == 0
10560                && (nonzero_bits (op1, tmode) & ~ GET_MODE_MASK (mode)) == 0)
10561               || ((num_sign_bit_copies (op0, tmode)
10562                    > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
10563                   && (num_sign_bit_copies (op1, tmode)
10564                       > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
10565             {
10566               op0 = gen_lowpart_for_combine (tmode, op0);
10567               op1 = gen_lowpart_for_combine (tmode, op1);
10568               break;
10569             }
10570
10571           /* If this is a test for negative, we can make an explicit
10572              test of the sign bit.  */
10573
10574           if (op1 == const0_rtx && (code == LT || code == GE)
10575               && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
10576             {
10577               op0 = gen_binary (AND, tmode,
10578                                 gen_lowpart_for_combine (tmode, op0),
10579                                 GEN_INT ((HOST_WIDE_INT) 1
10580                                          << (GET_MODE_BITSIZE (mode) - 1)));
10581               code = (code == LT) ? NE : EQ;
10582               break;
10583             }
10584         }
10585
10586 #ifdef CANONICALIZE_COMPARISON
10587   /* If this machine only supports a subset of valid comparisons, see if we
10588      can convert an unsupported one into a supported one.  */
10589   CANONICALIZE_COMPARISON (code, op0, op1);
10590 #endif
10591
10592   *pop0 = op0;
10593   *pop1 = op1;
10594
10595   return code;
10596 }
10597 \f
10598 /* Return 1 if we know that X, a comparison operation, is not operating
10599    on a floating-point value or is EQ or NE, meaning that we can safely
10600    reverse it.  */
10601
10602 static int
10603 reversible_comparison_p (x)
10604      rtx x;
10605 {
10606   if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT
10607       || flag_fast_math
10608       || GET_CODE (x) == NE || GET_CODE (x) == EQ)
10609     return 1;
10610
10611   switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))))
10612     {
10613     case MODE_INT:
10614     case MODE_PARTIAL_INT:
10615     case MODE_COMPLEX_INT:
10616       return 1;
10617
10618     case MODE_CC:
10619       /* If the mode of the condition codes tells us that this is safe,
10620          we need look no further.  */
10621       if (REVERSIBLE_CC_MODE (GET_MODE (XEXP (x, 0))))
10622         return 1;
10623
10624       /* Otherwise try and find where the condition codes were last set and
10625          use that.  */
10626       x = get_last_value (XEXP (x, 0));
10627       return (x && GET_CODE (x) == COMPARE
10628               && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0))));
10629       
10630     default:
10631       return 0;
10632     }
10633 }
10634 \f
10635 /* Utility function for following routine.  Called when X is part of a value
10636    being stored into reg_last_set_value.  Sets reg_last_set_table_tick
10637    for each register mentioned.  Similar to mention_regs in cse.c  */
10638
10639 static void
10640 update_table_tick (x)
10641      rtx x;
10642 {
10643   register enum rtx_code code = GET_CODE (x);
10644   register const char *fmt = GET_RTX_FORMAT (code);
10645   register int i;
10646
10647   if (code == REG)
10648     {
10649       int regno = REGNO (x);
10650       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
10651                               ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
10652
10653       for (i = regno; i < endregno; i++)
10654         reg_last_set_table_tick[i] = label_tick;
10655
10656       return;
10657     }
10658   
10659   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
10660     /* Note that we can't have an "E" in values stored; see
10661        get_last_value_validate.  */
10662     if (fmt[i] == 'e')
10663       update_table_tick (XEXP (x, i));
10664 }
10665
10666 /* Record that REG is set to VALUE in insn INSN.  If VALUE is zero, we
10667    are saying that the register is clobbered and we no longer know its
10668    value.  If INSN is zero, don't update reg_last_set; this is only permitted
10669    with VALUE also zero and is used to invalidate the register.  */
10670
10671 static void
10672 record_value_for_reg (reg, insn, value)
10673      rtx reg;
10674      rtx insn;
10675      rtx value;
10676 {
10677   int regno = REGNO (reg);
10678   int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
10679                           ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1);
10680   int i;
10681
10682   /* If VALUE contains REG and we have a previous value for REG, substitute
10683      the previous value.  */
10684   if (value && insn && reg_overlap_mentioned_p (reg, value))
10685     {
10686       rtx tem;
10687
10688       /* Set things up so get_last_value is allowed to see anything set up to
10689          our insn.  */
10690       subst_low_cuid = INSN_CUID (insn);
10691       tem = get_last_value (reg);      
10692
10693       if (tem)
10694         value = replace_rtx (copy_rtx (value), reg, tem);
10695     }
10696
10697   /* For each register modified, show we don't know its value, that
10698      we don't know about its bitwise content, that its value has been
10699      updated, and that we don't know the location of the death of the
10700      register.  */
10701   for (i = regno; i < endregno; i ++)
10702     {
10703       if (insn)
10704         reg_last_set[i] = insn;
10705       reg_last_set_value[i] = 0;
10706       reg_last_set_mode[i] = 0;
10707       reg_last_set_nonzero_bits[i] = 0;
10708       reg_last_set_sign_bit_copies[i] = 0;
10709       reg_last_death[i] = 0;
10710     }
10711
10712   /* Mark registers that are being referenced in this value.  */
10713   if (value)
10714     update_table_tick (value);
10715
10716   /* Now update the status of each register being set.
10717      If someone is using this register in this block, set this register
10718      to invalid since we will get confused between the two lives in this
10719      basic block.  This makes using this register always invalid.  In cse, we
10720      scan the table to invalidate all entries using this register, but this
10721      is too much work for us.  */
10722
10723   for (i = regno; i < endregno; i++)
10724     {
10725       reg_last_set_label[i] = label_tick;
10726       if (value && reg_last_set_table_tick[i] == label_tick)
10727         reg_last_set_invalid[i] = 1;
10728       else
10729         reg_last_set_invalid[i] = 0;
10730     }
10731
10732   /* The value being assigned might refer to X (like in "x++;").  In that
10733      case, we must replace it with (clobber (const_int 0)) to prevent
10734      infinite loops.  */
10735   if (value && ! get_last_value_validate (&value, insn,
10736                                           reg_last_set_label[regno], 0))
10737     {
10738       value = copy_rtx (value);
10739       if (! get_last_value_validate (&value, insn,
10740                                      reg_last_set_label[regno], 1))
10741         value = 0;
10742     }
10743
10744   /* For the main register being modified, update the value, the mode, the
10745      nonzero bits, and the number of sign bit copies.  */
10746
10747   reg_last_set_value[regno] = value;
10748
10749   if (value)
10750     {
10751       subst_low_cuid = INSN_CUID (insn);
10752       reg_last_set_mode[regno] = GET_MODE (reg);
10753       reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg));
10754       reg_last_set_sign_bit_copies[regno]
10755         = num_sign_bit_copies (value, GET_MODE (reg));
10756     }
10757 }
10758
10759 /* Called via note_stores from record_dead_and_set_regs to handle one
10760    SET or CLOBBER in an insn.  DATA is the instruction in which the
10761    set is occurring.  */
10762
10763 static void
10764 record_dead_and_set_regs_1 (dest, setter, data)
10765      rtx dest, setter;
10766      void *data;
10767 {
10768   rtx record_dead_insn = (rtx) data;
10769
10770   if (GET_CODE (dest) == SUBREG)
10771     dest = SUBREG_REG (dest);
10772
10773   if (GET_CODE (dest) == REG)
10774     {
10775       /* If we are setting the whole register, we know its value.  Otherwise
10776          show that we don't know the value.  We can handle SUBREG in
10777          some cases.  */
10778       if (GET_CODE (setter) == SET && dest == SET_DEST (setter))
10779         record_value_for_reg (dest, record_dead_insn, SET_SRC (setter));
10780       else if (GET_CODE (setter) == SET
10781                && GET_CODE (SET_DEST (setter)) == SUBREG
10782                && SUBREG_REG (SET_DEST (setter)) == dest
10783                && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD
10784                && subreg_lowpart_p (SET_DEST (setter)))
10785         record_value_for_reg (dest, record_dead_insn,
10786                               gen_lowpart_for_combine (GET_MODE (dest),
10787                                                        SET_SRC (setter)));
10788       else
10789         record_value_for_reg (dest, record_dead_insn, NULL_RTX);
10790     }
10791   else if (GET_CODE (dest) == MEM
10792            /* Ignore pushes, they clobber nothing.  */
10793            && ! push_operand (dest, GET_MODE (dest)))
10794     mem_last_set = INSN_CUID (record_dead_insn);
10795 }
10796
10797 /* Update the records of when each REG was most recently set or killed
10798    for the things done by INSN.  This is the last thing done in processing
10799    INSN in the combiner loop.
10800
10801    We update reg_last_set, reg_last_set_value, reg_last_set_mode,
10802    reg_last_set_nonzero_bits, reg_last_set_sign_bit_copies, reg_last_death,
10803    and also the similar information mem_last_set (which insn most recently
10804    modified memory) and last_call_cuid (which insn was the most recent
10805    subroutine call).  */
10806
10807 static void
10808 record_dead_and_set_regs (insn)
10809      rtx insn;
10810 {
10811   register rtx link;
10812   int i;
10813
10814   for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
10815     {
10816       if (REG_NOTE_KIND (link) == REG_DEAD
10817           && GET_CODE (XEXP (link, 0)) == REG)
10818         {
10819           int regno = REGNO (XEXP (link, 0));
10820           int endregno
10821             = regno + (regno < FIRST_PSEUDO_REGISTER
10822                        ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0)))
10823                        : 1);
10824
10825           for (i = regno; i < endregno; i++)
10826             reg_last_death[i] = insn;
10827         }
10828       else if (REG_NOTE_KIND (link) == REG_INC)
10829         record_value_for_reg (XEXP (link, 0), insn, NULL_RTX);
10830     }
10831
10832   if (GET_CODE (insn) == CALL_INSN)
10833     {
10834       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
10835         if (call_used_regs[i])
10836           {
10837             reg_last_set_value[i] = 0;
10838             reg_last_set_mode[i] = 0;
10839             reg_last_set_nonzero_bits[i] = 0;
10840             reg_last_set_sign_bit_copies[i] = 0;
10841             reg_last_death[i] = 0;
10842           }
10843
10844       last_call_cuid = mem_last_set = INSN_CUID (insn);
10845     }
10846
10847   note_stores (PATTERN (insn), record_dead_and_set_regs_1, insn);
10848 }
10849 \f
10850 /* Utility routine for the following function.  Verify that all the registers
10851    mentioned in *LOC are valid when *LOC was part of a value set when
10852    label_tick == TICK.  Return 0 if some are not.
10853
10854    If REPLACE is non-zero, replace the invalid reference with
10855    (clobber (const_int 0)) and return 1.  This replacement is useful because
10856    we often can get useful information about the form of a value (e.g., if
10857    it was produced by a shift that always produces -1 or 0) even though
10858    we don't know exactly what registers it was produced from.  */
10859
10860 static int
10861 get_last_value_validate (loc, insn, tick, replace)
10862      rtx *loc;
10863      rtx insn;
10864      int tick;
10865      int replace;
10866 {
10867   rtx x = *loc;
10868   const char *fmt = GET_RTX_FORMAT (GET_CODE (x));
10869   int len = GET_RTX_LENGTH (GET_CODE (x));
10870   int i;
10871
10872   if (GET_CODE (x) == REG)
10873     {
10874       int regno = REGNO (x);
10875       int endregno = regno + (regno < FIRST_PSEUDO_REGISTER
10876                               ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
10877       int j;
10878
10879       for (j = regno; j < endregno; j++)
10880         if (reg_last_set_invalid[j]
10881             /* If this is a pseudo-register that was only set once and not
10882                live at the beginning of the function, it is always valid.  */
10883             || (! (regno >= FIRST_PSEUDO_REGISTER 
10884                    && REG_N_SETS (regno) == 1
10885                    && ! REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno))
10886                 && reg_last_set_label[j] > tick))
10887           {
10888             if (replace)
10889               *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
10890             return replace;
10891           }
10892
10893       return 1;
10894     }
10895   /* If this is a memory reference, make sure that there were
10896      no stores after it that might have clobbered the value.  We don't
10897      have alias info, so we assume any store invalidates it.  */
10898   else if (GET_CODE (x) == MEM && ! RTX_UNCHANGING_P (x)
10899            && INSN_CUID (insn) <= mem_last_set)
10900     {
10901       if (replace)
10902         *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
10903       return replace;
10904     }
10905
10906   for (i = 0; i < len; i++)
10907     if ((fmt[i] == 'e'
10908          && get_last_value_validate (&XEXP (x, i), insn, tick, replace) == 0)
10909         /* Don't bother with these.  They shouldn't occur anyway.  */
10910         || fmt[i] == 'E')
10911       return 0;
10912
10913   /* If we haven't found a reason for it to be invalid, it is valid.  */
10914   return 1;
10915 }
10916
10917 /* Get the last value assigned to X, if known.  Some registers
10918    in the value may be replaced with (clobber (const_int 0)) if their value
10919    is known longer known reliably.  */
10920
10921 static rtx
10922 get_last_value (x)
10923      rtx x;
10924 {
10925   int regno;
10926   rtx value;
10927
10928   /* If this is a non-paradoxical SUBREG, get the value of its operand and
10929      then convert it to the desired mode.  If this is a paradoxical SUBREG,
10930      we cannot predict what values the "extra" bits might have.  */
10931   if (GET_CODE (x) == SUBREG
10932       && subreg_lowpart_p (x)
10933       && (GET_MODE_SIZE (GET_MODE (x))
10934           <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
10935       && (value = get_last_value (SUBREG_REG (x))) != 0)
10936     return gen_lowpart_for_combine (GET_MODE (x), value);
10937
10938   if (GET_CODE (x) != REG)
10939     return 0;
10940
10941   regno = REGNO (x);
10942   value = reg_last_set_value[regno];
10943
10944   /* If we don't have a value, or if it isn't for this basic block and
10945      it's either a hard register, set more than once, or it's a live
10946      at the beginning of the function, return 0.  
10947
10948      Because if it's not live at the beginnning of the function then the reg 
10949      is always set before being used (is never used without being set).
10950      And, if it's set only once, and it's always set before use, then all
10951      uses must have the same last value, even if it's not from this basic
10952      block.  */
10953
10954   if (value == 0
10955       || (reg_last_set_label[regno] != label_tick
10956           && (regno < FIRST_PSEUDO_REGISTER
10957               || REG_N_SETS (regno) != 1
10958               || REGNO_REG_SET_P (BASIC_BLOCK (0)->global_live_at_start, regno))))
10959     return 0;
10960
10961   /* If the value was set in a later insn than the ones we are processing,
10962      we can't use it even if the register was only set once.  */
10963   if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
10964     return 0;
10965
10966   /* If the value has all its registers valid, return it.  */
10967   if (get_last_value_validate (&value, reg_last_set[regno],
10968                                reg_last_set_label[regno], 0))
10969     return value;
10970
10971   /* Otherwise, make a copy and replace any invalid register with
10972      (clobber (const_int 0)).  If that fails for some reason, return 0.  */
10973
10974   value = copy_rtx (value);
10975   if (get_last_value_validate (&value, reg_last_set[regno],
10976                                reg_last_set_label[regno], 1))
10977     return value;
10978
10979   return 0;
10980 }
10981 \f
10982 /* Return nonzero if expression X refers to a REG or to memory
10983    that is set in an instruction more recent than FROM_CUID.  */
10984
10985 static int
10986 use_crosses_set_p (x, from_cuid)
10987      register rtx x;
10988      int from_cuid;
10989 {
10990   register const char *fmt;
10991   register int i;
10992   register enum rtx_code code = GET_CODE (x);
10993
10994   if (code == REG)
10995     {
10996       register int regno = REGNO (x);
10997       int endreg = regno + (regno < FIRST_PSEUDO_REGISTER
10998                             ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1);
10999       
11000 #ifdef PUSH_ROUNDING
11001       /* Don't allow uses of the stack pointer to be moved,
11002          because we don't know whether the move crosses a push insn.  */
11003       if (regno == STACK_POINTER_REGNUM)
11004         return 1;
11005 #endif
11006       for (;regno < endreg; regno++)
11007         if (reg_last_set[regno]
11008             && INSN_CUID (reg_last_set[regno]) > from_cuid)
11009           return 1;
11010       return 0;
11011     }
11012
11013   if (code == MEM && mem_last_set > from_cuid)
11014     return 1;
11015
11016   fmt = GET_RTX_FORMAT (code);
11017
11018   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11019     {
11020       if (fmt[i] == 'E')
11021         {
11022           register int j;
11023           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11024             if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid))
11025               return 1;
11026         }
11027       else if (fmt[i] == 'e'
11028                && use_crosses_set_p (XEXP (x, i), from_cuid))
11029         return 1;
11030     }
11031   return 0;
11032 }
11033 \f
11034 /* Define three variables used for communication between the following
11035    routines.  */
11036
11037 static int reg_dead_regno, reg_dead_endregno;
11038 static int reg_dead_flag;
11039
11040 /* Function called via note_stores from reg_dead_at_p.
11041
11042    If DEST is within [reg_dead_regno, reg_dead_endregno), set 
11043    reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET.  */
11044
11045 static void
11046 reg_dead_at_p_1 (dest, x, data)
11047      rtx dest;
11048      rtx x;
11049      void *data ATTRIBUTE_UNUSED;
11050 {
11051   int regno, endregno;
11052
11053   if (GET_CODE (dest) != REG)
11054     return;
11055
11056   regno = REGNO (dest);
11057   endregno = regno + (regno < FIRST_PSEUDO_REGISTER 
11058                       ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1);
11059
11060   if (reg_dead_endregno > regno && reg_dead_regno < endregno)
11061     reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1;
11062 }
11063
11064 /* Return non-zero if REG is known to be dead at INSN.
11065
11066    We scan backwards from INSN.  If we hit a REG_DEAD note or a CLOBBER
11067    referencing REG, it is dead.  If we hit a SET referencing REG, it is
11068    live.  Otherwise, see if it is live or dead at the start of the basic
11069    block we are in.  Hard regs marked as being live in NEWPAT_USED_REGS
11070    must be assumed to be always live.  */
11071
11072 static int
11073 reg_dead_at_p (reg, insn)
11074      rtx reg;
11075      rtx insn;
11076 {
11077   int block, i;
11078
11079   /* Set variables for reg_dead_at_p_1.  */
11080   reg_dead_regno = REGNO (reg);
11081   reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER
11082                                         ? HARD_REGNO_NREGS (reg_dead_regno,
11083                                                             GET_MODE (reg))
11084                                         : 1);
11085
11086   reg_dead_flag = 0;
11087
11088   /* Check that reg isn't mentioned in NEWPAT_USED_REGS.  */
11089   if (reg_dead_regno < FIRST_PSEUDO_REGISTER)
11090     {
11091       for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11092         if (TEST_HARD_REG_BIT (newpat_used_regs, i))
11093           return 0;
11094     }
11095
11096   /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or
11097      beginning of function.  */
11098   for (; insn && GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != BARRIER;
11099        insn = prev_nonnote_insn (insn))
11100     {
11101       note_stores (PATTERN (insn), reg_dead_at_p_1, NULL);
11102       if (reg_dead_flag)
11103         return reg_dead_flag == 1 ? 1 : 0;
11104
11105       if (find_regno_note (insn, REG_DEAD, reg_dead_regno))
11106         return 1;
11107     }
11108
11109   /* Get the basic block number that we were in.  */
11110   if (insn == 0)
11111     block = 0;
11112   else
11113     {
11114       for (block = 0; block < n_basic_blocks; block++)
11115         if (insn == BLOCK_HEAD (block))
11116           break;
11117
11118       if (block == n_basic_blocks)
11119         return 0;
11120     }
11121
11122   for (i = reg_dead_regno; i < reg_dead_endregno; i++)
11123     if (REGNO_REG_SET_P (BASIC_BLOCK (block)->global_live_at_start, i))
11124       return 0;
11125
11126   return 1;
11127 }
11128 \f
11129 /* Note hard registers in X that are used.  This code is similar to
11130    that in flow.c, but much simpler since we don't care about pseudos.  */
11131
11132 static void
11133 mark_used_regs_combine (x)
11134      rtx x;
11135 {
11136   register RTX_CODE code = GET_CODE (x);
11137   register int regno;
11138   int i;
11139
11140   switch (code)
11141     {
11142     case LABEL_REF:
11143     case SYMBOL_REF:
11144     case CONST_INT:
11145     case CONST:
11146     case CONST_DOUBLE:
11147     case PC:
11148     case ADDR_VEC:
11149     case ADDR_DIFF_VEC:
11150     case ASM_INPUT:
11151 #ifdef HAVE_cc0
11152     /* CC0 must die in the insn after it is set, so we don't need to take
11153        special note of it here.  */
11154     case CC0:
11155 #endif
11156       return;
11157
11158     case CLOBBER:
11159       /* If we are clobbering a MEM, mark any hard registers inside the
11160          address as used.  */
11161       if (GET_CODE (XEXP (x, 0)) == MEM)
11162         mark_used_regs_combine (XEXP (XEXP (x, 0), 0));
11163       return;
11164
11165     case REG:
11166       regno = REGNO (x);
11167       /* A hard reg in a wide mode may really be multiple registers.
11168          If so, mark all of them just like the first.  */
11169       if (regno < FIRST_PSEUDO_REGISTER)
11170         {
11171           /* None of this applies to the stack, frame or arg pointers */
11172           if (regno == STACK_POINTER_REGNUM
11173 #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
11174               || regno == HARD_FRAME_POINTER_REGNUM
11175 #endif
11176 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
11177               || (regno == ARG_POINTER_REGNUM && fixed_regs[regno])
11178 #endif
11179               || regno == FRAME_POINTER_REGNUM)
11180             return;
11181
11182           i = HARD_REGNO_NREGS (regno, GET_MODE (x));
11183           while (i-- > 0)
11184             SET_HARD_REG_BIT (newpat_used_regs, regno + i);
11185         }
11186       return;
11187
11188     case SET:
11189       {
11190         /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in
11191            the address.  */
11192         register rtx testreg = SET_DEST (x);
11193
11194         while (GET_CODE (testreg) == SUBREG
11195                || GET_CODE (testreg) == ZERO_EXTRACT
11196                || GET_CODE (testreg) == SIGN_EXTRACT
11197                || GET_CODE (testreg) == STRICT_LOW_PART)
11198           testreg = XEXP (testreg, 0);
11199
11200         if (GET_CODE (testreg) == MEM)
11201           mark_used_regs_combine (XEXP (testreg, 0));
11202
11203         mark_used_regs_combine (SET_SRC (x));
11204       }
11205       return;
11206
11207     default:
11208       break;
11209     }
11210
11211   /* Recursively scan the operands of this expression.  */
11212
11213   {
11214     register const char *fmt = GET_RTX_FORMAT (code);
11215
11216     for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
11217       {
11218         if (fmt[i] == 'e')
11219           mark_used_regs_combine (XEXP (x, i));
11220         else if (fmt[i] == 'E')
11221           {
11222             register int j;
11223
11224             for (j = 0; j < XVECLEN (x, i); j++)
11225               mark_used_regs_combine (XVECEXP (x, i, j));
11226           }
11227       }
11228   }
11229 }
11230
11231 \f
11232 /* Remove register number REGNO from the dead registers list of INSN.
11233
11234    Return the note used to record the death, if there was one.  */
11235
11236 rtx
11237 remove_death (regno, insn)
11238      int regno;
11239      rtx insn;
11240 {
11241   register rtx note = find_regno_note (insn, REG_DEAD, regno);
11242
11243   if (note)
11244     {
11245       REG_N_DEATHS (regno)--;
11246       remove_note (insn, note);
11247     }
11248
11249   return note;
11250 }
11251
11252 /* For each register (hardware or pseudo) used within expression X, if its
11253    death is in an instruction with cuid between FROM_CUID (inclusive) and
11254    TO_INSN (exclusive), put a REG_DEAD note for that register in the
11255    list headed by PNOTES. 
11256
11257    That said, don't move registers killed by maybe_kill_insn.
11258
11259    This is done when X is being merged by combination into TO_INSN.  These
11260    notes will then be distributed as needed.  */
11261
11262 static void
11263 move_deaths (x, maybe_kill_insn, from_cuid, to_insn, pnotes)
11264      rtx x;
11265      rtx maybe_kill_insn;
11266      int from_cuid;
11267      rtx to_insn;
11268      rtx *pnotes;
11269 {
11270   register const char *fmt;
11271   register int len, i;
11272   register enum rtx_code code = GET_CODE (x);
11273
11274   if (code == REG)
11275     {
11276       register int regno = REGNO (x);
11277       register rtx where_dead = reg_last_death[regno];
11278       register rtx before_dead, after_dead;
11279
11280       /* Don't move the register if it gets killed in between from and to */
11281       if (maybe_kill_insn && reg_set_p (x, maybe_kill_insn)
11282           && !reg_referenced_p (x, maybe_kill_insn))
11283         return;
11284
11285       /* WHERE_DEAD could be a USE insn made by combine, so first we
11286          make sure that we have insns with valid INSN_CUID values.  */
11287       before_dead = where_dead;
11288       while (before_dead && INSN_UID (before_dead) > max_uid_cuid)
11289         before_dead = PREV_INSN (before_dead);
11290       after_dead = where_dead;
11291       while (after_dead && INSN_UID (after_dead) > max_uid_cuid)
11292         after_dead = NEXT_INSN (after_dead);
11293
11294       if (before_dead && after_dead
11295           && INSN_CUID (before_dead) >= from_cuid
11296           && (INSN_CUID (after_dead) < INSN_CUID (to_insn)
11297               || (where_dead != after_dead
11298                   && INSN_CUID (after_dead) == INSN_CUID (to_insn))))
11299         {
11300           rtx note = remove_death (regno, where_dead);
11301
11302           /* It is possible for the call above to return 0.  This can occur
11303              when reg_last_death points to I2 or I1 that we combined with.
11304              In that case make a new note.
11305
11306              We must also check for the case where X is a hard register
11307              and NOTE is a death note for a range of hard registers
11308              including X.  In that case, we must put REG_DEAD notes for
11309              the remaining registers in place of NOTE.  */
11310
11311           if (note != 0 && regno < FIRST_PSEUDO_REGISTER
11312               && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11313                   > GET_MODE_SIZE (GET_MODE (x))))
11314             {
11315               int deadregno = REGNO (XEXP (note, 0));
11316               int deadend
11317                 = (deadregno + HARD_REGNO_NREGS (deadregno,
11318                                                  GET_MODE (XEXP (note, 0))));
11319               int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11320               int i;
11321
11322               for (i = deadregno; i < deadend; i++)
11323                 if (i < regno || i >= ourend)
11324                   REG_NOTES (where_dead)
11325                     = gen_rtx_EXPR_LIST (REG_DEAD,
11326                                          gen_rtx_REG (reg_raw_mode[i], i),
11327                                          REG_NOTES (where_dead));
11328             }
11329           /* If we didn't find any note, or if we found a REG_DEAD note that
11330              covers only part of the given reg, and we have a multi-reg hard
11331              register, then to be safe we must check for REG_DEAD notes
11332              for each register other than the first.  They could have
11333              their own REG_DEAD notes lying around.  */
11334           else if ((note == 0
11335                     || (note != 0
11336                         && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0)))
11337                             < GET_MODE_SIZE (GET_MODE (x)))))
11338                    && regno < FIRST_PSEUDO_REGISTER
11339                    && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1)
11340             {
11341               int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11342               int i, offset;
11343               rtx oldnotes = 0;
11344
11345               if (note)
11346                 offset = HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0)));
11347               else
11348                 offset = 1;
11349
11350               for (i = regno + offset; i < ourend; i++)
11351                 move_deaths (gen_rtx_REG (reg_raw_mode[i], i),
11352                              maybe_kill_insn, from_cuid, to_insn, &oldnotes);
11353             }
11354
11355           if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x))
11356             {
11357               XEXP (note, 1) = *pnotes;
11358               *pnotes = note;
11359             }
11360           else
11361             *pnotes = gen_rtx_EXPR_LIST (REG_DEAD, x, *pnotes);
11362
11363           REG_N_DEATHS (regno)++;
11364         }
11365
11366       return;
11367     }
11368
11369   else if (GET_CODE (x) == SET)
11370     {
11371       rtx dest = SET_DEST (x);
11372
11373       move_deaths (SET_SRC (x), maybe_kill_insn, from_cuid, to_insn, pnotes);
11374
11375       /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG
11376          that accesses one word of a multi-word item, some
11377          piece of everything register in the expression is used by
11378          this insn, so remove any old death.  */
11379
11380       if (GET_CODE (dest) == ZERO_EXTRACT
11381           || GET_CODE (dest) == STRICT_LOW_PART
11382           || (GET_CODE (dest) == SUBREG
11383               && (((GET_MODE_SIZE (GET_MODE (dest))
11384                     + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
11385                   == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
11386                        + UNITS_PER_WORD - 1) / UNITS_PER_WORD))))
11387         {
11388           move_deaths (dest, maybe_kill_insn, from_cuid, to_insn, pnotes);
11389           return;
11390         }
11391
11392       /* If this is some other SUBREG, we know it replaces the entire
11393          value, so use that as the destination.  */
11394       if (GET_CODE (dest) == SUBREG)
11395         dest = SUBREG_REG (dest);
11396
11397       /* If this is a MEM, adjust deaths of anything used in the address.
11398          For a REG (the only other possibility), the entire value is
11399          being replaced so the old value is not used in this insn.  */
11400
11401       if (GET_CODE (dest) == MEM)
11402         move_deaths (XEXP (dest, 0), maybe_kill_insn, from_cuid,
11403                      to_insn, pnotes);
11404       return;
11405     }
11406
11407   else if (GET_CODE (x) == CLOBBER)
11408     return;
11409
11410   len = GET_RTX_LENGTH (code);
11411   fmt = GET_RTX_FORMAT (code);
11412
11413   for (i = 0; i < len; i++)
11414     {
11415       if (fmt[i] == 'E')
11416         {
11417           register int j;
11418           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
11419             move_deaths (XVECEXP (x, i, j), maybe_kill_insn, from_cuid,
11420                          to_insn, pnotes);
11421         }
11422       else if (fmt[i] == 'e')
11423         move_deaths (XEXP (x, i), maybe_kill_insn, from_cuid, to_insn, pnotes);
11424     }
11425 }
11426 \f
11427 /* Return 1 if X is the target of a bit-field assignment in BODY, the
11428    pattern of an insn.  X must be a REG.  */
11429
11430 static int
11431 reg_bitfield_target_p (x, body)
11432      rtx x;
11433      rtx body;
11434 {
11435   int i;
11436
11437   if (GET_CODE (body) == SET)
11438     {
11439       rtx dest = SET_DEST (body);
11440       rtx target;
11441       int regno, tregno, endregno, endtregno;
11442
11443       if (GET_CODE (dest) == ZERO_EXTRACT)
11444         target = XEXP (dest, 0);
11445       else if (GET_CODE (dest) == STRICT_LOW_PART)
11446         target = SUBREG_REG (XEXP (dest, 0));
11447       else
11448         return 0;
11449
11450       if (GET_CODE (target) == SUBREG)
11451         target = SUBREG_REG (target);
11452
11453       if (GET_CODE (target) != REG)
11454         return 0;
11455
11456       tregno = REGNO (target), regno = REGNO (x);
11457       if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER)
11458         return target == x;
11459
11460       endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target));
11461       endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x));
11462
11463       return endregno > tregno && regno < endtregno;
11464     }
11465
11466   else if (GET_CODE (body) == PARALLEL)
11467     for (i = XVECLEN (body, 0) - 1; i >= 0; i--)
11468       if (reg_bitfield_target_p (x, XVECEXP (body, 0, i)))
11469         return 1;
11470
11471   return 0;
11472 }      
11473 \f
11474 /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them
11475    as appropriate.  I3 and I2 are the insns resulting from the combination
11476    insns including FROM (I2 may be zero).
11477
11478    ELIM_I2 and ELIM_I1 are either zero or registers that we know will
11479    not need REG_DEAD notes because they are being substituted for.  This
11480    saves searching in the most common cases.
11481
11482    Each note in the list is either ignored or placed on some insns, depending
11483    on the type of note.  */
11484
11485 static void
11486 distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
11487      rtx notes;
11488      rtx from_insn;
11489      rtx i3, i2;
11490      rtx elim_i2, elim_i1;
11491 {
11492   rtx note, next_note;
11493   rtx tem;
11494
11495   for (note = notes; note; note = next_note)
11496     {
11497       rtx place = 0, place2 = 0;
11498
11499       /* If this NOTE references a pseudo register, ensure it references
11500          the latest copy of that register.  */
11501       if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG
11502           && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER)
11503         XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))];
11504
11505       next_note = XEXP (note, 1);
11506       switch (REG_NOTE_KIND (note))
11507         {
11508         case REG_BR_PROB:
11509         case REG_EXEC_COUNT:
11510           /* Doesn't matter much where we put this, as long as it's somewhere.
11511              It is preferable to keep these notes on branches, which is most
11512              likely to be i3.  */
11513           place = i3;
11514           break;
11515
11516         case REG_EH_REGION:
11517         case REG_EH_RETHROW:
11518           /* These notes must remain with the call.  It should not be
11519              possible for both I2 and I3 to be a call.  */
11520           if (GET_CODE (i3) == CALL_INSN) 
11521             place = i3;
11522           else if (i2 && GET_CODE (i2) == CALL_INSN)
11523             place = i2;
11524           else
11525             abort ();
11526           break;
11527
11528         case REG_UNUSED:
11529           /* Any clobbers for i3 may still exist, and so we must process
11530              REG_UNUSED notes from that insn.
11531
11532              Any clobbers from i2 or i1 can only exist if they were added by
11533              recog_for_combine.  In that case, recog_for_combine created the
11534              necessary REG_UNUSED notes.  Trying to keep any original
11535              REG_UNUSED notes from these insns can cause incorrect output
11536              if it is for the same register as the original i3 dest.
11537              In that case, we will notice that the register is set in i3,
11538              and then add a REG_UNUSED note for the destination of i3, which
11539              is wrong.  However, it is possible to have REG_UNUSED notes from
11540              i2 or i1 for register which were both used and clobbered, so
11541              we keep notes from i2 or i1 if they will turn into REG_DEAD
11542              notes.  */
11543
11544           /* If this register is set or clobbered in I3, put the note there
11545              unless there is one already.  */
11546           if (reg_set_p (XEXP (note, 0), PATTERN (i3)))
11547             {
11548               if (from_insn != i3)
11549                 break;
11550
11551               if (! (GET_CODE (XEXP (note, 0)) == REG
11552                      ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0)))
11553                      : find_reg_note (i3, REG_UNUSED, XEXP (note, 0))))
11554                 place = i3;
11555             }
11556           /* Otherwise, if this register is used by I3, then this register
11557              now dies here, so we must put a REG_DEAD note here unless there
11558              is one already.  */
11559           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))
11560                    && ! (GET_CODE (XEXP (note, 0)) == REG
11561                          ? find_regno_note (i3, REG_DEAD, REGNO (XEXP (note, 0)))
11562                          : find_reg_note (i3, REG_DEAD, XEXP (note, 0))))
11563             {
11564               PUT_REG_NOTE_KIND (note, REG_DEAD);
11565               place = i3;
11566             }
11567           break;
11568
11569         case REG_EQUAL:
11570         case REG_EQUIV:
11571         case REG_NONNEG:
11572         case REG_NOALIAS:
11573           /* These notes say something about results of an insn.  We can
11574              only support them if they used to be on I3 in which case they
11575              remain on I3.  Otherwise they are ignored.
11576
11577              If the note refers to an expression that is not a constant, we
11578              must also ignore the note since we cannot tell whether the
11579              equivalence is still true.  It might be possible to do
11580              slightly better than this (we only have a problem if I2DEST
11581              or I1DEST is present in the expression), but it doesn't
11582              seem worth the trouble.  */
11583
11584           if (from_insn == i3
11585               && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0))))
11586             place = i3;
11587           break;
11588
11589         case REG_INC:
11590         case REG_NO_CONFLICT:
11591           /* These notes say something about how a register is used.  They must
11592              be present on any use of the register in I2 or I3.  */
11593           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3)))
11594             place = i3;
11595
11596           if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2)))
11597             {
11598               if (place)
11599                 place2 = i2;
11600               else
11601                 place = i2;
11602             }
11603           break;
11604
11605         case REG_LABEL:
11606           /* This can show up in several ways -- either directly in the
11607              pattern, or hidden off in the constant pool with (or without?)
11608              a REG_EQUAL note.  */
11609           /* ??? Ignore the without-reg_equal-note problem for now.  */
11610           if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))
11611               || ((tem = find_reg_note (i3, REG_EQUAL, NULL_RTX))
11612                   && GET_CODE (XEXP (tem, 0)) == LABEL_REF
11613                   && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0)))
11614             place = i3;
11615
11616           if (i2
11617               && (reg_mentioned_p (XEXP (note, 0), PATTERN (i2))
11618                   || ((tem = find_reg_note (i2, REG_EQUAL, NULL_RTX))
11619                       && GET_CODE (XEXP (tem, 0)) == LABEL_REF
11620                       && XEXP (XEXP (tem, 0), 0) == XEXP (note, 0))))
11621             {
11622               if (place)
11623                 place2 = i2;
11624               else
11625                 place = i2;
11626             }
11627           break;
11628
11629         case REG_WAS_0:
11630           /* It is too much trouble to try to see if this note is still
11631              correct in all situations.  It is better to simply delete it.  */
11632           break;
11633
11634         case REG_RETVAL:
11635           /* If the insn previously containing this note still exists,
11636              put it back where it was.  Otherwise move it to the previous
11637              insn.  Adjust the corresponding REG_LIBCALL note.  */
11638           if (GET_CODE (from_insn) != NOTE)
11639             place = from_insn;
11640           else
11641             {
11642               tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
11643               place = prev_real_insn (from_insn);
11644               if (tem && place)
11645                 XEXP (tem, 0) = place;
11646             }
11647           break;
11648
11649         case REG_LIBCALL:
11650           /* This is handled similarly to REG_RETVAL.  */
11651           if (GET_CODE (from_insn) != NOTE)
11652             place = from_insn;
11653           else
11654             {
11655               tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX);
11656               place = next_real_insn (from_insn);
11657               if (tem && place)
11658                 XEXP (tem, 0) = place;
11659             }
11660           break;
11661
11662         case REG_DEAD:
11663           /* If the register is used as an input in I3, it dies there.
11664              Similarly for I2, if it is non-zero and adjacent to I3.
11665
11666              If the register is not used as an input in either I3 or I2
11667              and it is not one of the registers we were supposed to eliminate,
11668              there are two possibilities.  We might have a non-adjacent I2
11669              or we might have somehow eliminated an additional register
11670              from a computation.  For example, we might have had A & B where
11671              we discover that B will always be zero.  In this case we will
11672              eliminate the reference to A.
11673
11674              In both cases, we must search to see if we can find a previous
11675              use of A and put the death note there.  */
11676
11677           if (from_insn
11678               && GET_CODE (from_insn) == CALL_INSN
11679               && find_reg_fusage (from_insn, USE, XEXP (note, 0)))
11680             place = from_insn;
11681           else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)))
11682             place = i3;
11683           else if (i2 != 0 && next_nonnote_insn (i2) == i3
11684                    && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
11685             place = i2;
11686
11687           if (XEXP (note, 0) == elim_i2 || XEXP (note, 0) == elim_i1)
11688             break;
11689
11690           /* If the register is used in both I2 and I3 and it dies in I3, 
11691              we might have added another reference to it.  If reg_n_refs
11692              was 2, bump it to 3.  This has to be correct since the 
11693              register must have been set somewhere.  The reason this is
11694              done is because local-alloc.c treats 2 references as a 
11695              special case.  */
11696
11697           if (place == i3 && i2 != 0 && GET_CODE (XEXP (note, 0)) == REG
11698               && REG_N_REFS (REGNO (XEXP (note, 0)))== 2
11699               && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
11700             REG_N_REFS (REGNO (XEXP (note, 0))) = 3;
11701
11702           if (place == 0)
11703             {
11704               basic_block bb = BASIC_BLOCK (this_basic_block);
11705
11706               for (tem = PREV_INSN (i3); place == 0; tem = PREV_INSN (tem))
11707                 {
11708                   if (GET_RTX_CLASS (GET_CODE (tem)) != 'i')
11709                     {
11710                       if (tem == bb->head)
11711                         break;
11712                       continue;
11713                     }
11714
11715                   /* If the register is being set at TEM, see if that is all
11716                      TEM is doing.  If so, delete TEM.  Otherwise, make this
11717                      into a REG_UNUSED note instead.  */
11718                   if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
11719                     {
11720                       rtx set = single_set (tem);
11721                       rtx inner_dest = 0;
11722 #ifdef HAVE_cc0
11723                       rtx cc0_setter = NULL_RTX;
11724 #endif
11725
11726                       if (set != 0)
11727                         for (inner_dest = SET_DEST (set);
11728                              GET_CODE (inner_dest) == STRICT_LOW_PART
11729                                || GET_CODE (inner_dest) == SUBREG
11730                                || GET_CODE (inner_dest) == ZERO_EXTRACT;
11731                              inner_dest = XEXP (inner_dest, 0))
11732                           ;
11733
11734                       /* Verify that it was the set, and not a clobber that
11735                          modified the register. 
11736
11737                          CC0 targets must be careful to maintain setter/user
11738                          pairs.  If we cannot delete the setter due to side
11739                          effects, mark the user with an UNUSED note instead
11740                          of deleting it.  */
11741
11742                       if (set != 0 && ! side_effects_p (SET_SRC (set))
11743                           && rtx_equal_p (XEXP (note, 0), inner_dest)
11744 #ifdef HAVE_cc0
11745                           && (! reg_mentioned_p (cc0_rtx, SET_SRC (set))
11746                               || ((cc0_setter = prev_cc0_setter (tem)) != NULL
11747                                   && sets_cc0_p (PATTERN (cc0_setter)) > 0))
11748 #endif
11749                           )
11750                         {
11751                           /* Move the notes and links of TEM elsewhere.
11752                              This might delete other dead insns recursively. 
11753                              First set the pattern to something that won't use
11754                              any register.  */
11755
11756                           PATTERN (tem) = pc_rtx;
11757
11758                           distribute_notes (REG_NOTES (tem), tem, tem,
11759                                             NULL_RTX, NULL_RTX, NULL_RTX);
11760                           distribute_links (LOG_LINKS (tem));
11761
11762                           PUT_CODE (tem, NOTE);
11763                           NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
11764                           NOTE_SOURCE_FILE (tem) = 0;
11765
11766 #ifdef HAVE_cc0
11767                           /* Delete the setter too.  */
11768                           if (cc0_setter)
11769                             {
11770                               PATTERN (cc0_setter) = pc_rtx;
11771
11772                               distribute_notes (REG_NOTES (cc0_setter),
11773                                                 cc0_setter, cc0_setter,
11774                                                 NULL_RTX, NULL_RTX, NULL_RTX);
11775                               distribute_links (LOG_LINKS (cc0_setter));
11776
11777                               PUT_CODE (cc0_setter, NOTE);
11778                               NOTE_LINE_NUMBER (cc0_setter)
11779                                 = NOTE_INSN_DELETED;
11780                               NOTE_SOURCE_FILE (cc0_setter) = 0;
11781                             }
11782 #endif
11783                         }
11784                       /* If the register is both set and used here, put the
11785                          REG_DEAD note here, but place a REG_UNUSED note
11786                          here too unless there already is one.  */
11787                       else if (reg_referenced_p (XEXP (note, 0),
11788                                                  PATTERN (tem)))
11789                         {
11790                           place = tem;
11791
11792                           if (! find_regno_note (tem, REG_UNUSED,
11793                                                  REGNO (XEXP (note, 0))))
11794                             REG_NOTES (tem)
11795                               = gen_rtx_EXPR_LIST (REG_UNUSED, XEXP (note, 0),
11796                                                    REG_NOTES (tem));
11797                         }
11798                       else
11799                         {
11800                           PUT_REG_NOTE_KIND (note, REG_UNUSED);
11801                           
11802                           /*  If there isn't already a REG_UNUSED note, put one
11803                               here.  */
11804                           if (! find_regno_note (tem, REG_UNUSED,
11805                                                  REGNO (XEXP (note, 0))))
11806                             place = tem;
11807                           break;
11808                         }
11809                     }
11810                   else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))
11811                            || (GET_CODE (tem) == CALL_INSN
11812                                && find_reg_fusage (tem, USE, XEXP (note, 0))))
11813                     {
11814                       place = tem;
11815
11816                       /* If we are doing a 3->2 combination, and we have a
11817                          register which formerly died in i3 and was not used
11818                          by i2, which now no longer dies in i3 and is used in
11819                          i2 but does not die in i2, and place is between i2
11820                          and i3, then we may need to move a link from place to
11821                          i2.  */
11822                       if (i2 && INSN_UID (place) <= max_uid_cuid
11823                           && INSN_CUID (place) > INSN_CUID (i2)
11824                           && from_insn && INSN_CUID (from_insn) > INSN_CUID (i2)
11825                           && reg_referenced_p (XEXP (note, 0), PATTERN (i2)))
11826                         {
11827                           rtx links = LOG_LINKS (place);
11828                           LOG_LINKS (place) = 0;
11829                           distribute_links (links);
11830                         }
11831                       break;
11832                     }
11833
11834                   if (tem == bb->head)
11835                     break;
11836                 }
11837               
11838               /* We haven't found an insn for the death note and it
11839                  is still a REG_DEAD note, but we have hit the beginning
11840                  of the block.  If the existing life info says the reg
11841                  was dead, there's nothing left to do.  Otherwise, we'll
11842                  need to do a global life update after combine.  */
11843               if (REG_NOTE_KIND (note) == REG_DEAD && place == 0)
11844                 {
11845                   int regno = REGNO (XEXP (note, 0));
11846                   if (REGNO_REG_SET_P (bb->global_live_at_start, regno))
11847                     {
11848                       SET_BIT (refresh_blocks, this_basic_block);
11849                       need_refresh = 1;
11850                     }
11851                 }
11852             }
11853
11854           /* If the register is set or already dead at PLACE, we needn't do
11855              anything with this note if it is still a REG_DEAD note.
11856              We can here if it is set at all, not if is it totally replace,
11857              which is what `dead_or_set_p' checks, so also check for it being
11858              set partially.  */
11859
11860           if (place && REG_NOTE_KIND (note) == REG_DEAD)
11861             {
11862               int regno = REGNO (XEXP (note, 0));
11863
11864               if (dead_or_set_p (place, XEXP (note, 0))
11865                   || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place)))
11866                 {
11867                   /* Unless the register previously died in PLACE, clear
11868                      reg_last_death.  [I no longer understand why this is
11869                      being done.] */
11870                   if (reg_last_death[regno] != place)
11871                     reg_last_death[regno] = 0;
11872                   place = 0;
11873                 }
11874               else
11875                 reg_last_death[regno] = place;
11876
11877               /* If this is a death note for a hard reg that is occupying
11878                  multiple registers, ensure that we are still using all
11879                  parts of the object.  If we find a piece of the object
11880                  that is unused, we must add a USE for that piece before
11881                  PLACE and put the appropriate REG_DEAD note on it.
11882
11883                  An alternative would be to put a REG_UNUSED for the pieces
11884                  on the insn that set the register, but that can't be done if
11885                  it is not in the same block.  It is simpler, though less
11886                  efficient, to add the USE insns.  */
11887
11888               if (place && regno < FIRST_PSEUDO_REGISTER
11889                   && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1)
11890                 {
11891                   int endregno
11892                     = regno + HARD_REGNO_NREGS (regno,
11893                                                 GET_MODE (XEXP (note, 0)));
11894                   int all_used = 1;
11895                   int i;
11896
11897                   for (i = regno; i < endregno; i++)
11898                     if (! refers_to_regno_p (i, i + 1, PATTERN (place), 0)
11899                         && ! find_regno_fusage (place, USE, i))
11900                       {
11901                         rtx piece = gen_rtx_REG (reg_raw_mode[i], i);
11902                         rtx p;
11903
11904                         /* See if we already placed a USE note for this
11905                            register in front of PLACE.  */
11906                         for (p = place;
11907                              GET_CODE (PREV_INSN (p)) == INSN
11908                              && GET_CODE (PATTERN (PREV_INSN (p))) == USE;
11909                              p = PREV_INSN (p))
11910                           if (rtx_equal_p (piece,
11911                                            XEXP (PATTERN (PREV_INSN (p)), 0)))
11912                             {
11913                               p = 0;
11914                               break;
11915                             }
11916
11917                         if (p)
11918                           {
11919                             rtx use_insn
11920                               = emit_insn_before (gen_rtx_USE (VOIDmode,
11921                                                                piece),
11922                                                   p);
11923                             REG_NOTES (use_insn)
11924                               = gen_rtx_EXPR_LIST (REG_DEAD, piece,
11925                                                    REG_NOTES (use_insn));
11926                           }
11927
11928                         all_used = 0;
11929                       }
11930
11931                   /* Check for the case where the register dying partially
11932                      overlaps the register set by this insn.  */
11933                   if (all_used)
11934                     for (i = regno; i < endregno; i++)
11935                       if (dead_or_set_regno_p (place, i))
11936                           {
11937                             all_used = 0;
11938                             break;
11939                           }
11940
11941                   if (! all_used)
11942                     {
11943                       /* Put only REG_DEAD notes for pieces that are
11944                          still used and that are not already dead or set.  */
11945
11946                       for (i = regno; i < endregno; i++)
11947                         {
11948                           rtx piece = gen_rtx_REG (reg_raw_mode[i], i);
11949
11950                           if ((reg_referenced_p (piece, PATTERN (place))
11951                                || (GET_CODE (place) == CALL_INSN
11952                                    && find_reg_fusage (place, USE, piece)))
11953                               && ! dead_or_set_p (place, piece)
11954                               && ! reg_bitfield_target_p (piece,
11955                                                           PATTERN (place)))
11956                             REG_NOTES (place)
11957                               = gen_rtx_EXPR_LIST (REG_DEAD, piece,
11958                                                    REG_NOTES (place));
11959                         }
11960
11961                       place = 0;
11962                     }
11963                 }
11964             }
11965           break;
11966
11967         default:
11968           /* Any other notes should not be present at this point in the
11969              compilation.  */
11970           abort ();
11971         }
11972
11973       if (place)
11974         {
11975           XEXP (note, 1) = REG_NOTES (place);
11976           REG_NOTES (place) = note;
11977         }
11978       else if ((REG_NOTE_KIND (note) == REG_DEAD
11979                 || REG_NOTE_KIND (note) == REG_UNUSED)
11980                && GET_CODE (XEXP (note, 0)) == REG)
11981         REG_N_DEATHS (REGNO (XEXP (note, 0)))--;
11982
11983       if (place2)
11984         {
11985           if ((REG_NOTE_KIND (note) == REG_DEAD
11986                || REG_NOTE_KIND (note) == REG_UNUSED)
11987               && GET_CODE (XEXP (note, 0)) == REG)
11988             REG_N_DEATHS (REGNO (XEXP (note, 0)))++;
11989
11990           REG_NOTES (place2) = gen_rtx_fmt_ee (GET_CODE (note),
11991                                                REG_NOTE_KIND (note),
11992                                                XEXP (note, 0),
11993                                                REG_NOTES (place2));
11994         }
11995     }
11996 }
11997 \f
11998 /* Similarly to above, distribute the LOG_LINKS that used to be present on
11999    I3, I2, and I1 to new locations.  This is also called in one case to
12000    add a link pointing at I3 when I3's destination is changed.  */
12001
12002 static void
12003 distribute_links (links)
12004      rtx links;
12005 {
12006   rtx link, next_link;
12007
12008   for (link = links; link; link = next_link)
12009     {
12010       rtx place = 0;
12011       rtx insn;
12012       rtx set, reg;
12013
12014       next_link = XEXP (link, 1);
12015
12016       /* If the insn that this link points to is a NOTE or isn't a single
12017          set, ignore it.  In the latter case, it isn't clear what we
12018          can do other than ignore the link, since we can't tell which 
12019          register it was for.  Such links wouldn't be used by combine
12020          anyway.
12021
12022          It is not possible for the destination of the target of the link to
12023          have been changed by combine.  The only potential of this is if we
12024          replace I3, I2, and I1 by I3 and I2.  But in that case the
12025          destination of I2 also remains unchanged.  */
12026
12027       if (GET_CODE (XEXP (link, 0)) == NOTE
12028           || (set = single_set (XEXP (link, 0))) == 0)
12029         continue;
12030
12031       reg = SET_DEST (set);
12032       while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT
12033              || GET_CODE (reg) == SIGN_EXTRACT
12034              || GET_CODE (reg) == STRICT_LOW_PART)
12035         reg = XEXP (reg, 0);
12036
12037       /* A LOG_LINK is defined as being placed on the first insn that uses
12038          a register and points to the insn that sets the register.  Start
12039          searching at the next insn after the target of the link and stop
12040          when we reach a set of the register or the end of the basic block.
12041
12042          Note that this correctly handles the link that used to point from
12043          I3 to I2.  Also note that not much searching is typically done here
12044          since most links don't point very far away.  */
12045
12046       for (insn = NEXT_INSN (XEXP (link, 0));
12047            (insn && (this_basic_block == n_basic_blocks - 1
12048                      || BLOCK_HEAD (this_basic_block + 1) != insn));
12049            insn = NEXT_INSN (insn))
12050         if (GET_RTX_CLASS (GET_CODE (insn)) == 'i'
12051             && reg_overlap_mentioned_p (reg, PATTERN (insn)))
12052           {
12053             if (reg_referenced_p (reg, PATTERN (insn)))
12054               place = insn;
12055             break;
12056           }
12057         else if (GET_CODE (insn) == CALL_INSN
12058               && find_reg_fusage (insn, USE, reg))
12059           {
12060             place = insn;
12061             break;
12062           }
12063
12064       /* If we found a place to put the link, place it there unless there
12065          is already a link to the same insn as LINK at that point.  */
12066
12067       if (place)
12068         {
12069           rtx link2;
12070
12071           for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1))
12072             if (XEXP (link2, 0) == XEXP (link, 0))
12073               break;
12074
12075           if (link2 == 0)
12076             {
12077               XEXP (link, 1) = LOG_LINKS (place);
12078               LOG_LINKS (place) = link;
12079
12080               /* Set added_links_insn to the earliest insn we added a
12081                  link to.  */
12082               if (added_links_insn == 0 
12083                   || INSN_CUID (added_links_insn) > INSN_CUID (place))
12084                 added_links_insn = place;
12085             }
12086         }
12087     }
12088 }
12089 \f
12090 /* Compute INSN_CUID for INSN, which is an insn made by combine.  */
12091
12092 static int
12093 insn_cuid (insn)
12094      rtx insn;
12095 {
12096   while (insn != 0 && INSN_UID (insn) > max_uid_cuid
12097          && GET_CODE (insn) == INSN && GET_CODE (PATTERN (insn)) == USE)
12098     insn = NEXT_INSN (insn);
12099
12100   if (INSN_UID (insn) > max_uid_cuid)
12101     abort ();
12102
12103   return INSN_CUID (insn);
12104 }
12105 \f
12106 void
12107 dump_combine_stats (file)
12108      FILE *file;
12109 {
12110   fnotice
12111     (file,
12112      ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n",
12113      combine_attempts, combine_merges, combine_extras, combine_successes);
12114 }
12115
12116 void
12117 dump_combine_total_stats (file)
12118      FILE *file;
12119 {
12120   fnotice
12121     (file,
12122      "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n",
12123      total_attempts, total_merges, total_extras, total_successes);
12124 }