|
|
1.1 root 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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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, ¬e) < 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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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 archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.