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