|
|
1.1 ! root 1: /* Optimize by combining instructions for GNU compiler. ! 2: Copyright (C) 1987, 1988, 1992, 1993 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: /* This module is essentially the "combiner" phase of the U. of Arizona ! 22: Portable Optimizer, but redone to work on our list-structured ! 23: representation for RTL instead of their string representation. ! 24: ! 25: The LOG_LINKS of each insn identify the most recent assignment ! 26: to each REG used in the insn. It is a list of previous insns, ! 27: each of which contains a SET for a REG that is used in this insn ! 28: and not used or set in between. LOG_LINKs never cross basic blocks. ! 29: They were set up by the preceding pass (lifetime analysis). ! 30: ! 31: We try to combine each pair of insns joined by a logical link. ! 32: We also try to combine triples of insns A, B and C when ! 33: C has a link back to B and B has a link back to A. ! 34: ! 35: LOG_LINKS does not have links for use of the CC0. They don't ! 36: need to, because the insn that sets the CC0 is always immediately ! 37: before the insn that tests it. So we always regard a branch ! 38: insn as having a logical link to the preceding insn. The same is true ! 39: for an insn explicitly using CC0. ! 40: ! 41: We check (with use_crosses_set_p) to avoid combining in such a way ! 42: as to move a computation to a place where its value would be different. ! 43: ! 44: Combination is done by mathematically substituting the previous ! 45: insn(s) values for the regs they set into the expressions in ! 46: the later insns that refer to these regs. If the result is a valid insn ! 47: for our target machine, according to the machine description, ! 48: we install it, delete the earlier insns, and update the data flow ! 49: information (LOG_LINKS and REG_NOTES) for what we did. ! 50: ! 51: There are a few exceptions where the dataflow information created by ! 52: flow.c aren't completely updated: ! 53: ! 54: - reg_live_length is not updated ! 55: - reg_n_refs is not adjusted in the rare case when a register is ! 56: no longer required in a computation ! 57: - there are extremely rare cases (see distribute_regnotes) when a ! 58: REG_DEAD note is lost ! 59: - a LOG_LINKS entry that refers to an insn with multiple SETs may be ! 60: removed because there is no way to know which register it was ! 61: linking ! 62: ! 63: To simplify substitution, we combine only when the earlier insn(s) ! 64: consist of only a single assignment. To simplify updating afterward, ! 65: we never combine when a subroutine call appears in the middle. ! 66: ! 67: Since we do not represent assignments to CC0 explicitly except when that ! 68: is all an insn does, there is no LOG_LINKS entry in an insn that uses ! 69: the condition code for the insn that set the condition code. ! 70: Fortunately, these two insns must be consecutive. ! 71: Therefore, every JUMP_INSN is taken to have an implicit logical link ! 72: to the preceding insn. This is not quite right, since non-jumps can ! 73: also use the condition code; but in practice such insns would not ! 74: combine anyway. */ ! 75: ! 76: #include "config.h" ! 77: #include "gvarargs.h" ! 78: ! 79: /* Must precede rtl.h for FFS. */ ! 80: #include <stdio.h> ! 81: ! 82: #include "rtl.h" ! 83: #include "flags.h" ! 84: #include "regs.h" ! 85: #include "hard-reg-set.h" ! 86: #include "expr.h" ! 87: #include "basic-block.h" ! 88: #include "insn-config.h" ! 89: #include "insn-flags.h" ! 90: #include "insn-codes.h" ! 91: #include "insn-attr.h" ! 92: #include "recog.h" ! 93: #include "real.h" ! 94: ! 95: /* It is not safe to use ordinary gen_lowpart in combine. ! 96: Use gen_lowpart_for_combine instead. See comments there. */ ! 97: #define gen_lowpart dont_use_gen_lowpart_you_dummy ! 98: ! 99: /* Number of attempts to combine instructions in this function. */ ! 100: ! 101: static int combine_attempts; ! 102: ! 103: /* Number of attempts that got as far as substitution in this function. */ ! 104: ! 105: static int combine_merges; ! 106: ! 107: /* Number of instructions combined with added SETs in this function. */ ! 108: ! 109: static int combine_extras; ! 110: ! 111: /* Number of instructions combined in this function. */ ! 112: ! 113: static int combine_successes; ! 114: ! 115: /* Totals over entire compilation. */ ! 116: ! 117: static int total_attempts, total_merges, total_extras, total_successes; ! 118: ! 119: /* Vector mapping INSN_UIDs to cuids. ! 120: The cuids are like uids but increase monotonically always. ! 121: Combine always uses cuids so that it can compare them. ! 122: But actually renumbering the uids, which we used to do, ! 123: proves to be a bad idea because it makes it hard to compare ! 124: the dumps produced by earlier passes with those from later passes. */ ! 125: ! 126: static int *uid_cuid; ! 127: ! 128: /* Get the cuid of an insn. */ ! 129: ! 130: #define INSN_CUID(INSN) (uid_cuid[INSN_UID (INSN)]) ! 131: ! 132: /* Maximum register number, which is the size of the tables below. */ ! 133: ! 134: static int combine_max_regno; ! 135: ! 136: /* Record last point of death of (hard or pseudo) register n. */ ! 137: ! 138: static rtx *reg_last_death; ! 139: ! 140: /* Record last point of modification of (hard or pseudo) register n. */ ! 141: ! 142: static rtx *reg_last_set; ! 143: ! 144: /* Record the cuid of the last insn that invalidated memory ! 145: (anything that writes memory, and subroutine calls, but not pushes). */ ! 146: ! 147: static int mem_last_set; ! 148: ! 149: /* Record the cuid of the last CALL_INSN ! 150: so we can tell whether a potential combination crosses any calls. */ ! 151: ! 152: static int last_call_cuid; ! 153: ! 154: /* When `subst' is called, this is the insn that is being modified ! 155: (by combining in a previous insn). The PATTERN of this insn ! 156: is still the old pattern partially modified and it should not be ! 157: looked at, but this may be used to examine the successors of the insn ! 158: to judge whether a simplification is valid. */ ! 159: ! 160: static rtx subst_insn; ! 161: ! 162: /* If nonzero, this is the insn that should be presumed to be ! 163: immediately in front of `subst_insn'. */ ! 164: ! 165: static rtx subst_prev_insn; ! 166: ! 167: /* This is the lowest CUID that `subst' is currently dealing with. ! 168: get_last_value will not return a value if the register was set at or ! 169: after this CUID. If not for this mechanism, we could get confused if ! 170: I2 or I1 in try_combine were an insn that used the old value of a register ! 171: to obtain a new value. In that case, we might erroneously get the ! 172: new value of the register when we wanted the old one. */ ! 173: ! 174: static int subst_low_cuid; ! 175: ! 176: /* This is the value of undobuf.num_undo when we started processing this ! 177: substitution. This will prevent gen_rtx_combine from re-used a piece ! 178: from the previous expression. Doing so can produce circular rtl ! 179: structures. */ ! 180: ! 181: static int previous_num_undos; ! 182: ! 183: /* Basic block number of the block in which we are performing combines. */ ! 184: static int this_basic_block; ! 185: ! 186: /* The next group of arrays allows the recording of the last value assigned ! 187: to (hard or pseudo) register n. We use this information to see if a ! 188: operation being processed is redundant given a prior operation performed ! 189: on the register. For example, an `and' with a constant is redundant if ! 190: all the zero bits are already known to be turned off. ! 191: ! 192: We use an approach similar to that used by cse, but change it in the ! 193: following ways: ! 194: ! 195: (1) We do not want to reinitialize at each label. ! 196: (2) It is useful, but not critical, to know the actual value assigned ! 197: to a register. Often just its form is helpful. ! 198: ! 199: Therefore, we maintain the following arrays: ! 200: ! 201: reg_last_set_value the last value assigned ! 202: reg_last_set_label records the value of label_tick when the ! 203: register was assigned ! 204: reg_last_set_table_tick records the value of label_tick when a ! 205: value using the register is assigned ! 206: reg_last_set_invalid set to non-zero when it is not valid ! 207: to use the value of this register in some ! 208: register's value ! 209: ! 210: To understand the usage of these tables, it is important to understand ! 211: the distinction between the value in reg_last_set_value being valid ! 212: and the register being validly contained in some other expression in the ! 213: table. ! 214: ! 215: Entry I in reg_last_set_value is valid if it is non-zero, and either ! 216: reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick. ! 217: ! 218: Register I may validly appear in any expression returned for the value ! 219: of another register if reg_n_sets[i] is 1. It may also appear in the ! 220: value for register J if reg_last_set_label[i] < reg_last_set_label[j] or ! 221: reg_last_set_invalid[j] is zero. ! 222: ! 223: If an expression is found in the table containing a register which may ! 224: not validly appear in an expression, the register is replaced by ! 225: something that won't match, (clobber (const_int 0)). ! 226: ! 227: reg_last_set_invalid[i] is set non-zero when register I is being assigned ! 228: to and reg_last_set_table_tick[i] == label_tick. */ ! 229: ! 230: /* Record last value assigned to (hard or pseudo) register n. */ ! 231: ! 232: static rtx *reg_last_set_value; ! 233: ! 234: /* Record the value of label_tick when the value for register n is placed in ! 235: reg_last_set_value[n]. */ ! 236: ! 237: static int *reg_last_set_label; ! 238: ! 239: /* Record the value of label_tick when an expression involving register n ! 240: is placed in reg_last_set_value. */ ! 241: ! 242: static int *reg_last_set_table_tick; ! 243: ! 244: /* Set non-zero if references to register n in expressions should not be ! 245: used. */ ! 246: ! 247: static char *reg_last_set_invalid; ! 248: ! 249: /* Incremented for each label. */ ! 250: ! 251: static int label_tick; ! 252: ! 253: /* Some registers that are set more than once and used in more than one ! 254: basic block are nevertheless always set in similar ways. For example, ! 255: a QImode register may be loaded from memory in two places on a machine ! 256: where byte loads zero extend. ! 257: ! 258: We record in the following array what we know about the nonzero ! 259: bits of a register, specifically which bits are known to be zero. ! 260: ! 261: If an entry is zero, it means that we don't know anything special. */ ! 262: ! 263: static unsigned HOST_WIDE_INT *reg_nonzero_bits; ! 264: ! 265: /* Mode used to compute significance in reg_nonzero_bits. It is the largest ! 266: integer mode that can fit in HOST_BITS_PER_WIDE_INT. */ ! 267: ! 268: static enum machine_mode nonzero_bits_mode; ! 269: ! 270: /* Nonzero if we know that a register has some leading bits that are always ! 271: equal to the sign bit. */ ! 272: ! 273: static char *reg_sign_bit_copies; ! 274: ! 275: /* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used. ! 276: It is zero while computing them and after combine has completed. This ! 277: former test prevents propagating values based on previously set values, ! 278: which can be incorrect if a variable is modified in a loop. */ ! 279: ! 280: static int nonzero_sign_valid; ! 281: ! 282: /* These arrays are maintained in parallel with reg_last_set_value ! 283: and are used to store the mode in which the register was last set, ! 284: the bits that were known to be zero when it was last set, and the ! 285: number of sign bits copies it was known to have when it was last set. */ ! 286: ! 287: static enum machine_mode *reg_last_set_mode; ! 288: static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits; ! 289: static char *reg_last_set_sign_bit_copies; ! 290: ! 291: /* Record one modification to rtl structure ! 292: to be undone by storing old_contents into *where. ! 293: is_int is 1 if the contents are an int. */ ! 294: ! 295: struct undo ! 296: { ! 297: int is_int; ! 298: union {rtx r; int i;} old_contents; ! 299: union {rtx *r; int *i;} where; ! 300: }; ! 301: ! 302: /* Record a bunch of changes to be undone, up to MAX_UNDO of them. ! 303: num_undo says how many are currently recorded. ! 304: ! 305: storage is nonzero if we must undo the allocation of new storage. ! 306: The value of storage is what to pass to obfree. ! 307: ! 308: other_insn is nonzero if we have modified some other insn in the process ! 309: of working on subst_insn. It must be verified too. */ ! 310: ! 311: #define MAX_UNDO 50 ! 312: ! 313: struct undobuf ! 314: { ! 315: int num_undo; ! 316: char *storage; ! 317: struct undo undo[MAX_UNDO]; ! 318: rtx other_insn; ! 319: }; ! 320: ! 321: static struct undobuf undobuf; ! 322: ! 323: /* Substitute NEWVAL, an rtx expression, into INTO, a place in some ! 324: insn. The substitution can be undone by undo_all. If INTO is already ! 325: set to NEWVAL, do not record this change. Because computing NEWVAL might ! 326: also call SUBST, we have to compute it before we put anything into ! 327: the undo table. */ ! 328: ! 329: #define SUBST(INTO, NEWVAL) \ ! 330: do { rtx _new = (NEWVAL); \ ! 331: if (undobuf.num_undo < MAX_UNDO) \ ! 332: { \ ! 333: undobuf.undo[undobuf.num_undo].is_int = 0; \ ! 334: undobuf.undo[undobuf.num_undo].where.r = &INTO; \ ! 335: undobuf.undo[undobuf.num_undo].old_contents.r = INTO; \ ! 336: INTO = _new; \ ! 337: if (undobuf.undo[undobuf.num_undo].old_contents.r != INTO) \ ! 338: undobuf.num_undo++; \ ! 339: } \ ! 340: } while (0) ! 341: ! 342: /* Similar to SUBST, but NEWVAL is an int. INTO will normally be an XINT ! 343: expression. ! 344: Note that substitution for the value of a CONST_INT is not safe. */ ! 345: ! 346: #define SUBST_INT(INTO, NEWVAL) \ ! 347: do { if (undobuf.num_undo < MAX_UNDO) \ ! 348: { \ ! 349: undobuf.undo[undobuf.num_undo].is_int = 1; \ ! 350: undobuf.undo[undobuf.num_undo].where.i = (int *) &INTO; \ ! 351: undobuf.undo[undobuf.num_undo].old_contents.i = INTO; \ ! 352: INTO = NEWVAL; \ ! 353: if (undobuf.undo[undobuf.num_undo].old_contents.i != INTO) \ ! 354: undobuf.num_undo++; \ ! 355: } \ ! 356: } while (0) ! 357: ! 358: /* Number of times the pseudo being substituted for ! 359: was found and replaced. */ ! 360: ! 361: static int n_occurrences; ! 362: ! 363: static void init_reg_last_arrays PROTO(()); ! 364: static void setup_incoming_promotions PROTO(()); ! 365: static void set_nonzero_bits_and_sign_copies PROTO((rtx, rtx)); ! 366: static int can_combine_p PROTO((rtx, rtx, rtx, rtx, rtx *, rtx *)); ! 367: static int combinable_i3pat PROTO((rtx, rtx *, rtx, rtx, int, rtx *)); ! 368: static rtx try_combine PROTO((rtx, rtx, rtx)); ! 369: static void undo_all PROTO((void)); ! 370: static rtx *find_split_point PROTO((rtx *, rtx)); ! 371: static rtx subst PROTO((rtx, rtx, rtx, int, int)); ! 372: static rtx expand_compound_operation PROTO((rtx)); ! 373: static rtx expand_field_assignment PROTO((rtx)); ! 374: static rtx make_extraction PROTO((enum machine_mode, rtx, int, rtx, int, ! 375: int, int, int)); ! 376: static rtx make_compound_operation PROTO((rtx, enum rtx_code)); ! 377: static int get_pos_from_mask PROTO((unsigned HOST_WIDE_INT, int *)); ! 378: static rtx force_to_mode PROTO((rtx, enum machine_mode, ! 379: unsigned HOST_WIDE_INT, rtx, int)); ! 380: static rtx known_cond PROTO((rtx, enum rtx_code, rtx, rtx)); ! 381: static rtx make_field_assignment PROTO((rtx)); ! 382: static rtx apply_distributive_law PROTO((rtx)); ! 383: static rtx simplify_and_const_int PROTO((rtx, enum machine_mode, rtx, ! 384: unsigned HOST_WIDE_INT)); ! 385: static unsigned HOST_WIDE_INT nonzero_bits PROTO((rtx, enum machine_mode)); ! 386: static int num_sign_bit_copies PROTO((rtx, enum machine_mode)); ! 387: static int merge_outer_ops PROTO((enum rtx_code *, HOST_WIDE_INT *, ! 388: enum rtx_code, HOST_WIDE_INT, ! 389: enum machine_mode, int *)); ! 390: static rtx simplify_shift_const PROTO((rtx, enum rtx_code, enum machine_mode, ! 391: rtx, int)); ! 392: static int recog_for_combine PROTO((rtx *, rtx, rtx *)); ! 393: static rtx gen_lowpart_for_combine PROTO((enum machine_mode, rtx)); ! 394: static rtx gen_rtx_combine (); /* This is varargs. */ ! 395: static rtx gen_binary PROTO((enum rtx_code, enum machine_mode, ! 396: rtx, rtx)); ! 397: static rtx gen_unary PROTO((enum rtx_code, enum machine_mode, rtx)); ! 398: static enum rtx_code simplify_comparison PROTO((enum rtx_code, rtx *, rtx *)); ! 399: static int reversible_comparison_p PROTO((rtx)); ! 400: static void update_table_tick PROTO((rtx)); ! 401: static void record_value_for_reg PROTO((rtx, rtx, rtx)); ! 402: static void record_dead_and_set_regs_1 PROTO((rtx, rtx)); ! 403: static void record_dead_and_set_regs PROTO((rtx)); ! 404: static int get_last_value_validate PROTO((rtx *, int, int)); ! 405: static rtx get_last_value PROTO((rtx)); ! 406: static int use_crosses_set_p PROTO((rtx, int)); ! 407: static void reg_dead_at_p_1 PROTO((rtx, rtx)); ! 408: static int reg_dead_at_p PROTO((rtx, rtx)); ! 409: static void move_deaths PROTO((rtx, int, rtx, rtx *)); ! 410: static int reg_bitfield_target_p PROTO((rtx, rtx)); ! 411: static void distribute_notes PROTO((rtx, rtx, rtx, rtx, rtx, rtx)); ! 412: static void distribute_links PROTO((rtx)); ! 413: ! 414: /* Main entry point for combiner. F is the first insn of the function. ! 415: NREGS is the first unused pseudo-reg number. */ ! 416: ! 417: void ! 418: combine_instructions (f, nregs) ! 419: rtx f; ! 420: int nregs; ! 421: { ! 422: register rtx insn, next, prev; ! 423: register int i; ! 424: register rtx links, nextlinks; ! 425: ! 426: combine_attempts = 0; ! 427: combine_merges = 0; ! 428: combine_extras = 0; ! 429: combine_successes = 0; ! 430: undobuf.num_undo = previous_num_undos = 0; ! 431: ! 432: combine_max_regno = nregs; ! 433: ! 434: reg_nonzero_bits ! 435: = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT)); ! 436: reg_sign_bit_copies = (char *) alloca (nregs * sizeof (char)); ! 437: ! 438: bzero (reg_nonzero_bits, nregs * sizeof (HOST_WIDE_INT)); ! 439: bzero (reg_sign_bit_copies, nregs * sizeof (char)); ! 440: ! 441: reg_last_death = (rtx *) alloca (nregs * sizeof (rtx)); ! 442: reg_last_set = (rtx *) alloca (nregs * sizeof (rtx)); ! 443: reg_last_set_value = (rtx *) alloca (nregs * sizeof (rtx)); ! 444: reg_last_set_table_tick = (int *) alloca (nregs * sizeof (int)); ! 445: reg_last_set_label = (int *) alloca (nregs * sizeof (int)); ! 446: reg_last_set_invalid = (char *) alloca (nregs * sizeof (char)); ! 447: reg_last_set_mode ! 448: = (enum machine_mode *) alloca (nregs * sizeof (enum machine_mode)); ! 449: reg_last_set_nonzero_bits ! 450: = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT)); ! 451: reg_last_set_sign_bit_copies ! 452: = (char *) alloca (nregs * sizeof (char)); ! 453: ! 454: init_reg_last_arrays (); ! 455: ! 456: init_recog_no_volatile (); ! 457: ! 458: /* Compute maximum uid value so uid_cuid can be allocated. */ ! 459: ! 460: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ! 461: if (INSN_UID (insn) > i) ! 462: i = INSN_UID (insn); ! 463: ! 464: uid_cuid = (int *) alloca ((i + 1) * sizeof (int)); ! 465: ! 466: nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0); ! 467: ! 468: /* Don't use reg_nonzero_bits when computing it. This can cause problems ! 469: when, for example, we have j <<= 1 in a loop. */ ! 470: ! 471: nonzero_sign_valid = 0; ! 472: ! 473: /* Compute the mapping from uids to cuids. ! 474: Cuids are numbers assigned to insns, like uids, ! 475: except that cuids increase monotonically through the code. ! 476: ! 477: Scan all SETs and see if we can deduce anything about what ! 478: bits are known to be zero for some registers and how many copies ! 479: of the sign bit are known to exist for those registers. ! 480: ! 481: Also set any known values so that we can use it while searching ! 482: for what bits are known to be set. */ ! 483: ! 484: label_tick = 1; ! 485: ! 486: setup_incoming_promotions (); ! 487: ! 488: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) ! 489: { ! 490: INSN_CUID (insn) = ++i; ! 491: subst_low_cuid = i; ! 492: subst_insn = insn; ! 493: ! 494: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 495: { ! 496: note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies); ! 497: record_dead_and_set_regs (insn); ! 498: } ! 499: ! 500: if (GET_CODE (insn) == CODE_LABEL) ! 501: label_tick++; ! 502: } ! 503: ! 504: nonzero_sign_valid = 1; ! 505: ! 506: /* Now scan all the insns in forward order. */ ! 507: ! 508: this_basic_block = -1; ! 509: label_tick = 1; ! 510: last_call_cuid = 0; ! 511: mem_last_set = 0; ! 512: init_reg_last_arrays (); ! 513: setup_incoming_promotions (); ! 514: ! 515: for (insn = f; insn; insn = next ? next : NEXT_INSN (insn)) ! 516: { ! 517: next = 0; ! 518: ! 519: /* If INSN starts a new basic block, update our basic block number. */ ! 520: if (this_basic_block + 1 < n_basic_blocks ! 521: && basic_block_head[this_basic_block + 1] == insn) ! 522: this_basic_block++; ! 523: ! 524: if (GET_CODE (insn) == CODE_LABEL) ! 525: label_tick++; ! 526: ! 527: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') ! 528: { ! 529: /* Try this insn with each insn it links back to. */ ! 530: ! 531: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ! 532: if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX)) != 0) ! 533: goto retry; ! 534: ! 535: /* Try each sequence of three linked insns ending with this one. */ ! 536: ! 537: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ! 538: for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks; ! 539: nextlinks = XEXP (nextlinks, 1)) ! 540: if ((next = try_combine (insn, XEXP (links, 0), ! 541: XEXP (nextlinks, 0))) != 0) ! 542: goto retry; ! 543: ! 544: #ifdef HAVE_cc0 ! 545: /* Try to combine a jump insn that uses CC0 ! 546: with a preceding insn that sets CC0, and maybe with its ! 547: logical predecessor as well. ! 548: This is how we make decrement-and-branch insns. ! 549: We need this special code because data flow connections ! 550: via CC0 do not get entered in LOG_LINKS. */ ! 551: ! 552: if (GET_CODE (insn) == JUMP_INSN ! 553: && (prev = prev_nonnote_insn (insn)) != 0 ! 554: && GET_CODE (prev) == INSN ! 555: && sets_cc0_p (PATTERN (prev))) ! 556: { ! 557: if ((next = try_combine (insn, prev, NULL_RTX)) != 0) ! 558: goto retry; ! 559: ! 560: for (nextlinks = LOG_LINKS (prev); nextlinks; ! 561: nextlinks = XEXP (nextlinks, 1)) ! 562: if ((next = try_combine (insn, prev, ! 563: XEXP (nextlinks, 0))) != 0) ! 564: goto retry; ! 565: } ! 566: ! 567: /* Do the same for an insn that explicitly references CC0. */ ! 568: if (GET_CODE (insn) == INSN ! 569: && (prev = prev_nonnote_insn (insn)) != 0 ! 570: && GET_CODE (prev) == INSN ! 571: && sets_cc0_p (PATTERN (prev)) ! 572: && GET_CODE (PATTERN (insn)) == SET ! 573: && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn)))) ! 574: { ! 575: if ((next = try_combine (insn, prev, NULL_RTX)) != 0) ! 576: goto retry; ! 577: ! 578: for (nextlinks = LOG_LINKS (prev); nextlinks; ! 579: nextlinks = XEXP (nextlinks, 1)) ! 580: if ((next = try_combine (insn, prev, ! 581: XEXP (nextlinks, 0))) != 0) ! 582: goto retry; ! 583: } ! 584: ! 585: /* Finally, see if any of the insns that this insn links to ! 586: explicitly references CC0. If so, try this insn, that insn, ! 587: and its predecessor if it sets CC0. */ ! 588: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ! 589: if (GET_CODE (XEXP (links, 0)) == INSN ! 590: && GET_CODE (PATTERN (XEXP (links, 0))) == SET ! 591: && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0)))) ! 592: && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0 ! 593: && GET_CODE (prev) == INSN ! 594: && sets_cc0_p (PATTERN (prev)) ! 595: && (next = try_combine (insn, XEXP (links, 0), prev)) != 0) ! 596: goto retry; ! 597: #endif ! 598: ! 599: /* Try combining an insn with two different insns whose results it ! 600: uses. */ ! 601: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) ! 602: for (nextlinks = XEXP (links, 1); nextlinks; ! 603: nextlinks = XEXP (nextlinks, 1)) ! 604: if ((next = try_combine (insn, XEXP (links, 0), ! 605: XEXP (nextlinks, 0))) != 0) ! 606: goto retry; ! 607: ! 608: if (GET_CODE (insn) != NOTE) ! 609: record_dead_and_set_regs (insn); ! 610: ! 611: retry: ! 612: ; ! 613: } ! 614: } ! 615: ! 616: total_attempts += combine_attempts; ! 617: total_merges += combine_merges; ! 618: total_extras += combine_extras; ! 619: total_successes += combine_successes; ! 620: ! 621: nonzero_sign_valid = 0; ! 622: } ! 623: ! 624: /* Wipe the reg_last_xxx arrays in preparation for another pass. */ ! 625: ! 626: static void ! 627: init_reg_last_arrays () ! 628: { ! 629: int nregs = combine_max_regno; ! 630: ! 631: bzero (reg_last_death, nregs * sizeof (rtx)); ! 632: bzero (reg_last_set, nregs * sizeof (rtx)); ! 633: bzero (reg_last_set_value, nregs * sizeof (rtx)); ! 634: bzero (reg_last_set_table_tick, nregs * sizeof (int)); ! 635: bzero (reg_last_set_label, nregs * sizeof (int)); ! 636: bzero (reg_last_set_invalid, nregs * sizeof (char)); ! 637: bzero (reg_last_set_mode, nregs * sizeof (enum machine_mode)); ! 638: bzero (reg_last_set_nonzero_bits, nregs * sizeof (HOST_WIDE_INT)); ! 639: bzero (reg_last_set_sign_bit_copies, nregs * sizeof (char)); ! 640: } ! 641: ! 642: /* Set up any promoted values for incoming argument registers. */ ! 643: ! 644: static void ! 645: setup_incoming_promotions () ! 646: { ! 647: #ifdef PROMOTE_FUNCTION_ARGS ! 648: int regno; ! 649: rtx reg; ! 650: enum machine_mode mode; ! 651: int unsignedp; ! 652: rtx first = get_insns (); ! 653: ! 654: for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) ! 655: if (FUNCTION_ARG_REGNO_P (regno) ! 656: && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0) ! 657: record_value_for_reg (reg, first, ! 658: gen_rtx (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, ! 659: GET_MODE (reg), ! 660: gen_rtx (CLOBBER, mode, const0_rtx))); ! 661: #endif ! 662: } ! 663: ! 664: /* Called via note_stores. If X is a pseudo that is used in more than ! 665: one basic block, is narrower that HOST_BITS_PER_WIDE_INT, and is being ! 666: set, record what bits are known zero. If we are clobbering X, ! 667: ignore this "set" because the clobbered value won't be used. ! 668: ! 669: If we are setting only a portion of X and we can't figure out what ! 670: portion, assume all bits will be used since we don't know what will ! 671: be happening. ! 672: ! 673: Similarly, set how many bits of X are known to be copies of the sign bit ! 674: at all locations in the function. This is the smallest number implied ! 675: by any set of X. */ ! 676: ! 677: static void ! 678: set_nonzero_bits_and_sign_copies (x, set) ! 679: rtx x; ! 680: rtx set; ! 681: { ! 682: int num; ! 683: ! 684: if (GET_CODE (x) == REG ! 685: && REGNO (x) >= FIRST_PSEUDO_REGISTER ! 686: && reg_n_sets[REGNO (x)] > 1 ! 687: && reg_basic_block[REGNO (x)] < 0 ! 688: /* If this register is undefined at the start of the file, we can't ! 689: say what its contents were. */ ! 690: && ! (basic_block_live_at_start[0][REGNO (x) / REGSET_ELT_BITS] ! 691: & ((REGSET_ELT_TYPE) 1 << (REGNO (x) % REGSET_ELT_BITS))) ! 692: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT) ! 693: { ! 694: if (GET_CODE (set) == CLOBBER) ! 695: { ! 696: reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x)); ! 697: reg_sign_bit_copies[REGNO (x)] = 0; ! 698: return; ! 699: } ! 700: ! 701: /* If this is a complex assignment, see if we can convert it into a ! 702: simple assignment. */ ! 703: set = expand_field_assignment (set); ! 704: ! 705: /* If this is a simple assignment, or we have a paradoxical SUBREG, ! 706: set what we know about X. */ ! 707: ! 708: if (SET_DEST (set) == x ! 709: || (GET_CODE (SET_DEST (set)) == SUBREG ! 710: && (GET_MODE_SIZE (GET_MODE (SET_DEST (set))) ! 711: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set))))) ! 712: && SUBREG_REG (SET_DEST (set)) == x)) ! 713: { ! 714: rtx src = SET_SRC (set); ! 715: ! 716: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND ! 717: /* If X is narrower than a word and SRC is a non-negative ! 718: constant that would appear negative in the mode of X, ! 719: sign-extend it for use in reg_nonzero_bits because some ! 720: machines (maybe most) will actually do the sign-extension ! 721: and this is the conservative approach. ! 722: ! 723: ??? For 2.5, try to tighten up the MD files in this regard ! 724: instead of this kludge. */ ! 725: ! 726: if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD ! 727: && GET_CODE (src) == CONST_INT ! 728: && INTVAL (src) > 0 ! 729: && 0 != (INTVAL (src) ! 730: & ((HOST_WIDE_INT) 1 ! 731: << GET_MODE_BITSIZE (GET_MODE (x))))) ! 732: src = GEN_INT (INTVAL (src) ! 733: | ((HOST_WIDE_INT) (-1) ! 734: << GET_MODE_BITSIZE (GET_MODE (x)))); ! 735: #endif ! 736: ! 737: reg_nonzero_bits[REGNO (x)] ! 738: |= nonzero_bits (src, nonzero_bits_mode); ! 739: num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x)); ! 740: if (reg_sign_bit_copies[REGNO (x)] == 0 ! 741: || reg_sign_bit_copies[REGNO (x)] > num) ! 742: reg_sign_bit_copies[REGNO (x)] = num; ! 743: } ! 744: else ! 745: { ! 746: reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x)); ! 747: reg_sign_bit_copies[REGNO (x)] = 0; ! 748: } ! 749: } ! 750: } ! 751: ! 752: /* See if INSN can be combined into I3. PRED and SUCC are optionally ! 753: insns that were previously combined into I3 or that will be combined ! 754: into the merger of INSN and I3. ! 755: ! 756: Return 0 if the combination is not allowed for any reason. ! 757: ! 758: If the combination is allowed, *PDEST will be set to the single ! 759: destination of INSN and *PSRC to the single source, and this function ! 760: will return 1. */ ! 761: ! 762: static int ! 763: can_combine_p (insn, i3, pred, succ, pdest, psrc) ! 764: rtx insn; ! 765: rtx i3; ! 766: rtx pred, succ; ! 767: rtx *pdest, *psrc; ! 768: { ! 769: int i; ! 770: rtx set = 0, src, dest; ! 771: rtx p, link; ! 772: int all_adjacent = (succ ? (next_active_insn (insn) == succ ! 773: && next_active_insn (succ) == i3) ! 774: : next_active_insn (insn) == i3); ! 775: ! 776: /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0. ! 777: or a PARALLEL consisting of such a SET and CLOBBERs. ! 778: ! 779: If INSN has CLOBBER parallel parts, ignore them for our processing. ! 780: By definition, these happen during the execution of the insn. When it ! 781: is merged with another insn, all bets are off. If they are, in fact, ! 782: needed and aren't also supplied in I3, they may be added by ! 783: recog_for_combine. Otherwise, it won't match. ! 784: ! 785: We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED ! 786: note. ! 787: ! 788: Get the source and destination of INSN. If more than one, can't ! 789: combine. */ ! 790: ! 791: if (GET_CODE (PATTERN (insn)) == SET) ! 792: set = PATTERN (insn); ! 793: else if (GET_CODE (PATTERN (insn)) == PARALLEL ! 794: && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET) ! 795: { ! 796: for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++) ! 797: { ! 798: rtx elt = XVECEXP (PATTERN (insn), 0, i); ! 799: ! 800: switch (GET_CODE (elt)) ! 801: { ! 802: /* We can ignore CLOBBERs. */ ! 803: case CLOBBER: ! 804: break; ! 805: ! 806: case SET: ! 807: /* Ignore SETs whose result isn't used but not those that ! 808: have side-effects. */ ! 809: if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt)) ! 810: && ! side_effects_p (elt)) ! 811: break; ! 812: ! 813: /* If we have already found a SET, this is a second one and ! 814: so we cannot combine with this insn. */ ! 815: if (set) ! 816: return 0; ! 817: ! 818: set = elt; ! 819: break; ! 820: ! 821: default: ! 822: /* Anything else means we can't combine. */ ! 823: return 0; ! 824: } ! 825: } ! 826: ! 827: if (set == 0 ! 828: /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs, ! 829: so don't do anything with it. */ ! 830: || GET_CODE (SET_SRC (set)) == ASM_OPERANDS) ! 831: return 0; ! 832: } ! 833: else ! 834: return 0; ! 835: ! 836: if (set == 0) ! 837: return 0; ! 838: ! 839: set = expand_field_assignment (set); ! 840: src = SET_SRC (set), dest = SET_DEST (set); ! 841: ! 842: /* Don't eliminate a store in the stack pointer. */ ! 843: if (dest == stack_pointer_rtx ! 844: /* If we couldn't eliminate a field assignment, we can't combine. */ ! 845: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART ! 846: /* Don't combine with an insn that sets a register to itself if it has ! 847: a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */ ! 848: || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX)) ! 849: /* Can't merge a function call. */ ! 850: || GET_CODE (src) == CALL ! 851: /* Don't substitute into an incremented register. */ ! 852: || FIND_REG_INC_NOTE (i3, dest) ! 853: || (succ && FIND_REG_INC_NOTE (succ, dest)) ! 854: /* Don't combine the end of a libcall into anything. */ ! 855: || find_reg_note (insn, REG_RETVAL, NULL_RTX) ! 856: /* Make sure that DEST is not used after SUCC but before I3. */ ! 857: || (succ && ! all_adjacent ! 858: && reg_used_between_p (dest, succ, i3)) ! 859: /* Make sure that the value that is to be substituted for the register ! 860: does not use any registers whose values alter in between. However, ! 861: If the insns are adjacent, a use can't cross a set even though we ! 862: think it might (this can happen for a sequence of insns each setting ! 863: the same destination; reg_last_set of that register might point to ! 864: a NOTE). If INSN has a REG_EQUIV note, the register is always ! 865: equivalent to the memory so the substitution is valid even if there ! 866: are intervening stores. Also, don't move a volatile asm or ! 867: UNSPEC_VOLATILE across any other insns. */ ! 868: || (! all_adjacent ! 869: && (((GET_CODE (src) != MEM ! 870: || ! find_reg_note (insn, REG_EQUIV, src)) ! 871: && use_crosses_set_p (src, INSN_CUID (insn))) ! 872: || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src)) ! 873: || GET_CODE (src) == UNSPEC_VOLATILE)) ! 874: /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get ! 875: better register allocation by not doing the combine. */ ! 876: || find_reg_note (i3, REG_NO_CONFLICT, dest) ! 877: || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest)) ! 878: /* Don't combine across a CALL_INSN, because that would possibly ! 879: change whether the life span of some REGs crosses calls or not, ! 880: and it is a pain to update that information. ! 881: Exception: if source is a constant, moving it later can't hurt. ! 882: Accept that special case, because it helps -fforce-addr a lot. */ ! 883: || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src))) ! 884: return 0; ! 885: ! 886: /* DEST must either be a REG or CC0. */ ! 887: if (GET_CODE (dest) == REG) ! 888: { ! 889: /* If register alignment is being enforced for multi-word items in all ! 890: cases except for parameters, it is possible to have a register copy ! 891: insn referencing a hard register that is not allowed to contain the ! 892: mode being copied and which would not be valid as an operand of most ! 893: insns. Eliminate this problem by not combining with such an insn. ! 894: ! 895: Also, on some machines we don't want to extend the life of a hard ! 896: register. */ ! 897: ! 898: if (GET_CODE (src) == REG ! 899: && ((REGNO (dest) < FIRST_PSEUDO_REGISTER ! 900: && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest))) ! 901: #ifdef SMALL_REGISTER_CLASSES ! 902: /* Don't extend the life of a hard register. */ ! 903: || REGNO (src) < FIRST_PSEUDO_REGISTER ! 904: #else ! 905: || (REGNO (src) < FIRST_PSEUDO_REGISTER ! 906: && ! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src))) ! 907: #endif ! 908: )) ! 909: return 0; ! 910: } ! 911: else if (GET_CODE (dest) != CC0) ! 912: return 0; ! 913: ! 914: /* Don't substitute for a register intended as a clobberable operand. ! 915: Similarly, don't substitute an expression containing a register that ! 916: will be clobbered in I3. */ ! 917: if (GET_CODE (PATTERN (i3)) == PARALLEL) ! 918: for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--) ! 919: if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER ! 920: && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), ! 921: src) ! 922: || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest))) ! 923: return 0; ! 924: ! 925: /* If INSN contains anything volatile, or is an `asm' (whether volatile ! 926: or not), reject, unless nothing volatile comes between it and I3, ! 927: with the exception of SUCC. */ ! 928: ! 929: if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src)) ! 930: for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p)) ! 931: if (GET_RTX_CLASS (GET_CODE (p)) == 'i' ! 932: && p != succ && volatile_refs_p (PATTERN (p))) ! 933: return 0; ! 934: ! 935: /* If there are any volatile insns between INSN and I3, reject, because ! 936: they might affect machine state. */ ! 937: ! 938: for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p)) ! 939: if (GET_RTX_CLASS (GET_CODE (p)) == 'i' ! 940: && p != succ && volatile_insn_p (PATTERN (p))) ! 941: return 0; ! 942: ! 943: /* If INSN or I2 contains an autoincrement or autodecrement, ! 944: make sure that register is not used between there and I3, ! 945: and not already used in I3 either. ! 946: Also insist that I3 not be a jump; if it were one ! 947: and the incremented register were spilled, we would lose. */ ! 948: ! 949: #ifdef AUTO_INC_DEC ! 950: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 951: if (REG_NOTE_KIND (link) == REG_INC ! 952: && (GET_CODE (i3) == JUMP_INSN ! 953: || reg_used_between_p (XEXP (link, 0), insn, i3) ! 954: || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3)))) ! 955: return 0; ! 956: #endif ! 957: ! 958: #ifdef HAVE_cc0 ! 959: /* Don't combine an insn that follows a CC0-setting insn. ! 960: An insn that uses CC0 must not be separated from the one that sets it. ! 961: We do, however, allow I2 to follow a CC0-setting insn if that insn ! 962: is passed as I1; in that case it will be deleted also. ! 963: We also allow combining in this case if all the insns are adjacent ! 964: because that would leave the two CC0 insns adjacent as well. ! 965: It would be more logical to test whether CC0 occurs inside I1 or I2, ! 966: but that would be much slower, and this ought to be equivalent. */ ! 967: ! 968: p = prev_nonnote_insn (insn); ! 969: if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p)) ! 970: && ! all_adjacent) ! 971: return 0; ! 972: #endif ! 973: ! 974: /* If we get here, we have passed all the tests and the combination is ! 975: to be allowed. */ ! 976: ! 977: *pdest = dest; ! 978: *psrc = src; ! 979: ! 980: return 1; ! 981: } ! 982: ! 983: /* LOC is the location within I3 that contains its pattern or the component ! 984: of a PARALLEL of the pattern. We validate that it is valid for combining. ! 985: ! 986: One problem is if I3 modifies its output, as opposed to replacing it ! 987: entirely, we can't allow the output to contain I2DEST or I1DEST as doing ! 988: so would produce an insn that is not equivalent to the original insns. ! 989: ! 990: Consider: ! 991: ! 992: (set (reg:DI 101) (reg:DI 100)) ! 993: (set (subreg:SI (reg:DI 101) 0) <foo>) ! 994: ! 995: This is NOT equivalent to: ! 996: ! 997: (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>) ! 998: (set (reg:DI 101) (reg:DI 100))]) ! 999: ! 1000: Not only does this modify 100 (in which case it might still be valid ! 1001: if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100. ! 1002: ! 1003: We can also run into a problem if I2 sets a register that I1 ! 1004: uses and I1 gets directly substituted into I3 (not via I2). In that ! 1005: case, we would be getting the wrong value of I2DEST into I3, so we ! 1006: must reject the combination. This case occurs when I2 and I1 both ! 1007: feed into I3, rather than when I1 feeds into I2, which feeds into I3. ! 1008: If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source ! 1009: of a SET must prevent combination from occurring. ! 1010: ! 1011: On machines where SMALL_REGISTER_CLASSES is defined, we don't combine ! 1012: if the destination of a SET is a hard register. ! 1013: ! 1014: Before doing the above check, we first try to expand a field assignment ! 1015: into a set of logical operations. ! 1016: ! 1017: If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which ! 1018: we place a register that is both set and used within I3. If more than one ! 1019: such register is detected, we fail. ! 1020: ! 1021: Return 1 if the combination is valid, zero otherwise. */ ! 1022: ! 1023: static int ! 1024: combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed) ! 1025: rtx i3; ! 1026: rtx *loc; ! 1027: rtx i2dest; ! 1028: rtx i1dest; ! 1029: int i1_not_in_src; ! 1030: rtx *pi3dest_killed; ! 1031: { ! 1032: rtx x = *loc; ! 1033: ! 1034: if (GET_CODE (x) == SET) ! 1035: { ! 1036: rtx set = expand_field_assignment (x); ! 1037: rtx dest = SET_DEST (set); ! 1038: rtx src = SET_SRC (set); ! 1039: rtx inner_dest = dest, inner_src = src; ! 1040: ! 1041: SUBST (*loc, set); ! 1042: ! 1043: while (GET_CODE (inner_dest) == STRICT_LOW_PART ! 1044: || GET_CODE (inner_dest) == SUBREG ! 1045: || GET_CODE (inner_dest) == ZERO_EXTRACT) ! 1046: inner_dest = XEXP (inner_dest, 0); ! 1047: ! 1048: /* We probably don't need this any more now that LIMIT_RELOAD_CLASS ! 1049: was added. */ ! 1050: #if 0 ! 1051: while (GET_CODE (inner_src) == STRICT_LOW_PART ! 1052: || GET_CODE (inner_src) == SUBREG ! 1053: || GET_CODE (inner_src) == ZERO_EXTRACT) ! 1054: inner_src = XEXP (inner_src, 0); ! 1055: ! 1056: /* If it is better that two different modes keep two different pseudos, ! 1057: avoid combining them. This avoids producing the following pattern ! 1058: on a 386: ! 1059: (set (subreg:SI (reg/v:QI 21) 0) ! 1060: (lshiftrt:SI (reg/v:SI 20) ! 1061: (const_int 24))) ! 1062: If that were made, reload could not handle the pair of ! 1063: reg 20/21, since it would try to get any GENERAL_REGS ! 1064: but some of them don't handle QImode. */ ! 1065: ! 1066: if (rtx_equal_p (inner_src, i2dest) ! 1067: && GET_CODE (inner_dest) == REG ! 1068: && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest))) ! 1069: return 0; ! 1070: #endif ! 1071: ! 1072: /* Check for the case where I3 modifies its output, as ! 1073: discussed above. */ ! 1074: if ((inner_dest != dest ! 1075: && (reg_overlap_mentioned_p (i2dest, inner_dest) ! 1076: || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest)))) ! 1077: /* This is the same test done in can_combine_p except that we ! 1078: allow a hard register with SMALL_REGISTER_CLASSES if SRC is a ! 1079: CALL operation. */ ! 1080: || (GET_CODE (inner_dest) == REG ! 1081: && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER ! 1082: #ifdef SMALL_REGISTER_CLASSES ! 1083: && GET_CODE (src) != CALL ! 1084: #else ! 1085: && ! HARD_REGNO_MODE_OK (REGNO (inner_dest), ! 1086: GET_MODE (inner_dest)) ! 1087: #endif ! 1088: ) ! 1089: ! 1090: || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))) ! 1091: return 0; ! 1092: ! 1093: /* If DEST is used in I3, it is being killed in this insn, ! 1094: so record that for later. ! 1095: Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the ! 1096: STACK_POINTER_REGNUM, since these are always considered to be ! 1097: live. Similarly for ARG_POINTER_REGNUM if it is fixed. */ ! 1098: if (pi3dest_killed && GET_CODE (dest) == REG ! 1099: && reg_referenced_p (dest, PATTERN (i3)) ! 1100: && REGNO (dest) != FRAME_POINTER_REGNUM ! 1101: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 1102: && REGNO (dest) != HARD_FRAME_POINTER_REGNUM ! 1103: #endif ! 1104: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 1105: && (REGNO (dest) != ARG_POINTER_REGNUM ! 1106: || ! fixed_regs [REGNO (dest)]) ! 1107: #endif ! 1108: && REGNO (dest) != STACK_POINTER_REGNUM) ! 1109: { ! 1110: if (*pi3dest_killed) ! 1111: return 0; ! 1112: ! 1113: *pi3dest_killed = dest; ! 1114: } ! 1115: } ! 1116: ! 1117: else if (GET_CODE (x) == PARALLEL) ! 1118: { ! 1119: int i; ! 1120: ! 1121: for (i = 0; i < XVECLEN (x, 0); i++) ! 1122: if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, ! 1123: i1_not_in_src, pi3dest_killed)) ! 1124: return 0; ! 1125: } ! 1126: ! 1127: return 1; ! 1128: } ! 1129: ! 1130: /* Try to combine the insns I1 and I2 into I3. ! 1131: Here I1 and I2 appear earlier than I3. ! 1132: I1 can be zero; then we combine just I2 into I3. ! 1133: ! 1134: It we are combining three insns and the resulting insn is not recognized, ! 1135: try splitting it into two insns. If that happens, I2 and I3 are retained ! 1136: and I1 is pseudo-deleted by turning it into a NOTE. Otherwise, I1 and I2 ! 1137: are pseudo-deleted. ! 1138: ! 1139: If we created two insns, return I2; otherwise return I3. ! 1140: Return 0 if the combination does not work. Then nothing is changed. */ ! 1141: ! 1142: static rtx ! 1143: try_combine (i3, i2, i1) ! 1144: register rtx i3, i2, i1; ! 1145: { ! 1146: /* New patterns for I3 and I3, respectively. */ ! 1147: rtx newpat, newi2pat = 0; ! 1148: /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead. */ ! 1149: int added_sets_1, added_sets_2; ! 1150: /* Total number of SETs to put into I3. */ ! 1151: int total_sets; ! 1152: /* Nonzero is I2's body now appears in I3. */ ! 1153: int i2_is_used; ! 1154: /* INSN_CODEs for new I3, new I2, and user of condition code. */ ! 1155: int insn_code_number, i2_code_number, other_code_number; ! 1156: /* Contains I3 if the destination of I3 is used in its source, which means ! 1157: that the old life of I3 is being killed. If that usage is placed into ! 1158: I2 and not in I3, a REG_DEAD note must be made. */ ! 1159: rtx i3dest_killed = 0; ! 1160: /* SET_DEST and SET_SRC of I2 and I1. */ ! 1161: rtx i2dest, i2src, i1dest = 0, i1src = 0; ! 1162: /* PATTERN (I2), or a copy of it in certain cases. */ ! 1163: rtx i2pat; ! 1164: /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */ ! 1165: int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0; ! 1166: int i1_feeds_i3 = 0; ! 1167: /* Notes that must be added to REG_NOTES in I3 and I2. */ ! 1168: rtx new_i3_notes, new_i2_notes; ! 1169: /* Notes that we substituted I3 into I2 instead of the normal case. */ ! 1170: int i3_subst_into_i2 = 0; ! 1171: ! 1172: int maxreg; ! 1173: rtx temp; ! 1174: register rtx link; ! 1175: int i; ! 1176: ! 1177: /* If any of I1, I2, and I3 isn't really an insn, we can't do anything. ! 1178: This can occur when flow deletes an insn that it has merged into an ! 1179: auto-increment address. We also can't do anything if I3 has a ! 1180: REG_LIBCALL note since we don't want to disrupt the contiguity of a ! 1181: libcall. */ ! 1182: ! 1183: if (GET_RTX_CLASS (GET_CODE (i3)) != 'i' ! 1184: || GET_RTX_CLASS (GET_CODE (i2)) != 'i' ! 1185: || (i1 && GET_RTX_CLASS (GET_CODE (i1)) != 'i') ! 1186: || find_reg_note (i3, REG_LIBCALL, NULL_RTX)) ! 1187: return 0; ! 1188: ! 1189: combine_attempts++; ! 1190: ! 1191: undobuf.num_undo = previous_num_undos = 0; ! 1192: undobuf.other_insn = 0; ! 1193: ! 1194: /* Save the current high-water-mark so we can free storage if we didn't ! 1195: accept this combination. */ ! 1196: undobuf.storage = (char *) oballoc (0); ! 1197: ! 1198: /* If I1 and I2 both feed I3, they can be in any order. To simplify the ! 1199: code below, set I1 to be the earlier of the two insns. */ ! 1200: if (i1 && INSN_CUID (i1) > INSN_CUID (i2)) ! 1201: temp = i1, i1 = i2, i2 = temp; ! 1202: ! 1203: subst_prev_insn = 0; ! 1204: ! 1205: /* First check for one important special-case that the code below will ! 1206: not handle. Namely, the case where I1 is zero, I2 has multiple sets, ! 1207: and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case, ! 1208: we may be able to replace that destination with the destination of I3. ! 1209: This occurs in the common code where we compute both a quotient and ! 1210: remainder into a structure, in which case we want to do the computation ! 1211: directly into the structure to avoid register-register copies. ! 1212: ! 1213: We make very conservative checks below and only try to handle the ! 1214: most common cases of this. For example, we only handle the case ! 1215: where I2 and I3 are adjacent to avoid making difficult register ! 1216: usage tests. */ ! 1217: ! 1218: if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET ! 1219: && GET_CODE (SET_SRC (PATTERN (i3))) == REG ! 1220: && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER ! 1221: #ifdef SMALL_REGISTER_CLASSES ! 1222: && (GET_CODE (SET_DEST (PATTERN (i3))) != REG ! 1223: || REGNO (SET_DEST (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER) ! 1224: #endif ! 1225: && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3))) ! 1226: && GET_CODE (PATTERN (i2)) == PARALLEL ! 1227: && ! side_effects_p (SET_DEST (PATTERN (i3))) ! 1228: /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code ! 1229: below would need to check what is inside (and reg_overlap_mentioned_p ! 1230: doesn't support those codes anyway). Don't allow those destinations; ! 1231: the resulting insn isn't likely to be recognized anyway. */ ! 1232: && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT ! 1233: && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART ! 1234: && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)), ! 1235: SET_DEST (PATTERN (i3))) ! 1236: && next_real_insn (i2) == i3) ! 1237: { ! 1238: rtx p2 = PATTERN (i2); ! 1239: ! 1240: /* Make sure that the destination of I3, ! 1241: which we are going to substitute into one output of I2, ! 1242: is not used within another output of I2. We must avoid making this: ! 1243: (parallel [(set (mem (reg 69)) ...) ! 1244: (set (reg 69) ...)]) ! 1245: which is not well-defined as to order of actions. ! 1246: (Besides, reload can't handle output reloads for this.) ! 1247: ! 1248: The problem can also happen if the dest of I3 is a memory ref, ! 1249: if another dest in I2 is an indirect memory ref. */ ! 1250: for (i = 0; i < XVECLEN (p2, 0); i++) ! 1251: if (GET_CODE (XVECEXP (p2, 0, i)) == SET ! 1252: && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)), ! 1253: SET_DEST (XVECEXP (p2, 0, i)))) ! 1254: break; ! 1255: ! 1256: if (i == XVECLEN (p2, 0)) ! 1257: for (i = 0; i < XVECLEN (p2, 0); i++) ! 1258: if (SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3))) ! 1259: { ! 1260: combine_merges++; ! 1261: ! 1262: subst_insn = i3; ! 1263: subst_low_cuid = INSN_CUID (i2); ! 1264: ! 1265: added_sets_2 = added_sets_1 = 0; ! 1266: i2dest = SET_SRC (PATTERN (i3)); ! 1267: ! 1268: /* Replace the dest in I2 with our dest and make the resulting ! 1269: insn the new pattern for I3. Then skip to where we ! 1270: validate the pattern. Everything was set up above. */ ! 1271: SUBST (SET_DEST (XVECEXP (p2, 0, i)), ! 1272: SET_DEST (PATTERN (i3))); ! 1273: ! 1274: newpat = p2; ! 1275: i3_subst_into_i2 = 1; ! 1276: goto validate_replacement; ! 1277: } ! 1278: } ! 1279: ! 1280: #ifndef HAVE_cc0 ! 1281: /* If we have no I1 and I2 looks like: ! 1282: (parallel [(set (reg:CC X) (compare:CC OP (const_int 0))) ! 1283: (set Y OP)]) ! 1284: make up a dummy I1 that is ! 1285: (set Y OP) ! 1286: and change I2 to be ! 1287: (set (reg:CC X) (compare:CC Y (const_int 0))) ! 1288: ! 1289: (We can ignore any trailing CLOBBERs.) ! 1290: ! 1291: This undoes a previous combination and allows us to match a branch-and- ! 1292: decrement insn. */ ! 1293: ! 1294: if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL ! 1295: && XVECLEN (PATTERN (i2), 0) >= 2 ! 1296: && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET ! 1297: && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)))) ! 1298: == MODE_CC) ! 1299: && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE ! 1300: && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx ! 1301: && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET ! 1302: && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG ! 1303: && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0), ! 1304: SET_SRC (XVECEXP (PATTERN (i2), 0, 1)))) ! 1305: { ! 1306: for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--) ! 1307: if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER) ! 1308: break; ! 1309: ! 1310: if (i == 1) ! 1311: { ! 1312: /* We make I1 with the same INSN_UID as I2. This gives it ! 1313: the same INSN_CUID for value tracking. Our fake I1 will ! 1314: never appear in the insn stream so giving it the same INSN_UID ! 1315: as I2 will not cause a problem. */ ! 1316: ! 1317: subst_prev_insn = i1 ! 1318: = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2, ! 1319: XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0); ! 1320: ! 1321: SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0)); ! 1322: SUBST (XEXP (SET_SRC (PATTERN (i2)), 0), ! 1323: SET_DEST (PATTERN (i1))); ! 1324: } ! 1325: } ! 1326: #endif ! 1327: ! 1328: /* Verify that I2 and I1 are valid for combining. */ ! 1329: if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src) ! 1330: || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src))) ! 1331: { ! 1332: undo_all (); ! 1333: return 0; ! 1334: } ! 1335: ! 1336: /* Record whether I2DEST is used in I2SRC and similarly for the other ! 1337: cases. Knowing this will help in register status updating below. */ ! 1338: i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src); ! 1339: i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src); ! 1340: i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src); ! 1341: ! 1342: /* See if I1 directly feeds into I3. It does if I1DEST is not used ! 1343: in I2SRC. */ ! 1344: i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src); ! 1345: ! 1346: /* Ensure that I3's pattern can be the destination of combines. */ ! 1347: if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, ! 1348: i1 && i2dest_in_i1src && i1_feeds_i3, ! 1349: &i3dest_killed)) ! 1350: { ! 1351: undo_all (); ! 1352: return 0; ! 1353: } ! 1354: ! 1355: /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd. ! 1356: We used to do this EXCEPT in one case: I3 has a post-inc in an ! 1357: output operand. However, that exception can give rise to insns like ! 1358: mov r3,(r3)+ ! 1359: which is a famous insn on the PDP-11 where the value of r3 used as the ! 1360: source was model-dependent. Avoid this sort of thing. */ ! 1361: ! 1362: #if 0 ! 1363: if (!(GET_CODE (PATTERN (i3)) == SET ! 1364: && GET_CODE (SET_SRC (PATTERN (i3))) == REG ! 1365: && GET_CODE (SET_DEST (PATTERN (i3))) == MEM ! 1366: && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC ! 1367: || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC))) ! 1368: /* It's not the exception. */ ! 1369: #endif ! 1370: #ifdef AUTO_INC_DEC ! 1371: for (link = REG_NOTES (i3); link; link = XEXP (link, 1)) ! 1372: if (REG_NOTE_KIND (link) == REG_INC ! 1373: && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2)) ! 1374: || (i1 != 0 ! 1375: && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1))))) ! 1376: { ! 1377: undo_all (); ! 1378: return 0; ! 1379: } ! 1380: #endif ! 1381: ! 1382: /* See if the SETs in I1 or I2 need to be kept around in the merged ! 1383: instruction: whenever the value set there is still needed past I3. ! 1384: For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3. ! 1385: ! 1386: For the SET in I1, we have two cases: If I1 and I2 independently ! 1387: feed into I3, the set in I1 needs to be kept around if I1DEST dies ! 1388: or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set ! 1389: in I1 needs to be kept around unless I1DEST dies or is set in either ! 1390: I2 or I3. We can distinguish these cases by seeing if I2SRC mentions ! 1391: I1DEST. If so, we know I1 feeds into I2. */ ! 1392: ! 1393: added_sets_2 = ! dead_or_set_p (i3, i2dest); ! 1394: ! 1395: added_sets_1 ! 1396: = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest) ! 1397: : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest))); ! 1398: ! 1399: /* If the set in I2 needs to be kept around, we must make a copy of ! 1400: PATTERN (I2), so that when we substitute I1SRC for I1DEST in ! 1401: PATTERN (I2), we are only substituting for the original I1DEST, not into ! 1402: an already-substituted copy. This also prevents making self-referential ! 1403: rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to ! 1404: I2DEST. */ ! 1405: ! 1406: i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL ! 1407: ? gen_rtx (SET, VOIDmode, i2dest, i2src) ! 1408: : PATTERN (i2)); ! 1409: ! 1410: if (added_sets_2) ! 1411: i2pat = copy_rtx (i2pat); ! 1412: ! 1413: combine_merges++; ! 1414: ! 1415: /* Substitute in the latest insn for the regs set by the earlier ones. */ ! 1416: ! 1417: maxreg = max_reg_num (); ! 1418: ! 1419: subst_insn = i3; ! 1420: ! 1421: /* It is possible that the source of I2 or I1 may be performing an ! 1422: unneeded operation, such as a ZERO_EXTEND of something that is known ! 1423: to have the high part zero. Handle that case by letting subst look at ! 1424: the innermost one of them. ! 1425: ! 1426: Another way to do this would be to have a function that tries to ! 1427: simplify a single insn instead of merging two or more insns. We don't ! 1428: do this because of the potential of infinite loops and because ! 1429: of the potential extra memory required. However, doing it the way ! 1430: we are is a bit of a kludge and doesn't catch all cases. ! 1431: ! 1432: But only do this if -fexpensive-optimizations since it slows things down ! 1433: and doesn't usually win. */ ! 1434: ! 1435: if (flag_expensive_optimizations) ! 1436: { ! 1437: /* Pass pc_rtx so no substitutions are done, just simplifications. ! 1438: The cases that we are interested in here do not involve the few ! 1439: cases were is_replaced is checked. */ ! 1440: if (i1) ! 1441: { ! 1442: subst_low_cuid = INSN_CUID (i1); ! 1443: i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0); ! 1444: } ! 1445: else ! 1446: { ! 1447: subst_low_cuid = INSN_CUID (i2); ! 1448: i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0); ! 1449: } ! 1450: ! 1451: previous_num_undos = undobuf.num_undo; ! 1452: } ! 1453: ! 1454: #ifndef HAVE_cc0 ! 1455: /* Many machines that don't use CC0 have insns that can both perform an ! 1456: arithmetic operation and set the condition code. These operations will ! 1457: be represented as a PARALLEL with the first element of the vector ! 1458: being a COMPARE of an arithmetic operation with the constant zero. ! 1459: The second element of the vector will set some pseudo to the result ! 1460: of the same arithmetic operation. If we simplify the COMPARE, we won't ! 1461: match such a pattern and so will generate an extra insn. Here we test ! 1462: for this case, where both the comparison and the operation result are ! 1463: needed, and make the PARALLEL by just replacing I2DEST in I3SRC with ! 1464: I2SRC. Later we will make the PARALLEL that contains I2. */ ! 1465: ! 1466: if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET ! 1467: && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE ! 1468: && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx ! 1469: && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest)) ! 1470: { ! 1471: rtx *cc_use; ! 1472: enum machine_mode compare_mode; ! 1473: ! 1474: newpat = PATTERN (i3); ! 1475: SUBST (XEXP (SET_SRC (newpat), 0), i2src); ! 1476: ! 1477: i2_is_used = 1; ! 1478: ! 1479: #ifdef EXTRA_CC_MODES ! 1480: /* See if a COMPARE with the operand we substituted in should be done ! 1481: with the mode that is currently being used. If not, do the same ! 1482: processing we do in `subst' for a SET; namely, if the destination ! 1483: is used only once, try to replace it with a register of the proper ! 1484: mode and also replace the COMPARE. */ ! 1485: if (undobuf.other_insn == 0 ! 1486: && (cc_use = find_single_use (SET_DEST (newpat), i3, ! 1487: &undobuf.other_insn)) ! 1488: && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use), ! 1489: i2src, const0_rtx)) ! 1490: != GET_MODE (SET_DEST (newpat)))) ! 1491: { ! 1492: int regno = REGNO (SET_DEST (newpat)); ! 1493: rtx new_dest = gen_rtx (REG, compare_mode, regno); ! 1494: ! 1495: if (regno < FIRST_PSEUDO_REGISTER ! 1496: || (reg_n_sets[regno] == 1 && ! added_sets_2 ! 1497: && ! REG_USERVAR_P (SET_DEST (newpat)))) ! 1498: { ! 1499: if (regno >= FIRST_PSEUDO_REGISTER) ! 1500: SUBST (regno_reg_rtx[regno], new_dest); ! 1501: ! 1502: SUBST (SET_DEST (newpat), new_dest); ! 1503: SUBST (XEXP (*cc_use, 0), new_dest); ! 1504: SUBST (SET_SRC (newpat), ! 1505: gen_rtx_combine (COMPARE, compare_mode, ! 1506: i2src, const0_rtx)); ! 1507: } ! 1508: else ! 1509: undobuf.other_insn = 0; ! 1510: } ! 1511: #endif ! 1512: } ! 1513: else ! 1514: #endif ! 1515: { ! 1516: n_occurrences = 0; /* `subst' counts here */ ! 1517: ! 1518: /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we ! 1519: need to make a unique copy of I2SRC each time we substitute it ! 1520: to avoid self-referential rtl. */ ! 1521: ! 1522: subst_low_cuid = INSN_CUID (i2); ! 1523: newpat = subst (PATTERN (i3), i2dest, i2src, 0, ! 1524: ! i1_feeds_i3 && i1dest_in_i1src); ! 1525: previous_num_undos = undobuf.num_undo; ! 1526: ! 1527: /* Record whether i2's body now appears within i3's body. */ ! 1528: i2_is_used = n_occurrences; ! 1529: } ! 1530: ! 1531: /* If we already got a failure, don't try to do more. Otherwise, ! 1532: try to substitute in I1 if we have it. */ ! 1533: ! 1534: if (i1 && GET_CODE (newpat) != CLOBBER) ! 1535: { ! 1536: /* Before we can do this substitution, we must redo the test done ! 1537: above (see detailed comments there) that ensures that I1DEST ! 1538: isn't mentioned in any SETs in NEWPAT that are field assignments. */ ! 1539: ! 1540: if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, ! 1541: 0, NULL_PTR)) ! 1542: { ! 1543: undo_all (); ! 1544: return 0; ! 1545: } ! 1546: ! 1547: n_occurrences = 0; ! 1548: subst_low_cuid = INSN_CUID (i1); ! 1549: newpat = subst (newpat, i1dest, i1src, 0, 0); ! 1550: previous_num_undos = undobuf.num_undo; ! 1551: } ! 1552: ! 1553: /* Fail if an autoincrement side-effect has been duplicated. Be careful ! 1554: to count all the ways that I2SRC and I1SRC can be used. */ ! 1555: if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0 ! 1556: && i2_is_used + added_sets_2 > 1) ! 1557: || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0 ! 1558: && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3) ! 1559: > 1)) ! 1560: /* Fail if we tried to make a new register (we used to abort, but there's ! 1561: really no reason to). */ ! 1562: || max_reg_num () != maxreg ! 1563: /* Fail if we couldn't do something and have a CLOBBER. */ ! 1564: || GET_CODE (newpat) == CLOBBER) ! 1565: { ! 1566: undo_all (); ! 1567: return 0; ! 1568: } ! 1569: ! 1570: /* If the actions of the earlier insns must be kept ! 1571: in addition to substituting them into the latest one, ! 1572: we must make a new PARALLEL for the latest insn ! 1573: to hold additional the SETs. */ ! 1574: ! 1575: if (added_sets_1 || added_sets_2) ! 1576: { ! 1577: combine_extras++; ! 1578: ! 1579: if (GET_CODE (newpat) == PARALLEL) ! 1580: { ! 1581: rtvec old = XVEC (newpat, 0); ! 1582: total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2; ! 1583: newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); ! 1584: bcopy (&old->elem[0], &XVECEXP (newpat, 0, 0), ! 1585: sizeof (old->elem[0]) * old->num_elem); ! 1586: } ! 1587: else ! 1588: { ! 1589: rtx old = newpat; ! 1590: total_sets = 1 + added_sets_1 + added_sets_2; ! 1591: newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); ! 1592: XVECEXP (newpat, 0, 0) = old; ! 1593: } ! 1594: ! 1595: if (added_sets_1) ! 1596: XVECEXP (newpat, 0, --total_sets) ! 1597: = (GET_CODE (PATTERN (i1)) == PARALLEL ! 1598: ? gen_rtx (SET, VOIDmode, i1dest, i1src) : PATTERN (i1)); ! 1599: ! 1600: if (added_sets_2) ! 1601: { ! 1602: /* If there is no I1, use I2's body as is. We used to also not do ! 1603: the subst call below if I2 was substituted into I3, ! 1604: but that could lose a simplification. */ ! 1605: if (i1 == 0) ! 1606: XVECEXP (newpat, 0, --total_sets) = i2pat; ! 1607: else ! 1608: /* See comment where i2pat is assigned. */ ! 1609: XVECEXP (newpat, 0, --total_sets) ! 1610: = subst (i2pat, i1dest, i1src, 0, 0); ! 1611: } ! 1612: } ! 1613: ! 1614: /* We come here when we are replacing a destination in I2 with the ! 1615: destination of I3. */ ! 1616: validate_replacement: ! 1617: ! 1618: /* Is the result of combination a valid instruction? */ ! 1619: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1620: ! 1621: /* If the result isn't valid, see if it is a PARALLEL of two SETs where ! 1622: the second SET's destination is a register that is unused. In that case, ! 1623: we just need the first SET. This can occur when simplifying a divmod ! 1624: insn. We *must* test for this case here because the code below that ! 1625: splits two independent SETs doesn't handle this case correctly when it ! 1626: updates the register status. Also check the case where the first ! 1627: SET's destination is unused. That would not cause incorrect code, but ! 1628: does cause an unneeded insn to remain. */ ! 1629: ! 1630: if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL ! 1631: && XVECLEN (newpat, 0) == 2 ! 1632: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET ! 1633: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET ! 1634: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG ! 1635: && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1))) ! 1636: && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1))) ! 1637: && asm_noperands (newpat) < 0) ! 1638: { ! 1639: newpat = XVECEXP (newpat, 0, 0); ! 1640: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1641: } ! 1642: ! 1643: else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL ! 1644: && XVECLEN (newpat, 0) == 2 ! 1645: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET ! 1646: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET ! 1647: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG ! 1648: && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0))) ! 1649: && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0))) ! 1650: && asm_noperands (newpat) < 0) ! 1651: { ! 1652: newpat = XVECEXP (newpat, 0, 1); ! 1653: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1654: } ! 1655: ! 1656: /* See if this is an XOR. If so, perhaps the problem is that the ! 1657: constant is out of range. Replace it with a complemented XOR with ! 1658: a complemented constant; it might be in range. */ ! 1659: ! 1660: else if (insn_code_number < 0 && GET_CODE (newpat) == SET ! 1661: && GET_CODE (SET_SRC (newpat)) == XOR ! 1662: && GET_CODE (XEXP (SET_SRC (newpat), 1)) == CONST_INT ! 1663: && ((temp = simplify_unary_operation (NOT, ! 1664: GET_MODE (SET_SRC (newpat)), ! 1665: XEXP (SET_SRC (newpat), 1), ! 1666: GET_MODE (SET_SRC (newpat)))) ! 1667: != 0)) ! 1668: { ! 1669: enum machine_mode i_mode = GET_MODE (SET_SRC (newpat)); ! 1670: rtx pat ! 1671: = gen_rtx_combine (SET, VOIDmode, SET_DEST (newpat), ! 1672: gen_unary (NOT, i_mode, ! 1673: gen_binary (XOR, i_mode, ! 1674: XEXP (SET_SRC (newpat), 0), ! 1675: temp))); ! 1676: ! 1677: insn_code_number = recog_for_combine (&pat, i3, &new_i3_notes); ! 1678: if (insn_code_number >= 0) ! 1679: newpat = pat; ! 1680: } ! 1681: ! 1682: /* If we were combining three insns and the result is a simple SET ! 1683: with no ASM_OPERANDS that wasn't recognized, try to split it into two ! 1684: insns. There are two ways to do this. It can be split using a ! 1685: machine-specific method (like when you have an addition of a large ! 1686: constant) or by combine in the function find_split_point. */ ! 1687: ! 1688: if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET ! 1689: && asm_noperands (newpat) < 0) ! 1690: { ! 1691: rtx m_split, *split; ! 1692: rtx ni2dest = i2dest; ! 1693: ! 1694: /* See if the MD file can split NEWPAT. If it can't, see if letting it ! 1695: use I2DEST as a scratch register will help. In the latter case, ! 1696: convert I2DEST to the mode of the source of NEWPAT if we can. */ ! 1697: ! 1698: m_split = split_insns (newpat, i3); ! 1699: ! 1700: /* We can only use I2DEST as a scratch reg if it doesn't overlap any ! 1701: inputs of NEWPAT. */ ! 1702: ! 1703: /* ??? If I2DEST is not safe, and I1DEST exists, then it would be ! 1704: possible to try that as a scratch reg. This would require adding ! 1705: more code to make it work though. */ ! 1706: ! 1707: if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat)) ! 1708: { ! 1709: /* If I2DEST is a hard register or the only use of a pseudo, ! 1710: we can change its mode. */ ! 1711: if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest) ! 1712: && GET_MODE (SET_DEST (newpat)) != VOIDmode ! 1713: && GET_CODE (i2dest) == REG ! 1714: && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER ! 1715: || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2 ! 1716: && ! REG_USERVAR_P (i2dest)))) ! 1717: ni2dest = gen_rtx (REG, GET_MODE (SET_DEST (newpat)), ! 1718: REGNO (i2dest)); ! 1719: ! 1720: m_split = split_insns (gen_rtx (PARALLEL, VOIDmode, ! 1721: gen_rtvec (2, newpat, ! 1722: gen_rtx (CLOBBER, ! 1723: VOIDmode, ! 1724: ni2dest))), ! 1725: i3); ! 1726: } ! 1727: ! 1728: if (m_split && GET_CODE (m_split) == SEQUENCE ! 1729: && XVECLEN (m_split, 0) == 2 ! 1730: && (next_real_insn (i2) == i3 ! 1731: || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)), ! 1732: INSN_CUID (i2)))) ! 1733: { ! 1734: rtx i2set, i3set; ! 1735: rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1)); ! 1736: newi2pat = PATTERN (XVECEXP (m_split, 0, 0)); ! 1737: ! 1738: i3set = single_set (XVECEXP (m_split, 0, 1)); ! 1739: i2set = single_set (XVECEXP (m_split, 0, 0)); ! 1740: ! 1741: /* In case we changed the mode of I2DEST, replace it in the ! 1742: pseudo-register table here. We can't do it above in case this ! 1743: code doesn't get executed and we do a split the other way. */ ! 1744: ! 1745: if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER) ! 1746: SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest); ! 1747: ! 1748: i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes); ! 1749: ! 1750: /* If I2 or I3 has multiple SETs, we won't know how to track ! 1751: register status, so don't use these insns. */ ! 1752: ! 1753: if (i2_code_number >= 0 && i2set && i3set) ! 1754: insn_code_number = recog_for_combine (&newi3pat, i3, ! 1755: &new_i3_notes); ! 1756: ! 1757: if (insn_code_number >= 0) ! 1758: newpat = newi3pat; ! 1759: ! 1760: /* It is possible that both insns now set the destination of I3. ! 1761: If so, we must show an extra use of it. */ ! 1762: ! 1763: if (insn_code_number >= 0 && GET_CODE (SET_DEST (i3set)) == REG ! 1764: && GET_CODE (SET_DEST (i2set)) == REG ! 1765: && REGNO (SET_DEST (i3set)) == REGNO (SET_DEST (i2set))) ! 1766: reg_n_sets[REGNO (SET_DEST (i2set))]++; ! 1767: } ! 1768: ! 1769: /* If we can split it and use I2DEST, go ahead and see if that ! 1770: helps things be recognized. Verify that none of the registers ! 1771: are set between I2 and I3. */ ! 1772: if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0 ! 1773: #ifdef HAVE_cc0 ! 1774: && GET_CODE (i2dest) == REG ! 1775: #endif ! 1776: /* We need I2DEST in the proper mode. If it is a hard register ! 1777: or the only use of a pseudo, we can change its mode. */ ! 1778: && (GET_MODE (*split) == GET_MODE (i2dest) ! 1779: || GET_MODE (*split) == VOIDmode ! 1780: || REGNO (i2dest) < FIRST_PSEUDO_REGISTER ! 1781: || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2 ! 1782: && ! REG_USERVAR_P (i2dest))) ! 1783: && (next_real_insn (i2) == i3 ! 1784: || ! use_crosses_set_p (*split, INSN_CUID (i2))) ! 1785: /* We can't overwrite I2DEST if its value is still used by ! 1786: NEWPAT. */ ! 1787: && ! reg_referenced_p (i2dest, newpat)) ! 1788: { ! 1789: rtx newdest = i2dest; ! 1790: ! 1791: /* Get NEWDEST as a register in the proper mode. We have already ! 1792: validated that we can do this. */ ! 1793: if (GET_MODE (i2dest) != GET_MODE (*split) ! 1794: && GET_MODE (*split) != VOIDmode) ! 1795: { ! 1796: newdest = gen_rtx (REG, GET_MODE (*split), REGNO (i2dest)); ! 1797: ! 1798: if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER) ! 1799: SUBST (regno_reg_rtx[REGNO (i2dest)], newdest); ! 1800: } ! 1801: ! 1802: /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to ! 1803: an ASHIFT. This can occur if it was inside a PLUS and hence ! 1804: appeared to be a memory address. This is a kludge. */ ! 1805: if (GET_CODE (*split) == MULT ! 1806: && GET_CODE (XEXP (*split, 1)) == CONST_INT ! 1807: && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0) ! 1808: SUBST (*split, gen_rtx_combine (ASHIFT, GET_MODE (*split), ! 1809: XEXP (*split, 0), GEN_INT (i))); ! 1810: ! 1811: #ifdef INSN_SCHEDULING ! 1812: /* If *SPLIT is a paradoxical SUBREG, when we split it, it should ! 1813: be written as a ZERO_EXTEND. */ ! 1814: if (GET_CODE (*split) == SUBREG ! 1815: && GET_CODE (SUBREG_REG (*split)) == MEM) ! 1816: SUBST (*split, gen_rtx_combine (ZERO_EXTEND, GET_MODE (*split), ! 1817: XEXP (*split, 0))); ! 1818: #endif ! 1819: ! 1820: newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split); ! 1821: SUBST (*split, newdest); ! 1822: i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes); ! 1823: if (i2_code_number >= 0) ! 1824: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1825: } ! 1826: } ! 1827: ! 1828: /* Check for a case where we loaded from memory in a narrow mode and ! 1829: then sign extended it, but we need both registers. In that case, ! 1830: we have a PARALLEL with both loads from the same memory location. ! 1831: We can split this into a load from memory followed by a register-register ! 1832: copy. This saves at least one insn, more if register allocation can ! 1833: eliminate the copy. ! 1834: ! 1835: We cannot do this if the destination of the second assignment is ! 1836: a register that we have already assumed is zero-extended. Similarly ! 1837: for a SUBREG of such a register. */ ! 1838: ! 1839: else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 ! 1840: && GET_CODE (newpat) == PARALLEL ! 1841: && XVECLEN (newpat, 0) == 2 ! 1842: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET ! 1843: && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND ! 1844: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET ! 1845: && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)), ! 1846: XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0)) ! 1847: && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), ! 1848: INSN_CUID (i2)) ! 1849: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT ! 1850: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART ! 1851: && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)), ! 1852: (GET_CODE (temp) == REG ! 1853: && reg_nonzero_bits[REGNO (temp)] != 0 ! 1854: && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD ! 1855: && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT ! 1856: && (reg_nonzero_bits[REGNO (temp)] ! 1857: != GET_MODE_MASK (word_mode)))) ! 1858: && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG ! 1859: && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))), ! 1860: (GET_CODE (temp) == REG ! 1861: && reg_nonzero_bits[REGNO (temp)] != 0 ! 1862: && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD ! 1863: && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT ! 1864: && (reg_nonzero_bits[REGNO (temp)] ! 1865: != GET_MODE_MASK (word_mode))))) ! 1866: && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)), ! 1867: SET_SRC (XVECEXP (newpat, 0, 1))) ! 1868: && ! find_reg_note (i3, REG_UNUSED, ! 1869: SET_DEST (XVECEXP (newpat, 0, 0)))) ! 1870: { ! 1871: rtx ni2dest; ! 1872: ! 1873: newi2pat = XVECEXP (newpat, 0, 0); ! 1874: ni2dest = SET_DEST (XVECEXP (newpat, 0, 0)); ! 1875: newpat = XVECEXP (newpat, 0, 1); ! 1876: SUBST (SET_SRC (newpat), ! 1877: gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest)); ! 1878: i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes); ! 1879: if (i2_code_number >= 0) ! 1880: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1881: ! 1882: if (insn_code_number >= 0) ! 1883: { ! 1884: rtx insn; ! 1885: rtx link; ! 1886: ! 1887: /* If we will be able to accept this, we have made a change to the ! 1888: destination of I3. This can invalidate a LOG_LINKS pointing ! 1889: to I3. No other part of combine.c makes such a transformation. ! 1890: ! 1891: The new I3 will have a destination that was previously the ! 1892: destination of I1 or I2 and which was used in i2 or I3. Call ! 1893: distribute_links to make a LOG_LINK from the next use of ! 1894: that destination. */ ! 1895: ! 1896: PATTERN (i3) = newpat; ! 1897: distribute_links (gen_rtx (INSN_LIST, VOIDmode, i3, NULL_RTX)); ! 1898: ! 1899: /* I3 now uses what used to be its destination and which is ! 1900: now I2's destination. That means we need a LOG_LINK from ! 1901: I3 to I2. But we used to have one, so we still will. ! 1902: ! 1903: However, some later insn might be using I2's dest and have ! 1904: a LOG_LINK pointing at I3. We must remove this link. ! 1905: The simplest way to remove the link is to point it at I1, ! 1906: which we know will be a NOTE. */ ! 1907: ! 1908: for (insn = NEXT_INSN (i3); ! 1909: insn && (this_basic_block == n_basic_blocks - 1 ! 1910: || insn != basic_block_head[this_basic_block + 1]); ! 1911: insn = NEXT_INSN (insn)) ! 1912: { ! 1913: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 1914: && reg_referenced_p (ni2dest, PATTERN (insn))) ! 1915: { ! 1916: for (link = LOG_LINKS (insn); link; ! 1917: link = XEXP (link, 1)) ! 1918: if (XEXP (link, 0) == i3) ! 1919: XEXP (link, 0) = i1; ! 1920: ! 1921: break; ! 1922: } ! 1923: } ! 1924: } ! 1925: } ! 1926: ! 1927: /* Similarly, check for a case where we have a PARALLEL of two independent ! 1928: SETs but we started with three insns. In this case, we can do the sets ! 1929: as two separate insns. This case occurs when some SET allows two ! 1930: other insns to combine, but the destination of that SET is still live. */ ! 1931: ! 1932: else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 ! 1933: && GET_CODE (newpat) == PARALLEL ! 1934: && XVECLEN (newpat, 0) == 2 ! 1935: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET ! 1936: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT ! 1937: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART ! 1938: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET ! 1939: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT ! 1940: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART ! 1941: && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), ! 1942: INSN_CUID (i2)) ! 1943: /* Don't pass sets with (USE (MEM ...)) dests to the following. */ ! 1944: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE ! 1945: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE ! 1946: && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)), ! 1947: XVECEXP (newpat, 0, 0)) ! 1948: && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)), ! 1949: XVECEXP (newpat, 0, 1))) ! 1950: { ! 1951: newi2pat = XVECEXP (newpat, 0, 1); ! 1952: newpat = XVECEXP (newpat, 0, 0); ! 1953: ! 1954: i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes); ! 1955: if (i2_code_number >= 0) ! 1956: insn_code_number = recog_for_combine (&newpat, i3, &new_i3_notes); ! 1957: } ! 1958: ! 1959: /* If it still isn't recognized, fail and change things back the way they ! 1960: were. */ ! 1961: if ((insn_code_number < 0 ! 1962: /* Is the result a reasonable ASM_OPERANDS? */ ! 1963: && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2))) ! 1964: { ! 1965: undo_all (); ! 1966: return 0; ! 1967: } ! 1968: ! 1969: /* If we had to change another insn, make sure it is valid also. */ ! 1970: if (undobuf.other_insn) ! 1971: { ! 1972: rtx other_notes = REG_NOTES (undobuf.other_insn); ! 1973: rtx other_pat = PATTERN (undobuf.other_insn); ! 1974: rtx new_other_notes; ! 1975: rtx note, next; ! 1976: ! 1977: other_code_number = recog_for_combine (&other_pat, undobuf.other_insn, ! 1978: &new_other_notes); ! 1979: ! 1980: if (other_code_number < 0 && ! check_asm_operands (other_pat)) ! 1981: { ! 1982: undo_all (); ! 1983: return 0; ! 1984: } ! 1985: ! 1986: PATTERN (undobuf.other_insn) = other_pat; ! 1987: ! 1988: /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they ! 1989: are still valid. Then add any non-duplicate notes added by ! 1990: recog_for_combine. */ ! 1991: for (note = REG_NOTES (undobuf.other_insn); note; note = next) ! 1992: { ! 1993: next = XEXP (note, 1); ! 1994: ! 1995: if (REG_NOTE_KIND (note) == REG_UNUSED ! 1996: && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn))) ! 1997: { ! 1998: if (GET_CODE (XEXP (note, 0)) == REG) ! 1999: reg_n_deaths[REGNO (XEXP (note, 0))]--; ! 2000: ! 2001: remove_note (undobuf.other_insn, note); ! 2002: } ! 2003: } ! 2004: ! 2005: for (note = new_other_notes; note; note = XEXP (note, 1)) ! 2006: if (GET_CODE (XEXP (note, 0)) == REG) ! 2007: reg_n_deaths[REGNO (XEXP (note, 0))]++; ! 2008: ! 2009: distribute_notes (new_other_notes, undobuf.other_insn, ! 2010: undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX); ! 2011: } ! 2012: ! 2013: /* We now know that we can do this combination. Merge the insns and ! 2014: update the status of registers and LOG_LINKS. */ ! 2015: ! 2016: { ! 2017: rtx i3notes, i2notes, i1notes = 0; ! 2018: rtx i3links, i2links, i1links = 0; ! 2019: rtx midnotes = 0; ! 2020: int all_adjacent = (next_real_insn (i2) == i3 ! 2021: && (i1 == 0 || next_real_insn (i1) == i2)); ! 2022: register int regno; ! 2023: /* Compute which registers we expect to eliminate. */ ! 2024: rtx elim_i2 = (newi2pat || i2dest_in_i2src || i2dest_in_i1src ! 2025: ? 0 : i2dest); ! 2026: rtx elim_i1 = i1 == 0 || i1dest_in_i1src ? 0 : i1dest; ! 2027: ! 2028: /* Get the old REG_NOTES and LOG_LINKS from all our insns and ! 2029: clear them. */ ! 2030: i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3); ! 2031: i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2); ! 2032: if (i1) ! 2033: i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1); ! 2034: ! 2035: /* Ensure that we do not have something that should not be shared but ! 2036: occurs multiple times in the new insns. Check this by first ! 2037: resetting all the `used' flags and then copying anything is shared. */ ! 2038: ! 2039: reset_used_flags (i3notes); ! 2040: reset_used_flags (i2notes); ! 2041: reset_used_flags (i1notes); ! 2042: reset_used_flags (newpat); ! 2043: reset_used_flags (newi2pat); ! 2044: if (undobuf.other_insn) ! 2045: reset_used_flags (PATTERN (undobuf.other_insn)); ! 2046: ! 2047: i3notes = copy_rtx_if_shared (i3notes); ! 2048: i2notes = copy_rtx_if_shared (i2notes); ! 2049: i1notes = copy_rtx_if_shared (i1notes); ! 2050: newpat = copy_rtx_if_shared (newpat); ! 2051: newi2pat = copy_rtx_if_shared (newi2pat); ! 2052: if (undobuf.other_insn) ! 2053: reset_used_flags (PATTERN (undobuf.other_insn)); ! 2054: ! 2055: INSN_CODE (i3) = insn_code_number; ! 2056: PATTERN (i3) = newpat; ! 2057: if (undobuf.other_insn) ! 2058: INSN_CODE (undobuf.other_insn) = other_code_number; ! 2059: ! 2060: /* We had one special case above where I2 had more than one set and ! 2061: we replaced a destination of one of those sets with the destination ! 2062: of I3. In that case, we have to update LOG_LINKS of insns later ! 2063: in this basic block. Note that this (expensive) case is rare. ! 2064: ! 2065: Also, in this case, we must pretend that all REG_NOTEs for I2 ! 2066: actually came from I3, so that REG_UNUSED notes from I2 will be ! 2067: properly handled. */ ! 2068: ! 2069: if (i3_subst_into_i2) ! 2070: { ! 2071: for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++) ! 2072: if (GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG ! 2073: && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest ! 2074: && ! find_reg_note (i2, REG_UNUSED, ! 2075: SET_DEST (XVECEXP (PATTERN (i2), 0, i)))) ! 2076: for (temp = NEXT_INSN (i2); ! 2077: temp && (this_basic_block == n_basic_blocks - 1 ! 2078: || basic_block_head[this_basic_block] != temp); ! 2079: temp = NEXT_INSN (temp)) ! 2080: if (temp != i3 && GET_RTX_CLASS (GET_CODE (temp)) == 'i') ! 2081: for (link = LOG_LINKS (temp); link; link = XEXP (link, 1)) ! 2082: if (XEXP (link, 0) == i2) ! 2083: XEXP (link, 0) = i3; ! 2084: ! 2085: if (i3notes) ! 2086: { ! 2087: rtx link = i3notes; ! 2088: while (XEXP (link, 1)) ! 2089: link = XEXP (link, 1); ! 2090: XEXP (link, 1) = i2notes; ! 2091: } ! 2092: else ! 2093: i3notes = i2notes; ! 2094: i2notes = 0; ! 2095: } ! 2096: ! 2097: LOG_LINKS (i3) = 0; ! 2098: REG_NOTES (i3) = 0; ! 2099: LOG_LINKS (i2) = 0; ! 2100: REG_NOTES (i2) = 0; ! 2101: ! 2102: if (newi2pat) ! 2103: { ! 2104: INSN_CODE (i2) = i2_code_number; ! 2105: PATTERN (i2) = newi2pat; ! 2106: } ! 2107: else ! 2108: { ! 2109: PUT_CODE (i2, NOTE); ! 2110: NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED; ! 2111: NOTE_SOURCE_FILE (i2) = 0; ! 2112: } ! 2113: ! 2114: if (i1) ! 2115: { ! 2116: LOG_LINKS (i1) = 0; ! 2117: REG_NOTES (i1) = 0; ! 2118: PUT_CODE (i1, NOTE); ! 2119: NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED; ! 2120: NOTE_SOURCE_FILE (i1) = 0; ! 2121: } ! 2122: ! 2123: /* Get death notes for everything that is now used in either I3 or ! 2124: I2 and used to die in a previous insn. */ ! 2125: ! 2126: move_deaths (newpat, i1 ? INSN_CUID (i1) : INSN_CUID (i2), i3, &midnotes); ! 2127: if (newi2pat) ! 2128: move_deaths (newi2pat, INSN_CUID (i1), i2, &midnotes); ! 2129: ! 2130: /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */ ! 2131: if (i3notes) ! 2132: distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX, ! 2133: elim_i2, elim_i1); ! 2134: if (i2notes) ! 2135: distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX, ! 2136: elim_i2, elim_i1); ! 2137: if (i1notes) ! 2138: distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX, ! 2139: elim_i2, elim_i1); ! 2140: if (midnotes) ! 2141: distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, ! 2142: elim_i2, elim_i1); ! 2143: ! 2144: /* Distribute any notes added to I2 or I3 by recog_for_combine. We ! 2145: know these are REG_UNUSED and want them to go to the desired insn, ! 2146: so we always pass it as i3. We have not counted the notes in ! 2147: reg_n_deaths yet, so we need to do so now. */ ! 2148: ! 2149: if (newi2pat && new_i2_notes) ! 2150: { ! 2151: for (temp = new_i2_notes; temp; temp = XEXP (temp, 1)) ! 2152: if (GET_CODE (XEXP (temp, 0)) == REG) ! 2153: reg_n_deaths[REGNO (XEXP (temp, 0))]++; ! 2154: ! 2155: distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX); ! 2156: } ! 2157: ! 2158: if (new_i3_notes) ! 2159: { ! 2160: for (temp = new_i3_notes; temp; temp = XEXP (temp, 1)) ! 2161: if (GET_CODE (XEXP (temp, 0)) == REG) ! 2162: reg_n_deaths[REGNO (XEXP (temp, 0))]++; ! 2163: ! 2164: distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX); ! 2165: } ! 2166: ! 2167: /* If I3DEST was used in I3SRC, it really died in I3. We may need to ! 2168: put a REG_DEAD note for it somewhere. Similarly for I2 and I1. ! 2169: Show an additional death due to the REG_DEAD note we make here. If ! 2170: we discard it in distribute_notes, we will decrement it again. */ ! 2171: ! 2172: if (i3dest_killed) ! 2173: { ! 2174: if (GET_CODE (i3dest_killed) == REG) ! 2175: reg_n_deaths[REGNO (i3dest_killed)]++; ! 2176: ! 2177: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i3dest_killed, ! 2178: NULL_RTX), ! 2179: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, ! 2180: NULL_RTX, NULL_RTX); ! 2181: } ! 2182: ! 2183: /* For I2 and I1, we have to be careful. If NEWI2PAT exists and sets ! 2184: I2DEST or I1DEST, the death must be somewhere before I2, not I3. If ! 2185: we passed I3 in that case, it might delete I2. */ ! 2186: ! 2187: if (i2dest_in_i2src) ! 2188: { ! 2189: if (GET_CODE (i2dest) == REG) ! 2190: reg_n_deaths[REGNO (i2dest)]++; ! 2191: ! 2192: if (newi2pat && reg_set_p (i2dest, newi2pat)) ! 2193: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX), ! 2194: NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX); ! 2195: else ! 2196: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX), ! 2197: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, ! 2198: NULL_RTX, NULL_RTX); ! 2199: } ! 2200: ! 2201: if (i1dest_in_i1src) ! 2202: { ! 2203: if (GET_CODE (i1dest) == REG) ! 2204: reg_n_deaths[REGNO (i1dest)]++; ! 2205: ! 2206: if (newi2pat && reg_set_p (i1dest, newi2pat)) ! 2207: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX), ! 2208: NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX); ! 2209: else ! 2210: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX), ! 2211: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, ! 2212: NULL_RTX, NULL_RTX); ! 2213: } ! 2214: ! 2215: distribute_links (i3links); ! 2216: distribute_links (i2links); ! 2217: distribute_links (i1links); ! 2218: ! 2219: if (GET_CODE (i2dest) == REG) ! 2220: { ! 2221: rtx link; ! 2222: rtx i2_insn = 0, i2_val = 0, set; ! 2223: ! 2224: /* The insn that used to set this register doesn't exist, and ! 2225: this life of the register may not exist either. See if one of ! 2226: I3's links points to an insn that sets I2DEST. If it does, ! 2227: that is now the last known value for I2DEST. If we don't update ! 2228: this and I2 set the register to a value that depended on its old ! 2229: contents, we will get confused. If this insn is used, thing ! 2230: will be set correctly in combine_instructions. */ ! 2231: ! 2232: for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) ! 2233: if ((set = single_set (XEXP (link, 0))) != 0 ! 2234: && rtx_equal_p (i2dest, SET_DEST (set))) ! 2235: i2_insn = XEXP (link, 0), i2_val = SET_SRC (set); ! 2236: ! 2237: record_value_for_reg (i2dest, i2_insn, i2_val); ! 2238: ! 2239: /* If the reg formerly set in I2 died only once and that was in I3, ! 2240: zero its use count so it won't make `reload' do any work. */ ! 2241: if (! added_sets_2 && newi2pat == 0) ! 2242: { ! 2243: regno = REGNO (i2dest); ! 2244: reg_n_sets[regno]--; ! 2245: if (reg_n_sets[regno] == 0 ! 2246: && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ! 2247: & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS)))) ! 2248: reg_n_refs[regno] = 0; ! 2249: } ! 2250: } ! 2251: ! 2252: if (i1 && GET_CODE (i1dest) == REG) ! 2253: { ! 2254: rtx link; ! 2255: rtx i1_insn = 0, i1_val = 0, set; ! 2256: ! 2257: for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) ! 2258: if ((set = single_set (XEXP (link, 0))) != 0 ! 2259: && rtx_equal_p (i1dest, SET_DEST (set))) ! 2260: i1_insn = XEXP (link, 0), i1_val = SET_SRC (set); ! 2261: ! 2262: record_value_for_reg (i1dest, i1_insn, i1_val); ! 2263: ! 2264: regno = REGNO (i1dest); ! 2265: if (! added_sets_1) ! 2266: { ! 2267: reg_n_sets[regno]--; ! 2268: if (reg_n_sets[regno] == 0 ! 2269: && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] ! 2270: & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS)))) ! 2271: reg_n_refs[regno] = 0; ! 2272: } ! 2273: } ! 2274: ! 2275: /* Update reg_nonzero_bits et al for any changes that may have been made ! 2276: to this insn. */ ! 2277: ! 2278: note_stores (newpat, set_nonzero_bits_and_sign_copies); ! 2279: if (newi2pat) ! 2280: note_stores (newi2pat, set_nonzero_bits_and_sign_copies); ! 2281: ! 2282: /* If I3 is now an unconditional jump, ensure that it has a ! 2283: BARRIER following it since it may have initially been a ! 2284: conditional jump. It may also be the last nonnote insn. */ ! 2285: ! 2286: if ((GET_CODE (newpat) == RETURN || simplejump_p (i3)) ! 2287: && ((temp = next_nonnote_insn (i3)) == NULL_RTX ! 2288: || GET_CODE (temp) != BARRIER)) ! 2289: emit_barrier_after (i3); ! 2290: } ! 2291: ! 2292: combine_successes++; ! 2293: ! 2294: return newi2pat ? i2 : i3; ! 2295: } ! 2296: ! 2297: /* Undo all the modifications recorded in undobuf. */ ! 2298: ! 2299: static void ! 2300: undo_all () ! 2301: { ! 2302: register int i; ! 2303: if (undobuf.num_undo > MAX_UNDO) ! 2304: undobuf.num_undo = MAX_UNDO; ! 2305: for (i = undobuf.num_undo - 1; i >= 0; i--) ! 2306: { ! 2307: if (undobuf.undo[i].is_int) ! 2308: *undobuf.undo[i].where.i = undobuf.undo[i].old_contents.i; ! 2309: else ! 2310: *undobuf.undo[i].where.r = undobuf.undo[i].old_contents.r; ! 2311: ! 2312: } ! 2313: ! 2314: obfree (undobuf.storage); ! 2315: undobuf.num_undo = 0; ! 2316: } ! 2317: ! 2318: /* Find the innermost point within the rtx at LOC, possibly LOC itself, ! 2319: where we have an arithmetic expression and return that point. LOC will ! 2320: be inside INSN. ! 2321: ! 2322: try_combine will call this function to see if an insn can be split into ! 2323: two insns. */ ! 2324: ! 2325: static rtx * ! 2326: find_split_point (loc, insn) ! 2327: rtx *loc; ! 2328: rtx insn; ! 2329: { ! 2330: rtx x = *loc; ! 2331: enum rtx_code code = GET_CODE (x); ! 2332: rtx *split; ! 2333: int len = 0, pos, unsignedp; ! 2334: rtx inner; ! 2335: ! 2336: /* First special-case some codes. */ ! 2337: switch (code) ! 2338: { ! 2339: case SUBREG: ! 2340: #ifdef INSN_SCHEDULING ! 2341: /* If we are making a paradoxical SUBREG invalid, it becomes a split ! 2342: point. */ ! 2343: if (GET_CODE (SUBREG_REG (x)) == MEM) ! 2344: return loc; ! 2345: #endif ! 2346: return find_split_point (&SUBREG_REG (x), insn); ! 2347: ! 2348: case MEM: ! 2349: #ifdef HAVE_lo_sum ! 2350: /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it ! 2351: using LO_SUM and HIGH. */ ! 2352: if (GET_CODE (XEXP (x, 0)) == CONST ! 2353: || GET_CODE (XEXP (x, 0)) == SYMBOL_REF) ! 2354: { ! 2355: SUBST (XEXP (x, 0), ! 2356: gen_rtx_combine (LO_SUM, Pmode, ! 2357: gen_rtx_combine (HIGH, Pmode, XEXP (x, 0)), ! 2358: XEXP (x, 0))); ! 2359: return &XEXP (XEXP (x, 0), 0); ! 2360: } ! 2361: #endif ! 2362: ! 2363: /* If we have a PLUS whose second operand is a constant and the ! 2364: address is not valid, perhaps will can split it up using ! 2365: the machine-specific way to split large constants. We use ! 2366: the first psuedo-reg (one of the virtual regs) as a placeholder; ! 2367: it will not remain in the result. */ ! 2368: if (GET_CODE (XEXP (x, 0)) == PLUS ! 2369: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 2370: && ! memory_address_p (GET_MODE (x), XEXP (x, 0))) ! 2371: { ! 2372: rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER]; ! 2373: rtx seq = split_insns (gen_rtx (SET, VOIDmode, reg, XEXP (x, 0)), ! 2374: subst_insn); ! 2375: ! 2376: /* This should have produced two insns, each of which sets our ! 2377: placeholder. If the source of the second is a valid address, ! 2378: we can make put both sources together and make a split point ! 2379: in the middle. */ ! 2380: ! 2381: if (seq && XVECLEN (seq, 0) == 2 ! 2382: && GET_CODE (XVECEXP (seq, 0, 0)) == INSN ! 2383: && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET ! 2384: && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg ! 2385: && ! reg_mentioned_p (reg, ! 2386: SET_SRC (PATTERN (XVECEXP (seq, 0, 0)))) ! 2387: && GET_CODE (XVECEXP (seq, 0, 1)) == INSN ! 2388: && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET ! 2389: && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg ! 2390: && memory_address_p (GET_MODE (x), ! 2391: SET_SRC (PATTERN (XVECEXP (seq, 0, 1))))) ! 2392: { ! 2393: rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0))); ! 2394: rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1))); ! 2395: ! 2396: /* Replace the placeholder in SRC2 with SRC1. If we can ! 2397: find where in SRC2 it was placed, that can become our ! 2398: split point and we can replace this address with SRC2. ! 2399: Just try two obvious places. */ ! 2400: ! 2401: src2 = replace_rtx (src2, reg, src1); ! 2402: split = 0; ! 2403: if (XEXP (src2, 0) == src1) ! 2404: split = &XEXP (src2, 0); ! 2405: else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e' ! 2406: && XEXP (XEXP (src2, 0), 0) == src1) ! 2407: split = &XEXP (XEXP (src2, 0), 0); ! 2408: ! 2409: if (split) ! 2410: { ! 2411: SUBST (XEXP (x, 0), src2); ! 2412: return split; ! 2413: } ! 2414: } ! 2415: ! 2416: /* If that didn't work, perhaps the first operand is complex and ! 2417: needs to be computed separately, so make a split point there. ! 2418: This will occur on machines that just support REG + CONST ! 2419: and have a constant moved through some previous computation. */ ! 2420: ! 2421: else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o' ! 2422: && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG ! 2423: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0)))) ! 2424: == 'o'))) ! 2425: return &XEXP (XEXP (x, 0), 0); ! 2426: } ! 2427: break; ! 2428: ! 2429: case SET: ! 2430: #ifdef HAVE_cc0 ! 2431: /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a ! 2432: ZERO_EXTRACT, the most likely reason why this doesn't match is that ! 2433: we need to put the operand into a register. So split at that ! 2434: point. */ ! 2435: ! 2436: if (SET_DEST (x) == cc0_rtx ! 2437: && GET_CODE (SET_SRC (x)) != COMPARE ! 2438: && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT ! 2439: && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o' ! 2440: && ! (GET_CODE (SET_SRC (x)) == SUBREG ! 2441: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o')) ! 2442: return &SET_SRC (x); ! 2443: #endif ! 2444: ! 2445: /* See if we can split SET_SRC as it stands. */ ! 2446: split = find_split_point (&SET_SRC (x), insn); ! 2447: if (split && split != &SET_SRC (x)) ! 2448: return split; ! 2449: ! 2450: /* See if this is a bitfield assignment with everything constant. If ! 2451: so, this is an IOR of an AND, so split it into that. */ ! 2452: if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT ! 2453: && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))) ! 2454: <= HOST_BITS_PER_WIDE_INT) ! 2455: && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT ! 2456: && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT ! 2457: && GET_CODE (SET_SRC (x)) == CONST_INT ! 2458: && ((INTVAL (XEXP (SET_DEST (x), 1)) ! 2459: + INTVAL (XEXP (SET_DEST (x), 2))) ! 2460: <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))) ! 2461: && ! side_effects_p (XEXP (SET_DEST (x), 0))) ! 2462: { ! 2463: int pos = INTVAL (XEXP (SET_DEST (x), 2)); ! 2464: int len = INTVAL (XEXP (SET_DEST (x), 1)); ! 2465: int src = INTVAL (SET_SRC (x)); ! 2466: rtx dest = XEXP (SET_DEST (x), 0); ! 2467: enum machine_mode mode = GET_MODE (dest); ! 2468: unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1; ! 2469: ! 2470: #if BITS_BIG_ENDIAN ! 2471: pos = GET_MODE_BITSIZE (mode) - len - pos; ! 2472: #endif ! 2473: ! 2474: if (src == mask) ! 2475: SUBST (SET_SRC (x), ! 2476: gen_binary (IOR, mode, dest, GEN_INT (src << pos))); ! 2477: else ! 2478: SUBST (SET_SRC (x), ! 2479: gen_binary (IOR, mode, ! 2480: gen_binary (AND, mode, dest, ! 2481: GEN_INT (~ (mask << pos) ! 2482: & GET_MODE_MASK (mode))), ! 2483: GEN_INT (src << pos))); ! 2484: ! 2485: SUBST (SET_DEST (x), dest); ! 2486: ! 2487: split = find_split_point (&SET_SRC (x), insn); ! 2488: if (split && split != &SET_SRC (x)) ! 2489: return split; ! 2490: } ! 2491: ! 2492: /* Otherwise, see if this is an operation that we can split into two. ! 2493: If so, try to split that. */ ! 2494: code = GET_CODE (SET_SRC (x)); ! 2495: ! 2496: switch (code) ! 2497: { ! 2498: case AND: ! 2499: /* If we are AND'ing with a large constant that is only a single ! 2500: bit and the result is only being used in a context where we ! 2501: need to know if it is zero or non-zero, replace it with a bit ! 2502: extraction. This will avoid the large constant, which might ! 2503: have taken more than one insn to make. If the constant were ! 2504: not a valid argument to the AND but took only one insn to make, ! 2505: this is no worse, but if it took more than one insn, it will ! 2506: be better. */ ! 2507: ! 2508: if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ! 2509: && GET_CODE (XEXP (SET_SRC (x), 0)) == REG ! 2510: && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7 ! 2511: && GET_CODE (SET_DEST (x)) == REG ! 2512: && (split = find_single_use (SET_DEST (x), insn, NULL_PTR)) != 0 ! 2513: && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE) ! 2514: && XEXP (*split, 0) == SET_DEST (x) ! 2515: && XEXP (*split, 1) == const0_rtx) ! 2516: { ! 2517: SUBST (SET_SRC (x), ! 2518: make_extraction (GET_MODE (SET_DEST (x)), ! 2519: XEXP (SET_SRC (x), 0), ! 2520: pos, NULL_RTX, 1, 1, 0, 0)); ! 2521: return find_split_point (loc, insn); ! 2522: } ! 2523: break; ! 2524: ! 2525: case SIGN_EXTEND: ! 2526: inner = XEXP (SET_SRC (x), 0); ! 2527: pos = 0; ! 2528: len = GET_MODE_BITSIZE (GET_MODE (inner)); ! 2529: unsignedp = 0; ! 2530: break; ! 2531: ! 2532: case SIGN_EXTRACT: ! 2533: case ZERO_EXTRACT: ! 2534: if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT ! 2535: && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT) ! 2536: { ! 2537: inner = XEXP (SET_SRC (x), 0); ! 2538: len = INTVAL (XEXP (SET_SRC (x), 1)); ! 2539: pos = INTVAL (XEXP (SET_SRC (x), 2)); ! 2540: ! 2541: #if BITS_BIG_ENDIAN ! 2542: pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos; ! 2543: #endif ! 2544: unsignedp = (code == ZERO_EXTRACT); ! 2545: } ! 2546: break; ! 2547: } ! 2548: ! 2549: if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner))) ! 2550: { ! 2551: enum machine_mode mode = GET_MODE (SET_SRC (x)); ! 2552: ! 2553: /* For unsigned, we have a choice of a shift followed by an ! 2554: AND or two shifts. Use two shifts for field sizes where the ! 2555: constant might be too large. We assume here that we can ! 2556: always at least get 8-bit constants in an AND insn, which is ! 2557: true for every current RISC. */ ! 2558: ! 2559: if (unsignedp && len <= 8) ! 2560: { ! 2561: SUBST (SET_SRC (x), ! 2562: gen_rtx_combine ! 2563: (AND, mode, ! 2564: gen_rtx_combine (LSHIFTRT, mode, ! 2565: gen_lowpart_for_combine (mode, inner), ! 2566: GEN_INT (pos)), ! 2567: GEN_INT (((HOST_WIDE_INT) 1 << len) - 1))); ! 2568: ! 2569: split = find_split_point (&SET_SRC (x), insn); ! 2570: if (split && split != &SET_SRC (x)) ! 2571: return split; ! 2572: } ! 2573: else ! 2574: { ! 2575: SUBST (SET_SRC (x), ! 2576: gen_rtx_combine ! 2577: (unsignedp ? LSHIFTRT : ASHIFTRT, mode, ! 2578: gen_rtx_combine (ASHIFT, mode, ! 2579: gen_lowpart_for_combine (mode, inner), ! 2580: GEN_INT (GET_MODE_BITSIZE (mode) ! 2581: - len - pos)), ! 2582: GEN_INT (GET_MODE_BITSIZE (mode) - len))); ! 2583: ! 2584: split = find_split_point (&SET_SRC (x), insn); ! 2585: if (split && split != &SET_SRC (x)) ! 2586: return split; ! 2587: } ! 2588: } ! 2589: ! 2590: /* See if this is a simple operation with a constant as the second ! 2591: operand. It might be that this constant is out of range and hence ! 2592: could be used as a split point. */ ! 2593: if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2' ! 2594: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c' ! 2595: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<') ! 2596: && CONSTANT_P (XEXP (SET_SRC (x), 1)) ! 2597: && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o' ! 2598: || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG ! 2599: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0)))) ! 2600: == 'o')))) ! 2601: return &XEXP (SET_SRC (x), 1); ! 2602: ! 2603: /* Finally, see if this is a simple operation with its first operand ! 2604: not in a register. The operation might require this operand in a ! 2605: register, so return it as a split point. We can always do this ! 2606: because if the first operand were another operation, we would have ! 2607: already found it as a split point. */ ! 2608: if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2' ! 2609: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c' ! 2610: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<' ! 2611: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1') ! 2612: && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode)) ! 2613: return &XEXP (SET_SRC (x), 0); ! 2614: ! 2615: return 0; ! 2616: ! 2617: case AND: ! 2618: case IOR: ! 2619: /* We write NOR as (and (not A) (not B)), but if we don't have a NOR, ! 2620: it is better to write this as (not (ior A B)) so we can split it. ! 2621: Similarly for IOR. */ ! 2622: if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT) ! 2623: { ! 2624: SUBST (*loc, ! 2625: gen_rtx_combine (NOT, GET_MODE (x), ! 2626: gen_rtx_combine (code == IOR ? AND : IOR, ! 2627: GET_MODE (x), ! 2628: XEXP (XEXP (x, 0), 0), ! 2629: XEXP (XEXP (x, 1), 0)))); ! 2630: return find_split_point (loc, insn); ! 2631: } ! 2632: ! 2633: /* Many RISC machines have a large set of logical insns. If the ! 2634: second operand is a NOT, put it first so we will try to split the ! 2635: other operand first. */ ! 2636: if (GET_CODE (XEXP (x, 1)) == NOT) ! 2637: { ! 2638: rtx tem = XEXP (x, 0); ! 2639: SUBST (XEXP (x, 0), XEXP (x, 1)); ! 2640: SUBST (XEXP (x, 1), tem); ! 2641: } ! 2642: break; ! 2643: } ! 2644: ! 2645: /* Otherwise, select our actions depending on our rtx class. */ ! 2646: switch (GET_RTX_CLASS (code)) ! 2647: { ! 2648: case 'b': /* This is ZERO_EXTRACT and SIGN_EXTRACT. */ ! 2649: case '3': ! 2650: split = find_split_point (&XEXP (x, 2), insn); ! 2651: if (split) ! 2652: return split; ! 2653: /* ... fall through ... */ ! 2654: case '2': ! 2655: case 'c': ! 2656: case '<': ! 2657: split = find_split_point (&XEXP (x, 1), insn); ! 2658: if (split) ! 2659: return split; ! 2660: /* ... fall through ... */ ! 2661: case '1': ! 2662: /* Some machines have (and (shift ...) ...) insns. If X is not ! 2663: an AND, but XEXP (X, 0) is, use it as our split point. */ ! 2664: if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND) ! 2665: return &XEXP (x, 0); ! 2666: ! 2667: split = find_split_point (&XEXP (x, 0), insn); ! 2668: if (split) ! 2669: return split; ! 2670: return loc; ! 2671: } ! 2672: ! 2673: /* Otherwise, we don't have a split point. */ ! 2674: return 0; ! 2675: } ! 2676: ! 2677: /* Throughout X, replace FROM with TO, and return the result. ! 2678: The result is TO if X is FROM; ! 2679: otherwise the result is X, but its contents may have been modified. ! 2680: If they were modified, a record was made in undobuf so that ! 2681: undo_all will (among other things) return X to its original state. ! 2682: ! 2683: If the number of changes necessary is too much to record to undo, ! 2684: the excess changes are not made, so the result is invalid. ! 2685: The changes already made can still be undone. ! 2686: undobuf.num_undo is incremented for such changes, so by testing that ! 2687: the caller can tell whether the result is valid. ! 2688: ! 2689: `n_occurrences' is incremented each time FROM is replaced. ! 2690: ! 2691: IN_DEST is non-zero if we are processing the SET_DEST of a SET. ! 2692: ! 2693: UNIQUE_COPY is non-zero if each substitution must be unique. We do this ! 2694: by copying if `n_occurrences' is non-zero. */ ! 2695: ! 2696: static rtx ! 2697: subst (x, from, to, in_dest, unique_copy) ! 2698: register rtx x, from, to; ! 2699: int in_dest; ! 2700: int unique_copy; ! 2701: { ! 2702: register char *fmt; ! 2703: register int len, i; ! 2704: register enum rtx_code code = GET_CODE (x), orig_code = code; ! 2705: rtx temp; ! 2706: enum machine_mode mode = GET_MODE (x); ! 2707: enum machine_mode op0_mode = VOIDmode; ! 2708: rtx other_insn; ! 2709: rtx *cc_use; ! 2710: int n_restarts = 0; ! 2711: ! 2712: /* FAKE_EXTEND_SAFE_P (MODE, FROM) is 1 if (subreg:MODE FROM 0) is a safe ! 2713: replacement for (zero_extend:MODE FROM) or (sign_extend:MODE FROM). ! 2714: If it is 0, that cannot be done. We can now do this for any MEM ! 2715: because (SUBREG (MEM...)) is guaranteed to cause the MEM to be reloaded. ! 2716: If not for that, MEM's would very rarely be safe. */ ! 2717: ! 2718: /* Reject MODEs bigger than a word, because we might not be able ! 2719: to reference a two-register group starting with an arbitrary register ! 2720: (and currently gen_lowpart might crash for a SUBREG). */ ! 2721: ! 2722: #define FAKE_EXTEND_SAFE_P(MODE, FROM) \ ! 2723: (GET_MODE_SIZE (MODE) <= UNITS_PER_WORD) ! 2724: ! 2725: /* Two expressions are equal if they are identical copies of a shared ! 2726: RTX or if they are both registers with the same register number ! 2727: and mode. */ ! 2728: ! 2729: #define COMBINE_RTX_EQUAL_P(X,Y) \ ! 2730: ((X) == (Y) \ ! 2731: || (GET_CODE (X) == REG && GET_CODE (Y) == REG \ ! 2732: && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y))) ! 2733: ! 2734: if (! in_dest && COMBINE_RTX_EQUAL_P (x, from)) ! 2735: { ! 2736: n_occurrences++; ! 2737: return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to); ! 2738: } ! 2739: ! 2740: /* If X and FROM are the same register but different modes, they will ! 2741: not have been seen as equal above. However, flow.c will make a ! 2742: LOG_LINKS entry for that case. If we do nothing, we will try to ! 2743: rerecognize our original insn and, when it succeeds, we will ! 2744: delete the feeding insn, which is incorrect. ! 2745: ! 2746: So force this insn not to match in this (rare) case. */ ! 2747: if (! in_dest && code == REG && GET_CODE (from) == REG ! 2748: && REGNO (x) == REGNO (from)) ! 2749: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); ! 2750: ! 2751: /* If this is an object, we are done unless it is a MEM or LO_SUM, both ! 2752: of which may contain things that can be combined. */ ! 2753: if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o') ! 2754: return x; ! 2755: ! 2756: /* It is possible to have a subexpression appear twice in the insn. ! 2757: Suppose that FROM is a register that appears within TO. ! 2758: Then, after that subexpression has been scanned once by `subst', ! 2759: the second time it is scanned, TO may be found. If we were ! 2760: to scan TO here, we would find FROM within it and create a ! 2761: self-referent rtl structure which is completely wrong. */ ! 2762: if (COMBINE_RTX_EQUAL_P (x, to)) ! 2763: return to; ! 2764: ! 2765: len = GET_RTX_LENGTH (code); ! 2766: fmt = GET_RTX_FORMAT (code); ! 2767: ! 2768: /* We don't need to process a SET_DEST that is a register, CC0, or PC, so ! 2769: set up to skip this common case. All other cases where we want to ! 2770: suppress replacing something inside a SET_SRC are handled via the ! 2771: IN_DEST operand. */ ! 2772: if (code == SET ! 2773: && (GET_CODE (SET_DEST (x)) == REG ! 2774: || GET_CODE (SET_DEST (x)) == CC0 ! 2775: || GET_CODE (SET_DEST (x)) == PC)) ! 2776: fmt = "ie"; ! 2777: ! 2778: /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a constant. */ ! 2779: if (fmt[0] == 'e') ! 2780: op0_mode = GET_MODE (XEXP (x, 0)); ! 2781: ! 2782: for (i = 0; i < len; i++) ! 2783: { ! 2784: if (fmt[i] == 'E') ! 2785: { ! 2786: register int j; ! 2787: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 2788: { ! 2789: register rtx new; ! 2790: if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from)) ! 2791: { ! 2792: new = (unique_copy && n_occurrences ? copy_rtx (to) : to); ! 2793: n_occurrences++; ! 2794: } ! 2795: else ! 2796: { ! 2797: new = subst (XVECEXP (x, i, j), from, to, 0, unique_copy); ! 2798: ! 2799: /* If this substitution failed, this whole thing fails. */ ! 2800: if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx) ! 2801: return new; ! 2802: } ! 2803: ! 2804: SUBST (XVECEXP (x, i, j), new); ! 2805: } ! 2806: } ! 2807: else if (fmt[i] == 'e') ! 2808: { ! 2809: register rtx new; ! 2810: ! 2811: if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from)) ! 2812: { ! 2813: /* In general, don't install a subreg involving two modes not ! 2814: tieable. It can worsen register allocation, and can even ! 2815: make invalid reload insns, since the reg inside may need to ! 2816: be copied from in the outside mode, and that may be invalid ! 2817: if it is an fp reg copied in integer mode. ! 2818: ! 2819: We allow two exceptions to this: It is valid if it is inside ! 2820: another SUBREG and the mode of that SUBREG and the mode of ! 2821: the inside of TO is tieable and it is valid if X is a SET ! 2822: that copies FROM to CC0. */ ! 2823: if (GET_CODE (to) == SUBREG ! 2824: && ! MODES_TIEABLE_P (GET_MODE (to), ! 2825: GET_MODE (SUBREG_REG (to))) ! 2826: && ! (code == SUBREG ! 2827: && MODES_TIEABLE_P (mode, GET_MODE (SUBREG_REG (to)))) ! 2828: #ifdef HAVE_cc0 ! 2829: && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx) ! 2830: #endif ! 2831: ) ! 2832: return gen_rtx (CLOBBER, VOIDmode, const0_rtx); ! 2833: ! 2834: new = (unique_copy && n_occurrences ? copy_rtx (to) : to); ! 2835: n_occurrences++; ! 2836: } ! 2837: else ! 2838: /* If we are in a SET_DEST, suppress most cases unless we ! 2839: have gone inside a MEM, in which case we want to ! 2840: simplify the address. We assume here that things that ! 2841: are actually part of the destination have their inner ! 2842: parts in the first expression. This is true for SUBREG, ! 2843: STRICT_LOW_PART, and ZERO_EXTRACT, which are the only ! 2844: things aside from REG and MEM that should appear in a ! 2845: SET_DEST. */ ! 2846: new = subst (XEXP (x, i), from, to, ! 2847: (((in_dest ! 2848: && (code == SUBREG || code == STRICT_LOW_PART ! 2849: || code == ZERO_EXTRACT)) ! 2850: || code == SET) ! 2851: && i == 0), unique_copy); ! 2852: ! 2853: /* If we found that we will have to reject this combination, ! 2854: indicate that by returning the CLOBBER ourselves, rather than ! 2855: an expression containing it. This will speed things up as ! 2856: well as prevent accidents where two CLOBBERs are considered ! 2857: to be equal, thus producing an incorrect simplification. */ ! 2858: ! 2859: if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx) ! 2860: return new; ! 2861: ! 2862: SUBST (XEXP (x, i), new); ! 2863: } ! 2864: } ! 2865: ! 2866: /* We come back to here if we have replaced the expression with one of ! 2867: a different code and it is likely that further simplification will be ! 2868: possible. */ ! 2869: ! 2870: restart: ! 2871: ! 2872: /* If we have restarted more than 4 times, we are probably looping, so ! 2873: give up. */ ! 2874: if (++n_restarts > 4) ! 2875: return x; ! 2876: ! 2877: /* If we are restarting at all, it means that we no longer know the ! 2878: original mode of operand 0 (since we have probably changed the ! 2879: form of X). */ ! 2880: ! 2881: if (n_restarts > 1) ! 2882: op0_mode = VOIDmode; ! 2883: ! 2884: code = GET_CODE (x); ! 2885: ! 2886: /* If this is a commutative operation, put a constant last and a complex ! 2887: expression first. We don't need to do this for comparisons here. */ ! 2888: if (GET_RTX_CLASS (code) == 'c' ! 2889: && ((CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT) ! 2890: || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'o' ! 2891: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o') ! 2892: || (GET_CODE (XEXP (x, 0)) == SUBREG ! 2893: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o' ! 2894: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o'))) ! 2895: { ! 2896: temp = XEXP (x, 0); ! 2897: SUBST (XEXP (x, 0), XEXP (x, 1)); ! 2898: SUBST (XEXP (x, 1), temp); ! 2899: } ! 2900: ! 2901: /* If this is a PLUS, MINUS, or MULT, and the first operand is the ! 2902: sign extension of a PLUS with a constant, reverse the order of the sign ! 2903: extension and the addition. Note that this not the same as the original ! 2904: code, but overflow is undefined for signed values. Also note that the ! 2905: PLUS will have been partially moved "inside" the sign-extension, so that ! 2906: the first operand of X will really look like: ! 2907: (ashiftrt (plus (ashift A C4) C5) C4). ! 2908: We convert this to ! 2909: (plus (ashiftrt (ashift A C4) C2) C4) ! 2910: and replace the first operand of X with that expression. Later parts ! 2911: of this function may simplify the expression further. ! 2912: ! 2913: For example, if we start with (mult (sign_extend (plus A C1)) C2), ! 2914: we swap the SIGN_EXTEND and PLUS. Later code will apply the ! 2915: distributive law to produce (plus (mult (sign_extend X) C1) C3). ! 2916: ! 2917: We do this to simplify address expressions. */ ! 2918: ! 2919: if ((code == PLUS || code == MINUS || code == MULT) ! 2920: && GET_CODE (XEXP (x, 0)) == ASHIFTRT ! 2921: && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS ! 2922: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT ! 2923: && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT ! 2924: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 2925: && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1) ! 2926: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT ! 2927: && (temp = simplify_binary_operation (ASHIFTRT, mode, ! 2928: XEXP (XEXP (XEXP (x, 0), 0), 1), ! 2929: XEXP (XEXP (x, 0), 1))) != 0) ! 2930: { ! 2931: rtx new ! 2932: = simplify_shift_const (NULL_RTX, ASHIFT, mode, ! 2933: XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0), ! 2934: INTVAL (XEXP (XEXP (x, 0), 1))); ! 2935: ! 2936: new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new, ! 2937: INTVAL (XEXP (XEXP (x, 0), 1))); ! 2938: ! 2939: SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp)); ! 2940: } ! 2941: ! 2942: /* If this is a simple operation applied to an IF_THEN_ELSE, try ! 2943: applying it to the arms of the IF_THEN_ELSE. This often simplifies ! 2944: things. Don't deal with operations that change modes here. */ ! 2945: ! 2946: if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c') ! 2947: && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE) ! 2948: { ! 2949: /* Don't do this by using SUBST inside X since we might be messing ! 2950: up a shared expression. */ ! 2951: rtx cond = XEXP (XEXP (x, 0), 0); ! 2952: rtx t_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1), ! 2953: XEXP (x, 1)), ! 2954: pc_rtx, pc_rtx, 0, 0); ! 2955: rtx f_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2), ! 2956: XEXP (x, 1)), ! 2957: pc_rtx, pc_rtx, 0, 0); ! 2958: ! 2959: ! 2960: x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm); ! 2961: goto restart; ! 2962: } ! 2963: ! 2964: else if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c') ! 2965: && GET_CODE (XEXP (x, 1)) == IF_THEN_ELSE) ! 2966: { ! 2967: /* Don't do this by using SUBST inside X since we might be messing ! 2968: up a shared expression. */ ! 2969: rtx cond = XEXP (XEXP (x, 1), 0); ! 2970: rtx t_arm = subst (gen_binary (code, mode, XEXP (x, 0), ! 2971: XEXP (XEXP (x, 1), 1)), ! 2972: pc_rtx, pc_rtx, 0, 0); ! 2973: rtx f_arm = subst (gen_binary (code, mode, XEXP (x, 0), ! 2974: XEXP (XEXP (x, 1), 2)), ! 2975: pc_rtx, pc_rtx, 0, 0); ! 2976: ! 2977: x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm); ! 2978: goto restart; ! 2979: } ! 2980: ! 2981: else if (GET_RTX_CLASS (code) == '1' ! 2982: && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE ! 2983: && GET_MODE (XEXP (x, 0)) == mode) ! 2984: { ! 2985: rtx cond = XEXP (XEXP (x, 0), 0); ! 2986: rtx t_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)), ! 2987: pc_rtx, pc_rtx, 0, 0); ! 2988: rtx f_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)), ! 2989: pc_rtx, pc_rtx, 0, 0); ! 2990: ! 2991: x = gen_rtx_combine (IF_THEN_ELSE, mode, cond, t_arm, f_arm); ! 2992: goto restart; ! 2993: } ! 2994: ! 2995: /* Try to fold this expression in case we have constants that weren't ! 2996: present before. */ ! 2997: temp = 0; ! 2998: switch (GET_RTX_CLASS (code)) ! 2999: { ! 3000: case '1': ! 3001: temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode); ! 3002: break; ! 3003: case '<': ! 3004: temp = simplify_relational_operation (code, op0_mode, ! 3005: XEXP (x, 0), XEXP (x, 1)); ! 3006: #ifdef FLOAT_STORE_FLAG_VALUE ! 3007: if (temp != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) ! 3008: temp = ((temp == const0_rtx) ? CONST0_RTX (GET_MODE (x)) ! 3009: : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x))); ! 3010: #endif ! 3011: break; ! 3012: case 'c': ! 3013: case '2': ! 3014: temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1)); ! 3015: break; ! 3016: case 'b': ! 3017: case '3': ! 3018: temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0), ! 3019: XEXP (x, 1), XEXP (x, 2)); ! 3020: break; ! 3021: } ! 3022: ! 3023: if (temp) ! 3024: x = temp, code = GET_CODE (temp); ! 3025: ! 3026: /* First see if we can apply the inverse distributive law. */ ! 3027: if (code == PLUS || code == MINUS ! 3028: || code == AND || code == IOR || code == XOR) ! 3029: { ! 3030: x = apply_distributive_law (x); ! 3031: code = GET_CODE (x); ! 3032: } ! 3033: ! 3034: /* If CODE is an associative operation not otherwise handled, see if we ! 3035: can associate some operands. This can win if they are constants or ! 3036: if they are logically related (i.e. (a & b) & a. */ ! 3037: if ((code == PLUS || code == MINUS ! 3038: || code == MULT || code == AND || code == IOR || code == XOR ! 3039: || code == DIV || code == UDIV ! 3040: || code == SMAX || code == SMIN || code == UMAX || code == UMIN) ! 3041: && INTEGRAL_MODE_P (mode)) ! 3042: { ! 3043: if (GET_CODE (XEXP (x, 0)) == code) ! 3044: { ! 3045: rtx other = XEXP (XEXP (x, 0), 0); ! 3046: rtx inner_op0 = XEXP (XEXP (x, 0), 1); ! 3047: rtx inner_op1 = XEXP (x, 1); ! 3048: rtx inner; ! 3049: ! 3050: /* Make sure we pass the constant operand if any as the second ! 3051: one if this is a commutative operation. */ ! 3052: if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c') ! 3053: { ! 3054: rtx tem = inner_op0; ! 3055: inner_op0 = inner_op1; ! 3056: inner_op1 = tem; ! 3057: } ! 3058: inner = simplify_binary_operation (code == MINUS ? PLUS ! 3059: : code == DIV ? MULT ! 3060: : code == UDIV ? MULT ! 3061: : code, ! 3062: mode, inner_op0, inner_op1); ! 3063: ! 3064: /* For commutative operations, try the other pair if that one ! 3065: didn't simplify. */ ! 3066: if (inner == 0 && GET_RTX_CLASS (code) == 'c') ! 3067: { ! 3068: other = XEXP (XEXP (x, 0), 1); ! 3069: inner = simplify_binary_operation (code, mode, ! 3070: XEXP (XEXP (x, 0), 0), ! 3071: XEXP (x, 1)); ! 3072: } ! 3073: ! 3074: if (inner) ! 3075: { ! 3076: x = gen_binary (code, mode, other, inner); ! 3077: goto restart; ! 3078: ! 3079: } ! 3080: } ! 3081: } ! 3082: ! 3083: /* A little bit of algebraic simplification here. */ ! 3084: switch (code) ! 3085: { ! 3086: case MEM: ! 3087: /* Ensure that our address has any ASHIFTs converted to MULT in case ! 3088: address-recognizing predicates are called later. */ ! 3089: temp = make_compound_operation (XEXP (x, 0), MEM); ! 3090: SUBST (XEXP (x, 0), temp); ! 3091: break; ! 3092: ! 3093: case SUBREG: ! 3094: /* (subreg:A (mem:B X) N) becomes a modified MEM unless the SUBREG ! 3095: is paradoxical. If we can't do that safely, then it becomes ! 3096: something nonsensical so that this combination won't take place. */ ! 3097: ! 3098: if (GET_CODE (SUBREG_REG (x)) == MEM ! 3099: && (GET_MODE_SIZE (mode) ! 3100: <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))) ! 3101: { ! 3102: rtx inner = SUBREG_REG (x); ! 3103: int endian_offset = 0; ! 3104: /* Don't change the mode of the MEM ! 3105: if that would change the meaning of the address. */ ! 3106: if (MEM_VOLATILE_P (SUBREG_REG (x)) ! 3107: || mode_dependent_address_p (XEXP (inner, 0))) ! 3108: return gen_rtx (CLOBBER, mode, const0_rtx); ! 3109: ! 3110: #if BYTES_BIG_ENDIAN ! 3111: if (GET_MODE_SIZE (mode) < UNITS_PER_WORD) ! 3112: endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (mode); ! 3113: if (GET_MODE_SIZE (GET_MODE (inner)) < UNITS_PER_WORD) ! 3114: endian_offset -= UNITS_PER_WORD - GET_MODE_SIZE (GET_MODE (inner)); ! 3115: #endif ! 3116: /* Note if the plus_constant doesn't make a valid address ! 3117: then this combination won't be accepted. */ ! 3118: x = gen_rtx (MEM, mode, ! 3119: plus_constant (XEXP (inner, 0), ! 3120: (SUBREG_WORD (x) * UNITS_PER_WORD ! 3121: + endian_offset))); ! 3122: MEM_VOLATILE_P (x) = MEM_VOLATILE_P (inner); ! 3123: RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (inner); ! 3124: MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (inner); ! 3125: return x; ! 3126: } ! 3127: ! 3128: /* If we are in a SET_DEST, these other cases can't apply. */ ! 3129: if (in_dest) ! 3130: return x; ! 3131: ! 3132: /* Changing mode twice with SUBREG => just change it once, ! 3133: or not at all if changing back to starting mode. */ ! 3134: if (GET_CODE (SUBREG_REG (x)) == SUBREG) ! 3135: { ! 3136: if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x))) ! 3137: && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0) ! 3138: return SUBREG_REG (SUBREG_REG (x)); ! 3139: ! 3140: SUBST_INT (SUBREG_WORD (x), ! 3141: SUBREG_WORD (x) + SUBREG_WORD (SUBREG_REG (x))); ! 3142: SUBST (SUBREG_REG (x), SUBREG_REG (SUBREG_REG (x))); ! 3143: } ! 3144: ! 3145: /* SUBREG of a hard register => just change the register number ! 3146: and/or mode. If the hard register is not valid in that mode, ! 3147: suppress this combination. If the hard register is the stack, ! 3148: frame, or argument pointer, leave this as a SUBREG. */ ! 3149: ! 3150: if (GET_CODE (SUBREG_REG (x)) == REG ! 3151: && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER ! 3152: && REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM ! 3153: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 3154: && REGNO (SUBREG_REG (x)) != HARD_FRAME_POINTER_REGNUM ! 3155: #endif ! 3156: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 3157: && REGNO (SUBREG_REG (x)) != ARG_POINTER_REGNUM ! 3158: #endif ! 3159: && REGNO (SUBREG_REG (x)) != STACK_POINTER_REGNUM) ! 3160: { ! 3161: if (HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (x)) + SUBREG_WORD (x), ! 3162: mode)) ! 3163: return gen_rtx (REG, mode, ! 3164: REGNO (SUBREG_REG (x)) + SUBREG_WORD (x)); ! 3165: else ! 3166: return gen_rtx (CLOBBER, mode, const0_rtx); ! 3167: } ! 3168: ! 3169: /* For a constant, try to pick up the part we want. Handle a full ! 3170: word and low-order part. Only do this if we are narrowing ! 3171: the constant; if it is being widened, we have no idea what ! 3172: the extra bits will have been set to. */ ! 3173: ! 3174: if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode ! 3175: && GET_MODE_SIZE (mode) == UNITS_PER_WORD ! 3176: && GET_MODE_SIZE (op0_mode) < UNITS_PER_WORD ! 3177: && GET_MODE_CLASS (mode) == MODE_INT) ! 3178: { ! 3179: temp = operand_subword (SUBREG_REG (x), SUBREG_WORD (x), ! 3180: 0, op0_mode); ! 3181: if (temp) ! 3182: return temp; ! 3183: } ! 3184: ! 3185: /* If we want a subreg of a constant, at offset 0, ! 3186: take the low bits. On a little-endian machine, that's ! 3187: always valid. On a big-endian machine, it's valid ! 3188: only if the constant's mode fits in one word. */ ! 3189: if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x) ! 3190: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode) ! 3191: #if WORDS_BIG_ENDIAN ! 3192: && GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD ! 3193: #endif ! 3194: ) ! 3195: return gen_lowpart_for_combine (mode, SUBREG_REG (x)); ! 3196: ! 3197: /* If we are narrowing an integral object, we need to see if we can ! 3198: simplify the expression for the object knowing that we only need the ! 3199: low-order bits. */ ! 3200: ! 3201: if (GET_MODE_CLASS (mode) == MODE_INT ! 3202: && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT ! 3203: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) ! 3204: && subreg_lowpart_p (x)) ! 3205: return force_to_mode (SUBREG_REG (x), mode, GET_MODE_MASK (mode), ! 3206: NULL_RTX, 0); ! 3207: break; ! 3208: ! 3209: case NOT: ! 3210: /* (not (plus X -1)) can become (neg X). */ ! 3211: if (GET_CODE (XEXP (x, 0)) == PLUS ! 3212: && XEXP (XEXP (x, 0), 1) == constm1_rtx) ! 3213: { ! 3214: x = gen_rtx_combine (NEG, mode, XEXP (XEXP (x, 0), 0)); ! 3215: goto restart; ! 3216: } ! 3217: ! 3218: /* Similarly, (not (neg X)) is (plus X -1). */ ! 3219: if (GET_CODE (XEXP (x, 0)) == NEG) ! 3220: { ! 3221: x = gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx); ! 3222: goto restart; ! 3223: } ! 3224: ! 3225: /* (not (xor X C)) for C constant is (xor X D) with D = ~ C. */ ! 3226: if (GET_CODE (XEXP (x, 0)) == XOR ! 3227: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 3228: && (temp = simplify_unary_operation (NOT, mode, ! 3229: XEXP (XEXP (x, 0), 1), ! 3230: mode)) != 0) ! 3231: { ! 3232: SUBST (XEXP (XEXP (x, 0), 1), temp); ! 3233: return XEXP (x, 0); ! 3234: } ! 3235: ! 3236: /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for operands ! 3237: other than 1, but that is not valid. We could do a similar ! 3238: simplification for (not (lshiftrt C X)) where C is just the sign bit, ! 3239: but this doesn't seem common enough to bother with. */ ! 3240: if (GET_CODE (XEXP (x, 0)) == ASHIFT ! 3241: && XEXP (XEXP (x, 0), 0) == const1_rtx) ! 3242: { ! 3243: x = gen_rtx (ROTATE, mode, gen_unary (NOT, mode, const1_rtx), ! 3244: XEXP (XEXP (x, 0), 1)); ! 3245: goto restart; ! 3246: } ! 3247: ! 3248: if (GET_CODE (XEXP (x, 0)) == SUBREG ! 3249: && subreg_lowpart_p (XEXP (x, 0)) ! 3250: && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) ! 3251: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0))))) ! 3252: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT ! 3253: && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx) ! 3254: { ! 3255: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0))); ! 3256: ! 3257: x = gen_rtx (ROTATE, inner_mode, ! 3258: gen_unary (NOT, inner_mode, const1_rtx), ! 3259: XEXP (SUBREG_REG (XEXP (x, 0)), 1)); ! 3260: x = gen_lowpart_for_combine (mode, x); ! 3261: goto restart; ! 3262: } ! 3263: ! 3264: #if STORE_FLAG_VALUE == -1 ! 3265: /* (not (comparison foo bar)) can be done by reversing the comparison ! 3266: code if valid. */ ! 3267: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3268: && reversible_comparison_p (XEXP (x, 0))) ! 3269: return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))), ! 3270: mode, XEXP (XEXP (x, 0), 0), ! 3271: XEXP (XEXP (x, 0), 1)); ! 3272: ! 3273: /* (ashiftrt foo C) where C is the number of bits in FOO minus 1 ! 3274: is (lt foo (const_int 0)), so we can perform the above ! 3275: simplification. */ ! 3276: ! 3277: if (XEXP (x, 1) == const1_rtx ! 3278: && GET_CODE (XEXP (x, 0)) == ASHIFTRT ! 3279: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 3280: && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1) ! 3281: return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx); ! 3282: #endif ! 3283: ! 3284: /* Apply De Morgan's laws to reduce number of patterns for machines ! 3285: with negating logical insns (and-not, nand, etc.). If result has ! 3286: only one NOT, put it first, since that is how the patterns are ! 3287: coded. */ ! 3288: ! 3289: if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND) ! 3290: { ! 3291: rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1); ! 3292: ! 3293: if (GET_CODE (in1) == NOT) ! 3294: in1 = XEXP (in1, 0); ! 3295: else ! 3296: in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1); ! 3297: ! 3298: if (GET_CODE (in2) == NOT) ! 3299: in2 = XEXP (in2, 0); ! 3300: else if (GET_CODE (in2) == CONST_INT ! 3301: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) ! 3302: in2 = GEN_INT (GET_MODE_MASK (mode) & ~ INTVAL (in2)); ! 3303: else ! 3304: in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2); ! 3305: ! 3306: if (GET_CODE (in2) == NOT) ! 3307: { ! 3308: rtx tem = in2; ! 3309: in2 = in1; in1 = tem; ! 3310: } ! 3311: ! 3312: x = gen_rtx_combine (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR, ! 3313: mode, in1, in2); ! 3314: goto restart; ! 3315: } ! 3316: break; ! 3317: ! 3318: case NEG: ! 3319: /* (neg (plus X 1)) can become (not X). */ ! 3320: if (GET_CODE (XEXP (x, 0)) == PLUS ! 3321: && XEXP (XEXP (x, 0), 1) == const1_rtx) ! 3322: { ! 3323: x = gen_rtx_combine (NOT, mode, XEXP (XEXP (x, 0), 0)); ! 3324: goto restart; ! 3325: } ! 3326: ! 3327: /* Similarly, (neg (not X)) is (plus X 1). */ ! 3328: if (GET_CODE (XEXP (x, 0)) == NOT) ! 3329: { ! 3330: x = plus_constant (XEXP (XEXP (x, 0), 0), 1); ! 3331: goto restart; ! 3332: } ! 3333: ! 3334: /* (neg (minus X Y)) can become (minus Y X). */ ! 3335: if (GET_CODE (XEXP (x, 0)) == MINUS ! 3336: && (! FLOAT_MODE_P (mode) ! 3337: /* x-y != -(y-x) with IEEE floating point. */ ! 3338: || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT)) ! 3339: { ! 3340: x = gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1), ! 3341: XEXP (XEXP (x, 0), 0)); ! 3342: goto restart; ! 3343: } ! 3344: ! 3345: /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */ ! 3346: if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx ! 3347: && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1) ! 3348: { ! 3349: x = gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx); ! 3350: goto restart; ! 3351: } ! 3352: ! 3353: /* NEG commutes with ASHIFT since it is multiplication. Only do this ! 3354: if we can then eliminate the NEG (e.g., ! 3355: if the operand is a constant). */ ! 3356: ! 3357: if (GET_CODE (XEXP (x, 0)) == ASHIFT) ! 3358: { ! 3359: temp = simplify_unary_operation (NEG, mode, ! 3360: XEXP (XEXP (x, 0), 0), mode); ! 3361: if (temp) ! 3362: { ! 3363: SUBST (XEXP (XEXP (x, 0), 0), temp); ! 3364: return XEXP (x, 0); ! 3365: } ! 3366: } ! 3367: ! 3368: temp = expand_compound_operation (XEXP (x, 0)); ! 3369: ! 3370: /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be ! 3371: replaced by (lshiftrt X C). This will convert ! 3372: (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */ ! 3373: ! 3374: if (GET_CODE (temp) == ASHIFTRT ! 3375: && GET_CODE (XEXP (temp, 1)) == CONST_INT ! 3376: && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1) ! 3377: { ! 3378: x = simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0), ! 3379: INTVAL (XEXP (temp, 1))); ! 3380: goto restart; ! 3381: } ! 3382: ! 3383: /* If X has only a single bit that might be nonzero, say, bit I, convert ! 3384: (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of ! 3385: MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to ! 3386: (sign_extract X 1 Y). But only do this if TEMP isn't a register ! 3387: or a SUBREG of one since we'd be making the expression more ! 3388: complex if it was just a register. */ ! 3389: ! 3390: if (GET_CODE (temp) != REG ! 3391: && ! (GET_CODE (temp) == SUBREG ! 3392: && GET_CODE (SUBREG_REG (temp)) == REG) ! 3393: && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0) ! 3394: { ! 3395: rtx temp1 = simplify_shift_const ! 3396: (NULL_RTX, ASHIFTRT, mode, ! 3397: simplify_shift_const (NULL_RTX, ASHIFT, mode, temp, ! 3398: GET_MODE_BITSIZE (mode) - 1 - i), ! 3399: GET_MODE_BITSIZE (mode) - 1 - i); ! 3400: ! 3401: /* If all we did was surround TEMP with the two shifts, we ! 3402: haven't improved anything, so don't use it. Otherwise, ! 3403: we are better off with TEMP1. */ ! 3404: if (GET_CODE (temp1) != ASHIFTRT ! 3405: || GET_CODE (XEXP (temp1, 0)) != ASHIFT ! 3406: || XEXP (XEXP (temp1, 0), 0) != temp) ! 3407: { ! 3408: x = temp1; ! 3409: goto restart; ! 3410: } ! 3411: } ! 3412: break; ! 3413: ! 3414: case FLOAT_TRUNCATE: ! 3415: /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */ ! 3416: if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND ! 3417: && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode) ! 3418: return XEXP (XEXP (x, 0), 0); ! 3419: break; ! 3420: ! 3421: #ifdef HAVE_cc0 ! 3422: case COMPARE: ! 3423: /* Convert (compare FOO (const_int 0)) to FOO unless we aren't ! 3424: using cc0, in which case we want to leave it as a COMPARE ! 3425: so we can distinguish it from a register-register-copy. */ ! 3426: if (XEXP (x, 1) == const0_rtx) ! 3427: return XEXP (x, 0); ! 3428: ! 3429: /* In IEEE floating point, x-0 is not the same as x. */ ! 3430: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT ! 3431: || ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))) ! 3432: && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0)))) ! 3433: return XEXP (x, 0); ! 3434: break; ! 3435: #endif ! 3436: ! 3437: case CONST: ! 3438: /* (const (const X)) can become (const X). Do it this way rather than ! 3439: returning the inner CONST since CONST can be shared with a ! 3440: REG_EQUAL note. */ ! 3441: if (GET_CODE (XEXP (x, 0)) == CONST) ! 3442: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ! 3443: break; ! 3444: ! 3445: #ifdef HAVE_lo_sum ! 3446: case LO_SUM: ! 3447: /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we ! 3448: can add in an offset. find_split_point will split this address up ! 3449: again if it doesn't match. */ ! 3450: if (GET_CODE (XEXP (x, 0)) == HIGH ! 3451: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))) ! 3452: return XEXP (x, 1); ! 3453: break; ! 3454: #endif ! 3455: ! 3456: case PLUS: ! 3457: /* If we have (plus (plus (A const) B)), associate it so that CONST is ! 3458: outermost. That's because that's the way indexed addresses are ! 3459: supposed to appear. This code used to check many more cases, but ! 3460: they are now checked elsewhere. */ ! 3461: if (GET_CODE (XEXP (x, 0)) == PLUS ! 3462: && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1))) ! 3463: return gen_binary (PLUS, mode, ! 3464: gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), ! 3465: XEXP (x, 1)), ! 3466: XEXP (XEXP (x, 0), 1)); ! 3467: ! 3468: /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>) ! 3469: when c is (const_int (pow2 + 1) / 2) is a sign extension of a ! 3470: bit-field and can be replaced by either a sign_extend or a ! 3471: sign_extract. The `and' may be a zero_extend. */ ! 3472: if (GET_CODE (XEXP (x, 0)) == XOR ! 3473: && GET_CODE (XEXP (x, 1)) == CONST_INT ! 3474: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 3475: && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1)) ! 3476: && (i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0 ! 3477: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 3478: && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND ! 3479: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT ! 3480: && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) ! 3481: == ((HOST_WIDE_INT) 1 << (i + 1)) - 1)) ! 3482: || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND ! 3483: && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0))) ! 3484: == i + 1)))) ! 3485: { ! 3486: x = simplify_shift_const ! 3487: (NULL_RTX, ASHIFTRT, mode, ! 3488: simplify_shift_const (NULL_RTX, ASHIFT, mode, ! 3489: XEXP (XEXP (XEXP (x, 0), 0), 0), ! 3490: GET_MODE_BITSIZE (mode) - (i + 1)), ! 3491: GET_MODE_BITSIZE (mode) - (i + 1)); ! 3492: goto restart; ! 3493: } ! 3494: ! 3495: /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if ! 3496: C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE ! 3497: is 1. This produces better code than the alternative immediately ! 3498: below. */ ! 3499: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3500: && reversible_comparison_p (XEXP (x, 0)) ! 3501: && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx) ! 3502: || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))) ! 3503: { ! 3504: x = gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))), ! 3505: mode, XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 0), 1)); ! 3506: x = gen_unary (NEG, mode, x); ! 3507: goto restart; ! 3508: } ! 3509: ! 3510: /* If only the low-order bit of X is possibly nonzero, (plus x -1) ! 3511: can become (ashiftrt (ashift (xor x 1) C) C) where C is ! 3512: the bitsize of the mode - 1. This allows simplification of ! 3513: "a = (b & 8) == 0;" */ ! 3514: if (XEXP (x, 1) == constm1_rtx ! 3515: && GET_CODE (XEXP (x, 0)) != REG ! 3516: && ! (GET_CODE (XEXP (x,0)) == SUBREG ! 3517: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG) ! 3518: && nonzero_bits (XEXP (x, 0), mode) == 1) ! 3519: { ! 3520: x = simplify_shift_const ! 3521: (NULL_RTX, ASHIFTRT, mode, ! 3522: simplify_shift_const (NULL_RTX, ASHIFT, mode, ! 3523: gen_rtx_combine (XOR, mode, ! 3524: XEXP (x, 0), const1_rtx), ! 3525: GET_MODE_BITSIZE (mode) - 1), ! 3526: GET_MODE_BITSIZE (mode) - 1); ! 3527: goto restart; ! 3528: } ! 3529: ! 3530: /* If we are adding two things that have no bits in common, convert ! 3531: the addition into an IOR. This will often be further simplified, ! 3532: for example in cases like ((a & 1) + (a & 2)), which can ! 3533: become a & 3. */ ! 3534: ! 3535: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 3536: && (nonzero_bits (XEXP (x, 0), mode) ! 3537: & nonzero_bits (XEXP (x, 1), mode)) == 0) ! 3538: { ! 3539: x = gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1)); ! 3540: goto restart; ! 3541: } ! 3542: break; ! 3543: ! 3544: case MINUS: ! 3545: #if STORE_FLAG_VALUE == 1 ! 3546: /* (minus 1 (comparison foo bar)) can be done by reversing the comparison ! 3547: code if valid. */ ! 3548: if (XEXP (x, 0) == const1_rtx ! 3549: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) == '<' ! 3550: && reversible_comparison_p (XEXP (x, 1))) ! 3551: return gen_binary (reverse_condition (GET_CODE (XEXP (x, 1))), ! 3552: mode, XEXP (XEXP (x, 1), 0), ! 3553: XEXP (XEXP (x, 1), 1)); ! 3554: #endif ! 3555: ! 3556: /* (minus <foo> (and <foo> (const_int -pow2))) becomes ! 3557: (and <foo> (const_int pow2-1)) */ ! 3558: if (GET_CODE (XEXP (x, 1)) == AND ! 3559: && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT ! 3560: && exact_log2 (- INTVAL (XEXP (XEXP (x, 1), 1))) >= 0 ! 3561: && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0))) ! 3562: { ! 3563: x = simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0), ! 3564: - INTVAL (XEXP (XEXP (x, 1), 1)) - 1); ! 3565: goto restart; ! 3566: } ! 3567: break; ! 3568: ! 3569: case MULT: ! 3570: /* If we have (mult (plus A B) C), apply the distributive law and then ! 3571: the inverse distributive law to see if things simplify. This ! 3572: occurs mostly in addresses, often when unrolling loops. */ ! 3573: ! 3574: if (GET_CODE (XEXP (x, 0)) == PLUS) ! 3575: { ! 3576: x = apply_distributive_law ! 3577: (gen_binary (PLUS, mode, ! 3578: gen_binary (MULT, mode, ! 3579: XEXP (XEXP (x, 0), 0), XEXP (x, 1)), ! 3580: gen_binary (MULT, mode, ! 3581: XEXP (XEXP (x, 0), 1), XEXP (x, 1)))); ! 3582: ! 3583: if (GET_CODE (x) != MULT) ! 3584: goto restart; ! 3585: } ! 3586: ! 3587: /* If this is multiplication by a power of two and its first operand is ! 3588: a shift, treat the multiply as a shift to allow the shifts to ! 3589: possibly combine. */ ! 3590: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 3591: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0 ! 3592: && (GET_CODE (XEXP (x, 0)) == ASHIFT ! 3593: || GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 3594: || GET_CODE (XEXP (x, 0)) == ASHIFTRT ! 3595: || GET_CODE (XEXP (x, 0)) == ROTATE ! 3596: || GET_CODE (XEXP (x, 0)) == ROTATERT)) ! 3597: { ! 3598: x = simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0), i); ! 3599: goto restart; ! 3600: } ! 3601: ! 3602: /* Convert (mult (ashift (const_int 1) A) B) to (ashift B A). */ ! 3603: if (GET_CODE (XEXP (x, 0)) == ASHIFT ! 3604: && XEXP (XEXP (x, 0), 0) == const1_rtx) ! 3605: return gen_rtx_combine (ASHIFT, mode, XEXP (x, 1), ! 3606: XEXP (XEXP (x, 0), 1)); ! 3607: break; ! 3608: ! 3609: case UDIV: ! 3610: /* If this is a divide by a power of two, treat it as a shift if ! 3611: its first operand is a shift. */ ! 3612: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 3613: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0 ! 3614: && (GET_CODE (XEXP (x, 0)) == ASHIFT ! 3615: || GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 3616: || GET_CODE (XEXP (x, 0)) == ASHIFTRT ! 3617: || GET_CODE (XEXP (x, 0)) == ROTATE ! 3618: || GET_CODE (XEXP (x, 0)) == ROTATERT)) ! 3619: { ! 3620: x = simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i); ! 3621: goto restart; ! 3622: } ! 3623: break; ! 3624: ! 3625: case EQ: case NE: ! 3626: case GT: case GTU: case GE: case GEU: ! 3627: case LT: case LTU: case LE: case LEU: ! 3628: /* If the first operand is a condition code, we can't do anything ! 3629: with it. */ ! 3630: if (GET_CODE (XEXP (x, 0)) == COMPARE ! 3631: || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC ! 3632: #ifdef HAVE_cc0 ! 3633: && XEXP (x, 0) != cc0_rtx ! 3634: #endif ! 3635: )) ! 3636: { ! 3637: rtx op0 = XEXP (x, 0); ! 3638: rtx op1 = XEXP (x, 1); ! 3639: enum rtx_code new_code; ! 3640: ! 3641: if (GET_CODE (op0) == COMPARE) ! 3642: op1 = XEXP (op0, 1), op0 = XEXP (op0, 0); ! 3643: ! 3644: /* Simplify our comparison, if possible. */ ! 3645: new_code = simplify_comparison (code, &op0, &op1); ! 3646: ! 3647: #if STORE_FLAG_VALUE == 1 ! 3648: /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X ! 3649: if only the low-order bit is possibly nonzero in X (such as when ! 3650: X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to ! 3651: (xor X 1) or (minus 1 X); we use the former. Finally, if X is ! 3652: known to be either 0 or -1, NE becomes a NEG and EQ becomes ! 3653: (plus X 1). ! 3654: ! 3655: Remove any ZERO_EXTRACT we made when thinking this was a ! 3656: comparison. It may now be simpler to use, e.g., an AND. If a ! 3657: ZERO_EXTRACT is indeed appropriate, it will be placed back by ! 3658: the call to make_compound_operation in the SET case. */ ! 3659: ! 3660: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT ! 3661: && op1 == const0_rtx ! 3662: && nonzero_bits (op0, mode) == 1) ! 3663: return gen_lowpart_for_combine (mode, ! 3664: expand_compound_operation (op0)); ! 3665: ! 3666: else if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT ! 3667: && op1 == const0_rtx ! 3668: && (num_sign_bit_copies (op0, mode) ! 3669: == GET_MODE_BITSIZE (mode))) ! 3670: { ! 3671: op0 = expand_compound_operation (op0); ! 3672: x = gen_unary (NEG, mode, gen_lowpart_for_combine (mode, op0)); ! 3673: goto restart; ! 3674: } ! 3675: ! 3676: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT ! 3677: && op1 == const0_rtx ! 3678: && nonzero_bits (op0, mode) == 1) ! 3679: { ! 3680: op0 = expand_compound_operation (op0); ! 3681: x = gen_binary (XOR, mode, ! 3682: gen_lowpart_for_combine (mode, op0), ! 3683: const1_rtx); ! 3684: goto restart; ! 3685: } ! 3686: ! 3687: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT ! 3688: && op1 == const0_rtx ! 3689: && (num_sign_bit_copies (op0, mode) ! 3690: == GET_MODE_BITSIZE (mode))) ! 3691: { ! 3692: op0 = expand_compound_operation (op0); ! 3693: x = plus_constant (gen_lowpart_for_combine (mode, op0), 1); ! 3694: goto restart; ! 3695: } ! 3696: #endif ! 3697: ! 3698: #if STORE_FLAG_VALUE == -1 ! 3699: /* If STORE_FLAG_VALUE is -1, we have cases similar to ! 3700: those above. */ ! 3701: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT ! 3702: && op1 == const0_rtx ! 3703: && (num_sign_bit_copies (op0, mode) ! 3704: == GET_MODE_BITSIZE (mode))) ! 3705: return gen_lowpart_for_combine (mode, ! 3706: expand_compound_operation (op0)); ! 3707: ! 3708: else if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT ! 3709: && op1 == const0_rtx ! 3710: && nonzero_bits (op0, mode) == 1) ! 3711: { ! 3712: op0 = expand_compound_operation (op0); ! 3713: x = gen_unary (NEG, mode, gen_lowpart_for_combine (mode, op0)); ! 3714: goto restart; ! 3715: } ! 3716: ! 3717: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT ! 3718: && op1 == const0_rtx ! 3719: && (num_sign_bit_copies (op0, mode) ! 3720: == GET_MODE_BITSIZE (mode))) ! 3721: { ! 3722: op0 = expand_compound_operation (op0); ! 3723: x = gen_unary (NOT, mode, gen_lowpart_for_combine (mode, op0)); ! 3724: goto restart; ! 3725: } ! 3726: ! 3727: /* If X is 0/1, (eq X 0) is X-1. */ ! 3728: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT ! 3729: && op1 == const0_rtx ! 3730: && nonzero_bits (op0, mode) == 1) ! 3731: { ! 3732: op0 = expand_compound_operation (op0); ! 3733: x = plus_constant (gen_lowpart_for_combine (mode, op0), -1); ! 3734: goto restart; ! 3735: } ! 3736: #endif ! 3737: ! 3738: /* If STORE_FLAG_VALUE says to just test the sign bit and X has just ! 3739: one bit that might be nonzero, we can convert (ne x 0) to ! 3740: (ashift x c) where C puts the bit in the sign bit. Remove any ! 3741: AND with STORE_FLAG_VALUE when we are done, since we are only ! 3742: going to test the sign bit. */ ! 3743: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT ! 3744: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 3745: && (STORE_FLAG_VALUE ! 3746: == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)) ! 3747: && op1 == const0_rtx ! 3748: && mode == GET_MODE (op0) ! 3749: && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0) ! 3750: { ! 3751: x = simplify_shift_const (NULL_RTX, ASHIFT, mode, ! 3752: expand_compound_operation (op0), ! 3753: GET_MODE_BITSIZE (mode) - 1 - i); ! 3754: if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx) ! 3755: return XEXP (x, 0); ! 3756: else ! 3757: return x; ! 3758: } ! 3759: ! 3760: /* If the code changed, return a whole new comparison. */ ! 3761: if (new_code != code) ! 3762: return gen_rtx_combine (new_code, mode, op0, op1); ! 3763: ! 3764: /* Otherwise, keep this operation, but maybe change its operands. ! 3765: This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */ ! 3766: SUBST (XEXP (x, 0), op0); ! 3767: SUBST (XEXP (x, 1), op1); ! 3768: } ! 3769: break; ! 3770: ! 3771: case IF_THEN_ELSE: ! 3772: /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register ! 3773: used in it is being compared against certain values. Get the ! 3774: true and false comparisons and see if that says anything about the ! 3775: value of each arm. */ ! 3776: ! 3777: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3778: && reversible_comparison_p (XEXP (x, 0)) ! 3779: && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG) ! 3780: { ! 3781: HOST_WIDE_INT nzb; ! 3782: rtx from = XEXP (XEXP (x, 0), 0); ! 3783: enum rtx_code true_code = GET_CODE (XEXP (x, 0)); ! 3784: enum rtx_code false_code = reverse_condition (true_code); ! 3785: rtx true_val = XEXP (XEXP (x, 0), 1); ! 3786: rtx false_val = true_val; ! 3787: rtx true_arm = XEXP (x, 1); ! 3788: rtx false_arm = XEXP (x, 2); ! 3789: int swapped = 0; ! 3790: ! 3791: /* If FALSE_CODE is EQ, swap the codes and arms. */ ! 3792: ! 3793: if (false_code == EQ) ! 3794: { ! 3795: swapped = 1, true_code = EQ, false_code = NE; ! 3796: true_arm = XEXP (x, 2), false_arm = XEXP (x, 1); ! 3797: } ! 3798: ! 3799: /* If we are comparing against zero and the expression being tested ! 3800: has only a single bit that might be nonzero, that is its value ! 3801: when it is not equal to zero. Similarly if it is known to be ! 3802: -1 or 0. */ ! 3803: ! 3804: if (true_code == EQ && true_val == const0_rtx ! 3805: && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0) ! 3806: false_code = EQ, false_val = GEN_INT (nzb); ! 3807: else if (true_code == EQ && true_val == const0_rtx ! 3808: && (num_sign_bit_copies (from, GET_MODE (from)) ! 3809: == GET_MODE_BITSIZE (GET_MODE (from)))) ! 3810: false_code = EQ, false_val = constm1_rtx; ! 3811: ! 3812: /* Now simplify an arm if we know the value of the register ! 3813: in the branch and it is used in the arm. Be carefull due to ! 3814: the potential of locally-shared RTL. */ ! 3815: ! 3816: if (reg_mentioned_p (from, true_arm)) ! 3817: true_arm = subst (known_cond (copy_rtx (true_arm), true_code, ! 3818: from, true_val), ! 3819: pc_rtx, pc_rtx, 0, 0); ! 3820: if (reg_mentioned_p (from, false_arm)) ! 3821: false_arm = subst (known_cond (copy_rtx (false_arm), false_code, ! 3822: from, false_val), ! 3823: pc_rtx, pc_rtx, 0, 0); ! 3824: ! 3825: SUBST (XEXP (x, 1), swapped ? false_arm : true_arm); ! 3826: SUBST (XEXP (x, 2), swapped ? true_arm : false_arm); ! 3827: } ! 3828: ! 3829: /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be ! 3830: reversed, do so to avoid needing two sets of patterns for ! 3831: subtract-and-branch insns. Similarly if we have a constant in that ! 3832: position or if the third operand is the same as the first operand ! 3833: of the comparison. */ ! 3834: ! 3835: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3836: && reversible_comparison_p (XEXP (x, 0)) ! 3837: && (XEXP (x, 1) == pc_rtx || GET_CODE (XEXP (x, 1)) == CONST_INT ! 3838: || rtx_equal_p (XEXP (x, 2), XEXP (XEXP (x, 0), 0)))) ! 3839: { ! 3840: SUBST (XEXP (x, 0), ! 3841: gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))), ! 3842: GET_MODE (XEXP (x, 0)), ! 3843: XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 0), 1))); ! 3844: ! 3845: temp = XEXP (x, 1); ! 3846: SUBST (XEXP (x, 1), XEXP (x, 2)); ! 3847: SUBST (XEXP (x, 2), temp); ! 3848: } ! 3849: ! 3850: /* If the two arms are identical, we don't need the comparison. */ ! 3851: ! 3852: if (rtx_equal_p (XEXP (x, 1), XEXP (x, 2)) ! 3853: && ! side_effects_p (XEXP (x, 0))) ! 3854: return XEXP (x, 1); ! 3855: ! 3856: /* Look for cases where we have (abs x) or (neg (abs X)). */ ! 3857: ! 3858: if (GET_MODE_CLASS (mode) == MODE_INT ! 3859: && GET_CODE (XEXP (x, 2)) == NEG ! 3860: && rtx_equal_p (XEXP (x, 1), XEXP (XEXP (x, 2), 0)) ! 3861: && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3862: && rtx_equal_p (XEXP (x, 1), XEXP (XEXP (x, 0), 0)) ! 3863: && ! side_effects_p (XEXP (x, 1))) ! 3864: switch (GET_CODE (XEXP (x, 0))) ! 3865: { ! 3866: case GT: ! 3867: case GE: ! 3868: x = gen_unary (ABS, mode, XEXP (x, 1)); ! 3869: goto restart; ! 3870: case LT: ! 3871: case LE: ! 3872: x = gen_unary (NEG, mode, gen_unary (ABS, mode, XEXP (x, 1))); ! 3873: goto restart; ! 3874: } ! 3875: ! 3876: /* Look for MIN or MAX. */ ! 3877: ! 3878: if (! FLOAT_MODE_P (mode) ! 3879: && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 3880: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)) ! 3881: && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 2)) ! 3882: && ! side_effects_p (XEXP (x, 0))) ! 3883: switch (GET_CODE (XEXP (x, 0))) ! 3884: { ! 3885: case GE: ! 3886: case GT: ! 3887: x = gen_binary (SMAX, mode, XEXP (x, 1), XEXP (x, 2)); ! 3888: goto restart; ! 3889: case LE: ! 3890: case LT: ! 3891: x = gen_binary (SMIN, mode, XEXP (x, 1), XEXP (x, 2)); ! 3892: goto restart; ! 3893: case GEU: ! 3894: case GTU: ! 3895: x = gen_binary (UMAX, mode, XEXP (x, 1), XEXP (x, 2)); ! 3896: goto restart; ! 3897: case LEU: ! 3898: case LTU: ! 3899: x = gen_binary (UMIN, mode, XEXP (x, 1), XEXP (x, 2)); ! 3900: goto restart; ! 3901: } ! 3902: ! 3903: #if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1 ! 3904: ! 3905: /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when ! 3906: its second operand is zero, this can be done as (OP Z (mult COND C2)) ! 3907: where C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ! 3908: ZERO_EXTEND or SIGN_EXTEND as long as Z is already extended (so ! 3909: we don't destroy it). We can do this kind of thing in some ! 3910: cases when STORE_FLAG_VALUE is neither of the above, but it isn't ! 3911: worth checking for. */ ! 3912: ! 3913: if (mode != VOIDmode && ! side_effects_p (x)) ! 3914: { ! 3915: rtx t = make_compound_operation (XEXP (x, 1), SET); ! 3916: rtx f = make_compound_operation (XEXP (x, 2), SET); ! 3917: rtx cond_op0 = XEXP (XEXP (x, 0), 0); ! 3918: rtx cond_op1 = XEXP (XEXP (x, 0), 1); ! 3919: enum rtx_code cond_op = GET_CODE (XEXP (x, 0)); ! 3920: enum rtx_code op, extend_op = NIL; ! 3921: enum machine_mode m = mode; ! 3922: rtx z = 0, c1, c2; ! 3923: ! 3924: if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS ! 3925: || GET_CODE (t) == IOR || GET_CODE (t) == XOR ! 3926: || GET_CODE (t) == ASHIFT ! 3927: || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT) ! 3928: && rtx_equal_p (XEXP (t, 0), f)) ! 3929: c1 = XEXP (t, 1), op = GET_CODE (t), z = f; ! 3930: else if (GET_CODE (t) == SIGN_EXTEND ! 3931: && (GET_CODE (XEXP (t, 0)) == PLUS ! 3932: || GET_CODE (XEXP (t, 0)) == MINUS ! 3933: || GET_CODE (XEXP (t, 0)) == IOR ! 3934: || GET_CODE (XEXP (t, 0)) == XOR ! 3935: || GET_CODE (XEXP (t, 0)) == ASHIFT ! 3936: || GET_CODE (XEXP (t, 0)) == LSHIFTRT ! 3937: || GET_CODE (XEXP (t, 0)) == ASHIFTRT) ! 3938: && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG ! 3939: && subreg_lowpart_p (XEXP (XEXP (t, 0), 0)) ! 3940: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f) ! 3941: && (num_sign_bit_copies (f, GET_MODE (f)) ! 3942: > (GET_MODE_BITSIZE (mode) ! 3943: - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0)))))) ! 3944: { ! 3945: c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0)); ! 3946: extend_op = SIGN_EXTEND; ! 3947: m = GET_MODE (XEXP (t, 0)); ! 3948: } ! 3949: else if (GET_CODE (t) == ZERO_EXTEND ! 3950: && (GET_CODE (XEXP (t, 0)) == PLUS ! 3951: || GET_CODE (XEXP (t, 0)) == MINUS ! 3952: || GET_CODE (XEXP (t, 0)) == IOR ! 3953: || GET_CODE (XEXP (t, 0)) == XOR ! 3954: || GET_CODE (XEXP (t, 0)) == ASHIFT ! 3955: || GET_CODE (XEXP (t, 0)) == LSHIFTRT ! 3956: || GET_CODE (XEXP (t, 0)) == ASHIFTRT) ! 3957: && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG ! 3958: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 3959: && subreg_lowpart_p (XEXP (XEXP (t, 0), 0)) ! 3960: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f) ! 3961: && ((nonzero_bits (f, GET_MODE (f)) ! 3962: & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0)))) ! 3963: == 0)) ! 3964: { ! 3965: c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0)); ! 3966: extend_op = ZERO_EXTEND; ! 3967: m = GET_MODE (XEXP (t, 0)); ! 3968: } ! 3969: ! 3970: if (reversible_comparison_p (XEXP (x, 0)) ! 3971: && (GET_CODE (f) == PLUS || GET_CODE (f) == MINUS ! 3972: || GET_CODE (f) == IOR || GET_CODE (f) == XOR ! 3973: || GET_CODE (f) == ASHIFT ! 3974: || GET_CODE (f) == LSHIFTRT || GET_CODE (f) == ASHIFTRT) ! 3975: && rtx_equal_p (XEXP (f, 0), t)) ! 3976: { ! 3977: c1 = XEXP (f, 1), op = GET_CODE (f), z = t; ! 3978: cond_op = reverse_condition (cond_op); ! 3979: } ! 3980: else if (GET_CODE (f) == SIGN_EXTEND ! 3981: && (GET_CODE (XEXP (f, 0)) == PLUS ! 3982: || GET_CODE (XEXP (f, 0)) == MINUS ! 3983: || GET_CODE (XEXP (f, 0)) == IOR ! 3984: || GET_CODE (XEXP (f, 0)) == XOR ! 3985: || GET_CODE (XEXP (f, 0)) == ASHIFT ! 3986: || GET_CODE (XEXP (f, 0)) == LSHIFTRT ! 3987: || GET_CODE (XEXP (f, 0)) == ASHIFTRT) ! 3988: && GET_CODE (XEXP (XEXP (f, 0), 0)) == SUBREG ! 3989: && subreg_lowpart_p (XEXP (XEXP (f, 0), 0)) ! 3990: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (f, 0), 0)), f) ! 3991: && (num_sign_bit_copies (t, GET_MODE (t)) ! 3992: > (GET_MODE_BITSIZE (mode) ! 3993: - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (f, 0), 0)))))) ! 3994: { ! 3995: c1 = XEXP (XEXP (f, 0), 1); z = t; op = GET_CODE (XEXP (f, 0)); ! 3996: extend_op = SIGN_EXTEND; ! 3997: m = GET_MODE (XEXP (f, 0)); ! 3998: cond_op = reverse_condition (cond_op); ! 3999: } ! 4000: else if (GET_CODE (f) == ZERO_EXTEND ! 4001: && (GET_CODE (XEXP (f, 0)) == PLUS ! 4002: || GET_CODE (XEXP (f, 0)) == MINUS ! 4003: || GET_CODE (XEXP (f, 0)) == IOR ! 4004: || GET_CODE (XEXP (f, 0)) == XOR ! 4005: || GET_CODE (XEXP (f, 0)) == ASHIFT ! 4006: || GET_CODE (XEXP (f, 0)) == LSHIFTRT ! 4007: || GET_CODE (XEXP (f, 0)) == ASHIFTRT) ! 4008: && GET_CODE (XEXP (XEXP (f, 0), 0)) == SUBREG ! 4009: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 4010: && subreg_lowpart_p (XEXP (XEXP (f, 0), 0)) ! 4011: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (f, 0), 0)), t) ! 4012: && ((nonzero_bits (t, GET_MODE (t)) ! 4013: & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (f, 0), 0)))) ! 4014: == 0)) ! 4015: { ! 4016: c1 = XEXP (XEXP (f, 0), 1); z = t; op = GET_CODE (XEXP (f, 0)); ! 4017: extend_op = ZERO_EXTEND; ! 4018: m = GET_MODE (XEXP (f, 0)); ! 4019: cond_op = reverse_condition (cond_op); ! 4020: } ! 4021: ! 4022: if (z) ! 4023: { ! 4024: temp = subst (gen_binary (cond_op, m, cond_op0, cond_op1), ! 4025: pc_rtx, pc_rtx, 0, 0); ! 4026: ! 4027: ! 4028: temp = gen_binary (MULT, m, temp, ! 4029: gen_binary (MULT, m, c1, ! 4030: GEN_INT (STORE_FLAG_VALUE))); ! 4031: ! 4032: temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp); ! 4033: ! 4034: if (extend_op != NIL) ! 4035: temp = gen_unary (extend_op, mode, temp); ! 4036: ! 4037: return temp; ! 4038: } ! 4039: } ! 4040: #endif ! 4041: ! 4042: /* If we have (if_then_else (ne A 0) C1 0) and either A is known to ! 4043: be 0 or 1 and C1 is a single bit or A is known to be 0 or -1 and ! 4044: C1 is the negation of a single bit, we can convert this operation ! 4045: to a shift. We can actually do this in more general cases, but it ! 4046: doesn't seem worth it. */ ! 4047: ! 4048: if (GET_CODE (XEXP (x, 0)) == NE && XEXP (XEXP (x, 0), 1) == const0_rtx ! 4049: && XEXP (x, 2) == const0_rtx && GET_CODE (XEXP (x, 1)) == CONST_INT ! 4050: && ((1 == nonzero_bits (XEXP (XEXP (x, 0), 0), mode) ! 4051: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0) ! 4052: || ((num_sign_bit_copies (XEXP (XEXP (x, 0), 0), mode) ! 4053: == GET_MODE_BITSIZE (mode)) ! 4054: && (i = exact_log2 (- INTVAL (XEXP (x, 1)))) >= 0))) ! 4055: return ! 4056: simplify_shift_const (NULL_RTX, ASHIFT, mode, ! 4057: gen_lowpart_for_combine (mode, ! 4058: XEXP (XEXP (x, 0), 0)), ! 4059: i); ! 4060: break; ! 4061: ! 4062: case ZERO_EXTRACT: ! 4063: case SIGN_EXTRACT: ! 4064: case ZERO_EXTEND: ! 4065: case SIGN_EXTEND: ! 4066: /* If we are processing SET_DEST, we are done. */ ! 4067: if (in_dest) ! 4068: return x; ! 4069: ! 4070: x = expand_compound_operation (x); ! 4071: if (GET_CODE (x) != code) ! 4072: goto restart; ! 4073: break; ! 4074: ! 4075: case SET: ! 4076: /* (set (pc) (return)) gets written as (return). */ ! 4077: if (GET_CODE (SET_DEST (x)) == PC && GET_CODE (SET_SRC (x)) == RETURN) ! 4078: return SET_SRC (x); ! 4079: ! 4080: /* Convert this into a field assignment operation, if possible. */ ! 4081: x = make_field_assignment (x); ! 4082: ! 4083: /* If we are setting CC0 or if the source is a COMPARE, look for the ! 4084: use of the comparison result and try to simplify it unless we already ! 4085: have used undobuf.other_insn. */ ! 4086: if ((GET_CODE (SET_SRC (x)) == COMPARE ! 4087: #ifdef HAVE_cc0 ! 4088: || SET_DEST (x) == cc0_rtx ! 4089: #endif ! 4090: ) ! 4091: && (cc_use = find_single_use (SET_DEST (x), subst_insn, ! 4092: &other_insn)) != 0 ! 4093: && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn) ! 4094: && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<' ! 4095: && XEXP (*cc_use, 0) == SET_DEST (x)) ! 4096: { ! 4097: enum rtx_code old_code = GET_CODE (*cc_use); ! 4098: enum rtx_code new_code; ! 4099: rtx op0, op1; ! 4100: int other_changed = 0; ! 4101: enum machine_mode compare_mode = GET_MODE (SET_DEST (x)); ! 4102: ! 4103: if (GET_CODE (SET_SRC (x)) == COMPARE) ! 4104: op0 = XEXP (SET_SRC (x), 0), op1 = XEXP (SET_SRC (x), 1); ! 4105: else ! 4106: op0 = SET_SRC (x), op1 = const0_rtx; ! 4107: ! 4108: /* Simplify our comparison, if possible. */ ! 4109: new_code = simplify_comparison (old_code, &op0, &op1); ! 4110: ! 4111: #ifdef EXTRA_CC_MODES ! 4112: /* If this machine has CC modes other than CCmode, check to see ! 4113: if we need to use a different CC mode here. */ ! 4114: compare_mode = SELECT_CC_MODE (new_code, op0, op1); ! 4115: #endif /* EXTRA_CC_MODES */ ! 4116: ! 4117: #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES) ! 4118: /* If the mode changed, we have to change SET_DEST, the mode ! 4119: in the compare, and the mode in the place SET_DEST is used. ! 4120: If SET_DEST is a hard register, just build new versions with ! 4121: the proper mode. If it is a pseudo, we lose unless it is only ! 4122: time we set the pseudo, in which case we can safely change ! 4123: its mode. */ ! 4124: if (compare_mode != GET_MODE (SET_DEST (x))) ! 4125: { ! 4126: int regno = REGNO (SET_DEST (x)); ! 4127: rtx new_dest = gen_rtx (REG, compare_mode, regno); ! 4128: ! 4129: if (regno < FIRST_PSEUDO_REGISTER ! 4130: || (reg_n_sets[regno] == 1 ! 4131: && ! REG_USERVAR_P (SET_DEST (x)))) ! 4132: { ! 4133: if (regno >= FIRST_PSEUDO_REGISTER) ! 4134: SUBST (regno_reg_rtx[regno], new_dest); ! 4135: ! 4136: SUBST (SET_DEST (x), new_dest); ! 4137: SUBST (XEXP (*cc_use, 0), new_dest); ! 4138: other_changed = 1; ! 4139: } ! 4140: } ! 4141: #endif ! 4142: ! 4143: /* If the code changed, we have to build a new comparison ! 4144: in undobuf.other_insn. */ ! 4145: if (new_code != old_code) ! 4146: { ! 4147: unsigned HOST_WIDE_INT mask; ! 4148: ! 4149: SUBST (*cc_use, gen_rtx_combine (new_code, GET_MODE (*cc_use), ! 4150: SET_DEST (x), const0_rtx)); ! 4151: ! 4152: /* If the only change we made was to change an EQ into an ! 4153: NE or vice versa, OP0 has only one bit that might be nonzero, ! 4154: and OP1 is zero, check if changing the user of the condition ! 4155: code will produce a valid insn. If it won't, we can keep ! 4156: the original code in that insn by surrounding our operation ! 4157: with an XOR. */ ! 4158: ! 4159: if (((old_code == NE && new_code == EQ) ! 4160: || (old_code == EQ && new_code == NE)) ! 4161: && ! other_changed && op1 == const0_rtx ! 4162: && (GET_MODE_BITSIZE (GET_MODE (op0)) ! 4163: <= HOST_BITS_PER_WIDE_INT) ! 4164: && (exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) ! 4165: >= 0)) ! 4166: { ! 4167: rtx pat = PATTERN (other_insn), note = 0; ! 4168: ! 4169: if ((recog_for_combine (&pat, other_insn, ¬e) < 0 ! 4170: && ! check_asm_operands (pat))) ! 4171: { ! 4172: PUT_CODE (*cc_use, old_code); ! 4173: other_insn = 0; ! 4174: ! 4175: op0 = gen_binary (XOR, GET_MODE (op0), op0, ! 4176: GEN_INT (mask)); ! 4177: } ! 4178: } ! 4179: ! 4180: other_changed = 1; ! 4181: } ! 4182: ! 4183: if (other_changed) ! 4184: undobuf.other_insn = other_insn; ! 4185: ! 4186: #ifdef HAVE_cc0 ! 4187: /* If we are now comparing against zero, change our source if ! 4188: needed. If we do not use cc0, we always have a COMPARE. */ ! 4189: if (op1 == const0_rtx && SET_DEST (x) == cc0_rtx) ! 4190: SUBST (SET_SRC (x), op0); ! 4191: else ! 4192: #endif ! 4193: ! 4194: /* Otherwise, if we didn't previously have a COMPARE in the ! 4195: correct mode, we need one. */ ! 4196: if (GET_CODE (SET_SRC (x)) != COMPARE ! 4197: || GET_MODE (SET_SRC (x)) != compare_mode) ! 4198: SUBST (SET_SRC (x), gen_rtx_combine (COMPARE, compare_mode, ! 4199: op0, op1)); ! 4200: else ! 4201: { ! 4202: /* Otherwise, update the COMPARE if needed. */ ! 4203: SUBST (XEXP (SET_SRC (x), 0), op0); ! 4204: SUBST (XEXP (SET_SRC (x), 1), op1); ! 4205: } ! 4206: } ! 4207: else ! 4208: { ! 4209: /* Get SET_SRC in a form where we have placed back any ! 4210: compound expressions. Then do the checks below. */ ! 4211: temp = make_compound_operation (SET_SRC (x), SET); ! 4212: SUBST (SET_SRC (x), temp); ! 4213: } ! 4214: ! 4215: /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some ! 4216: operation, and X being a REG or (subreg (reg)), we may be able to ! 4217: convert this to (set (subreg:m2 x) (op)). ! 4218: ! 4219: We can always do this if M1 is narrower than M2 because that ! 4220: means that we only care about the low bits of the result. ! 4221: ! 4222: However, on machines without WORD_REGISTER_OPERATIONS defined, ! 4223: we cannot perform a narrower operation that requested since the ! 4224: high-order bits will be undefined. On machine where it is defined, ! 4225: this transformation is safe as long as M1 and M2 have the same ! 4226: number of words. */ ! 4227: ! 4228: if (GET_CODE (SET_SRC (x)) == SUBREG ! 4229: && subreg_lowpart_p (SET_SRC (x)) ! 4230: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) != 'o' ! 4231: && (((GET_MODE_SIZE (GET_MODE (SET_SRC (x))) + (UNITS_PER_WORD - 1)) ! 4232: / UNITS_PER_WORD) ! 4233: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x)))) ! 4234: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)) ! 4235: #ifndef WORD_REGISTER_OPERATIONS ! 4236: && (GET_MODE_SIZE (GET_MODE (SET_SRC (x))) ! 4237: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x))))) ! 4238: #endif ! 4239: && (GET_CODE (SET_DEST (x)) == REG ! 4240: || (GET_CODE (SET_DEST (x)) == SUBREG ! 4241: && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG))) ! 4242: { ! 4243: SUBST (SET_DEST (x), ! 4244: gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_SRC (x))), ! 4245: SET_DEST (x))); ! 4246: SUBST (SET_SRC (x), SUBREG_REG (SET_SRC (x))); ! 4247: } ! 4248: ! 4249: #ifdef LOAD_EXTEND_OP ! 4250: /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with ! 4251: M wider than N, this would require a paradoxical subreg. ! 4252: Replace the subreg with a zero_extend to avoid the reload that ! 4253: would otherwise be required. */ ! 4254: ! 4255: if (GET_CODE (SET_SRC (x)) == SUBREG ! 4256: && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (SET_SRC (x)))) != NIL ! 4257: && subreg_lowpart_p (SET_SRC (x)) ! 4258: && SUBREG_WORD (SET_SRC (x)) == 0 ! 4259: && (GET_MODE_SIZE (GET_MODE (SET_SRC (x))) ! 4260: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_SRC (x))))) ! 4261: && GET_CODE (SUBREG_REG (SET_SRC (x))) == MEM) ! 4262: SUBST (SET_SRC (x), ! 4263: gen_rtx_combine (LOAD_EXTEND_OP (GET_MODE ! 4264: (SUBREG_REG (SET_SRC (x)))), ! 4265: GET_MODE (SET_SRC (x)), ! 4266: XEXP (SET_SRC (x), 0))); ! 4267: #endif ! 4268: ! 4269: #ifndef HAVE_conditional_move ! 4270: ! 4271: /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, ! 4272: and we are comparing an item known to be 0 or -1 against 0, use a ! 4273: logical operation instead. Check for one of the arms being an IOR ! 4274: of the other arm with some value. We compute three terms to be ! 4275: IOR'ed together. In practice, at most two will be nonzero. Then ! 4276: we do the IOR's. */ ! 4277: ! 4278: if (GET_CODE (SET_DEST (x)) != PC ! 4279: && GET_CODE (SET_SRC (x)) == IF_THEN_ELSE ! 4280: && (GET_CODE (XEXP (SET_SRC (x), 0)) == EQ ! 4281: || GET_CODE (XEXP (SET_SRC (x), 0)) == NE) ! 4282: && XEXP (XEXP (SET_SRC (x), 0), 1) == const0_rtx ! 4283: && (num_sign_bit_copies (XEXP (XEXP (SET_SRC (x), 0), 0), ! 4284: GET_MODE (XEXP (XEXP (SET_SRC (x), 0), 0))) ! 4285: == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (SET_SRC (x), 0), 0)))) ! 4286: && ! side_effects_p (SET_SRC (x))) ! 4287: { ! 4288: rtx true = (GET_CODE (XEXP (SET_SRC (x), 0)) == NE ! 4289: ? XEXP (SET_SRC (x), 1) : XEXP (SET_SRC (x), 2)); ! 4290: rtx false = (GET_CODE (XEXP (SET_SRC (x), 0)) == NE ! 4291: ? XEXP (SET_SRC (x), 2) : XEXP (SET_SRC (x), 1)); ! 4292: rtx term1 = const0_rtx, term2, term3; ! 4293: ! 4294: if (GET_CODE (true) == IOR && rtx_equal_p (XEXP (true, 0), false)) ! 4295: term1 = false, true = XEXP (true, 1), false = const0_rtx; ! 4296: else if (GET_CODE (true) == IOR ! 4297: && rtx_equal_p (XEXP (true, 1), false)) ! 4298: term1 = false, true = XEXP (true, 0), false = const0_rtx; ! 4299: else if (GET_CODE (false) == IOR ! 4300: && rtx_equal_p (XEXP (false, 0), true)) ! 4301: term1 = true, false = XEXP (false, 1), true = const0_rtx; ! 4302: else if (GET_CODE (false) == IOR ! 4303: && rtx_equal_p (XEXP (false, 1), true)) ! 4304: term1 = true, false = XEXP (false, 0), true = const0_rtx; ! 4305: ! 4306: term2 = gen_binary (AND, GET_MODE (SET_SRC (x)), ! 4307: XEXP (XEXP (SET_SRC (x), 0), 0), true); ! 4308: term3 = gen_binary (AND, GET_MODE (SET_SRC (x)), ! 4309: gen_unary (NOT, GET_MODE (SET_SRC (x)), ! 4310: XEXP (XEXP (SET_SRC (x), 0), 0)), ! 4311: false); ! 4312: ! 4313: SUBST (SET_SRC (x), ! 4314: gen_binary (IOR, GET_MODE (SET_SRC (x)), ! 4315: gen_binary (IOR, GET_MODE (SET_SRC (x)), ! 4316: term1, term2), ! 4317: term3)); ! 4318: } ! 4319: #endif ! 4320: break; ! 4321: ! 4322: case AND: ! 4323: if (GET_CODE (XEXP (x, 1)) == CONST_INT) ! 4324: { ! 4325: x = simplify_and_const_int (x, mode, XEXP (x, 0), ! 4326: INTVAL (XEXP (x, 1))); ! 4327: ! 4328: /* If we have (ior (and (X C1) C2)) and the next restart would be ! 4329: the last, simplify this by making C1 as small as possible ! 4330: and then exit. */ ! 4331: if (n_restarts >= 3 && GET_CODE (x) == IOR ! 4332: && GET_CODE (XEXP (x, 0)) == AND ! 4333: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 4334: && GET_CODE (XEXP (x, 1)) == CONST_INT) ! 4335: { ! 4336: temp = gen_binary (AND, mode, XEXP (XEXP (x, 0), 0), ! 4337: GEN_INT (INTVAL (XEXP (XEXP (x, 0), 1)) ! 4338: & ~ INTVAL (XEXP (x, 1)))); ! 4339: return gen_binary (IOR, mode, temp, XEXP (x, 1)); ! 4340: } ! 4341: ! 4342: if (GET_CODE (x) != AND) ! 4343: goto restart; ! 4344: } ! 4345: ! 4346: /* Convert (A | B) & A to A. */ ! 4347: if (GET_CODE (XEXP (x, 0)) == IOR ! 4348: && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)) ! 4349: || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))) ! 4350: && ! side_effects_p (XEXP (XEXP (x, 0), 0)) ! 4351: && ! side_effects_p (XEXP (XEXP (x, 0), 1))) ! 4352: return XEXP (x, 1); ! 4353: ! 4354: /* Convert (A ^ B) & A to A & (~ B) since the latter is often a single ! 4355: insn (and may simplify more). */ ! 4356: else if (GET_CODE (XEXP (x, 0)) == XOR ! 4357: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)) ! 4358: && ! side_effects_p (XEXP (x, 1))) ! 4359: { ! 4360: x = gen_binary (AND, mode, ! 4361: gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)), ! 4362: XEXP (x, 1)); ! 4363: goto restart; ! 4364: } ! 4365: else if (GET_CODE (XEXP (x, 0)) == XOR ! 4366: && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)) ! 4367: && ! side_effects_p (XEXP (x, 1))) ! 4368: { ! 4369: x = gen_binary (AND, mode, ! 4370: gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)), ! 4371: XEXP (x, 1)); ! 4372: goto restart; ! 4373: } ! 4374: ! 4375: /* Similarly for (~ (A ^ B)) & A. */ ! 4376: else if (GET_CODE (XEXP (x, 0)) == NOT ! 4377: && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR ! 4378: && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 0), XEXP (x, 1)) ! 4379: && ! side_effects_p (XEXP (x, 1))) ! 4380: { ! 4381: x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 1), ! 4382: XEXP (x, 1)); ! 4383: goto restart; ! 4384: } ! 4385: else if (GET_CODE (XEXP (x, 0)) == NOT ! 4386: && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR ! 4387: && rtx_equal_p (XEXP (XEXP (XEXP (x, 0), 0), 1), XEXP (x, 1)) ! 4388: && ! side_effects_p (XEXP (x, 1))) ! 4389: { ! 4390: x = gen_binary (AND, mode, XEXP (XEXP (XEXP (x, 0), 0), 0), ! 4391: XEXP (x, 1)); ! 4392: goto restart; ! 4393: } ! 4394: ! 4395: /* If we have (and A B) with A not an object but that is known to ! 4396: be -1 or 0, this is equivalent to the expression ! 4397: (if_then_else (ne A (const_int 0)) B (const_int 0)) ! 4398: We make this conversion because it may allow further ! 4399: simplifications and then allow use of conditional move insns. ! 4400: If the machine doesn't have condition moves, code in case SET ! 4401: will convert the IF_THEN_ELSE back to the logical operation. ! 4402: We build the IF_THEN_ELSE here in case further simplification ! 4403: is possible (e.g., we can convert it to ABS). */ ! 4404: ! 4405: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o' ! 4406: && ! (GET_CODE (XEXP (x, 0)) == SUBREG ! 4407: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o') ! 4408: && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))) ! 4409: == GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))))) ! 4410: { ! 4411: rtx op0 = XEXP (x, 0); ! 4412: rtx op1 = const0_rtx; ! 4413: enum rtx_code comp_code ! 4414: = simplify_comparison (NE, &op0, &op1); ! 4415: ! 4416: x = gen_rtx_combine (IF_THEN_ELSE, mode, ! 4417: gen_binary (comp_code, VOIDmode, op0, op1), ! 4418: XEXP (x, 1), const0_rtx); ! 4419: goto restart; ! 4420: } ! 4421: ! 4422: /* In the following group of tests (and those in case IOR below), ! 4423: we start with some combination of logical operations and apply ! 4424: the distributive law followed by the inverse distributive law. ! 4425: Most of the time, this results in no change. However, if some of ! 4426: the operands are the same or inverses of each other, simplifications ! 4427: will result. ! 4428: ! 4429: For example, (and (ior A B) (not B)) can occur as the result of ! 4430: expanding a bit field assignment. When we apply the distributive ! 4431: law to this, we get (ior (and (A (not B))) (and (B (not B)))), ! 4432: which then simplifies to (and (A (not B))). */ ! 4433: ! 4434: /* If we have (and (ior A B) C), apply the distributive law and then ! 4435: the inverse distributive law to see if things simplify. */ ! 4436: ! 4437: if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == XOR) ! 4438: { ! 4439: x = apply_distributive_law ! 4440: (gen_binary (GET_CODE (XEXP (x, 0)), mode, ! 4441: gen_binary (AND, mode, ! 4442: XEXP (XEXP (x, 0), 0), XEXP (x, 1)), ! 4443: gen_binary (AND, mode, ! 4444: XEXP (XEXP (x, 0), 1), XEXP (x, 1)))); ! 4445: if (GET_CODE (x) != AND) ! 4446: goto restart; ! 4447: } ! 4448: ! 4449: if (GET_CODE (XEXP (x, 1)) == IOR || GET_CODE (XEXP (x, 1)) == XOR) ! 4450: { ! 4451: x = apply_distributive_law ! 4452: (gen_binary (GET_CODE (XEXP (x, 1)), mode, ! 4453: gen_binary (AND, mode, ! 4454: XEXP (XEXP (x, 1), 0), XEXP (x, 0)), ! 4455: gen_binary (AND, mode, ! 4456: XEXP (XEXP (x, 1), 1), XEXP (x, 0)))); ! 4457: if (GET_CODE (x) != AND) ! 4458: goto restart; ! 4459: } ! 4460: ! 4461: /* Similarly, taking advantage of the fact that ! 4462: (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */ ! 4463: ! 4464: if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == XOR) ! 4465: { ! 4466: x = apply_distributive_law ! 4467: (gen_binary (XOR, mode, ! 4468: gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0), ! 4469: XEXP (XEXP (x, 1), 0)), ! 4470: gen_binary (IOR, mode, XEXP (XEXP (x, 0), 0), ! 4471: XEXP (XEXP (x, 1), 1)))); ! 4472: if (GET_CODE (x) != AND) ! 4473: goto restart; ! 4474: } ! 4475: ! 4476: else if (GET_CODE (XEXP (x, 1)) == NOT && GET_CODE (XEXP (x, 0)) == XOR) ! 4477: { ! 4478: x = apply_distributive_law ! 4479: (gen_binary (XOR, mode, ! 4480: gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0), ! 4481: XEXP (XEXP (x, 0), 0)), ! 4482: gen_binary (IOR, mode, XEXP (XEXP (x, 1), 0), ! 4483: XEXP (XEXP (x, 0), 1)))); ! 4484: if (GET_CODE (x) != AND) ! 4485: goto restart; ! 4486: } ! 4487: break; ! 4488: ! 4489: case IOR: ! 4490: /* (ior A C) is C if all bits of A that might be nonzero are on in C. */ ! 4491: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 4492: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 4493: && (nonzero_bits (XEXP (x, 0), mode) & ~ INTVAL (XEXP (x, 1))) == 0) ! 4494: return XEXP (x, 1); ! 4495: ! 4496: /* Convert (A & B) | A to A. */ ! 4497: if (GET_CODE (XEXP (x, 0)) == AND ! 4498: && (rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)) ! 4499: || rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1))) ! 4500: && ! side_effects_p (XEXP (XEXP (x, 0), 0)) ! 4501: && ! side_effects_p (XEXP (XEXP (x, 0), 1))) ! 4502: return XEXP (x, 1); ! 4503: ! 4504: /* If we have (ior (and A B) C), apply the distributive law and then ! 4505: the inverse distributive law to see if things simplify. */ ! 4506: ! 4507: if (GET_CODE (XEXP (x, 0)) == AND) ! 4508: { ! 4509: x = apply_distributive_law ! 4510: (gen_binary (AND, mode, ! 4511: gen_binary (IOR, mode, ! 4512: XEXP (XEXP (x, 0), 0), XEXP (x, 1)), ! 4513: gen_binary (IOR, mode, ! 4514: XEXP (XEXP (x, 0), 1), XEXP (x, 1)))); ! 4515: ! 4516: if (GET_CODE (x) != IOR) ! 4517: goto restart; ! 4518: } ! 4519: ! 4520: if (GET_CODE (XEXP (x, 1)) == AND) ! 4521: { ! 4522: x = apply_distributive_law ! 4523: (gen_binary (AND, mode, ! 4524: gen_binary (IOR, mode, ! 4525: XEXP (XEXP (x, 1), 0), XEXP (x, 0)), ! 4526: gen_binary (IOR, mode, ! 4527: XEXP (XEXP (x, 1), 1), XEXP (x, 0)))); ! 4528: ! 4529: if (GET_CODE (x) != IOR) ! 4530: goto restart; ! 4531: } ! 4532: ! 4533: /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the ! 4534: mode size to (rotate A CX). */ ! 4535: ! 4536: if (((GET_CODE (XEXP (x, 0)) == ASHIFT ! 4537: && GET_CODE (XEXP (x, 1)) == LSHIFTRT) ! 4538: || (GET_CODE (XEXP (x, 1)) == ASHIFT ! 4539: && GET_CODE (XEXP (x, 0)) == LSHIFTRT)) ! 4540: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (XEXP (x, 1), 0)) ! 4541: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 4542: && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT ! 4543: && (INTVAL (XEXP (XEXP (x, 0), 1)) + INTVAL (XEXP (XEXP (x, 1), 1)) ! 4544: == GET_MODE_BITSIZE (mode))) ! 4545: { ! 4546: rtx shift_count; ! 4547: ! 4548: if (GET_CODE (XEXP (x, 0)) == ASHIFT) ! 4549: shift_count = XEXP (XEXP (x, 0), 1); ! 4550: else ! 4551: shift_count = XEXP (XEXP (x, 1), 1); ! 4552: x = gen_rtx (ROTATE, mode, XEXP (XEXP (x, 0), 0), shift_count); ! 4553: goto restart; ! 4554: } ! 4555: break; ! 4556: ! 4557: case XOR: ! 4558: /* Convert (XOR (NOT x) (NOT y)) to (XOR x y). ! 4559: Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for ! 4560: (NOT y). */ ! 4561: { ! 4562: int num_negated = 0; ! 4563: rtx in1 = XEXP (x, 0), in2 = XEXP (x, 1); ! 4564: ! 4565: if (GET_CODE (in1) == NOT) ! 4566: num_negated++, in1 = XEXP (in1, 0); ! 4567: if (GET_CODE (in2) == NOT) ! 4568: num_negated++, in2 = XEXP (in2, 0); ! 4569: ! 4570: if (num_negated == 2) ! 4571: { ! 4572: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ! 4573: SUBST (XEXP (x, 1), XEXP (XEXP (x, 1), 0)); ! 4574: } ! 4575: else if (num_negated == 1) ! 4576: { ! 4577: x = gen_unary (NOT, mode, ! 4578: gen_binary (XOR, mode, in1, in2)); ! 4579: goto restart; ! 4580: } ! 4581: } ! 4582: ! 4583: /* Convert (xor (and A B) B) to (and (not A) B). The latter may ! 4584: correspond to a machine insn or result in further simplifications ! 4585: if B is a constant. */ ! 4586: ! 4587: if (GET_CODE (XEXP (x, 0)) == AND ! 4588: && rtx_equal_p (XEXP (XEXP (x, 0), 1), XEXP (x, 1)) ! 4589: && ! side_effects_p (XEXP (x, 1))) ! 4590: { ! 4591: x = gen_binary (AND, mode, ! 4592: gen_unary (NOT, mode, XEXP (XEXP (x, 0), 0)), ! 4593: XEXP (x, 1)); ! 4594: goto restart; ! 4595: } ! 4596: else if (GET_CODE (XEXP (x, 0)) == AND ! 4597: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1)) ! 4598: && ! side_effects_p (XEXP (x, 1))) ! 4599: { ! 4600: x = gen_binary (AND, mode, ! 4601: gen_unary (NOT, mode, XEXP (XEXP (x, 0), 1)), ! 4602: XEXP (x, 1)); ! 4603: goto restart; ! 4604: } ! 4605: ! 4606: ! 4607: #if STORE_FLAG_VALUE == 1 ! 4608: /* (xor (comparison foo bar) (const_int 1)) can become the reversed ! 4609: comparison. */ ! 4610: if (XEXP (x, 1) == const1_rtx ! 4611: && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 4612: && reversible_comparison_p (XEXP (x, 0))) ! 4613: return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))), ! 4614: mode, XEXP (XEXP (x, 0), 0), ! 4615: XEXP (XEXP (x, 0), 1)); ! 4616: ! 4617: /* (lshiftrt foo C) where C is the number of bits in FOO minus 1 ! 4618: is (lt foo (const_int 0)), so we can perform the above ! 4619: simplification. */ ! 4620: ! 4621: if (XEXP (x, 1) == const1_rtx ! 4622: && GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 4623: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 4624: && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1) ! 4625: return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx); ! 4626: #endif ! 4627: ! 4628: /* (xor (comparison foo bar) (const_int sign-bit)) ! 4629: when STORE_FLAG_VALUE is the sign bit. */ ! 4630: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 4631: && (STORE_FLAG_VALUE ! 4632: == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)) ! 4633: && XEXP (x, 1) == const_true_rtx ! 4634: && GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' ! 4635: && reversible_comparison_p (XEXP (x, 0))) ! 4636: return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))), ! 4637: mode, XEXP (XEXP (x, 0), 0), ! 4638: XEXP (XEXP (x, 0), 1)); ! 4639: break; ! 4640: ! 4641: case ABS: ! 4642: /* (abs (neg <foo>)) -> (abs <foo>) */ ! 4643: if (GET_CODE (XEXP (x, 0)) == NEG) ! 4644: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ! 4645: ! 4646: /* If operand is something known to be positive, ignore the ABS. */ ! 4647: if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS ! 4648: || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) ! 4649: <= HOST_BITS_PER_WIDE_INT) ! 4650: && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0))) ! 4651: & ((HOST_WIDE_INT) 1 ! 4652: << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))) ! 4653: == 0))) ! 4654: return XEXP (x, 0); ! 4655: ! 4656: ! 4657: /* If operand is known to be only -1 or 0, convert ABS to NEG. */ ! 4658: if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode)) ! 4659: { ! 4660: x = gen_rtx_combine (NEG, mode, XEXP (x, 0)); ! 4661: goto restart; ! 4662: } ! 4663: break; ! 4664: ! 4665: case FFS: ! 4666: /* (ffs (*_extend <X>)) = (ffs <X>) */ ! 4667: if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND ! 4668: || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND) ! 4669: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ! 4670: break; ! 4671: ! 4672: case FLOAT: ! 4673: /* (float (sign_extend <X>)) = (float <X>). */ ! 4674: if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND) ! 4675: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); ! 4676: break; ! 4677: ! 4678: case LSHIFT: ! 4679: case ASHIFT: ! 4680: case LSHIFTRT: ! 4681: case ASHIFTRT: ! 4682: case ROTATE: ! 4683: case ROTATERT: ! 4684: /* If this is a shift by a constant amount, simplify it. */ ! 4685: if (GET_CODE (XEXP (x, 1)) == CONST_INT) ! 4686: { ! 4687: x = simplify_shift_const (x, code, mode, XEXP (x, 0), ! 4688: INTVAL (XEXP (x, 1))); ! 4689: if (GET_CODE (x) != code) ! 4690: goto restart; ! 4691: } ! 4692: ! 4693: #ifdef SHIFT_COUNT_TRUNCATED ! 4694: else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG) ! 4695: SUBST (XEXP (x, 1), ! 4696: force_to_mode (XEXP (x, 1), GET_MODE (x), ! 4697: ((HOST_WIDE_INT) 1 ! 4698: << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x)))) ! 4699: - 1, ! 4700: NULL_RTX, 0)); ! 4701: #endif ! 4702: ! 4703: break; ! 4704: } ! 4705: ! 4706: return x; ! 4707: } ! 4708: ! 4709: /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound ! 4710: operations" because they can be replaced with two more basic operations. ! 4711: ZERO_EXTEND is also considered "compound" because it can be replaced with ! 4712: an AND operation, which is simpler, though only one operation. ! 4713: ! 4714: The function expand_compound_operation is called with an rtx expression ! 4715: and will convert it to the appropriate shifts and AND operations, ! 4716: simplifying at each stage. ! 4717: ! 4718: The function make_compound_operation is called to convert an expression ! 4719: consisting of shifts and ANDs into the equivalent compound expression. ! 4720: It is the inverse of this function, loosely speaking. */ ! 4721: ! 4722: static rtx ! 4723: expand_compound_operation (x) ! 4724: rtx x; ! 4725: { ! 4726: int pos = 0, len; ! 4727: int unsignedp = 0; ! 4728: int modewidth; ! 4729: rtx tem; ! 4730: ! 4731: switch (GET_CODE (x)) ! 4732: { ! 4733: case ZERO_EXTEND: ! 4734: unsignedp = 1; ! 4735: case SIGN_EXTEND: ! 4736: /* We can't necessarily use a const_int for a multiword mode; ! 4737: it depends on implicitly extending the value. ! 4738: Since we don't know the right way to extend it, ! 4739: we can't tell whether the implicit way is right. ! 4740: ! 4741: Even for a mode that is no wider than a const_int, ! 4742: we can't win, because we need to sign extend one of its bits through ! 4743: the rest of it, and we don't know which bit. */ ! 4744: if (GET_CODE (XEXP (x, 0)) == CONST_INT) ! 4745: return x; ! 4746: ! 4747: if (! FAKE_EXTEND_SAFE_P (GET_MODE (XEXP (x, 0)), XEXP (x, 0))) ! 4748: return x; ! 4749: ! 4750: len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))); ! 4751: /* If the inner object has VOIDmode (the only way this can happen ! 4752: is if it is a ASM_OPERANDS), we can't do anything since we don't ! 4753: know how much masking to do. */ ! 4754: if (len == 0) ! 4755: return x; ! 4756: ! 4757: break; ! 4758: ! 4759: case ZERO_EXTRACT: ! 4760: unsignedp = 1; ! 4761: case SIGN_EXTRACT: ! 4762: /* If the operand is a CLOBBER, just return it. */ ! 4763: if (GET_CODE (XEXP (x, 0)) == CLOBBER) ! 4764: return XEXP (x, 0); ! 4765: ! 4766: if (GET_CODE (XEXP (x, 1)) != CONST_INT ! 4767: || GET_CODE (XEXP (x, 2)) != CONST_INT ! 4768: || GET_MODE (XEXP (x, 0)) == VOIDmode) ! 4769: return x; ! 4770: ! 4771: len = INTVAL (XEXP (x, 1)); ! 4772: pos = INTVAL (XEXP (x, 2)); ! 4773: ! 4774: /* If this goes outside the object being extracted, replace the object ! 4775: with a (use (mem ...)) construct that only combine understands ! 4776: and is used only for this purpose. */ ! 4777: if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))) ! 4778: SUBST (XEXP (x, 0), gen_rtx (USE, GET_MODE (x), XEXP (x, 0))); ! 4779: ! 4780: #if BITS_BIG_ENDIAN ! 4781: pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos; ! 4782: #endif ! 4783: break; ! 4784: ! 4785: default: ! 4786: return x; ! 4787: } ! 4788: ! 4789: /* If we reach here, we want to return a pair of shifts. The inner ! 4790: shift is a left shift of BITSIZE - POS - LEN bits. The outer ! 4791: shift is a right shift of BITSIZE - LEN bits. It is arithmetic or ! 4792: logical depending on the value of UNSIGNEDP. ! 4793: ! 4794: If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be ! 4795: converted into an AND of a shift. ! 4796: ! 4797: We must check for the case where the left shift would have a negative ! 4798: count. This can happen in a case like (x >> 31) & 255 on machines ! 4799: that can't shift by a constant. On those machines, we would first ! 4800: combine the shift with the AND to produce a variable-position ! 4801: extraction. Then the constant of 31 would be substituted in to produce ! 4802: a such a position. */ ! 4803: ! 4804: modewidth = GET_MODE_BITSIZE (GET_MODE (x)); ! 4805: if (modewidth >= pos - len) ! 4806: tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT, ! 4807: GET_MODE (x), ! 4808: simplify_shift_const (NULL_RTX, ASHIFT, ! 4809: GET_MODE (x), ! 4810: XEXP (x, 0), ! 4811: modewidth - pos - len), ! 4812: modewidth - len); ! 4813: ! 4814: else if (unsignedp && len < HOST_BITS_PER_WIDE_INT) ! 4815: tem = simplify_and_const_int (NULL_RTX, GET_MODE (x), ! 4816: simplify_shift_const (NULL_RTX, LSHIFTRT, ! 4817: GET_MODE (x), ! 4818: XEXP (x, 0), pos), ! 4819: ((HOST_WIDE_INT) 1 << len) - 1); ! 4820: else ! 4821: /* Any other cases we can't handle. */ ! 4822: return x; ! 4823: ! 4824: ! 4825: /* If we couldn't do this for some reason, return the original ! 4826: expression. */ ! 4827: if (GET_CODE (tem) == CLOBBER) ! 4828: return x; ! 4829: ! 4830: return tem; ! 4831: } ! 4832: ! 4833: /* X is a SET which contains an assignment of one object into ! 4834: a part of another (such as a bit-field assignment, STRICT_LOW_PART, ! 4835: or certain SUBREGS). If possible, convert it into a series of ! 4836: logical operations. ! 4837: ! 4838: We half-heartedly support variable positions, but do not at all ! 4839: support variable lengths. */ ! 4840: ! 4841: static rtx ! 4842: expand_field_assignment (x) ! 4843: rtx x; ! 4844: { ! 4845: rtx inner; ! 4846: rtx pos; /* Always counts from low bit. */ ! 4847: int len; ! 4848: rtx mask; ! 4849: enum machine_mode compute_mode; ! 4850: ! 4851: /* Loop until we find something we can't simplify. */ ! 4852: while (1) ! 4853: { ! 4854: if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART ! 4855: && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG) ! 4856: { ! 4857: inner = SUBREG_REG (XEXP (SET_DEST (x), 0)); ! 4858: len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))); ! 4859: pos = const0_rtx; ! 4860: } ! 4861: else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT ! 4862: && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT) ! 4863: { ! 4864: inner = XEXP (SET_DEST (x), 0); ! 4865: len = INTVAL (XEXP (SET_DEST (x), 1)); ! 4866: pos = XEXP (SET_DEST (x), 2); ! 4867: ! 4868: /* If the position is constant and spans the width of INNER, ! 4869: surround INNER with a USE to indicate this. */ ! 4870: if (GET_CODE (pos) == CONST_INT ! 4871: && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner))) ! 4872: inner = gen_rtx (USE, GET_MODE (SET_DEST (x)), inner); ! 4873: ! 4874: #if BITS_BIG_ENDIAN ! 4875: if (GET_CODE (pos) == CONST_INT) ! 4876: pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len ! 4877: - INTVAL (pos)); ! 4878: else if (GET_CODE (pos) == MINUS ! 4879: && GET_CODE (XEXP (pos, 1)) == CONST_INT ! 4880: && (INTVAL (XEXP (pos, 1)) ! 4881: == GET_MODE_BITSIZE (GET_MODE (inner)) - len)) ! 4882: /* If position is ADJUST - X, new position is X. */ ! 4883: pos = XEXP (pos, 0); ! 4884: else ! 4885: pos = gen_binary (MINUS, GET_MODE (pos), ! 4886: GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) ! 4887: - len), ! 4888: pos); ! 4889: #endif ! 4890: } ! 4891: ! 4892: /* A SUBREG between two modes that occupy the same numbers of words ! 4893: can be done by moving the SUBREG to the source. */ ! 4894: else if (GET_CODE (SET_DEST (x)) == SUBREG ! 4895: && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x))) ! 4896: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) ! 4897: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x)))) ! 4898: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))) ! 4899: { ! 4900: x = gen_rtx (SET, VOIDmode, SUBREG_REG (SET_DEST (x)), ! 4901: gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_DEST (x))), ! 4902: SET_SRC (x))); ! 4903: continue; ! 4904: } ! 4905: else ! 4906: break; ! 4907: ! 4908: while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner)) ! 4909: inner = SUBREG_REG (inner); ! 4910: ! 4911: compute_mode = GET_MODE (inner); ! 4912: ! 4913: /* Compute a mask of LEN bits, if we can do this on the host machine. */ ! 4914: if (len < HOST_BITS_PER_WIDE_INT) ! 4915: mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1); ! 4916: else ! 4917: break; ! 4918: ! 4919: /* Now compute the equivalent expression. Make a copy of INNER ! 4920: for the SET_DEST in case it is a MEM into which we will substitute; ! 4921: we don't want shared RTL in that case. */ ! 4922: x = gen_rtx (SET, VOIDmode, copy_rtx (inner), ! 4923: gen_binary (IOR, compute_mode, ! 4924: gen_binary (AND, compute_mode, ! 4925: gen_unary (NOT, compute_mode, ! 4926: gen_binary (ASHIFT, ! 4927: compute_mode, ! 4928: mask, pos)), ! 4929: inner), ! 4930: gen_binary (ASHIFT, compute_mode, ! 4931: gen_binary (AND, compute_mode, ! 4932: gen_lowpart_for_combine ! 4933: (compute_mode, ! 4934: SET_SRC (x)), ! 4935: mask), ! 4936: pos))); ! 4937: } ! 4938: ! 4939: return x; ! 4940: } ! 4941: ! 4942: /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero, ! 4943: it is an RTX that represents a variable starting position; otherwise, ! 4944: POS is the (constant) starting bit position (counted from the LSB). ! 4945: ! 4946: INNER may be a USE. This will occur when we started with a bitfield ! 4947: that went outside the boundary of the object in memory, which is ! 4948: allowed on most machines. To isolate this case, we produce a USE ! 4949: whose mode is wide enough and surround the MEM with it. The only ! 4950: code that understands the USE is this routine. If it is not removed, ! 4951: it will cause the resulting insn not to match. ! 4952: ! 4953: UNSIGNEDP is non-zero for an unsigned reference and zero for a ! 4954: signed reference. ! 4955: ! 4956: IN_DEST is non-zero if this is a reference in the destination of a ! 4957: SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If non-zero, ! 4958: a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will ! 4959: be used. ! 4960: ! 4961: IN_COMPARE is non-zero if we are in a COMPARE. This means that a ! 4962: ZERO_EXTRACT should be built even for bits starting at bit 0. ! 4963: ! 4964: MODE is the desired mode of the result (if IN_DEST == 0). */ ! 4965: ! 4966: static rtx ! 4967: make_extraction (mode, inner, pos, pos_rtx, len, ! 4968: unsignedp, in_dest, in_compare) ! 4969: enum machine_mode mode; ! 4970: rtx inner; ! 4971: int pos; ! 4972: rtx pos_rtx; ! 4973: int len; ! 4974: int unsignedp; ! 4975: int in_dest, in_compare; ! 4976: { ! 4977: /* This mode describes the size of the storage area ! 4978: to fetch the overall value from. Within that, we ! 4979: ignore the POS lowest bits, etc. */ ! 4980: enum machine_mode is_mode = GET_MODE (inner); ! 4981: enum machine_mode inner_mode; ! 4982: enum machine_mode wanted_mem_mode = byte_mode; ! 4983: enum machine_mode pos_mode = word_mode; ! 4984: enum machine_mode extraction_mode = word_mode; ! 4985: enum machine_mode tmode = mode_for_size (len, MODE_INT, 1); ! 4986: int spans_byte = 0; ! 4987: rtx new = 0; ! 4988: rtx orig_pos_rtx = pos_rtx; ! 4989: int orig_pos; ! 4990: ! 4991: /* Get some information about INNER and get the innermost object. */ ! 4992: if (GET_CODE (inner) == USE) ! 4993: /* (use:SI (mem:QI foo)) stands for (mem:SI foo). */ ! 4994: /* We don't need to adjust the position because we set up the USE ! 4995: to pretend that it was a full-word object. */ ! 4996: spans_byte = 1, inner = XEXP (inner, 0); ! 4997: else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner)) ! 4998: { ! 4999: /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...), ! 5000: consider just the QI as the memory to extract from. ! 5001: The subreg adds or removes high bits; its mode is ! 5002: irrelevant to the meaning of this extraction, ! 5003: since POS and LEN count from the lsb. */ ! 5004: if (GET_CODE (SUBREG_REG (inner)) == MEM) ! 5005: is_mode = GET_MODE (SUBREG_REG (inner)); ! 5006: inner = SUBREG_REG (inner); ! 5007: } ! 5008: ! 5009: inner_mode = GET_MODE (inner); ! 5010: ! 5011: if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT) ! 5012: pos = INTVAL (pos_rtx), pos_rtx = 0; ! 5013: ! 5014: /* See if this can be done without an extraction. We never can if the ! 5015: width of the field is not the same as that of some integer mode. For ! 5016: registers, we can only avoid the extraction if the position is at the ! 5017: low-order bit and this is either not in the destination or we have the ! 5018: appropriate STRICT_LOW_PART operation available. ! 5019: ! 5020: For MEM, we can avoid an extract if the field starts on an appropriate ! 5021: boundary and we can change the mode of the memory reference. However, ! 5022: we cannot directly access the MEM if we have a USE and the underlying ! 5023: MEM is not TMODE. This combination means that MEM was being used in a ! 5024: context where bits outside its mode were being referenced; that is only ! 5025: valid in bit-field insns. */ ! 5026: ! 5027: if (tmode != BLKmode ! 5028: && ! (spans_byte && inner_mode != tmode) ! 5029: && ((pos_rtx == 0 && pos == 0 && GET_CODE (inner) != MEM ! 5030: && (! in_dest ! 5031: || (GET_CODE (inner) == REG ! 5032: && (movstrict_optab->handlers[(int) tmode].insn_code ! 5033: != CODE_FOR_nothing)))) ! 5034: || (GET_CODE (inner) == MEM && pos_rtx == 0 ! 5035: && (pos ! 5036: % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode) ! 5037: : BITS_PER_UNIT)) == 0 ! 5038: /* We can't do this if we are widening INNER_MODE (it ! 5039: may not be aligned, for one thing). */ ! 5040: && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode) ! 5041: && (inner_mode == tmode ! 5042: || (! mode_dependent_address_p (XEXP (inner, 0)) ! 5043: && ! MEM_VOLATILE_P (inner)))))) ! 5044: { ! 5045: /* If INNER is a MEM, make a new MEM that encompasses just the desired ! 5046: field. If the original and current mode are the same, we need not ! 5047: adjust the offset. Otherwise, we do if bytes big endian. ! 5048: ! 5049: If INNER is not a MEM, get a piece consisting of the just the field ! 5050: of interest (in this case POS must be 0). */ ! 5051: ! 5052: if (GET_CODE (inner) == MEM) ! 5053: { ! 5054: int offset; ! 5055: /* POS counts from lsb, but make OFFSET count in memory order. */ ! 5056: if (BYTES_BIG_ENDIAN) ! 5057: offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT; ! 5058: else ! 5059: offset = pos / BITS_PER_UNIT; ! 5060: ! 5061: new = gen_rtx (MEM, tmode, plus_constant (XEXP (inner, 0), offset)); ! 5062: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (inner); ! 5063: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (inner); ! 5064: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (inner); ! 5065: } ! 5066: else if (GET_CODE (inner) == REG) ! 5067: /* We can't call gen_lowpart_for_combine here since we always want ! 5068: a SUBREG and it would sometimes return a new hard register. */ ! 5069: new = gen_rtx (SUBREG, tmode, inner, ! 5070: (WORDS_BIG_ENDIAN ! 5071: && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD ! 5072: ? ((GET_MODE_SIZE (inner_mode) - GET_MODE_SIZE (tmode)) ! 5073: / UNITS_PER_WORD) ! 5074: : 0)); ! 5075: else ! 5076: new = force_to_mode (inner, tmode, ! 5077: len >= HOST_BITS_PER_WIDE_INT ! 5078: ? GET_MODE_MASK (tmode) ! 5079: : ((HOST_WIDE_INT) 1 << len) - 1, ! 5080: NULL_RTX, 0); ! 5081: ! 5082: /* If this extraction is going into the destination of a SET, ! 5083: make a STRICT_LOW_PART unless we made a MEM. */ ! 5084: ! 5085: if (in_dest) ! 5086: return (GET_CODE (new) == MEM ? new ! 5087: : (GET_CODE (new) != SUBREG ! 5088: ? gen_rtx (CLOBBER, tmode, const0_rtx) ! 5089: : gen_rtx_combine (STRICT_LOW_PART, VOIDmode, new))); ! 5090: ! 5091: /* Otherwise, sign- or zero-extend unless we already are in the ! 5092: proper mode. */ ! 5093: ! 5094: return (mode == tmode ? new ! 5095: : gen_rtx_combine (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, ! 5096: mode, new)); ! 5097: } ! 5098: ! 5099: /* Unless this is a COMPARE or we have a funny memory reference, ! 5100: don't do anything with zero-extending field extracts starting at ! 5101: the low-order bit since they are simple AND operations. */ ! 5102: if (pos_rtx == 0 && pos == 0 && ! in_dest ! 5103: && ! in_compare && ! spans_byte && unsignedp) ! 5104: return 0; ! 5105: ! 5106: /* Get the mode to use should INNER be a MEM, the mode for the position, ! 5107: and the mode for the result. */ ! 5108: #ifdef HAVE_insv ! 5109: if (in_dest) ! 5110: { ! 5111: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_insv][0]; ! 5112: pos_mode = insn_operand_mode[(int) CODE_FOR_insv][2]; ! 5113: extraction_mode = insn_operand_mode[(int) CODE_FOR_insv][3]; ! 5114: } ! 5115: #endif ! 5116: ! 5117: #ifdef HAVE_extzv ! 5118: if (! in_dest && unsignedp) ! 5119: { ! 5120: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extzv][1]; ! 5121: pos_mode = insn_operand_mode[(int) CODE_FOR_extzv][3]; ! 5122: extraction_mode = insn_operand_mode[(int) CODE_FOR_extzv][0]; ! 5123: } ! 5124: #endif ! 5125: ! 5126: #ifdef HAVE_extv ! 5127: if (! in_dest && ! unsignedp) ! 5128: { ! 5129: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extv][1]; ! 5130: pos_mode = insn_operand_mode[(int) CODE_FOR_extv][3]; ! 5131: extraction_mode = insn_operand_mode[(int) CODE_FOR_extv][0]; ! 5132: } ! 5133: #endif ! 5134: ! 5135: /* Never narrow an object, since that might not be safe. */ ! 5136: ! 5137: if (mode != VOIDmode ! 5138: && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode)) ! 5139: extraction_mode = mode; ! 5140: ! 5141: if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode ! 5142: && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx))) ! 5143: pos_mode = GET_MODE (pos_rtx); ! 5144: ! 5145: /* If this is not from memory or we have to change the mode of memory and ! 5146: cannot, the desired mode is EXTRACTION_MODE. */ ! 5147: if (GET_CODE (inner) != MEM ! 5148: || (inner_mode != wanted_mem_mode ! 5149: && (mode_dependent_address_p (XEXP (inner, 0)) ! 5150: || MEM_VOLATILE_P (inner)))) ! 5151: wanted_mem_mode = extraction_mode; ! 5152: ! 5153: orig_pos = pos; ! 5154: ! 5155: #if BITS_BIG_ENDIAN ! 5156: /* If position is constant, compute new position. Otherwise, build ! 5157: subtraction. */ ! 5158: if (pos_rtx == 0) ! 5159: pos = (MAX (GET_MODE_BITSIZE (is_mode), GET_MODE_BITSIZE (wanted_mem_mode)) ! 5160: - len - pos); ! 5161: else ! 5162: pos_rtx ! 5163: = gen_rtx_combine (MINUS, GET_MODE (pos_rtx), ! 5164: GEN_INT (MAX (GET_MODE_BITSIZE (is_mode), ! 5165: GET_MODE_BITSIZE (wanted_mem_mode)) ! 5166: - len), ! 5167: pos_rtx); ! 5168: #endif ! 5169: ! 5170: /* If INNER has a wider mode, make it smaller. If this is a constant ! 5171: extract, try to adjust the byte to point to the byte containing ! 5172: the value. */ ! 5173: if (wanted_mem_mode != VOIDmode ! 5174: && GET_MODE_SIZE (wanted_mem_mode) < GET_MODE_SIZE (is_mode) ! 5175: && ((GET_CODE (inner) == MEM ! 5176: && (inner_mode == wanted_mem_mode ! 5177: || (! mode_dependent_address_p (XEXP (inner, 0)) ! 5178: && ! MEM_VOLATILE_P (inner)))))) ! 5179: { ! 5180: int offset = 0; ! 5181: ! 5182: /* The computations below will be correct if the machine is big ! 5183: endian in both bits and bytes or little endian in bits and bytes. ! 5184: If it is mixed, we must adjust. */ ! 5185: ! 5186: /* If bytes are big endian and we had a paradoxical SUBREG, we must ! 5187: adjust OFFSET to compensate. */ ! 5188: #if BYTES_BIG_ENDIAN ! 5189: if (! spans_byte ! 5190: && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode)) ! 5191: offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode); ! 5192: #endif ! 5193: ! 5194: /* If this is a constant position, we can move to the desired byte. */ ! 5195: if (pos_rtx == 0) ! 5196: { ! 5197: offset += pos / BITS_PER_UNIT; ! 5198: pos %= GET_MODE_BITSIZE (wanted_mem_mode); ! 5199: } ! 5200: ! 5201: #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN ! 5202: if (! spans_byte && is_mode != wanted_mem_mode) ! 5203: offset = (GET_MODE_SIZE (is_mode) ! 5204: - GET_MODE_SIZE (wanted_mem_mode) - offset); ! 5205: #endif ! 5206: ! 5207: if (offset != 0 || inner_mode != wanted_mem_mode) ! 5208: { ! 5209: rtx newmem = gen_rtx (MEM, wanted_mem_mode, ! 5210: plus_constant (XEXP (inner, 0), offset)); ! 5211: RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (inner); ! 5212: MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (inner); ! 5213: MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (inner); ! 5214: inner = newmem; ! 5215: } ! 5216: } ! 5217: ! 5218: /* If INNER is not memory, we can always get it into the proper mode. */ ! 5219: else if (GET_CODE (inner) != MEM) ! 5220: inner = force_to_mode (inner, extraction_mode, ! 5221: pos_rtx || len + orig_pos >= HOST_BITS_PER_WIDE_INT ! 5222: ? GET_MODE_MASK (extraction_mode) ! 5223: : (((HOST_WIDE_INT) 1 << len) - 1) << orig_pos, ! 5224: NULL_RTX, 0); ! 5225: ! 5226: /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we ! 5227: have to zero extend. Otherwise, we can just use a SUBREG. */ ! 5228: if (pos_rtx != 0 ! 5229: && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx))) ! 5230: pos_rtx = gen_rtx_combine (ZERO_EXTEND, pos_mode, pos_rtx); ! 5231: else if (pos_rtx != 0 ! 5232: && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx))) ! 5233: pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx); ! 5234: ! 5235: /* Make POS_RTX unless we already have it and it is correct. If we don't ! 5236: have a POS_RTX but we do have an ORIG_POS_RTX, the latter must ! 5237: be a CONST_INT. */ ! 5238: if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos) ! 5239: pos_rtx = orig_pos_rtx; ! 5240: ! 5241: else if (pos_rtx == 0) ! 5242: pos_rtx = GEN_INT (pos); ! 5243: ! 5244: /* Make the required operation. See if we can use existing rtx. */ ! 5245: new = gen_rtx_combine (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT, ! 5246: extraction_mode, inner, GEN_INT (len), pos_rtx); ! 5247: if (! in_dest) ! 5248: new = gen_lowpart_for_combine (mode, new); ! 5249: ! 5250: return new; ! 5251: } ! 5252: ! 5253: /* Look at the expression rooted at X. Look for expressions ! 5254: equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND. ! 5255: Form these expressions. ! 5256: ! 5257: Return the new rtx, usually just X. ! 5258: ! 5259: Also, for machines like the Vax that don't have logical shift insns, ! 5260: try to convert logical to arithmetic shift operations in cases where ! 5261: they are equivalent. This undoes the canonicalizations to logical ! 5262: shifts done elsewhere. ! 5263: ! 5264: We try, as much as possible, to re-use rtl expressions to save memory. ! 5265: ! 5266: IN_CODE says what kind of expression we are processing. Normally, it is ! 5267: SET. In a memory address (inside a MEM, PLUS or minus, the latter two ! 5268: being kludges), it is MEM. When processing the arguments of a comparison ! 5269: or a COMPARE against zero, it is COMPARE. */ ! 5270: ! 5271: static rtx ! 5272: make_compound_operation (x, in_code) ! 5273: rtx x; ! 5274: enum rtx_code in_code; ! 5275: { ! 5276: enum rtx_code code = GET_CODE (x); ! 5277: enum machine_mode mode = GET_MODE (x); ! 5278: int mode_width = GET_MODE_BITSIZE (mode); ! 5279: enum rtx_code next_code; ! 5280: int i, count; ! 5281: rtx new = 0; ! 5282: rtx tem; ! 5283: char *fmt; ! 5284: ! 5285: /* Select the code to be used in recursive calls. Once we are inside an ! 5286: address, we stay there. If we have a comparison, set to COMPARE, ! 5287: but once inside, go back to our default of SET. */ ! 5288: ! 5289: next_code = (code == MEM || code == PLUS || code == MINUS ? MEM ! 5290: : ((code == COMPARE || GET_RTX_CLASS (code) == '<') ! 5291: && XEXP (x, 1) == const0_rtx) ? COMPARE ! 5292: : in_code == COMPARE ? SET : in_code); ! 5293: ! 5294: /* Process depending on the code of this operation. If NEW is set ! 5295: non-zero, it will be returned. */ ! 5296: ! 5297: switch (code) ! 5298: { ! 5299: case ASHIFT: ! 5300: case LSHIFT: ! 5301: /* Convert shifts by constants into multiplications if inside ! 5302: an address. */ ! 5303: if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT ! 5304: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT ! 5305: && INTVAL (XEXP (x, 1)) >= 0) ! 5306: { ! 5307: new = make_compound_operation (XEXP (x, 0), next_code); ! 5308: new = gen_rtx_combine (MULT, mode, new, ! 5309: GEN_INT ((HOST_WIDE_INT) 1 ! 5310: << INTVAL (XEXP (x, 1)))); ! 5311: } ! 5312: break; ! 5313: ! 5314: case AND: ! 5315: /* If the second operand is not a constant, we can't do anything ! 5316: with it. */ ! 5317: if (GET_CODE (XEXP (x, 1)) != CONST_INT) ! 5318: break; ! 5319: ! 5320: /* If the constant is a power of two minus one and the first operand ! 5321: is a logical right shift, make an extraction. */ ! 5322: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 5323: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) ! 5324: { ! 5325: new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code); ! 5326: new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1, ! 5327: 0, in_code == COMPARE); ! 5328: } ! 5329: ! 5330: /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */ ! 5331: else if (GET_CODE (XEXP (x, 0)) == SUBREG ! 5332: && subreg_lowpart_p (XEXP (x, 0)) ! 5333: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT ! 5334: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) ! 5335: { ! 5336: new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0), ! 5337: next_code); ! 5338: new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0, ! 5339: XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1, ! 5340: 0, in_code == COMPARE); ! 5341: } ! 5342: /* Same as previous, but for (xor/ior (lshift...) (lshift...)). */ ! 5343: else if ((GET_CODE (XEXP (x, 0)) == XOR ! 5344: || GET_CODE (XEXP (x, 0)) == IOR) ! 5345: && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT ! 5346: && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT ! 5347: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) ! 5348: { ! 5349: /* Apply the distributive law, and then try to make extractions. */ ! 5350: new = gen_rtx_combine (GET_CODE (XEXP (x, 0)), mode, ! 5351: gen_rtx (AND, mode, XEXP (XEXP (x, 0), 0), ! 5352: XEXP (x, 1)), ! 5353: gen_rtx (AND, mode, XEXP (XEXP (x, 0), 1), ! 5354: XEXP (x, 1))); ! 5355: new = make_compound_operation (new, in_code); ! 5356: } ! 5357: ! 5358: /* If we are have (and (rotate X C) M) and C is larger than the number ! 5359: of bits in M, this is an extraction. */ ! 5360: ! 5361: else if (GET_CODE (XEXP (x, 0)) == ROTATE ! 5362: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5363: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0 ! 5364: && i <= INTVAL (XEXP (XEXP (x, 0), 1))) ! 5365: { ! 5366: new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code); ! 5367: new = make_extraction (mode, new, ! 5368: (GET_MODE_BITSIZE (mode) ! 5369: - INTVAL (XEXP (XEXP (x, 0), 1))), ! 5370: NULL_RTX, i, 1, 0, in_code == COMPARE); ! 5371: } ! 5372: ! 5373: /* On machines without logical shifts, if the operand of the AND is ! 5374: a logical shift and our mask turns off all the propagated sign ! 5375: bits, we can replace the logical shift with an arithmetic shift. */ ! 5376: else if (ashr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing ! 5377: && (lshr_optab->handlers[(int) mode].insn_code ! 5378: == CODE_FOR_nothing) ! 5379: && GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 5380: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5381: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 ! 5382: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT ! 5383: && mode_width <= HOST_BITS_PER_WIDE_INT) ! 5384: { ! 5385: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); ! 5386: ! 5387: mask >>= INTVAL (XEXP (XEXP (x, 0), 1)); ! 5388: if ((INTVAL (XEXP (x, 1)) & ~mask) == 0) ! 5389: SUBST (XEXP (x, 0), ! 5390: gen_rtx_combine (ASHIFTRT, mode, ! 5391: make_compound_operation (XEXP (XEXP (x, 0), 0), ! 5392: next_code), ! 5393: XEXP (XEXP (x, 0), 1))); ! 5394: } ! 5395: ! 5396: /* If the constant is one less than a power of two, this might be ! 5397: representable by an extraction even if no shift is present. ! 5398: If it doesn't end up being a ZERO_EXTEND, we will ignore it unless ! 5399: we are in a COMPARE. */ ! 5400: else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) ! 5401: new = make_extraction (mode, ! 5402: make_compound_operation (XEXP (x, 0), ! 5403: next_code), ! 5404: 0, NULL_RTX, i, 1, 0, in_code == COMPARE); ! 5405: ! 5406: /* If we are in a comparison and this is an AND with a power of two, ! 5407: convert this into the appropriate bit extract. */ ! 5408: else if (in_code == COMPARE ! 5409: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0) ! 5410: new = make_extraction (mode, ! 5411: make_compound_operation (XEXP (x, 0), ! 5412: next_code), ! 5413: i, NULL_RTX, 1, 1, 0, 1); ! 5414: ! 5415: break; ! 5416: ! 5417: case LSHIFTRT: ! 5418: /* If the sign bit is known to be zero, replace this with an ! 5419: arithmetic shift. */ ! 5420: if (ashr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing ! 5421: && lshr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing ! 5422: && mode_width <= HOST_BITS_PER_WIDE_INT ! 5423: && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0) ! 5424: { ! 5425: new = gen_rtx_combine (ASHIFTRT, mode, ! 5426: make_compound_operation (XEXP (x, 0), ! 5427: next_code), ! 5428: XEXP (x, 1)); ! 5429: break; ! 5430: } ! 5431: ! 5432: /* ... fall through ... */ ! 5433: ! 5434: case ASHIFTRT: ! 5435: /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1, ! 5436: this is a SIGN_EXTRACT. */ ! 5437: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5438: && GET_CODE (XEXP (x, 0)) == ASHIFT ! 5439: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5440: && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (x, 0), 1))) ! 5441: { ! 5442: new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code); ! 5443: new = make_extraction (mode, new, ! 5444: (INTVAL (XEXP (x, 1)) ! 5445: - INTVAL (XEXP (XEXP (x, 0), 1))), ! 5446: NULL_RTX, mode_width - INTVAL (XEXP (x, 1)), ! 5447: code == LSHIFTRT, 0, in_code == COMPARE); ! 5448: } ! 5449: ! 5450: /* Similarly if we have (ashifrt (OP (ashift foo C1) C3) C2). In these ! 5451: cases, we are better off returning a SIGN_EXTEND of the operation. */ ! 5452: ! 5453: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5454: && (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND ! 5455: || GET_CODE (XEXP (x, 0)) == XOR ! 5456: || GET_CODE (XEXP (x, 0)) == PLUS) ! 5457: && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT ! 5458: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT ! 5459: && INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) < HOST_BITS_PER_WIDE_INT ! 5460: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5461: && 0 == (INTVAL (XEXP (XEXP (x, 0), 1)) ! 5462: & (((HOST_WIDE_INT) 1 ! 5463: << (MIN (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)), ! 5464: INTVAL (XEXP (x, 1))) ! 5465: - 1))))) ! 5466: { ! 5467: rtx c1 = XEXP (XEXP (XEXP (x, 0), 0), 1); ! 5468: rtx c2 = XEXP (x, 1); ! 5469: rtx c3 = XEXP (XEXP (x, 0), 1); ! 5470: HOST_WIDE_INT newop1; ! 5471: rtx inner = XEXP (XEXP (XEXP (x, 0), 0), 0); ! 5472: ! 5473: /* If C1 > C2, INNER needs to have the shift performed on it ! 5474: for C1-C2 bits. */ ! 5475: if (INTVAL (c1) > INTVAL (c2)) ! 5476: { ! 5477: inner = gen_binary (ASHIFT, mode, inner, ! 5478: GEN_INT (INTVAL (c1) - INTVAL (c2))); ! 5479: c1 = c2; ! 5480: } ! 5481: ! 5482: newop1 = INTVAL (c3) >> INTVAL (c1); ! 5483: new = make_compound_operation (inner, ! 5484: GET_CODE (XEXP (x, 0)) == PLUS ! 5485: ? MEM : GET_CODE (XEXP (x, 0))); ! 5486: new = make_extraction (mode, ! 5487: gen_binary (GET_CODE (XEXP (x, 0)), mode, new, ! 5488: GEN_INT (newop1)), ! 5489: INTVAL (c2) - INTVAL (c1), ! 5490: NULL_RTX, mode_width - INTVAL (c2), ! 5491: code == LSHIFTRT, 0, in_code == COMPARE); ! 5492: } ! 5493: ! 5494: /* Similarly for (ashiftrt (neg (ashift FOO C1)) C2). */ ! 5495: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5496: && GET_CODE (XEXP (x, 0)) == NEG ! 5497: && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT ! 5498: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT ! 5499: && INTVAL (XEXP (x, 1)) >= INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))) ! 5500: { ! 5501: new = make_compound_operation (XEXP (XEXP (XEXP (x, 0), 0), 0), ! 5502: next_code); ! 5503: new = make_extraction (mode, ! 5504: gen_unary (GET_CODE (XEXP (x, 0)), mode, new), ! 5505: (INTVAL (XEXP (x, 1)) ! 5506: - INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1))), ! 5507: NULL_RTX, mode_width - INTVAL (XEXP (x, 1)), ! 5508: code == LSHIFTRT, 0, in_code == COMPARE); ! 5509: } ! 5510: break; ! 5511: ! 5512: case SUBREG: ! 5513: /* Call ourselves recursively on the inner expression. If we are ! 5514: narrowing the object and it has a different RTL code from ! 5515: what it originally did, do this SUBREG as a force_to_mode. */ ! 5516: ! 5517: tem = make_compound_operation (SUBREG_REG (x), in_code); ! 5518: if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x)) ! 5519: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem)) ! 5520: && subreg_lowpart_p (x)) ! 5521: { ! 5522: rtx newer = force_to_mode (tem, mode, ! 5523: GET_MODE_MASK (mode), NULL_RTX, 0); ! 5524: ! 5525: /* If we have something other than a SUBREG, we might have ! 5526: done an expansion, so rerun outselves. */ ! 5527: if (GET_CODE (newer) != SUBREG) ! 5528: newer = make_compound_operation (newer, in_code); ! 5529: ! 5530: return newer; ! 5531: } ! 5532: } ! 5533: ! 5534: if (new) ! 5535: { ! 5536: x = gen_lowpart_for_combine (mode, new); ! 5537: code = GET_CODE (x); ! 5538: } ! 5539: ! 5540: /* Now recursively process each operand of this operation. */ ! 5541: fmt = GET_RTX_FORMAT (code); ! 5542: for (i = 0; i < GET_RTX_LENGTH (code); i++) ! 5543: if (fmt[i] == 'e') ! 5544: { ! 5545: new = make_compound_operation (XEXP (x, i), next_code); ! 5546: SUBST (XEXP (x, i), new); ! 5547: } ! 5548: ! 5549: return x; ! 5550: } ! 5551: ! 5552: /* Given M see if it is a value that would select a field of bits ! 5553: within an item, but not the entire word. Return -1 if not. ! 5554: Otherwise, return the starting position of the field, where 0 is the ! 5555: low-order bit. ! 5556: ! 5557: *PLEN is set to the length of the field. */ ! 5558: ! 5559: static int ! 5560: get_pos_from_mask (m, plen) ! 5561: unsigned HOST_WIDE_INT m; ! 5562: int *plen; ! 5563: { ! 5564: /* Get the bit number of the first 1 bit from the right, -1 if none. */ ! 5565: int pos = exact_log2 (m & - m); ! 5566: ! 5567: if (pos < 0) ! 5568: return -1; ! 5569: ! 5570: /* Now shift off the low-order zero bits and see if we have a power of ! 5571: two minus 1. */ ! 5572: *plen = exact_log2 ((m >> pos) + 1); ! 5573: ! 5574: if (*plen <= 0) ! 5575: return -1; ! 5576: ! 5577: return pos; ! 5578: } ! 5579: ! 5580: /* See if X can be simplified knowing that we will only refer to it in ! 5581: MODE and will only refer to those bits that are nonzero in MASK. ! 5582: If other bits are being computed or if masking operations are done ! 5583: that select a superset of the bits in MASK, they can sometimes be ! 5584: ignored. ! 5585: ! 5586: Return a possibly simplified expression, but always convert X to ! 5587: MODE. If X is a CONST_INT, AND the CONST_INT with MASK. ! 5588: ! 5589: Also, if REG is non-zero and X is a register equal in value to REG, ! 5590: replace X with REG. ! 5591: ! 5592: If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK ! 5593: are all off in X. This is used when X will be complemented, by either ! 5594: NOT or XOR. */ ! 5595: ! 5596: static rtx ! 5597: force_to_mode (x, mode, mask, reg, just_select) ! 5598: rtx x; ! 5599: enum machine_mode mode; ! 5600: unsigned HOST_WIDE_INT mask; ! 5601: rtx reg; ! 5602: int just_select; ! 5603: { ! 5604: enum rtx_code code = GET_CODE (x); ! 5605: int next_select = just_select || code == XOR || code == NOT; ! 5606: enum machine_mode op_mode; ! 5607: unsigned HOST_WIDE_INT fuller_mask, nonzero; ! 5608: rtx op0, op1, temp; ! 5609: ! 5610: /* We want to perform the operation is its present mode unless we know ! 5611: that the operation is valid in MODE, in which case we do the operation ! 5612: in MODE. */ ! 5613: op_mode = ((code_to_optab[(int) code] != 0 ! 5614: && (code_to_optab[(int) code]->handlers[(int) mode].insn_code ! 5615: != CODE_FOR_nothing)) ! 5616: ? mode : GET_MODE (x)); ! 5617: ! 5618: /* It is not valid to do a right-shift in a narrower mode ! 5619: than the one it came in with. */ ! 5620: if ((code == LSHIFTRT || code == ASHIFTRT) ! 5621: && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x))) ! 5622: op_mode = GET_MODE (x); ! 5623: ! 5624: /* Truncate MASK to fit OP_MODE. */ ! 5625: if (op_mode) ! 5626: mask &= GET_MODE_MASK (op_mode); ! 5627: ! 5628: /* When we have an arithmetic operation, or a shift whose count we ! 5629: do not know, we need to assume that all bit the up to the highest-order ! 5630: bit in MASK will be needed. This is how we form such a mask. */ ! 5631: if (op_mode) ! 5632: fuller_mask = (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT ! 5633: ? GET_MODE_MASK (op_mode) ! 5634: : ((HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1)) - 1); ! 5635: else ! 5636: fuller_mask = ~ (HOST_WIDE_INT) 0; ! 5637: ! 5638: /* Determine what bits of X are guaranteed to be (non)zero. */ ! 5639: nonzero = nonzero_bits (x, mode); ! 5640: ! 5641: /* If none of the bits in X are needed, return a zero. */ ! 5642: if (! just_select && (nonzero & mask) == 0) ! 5643: return const0_rtx; ! 5644: ! 5645: /* If X is a CONST_INT, return a new one. Do this here since the ! 5646: test below will fail. */ ! 5647: if (GET_CODE (x) == CONST_INT) ! 5648: { ! 5649: HOST_WIDE_INT cval = INTVAL (x) & mask; ! 5650: int width = GET_MODE_BITSIZE (mode); ! 5651: ! 5652: /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative ! 5653: number, sign extend it. */ ! 5654: if (width > 0 && width < HOST_BITS_PER_WIDE_INT ! 5655: && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) ! 5656: cval |= (HOST_WIDE_INT) -1 << width; ! 5657: ! 5658: return GEN_INT (cval); ! 5659: } ! 5660: ! 5661: /* If X is narrower than MODE, just get X in the proper mode. */ ! 5662: if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)) ! 5663: return gen_lowpart_for_combine (mode, x); ! 5664: ! 5665: /* If we aren't changing the mode and all zero bits in MASK are already ! 5666: known to be zero in X, we need not do anything. */ ! 5667: if (GET_MODE (x) == mode && (~ mask & nonzero) == 0) ! 5668: return x; ! 5669: ! 5670: switch (code) ! 5671: { ! 5672: case CLOBBER: ! 5673: /* If X is a (clobber (const_int)), return it since we know we are ! 5674: generating something that won't match. */ ! 5675: return x; ! 5676: ! 5677: #if ! BITS_BIG_ENDIAN ! 5678: case USE: ! 5679: /* X is a (use (mem ..)) that was made from a bit-field extraction that ! 5680: spanned the boundary of the MEM. If we are now masking so it is ! 5681: within that boundary, we don't need the USE any more. */ ! 5682: if ((mask & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0) ! 5683: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); ! 5684: #endif ! 5685: ! 5686: case SIGN_EXTEND: ! 5687: case ZERO_EXTEND: ! 5688: case ZERO_EXTRACT: ! 5689: case SIGN_EXTRACT: ! 5690: x = expand_compound_operation (x); ! 5691: if (GET_CODE (x) != code) ! 5692: return force_to_mode (x, mode, mask, reg, next_select); ! 5693: break; ! 5694: ! 5695: case REG: ! 5696: if (reg != 0 && (rtx_equal_p (get_last_value (reg), x) ! 5697: || rtx_equal_p (reg, get_last_value (x)))) ! 5698: x = reg; ! 5699: break; ! 5700: ! 5701: case SUBREG: ! 5702: if (subreg_lowpart_p (x) ! 5703: /* We can ignore the effect this SUBREG if it narrows the mode or, ! 5704: on machines where register operations are performed on the full ! 5705: word, if the constant masks to zero all the bits the mode ! 5706: doesn't have. */ ! 5707: && ((GET_MODE_SIZE (GET_MODE (x)) ! 5708: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 5709: #ifdef WORD_REGISTER_OPERATIONS ! 5710: || (0 == (mask ! 5711: & GET_MODE_MASK (GET_MODE (x)) ! 5712: & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x))))) ! 5713: #endif ! 5714: )) ! 5715: return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select); ! 5716: break; ! 5717: ! 5718: case AND: ! 5719: /* If this is an AND with a constant, convert it into an AND ! 5720: whose constant is the AND of that constant with MASK. If it ! 5721: remains an AND of MASK, delete it since it is redundant. */ ! 5722: ! 5723: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5724: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT) ! 5725: { ! 5726: x = simplify_and_const_int (x, op_mode, XEXP (x, 0), ! 5727: mask & INTVAL (XEXP (x, 1))); ! 5728: ! 5729: /* If X is still an AND, see if it is an AND with a mask that ! 5730: is just some low-order bits. If so, and it is BITS wide (it ! 5731: can't be wider), we don't need it. */ ! 5732: ! 5733: if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT ! 5734: && INTVAL (XEXP (x, 1)) == mask) ! 5735: x = XEXP (x, 0); ! 5736: ! 5737: break; ! 5738: } ! 5739: ! 5740: goto binop; ! 5741: ! 5742: case PLUS: ! 5743: /* In (and (plus FOO C1) M), if M is a mask that just turns off ! 5744: low-order bits (as in an alignment operation) and FOO is already ! 5745: aligned to that boundary, mask C1 to that boundary as well. ! 5746: This may eliminate that PLUS and, later, the AND. */ ! 5747: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5748: && exact_log2 (- mask) >= 0 ! 5749: && (nonzero_bits (XEXP (x, 0), mode) & ~ mask) == 0 ! 5750: && (INTVAL (XEXP (x, 1)) & ~ mask) != 0) ! 5751: return force_to_mode (plus_constant (XEXP (x, 0), ! 5752: INTVAL (XEXP (x, 1)) & mask), ! 5753: mode, mask, reg, next_select); ! 5754: ! 5755: /* ... fall through ... */ ! 5756: ! 5757: case MINUS: ! 5758: case MULT: ! 5759: /* For PLUS, MINUS and MULT, we need any bits less significant than the ! 5760: most significant bit in MASK since carries from those bits will ! 5761: affect the bits we are interested in. */ ! 5762: mask = fuller_mask; ! 5763: goto binop; ! 5764: ! 5765: case IOR: ! 5766: case XOR: ! 5767: /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and ! 5768: LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...) ! 5769: operation which may be a bitfield extraction. Ensure that the ! 5770: constant we form is not wider than the mode of X. */ ! 5771: ! 5772: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 5773: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5774: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 ! 5775: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT ! 5776: && GET_CODE (XEXP (x, 1)) == CONST_INT ! 5777: && ((INTVAL (XEXP (XEXP (x, 0), 1)) ! 5778: + floor_log2 (INTVAL (XEXP (x, 1)))) ! 5779: < GET_MODE_BITSIZE (GET_MODE (x))) ! 5780: && (INTVAL (XEXP (x, 1)) ! 5781: & ~ nonzero_bits (XEXP (x, 0), GET_MODE (x)) == 0)) ! 5782: { ! 5783: temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask) ! 5784: << INTVAL (XEXP (XEXP (x, 0), 1))); ! 5785: temp = gen_binary (GET_CODE (x), GET_MODE (x), ! 5786: XEXP (XEXP (x, 0), 0), temp); ! 5787: x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (x, 1)); ! 5788: return force_to_mode (x, mode, mask, reg, next_select); ! 5789: } ! 5790: ! 5791: binop: ! 5792: /* For most binary operations, just propagate into the operation and ! 5793: change the mode if we have an operation of that mode. */ ! 5794: ! 5795: op0 = gen_lowpart_for_combine (op_mode, ! 5796: force_to_mode (XEXP (x, 0), mode, mask, ! 5797: reg, next_select)); ! 5798: op1 = gen_lowpart_for_combine (op_mode, ! 5799: force_to_mode (XEXP (x, 1), mode, mask, ! 5800: reg, next_select)); ! 5801: ! 5802: /* If OP1 is a CONST_INT and X is an IOR or XOR, clear bits outside ! 5803: MASK since OP1 might have been sign-extended but we never want ! 5804: to turn on extra bits, since combine might have previously relied ! 5805: on them being off. */ ! 5806: if (GET_CODE (op1) == CONST_INT && (code == IOR || code == XOR) ! 5807: && (INTVAL (op1) & mask) != 0) ! 5808: op1 = GEN_INT (INTVAL (op1) & mask); ! 5809: ! 5810: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) ! 5811: x = gen_binary (code, op_mode, op0, op1); ! 5812: break; ! 5813: ! 5814: case ASHIFT: ! 5815: case LSHIFT: ! 5816: /* For left shifts, do the same, but just for the first operand. ! 5817: However, we cannot do anything with shifts where we cannot ! 5818: guarantee that the counts are smaller than the size of the mode ! 5819: because such a count will have a different meaning in a ! 5820: wider mode. */ ! 5821: ! 5822: if (! (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5823: && INTVAL (XEXP (x, 1)) >= 0 ! 5824: && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode)) ! 5825: && ! (GET_MODE (XEXP (x, 1)) != VOIDmode ! 5826: && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1))) ! 5827: < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode)))) ! 5828: break; ! 5829: ! 5830: /* If the shift count is a constant and we can do arithmetic in ! 5831: the mode of the shift, refine which bits we need. Otherwise, use the ! 5832: conservative form of the mask. */ ! 5833: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5834: && INTVAL (XEXP (x, 1)) >= 0 ! 5835: && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode) ! 5836: && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT) ! 5837: mask >>= INTVAL (XEXP (x, 1)); ! 5838: else ! 5839: mask = fuller_mask; ! 5840: ! 5841: op0 = gen_lowpart_for_combine (op_mode, ! 5842: force_to_mode (XEXP (x, 0), op_mode, ! 5843: mask, reg, next_select)); ! 5844: ! 5845: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0)) ! 5846: x = gen_binary (code, op_mode, op0, XEXP (x, 1)); ! 5847: break; ! 5848: ! 5849: case LSHIFTRT: ! 5850: /* Here we can only do something if the shift count is a constant, ! 5851: this shift constant is valid for the host, and we can do arithmetic ! 5852: in OP_MODE. */ ! 5853: ! 5854: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5855: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT ! 5856: && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT) ! 5857: { ! 5858: rtx inner = XEXP (x, 0); ! 5859: ! 5860: /* Select the mask of the bits we need for the shift operand. */ ! 5861: mask <<= INTVAL (XEXP (x, 1)); ! 5862: ! 5863: /* We can only change the mode of the shift if we can do arithmetic ! 5864: in the mode of the shift and MASK is no wider than the width of ! 5865: OP_MODE. */ ! 5866: if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT ! 5867: || (mask & ~ GET_MODE_MASK (op_mode)) != 0) ! 5868: op_mode = GET_MODE (x); ! 5869: ! 5870: inner = force_to_mode (inner, op_mode, mask, reg, next_select); ! 5871: ! 5872: if (GET_MODE (x) != op_mode || inner != XEXP (x, 0)) ! 5873: x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1)); ! 5874: } ! 5875: ! 5876: /* If we have (and (lshiftrt FOO C1) C2) where the combination of the ! 5877: shift and AND produces only copies of the sign bit (C2 is one less ! 5878: than a power of two), we can do this with just a shift. */ ! 5879: ! 5880: if (GET_CODE (x) == LSHIFTRT ! 5881: && GET_CODE (XEXP (x, 1)) == CONST_INT ! 5882: && ((INTVAL (XEXP (x, 1)) ! 5883: + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))) ! 5884: >= GET_MODE_BITSIZE (GET_MODE (x))) ! 5885: && exact_log2 (mask + 1) >= 0 ! 5886: && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))) ! 5887: >= exact_log2 (mask + 1))) ! 5888: x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), ! 5889: GEN_INT (GET_MODE_BITSIZE (GET_MODE (x)) ! 5890: - exact_log2 (mask + 1))); ! 5891: break; ! 5892: ! 5893: case ASHIFTRT: ! 5894: /* If we are just looking for the sign bit, we don't need this shift at ! 5895: all, even if it has a variable count. */ ! 5896: if (mask == ((HOST_WIDE_INT) 1 ! 5897: << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))) ! 5898: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); ! 5899: ! 5900: /* If this is a shift by a constant, get a mask that contains those bits ! 5901: that are not copies of the sign bit. We then have two cases: If ! 5902: MASK only includes those bits, this can be a logical shift, which may ! 5903: allow simplifications. If MASK is a single-bit field not within ! 5904: those bits, we are requesting a copy of the sign bit and hence can ! 5905: shift the sign bit to the appropriate location. */ ! 5906: ! 5907: if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0 ! 5908: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) ! 5909: { ! 5910: int i = -1; ! 5911: ! 5912: nonzero = GET_MODE_MASK (GET_MODE (x)); ! 5913: nonzero >>= INTVAL (XEXP (x, 1)); ! 5914: ! 5915: if ((mask & ~ nonzero) == 0 ! 5916: || (i = exact_log2 (mask)) >= 0) ! 5917: { ! 5918: x = simplify_shift_const ! 5919: (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0), ! 5920: i < 0 ? INTVAL (XEXP (x, 1)) ! 5921: : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i); ! 5922: ! 5923: if (GET_CODE (x) != ASHIFTRT) ! 5924: return force_to_mode (x, mode, mask, reg, next_select); ! 5925: } ! 5926: } ! 5927: ! 5928: /* If MASK is 1, convert this to a LSHIFTRT. This can be done ! 5929: even if the shift count isn't a constant. */ ! 5930: if (mask == 1) ! 5931: x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)); ! 5932: ! 5933: /* If this is a sign-extension operation that just affects bits ! 5934: we don't care about, remove it. Be sure the call above returned ! 5935: something that is still a shift. */ ! 5936: ! 5937: if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT) ! 5938: && GET_CODE (XEXP (x, 1)) == CONST_INT ! 5939: && INTVAL (XEXP (x, 1)) >= 0 ! 5940: && (INTVAL (XEXP (x, 1)) ! 5941: <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1)) ! 5942: && GET_CODE (XEXP (x, 0)) == ASHIFT ! 5943: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5944: && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1))) ! 5945: return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask, ! 5946: reg, next_select); ! 5947: ! 5948: break; ! 5949: ! 5950: case ROTATE: ! 5951: case ROTATERT: ! 5952: /* If the shift count is constant and we can do computations ! 5953: in the mode of X, compute where the bits we care about are. ! 5954: Otherwise, we can't do anything. Don't change the mode of ! 5955: the shift or propagate MODE into the shift, though. */ ! 5956: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5957: && INTVAL (XEXP (x, 1)) >= 0) ! 5958: { ! 5959: temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE, ! 5960: GET_MODE (x), GEN_INT (mask), ! 5961: XEXP (x, 1)); ! 5962: if (temp) ! 5963: SUBST (XEXP (x, 0), ! 5964: force_to_mode (XEXP (x, 0), GET_MODE (x), ! 5965: INTVAL (temp), reg, next_select)); ! 5966: } ! 5967: break; ! 5968: ! 5969: case NEG: ! 5970: /* We need any bits less significant than the most significant bit in ! 5971: MASK since carries from those bits will affect the bits we are ! 5972: interested in. */ ! 5973: mask = fuller_mask; ! 5974: goto unop; ! 5975: ! 5976: case NOT: ! 5977: /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the ! 5978: same as the XOR case above. Ensure that the constant we form is not ! 5979: wider than the mode of X. */ ! 5980: ! 5981: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT ! 5982: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT ! 5983: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 ! 5984: && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask) ! 5985: < GET_MODE_BITSIZE (GET_MODE (x))) ! 5986: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT) ! 5987: { ! 5988: temp = GEN_INT (mask << INTVAL (XEXP (XEXP (x, 0), 1))); ! 5989: temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp); ! 5990: x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1)); ! 5991: ! 5992: return force_to_mode (x, mode, mask, reg, next_select); ! 5993: } ! 5994: ! 5995: unop: ! 5996: op0 = gen_lowpart_for_combine (op_mode, ! 5997: force_to_mode (XEXP (x, 0), mode, mask, ! 5998: reg, next_select)); ! 5999: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0)) ! 6000: x = gen_unary (code, op_mode, op0); ! 6001: break; ! 6002: ! 6003: case NE: ! 6004: /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included ! 6005: in STORE_FLAG_VALUE and FOO has no bits that might be nonzero not ! 6006: in CONST. */ ! 6007: if ((mask & ~ STORE_FLAG_VALUE) == 0 && XEXP (x, 0) == const0_rtx ! 6008: && (nonzero_bits (XEXP (x, 0), mode) & ~ mask) == 0) ! 6009: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); ! 6010: ! 6011: break; ! 6012: ! 6013: case IF_THEN_ELSE: ! 6014: /* We have no way of knowing if the IF_THEN_ELSE can itself be ! 6015: written in a narrower mode. We play it safe and do not do so. */ ! 6016: ! 6017: SUBST (XEXP (x, 1), ! 6018: gen_lowpart_for_combine (GET_MODE (x), ! 6019: force_to_mode (XEXP (x, 1), mode, ! 6020: mask, reg, next_select))); ! 6021: SUBST (XEXP (x, 2), ! 6022: gen_lowpart_for_combine (GET_MODE (x), ! 6023: force_to_mode (XEXP (x, 2), mode, ! 6024: mask, reg,next_select))); ! 6025: break; ! 6026: } ! 6027: ! 6028: /* Ensure we return a value of the proper mode. */ ! 6029: return gen_lowpart_for_combine (mode, x); ! 6030: } ! 6031: ! 6032: /* Return the value of expression X given the fact that condition COND ! 6033: is known to be true when applied to REG as its first operand and VAL ! 6034: as its second. X is known to not be shared and so can be modified in ! 6035: place. ! 6036: ! 6037: We only handle the simplest cases, and specifically those cases that ! 6038: arise with IF_THEN_ELSE expressions. */ ! 6039: ! 6040: static rtx ! 6041: known_cond (x, cond, reg, val) ! 6042: rtx x; ! 6043: enum rtx_code cond; ! 6044: rtx reg, val; ! 6045: { ! 6046: enum rtx_code code = GET_CODE (x); ! 6047: rtx new, temp; ! 6048: char *fmt; ! 6049: int i, j; ! 6050: ! 6051: if (side_effects_p (x)) ! 6052: return x; ! 6053: ! 6054: if (cond == EQ && rtx_equal_p (x, reg)) ! 6055: return val; ! 6056: ! 6057: /* If X is (abs REG) and we know something about REG's relationship ! 6058: with zero, we may be able to simplify this. */ ! 6059: ! 6060: if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx) ! 6061: switch (cond) ! 6062: { ! 6063: case GE: case GT: case EQ: ! 6064: return XEXP (x, 0); ! 6065: case LT: case LE: ! 6066: return gen_unary (NEG, GET_MODE (XEXP (x, 0)), XEXP (x, 0)); ! 6067: } ! 6068: ! 6069: /* The only other cases we handle are MIN, MAX, and comparisons if the ! 6070: operands are the same as REG and VAL. */ ! 6071: ! 6072: else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c') ! 6073: { ! 6074: if (rtx_equal_p (XEXP (x, 0), val)) ! 6075: cond = swap_condition (cond), temp = val, val = reg, reg = temp; ! 6076: ! 6077: if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val)) ! 6078: { ! 6079: if (GET_RTX_CLASS (code) == '<') ! 6080: return (comparison_dominates_p (cond, code) ? const_true_rtx ! 6081: : (comparison_dominates_p (cond, ! 6082: reverse_condition (code)) ! 6083: ? const0_rtx : x)); ! 6084: ! 6085: else if (code == SMAX || code == SMIN ! 6086: || code == UMIN || code == UMAX) ! 6087: { ! 6088: int unsignedp = (code == UMIN || code == UMAX); ! 6089: ! 6090: if (code == SMAX || code == UMAX) ! 6091: cond = reverse_condition (cond); ! 6092: ! 6093: switch (cond) ! 6094: { ! 6095: case GE: case GT: ! 6096: return unsignedp ? x : XEXP (x, 1); ! 6097: case LE: case LT: ! 6098: return unsignedp ? x : XEXP (x, 0); ! 6099: case GEU: case GTU: ! 6100: return unsignedp ? XEXP (x, 1) : x; ! 6101: case LEU: case LTU: ! 6102: return unsignedp ? XEXP (x, 0) : x; ! 6103: } ! 6104: } ! 6105: } ! 6106: } ! 6107: ! 6108: fmt = GET_RTX_FORMAT (code); ! 6109: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 6110: { ! 6111: if (fmt[i] == 'e') ! 6112: SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val)); ! 6113: else if (fmt[i] == 'E') ! 6114: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 6115: SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j), ! 6116: cond, reg, val)); ! 6117: } ! 6118: ! 6119: return x; ! 6120: } ! 6121: ! 6122: /* See if X, a SET operation, can be rewritten as a bit-field assignment. ! 6123: Return that assignment if so. ! 6124: ! 6125: We only handle the most common cases. */ ! 6126: ! 6127: static rtx ! 6128: make_field_assignment (x) ! 6129: rtx x; ! 6130: { ! 6131: rtx dest = SET_DEST (x); ! 6132: rtx src = SET_SRC (x); ! 6133: rtx ourdest; ! 6134: rtx assign; ! 6135: HOST_WIDE_INT c1; ! 6136: int pos, len; ! 6137: rtx other; ! 6138: enum machine_mode mode; ! 6139: ! 6140: /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is ! 6141: a clear of a one-bit field. We will have changed it to ! 6142: (and (rotate (const_int -2) POS) DEST), so check for that. Also check ! 6143: for a SUBREG. */ ! 6144: ! 6145: if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE ! 6146: && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT ! 6147: && INTVAL (XEXP (XEXP (src, 0), 0)) == -2 ! 6148: && (rtx_equal_p (dest, XEXP (src, 1)) ! 6149: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) ! 6150: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) ! 6151: { ! 6152: assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), ! 6153: 1, 1, 1, 0); ! 6154: return gen_rtx (SET, VOIDmode, assign, const0_rtx); ! 6155: } ! 6156: ! 6157: else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG ! 6158: && subreg_lowpart_p (XEXP (src, 0)) ! 6159: && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) ! 6160: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0))))) ! 6161: && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE ! 6162: && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2 ! 6163: && (rtx_equal_p (dest, XEXP (src, 1)) ! 6164: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) ! 6165: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) ! 6166: { ! 6167: assign = make_extraction (VOIDmode, dest, 0, ! 6168: XEXP (SUBREG_REG (XEXP (src, 0)), 1), ! 6169: 1, 1, 1, 0); ! 6170: return gen_rtx (SET, VOIDmode, assign, const0_rtx); ! 6171: } ! 6172: ! 6173: /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a ! 6174: one-bit field. */ ! 6175: else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT ! 6176: && XEXP (XEXP (src, 0), 0) == const1_rtx ! 6177: && (rtx_equal_p (dest, XEXP (src, 1)) ! 6178: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) ! 6179: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) ! 6180: { ! 6181: assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), ! 6182: 1, 1, 1, 0); ! 6183: return gen_rtx (SET, VOIDmode, assign, const1_rtx); ! 6184: } ! 6185: ! 6186: /* The other case we handle is assignments into a constant-position ! 6187: field. They look like (ior (and DEST C1) OTHER). If C1 represents ! 6188: a mask that has all one bits except for a group of zero bits and ! 6189: OTHER is known to have zeros where C1 has ones, this is such an ! 6190: assignment. Compute the position and length from C1. Shift OTHER ! 6191: to the appropriate position, force it to the required mode, and ! 6192: make the extraction. Check for the AND in both operands. */ ! 6193: ! 6194: if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == AND ! 6195: && GET_CODE (XEXP (XEXP (src, 0), 1)) == CONST_INT ! 6196: && (rtx_equal_p (XEXP (XEXP (src, 0), 0), dest) ! 6197: || rtx_equal_p (XEXP (XEXP (src, 0), 0), get_last_value (dest)) ! 6198: || rtx_equal_p (get_last_value (XEXP (XEXP (src, 0), 1)), dest))) ! 6199: c1 = INTVAL (XEXP (XEXP (src, 0), 1)), other = XEXP (src, 1); ! 6200: else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 1)) == AND ! 6201: && GET_CODE (XEXP (XEXP (src, 1), 1)) == CONST_INT ! 6202: && (rtx_equal_p (XEXP (XEXP (src, 1), 0), dest) ! 6203: || rtx_equal_p (XEXP (XEXP (src, 1), 0), get_last_value (dest)) ! 6204: || rtx_equal_p (get_last_value (XEXP (XEXP (src, 1), 0)), ! 6205: dest))) ! 6206: c1 = INTVAL (XEXP (XEXP (src, 1), 1)), other = XEXP (src, 0); ! 6207: else ! 6208: return x; ! 6209: ! 6210: pos = get_pos_from_mask (c1 ^ GET_MODE_MASK (GET_MODE (dest)), &len); ! 6211: if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest)) ! 6212: || (GET_MODE_BITSIZE (GET_MODE (other)) <= HOST_BITS_PER_WIDE_INT ! 6213: && (c1 & nonzero_bits (other, GET_MODE (other))) != 0)) ! 6214: return x; ! 6215: ! 6216: assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0); ! 6217: ! 6218: /* The mode to use for the source is the mode of the assignment, or of ! 6219: what is inside a possible STRICT_LOW_PART. */ ! 6220: mode = (GET_CODE (assign) == STRICT_LOW_PART ! 6221: ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign)); ! 6222: ! 6223: /* Shift OTHER right POS places and make it the source, restricting it ! 6224: to the proper length and mode. */ ! 6225: ! 6226: src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT, ! 6227: GET_MODE (src), other, pos), ! 6228: mode, ! 6229: GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT ! 6230: ? GET_MODE_MASK (mode) ! 6231: : ((HOST_WIDE_INT) 1 << len) - 1, ! 6232: dest, 0); ! 6233: ! 6234: return gen_rtx_combine (SET, VOIDmode, assign, src); ! 6235: } ! 6236: ! 6237: /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c) ! 6238: if so. */ ! 6239: ! 6240: static rtx ! 6241: apply_distributive_law (x) ! 6242: rtx x; ! 6243: { ! 6244: enum rtx_code code = GET_CODE (x); ! 6245: rtx lhs, rhs, other; ! 6246: rtx tem; ! 6247: enum rtx_code inner_code; ! 6248: ! 6249: /* Distributivity is not true for floating point. ! 6250: It can change the value. So don't do it. ! 6251: -- rms and [email protected]. */ ! 6252: if (FLOAT_MODE_P (GET_MODE (x))) ! 6253: return x; ! 6254: ! 6255: /* The outer operation can only be one of the following: */ ! 6256: if (code != IOR && code != AND && code != XOR ! 6257: && code != PLUS && code != MINUS) ! 6258: return x; ! 6259: ! 6260: lhs = XEXP (x, 0), rhs = XEXP (x, 1); ! 6261: ! 6262: /* If either operand is a primitive we can't do anything, so get out fast. */ ! 6263: if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o' ! 6264: || GET_RTX_CLASS (GET_CODE (rhs)) == 'o') ! 6265: return x; ! 6266: ! 6267: lhs = expand_compound_operation (lhs); ! 6268: rhs = expand_compound_operation (rhs); ! 6269: inner_code = GET_CODE (lhs); ! 6270: if (inner_code != GET_CODE (rhs)) ! 6271: return x; ! 6272: ! 6273: /* See if the inner and outer operations distribute. */ ! 6274: switch (inner_code) ! 6275: { ! 6276: case LSHIFTRT: ! 6277: case ASHIFTRT: ! 6278: case AND: ! 6279: case IOR: ! 6280: /* These all distribute except over PLUS. */ ! 6281: if (code == PLUS || code == MINUS) ! 6282: return x; ! 6283: break; ! 6284: ! 6285: case MULT: ! 6286: if (code != PLUS && code != MINUS) ! 6287: return x; ! 6288: break; ! 6289: ! 6290: case ASHIFT: ! 6291: case LSHIFT: ! 6292: /* These are also multiplies, so they distribute over everything. */ ! 6293: break; ! 6294: ! 6295: case SUBREG: ! 6296: /* Non-paradoxical SUBREGs distributes over all operations, provided ! 6297: the inner modes and word numbers are the same, this is an extraction ! 6298: of a low-order part, we don't convert an fp operation to int or ! 6299: vice versa, and we would not be converting a single-word ! 6300: operation into a multi-word operation. The latter test is not ! 6301: required, but it prevents generating unneeded multi-word operations. ! 6302: Some of the previous tests are redundant given the latter test, but ! 6303: are retained because they are required for correctness. ! 6304: ! 6305: We produce the result slightly differently in this case. */ ! 6306: ! 6307: if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs)) ! 6308: || SUBREG_WORD (lhs) != SUBREG_WORD (rhs) ! 6309: || ! subreg_lowpart_p (lhs) ! 6310: || (GET_MODE_CLASS (GET_MODE (lhs)) ! 6311: != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs)))) ! 6312: || (GET_MODE_SIZE (GET_MODE (lhs)) ! 6313: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs)))) ! 6314: || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD) ! 6315: return x; ! 6316: ! 6317: tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)), ! 6318: SUBREG_REG (lhs), SUBREG_REG (rhs)); ! 6319: return gen_lowpart_for_combine (GET_MODE (x), tem); ! 6320: ! 6321: default: ! 6322: return x; ! 6323: } ! 6324: ! 6325: /* Set LHS and RHS to the inner operands (A and B in the example ! 6326: above) and set OTHER to the common operand (C in the example). ! 6327: These is only one way to do this unless the inner operation is ! 6328: commutative. */ ! 6329: if (GET_RTX_CLASS (inner_code) == 'c' ! 6330: && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0))) ! 6331: other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1); ! 6332: else if (GET_RTX_CLASS (inner_code) == 'c' ! 6333: && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1))) ! 6334: other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0); ! 6335: else if (GET_RTX_CLASS (inner_code) == 'c' ! 6336: && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0))) ! 6337: other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1); ! 6338: else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1))) ! 6339: other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0); ! 6340: else ! 6341: return x; ! 6342: ! 6343: /* Form the new inner operation, seeing if it simplifies first. */ ! 6344: tem = gen_binary (code, GET_MODE (x), lhs, rhs); ! 6345: ! 6346: /* There is one exception to the general way of distributing: ! 6347: (a ^ b) | (a ^ c) -> (~a) & (b ^ c) */ ! 6348: if (code == XOR && inner_code == IOR) ! 6349: { ! 6350: inner_code = AND; ! 6351: other = gen_unary (NOT, GET_MODE (x), other); ! 6352: } ! 6353: ! 6354: /* We may be able to continuing distributing the result, so call ! 6355: ourselves recursively on the inner operation before forming the ! 6356: outer operation, which we return. */ ! 6357: return gen_binary (inner_code, GET_MODE (x), ! 6358: apply_distributive_law (tem), other); ! 6359: } ! 6360: ! 6361: /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done ! 6362: in MODE. ! 6363: ! 6364: Return an equivalent form, if different from X. Otherwise, return X. If ! 6365: X is zero, we are to always construct the equivalent form. */ ! 6366: ! 6367: static rtx ! 6368: simplify_and_const_int (x, mode, varop, constop) ! 6369: rtx x; ! 6370: enum machine_mode mode; ! 6371: rtx varop; ! 6372: unsigned HOST_WIDE_INT constop; ! 6373: { ! 6374: register enum machine_mode tmode; ! 6375: register rtx temp; ! 6376: unsigned HOST_WIDE_INT nonzero; ! 6377: int i; ! 6378: ! 6379: /* Simplify VAROP knowing that we will be only looking at some of the ! 6380: bits in it. */ ! 6381: varop = force_to_mode (varop, mode, constop, NULL_RTX, 0); ! 6382: ! 6383: /* If VAROP is a CLOBBER, we will fail so return it; if it is a ! 6384: CONST_INT, we are done. */ ! 6385: if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT) ! 6386: return varop; ! 6387: ! 6388: /* See what bits may be nonzero in VAROP. Unlike the general case of ! 6389: a call to nonzero_bits, here we don't care about bits outside ! 6390: MODE. */ ! 6391: ! 6392: nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode); ! 6393: ! 6394: /* Turn off all bits in the constant that are known to already be zero. ! 6395: Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS ! 6396: which is tested below. */ ! 6397: ! 6398: constop &= nonzero; ! 6399: ! 6400: /* If we don't have any bits left, return zero. */ ! 6401: if (constop == 0) ! 6402: return const0_rtx; ! 6403: ! 6404: /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is ! 6405: a power of two, we can replace this with a ASHIFT. */ ! 6406: if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1 ! 6407: && (i = exact_log2 (constop)) >= 0) ! 6408: return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i); ! 6409: ! 6410: /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR ! 6411: or XOR, then try to apply the distributive law. This may eliminate ! 6412: operations if either branch can be simplified because of the AND. ! 6413: It may also make some cases more complex, but those cases probably ! 6414: won't match a pattern either with or without this. */ ! 6415: ! 6416: if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR) ! 6417: return ! 6418: gen_lowpart_for_combine ! 6419: (mode, ! 6420: apply_distributive_law ! 6421: (gen_binary (GET_CODE (varop), GET_MODE (varop), ! 6422: simplify_and_const_int (NULL_RTX, GET_MODE (varop), ! 6423: XEXP (varop, 0), constop), ! 6424: simplify_and_const_int (NULL_RTX, GET_MODE (varop), ! 6425: XEXP (varop, 1), constop)))); ! 6426: ! 6427: /* Get VAROP in MODE. Try to get a SUBREG if not. Don't make a new SUBREG ! 6428: if we already had one (just check for the simplest cases). */ ! 6429: if (x && GET_CODE (XEXP (x, 0)) == SUBREG ! 6430: && GET_MODE (XEXP (x, 0)) == mode ! 6431: && SUBREG_REG (XEXP (x, 0)) == varop) ! 6432: varop = XEXP (x, 0); ! 6433: else ! 6434: varop = gen_lowpart_for_combine (mode, varop); ! 6435: ! 6436: /* If we can't make the SUBREG, try to return what we were given. */ ! 6437: if (GET_CODE (varop) == CLOBBER) ! 6438: return x ? x : varop; ! 6439: ! 6440: /* If we are only masking insignificant bits, return VAROP. */ ! 6441: if (constop == nonzero) ! 6442: x = varop; ! 6443: ! 6444: /* Otherwise, return an AND. See how much, if any, of X we can use. */ ! 6445: else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode) ! 6446: x = gen_binary (AND, mode, varop, GEN_INT (constop)); ! 6447: ! 6448: else ! 6449: { ! 6450: if (GET_CODE (XEXP (x, 1)) != CONST_INT ! 6451: || INTVAL (XEXP (x, 1)) != constop) ! 6452: SUBST (XEXP (x, 1), GEN_INT (constop)); ! 6453: ! 6454: SUBST (XEXP (x, 0), varop); ! 6455: } ! 6456: ! 6457: return x; ! 6458: } ! 6459: ! 6460: /* Given an expression, X, compute which bits in X can be non-zero. ! 6461: We don't care about bits outside of those defined in MODE. ! 6462: ! 6463: For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is ! 6464: a shift, AND, or zero_extract, we can do better. */ ! 6465: ! 6466: static unsigned HOST_WIDE_INT ! 6467: nonzero_bits (x, mode) ! 6468: rtx x; ! 6469: enum machine_mode mode; ! 6470: { ! 6471: unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode); ! 6472: unsigned HOST_WIDE_INT inner_nz; ! 6473: enum rtx_code code; ! 6474: int mode_width = GET_MODE_BITSIZE (mode); ! 6475: rtx tem; ! 6476: ! 6477: /* If X is wider than MODE, use its mode instead. */ ! 6478: if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width) ! 6479: { ! 6480: mode = GET_MODE (x); ! 6481: nonzero = GET_MODE_MASK (mode); ! 6482: mode_width = GET_MODE_BITSIZE (mode); ! 6483: } ! 6484: ! 6485: if (mode_width > HOST_BITS_PER_WIDE_INT) ! 6486: /* Our only callers in this case look for single bit values. So ! 6487: just return the mode mask. Those tests will then be false. */ ! 6488: return nonzero; ! 6489: ! 6490: #ifndef WORD_REGISTER_OPERATIONS ! 6491: /* If MODE is wider than X, but both are a single word for both the host ! 6492: and target machines, we can compute this from which bits of the ! 6493: object might be nonzero in its own mode, taking into account the fact ! 6494: that on many CISC machines, accessing an object in a wider mode ! 6495: causes the high-order bits to become undefined. So they are ! 6496: not known to be zero. */ ! 6497: ! 6498: if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode ! 6499: && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD ! 6500: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT ! 6501: && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x))) ! 6502: { ! 6503: nonzero &= nonzero_bits (x, GET_MODE (x)); ! 6504: nonzero |= GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)); ! 6505: return nonzero; ! 6506: } ! 6507: #endif ! 6508: ! 6509: code = GET_CODE (x); ! 6510: switch (code) ! 6511: { ! 6512: case REG: ! 6513: #ifdef STACK_BOUNDARY ! 6514: /* If this is the stack pointer, we may know something about its ! 6515: alignment. If PUSH_ROUNDING is defined, it is possible for the ! 6516: stack to be momentarily aligned only to that amount, so we pick ! 6517: the least alignment. */ ! 6518: ! 6519: if (x == stack_pointer_rtx) ! 6520: { ! 6521: int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT; ! 6522: ! 6523: #ifdef PUSH_ROUNDING ! 6524: sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment); ! 6525: #endif ! 6526: ! 6527: return nonzero & ~ (sp_alignment - 1); ! 6528: } ! 6529: #endif ! 6530: ! 6531: /* If X is a register whose nonzero bits value is current, use it. ! 6532: Otherwise, if X is a register whose value we can find, use that ! 6533: value. Otherwise, use the previously-computed global nonzero bits ! 6534: for this register. */ ! 6535: ! 6536: if (reg_last_set_value[REGNO (x)] != 0 ! 6537: && reg_last_set_mode[REGNO (x)] == mode ! 6538: && (reg_n_sets[REGNO (x)] == 1 ! 6539: || reg_last_set_label[REGNO (x)] == label_tick) ! 6540: && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) ! 6541: return reg_last_set_nonzero_bits[REGNO (x)]; ! 6542: ! 6543: tem = get_last_value (x); ! 6544: ! 6545: if (tem) ! 6546: { ! 6547: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND ! 6548: /* If X is narrower than MODE and TEM is a non-negative ! 6549: constant that would appear negative in the mode of X, ! 6550: sign-extend it for use in reg_nonzero_bits because some ! 6551: machines (maybe most) will actually do the sign-extension ! 6552: and this is the conservative approach. ! 6553: ! 6554: ??? For 2.5, try to tighten up the MD files in this regard ! 6555: instead of this kludge. */ ! 6556: ! 6557: if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width ! 6558: && GET_CODE (tem) == CONST_INT ! 6559: && INTVAL (tem) > 0 ! 6560: && 0 != (INTVAL (tem) ! 6561: & ((HOST_WIDE_INT) 1 ! 6562: << GET_MODE_BITSIZE (GET_MODE (x))))) ! 6563: tem = GEN_INT (INTVAL (tem) ! 6564: | ((HOST_WIDE_INT) (-1) ! 6565: << GET_MODE_BITSIZE (GET_MODE (x)))); ! 6566: #endif ! 6567: return nonzero_bits (tem, mode); ! 6568: } ! 6569: else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)]) ! 6570: return reg_nonzero_bits[REGNO (x)] & nonzero; ! 6571: else ! 6572: return nonzero; ! 6573: ! 6574: case CONST_INT: ! 6575: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND ! 6576: /* If X is negative in MODE, sign-extend the value. */ ! 6577: if (INTVAL (x) > 0 ! 6578: && 0 != (INTVAL (x) ! 6579: & ((HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (GET_MODE (x))))) ! 6580: return (INTVAL (x) ! 6581: | ((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (GET_MODE (x)))); ! 6582: #endif ! 6583: ! 6584: return INTVAL (x); ! 6585: ! 6586: case MEM: ! 6587: #ifdef LOAD_EXTEND_OP ! 6588: /* In many, if not most, RISC machines, reading a byte from memory ! 6589: zeros the rest of the register. Noticing that fact saves a lot ! 6590: of extra zero-extends. */ ! 6591: if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND) ! 6592: nonzero &= GET_MODE_MASK (GET_MODE (x)); ! 6593: #endif ! 6594: break; ! 6595: ! 6596: case EQ: case NE: ! 6597: case GT: case GTU: ! 6598: case LT: case LTU: ! 6599: case GE: case GEU: ! 6600: case LE: case LEU: ! 6601: ! 6602: /* If this produces an integer result, we know which bits are set. ! 6603: Code here used to clear bits outside the mode of X, but that is ! 6604: now done above. */ ! 6605: ! 6606: if (GET_MODE_CLASS (mode) == MODE_INT ! 6607: && mode_width <= HOST_BITS_PER_WIDE_INT) ! 6608: nonzero = STORE_FLAG_VALUE; ! 6609: break; ! 6610: ! 6611: case NEG: ! 6612: if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x)) ! 6613: == GET_MODE_BITSIZE (GET_MODE (x))) ! 6614: nonzero = 1; ! 6615: ! 6616: if (GET_MODE_SIZE (GET_MODE (x)) < mode_width) ! 6617: nonzero |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x))); ! 6618: break; ! 6619: ! 6620: case ABS: ! 6621: if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x)) ! 6622: == GET_MODE_BITSIZE (GET_MODE (x))) ! 6623: nonzero = 1; ! 6624: break; ! 6625: ! 6626: case TRUNCATE: ! 6627: nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode)); ! 6628: break; ! 6629: ! 6630: case ZERO_EXTEND: ! 6631: nonzero &= nonzero_bits (XEXP (x, 0), mode); ! 6632: if (GET_MODE (XEXP (x, 0)) != VOIDmode) ! 6633: nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0))); ! 6634: break; ! 6635: ! 6636: case SIGN_EXTEND: ! 6637: /* If the sign bit is known clear, this is the same as ZERO_EXTEND. ! 6638: Otherwise, show all the bits in the outer mode but not the inner ! 6639: may be non-zero. */ ! 6640: inner_nz = nonzero_bits (XEXP (x, 0), mode); ! 6641: if (GET_MODE (XEXP (x, 0)) != VOIDmode) ! 6642: { ! 6643: inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0))); ! 6644: if (inner_nz & ! 6645: (((HOST_WIDE_INT) 1 ! 6646: << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))) ! 6647: inner_nz |= (GET_MODE_MASK (mode) ! 6648: & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))); ! 6649: } ! 6650: ! 6651: nonzero &= inner_nz; ! 6652: break; ! 6653: ! 6654: case AND: ! 6655: nonzero &= (nonzero_bits (XEXP (x, 0), mode) ! 6656: & nonzero_bits (XEXP (x, 1), mode)); ! 6657: break; ! 6658: ! 6659: case XOR: case IOR: ! 6660: case UMIN: case UMAX: case SMIN: case SMAX: ! 6661: nonzero &= (nonzero_bits (XEXP (x, 0), mode) ! 6662: | nonzero_bits (XEXP (x, 1), mode)); ! 6663: break; ! 6664: ! 6665: case PLUS: case MINUS: ! 6666: case MULT: ! 6667: case DIV: case UDIV: ! 6668: case MOD: case UMOD: ! 6669: /* We can apply the rules of arithmetic to compute the number of ! 6670: high- and low-order zero bits of these operations. We start by ! 6671: computing the width (position of the highest-order non-zero bit) ! 6672: and the number of low-order zero bits for each value. */ ! 6673: { ! 6674: unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode); ! 6675: unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode); ! 6676: int width0 = floor_log2 (nz0) + 1; ! 6677: int width1 = floor_log2 (nz1) + 1; ! 6678: int low0 = floor_log2 (nz0 & -nz0); ! 6679: int low1 = floor_log2 (nz1 & -nz1); ! 6680: int op0_maybe_minusp = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); ! 6681: int op1_maybe_minusp = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); ! 6682: int result_width = mode_width; ! 6683: int result_low = 0; ! 6684: ! 6685: switch (code) ! 6686: { ! 6687: case PLUS: ! 6688: result_width = MAX (width0, width1) + 1; ! 6689: result_low = MIN (low0, low1); ! 6690: break; ! 6691: case MINUS: ! 6692: result_low = MIN (low0, low1); ! 6693: break; ! 6694: case MULT: ! 6695: result_width = width0 + width1; ! 6696: result_low = low0 + low1; ! 6697: break; ! 6698: case DIV: ! 6699: if (! op0_maybe_minusp && ! op1_maybe_minusp) ! 6700: result_width = width0; ! 6701: break; ! 6702: case UDIV: ! 6703: result_width = width0; ! 6704: break; ! 6705: case MOD: ! 6706: if (! op0_maybe_minusp && ! op1_maybe_minusp) ! 6707: result_width = MIN (width0, width1); ! 6708: result_low = MIN (low0, low1); ! 6709: break; ! 6710: case UMOD: ! 6711: result_width = MIN (width0, width1); ! 6712: result_low = MIN (low0, low1); ! 6713: break; ! 6714: } ! 6715: ! 6716: if (result_width < mode_width) ! 6717: nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1; ! 6718: ! 6719: if (result_low > 0) ! 6720: nonzero &= ~ (((HOST_WIDE_INT) 1 << result_low) - 1); ! 6721: } ! 6722: break; ! 6723: ! 6724: case ZERO_EXTRACT: ! 6725: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 6726: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) ! 6727: nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1; ! 6728: break; ! 6729: ! 6730: case SUBREG: ! 6731: /* If this is a SUBREG formed for a promoted variable that has ! 6732: been zero-extended, we know that at least the high-order bits ! 6733: are zero, though others might be too. */ ! 6734: ! 6735: if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x)) ! 6736: nonzero = (GET_MODE_MASK (GET_MODE (x)) ! 6737: & nonzero_bits (SUBREG_REG (x), GET_MODE (x))); ! 6738: ! 6739: /* If the inner mode is a single word for both the host and target ! 6740: machines, we can compute this from which bits of the inner ! 6741: object might be nonzero. */ ! 6742: if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD ! 6743: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) ! 6744: <= HOST_BITS_PER_WIDE_INT)) ! 6745: { ! 6746: nonzero &= nonzero_bits (SUBREG_REG (x), mode); ! 6747: ! 6748: #ifndef WORD_REGISTER_OPERATIONS ! 6749: /* On many CISC machines, accessing an object in a wider mode ! 6750: causes the high-order bits to become undefined. So they are ! 6751: not known to be zero. */ ! 6752: if (GET_MODE_SIZE (GET_MODE (x)) ! 6753: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 6754: nonzero |= (GET_MODE_MASK (GET_MODE (x)) ! 6755: & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))); ! 6756: #endif ! 6757: } ! 6758: break; ! 6759: ! 6760: case ASHIFTRT: ! 6761: case LSHIFTRT: ! 6762: case ASHIFT: ! 6763: case LSHIFT: ! 6764: case ROTATE: ! 6765: /* The nonzero bits are in two classes: any bits within MODE ! 6766: that aren't in GET_MODE (x) are always significant. The rest of the ! 6767: nonzero bits are those that are significant in the operand of ! 6768: the shift when shifted the appropriate number of bits. This ! 6769: shows that high-order bits are cleared by the right shift and ! 6770: low-order bits by left shifts. */ ! 6771: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 6772: && INTVAL (XEXP (x, 1)) >= 0 ! 6773: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) ! 6774: { ! 6775: enum machine_mode inner_mode = GET_MODE (x); ! 6776: int width = GET_MODE_BITSIZE (inner_mode); ! 6777: int count = INTVAL (XEXP (x, 1)); ! 6778: unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode); ! 6779: unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode); ! 6780: unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask; ! 6781: unsigned HOST_WIDE_INT outer = 0; ! 6782: ! 6783: if (mode_width > width) ! 6784: outer = (op_nonzero & nonzero & ~ mode_mask); ! 6785: ! 6786: if (code == LSHIFTRT) ! 6787: inner >>= count; ! 6788: else if (code == ASHIFTRT) ! 6789: { ! 6790: inner >>= count; ! 6791: ! 6792: /* If the sign bit may have been nonzero before the shift, we ! 6793: need to mark all the places it could have been copied to ! 6794: by the shift as possibly nonzero. */ ! 6795: if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count))) ! 6796: inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count); ! 6797: } ! 6798: else if (code == LSHIFT || code == ASHIFT) ! 6799: inner <<= count; ! 6800: else ! 6801: inner = ((inner << (count % width) ! 6802: | (inner >> (width - (count % width)))) & mode_mask); ! 6803: ! 6804: nonzero &= (outer | inner); ! 6805: } ! 6806: break; ! 6807: ! 6808: case FFS: ! 6809: /* This is at most the number of bits in the mode. */ ! 6810: nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1; ! 6811: break; ! 6812: ! 6813: case IF_THEN_ELSE: ! 6814: nonzero &= (nonzero_bits (XEXP (x, 1), mode) ! 6815: | nonzero_bits (XEXP (x, 2), mode)); ! 6816: break; ! 6817: } ! 6818: ! 6819: return nonzero; ! 6820: } ! 6821: ! 6822: /* Return the number of bits at the high-order end of X that are known to ! 6823: be equal to the sign bit. X will be used in mode MODE; if MODE is ! 6824: VOIDmode, X will be used in its own mode. The returned value will always ! 6825: be between 1 and the number of bits in MODE. */ ! 6826: ! 6827: static int ! 6828: num_sign_bit_copies (x, mode) ! 6829: rtx x; ! 6830: enum machine_mode mode; ! 6831: { ! 6832: enum rtx_code code = GET_CODE (x); ! 6833: int bitwidth; ! 6834: int num0, num1, result; ! 6835: unsigned HOST_WIDE_INT nonzero; ! 6836: rtx tem; ! 6837: ! 6838: /* If we weren't given a mode, use the mode of X. If the mode is still ! 6839: VOIDmode, we don't know anything. */ ! 6840: ! 6841: if (mode == VOIDmode) ! 6842: mode = GET_MODE (x); ! 6843: ! 6844: if (mode == VOIDmode) ! 6845: return 1; ! 6846: ! 6847: bitwidth = GET_MODE_BITSIZE (mode); ! 6848: ! 6849: /* For a smaller object, just ignore the high bits. */ ! 6850: if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x))) ! 6851: return MAX (1, (num_sign_bit_copies (x, GET_MODE (x)) ! 6852: - (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth))); ! 6853: ! 6854: switch (code) ! 6855: { ! 6856: case REG: ! 6857: ! 6858: if (reg_last_set_value[REGNO (x)] != 0 ! 6859: && reg_last_set_mode[REGNO (x)] == mode ! 6860: && (reg_n_sets[REGNO (x)] == 1 ! 6861: || reg_last_set_label[REGNO (x)] == label_tick) ! 6862: && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) ! 6863: return reg_last_set_sign_bit_copies[REGNO (x)]; ! 6864: ! 6865: tem = get_last_value (x); ! 6866: if (tem != 0) ! 6867: return num_sign_bit_copies (tem, mode); ! 6868: ! 6869: if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0) ! 6870: return reg_sign_bit_copies[REGNO (x)]; ! 6871: break; ! 6872: ! 6873: case MEM: ! 6874: #ifdef LOAD_EXTEND_OP ! 6875: /* Some RISC machines sign-extend all loads of smaller than a word. */ ! 6876: if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND) ! 6877: return MAX (1, bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1); ! 6878: #endif ! 6879: break; ! 6880: ! 6881: case CONST_INT: ! 6882: /* If the constant is negative, take its 1's complement and remask. ! 6883: Then see how many zero bits we have. */ ! 6884: nonzero = INTVAL (x) & GET_MODE_MASK (mode); ! 6885: if (bitwidth <= HOST_BITS_PER_WIDE_INT ! 6886: && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) ! 6887: nonzero = (~ nonzero) & GET_MODE_MASK (mode); ! 6888: ! 6889: return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1); ! 6890: ! 6891: case SUBREG: ! 6892: /* If this is a SUBREG for a promoted object that is sign-extended ! 6893: and we are looking at it in a wider mode, we know that at least the ! 6894: high-order bits are known to be sign bit copies. */ ! 6895: ! 6896: if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x)) ! 6897: return MAX (bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1, ! 6898: num_sign_bit_copies (SUBREG_REG (x), mode)); ! 6899: ! 6900: /* For a smaller object, just ignore the high bits. */ ! 6901: if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))) ! 6902: { ! 6903: num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode); ! 6904: return MAX (1, (num0 ! 6905: - (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) ! 6906: - bitwidth))); ! 6907: } ! 6908: ! 6909: #ifdef WORD_REGISTER_OPERATIONS ! 6910: /* For paradoxical SUBREGs on machines where all register operations ! 6911: affect the entire register, just look inside. Note that we are ! 6912: passing MODE to the recursive call, so the number of sign bit copies ! 6913: will remain relative to that mode, not the inner mode. */ ! 6914: ! 6915: if (GET_MODE_SIZE (GET_MODE (x)) ! 6916: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 6917: return num_sign_bit_copies (SUBREG_REG (x), mode); ! 6918: #endif ! 6919: break; ! 6920: ! 6921: case SIGN_EXTRACT: ! 6922: if (GET_CODE (XEXP (x, 1)) == CONST_INT) ! 6923: return MAX (1, bitwidth - INTVAL (XEXP (x, 1))); ! 6924: break; ! 6925: ! 6926: case SIGN_EXTEND: ! 6927: return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) ! 6928: + num_sign_bit_copies (XEXP (x, 0), VOIDmode)); ! 6929: ! 6930: case TRUNCATE: ! 6931: /* For a smaller object, just ignore the high bits. */ ! 6932: num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode); ! 6933: return MAX (1, (num0 - (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) ! 6934: - bitwidth))); ! 6935: ! 6936: case NOT: ! 6937: return num_sign_bit_copies (XEXP (x, 0), mode); ! 6938: ! 6939: case ROTATE: case ROTATERT: ! 6940: /* If we are rotating left by a number of bits less than the number ! 6941: of sign bit copies, we can just subtract that amount from the ! 6942: number. */ ! 6943: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 6944: && INTVAL (XEXP (x, 1)) >= 0 && INTVAL (XEXP (x, 1)) < bitwidth) ! 6945: { ! 6946: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 6947: return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1)) ! 6948: : bitwidth - INTVAL (XEXP (x, 1)))); ! 6949: } ! 6950: break; ! 6951: ! 6952: case NEG: ! 6953: /* In general, this subtracts one sign bit copy. But if the value ! 6954: is known to be positive, the number of sign bit copies is the ! 6955: same as that of the input. Finally, if the input has just one bit ! 6956: that might be nonzero, all the bits are copies of the sign bit. */ ! 6957: nonzero = nonzero_bits (XEXP (x, 0), mode); ! 6958: if (nonzero == 1) ! 6959: return bitwidth; ! 6960: ! 6961: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 6962: if (num0 > 1 ! 6963: && bitwidth <= HOST_BITS_PER_WIDE_INT ! 6964: && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero)) ! 6965: num0--; ! 6966: ! 6967: return num0; ! 6968: ! 6969: case IOR: case AND: case XOR: ! 6970: case SMIN: case SMAX: case UMIN: case UMAX: ! 6971: /* Logical operations will preserve the number of sign-bit copies. ! 6972: MIN and MAX operations always return one of the operands. */ ! 6973: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 6974: num1 = num_sign_bit_copies (XEXP (x, 1), mode); ! 6975: return MIN (num0, num1); ! 6976: ! 6977: case PLUS: case MINUS: ! 6978: /* For addition and subtraction, we can have a 1-bit carry. However, ! 6979: if we are subtracting 1 from a positive number, there will not ! 6980: be such a carry. Furthermore, if the positive number is known to ! 6981: be 0 or 1, we know the result is either -1 or 0. */ ! 6982: ! 6983: if (code == PLUS && XEXP (x, 1) == constm1_rtx ! 6984: && bitwidth <= HOST_BITS_PER_WIDE_INT) ! 6985: { ! 6986: nonzero = nonzero_bits (XEXP (x, 0), mode); ! 6987: if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0) ! 6988: return (nonzero == 1 || nonzero == 0 ? bitwidth ! 6989: : bitwidth - floor_log2 (nonzero) - 1); ! 6990: } ! 6991: ! 6992: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 6993: num1 = num_sign_bit_copies (XEXP (x, 1), mode); ! 6994: return MAX (1, MIN (num0, num1) - 1); ! 6995: ! 6996: case MULT: ! 6997: /* The number of bits of the product is the sum of the number of ! 6998: bits of both terms. However, unless one of the terms if known ! 6999: to be positive, we must allow for an additional bit since negating ! 7000: a negative number can remove one sign bit copy. */ ! 7001: ! 7002: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 7003: num1 = num_sign_bit_copies (XEXP (x, 1), mode); ! 7004: ! 7005: result = bitwidth - (bitwidth - num0) - (bitwidth - num1); ! 7006: if (result > 0 ! 7007: && bitwidth <= HOST_BITS_PER_WIDE_INT ! 7008: && ((nonzero_bits (XEXP (x, 0), mode) ! 7009: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) ! 7010: && (nonzero_bits (XEXP (x, 1), mode) ! 7011: & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) != 0)) ! 7012: result--; ! 7013: ! 7014: return MAX (1, result); ! 7015: ! 7016: case UDIV: ! 7017: /* The result must be <= the first operand. */ ! 7018: return num_sign_bit_copies (XEXP (x, 0), mode); ! 7019: ! 7020: case UMOD: ! 7021: /* The result must be <= the scond operand. */ ! 7022: return num_sign_bit_copies (XEXP (x, 1), mode); ! 7023: ! 7024: case DIV: ! 7025: /* Similar to unsigned division, except that we have to worry about ! 7026: the case where the divisor is negative, in which case we have ! 7027: to add 1. */ ! 7028: result = num_sign_bit_copies (XEXP (x, 0), mode); ! 7029: if (result > 1 ! 7030: && bitwidth <= HOST_BITS_PER_WIDE_INT ! 7031: && (nonzero_bits (XEXP (x, 1), mode) ! 7032: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) ! 7033: result --; ! 7034: ! 7035: return result; ! 7036: ! 7037: case MOD: ! 7038: result = num_sign_bit_copies (XEXP (x, 1), mode); ! 7039: if (result > 1 ! 7040: && bitwidth <= HOST_BITS_PER_WIDE_INT ! 7041: && (nonzero_bits (XEXP (x, 1), mode) ! 7042: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) ! 7043: result --; ! 7044: ! 7045: return result; ! 7046: ! 7047: case ASHIFTRT: ! 7048: /* Shifts by a constant add to the number of bits equal to the ! 7049: sign bit. */ ! 7050: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 7051: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 7052: && INTVAL (XEXP (x, 1)) > 0) ! 7053: num0 = MIN (bitwidth, num0 + INTVAL (XEXP (x, 1))); ! 7054: ! 7055: return num0; ! 7056: ! 7057: case ASHIFT: ! 7058: case LSHIFT: ! 7059: /* Left shifts destroy copies. */ ! 7060: if (GET_CODE (XEXP (x, 1)) != CONST_INT ! 7061: || INTVAL (XEXP (x, 1)) < 0 ! 7062: || INTVAL (XEXP (x, 1)) >= bitwidth) ! 7063: return 1; ! 7064: ! 7065: num0 = num_sign_bit_copies (XEXP (x, 0), mode); ! 7066: return MAX (1, num0 - INTVAL (XEXP (x, 1))); ! 7067: ! 7068: case IF_THEN_ELSE: ! 7069: num0 = num_sign_bit_copies (XEXP (x, 1), mode); ! 7070: num1 = num_sign_bit_copies (XEXP (x, 2), mode); ! 7071: return MIN (num0, num1); ! 7072: ! 7073: #if STORE_FLAG_VALUE == -1 ! 7074: case EQ: case NE: case GE: case GT: case LE: case LT: ! 7075: case GEU: case GTU: case LEU: case LTU: ! 7076: return bitwidth; ! 7077: #endif ! 7078: } ! 7079: ! 7080: /* If we haven't been able to figure it out by one of the above rules, ! 7081: see if some of the high-order bits are known to be zero. If so, ! 7082: count those bits and return one less than that amount. If we can't ! 7083: safely compute the mask for this mode, always return BITWIDTH. */ ! 7084: ! 7085: if (bitwidth > HOST_BITS_PER_WIDE_INT) ! 7086: return 1; ! 7087: ! 7088: nonzero = nonzero_bits (x, mode); ! 7089: return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) ! 7090: ? 1 : bitwidth - floor_log2 (nonzero) - 1); ! 7091: } ! 7092: ! 7093: /* Return the number of "extended" bits there are in X, when interpreted ! 7094: as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For ! 7095: unsigned quantities, this is the number of high-order zero bits. ! 7096: For signed quantities, this is the number of copies of the sign bit ! 7097: minus 1. In both case, this function returns the number of "spare" ! 7098: bits. For example, if two quantities for which this function returns ! 7099: at least 1 are added, the addition is known not to overflow. ! 7100: ! 7101: This function will always return 0 unless called during combine, which ! 7102: implies that it must be called from a define_split. */ ! 7103: ! 7104: int ! 7105: extended_count (x, mode, unsignedp) ! 7106: rtx x; ! 7107: enum machine_mode mode; ! 7108: int unsignedp; ! 7109: { ! 7110: if (nonzero_sign_valid == 0) ! 7111: return 0; ! 7112: ! 7113: return (unsignedp ! 7114: ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT ! 7115: && (GET_MODE_BITSIZE (mode) - 1 ! 7116: - floor_log2 (nonzero_bits (x, mode)))) ! 7117: : num_sign_bit_copies (x, mode) - 1); ! 7118: } ! 7119: ! 7120: /* This function is called from `simplify_shift_const' to merge two ! 7121: outer operations. Specifically, we have already found that we need ! 7122: to perform operation *POP0 with constant *PCONST0 at the outermost ! 7123: position. We would now like to also perform OP1 with constant CONST1 ! 7124: (with *POP0 being done last). ! 7125: ! 7126: Return 1 if we can do the operation and update *POP0 and *PCONST0 with ! 7127: the resulting operation. *PCOMP_P is set to 1 if we would need to ! 7128: complement the innermost operand, otherwise it is unchanged. ! 7129: ! 7130: MODE is the mode in which the operation will be done. No bits outside ! 7131: the width of this mode matter. It is assumed that the width of this mode ! 7132: is smaller than or equal to HOST_BITS_PER_WIDE_INT. ! 7133: ! 7134: If *POP0 or OP1 are NIL, it means no operation is required. Only NEG, PLUS, ! 7135: IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper ! 7136: result is simply *PCONST0. ! 7137: ! 7138: If the resulting operation cannot be expressed as one operation, we ! 7139: return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */ ! 7140: ! 7141: static int ! 7142: merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p) ! 7143: enum rtx_code *pop0; ! 7144: HOST_WIDE_INT *pconst0; ! 7145: enum rtx_code op1; ! 7146: HOST_WIDE_INT const1; ! 7147: enum machine_mode mode; ! 7148: int *pcomp_p; ! 7149: { ! 7150: enum rtx_code op0 = *pop0; ! 7151: HOST_WIDE_INT const0 = *pconst0; ! 7152: ! 7153: const0 &= GET_MODE_MASK (mode); ! 7154: const1 &= GET_MODE_MASK (mode); ! 7155: ! 7156: /* If OP0 is an AND, clear unimportant bits in CONST1. */ ! 7157: if (op0 == AND) ! 7158: const1 &= const0; ! 7159: ! 7160: /* If OP0 or OP1 is NIL, this is easy. Similarly if they are the same or ! 7161: if OP0 is SET. */ ! 7162: ! 7163: if (op1 == NIL || op0 == SET) ! 7164: return 1; ! 7165: ! 7166: else if (op0 == NIL) ! 7167: op0 = op1, const0 = const1; ! 7168: ! 7169: else if (op0 == op1) ! 7170: { ! 7171: switch (op0) ! 7172: { ! 7173: case AND: ! 7174: const0 &= const1; ! 7175: break; ! 7176: case IOR: ! 7177: const0 |= const1; ! 7178: break; ! 7179: case XOR: ! 7180: const0 ^= const1; ! 7181: break; ! 7182: case PLUS: ! 7183: const0 += const1; ! 7184: break; ! 7185: case NEG: ! 7186: op0 = NIL; ! 7187: break; ! 7188: } ! 7189: } ! 7190: ! 7191: /* Otherwise, if either is a PLUS or NEG, we can't do anything. */ ! 7192: else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG) ! 7193: return 0; ! 7194: ! 7195: /* If the two constants aren't the same, we can't do anything. The ! 7196: remaining six cases can all be done. */ ! 7197: else if (const0 != const1) ! 7198: return 0; ! 7199: ! 7200: else ! 7201: switch (op0) ! 7202: { ! 7203: case IOR: ! 7204: if (op1 == AND) ! 7205: /* (a & b) | b == b */ ! 7206: op0 = SET; ! 7207: else /* op1 == XOR */ ! 7208: /* (a ^ b) | b == a | b */ ! 7209: ; ! 7210: break; ! 7211: ! 7212: case XOR: ! 7213: if (op1 == AND) ! 7214: /* (a & b) ^ b == (~a) & b */ ! 7215: op0 = AND, *pcomp_p = 1; ! 7216: else /* op1 == IOR */ ! 7217: /* (a | b) ^ b == a & ~b */ ! 7218: op0 = AND, *pconst0 = ~ const0; ! 7219: break; ! 7220: ! 7221: case AND: ! 7222: if (op1 == IOR) ! 7223: /* (a | b) & b == b */ ! 7224: op0 = SET; ! 7225: else /* op1 == XOR */ ! 7226: /* (a ^ b) & b) == (~a) & b */ ! 7227: *pcomp_p = 1; ! 7228: break; ! 7229: } ! 7230: ! 7231: /* Check for NO-OP cases. */ ! 7232: const0 &= GET_MODE_MASK (mode); ! 7233: if (const0 == 0 ! 7234: && (op0 == IOR || op0 == XOR || op0 == PLUS)) ! 7235: op0 = NIL; ! 7236: else if (const0 == 0 && op0 == AND) ! 7237: op0 = SET; ! 7238: else if (const0 == GET_MODE_MASK (mode) && op0 == AND) ! 7239: op0 = NIL; ! 7240: ! 7241: *pop0 = op0; ! 7242: *pconst0 = const0; ! 7243: ! 7244: return 1; ! 7245: } ! 7246: ! 7247: /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift. ! 7248: The result of the shift is RESULT_MODE. X, if non-zero, is an expression ! 7249: that we started with. ! 7250: ! 7251: The shift is normally computed in the widest mode we find in VAROP, as ! 7252: long as it isn't a different number of words than RESULT_MODE. Exceptions ! 7253: are ASHIFTRT and ROTATE, which are always done in their original mode, */ ! 7254: ! 7255: static rtx ! 7256: simplify_shift_const (x, code, result_mode, varop, count) ! 7257: rtx x; ! 7258: enum rtx_code code; ! 7259: enum machine_mode result_mode; ! 7260: rtx varop; ! 7261: int count; ! 7262: { ! 7263: enum rtx_code orig_code = code; ! 7264: int orig_count = count; ! 7265: enum machine_mode mode = result_mode; ! 7266: enum machine_mode shift_mode, tmode; ! 7267: int mode_words ! 7268: = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD; ! 7269: /* We form (outer_op (code varop count) (outer_const)). */ ! 7270: enum rtx_code outer_op = NIL; ! 7271: HOST_WIDE_INT outer_const = 0; ! 7272: rtx const_rtx; ! 7273: int complement_p = 0; ! 7274: rtx new; ! 7275: ! 7276: /* If we were given an invalid count, don't do anything except exactly ! 7277: what was requested. */ ! 7278: ! 7279: if (count < 0 || count > GET_MODE_BITSIZE (mode)) ! 7280: { ! 7281: if (x) ! 7282: return x; ! 7283: ! 7284: return gen_rtx (code, mode, varop, GEN_INT (count)); ! 7285: } ! 7286: ! 7287: /* Unless one of the branches of the `if' in this loop does a `continue', ! 7288: we will `break' the loop after the `if'. */ ! 7289: ! 7290: while (count != 0) ! 7291: { ! 7292: /* If we have an operand of (clobber (const_int 0)), just return that ! 7293: value. */ ! 7294: if (GET_CODE (varop) == CLOBBER) ! 7295: return varop; ! 7296: ! 7297: /* If we discovered we had to complement VAROP, leave. Making a NOT ! 7298: here would cause an infinite loop. */ ! 7299: if (complement_p) ! 7300: break; ! 7301: ! 7302: /* Convert ROTATETRT to ROTATE. */ ! 7303: if (code == ROTATERT) ! 7304: code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count; ! 7305: ! 7306: /* Canonicalize LSHIFT to ASHIFT. */ ! 7307: if (code == LSHIFT) ! 7308: code = ASHIFT; ! 7309: ! 7310: /* We need to determine what mode we will do the shift in. If the ! 7311: shift is a ASHIFTRT or ROTATE, we must always do it in the mode it ! 7312: was originally done in. Otherwise, we can do it in MODE, the widest ! 7313: mode encountered. */ ! 7314: shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode); ! 7315: ! 7316: /* Handle cases where the count is greater than the size of the mode ! 7317: minus 1. For ASHIFT, use the size minus one as the count (this can ! 7318: occur when simplifying (lshiftrt (ashiftrt ..))). For rotates, ! 7319: take the count modulo the size. For other shifts, the result is ! 7320: zero. ! 7321: ! 7322: Since these shifts are being produced by the compiler by combining ! 7323: multiple operations, each of which are defined, we know what the ! 7324: result is supposed to be. */ ! 7325: ! 7326: if (count > GET_MODE_BITSIZE (shift_mode) - 1) ! 7327: { ! 7328: if (code == ASHIFTRT) ! 7329: count = GET_MODE_BITSIZE (shift_mode) - 1; ! 7330: else if (code == ROTATE || code == ROTATERT) ! 7331: count %= GET_MODE_BITSIZE (shift_mode); ! 7332: else ! 7333: { ! 7334: /* We can't simply return zero because there may be an ! 7335: outer op. */ ! 7336: varop = const0_rtx; ! 7337: count = 0; ! 7338: break; ! 7339: } ! 7340: } ! 7341: ! 7342: /* Negative counts are invalid and should not have been made (a ! 7343: programmer-specified negative count should have been handled ! 7344: above). */ ! 7345: else if (count < 0) ! 7346: abort (); ! 7347: ! 7348: /* An arithmetic right shift of a quantity known to be -1 or 0 ! 7349: is a no-op. */ ! 7350: if (code == ASHIFTRT ! 7351: && (num_sign_bit_copies (varop, shift_mode) ! 7352: == GET_MODE_BITSIZE (shift_mode))) ! 7353: { ! 7354: count = 0; ! 7355: break; ! 7356: } ! 7357: ! 7358: /* If we are doing an arithmetic right shift and discarding all but ! 7359: the sign bit copies, this is equivalent to doing a shift by the ! 7360: bitsize minus one. Convert it into that shift because it will often ! 7361: allow other simplifications. */ ! 7362: ! 7363: if (code == ASHIFTRT ! 7364: && (count + num_sign_bit_copies (varop, shift_mode) ! 7365: >= GET_MODE_BITSIZE (shift_mode))) ! 7366: count = GET_MODE_BITSIZE (shift_mode) - 1; ! 7367: ! 7368: /* We simplify the tests below and elsewhere by converting ! 7369: ASHIFTRT to LSHIFTRT if we know the sign bit is clear. ! 7370: `make_compound_operation' will convert it to a ASHIFTRT for ! 7371: those machines (such as Vax) that don't have a LSHIFTRT. */ ! 7372: if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT ! 7373: && code == ASHIFTRT ! 7374: && ((nonzero_bits (varop, shift_mode) ! 7375: & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1))) ! 7376: == 0)) ! 7377: code = LSHIFTRT; ! 7378: ! 7379: switch (GET_CODE (varop)) ! 7380: { ! 7381: case SIGN_EXTEND: ! 7382: case ZERO_EXTEND: ! 7383: case SIGN_EXTRACT: ! 7384: case ZERO_EXTRACT: ! 7385: new = expand_compound_operation (varop); ! 7386: if (new != varop) ! 7387: { ! 7388: varop = new; ! 7389: continue; ! 7390: } ! 7391: break; ! 7392: ! 7393: case MEM: ! 7394: /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH ! 7395: minus the width of a smaller mode, we can do this with a ! 7396: SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */ ! 7397: if ((code == ASHIFTRT || code == LSHIFTRT) ! 7398: && ! mode_dependent_address_p (XEXP (varop, 0)) ! 7399: && ! MEM_VOLATILE_P (varop) ! 7400: && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count, ! 7401: MODE_INT, 1)) != BLKmode) ! 7402: { ! 7403: #if BYTES_BIG_ENDIAN ! 7404: new = gen_rtx (MEM, tmode, XEXP (varop, 0)); ! 7405: #else ! 7406: new = gen_rtx (MEM, tmode, ! 7407: plus_constant (XEXP (varop, 0), ! 7408: count / BITS_PER_UNIT)); ! 7409: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (varop); ! 7410: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (varop); ! 7411: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (varop); ! 7412: #endif ! 7413: varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND ! 7414: : ZERO_EXTEND, mode, new); ! 7415: count = 0; ! 7416: continue; ! 7417: } ! 7418: break; ! 7419: ! 7420: case USE: ! 7421: /* Similar to the case above, except that we can only do this if ! 7422: the resulting mode is the same as that of the underlying ! 7423: MEM and adjust the address depending on the *bits* endianness ! 7424: because of the way that bit-field extract insns are defined. */ ! 7425: if ((code == ASHIFTRT || code == LSHIFTRT) ! 7426: && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count, ! 7427: MODE_INT, 1)) != BLKmode ! 7428: && tmode == GET_MODE (XEXP (varop, 0))) ! 7429: { ! 7430: #if BITS_BIG_ENDIAN ! 7431: new = XEXP (varop, 0); ! 7432: #else ! 7433: new = copy_rtx (XEXP (varop, 0)); ! 7434: SUBST (XEXP (new, 0), ! 7435: plus_constant (XEXP (new, 0), ! 7436: count / BITS_PER_UNIT)); ! 7437: #endif ! 7438: ! 7439: varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND ! 7440: : ZERO_EXTEND, mode, new); ! 7441: count = 0; ! 7442: continue; ! 7443: } ! 7444: break; ! 7445: ! 7446: case SUBREG: ! 7447: /* If VAROP is a SUBREG, strip it as long as the inner operand has ! 7448: the same number of words as what we've seen so far. Then store ! 7449: the widest mode in MODE. */ ! 7450: if (subreg_lowpart_p (varop) ! 7451: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))) ! 7452: > GET_MODE_SIZE (GET_MODE (varop))) ! 7453: && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))) ! 7454: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) ! 7455: == mode_words)) ! 7456: { ! 7457: varop = SUBREG_REG (varop); ! 7458: if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode)) ! 7459: mode = GET_MODE (varop); ! 7460: continue; ! 7461: } ! 7462: break; ! 7463: ! 7464: case MULT: ! 7465: /* Some machines use MULT instead of ASHIFT because MULT ! 7466: is cheaper. But it is still better on those machines to ! 7467: merge two shifts into one. */ ! 7468: if (GET_CODE (XEXP (varop, 1)) == CONST_INT ! 7469: && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0) ! 7470: { ! 7471: varop = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0), ! 7472: GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));; ! 7473: continue; ! 7474: } ! 7475: break; ! 7476: ! 7477: case UDIV: ! 7478: /* Similar, for when divides are cheaper. */ ! 7479: if (GET_CODE (XEXP (varop, 1)) == CONST_INT ! 7480: && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0) ! 7481: { ! 7482: varop = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0), ! 7483: GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1))))); ! 7484: continue; ! 7485: } ! 7486: break; ! 7487: ! 7488: case ASHIFTRT: ! 7489: /* If we are extracting just the sign bit of an arithmetic right ! 7490: shift, that shift is not needed. */ ! 7491: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1) ! 7492: { ! 7493: varop = XEXP (varop, 0); ! 7494: continue; ! 7495: } ! 7496: ! 7497: /* ... fall through ... */ ! 7498: ! 7499: case LSHIFTRT: ! 7500: case ASHIFT: ! 7501: case LSHIFT: ! 7502: case ROTATE: ! 7503: /* Here we have two nested shifts. The result is usually the ! 7504: AND of a new shift with a mask. We compute the result below. */ ! 7505: if (GET_CODE (XEXP (varop, 1)) == CONST_INT ! 7506: && INTVAL (XEXP (varop, 1)) >= 0 ! 7507: && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop)) ! 7508: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT ! 7509: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) ! 7510: { ! 7511: enum rtx_code first_code = GET_CODE (varop); ! 7512: int first_count = INTVAL (XEXP (varop, 1)); ! 7513: unsigned HOST_WIDE_INT mask; ! 7514: rtx mask_rtx; ! 7515: rtx inner; ! 7516: ! 7517: if (first_code == LSHIFT) ! 7518: first_code = ASHIFT; ! 7519: ! 7520: /* We have one common special case. We can't do any merging if ! 7521: the inner code is an ASHIFTRT of a smaller mode. However, if ! 7522: we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2) ! 7523: with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2), ! 7524: we can convert it to ! 7525: (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1). ! 7526: This simplifies certain SIGN_EXTEND operations. */ ! 7527: if (code == ASHIFT && first_code == ASHIFTRT ! 7528: && (GET_MODE_BITSIZE (result_mode) ! 7529: - GET_MODE_BITSIZE (GET_MODE (varop))) == count) ! 7530: { ! 7531: /* C3 has the low-order C1 bits zero. */ ! 7532: ! 7533: mask = (GET_MODE_MASK (mode) ! 7534: & ~ (((HOST_WIDE_INT) 1 << first_count) - 1)); ! 7535: ! 7536: varop = simplify_and_const_int (NULL_RTX, result_mode, ! 7537: XEXP (varop, 0), mask); ! 7538: varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode, ! 7539: varop, count); ! 7540: count = first_count; ! 7541: code = ASHIFTRT; ! 7542: continue; ! 7543: } ! 7544: ! 7545: /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more ! 7546: than C1 high-order bits equal to the sign bit, we can convert ! 7547: this to either an ASHIFT or a ASHIFTRT depending on the ! 7548: two counts. ! 7549: ! 7550: We cannot do this if VAROP's mode is not SHIFT_MODE. */ ! 7551: ! 7552: if (code == ASHIFTRT && first_code == ASHIFT ! 7553: && GET_MODE (varop) == shift_mode ! 7554: && (num_sign_bit_copies (XEXP (varop, 0), shift_mode) ! 7555: > first_count)) ! 7556: { ! 7557: count -= first_count; ! 7558: if (count < 0) ! 7559: count = - count, code = ASHIFT; ! 7560: varop = XEXP (varop, 0); ! 7561: continue; ! 7562: } ! 7563: ! 7564: /* There are some cases we can't do. If CODE is ASHIFTRT, ! 7565: we can only do this if FIRST_CODE is also ASHIFTRT. ! 7566: ! 7567: We can't do the case when CODE is ROTATE and FIRST_CODE is ! 7568: ASHIFTRT. ! 7569: ! 7570: If the mode of this shift is not the mode of the outer shift, ! 7571: we can't do this if either shift is ASHIFTRT or ROTATE. ! 7572: ! 7573: Finally, we can't do any of these if the mode is too wide ! 7574: unless the codes are the same. ! 7575: ! 7576: Handle the case where the shift codes are the same ! 7577: first. */ ! 7578: ! 7579: if (code == first_code) ! 7580: { ! 7581: if (GET_MODE (varop) != result_mode ! 7582: && (code == ASHIFTRT || code == ROTATE)) ! 7583: break; ! 7584: ! 7585: count += first_count; ! 7586: varop = XEXP (varop, 0); ! 7587: continue; ! 7588: } ! 7589: ! 7590: if (code == ASHIFTRT ! 7591: || (code == ROTATE && first_code == ASHIFTRT) ! 7592: || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT ! 7593: || (GET_MODE (varop) != result_mode ! 7594: && (first_code == ASHIFTRT || first_code == ROTATE ! 7595: || code == ROTATE))) ! 7596: break; ! 7597: ! 7598: /* To compute the mask to apply after the shift, shift the ! 7599: nonzero bits of the inner shift the same way the ! 7600: outer shift will. */ ! 7601: ! 7602: mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop))); ! 7603: ! 7604: mask_rtx ! 7605: = simplify_binary_operation (code, result_mode, mask_rtx, ! 7606: GEN_INT (count)); ! 7607: ! 7608: /* Give up if we can't compute an outer operation to use. */ ! 7609: if (mask_rtx == 0 ! 7610: || GET_CODE (mask_rtx) != CONST_INT ! 7611: || ! merge_outer_ops (&outer_op, &outer_const, AND, ! 7612: INTVAL (mask_rtx), ! 7613: result_mode, &complement_p)) ! 7614: break; ! 7615: ! 7616: /* If the shifts are in the same direction, we add the ! 7617: counts. Otherwise, we subtract them. */ ! 7618: if ((code == ASHIFTRT || code == LSHIFTRT) ! 7619: == (first_code == ASHIFTRT || first_code == LSHIFTRT)) ! 7620: count += first_count; ! 7621: else ! 7622: count -= first_count; ! 7623: ! 7624: /* If COUNT is positive, the new shift is usually CODE, ! 7625: except for the two exceptions below, in which case it is ! 7626: FIRST_CODE. If the count is negative, FIRST_CODE should ! 7627: always be used */ ! 7628: if (count > 0 ! 7629: && ((first_code == ROTATE && code == ASHIFT) ! 7630: || (first_code == ASHIFTRT && code == LSHIFTRT))) ! 7631: code = first_code; ! 7632: else if (count < 0) ! 7633: code = first_code, count = - count; ! 7634: ! 7635: varop = XEXP (varop, 0); ! 7636: continue; ! 7637: } ! 7638: ! 7639: /* If we have (A << B << C) for any shift, we can convert this to ! 7640: (A << C << B). This wins if A is a constant. Only try this if ! 7641: B is not a constant. */ ! 7642: ! 7643: else if (GET_CODE (varop) == code ! 7644: && GET_CODE (XEXP (varop, 1)) != CONST_INT ! 7645: && 0 != (new ! 7646: = simplify_binary_operation (code, mode, ! 7647: XEXP (varop, 0), ! 7648: GEN_INT (count)))) ! 7649: { ! 7650: varop = gen_rtx_combine (code, mode, new, XEXP (varop, 1)); ! 7651: count = 0; ! 7652: continue; ! 7653: } ! 7654: break; ! 7655: ! 7656: case NOT: ! 7657: /* Make this fit the case below. */ ! 7658: varop = gen_rtx_combine (XOR, mode, XEXP (varop, 0), ! 7659: GEN_INT (GET_MODE_MASK (mode))); ! 7660: continue; ! 7661: ! 7662: case IOR: ! 7663: case AND: ! 7664: case XOR: ! 7665: /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C) ! 7666: with C the size of VAROP - 1 and the shift is logical if ! 7667: STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1, ! 7668: we have an (le X 0) operation. If we have an arithmetic shift ! 7669: and STORE_FLAG_VALUE is 1 or we have a logical shift with ! 7670: STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */ ! 7671: ! 7672: if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS ! 7673: && XEXP (XEXP (varop, 0), 1) == constm1_rtx ! 7674: && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1) ! 7675: && (code == LSHIFTRT || code == ASHIFTRT) ! 7676: && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1 ! 7677: && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1))) ! 7678: { ! 7679: count = 0; ! 7680: varop = gen_rtx_combine (LE, GET_MODE (varop), XEXP (varop, 1), ! 7681: const0_rtx); ! 7682: ! 7683: if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT) ! 7684: varop = gen_rtx_combine (NEG, GET_MODE (varop), varop); ! 7685: ! 7686: continue; ! 7687: } ! 7688: ! 7689: /* If we have (shift (logical)), move the logical to the outside ! 7690: to allow it to possibly combine with another logical and the ! 7691: shift to combine with another shift. This also canonicalizes to ! 7692: what a ZERO_EXTRACT looks like. Also, some machines have ! 7693: (and (shift)) insns. */ ! 7694: ! 7695: if (GET_CODE (XEXP (varop, 1)) == CONST_INT ! 7696: && (new = simplify_binary_operation (code, result_mode, ! 7697: XEXP (varop, 1), ! 7698: GEN_INT (count))) != 0 ! 7699: && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop), ! 7700: INTVAL (new), result_mode, &complement_p)) ! 7701: { ! 7702: varop = XEXP (varop, 0); ! 7703: continue; ! 7704: } ! 7705: ! 7706: /* If we can't do that, try to simplify the shift in each arm of the ! 7707: logical expression, make a new logical expression, and apply ! 7708: the inverse distributive law. */ ! 7709: { ! 7710: rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode, ! 7711: XEXP (varop, 0), count); ! 7712: rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode, ! 7713: XEXP (varop, 1), count); ! 7714: ! 7715: varop = gen_binary (GET_CODE (varop), GET_MODE (varop), lhs, rhs); ! 7716: varop = apply_distributive_law (varop); ! 7717: ! 7718: count = 0; ! 7719: } ! 7720: break; ! 7721: ! 7722: case EQ: ! 7723: /* convert (lshift (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE ! 7724: says that the sign bit can be tested, FOO has mode MODE, C is ! 7725: GET_MODE_BITSIZE (MODE) - 1, and FOO has only the low-order bit ! 7726: may be nonzero. */ ! 7727: if (code == LSHIFT ! 7728: && XEXP (varop, 1) == const0_rtx ! 7729: && GET_MODE (XEXP (varop, 0)) == result_mode ! 7730: && count == GET_MODE_BITSIZE (result_mode) - 1 ! 7731: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT ! 7732: && ((STORE_FLAG_VALUE ! 7733: & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1)))) ! 7734: && nonzero_bits (XEXP (varop, 0), result_mode) == 1 ! 7735: && merge_outer_ops (&outer_op, &outer_const, XOR, ! 7736: (HOST_WIDE_INT) 1, result_mode, ! 7737: &complement_p)) ! 7738: { ! 7739: varop = XEXP (varop, 0); ! 7740: count = 0; ! 7741: continue; ! 7742: } ! 7743: break; ! 7744: ! 7745: case NEG: ! 7746: /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less ! 7747: than the number of bits in the mode is equivalent to A. */ ! 7748: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1 ! 7749: && nonzero_bits (XEXP (varop, 0), result_mode) == 1) ! 7750: { ! 7751: varop = XEXP (varop, 0); ! 7752: count = 0; ! 7753: continue; ! 7754: } ! 7755: ! 7756: /* NEG commutes with ASHIFT since it is multiplication. Move the ! 7757: NEG outside to allow shifts to combine. */ ! 7758: if (code == ASHIFT ! 7759: && merge_outer_ops (&outer_op, &outer_const, NEG, ! 7760: (HOST_WIDE_INT) 0, result_mode, ! 7761: &complement_p)) ! 7762: { ! 7763: varop = XEXP (varop, 0); ! 7764: continue; ! 7765: } ! 7766: break; ! 7767: ! 7768: case PLUS: ! 7769: /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C ! 7770: is one less than the number of bits in the mode is ! 7771: equivalent to (xor A 1). */ ! 7772: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1 ! 7773: && XEXP (varop, 1) == constm1_rtx ! 7774: && nonzero_bits (XEXP (varop, 0), result_mode) == 1 ! 7775: && merge_outer_ops (&outer_op, &outer_const, XOR, ! 7776: (HOST_WIDE_INT) 1, result_mode, ! 7777: &complement_p)) ! 7778: { ! 7779: count = 0; ! 7780: varop = XEXP (varop, 0); ! 7781: continue; ! 7782: } ! 7783: ! 7784: /* If we have (xshiftrt (plus FOO BAR) C), and the only bits ! 7785: that might be nonzero in BAR are those being shifted out and those ! 7786: bits are known zero in FOO, we can replace the PLUS with FOO. ! 7787: Similarly in the other operand order. This code occurs when ! 7788: we are computing the size of a variable-size array. */ ! 7789: ! 7790: if ((code == ASHIFTRT || code == LSHIFTRT) ! 7791: && count < HOST_BITS_PER_WIDE_INT ! 7792: && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0 ! 7793: && (nonzero_bits (XEXP (varop, 1), result_mode) ! 7794: & nonzero_bits (XEXP (varop, 0), result_mode)) == 0) ! 7795: { ! 7796: varop = XEXP (varop, 0); ! 7797: continue; ! 7798: } ! 7799: else if ((code == ASHIFTRT || code == LSHIFTRT) ! 7800: && count < HOST_BITS_PER_WIDE_INT ! 7801: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT ! 7802: && 0 == (nonzero_bits (XEXP (varop, 0), result_mode) ! 7803: >> count) ! 7804: && 0 == (nonzero_bits (XEXP (varop, 0), result_mode) ! 7805: & nonzero_bits (XEXP (varop, 1), ! 7806: result_mode))) ! 7807: { ! 7808: varop = XEXP (varop, 1); ! 7809: continue; ! 7810: } ! 7811: ! 7812: /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */ ! 7813: if (code == ASHIFT ! 7814: && GET_CODE (XEXP (varop, 1)) == CONST_INT ! 7815: && (new = simplify_binary_operation (ASHIFT, result_mode, ! 7816: XEXP (varop, 1), ! 7817: GEN_INT (count))) != 0 ! 7818: && merge_outer_ops (&outer_op, &outer_const, PLUS, ! 7819: INTVAL (new), result_mode, &complement_p)) ! 7820: { ! 7821: varop = XEXP (varop, 0); ! 7822: continue; ! 7823: } ! 7824: break; ! 7825: ! 7826: case MINUS: ! 7827: /* If we have (xshiftrt (minus (ashiftrt X C)) X) C) ! 7828: with C the size of VAROP - 1 and the shift is logical if ! 7829: STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1, ! 7830: we have a (gt X 0) operation. If the shift is arithmetic with ! 7831: STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1, ! 7832: we have a (neg (gt X 0)) operation. */ ! 7833: ! 7834: if (GET_CODE (XEXP (varop, 0)) == ASHIFTRT ! 7835: && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1 ! 7836: && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1) ! 7837: && (code == LSHIFTRT || code == ASHIFTRT) ! 7838: && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT ! 7839: && INTVAL (XEXP (XEXP (varop, 0), 1)) == count ! 7840: && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1))) ! 7841: { ! 7842: count = 0; ! 7843: varop = gen_rtx_combine (GT, GET_MODE (varop), XEXP (varop, 1), ! 7844: const0_rtx); ! 7845: ! 7846: if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT) ! 7847: varop = gen_rtx_combine (NEG, GET_MODE (varop), varop); ! 7848: ! 7849: continue; ! 7850: } ! 7851: break; ! 7852: } ! 7853: ! 7854: break; ! 7855: } ! 7856: ! 7857: /* We need to determine what mode to do the shift in. If the shift is ! 7858: a ASHIFTRT or ROTATE, we must always do it in the mode it was originally ! 7859: done in. Otherwise, we can do it in MODE, the widest mode encountered. ! 7860: The code we care about is that of the shift that will actually be done, ! 7861: not the shift that was originally requested. */ ! 7862: shift_mode = (code == ASHIFTRT || code == ROTATE ? result_mode : mode); ! 7863: ! 7864: /* We have now finished analyzing the shift. The result should be ! 7865: a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If ! 7866: OUTER_OP is non-NIL, it is an operation that needs to be applied ! 7867: to the result of the shift. OUTER_CONST is the relevant constant, ! 7868: but we must turn off all bits turned off in the shift. ! 7869: ! 7870: If we were passed a value for X, see if we can use any pieces of ! 7871: it. If not, make new rtx. */ ! 7872: ! 7873: if (x && GET_RTX_CLASS (GET_CODE (x)) == '2' ! 7874: && GET_CODE (XEXP (x, 1)) == CONST_INT ! 7875: && INTVAL (XEXP (x, 1)) == count) ! 7876: const_rtx = XEXP (x, 1); ! 7877: else ! 7878: const_rtx = GEN_INT (count); ! 7879: ! 7880: if (x && GET_CODE (XEXP (x, 0)) == SUBREG ! 7881: && GET_MODE (XEXP (x, 0)) == shift_mode ! 7882: && SUBREG_REG (XEXP (x, 0)) == varop) ! 7883: varop = XEXP (x, 0); ! 7884: else if (GET_MODE (varop) != shift_mode) ! 7885: varop = gen_lowpart_for_combine (shift_mode, varop); ! 7886: ! 7887: /* If we can't make the SUBREG, try to return what we were given. */ ! 7888: if (GET_CODE (varop) == CLOBBER) ! 7889: return x ? x : varop; ! 7890: ! 7891: new = simplify_binary_operation (code, shift_mode, varop, const_rtx); ! 7892: if (new != 0) ! 7893: x = new; ! 7894: else ! 7895: { ! 7896: if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode) ! 7897: x = gen_rtx_combine (code, shift_mode, varop, const_rtx); ! 7898: ! 7899: SUBST (XEXP (x, 0), varop); ! 7900: SUBST (XEXP (x, 1), const_rtx); ! 7901: } ! 7902: ! 7903: /* If we have an outer operation and we just made a shift, it is ! 7904: possible that we could have simplified the shift were it not ! 7905: for the outer operation. So try to do the simplification ! 7906: recursively. */ ! 7907: ! 7908: if (outer_op != NIL && GET_CODE (x) == code ! 7909: && GET_CODE (XEXP (x, 1)) == CONST_INT) ! 7910: x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0), ! 7911: INTVAL (XEXP (x, 1))); ! 7912: ! 7913: /* If we were doing a LSHIFTRT in a wider mode than it was originally, ! 7914: turn off all the bits that the shift would have turned off. */ ! 7915: if (orig_code == LSHIFTRT && result_mode != shift_mode) ! 7916: x = simplify_and_const_int (NULL_RTX, shift_mode, x, ! 7917: GET_MODE_MASK (result_mode) >> orig_count); ! 7918: ! 7919: /* Do the remainder of the processing in RESULT_MODE. */ ! 7920: x = gen_lowpart_for_combine (result_mode, x); ! 7921: ! 7922: /* If COMPLEMENT_P is set, we have to complement X before doing the outer ! 7923: operation. */ ! 7924: if (complement_p) ! 7925: x = gen_unary (NOT, result_mode, x); ! 7926: ! 7927: if (outer_op != NIL) ! 7928: { ! 7929: if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT) ! 7930: outer_const &= GET_MODE_MASK (result_mode); ! 7931: ! 7932: if (outer_op == AND) ! 7933: x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const); ! 7934: else if (outer_op == SET) ! 7935: /* This means that we have determined that the result is ! 7936: equivalent to a constant. This should be rare. */ ! 7937: x = GEN_INT (outer_const); ! 7938: else if (GET_RTX_CLASS (outer_op) == '1') ! 7939: x = gen_unary (outer_op, result_mode, x); ! 7940: else ! 7941: x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const)); ! 7942: } ! 7943: ! 7944: return x; ! 7945: } ! 7946: ! 7947: /* Like recog, but we receive the address of a pointer to a new pattern. ! 7948: We try to match the rtx that the pointer points to. ! 7949: If that fails, we may try to modify or replace the pattern, ! 7950: storing the replacement into the same pointer object. ! 7951: ! 7952: Modifications include deletion or addition of CLOBBERs. ! 7953: ! 7954: PNOTES is a pointer to a location where any REG_UNUSED notes added for ! 7955: the CLOBBERs are placed. ! 7956: ! 7957: The value is the final insn code from the pattern ultimately matched, ! 7958: or -1. */ ! 7959: ! 7960: static int ! 7961: recog_for_combine (pnewpat, insn, pnotes) ! 7962: rtx *pnewpat; ! 7963: rtx insn; ! 7964: rtx *pnotes; ! 7965: { ! 7966: register rtx pat = *pnewpat; ! 7967: int insn_code_number; ! 7968: int num_clobbers_to_add = 0; ! 7969: int i; ! 7970: rtx notes = 0; ! 7971: ! 7972: /* If PAT is a PARALLEL, check to see if it contains the CLOBBER ! 7973: we use to indicate that something didn't match. If we find such a ! 7974: thing, force rejection. */ ! 7975: if (GET_CODE (pat) == PARALLEL) ! 7976: for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) ! 7977: if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER ! 7978: && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx) ! 7979: return -1; ! 7980: ! 7981: /* Is the result of combination a valid instruction? */ ! 7982: insn_code_number = recog (pat, insn, &num_clobbers_to_add); ! 7983: ! 7984: /* If it isn't, there is the possibility that we previously had an insn ! 7985: that clobbered some register as a side effect, but the combined ! 7986: insn doesn't need to do that. So try once more without the clobbers ! 7987: unless this represents an ASM insn. */ ! 7988: ! 7989: if (insn_code_number < 0 && ! check_asm_operands (pat) ! 7990: && GET_CODE (pat) == PARALLEL) ! 7991: { ! 7992: int pos; ! 7993: ! 7994: for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++) ! 7995: if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER) ! 7996: { ! 7997: if (i != pos) ! 7998: SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i)); ! 7999: pos++; ! 8000: } ! 8001: ! 8002: SUBST_INT (XVECLEN (pat, 0), pos); ! 8003: ! 8004: if (pos == 1) ! 8005: pat = XVECEXP (pat, 0, 0); ! 8006: ! 8007: insn_code_number = recog (pat, insn, &num_clobbers_to_add); ! 8008: } ! 8009: ! 8010: /* If we had any clobbers to add, make a new pattern than contains ! 8011: them. Then check to make sure that all of them are dead. */ ! 8012: if (num_clobbers_to_add) ! 8013: { ! 8014: rtx newpat = gen_rtx (PARALLEL, VOIDmode, ! 8015: gen_rtvec (GET_CODE (pat) == PARALLEL ! 8016: ? XVECLEN (pat, 0) + num_clobbers_to_add ! 8017: : num_clobbers_to_add + 1)); ! 8018: ! 8019: if (GET_CODE (pat) == PARALLEL) ! 8020: for (i = 0; i < XVECLEN (pat, 0); i++) ! 8021: XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i); ! 8022: else ! 8023: XVECEXP (newpat, 0, 0) = pat; ! 8024: ! 8025: add_clobbers (newpat, insn_code_number); ! 8026: ! 8027: for (i = XVECLEN (newpat, 0) - num_clobbers_to_add; ! 8028: i < XVECLEN (newpat, 0); i++) ! 8029: { ! 8030: if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG ! 8031: && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn)) ! 8032: return -1; ! 8033: notes = gen_rtx (EXPR_LIST, REG_UNUSED, ! 8034: XEXP (XVECEXP (newpat, 0, i), 0), notes); ! 8035: } ! 8036: pat = newpat; ! 8037: } ! 8038: ! 8039: *pnewpat = pat; ! 8040: *pnotes = notes; ! 8041: ! 8042: return insn_code_number; ! 8043: } ! 8044: ! 8045: /* Like gen_lowpart but for use by combine. In combine it is not possible ! 8046: to create any new pseudoregs. However, it is safe to create ! 8047: invalid memory addresses, because combine will try to recognize ! 8048: them and all they will do is make the combine attempt fail. ! 8049: ! 8050: If for some reason this cannot do its job, an rtx ! 8051: (clobber (const_int 0)) is returned. ! 8052: An insn containing that will not be recognized. */ ! 8053: ! 8054: #undef gen_lowpart ! 8055: ! 8056: static rtx ! 8057: gen_lowpart_for_combine (mode, x) ! 8058: enum machine_mode mode; ! 8059: register rtx x; ! 8060: { ! 8061: rtx result; ! 8062: ! 8063: if (GET_MODE (x) == mode) ! 8064: return x; ! 8065: ! 8066: /* We can only support MODE being wider than a word if X is a ! 8067: constant integer or has a mode the same size. */ ! 8068: ! 8069: if (GET_MODE_SIZE (mode) > UNITS_PER_WORD ! 8070: && ! ((GET_MODE (x) == VOIDmode ! 8071: && (GET_CODE (x) == CONST_INT ! 8072: || GET_CODE (x) == CONST_DOUBLE)) ! 8073: || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode))) ! 8074: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); ! 8075: ! 8076: /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart ! 8077: won't know what to do. So we will strip off the SUBREG here and ! 8078: process normally. */ ! 8079: if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM) ! 8080: { ! 8081: x = SUBREG_REG (x); ! 8082: if (GET_MODE (x) == mode) ! 8083: return x; ! 8084: } ! 8085: ! 8086: result = gen_lowpart_common (mode, x); ! 8087: if (result) ! 8088: return result; ! 8089: ! 8090: if (GET_CODE (x) == MEM) ! 8091: { ! 8092: register int offset = 0; ! 8093: rtx new; ! 8094: ! 8095: /* Refuse to work on a volatile memory ref or one with a mode-dependent ! 8096: address. */ ! 8097: if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0))) ! 8098: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); ! 8099: ! 8100: /* If we want to refer to something bigger than the original memref, ! 8101: generate a perverse subreg instead. That will force a reload ! 8102: of the original memref X. */ ! 8103: if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)) ! 8104: return gen_rtx (SUBREG, mode, x, 0); ! 8105: ! 8106: #if WORDS_BIG_ENDIAN ! 8107: offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) ! 8108: - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); ! 8109: #endif ! 8110: #if BYTES_BIG_ENDIAN ! 8111: /* Adjust the address so that the address-after-the-data ! 8112: is unchanged. */ ! 8113: offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) ! 8114: - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); ! 8115: #endif ! 8116: new = gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), offset)); ! 8117: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x); ! 8118: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x); ! 8119: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x); ! 8120: return new; ! 8121: } ! 8122: ! 8123: /* If X is a comparison operator, rewrite it in a new mode. This ! 8124: probably won't match, but may allow further simplifications. */ ! 8125: else if (GET_RTX_CLASS (GET_CODE (x)) == '<') ! 8126: return gen_rtx_combine (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1)); ! 8127: ! 8128: /* If we couldn't simplify X any other way, just enclose it in a ! 8129: SUBREG. Normally, this SUBREG won't match, but some patterns may ! 8130: include an explicit SUBREG or we may simplify it further in combine. */ ! 8131: else ! 8132: { ! 8133: int word = 0; ! 8134: ! 8135: if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) ! 8136: word = ((GET_MODE_SIZE (GET_MODE (x)) ! 8137: - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)) ! 8138: / UNITS_PER_WORD); ! 8139: return gen_rtx (SUBREG, mode, x, word); ! 8140: } ! 8141: } ! 8142: ! 8143: /* Make an rtx expression. This is a subset of gen_rtx and only supports ! 8144: expressions of 1, 2, or 3 operands, each of which are rtx expressions. ! 8145: ! 8146: If the identical expression was previously in the insn (in the undobuf), ! 8147: it will be returned. Only if it is not found will a new expression ! 8148: be made. */ ! 8149: ! 8150: /*VARARGS2*/ ! 8151: static rtx ! 8152: gen_rtx_combine (va_alist) ! 8153: va_dcl ! 8154: { ! 8155: va_list p; ! 8156: enum rtx_code code; ! 8157: enum machine_mode mode; ! 8158: int n_args; ! 8159: rtx args[3]; ! 8160: int i, j; ! 8161: char *fmt; ! 8162: rtx rt; ! 8163: ! 8164: va_start (p); ! 8165: code = va_arg (p, enum rtx_code); ! 8166: mode = va_arg (p, enum machine_mode); ! 8167: n_args = GET_RTX_LENGTH (code); ! 8168: fmt = GET_RTX_FORMAT (code); ! 8169: ! 8170: if (n_args == 0 || n_args > 3) ! 8171: abort (); ! 8172: ! 8173: /* Get each arg and verify that it is supposed to be an expression. */ ! 8174: for (j = 0; j < n_args; j++) ! 8175: { ! 8176: if (*fmt++ != 'e') ! 8177: abort (); ! 8178: ! 8179: args[j] = va_arg (p, rtx); ! 8180: } ! 8181: ! 8182: /* See if this is in undobuf. Be sure we don't use objects that came ! 8183: from another insn; this could produce circular rtl structures. */ ! 8184: ! 8185: for (i = previous_num_undos; i < undobuf.num_undo; i++) ! 8186: if (!undobuf.undo[i].is_int ! 8187: && GET_CODE (undobuf.undo[i].old_contents.r) == code ! 8188: && GET_MODE (undobuf.undo[i].old_contents.r) == mode) ! 8189: { ! 8190: for (j = 0; j < n_args; j++) ! 8191: if (XEXP (undobuf.undo[i].old_contents.r, j) != args[j]) ! 8192: break; ! 8193: ! 8194: if (j == n_args) ! 8195: return undobuf.undo[i].old_contents.r; ! 8196: } ! 8197: ! 8198: /* Otherwise make a new rtx. We know we have 1, 2, or 3 args. ! 8199: Use rtx_alloc instead of gen_rtx because it's faster on RISC. */ ! 8200: rt = rtx_alloc (code); ! 8201: PUT_MODE (rt, mode); ! 8202: XEXP (rt, 0) = args[0]; ! 8203: if (n_args > 1) ! 8204: { ! 8205: XEXP (rt, 1) = args[1]; ! 8206: if (n_args > 2) ! 8207: XEXP (rt, 2) = args[2]; ! 8208: } ! 8209: return rt; ! 8210: } ! 8211: ! 8212: /* These routines make binary and unary operations by first seeing if they ! 8213: fold; if not, a new expression is allocated. */ ! 8214: ! 8215: static rtx ! 8216: gen_binary (code, mode, op0, op1) ! 8217: enum rtx_code code; ! 8218: enum machine_mode mode; ! 8219: rtx op0, op1; ! 8220: { ! 8221: rtx result; ! 8222: rtx tem; ! 8223: ! 8224: if (GET_RTX_CLASS (code) == 'c' ! 8225: && (GET_CODE (op0) == CONST_INT ! 8226: || (CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT))) ! 8227: tem = op0, op0 = op1, op1 = tem; ! 8228: ! 8229: if (GET_RTX_CLASS (code) == '<') ! 8230: { ! 8231: enum machine_mode op_mode = GET_MODE (op0); ! 8232: if (op_mode == VOIDmode) ! 8233: op_mode = GET_MODE (op1); ! 8234: result = simplify_relational_operation (code, op_mode, op0, op1); ! 8235: } ! 8236: else ! 8237: result = simplify_binary_operation (code, mode, op0, op1); ! 8238: ! 8239: if (result) ! 8240: return result; ! 8241: ! 8242: /* Put complex operands first and constants second. */ ! 8243: if (GET_RTX_CLASS (code) == 'c' ! 8244: && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT) ! 8245: || (GET_RTX_CLASS (GET_CODE (op0)) == 'o' ! 8246: && GET_RTX_CLASS (GET_CODE (op1)) != 'o') ! 8247: || (GET_CODE (op0) == SUBREG ! 8248: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o' ! 8249: && GET_RTX_CLASS (GET_CODE (op1)) != 'o'))) ! 8250: return gen_rtx_combine (code, mode, op1, op0); ! 8251: ! 8252: return gen_rtx_combine (code, mode, op0, op1); ! 8253: } ! 8254: ! 8255: static rtx ! 8256: gen_unary (code, mode, op0) ! 8257: enum rtx_code code; ! 8258: enum machine_mode mode; ! 8259: rtx op0; ! 8260: { ! 8261: rtx result = simplify_unary_operation (code, mode, op0, mode); ! 8262: ! 8263: if (result) ! 8264: return result; ! 8265: ! 8266: return gen_rtx_combine (code, mode, op0); ! 8267: } ! 8268: ! 8269: /* Simplify a comparison between *POP0 and *POP1 where CODE is the ! 8270: comparison code that will be tested. ! 8271: ! 8272: The result is a possibly different comparison code to use. *POP0 and ! 8273: *POP1 may be updated. ! 8274: ! 8275: It is possible that we might detect that a comparison is either always ! 8276: true or always false. However, we do not perform general constant ! 8277: folding in combine, so this knowledge isn't useful. Such tautologies ! 8278: should have been detected earlier. Hence we ignore all such cases. */ ! 8279: ! 8280: static enum rtx_code ! 8281: simplify_comparison (code, pop0, pop1) ! 8282: enum rtx_code code; ! 8283: rtx *pop0; ! 8284: rtx *pop1; ! 8285: { ! 8286: rtx op0 = *pop0; ! 8287: rtx op1 = *pop1; ! 8288: rtx tem, tem1; ! 8289: int i; ! 8290: enum machine_mode mode, tmode; ! 8291: ! 8292: /* Try a few ways of applying the same transformation to both operands. */ ! 8293: while (1) ! 8294: { ! 8295: /* If both operands are the same constant shift, see if we can ignore the ! 8296: shift. We can if the shift is a rotate or if the bits shifted out of ! 8297: this shift are known to be zero for both inputs and if the type of ! 8298: comparison is compatible with the shift. */ ! 8299: if (GET_CODE (op0) == GET_CODE (op1) ! 8300: && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT ! 8301: && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ)) ! 8302: || ((GET_CODE (op0) == LSHIFTRT ! 8303: || GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT) ! 8304: && (code != GT && code != LT && code != GE && code != LE)) ! 8305: || (GET_CODE (op0) == ASHIFTRT ! 8306: && (code != GTU && code != LTU ! 8307: && code != GEU && code != GEU))) ! 8308: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8309: && INTVAL (XEXP (op0, 1)) >= 0 ! 8310: && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT ! 8311: && XEXP (op0, 1) == XEXP (op1, 1)) ! 8312: { ! 8313: enum machine_mode mode = GET_MODE (op0); ! 8314: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); ! 8315: int shift_count = INTVAL (XEXP (op0, 1)); ! 8316: ! 8317: if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT) ! 8318: mask &= (mask >> shift_count) << shift_count; ! 8319: else if (GET_CODE (op0) == ASHIFT || GET_CODE (op0) == LSHIFT) ! 8320: mask = (mask & (mask << shift_count)) >> shift_count; ! 8321: ! 8322: if ((nonzero_bits (XEXP (op0, 0), mode) & ~ mask) == 0 ! 8323: && (nonzero_bits (XEXP (op1, 0), mode) & ~ mask) == 0) ! 8324: op0 = XEXP (op0, 0), op1 = XEXP (op1, 0); ! 8325: else ! 8326: break; ! 8327: } ! 8328: ! 8329: /* If both operands are AND's of a paradoxical SUBREG by constant, the ! 8330: SUBREGs are of the same mode, and, in both cases, the AND would ! 8331: be redundant if the comparison was done in the narrower mode, ! 8332: do the comparison in the narrower mode (e.g., we are AND'ing with 1 ! 8333: and the operand's possibly nonzero bits are 0xffffff01; in that case ! 8334: if we only care about QImode, we don't need the AND). This case ! 8335: occurs if the output mode of an scc insn is not SImode and ! 8336: STORE_FLAG_VALUE == 1 (e.g., the 386). */ ! 8337: ! 8338: else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND ! 8339: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8340: && GET_CODE (XEXP (op1, 1)) == CONST_INT ! 8341: && GET_CODE (XEXP (op0, 0)) == SUBREG ! 8342: && GET_CODE (XEXP (op1, 0)) == SUBREG ! 8343: && (GET_MODE_SIZE (GET_MODE (XEXP (op0, 0))) ! 8344: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))) ! 8345: && (GET_MODE (SUBREG_REG (XEXP (op0, 0))) ! 8346: == GET_MODE (SUBREG_REG (XEXP (op1, 0)))) ! 8347: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))) ! 8348: <= HOST_BITS_PER_WIDE_INT) ! 8349: && (nonzero_bits (SUBREG_REG (XEXP (op0, 0)), ! 8350: GET_MODE (SUBREG_REG (XEXP (op0, 0)))) ! 8351: & ~ INTVAL (XEXP (op0, 1))) == 0 ! 8352: && (nonzero_bits (SUBREG_REG (XEXP (op1, 0)), ! 8353: GET_MODE (SUBREG_REG (XEXP (op1, 0)))) ! 8354: & ~ INTVAL (XEXP (op1, 1))) == 0) ! 8355: { ! 8356: op0 = SUBREG_REG (XEXP (op0, 0)); ! 8357: op1 = SUBREG_REG (XEXP (op1, 0)); ! 8358: ! 8359: /* the resulting comparison is always unsigned since we masked off ! 8360: the original sign bit. */ ! 8361: code = unsigned_condition (code); ! 8362: } ! 8363: else ! 8364: break; ! 8365: } ! 8366: ! 8367: /* If the first operand is a constant, swap the operands and adjust the ! 8368: comparison code appropriately. */ ! 8369: if (CONSTANT_P (op0)) ! 8370: { ! 8371: tem = op0, op0 = op1, op1 = tem; ! 8372: code = swap_condition (code); ! 8373: } ! 8374: ! 8375: /* We now enter a loop during which we will try to simplify the comparison. ! 8376: For the most part, we only are concerned with comparisons with zero, ! 8377: but some things may really be comparisons with zero but not start ! 8378: out looking that way. */ ! 8379: ! 8380: while (GET_CODE (op1) == CONST_INT) ! 8381: { ! 8382: enum machine_mode mode = GET_MODE (op0); ! 8383: int mode_width = GET_MODE_BITSIZE (mode); ! 8384: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); ! 8385: int equality_comparison_p; ! 8386: int sign_bit_comparison_p; ! 8387: int unsigned_comparison_p; ! 8388: HOST_WIDE_INT const_op; ! 8389: ! 8390: /* We only want to handle integral modes. This catches VOIDmode, ! 8391: CCmode, and the floating-point modes. An exception is that we ! 8392: can handle VOIDmode if OP0 is a COMPARE or a comparison ! 8393: operation. */ ! 8394: ! 8395: if (GET_MODE_CLASS (mode) != MODE_INT ! 8396: && ! (mode == VOIDmode ! 8397: && (GET_CODE (op0) == COMPARE ! 8398: || GET_RTX_CLASS (GET_CODE (op0)) == '<'))) ! 8399: break; ! 8400: ! 8401: /* Get the constant we are comparing against and turn off all bits ! 8402: not on in our mode. */ ! 8403: const_op = INTVAL (op1); ! 8404: if (mode_width <= HOST_BITS_PER_WIDE_INT) ! 8405: const_op &= mask; ! 8406: ! 8407: /* If we are comparing against a constant power of two and the value ! 8408: being compared can only have that single bit nonzero (e.g., it was ! 8409: `and'ed with that bit), we can replace this with a comparison ! 8410: with zero. */ ! 8411: if (const_op ! 8412: && (code == EQ || code == NE || code == GE || code == GEU ! 8413: || code == LT || code == LTU) ! 8414: && mode_width <= HOST_BITS_PER_WIDE_INT ! 8415: && exact_log2 (const_op) >= 0 ! 8416: && nonzero_bits (op0, mode) == const_op) ! 8417: { ! 8418: code = (code == EQ || code == GE || code == GEU ? NE : EQ); ! 8419: op1 = const0_rtx, const_op = 0; ! 8420: } ! 8421: ! 8422: /* Similarly, if we are comparing a value known to be either -1 or ! 8423: 0 with -1, change it to the opposite comparison against zero. */ ! 8424: ! 8425: if (const_op == -1 ! 8426: && (code == EQ || code == NE || code == GT || code == LE ! 8427: || code == GEU || code == LTU) ! 8428: && num_sign_bit_copies (op0, mode) == mode_width) ! 8429: { ! 8430: code = (code == EQ || code == LE || code == GEU ? NE : EQ); ! 8431: op1 = const0_rtx, const_op = 0; ! 8432: } ! 8433: ! 8434: /* Do some canonicalizations based on the comparison code. We prefer ! 8435: comparisons against zero and then prefer equality comparisons. ! 8436: If we can reduce the size of a constant, we will do that too. */ ! 8437: ! 8438: switch (code) ! 8439: { ! 8440: case LT: ! 8441: /* < C is equivalent to <= (C - 1) */ ! 8442: if (const_op > 0) ! 8443: { ! 8444: const_op -= 1; ! 8445: op1 = GEN_INT (const_op); ! 8446: code = LE; ! 8447: /* ... fall through to LE case below. */ ! 8448: } ! 8449: else ! 8450: break; ! 8451: ! 8452: case LE: ! 8453: /* <= C is equivalent to < (C + 1); we do this for C < 0 */ ! 8454: if (const_op < 0) ! 8455: { ! 8456: const_op += 1; ! 8457: op1 = GEN_INT (const_op); ! 8458: code = LT; ! 8459: } ! 8460: ! 8461: /* If we are doing a <= 0 comparison on a value known to have ! 8462: a zero sign bit, we can replace this with == 0. */ ! 8463: else if (const_op == 0 ! 8464: && mode_width <= HOST_BITS_PER_WIDE_INT ! 8465: && (nonzero_bits (op0, mode) ! 8466: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0) ! 8467: code = EQ; ! 8468: break; ! 8469: ! 8470: case GE: ! 8471: /* >= C is equivalent to > (C - 1). */ ! 8472: if (const_op > 0) ! 8473: { ! 8474: const_op -= 1; ! 8475: op1 = GEN_INT (const_op); ! 8476: code = GT; ! 8477: /* ... fall through to GT below. */ ! 8478: } ! 8479: else ! 8480: break; ! 8481: ! 8482: case GT: ! 8483: /* > C is equivalent to >= (C + 1); we do this for C < 0*/ ! 8484: if (const_op < 0) ! 8485: { ! 8486: const_op += 1; ! 8487: op1 = GEN_INT (const_op); ! 8488: code = GE; ! 8489: } ! 8490: ! 8491: /* If we are doing a > 0 comparison on a value known to have ! 8492: a zero sign bit, we can replace this with != 0. */ ! 8493: else if (const_op == 0 ! 8494: && mode_width <= HOST_BITS_PER_WIDE_INT ! 8495: && (nonzero_bits (op0, mode) ! 8496: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0) ! 8497: code = NE; ! 8498: break; ! 8499: ! 8500: case LTU: ! 8501: /* < C is equivalent to <= (C - 1). */ ! 8502: if (const_op > 0) ! 8503: { ! 8504: const_op -= 1; ! 8505: op1 = GEN_INT (const_op); ! 8506: code = LEU; ! 8507: /* ... fall through ... */ ! 8508: } ! 8509: ! 8510: /* (unsigned) < 0x80000000 is equivalent to >= 0. */ ! 8511: else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)) ! 8512: { ! 8513: const_op = 0, op1 = const0_rtx; ! 8514: code = GE; ! 8515: break; ! 8516: } ! 8517: else ! 8518: break; ! 8519: ! 8520: case LEU: ! 8521: /* unsigned <= 0 is equivalent to == 0 */ ! 8522: if (const_op == 0) ! 8523: code = EQ; ! 8524: ! 8525: /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */ ! 8526: else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1) ! 8527: { ! 8528: const_op = 0, op1 = const0_rtx; ! 8529: code = GE; ! 8530: } ! 8531: break; ! 8532: ! 8533: case GEU: ! 8534: /* >= C is equivalent to < (C - 1). */ ! 8535: if (const_op > 1) ! 8536: { ! 8537: const_op -= 1; ! 8538: op1 = GEN_INT (const_op); ! 8539: code = GTU; ! 8540: /* ... fall through ... */ ! 8541: } ! 8542: ! 8543: /* (unsigned) >= 0x80000000 is equivalent to < 0. */ ! 8544: else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)) ! 8545: { ! 8546: const_op = 0, op1 = const0_rtx; ! 8547: code = LT; ! 8548: } ! 8549: else ! 8550: break; ! 8551: ! 8552: case GTU: ! 8553: /* unsigned > 0 is equivalent to != 0 */ ! 8554: if (const_op == 0) ! 8555: code = NE; ! 8556: ! 8557: /* (unsigned) > 0x7fffffff is equivalent to < 0. */ ! 8558: else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1) ! 8559: { ! 8560: const_op = 0, op1 = const0_rtx; ! 8561: code = LT; ! 8562: } ! 8563: break; ! 8564: } ! 8565: ! 8566: /* Compute some predicates to simplify code below. */ ! 8567: ! 8568: equality_comparison_p = (code == EQ || code == NE); ! 8569: sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0); ! 8570: unsigned_comparison_p = (code == LTU || code == LEU || code == GTU ! 8571: || code == LEU); ! 8572: ! 8573: /* If this is a sign bit comparison and we can do arithmetic in ! 8574: MODE, say that we will only be needing the sign bit of OP0. */ ! 8575: if (sign_bit_comparison_p ! 8576: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) ! 8577: op0 = force_to_mode (op0, mode, ! 8578: ((HOST_WIDE_INT) 1 ! 8579: << (GET_MODE_BITSIZE (mode) - 1)), ! 8580: NULL_RTX, 0); ! 8581: ! 8582: /* Now try cases based on the opcode of OP0. If none of the cases ! 8583: does a "continue", we exit this loop immediately after the ! 8584: switch. */ ! 8585: ! 8586: switch (GET_CODE (op0)) ! 8587: { ! 8588: case ZERO_EXTRACT: ! 8589: /* If we are extracting a single bit from a variable position in ! 8590: a constant that has only a single bit set and are comparing it ! 8591: with zero, we can convert this into an equality comparison ! 8592: between the position and the location of the single bit. We can't ! 8593: do this if bit endian and we don't have an extzv since we then ! 8594: can't know what mode to use for the endianness adjustment. */ ! 8595: ! 8596: #if ! BITS_BIG_ENDIAN || defined (HAVE_extzv) ! 8597: if (GET_CODE (XEXP (op0, 0)) == CONST_INT ! 8598: && XEXP (op0, 1) == const1_rtx ! 8599: && equality_comparison_p && const_op == 0 ! 8600: && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0) ! 8601: { ! 8602: #if BITS_BIG_ENDIAN ! 8603: i = (GET_MODE_BITSIZE ! 8604: (insn_operand_mode[(int) CODE_FOR_extzv][1]) - 1 - i); ! 8605: #endif ! 8606: ! 8607: op0 = XEXP (op0, 2); ! 8608: op1 = GEN_INT (i); ! 8609: const_op = i; ! 8610: ! 8611: /* Result is nonzero iff shift count is equal to I. */ ! 8612: code = reverse_condition (code); ! 8613: continue; ! 8614: } ! 8615: #endif ! 8616: ! 8617: /* ... fall through ... */ ! 8618: ! 8619: case SIGN_EXTRACT: ! 8620: tem = expand_compound_operation (op0); ! 8621: if (tem != op0) ! 8622: { ! 8623: op0 = tem; ! 8624: continue; ! 8625: } ! 8626: break; ! 8627: ! 8628: case NOT: ! 8629: /* If testing for equality, we can take the NOT of the constant. */ ! 8630: if (equality_comparison_p ! 8631: && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0) ! 8632: { ! 8633: op0 = XEXP (op0, 0); ! 8634: op1 = tem; ! 8635: continue; ! 8636: } ! 8637: ! 8638: /* If just looking at the sign bit, reverse the sense of the ! 8639: comparison. */ ! 8640: if (sign_bit_comparison_p) ! 8641: { ! 8642: op0 = XEXP (op0, 0); ! 8643: code = (code == GE ? LT : GE); ! 8644: continue; ! 8645: } ! 8646: break; ! 8647: ! 8648: case NEG: ! 8649: /* If testing for equality, we can take the NEG of the constant. */ ! 8650: if (equality_comparison_p ! 8651: && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0) ! 8652: { ! 8653: op0 = XEXP (op0, 0); ! 8654: op1 = tem; ! 8655: continue; ! 8656: } ! 8657: ! 8658: /* The remaining cases only apply to comparisons with zero. */ ! 8659: if (const_op != 0) ! 8660: break; ! 8661: ! 8662: /* When X is ABS or is known positive, ! 8663: (neg X) is < 0 if and only if X != 0. */ ! 8664: ! 8665: if (sign_bit_comparison_p ! 8666: && (GET_CODE (XEXP (op0, 0)) == ABS ! 8667: || (mode_width <= HOST_BITS_PER_WIDE_INT ! 8668: && (nonzero_bits (XEXP (op0, 0), mode) ! 8669: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0))) ! 8670: { ! 8671: op0 = XEXP (op0, 0); ! 8672: code = (code == LT ? NE : EQ); ! 8673: continue; ! 8674: } ! 8675: ! 8676: /* If we have NEG of something whose two high-order bits are the ! 8677: same, we know that "(-a) < 0" is equivalent to "a > 0". */ ! 8678: if (num_sign_bit_copies (op0, mode) >= 2) ! 8679: { ! 8680: op0 = XEXP (op0, 0); ! 8681: code = swap_condition (code); ! 8682: continue; ! 8683: } ! 8684: break; ! 8685: ! 8686: case ROTATE: ! 8687: /* If we are testing equality and our count is a constant, we ! 8688: can perform the inverse operation on our RHS. */ ! 8689: if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8690: && (tem = simplify_binary_operation (ROTATERT, mode, ! 8691: op1, XEXP (op0, 1))) != 0) ! 8692: { ! 8693: op0 = XEXP (op0, 0); ! 8694: op1 = tem; ! 8695: continue; ! 8696: } ! 8697: ! 8698: /* If we are doing a < 0 or >= 0 comparison, it means we are testing ! 8699: a particular bit. Convert it to an AND of a constant of that ! 8700: bit. This will be converted into a ZERO_EXTRACT. */ ! 8701: if (const_op == 0 && sign_bit_comparison_p ! 8702: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8703: && mode_width <= HOST_BITS_PER_WIDE_INT) ! 8704: { ! 8705: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), ! 8706: ((HOST_WIDE_INT) 1 ! 8707: << (mode_width - 1 ! 8708: - INTVAL (XEXP (op0, 1))))); ! 8709: code = (code == LT ? NE : EQ); ! 8710: continue; ! 8711: } ! 8712: ! 8713: /* ... fall through ... */ ! 8714: ! 8715: case ABS: ! 8716: /* ABS is ignorable inside an equality comparison with zero. */ ! 8717: if (const_op == 0 && equality_comparison_p) ! 8718: { ! 8719: op0 = XEXP (op0, 0); ! 8720: continue; ! 8721: } ! 8722: break; ! 8723: ! 8724: ! 8725: case SIGN_EXTEND: ! 8726: /* Can simplify (compare (zero/sign_extend FOO) CONST) ! 8727: to (compare FOO CONST) if CONST fits in FOO's mode and we ! 8728: are either testing inequality or have an unsigned comparison ! 8729: with ZERO_EXTEND or a signed comparison with SIGN_EXTEND. */ ! 8730: if (! unsigned_comparison_p ! 8731: && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) ! 8732: <= HOST_BITS_PER_WIDE_INT) ! 8733: && ((unsigned HOST_WIDE_INT) const_op ! 8734: < (((HOST_WIDE_INT) 1 ! 8735: << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1))))) ! 8736: { ! 8737: op0 = XEXP (op0, 0); ! 8738: continue; ! 8739: } ! 8740: break; ! 8741: ! 8742: case SUBREG: ! 8743: /* Check for the case where we are comparing A - C1 with C2, ! 8744: both constants are smaller than 1/2 the maxium positive ! 8745: value in MODE, and the comparison is equality or unsigned. ! 8746: In that case, if A is either zero-extended to MODE or has ! 8747: sufficient sign bits so that the high-order bit in MODE ! 8748: is a copy of the sign in the inner mode, we can prove that it is ! 8749: safe to do the operation in the wider mode. This simplifies ! 8750: many range checks. */ ! 8751: ! 8752: if (mode_width <= HOST_BITS_PER_WIDE_INT ! 8753: && subreg_lowpart_p (op0) ! 8754: && GET_CODE (SUBREG_REG (op0)) == PLUS ! 8755: && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT ! 8756: && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0 ! 8757: && (- INTVAL (XEXP (SUBREG_REG (op0), 1)) ! 8758: < GET_MODE_MASK (mode) / 2) ! 8759: && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2 ! 8760: && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0), ! 8761: GET_MODE (SUBREG_REG (op0))) ! 8762: & ~ GET_MODE_MASK (mode)) ! 8763: || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0), ! 8764: GET_MODE (SUBREG_REG (op0))) ! 8765: > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) ! 8766: - GET_MODE_BITSIZE (mode))))) ! 8767: { ! 8768: op0 = SUBREG_REG (op0); ! 8769: continue; ! 8770: } ! 8771: ! 8772: /* If the inner mode is narrower and we are extracting the low part, ! 8773: we can treat the SUBREG as if it were a ZERO_EXTEND. */ ! 8774: if (subreg_lowpart_p (op0) ! 8775: && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width) ! 8776: /* Fall through */ ; ! 8777: else ! 8778: break; ! 8779: ! 8780: /* ... fall through ... */ ! 8781: ! 8782: case ZERO_EXTEND: ! 8783: if ((unsigned_comparison_p || equality_comparison_p) ! 8784: && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) ! 8785: <= HOST_BITS_PER_WIDE_INT) ! 8786: && ((unsigned HOST_WIDE_INT) const_op ! 8787: < GET_MODE_MASK (GET_MODE (XEXP (op0, 0))))) ! 8788: { ! 8789: op0 = XEXP (op0, 0); ! 8790: continue; ! 8791: } ! 8792: break; ! 8793: ! 8794: case PLUS: ! 8795: /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do ! 8796: this for equality comparisons due to pathological cases involving ! 8797: overflows. */ ! 8798: if (equality_comparison_p ! 8799: && 0 != (tem = simplify_binary_operation (MINUS, mode, ! 8800: op1, XEXP (op0, 1)))) ! 8801: { ! 8802: op0 = XEXP (op0, 0); ! 8803: op1 = tem; ! 8804: continue; ! 8805: } ! 8806: ! 8807: /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */ ! 8808: if (const_op == 0 && XEXP (op0, 1) == constm1_rtx ! 8809: && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p) ! 8810: { ! 8811: op0 = XEXP (XEXP (op0, 0), 0); ! 8812: code = (code == LT ? EQ : NE); ! 8813: continue; ! 8814: } ! 8815: break; ! 8816: ! 8817: case MINUS: ! 8818: /* (eq (minus A B) C) -> (eq A (plus B C)) or ! 8819: (eq B (minus A C)), whichever simplifies. We can only do ! 8820: this for equality comparisons due to pathological cases involving ! 8821: overflows. */ ! 8822: if (equality_comparison_p ! 8823: && 0 != (tem = simplify_binary_operation (PLUS, mode, ! 8824: XEXP (op0, 1), op1))) ! 8825: { ! 8826: op0 = XEXP (op0, 0); ! 8827: op1 = tem; ! 8828: continue; ! 8829: } ! 8830: ! 8831: if (equality_comparison_p ! 8832: && 0 != (tem = simplify_binary_operation (MINUS, mode, ! 8833: XEXP (op0, 0), op1))) ! 8834: { ! 8835: op0 = XEXP (op0, 1); ! 8836: op1 = tem; ! 8837: continue; ! 8838: } ! 8839: ! 8840: /* The sign bit of (minus (ashiftrt X C) X), where C is the number ! 8841: of bits in X minus 1, is one iff X > 0. */ ! 8842: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT ! 8843: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT ! 8844: && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1 ! 8845: && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1))) ! 8846: { ! 8847: op0 = XEXP (op0, 1); ! 8848: code = (code == GE ? LE : GT); ! 8849: continue; ! 8850: } ! 8851: break; ! 8852: ! 8853: case XOR: ! 8854: /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification ! 8855: if C is zero or B is a constant. */ ! 8856: if (equality_comparison_p ! 8857: && 0 != (tem = simplify_binary_operation (XOR, mode, ! 8858: XEXP (op0, 1), op1))) ! 8859: { ! 8860: op0 = XEXP (op0, 0); ! 8861: op1 = tem; ! 8862: continue; ! 8863: } ! 8864: break; ! 8865: ! 8866: case EQ: case NE: ! 8867: case LT: case LTU: case LE: case LEU: ! 8868: case GT: case GTU: case GE: case GEU: ! 8869: /* We can't do anything if OP0 is a condition code value, rather ! 8870: than an actual data value. */ ! 8871: if (const_op != 0 ! 8872: #ifdef HAVE_cc0 ! 8873: || XEXP (op0, 0) == cc0_rtx ! 8874: #endif ! 8875: || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC) ! 8876: break; ! 8877: ! 8878: /* Get the two operands being compared. */ ! 8879: if (GET_CODE (XEXP (op0, 0)) == COMPARE) ! 8880: tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1); ! 8881: else ! 8882: tem = XEXP (op0, 0), tem1 = XEXP (op0, 1); ! 8883: ! 8884: /* Check for the cases where we simply want the result of the ! 8885: earlier test or the opposite of that result. */ ! 8886: if (code == NE ! 8887: || (code == EQ && reversible_comparison_p (op0)) ! 8888: || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT ! 8889: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT ! 8890: && (STORE_FLAG_VALUE ! 8891: & (((HOST_WIDE_INT) 1 ! 8892: << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1)))) ! 8893: && (code == LT ! 8894: || (code == GE && reversible_comparison_p (op0))))) ! 8895: { ! 8896: code = (code == LT || code == NE ! 8897: ? GET_CODE (op0) : reverse_condition (GET_CODE (op0))); ! 8898: op0 = tem, op1 = tem1; ! 8899: continue; ! 8900: } ! 8901: break; ! 8902: ! 8903: case IOR: ! 8904: /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero ! 8905: iff X <= 0. */ ! 8906: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS ! 8907: && XEXP (XEXP (op0, 0), 1) == constm1_rtx ! 8908: && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1))) ! 8909: { ! 8910: op0 = XEXP (op0, 1); ! 8911: code = (code == GE ? GT : LE); ! 8912: continue; ! 8913: } ! 8914: break; ! 8915: ! 8916: case AND: ! 8917: /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This ! 8918: will be converted to a ZERO_EXTRACT later. */ ! 8919: if (const_op == 0 && equality_comparison_p ! 8920: && (GET_CODE (XEXP (op0, 0)) == ASHIFT ! 8921: || GET_CODE (XEXP (op0, 0)) == LSHIFT) ! 8922: && XEXP (XEXP (op0, 0), 0) == const1_rtx) ! 8923: { ! 8924: op0 = simplify_and_const_int ! 8925: (op0, mode, gen_rtx_combine (LSHIFTRT, mode, ! 8926: XEXP (op0, 1), ! 8927: XEXP (XEXP (op0, 0), 1)), ! 8928: (HOST_WIDE_INT) 1); ! 8929: continue; ! 8930: } ! 8931: ! 8932: /* If we are comparing (and (lshiftrt X C1) C2) for equality with ! 8933: zero and X is a comparison and C1 and C2 describe only bits set ! 8934: in STORE_FLAG_VALUE, we can compare with X. */ ! 8935: if (const_op == 0 && equality_comparison_p ! 8936: && mode_width <= HOST_BITS_PER_WIDE_INT ! 8937: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8938: && GET_CODE (XEXP (op0, 0)) == LSHIFTRT ! 8939: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT ! 8940: && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0 ! 8941: && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT) ! 8942: { ! 8943: mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode)) ! 8944: << INTVAL (XEXP (XEXP (op0, 0), 1))); ! 8945: if ((~ STORE_FLAG_VALUE & mask) == 0 ! 8946: && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<' ! 8947: || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0 ! 8948: && GET_RTX_CLASS (GET_CODE (tem)) == '<'))) ! 8949: { ! 8950: op0 = XEXP (XEXP (op0, 0), 0); ! 8951: continue; ! 8952: } ! 8953: } ! 8954: ! 8955: /* If we are doing an equality comparison of an AND of a bit equal ! 8956: to the sign bit, replace this with a LT or GE comparison of ! 8957: the underlying value. */ ! 8958: if (equality_comparison_p ! 8959: && const_op == 0 ! 8960: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8961: && mode_width <= HOST_BITS_PER_WIDE_INT ! 8962: && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode)) ! 8963: == (HOST_WIDE_INT) 1 << (mode_width - 1))) ! 8964: { ! 8965: op0 = XEXP (op0, 0); ! 8966: code = (code == EQ ? GE : LT); ! 8967: continue; ! 8968: } ! 8969: ! 8970: /* If this AND operation is really a ZERO_EXTEND from a narrower ! 8971: mode, the constant fits within that mode, and this is either an ! 8972: equality or unsigned comparison, try to do this comparison in ! 8973: the narrower mode. */ ! 8974: if ((equality_comparison_p || unsigned_comparison_p) ! 8975: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8976: && (i = exact_log2 ((INTVAL (XEXP (op0, 1)) ! 8977: & GET_MODE_MASK (mode)) ! 8978: + 1)) >= 0 ! 8979: && const_op >> i == 0 ! 8980: && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode) ! 8981: { ! 8982: op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0)); ! 8983: continue; ! 8984: } ! 8985: break; ! 8986: ! 8987: case ASHIFT: ! 8988: case LSHIFT: ! 8989: /* If we have (compare (xshift FOO N) (const_int C)) and ! 8990: the high order N bits of FOO (N+1 if an inequality comparison) ! 8991: are known to be zero, we can do this by comparing FOO with C ! 8992: shifted right N bits so long as the low-order N bits of C are ! 8993: zero. */ ! 8994: if (GET_CODE (XEXP (op0, 1)) == CONST_INT ! 8995: && INTVAL (XEXP (op0, 1)) >= 0 ! 8996: && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p) ! 8997: < HOST_BITS_PER_WIDE_INT) ! 8998: && ((const_op ! 8999: & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0) ! 9000: && mode_width <= HOST_BITS_PER_WIDE_INT ! 9001: && (nonzero_bits (XEXP (op0, 0), mode) ! 9002: & ~ (mask >> (INTVAL (XEXP (op0, 1)) ! 9003: + ! equality_comparison_p))) == 0) ! 9004: { ! 9005: const_op >>= INTVAL (XEXP (op0, 1)); ! 9006: op1 = GEN_INT (const_op); ! 9007: op0 = XEXP (op0, 0); ! 9008: continue; ! 9009: } ! 9010: ! 9011: /* If we are doing a sign bit comparison, it means we are testing ! 9012: a particular bit. Convert it to the appropriate AND. */ ! 9013: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 9014: && mode_width <= HOST_BITS_PER_WIDE_INT) ! 9015: { ! 9016: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), ! 9017: ((HOST_WIDE_INT) 1 ! 9018: << (mode_width - 1 ! 9019: - INTVAL (XEXP (op0, 1))))); ! 9020: code = (code == LT ? NE : EQ); ! 9021: continue; ! 9022: } ! 9023: ! 9024: /* If this an equality comparison with zero and we are shifting ! 9025: the low bit to the sign bit, we can convert this to an AND of the ! 9026: low-order bit. */ ! 9027: if (const_op == 0 && equality_comparison_p ! 9028: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 9029: && INTVAL (XEXP (op0, 1)) == mode_width - 1) ! 9030: { ! 9031: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), ! 9032: (HOST_WIDE_INT) 1); ! 9033: continue; ! 9034: } ! 9035: break; ! 9036: ! 9037: case ASHIFTRT: ! 9038: /* If this is an equality comparison with zero, we can do this ! 9039: as a logical shift, which might be much simpler. */ ! 9040: if (equality_comparison_p && const_op == 0 ! 9041: && GET_CODE (XEXP (op0, 1)) == CONST_INT) ! 9042: { ! 9043: op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode, ! 9044: XEXP (op0, 0), ! 9045: INTVAL (XEXP (op0, 1))); ! 9046: continue; ! 9047: } ! 9048: ! 9049: /* If OP0 is a sign extension and CODE is not an unsigned comparison, ! 9050: do the comparison in a narrower mode. */ ! 9051: if (! unsigned_comparison_p ! 9052: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 9053: && GET_CODE (XEXP (op0, 0)) == ASHIFT ! 9054: && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1) ! 9055: && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), ! 9056: MODE_INT, 1)) != BLKmode ! 9057: && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode) ! 9058: || ((unsigned HOST_WIDE_INT) - const_op ! 9059: <= GET_MODE_MASK (tmode)))) ! 9060: { ! 9061: op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0)); ! 9062: continue; ! 9063: } ! 9064: ! 9065: /* ... fall through ... */ ! 9066: case LSHIFTRT: ! 9067: /* If we have (compare (xshiftrt FOO N) (const_int C)) and ! 9068: the low order N bits of FOO are known to be zero, we can do this ! 9069: by comparing FOO with C shifted left N bits so long as no ! 9070: overflow occurs. */ ! 9071: if (GET_CODE (XEXP (op0, 1)) == CONST_INT ! 9072: && INTVAL (XEXP (op0, 1)) >= 0 ! 9073: && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT ! 9074: && mode_width <= HOST_BITS_PER_WIDE_INT ! 9075: && (nonzero_bits (XEXP (op0, 0), mode) ! 9076: & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0 ! 9077: && (const_op == 0 ! 9078: || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1)) ! 9079: < mode_width))) ! 9080: { ! 9081: const_op <<= INTVAL (XEXP (op0, 1)); ! 9082: op1 = GEN_INT (const_op); ! 9083: op0 = XEXP (op0, 0); ! 9084: continue; ! 9085: } ! 9086: ! 9087: /* If we are using this shift to extract just the sign bit, we ! 9088: can replace this with an LT or GE comparison. */ ! 9089: if (const_op == 0 ! 9090: && (equality_comparison_p || sign_bit_comparison_p) ! 9091: && GET_CODE (XEXP (op0, 1)) == CONST_INT ! 9092: && INTVAL (XEXP (op0, 1)) == mode_width - 1) ! 9093: { ! 9094: op0 = XEXP (op0, 0); ! 9095: code = (code == NE || code == GT ? LT : GE); ! 9096: continue; ! 9097: } ! 9098: break; ! 9099: } ! 9100: ! 9101: break; ! 9102: } ! 9103: ! 9104: /* Now make any compound operations involved in this comparison. Then, ! 9105: check for an outmost SUBREG on OP0 that isn't doing anything or is ! 9106: paradoxical. The latter case can only occur when it is known that the ! 9107: "extra" bits will be zero. Therefore, it is safe to remove the SUBREG. ! 9108: We can never remove a SUBREG for a non-equality comparison because the ! 9109: sign bit is in a different place in the underlying object. */ ! 9110: ! 9111: op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET); ! 9112: op1 = make_compound_operation (op1, SET); ! 9113: ! 9114: if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0) ! 9115: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT ! 9116: && (code == NE || code == EQ) ! 9117: && ((GET_MODE_SIZE (GET_MODE (op0)) ! 9118: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))) ! 9119: { ! 9120: op0 = SUBREG_REG (op0); ! 9121: op1 = gen_lowpart_for_combine (GET_MODE (op0), op1); ! 9122: } ! 9123: ! 9124: else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0) ! 9125: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT ! 9126: && (code == NE || code == EQ) ! 9127: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) ! 9128: <= HOST_BITS_PER_WIDE_INT) ! 9129: && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0))) ! 9130: & ~ GET_MODE_MASK (GET_MODE (op0))) == 0 ! 9131: && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)), ! 9132: op1), ! 9133: (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0))) ! 9134: & ~ GET_MODE_MASK (GET_MODE (op0))) == 0)) ! 9135: op0 = SUBREG_REG (op0), op1 = tem; ! 9136: ! 9137: /* We now do the opposite procedure: Some machines don't have compare ! 9138: insns in all modes. If OP0's mode is an integer mode smaller than a ! 9139: word and we can't do a compare in that mode, see if there is a larger ! 9140: mode for which we can do the compare. There are a number of cases in ! 9141: which we can use the wider mode. */ ! 9142: ! 9143: mode = GET_MODE (op0); ! 9144: if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT ! 9145: && GET_MODE_SIZE (mode) < UNITS_PER_WORD ! 9146: && cmp_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing) ! 9147: for (tmode = GET_MODE_WIDER_MODE (mode); ! 9148: (tmode != VOIDmode ! 9149: && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT); ! 9150: tmode = GET_MODE_WIDER_MODE (tmode)) ! 9151: if (cmp_optab->handlers[(int) tmode].insn_code != CODE_FOR_nothing) ! 9152: { ! 9153: /* If the only nonzero bits in OP0 and OP1 are those in the ! 9154: narrower mode and this is an equality or unsigned comparison, ! 9155: we can use the wider mode. Similarly for sign-extended ! 9156: values and equality or signed comparisons. */ ! 9157: if (((code == EQ || code == NE ! 9158: || code == GEU || code == GTU || code == LEU || code == LTU) ! 9159: && (nonzero_bits (op0, tmode) & ~ GET_MODE_MASK (mode)) == 0 ! 9160: && (nonzero_bits (op1, tmode) & ~ GET_MODE_MASK (mode)) == 0) ! 9161: || ((code == EQ || code == NE ! 9162: || code == GE || code == GT || code == LE || code == LT) ! 9163: && (num_sign_bit_copies (op0, tmode) ! 9164: > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)) ! 9165: && (num_sign_bit_copies (op1, tmode) ! 9166: > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)))) ! 9167: { ! 9168: op0 = gen_lowpart_for_combine (tmode, op0); ! 9169: op1 = gen_lowpart_for_combine (tmode, op1); ! 9170: break; ! 9171: } ! 9172: ! 9173: /* If this is a test for negative, we can make an explicit ! 9174: test of the sign bit. */ ! 9175: ! 9176: if (op1 == const0_rtx && (code == LT || code == GE) ! 9177: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) ! 9178: { ! 9179: op0 = gen_binary (AND, tmode, ! 9180: gen_lowpart_for_combine (tmode, op0), ! 9181: GEN_INT ((HOST_WIDE_INT) 1 ! 9182: << (GET_MODE_BITSIZE (mode) - 1))); ! 9183: code = (code == LT) ? NE : EQ; ! 9184: break; ! 9185: } ! 9186: } ! 9187: ! 9188: *pop0 = op0; ! 9189: *pop1 = op1; ! 9190: ! 9191: return code; ! 9192: } ! 9193: ! 9194: /* Return 1 if we know that X, a comparison operation, is not operating ! 9195: on a floating-point value or is EQ or NE, meaning that we can safely ! 9196: reverse it. */ ! 9197: ! 9198: static int ! 9199: reversible_comparison_p (x) ! 9200: rtx x; ! 9201: { ! 9202: if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT ! 9203: || GET_CODE (x) == NE || GET_CODE (x) == EQ) ! 9204: return 1; ! 9205: ! 9206: switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0)))) ! 9207: { ! 9208: case MODE_INT: ! 9209: case MODE_PARTIAL_INT: ! 9210: case MODE_COMPLEX_INT: ! 9211: return 1; ! 9212: ! 9213: case MODE_CC: ! 9214: x = get_last_value (XEXP (x, 0)); ! 9215: return (x && GET_CODE (x) == COMPARE ! 9216: && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))); ! 9217: } ! 9218: ! 9219: return 0; ! 9220: } ! 9221: ! 9222: /* Utility function for following routine. Called when X is part of a value ! 9223: being stored into reg_last_set_value. Sets reg_last_set_table_tick ! 9224: for each register mentioned. Similar to mention_regs in cse.c */ ! 9225: ! 9226: static void ! 9227: update_table_tick (x) ! 9228: rtx x; ! 9229: { ! 9230: register enum rtx_code code = GET_CODE (x); ! 9231: register char *fmt = GET_RTX_FORMAT (code); ! 9232: register int i; ! 9233: ! 9234: if (code == REG) ! 9235: { ! 9236: int regno = REGNO (x); ! 9237: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER ! 9238: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); ! 9239: ! 9240: for (i = regno; i < endregno; i++) ! 9241: reg_last_set_table_tick[i] = label_tick; ! 9242: ! 9243: return; ! 9244: } ! 9245: ! 9246: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 9247: /* Note that we can't have an "E" in values stored; see ! 9248: get_last_value_validate. */ ! 9249: if (fmt[i] == 'e') ! 9250: update_table_tick (XEXP (x, i)); ! 9251: } ! 9252: ! 9253: /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we ! 9254: are saying that the register is clobbered and we no longer know its ! 9255: value. If INSN is zero, don't update reg_last_set; this is only permitted ! 9256: with VALUE also zero and is used to invalidate the register. */ ! 9257: ! 9258: static void ! 9259: record_value_for_reg (reg, insn, value) ! 9260: rtx reg; ! 9261: rtx insn; ! 9262: rtx value; ! 9263: { ! 9264: int regno = REGNO (reg); ! 9265: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER ! 9266: ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1); ! 9267: int i; ! 9268: ! 9269: /* If VALUE contains REG and we have a previous value for REG, substitute ! 9270: the previous value. */ ! 9271: if (value && insn && reg_overlap_mentioned_p (reg, value)) ! 9272: { ! 9273: rtx tem; ! 9274: ! 9275: /* Set things up so get_last_value is allowed to see anything set up to ! 9276: our insn. */ ! 9277: subst_low_cuid = INSN_CUID (insn); ! 9278: tem = get_last_value (reg); ! 9279: ! 9280: if (tem) ! 9281: value = replace_rtx (copy_rtx (value), reg, tem); ! 9282: } ! 9283: ! 9284: /* For each register modified, show we don't know its value, that ! 9285: we don't know about its bitwise content, that its value has been ! 9286: updated, and that we don't know the location of the death of the ! 9287: register. */ ! 9288: for (i = regno; i < endregno; i ++) ! 9289: { ! 9290: if (insn) ! 9291: reg_last_set[i] = insn; ! 9292: reg_last_set_value[i] = 0; ! 9293: reg_last_set_mode[i] = 0; ! 9294: reg_last_set_nonzero_bits[i] = 0; ! 9295: reg_last_set_sign_bit_copies[i] = 0; ! 9296: reg_last_death[i] = 0; ! 9297: } ! 9298: ! 9299: /* Mark registers that are being referenced in this value. */ ! 9300: if (value) ! 9301: update_table_tick (value); ! 9302: ! 9303: /* Now update the status of each register being set. ! 9304: If someone is using this register in this block, set this register ! 9305: to invalid since we will get confused between the two lives in this ! 9306: basic block. This makes using this register always invalid. In cse, we ! 9307: scan the table to invalidate all entries using this register, but this ! 9308: is too much work for us. */ ! 9309: ! 9310: for (i = regno; i < endregno; i++) ! 9311: { ! 9312: reg_last_set_label[i] = label_tick; ! 9313: if (value && reg_last_set_table_tick[i] == label_tick) ! 9314: reg_last_set_invalid[i] = 1; ! 9315: else ! 9316: reg_last_set_invalid[i] = 0; ! 9317: } ! 9318: ! 9319: /* The value being assigned might refer to X (like in "x++;"). In that ! 9320: case, we must replace it with (clobber (const_int 0)) to prevent ! 9321: infinite loops. */ ! 9322: if (value && ! get_last_value_validate (&value, ! 9323: reg_last_set_label[regno], 0)) ! 9324: { ! 9325: value = copy_rtx (value); ! 9326: if (! get_last_value_validate (&value, reg_last_set_label[regno], 1)) ! 9327: value = 0; ! 9328: } ! 9329: ! 9330: /* For the main register being modified, update the value, the mode, the ! 9331: nonzero bits, and the number of sign bit copies. */ ! 9332: ! 9333: reg_last_set_value[regno] = value; ! 9334: ! 9335: if (value) ! 9336: { ! 9337: subst_low_cuid = INSN_CUID (insn); ! 9338: reg_last_set_mode[regno] = GET_MODE (reg); ! 9339: reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg)); ! 9340: reg_last_set_sign_bit_copies[regno] ! 9341: = num_sign_bit_copies (value, GET_MODE (reg)); ! 9342: } ! 9343: } ! 9344: ! 9345: /* Used for communication between the following two routines. */ ! 9346: static rtx record_dead_insn; ! 9347: ! 9348: /* Called via note_stores from record_dead_and_set_regs to handle one ! 9349: SET or CLOBBER in an insn. */ ! 9350: ! 9351: static void ! 9352: record_dead_and_set_regs_1 (dest, setter) ! 9353: rtx dest, setter; ! 9354: { ! 9355: if (GET_CODE (dest) == REG) ! 9356: { ! 9357: /* If we are setting the whole register, we know its value. Otherwise ! 9358: show that we don't know the value. We can handle SUBREG in ! 9359: some cases. */ ! 9360: if (GET_CODE (setter) == SET && dest == SET_DEST (setter)) ! 9361: record_value_for_reg (dest, record_dead_insn, SET_SRC (setter)); ! 9362: else if (GET_CODE (setter) == SET ! 9363: && GET_CODE (SET_DEST (setter)) == SUBREG ! 9364: && SUBREG_REG (SET_DEST (setter)) == dest ! 9365: && subreg_lowpart_p (SET_DEST (setter))) ! 9366: record_value_for_reg (dest, record_dead_insn, ! 9367: gen_lowpart_for_combine (GET_MODE (dest), ! 9368: SET_SRC (setter))); ! 9369: else ! 9370: record_value_for_reg (dest, record_dead_insn, NULL_RTX); ! 9371: } ! 9372: else if (GET_CODE (dest) == MEM ! 9373: /* Ignore pushes, they clobber nothing. */ ! 9374: && ! push_operand (dest, GET_MODE (dest))) ! 9375: mem_last_set = INSN_CUID (record_dead_insn); ! 9376: } ! 9377: ! 9378: /* Update the records of when each REG was most recently set or killed ! 9379: for the things done by INSN. This is the last thing done in processing ! 9380: INSN in the combiner loop. ! 9381: ! 9382: We update reg_last_set, reg_last_set_value, reg_last_set_mode, ! 9383: reg_last_set_nonzero_bits, reg_last_set_sign_bit_copies, reg_last_death, ! 9384: and also the similar information mem_last_set (which insn most recently ! 9385: modified memory) and last_call_cuid (which insn was the most recent ! 9386: subroutine call). */ ! 9387: ! 9388: static void ! 9389: record_dead_and_set_regs (insn) ! 9390: rtx insn; ! 9391: { ! 9392: register rtx link; ! 9393: int i; ! 9394: ! 9395: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) ! 9396: { ! 9397: if (REG_NOTE_KIND (link) == REG_DEAD ! 9398: && GET_CODE (XEXP (link, 0)) == REG) ! 9399: { ! 9400: int regno = REGNO (XEXP (link, 0)); ! 9401: int endregno ! 9402: = regno + (regno < FIRST_PSEUDO_REGISTER ! 9403: ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0))) ! 9404: : 1); ! 9405: ! 9406: for (i = regno; i < endregno; i++) ! 9407: reg_last_death[i] = insn; ! 9408: } ! 9409: else if (REG_NOTE_KIND (link) == REG_INC) ! 9410: record_value_for_reg (XEXP (link, 0), insn, NULL_RTX); ! 9411: } ! 9412: ! 9413: if (GET_CODE (insn) == CALL_INSN) ! 9414: { ! 9415: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 9416: if (call_used_regs[i]) ! 9417: { ! 9418: reg_last_set_value[i] = 0; ! 9419: reg_last_set_mode[i] = 0; ! 9420: reg_last_set_nonzero_bits[i] = 0; ! 9421: reg_last_set_sign_bit_copies[i] = 0; ! 9422: reg_last_death[i] = 0; ! 9423: } ! 9424: ! 9425: last_call_cuid = mem_last_set = INSN_CUID (insn); ! 9426: } ! 9427: ! 9428: record_dead_insn = insn; ! 9429: note_stores (PATTERN (insn), record_dead_and_set_regs_1); ! 9430: } ! 9431: ! 9432: /* Utility routine for the following function. Verify that all the registers ! 9433: mentioned in *LOC are valid when *LOC was part of a value set when ! 9434: label_tick == TICK. Return 0 if some are not. ! 9435: ! 9436: If REPLACE is non-zero, replace the invalid reference with ! 9437: (clobber (const_int 0)) and return 1. This replacement is useful because ! 9438: we often can get useful information about the form of a value (e.g., if ! 9439: it was produced by a shift that always produces -1 or 0) even though ! 9440: we don't know exactly what registers it was produced from. */ ! 9441: ! 9442: static int ! 9443: get_last_value_validate (loc, tick, replace) ! 9444: rtx *loc; ! 9445: int tick; ! 9446: int replace; ! 9447: { ! 9448: rtx x = *loc; ! 9449: char *fmt = GET_RTX_FORMAT (GET_CODE (x)); ! 9450: int len = GET_RTX_LENGTH (GET_CODE (x)); ! 9451: int i; ! 9452: ! 9453: if (GET_CODE (x) == REG) ! 9454: { ! 9455: int regno = REGNO (x); ! 9456: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER ! 9457: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); ! 9458: int j; ! 9459: ! 9460: for (j = regno; j < endregno; j++) ! 9461: if (reg_last_set_invalid[j] ! 9462: /* If this is a pseudo-register that was only set once, it is ! 9463: always valid. */ ! 9464: || (! (regno >= FIRST_PSEUDO_REGISTER && reg_n_sets[regno] == 1) ! 9465: && reg_last_set_label[j] > tick)) ! 9466: { ! 9467: if (replace) ! 9468: *loc = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); ! 9469: return replace; ! 9470: } ! 9471: ! 9472: return 1; ! 9473: } ! 9474: ! 9475: for (i = 0; i < len; i++) ! 9476: if ((fmt[i] == 'e' ! 9477: && get_last_value_validate (&XEXP (x, i), tick, replace) == 0) ! 9478: /* Don't bother with these. They shouldn't occur anyway. */ ! 9479: || fmt[i] == 'E') ! 9480: return 0; ! 9481: ! 9482: /* If we haven't found a reason for it to be invalid, it is valid. */ ! 9483: return 1; ! 9484: } ! 9485: ! 9486: /* Get the last value assigned to X, if known. Some registers ! 9487: in the value may be replaced with (clobber (const_int 0)) if their value ! 9488: is known longer known reliably. */ ! 9489: ! 9490: static rtx ! 9491: get_last_value (x) ! 9492: rtx x; ! 9493: { ! 9494: int regno; ! 9495: rtx value; ! 9496: ! 9497: /* If this is a non-paradoxical SUBREG, get the value of its operand and ! 9498: then convert it to the desired mode. If this is a paradoxical SUBREG, ! 9499: we cannot predict what values the "extra" bits might have. */ ! 9500: if (GET_CODE (x) == SUBREG ! 9501: && subreg_lowpart_p (x) ! 9502: && (GET_MODE_SIZE (GET_MODE (x)) ! 9503: <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 9504: && (value = get_last_value (SUBREG_REG (x))) != 0) ! 9505: return gen_lowpart_for_combine (GET_MODE (x), value); ! 9506: ! 9507: if (GET_CODE (x) != REG) ! 9508: return 0; ! 9509: ! 9510: regno = REGNO (x); ! 9511: value = reg_last_set_value[regno]; ! 9512: ! 9513: /* If we don't have a value or if it isn't for this basic block, return 0. */ ! 9514: ! 9515: if (value == 0 ! 9516: || (reg_n_sets[regno] != 1 ! 9517: && reg_last_set_label[regno] != label_tick)) ! 9518: return 0; ! 9519: ! 9520: /* If the value was set in a later insn that the ones we are processing, ! 9521: we can't use it even if the register was only set once, but make a quick ! 9522: check to see if the previous insn set it to something. This is commonly ! 9523: the case when the same pseudo is used by repeated insns. */ ! 9524: ! 9525: if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid) ! 9526: { ! 9527: rtx insn, set; ! 9528: ! 9529: /* If there is an insn that is supposed to be immediately ! 9530: in front of subst_insn, use it. */ ! 9531: if (subst_prev_insn != 0) ! 9532: insn = subst_prev_insn; ! 9533: else ! 9534: for (insn = prev_nonnote_insn (subst_insn); ! 9535: insn && INSN_CUID (insn) >= subst_low_cuid; ! 9536: insn = prev_nonnote_insn (insn)) ! 9537: ; ! 9538: ! 9539: if (insn ! 9540: && (set = single_set (insn)) != 0 ! 9541: && rtx_equal_p (SET_DEST (set), x)) ! 9542: { ! 9543: value = SET_SRC (set); ! 9544: ! 9545: /* Make sure that VALUE doesn't reference X. Replace any ! 9546: expliit references with a CLOBBER. If there are any remaining ! 9547: references (rare), don't use the value. */ ! 9548: ! 9549: if (reg_mentioned_p (x, value)) ! 9550: value = replace_rtx (copy_rtx (value), x, ! 9551: gen_rtx (CLOBBER, GET_MODE (x), const0_rtx)); ! 9552: ! 9553: if (reg_overlap_mentioned_p (x, value)) ! 9554: return 0; ! 9555: } ! 9556: else ! 9557: return 0; ! 9558: } ! 9559: ! 9560: /* If the value has all its registers valid, return it. */ ! 9561: if (get_last_value_validate (&value, reg_last_set_label[regno], 0)) ! 9562: return value; ! 9563: ! 9564: /* Otherwise, make a copy and replace any invalid register with ! 9565: (clobber (const_int 0)). If that fails for some reason, return 0. */ ! 9566: ! 9567: value = copy_rtx (value); ! 9568: if (get_last_value_validate (&value, reg_last_set_label[regno], 1)) ! 9569: return value; ! 9570: ! 9571: return 0; ! 9572: } ! 9573: ! 9574: /* Return nonzero if expression X refers to a REG or to memory ! 9575: that is set in an instruction more recent than FROM_CUID. */ ! 9576: ! 9577: static int ! 9578: use_crosses_set_p (x, from_cuid) ! 9579: register rtx x; ! 9580: int from_cuid; ! 9581: { ! 9582: register char *fmt; ! 9583: register int i; ! 9584: register enum rtx_code code = GET_CODE (x); ! 9585: ! 9586: if (code == REG) ! 9587: { ! 9588: register int regno = REGNO (x); ! 9589: int endreg = regno + (regno < FIRST_PSEUDO_REGISTER ! 9590: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); ! 9591: ! 9592: #ifdef PUSH_ROUNDING ! 9593: /* Don't allow uses of the stack pointer to be moved, ! 9594: because we don't know whether the move crosses a push insn. */ ! 9595: if (regno == STACK_POINTER_REGNUM) ! 9596: return 1; ! 9597: #endif ! 9598: for (;regno < endreg; regno++) ! 9599: if (reg_last_set[regno] ! 9600: && INSN_CUID (reg_last_set[regno]) > from_cuid) ! 9601: return 1; ! 9602: return 0; ! 9603: } ! 9604: ! 9605: if (code == MEM && mem_last_set > from_cuid) ! 9606: return 1; ! 9607: ! 9608: fmt = GET_RTX_FORMAT (code); ! 9609: ! 9610: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 9611: { ! 9612: if (fmt[i] == 'E') ! 9613: { ! 9614: register int j; ! 9615: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 9616: if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid)) ! 9617: return 1; ! 9618: } ! 9619: else if (fmt[i] == 'e' ! 9620: && use_crosses_set_p (XEXP (x, i), from_cuid)) ! 9621: return 1; ! 9622: } ! 9623: return 0; ! 9624: } ! 9625: ! 9626: /* Define three variables used for communication between the following ! 9627: routines. */ ! 9628: ! 9629: static int reg_dead_regno, reg_dead_endregno; ! 9630: static int reg_dead_flag; ! 9631: ! 9632: /* Function called via note_stores from reg_dead_at_p. ! 9633: ! 9634: If DEST is within [reg_dead_rengno, reg_dead_endregno), set ! 9635: reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */ ! 9636: ! 9637: static void ! 9638: reg_dead_at_p_1 (dest, x) ! 9639: rtx dest; ! 9640: rtx x; ! 9641: { ! 9642: int regno, endregno; ! 9643: ! 9644: if (GET_CODE (dest) != REG) ! 9645: return; ! 9646: ! 9647: regno = REGNO (dest); ! 9648: endregno = regno + (regno < FIRST_PSEUDO_REGISTER ! 9649: ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1); ! 9650: ! 9651: if (reg_dead_endregno > regno && reg_dead_regno < endregno) ! 9652: reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1; ! 9653: } ! 9654: ! 9655: /* Return non-zero if REG is known to be dead at INSN. ! 9656: ! 9657: We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER ! 9658: referencing REG, it is dead. If we hit a SET referencing REG, it is ! 9659: live. Otherwise, see if it is live or dead at the start of the basic ! 9660: block we are in. */ ! 9661: ! 9662: static int ! 9663: reg_dead_at_p (reg, insn) ! 9664: rtx reg; ! 9665: rtx insn; ! 9666: { ! 9667: int block, i; ! 9668: ! 9669: /* Set variables for reg_dead_at_p_1. */ ! 9670: reg_dead_regno = REGNO (reg); ! 9671: reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER ! 9672: ? HARD_REGNO_NREGS (reg_dead_regno, ! 9673: GET_MODE (reg)) ! 9674: : 1); ! 9675: ! 9676: reg_dead_flag = 0; ! 9677: ! 9678: /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or ! 9679: beginning of function. */ ! 9680: for (; insn && GET_CODE (insn) != CODE_LABEL; ! 9681: insn = prev_nonnote_insn (insn)) ! 9682: { ! 9683: note_stores (PATTERN (insn), reg_dead_at_p_1); ! 9684: if (reg_dead_flag) ! 9685: return reg_dead_flag == 1 ? 1 : 0; ! 9686: ! 9687: if (find_regno_note (insn, REG_DEAD, reg_dead_regno)) ! 9688: return 1; ! 9689: } ! 9690: ! 9691: /* Get the basic block number that we were in. */ ! 9692: if (insn == 0) ! 9693: block = 0; ! 9694: else ! 9695: { ! 9696: for (block = 0; block < n_basic_blocks; block++) ! 9697: if (insn == basic_block_head[block]) ! 9698: break; ! 9699: ! 9700: if (block == n_basic_blocks) ! 9701: return 0; ! 9702: } ! 9703: ! 9704: for (i = reg_dead_regno; i < reg_dead_endregno; i++) ! 9705: if (basic_block_live_at_start[block][i / REGSET_ELT_BITS] ! 9706: & ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS))) ! 9707: return 0; ! 9708: ! 9709: return 1; ! 9710: } ! 9711: ! 9712: /* Remove register number REGNO from the dead registers list of INSN. ! 9713: ! 9714: Return the note used to record the death, if there was one. */ ! 9715: ! 9716: rtx ! 9717: remove_death (regno, insn) ! 9718: int regno; ! 9719: rtx insn; ! 9720: { ! 9721: register rtx note = find_regno_note (insn, REG_DEAD, regno); ! 9722: ! 9723: if (note) ! 9724: { ! 9725: reg_n_deaths[regno]--; ! 9726: remove_note (insn, note); ! 9727: } ! 9728: ! 9729: return note; ! 9730: } ! 9731: ! 9732: /* For each register (hardware or pseudo) used within expression X, if its ! 9733: death is in an instruction with cuid between FROM_CUID (inclusive) and ! 9734: TO_INSN (exclusive), put a REG_DEAD note for that register in the ! 9735: list headed by PNOTES. ! 9736: ! 9737: This is done when X is being merged by combination into TO_INSN. These ! 9738: notes will then be distributed as needed. */ ! 9739: ! 9740: static void ! 9741: move_deaths (x, from_cuid, to_insn, pnotes) ! 9742: rtx x; ! 9743: int from_cuid; ! 9744: rtx to_insn; ! 9745: rtx *pnotes; ! 9746: { ! 9747: register char *fmt; ! 9748: register int len, i; ! 9749: register enum rtx_code code = GET_CODE (x); ! 9750: ! 9751: if (code == REG) ! 9752: { ! 9753: register int regno = REGNO (x); ! 9754: register rtx where_dead = reg_last_death[regno]; ! 9755: ! 9756: if (where_dead && INSN_CUID (where_dead) >= from_cuid ! 9757: && INSN_CUID (where_dead) < INSN_CUID (to_insn)) ! 9758: { ! 9759: rtx note = remove_death (regno, where_dead); ! 9760: ! 9761: /* It is possible for the call above to return 0. This can occur ! 9762: when reg_last_death points to I2 or I1 that we combined with. ! 9763: In that case make a new note. ! 9764: ! 9765: We must also check for the case where X is a hard register ! 9766: and NOTE is a death note for a range of hard registers ! 9767: including X. In that case, we must put REG_DEAD notes for ! 9768: the remaining registers in place of NOTE. */ ! 9769: ! 9770: if (note != 0 && regno < FIRST_PSEUDO_REGISTER ! 9771: && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) ! 9772: != GET_MODE_SIZE (GET_MODE (x)))) ! 9773: { ! 9774: int deadregno = REGNO (XEXP (note, 0)); ! 9775: int deadend ! 9776: = (deadregno + HARD_REGNO_NREGS (deadregno, ! 9777: GET_MODE (XEXP (note, 0)))); ! 9778: int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 9779: int i; ! 9780: ! 9781: for (i = deadregno; i < deadend; i++) ! 9782: if (i < regno || i >= ourend) ! 9783: REG_NOTES (where_dead) ! 9784: = gen_rtx (EXPR_LIST, REG_DEAD, ! 9785: gen_rtx (REG, word_mode, i), ! 9786: REG_NOTES (where_dead)); ! 9787: } ! 9788: ! 9789: if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x)) ! 9790: { ! 9791: XEXP (note, 1) = *pnotes; ! 9792: *pnotes = note; ! 9793: } ! 9794: else ! 9795: *pnotes = gen_rtx (EXPR_LIST, REG_DEAD, x, *pnotes); ! 9796: ! 9797: reg_n_deaths[regno]++; ! 9798: } ! 9799: ! 9800: return; ! 9801: } ! 9802: ! 9803: else if (GET_CODE (x) == SET) ! 9804: { ! 9805: rtx dest = SET_DEST (x); ! 9806: ! 9807: move_deaths (SET_SRC (x), from_cuid, to_insn, pnotes); ! 9808: ! 9809: /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG ! 9810: that accesses one word of a multi-word item, some ! 9811: piece of everything register in the expression is used by ! 9812: this insn, so remove any old death. */ ! 9813: ! 9814: if (GET_CODE (dest) == ZERO_EXTRACT ! 9815: || GET_CODE (dest) == STRICT_LOW_PART ! 9816: || (GET_CODE (dest) == SUBREG ! 9817: && (((GET_MODE_SIZE (GET_MODE (dest)) ! 9818: + UNITS_PER_WORD - 1) / UNITS_PER_WORD) ! 9819: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) ! 9820: + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))) ! 9821: { ! 9822: move_deaths (dest, from_cuid, to_insn, pnotes); ! 9823: return; ! 9824: } ! 9825: ! 9826: /* If this is some other SUBREG, we know it replaces the entire ! 9827: value, so use that as the destination. */ ! 9828: if (GET_CODE (dest) == SUBREG) ! 9829: dest = SUBREG_REG (dest); ! 9830: ! 9831: /* If this is a MEM, adjust deaths of anything used in the address. ! 9832: For a REG (the only other possibility), the entire value is ! 9833: being replaced so the old value is not used in this insn. */ ! 9834: ! 9835: if (GET_CODE (dest) == MEM) ! 9836: move_deaths (XEXP (dest, 0), from_cuid, to_insn, pnotes); ! 9837: return; ! 9838: } ! 9839: ! 9840: else if (GET_CODE (x) == CLOBBER) ! 9841: return; ! 9842: ! 9843: len = GET_RTX_LENGTH (code); ! 9844: fmt = GET_RTX_FORMAT (code); ! 9845: ! 9846: for (i = 0; i < len; i++) ! 9847: { ! 9848: if (fmt[i] == 'E') ! 9849: { ! 9850: register int j; ! 9851: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 9852: move_deaths (XVECEXP (x, i, j), from_cuid, to_insn, pnotes); ! 9853: } ! 9854: else if (fmt[i] == 'e') ! 9855: move_deaths (XEXP (x, i), from_cuid, to_insn, pnotes); ! 9856: } ! 9857: } ! 9858: ! 9859: /* Return 1 if X is the target of a bit-field assignment in BODY, the ! 9860: pattern of an insn. X must be a REG. */ ! 9861: ! 9862: static int ! 9863: reg_bitfield_target_p (x, body) ! 9864: rtx x; ! 9865: rtx body; ! 9866: { ! 9867: int i; ! 9868: ! 9869: if (GET_CODE (body) == SET) ! 9870: { ! 9871: rtx dest = SET_DEST (body); ! 9872: rtx target; ! 9873: int regno, tregno, endregno, endtregno; ! 9874: ! 9875: if (GET_CODE (dest) == ZERO_EXTRACT) ! 9876: target = XEXP (dest, 0); ! 9877: else if (GET_CODE (dest) == STRICT_LOW_PART) ! 9878: target = SUBREG_REG (XEXP (dest, 0)); ! 9879: else ! 9880: return 0; ! 9881: ! 9882: if (GET_CODE (target) == SUBREG) ! 9883: target = SUBREG_REG (target); ! 9884: ! 9885: if (GET_CODE (target) != REG) ! 9886: return 0; ! 9887: ! 9888: tregno = REGNO (target), regno = REGNO (x); ! 9889: if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER) ! 9890: return target == x; ! 9891: ! 9892: endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target)); ! 9893: endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 9894: ! 9895: return endregno > tregno && regno < endtregno; ! 9896: } ! 9897: ! 9898: else if (GET_CODE (body) == PARALLEL) ! 9899: for (i = XVECLEN (body, 0) - 1; i >= 0; i--) ! 9900: if (reg_bitfield_target_p (x, XVECEXP (body, 0, i))) ! 9901: return 1; ! 9902: ! 9903: return 0; ! 9904: } ! 9905: ! 9906: /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them ! 9907: as appropriate. I3 and I2 are the insns resulting from the combination ! 9908: insns including FROM (I2 may be zero). ! 9909: ! 9910: ELIM_I2 and ELIM_I1 are either zero or registers that we know will ! 9911: not need REG_DEAD notes because they are being substituted for. This ! 9912: saves searching in the most common cases. ! 9913: ! 9914: Each note in the list is either ignored or placed on some insns, depending ! 9915: on the type of note. */ ! 9916: ! 9917: static void ! 9918: distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) ! 9919: rtx notes; ! 9920: rtx from_insn; ! 9921: rtx i3, i2; ! 9922: rtx elim_i2, elim_i1; ! 9923: { ! 9924: rtx note, next_note; ! 9925: rtx tem; ! 9926: ! 9927: for (note = notes; note; note = next_note) ! 9928: { ! 9929: rtx place = 0, place2 = 0; ! 9930: ! 9931: /* If this NOTE references a pseudo register, ensure it references ! 9932: the latest copy of that register. */ ! 9933: if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG ! 9934: && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER) ! 9935: XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))]; ! 9936: ! 9937: next_note = XEXP (note, 1); ! 9938: switch (REG_NOTE_KIND (note)) ! 9939: { ! 9940: case REG_UNUSED: ! 9941: /* If this note is from any insn other than i3, then we have no ! 9942: use for it, and must ignore it. ! 9943: ! 9944: Any clobbers for i3 may still exist, and so we must process ! 9945: REG_UNUSED notes from that insn. ! 9946: ! 9947: Any clobbers from i2 or i1 can only exist if they were added by ! 9948: recog_for_combine. In that case, recog_for_combine created the ! 9949: necessary REG_UNUSED notes. Trying to keep any original ! 9950: REG_UNUSED notes from these insns can cause incorrect output ! 9951: if it is for the same register as the original i3 dest. ! 9952: In that case, we will notice that the register is set in i3, ! 9953: and then add a REG_UNUSED note for the destination of i3, which ! 9954: is wrong. */ ! 9955: if (from_insn != i3) ! 9956: break; ! 9957: ! 9958: /* If this register is set or clobbered in I3, put the note there ! 9959: unless there is one already. */ ! 9960: else if (reg_set_p (XEXP (note, 0), PATTERN (i3))) ! 9961: { ! 9962: if (! (GET_CODE (XEXP (note, 0)) == REG ! 9963: ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0))) ! 9964: : find_reg_note (i3, REG_UNUSED, XEXP (note, 0)))) ! 9965: place = i3; ! 9966: } ! 9967: /* Otherwise, if this register is used by I3, then this register ! 9968: now dies here, so we must put a REG_DEAD note here unless there ! 9969: is one already. */ ! 9970: else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)) ! 9971: && ! (GET_CODE (XEXP (note, 0)) == REG ! 9972: ? find_regno_note (i3, REG_DEAD, REGNO (XEXP (note, 0))) ! 9973: : find_reg_note (i3, REG_DEAD, XEXP (note, 0)))) ! 9974: { ! 9975: PUT_REG_NOTE_KIND (note, REG_DEAD); ! 9976: place = i3; ! 9977: } ! 9978: break; ! 9979: ! 9980: case REG_EQUAL: ! 9981: case REG_EQUIV: ! 9982: case REG_NONNEG: ! 9983: /* These notes say something about results of an insn. We can ! 9984: only support them if they used to be on I3 in which case they ! 9985: remain on I3. Otherwise they are ignored. ! 9986: ! 9987: If the note refers to an expression that is not a constant, we ! 9988: must also ignore the note since we cannot tell whether the ! 9989: equivalence is still true. It might be possible to do ! 9990: slightly better than this (we only have a problem if I2DEST ! 9991: or I1DEST is present in the expression), but it doesn't ! 9992: seem worth the trouble. */ ! 9993: ! 9994: if (from_insn == i3 ! 9995: && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0)))) ! 9996: place = i3; ! 9997: break; ! 9998: ! 9999: case REG_INC: ! 10000: case REG_NO_CONFLICT: ! 10001: case REG_LABEL: ! 10002: /* These notes say something about how a register is used. They must ! 10003: be present on any use of the register in I2 or I3. */ ! 10004: if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))) ! 10005: place = i3; ! 10006: ! 10007: if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2))) ! 10008: { ! 10009: if (place) ! 10010: place2 = i2; ! 10011: else ! 10012: place = i2; ! 10013: } ! 10014: break; ! 10015: ! 10016: case REG_WAS_0: ! 10017: /* It is too much trouble to try to see if this note is still ! 10018: correct in all situations. It is better to simply delete it. */ ! 10019: break; ! 10020: ! 10021: case REG_RETVAL: ! 10022: /* If the insn previously containing this note still exists, ! 10023: put it back where it was. Otherwise move it to the previous ! 10024: insn. Adjust the corresponding REG_LIBCALL note. */ ! 10025: if (GET_CODE (from_insn) != NOTE) ! 10026: place = from_insn; ! 10027: else ! 10028: { ! 10029: tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX); ! 10030: place = prev_real_insn (from_insn); ! 10031: if (tem && place) ! 10032: XEXP (tem, 0) = place; ! 10033: } ! 10034: break; ! 10035: ! 10036: case REG_LIBCALL: ! 10037: /* This is handled similarly to REG_RETVAL. */ ! 10038: if (GET_CODE (from_insn) != NOTE) ! 10039: place = from_insn; ! 10040: else ! 10041: { ! 10042: tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX); ! 10043: place = next_real_insn (from_insn); ! 10044: if (tem && place) ! 10045: XEXP (tem, 0) = place; ! 10046: } ! 10047: break; ! 10048: ! 10049: case REG_DEAD: ! 10050: /* If the register is used as an input in I3, it dies there. ! 10051: Similarly for I2, if it is non-zero and adjacent to I3. ! 10052: ! 10053: If the register is not used as an input in either I3 or I2 ! 10054: and it is not one of the registers we were supposed to eliminate, ! 10055: there are two possibilities. We might have a non-adjacent I2 ! 10056: or we might have somehow eliminated an additional register ! 10057: from a computation. For example, we might have had A & B where ! 10058: we discover that B will always be zero. In this case we will ! 10059: eliminate the reference to A. ! 10060: ! 10061: In both cases, we must search to see if we can find a previous ! 10062: use of A and put the death note there. */ ! 10063: ! 10064: if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))) ! 10065: place = i3; ! 10066: else if (i2 != 0 && next_nonnote_insn (i2) == i3 ! 10067: && reg_referenced_p (XEXP (note, 0), PATTERN (i2))) ! 10068: place = i2; ! 10069: ! 10070: if (XEXP (note, 0) == elim_i2 || XEXP (note, 0) == elim_i1) ! 10071: break; ! 10072: ! 10073: /* If the register is used in both I2 and I3 and it dies in I3, ! 10074: we might have added another reference to it. If reg_n_refs ! 10075: was 2, bump it to 3. This has to be correct since the ! 10076: register must have been set somewhere. The reason this is ! 10077: done is because local-alloc.c treats 2 references as a ! 10078: special case. */ ! 10079: ! 10080: if (place == i3 && i2 != 0 && GET_CODE (XEXP (note, 0)) == REG ! 10081: && reg_n_refs[REGNO (XEXP (note, 0))]== 2 ! 10082: && reg_referenced_p (XEXP (note, 0), PATTERN (i2))) ! 10083: reg_n_refs[REGNO (XEXP (note, 0))] = 3; ! 10084: ! 10085: if (place == 0) ! 10086: for (tem = prev_nonnote_insn (i3); ! 10087: tem && (GET_CODE (tem) == INSN ! 10088: || GET_CODE (tem) == CALL_INSN); ! 10089: tem = prev_nonnote_insn (tem)) ! 10090: { ! 10091: /* If the register is being set at TEM, see if that is all ! 10092: TEM is doing. If so, delete TEM. Otherwise, make this ! 10093: into a REG_UNUSED note instead. */ ! 10094: if (reg_set_p (XEXP (note, 0), PATTERN (tem))) ! 10095: { ! 10096: rtx set = single_set (tem); ! 10097: ! 10098: /* Verify that it was the set, and not a clobber that ! 10099: modified the register. */ ! 10100: ! 10101: if (set != 0 && ! side_effects_p (SET_SRC (set)) ! 10102: && rtx_equal_p (XEXP (note, 0), SET_DEST (set))) ! 10103: { ! 10104: /* Move the notes and links of TEM elsewhere. ! 10105: This might delete other dead insns recursively. ! 10106: First set the pattern to something that won't use ! 10107: any register. */ ! 10108: ! 10109: PATTERN (tem) = pc_rtx; ! 10110: ! 10111: distribute_notes (REG_NOTES (tem), tem, tem, ! 10112: NULL_RTX, NULL_RTX, NULL_RTX); ! 10113: distribute_links (LOG_LINKS (tem)); ! 10114: ! 10115: PUT_CODE (tem, NOTE); ! 10116: NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED; ! 10117: NOTE_SOURCE_FILE (tem) = 0; ! 10118: } ! 10119: else ! 10120: { ! 10121: PUT_REG_NOTE_KIND (note, REG_UNUSED); ! 10122: ! 10123: /* If there isn't already a REG_UNUSED note, put one ! 10124: here. */ ! 10125: if (! find_regno_note (tem, REG_UNUSED, ! 10126: REGNO (XEXP (note, 0)))) ! 10127: place = tem; ! 10128: break; ! 10129: } ! 10130: } ! 10131: else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem))) ! 10132: { ! 10133: place = tem; ! 10134: break; ! 10135: } ! 10136: } ! 10137: ! 10138: /* If the register is set or already dead at PLACE, we needn't do ! 10139: anything with this note if it is still a REG_DEAD note. ! 10140: ! 10141: Note that we cannot use just `dead_or_set_p' here since we can ! 10142: convert an assignment to a register into a bit-field assignment. ! 10143: Therefore, we must also omit the note if the register is the ! 10144: target of a bitfield assignment. */ ! 10145: ! 10146: if (place && REG_NOTE_KIND (note) == REG_DEAD) ! 10147: { ! 10148: int regno = REGNO (XEXP (note, 0)); ! 10149: ! 10150: if (dead_or_set_p (place, XEXP (note, 0)) ! 10151: || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place))) ! 10152: { ! 10153: /* Unless the register previously died in PLACE, clear ! 10154: reg_last_death. [I no longer understand why this is ! 10155: being done.] */ ! 10156: if (reg_last_death[regno] != place) ! 10157: reg_last_death[regno] = 0; ! 10158: place = 0; ! 10159: } ! 10160: else ! 10161: reg_last_death[regno] = place; ! 10162: ! 10163: /* If this is a death note for a hard reg that is occupying ! 10164: multiple registers, ensure that we are still using all ! 10165: parts of the object. If we find a piece of the object ! 10166: that is unused, we must add a USE for that piece before ! 10167: PLACE and put the appropriate REG_DEAD note on it. ! 10168: ! 10169: An alternative would be to put a REG_UNUSED for the pieces ! 10170: on the insn that set the register, but that can't be done if ! 10171: it is not in the same block. It is simpler, though less ! 10172: efficient, to add the USE insns. */ ! 10173: ! 10174: if (place && regno < FIRST_PSEUDO_REGISTER ! 10175: && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1) ! 10176: { ! 10177: int endregno ! 10178: = regno + HARD_REGNO_NREGS (regno, ! 10179: GET_MODE (XEXP (note, 0))); ! 10180: int all_used = 1; ! 10181: int i; ! 10182: ! 10183: for (i = regno; i < endregno; i++) ! 10184: if (! refers_to_regno_p (i, i + 1, PATTERN (place), 0)) ! 10185: { ! 10186: rtx piece = gen_rtx (REG, word_mode, i); ! 10187: rtx p; ! 10188: ! 10189: /* See if we already placed a USE note for this ! 10190: register in front of PLACE. */ ! 10191: for (p = place; ! 10192: GET_CODE (PREV_INSN (p)) == INSN ! 10193: && GET_CODE (PATTERN (PREV_INSN (p))) == USE; ! 10194: p = PREV_INSN (p)) ! 10195: if (rtx_equal_p (piece, ! 10196: XEXP (PATTERN (PREV_INSN (p)), 0))) ! 10197: { ! 10198: p = 0; ! 10199: break; ! 10200: } ! 10201: ! 10202: if (p) ! 10203: { ! 10204: rtx use_insn ! 10205: = emit_insn_before (gen_rtx (USE, VOIDmode, ! 10206: piece), ! 10207: p); ! 10208: REG_NOTES (use_insn) ! 10209: = gen_rtx (EXPR_LIST, REG_DEAD, piece, ! 10210: REG_NOTES (use_insn)); ! 10211: } ! 10212: ! 10213: all_used = 0; ! 10214: } ! 10215: ! 10216: /* Check for the case where the register dying partially ! 10217: overlaps the register set by this insn. */ ! 10218: if (all_used) ! 10219: for (i = regno; i < endregno; i++) ! 10220: if (dead_or_set_regno_p (place, i)) ! 10221: { ! 10222: all_used = 0; ! 10223: break; ! 10224: } ! 10225: ! 10226: if (! all_used) ! 10227: { ! 10228: /* Put only REG_DEAD notes for pieces that are ! 10229: still used and that are not already dead or set. */ ! 10230: ! 10231: for (i = regno; i < endregno; i++) ! 10232: { ! 10233: rtx piece = gen_rtx (REG, word_mode, i); ! 10234: ! 10235: if (reg_referenced_p (piece, PATTERN (place)) ! 10236: && ! dead_or_set_p (place, piece) ! 10237: && ! reg_bitfield_target_p (piece, ! 10238: PATTERN (place))) ! 10239: REG_NOTES (place) = gen_rtx (EXPR_LIST, REG_DEAD, ! 10240: piece, ! 10241: REG_NOTES (place)); ! 10242: } ! 10243: ! 10244: place = 0; ! 10245: } ! 10246: } ! 10247: } ! 10248: break; ! 10249: ! 10250: default: ! 10251: /* Any other notes should not be present at this point in the ! 10252: compilation. */ ! 10253: abort (); ! 10254: } ! 10255: ! 10256: if (place) ! 10257: { ! 10258: XEXP (note, 1) = REG_NOTES (place); ! 10259: REG_NOTES (place) = note; ! 10260: } ! 10261: else if ((REG_NOTE_KIND (note) == REG_DEAD ! 10262: || REG_NOTE_KIND (note) == REG_UNUSED) ! 10263: && GET_CODE (XEXP (note, 0)) == REG) ! 10264: reg_n_deaths[REGNO (XEXP (note, 0))]--; ! 10265: ! 10266: if (place2) ! 10267: { ! 10268: if ((REG_NOTE_KIND (note) == REG_DEAD ! 10269: || REG_NOTE_KIND (note) == REG_UNUSED) ! 10270: && GET_CODE (XEXP (note, 0)) == REG) ! 10271: reg_n_deaths[REGNO (XEXP (note, 0))]++; ! 10272: ! 10273: REG_NOTES (place2) = gen_rtx (GET_CODE (note), REG_NOTE_KIND (note), ! 10274: XEXP (note, 0), REG_NOTES (place2)); ! 10275: } ! 10276: } ! 10277: } ! 10278: ! 10279: /* Similarly to above, distribute the LOG_LINKS that used to be present on ! 10280: I3, I2, and I1 to new locations. This is also called in one case to ! 10281: add a link pointing at I3 when I3's destination is changed. */ ! 10282: ! 10283: static void ! 10284: distribute_links (links) ! 10285: rtx links; ! 10286: { ! 10287: rtx link, next_link; ! 10288: ! 10289: for (link = links; link; link = next_link) ! 10290: { ! 10291: rtx place = 0; ! 10292: rtx insn; ! 10293: rtx set, reg; ! 10294: ! 10295: next_link = XEXP (link, 1); ! 10296: ! 10297: /* If the insn that this link points to is a NOTE or isn't a single ! 10298: set, ignore it. In the latter case, it isn't clear what we ! 10299: can do other than ignore the link, since we can't tell which ! 10300: register it was for. Such links wouldn't be used by combine ! 10301: anyway. ! 10302: ! 10303: It is not possible for the destination of the target of the link to ! 10304: have been changed by combine. The only potential of this is if we ! 10305: replace I3, I2, and I1 by I3 and I2. But in that case the ! 10306: destination of I2 also remains unchanged. */ ! 10307: ! 10308: if (GET_CODE (XEXP (link, 0)) == NOTE ! 10309: || (set = single_set (XEXP (link, 0))) == 0) ! 10310: continue; ! 10311: ! 10312: reg = SET_DEST (set); ! 10313: while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT ! 10314: || GET_CODE (reg) == SIGN_EXTRACT ! 10315: || GET_CODE (reg) == STRICT_LOW_PART) ! 10316: reg = XEXP (reg, 0); ! 10317: ! 10318: /* A LOG_LINK is defined as being placed on the first insn that uses ! 10319: a register and points to the insn that sets the register. Start ! 10320: searching at the next insn after the target of the link and stop ! 10321: when we reach a set of the register or the end of the basic block. ! 10322: ! 10323: Note that this correctly handles the link that used to point from ! 10324: I3 to I2. Also note that not much searching is typically done here ! 10325: since most links don't point very far away. */ ! 10326: ! 10327: for (insn = NEXT_INSN (XEXP (link, 0)); ! 10328: (insn && (this_basic_block == n_basic_blocks - 1 ! 10329: || basic_block_head[this_basic_block + 1] != insn)); ! 10330: insn = NEXT_INSN (insn)) ! 10331: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' ! 10332: && reg_overlap_mentioned_p (reg, PATTERN (insn))) ! 10333: { ! 10334: if (reg_referenced_p (reg, PATTERN (insn))) ! 10335: place = insn; ! 10336: break; ! 10337: } ! 10338: ! 10339: /* If we found a place to put the link, place it there unless there ! 10340: is already a link to the same insn as LINK at that point. */ ! 10341: ! 10342: if (place) ! 10343: { ! 10344: rtx link2; ! 10345: ! 10346: for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1)) ! 10347: if (XEXP (link2, 0) == XEXP (link, 0)) ! 10348: break; ! 10349: ! 10350: if (link2 == 0) ! 10351: { ! 10352: XEXP (link, 1) = LOG_LINKS (place); ! 10353: LOG_LINKS (place) = link; ! 10354: } ! 10355: } ! 10356: } ! 10357: } ! 10358: ! 10359: void ! 10360: dump_combine_stats (file) ! 10361: FILE *file; ! 10362: { ! 10363: fprintf ! 10364: (file, ! 10365: ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n", ! 10366: combine_attempts, combine_merges, combine_extras, combine_successes); ! 10367: } ! 10368: ! 10369: void ! 10370: dump_combine_total_stats (file) ! 10371: FILE *file; ! 10372: { ! 10373: fprintf ! 10374: (file, ! 10375: "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n", ! 10376: total_attempts, total_merges, total_extras, total_successes); ! 10377: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.