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