|
|
1.1 root 1: /* Optimize by combining instructions for GNU compiler. 1.1.1.8 ! root 2: Copyright (C) 1987, 88, 92, 93, 94, 1995 Free Software Foundation, Inc. 1.1 root 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 1.1.1.8 ! root 18: the Free Software Foundation, 59 Temple Place - Suite 330, ! 19: Boston, MA 02111-1307, USA. */ 1.1 root 20: 21: 22: /* This module is essentially the "combiner" phase of the U. of Arizona 23: Portable Optimizer, but redone to work on our list-structured 24: representation for RTL instead of their string representation. 25: 26: The LOG_LINKS of each insn identify the most recent assignment 27: to each REG used in the insn. It is a list of previous insns, 28: each of which contains a SET for a REG that is used in this insn 29: and not used or set in between. LOG_LINKs never cross basic blocks. 30: They were set up by the preceding pass (lifetime analysis). 31: 32: We try to combine each pair of insns joined by a logical link. 33: We also try to combine triples of insns A, B and C when 34: C has a link back to B and B has a link back to A. 35: 36: LOG_LINKS does not have links for use of the CC0. They don't 37: need to, because the insn that sets the CC0 is always immediately 38: before the insn that tests it. So we always regard a branch 39: insn as having a logical link to the preceding insn. The same is true 40: for an insn explicitly using CC0. 41: 42: We check (with use_crosses_set_p) to avoid combining in such a way 43: as to move a computation to a place where its value would be different. 44: 45: Combination is done by mathematically substituting the previous 46: insn(s) values for the regs they set into the expressions in 47: the later insns that refer to these regs. If the result is a valid insn 48: for our target machine, according to the machine description, 49: we install it, delete the earlier insns, and update the data flow 50: information (LOG_LINKS and REG_NOTES) for what we did. 51: 52: There are a few exceptions where the dataflow information created by 53: flow.c aren't completely updated: 54: 55: - reg_live_length is not updated 56: - reg_n_refs is not adjusted in the rare case when a register is 57: no longer required in a computation 58: - there are extremely rare cases (see distribute_regnotes) when a 59: REG_DEAD note is lost 60: - a LOG_LINKS entry that refers to an insn with multiple SETs may be 61: removed because there is no way to know which register it was 62: linking 63: 64: To simplify substitution, we combine only when the earlier insn(s) 65: consist of only a single assignment. To simplify updating afterward, 66: we never combine when a subroutine call appears in the middle. 67: 68: Since we do not represent assignments to CC0 explicitly except when that 69: is all an insn does, there is no LOG_LINKS entry in an insn that uses 70: the condition code for the insn that set the condition code. 71: Fortunately, these two insns must be consecutive. 72: Therefore, every JUMP_INSN is taken to have an implicit logical link 73: to the preceding insn. This is not quite right, since non-jumps can 74: also use the condition code; but in practice such insns would not 75: combine anyway. */ 76: 77: #include "config.h" 1.1.1.7 root 78: #ifdef __STDC__ 79: #include <stdarg.h> 80: #else 81: #include <varargs.h> 82: #endif 1.1.1.6 root 83: 84: /* Must precede rtl.h for FFS. */ 85: #include <stdio.h> 86: 1.1 root 87: #include "rtl.h" 88: #include "flags.h" 89: #include "regs.h" 1.1.1.5 root 90: #include "hard-reg-set.h" 1.1 root 91: #include "expr.h" 92: #include "basic-block.h" 93: #include "insn-config.h" 94: #include "insn-flags.h" 95: #include "insn-codes.h" 96: #include "insn-attr.h" 97: #include "recog.h" 98: #include "real.h" 99: 100: /* It is not safe to use ordinary gen_lowpart in combine. 101: Use gen_lowpart_for_combine instead. See comments there. */ 102: #define gen_lowpart dont_use_gen_lowpart_you_dummy 103: 104: /* Number of attempts to combine instructions in this function. */ 105: 106: static int combine_attempts; 107: 108: /* Number of attempts that got as far as substitution in this function. */ 109: 110: static int combine_merges; 111: 112: /* Number of instructions combined with added SETs in this function. */ 113: 114: static int combine_extras; 115: 116: /* Number of instructions combined in this function. */ 117: 118: static int combine_successes; 119: 120: /* Totals over entire compilation. */ 121: 122: static int total_attempts, total_merges, total_extras, total_successes; 1.1.1.7 root 123: 1.1.1.8 ! root 124: /* Define a default value for REVERSIBLE_CC_MODE. 1.1.1.7 root 125: We can never assume that a condition code mode is safe to reverse unless 126: the md tells us so. */ 127: #ifndef REVERSIBLE_CC_MODE 128: #define REVERSIBLE_CC_MODE(MODE) 0 129: #endif 1.1 root 130: 131: /* Vector mapping INSN_UIDs to cuids. 1.1.1.2 root 132: The cuids are like uids but increase monotonically always. 1.1 root 133: Combine always uses cuids so that it can compare them. 134: But actually renumbering the uids, which we used to do, 135: proves to be a bad idea because it makes it hard to compare 136: the dumps produced by earlier passes with those from later passes. */ 137: 138: static int *uid_cuid; 1.1.1.8 ! root 139: static int max_uid_cuid; 1.1 root 140: 141: /* Get the cuid of an insn. */ 142: 1.1.1.8 ! root 143: #define INSN_CUID(INSN) (INSN_UID (INSN) > max_uid_cuid \ ! 144: ? (abort(), 0) \ ! 145: : uid_cuid[INSN_UID (INSN)]) 1.1 root 146: 147: /* Maximum register number, which is the size of the tables below. */ 148: 149: static int combine_max_regno; 150: 151: /* Record last point of death of (hard or pseudo) register n. */ 152: 153: static rtx *reg_last_death; 154: 155: /* Record last point of modification of (hard or pseudo) register n. */ 156: 157: static rtx *reg_last_set; 158: 159: /* Record the cuid of the last insn that invalidated memory 160: (anything that writes memory, and subroutine calls, but not pushes). */ 161: 162: static int mem_last_set; 163: 164: /* Record the cuid of the last CALL_INSN 165: so we can tell whether a potential combination crosses any calls. */ 166: 167: static int last_call_cuid; 168: 169: /* When `subst' is called, this is the insn that is being modified 170: (by combining in a previous insn). The PATTERN of this insn 171: is still the old pattern partially modified and it should not be 172: looked at, but this may be used to examine the successors of the insn 173: to judge whether a simplification is valid. */ 174: 175: static rtx subst_insn; 176: 1.1.1.8 ! root 177: /* This is an insn that belongs before subst_insn, but is not currently ! 178: on the insn chain. */ ! 179: ! 180: static rtx subst_prev_insn; ! 181: 1.1 root 182: /* This is the lowest CUID that `subst' is currently dealing with. 183: get_last_value will not return a value if the register was set at or 184: after this CUID. If not for this mechanism, we could get confused if 185: I2 or I1 in try_combine were an insn that used the old value of a register 186: to obtain a new value. In that case, we might erroneously get the 187: new value of the register when we wanted the old one. */ 188: 189: static int subst_low_cuid; 190: 1.1.1.7 root 191: /* This contains any hard registers that are used in newpat; reg_dead_at_p 192: must consider all these registers to be always live. */ 193: 194: static HARD_REG_SET newpat_used_regs; 195: 196: /* This is an insn to which a LOG_LINKS entry has been added. If this 197: insn is the earlier than I2 or I3, combine should rescan starting at 198: that location. */ 199: 200: static rtx added_links_insn; 201: 1.1 root 202: /* This is the value of undobuf.num_undo when we started processing this 203: substitution. This will prevent gen_rtx_combine from re-used a piece 204: from the previous expression. Doing so can produce circular rtl 205: structures. */ 206: 207: static int previous_num_undos; 1.1.1.6 root 208: 209: /* Basic block number of the block in which we are performing combines. */ 210: static int this_basic_block; 1.1 root 211: 212: /* The next group of arrays allows the recording of the last value assigned 213: to (hard or pseudo) register n. We use this information to see if a 1.1.1.2 root 214: operation being processed is redundant given a prior operation performed 1.1 root 215: on the register. For example, an `and' with a constant is redundant if 216: all the zero bits are already known to be turned off. 217: 218: We use an approach similar to that used by cse, but change it in the 219: following ways: 220: 221: (1) We do not want to reinitialize at each label. 222: (2) It is useful, but not critical, to know the actual value assigned 223: to a register. Often just its form is helpful. 224: 225: Therefore, we maintain the following arrays: 226: 227: reg_last_set_value the last value assigned 228: reg_last_set_label records the value of label_tick when the 229: register was assigned 230: reg_last_set_table_tick records the value of label_tick when a 231: value using the register is assigned 232: reg_last_set_invalid set to non-zero when it is not valid 233: to use the value of this register in some 234: register's value 235: 236: To understand the usage of these tables, it is important to understand 237: the distinction between the value in reg_last_set_value being valid 238: and the register being validly contained in some other expression in the 239: table. 240: 241: Entry I in reg_last_set_value is valid if it is non-zero, and either 242: reg_n_sets[i] is 1 or reg_last_set_label[i] == label_tick. 243: 244: Register I may validly appear in any expression returned for the value 245: of another register if reg_n_sets[i] is 1. It may also appear in the 246: value for register J if reg_last_set_label[i] < reg_last_set_label[j] or 247: reg_last_set_invalid[j] is zero. 248: 249: If an expression is found in the table containing a register which may 250: not validly appear in an expression, the register is replaced by 251: something that won't match, (clobber (const_int 0)). 252: 253: reg_last_set_invalid[i] is set non-zero when register I is being assigned 254: to and reg_last_set_table_tick[i] == label_tick. */ 255: 256: /* Record last value assigned to (hard or pseudo) register n. */ 257: 258: static rtx *reg_last_set_value; 259: 260: /* Record the value of label_tick when the value for register n is placed in 261: reg_last_set_value[n]. */ 262: 1.1.1.5 root 263: static int *reg_last_set_label; 1.1 root 264: 265: /* Record the value of label_tick when an expression involving register n 266: is placed in reg_last_set_value. */ 267: 1.1.1.5 root 268: static int *reg_last_set_table_tick; 1.1 root 269: 270: /* Set non-zero if references to register n in expressions should not be 271: used. */ 272: 273: static char *reg_last_set_invalid; 274: 275: /* Incremented for each label. */ 276: 1.1.1.5 root 277: static int label_tick; 1.1 root 278: 279: /* Some registers that are set more than once and used in more than one 280: basic block are nevertheless always set in similar ways. For example, 281: a QImode register may be loaded from memory in two places on a machine 282: where byte loads zero extend. 283: 1.1.1.5 root 284: We record in the following array what we know about the nonzero 1.1 root 285: bits of a register, specifically which bits are known to be zero. 286: 287: If an entry is zero, it means that we don't know anything special. */ 288: 1.1.1.5 root 289: static unsigned HOST_WIDE_INT *reg_nonzero_bits; 1.1 root 290: 1.1.1.5 root 291: /* Mode used to compute significance in reg_nonzero_bits. It is the largest 1.1.1.4 root 292: integer mode that can fit in HOST_BITS_PER_WIDE_INT. */ 1.1 root 293: 1.1.1.5 root 294: static enum machine_mode nonzero_bits_mode; 1.1 root 295: 1.1.1.4 root 296: /* Nonzero if we know that a register has some leading bits that are always 297: equal to the sign bit. */ 298: 299: static char *reg_sign_bit_copies; 300: 1.1.1.5 root 301: /* Nonzero when reg_nonzero_bits and reg_sign_bit_copies can be safely used. 1.1.1.4 root 302: It is zero while computing them and after combine has completed. This 303: former test prevents propagating values based on previously set values, 304: which can be incorrect if a variable is modified in a loop. */ 1.1 root 305: 1.1.1.5 root 306: static int nonzero_sign_valid; 307: 308: /* These arrays are maintained in parallel with reg_last_set_value 309: and are used to store the mode in which the register was last set, 310: the bits that were known to be zero when it was last set, and the 311: number of sign bits copies it was known to have when it was last set. */ 312: 313: static enum machine_mode *reg_last_set_mode; 314: static unsigned HOST_WIDE_INT *reg_last_set_nonzero_bits; 315: static char *reg_last_set_sign_bit_copies; 1.1 root 316: 317: /* Record one modification to rtl structure 318: to be undone by storing old_contents into *where. 319: is_int is 1 if the contents are an int. */ 320: 321: struct undo 322: { 323: int is_int; 1.1.1.6 root 324: union {rtx r; int i;} old_contents; 325: union {rtx *r; int *i;} where; 1.1 root 326: }; 327: 328: /* Record a bunch of changes to be undone, up to MAX_UNDO of them. 329: num_undo says how many are currently recorded. 330: 331: storage is nonzero if we must undo the allocation of new storage. 332: The value of storage is what to pass to obfree. 333: 334: other_insn is nonzero if we have modified some other insn in the process 335: of working on subst_insn. It must be verified too. */ 336: 337: #define MAX_UNDO 50 338: 339: struct undobuf 340: { 341: int num_undo; 342: char *storage; 343: struct undo undo[MAX_UNDO]; 344: rtx other_insn; 345: }; 346: 347: static struct undobuf undobuf; 348: 1.1.1.4 root 349: /* Substitute NEWVAL, an rtx expression, into INTO, a place in some 1.1 root 350: insn. The substitution can be undone by undo_all. If INTO is already 1.1.1.4 root 351: set to NEWVAL, do not record this change. Because computing NEWVAL might 352: also call SUBST, we have to compute it before we put anything into 353: the undo table. */ 1.1 root 354: 355: #define SUBST(INTO, NEWVAL) \ 1.1.1.4 root 356: do { rtx _new = (NEWVAL); \ 357: if (undobuf.num_undo < MAX_UNDO) \ 1.1 root 358: { \ 359: undobuf.undo[undobuf.num_undo].is_int = 0; \ 1.1.1.6 root 360: undobuf.undo[undobuf.num_undo].where.r = &INTO; \ 361: undobuf.undo[undobuf.num_undo].old_contents.r = INTO; \ 1.1.1.4 root 362: INTO = _new; \ 1.1.1.6 root 363: if (undobuf.undo[undobuf.num_undo].old_contents.r != INTO) \ 1.1 root 364: undobuf.num_undo++; \ 365: } \ 366: } while (0) 367: 368: /* Similar to SUBST, but NEWVAL is an int. INTO will normally be an XINT 369: expression. 370: Note that substitution for the value of a CONST_INT is not safe. */ 371: 372: #define SUBST_INT(INTO, NEWVAL) \ 373: do { if (undobuf.num_undo < MAX_UNDO) \ 374: { \ 1.1.1.4 root 375: undobuf.undo[undobuf.num_undo].is_int = 1; \ 376: undobuf.undo[undobuf.num_undo].where.i = (int *) &INTO; \ 377: undobuf.undo[undobuf.num_undo].old_contents.i = INTO; \ 1.1 root 378: INTO = NEWVAL; \ 1.1.1.4 root 379: if (undobuf.undo[undobuf.num_undo].old_contents.i != INTO) \ 1.1 root 380: undobuf.num_undo++; \ 381: } \ 382: } while (0) 383: 384: /* Number of times the pseudo being substituted for 385: was found and replaced. */ 386: 387: static int n_occurrences; 388: 1.1.1.6 root 389: static void init_reg_last_arrays PROTO(()); 390: static void setup_incoming_promotions PROTO(()); 391: static void set_nonzero_bits_and_sign_copies PROTO((rtx, rtx)); 392: static int can_combine_p PROTO((rtx, rtx, rtx, rtx, rtx *, rtx *)); 393: static int combinable_i3pat PROTO((rtx, rtx *, rtx, rtx, int, rtx *)); 394: static rtx try_combine PROTO((rtx, rtx, rtx)); 395: static void undo_all PROTO((void)); 396: static rtx *find_split_point PROTO((rtx *, rtx)); 397: static rtx subst PROTO((rtx, rtx, rtx, int, int)); 1.1.1.7 root 398: static rtx simplify_rtx PROTO((rtx, enum machine_mode, int, int)); 399: static rtx simplify_if_then_else PROTO((rtx)); 400: static rtx simplify_set PROTO((rtx)); 401: static rtx simplify_logical PROTO((rtx, int)); 1.1.1.6 root 402: static rtx expand_compound_operation PROTO((rtx)); 403: static rtx expand_field_assignment PROTO((rtx)); 404: static rtx make_extraction PROTO((enum machine_mode, rtx, int, rtx, int, 405: int, int, int)); 1.1.1.7 root 406: static rtx extract_left_shift PROTO((rtx, int)); 1.1.1.6 root 407: static rtx make_compound_operation PROTO((rtx, enum rtx_code)); 408: static int get_pos_from_mask PROTO((unsigned HOST_WIDE_INT, int *)); 409: static rtx force_to_mode PROTO((rtx, enum machine_mode, 410: unsigned HOST_WIDE_INT, rtx, int)); 1.1.1.7 root 411: static rtx if_then_else_cond PROTO((rtx, rtx *, rtx *)); 1.1.1.6 root 412: static rtx known_cond PROTO((rtx, enum rtx_code, rtx, rtx)); 413: static rtx make_field_assignment PROTO((rtx)); 414: static rtx apply_distributive_law PROTO((rtx)); 415: static rtx simplify_and_const_int PROTO((rtx, enum machine_mode, rtx, 416: unsigned HOST_WIDE_INT)); 417: static unsigned HOST_WIDE_INT nonzero_bits PROTO((rtx, enum machine_mode)); 418: static int num_sign_bit_copies PROTO((rtx, enum machine_mode)); 419: static int merge_outer_ops PROTO((enum rtx_code *, HOST_WIDE_INT *, 420: enum rtx_code, HOST_WIDE_INT, 421: enum machine_mode, int *)); 422: static rtx simplify_shift_const PROTO((rtx, enum rtx_code, enum machine_mode, 423: rtx, int)); 1.1.1.8 ! root 424: static int recog_for_combine PROTO((rtx *, rtx, rtx *, int *)); 1.1.1.6 root 425: static rtx gen_lowpart_for_combine PROTO((enum machine_mode, rtx)); 1.1.1.7 root 426: static rtx gen_rtx_combine PVPROTO((enum rtx_code code, enum machine_mode mode, 427: ...)); 1.1.1.6 root 428: static rtx gen_binary PROTO((enum rtx_code, enum machine_mode, 429: rtx, rtx)); 1.1.1.7 root 430: static rtx gen_unary PROTO((enum rtx_code, enum machine_mode, 431: enum machine_mode, rtx)); 1.1.1.6 root 432: static enum rtx_code simplify_comparison PROTO((enum rtx_code, rtx *, rtx *)); 433: static int reversible_comparison_p PROTO((rtx)); 434: static void update_table_tick PROTO((rtx)); 435: static void record_value_for_reg PROTO((rtx, rtx, rtx)); 436: static void record_dead_and_set_regs_1 PROTO((rtx, rtx)); 437: static void record_dead_and_set_regs PROTO((rtx)); 438: static int get_last_value_validate PROTO((rtx *, int, int)); 439: static rtx get_last_value PROTO((rtx)); 440: static int use_crosses_set_p PROTO((rtx, int)); 441: static void reg_dead_at_p_1 PROTO((rtx, rtx)); 442: static int reg_dead_at_p PROTO((rtx, rtx)); 443: static void move_deaths PROTO((rtx, int, rtx, rtx *)); 444: static int reg_bitfield_target_p PROTO((rtx, rtx)); 445: static void distribute_notes PROTO((rtx, rtx, rtx, rtx, rtx, rtx)); 446: static void distribute_links PROTO((rtx)); 1.1.1.7 root 447: static void mark_used_regs_combine PROTO((rtx)); 1.1 root 448: 449: /* Main entry point for combiner. F is the first insn of the function. 450: NREGS is the first unused pseudo-reg number. */ 451: 452: void 453: combine_instructions (f, nregs) 454: rtx f; 455: int nregs; 456: { 457: register rtx insn, next, prev; 458: register int i; 459: register rtx links, nextlinks; 460: 461: combine_attempts = 0; 462: combine_merges = 0; 463: combine_extras = 0; 464: combine_successes = 0; 1.1.1.5 root 465: undobuf.num_undo = previous_num_undos = 0; 1.1 root 466: 467: combine_max_regno = nregs; 468: 1.1.1.6 root 469: reg_nonzero_bits 470: = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT)); 471: reg_sign_bit_copies = (char *) alloca (nregs * sizeof (char)); 472: 1.1.1.7 root 473: bzero ((char *) reg_nonzero_bits, nregs * sizeof (HOST_WIDE_INT)); 1.1.1.6 root 474: bzero (reg_sign_bit_copies, nregs * sizeof (char)); 475: 1.1 root 476: reg_last_death = (rtx *) alloca (nregs * sizeof (rtx)); 477: reg_last_set = (rtx *) alloca (nregs * sizeof (rtx)); 478: reg_last_set_value = (rtx *) alloca (nregs * sizeof (rtx)); 1.1.1.5 root 479: reg_last_set_table_tick = (int *) alloca (nregs * sizeof (int)); 480: reg_last_set_label = (int *) alloca (nregs * sizeof (int)); 1.1.1.4 root 481: reg_last_set_invalid = (char *) alloca (nregs * sizeof (char)); 1.1.1.5 root 482: reg_last_set_mode 483: = (enum machine_mode *) alloca (nregs * sizeof (enum machine_mode)); 484: reg_last_set_nonzero_bits 485: = (unsigned HOST_WIDE_INT *) alloca (nregs * sizeof (HOST_WIDE_INT)); 486: reg_last_set_sign_bit_copies 487: = (char *) alloca (nregs * sizeof (char)); 488: 1.1.1.6 root 489: init_reg_last_arrays (); 1.1 root 490: 491: init_recog_no_volatile (); 492: 493: /* Compute maximum uid value so uid_cuid can be allocated. */ 494: 495: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) 496: if (INSN_UID (insn) > i) 497: i = INSN_UID (insn); 498: 499: uid_cuid = (int *) alloca ((i + 1) * sizeof (int)); 1.1.1.8 ! root 500: max_uid_cuid = i; 1.1 root 501: 1.1.1.5 root 502: nonzero_bits_mode = mode_for_size (HOST_BITS_PER_WIDE_INT, MODE_INT, 0); 1.1 root 503: 1.1.1.5 root 504: /* Don't use reg_nonzero_bits when computing it. This can cause problems 1.1 root 505: when, for example, we have j <<= 1 in a loop. */ 506: 1.1.1.5 root 507: nonzero_sign_valid = 0; 1.1 root 508: 509: /* Compute the mapping from uids to cuids. 510: Cuids are numbers assigned to insns, like uids, 511: except that cuids increase monotonically through the code. 512: 513: Scan all SETs and see if we can deduce anything about what 1.1.1.5 root 514: bits are known to be zero for some registers and how many copies 515: of the sign bit are known to exist for those registers. 516: 517: Also set any known values so that we can use it while searching 518: for what bits are known to be set. */ 519: 520: label_tick = 1; 521: 1.1.1.8 ! root 522: /* We need to initialize it here, because record_dead_and_set_regs may call ! 523: get_last_value. */ ! 524: subst_prev_insn = NULL_RTX; ! 525: 1.1.1.5 root 526: setup_incoming_promotions (); 1.1 root 527: 528: for (insn = f, i = 0; insn; insn = NEXT_INSN (insn)) 529: { 1.1.1.8 ! root 530: uid_cuid[INSN_UID (insn)] = ++i; 1.1.1.5 root 531: subst_low_cuid = i; 532: subst_insn = insn; 533: 1.1 root 534: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') 1.1.1.5 root 535: { 536: note_stores (PATTERN (insn), set_nonzero_bits_and_sign_copies); 537: record_dead_and_set_regs (insn); 538: } 539: 540: if (GET_CODE (insn) == CODE_LABEL) 541: label_tick++; 1.1 root 542: } 543: 1.1.1.5 root 544: nonzero_sign_valid = 1; 1.1 root 545: 546: /* Now scan all the insns in forward order. */ 547: 1.1.1.6 root 548: this_basic_block = -1; 1.1 root 549: label_tick = 1; 550: last_call_cuid = 0; 551: mem_last_set = 0; 1.1.1.6 root 552: init_reg_last_arrays (); 1.1.1.5 root 553: setup_incoming_promotions (); 1.1 root 554: 555: for (insn = f; insn; insn = next ? next : NEXT_INSN (insn)) 556: { 557: next = 0; 558: 1.1.1.6 root 559: /* If INSN starts a new basic block, update our basic block number. */ 560: if (this_basic_block + 1 < n_basic_blocks 561: && basic_block_head[this_basic_block + 1] == insn) 562: this_basic_block++; 563: 1.1 root 564: if (GET_CODE (insn) == CODE_LABEL) 565: label_tick++; 566: 1.1.1.6 root 567: else if (GET_RTX_CLASS (GET_CODE (insn)) == 'i') 1.1 root 568: { 569: /* Try this insn with each insn it links back to. */ 570: 571: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) 1.1.1.4 root 572: if ((next = try_combine (insn, XEXP (links, 0), NULL_RTX)) != 0) 1.1 root 573: goto retry; 574: 575: /* Try each sequence of three linked insns ending with this one. */ 576: 577: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) 578: for (nextlinks = LOG_LINKS (XEXP (links, 0)); nextlinks; 579: nextlinks = XEXP (nextlinks, 1)) 580: if ((next = try_combine (insn, XEXP (links, 0), 581: XEXP (nextlinks, 0))) != 0) 582: goto retry; 583: 584: #ifdef HAVE_cc0 585: /* Try to combine a jump insn that uses CC0 586: with a preceding insn that sets CC0, and maybe with its 587: logical predecessor as well. 588: This is how we make decrement-and-branch insns. 589: We need this special code because data flow connections 590: via CC0 do not get entered in LOG_LINKS. */ 591: 592: if (GET_CODE (insn) == JUMP_INSN 593: && (prev = prev_nonnote_insn (insn)) != 0 594: && GET_CODE (prev) == INSN 595: && sets_cc0_p (PATTERN (prev))) 596: { 1.1.1.4 root 597: if ((next = try_combine (insn, prev, NULL_RTX)) != 0) 1.1 root 598: goto retry; 599: 600: for (nextlinks = LOG_LINKS (prev); nextlinks; 601: nextlinks = XEXP (nextlinks, 1)) 602: if ((next = try_combine (insn, prev, 603: XEXP (nextlinks, 0))) != 0) 604: goto retry; 605: } 606: 607: /* Do the same for an insn that explicitly references CC0. */ 608: if (GET_CODE (insn) == INSN 609: && (prev = prev_nonnote_insn (insn)) != 0 610: && GET_CODE (prev) == INSN 611: && sets_cc0_p (PATTERN (prev)) 612: && GET_CODE (PATTERN (insn)) == SET 613: && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (insn)))) 614: { 1.1.1.4 root 615: if ((next = try_combine (insn, prev, NULL_RTX)) != 0) 1.1 root 616: goto retry; 617: 618: for (nextlinks = LOG_LINKS (prev); nextlinks; 619: nextlinks = XEXP (nextlinks, 1)) 620: if ((next = try_combine (insn, prev, 621: XEXP (nextlinks, 0))) != 0) 622: goto retry; 623: } 624: 625: /* Finally, see if any of the insns that this insn links to 626: explicitly references CC0. If so, try this insn, that insn, 1.1.1.2 root 627: and its predecessor if it sets CC0. */ 1.1 root 628: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) 629: if (GET_CODE (XEXP (links, 0)) == INSN 630: && GET_CODE (PATTERN (XEXP (links, 0))) == SET 631: && reg_mentioned_p (cc0_rtx, SET_SRC (PATTERN (XEXP (links, 0)))) 632: && (prev = prev_nonnote_insn (XEXP (links, 0))) != 0 633: && GET_CODE (prev) == INSN 634: && sets_cc0_p (PATTERN (prev)) 635: && (next = try_combine (insn, XEXP (links, 0), prev)) != 0) 636: goto retry; 637: #endif 638: 639: /* Try combining an insn with two different insns whose results it 640: uses. */ 641: for (links = LOG_LINKS (insn); links; links = XEXP (links, 1)) 642: for (nextlinks = XEXP (links, 1); nextlinks; 643: nextlinks = XEXP (nextlinks, 1)) 644: if ((next = try_combine (insn, XEXP (links, 0), 645: XEXP (nextlinks, 0))) != 0) 646: goto retry; 647: 648: if (GET_CODE (insn) != NOTE) 649: record_dead_and_set_regs (insn); 650: 651: retry: 652: ; 653: } 654: } 655: 656: total_attempts += combine_attempts; 657: total_merges += combine_merges; 658: total_extras += combine_extras; 659: total_successes += combine_successes; 1.1.1.4 root 660: 1.1.1.5 root 661: nonzero_sign_valid = 0; 662: } 1.1.1.6 root 663: 664: /* Wipe the reg_last_xxx arrays in preparation for another pass. */ 665: 666: static void 667: init_reg_last_arrays () 668: { 669: int nregs = combine_max_regno; 670: 1.1.1.7 root 671: bzero ((char *) reg_last_death, nregs * sizeof (rtx)); 672: bzero ((char *) reg_last_set, nregs * sizeof (rtx)); 673: bzero ((char *) reg_last_set_value, nregs * sizeof (rtx)); 674: bzero ((char *) reg_last_set_table_tick, nregs * sizeof (int)); 675: bzero ((char *) reg_last_set_label, nregs * sizeof (int)); 1.1.1.6 root 676: bzero (reg_last_set_invalid, nregs * sizeof (char)); 1.1.1.7 root 677: bzero ((char *) reg_last_set_mode, nregs * sizeof (enum machine_mode)); 678: bzero ((char *) reg_last_set_nonzero_bits, nregs * sizeof (HOST_WIDE_INT)); 1.1.1.6 root 679: bzero (reg_last_set_sign_bit_copies, nregs * sizeof (char)); 680: } 1.1.1.5 root 681: 682: /* Set up any promoted values for incoming argument registers. */ 683: 684: static void 685: setup_incoming_promotions () 686: { 687: #ifdef PROMOTE_FUNCTION_ARGS 688: int regno; 689: rtx reg; 690: enum machine_mode mode; 691: int unsignedp; 692: rtx first = get_insns (); 693: 694: for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) 695: if (FUNCTION_ARG_REGNO_P (regno) 696: && (reg = promoted_input_arg (regno, &mode, &unsignedp)) != 0) 697: record_value_for_reg (reg, first, 698: gen_rtx (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, 699: GET_MODE (reg), 700: gen_rtx (CLOBBER, mode, const0_rtx))); 701: #endif 1.1 root 702: } 703: 704: /* Called via note_stores. If X is a pseudo that is used in more than 1.1.1.4 root 705: one basic block, is narrower that HOST_BITS_PER_WIDE_INT, and is being 1.1.1.5 root 706: set, record what bits are known zero. If we are clobbering X, 1.1 root 707: ignore this "set" because the clobbered value won't be used. 708: 709: If we are setting only a portion of X and we can't figure out what 710: portion, assume all bits will be used since we don't know what will 1.1.1.4 root 711: be happening. 712: 713: Similarly, set how many bits of X are known to be copies of the sign bit 714: at all locations in the function. This is the smallest number implied 715: by any set of X. */ 1.1 root 716: 717: static void 1.1.1.5 root 718: set_nonzero_bits_and_sign_copies (x, set) 1.1 root 719: rtx x; 720: rtx set; 721: { 1.1.1.4 root 722: int num; 723: 1.1 root 724: if (GET_CODE (x) == REG 725: && REGNO (x) >= FIRST_PSEUDO_REGISTER 726: && reg_n_sets[REGNO (x)] > 1 727: && reg_basic_block[REGNO (x)] < 0 1.1.1.5 root 728: /* If this register is undefined at the start of the file, we can't 729: say what its contents were. */ 730: && ! (basic_block_live_at_start[0][REGNO (x) / REGSET_ELT_BITS] 731: & ((REGSET_ELT_TYPE) 1 << (REGNO (x) % REGSET_ELT_BITS))) 1.1.1.4 root 732: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT) 1.1 root 733: { 734: if (GET_CODE (set) == CLOBBER) 1.1.1.5 root 735: { 736: reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x)); 737: reg_sign_bit_copies[REGNO (x)] = 0; 738: return; 739: } 1.1 root 740: 741: /* If this is a complex assignment, see if we can convert it into a 1.1.1.2 root 742: simple assignment. */ 1.1 root 743: set = expand_field_assignment (set); 1.1.1.5 root 744: 745: /* If this is a simple assignment, or we have a paradoxical SUBREG, 746: set what we know about X. */ 747: 748: if (SET_DEST (set) == x 749: || (GET_CODE (SET_DEST (set)) == SUBREG 750: && (GET_MODE_SIZE (GET_MODE (SET_DEST (set))) 751: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (set))))) 752: && SUBREG_REG (SET_DEST (set)) == x)) 753: { 754: rtx src = SET_SRC (set); 755: 756: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND 757: /* If X is narrower than a word and SRC is a non-negative 758: constant that would appear negative in the mode of X, 759: sign-extend it for use in reg_nonzero_bits because some 760: machines (maybe most) will actually do the sign-extension 761: and this is the conservative approach. 762: 763: ??? For 2.5, try to tighten up the MD files in this regard 764: instead of this kludge. */ 765: 766: if (GET_MODE_BITSIZE (GET_MODE (x)) < BITS_PER_WORD 767: && GET_CODE (src) == CONST_INT 768: && INTVAL (src) > 0 769: && 0 != (INTVAL (src) 770: & ((HOST_WIDE_INT) 1 1.1.1.7 root 771: << (GET_MODE_BITSIZE (GET_MODE (x)) - 1)))) 1.1.1.5 root 772: src = GEN_INT (INTVAL (src) 773: | ((HOST_WIDE_INT) (-1) 774: << GET_MODE_BITSIZE (GET_MODE (x)))); 775: #endif 776: 777: reg_nonzero_bits[REGNO (x)] 778: |= nonzero_bits (src, nonzero_bits_mode); 1.1.1.4 root 779: num = num_sign_bit_copies (SET_SRC (set), GET_MODE (x)); 780: if (reg_sign_bit_copies[REGNO (x)] == 0 781: || reg_sign_bit_copies[REGNO (x)] > num) 782: reg_sign_bit_copies[REGNO (x)] = num; 783: } 1.1 root 784: else 1.1.1.4 root 785: { 1.1.1.5 root 786: reg_nonzero_bits[REGNO (x)] = GET_MODE_MASK (GET_MODE (x)); 1.1.1.4 root 787: reg_sign_bit_copies[REGNO (x)] = 0; 788: } 1.1 root 789: } 790: } 791: 792: /* See if INSN can be combined into I3. PRED and SUCC are optionally 793: insns that were previously combined into I3 or that will be combined 794: into the merger of INSN and I3. 795: 796: Return 0 if the combination is not allowed for any reason. 797: 798: If the combination is allowed, *PDEST will be set to the single 799: destination of INSN and *PSRC to the single source, and this function 800: will return 1. */ 801: 802: static int 803: can_combine_p (insn, i3, pred, succ, pdest, psrc) 804: rtx insn; 805: rtx i3; 806: rtx pred, succ; 807: rtx *pdest, *psrc; 808: { 809: int i; 810: rtx set = 0, src, dest; 811: rtx p, link; 812: int all_adjacent = (succ ? (next_active_insn (insn) == succ 813: && next_active_insn (succ) == i3) 814: : next_active_insn (insn) == i3); 815: 816: /* Can combine only if previous insn is a SET of a REG, a SUBREG or CC0. 817: or a PARALLEL consisting of such a SET and CLOBBERs. 818: 819: If INSN has CLOBBER parallel parts, ignore them for our processing. 820: By definition, these happen during the execution of the insn. When it 821: is merged with another insn, all bets are off. If they are, in fact, 822: needed and aren't also supplied in I3, they may be added by 823: recog_for_combine. Otherwise, it won't match. 824: 825: We can also ignore a SET whose SET_DEST is mentioned in a REG_UNUSED 826: note. 827: 828: Get the source and destination of INSN. If more than one, can't 829: combine. */ 830: 831: if (GET_CODE (PATTERN (insn)) == SET) 832: set = PATTERN (insn); 833: else if (GET_CODE (PATTERN (insn)) == PARALLEL 834: && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET) 835: { 836: for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++) 837: { 838: rtx elt = XVECEXP (PATTERN (insn), 0, i); 839: 840: switch (GET_CODE (elt)) 841: { 842: /* We can ignore CLOBBERs. */ 843: case CLOBBER: 844: break; 845: 846: case SET: 847: /* Ignore SETs whose result isn't used but not those that 848: have side-effects. */ 849: if (find_reg_note (insn, REG_UNUSED, SET_DEST (elt)) 850: && ! side_effects_p (elt)) 851: break; 852: 853: /* If we have already found a SET, this is a second one and 854: so we cannot combine with this insn. */ 855: if (set) 856: return 0; 857: 858: set = elt; 859: break; 860: 861: default: 862: /* Anything else means we can't combine. */ 863: return 0; 864: } 865: } 866: 867: if (set == 0 868: /* If SET_SRC is an ASM_OPERANDS we can't throw away these CLOBBERs, 869: so don't do anything with it. */ 870: || GET_CODE (SET_SRC (set)) == ASM_OPERANDS) 871: return 0; 872: } 873: else 874: return 0; 875: 876: if (set == 0) 877: return 0; 878: 879: set = expand_field_assignment (set); 880: src = SET_SRC (set), dest = SET_DEST (set); 881: 882: /* Don't eliminate a store in the stack pointer. */ 883: if (dest == stack_pointer_rtx 884: /* If we couldn't eliminate a field assignment, we can't combine. */ 885: || GET_CODE (dest) == ZERO_EXTRACT || GET_CODE (dest) == STRICT_LOW_PART 886: /* Don't combine with an insn that sets a register to itself if it has 887: a REG_EQUAL note. This may be part of a REG_NO_CONFLICT sequence. */ 1.1.1.4 root 888: || (rtx_equal_p (src, dest) && find_reg_note (insn, REG_EQUAL, NULL_RTX)) 1.1 root 889: /* Can't merge a function call. */ 890: || GET_CODE (src) == CALL 1.1.1.7 root 891: /* Don't eliminate a function call argument. */ 892: || (GET_CODE (i3) == CALL_INSN 893: && (find_reg_fusage (i3, USE, dest) 894: || (GET_CODE (dest) == REG 895: && REGNO (dest) < FIRST_PSEUDO_REGISTER 896: && global_regs[REGNO (dest)]))) 1.1 root 897: /* Don't substitute into an incremented register. */ 898: || FIND_REG_INC_NOTE (i3, dest) 899: || (succ && FIND_REG_INC_NOTE (succ, dest)) 900: /* Don't combine the end of a libcall into anything. */ 1.1.1.4 root 901: || find_reg_note (insn, REG_RETVAL, NULL_RTX) 1.1 root 902: /* Make sure that DEST is not used after SUCC but before I3. */ 903: || (succ && ! all_adjacent 904: && reg_used_between_p (dest, succ, i3)) 905: /* Make sure that the value that is to be substituted for the register 906: does not use any registers whose values alter in between. However, 907: If the insns are adjacent, a use can't cross a set even though we 908: think it might (this can happen for a sequence of insns each setting 909: the same destination; reg_last_set of that register might point to 1.1.1.6 root 910: a NOTE). If INSN has a REG_EQUIV note, the register is always 911: equivalent to the memory so the substitution is valid even if there 912: are intervening stores. Also, don't move a volatile asm or 913: UNSPEC_VOLATILE across any other insns. */ 1.1 root 914: || (! all_adjacent 1.1.1.6 root 915: && (((GET_CODE (src) != MEM 916: || ! find_reg_note (insn, REG_EQUIV, src)) 917: && use_crosses_set_p (src, INSN_CUID (insn))) 1.1.1.5 root 918: || (GET_CODE (src) == ASM_OPERANDS && MEM_VOLATILE_P (src)) 919: || GET_CODE (src) == UNSPEC_VOLATILE)) 1.1 root 920: /* If there is a REG_NO_CONFLICT note for DEST in I3 or SUCC, we get 921: better register allocation by not doing the combine. */ 922: || find_reg_note (i3, REG_NO_CONFLICT, dest) 923: || (succ && find_reg_note (succ, REG_NO_CONFLICT, dest)) 924: /* Don't combine across a CALL_INSN, because that would possibly 925: change whether the life span of some REGs crosses calls or not, 926: and it is a pain to update that information. 927: Exception: if source is a constant, moving it later can't hurt. 928: Accept that special case, because it helps -fforce-addr a lot. */ 929: || (INSN_CUID (insn) < last_call_cuid && ! CONSTANT_P (src))) 930: return 0; 931: 932: /* DEST must either be a REG or CC0. */ 933: if (GET_CODE (dest) == REG) 934: { 935: /* If register alignment is being enforced for multi-word items in all 936: cases except for parameters, it is possible to have a register copy 937: insn referencing a hard register that is not allowed to contain the 938: mode being copied and which would not be valid as an operand of most 939: insns. Eliminate this problem by not combining with such an insn. 940: 941: Also, on some machines we don't want to extend the life of a hard 942: register. */ 943: 944: if (GET_CODE (src) == REG 945: && ((REGNO (dest) < FIRST_PSEUDO_REGISTER 946: && ! HARD_REGNO_MODE_OK (REGNO (dest), GET_MODE (dest))) 1.1.1.7 root 947: /* Don't extend the life of a hard register unless it is 948: user variable (if we have few registers) or it can't 949: fit into the desired register (meaning something special 950: is going on). */ 1.1 root 951: || (REGNO (src) < FIRST_PSEUDO_REGISTER 1.1.1.7 root 952: && (! HARD_REGNO_MODE_OK (REGNO (src), GET_MODE (src)) 953: #ifdef SMALL_REGISTER_CLASSES 954: || ! REG_USERVAR_P (src) 1.1 root 955: #endif 1.1.1.7 root 956: )))) 1.1 root 957: return 0; 958: } 959: else if (GET_CODE (dest) != CC0) 960: return 0; 961: 1.1.1.4 root 962: /* Don't substitute for a register intended as a clobberable operand. 963: Similarly, don't substitute an expression containing a register that 964: will be clobbered in I3. */ 1.1 root 965: if (GET_CODE (PATTERN (i3)) == PARALLEL) 966: for (i = XVECLEN (PATTERN (i3), 0) - 1; i >= 0; i--) 967: if (GET_CODE (XVECEXP (PATTERN (i3), 0, i)) == CLOBBER 1.1.1.4 root 968: && (reg_overlap_mentioned_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), 969: src) 970: || rtx_equal_p (XEXP (XVECEXP (PATTERN (i3), 0, i), 0), dest))) 1.1 root 971: return 0; 972: 973: /* If INSN contains anything volatile, or is an `asm' (whether volatile 974: or not), reject, unless nothing volatile comes between it and I3, 975: with the exception of SUCC. */ 976: 977: if (GET_CODE (src) == ASM_OPERANDS || volatile_refs_p (src)) 978: for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p)) 979: if (GET_RTX_CLASS (GET_CODE (p)) == 'i' 980: && p != succ && volatile_refs_p (PATTERN (p))) 981: return 0; 982: 1.1.1.6 root 983: /* If there are any volatile insns between INSN and I3, reject, because 984: they might affect machine state. */ 985: 986: for (p = NEXT_INSN (insn); p != i3; p = NEXT_INSN (p)) 987: if (GET_RTX_CLASS (GET_CODE (p)) == 'i' 988: && p != succ && volatile_insn_p (PATTERN (p))) 989: return 0; 990: 1.1 root 991: /* If INSN or I2 contains an autoincrement or autodecrement, 992: make sure that register is not used between there and I3, 993: and not already used in I3 either. 994: Also insist that I3 not be a jump; if it were one 995: and the incremented register were spilled, we would lose. */ 996: 997: #ifdef AUTO_INC_DEC 998: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) 999: if (REG_NOTE_KIND (link) == REG_INC 1000: && (GET_CODE (i3) == JUMP_INSN 1001: || reg_used_between_p (XEXP (link, 0), insn, i3) 1002: || reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i3)))) 1003: return 0; 1004: #endif 1005: 1006: #ifdef HAVE_cc0 1007: /* Don't combine an insn that follows a CC0-setting insn. 1008: An insn that uses CC0 must not be separated from the one that sets it. 1009: We do, however, allow I2 to follow a CC0-setting insn if that insn 1010: is passed as I1; in that case it will be deleted also. 1011: We also allow combining in this case if all the insns are adjacent 1012: because that would leave the two CC0 insns adjacent as well. 1013: It would be more logical to test whether CC0 occurs inside I1 or I2, 1014: but that would be much slower, and this ought to be equivalent. */ 1015: 1016: p = prev_nonnote_insn (insn); 1017: if (p && p != pred && GET_CODE (p) == INSN && sets_cc0_p (PATTERN (p)) 1018: && ! all_adjacent) 1019: return 0; 1020: #endif 1021: 1022: /* If we get here, we have passed all the tests and the combination is 1023: to be allowed. */ 1024: 1025: *pdest = dest; 1026: *psrc = src; 1027: 1028: return 1; 1029: } 1030: 1031: /* LOC is the location within I3 that contains its pattern or the component 1032: of a PARALLEL of the pattern. We validate that it is valid for combining. 1033: 1034: One problem is if I3 modifies its output, as opposed to replacing it 1035: entirely, we can't allow the output to contain I2DEST or I1DEST as doing 1036: so would produce an insn that is not equivalent to the original insns. 1037: 1038: Consider: 1039: 1040: (set (reg:DI 101) (reg:DI 100)) 1041: (set (subreg:SI (reg:DI 101) 0) <foo>) 1042: 1043: This is NOT equivalent to: 1044: 1045: (parallel [(set (subreg:SI (reg:DI 100) 0) <foo>) 1046: (set (reg:DI 101) (reg:DI 100))]) 1047: 1048: Not only does this modify 100 (in which case it might still be valid 1049: if 100 were dead in I2), it sets 101 to the ORIGINAL value of 100. 1050: 1051: We can also run into a problem if I2 sets a register that I1 1052: uses and I1 gets directly substituted into I3 (not via I2). In that 1053: case, we would be getting the wrong value of I2DEST into I3, so we 1054: must reject the combination. This case occurs when I2 and I1 both 1055: feed into I3, rather than when I1 feeds into I2, which feeds into I3. 1056: If I1_NOT_IN_SRC is non-zero, it means that finding I1 in the source 1057: of a SET must prevent combination from occurring. 1058: 1059: On machines where SMALL_REGISTER_CLASSES is defined, we don't combine 1.1.1.7 root 1060: if the destination of a SET is a hard register that isn't a user 1061: variable. 1.1 root 1062: 1063: Before doing the above check, we first try to expand a field assignment 1064: into a set of logical operations. 1065: 1066: If PI3_DEST_KILLED is non-zero, it is a pointer to a location in which 1067: we place a register that is both set and used within I3. If more than one 1068: such register is detected, we fail. 1069: 1070: Return 1 if the combination is valid, zero otherwise. */ 1071: 1072: static int 1073: combinable_i3pat (i3, loc, i2dest, i1dest, i1_not_in_src, pi3dest_killed) 1074: rtx i3; 1075: rtx *loc; 1076: rtx i2dest; 1077: rtx i1dest; 1078: int i1_not_in_src; 1079: rtx *pi3dest_killed; 1080: { 1081: rtx x = *loc; 1082: 1083: if (GET_CODE (x) == SET) 1084: { 1085: rtx set = expand_field_assignment (x); 1086: rtx dest = SET_DEST (set); 1087: rtx src = SET_SRC (set); 1088: rtx inner_dest = dest, inner_src = src; 1089: 1090: SUBST (*loc, set); 1091: 1092: while (GET_CODE (inner_dest) == STRICT_LOW_PART 1093: || GET_CODE (inner_dest) == SUBREG 1094: || GET_CODE (inner_dest) == ZERO_EXTRACT) 1095: inner_dest = XEXP (inner_dest, 0); 1096: 1097: /* We probably don't need this any more now that LIMIT_RELOAD_CLASS 1098: was added. */ 1099: #if 0 1100: while (GET_CODE (inner_src) == STRICT_LOW_PART 1101: || GET_CODE (inner_src) == SUBREG 1102: || GET_CODE (inner_src) == ZERO_EXTRACT) 1103: inner_src = XEXP (inner_src, 0); 1104: 1105: /* If it is better that two different modes keep two different pseudos, 1106: avoid combining them. This avoids producing the following pattern 1107: on a 386: 1108: (set (subreg:SI (reg/v:QI 21) 0) 1109: (lshiftrt:SI (reg/v:SI 20) 1110: (const_int 24))) 1111: If that were made, reload could not handle the pair of 1112: reg 20/21, since it would try to get any GENERAL_REGS 1113: but some of them don't handle QImode. */ 1114: 1115: if (rtx_equal_p (inner_src, i2dest) 1116: && GET_CODE (inner_dest) == REG 1117: && ! MODES_TIEABLE_P (GET_MODE (i2dest), GET_MODE (inner_dest))) 1118: return 0; 1119: #endif 1120: 1121: /* Check for the case where I3 modifies its output, as 1122: discussed above. */ 1123: if ((inner_dest != dest 1124: && (reg_overlap_mentioned_p (i2dest, inner_dest) 1125: || (i1dest && reg_overlap_mentioned_p (i1dest, inner_dest)))) 1.1.1.3 root 1126: /* This is the same test done in can_combine_p except that we 1127: allow a hard register with SMALL_REGISTER_CLASSES if SRC is a 1128: CALL operation. */ 1.1 root 1129: || (GET_CODE (inner_dest) == REG 1.1.1.2 root 1130: && REGNO (inner_dest) < FIRST_PSEUDO_REGISTER 1.1.1.7 root 1131: && (! HARD_REGNO_MODE_OK (REGNO (inner_dest), 1132: GET_MODE (inner_dest)) 1.1.1.3 root 1133: #ifdef SMALL_REGISTER_CLASSES 1.1.1.7 root 1134: || (GET_CODE (src) != CALL && ! REG_USERVAR_P (inner_dest)) 1.1 root 1135: #endif 1.1.1.7 root 1136: )) 1.1 root 1137: || (i1_not_in_src && reg_overlap_mentioned_p (i1dest, src))) 1138: return 0; 1139: 1140: /* If DEST is used in I3, it is being killed in this insn, 1.1.1.5 root 1141: so record that for later. 1142: Never add REG_DEAD notes for the FRAME_POINTER_REGNUM or the 1143: STACK_POINTER_REGNUM, since these are always considered to be 1144: live. Similarly for ARG_POINTER_REGNUM if it is fixed. */ 1.1 root 1145: if (pi3dest_killed && GET_CODE (dest) == REG 1.1.1.5 root 1146: && reg_referenced_p (dest, PATTERN (i3)) 1147: && REGNO (dest) != FRAME_POINTER_REGNUM 1.1.1.6 root 1148: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM 1149: && REGNO (dest) != HARD_FRAME_POINTER_REGNUM 1150: #endif 1.1.1.5 root 1151: #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM 1152: && (REGNO (dest) != ARG_POINTER_REGNUM 1153: || ! fixed_regs [REGNO (dest)]) 1154: #endif 1155: && REGNO (dest) != STACK_POINTER_REGNUM) 1.1 root 1156: { 1157: if (*pi3dest_killed) 1158: return 0; 1159: 1160: *pi3dest_killed = dest; 1161: } 1162: } 1163: 1164: else if (GET_CODE (x) == PARALLEL) 1165: { 1166: int i; 1167: 1168: for (i = 0; i < XVECLEN (x, 0); i++) 1169: if (! combinable_i3pat (i3, &XVECEXP (x, 0, i), i2dest, i1dest, 1170: i1_not_in_src, pi3dest_killed)) 1171: return 0; 1172: } 1173: 1174: return 1; 1175: } 1176: 1177: /* Try to combine the insns I1 and I2 into I3. 1178: Here I1 and I2 appear earlier than I3. 1179: I1 can be zero; then we combine just I2 into I3. 1180: 1181: It we are combining three insns and the resulting insn is not recognized, 1182: try splitting it into two insns. If that happens, I2 and I3 are retained 1183: and I1 is pseudo-deleted by turning it into a NOTE. Otherwise, I1 and I2 1184: are pseudo-deleted. 1185: 1.1.1.7 root 1186: Return 0 if the combination does not work. Then nothing is changed. 1187: If we did the combination, return the insn at which combine should 1188: resume scanning. */ 1.1 root 1189: 1190: static rtx 1191: try_combine (i3, i2, i1) 1192: register rtx i3, i2, i1; 1193: { 1194: /* New patterns for I3 and I3, respectively. */ 1195: rtx newpat, newi2pat = 0; 1196: /* Indicates need to preserve SET in I1 or I2 in I3 if it is not dead. */ 1197: int added_sets_1, added_sets_2; 1198: /* Total number of SETs to put into I3. */ 1199: int total_sets; 1200: /* Nonzero is I2's body now appears in I3. */ 1201: int i2_is_used; 1202: /* INSN_CODEs for new I3, new I2, and user of condition code. */ 1203: int insn_code_number, i2_code_number, other_code_number; 1204: /* Contains I3 if the destination of I3 is used in its source, which means 1205: that the old life of I3 is being killed. If that usage is placed into 1206: I2 and not in I3, a REG_DEAD note must be made. */ 1207: rtx i3dest_killed = 0; 1208: /* SET_DEST and SET_SRC of I2 and I1. */ 1209: rtx i2dest, i2src, i1dest = 0, i1src = 0; 1210: /* PATTERN (I2), or a copy of it in certain cases. */ 1211: rtx i2pat; 1212: /* Indicates if I2DEST or I1DEST is in I2SRC or I1_SRC. */ 1.1.1.6 root 1213: int i2dest_in_i2src = 0, i1dest_in_i1src = 0, i2dest_in_i1src = 0; 1.1 root 1214: int i1_feeds_i3 = 0; 1215: /* Notes that must be added to REG_NOTES in I3 and I2. */ 1216: rtx new_i3_notes, new_i2_notes; 1.1.1.6 root 1217: /* Notes that we substituted I3 into I2 instead of the normal case. */ 1218: int i3_subst_into_i2 = 0; 1.1.1.7 root 1219: /* Notes that I1, I2 or I3 is a MULT operation. */ 1220: int have_mult = 0; 1.1.1.8 ! root 1221: /* Number of clobbers of SCRATCH we had to add. */ ! 1222: int i3_scratches = 0, i2_scratches = 0, other_scratches = 0; 1.1 root 1223: 1224: int maxreg; 1225: rtx temp; 1226: register rtx link; 1227: int i; 1228: 1229: /* If any of I1, I2, and I3 isn't really an insn, we can't do anything. 1230: This can occur when flow deletes an insn that it has merged into an 1231: auto-increment address. We also can't do anything if I3 has a 1232: REG_LIBCALL note since we don't want to disrupt the contiguity of a 1233: libcall. */ 1234: 1235: if (GET_RTX_CLASS (GET_CODE (i3)) != 'i' 1236: || GET_RTX_CLASS (GET_CODE (i2)) != 'i' 1237: || (i1 && GET_RTX_CLASS (GET_CODE (i1)) != 'i') 1.1.1.4 root 1238: || find_reg_note (i3, REG_LIBCALL, NULL_RTX)) 1.1 root 1239: return 0; 1240: 1241: combine_attempts++; 1242: 1243: undobuf.num_undo = previous_num_undos = 0; 1244: undobuf.other_insn = 0; 1245: 1246: /* Save the current high-water-mark so we can free storage if we didn't 1247: accept this combination. */ 1248: undobuf.storage = (char *) oballoc (0); 1249: 1.1.1.7 root 1250: /* Reset the hard register usage information. */ 1251: CLEAR_HARD_REG_SET (newpat_used_regs); 1252: 1.1 root 1253: /* If I1 and I2 both feed I3, they can be in any order. To simplify the 1254: code below, set I1 to be the earlier of the two insns. */ 1255: if (i1 && INSN_CUID (i1) > INSN_CUID (i2)) 1256: temp = i1, i1 = i2, i2 = temp; 1257: 1.1.1.7 root 1258: added_links_insn = 0; 1.1.1.6 root 1259: 1.1 root 1260: /* First check for one important special-case that the code below will 1261: not handle. Namely, the case where I1 is zero, I2 has multiple sets, 1262: and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case, 1263: we may be able to replace that destination with the destination of I3. 1264: This occurs in the common code where we compute both a quotient and 1265: remainder into a structure, in which case we want to do the computation 1266: directly into the structure to avoid register-register copies. 1267: 1268: We make very conservative checks below and only try to handle the 1269: most common cases of this. For example, we only handle the case 1270: where I2 and I3 are adjacent to avoid making difficult register 1271: usage tests. */ 1272: 1273: if (i1 == 0 && GET_CODE (i3) == INSN && GET_CODE (PATTERN (i3)) == SET 1274: && GET_CODE (SET_SRC (PATTERN (i3))) == REG 1275: && REGNO (SET_SRC (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER 1276: #ifdef SMALL_REGISTER_CLASSES 1277: && (GET_CODE (SET_DEST (PATTERN (i3))) != REG 1.1.1.7 root 1278: || REGNO (SET_DEST (PATTERN (i3))) >= FIRST_PSEUDO_REGISTER 1279: || REG_USERVAR_P (SET_DEST (PATTERN (i3)))) 1.1 root 1280: #endif 1281: && find_reg_note (i3, REG_DEAD, SET_SRC (PATTERN (i3))) 1282: && GET_CODE (PATTERN (i2)) == PARALLEL 1283: && ! side_effects_p (SET_DEST (PATTERN (i3))) 1.1.1.2 root 1284: /* If the dest of I3 is a ZERO_EXTRACT or STRICT_LOW_PART, the code 1285: below would need to check what is inside (and reg_overlap_mentioned_p 1286: doesn't support those codes anyway). Don't allow those destinations; 1287: the resulting insn isn't likely to be recognized anyway. */ 1288: && GET_CODE (SET_DEST (PATTERN (i3))) != ZERO_EXTRACT 1289: && GET_CODE (SET_DEST (PATTERN (i3))) != STRICT_LOW_PART 1.1 root 1290: && ! reg_overlap_mentioned_p (SET_SRC (PATTERN (i3)), 1291: SET_DEST (PATTERN (i3))) 1292: && next_real_insn (i2) == i3) 1.1.1.2 root 1293: { 1294: rtx p2 = PATTERN (i2); 1.1 root 1295: 1.1.1.2 root 1296: /* Make sure that the destination of I3, 1297: which we are going to substitute into one output of I2, 1298: is not used within another output of I2. We must avoid making this: 1299: (parallel [(set (mem (reg 69)) ...) 1300: (set (reg 69) ...)]) 1301: which is not well-defined as to order of actions. 1302: (Besides, reload can't handle output reloads for this.) 1303: 1304: The problem can also happen if the dest of I3 is a memory ref, 1305: if another dest in I2 is an indirect memory ref. */ 1306: for (i = 0; i < XVECLEN (p2, 0); i++) 1307: if (GET_CODE (XVECEXP (p2, 0, i)) == SET 1308: && reg_overlap_mentioned_p (SET_DEST (PATTERN (i3)), 1309: SET_DEST (XVECEXP (p2, 0, i)))) 1310: break; 1311: 1312: if (i == XVECLEN (p2, 0)) 1313: for (i = 0; i < XVECLEN (p2, 0); i++) 1314: if (SET_DEST (XVECEXP (p2, 0, i)) == SET_SRC (PATTERN (i3))) 1315: { 1316: combine_merges++; 1317: 1318: subst_insn = i3; 1319: subst_low_cuid = INSN_CUID (i2); 1320: 1.1.1.6 root 1321: added_sets_2 = added_sets_1 = 0; 1.1.1.2 root 1322: i2dest = SET_SRC (PATTERN (i3)); 1323: 1324: /* Replace the dest in I2 with our dest and make the resulting 1325: insn the new pattern for I3. Then skip to where we 1326: validate the pattern. Everything was set up above. */ 1327: SUBST (SET_DEST (XVECEXP (p2, 0, i)), 1328: SET_DEST (PATTERN (i3))); 1.1 root 1329: 1.1.1.2 root 1330: newpat = p2; 1.1.1.6 root 1331: i3_subst_into_i2 = 1; 1.1.1.2 root 1332: goto validate_replacement; 1333: } 1334: } 1.1 root 1335: 1336: #ifndef HAVE_cc0 1337: /* If we have no I1 and I2 looks like: 1338: (parallel [(set (reg:CC X) (compare:CC OP (const_int 0))) 1339: (set Y OP)]) 1340: make up a dummy I1 that is 1341: (set Y OP) 1342: and change I2 to be 1343: (set (reg:CC X) (compare:CC Y (const_int 0))) 1344: 1345: (We can ignore any trailing CLOBBERs.) 1346: 1347: This undoes a previous combination and allows us to match a branch-and- 1348: decrement insn. */ 1349: 1350: if (i1 == 0 && GET_CODE (PATTERN (i2)) == PARALLEL 1351: && XVECLEN (PATTERN (i2), 0) >= 2 1352: && GET_CODE (XVECEXP (PATTERN (i2), 0, 0)) == SET 1353: && (GET_MODE_CLASS (GET_MODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 0)))) 1354: == MODE_CC) 1355: && GET_CODE (SET_SRC (XVECEXP (PATTERN (i2), 0, 0))) == COMPARE 1356: && XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 1) == const0_rtx 1357: && GET_CODE (XVECEXP (PATTERN (i2), 0, 1)) == SET 1358: && GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, 1))) == REG 1359: && rtx_equal_p (XEXP (SET_SRC (XVECEXP (PATTERN (i2), 0, 0)), 0), 1360: SET_SRC (XVECEXP (PATTERN (i2), 0, 1)))) 1361: { 1362: for (i = XVECLEN (PATTERN (i2), 0) - 1; i >= 2; i--) 1363: if (GET_CODE (XVECEXP (PATTERN (i2), 0, i)) != CLOBBER) 1364: break; 1365: 1366: if (i == 1) 1367: { 1368: /* We make I1 with the same INSN_UID as I2. This gives it 1369: the same INSN_CUID for value tracking. Our fake I1 will 1370: never appear in the insn stream so giving it the same INSN_UID 1371: as I2 will not cause a problem. */ 1372: 1.1.1.8 ! root 1373: subst_prev_insn = i1 ! 1374: = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2, ! 1375: XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0); 1.1 root 1376: 1377: SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0)); 1378: SUBST (XEXP (SET_SRC (PATTERN (i2)), 0), 1379: SET_DEST (PATTERN (i1))); 1380: } 1381: } 1382: #endif 1383: 1384: /* Verify that I2 and I1 are valid for combining. */ 1.1.1.4 root 1385: if (! can_combine_p (i2, i3, i1, NULL_RTX, &i2dest, &i2src) 1386: || (i1 && ! can_combine_p (i1, i3, NULL_RTX, i2, &i1dest, &i1src))) 1.1 root 1387: { 1388: undo_all (); 1389: return 0; 1390: } 1391: 1392: /* Record whether I2DEST is used in I2SRC and similarly for the other 1393: cases. Knowing this will help in register status updating below. */ 1394: i2dest_in_i2src = reg_overlap_mentioned_p (i2dest, i2src); 1395: i1dest_in_i1src = i1 && reg_overlap_mentioned_p (i1dest, i1src); 1396: i2dest_in_i1src = i1 && reg_overlap_mentioned_p (i2dest, i1src); 1397: 1.1.1.3 root 1398: /* See if I1 directly feeds into I3. It does if I1DEST is not used 1.1 root 1399: in I2SRC. */ 1400: i1_feeds_i3 = i1 && ! reg_overlap_mentioned_p (i1dest, i2src); 1401: 1402: /* Ensure that I3's pattern can be the destination of combines. */ 1403: if (! combinable_i3pat (i3, &PATTERN (i3), i2dest, i1dest, 1404: i1 && i2dest_in_i1src && i1_feeds_i3, 1405: &i3dest_killed)) 1406: { 1407: undo_all (); 1408: return 0; 1409: } 1410: 1.1.1.7 root 1411: /* See if any of the insns is a MULT operation. Unless one is, we will 1412: reject a combination that is, since it must be slower. Be conservative 1413: here. */ 1414: if (GET_CODE (i2src) == MULT 1415: || (i1 != 0 && GET_CODE (i1src) == MULT) 1416: || (GET_CODE (PATTERN (i3)) == SET 1417: && GET_CODE (SET_SRC (PATTERN (i3))) == MULT)) 1418: have_mult = 1; 1419: 1.1 root 1420: /* If I3 has an inc, then give up if I1 or I2 uses the reg that is inc'd. 1421: We used to do this EXCEPT in one case: I3 has a post-inc in an 1422: output operand. However, that exception can give rise to insns like 1423: mov r3,(r3)+ 1424: which is a famous insn on the PDP-11 where the value of r3 used as the 1.1.1.2 root 1425: source was model-dependent. Avoid this sort of thing. */ 1.1 root 1426: 1427: #if 0 1428: if (!(GET_CODE (PATTERN (i3)) == SET 1429: && GET_CODE (SET_SRC (PATTERN (i3))) == REG 1430: && GET_CODE (SET_DEST (PATTERN (i3))) == MEM 1431: && (GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_INC 1432: || GET_CODE (XEXP (SET_DEST (PATTERN (i3)), 0)) == POST_DEC))) 1433: /* It's not the exception. */ 1434: #endif 1435: #ifdef AUTO_INC_DEC 1436: for (link = REG_NOTES (i3); link; link = XEXP (link, 1)) 1437: if (REG_NOTE_KIND (link) == REG_INC 1438: && (reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i2)) 1439: || (i1 != 0 1440: && reg_overlap_mentioned_p (XEXP (link, 0), PATTERN (i1))))) 1441: { 1442: undo_all (); 1443: return 0; 1444: } 1445: #endif 1446: 1447: /* See if the SETs in I1 or I2 need to be kept around in the merged 1448: instruction: whenever the value set there is still needed past I3. 1449: For the SETs in I2, this is easy: we see if I2DEST dies or is set in I3. 1450: 1451: For the SET in I1, we have two cases: If I1 and I2 independently 1452: feed into I3, the set in I1 needs to be kept around if I1DEST dies 1453: or is set in I3. Otherwise (if I1 feeds I2 which feeds I3), the set 1454: in I1 needs to be kept around unless I1DEST dies or is set in either 1455: I2 or I3. We can distinguish these cases by seeing if I2SRC mentions 1456: I1DEST. If so, we know I1 feeds into I2. */ 1457: 1458: added_sets_2 = ! dead_or_set_p (i3, i2dest); 1459: 1460: added_sets_1 1461: = i1 && ! (i1_feeds_i3 ? dead_or_set_p (i3, i1dest) 1462: : (dead_or_set_p (i3, i1dest) || dead_or_set_p (i2, i1dest))); 1463: 1464: /* If the set in I2 needs to be kept around, we must make a copy of 1465: PATTERN (I2), so that when we substitute I1SRC for I1DEST in 1.1.1.2 root 1466: PATTERN (I2), we are only substituting for the original I1DEST, not into 1.1 root 1467: an already-substituted copy. This also prevents making self-referential 1468: rtx. If I2 is a PARALLEL, we just need the piece that assigns I2SRC to 1469: I2DEST. */ 1470: 1471: i2pat = (GET_CODE (PATTERN (i2)) == PARALLEL 1472: ? gen_rtx (SET, VOIDmode, i2dest, i2src) 1473: : PATTERN (i2)); 1474: 1475: if (added_sets_2) 1476: i2pat = copy_rtx (i2pat); 1477: 1478: combine_merges++; 1479: 1480: /* Substitute in the latest insn for the regs set by the earlier ones. */ 1481: 1482: maxreg = max_reg_num (); 1483: 1484: subst_insn = i3; 1485: 1486: /* It is possible that the source of I2 or I1 may be performing an 1487: unneeded operation, such as a ZERO_EXTEND of something that is known 1488: to have the high part zero. Handle that case by letting subst look at 1489: the innermost one of them. 1490: 1491: Another way to do this would be to have a function that tries to 1492: simplify a single insn instead of merging two or more insns. We don't 1493: do this because of the potential of infinite loops and because 1494: of the potential extra memory required. However, doing it the way 1495: we are is a bit of a kludge and doesn't catch all cases. 1496: 1497: But only do this if -fexpensive-optimizations since it slows things down 1498: and doesn't usually win. */ 1499: 1500: if (flag_expensive_optimizations) 1501: { 1502: /* Pass pc_rtx so no substitutions are done, just simplifications. 1503: The cases that we are interested in here do not involve the few 1504: cases were is_replaced is checked. */ 1505: if (i1) 1.1.1.4 root 1506: { 1507: subst_low_cuid = INSN_CUID (i1); 1508: i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0); 1509: } 1.1 root 1510: else 1.1.1.4 root 1511: { 1512: subst_low_cuid = INSN_CUID (i2); 1513: i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0); 1514: } 1.1 root 1515: 1516: previous_num_undos = undobuf.num_undo; 1517: } 1518: 1519: #ifndef HAVE_cc0 1520: /* Many machines that don't use CC0 have insns that can both perform an 1521: arithmetic operation and set the condition code. These operations will 1522: be represented as a PARALLEL with the first element of the vector 1523: being a COMPARE of an arithmetic operation with the constant zero. 1524: The second element of the vector will set some pseudo to the result 1525: of the same arithmetic operation. If we simplify the COMPARE, we won't 1526: match such a pattern and so will generate an extra insn. Here we test 1527: for this case, where both the comparison and the operation result are 1528: needed, and make the PARALLEL by just replacing I2DEST in I3SRC with 1529: I2SRC. Later we will make the PARALLEL that contains I2. */ 1530: 1531: if (i1 == 0 && added_sets_2 && GET_CODE (PATTERN (i3)) == SET 1532: && GET_CODE (SET_SRC (PATTERN (i3))) == COMPARE 1533: && XEXP (SET_SRC (PATTERN (i3)), 1) == const0_rtx 1534: && rtx_equal_p (XEXP (SET_SRC (PATTERN (i3)), 0), i2dest)) 1535: { 1536: rtx *cc_use; 1537: enum machine_mode compare_mode; 1538: 1539: newpat = PATTERN (i3); 1540: SUBST (XEXP (SET_SRC (newpat), 0), i2src); 1541: 1542: i2_is_used = 1; 1543: 1544: #ifdef EXTRA_CC_MODES 1545: /* See if a COMPARE with the operand we substituted in should be done 1546: with the mode that is currently being used. If not, do the same 1547: processing we do in `subst' for a SET; namely, if the destination 1548: is used only once, try to replace it with a register of the proper 1549: mode and also replace the COMPARE. */ 1550: if (undobuf.other_insn == 0 1551: && (cc_use = find_single_use (SET_DEST (newpat), i3, 1552: &undobuf.other_insn)) 1.1.1.4 root 1553: && ((compare_mode = SELECT_CC_MODE (GET_CODE (*cc_use), 1554: i2src, const0_rtx)) 1.1 root 1555: != GET_MODE (SET_DEST (newpat)))) 1556: { 1557: int regno = REGNO (SET_DEST (newpat)); 1558: rtx new_dest = gen_rtx (REG, compare_mode, regno); 1559: 1560: if (regno < FIRST_PSEUDO_REGISTER 1561: || (reg_n_sets[regno] == 1 && ! added_sets_2 1562: && ! REG_USERVAR_P (SET_DEST (newpat)))) 1563: { 1564: if (regno >= FIRST_PSEUDO_REGISTER) 1565: SUBST (regno_reg_rtx[regno], new_dest); 1566: 1567: SUBST (SET_DEST (newpat), new_dest); 1568: SUBST (XEXP (*cc_use, 0), new_dest); 1569: SUBST (SET_SRC (newpat), 1570: gen_rtx_combine (COMPARE, compare_mode, 1571: i2src, const0_rtx)); 1572: } 1573: else 1574: undobuf.other_insn = 0; 1575: } 1576: #endif 1577: } 1578: else 1579: #endif 1580: { 1581: n_occurrences = 0; /* `subst' counts here */ 1582: 1583: /* If I1 feeds into I2 (not into I3) and I1DEST is in I1SRC, we 1584: need to make a unique copy of I2SRC each time we substitute it 1585: to avoid self-referential rtl. */ 1586: 1.1.1.4 root 1587: subst_low_cuid = INSN_CUID (i2); 1.1 root 1588: newpat = subst (PATTERN (i3), i2dest, i2src, 0, 1589: ! i1_feeds_i3 && i1dest_in_i1src); 1590: previous_num_undos = undobuf.num_undo; 1591: 1592: /* Record whether i2's body now appears within i3's body. */ 1593: i2_is_used = n_occurrences; 1594: } 1595: 1596: /* If we already got a failure, don't try to do more. Otherwise, 1597: try to substitute in I1 if we have it. */ 1598: 1599: if (i1 && GET_CODE (newpat) != CLOBBER) 1600: { 1601: /* Before we can do this substitution, we must redo the test done 1602: above (see detailed comments there) that ensures that I1DEST 1603: isn't mentioned in any SETs in NEWPAT that are field assignments. */ 1604: 1.1.1.4 root 1605: if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 1606: 0, NULL_PTR)) 1.1 root 1607: { 1608: undo_all (); 1609: return 0; 1610: } 1611: 1612: n_occurrences = 0; 1.1.1.4 root 1613: subst_low_cuid = INSN_CUID (i1); 1.1 root 1614: newpat = subst (newpat, i1dest, i1src, 0, 0); 1615: previous_num_undos = undobuf.num_undo; 1616: } 1617: 1.1.1.3 root 1618: /* Fail if an autoincrement side-effect has been duplicated. Be careful 1619: to count all the ways that I2SRC and I1SRC can be used. */ 1.1.1.4 root 1620: if ((FIND_REG_INC_NOTE (i2, NULL_RTX) != 0 1.1.1.3 root 1621: && i2_is_used + added_sets_2 > 1) 1.1.1.4 root 1622: || (i1 != 0 && FIND_REG_INC_NOTE (i1, NULL_RTX) != 0 1.1.1.3 root 1623: && (n_occurrences + added_sets_1 + (added_sets_2 && ! i1_feeds_i3) 1624: > 1)) 1.1 root 1625: /* Fail if we tried to make a new register (we used to abort, but there's 1626: really no reason to). */ 1627: || max_reg_num () != maxreg 1628: /* Fail if we couldn't do something and have a CLOBBER. */ 1.1.1.7 root 1629: || GET_CODE (newpat) == CLOBBER 1630: /* Fail if this new pattern is a MULT and we didn't have one before 1631: at the outer level. */ 1632: || (GET_CODE (newpat) == SET && GET_CODE (SET_SRC (newpat)) == MULT 1633: && ! have_mult)) 1.1 root 1634: { 1635: undo_all (); 1636: return 0; 1637: } 1638: 1639: /* If the actions of the earlier insns must be kept 1640: in addition to substituting them into the latest one, 1641: we must make a new PARALLEL for the latest insn 1642: to hold additional the SETs. */ 1643: 1644: if (added_sets_1 || added_sets_2) 1645: { 1646: combine_extras++; 1647: 1648: if (GET_CODE (newpat) == PARALLEL) 1649: { 1650: rtvec old = XVEC (newpat, 0); 1651: total_sets = XVECLEN (newpat, 0) + added_sets_1 + added_sets_2; 1652: newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); 1.1.1.7 root 1653: bcopy ((char *) &old->elem[0], (char *) &XVECEXP (newpat, 0, 0), 1.1 root 1654: sizeof (old->elem[0]) * old->num_elem); 1655: } 1656: else 1657: { 1658: rtx old = newpat; 1659: total_sets = 1 + added_sets_1 + added_sets_2; 1660: newpat = gen_rtx (PARALLEL, VOIDmode, rtvec_alloc (total_sets)); 1661: XVECEXP (newpat, 0, 0) = old; 1662: } 1663: 1664: if (added_sets_1) 1665: XVECEXP (newpat, 0, --total_sets) 1666: = (GET_CODE (PATTERN (i1)) == PARALLEL 1667: ? gen_rtx (SET, VOIDmode, i1dest, i1src) : PATTERN (i1)); 1668: 1669: if (added_sets_2) 1670: { 1671: /* If there is no I1, use I2's body as is. We used to also not do 1672: the subst call below if I2 was substituted into I3, 1673: but that could lose a simplification. */ 1674: if (i1 == 0) 1675: XVECEXP (newpat, 0, --total_sets) = i2pat; 1676: else 1677: /* See comment where i2pat is assigned. */ 1678: XVECEXP (newpat, 0, --total_sets) 1679: = subst (i2pat, i1dest, i1src, 0, 0); 1680: } 1681: } 1682: 1683: /* We come here when we are replacing a destination in I2 with the 1684: destination of I3. */ 1685: validate_replacement: 1686: 1.1.1.7 root 1687: /* Note which hard regs this insn has as inputs. */ 1688: mark_used_regs_combine (newpat); 1689: 1.1 root 1690: /* Is the result of combination a valid instruction? */ 1.1.1.8 ! root 1691: insn_code_number ! 1692: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1 root 1693: 1694: /* If the result isn't valid, see if it is a PARALLEL of two SETs where 1695: the second SET's destination is a register that is unused. In that case, 1696: we just need the first SET. This can occur when simplifying a divmod 1697: insn. We *must* test for this case here because the code below that 1698: splits two independent SETs doesn't handle this case correctly when it 1699: updates the register status. Also check the case where the first 1700: SET's destination is unused. That would not cause incorrect code, but 1701: does cause an unneeded insn to remain. */ 1702: 1703: if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL 1704: && XVECLEN (newpat, 0) == 2 1705: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET 1706: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET 1707: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == REG 1708: && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 1))) 1709: && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 1))) 1710: && asm_noperands (newpat) < 0) 1711: { 1712: newpat = XVECEXP (newpat, 0, 0); 1.1.1.8 ! root 1713: insn_code_number ! 1714: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1 root 1715: } 1716: 1717: else if (insn_code_number < 0 && GET_CODE (newpat) == PARALLEL 1718: && XVECLEN (newpat, 0) == 2 1719: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET 1720: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET 1721: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) == REG 1722: && find_reg_note (i3, REG_UNUSED, SET_DEST (XVECEXP (newpat, 0, 0))) 1723: && ! side_effects_p (SET_SRC (XVECEXP (newpat, 0, 0))) 1724: && asm_noperands (newpat) < 0) 1725: { 1726: newpat = XVECEXP (newpat, 0, 1); 1.1.1.8 ! root 1727: insn_code_number ! 1728: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1 root 1729: } 1730: 1731: /* If we were combining three insns and the result is a simple SET 1732: with no ASM_OPERANDS that wasn't recognized, try to split it into two 1.1.1.3 root 1733: insns. There are two ways to do this. It can be split using a 1734: machine-specific method (like when you have an addition of a large 1735: constant) or by combine in the function find_split_point. */ 1736: 1.1 root 1737: if (i1 && insn_code_number < 0 && GET_CODE (newpat) == SET 1738: && asm_noperands (newpat) < 0) 1739: { 1.1.1.3 root 1740: rtx m_split, *split; 1.1.1.4 root 1741: rtx ni2dest = i2dest; 1.1.1.3 root 1742: 1743: /* See if the MD file can split NEWPAT. If it can't, see if letting it 1.1.1.4 root 1744: use I2DEST as a scratch register will help. In the latter case, 1745: convert I2DEST to the mode of the source of NEWPAT if we can. */ 1.1.1.3 root 1746: 1747: m_split = split_insns (newpat, i3); 1.1.1.4 root 1748: 1749: /* We can only use I2DEST as a scratch reg if it doesn't overlap any 1750: inputs of NEWPAT. */ 1751: 1752: /* ??? If I2DEST is not safe, and I1DEST exists, then it would be 1753: possible to try that as a scratch reg. This would require adding 1754: more code to make it work though. */ 1755: 1756: if (m_split == 0 && ! reg_overlap_mentioned_p (ni2dest, newpat)) 1757: { 1758: /* If I2DEST is a hard register or the only use of a pseudo, 1759: we can change its mode. */ 1760: if (GET_MODE (SET_DEST (newpat)) != GET_MODE (i2dest) 1761: && GET_MODE (SET_DEST (newpat)) != VOIDmode 1762: && GET_CODE (i2dest) == REG 1763: && (REGNO (i2dest) < FIRST_PSEUDO_REGISTER 1764: || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2 1765: && ! REG_USERVAR_P (i2dest)))) 1766: ni2dest = gen_rtx (REG, GET_MODE (SET_DEST (newpat)), 1767: REGNO (i2dest)); 1768: 1769: m_split = split_insns (gen_rtx (PARALLEL, VOIDmode, 1770: gen_rtvec (2, newpat, 1771: gen_rtx (CLOBBER, 1772: VOIDmode, 1773: ni2dest))), 1774: i3); 1775: } 1.1.1.3 root 1776: 1777: if (m_split && GET_CODE (m_split) == SEQUENCE 1778: && XVECLEN (m_split, 0) == 2 1779: && (next_real_insn (i2) == i3 1780: || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)), 1781: INSN_CUID (i2)))) 1782: { 1.1.1.4 root 1783: rtx i2set, i3set; 1784: rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1)); 1.1.1.3 root 1785: newi2pat = PATTERN (XVECEXP (m_split, 0, 0)); 1.1.1.4 root 1786: 1787: i3set = single_set (XVECEXP (m_split, 0, 1)); 1788: i2set = single_set (XVECEXP (m_split, 0, 0)); 1789: 1790: /* In case we changed the mode of I2DEST, replace it in the 1791: pseudo-register table here. We can't do it above in case this 1792: code doesn't get executed and we do a split the other way. */ 1793: 1794: if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER) 1795: SUBST (regno_reg_rtx[REGNO (i2dest)], ni2dest); 1.1.1.3 root 1796: 1.1.1.8 ! root 1797: i2_code_number = recog_for_combine (&newi2pat, i2, &new_i2_notes, ! 1798: &i2_scratches); 1.1.1.4 root 1799: 1800: /* If I2 or I3 has multiple SETs, we won't know how to track 1801: register status, so don't use these insns. */ 1802: 1803: if (i2_code_number >= 0 && i2set && i3set) 1.1.1.8 ! root 1804: insn_code_number = recog_for_combine (&newi3pat, i3, &new_i3_notes, ! 1805: &i3_scratches); 1.1.1.4 root 1806: if (insn_code_number >= 0) 1807: newpat = newi3pat; 1808: 1809: /* It is possible that both insns now set the destination of I3. 1810: If so, we must show an extra use of it. */ 1811: 1812: if (insn_code_number >= 0 && GET_CODE (SET_DEST (i3set)) == REG 1813: && GET_CODE (SET_DEST (i2set)) == REG 1814: && REGNO (SET_DEST (i3set)) == REGNO (SET_DEST (i2set))) 1815: reg_n_sets[REGNO (SET_DEST (i2set))]++; 1.1.1.3 root 1816: } 1.1 root 1817: 1818: /* If we can split it and use I2DEST, go ahead and see if that 1819: helps things be recognized. Verify that none of the registers 1820: are set between I2 and I3. */ 1.1.1.4 root 1821: if (insn_code_number < 0 && (split = find_split_point (&newpat, i3)) != 0 1.1 root 1822: #ifdef HAVE_cc0 1823: && GET_CODE (i2dest) == REG 1824: #endif 1825: /* We need I2DEST in the proper mode. If it is a hard register 1826: or the only use of a pseudo, we can change its mode. */ 1827: && (GET_MODE (*split) == GET_MODE (i2dest) 1828: || GET_MODE (*split) == VOIDmode 1829: || REGNO (i2dest) < FIRST_PSEUDO_REGISTER 1830: || (reg_n_sets[REGNO (i2dest)] == 1 && ! added_sets_2 1831: && ! REG_USERVAR_P (i2dest))) 1832: && (next_real_insn (i2) == i3 1833: || ! use_crosses_set_p (*split, INSN_CUID (i2))) 1834: /* We can't overwrite I2DEST if its value is still used by 1835: NEWPAT. */ 1836: && ! reg_referenced_p (i2dest, newpat)) 1837: { 1838: rtx newdest = i2dest; 1.1.1.7 root 1839: enum rtx_code split_code = GET_CODE (*split); 1840: enum machine_mode split_mode = GET_MODE (*split); 1.1 root 1841: 1842: /* Get NEWDEST as a register in the proper mode. We have already 1843: validated that we can do this. */ 1.1.1.7 root 1844: if (GET_MODE (i2dest) != split_mode && split_mode != VOIDmode) 1.1 root 1845: { 1.1.1.7 root 1846: newdest = gen_rtx (REG, split_mode, REGNO (i2dest)); 1.1 root 1847: 1848: if (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER) 1849: SUBST (regno_reg_rtx[REGNO (i2dest)], newdest); 1850: } 1851: 1852: /* If *SPLIT is a (mult FOO (const_int pow2)), convert it to 1853: an ASHIFT. This can occur if it was inside a PLUS and hence 1854: appeared to be a memory address. This is a kludge. */ 1.1.1.7 root 1855: if (split_code == MULT 1.1 root 1856: && GET_CODE (XEXP (*split, 1)) == CONST_INT 1857: && (i = exact_log2 (INTVAL (XEXP (*split, 1)))) >= 0) 1.1.1.7 root 1858: { 1859: SUBST (*split, gen_rtx_combine (ASHIFT, split_mode, 1860: XEXP (*split, 0), GEN_INT (i))); 1861: /* Update split_code because we may not have a multiply 1862: anymore. */ 1863: split_code = GET_CODE (*split); 1864: } 1.1 root 1865: 1866: #ifdef INSN_SCHEDULING 1867: /* If *SPLIT is a paradoxical SUBREG, when we split it, it should 1868: be written as a ZERO_EXTEND. */ 1.1.1.7 root 1869: if (split_code == SUBREG && GET_CODE (SUBREG_REG (*split)) == MEM) 1870: SUBST (*split, gen_rtx_combine (ZERO_EXTEND, split_mode, 1.1 root 1871: XEXP (*split, 0))); 1872: #endif 1873: 1874: newi2pat = gen_rtx_combine (SET, VOIDmode, newdest, *split); 1875: SUBST (*split, newdest); 1.1.1.8 ! root 1876: i2_code_number ! 1877: = recog_for_combine (&newi2pat, i2, &new_i2_notes, &i2_scratches); 1.1.1.7 root 1878: 1879: /* If the split point was a MULT and we didn't have one before, 1880: don't use one now. */ 1881: if (i2_code_number >= 0 && ! (split_code == MULT && ! have_mult)) 1.1.1.8 ! root 1882: insn_code_number ! 1883: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1 root 1884: } 1885: } 1886: 1887: /* Check for a case where we loaded from memory in a narrow mode and 1888: then sign extended it, but we need both registers. In that case, 1889: we have a PARALLEL with both loads from the same memory location. 1890: We can split this into a load from memory followed by a register-register 1891: copy. This saves at least one insn, more if register allocation can 1.1.1.6 root 1892: eliminate the copy. 1893: 1894: We cannot do this if the destination of the second assignment is 1895: a register that we have already assumed is zero-extended. Similarly 1896: for a SUBREG of such a register. */ 1.1 root 1897: 1898: else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 1899: && GET_CODE (newpat) == PARALLEL 1900: && XVECLEN (newpat, 0) == 2 1901: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET 1902: && GET_CODE (SET_SRC (XVECEXP (newpat, 0, 0))) == SIGN_EXTEND 1903: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET 1904: && rtx_equal_p (SET_SRC (XVECEXP (newpat, 0, 1)), 1905: XEXP (SET_SRC (XVECEXP (newpat, 0, 0)), 0)) 1906: && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), 1907: INSN_CUID (i2)) 1908: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT 1909: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART 1.1.1.6 root 1910: && ! (temp = SET_DEST (XVECEXP (newpat, 0, 1)), 1911: (GET_CODE (temp) == REG 1912: && reg_nonzero_bits[REGNO (temp)] != 0 1913: && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD 1914: && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT 1915: && (reg_nonzero_bits[REGNO (temp)] 1916: != GET_MODE_MASK (word_mode)))) 1917: && ! (GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) == SUBREG 1918: && (temp = SUBREG_REG (SET_DEST (XVECEXP (newpat, 0, 1))), 1919: (GET_CODE (temp) == REG 1920: && reg_nonzero_bits[REGNO (temp)] != 0 1921: && GET_MODE_BITSIZE (GET_MODE (temp)) < BITS_PER_WORD 1922: && GET_MODE_BITSIZE (GET_MODE (temp)) < HOST_BITS_PER_INT 1923: && (reg_nonzero_bits[REGNO (temp)] 1924: != GET_MODE_MASK (word_mode))))) 1.1 root 1925: && ! reg_overlap_mentioned_p (SET_DEST (XVECEXP (newpat, 0, 1)), 1926: SET_SRC (XVECEXP (newpat, 0, 1))) 1927: && ! find_reg_note (i3, REG_UNUSED, 1928: SET_DEST (XVECEXP (newpat, 0, 0)))) 1929: { 1.1.1.4 root 1930: rtx ni2dest; 1931: 1.1 root 1932: newi2pat = XVECEXP (newpat, 0, 0); 1.1.1.4 root 1933: ni2dest = SET_DEST (XVECEXP (newpat, 0, 0)); 1.1 root 1934: newpat = XVECEXP (newpat, 0, 1); 1935: SUBST (SET_SRC (newpat), 1.1.1.4 root 1936: gen_lowpart_for_combine (GET_MODE (SET_SRC (newpat)), ni2dest)); 1.1.1.8 ! root 1937: i2_code_number ! 1938: = recog_for_combine (&newi2pat, i2, &new_i2_notes, &i2_scratches); ! 1939: 1.1 root 1940: if (i2_code_number >= 0) 1.1.1.8 ! root 1941: insn_code_number ! 1942: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1.1.2 root 1943: 1944: if (insn_code_number >= 0) 1945: { 1946: rtx insn; 1947: rtx link; 1948: 1949: /* If we will be able to accept this, we have made a change to the 1950: destination of I3. This can invalidate a LOG_LINKS pointing 1951: to I3. No other part of combine.c makes such a transformation. 1952: 1953: The new I3 will have a destination that was previously the 1954: destination of I1 or I2 and which was used in i2 or I3. Call 1955: distribute_links to make a LOG_LINK from the next use of 1956: that destination. */ 1957: 1958: PATTERN (i3) = newpat; 1.1.1.4 root 1959: distribute_links (gen_rtx (INSN_LIST, VOIDmode, i3, NULL_RTX)); 1.1.1.2 root 1960: 1961: /* I3 now uses what used to be its destination and which is 1962: now I2's destination. That means we need a LOG_LINK from 1963: I3 to I2. But we used to have one, so we still will. 1964: 1965: However, some later insn might be using I2's dest and have 1966: a LOG_LINK pointing at I3. We must remove this link. 1967: The simplest way to remove the link is to point it at I1, 1968: which we know will be a NOTE. */ 1969: 1970: for (insn = NEXT_INSN (i3); 1.1.1.6 root 1971: insn && (this_basic_block == n_basic_blocks - 1 1972: || insn != basic_block_head[this_basic_block + 1]); 1.1.1.2 root 1973: insn = NEXT_INSN (insn)) 1974: { 1975: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 1.1.1.4 root 1976: && reg_referenced_p (ni2dest, PATTERN (insn))) 1.1.1.2 root 1977: { 1978: for (link = LOG_LINKS (insn); link; 1979: link = XEXP (link, 1)) 1980: if (XEXP (link, 0) == i3) 1981: XEXP (link, 0) = i1; 1982: 1983: break; 1984: } 1985: } 1986: } 1.1 root 1987: } 1988: 1989: /* Similarly, check for a case where we have a PARALLEL of two independent 1990: SETs but we started with three insns. In this case, we can do the sets 1991: as two separate insns. This case occurs when some SET allows two 1992: other insns to combine, but the destination of that SET is still live. */ 1993: 1994: else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0 1995: && GET_CODE (newpat) == PARALLEL 1996: && XVECLEN (newpat, 0) == 2 1997: && GET_CODE (XVECEXP (newpat, 0, 0)) == SET 1998: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT 1999: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART 2000: && GET_CODE (XVECEXP (newpat, 0, 1)) == SET 2001: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT 2002: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART 2003: && ! use_crosses_set_p (SET_SRC (XVECEXP (newpat, 0, 1)), 2004: INSN_CUID (i2)) 2005: /* Don't pass sets with (USE (MEM ...)) dests to the following. */ 2006: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != USE 2007: && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != USE 2008: && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)), 2009: XVECEXP (newpat, 0, 0)) 2010: && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 0)), 2011: XVECEXP (newpat, 0, 1))) 2012: { 2013: newi2pat = XVECEXP (newpat, 0, 1); 2014: newpat = XVECEXP (newpat, 0, 0); 2015: 1.1.1.8 ! root 2016: i2_code_number ! 2017: = recog_for_combine (&newi2pat, i2, &new_i2_notes, &i2_scratches); ! 2018: 1.1 root 2019: if (i2_code_number >= 0) 1.1.1.8 ! root 2020: insn_code_number ! 2021: = recog_for_combine (&newpat, i3, &new_i3_notes, &i3_scratches); 1.1 root 2022: } 2023: 2024: /* If it still isn't recognized, fail and change things back the way they 2025: were. */ 2026: if ((insn_code_number < 0 2027: /* Is the result a reasonable ASM_OPERANDS? */ 2028: && (! check_asm_operands (newpat) || added_sets_1 || added_sets_2))) 2029: { 2030: undo_all (); 2031: return 0; 2032: } 2033: 2034: /* If we had to change another insn, make sure it is valid also. */ 2035: if (undobuf.other_insn) 2036: { 2037: rtx other_pat = PATTERN (undobuf.other_insn); 2038: rtx new_other_notes; 2039: rtx note, next; 2040: 1.1.1.7 root 2041: CLEAR_HARD_REG_SET (newpat_used_regs); 2042: 1.1.1.8 ! root 2043: other_code_number ! 2044: = recog_for_combine (&other_pat, undobuf.other_insn, ! 2045: &new_other_notes, &other_scratches); 1.1 root 2046: 2047: if (other_code_number < 0 && ! check_asm_operands (other_pat)) 2048: { 2049: undo_all (); 2050: return 0; 2051: } 2052: 2053: PATTERN (undobuf.other_insn) = other_pat; 2054: 2055: /* If any of the notes in OTHER_INSN were REG_UNUSED, ensure that they 2056: are still valid. Then add any non-duplicate notes added by 2057: recog_for_combine. */ 2058: for (note = REG_NOTES (undobuf.other_insn); note; note = next) 2059: { 2060: next = XEXP (note, 1); 2061: 2062: if (REG_NOTE_KIND (note) == REG_UNUSED 2063: && ! reg_set_p (XEXP (note, 0), PATTERN (undobuf.other_insn))) 1.1.1.4 root 2064: { 2065: if (GET_CODE (XEXP (note, 0)) == REG) 2066: reg_n_deaths[REGNO (XEXP (note, 0))]--; 2067: 2068: remove_note (undobuf.other_insn, note); 2069: } 1.1 root 2070: } 2071: 1.1.1.4 root 2072: for (note = new_other_notes; note; note = XEXP (note, 1)) 2073: if (GET_CODE (XEXP (note, 0)) == REG) 2074: reg_n_deaths[REGNO (XEXP (note, 0))]++; 2075: 1.1 root 2076: distribute_notes (new_other_notes, undobuf.other_insn, 1.1.1.4 root 2077: undobuf.other_insn, NULL_RTX, NULL_RTX, NULL_RTX); 1.1 root 2078: } 2079: 2080: /* We now know that we can do this combination. Merge the insns and 2081: update the status of registers and LOG_LINKS. */ 2082: 2083: { 2084: rtx i3notes, i2notes, i1notes = 0; 2085: rtx i3links, i2links, i1links = 0; 2086: rtx midnotes = 0; 2087: register int regno; 2088: /* Compute which registers we expect to eliminate. */ 2089: rtx elim_i2 = (newi2pat || i2dest_in_i2src || i2dest_in_i1src 2090: ? 0 : i2dest); 2091: rtx elim_i1 = i1 == 0 || i1dest_in_i1src ? 0 : i1dest; 2092: 2093: /* Get the old REG_NOTES and LOG_LINKS from all our insns and 2094: clear them. */ 2095: i3notes = REG_NOTES (i3), i3links = LOG_LINKS (i3); 2096: i2notes = REG_NOTES (i2), i2links = LOG_LINKS (i2); 2097: if (i1) 2098: i1notes = REG_NOTES (i1), i1links = LOG_LINKS (i1); 2099: 2100: /* Ensure that we do not have something that should not be shared but 2101: occurs multiple times in the new insns. Check this by first 1.1.1.2 root 2102: resetting all the `used' flags and then copying anything is shared. */ 1.1 root 2103: 2104: reset_used_flags (i3notes); 2105: reset_used_flags (i2notes); 2106: reset_used_flags (i1notes); 2107: reset_used_flags (newpat); 2108: reset_used_flags (newi2pat); 2109: if (undobuf.other_insn) 2110: reset_used_flags (PATTERN (undobuf.other_insn)); 2111: 2112: i3notes = copy_rtx_if_shared (i3notes); 2113: i2notes = copy_rtx_if_shared (i2notes); 2114: i1notes = copy_rtx_if_shared (i1notes); 2115: newpat = copy_rtx_if_shared (newpat); 2116: newi2pat = copy_rtx_if_shared (newi2pat); 2117: if (undobuf.other_insn) 2118: reset_used_flags (PATTERN (undobuf.other_insn)); 2119: 2120: INSN_CODE (i3) = insn_code_number; 2121: PATTERN (i3) = newpat; 2122: if (undobuf.other_insn) 2123: INSN_CODE (undobuf.other_insn) = other_code_number; 2124: 2125: /* We had one special case above where I2 had more than one set and 2126: we replaced a destination of one of those sets with the destination 2127: of I3. In that case, we have to update LOG_LINKS of insns later 1.1.1.6 root 2128: in this basic block. Note that this (expensive) case is rare. 1.1 root 2129: 1.1.1.6 root 2130: Also, in this case, we must pretend that all REG_NOTEs for I2 2131: actually came from I3, so that REG_UNUSED notes from I2 will be 2132: properly handled. */ 1.1 root 2133: 1.1.1.6 root 2134: if (i3_subst_into_i2) 2135: { 2136: for (i = 0; i < XVECLEN (PATTERN (i2), 0); i++) 2137: if (GET_CODE (SET_DEST (XVECEXP (PATTERN (i2), 0, i))) == REG 2138: && SET_DEST (XVECEXP (PATTERN (i2), 0, i)) != i2dest 2139: && ! find_reg_note (i2, REG_UNUSED, 2140: SET_DEST (XVECEXP (PATTERN (i2), 0, i)))) 2141: for (temp = NEXT_INSN (i2); 2142: temp && (this_basic_block == n_basic_blocks - 1 2143: || basic_block_head[this_basic_block] != temp); 2144: temp = NEXT_INSN (temp)) 2145: if (temp != i3 && GET_RTX_CLASS (GET_CODE (temp)) == 'i') 2146: for (link = LOG_LINKS (temp); link; link = XEXP (link, 1)) 2147: if (XEXP (link, 0) == i2) 2148: XEXP (link, 0) = i3; 1.1 root 2149: 1.1.1.6 root 2150: if (i3notes) 2151: { 2152: rtx link = i3notes; 2153: while (XEXP (link, 1)) 2154: link = XEXP (link, 1); 2155: XEXP (link, 1) = i2notes; 1.1 root 2156: } 1.1.1.6 root 2157: else 2158: i3notes = i2notes; 2159: i2notes = 0; 2160: } 1.1 root 2161: 2162: LOG_LINKS (i3) = 0; 2163: REG_NOTES (i3) = 0; 2164: LOG_LINKS (i2) = 0; 2165: REG_NOTES (i2) = 0; 2166: 2167: if (newi2pat) 2168: { 2169: INSN_CODE (i2) = i2_code_number; 2170: PATTERN (i2) = newi2pat; 2171: } 2172: else 2173: { 2174: PUT_CODE (i2, NOTE); 2175: NOTE_LINE_NUMBER (i2) = NOTE_INSN_DELETED; 2176: NOTE_SOURCE_FILE (i2) = 0; 2177: } 2178: 2179: if (i1) 2180: { 2181: LOG_LINKS (i1) = 0; 2182: REG_NOTES (i1) = 0; 2183: PUT_CODE (i1, NOTE); 2184: NOTE_LINE_NUMBER (i1) = NOTE_INSN_DELETED; 2185: NOTE_SOURCE_FILE (i1) = 0; 2186: } 2187: 2188: /* Get death notes for everything that is now used in either I3 or 2189: I2 and used to die in a previous insn. */ 2190: 2191: move_deaths (newpat, i1 ? INSN_CUID (i1) : INSN_CUID (i2), i3, &midnotes); 2192: if (newi2pat) 2193: move_deaths (newi2pat, INSN_CUID (i1), i2, &midnotes); 2194: 2195: /* Distribute all the LOG_LINKS and REG_NOTES from I1, I2, and I3. */ 2196: if (i3notes) 1.1.1.4 root 2197: distribute_notes (i3notes, i3, i3, newi2pat ? i2 : NULL_RTX, 2198: elim_i2, elim_i1); 1.1 root 2199: if (i2notes) 1.1.1.4 root 2200: distribute_notes (i2notes, i2, i3, newi2pat ? i2 : NULL_RTX, 2201: elim_i2, elim_i1); 1.1 root 2202: if (i1notes) 1.1.1.4 root 2203: distribute_notes (i1notes, i1, i3, newi2pat ? i2 : NULL_RTX, 2204: elim_i2, elim_i1); 1.1 root 2205: if (midnotes) 1.1.1.4 root 2206: distribute_notes (midnotes, NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, 2207: elim_i2, elim_i1); 1.1 root 2208: 2209: /* Distribute any notes added to I2 or I3 by recog_for_combine. We 2210: know these are REG_UNUSED and want them to go to the desired insn, 1.1.1.4 root 2211: so we always pass it as i3. We have not counted the notes in 2212: reg_n_deaths yet, so we need to do so now. */ 2213: 1.1 root 2214: if (newi2pat && new_i2_notes) 1.1.1.4 root 2215: { 2216: for (temp = new_i2_notes; temp; temp = XEXP (temp, 1)) 2217: if (GET_CODE (XEXP (temp, 0)) == REG) 2218: reg_n_deaths[REGNO (XEXP (temp, 0))]++; 2219: 2220: distribute_notes (new_i2_notes, i2, i2, NULL_RTX, NULL_RTX, NULL_RTX); 2221: } 2222: 1.1 root 2223: if (new_i3_notes) 1.1.1.4 root 2224: { 2225: for (temp = new_i3_notes; temp; temp = XEXP (temp, 1)) 2226: if (GET_CODE (XEXP (temp, 0)) == REG) 2227: reg_n_deaths[REGNO (XEXP (temp, 0))]++; 2228: 2229: distribute_notes (new_i3_notes, i3, i3, NULL_RTX, NULL_RTX, NULL_RTX); 2230: } 1.1 root 2231: 2232: /* If I3DEST was used in I3SRC, it really died in I3. We may need to 1.1.1.4 root 2233: put a REG_DEAD note for it somewhere. Similarly for I2 and I1. 2234: Show an additional death due to the REG_DEAD note we make here. If 2235: we discard it in distribute_notes, we will decrement it again. */ 2236: 1.1 root 2237: if (i3dest_killed) 1.1.1.4 root 2238: { 2239: if (GET_CODE (i3dest_killed) == REG) 2240: reg_n_deaths[REGNO (i3dest_killed)]++; 2241: 2242: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i3dest_killed, 2243: NULL_RTX), 2244: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, 2245: NULL_RTX, NULL_RTX); 2246: } 2247: 2248: /* For I2 and I1, we have to be careful. If NEWI2PAT exists and sets 2249: I2DEST or I1DEST, the death must be somewhere before I2, not I3. If 2250: we passed I3 in that case, it might delete I2. */ 2251: 1.1 root 2252: if (i2dest_in_i2src) 1.1.1.4 root 2253: { 2254: if (GET_CODE (i2dest) == REG) 2255: reg_n_deaths[REGNO (i2dest)]++; 2256: 2257: if (newi2pat && reg_set_p (i2dest, newi2pat)) 2258: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX), 2259: NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX); 2260: else 2261: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i2dest, NULL_RTX), 2262: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, 2263: NULL_RTX, NULL_RTX); 2264: } 2265: 1.1 root 2266: if (i1dest_in_i1src) 1.1.1.4 root 2267: { 2268: if (GET_CODE (i1dest) == REG) 2269: reg_n_deaths[REGNO (i1dest)]++; 2270: 2271: if (newi2pat && reg_set_p (i1dest, newi2pat)) 2272: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX), 2273: NULL_RTX, i2, NULL_RTX, NULL_RTX, NULL_RTX); 2274: else 2275: distribute_notes (gen_rtx (EXPR_LIST, REG_DEAD, i1dest, NULL_RTX), 2276: NULL_RTX, i3, newi2pat ? i2 : NULL_RTX, 2277: NULL_RTX, NULL_RTX); 2278: } 1.1 root 2279: 2280: distribute_links (i3links); 2281: distribute_links (i2links); 2282: distribute_links (i1links); 2283: 2284: if (GET_CODE (i2dest) == REG) 2285: { 1.1.1.4 root 2286: rtx link; 2287: rtx i2_insn = 0, i2_val = 0, set; 2288: 2289: /* The insn that used to set this register doesn't exist, and 2290: this life of the register may not exist either. See if one of 2291: I3's links points to an insn that sets I2DEST. If it does, 2292: that is now the last known value for I2DEST. If we don't update 2293: this and I2 set the register to a value that depended on its old 1.1 root 2294: contents, we will get confused. If this insn is used, thing 2295: will be set correctly in combine_instructions. */ 1.1.1.4 root 2296: 2297: for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) 2298: if ((set = single_set (XEXP (link, 0))) != 0 2299: && rtx_equal_p (i2dest, SET_DEST (set))) 2300: i2_insn = XEXP (link, 0), i2_val = SET_SRC (set); 2301: 2302: record_value_for_reg (i2dest, i2_insn, i2_val); 1.1 root 2303: 2304: /* If the reg formerly set in I2 died only once and that was in I3, 2305: zero its use count so it won't make `reload' do any work. */ 1.1.1.7 root 2306: if (! added_sets_2 && newi2pat == 0 && ! i2dest_in_i2src) 1.1 root 2307: { 2308: regno = REGNO (i2dest); 2309: reg_n_sets[regno]--; 2310: if (reg_n_sets[regno] == 0 1.1.1.4 root 2311: && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] 2312: & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS)))) 1.1 root 2313: reg_n_refs[regno] = 0; 2314: } 2315: } 2316: 2317: if (i1 && GET_CODE (i1dest) == REG) 2318: { 1.1.1.4 root 2319: rtx link; 2320: rtx i1_insn = 0, i1_val = 0, set; 2321: 2322: for (link = LOG_LINKS (i3); link; link = XEXP (link, 1)) 2323: if ((set = single_set (XEXP (link, 0))) != 0 2324: && rtx_equal_p (i1dest, SET_DEST (set))) 2325: i1_insn = XEXP (link, 0), i1_val = SET_SRC (set); 2326: 2327: record_value_for_reg (i1dest, i1_insn, i1_val); 2328: 1.1 root 2329: regno = REGNO (i1dest); 1.1.1.7 root 2330: if (! added_sets_1 && ! i1dest_in_i1src) 1.1 root 2331: { 2332: reg_n_sets[regno]--; 2333: if (reg_n_sets[regno] == 0 1.1.1.4 root 2334: && ! (basic_block_live_at_start[0][regno / REGSET_ELT_BITS] 2335: & ((REGSET_ELT_TYPE) 1 << (regno % REGSET_ELT_BITS)))) 1.1 root 2336: reg_n_refs[regno] = 0; 2337: } 2338: } 2339: 1.1.1.5 root 2340: /* Update reg_nonzero_bits et al for any changes that may have been made 1.1.1.4 root 2341: to this insn. */ 2342: 1.1.1.5 root 2343: note_stores (newpat, set_nonzero_bits_and_sign_copies); 1.1.1.4 root 2344: if (newi2pat) 1.1.1.5 root 2345: note_stores (newi2pat, set_nonzero_bits_and_sign_copies); 1.1.1.4 root 2346: 1.1.1.8 ! root 2347: /* If we added any (clobber (scratch)), add them to the max for a ! 2348: block. This is a very pessimistic calculation, since we might ! 2349: have had them already and this might not be the worst block, but ! 2350: it's not worth doing any better. */ ! 2351: max_scratch += i3_scratches + i2_scratches + other_scratches; ! 2352: 1.1 root 2353: /* If I3 is now an unconditional jump, ensure that it has a 2354: BARRIER following it since it may have initially been a 1.1.1.4 root 2355: conditional jump. It may also be the last nonnote insn. */ 1.1 root 2356: 2357: if ((GET_CODE (newpat) == RETURN || simplejump_p (i3)) 1.1.1.4 root 2358: && ((temp = next_nonnote_insn (i3)) == NULL_RTX 2359: || GET_CODE (temp) != BARRIER)) 1.1 root 2360: emit_barrier_after (i3); 2361: } 2362: 2363: combine_successes++; 2364: 1.1.1.8 ! root 2365: /* Clear this here, so that subsequent get_last_value calls are not ! 2366: affected. */ ! 2367: subst_prev_insn = NULL_RTX; ! 2368: 1.1.1.7 root 2369: if (added_links_insn 2370: && (newi2pat == 0 || INSN_CUID (added_links_insn) < INSN_CUID (i2)) 2371: && INSN_CUID (added_links_insn) < INSN_CUID (i3)) 2372: return added_links_insn; 2373: else 2374: return newi2pat ? i2 : i3; 1.1 root 2375: } 2376: 2377: /* Undo all the modifications recorded in undobuf. */ 2378: 2379: static void 2380: undo_all () 2381: { 2382: register int i; 2383: if (undobuf.num_undo > MAX_UNDO) 2384: undobuf.num_undo = MAX_UNDO; 2385: for (i = undobuf.num_undo - 1; i >= 0; i--) 1.1.1.4 root 2386: { 2387: if (undobuf.undo[i].is_int) 2388: *undobuf.undo[i].where.i = undobuf.undo[i].old_contents.i; 2389: else 1.1.1.6 root 2390: *undobuf.undo[i].where.r = undobuf.undo[i].old_contents.r; 1.1.1.4 root 2391: 2392: } 1.1 root 2393: 2394: obfree (undobuf.storage); 2395: undobuf.num_undo = 0; 1.1.1.8 ! root 2396: ! 2397: /* Clear this here, so that subsequent get_last_value calls are not ! 2398: affected. */ ! 2399: subst_prev_insn = NULL_RTX; 1.1 root 2400: } 2401: 2402: /* Find the innermost point within the rtx at LOC, possibly LOC itself, 1.1.1.4 root 2403: where we have an arithmetic expression and return that point. LOC will 2404: be inside INSN. 1.1 root 2405: 2406: try_combine will call this function to see if an insn can be split into 2407: two insns. */ 2408: 2409: static rtx * 1.1.1.4 root 2410: find_split_point (loc, insn) 1.1 root 2411: rtx *loc; 1.1.1.4 root 2412: rtx insn; 1.1 root 2413: { 2414: rtx x = *loc; 2415: enum rtx_code code = GET_CODE (x); 2416: rtx *split; 2417: int len = 0, pos, unsignedp; 2418: rtx inner; 2419: 2420: /* First special-case some codes. */ 2421: switch (code) 2422: { 2423: case SUBREG: 2424: #ifdef INSN_SCHEDULING 2425: /* If we are making a paradoxical SUBREG invalid, it becomes a split 2426: point. */ 2427: if (GET_CODE (SUBREG_REG (x)) == MEM) 2428: return loc; 2429: #endif 1.1.1.4 root 2430: return find_split_point (&SUBREG_REG (x), insn); 1.1 root 2431: 2432: case MEM: 1.1.1.3 root 2433: #ifdef HAVE_lo_sum 1.1 root 2434: /* If we have (mem (const ..)) or (mem (symbol_ref ...)), split it 2435: using LO_SUM and HIGH. */ 2436: if (GET_CODE (XEXP (x, 0)) == CONST 2437: || GET_CODE (XEXP (x, 0)) == SYMBOL_REF) 2438: { 2439: SUBST (XEXP (x, 0), 2440: gen_rtx_combine (LO_SUM, Pmode, 2441: gen_rtx_combine (HIGH, Pmode, XEXP (x, 0)), 2442: XEXP (x, 0))); 2443: return &XEXP (XEXP (x, 0), 0); 2444: } 2445: #endif 2446: 1.1.1.3 root 2447: /* If we have a PLUS whose second operand is a constant and the 2448: address is not valid, perhaps will can split it up using 2449: the machine-specific way to split large constants. We use 1.1.1.8 ! root 2450: the first pseudo-reg (one of the virtual regs) as a placeholder; 1.1.1.3 root 2451: it will not remain in the result. */ 2452: if (GET_CODE (XEXP (x, 0)) == PLUS 2453: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 2454: && ! memory_address_p (GET_MODE (x), XEXP (x, 0))) 2455: { 2456: rtx reg = regno_reg_rtx[FIRST_PSEUDO_REGISTER]; 2457: rtx seq = split_insns (gen_rtx (SET, VOIDmode, reg, XEXP (x, 0)), 2458: subst_insn); 2459: 2460: /* This should have produced two insns, each of which sets our 2461: placeholder. If the source of the second is a valid address, 2462: we can make put both sources together and make a split point 2463: in the middle. */ 2464: 2465: if (seq && XVECLEN (seq, 0) == 2 2466: && GET_CODE (XVECEXP (seq, 0, 0)) == INSN 2467: && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET 2468: && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg 2469: && ! reg_mentioned_p (reg, 2470: SET_SRC (PATTERN (XVECEXP (seq, 0, 0)))) 2471: && GET_CODE (XVECEXP (seq, 0, 1)) == INSN 2472: && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET 2473: && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg 2474: && memory_address_p (GET_MODE (x), 2475: SET_SRC (PATTERN (XVECEXP (seq, 0, 1))))) 2476: { 2477: rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0))); 2478: rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1))); 2479: 2480: /* Replace the placeholder in SRC2 with SRC1. If we can 2481: find where in SRC2 it was placed, that can become our 2482: split point and we can replace this address with SRC2. 2483: Just try two obvious places. */ 2484: 2485: src2 = replace_rtx (src2, reg, src1); 2486: split = 0; 2487: if (XEXP (src2, 0) == src1) 2488: split = &XEXP (src2, 0); 2489: else if (GET_RTX_FORMAT (GET_CODE (XEXP (src2, 0)))[0] == 'e' 2490: && XEXP (XEXP (src2, 0), 0) == src1) 2491: split = &XEXP (XEXP (src2, 0), 0); 2492: 2493: if (split) 2494: { 2495: SUBST (XEXP (x, 0), src2); 2496: return split; 2497: } 2498: } 1.1.1.4 root 2499: 2500: /* If that didn't work, perhaps the first operand is complex and 2501: needs to be computed separately, so make a split point there. 2502: This will occur on machines that just support REG + CONST 2503: and have a constant moved through some previous computation. */ 2504: 2505: else if (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (x, 0), 0))) != 'o' 2506: && ! (GET_CODE (XEXP (XEXP (x, 0), 0)) == SUBREG 2507: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (XEXP (x, 0), 0)))) 2508: == 'o'))) 2509: return &XEXP (XEXP (x, 0), 0); 1.1.1.3 root 2510: } 2511: break; 2512: 1.1 root 2513: case SET: 2514: #ifdef HAVE_cc0 2515: /* If SET_DEST is CC0 and SET_SRC is not an operand, a COMPARE, or a 2516: ZERO_EXTRACT, the most likely reason why this doesn't match is that 2517: we need to put the operand into a register. So split at that 2518: point. */ 2519: 2520: if (SET_DEST (x) == cc0_rtx 2521: && GET_CODE (SET_SRC (x)) != COMPARE 2522: && GET_CODE (SET_SRC (x)) != ZERO_EXTRACT 2523: && GET_RTX_CLASS (GET_CODE (SET_SRC (x))) != 'o' 2524: && ! (GET_CODE (SET_SRC (x)) == SUBREG 2525: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (SET_SRC (x)))) == 'o')) 2526: return &SET_SRC (x); 2527: #endif 2528: 2529: /* See if we can split SET_SRC as it stands. */ 1.1.1.4 root 2530: split = find_split_point (&SET_SRC (x), insn); 1.1 root 2531: if (split && split != &SET_SRC (x)) 2532: return split; 2533: 2534: /* See if this is a bitfield assignment with everything constant. If 2535: so, this is an IOR of an AND, so split it into that. */ 2536: if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT 2537: && (GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))) 1.1.1.4 root 2538: <= HOST_BITS_PER_WIDE_INT) 1.1 root 2539: && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT 2540: && GET_CODE (XEXP (SET_DEST (x), 2)) == CONST_INT 2541: && GET_CODE (SET_SRC (x)) == CONST_INT 2542: && ((INTVAL (XEXP (SET_DEST (x), 1)) 2543: + INTVAL (XEXP (SET_DEST (x), 2))) 2544: <= GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0)))) 2545: && ! side_effects_p (XEXP (SET_DEST (x), 0))) 2546: { 2547: int pos = INTVAL (XEXP (SET_DEST (x), 2)); 2548: int len = INTVAL (XEXP (SET_DEST (x), 1)); 2549: int src = INTVAL (SET_SRC (x)); 2550: rtx dest = XEXP (SET_DEST (x), 0); 2551: enum machine_mode mode = GET_MODE (dest); 1.1.1.4 root 2552: unsigned HOST_WIDE_INT mask = ((HOST_WIDE_INT) 1 << len) - 1; 1.1 root 2553: 1.1.1.8 ! root 2554: if (BITS_BIG_ENDIAN) ! 2555: pos = GET_MODE_BITSIZE (mode) - len - pos; 1.1 root 2556: 2557: if (src == mask) 2558: SUBST (SET_SRC (x), 1.1.1.4 root 2559: gen_binary (IOR, mode, dest, GEN_INT (src << pos))); 1.1 root 2560: else 2561: SUBST (SET_SRC (x), 2562: gen_binary (IOR, mode, 2563: gen_binary (AND, mode, dest, 1.1.1.4 root 2564: GEN_INT (~ (mask << pos) 2565: & GET_MODE_MASK (mode))), 2566: GEN_INT (src << pos))); 1.1 root 2567: 2568: SUBST (SET_DEST (x), dest); 2569: 1.1.1.4 root 2570: split = find_split_point (&SET_SRC (x), insn); 1.1 root 2571: if (split && split != &SET_SRC (x)) 2572: return split; 2573: } 2574: 2575: /* Otherwise, see if this is an operation that we can split into two. 2576: If so, try to split that. */ 2577: code = GET_CODE (SET_SRC (x)); 2578: 2579: switch (code) 2580: { 1.1.1.4 root 2581: case AND: 2582: /* If we are AND'ing with a large constant that is only a single 2583: bit and the result is only being used in a context where we 2584: need to know if it is zero or non-zero, replace it with a bit 2585: extraction. This will avoid the large constant, which might 2586: have taken more than one insn to make. If the constant were 2587: not a valid argument to the AND but took only one insn to make, 2588: this is no worse, but if it took more than one insn, it will 2589: be better. */ 2590: 2591: if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT 2592: && GET_CODE (XEXP (SET_SRC (x), 0)) == REG 2593: && (pos = exact_log2 (INTVAL (XEXP (SET_SRC (x), 1)))) >= 7 2594: && GET_CODE (SET_DEST (x)) == REG 2595: && (split = find_single_use (SET_DEST (x), insn, NULL_PTR)) != 0 2596: && (GET_CODE (*split) == EQ || GET_CODE (*split) == NE) 2597: && XEXP (*split, 0) == SET_DEST (x) 2598: && XEXP (*split, 1) == const0_rtx) 2599: { 2600: SUBST (SET_SRC (x), 2601: make_extraction (GET_MODE (SET_DEST (x)), 2602: XEXP (SET_SRC (x), 0), 2603: pos, NULL_RTX, 1, 1, 0, 0)); 2604: return find_split_point (loc, insn); 2605: } 2606: break; 2607: 1.1 root 2608: case SIGN_EXTEND: 2609: inner = XEXP (SET_SRC (x), 0); 2610: pos = 0; 2611: len = GET_MODE_BITSIZE (GET_MODE (inner)); 2612: unsignedp = 0; 2613: break; 2614: 2615: case SIGN_EXTRACT: 2616: case ZERO_EXTRACT: 2617: if (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT 2618: && GET_CODE (XEXP (SET_SRC (x), 2)) == CONST_INT) 2619: { 2620: inner = XEXP (SET_SRC (x), 0); 2621: len = INTVAL (XEXP (SET_SRC (x), 1)); 2622: pos = INTVAL (XEXP (SET_SRC (x), 2)); 2623: 1.1.1.8 ! root 2624: if (BITS_BIG_ENDIAN) ! 2625: pos = GET_MODE_BITSIZE (GET_MODE (inner)) - len - pos; 1.1 root 2626: unsignedp = (code == ZERO_EXTRACT); 2627: } 2628: break; 2629: } 2630: 2631: if (len && pos >= 0 && pos + len <= GET_MODE_BITSIZE (GET_MODE (inner))) 2632: { 2633: enum machine_mode mode = GET_MODE (SET_SRC (x)); 2634: 1.1.1.4 root 2635: /* For unsigned, we have a choice of a shift followed by an 2636: AND or two shifts. Use two shifts for field sizes where the 2637: constant might be too large. We assume here that we can 2638: always at least get 8-bit constants in an AND insn, which is 2639: true for every current RISC. */ 2640: 2641: if (unsignedp && len <= 8) 1.1 root 2642: { 2643: SUBST (SET_SRC (x), 2644: gen_rtx_combine 2645: (AND, mode, 2646: gen_rtx_combine (LSHIFTRT, mode, 2647: gen_lowpart_for_combine (mode, inner), 1.1.1.4 root 2648: GEN_INT (pos)), 2649: GEN_INT (((HOST_WIDE_INT) 1 << len) - 1))); 1.1 root 2650: 1.1.1.4 root 2651: split = find_split_point (&SET_SRC (x), insn); 1.1 root 2652: if (split && split != &SET_SRC (x)) 2653: return split; 2654: } 2655: else 2656: { 2657: SUBST (SET_SRC (x), 2658: gen_rtx_combine 1.1.1.4 root 2659: (unsignedp ? LSHIFTRT : ASHIFTRT, mode, 1.1 root 2660: gen_rtx_combine (ASHIFT, mode, 2661: gen_lowpart_for_combine (mode, inner), 1.1.1.4 root 2662: GEN_INT (GET_MODE_BITSIZE (mode) 2663: - len - pos)), 2664: GEN_INT (GET_MODE_BITSIZE (mode) - len))); 1.1 root 2665: 1.1.1.4 root 2666: split = find_split_point (&SET_SRC (x), insn); 1.1 root 2667: if (split && split != &SET_SRC (x)) 2668: return split; 2669: } 2670: } 2671: 2672: /* See if this is a simple operation with a constant as the second 2673: operand. It might be that this constant is out of range and hence 2674: could be used as a split point. */ 2675: if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2' 2676: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c' 2677: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<') 2678: && CONSTANT_P (XEXP (SET_SRC (x), 1)) 2679: && (GET_RTX_CLASS (GET_CODE (XEXP (SET_SRC (x), 0))) == 'o' 2680: || (GET_CODE (XEXP (SET_SRC (x), 0)) == SUBREG 2681: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (SET_SRC (x), 0)))) 2682: == 'o')))) 2683: return &XEXP (SET_SRC (x), 1); 2684: 2685: /* Finally, see if this is a simple operation with its first operand 2686: not in a register. The operation might require this operand in a 2687: register, so return it as a split point. We can always do this 2688: because if the first operand were another operation, we would have 2689: already found it as a split point. */ 2690: if ((GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '2' 2691: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == 'c' 2692: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '<' 2693: || GET_RTX_CLASS (GET_CODE (SET_SRC (x))) == '1') 2694: && ! register_operand (XEXP (SET_SRC (x), 0), VOIDmode)) 2695: return &XEXP (SET_SRC (x), 0); 2696: 2697: return 0; 2698: 2699: case AND: 2700: case IOR: 2701: /* We write NOR as (and (not A) (not B)), but if we don't have a NOR, 2702: it is better to write this as (not (ior A B)) so we can split it. 2703: Similarly for IOR. */ 2704: if (GET_CODE (XEXP (x, 0)) == NOT && GET_CODE (XEXP (x, 1)) == NOT) 2705: { 2706: SUBST (*loc, 2707: gen_rtx_combine (NOT, GET_MODE (x), 2708: gen_rtx_combine (code == IOR ? AND : IOR, 2709: GET_MODE (x), 2710: XEXP (XEXP (x, 0), 0), 2711: XEXP (XEXP (x, 1), 0)))); 1.1.1.4 root 2712: return find_split_point (loc, insn); 1.1 root 2713: } 2714: 2715: /* Many RISC machines have a large set of logical insns. If the 2716: second operand is a NOT, put it first so we will try to split the 2717: other operand first. */ 2718: if (GET_CODE (XEXP (x, 1)) == NOT) 2719: { 2720: rtx tem = XEXP (x, 0); 2721: SUBST (XEXP (x, 0), XEXP (x, 1)); 2722: SUBST (XEXP (x, 1), tem); 2723: } 2724: break; 2725: } 2726: 2727: /* Otherwise, select our actions depending on our rtx class. */ 2728: switch (GET_RTX_CLASS (code)) 2729: { 2730: case 'b': /* This is ZERO_EXTRACT and SIGN_EXTRACT. */ 2731: case '3': 1.1.1.4 root 2732: split = find_split_point (&XEXP (x, 2), insn); 1.1 root 2733: if (split) 2734: return split; 2735: /* ... fall through ... */ 2736: case '2': 2737: case 'c': 2738: case '<': 1.1.1.4 root 2739: split = find_split_point (&XEXP (x, 1), insn); 1.1 root 2740: if (split) 2741: return split; 2742: /* ... fall through ... */ 2743: case '1': 2744: /* Some machines have (and (shift ...) ...) insns. If X is not 2745: an AND, but XEXP (X, 0) is, use it as our split point. */ 2746: if (GET_CODE (x) != AND && GET_CODE (XEXP (x, 0)) == AND) 2747: return &XEXP (x, 0); 2748: 1.1.1.4 root 2749: split = find_split_point (&XEXP (x, 0), insn); 1.1 root 2750: if (split) 2751: return split; 2752: return loc; 2753: } 2754: 2755: /* Otherwise, we don't have a split point. */ 2756: return 0; 2757: } 2758: 2759: /* Throughout X, replace FROM with TO, and return the result. 2760: The result is TO if X is FROM; 2761: otherwise the result is X, but its contents may have been modified. 2762: If they were modified, a record was made in undobuf so that 2763: undo_all will (among other things) return X to its original state. 2764: 2765: If the number of changes necessary is too much to record to undo, 2766: the excess changes are not made, so the result is invalid. 2767: The changes already made can still be undone. 2768: undobuf.num_undo is incremented for such changes, so by testing that 2769: the caller can tell whether the result is valid. 2770: 2771: `n_occurrences' is incremented each time FROM is replaced. 2772: 2773: IN_DEST is non-zero if we are processing the SET_DEST of a SET. 2774: 1.1.1.2 root 2775: UNIQUE_COPY is non-zero if each substitution must be unique. We do this 1.1 root 2776: by copying if `n_occurrences' is non-zero. */ 2777: 2778: static rtx 2779: subst (x, from, to, in_dest, unique_copy) 2780: register rtx x, from, to; 2781: int in_dest; 2782: int unique_copy; 2783: { 1.1.1.7 root 2784: register enum rtx_code code = GET_CODE (x); 2785: enum machine_mode op0_mode = VOIDmode; 1.1 root 2786: register char *fmt; 2787: register int len, i; 1.1.1.7 root 2788: rtx new; 1.1 root 2789: 2790: /* Two expressions are equal if they are identical copies of a shared 2791: RTX or if they are both registers with the same register number 2792: and mode. */ 2793: 2794: #define COMBINE_RTX_EQUAL_P(X,Y) \ 2795: ((X) == (Y) \ 2796: || (GET_CODE (X) == REG && GET_CODE (Y) == REG \ 2797: && REGNO (X) == REGNO (Y) && GET_MODE (X) == GET_MODE (Y))) 2798: 2799: if (! in_dest && COMBINE_RTX_EQUAL_P (x, from)) 2800: { 2801: n_occurrences++; 2802: return (unique_copy && n_occurrences > 1 ? copy_rtx (to) : to); 2803: } 2804: 2805: /* If X and FROM are the same register but different modes, they will 2806: not have been seen as equal above. However, flow.c will make a 2807: LOG_LINKS entry for that case. If we do nothing, we will try to 2808: rerecognize our original insn and, when it succeeds, we will 2809: delete the feeding insn, which is incorrect. 2810: 2811: So force this insn not to match in this (rare) case. */ 2812: if (! in_dest && code == REG && GET_CODE (from) == REG 2813: && REGNO (x) == REGNO (from)) 2814: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); 2815: 2816: /* If this is an object, we are done unless it is a MEM or LO_SUM, both 2817: of which may contain things that can be combined. */ 2818: if (code != MEM && code != LO_SUM && GET_RTX_CLASS (code) == 'o') 2819: return x; 2820: 2821: /* It is possible to have a subexpression appear twice in the insn. 2822: Suppose that FROM is a register that appears within TO. 2823: Then, after that subexpression has been scanned once by `subst', 2824: the second time it is scanned, TO may be found. If we were 2825: to scan TO here, we would find FROM within it and create a 2826: self-referent rtl structure which is completely wrong. */ 2827: if (COMBINE_RTX_EQUAL_P (x, to)) 2828: return to; 2829: 2830: len = GET_RTX_LENGTH (code); 2831: fmt = GET_RTX_FORMAT (code); 2832: 2833: /* We don't need to process a SET_DEST that is a register, CC0, or PC, so 2834: set up to skip this common case. All other cases where we want to 2835: suppress replacing something inside a SET_SRC are handled via the 2836: IN_DEST operand. */ 2837: if (code == SET 2838: && (GET_CODE (SET_DEST (x)) == REG 2839: || GET_CODE (SET_DEST (x)) == CC0 2840: || GET_CODE (SET_DEST (x)) == PC)) 2841: fmt = "ie"; 2842: 2843: /* Get the mode of operand 0 in case X is now a SIGN_EXTEND of a constant. */ 2844: if (fmt[0] == 'e') 2845: op0_mode = GET_MODE (XEXP (x, 0)); 2846: 2847: for (i = 0; i < len; i++) 2848: { 2849: if (fmt[i] == 'E') 2850: { 2851: register int j; 2852: for (j = XVECLEN (x, i) - 1; j >= 0; j--) 2853: { 2854: if (COMBINE_RTX_EQUAL_P (XVECEXP (x, i, j), from)) 2855: { 2856: new = (unique_copy && n_occurrences ? copy_rtx (to) : to); 2857: n_occurrences++; 2858: } 2859: else 2860: { 2861: new = subst (XVECEXP (x, i, j), from, to, 0, unique_copy); 2862: 2863: /* If this substitution failed, this whole thing fails. */ 2864: if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx) 2865: return new; 2866: } 2867: 2868: SUBST (XVECEXP (x, i, j), new); 2869: } 2870: } 2871: else if (fmt[i] == 'e') 2872: { 2873: if (COMBINE_RTX_EQUAL_P (XEXP (x, i), from)) 2874: { 1.1.1.6 root 2875: /* In general, don't install a subreg involving two modes not 2876: tieable. It can worsen register allocation, and can even 2877: make invalid reload insns, since the reg inside may need to 2878: be copied from in the outside mode, and that may be invalid 2879: if it is an fp reg copied in integer mode. 2880: 2881: We allow two exceptions to this: It is valid if it is inside 2882: another SUBREG and the mode of that SUBREG and the mode of 2883: the inside of TO is tieable and it is valid if X is a SET 2884: that copies FROM to CC0. */ 2885: if (GET_CODE (to) == SUBREG 2886: && ! MODES_TIEABLE_P (GET_MODE (to), 2887: GET_MODE (SUBREG_REG (to))) 2888: && ! (code == SUBREG 1.1.1.7 root 2889: && MODES_TIEABLE_P (GET_MODE (x), 2890: GET_MODE (SUBREG_REG (to)))) 1.1.1.6 root 2891: #ifdef HAVE_cc0 2892: && ! (code == SET && i == 1 && XEXP (x, 0) == cc0_rtx) 2893: #endif 2894: ) 2895: return gen_rtx (CLOBBER, VOIDmode, const0_rtx); 2896: 1.1 root 2897: new = (unique_copy && n_occurrences ? copy_rtx (to) : to); 2898: n_occurrences++; 2899: } 2900: else 2901: /* If we are in a SET_DEST, suppress most cases unless we 2902: have gone inside a MEM, in which case we want to 2903: simplify the address. We assume here that things that 2904: are actually part of the destination have their inner 2905: parts in the first expression. This is true for SUBREG, 2906: STRICT_LOW_PART, and ZERO_EXTRACT, which are the only 2907: things aside from REG and MEM that should appear in a 2908: SET_DEST. */ 2909: new = subst (XEXP (x, i), from, to, 2910: (((in_dest 2911: && (code == SUBREG || code == STRICT_LOW_PART 2912: || code == ZERO_EXTRACT)) 2913: || code == SET) 2914: && i == 0), unique_copy); 2915: 2916: /* If we found that we will have to reject this combination, 2917: indicate that by returning the CLOBBER ourselves, rather than 2918: an expression containing it. This will speed things up as 2919: well as prevent accidents where two CLOBBERs are considered 2920: to be equal, thus producing an incorrect simplification. */ 2921: 2922: if (GET_CODE (new) == CLOBBER && XEXP (new, 0) == const0_rtx) 2923: return new; 2924: 2925: SUBST (XEXP (x, i), new); 2926: } 2927: } 2928: 1.1.1.7 root 2929: /* Try to simplify X. If the simplification changed the code, it is likely 2930: that further simplification will help, so loop, but limit the number 2931: of repetitions that will be performed. */ 2932: 2933: for (i = 0; i < 4; i++) 2934: { 2935: /* If X is sufficiently simple, don't bother trying to do anything 2936: with it. */ 2937: if (code != CONST_INT && code != REG && code != CLOBBER) 2938: x = simplify_rtx (x, op0_mode, i == 3, in_dest); 1.1.1.4 root 2939: 1.1.1.7 root 2940: if (GET_CODE (x) == code) 2941: break; 1.1.1.4 root 2942: 1.1.1.7 root 2943: code = GET_CODE (x); 1.1.1.4 root 2944: 1.1.1.7 root 2945: /* We no longer know the original mode of operand 0 since we 2946: have changed the form of X) */ 2947: op0_mode = VOIDmode; 2948: } 2949: 2950: return x; 2951: } 2952: 2953: /* Simplify X, a piece of RTL. We just operate on the expression at the 2954: outer level; call `subst' to simplify recursively. Return the new 2955: expression. 2956: 2957: OP0_MODE is the original mode of XEXP (x, 0); LAST is nonzero if this 2958: will be the iteration even if an expression with a code different from 2959: X is returned; IN_DEST is nonzero if we are inside a SET_DEST. */ 2960: 2961: static rtx 2962: simplify_rtx (x, op0_mode, last, in_dest) 2963: rtx x; 2964: enum machine_mode op0_mode; 2965: int last; 2966: int in_dest; 2967: { 2968: enum rtx_code code = GET_CODE (x); 2969: enum machine_mode mode = GET_MODE (x); 2970: rtx temp; 2971: int i; 1.1.1.4 root 2972: 1.1 root 2973: /* If this is a commutative operation, put a constant last and a complex 2974: expression first. We don't need to do this for comparisons here. */ 2975: if (GET_RTX_CLASS (code) == 'c' 2976: && ((CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT) 2977: || (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == 'o' 2978: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o') 2979: || (GET_CODE (XEXP (x, 0)) == SUBREG 2980: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) == 'o' 2981: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o'))) 2982: { 2983: temp = XEXP (x, 0); 2984: SUBST (XEXP (x, 0), XEXP (x, 1)); 2985: SUBST (XEXP (x, 1), temp); 2986: } 2987: 1.1.1.4 root 2988: /* If this is a PLUS, MINUS, or MULT, and the first operand is the 2989: sign extension of a PLUS with a constant, reverse the order of the sign 2990: extension and the addition. Note that this not the same as the original 2991: code, but overflow is undefined for signed values. Also note that the 2992: PLUS will have been partially moved "inside" the sign-extension, so that 2993: the first operand of X will really look like: 2994: (ashiftrt (plus (ashift A C4) C5) C4). 2995: We convert this to 2996: (plus (ashiftrt (ashift A C4) C2) C4) 2997: and replace the first operand of X with that expression. Later parts 2998: of this function may simplify the expression further. 2999: 3000: For example, if we start with (mult (sign_extend (plus A C1)) C2), 3001: we swap the SIGN_EXTEND and PLUS. Later code will apply the 3002: distributive law to produce (plus (mult (sign_extend X) C1) C3). 3003: 3004: We do this to simplify address expressions. */ 3005: 3006: if ((code == PLUS || code == MINUS || code == MULT) 3007: && GET_CODE (XEXP (x, 0)) == ASHIFTRT 3008: && GET_CODE (XEXP (XEXP (x, 0), 0)) == PLUS 3009: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == ASHIFT 3010: && GET_CODE (XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1)) == CONST_INT 3011: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 3012: && XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 1) == XEXP (XEXP (x, 0), 1) 3013: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT 3014: && (temp = simplify_binary_operation (ASHIFTRT, mode, 3015: XEXP (XEXP (XEXP (x, 0), 0), 1), 3016: XEXP (XEXP (x, 0), 1))) != 0) 3017: { 3018: rtx new 3019: = simplify_shift_const (NULL_RTX, ASHIFT, mode, 3020: XEXP (XEXP (XEXP (XEXP (x, 0), 0), 0), 0), 3021: INTVAL (XEXP (XEXP (x, 0), 1))); 3022: 3023: new = simplify_shift_const (NULL_RTX, ASHIFTRT, mode, new, 3024: INTVAL (XEXP (XEXP (x, 0), 1))); 3025: 3026: SUBST (XEXP (x, 0), gen_binary (PLUS, mode, new, temp)); 3027: } 3028: 3029: /* If this is a simple operation applied to an IF_THEN_ELSE, try 3030: applying it to the arms of the IF_THEN_ELSE. This often simplifies 1.1.1.7 root 3031: things. Check for cases where both arms are testing the same 3032: condition. 1.1.1.4 root 3033: 1.1.1.7 root 3034: Don't do anything if all operands are very simple. */ 3035: 3036: if (((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c' 3037: || GET_RTX_CLASS (code) == '<') 3038: && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o' 3039: && ! (GET_CODE (XEXP (x, 0)) == SUBREG 3040: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) 3041: == 'o'))) 3042: || (GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) != 'o' 3043: && ! (GET_CODE (XEXP (x, 1)) == SUBREG 3044: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 1)))) 3045: == 'o'))))) 3046: || (GET_RTX_CLASS (code) == '1' 3047: && ((GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) != 'o' 3048: && ! (GET_CODE (XEXP (x, 0)) == SUBREG 3049: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (XEXP (x, 0)))) 3050: == 'o')))))) 3051: { 3052: rtx cond, true, false; 3053: 3054: cond = if_then_else_cond (x, &true, &false); 3055: if (cond != 0) 3056: { 3057: rtx cop1 = const0_rtx; 3058: enum rtx_code cond_code = simplify_comparison (NE, &cond, &cop1); 3059: 1.1.1.8 ! root 3060: if (cond_code == NE && GET_RTX_CLASS (GET_CODE (cond)) == '<') ! 3061: return x; ! 3062: 1.1.1.7 root 3063: /* Simplify the alternative arms; this may collapse the true and 3064: false arms to store-flag values. */ 3065: true = subst (true, pc_rtx, pc_rtx, 0, 0); 3066: false = subst (false, pc_rtx, pc_rtx, 0, 0); 3067: 3068: /* Restarting if we generate a store-flag expression will cause 3069: us to loop. Just drop through in this case. */ 3070: 3071: /* If the result values are STORE_FLAG_VALUE and zero, we can 3072: just make the comparison operation. */ 3073: if (true == const_true_rtx && false == const0_rtx) 3074: x = gen_binary (cond_code, mode, cond, cop1); 3075: else if (true == const0_rtx && false == const_true_rtx) 3076: x = gen_binary (reverse_condition (cond_code), mode, cond, cop1); 3077: 3078: /* Likewise, we can make the negate of a comparison operation 3079: if the result values are - STORE_FLAG_VALUE and zero. */ 3080: else if (GET_CODE (true) == CONST_INT 3081: && INTVAL (true) == - STORE_FLAG_VALUE 3082: && false == const0_rtx) 3083: x = gen_unary (NEG, mode, mode, 3084: gen_binary (cond_code, mode, cond, cop1)); 3085: else if (GET_CODE (false) == CONST_INT 3086: && INTVAL (false) == - STORE_FLAG_VALUE 3087: && true == const0_rtx) 3088: x = gen_unary (NEG, mode, mode, 3089: gen_binary (reverse_condition (cond_code), 3090: mode, cond, cop1)); 3091: else 3092: return gen_rtx (IF_THEN_ELSE, mode, 3093: gen_binary (cond_code, VOIDmode, cond, cop1), 3094: true, false); 1.1.1.4 root 3095: 1.1.1.7 root 3096: code = GET_CODE (x); 3097: op0_mode = VOIDmode; 3098: } 1.1.1.4 root 3099: } 3100: 1.1 root 3101: /* Try to fold this expression in case we have constants that weren't 3102: present before. */ 3103: temp = 0; 3104: switch (GET_RTX_CLASS (code)) 3105: { 3106: case '1': 3107: temp = simplify_unary_operation (code, mode, XEXP (x, 0), op0_mode); 3108: break; 3109: case '<': 3110: temp = simplify_relational_operation (code, op0_mode, 3111: XEXP (x, 0), XEXP (x, 1)); 1.1.1.4 root 3112: #ifdef FLOAT_STORE_FLAG_VALUE 3113: if (temp != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT) 3114: temp = ((temp == const0_rtx) ? CONST0_RTX (GET_MODE (x)) 3115: : immed_real_const_1 (FLOAT_STORE_FLAG_VALUE, GET_MODE (x))); 3116: #endif 1.1 root 3117: break; 3118: case 'c': 3119: case '2': 3120: temp = simplify_binary_operation (code, mode, XEXP (x, 0), XEXP (x, 1)); 3121: break; 3122: case 'b': 3123: case '3': 3124: temp = simplify_ternary_operation (code, mode, op0_mode, XEXP (x, 0), 3125: XEXP (x, 1), XEXP (x, 2)); 3126: break; 3127: } 3128: 3129: if (temp) 1.1.1.4 root 3130: x = temp, code = GET_CODE (temp); 1.1 root 3131: 3132: /* First see if we can apply the inverse distributive law. */ 1.1.1.6 root 3133: if (code == PLUS || code == MINUS 3134: || code == AND || code == IOR || code == XOR) 1.1 root 3135: { 3136: x = apply_distributive_law (x); 3137: code = GET_CODE (x); 3138: } 3139: 3140: /* If CODE is an associative operation not otherwise handled, see if we 3141: can associate some operands. This can win if they are constants or 3142: if they are logically related (i.e. (a & b) & a. */ 3143: if ((code == PLUS || code == MINUS 3144: || code == MULT || code == AND || code == IOR || code == XOR 3145: || code == DIV || code == UDIV 3146: || code == SMAX || code == SMIN || code == UMAX || code == UMIN) 1.1.1.6 root 3147: && INTEGRAL_MODE_P (mode)) 1.1 root 3148: { 3149: if (GET_CODE (XEXP (x, 0)) == code) 3150: { 3151: rtx other = XEXP (XEXP (x, 0), 0); 3152: rtx inner_op0 = XEXP (XEXP (x, 0), 1); 3153: rtx inner_op1 = XEXP (x, 1); 3154: rtx inner; 3155: 3156: /* Make sure we pass the constant operand if any as the second 3157: one if this is a commutative operation. */ 3158: if (CONSTANT_P (inner_op0) && GET_RTX_CLASS (code) == 'c') 3159: { 3160: rtx tem = inner_op0; 3161: inner_op0 = inner_op1; 3162: inner_op1 = tem; 3163: } 3164: inner = simplify_binary_operation (code == MINUS ? PLUS 3165: : code == DIV ? MULT 3166: : code == UDIV ? MULT 3167: : code, 3168: mode, inner_op0, inner_op1); 3169: 3170: /* For commutative operations, try the other pair if that one 3171: didn't simplify. */ 3172: if (inner == 0 && GET_RTX_CLASS (code) == 'c') 3173: { 3174: other = XEXP (XEXP (x, 0), 1); 3175: inner = simplify_binary_operation (code, mode, 3176: XEXP (XEXP (x, 0), 0), 3177: XEXP (x, 1)); 3178: } 3179: 3180: if (inner) 1.1.1.7 root 3181: return gen_binary (code, mode, other, inner); 1.1 root 3182: } 3183: } 3184: 3185: /* A little bit of algebraic simplification here. */ 3186: switch (code) 3187: { 3188: case MEM: 3189: /* Ensure that our address has any ASHIFTs converted to MULT in case 3190: address-recognizing predicates are called later. */ 3191: temp = make_compound_operation (XEXP (x, 0), MEM); 3192: SUBST (XEXP (x, 0), temp); 3193: break; 3194: 3195: case SUBREG: 3196: /* (subreg:A (mem:B X) N) becomes a modified MEM unless the SUBREG 3197: is paradoxical. If we can't do that safely, then it becomes 3198: something nonsensical so that this combination won't take place. */ 3199: 3200: if (GET_CODE (SUBREG_REG (x)) == MEM 3201: && (GET_MODE_SIZE (mode) 3202: <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))) 3203: { 3204: rtx inner = SUBREG_REG (x); 3205: int endian_offset = 0; 3206: /* Don't change the mode of the MEM 3207: if that would change the meaning of the address. */ 3208: if (MEM_VOLATILE_P (SUBREG_REG (x)) 3209: || mode_dependent_address_p (XEXP (inner, 0))) 3210: return gen_rtx (CLOBBER, mode, const0_rtx); 3211: 1.1.1.8 ! root 3212: if (BYTES_BIG_ENDIAN) ! 3213: { ! 3214: if (GET_MODE_SIZE (mode) < UNITS_PER_WORD) ! 3215: endian_offset += UNITS_PER_WORD - GET_MODE_SIZE (mode); ! 3216: if (GET_MODE_SIZE (GET_MODE (inner)) < UNITS_PER_WORD) ! 3217: endian_offset -= (UNITS_PER_WORD ! 3218: - GET_MODE_SIZE (GET_MODE (inner))); ! 3219: } 1.1 root 3220: /* Note if the plus_constant doesn't make a valid address 3221: then this combination won't be accepted. */ 3222: x = gen_rtx (MEM, mode, 3223: plus_constant (XEXP (inner, 0), 3224: (SUBREG_WORD (x) * UNITS_PER_WORD 3225: + endian_offset))); 3226: MEM_VOLATILE_P (x) = MEM_VOLATILE_P (inner); 3227: RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (inner); 3228: MEM_IN_STRUCT_P (x) = MEM_IN_STRUCT_P (inner); 3229: return x; 3230: } 3231: 3232: /* If we are in a SET_DEST, these other cases can't apply. */ 3233: if (in_dest) 3234: return x; 3235: 3236: /* Changing mode twice with SUBREG => just change it once, 3237: or not at all if changing back to starting mode. */ 3238: if (GET_CODE (SUBREG_REG (x)) == SUBREG) 3239: { 3240: if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x))) 3241: && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0) 3242: return SUBREG_REG (SUBREG_REG (x)); 3243: 3244: SUBST_INT (SUBREG_WORD (x), 3245: SUBREG_WORD (x) + SUBREG_WORD (SUBREG_REG (x))); 3246: SUBST (SUBREG_REG (x), SUBREG_REG (SUBREG_REG (x))); 3247: } 3248: 3249: /* SUBREG of a hard register => just change the register number 3250: and/or mode. If the hard register is not valid in that mode, 1.1.1.4 root 3251: suppress this combination. If the hard register is the stack, 3252: frame, or argument pointer, leave this as a SUBREG. */ 1.1 root 3253: 3254: if (GET_CODE (SUBREG_REG (x)) == REG 1.1.1.4 root 3255: && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER 3256: && REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM 1.1.1.6 root 3257: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM 3258: && REGNO (SUBREG_REG (x)) != HARD_FRAME_POINTER_REGNUM 3259: #endif 1.1.1.4 root 3260: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 3261: && REGNO (SUBREG_REG (x)) != ARG_POINTER_REGNUM 3262: #endif 3263: && REGNO (SUBREG_REG (x)) != STACK_POINTER_REGNUM) 1.1 root 3264: { 3265: if (HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (x)) + SUBREG_WORD (x), 3266: mode)) 3267: return gen_rtx (REG, mode, 3268: REGNO (SUBREG_REG (x)) + SUBREG_WORD (x)); 3269: else 3270: return gen_rtx (CLOBBER, mode, const0_rtx); 3271: } 3272: 3273: /* For a constant, try to pick up the part we want. Handle a full 1.1.1.3 root 3274: word and low-order part. Only do this if we are narrowing 3275: the constant; if it is being widened, we have no idea what 3276: the extra bits will have been set to. */ 1.1 root 3277: 3278: if (CONSTANT_P (SUBREG_REG (x)) && op0_mode != VOIDmode 3279: && GET_MODE_SIZE (mode) == UNITS_PER_WORD 1.1.1.3 root 3280: && GET_MODE_SIZE (op0_mode) < UNITS_PER_WORD 1.1 root 3281: && GET_MODE_CLASS (mode) == MODE_INT) 3282: { 3283: temp = operand_subword (SUBREG_REG (x), SUBREG_WORD (x), 1.1.1.4 root 3284: 0, op0_mode); 1.1 root 3285: if (temp) 3286: return temp; 3287: } 3288: 1.1.1.5 root 3289: /* If we want a subreg of a constant, at offset 0, 3290: take the low bits. On a little-endian machine, that's 3291: always valid. On a big-endian machine, it's valid 3292: only if the constant's mode fits in one word. */ 1.1.1.3 root 3293: if (CONSTANT_P (SUBREG_REG (x)) && subreg_lowpart_p (x) 1.1.1.5 root 3294: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (op0_mode) 1.1.1.8 ! root 3295: && (! WORDS_BIG_ENDIAN ! 3296: || GET_MODE_BITSIZE (op0_mode) <= BITS_PER_WORD)) 1.1 root 3297: return gen_lowpart_for_combine (mode, SUBREG_REG (x)); 3298: 1.1.1.7 root 3299: /* A paradoxical SUBREG of a VOIDmode constant is the same constant, 3300: since we are saying that the high bits don't matter. */ 3301: if (CONSTANT_P (SUBREG_REG (x)) && GET_MODE (SUBREG_REG (x)) == VOIDmode 3302: && GET_MODE_SIZE (mode) > GET_MODE_SIZE (op0_mode)) 3303: return SUBREG_REG (x); 3304: 3305: /* Note that we cannot do any narrowing for non-constants since 3306: we might have been counting on using the fact that some bits were 3307: zero. We now do this in the SET. */ 1.1.1.4 root 3308: 1.1 root 3309: break; 3310: 3311: case NOT: 3312: /* (not (plus X -1)) can become (neg X). */ 3313: if (GET_CODE (XEXP (x, 0)) == PLUS 3314: && XEXP (XEXP (x, 0), 1) == constm1_rtx) 1.1.1.7 root 3315: return gen_rtx_combine (NEG, mode, XEXP (XEXP (x, 0), 0)); 1.1 root 3316: 3317: /* Similarly, (not (neg X)) is (plus X -1). */ 3318: if (GET_CODE (XEXP (x, 0)) == NEG) 1.1.1.7 root 3319: return gen_rtx_combine (PLUS, mode, XEXP (XEXP (x, 0), 0), 3320: constm1_rtx); 1.1 root 3321: 1.1.1.4 root 3322: /* (not (xor X C)) for C constant is (xor X D) with D = ~ C. */ 3323: if (GET_CODE (XEXP (x, 0)) == XOR 3324: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 3325: && (temp = simplify_unary_operation (NOT, mode, 3326: XEXP (XEXP (x, 0), 1), 3327: mode)) != 0) 1.1.1.7 root 3328: return gen_binary (XOR, mode, XEXP (XEXP (x, 0), 0), temp); 1.1.1.4 root 3329: 1.1 root 3330: /* (not (ashift 1 X)) is (rotate ~1 X). We used to do this for operands 3331: other than 1, but that is not valid. We could do a similar 3332: simplification for (not (lshiftrt C X)) where C is just the sign bit, 3333: but this doesn't seem common enough to bother with. */ 3334: if (GET_CODE (XEXP (x, 0)) == ASHIFT 3335: && XEXP (XEXP (x, 0), 0) == const1_rtx) 1.1.1.7 root 3336: return gen_rtx (ROTATE, mode, gen_unary (NOT, mode, mode, const1_rtx), 3337: XEXP (XEXP (x, 0), 1)); 1.1 root 3338: 3339: if (GET_CODE (XEXP (x, 0)) == SUBREG 3340: && subreg_lowpart_p (XEXP (x, 0)) 3341: && (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) 3342: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (x, 0))))) 3343: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == ASHIFT 3344: && XEXP (SUBREG_REG (XEXP (x, 0)), 0) == const1_rtx) 3345: { 3346: enum machine_mode inner_mode = GET_MODE (SUBREG_REG (XEXP (x, 0))); 3347: 3348: x = gen_rtx (ROTATE, inner_mode, 1.1.1.7 root 3349: gen_unary (NOT, inner_mode, inner_mode, const1_rtx), 1.1 root 3350: XEXP (SUBREG_REG (XEXP (x, 0)), 1)); 1.1.1.7 root 3351: return gen_lowpart_for_combine (mode, x); 1.1 root 3352: } 3353: 3354: #if STORE_FLAG_VALUE == -1 3355: /* (not (comparison foo bar)) can be done by reversing the comparison 3356: code if valid. */ 3357: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' 3358: && reversible_comparison_p (XEXP (x, 0))) 3359: return gen_rtx_combine (reverse_condition (GET_CODE (XEXP (x, 0))), 3360: mode, XEXP (XEXP (x, 0), 0), 3361: XEXP (XEXP (x, 0), 1)); 1.1.1.5 root 3362: 3363: /* (ashiftrt foo C) where C is the number of bits in FOO minus 1 3364: is (lt foo (const_int 0)), so we can perform the above 3365: simplification. */ 3366: 3367: if (XEXP (x, 1) == const1_rtx 3368: && GET_CODE (XEXP (x, 0)) == ASHIFTRT 3369: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 3370: && INTVAL (XEXP (XEXP (x, 0), 1)) == GET_MODE_BITSIZE (mode) - 1) 3371: return gen_rtx_combine (GE, mode, XEXP (XEXP (x, 0), 0), const0_rtx); 1.1 root 3372: #endif 3373: 3374: /* Apply De Morgan's laws to reduce number of patterns for machines 3375: with negating logical insns (and-not, nand, etc.). If result has 3376: only one NOT, put it first, since that is how the patterns are 3377: coded. */ 3378: 3379: if (GET_CODE (XEXP (x, 0)) == IOR || GET_CODE (XEXP (x, 0)) == AND) 3380: { 3381: rtx in1 = XEXP (XEXP (x, 0), 0), in2 = XEXP (XEXP (x, 0), 1); 3382: 3383: if (GET_CODE (in1) == NOT) 3384: in1 = XEXP (in1, 0); 3385: else 3386: in1 = gen_rtx_combine (NOT, GET_MODE (in1), in1); 3387: 3388: if (GET_CODE (in2) == NOT) 3389: in2 = XEXP (in2, 0); 3390: else if (GET_CODE (in2) == CONST_INT 1.1.1.4 root 3391: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) 3392: in2 = GEN_INT (GET_MODE_MASK (mode) & ~ INTVAL (in2)); 1.1 root 3393: else 3394: in2 = gen_rtx_combine (NOT, GET_MODE (in2), in2); 3395: 3396: if (GET_CODE (in2) == NOT) 3397: { 3398: rtx tem = in2; 3399: in2 = in1; in1 = tem; 3400: } 3401: 1.1.1.7 root 3402: return gen_rtx_combine (GET_CODE (XEXP (x, 0)) == IOR ? AND : IOR, 3403: mode, in1, in2); 1.1 root 3404: } 3405: break; 3406: 3407: case NEG: 3408: /* (neg (plus X 1)) can become (not X). */ 3409: if (GET_CODE (XEXP (x, 0)) == PLUS 3410: && XEXP (XEXP (x, 0), 1) == const1_rtx) 1.1.1.7 root 3411: return gen_rtx_combine (NOT, mode, XEXP (XEXP (x, 0), 0)); 1.1 root 3412: 3413: /* Similarly, (neg (not X)) is (plus X 1). */ 3414: if (GET_CODE (XEXP (x, 0)) == NOT) 1.1.1.7 root 3415: return plus_constant (XEXP (XEXP (x, 0), 0), 1); 1.1 root 3416: 3417: /* (neg (minus X Y)) can become (minus Y X). */ 3418: if (GET_CODE (XEXP (x, 0)) == MINUS 1.1.1.6 root 3419: && (! FLOAT_MODE_P (mode) 1.1 root 3420: /* x-y != -(y-x) with IEEE floating point. */ 1.1.1.7 root 3421: || TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT 3422: || flag_fast_math)) 3423: return gen_binary (MINUS, mode, XEXP (XEXP (x, 0), 1), 3424: XEXP (XEXP (x, 0), 0)); 1.1 root 3425: 1.1.1.4 root 3426: /* (neg (xor A 1)) is (plus A -1) if A is known to be either 0 or 1. */ 3427: if (GET_CODE (XEXP (x, 0)) == XOR && XEXP (XEXP (x, 0), 1) == const1_rtx 1.1.1.5 root 3428: && nonzero_bits (XEXP (XEXP (x, 0), 0), mode) == 1) 1.1.1.7 root 3429: return gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), constm1_rtx); 1.1.1.4 root 3430: 1.1 root 3431: /* NEG commutes with ASHIFT since it is multiplication. Only do this 3432: if we can then eliminate the NEG (e.g., 3433: if the operand is a constant). */ 3434: 3435: if (GET_CODE (XEXP (x, 0)) == ASHIFT) 3436: { 3437: temp = simplify_unary_operation (NEG, mode, 3438: XEXP (XEXP (x, 0), 0), mode); 3439: if (temp) 3440: { 3441: SUBST (XEXP (XEXP (x, 0), 0), temp); 3442: return XEXP (x, 0); 3443: } 3444: } 3445: 3446: temp = expand_compound_operation (XEXP (x, 0)); 3447: 3448: /* For C equal to the width of MODE minus 1, (neg (ashiftrt X C)) can be 3449: replaced by (lshiftrt X C). This will convert 3450: (neg (sign_extract X 1 Y)) to (zero_extract X 1 Y). */ 3451: 3452: if (GET_CODE (temp) == ASHIFTRT 3453: && GET_CODE (XEXP (temp, 1)) == CONST_INT 3454: && INTVAL (XEXP (temp, 1)) == GET_MODE_BITSIZE (mode) - 1) 1.1.1.7 root 3455: return simplify_shift_const (temp, LSHIFTRT, mode, XEXP (temp, 0), 3456: INTVAL (XEXP (temp, 1))); 1.1 root 3457: 1.1.1.5 root 3458: /* If X has only a single bit that might be nonzero, say, bit I, convert 1.1 root 3459: (neg X) to (ashiftrt (ashift X C-I) C-I) where C is the bitsize of 3460: MODE minus 1. This will convert (neg (zero_extract X 1 Y)) to 3461: (sign_extract X 1 Y). But only do this if TEMP isn't a register 3462: or a SUBREG of one since we'd be making the expression more 3463: complex if it was just a register. */ 3464: 3465: if (GET_CODE (temp) != REG 3466: && ! (GET_CODE (temp) == SUBREG 3467: && GET_CODE (SUBREG_REG (temp)) == REG) 1.1.1.5 root 3468: && (i = exact_log2 (nonzero_bits (temp, mode))) >= 0) 1.1 root 3469: { 3470: rtx temp1 = simplify_shift_const 1.1.1.4 root 3471: (NULL_RTX, ASHIFTRT, mode, 3472: simplify_shift_const (NULL_RTX, ASHIFT, mode, temp, 1.1 root 3473: GET_MODE_BITSIZE (mode) - 1 - i), 3474: GET_MODE_BITSIZE (mode) - 1 - i); 3475: 3476: /* If all we did was surround TEMP with the two shifts, we 3477: haven't improved anything, so don't use it. Otherwise, 3478: we are better off with TEMP1. */ 3479: if (GET_CODE (temp1) != ASHIFTRT 3480: || GET_CODE (XEXP (temp1, 0)) != ASHIFT 3481: || XEXP (XEXP (temp1, 0), 0) != temp) 1.1.1.7 root 3482: return temp1; 1.1 root 3483: } 3484: break; 3485: 1.1.1.8 ! root 3486: case TRUNCATE: ! 3487: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) ! 3488: SUBST (XEXP (x, 0), ! 3489: force_to_mode (XEXP (x, 0), GET_MODE (XEXP (x, 0)), ! 3490: GET_MODE_MASK (mode), NULL_RTX, 0)); ! 3491: break; ! 3492: 1.1 root 3493: case FLOAT_TRUNCATE: 3494: /* (float_truncate:SF (float_extend:DF foo:SF)) = foo:SF. */ 3495: if (GET_CODE (XEXP (x, 0)) == FLOAT_EXTEND 3496: && GET_MODE (XEXP (XEXP (x, 0), 0)) == mode) 3497: return XEXP (XEXP (x, 0), 0); 1.1.1.7 root 3498: 3499: /* (float_truncate:SF (OP:DF (float_extend:DF foo:sf))) is 3500: (OP:SF foo:SF) if OP is NEG or ABS. */ 3501: if ((GET_CODE (XEXP (x, 0)) == ABS 3502: || GET_CODE (XEXP (x, 0)) == NEG) 3503: && GET_CODE (XEXP (XEXP (x, 0), 0)) == FLOAT_EXTEND 3504: && GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == mode) 3505: return gen_unary (GET_CODE (XEXP (x, 0)), mode, mode, 3506: XEXP (XEXP (XEXP (x, 0), 0), 0)); 3507: 3508: /* (float_truncate:SF (subreg:DF (float_truncate:SF X) 0)) 3509: is (float_truncate:SF x). */ 3510: if (GET_CODE (XEXP (x, 0)) == SUBREG 3511: && subreg_lowpart_p (XEXP (x, 0)) 3512: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == FLOAT_TRUNCATE) 3513: return SUBREG_REG (XEXP (x, 0)); 1.1 root 3514: break; 3515: 3516: #ifdef HAVE_cc0 3517: case COMPARE: 3518: /* Convert (compare FOO (const_int 0)) to FOO unless we aren't 3519: using cc0, in which case we want to leave it as a COMPARE 3520: so we can distinguish it from a register-register-copy. */ 3521: if (XEXP (x, 1) == const0_rtx) 3522: return XEXP (x, 0); 3523: 3524: /* In IEEE floating point, x-0 is not the same as x. */ 3525: if ((TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT 1.1.1.7 root 3526: || ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0))) 3527: || flag_fast_math) 1.1 root 3528: && XEXP (x, 1) == CONST0_RTX (GET_MODE (XEXP (x, 0)))) 3529: return XEXP (x, 0); 3530: break; 3531: #endif 3532: 3533: case CONST: 3534: /* (const (const X)) can become (const X). Do it this way rather than 3535: returning the inner CONST since CONST can be shared with a 3536: REG_EQUAL note. */ 3537: if (GET_CODE (XEXP (x, 0)) == CONST) 3538: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); 3539: break; 3540: 3541: #ifdef HAVE_lo_sum 3542: case LO_SUM: 3543: /* Convert (lo_sum (high FOO) FOO) to FOO. This is necessary so we 3544: can add in an offset. find_split_point will split this address up 3545: again if it doesn't match. */ 3546: if (GET_CODE (XEXP (x, 0)) == HIGH 3547: && rtx_equal_p (XEXP (XEXP (x, 0), 0), XEXP (x, 1))) 3548: return XEXP (x, 1); 3549: break; 3550: #endif 3551: 3552: case PLUS: 3553: /* If we have (plus (plus (A const) B)), associate it so that CONST is 3554: outermost. That's because that's the way indexed addresses are 3555: supposed to appear. This code used to check many more cases, but 3556: they are now checked elsewhere. */ 3557: if (GET_CODE (XEXP (x, 0)) == PLUS 3558: && CONSTANT_ADDRESS_P (XEXP (XEXP (x, 0), 1))) 3559: return gen_binary (PLUS, mode, 3560: gen_binary (PLUS, mode, XEXP (XEXP (x, 0), 0), 3561: XEXP (x, 1)), 3562: XEXP (XEXP (x, 0), 1)); 3563: 3564: /* (plus (xor (and <foo> (const_int pow2 - 1)) <c>) <-c>) 3565: when c is (const_int (pow2 + 1) / 2) is a sign extension of a 3566: bit-field and can be replaced by either a sign_extend or a 3567: sign_extract. The `and' may be a zero_extend. */ 3568: if (GET_CODE (XEXP (x, 0)) == XOR 3569: && GET_CODE (XEXP (x, 1)) == CONST_INT 3570: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 3571: && INTVAL (XEXP (x, 1)) == - INTVAL (XEXP (XEXP (x, 0), 1)) 3572: && (i = exact_log2 (INTVAL (XEXP (XEXP (x, 0), 1)))) >= 0 1.1.1.4 root 3573: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 1.1 root 3574: && ((GET_CODE (XEXP (XEXP (x, 0), 0)) == AND 3575: && GET_CODE (XEXP (XEXP (XEXP (x, 0), 0), 1)) == CONST_INT 3576: && (INTVAL (XEXP (XEXP (XEXP (x, 0), 0), 1)) 1.1.1.4 root 3577: == ((HOST_WIDE_INT) 1 << (i + 1)) - 1)) 1.1 root 3578: || (GET_CODE (XEXP (XEXP (x, 0), 0)) == ZERO_EXTEND 3579: && (GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0))) 3580: == i + 1)))) 1.1.1.7 root 3581: return simplify_shift_const 3582: (NULL_RTX, ASHIFTRT, mode, 3583: simplify_shift_const (NULL_RTX, ASHIFT, mode, 3584: XEXP (XEXP (XEXP (x, 0), 0), 0), 3585: GET_MODE_BITSIZE (mode) - (i + 1)), 3586: GET_MODE_BITSIZE (mode) - (i + 1)); 1.1 root 3587: 1.1.1.6 root 3588: /* (plus (comparison A B) C) can become (neg (rev-comp A B)) if 3589: C is 1 and STORE_FLAG_VALUE is -1 or if C is -1 and STORE_FLAG_VALUE 3590: is 1. This produces better code than the alternative immediately 3591: below. */ 3592: if (GET_RTX_CLASS (GET_CODE (XEXP (x, 0))) == '<' 3593: && reversible_comparison_p (XEXP (x, 0)) 3594: && ((STORE_FLAG_VALUE == -1 && XEXP (x, 1) == const1_rtx) 3595: || (STORE_FLAG_VALUE == 1 && XEXP (x, 1) == constm1_rtx))) 1.1.1.7 root 3596: return 3597: gen_unary (NEG, mode, mode, 3598: gen_binary (reverse_condition (GET_CODE (XEXP (x, 0))), 3599: mode, XEXP (XEXP (x, 0), 0), 3600: XEXP (XEXP (x, 0), 1))); 1.1.1.6 root 3601: 3602: /* If only the low-order bit of X is possibly nonzero, (plus x -1) 1.1 root 3603: can become (ashiftrt (ashift (xor x 1) C) C) where C is 3604: the bitsize of the mode - 1. This allows simplification of 3605: "a = (b & 8) == 0;" */ 3606: if (XEXP (x, 1) == constm1_rtx 3607: && GET_CODE (XEXP (x, 0)) != REG 3608: && ! (GET_CODE (XEXP (x,0)) == SUBREG 3609: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == REG) 1.1.1.5 root 3610: && nonzero_bits (XEXP (x, 0), mode) == 1) 1.1.1.7 root 3611: return simplify_shift_const (NULL_RTX, ASHIFTRT, mode, 3612: simplify_shift_const (NULL_RTX, ASHIFT, mode, 3613: gen_rtx_combine (XOR, mode, 3614: XEXP (x, 0), const1_rtx), 3615: GET_MODE_BITSIZE (mode) - 1), 3616: GET_MODE_BITSIZE (mode) - 1); 1.1.1.4 root 3617: 3618: /* If we are adding two things that have no bits in common, convert 3619: the addition into an IOR. This will often be further simplified, 3620: for example in cases like ((a & 1) + (a & 2)), which can 3621: become a & 3. */ 3622: 3623: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 3624: && (nonzero_bits (XEXP (x, 0), mode) 3625: & nonzero_bits (XEXP (x, 1), mode)) == 0) 1.1.1.7 root 3626: return gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1)); 1.1 root 3627: break; 3628: 3629: case MINUS: 1.1.1.6 root 3630: #if STORE_FLAG_VALUE == 1 3631: /* (minus 1 (comparison foo bar)) can be done by reversing the comparison 3632: code if valid. */ 3633: if (XEXP (x, 0) == const1_rtx 3634: && GET_RTX_CLASS (GET_CODE (XEXP (x, 1))) == '<' 3635: && reversible_comparison_p (XEXP (x, 1))) 3636: return gen_binary (reverse_condition (GET_CODE (XEXP (x, 1))), 3637: mode, XEXP (XEXP (x, 1), 0), 3638: XEXP (XEXP (x, 1), 1)); 3639: #endif 3640: 1.1 root 3641: /* (minus <foo> (and <foo> (const_int -pow2))) becomes 3642: (and <foo> (const_int pow2-1)) */ 3643: if (GET_CODE (XEXP (x, 1)) == AND 3644: && GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT 3645: && exact_log2 (- INTVAL (XEXP (XEXP (x, 1), 1))) >= 0 3646: && rtx_equal_p (XEXP (XEXP (x, 1), 0), XEXP (x, 0))) 1.1.1.7 root 3647: return simplify_and_const_int (NULL_RTX, mode, XEXP (x, 0), 3648: - INTVAL (XEXP (XEXP (x, 1), 1)) - 1); 3649: 3650: /* Canonicalize (minus A (plus B C)) to (minus (minus A B) C) for 3651: integers. */ 3652: if (GET_CODE (XEXP (x, 1)) == PLUS && INTEGRAL_MODE_P (mode)) 3653: return gen_binary (MINUS, mode, 3654: gen_binary (MINUS, mode, XEXP (x, 0), 3655: XEXP (XEXP (x, 1), 0)), 3656: XEXP (XEXP (x, 1), 1)); 1.1 root 3657: break; 3658: 3659: case MULT: 3660: /* If we have (mult (plus A B) C), apply the distributive law and then 3661: the inverse distributive law to see if things simplify. This 3662: occurs mostly in addresses, often when unrolling loops. */ 3663: 3664: if (GET_CODE (XEXP (x, 0)) == PLUS) 3665: { 3666: x = apply_distributive_law 3667: (gen_binary (PLUS, mode, 3668: gen_binary (MULT, mode, 3669: XEXP (XEXP (x, 0), 0), XEXP (x, 1)), 3670: gen_binary (MULT, mode, 3671: XEXP (XEXP (x, 0), 1), XEXP (x, 1)))); 3672: 3673: if (GET_CODE (x) != MULT) 1.1.1.7 root 3674: return x; 1.1 root 3675: } 3676: break; 3677: 3678: case UDIV: 3679: /* If this is a divide by a power of two, treat it as a shift if 3680: its first operand is a shift. */ 3681: if (GET_CODE (XEXP (x, 1)) == CONST_INT 3682: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0 3683: && (GET_CODE (XEXP (x, 0)) == ASHIFT 3684: || GET_CODE (XEXP (x, 0)) == LSHIFTRT 3685: || GET_CODE (XEXP (x, 0)) == ASHIFTRT 3686: || GET_CODE (XEXP (x, 0)) == ROTATE 3687: || GET_CODE (XEXP (x, 0)) == ROTATERT)) 1.1.1.7 root 3688: return simplify_shift_const (NULL_RTX, LSHIFTRT, mode, XEXP (x, 0), i); 1.1 root 3689: break; 3690: 3691: case EQ: case NE: 3692: case GT: case GTU: case GE: case GEU: 3693: case LT: case LTU: case LE: case LEU: 3694: /* If the first operand is a condition code, we can't do anything 3695: with it. */ 3696: if (GET_CODE (XEXP (x, 0)) == COMPARE 3697: || (GET_MODE_CLASS (GET_MODE (XEXP (x, 0))) != MODE_CC 3698: #ifdef HAVE_cc0 3699: && XEXP (x, 0) != cc0_rtx 3700: #endif 3701: )) 3702: { 3703: rtx op0 = XEXP (x, 0); 3704: rtx op1 = XEXP (x, 1); 3705: enum rtx_code new_code; 3706: 3707: if (GET_CODE (op0) == COMPARE) 3708: op1 = XEXP (op0, 1), op0 = XEXP (op0, 0); 3709: 3710: /* Simplify our comparison, if possible. */ 3711: new_code = simplify_comparison (code, &op0, &op1); 3712: 3713: #if STORE_FLAG_VALUE == 1 3714: /* If STORE_FLAG_VALUE is 1, we can convert (ne x 0) to simply X 1.1.1.5 root 3715: if only the low-order bit is possibly nonzero in X (such as when 1.1.1.6 root 3716: X is a ZERO_EXTRACT of one bit). Similarly, we can convert EQ to 3717: (xor X 1) or (minus 1 X); we use the former. Finally, if X is 3718: known to be either 0 or -1, NE becomes a NEG and EQ becomes 3719: (plus X 1). 3720: 3721: Remove any ZERO_EXTRACT we made when thinking this was a 3722: comparison. It may now be simpler to use, e.g., an AND. If a 3723: ZERO_EXTRACT is indeed appropriate, it will be placed back by 3724: the call to make_compound_operation in the SET case. */ 3725: 1.1.1.3 root 3726: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT 1.1 root 3727: && op1 == const0_rtx 1.1.1.6 root 3728: && nonzero_bits (op0, mode) == 1) 1.1.1.5 root 3729: return gen_lowpart_for_combine (mode, 3730: expand_compound_operation (op0)); 1.1.1.6 root 3731: 3732: else if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT 3733: && op1 == const0_rtx 3734: && (num_sign_bit_copies (op0, mode) 3735: == GET_MODE_BITSIZE (mode))) 3736: { 3737: op0 = expand_compound_operation (op0); 1.1.1.7 root 3738: return gen_unary (NEG, mode, mode, 3739: gen_lowpart_for_combine (mode, op0)); 1.1.1.6 root 3740: } 3741: 1.1.1.3 root 3742: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT 1.1 root 3743: && op1 == const0_rtx 1.1.1.6 root 3744: && nonzero_bits (op0, mode) == 1) 1.1.1.5 root 3745: { 3746: op0 = expand_compound_operation (op0); 1.1.1.7 root 3747: return gen_binary (XOR, mode, 3748: gen_lowpart_for_combine (mode, op0), 3749: const1_rtx); 1.1.1.6 root 3750: } 1.1.1.5 root 3751: 1.1.1.6 root 3752: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT 3753: && op1 == const0_rtx 3754: && (num_sign_bit_copies (op0, mode) 3755: == GET_MODE_BITSIZE (mode))) 3756: { 3757: op0 = expand_compound_operation (op0); 1.1.1.7 root 3758: return plus_constant (gen_lowpart_for_combine (mode, op0), 1); 1.1.1.5 root 3759: } 1.1 root 3760: #endif 3761: 3762: #if STORE_FLAG_VALUE == -1 1.1.1.6 root 3763: /* If STORE_FLAG_VALUE is -1, we have cases similar to 3764: those above. */ 1.1.1.3 root 3765: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT 1.1 root 3766: && op1 == const0_rtx 1.1.1.6 root 3767: && (num_sign_bit_copies (op0, mode) 3768: == GET_MODE_BITSIZE (mode))) 3769: return gen_lowpart_for_combine (mode, 3770: expand_compound_operation (op0)); 3771: 3772: else if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT 3773: && op1 == const0_rtx 3774: && nonzero_bits (op0, mode) == 1) 3775: { 3776: op0 = expand_compound_operation (op0); 1.1.1.7 root 3777: return gen_unary (NEG, mode, mode, 3778: gen_lowpart_for_combine (mode, op0)); 1.1.1.6 root 3779: } 3780: 3781: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT 3782: && op1 == const0_rtx 3783: && (num_sign_bit_copies (op0, mode) 3784: == GET_MODE_BITSIZE (mode))) 1.1 root 3785: { 1.1.1.5 root 3786: op0 = expand_compound_operation (op0); 1.1.1.7 root 3787: return gen_unary (NOT, mode, mode, 3788: gen_lowpart_for_combine (mode, op0)); 1.1.1.6 root 3789: } 3790: 3791: /* If X is 0/1, (eq X 0) is X-1. */ 3792: else if (new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT 3793: && op1 == const0_rtx 3794: && nonzero_bits (op0, mode) == 1) 3795: { 3796: op0 = expand_compound_operation (op0); 1.1.1.7 root 3797: return plus_constant (gen_lowpart_for_combine (mode, op0), -1); 1.1 root 3798: } 3799: #endif 3800: 3801: /* If STORE_FLAG_VALUE says to just test the sign bit and X has just 1.1.1.5 root 3802: one bit that might be nonzero, we can convert (ne x 0) to 3803: (ashift x c) where C puts the bit in the sign bit. Remove any 3804: AND with STORE_FLAG_VALUE when we are done, since we are only 3805: going to test the sign bit. */ 1.1.1.3 root 3806: if (new_code == NE && GET_MODE_CLASS (mode) == MODE_INT 1.1.1.4 root 3807: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 3808: && (STORE_FLAG_VALUE 3809: == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)) 1.1 root 3810: && op1 == const0_rtx 3811: && mode == GET_MODE (op0) 1.1.1.6 root 3812: && (i = exact_log2 (nonzero_bits (op0, mode))) >= 0) 1.1 root 3813: { 1.1.1.5 root 3814: x = simplify_shift_const (NULL_RTX, ASHIFT, mode, 3815: expand_compound_operation (op0), 1.1 root 3816: GET_MODE_BITSIZE (mode) - 1 - i); 3817: if (GET_CODE (x) == AND && XEXP (x, 1) == const_true_rtx) 3818: return XEXP (x, 0); 3819: else 3820: return x; 3821: } 3822: 3823: /* If the code changed, return a whole new comparison. */ 3824: if (new_code != code) 3825: return gen_rtx_combine (new_code, mode, op0, op1); 3826: 3827: /* Otherwise, keep this operation, but maybe change its operands. 3828: This also converts (ne (compare FOO BAR) 0) to (ne FOO BAR). */ 3829: SUBST (XEXP (x, 0), op0); 3830: SUBST (XEXP (x, 1), op1); 3831: } 3832: break; 3833: 3834: case IF_THEN_ELSE: 1.1.1.7 root 3835: return simplify_if_then_else (x); 1.1.1.4 root 3836: 1.1.1.7 root 3837: case ZERO_EXTRACT: 3838: case SIGN_EXTRACT: 3839: case ZERO_EXTEND: 3840: case SIGN_EXTEND: 3841: /* If we are processing SET_DEST, we are done. */ 3842: if (in_dest) 3843: return x; 1.1.1.4 root 3844: 1.1.1.7 root 3845: return expand_compound_operation (x); 1.1.1.4 root 3846: 1.1.1.7 root 3847: case SET: 3848: return simplify_set (x); 1.1.1.4 root 3849: 1.1.1.7 root 3850: case AND: 3851: case IOR: 3852: case XOR: 3853: return simplify_logical (x, last); 1.1.1.4 root 3854: 1.1.1.7 root 3855: case ABS: 3856: /* (abs (neg <foo>)) -> (abs <foo>) */ 3857: if (GET_CODE (XEXP (x, 0)) == NEG) 3858: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); 1.1.1.4 root 3859: 1.1.1.7 root 3860: /* If operand is something known to be positive, ignore the ABS. */ 3861: if (GET_CODE (XEXP (x, 0)) == FFS || GET_CODE (XEXP (x, 0)) == ABS 3862: || ((GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) 3863: <= HOST_BITS_PER_WIDE_INT) 3864: && ((nonzero_bits (XEXP (x, 0), GET_MODE (XEXP (x, 0))) 3865: & ((HOST_WIDE_INT) 1 3866: << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1))) 3867: == 0))) 3868: return XEXP (x, 0); 1.1.1.4 root 3869: 3870: 1.1.1.7 root 3871: /* If operand is known to be only -1 or 0, convert ABS to NEG. */ 3872: if (num_sign_bit_copies (XEXP (x, 0), mode) == GET_MODE_BITSIZE (mode)) 3873: return gen_rtx_combine (NEG, mode, XEXP (x, 0)); 1.1.1.4 root 3874: 1.1.1.7 root 3875: break; 1.1.1.4 root 3876: 1.1.1.7 root 3877: case FFS: 3878: /* (ffs (*_extend <X>)) = (ffs <X>) */ 3879: if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND 3880: || GET_CODE (XEXP (x, 0)) == ZERO_EXTEND) 3881: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); 3882: break; 1.1.1.6 root 3883: 1.1.1.7 root 3884: case FLOAT: 3885: /* (float (sign_extend <X>)) = (float <X>). */ 3886: if (GET_CODE (XEXP (x, 0)) == SIGN_EXTEND) 3887: SUBST (XEXP (x, 0), XEXP (XEXP (x, 0), 0)); 1.1 root 3888: break; 3889: 1.1.1.7 root 3890: case ASHIFT: 3891: case LSHIFTRT: 3892: case ASHIFTRT: 3893: case ROTATE: 3894: case ROTATERT: 3895: /* If this is a shift by a constant amount, simplify it. */ 3896: if (GET_CODE (XEXP (x, 1)) == CONST_INT) 3897: return simplify_shift_const (x, code, mode, XEXP (x, 0), 3898: INTVAL (XEXP (x, 1))); 3899: 3900: #ifdef SHIFT_COUNT_TRUNCATED 3901: else if (SHIFT_COUNT_TRUNCATED && GET_CODE (XEXP (x, 1)) != REG) 3902: SUBST (XEXP (x, 1), 3903: force_to_mode (XEXP (x, 1), GET_MODE (x), 3904: ((HOST_WIDE_INT) 1 3905: << exact_log2 (GET_MODE_BITSIZE (GET_MODE (x)))) 3906: - 1, 3907: NULL_RTX, 0)); 3908: #endif 3909: 1.1 root 3910: break; 1.1.1.7 root 3911: } 1.1 root 3912: 1.1.1.7 root 3913: return x; 3914: } 3915: 3916: /* Simplify X, an IF_THEN_ELSE expression. Return the new expression. */ 3917: 3918: static rtx 3919: simplify_if_then_else (x) 3920: rtx x; 3921: { 3922: enum machine_mode mode = GET_MODE (x); 3923: rtx cond = XEXP (x, 0); 3924: rtx true = XEXP (x, 1); 3925: rtx false = XEXP (x, 2); 3926: enum rtx_code true_code = GET_CODE (cond); 3927: int comparison_p = GET_RTX_CLASS (true_code) == '<'; 3928: rtx temp; 3929: int i; 3930: 3931: /* Simplify storing of the truth value. */ 3932: if (comparison_p && true == const_true_rtx && false == const0_rtx) 3933: return gen_binary (true_code, mode, XEXP (cond, 0), XEXP (cond, 1)); 3934: 3935: /* Also when the truth value has to be reversed. */ 3936: if (comparison_p && reversible_comparison_p (cond) 3937: && true == const0_rtx && false == const_true_rtx) 3938: return gen_binary (reverse_condition (true_code), 3939: mode, XEXP (cond, 0), XEXP (cond, 1)); 3940: 3941: /* Sometimes we can simplify the arm of an IF_THEN_ELSE if a register used 3942: in it is being compared against certain values. Get the true and false 3943: comparisons and see if that says anything about the value of each arm. */ 3944: 3945: if (comparison_p && reversible_comparison_p (cond) 3946: && GET_CODE (XEXP (cond, 0)) == REG) 3947: { 3948: HOST_WIDE_INT nzb; 3949: rtx from = XEXP (cond, 0); 3950: enum rtx_code false_code = reverse_condition (true_code); 3951: rtx true_val = XEXP (cond, 1); 3952: rtx false_val = true_val; 3953: int swapped = 0; 3954: 3955: /* If FALSE_CODE is EQ, swap the codes and arms. */ 3956: 3957: if (false_code == EQ) 3958: { 3959: swapped = 1, true_code = EQ, false_code = NE; 3960: temp = true, true = false, false = temp; 3961: } 3962: 3963: /* If we are comparing against zero and the expression being tested has 3964: only a single bit that might be nonzero, that is its value when it is 3965: not equal to zero. Similarly if it is known to be -1 or 0. */ 3966: 3967: if (true_code == EQ && true_val == const0_rtx 3968: && exact_log2 (nzb = nonzero_bits (from, GET_MODE (from))) >= 0) 3969: false_code = EQ, false_val = GEN_INT (nzb); 3970: else if (true_code == EQ && true_val == const0_rtx 3971: && (num_sign_bit_copies (from, GET_MODE (from)) 3972: == GET_MODE_BITSIZE (GET_MODE (from)))) 3973: false_code = EQ, false_val = constm1_rtx; 3974: 3975: /* Now simplify an arm if we know the value of the register in the 3976: branch and it is used in the arm. Be careful due to the potential 3977: of locally-shared RTL. */ 3978: 3979: if (reg_mentioned_p (from, true)) 3980: true = subst (known_cond (copy_rtx (true), true_code, from, true_val), 3981: pc_rtx, pc_rtx, 0, 0); 3982: if (reg_mentioned_p (from, false)) 3983: false = subst (known_cond (copy_rtx (false), false_code, 3984: from, false_val), 3985: pc_rtx, pc_rtx, 0, 0); 3986: 3987: SUBST (XEXP (x, 1), swapped ? false : true); 3988: SUBST (XEXP (x, 2), swapped ? true : false); 3989: 3990: true = XEXP (x, 1), false = XEXP (x, 2), true_code = GET_CODE (cond); 3991: } 3992: 3993: /* If we have (if_then_else FOO (pc) (label_ref BAR)) and FOO can be 3994: reversed, do so to avoid needing two sets of patterns for 3995: subtract-and-branch insns. Similarly if we have a constant in the true 3996: arm, the false arm is the same as the first operand of the comparison, or 3997: the false arm is more complicated than the true arm. */ 3998: 3999: if (comparison_p && reversible_comparison_p (cond) 4000: && (true == pc_rtx 4001: || (CONSTANT_P (true) 4002: && GET_CODE (false) != CONST_INT && false != pc_rtx) 4003: || true == const0_rtx 4004: || (GET_RTX_CLASS (GET_CODE (true)) == 'o' 4005: && GET_RTX_CLASS (GET_CODE (false)) != 'o') 4006: || (GET_CODE (true) == SUBREG 4007: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (true))) == 'o' 4008: && GET_RTX_CLASS (GET_CODE (false)) != 'o') 4009: || reg_mentioned_p (true, false) 4010: || rtx_equal_p (false, XEXP (cond, 0)))) 4011: { 4012: true_code = reverse_condition (true_code); 4013: SUBST (XEXP (x, 0), 4014: gen_binary (true_code, GET_MODE (cond), XEXP (cond, 0), 4015: XEXP (cond, 1))); 4016: 4017: SUBST (XEXP (x, 1), false); 4018: SUBST (XEXP (x, 2), true); 4019: 4020: temp = true, true = false, false = temp, cond = XEXP (x, 0); 4021: } 4022: 4023: /* If the two arms are identical, we don't need the comparison. */ 4024: 4025: if (rtx_equal_p (true, false) && ! side_effects_p (cond)) 4026: return true; 4027: 4028: /* Look for cases where we have (abs x) or (neg (abs X)). */ 4029: 4030: if (GET_MODE_CLASS (mode) == MODE_INT 4031: && GET_CODE (false) == NEG 4032: && rtx_equal_p (true, XEXP (false, 0)) 4033: && comparison_p 4034: && rtx_equal_p (true, XEXP (cond, 0)) 4035: && ! side_effects_p (true)) 4036: switch (true_code) 4037: { 4038: case GT: 4039: case GE: 4040: return gen_unary (ABS, mode, mode, true); 4041: case LT: 4042: case LE: 4043: return gen_unary (NEG, mode, mode, gen_unary (ABS, mode, mode, true)); 4044: } 4045: 4046: /* Look for MIN or MAX. */ 4047: 1.1.1.8 ! root 4048: if ((! FLOAT_MODE_P (mode) || flag_fast_math) 1.1.1.7 root 4049: && comparison_p 4050: && rtx_equal_p (XEXP (cond, 0), true) 4051: && rtx_equal_p (XEXP (cond, 1), false) 4052: && ! side_effects_p (cond)) 4053: switch (true_code) 4054: { 4055: case GE: 4056: case GT: 4057: return gen_binary (SMAX, mode, true, false); 4058: case LE: 4059: case LT: 4060: return gen_binary (SMIN, mode, true, false); 4061: case GEU: 4062: case GTU: 4063: return gen_binary (UMAX, mode, true, false); 4064: case LEU: 4065: case LTU: 4066: return gen_binary (UMIN, mode, true, false); 4067: } 4068: 4069: #if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1 4070: 4071: /* If we have (if_then_else COND (OP Z C1) Z) and OP is an identity when its 4072: second operand is zero, this can be done as (OP Z (mult COND C2)) where 4073: C2 = C1 * STORE_FLAG_VALUE. Similarly if OP has an outer ZERO_EXTEND or 4074: SIGN_EXTEND as long as Z is already extended (so we don't destroy it). 4075: We can do this kind of thing in some cases when STORE_FLAG_VALUE is 4076: neither of the above, but it isn't worth checking for. */ 4077: 4078: if (comparison_p && mode != VOIDmode && ! side_effects_p (x)) 4079: { 4080: rtx t = make_compound_operation (true, SET); 4081: rtx f = make_compound_operation (false, SET); 4082: rtx cond_op0 = XEXP (cond, 0); 4083: rtx cond_op1 = XEXP (cond, 1); 4084: enum rtx_code op, extend_op = NIL; 4085: enum machine_mode m = mode; 4086: rtx z = 0, c1; 4087: 4088: if ((GET_CODE (t) == PLUS || GET_CODE (t) == MINUS 4089: || GET_CODE (t) == IOR || GET_CODE (t) == XOR 4090: || GET_CODE (t) == ASHIFT 4091: || GET_CODE (t) == LSHIFTRT || GET_CODE (t) == ASHIFTRT) 4092: && rtx_equal_p (XEXP (t, 0), f)) 4093: c1 = XEXP (t, 1), op = GET_CODE (t), z = f; 4094: 4095: /* If an identity-zero op is commutative, check whether there 4096: would be a match if we swapped the operands. */ 4097: else if ((GET_CODE (t) == PLUS || GET_CODE (t) == IOR 4098: || GET_CODE (t) == XOR) 4099: && rtx_equal_p (XEXP (t, 1), f)) 4100: c1 = XEXP (t, 0), op = GET_CODE (t), z = f; 4101: else if (GET_CODE (t) == SIGN_EXTEND 4102: && (GET_CODE (XEXP (t, 0)) == PLUS 4103: || GET_CODE (XEXP (t, 0)) == MINUS 4104: || GET_CODE (XEXP (t, 0)) == IOR 4105: || GET_CODE (XEXP (t, 0)) == XOR 4106: || GET_CODE (XEXP (t, 0)) == ASHIFT 4107: || GET_CODE (XEXP (t, 0)) == LSHIFTRT 4108: || GET_CODE (XEXP (t, 0)) == ASHIFTRT) 4109: && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG 4110: && subreg_lowpart_p (XEXP (XEXP (t, 0), 0)) 4111: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f) 4112: && (num_sign_bit_copies (f, GET_MODE (f)) 4113: > (GET_MODE_BITSIZE (mode) 4114: - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 0)))))) 4115: { 4116: c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0)); 4117: extend_op = SIGN_EXTEND; 4118: m = GET_MODE (XEXP (t, 0)); 4119: } 4120: else if (GET_CODE (t) == SIGN_EXTEND 4121: && (GET_CODE (XEXP (t, 0)) == PLUS 4122: || GET_CODE (XEXP (t, 0)) == IOR 4123: || GET_CODE (XEXP (t, 0)) == XOR) 4124: && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG 4125: && subreg_lowpart_p (XEXP (XEXP (t, 0), 1)) 4126: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f) 4127: && (num_sign_bit_copies (f, GET_MODE (f)) 4128: > (GET_MODE_BITSIZE (mode) 4129: - GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (t, 0), 1)))))) 4130: { 4131: c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0)); 4132: extend_op = SIGN_EXTEND; 4133: m = GET_MODE (XEXP (t, 0)); 4134: } 4135: else if (GET_CODE (t) == ZERO_EXTEND 4136: && (GET_CODE (XEXP (t, 0)) == PLUS 4137: || GET_CODE (XEXP (t, 0)) == MINUS 4138: || GET_CODE (XEXP (t, 0)) == IOR 4139: || GET_CODE (XEXP (t, 0)) == XOR 4140: || GET_CODE (XEXP (t, 0)) == ASHIFT 4141: || GET_CODE (XEXP (t, 0)) == LSHIFTRT 4142: || GET_CODE (XEXP (t, 0)) == ASHIFTRT) 4143: && GET_CODE (XEXP (XEXP (t, 0), 0)) == SUBREG 4144: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 4145: && subreg_lowpart_p (XEXP (XEXP (t, 0), 0)) 4146: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 0)), f) 4147: && ((nonzero_bits (f, GET_MODE (f)) 4148: & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 0)))) 4149: == 0)) 4150: { 4151: c1 = XEXP (XEXP (t, 0), 1); z = f; op = GET_CODE (XEXP (t, 0)); 4152: extend_op = ZERO_EXTEND; 4153: m = GET_MODE (XEXP (t, 0)); 4154: } 4155: else if (GET_CODE (t) == ZERO_EXTEND 4156: && (GET_CODE (XEXP (t, 0)) == PLUS 4157: || GET_CODE (XEXP (t, 0)) == IOR 4158: || GET_CODE (XEXP (t, 0)) == XOR) 4159: && GET_CODE (XEXP (XEXP (t, 0), 1)) == SUBREG 4160: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 4161: && subreg_lowpart_p (XEXP (XEXP (t, 0), 1)) 4162: && rtx_equal_p (SUBREG_REG (XEXP (XEXP (t, 0), 1)), f) 4163: && ((nonzero_bits (f, GET_MODE (f)) 4164: & ~ GET_MODE_MASK (GET_MODE (XEXP (XEXP (t, 0), 1)))) 4165: == 0)) 4166: { 4167: c1 = XEXP (XEXP (t, 0), 0); z = f; op = GET_CODE (XEXP (t, 0)); 4168: extend_op = ZERO_EXTEND; 4169: m = GET_MODE (XEXP (t, 0)); 4170: } 4171: 4172: if (z) 4173: { 4174: temp = subst (gen_binary (true_code, m, cond_op0, cond_op1), 4175: pc_rtx, pc_rtx, 0, 0); 4176: temp = gen_binary (MULT, m, temp, 4177: gen_binary (MULT, m, c1, const_true_rtx)); 4178: temp = subst (temp, pc_rtx, pc_rtx, 0, 0); 4179: temp = gen_binary (op, m, gen_lowpart_for_combine (m, z), temp); 4180: 4181: if (extend_op != NIL) 4182: temp = gen_unary (extend_op, mode, m, temp); 4183: 4184: return temp; 4185: } 4186: } 4187: #endif 4188: 4189: /* If we have (if_then_else (ne A 0) C1 0) and either A is known to be 0 or 4190: 1 and C1 is a single bit or A is known to be 0 or -1 and C1 is the 4191: negation of a single bit, we can convert this operation to a shift. We 4192: can actually do this more generally, but it doesn't seem worth it. */ 4193: 4194: if (true_code == NE && XEXP (cond, 1) == const0_rtx 4195: && false == const0_rtx && GET_CODE (true) == CONST_INT 4196: && ((1 == nonzero_bits (XEXP (cond, 0), mode) 4197: && (i = exact_log2 (INTVAL (true))) >= 0) 4198: || ((num_sign_bit_copies (XEXP (cond, 0), mode) 4199: == GET_MODE_BITSIZE (mode)) 4200: && (i = exact_log2 (- INTVAL (true))) >= 0))) 4201: return 4202: simplify_shift_const (NULL_RTX, ASHIFT, mode, 4203: gen_lowpart_for_combine (mode, XEXP (cond, 0)), i); 4204: 4205: return x; 4206: } 4207: 4208: /* Simplify X, a SET expression. Return the new expression. */ 4209: 4210: static rtx 4211: simplify_set (x) 4212: rtx x; 4213: { 4214: rtx src = SET_SRC (x); 4215: rtx dest = SET_DEST (x); 4216: enum machine_mode mode 4217: = GET_MODE (src) != VOIDmode ? GET_MODE (src) : GET_MODE (dest); 4218: rtx other_insn; 4219: rtx *cc_use; 4220: 4221: /* (set (pc) (return)) gets written as (return). */ 4222: if (GET_CODE (dest) == PC && GET_CODE (src) == RETURN) 4223: return src; 4224: 4225: /* Now that we know for sure which bits of SRC we are using, see if we can 4226: simplify the expression for the object knowing that we only need the 4227: low-order bits. */ 4228: 4229: if (GET_MODE_CLASS (mode) == MODE_INT) 4230: src = force_to_mode (src, mode, GET_MODE_MASK (mode), NULL_RTX, 0); 4231: 4232: /* If we are setting CC0 or if the source is a COMPARE, look for the use of 4233: the comparison result and try to simplify it unless we already have used 4234: undobuf.other_insn. */ 4235: if ((GET_CODE (src) == COMPARE 1.1 root 4236: #ifdef HAVE_cc0 1.1.1.7 root 4237: || dest == cc0_rtx 1.1 root 4238: #endif 1.1.1.7 root 4239: ) 4240: && (cc_use = find_single_use (dest, subst_insn, &other_insn)) != 0 4241: && (undobuf.other_insn == 0 || other_insn == undobuf.other_insn) 4242: && GET_RTX_CLASS (GET_CODE (*cc_use)) == '<' 4243: && rtx_equal_p (XEXP (*cc_use, 0), dest)) 4244: { 4245: enum rtx_code old_code = GET_CODE (*cc_use); 4246: enum rtx_code new_code; 4247: rtx op0, op1; 4248: int other_changed = 0; 4249: enum machine_mode compare_mode = GET_MODE (dest); 1.1 root 4250: 1.1.1.7 root 4251: if (GET_CODE (src) == COMPARE) 4252: op0 = XEXP (src, 0), op1 = XEXP (src, 1); 4253: else 4254: op0 = src, op1 = const0_rtx; 1.1 root 4255: 1.1.1.7 root 4256: /* Simplify our comparison, if possible. */ 4257: new_code = simplify_comparison (old_code, &op0, &op1); 1.1 root 4258: 1.1.1.5 root 4259: #ifdef EXTRA_CC_MODES 1.1.1.7 root 4260: /* If this machine has CC modes other than CCmode, check to see if we 4261: need to use a different CC mode here. */ 4262: compare_mode = SELECT_CC_MODE (new_code, op0, op1); 1.1.1.5 root 4263: #endif /* EXTRA_CC_MODES */ 1.1 root 4264: 1.1.1.5 root 4265: #if !defined (HAVE_cc0) && defined (EXTRA_CC_MODES) 1.1.1.7 root 4266: /* If the mode changed, we have to change SET_DEST, the mode in the 4267: compare, and the mode in the place SET_DEST is used. If SET_DEST is 4268: a hard register, just build new versions with the proper mode. If it 4269: is a pseudo, we lose unless it is only time we set the pseudo, in 4270: which case we can safely change its mode. */ 4271: if (compare_mode != GET_MODE (dest)) 4272: { 4273: int regno = REGNO (dest); 4274: rtx new_dest = gen_rtx (REG, compare_mode, regno); 1.1 root 4275: 1.1.1.7 root 4276: if (regno < FIRST_PSEUDO_REGISTER 4277: || (reg_n_sets[regno] == 1 && ! REG_USERVAR_P (dest))) 4278: { 4279: if (regno >= FIRST_PSEUDO_REGISTER) 4280: SUBST (regno_reg_rtx[regno], new_dest); 4281: 4282: SUBST (SET_DEST (x), new_dest); 4283: SUBST (XEXP (*cc_use, 0), new_dest); 4284: other_changed = 1; 4285: 4286: dest = new_dest; 1.1 root 4287: } 1.1.1.7 root 4288: } 1.1 root 4289: #endif 4290: 1.1.1.7 root 4291: /* If the code changed, we have to build a new comparison in 4292: undobuf.other_insn. */ 4293: if (new_code != old_code) 4294: { 4295: unsigned HOST_WIDE_INT mask; 1.1 root 4296: 1.1.1.7 root 4297: SUBST (*cc_use, gen_rtx_combine (new_code, GET_MODE (*cc_use), 4298: dest, const0_rtx)); 1.1 root 4299: 1.1.1.7 root 4300: /* If the only change we made was to change an EQ into an NE or 4301: vice versa, OP0 has only one bit that might be nonzero, and OP1 4302: is zero, check if changing the user of the condition code will 4303: produce a valid insn. If it won't, we can keep the original code 4304: in that insn by surrounding our operation with an XOR. */ 1.1 root 4305: 1.1.1.7 root 4306: if (((old_code == NE && new_code == EQ) 4307: || (old_code == EQ && new_code == NE)) 4308: && ! other_changed && op1 == const0_rtx 4309: && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT 4310: && exact_log2 (mask = nonzero_bits (op0, GET_MODE (op0))) >= 0) 4311: { 4312: rtx pat = PATTERN (other_insn), note = 0; 1.1.1.8 ! root 4313: int scratches; 1.1 root 4314: 1.1.1.8 ! root 4315: if ((recog_for_combine (&pat, other_insn, ¬e, &scratches) < 0 1.1.1.7 root 4316: && ! check_asm_operands (pat))) 4317: { 4318: PUT_CODE (*cc_use, old_code); 4319: other_insn = 0; 1.1 root 4320: 1.1.1.7 root 4321: op0 = gen_binary (XOR, GET_MODE (op0), op0, GEN_INT (mask)); 4322: } 1.1 root 4323: } 4324: 1.1.1.7 root 4325: other_changed = 1; 4326: } 4327: 4328: if (other_changed) 4329: undobuf.other_insn = other_insn; 1.1 root 4330: 4331: #ifdef HAVE_cc0 1.1.1.7 root 4332: /* If we are now comparing against zero, change our source if 4333: needed. If we do not use cc0, we always have a COMPARE. */ 4334: if (op1 == const0_rtx && dest == cc0_rtx) 4335: { 4336: SUBST (SET_SRC (x), op0); 4337: src = op0; 4338: } 4339: else 1.1 root 4340: #endif 4341: 1.1.1.7 root 4342: /* Otherwise, if we didn't previously have a COMPARE in the 4343: correct mode, we need one. */ 4344: if (GET_CODE (src) != COMPARE || GET_MODE (src) != compare_mode) 4345: { 4346: SUBST (SET_SRC (x), 4347: gen_rtx_combine (COMPARE, compare_mode, op0, op1)); 4348: src = SET_SRC (x); 1.1 root 4349: } 4350: else 4351: { 1.1.1.7 root 4352: /* Otherwise, update the COMPARE if needed. */ 4353: SUBST (XEXP (src, 0), op0); 4354: SUBST (XEXP (src, 1), op1); 4355: } 4356: } 4357: else 4358: { 4359: /* Get SET_SRC in a form where we have placed back any 4360: compound expressions. Then do the checks below. */ 4361: src = make_compound_operation (src, SET); 4362: SUBST (SET_SRC (x), src); 4363: } 4364: 4365: /* If we have (set x (subreg:m1 (op:m2 ...) 0)) with OP being some operation, 4366: and X being a REG or (subreg (reg)), we may be able to convert this to 4367: (set (subreg:m2 x) (op)). 4368: 4369: We can always do this if M1 is narrower than M2 because that means that 4370: we only care about the low bits of the result. 4371: 4372: However, on machines without WORD_REGISTER_OPERATIONS defined, we cannot 4373: perform a narrower operation that requested since the high-order bits will 4374: be undefined. On machine where it is defined, this transformation is safe 4375: as long as M1 and M2 have the same number of words. */ 1.1.1.4 root 4376: 1.1.1.7 root 4377: if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src) 4378: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (src))) != 'o' 4379: && (((GET_MODE_SIZE (GET_MODE (src)) + (UNITS_PER_WORD - 1)) 4380: / UNITS_PER_WORD) 4381: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))) 4382: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)) 1.1.1.6 root 4383: #ifndef WORD_REGISTER_OPERATIONS 1.1.1.7 root 4384: && (GET_MODE_SIZE (GET_MODE (src)) 4385: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))) 1.1.1.4 root 4386: #endif 1.1.1.8 ! root 4387: #ifdef CLASS_CANNOT_CHANGE_SIZE ! 4388: && ! (GET_CODE (dest) == REG && REGNO (dest) < FIRST_PSEUDO_REGISTER ! 4389: && (TEST_HARD_REG_BIT ! 4390: (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE], ! 4391: REGNO (dest))) ! 4392: && (GET_MODE_SIZE (GET_MODE (src)) ! 4393: != GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))) ! 4394: #endif 1.1.1.7 root 4395: && (GET_CODE (dest) == REG 4396: || (GET_CODE (dest) == SUBREG 4397: && GET_CODE (SUBREG_REG (dest)) == REG))) 4398: { 4399: SUBST (SET_DEST (x), 4400: gen_lowpart_for_combine (GET_MODE (SUBREG_REG (src)), 4401: dest)); 4402: SUBST (SET_SRC (x), SUBREG_REG (src)); 4403: 4404: src = SET_SRC (x), dest = SET_DEST (x); 4405: } 1.1.1.4 root 4406: 1.1.1.6 root 4407: #ifdef LOAD_EXTEND_OP 1.1.1.7 root 4408: /* If we have (set FOO (subreg:M (mem:N BAR) 0)) with M wider than N, this 4409: would require a paradoxical subreg. Replace the subreg with a 4410: zero_extend to avoid the reload that would otherwise be required. */ 4411: 4412: if (GET_CODE (src) == SUBREG && subreg_lowpart_p (src) 4413: && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))) != NIL 4414: && SUBREG_WORD (src) == 0 4415: && (GET_MODE_SIZE (GET_MODE (src)) 4416: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (src)))) 4417: && GET_CODE (SUBREG_REG (src)) == MEM) 4418: { 4419: SUBST (SET_SRC (x), 4420: gen_rtx_combine (LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (src))), 4421: GET_MODE (src), XEXP (src, 0))); 4422: 4423: src = SET_SRC (x); 4424: } 4425: #endif 4426: 4427: /* If we don't have a conditional move, SET_SRC is an IF_THEN_ELSE, and we 4428: are comparing an item known to be 0 or -1 against 0, use a logical 4429: operation instead. Check for one of the arms being an IOR of the other 4430: arm with some value. We compute three terms to be IOR'ed together. In 4431: practice, at most two will be nonzero. Then we do the IOR's. */ 4432: 4433: if (GET_CODE (dest) != PC 4434: && GET_CODE (src) == IF_THEN_ELSE 4435: && GET_MODE_CLASS (GET_MODE (src)) == MODE_INT 4436: && (GET_CODE (XEXP (src, 0)) == EQ || GET_CODE (XEXP (src, 0)) == NE) 4437: && XEXP (XEXP (src, 0), 1) == const0_rtx 4438: && GET_MODE (src) == GET_MODE (XEXP (XEXP (src, 0), 0)) 1.1.1.8 ! root 4439: #ifdef HAVE_conditional_move ! 4440: && ! can_conditionally_move_p (GET_MODE (src)) ! 4441: #endif 1.1.1.7 root 4442: && (num_sign_bit_copies (XEXP (XEXP (src, 0), 0), 4443: GET_MODE (XEXP (XEXP (src, 0), 0))) 4444: == GET_MODE_BITSIZE (GET_MODE (XEXP (XEXP (src, 0), 0)))) 4445: && ! side_effects_p (src)) 4446: { 4447: rtx true = (GET_CODE (XEXP (src, 0)) == NE 4448: ? XEXP (src, 1) : XEXP (src, 2)); 4449: rtx false = (GET_CODE (XEXP (src, 0)) == NE 4450: ? XEXP (src, 2) : XEXP (src, 1)); 4451: rtx term1 = const0_rtx, term2, term3; 4452: 4453: if (GET_CODE (true) == IOR && rtx_equal_p (XEXP (true, 0), false)) 4454: term1 = false, true = XEXP (true, 1), false = const0_rtx; 4455: else if (GET_CODE (true) == IOR 4456: && rtx_equal_p (XEXP (true, 1), false)) 4457: term1 = false, true = XEXP (true, 0), false = const0_rtx; 4458: else if (GET_CODE (false) == IOR 4459: && rtx_equal_p (XEXP (false, 0), true)) 4460: term1 = true, false = XEXP (false, 1), true = const0_rtx; 4461: else if (GET_CODE (false) == IOR 4462: && rtx_equal_p (XEXP (false, 1), true)) 4463: term1 = true, false = XEXP (false, 0), true = const0_rtx; 4464: 4465: term2 = gen_binary (AND, GET_MODE (src), XEXP (XEXP (src, 0), 0), true); 4466: term3 = gen_binary (AND, GET_MODE (src), 4467: gen_unary (NOT, GET_MODE (src), GET_MODE (src), 4468: XEXP (XEXP (src, 0), 0)), 4469: false); 4470: 4471: SUBST (SET_SRC (x), 4472: gen_binary (IOR, GET_MODE (src), 4473: gen_binary (IOR, GET_MODE (src), term1, term2), 4474: term3)); 4475: 4476: src = SET_SRC (x); 4477: } 4478: 4479: /* If either SRC or DEST is a CLOBBER of (const_int 0), make this 4480: whole thing fail. */ 4481: if (GET_CODE (src) == CLOBBER && XEXP (src, 0) == const0_rtx) 4482: return src; 4483: else if (GET_CODE (dest) == CLOBBER && XEXP (dest, 0) == const0_rtx) 4484: return dest; 4485: else 4486: /* Convert this into a field assignment operation, if possible. */ 4487: return make_field_assignment (x); 4488: } 4489: 4490: /* Simplify, X, and AND, IOR, or XOR operation, and return the simplified 4491: result. LAST is nonzero if this is the last retry. */ 1.1.1.4 root 4492: 1.1.1.7 root 4493: static rtx 4494: simplify_logical (x, last) 4495: rtx x; 4496: int last; 4497: { 4498: enum machine_mode mode = GET_MODE (x); 4499: rtx op0 = XEXP (x, 0); 4500: rtx op1 = XEXP (x, 1); 1.1 root 4501: 1.1.1.7 root 4502: switch (GET_CODE (x)) 4503: { 1.1 root 4504: case AND: 1.1.1.7 root 4505: /* Convert (A ^ B) & A to A & (~ B) since the latter is often a single 4506: insn (and may simplify more). */ 4507: if (GET_CODE (op0) == XOR 4508: && rtx_equal_p (XEXP (op0, 0), op1) 4509: && ! side_effects_p (op1)) 4510: x = gen_binary (AND, mode, 4511: gen_unary (NOT, mode, mode, XEXP (op0, 1)), op1); 4512: 4513: if (GET_CODE (op0) == XOR 4514: && rtx_equal_p (XEXP (op0, 1), op1) 4515: && ! side_effects_p (op1)) 4516: x = gen_binary (AND, mode, 4517: gen_unary (NOT, mode, mode, XEXP (op0, 0)), op1); 4518: 4519: /* Similarly for (~ (A ^ B)) & A. */ 4520: if (GET_CODE (op0) == NOT 4521: && GET_CODE (XEXP (op0, 0)) == XOR 4522: && rtx_equal_p (XEXP (XEXP (op0, 0), 0), op1) 4523: && ! side_effects_p (op1)) 4524: x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 1), op1); 4525: 4526: if (GET_CODE (op0) == NOT 4527: && GET_CODE (XEXP (op0, 0)) == XOR 4528: && rtx_equal_p (XEXP (XEXP (op0, 0), 1), op1) 4529: && ! side_effects_p (op1)) 4530: x = gen_binary (AND, mode, XEXP (XEXP (op0, 0), 0), op1); 4531: 4532: if (GET_CODE (op1) == CONST_INT) 1.1 root 4533: { 1.1.1.7 root 4534: x = simplify_and_const_int (x, mode, op0, INTVAL (op1)); 1.1 root 4535: 4536: /* If we have (ior (and (X C1) C2)) and the next restart would be 4537: the last, simplify this by making C1 as small as possible 4538: and then exit. */ 1.1.1.7 root 4539: if (last 4540: && GET_CODE (x) == IOR && GET_CODE (op0) == AND 4541: && GET_CODE (XEXP (op0, 1)) == CONST_INT 4542: && GET_CODE (op1) == CONST_INT) 4543: return gen_binary (IOR, mode, 4544: gen_binary (AND, mode, XEXP (op0, 0), 4545: GEN_INT (INTVAL (XEXP (op0, 1)) 4546: & ~ INTVAL (op1))), op1); 1.1 root 4547: 4548: if (GET_CODE (x) != AND) 1.1.1.7 root 4549: return x; 1.1.1.8 ! root 4550: ! 4551: if (GET_RTX_CLASS (GET_CODE (x)) == 'c' ! 4552: || GET_RTX_CLASS (GET_CODE (x)) == '2') ! 4553: op0 = XEXP (x, 0), op1 = XEXP (x, 1); 1.1 root 4554: } 4555: 4556: /* Convert (A | B) & A to A. */ 1.1.1.7 root 4557: if (GET_CODE (op0) == IOR 4558: && (rtx_equal_p (XEXP (op0, 0), op1) 4559: || rtx_equal_p (XEXP (op0, 1), op1)) 4560: && ! side_effects_p (XEXP (op0, 0)) 4561: && ! side_effects_p (XEXP (op0, 1))) 4562: return op1; 1.1.1.4 root 4563: 4564: /* In the following group of tests (and those in case IOR below), 1.1 root 4565: we start with some combination of logical operations and apply 4566: the distributive law followed by the inverse distributive law. 4567: Most of the time, this results in no change. However, if some of 4568: the operands are the same or inverses of each other, simplifications 4569: will result. 4570: 4571: For example, (and (ior A B) (not B)) can occur as the result of 4572: expanding a bit field assignment. When we apply the distributive 4573: law to this, we get (ior (and (A (not B))) (and (B (not B)))), 1.1.1.7 root 4574: which then simplifies to (and (A (not B))). 1.1 root 4575: 1.1.1.7 root 4576: If we have (and (ior A B) C), apply the distributive law and then 1.1 root 4577: the inverse distributive law to see if things simplify. */ 4578: 1.1.1.7 root 4579: if (GET_CODE (op0) == IOR || GET_CODE (op0) == XOR) 1.1 root 4580: { 4581: x = apply_distributive_law 1.1.1.7 root 4582: (gen_binary (GET_CODE (op0), mode, 4583: gen_binary (AND, mode, XEXP (op0, 0), op1), 4584: gen_binary (AND, mode, XEXP (op0, 1), op1))); 1.1 root 4585: if (GET_CODE (x) != AND) 1.1.1.7 root 4586: return x; 1.1 root 4587: } 4588: 1.1.1.7 root 4589: if (GET_CODE (op1) == IOR || GET_CODE (op1) == XOR) 4590: return apply_distributive_law 4591: (gen_binary (GET_CODE (op1), mode, 4592: gen_binary (AND, mode, XEXP (op1, 0), op0), 4593: gen_binary (AND, mode, XEXP (op1, 1), op0))); 1.1 root 4594: 4595: /* Similarly, taking advantage of the fact that 4596: (and (not A) (xor B C)) == (xor (ior A B) (ior A C)) */ 4597: 1.1.1.7 root 4598: if (GET_CODE (op0) == NOT && GET_CODE (op1) == XOR) 4599: return apply_distributive_law 4600: (gen_binary (XOR, mode, 4601: gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 0)), 4602: gen_binary (IOR, mode, XEXP (op0, 0), XEXP (op1, 1)))); 1.1 root 4603: 1.1.1.7 root 4604: else if (GET_CODE (op1) == NOT && GET_CODE (op0) == XOR) 4605: return apply_distributive_law 4606: (gen_binary (XOR, mode, 4607: gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 0)), 4608: gen_binary (IOR, mode, XEXP (op1, 0), XEXP (op0, 1)))); 1.1 root 4609: break; 4610: 4611: case IOR: 1.1.1.5 root 4612: /* (ior A C) is C if all bits of A that might be nonzero are on in C. */ 1.1.1.7 root 4613: if (GET_CODE (op1) == CONST_INT 1.1.1.4 root 4614: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 1.1.1.7 root 4615: && (nonzero_bits (op0, mode) & ~ INTVAL (op1)) == 0) 4616: return op1; 1.1.1.4 root 4617: 1.1 root 4618: /* Convert (A & B) | A to A. */ 1.1.1.7 root 4619: if (GET_CODE (op0) == AND 4620: && (rtx_equal_p (XEXP (op0, 0), op1) 4621: || rtx_equal_p (XEXP (op0, 1), op1)) 4622: && ! side_effects_p (XEXP (op0, 0)) 4623: && ! side_effects_p (XEXP (op0, 1))) 4624: return op1; 1.1 root 4625: 4626: /* If we have (ior (and A B) C), apply the distributive law and then 4627: the inverse distributive law to see if things simplify. */ 4628: 1.1.1.7 root 4629: if (GET_CODE (op0) == AND) 1.1 root 4630: { 4631: x = apply_distributive_law 4632: (gen_binary (AND, mode, 1.1.1.7 root 4633: gen_binary (IOR, mode, XEXP (op0, 0), op1), 4634: gen_binary (IOR, mode, XEXP (op0, 1), op1))); 1.1 root 4635: 4636: if (GET_CODE (x) != IOR) 1.1.1.7 root 4637: return x; 1.1 root 4638: } 4639: 1.1.1.7 root 4640: if (GET_CODE (op1) == AND) 1.1 root 4641: { 4642: x = apply_distributive_law 4643: (gen_binary (AND, mode, 1.1.1.7 root 4644: gen_binary (IOR, mode, XEXP (op1, 0), op0), 4645: gen_binary (IOR, mode, XEXP (op1, 1), op0))); 1.1 root 4646: 4647: if (GET_CODE (x) != IOR) 1.1.1.7 root 4648: return x; 1.1 root 4649: } 4650: 4651: /* Convert (ior (ashift A CX) (lshiftrt A CY)) where CX+CY equals the 4652: mode size to (rotate A CX). */ 4653: 1.1.1.7 root 4654: if (((GET_CODE (op0) == ASHIFT && GET_CODE (op1) == LSHIFTRT) 4655: || (GET_CODE (op1) == ASHIFT && GET_CODE (op0) == LSHIFTRT)) 4656: && rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0)) 4657: && GET_CODE (XEXP (op0, 1)) == CONST_INT 4658: && GET_CODE (XEXP (op1, 1)) == CONST_INT 4659: && (INTVAL (XEXP (op0, 1)) + INTVAL (XEXP (op1, 1)) 1.1 root 4660: == GET_MODE_BITSIZE (mode))) 1.1.1.7 root 4661: return gen_rtx (ROTATE, mode, XEXP (op0, 0), 4662: (GET_CODE (op0) == ASHIFT 4663: ? XEXP (op0, 1) : XEXP (op1, 1))); 4664: 4665: /* If OP0 is (ashiftrt (plus ...) C), it might actually be 4666: a (sign_extend (plus ...)). If so, OP1 is a CONST_INT, and the PLUS 4667: does not affect any of the bits in OP1, it can really be done 4668: as a PLUS and we can associate. We do this by seeing if OP1 4669: can be safely shifted left C bits. */ 4670: if (GET_CODE (op1) == CONST_INT && GET_CODE (op0) == ASHIFTRT 4671: && GET_CODE (XEXP (op0, 0)) == PLUS 4672: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT 4673: && GET_CODE (XEXP (op0, 1)) == CONST_INT 4674: && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT) 1.1 root 4675: { 1.1.1.7 root 4676: int count = INTVAL (XEXP (op0, 1)); 4677: HOST_WIDE_INT mask = INTVAL (op1) << count; 1.1 root 4678: 1.1.1.7 root 4679: if (mask >> count == INTVAL (op1) 4680: && (mask & nonzero_bits (XEXP (op0, 0), mode)) == 0) 4681: { 4682: SUBST (XEXP (XEXP (op0, 0), 1), 4683: GEN_INT (INTVAL (XEXP (XEXP (op0, 0), 1)) | mask)); 4684: return op0; 4685: } 1.1 root 4686: } 4687: break; 4688: 4689: case XOR: 4690: /* Convert (XOR (NOT x) (NOT y)) to (XOR x y). 4691: Also convert (XOR (NOT x) y) to (NOT (XOR x y)), similarly for 4692: (NOT y). */ 1.1.1.7 root 4693: { 4694: int num_negated = 0; 1.1 root 4695: 1.1.1.7 root 4696: if (GET_CODE (op0) == NOT) 4697: num_negated++, op0 = XEXP (op0, 0); 4698: if (GET_CODE (op1) == NOT) 4699: num_negated++, op1 = XEXP (op1, 0); 1.1 root 4700: 1.1.1.7 root 4701: if (num_negated == 2) 4702: { 4703: SUBST (XEXP (x, 0), op0); 4704: SUBST (XEXP (x, 1), op1); 4705: } 4706: else if (num_negated == 1) 4707: return gen_unary (NOT, mode, mode, gen_binary (XOR, mode, op0, op1)); 4708: } 1.1 root 4709: 1.1.1.7 root 4710: /* Convert (xor (and A B) B) to (and (not A) B). The latter may 4711: correspond to a machine insn or result in further simplifications 4712: if B is a constant. */ 1.1.1.3 root 4713: 1.1.1.7 root 4714: if (GET_CODE (op0) == AND 4715: && rtx_equal_p (XEXP (op0, 1), op1) 4716: && ! side_effects_p (op1)) 4717: return gen_binary (AND, mode, 4718: gen_unary (NOT, mode, mode, XEXP (op0, 0)), 4719: op1); 4720: 4721: else if (GET_CODE (op0) == AND 4722: && rtx_equal_p (XEXP (op0, 0), op1) 4723: && ! side_effects_p (op1)) 4724: return gen_binary (AND, mode, 4725: gen_unary (NOT, mode, mode, XEXP (op0, 1)), 4726: op1); 1.1 root 4727: 1.1.1.7 root 4728: #if STORE_FLAG_VALUE == 1 4729: /* (xor (comparison foo bar) (const_int 1)) can become the reversed 4730: comparison. */ 4731: if (op1 == const1_rtx 4732: && GET_RTX_CLASS (GET_CODE (op0)) == '<' 4733: && reversible_comparison_p (op0)) 4734: return gen_rtx_combine (reverse_condition (GET_CODE (op0)), 4735: mode, XEXP (op0, 0), XEXP (op0, 1)); 1.1.1.4 root 4736: 1.1.1.7 root 4737: /* (lshiftrt foo C) where C is the number of bits in FOO minus 1 4738: is (lt foo (const_int 0)), so we can perform the above 4739: simplification. */ 4740: 4741: if (op1 == const1_rtx 4742: && GET_CODE (op0) == LSHIFTRT 4743: && GET_CODE (XEXP (op0, 1)) == CONST_INT 4744: && INTVAL (XEXP (op0, 1)) == GET_MODE_BITSIZE (mode) - 1) 4745: return gen_rtx_combine (GE, mode, XEXP (op0, 0), const0_rtx); 1.1.1.4 root 4746: #endif 4747: 1.1.1.7 root 4748: /* (xor (comparison foo bar) (const_int sign-bit)) 4749: when STORE_FLAG_VALUE is the sign bit. */ 4750: if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 4751: && (STORE_FLAG_VALUE 4752: == (HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1)) 4753: && op1 == const_true_rtx 4754: && GET_RTX_CLASS (GET_CODE (op0)) == '<' 4755: && reversible_comparison_p (op0)) 4756: return gen_rtx_combine (reverse_condition (GET_CODE (op0)), 4757: mode, XEXP (op0, 0), XEXP (op0, 1)); 1.1 root 4758: break; 4759: } 4760: 4761: return x; 4762: } 4763: 4764: /* We consider ZERO_EXTRACT, SIGN_EXTRACT, and SIGN_EXTEND as "compound 4765: operations" because they can be replaced with two more basic operations. 4766: ZERO_EXTEND is also considered "compound" because it can be replaced with 4767: an AND operation, which is simpler, though only one operation. 4768: 4769: The function expand_compound_operation is called with an rtx expression 4770: and will convert it to the appropriate shifts and AND operations, 4771: simplifying at each stage. 4772: 4773: The function make_compound_operation is called to convert an expression 4774: consisting of shifts and ANDs into the equivalent compound expression. 4775: It is the inverse of this function, loosely speaking. */ 4776: 4777: static rtx 4778: expand_compound_operation (x) 4779: rtx x; 4780: { 4781: int pos = 0, len; 4782: int unsignedp = 0; 4783: int modewidth; 4784: rtx tem; 4785: 4786: switch (GET_CODE (x)) 4787: { 4788: case ZERO_EXTEND: 4789: unsignedp = 1; 4790: case SIGN_EXTEND: 1.1.1.3 root 4791: /* We can't necessarily use a const_int for a multiword mode; 4792: it depends on implicitly extending the value. 4793: Since we don't know the right way to extend it, 4794: we can't tell whether the implicit way is right. 4795: 4796: Even for a mode that is no wider than a const_int, 4797: we can't win, because we need to sign extend one of its bits through 4798: the rest of it, and we don't know which bit. */ 1.1 root 4799: if (GET_CODE (XEXP (x, 0)) == CONST_INT) 1.1.1.3 root 4800: return x; 1.1 root 4801: 1.1.1.7 root 4802: /* Return if (subreg:MODE FROM 0) is not a safe replacement for 4803: (zero_extend:MODE FROM) or (sign_extend:MODE FROM). It is for any MEM 4804: because (SUBREG (MEM...)) is guaranteed to cause the MEM to be 4805: reloaded. If not for that, MEM's would very rarely be safe. 4806: 4807: Reject MODEs bigger than a word, because we might not be able 4808: to reference a two-register group starting with an arbitrary register 4809: (and currently gen_lowpart might crash for a SUBREG). */ 4810: 4811: if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD) 1.1 root 4812: return x; 4813: 4814: len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))); 4815: /* If the inner object has VOIDmode (the only way this can happen 4816: is if it is a ASM_OPERANDS), we can't do anything since we don't 4817: know how much masking to do. */ 4818: if (len == 0) 4819: return x; 4820: 4821: break; 4822: 4823: case ZERO_EXTRACT: 4824: unsignedp = 1; 4825: case SIGN_EXTRACT: 4826: /* If the operand is a CLOBBER, just return it. */ 4827: if (GET_CODE (XEXP (x, 0)) == CLOBBER) 4828: return XEXP (x, 0); 4829: 4830: if (GET_CODE (XEXP (x, 1)) != CONST_INT 4831: || GET_CODE (XEXP (x, 2)) != CONST_INT 4832: || GET_MODE (XEXP (x, 0)) == VOIDmode) 4833: return x; 4834: 4835: len = INTVAL (XEXP (x, 1)); 4836: pos = INTVAL (XEXP (x, 2)); 4837: 4838: /* If this goes outside the object being extracted, replace the object 4839: with a (use (mem ...)) construct that only combine understands 4840: and is used only for this purpose. */ 4841: if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))) 4842: SUBST (XEXP (x, 0), gen_rtx (USE, GET_MODE (x), XEXP (x, 0))); 4843: 1.1.1.8 ! root 4844: if (BITS_BIG_ENDIAN) ! 4845: pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos; ! 4846: 1.1 root 4847: break; 4848: 4849: default: 4850: return x; 4851: } 4852: 4853: /* If we reach here, we want to return a pair of shifts. The inner 4854: shift is a left shift of BITSIZE - POS - LEN bits. The outer 4855: shift is a right shift of BITSIZE - LEN bits. It is arithmetic or 4856: logical depending on the value of UNSIGNEDP. 4857: 4858: If this was a ZERO_EXTEND or ZERO_EXTRACT, this pair of shifts will be 4859: converted into an AND of a shift. 4860: 4861: We must check for the case where the left shift would have a negative 4862: count. This can happen in a case like (x >> 31) & 255 on machines 4863: that can't shift by a constant. On those machines, we would first 4864: combine the shift with the AND to produce a variable-position 4865: extraction. Then the constant of 31 would be substituted in to produce 4866: a such a position. */ 4867: 4868: modewidth = GET_MODE_BITSIZE (GET_MODE (x)); 4869: if (modewidth >= pos - len) 1.1.1.4 root 4870: tem = simplify_shift_const (NULL_RTX, unsignedp ? LSHIFTRT : ASHIFTRT, 1.1 root 4871: GET_MODE (x), 1.1.1.4 root 4872: simplify_shift_const (NULL_RTX, ASHIFT, 4873: GET_MODE (x), 1.1 root 4874: XEXP (x, 0), 4875: modewidth - pos - len), 4876: modewidth - len); 4877: 1.1.1.4 root 4878: else if (unsignedp && len < HOST_BITS_PER_WIDE_INT) 4879: tem = simplify_and_const_int (NULL_RTX, GET_MODE (x), 4880: simplify_shift_const (NULL_RTX, LSHIFTRT, 1.1 root 4881: GET_MODE (x), 4882: XEXP (x, 0), pos), 1.1.1.4 root 4883: ((HOST_WIDE_INT) 1 << len) - 1); 1.1 root 4884: else 4885: /* Any other cases we can't handle. */ 4886: return x; 4887: 4888: 4889: /* If we couldn't do this for some reason, return the original 4890: expression. */ 4891: if (GET_CODE (tem) == CLOBBER) 4892: return x; 4893: 4894: return tem; 4895: } 4896: 4897: /* X is a SET which contains an assignment of one object into 4898: a part of another (such as a bit-field assignment, STRICT_LOW_PART, 4899: or certain SUBREGS). If possible, convert it into a series of 4900: logical operations. 4901: 4902: We half-heartedly support variable positions, but do not at all 4903: support variable lengths. */ 4904: 4905: static rtx 4906: expand_field_assignment (x) 4907: rtx x; 4908: { 4909: rtx inner; 4910: rtx pos; /* Always counts from low bit. */ 4911: int len; 4912: rtx mask; 4913: enum machine_mode compute_mode; 4914: 4915: /* Loop until we find something we can't simplify. */ 4916: while (1) 4917: { 4918: if (GET_CODE (SET_DEST (x)) == STRICT_LOW_PART 4919: && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG) 4920: { 4921: inner = SUBREG_REG (XEXP (SET_DEST (x), 0)); 4922: len = GET_MODE_BITSIZE (GET_MODE (XEXP (SET_DEST (x), 0))); 4923: pos = const0_rtx; 4924: } 4925: else if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT 4926: && GET_CODE (XEXP (SET_DEST (x), 1)) == CONST_INT) 4927: { 4928: inner = XEXP (SET_DEST (x), 0); 4929: len = INTVAL (XEXP (SET_DEST (x), 1)); 4930: pos = XEXP (SET_DEST (x), 2); 4931: 4932: /* If the position is constant and spans the width of INNER, 4933: surround INNER with a USE to indicate this. */ 4934: if (GET_CODE (pos) == CONST_INT 4935: && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner))) 4936: inner = gen_rtx (USE, GET_MODE (SET_DEST (x)), inner); 4937: 1.1.1.8 ! root 4938: if (BITS_BIG_ENDIAN) ! 4939: { ! 4940: if (GET_CODE (pos) == CONST_INT) ! 4941: pos = GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) - len ! 4942: - INTVAL (pos)); ! 4943: else if (GET_CODE (pos) == MINUS ! 4944: && GET_CODE (XEXP (pos, 1)) == CONST_INT ! 4945: && (INTVAL (XEXP (pos, 1)) ! 4946: == GET_MODE_BITSIZE (GET_MODE (inner)) - len)) ! 4947: /* If position is ADJUST - X, new position is X. */ ! 4948: pos = XEXP (pos, 0); ! 4949: else ! 4950: pos = gen_binary (MINUS, GET_MODE (pos), ! 4951: GEN_INT (GET_MODE_BITSIZE (GET_MODE (inner)) ! 4952: - len), ! 4953: pos); ! 4954: } 1.1 root 4955: } 4956: 4957: /* A SUBREG between two modes that occupy the same numbers of words 4958: can be done by moving the SUBREG to the source. */ 4959: else if (GET_CODE (SET_DEST (x)) == SUBREG 4960: && (((GET_MODE_SIZE (GET_MODE (SET_DEST (x))) 4961: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) 4962: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (SET_DEST (x)))) 4963: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD))) 4964: { 4965: x = gen_rtx (SET, VOIDmode, SUBREG_REG (SET_DEST (x)), 4966: gen_lowpart_for_combine (GET_MODE (SUBREG_REG (SET_DEST (x))), 4967: SET_SRC (x))); 4968: continue; 4969: } 4970: else 4971: break; 4972: 4973: while (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner)) 4974: inner = SUBREG_REG (inner); 4975: 4976: compute_mode = GET_MODE (inner); 4977: 4978: /* Compute a mask of LEN bits, if we can do this on the host machine. */ 1.1.1.4 root 4979: if (len < HOST_BITS_PER_WIDE_INT) 4980: mask = GEN_INT (((HOST_WIDE_INT) 1 << len) - 1); 1.1 root 4981: else 4982: break; 4983: 4984: /* Now compute the equivalent expression. Make a copy of INNER 4985: for the SET_DEST in case it is a MEM into which we will substitute; 4986: we don't want shared RTL in that case. */ 4987: x = gen_rtx (SET, VOIDmode, copy_rtx (inner), 4988: gen_binary (IOR, compute_mode, 4989: gen_binary (AND, compute_mode, 4990: gen_unary (NOT, compute_mode, 1.1.1.7 root 4991: compute_mode, 1.1 root 4992: gen_binary (ASHIFT, 4993: compute_mode, 4994: mask, pos)), 4995: inner), 4996: gen_binary (ASHIFT, compute_mode, 4997: gen_binary (AND, compute_mode, 4998: gen_lowpart_for_combine 4999: (compute_mode, 5000: SET_SRC (x)), 5001: mask), 5002: pos))); 5003: } 5004: 5005: return x; 5006: } 5007: 1.1.1.5 root 5008: /* Return an RTX for a reference to LEN bits of INNER. If POS_RTX is nonzero, 5009: it is an RTX that represents a variable starting position; otherwise, 5010: POS is the (constant) starting bit position (counted from the LSB). 1.1 root 5011: 5012: INNER may be a USE. This will occur when we started with a bitfield 5013: that went outside the boundary of the object in memory, which is 5014: allowed on most machines. To isolate this case, we produce a USE 5015: whose mode is wide enough and surround the MEM with it. The only 5016: code that understands the USE is this routine. If it is not removed, 5017: it will cause the resulting insn not to match. 5018: 5019: UNSIGNEDP is non-zero for an unsigned reference and zero for a 5020: signed reference. 5021: 5022: IN_DEST is non-zero if this is a reference in the destination of a 5023: SET. This is used when a ZERO_ or SIGN_EXTRACT isn't needed. If non-zero, 5024: a STRICT_LOW_PART will be used, if zero, ZERO_EXTEND or SIGN_EXTEND will 5025: be used. 5026: 5027: IN_COMPARE is non-zero if we are in a COMPARE. This means that a 5028: ZERO_EXTRACT should be built even for bits starting at bit 0. 5029: 5030: MODE is the desired mode of the result (if IN_DEST == 0). */ 5031: 5032: static rtx 5033: make_extraction (mode, inner, pos, pos_rtx, len, 5034: unsignedp, in_dest, in_compare) 5035: enum machine_mode mode; 5036: rtx inner; 5037: int pos; 5038: rtx pos_rtx; 5039: int len; 5040: int unsignedp; 5041: int in_dest, in_compare; 5042: { 1.1.1.4 root 5043: /* This mode describes the size of the storage area 5044: to fetch the overall value from. Within that, we 5045: ignore the POS lowest bits, etc. */ 1.1 root 5046: enum machine_mode is_mode = GET_MODE (inner); 5047: enum machine_mode inner_mode; 5048: enum machine_mode wanted_mem_mode = byte_mode; 5049: enum machine_mode pos_mode = word_mode; 5050: enum machine_mode extraction_mode = word_mode; 5051: enum machine_mode tmode = mode_for_size (len, MODE_INT, 1); 5052: int spans_byte = 0; 5053: rtx new = 0; 1.1.1.5 root 5054: rtx orig_pos_rtx = pos_rtx; 1.1.1.6 root 5055: int orig_pos; 1.1 root 5056: 5057: /* Get some information about INNER and get the innermost object. */ 5058: if (GET_CODE (inner) == USE) 1.1.1.4 root 5059: /* (use:SI (mem:QI foo)) stands for (mem:SI foo). */ 1.1 root 5060: /* We don't need to adjust the position because we set up the USE 5061: to pretend that it was a full-word object. */ 5062: spans_byte = 1, inner = XEXP (inner, 0); 5063: else if (GET_CODE (inner) == SUBREG && subreg_lowpart_p (inner)) 1.1.1.4 root 5064: { 5065: /* If going from (subreg:SI (mem:QI ...)) to (mem:QI ...), 5066: consider just the QI as the memory to extract from. 5067: The subreg adds or removes high bits; its mode is 5068: irrelevant to the meaning of this extraction, 5069: since POS and LEN count from the lsb. */ 5070: if (GET_CODE (SUBREG_REG (inner)) == MEM) 5071: is_mode = GET_MODE (SUBREG_REG (inner)); 5072: inner = SUBREG_REG (inner); 5073: } 1.1 root 5074: 5075: inner_mode = GET_MODE (inner); 5076: 5077: if (pos_rtx && GET_CODE (pos_rtx) == CONST_INT) 1.1.1.5 root 5078: pos = INTVAL (pos_rtx), pos_rtx = 0; 1.1 root 5079: 5080: /* See if this can be done without an extraction. We never can if the 5081: width of the field is not the same as that of some integer mode. For 5082: registers, we can only avoid the extraction if the position is at the 5083: low-order bit and this is either not in the destination or we have the 5084: appropriate STRICT_LOW_PART operation available. 5085: 5086: For MEM, we can avoid an extract if the field starts on an appropriate 5087: boundary and we can change the mode of the memory reference. However, 5088: we cannot directly access the MEM if we have a USE and the underlying 5089: MEM is not TMODE. This combination means that MEM was being used in a 5090: context where bits outside its mode were being referenced; that is only 5091: valid in bit-field insns. */ 5092: 5093: if (tmode != BLKmode 5094: && ! (spans_byte && inner_mode != tmode) 1.1.1.5 root 5095: && ((pos_rtx == 0 && pos == 0 && GET_CODE (inner) != MEM 1.1 root 5096: && (! in_dest 1.1.1.4 root 5097: || (GET_CODE (inner) == REG 5098: && (movstrict_optab->handlers[(int) tmode].insn_code 5099: != CODE_FOR_nothing)))) 1.1.1.5 root 5100: || (GET_CODE (inner) == MEM && pos_rtx == 0 1.1.1.2 root 5101: && (pos 5102: % (STRICT_ALIGNMENT ? GET_MODE_ALIGNMENT (tmode) 5103: : BITS_PER_UNIT)) == 0 1.1 root 5104: /* We can't do this if we are widening INNER_MODE (it 5105: may not be aligned, for one thing). */ 5106: && GET_MODE_BITSIZE (inner_mode) >= GET_MODE_BITSIZE (tmode) 5107: && (inner_mode == tmode 5108: || (! mode_dependent_address_p (XEXP (inner, 0)) 5109: && ! MEM_VOLATILE_P (inner)))))) 5110: { 5111: /* If INNER is a MEM, make a new MEM that encompasses just the desired 5112: field. If the original and current mode are the same, we need not 5113: adjust the offset. Otherwise, we do if bytes big endian. 5114: 5115: If INNER is not a MEM, get a piece consisting of the just the field 1.1.1.4 root 5116: of interest (in this case POS must be 0). */ 1.1 root 5117: 5118: if (GET_CODE (inner) == MEM) 5119: { 1.1.1.4 root 5120: int offset; 5121: /* POS counts from lsb, but make OFFSET count in memory order. */ 5122: if (BYTES_BIG_ENDIAN) 5123: offset = (GET_MODE_BITSIZE (is_mode) - len - pos) / BITS_PER_UNIT; 5124: else 5125: offset = pos / BITS_PER_UNIT; 1.1 root 5126: 5127: new = gen_rtx (MEM, tmode, plus_constant (XEXP (inner, 0), offset)); 5128: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (inner); 5129: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (inner); 5130: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (inner); 5131: } 1.1.1.4 root 5132: else if (GET_CODE (inner) == REG) 1.1.1.7 root 5133: { 5134: /* We can't call gen_lowpart_for_combine here since we always want 5135: a SUBREG and it would sometimes return a new hard register. */ 5136: if (tmode != inner_mode) 5137: new = gen_rtx (SUBREG, tmode, inner, 5138: (WORDS_BIG_ENDIAN 5139: && GET_MODE_SIZE (inner_mode) > UNITS_PER_WORD 5140: ? ((GET_MODE_SIZE (inner_mode) 5141: - GET_MODE_SIZE (tmode)) 5142: / UNITS_PER_WORD) 5143: : 0)); 5144: else 5145: new = inner; 5146: } 1.1 root 5147: else 1.1.1.6 root 5148: new = force_to_mode (inner, tmode, 5149: len >= HOST_BITS_PER_WIDE_INT 5150: ? GET_MODE_MASK (tmode) 5151: : ((HOST_WIDE_INT) 1 << len) - 1, 5152: NULL_RTX, 0); 1.1 root 5153: 5154: /* If this extraction is going into the destination of a SET, 5155: make a STRICT_LOW_PART unless we made a MEM. */ 5156: 5157: if (in_dest) 5158: return (GET_CODE (new) == MEM ? new 1.1.1.4 root 5159: : (GET_CODE (new) != SUBREG 5160: ? gen_rtx (CLOBBER, tmode, const0_rtx) 5161: : gen_rtx_combine (STRICT_LOW_PART, VOIDmode, new))); 1.1 root 5162: 5163: /* Otherwise, sign- or zero-extend unless we already are in the 5164: proper mode. */ 5165: 5166: return (mode == tmode ? new 5167: : gen_rtx_combine (unsignedp ? ZERO_EXTEND : SIGN_EXTEND, 5168: mode, new)); 5169: } 5170: 1.1.1.4 root 5171: /* Unless this is a COMPARE or we have a funny memory reference, 5172: don't do anything with zero-extending field extracts starting at 5173: the low-order bit since they are simple AND operations. */ 1.1.1.5 root 5174: if (pos_rtx == 0 && pos == 0 && ! in_dest 5175: && ! in_compare && ! spans_byte && unsignedp) 1.1 root 5176: return 0; 5177: 1.1.1.7 root 5178: /* Unless we are allowed to span bytes, reject this if we would be 5179: spanning bytes or if the position is not a constant and the length 5180: is not 1. In all other cases, we would only be going outside 5181: out object in cases when an original shift would have been 5182: undefined. */ 5183: if (! spans_byte 5184: && ((pos_rtx == 0 && pos + len > GET_MODE_BITSIZE (is_mode)) 5185: || (pos_rtx != 0 && len != 1))) 5186: return 0; 5187: 1.1 root 5188: /* Get the mode to use should INNER be a MEM, the mode for the position, 5189: and the mode for the result. */ 5190: #ifdef HAVE_insv 5191: if (in_dest) 5192: { 5193: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_insv][0]; 5194: pos_mode = insn_operand_mode[(int) CODE_FOR_insv][2]; 5195: extraction_mode = insn_operand_mode[(int) CODE_FOR_insv][3]; 5196: } 5197: #endif 5198: 5199: #ifdef HAVE_extzv 5200: if (! in_dest && unsignedp) 5201: { 5202: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extzv][1]; 5203: pos_mode = insn_operand_mode[(int) CODE_FOR_extzv][3]; 5204: extraction_mode = insn_operand_mode[(int) CODE_FOR_extzv][0]; 5205: } 5206: #endif 5207: 5208: #ifdef HAVE_extv 5209: if (! in_dest && ! unsignedp) 5210: { 5211: wanted_mem_mode = insn_operand_mode[(int) CODE_FOR_extv][1]; 5212: pos_mode = insn_operand_mode[(int) CODE_FOR_extv][3]; 5213: extraction_mode = insn_operand_mode[(int) CODE_FOR_extv][0]; 5214: } 5215: #endif 5216: 5217: /* Never narrow an object, since that might not be safe. */ 5218: 5219: if (mode != VOIDmode 5220: && GET_MODE_SIZE (extraction_mode) < GET_MODE_SIZE (mode)) 5221: extraction_mode = mode; 5222: 5223: if (pos_rtx && GET_MODE (pos_rtx) != VOIDmode 5224: && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx))) 5225: pos_mode = GET_MODE (pos_rtx); 5226: 5227: /* If this is not from memory or we have to change the mode of memory and 5228: cannot, the desired mode is EXTRACTION_MODE. */ 5229: if (GET_CODE (inner) != MEM 5230: || (inner_mode != wanted_mem_mode 5231: && (mode_dependent_address_p (XEXP (inner, 0)) 5232: || MEM_VOLATILE_P (inner)))) 5233: wanted_mem_mode = extraction_mode; 5234: 1.1.1.6 root 5235: orig_pos = pos; 5236: 1.1.1.8 ! root 5237: if (BITS_BIG_ENDIAN) ! 5238: { ! 5239: /* If position is constant, compute new position. Otherwise, ! 5240: build subtraction. */ ! 5241: if (pos_rtx == 0) ! 5242: pos = (MAX (GET_MODE_BITSIZE (is_mode), ! 5243: GET_MODE_BITSIZE (wanted_mem_mode)) ! 5244: - len - pos); ! 5245: else ! 5246: pos_rtx ! 5247: = gen_rtx_combine (MINUS, GET_MODE (pos_rtx), ! 5248: GEN_INT (MAX (GET_MODE_BITSIZE (is_mode), ! 5249: GET_MODE_BITSIZE (wanted_mem_mode)) ! 5250: - len), ! 5251: pos_rtx); ! 5252: } 1.1 root 5253: 5254: /* If INNER has a wider mode, make it smaller. If this is a constant 5255: extract, try to adjust the byte to point to the byte containing 5256: the value. */ 5257: if (wanted_mem_mode != VOIDmode 5258: && GET_MODE_SIZE (wanted_mem_mode) < GET_MODE_SIZE (is_mode) 5259: && ((GET_CODE (inner) == MEM 5260: && (inner_mode == wanted_mem_mode 5261: || (! mode_dependent_address_p (XEXP (inner, 0)) 5262: && ! MEM_VOLATILE_P (inner)))))) 5263: { 5264: int offset = 0; 5265: 5266: /* The computations below will be correct if the machine is big 5267: endian in both bits and bytes or little endian in bits and bytes. 5268: If it is mixed, we must adjust. */ 5269: 5270: /* If bytes are big endian and we had a paradoxical SUBREG, we must 5271: adjust OFFSET to compensate. */ 1.1.1.8 ! root 5272: if (BYTES_BIG_ENDIAN ! 5273: && ! spans_byte 1.1 root 5274: && GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (is_mode)) 5275: offset -= GET_MODE_SIZE (is_mode) - GET_MODE_SIZE (inner_mode); 5276: 5277: /* If this is a constant position, we can move to the desired byte. */ 1.1.1.5 root 5278: if (pos_rtx == 0) 1.1 root 5279: { 5280: offset += pos / BITS_PER_UNIT; 5281: pos %= GET_MODE_BITSIZE (wanted_mem_mode); 5282: } 5283: 1.1.1.8 ! root 5284: if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN ! 5285: && ! spans_byte ! 5286: && is_mode != wanted_mem_mode) 1.1.1.5 root 5287: offset = (GET_MODE_SIZE (is_mode) 5288: - GET_MODE_SIZE (wanted_mem_mode) - offset); 5289: 1.1 root 5290: if (offset != 0 || inner_mode != wanted_mem_mode) 5291: { 5292: rtx newmem = gen_rtx (MEM, wanted_mem_mode, 5293: plus_constant (XEXP (inner, 0), offset)); 5294: RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (inner); 5295: MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (inner); 5296: MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (inner); 5297: inner = newmem; 5298: } 5299: } 5300: 5301: /* If INNER is not memory, we can always get it into the proper mode. */ 5302: else if (GET_CODE (inner) != MEM) 1.1.1.4 root 5303: inner = force_to_mode (inner, extraction_mode, 1.1.1.6 root 5304: pos_rtx || len + orig_pos >= HOST_BITS_PER_WIDE_INT 5305: ? GET_MODE_MASK (extraction_mode) 5306: : (((HOST_WIDE_INT) 1 << len) - 1) << orig_pos, 5307: NULL_RTX, 0); 1.1 root 5308: 5309: /* Adjust mode of POS_RTX, if needed. If we want a wider mode, we 5310: have to zero extend. Otherwise, we can just use a SUBREG. */ 1.1.1.5 root 5311: if (pos_rtx != 0 1.1 root 5312: && GET_MODE_SIZE (pos_mode) > GET_MODE_SIZE (GET_MODE (pos_rtx))) 5313: pos_rtx = gen_rtx_combine (ZERO_EXTEND, pos_mode, pos_rtx); 1.1.1.5 root 5314: else if (pos_rtx != 0 1.1 root 5315: && GET_MODE_SIZE (pos_mode) < GET_MODE_SIZE (GET_MODE (pos_rtx))) 5316: pos_rtx = gen_lowpart_for_combine (pos_mode, pos_rtx); 5317: 1.1.1.5 root 5318: /* Make POS_RTX unless we already have it and it is correct. If we don't 5319: have a POS_RTX but we do have an ORIG_POS_RTX, the latter must 5320: be a CONST_INT. */ 5321: if (pos_rtx == 0 && orig_pos_rtx != 0 && INTVAL (orig_pos_rtx) == pos) 5322: pos_rtx = orig_pos_rtx; 5323: 5324: else if (pos_rtx == 0) 1.1.1.4 root 5325: pos_rtx = GEN_INT (pos); 1.1 root 5326: 5327: /* Make the required operation. See if we can use existing rtx. */ 5328: new = gen_rtx_combine (unsignedp ? ZERO_EXTRACT : SIGN_EXTRACT, 1.1.1.4 root 5329: extraction_mode, inner, GEN_INT (len), pos_rtx); 1.1 root 5330: if (! in_dest) 5331: new = gen_lowpart_for_combine (mode, new); 5332: 5333: return new; 5334: } 5335: 1.1.1.7 root 5336: /* See if X contains an ASHIFT of COUNT or more bits that can be commuted 5337: with any other operations in X. Return X without that shift if so. */ 5338: 5339: static rtx 5340: extract_left_shift (x, count) 5341: rtx x; 5342: int count; 5343: { 5344: enum rtx_code code = GET_CODE (x); 5345: enum machine_mode mode = GET_MODE (x); 5346: rtx tem; 5347: 5348: switch (code) 5349: { 5350: case ASHIFT: 5351: /* This is the shift itself. If it is wide enough, we will return 5352: either the value being shifted if the shift count is equal to 5353: COUNT or a shift for the difference. */ 5354: if (GET_CODE (XEXP (x, 1)) == CONST_INT 5355: && INTVAL (XEXP (x, 1)) >= count) 5356: return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (x, 0), 5357: INTVAL (XEXP (x, 1)) - count); 5358: break; 5359: 5360: case NEG: case NOT: 5361: if ((tem = extract_left_shift (XEXP (x, 0), count)) != 0) 5362: return gen_unary (code, mode, mode, tem); 5363: 5364: break; 5365: 5366: case PLUS: case IOR: case XOR: case AND: 5367: /* If we can safely shift this constant and we find the inner shift, 5368: make a new operation. */ 5369: if (GET_CODE (XEXP (x,1)) == CONST_INT 5370: && (INTVAL (XEXP (x, 1)) & (((HOST_WIDE_INT) 1 << count)) - 1) == 0 5371: && (tem = extract_left_shift (XEXP (x, 0), count)) != 0) 5372: return gen_binary (code, mode, tem, 5373: GEN_INT (INTVAL (XEXP (x, 1)) >> count)); 5374: 5375: break; 5376: } 5377: 5378: return 0; 5379: } 5380: 1.1 root 5381: /* Look at the expression rooted at X. Look for expressions 5382: equivalent to ZERO_EXTRACT, SIGN_EXTRACT, ZERO_EXTEND, SIGN_EXTEND. 5383: Form these expressions. 5384: 5385: Return the new rtx, usually just X. 5386: 5387: Also, for machines like the Vax that don't have logical shift insns, 5388: try to convert logical to arithmetic shift operations in cases where 5389: they are equivalent. This undoes the canonicalizations to logical 5390: shifts done elsewhere. 5391: 5392: We try, as much as possible, to re-use rtl expressions to save memory. 5393: 5394: IN_CODE says what kind of expression we are processing. Normally, it is 1.1.1.4 root 5395: SET. In a memory address (inside a MEM, PLUS or minus, the latter two 5396: being kludges), it is MEM. When processing the arguments of a comparison 1.1 root 5397: or a COMPARE against zero, it is COMPARE. */ 5398: 5399: static rtx 5400: make_compound_operation (x, in_code) 5401: rtx x; 5402: enum rtx_code in_code; 5403: { 5404: enum rtx_code code = GET_CODE (x); 5405: enum machine_mode mode = GET_MODE (x); 5406: int mode_width = GET_MODE_BITSIZE (mode); 1.1.1.7 root 5407: rtx rhs, lhs; 1.1 root 5408: enum rtx_code next_code; 1.1.1.7 root 5409: int i; 1.1 root 5410: rtx new = 0; 1.1.1.5 root 5411: rtx tem; 1.1 root 5412: char *fmt; 5413: 5414: /* Select the code to be used in recursive calls. Once we are inside an 5415: address, we stay there. If we have a comparison, set to COMPARE, 5416: but once inside, go back to our default of SET. */ 5417: 1.1.1.4 root 5418: next_code = (code == MEM || code == PLUS || code == MINUS ? MEM 1.1 root 5419: : ((code == COMPARE || GET_RTX_CLASS (code) == '<') 5420: && XEXP (x, 1) == const0_rtx) ? COMPARE 5421: : in_code == COMPARE ? SET : in_code); 5422: 5423: /* Process depending on the code of this operation. If NEW is set 5424: non-zero, it will be returned. */ 5425: 5426: switch (code) 5427: { 5428: case ASHIFT: 5429: /* Convert shifts by constants into multiplications if inside 5430: an address. */ 5431: if (in_code == MEM && GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.4 root 5432: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT 1.1 root 5433: && INTVAL (XEXP (x, 1)) >= 0) 1.1.1.5 root 5434: { 5435: new = make_compound_operation (XEXP (x, 0), next_code); 5436: new = gen_rtx_combine (MULT, mode, new, 5437: GEN_INT ((HOST_WIDE_INT) 1 5438: << INTVAL (XEXP (x, 1)))); 5439: } 1.1 root 5440: break; 5441: 5442: case AND: 5443: /* If the second operand is not a constant, we can't do anything 5444: with it. */ 5445: if (GET_CODE (XEXP (x, 1)) != CONST_INT) 5446: break; 5447: 5448: /* If the constant is a power of two minus one and the first operand 5449: is a logical right shift, make an extraction. */ 5450: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT 5451: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) 1.1.1.5 root 5452: { 5453: new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code); 5454: new = make_extraction (mode, new, 0, XEXP (XEXP (x, 0), 1), i, 1, 5455: 0, in_code == COMPARE); 5456: } 1.1.1.2 root 5457: 1.1 root 5458: /* Same as previous, but for (subreg (lshiftrt ...)) in first op. */ 5459: else if (GET_CODE (XEXP (x, 0)) == SUBREG 5460: && subreg_lowpart_p (XEXP (x, 0)) 5461: && GET_CODE (SUBREG_REG (XEXP (x, 0))) == LSHIFTRT 5462: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) 1.1.1.5 root 5463: { 5464: new = make_compound_operation (XEXP (SUBREG_REG (XEXP (x, 0)), 0), 5465: next_code); 1.1.1.8 ! root 5466: new = make_extraction (GET_MODE (SUBREG_REG (XEXP (x, 0))), new, 0, 1.1.1.5 root 5467: XEXP (SUBREG_REG (XEXP (x, 0)), 1), i, 1, 5468: 0, in_code == COMPARE); 5469: } 1.1.1.7 root 5470: /* Same as previous, but for (xor/ior (lshiftrt...) (lshiftrt...)). */ 1.1.1.6 root 5471: else if ((GET_CODE (XEXP (x, 0)) == XOR 5472: || GET_CODE (XEXP (x, 0)) == IOR) 5473: && GET_CODE (XEXP (XEXP (x, 0), 0)) == LSHIFTRT 5474: && GET_CODE (XEXP (XEXP (x, 0), 1)) == LSHIFTRT 5475: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) 5476: { 5477: /* Apply the distributive law, and then try to make extractions. */ 5478: new = gen_rtx_combine (GET_CODE (XEXP (x, 0)), mode, 5479: gen_rtx (AND, mode, XEXP (XEXP (x, 0), 0), 5480: XEXP (x, 1)), 5481: gen_rtx (AND, mode, XEXP (XEXP (x, 0), 1), 5482: XEXP (x, 1))); 5483: new = make_compound_operation (new, in_code); 5484: } 1.1.1.3 root 5485: 5486: /* If we are have (and (rotate X C) M) and C is larger than the number 5487: of bits in M, this is an extraction. */ 5488: 5489: else if (GET_CODE (XEXP (x, 0)) == ROTATE 5490: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 5491: && (i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0 5492: && i <= INTVAL (XEXP (XEXP (x, 0), 1))) 1.1.1.5 root 5493: { 5494: new = make_compound_operation (XEXP (XEXP (x, 0), 0), next_code); 5495: new = make_extraction (mode, new, 5496: (GET_MODE_BITSIZE (mode) 5497: - INTVAL (XEXP (XEXP (x, 0), 1))), 5498: NULL_RTX, i, 1, 0, in_code == COMPARE); 5499: } 1.1.1.3 root 5500: 5501: /* On machines without logical shifts, if the operand of the AND is 1.1 root 5502: a logical shift and our mask turns off all the propagated sign 5503: bits, we can replace the logical shift with an arithmetic shift. */ 1.1.1.4 root 5504: else if (ashr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing 5505: && (lshr_optab->handlers[(int) mode].insn_code 5506: == CODE_FOR_nothing) 1.1 root 5507: && GET_CODE (XEXP (x, 0)) == LSHIFTRT 5508: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 5509: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 1.1.1.4 root 5510: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT 5511: && mode_width <= HOST_BITS_PER_WIDE_INT) 1.1 root 5512: { 1.1.1.4 root 5513: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); 1.1 root 5514: 5515: mask >>= INTVAL (XEXP (XEXP (x, 0), 1)); 5516: if ((INTVAL (XEXP (x, 1)) & ~mask) == 0) 5517: SUBST (XEXP (x, 0), 1.1.1.5 root 5518: gen_rtx_combine (ASHIFTRT, mode, 5519: make_compound_operation (XEXP (XEXP (x, 0), 0), 5520: next_code), 1.1 root 5521: XEXP (XEXP (x, 0), 1))); 5522: } 5523: 5524: /* If the constant is one less than a power of two, this might be 5525: representable by an extraction even if no shift is present. 5526: If it doesn't end up being a ZERO_EXTEND, we will ignore it unless 5527: we are in a COMPARE. */ 5528: else if ((i = exact_log2 (INTVAL (XEXP (x, 1)) + 1)) >= 0) 1.1.1.5 root 5529: new = make_extraction (mode, 5530: make_compound_operation (XEXP (x, 0), 5531: next_code), 5532: 0, NULL_RTX, i, 1, 0, in_code == COMPARE); 1.1 root 5533: 5534: /* If we are in a comparison and this is an AND with a power of two, 5535: convert this into the appropriate bit extract. */ 5536: else if (in_code == COMPARE 5537: && (i = exact_log2 (INTVAL (XEXP (x, 1)))) >= 0) 1.1.1.5 root 5538: new = make_extraction (mode, 5539: make_compound_operation (XEXP (x, 0), 5540: next_code), 5541: i, NULL_RTX, 1, 1, 0, 1); 1.1 root 5542: 5543: break; 5544: 5545: case LSHIFTRT: 5546: /* If the sign bit is known to be zero, replace this with an 5547: arithmetic shift. */ 1.1.1.4 root 5548: if (ashr_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing 5549: && lshr_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing 5550: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 5551: && (nonzero_bits (XEXP (x, 0), mode) & (1 << (mode_width - 1))) == 0) 1.1 root 5552: { 1.1.1.5 root 5553: new = gen_rtx_combine (ASHIFTRT, mode, 5554: make_compound_operation (XEXP (x, 0), 5555: next_code), 5556: XEXP (x, 1)); 1.1 root 5557: break; 5558: } 5559: 5560: /* ... fall through ... */ 5561: 5562: case ASHIFTRT: 1.1.1.7 root 5563: lhs = XEXP (x, 0); 5564: rhs = XEXP (x, 1); 5565: 1.1 root 5566: /* If we have (ashiftrt (ashift foo C1) C2) with C2 >= C1, 5567: this is a SIGN_EXTRACT. */ 1.1.1.7 root 5568: if (GET_CODE (rhs) == CONST_INT 5569: && GET_CODE (lhs) == ASHIFT 5570: && GET_CODE (XEXP (lhs, 1)) == CONST_INT 5571: && INTVAL (rhs) >= INTVAL (XEXP (lhs, 1))) 1.1.1.5 root 5572: { 1.1.1.7 root 5573: new = make_compound_operation (XEXP (lhs, 0), next_code); 1.1.1.5 root 5574: new = make_extraction (mode, new, 1.1.1.7 root 5575: INTVAL (rhs) - INTVAL (XEXP (lhs, 1)), 5576: NULL_RTX, mode_width - INTVAL (rhs), 1.1.1.4 root 5577: code == LSHIFTRT, 0, in_code == COMPARE); 5578: } 5579: 1.1.1.7 root 5580: /* See if we have operations between an ASHIFTRT and an ASHIFT. 5581: If so, try to merge the shifts into a SIGN_EXTEND. We could 5582: also do this for some cases of SIGN_EXTRACT, but it doesn't 5583: seem worth the effort; the case checked for occurs on Alpha. */ 5584: 5585: if (GET_RTX_CLASS (GET_CODE (lhs)) != 'o' 5586: && ! (GET_CODE (lhs) == SUBREG 5587: && (GET_RTX_CLASS (GET_CODE (SUBREG_REG (lhs))) == 'o')) 5588: && GET_CODE (rhs) == CONST_INT 5589: && INTVAL (rhs) < HOST_BITS_PER_WIDE_INT 5590: && (new = extract_left_shift (lhs, INTVAL (rhs))) != 0) 5591: new = make_extraction (mode, make_compound_operation (new, next_code), 5592: 0, NULL_RTX, mode_width - INTVAL (rhs), 5593: code == LSHIFTRT, 0, in_code == COMPARE); 5594: 1.1 root 5595: break; 1.1.1.5 root 5596: 5597: case SUBREG: 5598: /* Call ourselves recursively on the inner expression. If we are 5599: narrowing the object and it has a different RTL code from 5600: what it originally did, do this SUBREG as a force_to_mode. */ 5601: 5602: tem = make_compound_operation (SUBREG_REG (x), in_code); 5603: if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x)) 5604: && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem)) 5605: && subreg_lowpart_p (x)) 5606: { 5607: rtx newer = force_to_mode (tem, mode, 1.1.1.6 root 5608: GET_MODE_MASK (mode), NULL_RTX, 0); 1.1.1.5 root 5609: 5610: /* If we have something other than a SUBREG, we might have 5611: done an expansion, so rerun outselves. */ 5612: if (GET_CODE (newer) != SUBREG) 5613: newer = make_compound_operation (newer, in_code); 5614: 5615: return newer; 5616: } 1.1 root 5617: } 5618: 5619: if (new) 5620: { 1.1.1.4 root 5621: x = gen_lowpart_for_combine (mode, new); 1.1 root 5622: code = GET_CODE (x); 5623: } 5624: 5625: /* Now recursively process each operand of this operation. */ 5626: fmt = GET_RTX_FORMAT (code); 5627: for (i = 0; i < GET_RTX_LENGTH (code); i++) 5628: if (fmt[i] == 'e') 5629: { 5630: new = make_compound_operation (XEXP (x, i), next_code); 5631: SUBST (XEXP (x, i), new); 5632: } 5633: 5634: return x; 5635: } 5636: 5637: /* Given M see if it is a value that would select a field of bits 5638: within an item, but not the entire word. Return -1 if not. 5639: Otherwise, return the starting position of the field, where 0 is the 5640: low-order bit. 5641: 5642: *PLEN is set to the length of the field. */ 5643: 5644: static int 5645: get_pos_from_mask (m, plen) 1.1.1.4 root 5646: unsigned HOST_WIDE_INT m; 1.1 root 5647: int *plen; 5648: { 5649: /* Get the bit number of the first 1 bit from the right, -1 if none. */ 5650: int pos = exact_log2 (m & - m); 5651: 5652: if (pos < 0) 5653: return -1; 5654: 5655: /* Now shift off the low-order zero bits and see if we have a power of 5656: two minus 1. */ 5657: *plen = exact_log2 ((m >> pos) + 1); 5658: 5659: if (*plen <= 0) 5660: return -1; 5661: 5662: return pos; 5663: } 5664: 1.1.1.6 root 5665: /* See if X can be simplified knowing that we will only refer to it in 5666: MODE and will only refer to those bits that are nonzero in MASK. 5667: If other bits are being computed or if masking operations are done 5668: that select a superset of the bits in MASK, they can sometimes be 5669: ignored. 5670: 5671: Return a possibly simplified expression, but always convert X to 5672: MODE. If X is a CONST_INT, AND the CONST_INT with MASK. 1.1.1.2 root 5673: 5674: Also, if REG is non-zero and X is a register equal in value to REG, 1.1.1.6 root 5675: replace X with REG. 5676: 5677: If JUST_SELECT is nonzero, don't optimize by noticing that bits in MASK 5678: are all off in X. This is used when X will be complemented, by either 1.1.1.7 root 5679: NOT, NEG, or XOR. */ 1.1.1.2 root 5680: 5681: static rtx 1.1.1.6 root 5682: force_to_mode (x, mode, mask, reg, just_select) 1.1.1.2 root 5683: rtx x; 5684: enum machine_mode mode; 1.1.1.6 root 5685: unsigned HOST_WIDE_INT mask; 1.1.1.2 root 5686: rtx reg; 1.1.1.6 root 5687: int just_select; 1.1.1.2 root 5688: { 5689: enum rtx_code code = GET_CODE (x); 1.1.1.7 root 5690: int next_select = just_select || code == XOR || code == NOT || code == NEG; 1.1.1.6 root 5691: enum machine_mode op_mode; 5692: unsigned HOST_WIDE_INT fuller_mask, nonzero; 5693: rtx op0, op1, temp; 5694: 1.1.1.7 root 5695: /* If this is a CALL, don't do anything. Some of the code below 5696: will do the wrong thing since the mode of a CALL is VOIDmode. */ 5697: if (code == CALL) 5698: return x; 5699: 1.1.1.6 root 5700: /* We want to perform the operation is its present mode unless we know 5701: that the operation is valid in MODE, in which case we do the operation 5702: in MODE. */ 1.1.1.7 root 5703: op_mode = ((GET_MODE_CLASS (mode) == GET_MODE_CLASS (GET_MODE (x)) 5704: && code_to_optab[(int) code] != 0 1.1.1.6 root 5705: && (code_to_optab[(int) code]->handlers[(int) mode].insn_code 5706: != CODE_FOR_nothing)) 5707: ? mode : GET_MODE (x)); 5708: 5709: /* It is not valid to do a right-shift in a narrower mode 5710: than the one it came in with. */ 5711: if ((code == LSHIFTRT || code == ASHIFTRT) 5712: && GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (GET_MODE (x))) 5713: op_mode = GET_MODE (x); 5714: 5715: /* Truncate MASK to fit OP_MODE. */ 5716: if (op_mode) 5717: mask &= GET_MODE_MASK (op_mode); 5718: 5719: /* When we have an arithmetic operation, or a shift whose count we 5720: do not know, we need to assume that all bit the up to the highest-order 5721: bit in MASK will be needed. This is how we form such a mask. */ 5722: if (op_mode) 5723: fuller_mask = (GET_MODE_BITSIZE (op_mode) >= HOST_BITS_PER_WIDE_INT 5724: ? GET_MODE_MASK (op_mode) 5725: : ((HOST_WIDE_INT) 1 << (floor_log2 (mask) + 1)) - 1); 5726: else 5727: fuller_mask = ~ (HOST_WIDE_INT) 0; 1.1.1.2 root 5728: 1.1.1.6 root 5729: /* Determine what bits of X are guaranteed to be (non)zero. */ 5730: nonzero = nonzero_bits (x, mode); 5731: 5732: /* If none of the bits in X are needed, return a zero. */ 5733: if (! just_select && (nonzero & mask) == 0) 5734: return const0_rtx; 1.1.1.2 root 5735: 1.1.1.6 root 5736: /* If X is a CONST_INT, return a new one. Do this here since the 5737: test below will fail. */ 5738: if (GET_CODE (x) == CONST_INT) 5739: { 5740: HOST_WIDE_INT cval = INTVAL (x) & mask; 5741: int width = GET_MODE_BITSIZE (mode); 5742: 5743: /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative 5744: number, sign extend it. */ 5745: if (width > 0 && width < HOST_BITS_PER_WIDE_INT 5746: && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) 5747: cval |= (HOST_WIDE_INT) -1 << width; 5748: 5749: return GEN_INT (cval); 5750: } 5751: 1.1.1.7 root 5752: /* If X is narrower than MODE and we want all the bits in X's mode, just 5753: get X in the proper mode. */ 5754: if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode) 5755: && (GET_MODE_MASK (GET_MODE (x)) & ~ mask) == 0) 1.1.1.2 root 5756: return gen_lowpart_for_combine (mode, x); 5757: 1.1.1.7 root 5758: /* If we aren't changing the mode, X is not a SUBREG, and all zero bits in 5759: MASK are already known to be zero in X, we need not do anything. */ 5760: if (GET_MODE (x) == mode && code != SUBREG && (~ mask & nonzero) == 0) 1.1.1.6 root 5761: return x; 5762: 1.1.1.2 root 5763: switch (code) 5764: { 1.1.1.6 root 5765: case CLOBBER: 5766: /* If X is a (clobber (const_int)), return it since we know we are 5767: generating something that won't match. */ 5768: return x; 5769: 5770: case USE: 5771: /* X is a (use (mem ..)) that was made from a bit-field extraction that 5772: spanned the boundary of the MEM. If we are now masking so it is 5773: within that boundary, we don't need the USE any more. */ 1.1.1.8 ! root 5774: if (! BITS_BIG_ENDIAN ! 5775: && (mask & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))) == 0) 1.1.1.6 root 5776: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); 1.1.1.8 ! root 5777: break; 1.1.1.6 root 5778: 1.1.1.2 root 5779: case SIGN_EXTEND: 5780: case ZERO_EXTEND: 5781: case ZERO_EXTRACT: 5782: case SIGN_EXTRACT: 5783: x = expand_compound_operation (x); 5784: if (GET_CODE (x) != code) 1.1.1.6 root 5785: return force_to_mode (x, mode, mask, reg, next_select); 1.1.1.2 root 5786: break; 5787: 5788: case REG: 5789: if (reg != 0 && (rtx_equal_p (get_last_value (reg), x) 5790: || rtx_equal_p (reg, get_last_value (x)))) 5791: x = reg; 5792: break; 5793: 5794: case SUBREG: 1.1.1.6 root 5795: if (subreg_lowpart_p (x) 1.1.1.7 root 5796: /* We can ignore the effect of this SUBREG if it narrows the mode or 5797: if the constant masks to zero all the bits the mode doesn't 5798: have. */ 1.1.1.6 root 5799: && ((GET_MODE_SIZE (GET_MODE (x)) 5800: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) 5801: || (0 == (mask 5802: & GET_MODE_MASK (GET_MODE (x)) 1.1.1.7 root 5803: & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x))))))) 1.1.1.6 root 5804: return force_to_mode (SUBREG_REG (x), mode, mask, reg, next_select); 1.1.1.2 root 5805: break; 5806: 5807: case AND: 1.1.1.6 root 5808: /* If this is an AND with a constant, convert it into an AND 5809: whose constant is the AND of that constant with MASK. If it 5810: remains an AND of MASK, delete it since it is redundant. */ 1.1.1.2 root 5811: 1.1.1.8 ! root 5812: if (GET_CODE (XEXP (x, 1)) == CONST_INT) 1.1.1.2 root 5813: { 1.1.1.6 root 5814: x = simplify_and_const_int (x, op_mode, XEXP (x, 0), 5815: mask & INTVAL (XEXP (x, 1))); 1.1.1.2 root 5816: 5817: /* If X is still an AND, see if it is an AND with a mask that 1.1.1.7 root 5818: is just some low-order bits. If so, and it is MASK, we don't 5819: need it. */ 1.1.1.2 root 5820: 5821: if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.6 root 5822: && INTVAL (XEXP (x, 1)) == mask) 1.1.1.2 root 5823: x = XEXP (x, 0); 1.1.1.4 root 5824: 1.1.1.7 root 5825: /* If it remains an AND, try making another AND with the bits 5826: in the mode mask that aren't in MASK turned on. If the 5827: constant in the AND is wide enough, this might make a 5828: cheaper constant. */ 5829: 5830: if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.8 ! root 5831: && GET_MODE_MASK (GET_MODE (x)) != mask ! 5832: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT) 1.1.1.7 root 5833: { 5834: HOST_WIDE_INT cval = (INTVAL (XEXP (x, 1)) 5835: | (GET_MODE_MASK (GET_MODE (x)) & ~ mask)); 5836: int width = GET_MODE_BITSIZE (GET_MODE (x)); 5837: rtx y; 5838: 5839: /* If MODE is narrower that HOST_WIDE_INT and CVAL is a negative 5840: number, sign extend it. */ 5841: if (width > 0 && width < HOST_BITS_PER_WIDE_INT 5842: && (cval & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) 5843: cval |= (HOST_WIDE_INT) -1 << width; 5844: 5845: y = gen_binary (AND, GET_MODE (x), XEXP (x, 0), GEN_INT (cval)); 5846: if (rtx_cost (y, SET) < rtx_cost (x, SET)) 5847: x = y; 5848: } 5849: 1.1.1.4 root 5850: break; 1.1.1.2 root 5851: } 5852: 1.1.1.6 root 5853: goto binop; 1.1.1.2 root 5854: 5855: case PLUS: 1.1.1.6 root 5856: /* In (and (plus FOO C1) M), if M is a mask that just turns off 5857: low-order bits (as in an alignment operation) and FOO is already 5858: aligned to that boundary, mask C1 to that boundary as well. 5859: This may eliminate that PLUS and, later, the AND. */ 1.1.1.8 ! root 5860: ! 5861: { ! 5862: int width = GET_MODE_BITSIZE (mode); ! 5863: unsigned HOST_WIDE_INT smask = mask; ! 5864: ! 5865: /* If MODE is narrower than HOST_WIDE_INT and mask is a negative ! 5866: number, sign extend it. */ ! 5867: ! 5868: if (width < HOST_BITS_PER_WIDE_INT ! 5869: && (smask & ((HOST_WIDE_INT) 1 << (width - 1))) != 0) ! 5870: smask |= (HOST_WIDE_INT) -1 << width; ! 5871: ! 5872: if (GET_CODE (XEXP (x, 1)) == CONST_INT ! 5873: && exact_log2 (- smask) >= 0 ! 5874: && (nonzero_bits (XEXP (x, 0), mode) & ~ mask) == 0 ! 5875: && (INTVAL (XEXP (x, 1)) & ~ mask) != 0) ! 5876: return force_to_mode (plus_constant (XEXP (x, 0), ! 5877: INTVAL (XEXP (x, 1)) & mask), ! 5878: mode, mask, reg, next_select); ! 5879: } 1.1.1.6 root 5880: 5881: /* ... fall through ... */ 5882: 1.1.1.2 root 5883: case MINUS: 5884: case MULT: 1.1.1.6 root 5885: /* For PLUS, MINUS and MULT, we need any bits less significant than the 5886: most significant bit in MASK since carries from those bits will 5887: affect the bits we are interested in. */ 5888: mask = fuller_mask; 5889: goto binop; 5890: 1.1.1.2 root 5891: case IOR: 5892: case XOR: 1.1.1.6 root 5893: /* If X is (ior (lshiftrt FOO C1) C2), try to commute the IOR and 5894: LSHIFTRT so we end up with an (and (lshiftrt (ior ...) ...) ...) 5895: operation which may be a bitfield extraction. Ensure that the 5896: constant we form is not wider than the mode of X. */ 5897: 5898: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT 5899: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 5900: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 5901: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT 5902: && GET_CODE (XEXP (x, 1)) == CONST_INT 5903: && ((INTVAL (XEXP (XEXP (x, 0), 1)) 5904: + floor_log2 (INTVAL (XEXP (x, 1)))) 5905: < GET_MODE_BITSIZE (GET_MODE (x))) 5906: && (INTVAL (XEXP (x, 1)) 5907: & ~ nonzero_bits (XEXP (x, 0), GET_MODE (x)) == 0)) 5908: { 5909: temp = GEN_INT ((INTVAL (XEXP (x, 1)) & mask) 5910: << INTVAL (XEXP (XEXP (x, 0), 1))); 5911: temp = gen_binary (GET_CODE (x), GET_MODE (x), 5912: XEXP (XEXP (x, 0), 0), temp); 5913: x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (x, 1)); 5914: return force_to_mode (x, mode, mask, reg, next_select); 5915: } 5916: 5917: binop: 1.1.1.2 root 5918: /* For most binary operations, just propagate into the operation and 1.1.1.6 root 5919: change the mode if we have an operation of that mode. */ 1.1.1.2 root 5920: 1.1.1.6 root 5921: op0 = gen_lowpart_for_combine (op_mode, 5922: force_to_mode (XEXP (x, 0), mode, mask, 5923: reg, next_select)); 5924: op1 = gen_lowpart_for_combine (op_mode, 5925: force_to_mode (XEXP (x, 1), mode, mask, 5926: reg, next_select)); 5927: 5928: /* If OP1 is a CONST_INT and X is an IOR or XOR, clear bits outside 5929: MASK since OP1 might have been sign-extended but we never want 5930: to turn on extra bits, since combine might have previously relied 5931: on them being off. */ 5932: if (GET_CODE (op1) == CONST_INT && (code == IOR || code == XOR) 5933: && (INTVAL (op1) & mask) != 0) 5934: op1 = GEN_INT (INTVAL (op1) & mask); 5935: 5936: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0) || op1 != XEXP (x, 1)) 5937: x = gen_binary (code, op_mode, op0, op1); 1.1.1.4 root 5938: break; 1.1.1.2 root 5939: 5940: case ASHIFT: 5941: /* For left shifts, do the same, but just for the first operand. 1.1.1.5 root 5942: However, we cannot do anything with shifts where we cannot 5943: guarantee that the counts are smaller than the size of the mode 5944: because such a count will have a different meaning in a 1.1.1.6 root 5945: wider mode. */ 1.1.1.5 root 5946: 5947: if (! (GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.6 root 5948: && INTVAL (XEXP (x, 1)) >= 0 1.1.1.5 root 5949: && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (mode)) 5950: && ! (GET_MODE (XEXP (x, 1)) != VOIDmode 5951: && (nonzero_bits (XEXP (x, 1), GET_MODE (XEXP (x, 1))) 5952: < (unsigned HOST_WIDE_INT) GET_MODE_BITSIZE (mode)))) 5953: break; 5954: 1.1.1.6 root 5955: /* If the shift count is a constant and we can do arithmetic in 5956: the mode of the shift, refine which bits we need. Otherwise, use the 5957: conservative form of the mask. */ 5958: if (GET_CODE (XEXP (x, 1)) == CONST_INT 5959: && INTVAL (XEXP (x, 1)) >= 0 5960: && INTVAL (XEXP (x, 1)) < GET_MODE_BITSIZE (op_mode) 5961: && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT) 5962: mask >>= INTVAL (XEXP (x, 1)); 5963: else 5964: mask = fuller_mask; 5965: 5966: op0 = gen_lowpart_for_combine (op_mode, 5967: force_to_mode (XEXP (x, 0), op_mode, 5968: mask, reg, next_select)); 1.1.1.2 root 5969: 1.1.1.6 root 5970: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0)) 5971: x = gen_binary (code, op_mode, op0, XEXP (x, 1)); 1.1.1.4 root 5972: break; 1.1.1.2 root 5973: 5974: case LSHIFTRT: 1.1.1.6 root 5975: /* Here we can only do something if the shift count is a constant, 5976: this shift constant is valid for the host, and we can do arithmetic 5977: in OP_MODE. */ 1.1.1.2 root 5978: 5979: if (GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.6 root 5980: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT 5981: && GET_MODE_BITSIZE (op_mode) <= HOST_BITS_PER_WIDE_INT) 1.1.1.4 root 5982: { 1.1.1.6 root 5983: rtx inner = XEXP (x, 0); 1.1.1.4 root 5984: 1.1.1.6 root 5985: /* Select the mask of the bits we need for the shift operand. */ 5986: mask <<= INTVAL (XEXP (x, 1)); 5987: 5988: /* We can only change the mode of the shift if we can do arithmetic 5989: in the mode of the shift and MASK is no wider than the width of 5990: OP_MODE. */ 5991: if (GET_MODE_BITSIZE (op_mode) > HOST_BITS_PER_WIDE_INT 5992: || (mask & ~ GET_MODE_MASK (op_mode)) != 0) 1.1.1.4 root 5993: op_mode = GET_MODE (x); 5994: 1.1.1.6 root 5995: inner = force_to_mode (inner, op_mode, mask, reg, next_select); 5996: 5997: if (GET_MODE (x) != op_mode || inner != XEXP (x, 0)) 5998: x = gen_binary (LSHIFTRT, op_mode, inner, XEXP (x, 1)); 1.1.1.4 root 5999: } 1.1.1.6 root 6000: 6001: /* If we have (and (lshiftrt FOO C1) C2) where the combination of the 6002: shift and AND produces only copies of the sign bit (C2 is one less 6003: than a power of two), we can do this with just a shift. */ 6004: 6005: if (GET_CODE (x) == LSHIFTRT 6006: && GET_CODE (XEXP (x, 1)) == CONST_INT 6007: && ((INTVAL (XEXP (x, 1)) 6008: + num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0)))) 6009: >= GET_MODE_BITSIZE (GET_MODE (x))) 6010: && exact_log2 (mask + 1) >= 0 6011: && (num_sign_bit_copies (XEXP (x, 0), GET_MODE (XEXP (x, 0))) 6012: >= exact_log2 (mask + 1))) 6013: x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), 6014: GEN_INT (GET_MODE_BITSIZE (GET_MODE (x)) 6015: - exact_log2 (mask + 1))); 1.1.1.4 root 6016: break; 6017: 6018: case ASHIFTRT: 1.1.1.6 root 6019: /* If we are just looking for the sign bit, we don't need this shift at 6020: all, even if it has a variable count. */ 1.1.1.8 ! root 6021: if (GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT ! 6022: && (mask == ((HOST_WIDE_INT) 1 ! 6023: << (GET_MODE_BITSIZE (GET_MODE (x)) - 1)))) 1.1.1.6 root 6024: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); 6025: 6026: /* If this is a shift by a constant, get a mask that contains those bits 6027: that are not copies of the sign bit. We then have two cases: If 6028: MASK only includes those bits, this can be a logical shift, which may 6029: allow simplifications. If MASK is a single-bit field not within 6030: those bits, we are requesting a copy of the sign bit and hence can 6031: shift the sign bit to the appropriate location. */ 6032: 6033: if (GET_CODE (XEXP (x, 1)) == CONST_INT && INTVAL (XEXP (x, 1)) >= 0 6034: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) 6035: { 6036: int i = -1; 6037: 1.1.1.8 ! root 6038: /* If the considered data is wider then HOST_WIDE_INT, we can't ! 6039: represent a mask for all its bits in a single scalar. ! 6040: But we only care about the lower bits, so calculate these. */ ! 6041: ! 6042: if (GET_MODE_BITSIZE (GET_MODE (x)) > HOST_BITS_PER_WIDE_INT) ! 6043: { ! 6044: nonzero = ~(HOST_WIDE_INT)0; ! 6045: ! 6046: /* GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1)) ! 6047: is the number of bits a full-width mask would have set. ! 6048: We need only shift if these are fewer than nonzero can ! 6049: hold. If not, we must keep all bits set in nonzero. */ ! 6050: ! 6051: if (GET_MODE_BITSIZE (GET_MODE (x)) - INTVAL (XEXP (x, 1)) ! 6052: < HOST_BITS_PER_WIDE_INT) ! 6053: nonzero >>= INTVAL (XEXP (x, 1)) ! 6054: + HOST_BITS_PER_WIDE_INT ! 6055: - GET_MODE_BITSIZE (GET_MODE (x)) ; ! 6056: } ! 6057: else ! 6058: { ! 6059: nonzero = GET_MODE_MASK (GET_MODE (x)); ! 6060: nonzero >>= INTVAL (XEXP (x, 1)); ! 6061: } 1.1.1.6 root 6062: 6063: if ((mask & ~ nonzero) == 0 6064: || (i = exact_log2 (mask)) >= 0) 6065: { 6066: x = simplify_shift_const 6067: (x, LSHIFTRT, GET_MODE (x), XEXP (x, 0), 6068: i < 0 ? INTVAL (XEXP (x, 1)) 6069: : GET_MODE_BITSIZE (GET_MODE (x)) - 1 - i); 6070: 6071: if (GET_CODE (x) != ASHIFTRT) 6072: return force_to_mode (x, mode, mask, reg, next_select); 6073: } 6074: } 6075: 6076: /* If MASK is 1, convert this to a LSHIFTRT. This can be done 6077: even if the shift count isn't a constant. */ 6078: if (mask == 1) 6079: x = gen_binary (LSHIFTRT, GET_MODE (x), XEXP (x, 0), XEXP (x, 1)); 6080: 1.1.1.4 root 6081: /* If this is a sign-extension operation that just affects bits 1.1.1.6 root 6082: we don't care about, remove it. Be sure the call above returned 6083: something that is still a shift. */ 1.1.1.4 root 6084: 1.1.1.6 root 6085: if ((GET_CODE (x) == LSHIFTRT || GET_CODE (x) == ASHIFTRT) 6086: && GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.4 root 6087: && INTVAL (XEXP (x, 1)) >= 0 1.1.1.6 root 6088: && (INTVAL (XEXP (x, 1)) 6089: <= GET_MODE_BITSIZE (GET_MODE (x)) - (floor_log2 (mask) + 1)) 1.1.1.4 root 6090: && GET_CODE (XEXP (x, 0)) == ASHIFT 6091: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 6092: && INTVAL (XEXP (XEXP (x, 0), 1)) == INTVAL (XEXP (x, 1))) 1.1.1.6 root 6093: return force_to_mode (XEXP (XEXP (x, 0), 0), mode, mask, 6094: reg, next_select); 6095: 1.1.1.2 root 6096: break; 6097: 1.1.1.6 root 6098: case ROTATE: 6099: case ROTATERT: 6100: /* If the shift count is constant and we can do computations 6101: in the mode of X, compute where the bits we care about are. 6102: Otherwise, we can't do anything. Don't change the mode of 6103: the shift or propagate MODE into the shift, though. */ 6104: if (GET_CODE (XEXP (x, 1)) == CONST_INT 6105: && INTVAL (XEXP (x, 1)) >= 0) 6106: { 6107: temp = simplify_binary_operation (code == ROTATE ? ROTATERT : ROTATE, 6108: GET_MODE (x), GEN_INT (mask), 6109: XEXP (x, 1)); 1.1.1.7 root 6110: if (temp && GET_CODE(temp) == CONST_INT) 1.1.1.6 root 6111: SUBST (XEXP (x, 0), 6112: force_to_mode (XEXP (x, 0), GET_MODE (x), 6113: INTVAL (temp), reg, next_select)); 6114: } 6115: break; 6116: 1.1.1.2 root 6117: case NEG: 1.1.1.7 root 6118: /* If we just want the low-order bit, the NEG isn't needed since it 6119: won't change the low-order bit. */ 6120: if (mask == 1) 6121: return force_to_mode (XEXP (x, 0), mode, mask, reg, just_select); 6122: 1.1.1.6 root 6123: /* We need any bits less significant than the most significant bit in 6124: MASK since carries from those bits will affect the bits we are 6125: interested in. */ 6126: mask = fuller_mask; 6127: goto unop; 6128: 1.1.1.2 root 6129: case NOT: 1.1.1.6 root 6130: /* (not FOO) is (xor FOO CONST), so if FOO is an LSHIFTRT, we can do the 6131: same as the XOR case above. Ensure that the constant we form is not 6132: wider than the mode of X. */ 6133: 6134: if (GET_CODE (XEXP (x, 0)) == LSHIFTRT 6135: && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT 6136: && INTVAL (XEXP (XEXP (x, 0), 1)) >= 0 6137: && (INTVAL (XEXP (XEXP (x, 0), 1)) + floor_log2 (mask) 6138: < GET_MODE_BITSIZE (GET_MODE (x))) 6139: && INTVAL (XEXP (XEXP (x, 0), 1)) < HOST_BITS_PER_WIDE_INT) 6140: { 6141: temp = GEN_INT (mask << INTVAL (XEXP (XEXP (x, 0), 1))); 6142: temp = gen_binary (XOR, GET_MODE (x), XEXP (XEXP (x, 0), 0), temp); 6143: x = gen_binary (LSHIFTRT, GET_MODE (x), temp, XEXP (XEXP (x, 0), 1)); 6144: 6145: return force_to_mode (x, mode, mask, reg, next_select); 6146: } 6147: 6148: unop: 6149: op0 = gen_lowpart_for_combine (op_mode, 6150: force_to_mode (XEXP (x, 0), mode, mask, 6151: reg, next_select)); 6152: if (op_mode != GET_MODE (x) || op0 != XEXP (x, 0)) 1.1.1.7 root 6153: x = gen_unary (code, op_mode, op_mode, op0); 1.1.1.6 root 6154: break; 6155: 6156: case NE: 6157: /* (and (ne FOO 0) CONST) can be (and FOO CONST) if CONST is included 6158: in STORE_FLAG_VALUE and FOO has no bits that might be nonzero not 6159: in CONST. */ 6160: if ((mask & ~ STORE_FLAG_VALUE) == 0 && XEXP (x, 0) == const0_rtx 6161: && (nonzero_bits (XEXP (x, 0), mode) & ~ mask) == 0) 6162: return force_to_mode (XEXP (x, 0), mode, mask, reg, next_select); 6163: 1.1.1.4 root 6164: break; 6165: 6166: case IF_THEN_ELSE: 6167: /* We have no way of knowing if the IF_THEN_ELSE can itself be 6168: written in a narrower mode. We play it safe and do not do so. */ 6169: 6170: SUBST (XEXP (x, 1), 6171: gen_lowpart_for_combine (GET_MODE (x), 6172: force_to_mode (XEXP (x, 1), mode, 1.1.1.6 root 6173: mask, reg, next_select))); 1.1.1.4 root 6174: SUBST (XEXP (x, 2), 6175: gen_lowpart_for_combine (GET_MODE (x), 6176: force_to_mode (XEXP (x, 2), mode, 1.1.1.6 root 6177: mask, reg,next_select))); 1.1.1.4 root 6178: break; 1.1.1.2 root 6179: } 6180: 1.1.1.4 root 6181: /* Ensure we return a value of the proper mode. */ 1.1.1.2 root 6182: return gen_lowpart_for_combine (mode, x); 6183: } 6184: 1.1.1.7 root 6185: /* Return nonzero if X is an expression that has one of two values depending on 6186: whether some other value is zero or nonzero. In that case, we return the 6187: value that is being tested, *PTRUE is set to the value if the rtx being 6188: returned has a nonzero value, and *PFALSE is set to the other alternative. 6189: 6190: If we return zero, we set *PTRUE and *PFALSE to X. */ 6191: 6192: static rtx 6193: if_then_else_cond (x, ptrue, pfalse) 6194: rtx x; 6195: rtx *ptrue, *pfalse; 6196: { 6197: enum machine_mode mode = GET_MODE (x); 6198: enum rtx_code code = GET_CODE (x); 6199: int size = GET_MODE_BITSIZE (mode); 6200: rtx cond0, cond1, true0, true1, false0, false1; 6201: unsigned HOST_WIDE_INT nz; 6202: 6203: /* If this is a unary operation whose operand has one of two values, apply 6204: our opcode to compute those values. */ 6205: if (GET_RTX_CLASS (code) == '1' 6206: && (cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0)) != 0) 6207: { 6208: *ptrue = gen_unary (code, mode, GET_MODE (XEXP (x, 0)), true0); 6209: *pfalse = gen_unary (code, mode, GET_MODE (XEXP (x, 0)), false0); 6210: return cond0; 6211: } 6212: 6213: /* If this is a COMPARE, do nothing, since the IF_THEN_ELSE we would 1.1.1.8 ! root 6214: make can't possibly match and would suppress other optimizations. */ 1.1.1.7 root 6215: else if (code == COMPARE) 6216: ; 6217: 6218: /* If this is a binary operation, see if either side has only one of two 6219: values. If either one does or if both do and they are conditional on 6220: the same value, compute the new true and false values. */ 6221: else if (GET_RTX_CLASS (code) == 'c' || GET_RTX_CLASS (code) == '2' 6222: || GET_RTX_CLASS (code) == '<') 6223: { 6224: cond0 = if_then_else_cond (XEXP (x, 0), &true0, &false0); 6225: cond1 = if_then_else_cond (XEXP (x, 1), &true1, &false1); 6226: 6227: if ((cond0 != 0 || cond1 != 0) 6228: && ! (cond0 != 0 && cond1 != 0 && ! rtx_equal_p (cond0, cond1))) 6229: { 6230: *ptrue = gen_binary (code, mode, true0, true1); 6231: *pfalse = gen_binary (code, mode, false0, false1); 6232: return cond0 ? cond0 : cond1; 6233: } 6234: 6235: #if STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1 6236: 6237: /* See if we have PLUS, IOR, XOR, MINUS or UMAX, where one of the 6238: operands is zero when the other is non-zero, and vice-versa. */ 6239: 6240: if ((code == PLUS || code == IOR || code == XOR || code == MINUS 6241: || code == UMAX) 6242: && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT) 6243: { 6244: rtx op0 = XEXP (XEXP (x, 0), 1); 6245: rtx op1 = XEXP (XEXP (x, 1), 1); 6246: 6247: cond0 = XEXP (XEXP (x, 0), 0); 6248: cond1 = XEXP (XEXP (x, 1), 0); 6249: 6250: if (GET_RTX_CLASS (GET_CODE (cond0)) == '<' 6251: && GET_RTX_CLASS (GET_CODE (cond1)) == '<' 6252: && reversible_comparison_p (cond1) 6253: && ((GET_CODE (cond0) == reverse_condition (GET_CODE (cond1)) 6254: && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0)) 6255: && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1))) 6256: || ((swap_condition (GET_CODE (cond0)) 6257: == reverse_condition (GET_CODE (cond1))) 6258: && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1)) 6259: && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0)))) 6260: && ! side_effects_p (x)) 6261: { 6262: *ptrue = gen_binary (MULT, mode, op0, const_true_rtx); 6263: *pfalse = gen_binary (MULT, mode, 6264: (code == MINUS 6265: ? gen_unary (NEG, mode, mode, op1) : op1), 6266: const_true_rtx); 6267: return cond0; 6268: } 6269: } 6270: 6271: /* Similarly for MULT, AND and UMIN, execpt that for these the result 6272: is always zero. */ 6273: if ((code == MULT || code == AND || code == UMIN) 6274: && GET_CODE (XEXP (x, 0)) == MULT && GET_CODE (XEXP (x, 1)) == MULT) 6275: { 6276: cond0 = XEXP (XEXP (x, 0), 0); 6277: cond1 = XEXP (XEXP (x, 1), 0); 6278: 6279: if (GET_RTX_CLASS (GET_CODE (cond0)) == '<' 6280: && GET_RTX_CLASS (GET_CODE (cond1)) == '<' 6281: && reversible_comparison_p (cond1) 6282: && ((GET_CODE (cond0) == reverse_condition (GET_CODE (cond1)) 6283: && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0)) 6284: && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1))) 6285: || ((swap_condition (GET_CODE (cond0)) 6286: == reverse_condition (GET_CODE (cond1))) 6287: && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 1)) 6288: && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 0)))) 6289: && ! side_effects_p (x)) 6290: { 6291: *ptrue = *pfalse = const0_rtx; 6292: return cond0; 6293: } 6294: } 6295: #endif 6296: } 6297: 6298: else if (code == IF_THEN_ELSE) 6299: { 6300: /* If we have IF_THEN_ELSE already, extract the condition and 6301: canonicalize it if it is NE or EQ. */ 6302: cond0 = XEXP (x, 0); 6303: *ptrue = XEXP (x, 1), *pfalse = XEXP (x, 2); 6304: if (GET_CODE (cond0) == NE && XEXP (cond0, 1) == const0_rtx) 6305: return XEXP (cond0, 0); 6306: else if (GET_CODE (cond0) == EQ && XEXP (cond0, 1) == const0_rtx) 6307: { 6308: *ptrue = XEXP (x, 2), *pfalse = XEXP (x, 1); 6309: return XEXP (cond0, 0); 6310: } 6311: else 6312: return cond0; 6313: } 6314: 6315: /* If X is a normal SUBREG with both inner and outer modes integral, 6316: we can narrow both the true and false values of the inner expression, 6317: if there is a condition. */ 6318: else if (code == SUBREG && GET_MODE_CLASS (mode) == MODE_INT 6319: && GET_MODE_CLASS (GET_MODE (SUBREG_REG (x))) == MODE_INT 6320: && GET_MODE_SIZE (mode) <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))) 6321: && 0 != (cond0 = if_then_else_cond (SUBREG_REG (x), 6322: &true0, &false0))) 6323: { 6324: *ptrue = force_to_mode (true0, mode, GET_MODE_MASK (mode), NULL_RTX, 0); 6325: *pfalse 6326: = force_to_mode (false0, mode, GET_MODE_MASK (mode), NULL_RTX, 0); 6327: 6328: return cond0; 6329: } 6330: 6331: /* If X is a constant, this isn't special and will cause confusions 6332: if we treat it as such. Likewise if it is equivalent to a constant. */ 6333: else if (CONSTANT_P (x) 6334: || ((cond0 = get_last_value (x)) != 0 && CONSTANT_P (cond0))) 6335: ; 6336: 6337: /* If X is known to be either 0 or -1, those are the true and 6338: false values when testing X. */ 6339: else if (num_sign_bit_copies (x, mode) == size) 6340: { 6341: *ptrue = constm1_rtx, *pfalse = const0_rtx; 6342: return x; 6343: } 6344: 6345: /* Likewise for 0 or a single bit. */ 6346: else if (exact_log2 (nz = nonzero_bits (x, mode)) >= 0) 6347: { 6348: *ptrue = GEN_INT (nz), *pfalse = const0_rtx; 6349: return x; 6350: } 6351: 6352: /* Otherwise fail; show no condition with true and false values the same. */ 6353: *ptrue = *pfalse = x; 6354: return 0; 6355: } 6356: 1.1.1.4 root 6357: /* Return the value of expression X given the fact that condition COND 6358: is known to be true when applied to REG as its first operand and VAL 6359: as its second. X is known to not be shared and so can be modified in 6360: place. 6361: 6362: We only handle the simplest cases, and specifically those cases that 6363: arise with IF_THEN_ELSE expressions. */ 6364: 6365: static rtx 6366: known_cond (x, cond, reg, val) 6367: rtx x; 6368: enum rtx_code cond; 6369: rtx reg, val; 6370: { 6371: enum rtx_code code = GET_CODE (x); 1.1.1.7 root 6372: rtx temp; 1.1.1.4 root 6373: char *fmt; 6374: int i, j; 6375: 6376: if (side_effects_p (x)) 6377: return x; 6378: 6379: if (cond == EQ && rtx_equal_p (x, reg)) 6380: return val; 6381: 6382: /* If X is (abs REG) and we know something about REG's relationship 6383: with zero, we may be able to simplify this. */ 6384: 6385: if (code == ABS && rtx_equal_p (XEXP (x, 0), reg) && val == const0_rtx) 6386: switch (cond) 6387: { 6388: case GE: case GT: case EQ: 6389: return XEXP (x, 0); 6390: case LT: case LE: 1.1.1.7 root 6391: return gen_unary (NEG, GET_MODE (XEXP (x, 0)), GET_MODE (XEXP (x, 0)), 6392: XEXP (x, 0)); 1.1.1.4 root 6393: } 6394: 6395: /* The only other cases we handle are MIN, MAX, and comparisons if the 6396: operands are the same as REG and VAL. */ 6397: 6398: else if (GET_RTX_CLASS (code) == '<' || GET_RTX_CLASS (code) == 'c') 6399: { 6400: if (rtx_equal_p (XEXP (x, 0), val)) 6401: cond = swap_condition (cond), temp = val, val = reg, reg = temp; 6402: 6403: if (rtx_equal_p (XEXP (x, 0), reg) && rtx_equal_p (XEXP (x, 1), val)) 6404: { 6405: if (GET_RTX_CLASS (code) == '<') 6406: return (comparison_dominates_p (cond, code) ? const_true_rtx 6407: : (comparison_dominates_p (cond, 6408: reverse_condition (code)) 6409: ? const0_rtx : x)); 6410: 6411: else if (code == SMAX || code == SMIN 6412: || code == UMIN || code == UMAX) 6413: { 6414: int unsignedp = (code == UMIN || code == UMAX); 6415: 6416: if (code == SMAX || code == UMAX) 6417: cond = reverse_condition (cond); 6418: 6419: switch (cond) 6420: { 6421: case GE: case GT: 6422: return unsignedp ? x : XEXP (x, 1); 6423: case LE: case LT: 6424: return unsignedp ? x : XEXP (x, 0); 6425: case GEU: case GTU: 6426: return unsignedp ? XEXP (x, 1) : x; 6427: case LEU: case LTU: 6428: return unsignedp ? XEXP (x, 0) : x; 6429: } 6430: } 6431: } 6432: } 6433: 6434: fmt = GET_RTX_FORMAT (code); 6435: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 6436: { 6437: if (fmt[i] == 'e') 6438: SUBST (XEXP (x, i), known_cond (XEXP (x, i), cond, reg, val)); 6439: else if (fmt[i] == 'E') 6440: for (j = XVECLEN (x, i) - 1; j >= 0; j--) 6441: SUBST (XVECEXP (x, i, j), known_cond (XVECEXP (x, i, j), 6442: cond, reg, val)); 6443: } 6444: 6445: return x; 6446: } 6447: 1.1 root 6448: /* See if X, a SET operation, can be rewritten as a bit-field assignment. 6449: Return that assignment if so. 6450: 6451: We only handle the most common cases. */ 6452: 6453: static rtx 6454: make_field_assignment (x) 6455: rtx x; 6456: { 6457: rtx dest = SET_DEST (x); 6458: rtx src = SET_SRC (x); 1.1.1.2 root 6459: rtx assign; 1.1.1.4 root 6460: HOST_WIDE_INT c1; 6461: int pos, len; 1.1.1.2 root 6462: rtx other; 6463: enum machine_mode mode; 1.1 root 6464: 6465: /* If SRC was (and (not (ashift (const_int 1) POS)) DEST), this is 6466: a clear of a one-bit field. We will have changed it to 6467: (and (rotate (const_int -2) POS) DEST), so check for that. Also check 6468: for a SUBREG. */ 6469: 6470: if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == ROTATE 6471: && GET_CODE (XEXP (XEXP (src, 0), 0)) == CONST_INT 6472: && INTVAL (XEXP (XEXP (src, 0), 0)) == -2 1.1.1.2 root 6473: && (rtx_equal_p (dest, XEXP (src, 1)) 6474: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) 6475: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) 1.1 root 6476: { 1.1.1.5 root 6477: assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), 1.1 root 6478: 1, 1, 1, 0); 1.1.1.2 root 6479: return gen_rtx (SET, VOIDmode, assign, const0_rtx); 1.1 root 6480: } 6481: 6482: else if (GET_CODE (src) == AND && GET_CODE (XEXP (src, 0)) == SUBREG 6483: && subreg_lowpart_p (XEXP (src, 0)) 6484: && (GET_MODE_SIZE (GET_MODE (XEXP (src, 0))) 6485: < GET_MODE_SIZE (GET_MODE (SUBREG_REG (XEXP (src, 0))))) 6486: && GET_CODE (SUBREG_REG (XEXP (src, 0))) == ROTATE 6487: && INTVAL (XEXP (SUBREG_REG (XEXP (src, 0)), 0)) == -2 1.1.1.2 root 6488: && (rtx_equal_p (dest, XEXP (src, 1)) 6489: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) 6490: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) 1.1 root 6491: { 1.1.1.5 root 6492: assign = make_extraction (VOIDmode, dest, 0, 1.1 root 6493: XEXP (SUBREG_REG (XEXP (src, 0)), 1), 6494: 1, 1, 1, 0); 1.1.1.2 root 6495: return gen_rtx (SET, VOIDmode, assign, const0_rtx); 1.1 root 6496: } 6497: 6498: /* If SRC is (ior (ashift (const_int 1) POS DEST)), this is a set of a 6499: one-bit field. */ 6500: else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == ASHIFT 6501: && XEXP (XEXP (src, 0), 0) == const1_rtx 1.1.1.2 root 6502: && (rtx_equal_p (dest, XEXP (src, 1)) 6503: || rtx_equal_p (dest, get_last_value (XEXP (src, 1))) 6504: || rtx_equal_p (get_last_value (dest), XEXP (src, 1)))) 1.1 root 6505: { 1.1.1.5 root 6506: assign = make_extraction (VOIDmode, dest, 0, XEXP (XEXP (src, 0), 1), 1.1 root 6507: 1, 1, 1, 0); 1.1.1.2 root 6508: return gen_rtx (SET, VOIDmode, assign, const1_rtx); 1.1 root 6509: } 6510: 1.1.1.2 root 6511: /* The other case we handle is assignments into a constant-position 6512: field. They look like (ior (and DEST C1) OTHER). If C1 represents 6513: a mask that has all one bits except for a group of zero bits and 6514: OTHER is known to have zeros where C1 has ones, this is such an 6515: assignment. Compute the position and length from C1. Shift OTHER 6516: to the appropriate position, force it to the required mode, and 6517: make the extraction. Check for the AND in both operands. */ 6518: 6519: if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 0)) == AND 6520: && GET_CODE (XEXP (XEXP (src, 0), 1)) == CONST_INT 6521: && (rtx_equal_p (XEXP (XEXP (src, 0), 0), dest) 6522: || rtx_equal_p (XEXP (XEXP (src, 0), 0), get_last_value (dest)) 6523: || rtx_equal_p (get_last_value (XEXP (XEXP (src, 0), 1)), dest))) 6524: c1 = INTVAL (XEXP (XEXP (src, 0), 1)), other = XEXP (src, 1); 6525: else if (GET_CODE (src) == IOR && GET_CODE (XEXP (src, 1)) == AND 6526: && GET_CODE (XEXP (XEXP (src, 1), 1)) == CONST_INT 6527: && (rtx_equal_p (XEXP (XEXP (src, 1), 0), dest) 6528: || rtx_equal_p (XEXP (XEXP (src, 1), 0), get_last_value (dest)) 6529: || rtx_equal_p (get_last_value (XEXP (XEXP (src, 1), 0)), 6530: dest))) 6531: c1 = INTVAL (XEXP (XEXP (src, 1), 1)), other = XEXP (src, 0); 6532: else 6533: return x; 1.1 root 6534: 1.1.1.6 root 6535: pos = get_pos_from_mask (c1 ^ GET_MODE_MASK (GET_MODE (dest)), &len); 1.1.1.2 root 6536: if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest)) 1.1.1.4 root 6537: || (GET_MODE_BITSIZE (GET_MODE (other)) <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 6538: && (c1 & nonzero_bits (other, GET_MODE (other))) != 0)) 1.1.1.2 root 6539: return x; 1.1 root 6540: 1.1.1.4 root 6541: assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0); 1.1 root 6542: 1.1.1.2 root 6543: /* The mode to use for the source is the mode of the assignment, or of 6544: what is inside a possible STRICT_LOW_PART. */ 6545: mode = (GET_CODE (assign) == STRICT_LOW_PART 6546: ? GET_MODE (XEXP (assign, 0)) : GET_MODE (assign)); 1.1 root 6547: 1.1.1.2 root 6548: /* Shift OTHER right POS places and make it the source, restricting it 6549: to the proper length and mode. */ 1.1 root 6550: 1.1.1.4 root 6551: src = force_to_mode (simplify_shift_const (NULL_RTX, LSHIFTRT, 6552: GET_MODE (src), other, pos), 1.1.1.6 root 6553: mode, 6554: GET_MODE_BITSIZE (mode) >= HOST_BITS_PER_WIDE_INT 6555: ? GET_MODE_MASK (mode) 6556: : ((HOST_WIDE_INT) 1 << len) - 1, 6557: dest, 0); 1.1 root 6558: 1.1.1.2 root 6559: return gen_rtx_combine (SET, VOIDmode, assign, src); 1.1 root 6560: } 6561: 6562: /* See if X is of the form (+ (* a c) (* b c)) and convert to (* (+ a b) c) 6563: if so. */ 6564: 6565: static rtx 6566: apply_distributive_law (x) 6567: rtx x; 6568: { 6569: enum rtx_code code = GET_CODE (x); 6570: rtx lhs, rhs, other; 6571: rtx tem; 6572: enum rtx_code inner_code; 6573: 1.1.1.5 root 6574: /* Distributivity is not true for floating point. 6575: It can change the value. So don't do it. 6576: -- rms and [email protected]. */ 1.1.1.6 root 6577: if (FLOAT_MODE_P (GET_MODE (x))) 1.1.1.5 root 6578: return x; 6579: 1.1 root 6580: /* The outer operation can only be one of the following: */ 6581: if (code != IOR && code != AND && code != XOR 6582: && code != PLUS && code != MINUS) 6583: return x; 6584: 6585: lhs = XEXP (x, 0), rhs = XEXP (x, 1); 6586: 1.1.1.2 root 6587: /* If either operand is a primitive we can't do anything, so get out fast. */ 1.1 root 6588: if (GET_RTX_CLASS (GET_CODE (lhs)) == 'o' 1.1.1.2 root 6589: || GET_RTX_CLASS (GET_CODE (rhs)) == 'o') 1.1 root 6590: return x; 6591: 6592: lhs = expand_compound_operation (lhs); 6593: rhs = expand_compound_operation (rhs); 6594: inner_code = GET_CODE (lhs); 6595: if (inner_code != GET_CODE (rhs)) 6596: return x; 6597: 6598: /* See if the inner and outer operations distribute. */ 6599: switch (inner_code) 6600: { 6601: case LSHIFTRT: 6602: case ASHIFTRT: 6603: case AND: 6604: case IOR: 6605: /* These all distribute except over PLUS. */ 6606: if (code == PLUS || code == MINUS) 6607: return x; 6608: break; 6609: 6610: case MULT: 6611: if (code != PLUS && code != MINUS) 6612: return x; 6613: break; 6614: 6615: case ASHIFT: 1.1.1.7 root 6616: /* This is also a multiply, so it distributes over everything. */ 1.1 root 6617: break; 6618: 6619: case SUBREG: 1.1.1.2 root 6620: /* Non-paradoxical SUBREGs distributes over all operations, provided 6621: the inner modes and word numbers are the same, this is an extraction 1.1.1.3 root 6622: of a low-order part, we don't convert an fp operation to int or 6623: vice versa, and we would not be converting a single-word 1.1.1.2 root 6624: operation into a multi-word operation. The latter test is not 1.1.1.3 root 6625: required, but it prevents generating unneeded multi-word operations. 1.1.1.2 root 6626: Some of the previous tests are redundant given the latter test, but 6627: are retained because they are required for correctness. 6628: 6629: We produce the result slightly differently in this case. */ 6630: 6631: if (GET_MODE (SUBREG_REG (lhs)) != GET_MODE (SUBREG_REG (rhs)) 6632: || SUBREG_WORD (lhs) != SUBREG_WORD (rhs) 6633: || ! subreg_lowpart_p (lhs) 1.1.1.3 root 6634: || (GET_MODE_CLASS (GET_MODE (lhs)) 6635: != GET_MODE_CLASS (GET_MODE (SUBREG_REG (lhs)))) 1.1.1.2 root 6636: || (GET_MODE_SIZE (GET_MODE (lhs)) 1.1.1.8 ! root 6637: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs)))) 1.1.1.2 root 6638: || GET_MODE_SIZE (GET_MODE (SUBREG_REG (lhs))) > UNITS_PER_WORD) 1.1 root 6639: return x; 6640: 6641: tem = gen_binary (code, GET_MODE (SUBREG_REG (lhs)), 6642: SUBREG_REG (lhs), SUBREG_REG (rhs)); 6643: return gen_lowpart_for_combine (GET_MODE (x), tem); 6644: 6645: default: 6646: return x; 6647: } 6648: 6649: /* Set LHS and RHS to the inner operands (A and B in the example 6650: above) and set OTHER to the common operand (C in the example). 6651: These is only one way to do this unless the inner operation is 6652: commutative. */ 6653: if (GET_RTX_CLASS (inner_code) == 'c' 6654: && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 0))) 6655: other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 1); 6656: else if (GET_RTX_CLASS (inner_code) == 'c' 6657: && rtx_equal_p (XEXP (lhs, 0), XEXP (rhs, 1))) 6658: other = XEXP (lhs, 0), lhs = XEXP (lhs, 1), rhs = XEXP (rhs, 0); 6659: else if (GET_RTX_CLASS (inner_code) == 'c' 6660: && rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 0))) 6661: other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 1); 6662: else if (rtx_equal_p (XEXP (lhs, 1), XEXP (rhs, 1))) 6663: other = XEXP (lhs, 1), lhs = XEXP (lhs, 0), rhs = XEXP (rhs, 0); 6664: else 6665: return x; 6666: 6667: /* Form the new inner operation, seeing if it simplifies first. */ 6668: tem = gen_binary (code, GET_MODE (x), lhs, rhs); 6669: 6670: /* There is one exception to the general way of distributing: 6671: (a ^ b) | (a ^ c) -> (~a) & (b ^ c) */ 6672: if (code == XOR && inner_code == IOR) 6673: { 6674: inner_code = AND; 1.1.1.7 root 6675: other = gen_unary (NOT, GET_MODE (x), GET_MODE (x), other); 1.1 root 6676: } 6677: 6678: /* We may be able to continuing distributing the result, so call 6679: ourselves recursively on the inner operation before forming the 6680: outer operation, which we return. */ 6681: return gen_binary (inner_code, GET_MODE (x), 6682: apply_distributive_law (tem), other); 6683: } 6684: 6685: /* We have X, a logical `and' of VAROP with the constant CONSTOP, to be done 6686: in MODE. 6687: 6688: Return an equivalent form, if different from X. Otherwise, return X. If 6689: X is zero, we are to always construct the equivalent form. */ 6690: 6691: static rtx 6692: simplify_and_const_int (x, mode, varop, constop) 6693: rtx x; 6694: enum machine_mode mode; 6695: rtx varop; 1.1.1.4 root 6696: unsigned HOST_WIDE_INT constop; 1.1 root 6697: { 1.1.1.5 root 6698: unsigned HOST_WIDE_INT nonzero; 1.1.1.8 ! root 6699: int width = GET_MODE_BITSIZE (mode); 1.1.1.6 root 6700: int i; 1.1 root 6701: 1.1.1.6 root 6702: /* Simplify VAROP knowing that we will be only looking at some of the 6703: bits in it. */ 6704: varop = force_to_mode (varop, mode, constop, NULL_RTX, 0); 6705: 6706: /* If VAROP is a CLOBBER, we will fail so return it; if it is a 6707: CONST_INT, we are done. */ 6708: if (GET_CODE (varop) == CLOBBER || GET_CODE (varop) == CONST_INT) 6709: return varop; 1.1 root 6710: 1.1.1.5 root 6711: /* See what bits may be nonzero in VAROP. Unlike the general case of 6712: a call to nonzero_bits, here we don't care about bits outside 6713: MODE. */ 6714: 6715: nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode); 1.1 root 6716: 1.1.1.8 ! root 6717: /* If this would be an entire word for the target, but is not for ! 6718: the host, then sign-extend on the host so that the number will look ! 6719: the same way on the host that it would on the target. ! 6720: ! 6721: For example, when building a 64 bit alpha hosted 32 bit sparc ! 6722: targeted compiler, then we want the 32 bit unsigned value -1 to be ! 6723: represented as a 64 bit value -1, and not as 0x00000000ffffffff. ! 6724: The later confuses the sparc backend. */ ! 6725: ! 6726: if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width ! 6727: && (nonzero & ((HOST_WIDE_INT) 1 << (width - 1)))) ! 6728: nonzero |= ((HOST_WIDE_INT) (-1) << width); ! 6729: 1.1 root 6730: /* Turn off all bits in the constant that are known to already be zero. 1.1.1.5 root 6731: Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS 1.1 root 6732: which is tested below. */ 6733: 1.1.1.5 root 6734: constop &= nonzero; 1.1 root 6735: 6736: /* If we don't have any bits left, return zero. */ 6737: if (constop == 0) 6738: return const0_rtx; 6739: 1.1.1.6 root 6740: /* If VAROP is a NEG of something known to be zero or 1 and CONSTOP is 6741: a power of two, we can replace this with a ASHIFT. */ 6742: if (GET_CODE (varop) == NEG && nonzero_bits (XEXP (varop, 0), mode) == 1 6743: && (i = exact_log2 (constop)) >= 0) 6744: return simplify_shift_const (NULL_RTX, ASHIFT, mode, XEXP (varop, 0), i); 6745: 6746: /* If VAROP is an IOR or XOR, apply the AND to both branches of the IOR 6747: or XOR, then try to apply the distributive law. This may eliminate 6748: operations if either branch can be simplified because of the AND. 6749: It may also make some cases more complex, but those cases probably 6750: won't match a pattern either with or without this. */ 6751: 6752: if (GET_CODE (varop) == IOR || GET_CODE (varop) == XOR) 6753: return 6754: gen_lowpart_for_combine 6755: (mode, 6756: apply_distributive_law 6757: (gen_binary (GET_CODE (varop), GET_MODE (varop), 6758: simplify_and_const_int (NULL_RTX, GET_MODE (varop), 6759: XEXP (varop, 0), constop), 6760: simplify_and_const_int (NULL_RTX, GET_MODE (varop), 6761: XEXP (varop, 1), constop)))); 6762: 1.1 root 6763: /* Get VAROP in MODE. Try to get a SUBREG if not. Don't make a new SUBREG 6764: if we already had one (just check for the simplest cases). */ 6765: if (x && GET_CODE (XEXP (x, 0)) == SUBREG 6766: && GET_MODE (XEXP (x, 0)) == mode 6767: && SUBREG_REG (XEXP (x, 0)) == varop) 6768: varop = XEXP (x, 0); 6769: else 6770: varop = gen_lowpart_for_combine (mode, varop); 6771: 6772: /* If we can't make the SUBREG, try to return what we were given. */ 6773: if (GET_CODE (varop) == CLOBBER) 6774: return x ? x : varop; 6775: 6776: /* If we are only masking insignificant bits, return VAROP. */ 1.1.1.5 root 6777: if (constop == nonzero) 1.1 root 6778: x = varop; 6779: 6780: /* Otherwise, return an AND. See how much, if any, of X we can use. */ 6781: else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode) 1.1.1.6 root 6782: x = gen_binary (AND, mode, varop, GEN_INT (constop)); 1.1 root 6783: 6784: else 6785: { 6786: if (GET_CODE (XEXP (x, 1)) != CONST_INT 6787: || INTVAL (XEXP (x, 1)) != constop) 1.1.1.4 root 6788: SUBST (XEXP (x, 1), GEN_INT (constop)); 1.1 root 6789: 6790: SUBST (XEXP (x, 0), varop); 6791: } 6792: 6793: return x; 6794: } 6795: 6796: /* Given an expression, X, compute which bits in X can be non-zero. 6797: We don't care about bits outside of those defined in MODE. 6798: 6799: For most X this is simply GET_MODE_MASK (GET_MODE (MODE)), but if X is 6800: a shift, AND, or zero_extract, we can do better. */ 6801: 1.1.1.4 root 6802: static unsigned HOST_WIDE_INT 1.1.1.5 root 6803: nonzero_bits (x, mode) 1.1 root 6804: rtx x; 6805: enum machine_mode mode; 6806: { 1.1.1.5 root 6807: unsigned HOST_WIDE_INT nonzero = GET_MODE_MASK (mode); 6808: unsigned HOST_WIDE_INT inner_nz; 1.1 root 6809: enum rtx_code code; 6810: int mode_width = GET_MODE_BITSIZE (mode); 6811: rtx tem; 6812: 1.1.1.7 root 6813: /* For floating-point values, assume all bits are needed. */ 6814: if (FLOAT_MODE_P (GET_MODE (x)) || FLOAT_MODE_P (mode)) 6815: return nonzero; 6816: 1.1 root 6817: /* If X is wider than MODE, use its mode instead. */ 6818: if (GET_MODE_BITSIZE (GET_MODE (x)) > mode_width) 6819: { 6820: mode = GET_MODE (x); 1.1.1.5 root 6821: nonzero = GET_MODE_MASK (mode); 1.1 root 6822: mode_width = GET_MODE_BITSIZE (mode); 6823: } 6824: 1.1.1.4 root 6825: if (mode_width > HOST_BITS_PER_WIDE_INT) 1.1 root 6826: /* Our only callers in this case look for single bit values. So 6827: just return the mode mask. Those tests will then be false. */ 1.1.1.5 root 6828: return nonzero; 1.1 root 6829: 1.1.1.6 root 6830: #ifndef WORD_REGISTER_OPERATIONS 6831: /* If MODE is wider than X, but both are a single word for both the host 6832: and target machines, we can compute this from which bits of the 6833: object might be nonzero in its own mode, taking into account the fact 6834: that on many CISC machines, accessing an object in a wider mode 6835: causes the high-order bits to become undefined. So they are 6836: not known to be zero. */ 6837: 6838: if (GET_MODE (x) != VOIDmode && GET_MODE (x) != mode 6839: && GET_MODE_BITSIZE (GET_MODE (x)) <= BITS_PER_WORD 6840: && GET_MODE_BITSIZE (GET_MODE (x)) <= HOST_BITS_PER_WIDE_INT 6841: && GET_MODE_BITSIZE (mode) > GET_MODE_BITSIZE (GET_MODE (x))) 6842: { 6843: nonzero &= nonzero_bits (x, GET_MODE (x)); 6844: nonzero |= GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x)); 6845: return nonzero; 6846: } 6847: #endif 6848: 1.1 root 6849: code = GET_CODE (x); 6850: switch (code) 6851: { 6852: case REG: 1.1.1.8 ! root 6853: #ifdef POINTERS_EXTEND_UNSIGNED ! 6854: /* If pointers extend unsigned and this is a pointer in Pmode, say that ! 6855: all the bits above ptr_mode are known to be zero. */ ! 6856: if (POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode ! 6857: && REGNO_POINTER_FLAG (REGNO (x))) ! 6858: nonzero &= GET_MODE_MASK (ptr_mode); ! 6859: #endif ! 6860: 1.1 root 6861: #ifdef STACK_BOUNDARY 6862: /* If this is the stack pointer, we may know something about its 6863: alignment. If PUSH_ROUNDING is defined, it is possible for the 6864: stack to be momentarily aligned only to that amount, so we pick 6865: the least alignment. */ 6866: 6867: if (x == stack_pointer_rtx) 6868: { 6869: int sp_alignment = STACK_BOUNDARY / BITS_PER_UNIT; 6870: 6871: #ifdef PUSH_ROUNDING 6872: sp_alignment = MIN (PUSH_ROUNDING (1), sp_alignment); 6873: #endif 6874: 1.1.1.8 ! root 6875: /* We must return here, otherwise we may get a worse result from ! 6876: one of the choices below. There is nothing useful below as ! 6877: far as the stack pointer is concerned. */ ! 6878: return nonzero &= ~ (sp_alignment - 1); 1.1 root 6879: } 6880: #endif 6881: 1.1.1.5 root 6882: /* If X is a register whose nonzero bits value is current, use it. 6883: Otherwise, if X is a register whose value we can find, use that 6884: value. Otherwise, use the previously-computed global nonzero bits 6885: for this register. */ 6886: 6887: if (reg_last_set_value[REGNO (x)] != 0 6888: && reg_last_set_mode[REGNO (x)] == mode 6889: && (reg_n_sets[REGNO (x)] == 1 6890: || reg_last_set_label[REGNO (x)] == label_tick) 6891: && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) 6892: return reg_last_set_nonzero_bits[REGNO (x)]; 1.1 root 6893: 6894: tem = get_last_value (x); 1.1.1.5 root 6895: 1.1 root 6896: if (tem) 1.1.1.5 root 6897: { 6898: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND 6899: /* If X is narrower than MODE and TEM is a non-negative 6900: constant that would appear negative in the mode of X, 6901: sign-extend it for use in reg_nonzero_bits because some 6902: machines (maybe most) will actually do the sign-extension 6903: and this is the conservative approach. 6904: 6905: ??? For 2.5, try to tighten up the MD files in this regard 6906: instead of this kludge. */ 6907: 6908: if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width 6909: && GET_CODE (tem) == CONST_INT 6910: && INTVAL (tem) > 0 6911: && 0 != (INTVAL (tem) 6912: & ((HOST_WIDE_INT) 1 1.1.1.7 root 6913: << (GET_MODE_BITSIZE (GET_MODE (x)) - 1)))) 1.1.1.5 root 6914: tem = GEN_INT (INTVAL (tem) 6915: | ((HOST_WIDE_INT) (-1) 6916: << GET_MODE_BITSIZE (GET_MODE (x)))); 6917: #endif 6918: return nonzero_bits (tem, mode); 6919: } 6920: else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)]) 6921: return reg_nonzero_bits[REGNO (x)] & nonzero; 1.1 root 6922: else 1.1.1.5 root 6923: return nonzero; 1.1 root 6924: 6925: case CONST_INT: 1.1.1.5 root 6926: #ifdef SHORT_IMMEDIATES_SIGN_EXTEND 6927: /* If X is negative in MODE, sign-extend the value. */ 1.1.1.7 root 6928: if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD 6929: && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1)))) 6930: return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width)); 1.1.1.5 root 6931: #endif 6932: 1.1 root 6933: return INTVAL (x); 6934: 6935: case MEM: 1.1.1.6 root 6936: #ifdef LOAD_EXTEND_OP 1.1 root 6937: /* In many, if not most, RISC machines, reading a byte from memory 6938: zeros the rest of the register. Noticing that fact saves a lot 6939: of extra zero-extends. */ 1.1.1.6 root 6940: if (LOAD_EXTEND_OP (GET_MODE (x)) == ZERO_EXTEND) 6941: nonzero &= GET_MODE_MASK (GET_MODE (x)); 1.1 root 6942: #endif 1.1.1.6 root 6943: break; 1.1 root 6944: 6945: case EQ: case NE: 6946: case GT: case GTU: 6947: case LT: case LTU: 6948: case GE: case GEU: 6949: case LE: case LEU: 1.1.1.3 root 6950: 1.1.1.6 root 6951: /* If this produces an integer result, we know which bits are set. 6952: Code here used to clear bits outside the mode of X, but that is 6953: now done above. */ 1.1 root 6954: 1.1.1.6 root 6955: if (GET_MODE_CLASS (mode) == MODE_INT 6956: && mode_width <= HOST_BITS_PER_WIDE_INT) 6957: nonzero = STORE_FLAG_VALUE; 1.1 root 6958: break; 6959: 6960: case NEG: 1.1.1.4 root 6961: if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x)) 6962: == GET_MODE_BITSIZE (GET_MODE (x))) 1.1.1.5 root 6963: nonzero = 1; 1.1 root 6964: 6965: if (GET_MODE_SIZE (GET_MODE (x)) < mode_width) 1.1.1.5 root 6966: nonzero |= (GET_MODE_MASK (mode) & ~ GET_MODE_MASK (GET_MODE (x))); 1.1 root 6967: break; 1.1.1.4 root 6968: 6969: case ABS: 6970: if (num_sign_bit_copies (XEXP (x, 0), GET_MODE (x)) 6971: == GET_MODE_BITSIZE (GET_MODE (x))) 1.1.1.5 root 6972: nonzero = 1; 1.1.1.4 root 6973: break; 1.1 root 6974: 6975: case TRUNCATE: 1.1.1.5 root 6976: nonzero &= (nonzero_bits (XEXP (x, 0), mode) & GET_MODE_MASK (mode)); 1.1 root 6977: break; 6978: 6979: case ZERO_EXTEND: 1.1.1.5 root 6980: nonzero &= nonzero_bits (XEXP (x, 0), mode); 1.1 root 6981: if (GET_MODE (XEXP (x, 0)) != VOIDmode) 1.1.1.5 root 6982: nonzero &= GET_MODE_MASK (GET_MODE (XEXP (x, 0))); 1.1 root 6983: break; 6984: 6985: case SIGN_EXTEND: 6986: /* If the sign bit is known clear, this is the same as ZERO_EXTEND. 6987: Otherwise, show all the bits in the outer mode but not the inner 6988: may be non-zero. */ 1.1.1.5 root 6989: inner_nz = nonzero_bits (XEXP (x, 0), mode); 1.1 root 6990: if (GET_MODE (XEXP (x, 0)) != VOIDmode) 6991: { 1.1.1.5 root 6992: inner_nz &= GET_MODE_MASK (GET_MODE (XEXP (x, 0))); 6993: if (inner_nz & 1.1.1.4 root 6994: (((HOST_WIDE_INT) 1 6995: << (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - 1)))) 1.1.1.5 root 6996: inner_nz |= (GET_MODE_MASK (mode) 1.1 root 6997: & ~ GET_MODE_MASK (GET_MODE (XEXP (x, 0)))); 6998: } 6999: 1.1.1.5 root 7000: nonzero &= inner_nz; 1.1 root 7001: break; 7002: 7003: case AND: 1.1.1.5 root 7004: nonzero &= (nonzero_bits (XEXP (x, 0), mode) 7005: & nonzero_bits (XEXP (x, 1), mode)); 1.1 root 7006: break; 7007: 1.1.1.4 root 7008: case XOR: case IOR: 7009: case UMIN: case UMAX: case SMIN: case SMAX: 1.1.1.5 root 7010: nonzero &= (nonzero_bits (XEXP (x, 0), mode) 7011: | nonzero_bits (XEXP (x, 1), mode)); 1.1 root 7012: break; 7013: 7014: case PLUS: case MINUS: 7015: case MULT: 7016: case DIV: case UDIV: 7017: case MOD: case UMOD: 7018: /* We can apply the rules of arithmetic to compute the number of 7019: high- and low-order zero bits of these operations. We start by 7020: computing the width (position of the highest-order non-zero bit) 7021: and the number of low-order zero bits for each value. */ 7022: { 1.1.1.5 root 7023: unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode); 7024: unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode); 7025: int width0 = floor_log2 (nz0) + 1; 7026: int width1 = floor_log2 (nz1) + 1; 7027: int low0 = floor_log2 (nz0 & -nz0); 7028: int low1 = floor_log2 (nz1 & -nz1); 1.1.1.7 root 7029: HOST_WIDE_INT op0_maybe_minusp 7030: = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); 7031: HOST_WIDE_INT op1_maybe_minusp 7032: = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); 1.1 root 7033: int result_width = mode_width; 7034: int result_low = 0; 7035: 7036: switch (code) 7037: { 7038: case PLUS: 7039: result_width = MAX (width0, width1) + 1; 7040: result_low = MIN (low0, low1); 7041: break; 7042: case MINUS: 7043: result_low = MIN (low0, low1); 7044: break; 7045: case MULT: 7046: result_width = width0 + width1; 7047: result_low = low0 + low1; 7048: break; 7049: case DIV: 7050: if (! op0_maybe_minusp && ! op1_maybe_minusp) 7051: result_width = width0; 7052: break; 7053: case UDIV: 7054: result_width = width0; 7055: break; 7056: case MOD: 7057: if (! op0_maybe_minusp && ! op1_maybe_minusp) 7058: result_width = MIN (width0, width1); 7059: result_low = MIN (low0, low1); 7060: break; 7061: case UMOD: 7062: result_width = MIN (width0, width1); 7063: result_low = MIN (low0, low1); 7064: break; 7065: } 7066: 7067: if (result_width < mode_width) 1.1.1.5 root 7068: nonzero &= ((HOST_WIDE_INT) 1 << result_width) - 1; 1.1 root 7069: 7070: if (result_low > 0) 1.1.1.5 root 7071: nonzero &= ~ (((HOST_WIDE_INT) 1 << result_low) - 1); 1.1 root 7072: } 7073: break; 7074: 7075: case ZERO_EXTRACT: 7076: if (GET_CODE (XEXP (x, 1)) == CONST_INT 1.1.1.4 root 7077: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) 1.1.1.5 root 7078: nonzero &= ((HOST_WIDE_INT) 1 << INTVAL (XEXP (x, 1))) - 1; 1.1 root 7079: break; 7080: 7081: case SUBREG: 1.1.1.4 root 7082: /* If this is a SUBREG formed for a promoted variable that has 7083: been zero-extended, we know that at least the high-order bits 7084: are zero, though others might be too. */ 7085: 7086: if (SUBREG_PROMOTED_VAR_P (x) && SUBREG_PROMOTED_UNSIGNED_P (x)) 1.1.1.5 root 7087: nonzero = (GET_MODE_MASK (GET_MODE (x)) 7088: & nonzero_bits (SUBREG_REG (x), GET_MODE (x))); 1.1.1.4 root 7089: 1.1 root 7090: /* If the inner mode is a single word for both the host and target 7091: machines, we can compute this from which bits of the inner 1.1.1.5 root 7092: object might be nonzero. */ 1.1 root 7093: if (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) <= BITS_PER_WORD 1.1.1.4 root 7094: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) 7095: <= HOST_BITS_PER_WIDE_INT)) 1.1 root 7096: { 1.1.1.5 root 7097: nonzero &= nonzero_bits (SUBREG_REG (x), mode); 1.1.1.6 root 7098: 7099: #ifndef WORD_REGISTER_OPERATIONS 1.1 root 7100: /* On many CISC machines, accessing an object in a wider mode 7101: causes the high-order bits to become undefined. So they are 7102: not known to be zero. */ 7103: if (GET_MODE_SIZE (GET_MODE (x)) 7104: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) 1.1.1.5 root 7105: nonzero |= (GET_MODE_MASK (GET_MODE (x)) 7106: & ~ GET_MODE_MASK (GET_MODE (SUBREG_REG (x)))); 1.1 root 7107: #endif 7108: } 7109: break; 7110: 7111: case ASHIFTRT: 7112: case LSHIFTRT: 7113: case ASHIFT: 7114: case ROTATE: 1.1.1.5 root 7115: /* The nonzero bits are in two classes: any bits within MODE 1.1 root 7116: that aren't in GET_MODE (x) are always significant. The rest of the 1.1.1.5 root 7117: nonzero bits are those that are significant in the operand of 1.1 root 7118: the shift when shifted the appropriate number of bits. This 7119: shows that high-order bits are cleared by the right shift and 7120: low-order bits by left shifts. */ 7121: if (GET_CODE (XEXP (x, 1)) == CONST_INT 7122: && INTVAL (XEXP (x, 1)) >= 0 1.1.1.4 root 7123: && INTVAL (XEXP (x, 1)) < HOST_BITS_PER_WIDE_INT) 1.1 root 7124: { 7125: enum machine_mode inner_mode = GET_MODE (x); 7126: int width = GET_MODE_BITSIZE (inner_mode); 7127: int count = INTVAL (XEXP (x, 1)); 1.1.1.4 root 7128: unsigned HOST_WIDE_INT mode_mask = GET_MODE_MASK (inner_mode); 1.1.1.5 root 7129: unsigned HOST_WIDE_INT op_nonzero = nonzero_bits (XEXP (x, 0), mode); 7130: unsigned HOST_WIDE_INT inner = op_nonzero & mode_mask; 1.1.1.4 root 7131: unsigned HOST_WIDE_INT outer = 0; 1.1 root 7132: 7133: if (mode_width > width) 1.1.1.5 root 7134: outer = (op_nonzero & nonzero & ~ mode_mask); 1.1 root 7135: 7136: if (code == LSHIFTRT) 7137: inner >>= count; 7138: else if (code == ASHIFTRT) 7139: { 7140: inner >>= count; 7141: 1.1.1.5 root 7142: /* If the sign bit may have been nonzero before the shift, we 1.1 root 7143: need to mark all the places it could have been copied to 1.1.1.5 root 7144: by the shift as possibly nonzero. */ 1.1.1.4 root 7145: if (inner & ((HOST_WIDE_INT) 1 << (width - 1 - count))) 7146: inner |= (((HOST_WIDE_INT) 1 << count) - 1) << (width - count); 1.1 root 7147: } 1.1.1.7 root 7148: else if (code == ASHIFT) 1.1 root 7149: inner <<= count; 7150: else 7151: inner = ((inner << (count % width) 7152: | (inner >> (width - (count % width)))) & mode_mask); 7153: 1.1.1.5 root 7154: nonzero &= (outer | inner); 1.1 root 7155: } 7156: break; 7157: 7158: case FFS: 7159: /* This is at most the number of bits in the mode. */ 1.1.1.5 root 7160: nonzero = ((HOST_WIDE_INT) 1 << (floor_log2 (mode_width) + 1)) - 1; 1.1.1.4 root 7161: break; 7162: 7163: case IF_THEN_ELSE: 1.1.1.5 root 7164: nonzero &= (nonzero_bits (XEXP (x, 1), mode) 7165: | nonzero_bits (XEXP (x, 2), mode)); 1.1 root 7166: break; 7167: } 7168: 1.1.1.5 root 7169: return nonzero; 1.1 root 7170: } 7171: 1.1.1.4 root 7172: /* Return the number of bits at the high-order end of X that are known to 1.1.1.6 root 7173: be equal to the sign bit. X will be used in mode MODE; if MODE is 7174: VOIDmode, X will be used in its own mode. The returned value will always 7175: be between 1 and the number of bits in MODE. */ 1.1.1.4 root 7176: 7177: static int 7178: num_sign_bit_copies (x, mode) 7179: rtx x; 7180: enum machine_mode mode; 7181: { 7182: enum rtx_code code = GET_CODE (x); 7183: int bitwidth; 7184: int num0, num1, result; 1.1.1.5 root 7185: unsigned HOST_WIDE_INT nonzero; 1.1.1.4 root 7186: rtx tem; 7187: 7188: /* If we weren't given a mode, use the mode of X. If the mode is still 1.1.1.7 root 7189: VOIDmode, we don't know anything. Likewise if one of the modes is 7190: floating-point. */ 1.1.1.4 root 7191: 7192: if (mode == VOIDmode) 7193: mode = GET_MODE (x); 7194: 1.1.1.7 root 7195: if (mode == VOIDmode || FLOAT_MODE_P (mode) || FLOAT_MODE_P (GET_MODE (x))) 1.1.1.4 root 7196: return 1; 7197: 7198: bitwidth = GET_MODE_BITSIZE (mode); 7199: 1.1.1.6 root 7200: /* For a smaller object, just ignore the high bits. */ 7201: if (bitwidth < GET_MODE_BITSIZE (GET_MODE (x))) 7202: return MAX (1, (num_sign_bit_copies (x, GET_MODE (x)) 7203: - (GET_MODE_BITSIZE (GET_MODE (x)) - bitwidth))); 7204: 1.1.1.7 root 7205: #ifndef WORD_REGISTER_OPERATIONS 7206: /* If this machine does not do all register operations on the entire 7207: register and MODE is wider than the mode of X, we can say nothing 7208: at all about the high-order bits. */ 7209: if (GET_MODE (x) != VOIDmode && bitwidth > GET_MODE_BITSIZE (GET_MODE (x))) 7210: return 1; 7211: #endif 7212: 1.1.1.4 root 7213: switch (code) 7214: { 7215: case REG: 1.1.1.5 root 7216: 1.1.1.8 ! root 7217: #ifdef POINTERS_EXTEND_UNSIGNED ! 7218: /* If pointers extend signed and this is a pointer in Pmode, say that ! 7219: all the bits above ptr_mode are known to be sign bit copies. */ ! 7220: if (! POINTERS_EXTEND_UNSIGNED && GET_MODE (x) == Pmode && mode == Pmode ! 7221: && REGNO_POINTER_FLAG (REGNO (x))) ! 7222: return GET_MODE_BITSIZE (Pmode) - GET_MODE_BITSIZE (ptr_mode) + 1; ! 7223: #endif ! 7224: 1.1.1.5 root 7225: if (reg_last_set_value[REGNO (x)] != 0 7226: && reg_last_set_mode[REGNO (x)] == mode 7227: && (reg_n_sets[REGNO (x)] == 1 7228: || reg_last_set_label[REGNO (x)] == label_tick) 7229: && INSN_CUID (reg_last_set[REGNO (x)]) < subst_low_cuid) 7230: return reg_last_set_sign_bit_copies[REGNO (x)]; 1.1.1.4 root 7231: 7232: tem = get_last_value (x); 7233: if (tem != 0) 7234: return num_sign_bit_copies (tem, mode); 1.1.1.5 root 7235: 7236: if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0) 7237: return reg_sign_bit_copies[REGNO (x)]; 1.1.1.4 root 7238: break; 7239: 7240: case MEM: 1.1.1.6 root 7241: #ifdef LOAD_EXTEND_OP 1.1.1.4 root 7242: /* Some RISC machines sign-extend all loads of smaller than a word. */ 1.1.1.6 root 7243: if (LOAD_EXTEND_OP (GET_MODE (x)) == SIGN_EXTEND) 7244: return MAX (1, bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1); 1.1.1.4 root 7245: #endif 1.1.1.6 root 7246: break; 1.1.1.4 root 7247: 7248: case CONST_INT: 7249: /* If the constant is negative, take its 1's complement and remask. 7250: Then see how many zero bits we have. */ 1.1.1.5 root 7251: nonzero = INTVAL (x) & GET_MODE_MASK (mode); 1.1.1.4 root 7252: if (bitwidth <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 7253: && (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) 7254: nonzero = (~ nonzero) & GET_MODE_MASK (mode); 1.1.1.4 root 7255: 1.1.1.5 root 7256: return (nonzero == 0 ? bitwidth : bitwidth - floor_log2 (nonzero) - 1); 1.1.1.4 root 7257: 7258: case SUBREG: 7259: /* If this is a SUBREG for a promoted object that is sign-extended 7260: and we are looking at it in a wider mode, we know that at least the 7261: high-order bits are known to be sign bit copies. */ 7262: 7263: if (SUBREG_PROMOTED_VAR_P (x) && ! SUBREG_PROMOTED_UNSIGNED_P (x)) 1.1.1.5 root 7264: return MAX (bitwidth - GET_MODE_BITSIZE (GET_MODE (x)) + 1, 7265: num_sign_bit_copies (SUBREG_REG (x), mode)); 1.1.1.4 root 7266: 7267: /* For a smaller object, just ignore the high bits. */ 7268: if (bitwidth <= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x)))) 7269: { 7270: num0 = num_sign_bit_copies (SUBREG_REG (x), VOIDmode); 7271: return MAX (1, (num0 7272: - (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (x))) 7273: - bitwidth))); 7274: } 7275: 1.1.1.6 root 7276: #ifdef WORD_REGISTER_OPERATIONS 1.1.1.8 ! root 7277: #ifdef LOAD_EXTEND_OP 1.1.1.6 root 7278: /* For paradoxical SUBREGs on machines where all register operations 7279: affect the entire register, just look inside. Note that we are 7280: passing MODE to the recursive call, so the number of sign bit copies 7281: will remain relative to that mode, not the inner mode. */ 1.1.1.4 root 7282: 1.1.1.8 ! root 7283: /* This works only if loads sign extend. Otherwise, if we get a ! 7284: reload for the inner part, it may be loaded from the stack, and ! 7285: then we lose all sign bit copies that existed before the store ! 7286: to the stack. */ ! 7287: ! 7288: if ((GET_MODE_SIZE (GET_MODE (x)) ! 7289: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 7290: && LOAD_EXTEND_OP (GET_MODE (SUBREG_REG (x))) == SIGN_EXTEND) 1.1.1.4 root 7291: return num_sign_bit_copies (SUBREG_REG (x), mode); 7292: #endif 1.1.1.8 ! root 7293: #endif 1.1.1.4 root 7294: break; 7295: 7296: case SIGN_EXTRACT: 7297: if (GET_CODE (XEXP (x, 1)) == CONST_INT) 7298: return MAX (1, bitwidth - INTVAL (XEXP (x, 1))); 7299: break; 7300: 7301: case SIGN_EXTEND: 7302: return (bitwidth - GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) 7303: + num_sign_bit_copies (XEXP (x, 0), VOIDmode)); 7304: 7305: case TRUNCATE: 7306: /* For a smaller object, just ignore the high bits. */ 7307: num0 = num_sign_bit_copies (XEXP (x, 0), VOIDmode); 7308: return MAX (1, (num0 - (GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) 7309: - bitwidth))); 7310: 7311: case NOT: 7312: return num_sign_bit_copies (XEXP (x, 0), mode); 7313: 7314: case ROTATE: case ROTATERT: 7315: /* If we are rotating left by a number of bits less than the number 7316: of sign bit copies, we can just subtract that amount from the 7317: number. */ 7318: if (GET_CODE (XEXP (x, 1)) == CONST_INT 7319: && INTVAL (XEXP (x, 1)) >= 0 && INTVAL (XEXP (x, 1)) < bitwidth) 7320: { 7321: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7322: return MAX (1, num0 - (code == ROTATE ? INTVAL (XEXP (x, 1)) 7323: : bitwidth - INTVAL (XEXP (x, 1)))); 7324: } 7325: break; 7326: 7327: case NEG: 7328: /* In general, this subtracts one sign bit copy. But if the value 7329: is known to be positive, the number of sign bit copies is the 1.1.1.5 root 7330: same as that of the input. Finally, if the input has just one bit 7331: that might be nonzero, all the bits are copies of the sign bit. */ 7332: nonzero = nonzero_bits (XEXP (x, 0), mode); 7333: if (nonzero == 1) 1.1.1.4 root 7334: return bitwidth; 7335: 7336: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7337: if (num0 > 1 7338: && bitwidth <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 7339: && (((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero)) 1.1.1.4 root 7340: num0--; 7341: 7342: return num0; 7343: 7344: case IOR: case AND: case XOR: 7345: case SMIN: case SMAX: case UMIN: case UMAX: 7346: /* Logical operations will preserve the number of sign-bit copies. 7347: MIN and MAX operations always return one of the operands. */ 7348: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7349: num1 = num_sign_bit_copies (XEXP (x, 1), mode); 7350: return MIN (num0, num1); 7351: 7352: case PLUS: case MINUS: 7353: /* For addition and subtraction, we can have a 1-bit carry. However, 7354: if we are subtracting 1 from a positive number, there will not 7355: be such a carry. Furthermore, if the positive number is known to 7356: be 0 or 1, we know the result is either -1 or 0. */ 7357: 7358: if (code == PLUS && XEXP (x, 1) == constm1_rtx 1.1.1.5 root 7359: && bitwidth <= HOST_BITS_PER_WIDE_INT) 7360: { 7361: nonzero = nonzero_bits (XEXP (x, 0), mode); 7362: if ((((HOST_WIDE_INT) 1 << (bitwidth - 1)) & nonzero) == 0) 7363: return (nonzero == 1 || nonzero == 0 ? bitwidth 7364: : bitwidth - floor_log2 (nonzero) - 1); 1.1.1.4 root 7365: } 7366: 7367: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7368: num1 = num_sign_bit_copies (XEXP (x, 1), mode); 7369: return MAX (1, MIN (num0, num1) - 1); 7370: 7371: case MULT: 7372: /* The number of bits of the product is the sum of the number of 7373: bits of both terms. However, unless one of the terms if known 7374: to be positive, we must allow for an additional bit since negating 7375: a negative number can remove one sign bit copy. */ 7376: 7377: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7378: num1 = num_sign_bit_copies (XEXP (x, 1), mode); 7379: 7380: result = bitwidth - (bitwidth - num0) - (bitwidth - num1); 7381: if (result > 0 1.1.1.5 root 7382: && bitwidth <= HOST_BITS_PER_WIDE_INT 7383: && ((nonzero_bits (XEXP (x, 0), mode) 1.1.1.4 root 7384: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) 1.1.1.5 root 7385: && (nonzero_bits (XEXP (x, 1), mode) 1.1.1.4 root 7386: & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) != 0)) 7387: result--; 7388: 7389: return MAX (1, result); 7390: 7391: case UDIV: 7392: /* The result must be <= the first operand. */ 7393: return num_sign_bit_copies (XEXP (x, 0), mode); 7394: 7395: case UMOD: 7396: /* The result must be <= the scond operand. */ 7397: return num_sign_bit_copies (XEXP (x, 1), mode); 7398: 7399: case DIV: 7400: /* Similar to unsigned division, except that we have to worry about 7401: the case where the divisor is negative, in which case we have 7402: to add 1. */ 7403: result = num_sign_bit_copies (XEXP (x, 0), mode); 7404: if (result > 1 7405: && bitwidth <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 7406: && (nonzero_bits (XEXP (x, 1), mode) 1.1.1.4 root 7407: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) 7408: result --; 7409: 7410: return result; 7411: 7412: case MOD: 7413: result = num_sign_bit_copies (XEXP (x, 1), mode); 7414: if (result > 1 7415: && bitwidth <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 7416: && (nonzero_bits (XEXP (x, 1), mode) 1.1.1.4 root 7417: & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) 7418: result --; 7419: 7420: return result; 7421: 7422: case ASHIFTRT: 7423: /* Shifts by a constant add to the number of bits equal to the 7424: sign bit. */ 7425: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7426: if (GET_CODE (XEXP (x, 1)) == CONST_INT 7427: && INTVAL (XEXP (x, 1)) > 0) 7428: num0 = MIN (bitwidth, num0 + INTVAL (XEXP (x, 1))); 7429: 7430: return num0; 7431: 7432: case ASHIFT: 7433: /* Left shifts destroy copies. */ 7434: if (GET_CODE (XEXP (x, 1)) != CONST_INT 7435: || INTVAL (XEXP (x, 1)) < 0 7436: || INTVAL (XEXP (x, 1)) >= bitwidth) 7437: return 1; 7438: 7439: num0 = num_sign_bit_copies (XEXP (x, 0), mode); 7440: return MAX (1, num0 - INTVAL (XEXP (x, 1))); 7441: 7442: case IF_THEN_ELSE: 7443: num0 = num_sign_bit_copies (XEXP (x, 1), mode); 7444: num1 = num_sign_bit_copies (XEXP (x, 2), mode); 7445: return MIN (num0, num1); 7446: 7447: #if STORE_FLAG_VALUE == -1 7448: case EQ: case NE: case GE: case GT: case LE: case LT: 7449: case GEU: case GTU: case LEU: case LTU: 7450: return bitwidth; 7451: #endif 7452: } 7453: 7454: /* If we haven't been able to figure it out by one of the above rules, 7455: see if some of the high-order bits are known to be zero. If so, 7456: count those bits and return one less than that amount. If we can't 7457: safely compute the mask for this mode, always return BITWIDTH. */ 7458: 7459: if (bitwidth > HOST_BITS_PER_WIDE_INT) 7460: return 1; 7461: 1.1.1.5 root 7462: nonzero = nonzero_bits (x, mode); 7463: return (nonzero & ((HOST_WIDE_INT) 1 << (bitwidth - 1)) 7464: ? 1 : bitwidth - floor_log2 (nonzero) - 1); 1.1.1.4 root 7465: } 7466: 7467: /* Return the number of "extended" bits there are in X, when interpreted 7468: as a quantity in MODE whose signedness is indicated by UNSIGNEDP. For 7469: unsigned quantities, this is the number of high-order zero bits. 7470: For signed quantities, this is the number of copies of the sign bit 7471: minus 1. In both case, this function returns the number of "spare" 7472: bits. For example, if two quantities for which this function returns 7473: at least 1 are added, the addition is known not to overflow. 7474: 7475: This function will always return 0 unless called during combine, which 7476: implies that it must be called from a define_split. */ 7477: 7478: int 7479: extended_count (x, mode, unsignedp) 7480: rtx x; 7481: enum machine_mode mode; 7482: int unsignedp; 7483: { 1.1.1.5 root 7484: if (nonzero_sign_valid == 0) 1.1.1.4 root 7485: return 0; 7486: 7487: return (unsignedp 7488: ? (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT 7489: && (GET_MODE_BITSIZE (mode) - 1 1.1.1.5 root 7490: - floor_log2 (nonzero_bits (x, mode)))) 1.1.1.4 root 7491: : num_sign_bit_copies (x, mode) - 1); 7492: } 7493: 1.1 root 7494: /* This function is called from `simplify_shift_const' to merge two 7495: outer operations. Specifically, we have already found that we need 7496: to perform operation *POP0 with constant *PCONST0 at the outermost 7497: position. We would now like to also perform OP1 with constant CONST1 7498: (with *POP0 being done last). 7499: 7500: Return 1 if we can do the operation and update *POP0 and *PCONST0 with 7501: the resulting operation. *PCOMP_P is set to 1 if we would need to 7502: complement the innermost operand, otherwise it is unchanged. 7503: 7504: MODE is the mode in which the operation will be done. No bits outside 7505: the width of this mode matter. It is assumed that the width of this mode 1.1.1.4 root 7506: is smaller than or equal to HOST_BITS_PER_WIDE_INT. 1.1 root 7507: 7508: If *POP0 or OP1 are NIL, it means no operation is required. Only NEG, PLUS, 7509: IOR, XOR, and AND are supported. We may set *POP0 to SET if the proper 7510: result is simply *PCONST0. 7511: 7512: If the resulting operation cannot be expressed as one operation, we 7513: return 0 and do not change *POP0, *PCONST0, and *PCOMP_P. */ 7514: 7515: static int 7516: merge_outer_ops (pop0, pconst0, op1, const1, mode, pcomp_p) 7517: enum rtx_code *pop0; 1.1.1.4 root 7518: HOST_WIDE_INT *pconst0; 1.1 root 7519: enum rtx_code op1; 1.1.1.4 root 7520: HOST_WIDE_INT const1; 1.1 root 7521: enum machine_mode mode; 7522: int *pcomp_p; 7523: { 7524: enum rtx_code op0 = *pop0; 1.1.1.4 root 7525: HOST_WIDE_INT const0 = *pconst0; 1.1.1.8 ! root 7526: int width = GET_MODE_BITSIZE (mode); 1.1 root 7527: 7528: const0 &= GET_MODE_MASK (mode); 7529: const1 &= GET_MODE_MASK (mode); 7530: 7531: /* If OP0 is an AND, clear unimportant bits in CONST1. */ 7532: if (op0 == AND) 7533: const1 &= const0; 7534: 7535: /* If OP0 or OP1 is NIL, this is easy. Similarly if they are the same or 7536: if OP0 is SET. */ 7537: 7538: if (op1 == NIL || op0 == SET) 7539: return 1; 7540: 7541: else if (op0 == NIL) 7542: op0 = op1, const0 = const1; 7543: 7544: else if (op0 == op1) 7545: { 7546: switch (op0) 7547: { 7548: case AND: 7549: const0 &= const1; 7550: break; 7551: case IOR: 7552: const0 |= const1; 7553: break; 7554: case XOR: 7555: const0 ^= const1; 7556: break; 7557: case PLUS: 7558: const0 += const1; 7559: break; 7560: case NEG: 7561: op0 = NIL; 7562: break; 7563: } 7564: } 7565: 7566: /* Otherwise, if either is a PLUS or NEG, we can't do anything. */ 7567: else if (op0 == PLUS || op1 == PLUS || op0 == NEG || op1 == NEG) 7568: return 0; 7569: 7570: /* If the two constants aren't the same, we can't do anything. The 7571: remaining six cases can all be done. */ 7572: else if (const0 != const1) 7573: return 0; 7574: 7575: else 7576: switch (op0) 7577: { 7578: case IOR: 7579: if (op1 == AND) 7580: /* (a & b) | b == b */ 7581: op0 = SET; 7582: else /* op1 == XOR */ 7583: /* (a ^ b) | b == a | b */ 7584: ; 7585: break; 7586: 7587: case XOR: 7588: if (op1 == AND) 7589: /* (a & b) ^ b == (~a) & b */ 7590: op0 = AND, *pcomp_p = 1; 7591: else /* op1 == IOR */ 7592: /* (a | b) ^ b == a & ~b */ 7593: op0 = AND, *pconst0 = ~ const0; 7594: break; 7595: 7596: case AND: 7597: if (op1 == IOR) 7598: /* (a | b) & b == b */ 7599: op0 = SET; 7600: else /* op1 == XOR */ 7601: /* (a ^ b) & b) == (~a) & b */ 7602: *pcomp_p = 1; 7603: break; 7604: } 7605: 7606: /* Check for NO-OP cases. */ 7607: const0 &= GET_MODE_MASK (mode); 7608: if (const0 == 0 7609: && (op0 == IOR || op0 == XOR || op0 == PLUS)) 7610: op0 = NIL; 7611: else if (const0 == 0 && op0 == AND) 7612: op0 = SET; 7613: else if (const0 == GET_MODE_MASK (mode) && op0 == AND) 7614: op0 = NIL; 7615: 1.1.1.8 ! root 7616: /* If this would be an entire word for the target, but is not for ! 7617: the host, then sign-extend on the host so that the number will look ! 7618: the same way on the host that it would on the target. ! 7619: ! 7620: For example, when building a 64 bit alpha hosted 32 bit sparc ! 7621: targeted compiler, then we want the 32 bit unsigned value -1 to be ! 7622: represented as a 64 bit value -1, and not as 0x00000000ffffffff. ! 7623: The later confuses the sparc backend. */ ! 7624: ! 7625: if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width ! 7626: && (const0 & ((HOST_WIDE_INT) 1 << (width - 1)))) ! 7627: const0 |= ((HOST_WIDE_INT) (-1) << width); ! 7628: 1.1 root 7629: *pop0 = op0; 7630: *pconst0 = const0; 7631: 7632: return 1; 7633: } 7634: 7635: /* Simplify a shift of VAROP by COUNT bits. CODE says what kind of shift. 7636: The result of the shift is RESULT_MODE. X, if non-zero, is an expression 7637: that we started with. 7638: 7639: The shift is normally computed in the widest mode we find in VAROP, as 7640: long as it isn't a different number of words than RESULT_MODE. Exceptions 7641: are ASHIFTRT and ROTATE, which are always done in their original mode, */ 7642: 7643: static rtx 7644: simplify_shift_const (x, code, result_mode, varop, count) 7645: rtx x; 7646: enum rtx_code code; 7647: enum machine_mode result_mode; 7648: rtx varop; 7649: int count; 7650: { 7651: enum rtx_code orig_code = code; 7652: int orig_count = count; 7653: enum machine_mode mode = result_mode; 7654: enum machine_mode shift_mode, tmode; 7655: int mode_words 7656: = (GET_MODE_SIZE (mode) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD; 7657: /* We form (outer_op (code varop count) (outer_const)). */ 7658: enum rtx_code outer_op = NIL; 1.1.1.6 root 7659: HOST_WIDE_INT outer_const = 0; 1.1 root 7660: rtx const_rtx; 7661: int complement_p = 0; 7662: rtx new; 7663: 7664: /* If we were given an invalid count, don't do anything except exactly 7665: what was requested. */ 7666: 7667: if (count < 0 || count > GET_MODE_BITSIZE (mode)) 7668: { 7669: if (x) 7670: return x; 7671: 1.1.1.4 root 7672: return gen_rtx (code, mode, varop, GEN_INT (count)); 1.1 root 7673: } 7674: 7675: /* Unless one of the branches of the `if' in this loop does a `continue', 7676: we will `break' the loop after the `if'. */ 7677: 7678: while (count != 0) 7679: { 7680: /* If we have an operand of (clobber (const_int 0)), just return that 7681: value. */ 7682: if (GET_CODE (varop) == CLOBBER) 7683: return varop; 7684: 7685: /* If we discovered we had to complement VAROP, leave. Making a NOT 7686: here would cause an infinite loop. */ 7687: if (complement_p) 7688: break; 7689: 1.1.1.8 ! root 7690: /* Convert ROTATERT to ROTATE. */ 1.1 root 7691: if (code == ROTATERT) 7692: code = ROTATE, count = GET_MODE_BITSIZE (result_mode) - count; 7693: 7694: /* We need to determine what mode we will do the shift in. If the 1.1.1.8 ! root 7695: shift is a right shift or a ROTATE, we must always do it in the mode ! 7696: it was originally done in. Otherwise, we can do it in MODE, the ! 7697: widest mode encountered. */ ! 7698: shift_mode ! 7699: = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE ! 7700: ? result_mode : mode); 1.1 root 7701: 7702: /* Handle cases where the count is greater than the size of the mode 7703: minus 1. For ASHIFT, use the size minus one as the count (this can 7704: occur when simplifying (lshiftrt (ashiftrt ..))). For rotates, 7705: take the count modulo the size. For other shifts, the result is 7706: zero. 7707: 7708: Since these shifts are being produced by the compiler by combining 7709: multiple operations, each of which are defined, we know what the 7710: result is supposed to be. */ 7711: 7712: if (count > GET_MODE_BITSIZE (shift_mode) - 1) 7713: { 7714: if (code == ASHIFTRT) 7715: count = GET_MODE_BITSIZE (shift_mode) - 1; 7716: else if (code == ROTATE || code == ROTATERT) 7717: count %= GET_MODE_BITSIZE (shift_mode); 7718: else 7719: { 7720: /* We can't simply return zero because there may be an 7721: outer op. */ 7722: varop = const0_rtx; 7723: count = 0; 7724: break; 7725: } 7726: } 7727: 7728: /* Negative counts are invalid and should not have been made (a 7729: programmer-specified negative count should have been handled 7730: above). */ 7731: else if (count < 0) 7732: abort (); 7733: 1.1.1.4 root 7734: /* An arithmetic right shift of a quantity known to be -1 or 0 7735: is a no-op. */ 7736: if (code == ASHIFTRT 7737: && (num_sign_bit_copies (varop, shift_mode) 7738: == GET_MODE_BITSIZE (shift_mode))) 7739: { 7740: count = 0; 7741: break; 7742: } 7743: 1.1.1.5 root 7744: /* If we are doing an arithmetic right shift and discarding all but 7745: the sign bit copies, this is equivalent to doing a shift by the 7746: bitsize minus one. Convert it into that shift because it will often 7747: allow other simplifications. */ 7748: 7749: if (code == ASHIFTRT 7750: && (count + num_sign_bit_copies (varop, shift_mode) 7751: >= GET_MODE_BITSIZE (shift_mode))) 7752: count = GET_MODE_BITSIZE (shift_mode) - 1; 7753: 1.1 root 7754: /* We simplify the tests below and elsewhere by converting 7755: ASHIFTRT to LSHIFTRT if we know the sign bit is clear. 7756: `make_compound_operation' will convert it to a ASHIFTRT for 7757: those machines (such as Vax) that don't have a LSHIFTRT. */ 1.1.1.4 root 7758: if (GET_MODE_BITSIZE (shift_mode) <= HOST_BITS_PER_WIDE_INT 1.1 root 7759: && code == ASHIFTRT 1.1.1.5 root 7760: && ((nonzero_bits (varop, shift_mode) 1.1.1.4 root 7761: & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (shift_mode) - 1))) 7762: == 0)) 1.1 root 7763: code = LSHIFTRT; 7764: 7765: switch (GET_CODE (varop)) 7766: { 7767: case SIGN_EXTEND: 7768: case ZERO_EXTEND: 7769: case SIGN_EXTRACT: 7770: case ZERO_EXTRACT: 7771: new = expand_compound_operation (varop); 7772: if (new != varop) 7773: { 7774: varop = new; 7775: continue; 7776: } 7777: break; 7778: 7779: case MEM: 7780: /* If we have (xshiftrt (mem ...) C) and C is MODE_WIDTH 7781: minus the width of a smaller mode, we can do this with a 7782: SIGN_EXTEND or ZERO_EXTEND from the narrower memory location. */ 7783: if ((code == ASHIFTRT || code == LSHIFTRT) 7784: && ! mode_dependent_address_p (XEXP (varop, 0)) 7785: && ! MEM_VOLATILE_P (varop) 7786: && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count, 7787: MODE_INT, 1)) != BLKmode) 7788: { 1.1.1.8 ! root 7789: if (BYTES_BIG_ENDIAN) ! 7790: new = gen_rtx (MEM, tmode, XEXP (varop, 0)); ! 7791: else ! 7792: new = gen_rtx (MEM, tmode, ! 7793: plus_constant (XEXP (varop, 0), ! 7794: count / BITS_PER_UNIT)); 1.1 root 7795: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (varop); 7796: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (varop); 7797: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (varop); 7798: varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND 7799: : ZERO_EXTEND, mode, new); 7800: count = 0; 7801: continue; 7802: } 7803: break; 7804: 7805: case USE: 7806: /* Similar to the case above, except that we can only do this if 7807: the resulting mode is the same as that of the underlying 7808: MEM and adjust the address depending on the *bits* endianness 7809: because of the way that bit-field extract insns are defined. */ 7810: if ((code == ASHIFTRT || code == LSHIFTRT) 7811: && (tmode = mode_for_size (GET_MODE_BITSIZE (mode) - count, 7812: MODE_INT, 1)) != BLKmode 7813: && tmode == GET_MODE (XEXP (varop, 0))) 7814: { 1.1.1.8 ! root 7815: if (BITS_BIG_ENDIAN) ! 7816: new = XEXP (varop, 0); ! 7817: else ! 7818: { ! 7819: new = copy_rtx (XEXP (varop, 0)); ! 7820: SUBST (XEXP (new, 0), ! 7821: plus_constant (XEXP (new, 0), ! 7822: count / BITS_PER_UNIT)); ! 7823: } 1.1 root 7824: 7825: varop = gen_rtx_combine (code == ASHIFTRT ? SIGN_EXTEND 7826: : ZERO_EXTEND, mode, new); 7827: count = 0; 7828: continue; 7829: } 7830: break; 7831: 7832: case SUBREG: 7833: /* If VAROP is a SUBREG, strip it as long as the inner operand has 7834: the same number of words as what we've seen so far. Then store 7835: the widest mode in MODE. */ 1.1.1.4 root 7836: if (subreg_lowpart_p (varop) 7837: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))) 7838: > GET_MODE_SIZE (GET_MODE (varop))) 1.1 root 7839: && (((GET_MODE_SIZE (GET_MODE (SUBREG_REG (varop))) 7840: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD) 7841: == mode_words)) 7842: { 7843: varop = SUBREG_REG (varop); 7844: if (GET_MODE_SIZE (GET_MODE (varop)) > GET_MODE_SIZE (mode)) 7845: mode = GET_MODE (varop); 7846: continue; 7847: } 7848: break; 7849: 7850: case MULT: 7851: /* Some machines use MULT instead of ASHIFT because MULT 7852: is cheaper. But it is still better on those machines to 7853: merge two shifts into one. */ 7854: if (GET_CODE (XEXP (varop, 1)) == CONST_INT 7855: && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0) 7856: { 7857: varop = gen_binary (ASHIFT, GET_MODE (varop), XEXP (varop, 0), 1.1.1.4 root 7858: GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1)))));; 1.1 root 7859: continue; 7860: } 7861: break; 7862: 7863: case UDIV: 7864: /* Similar, for when divides are cheaper. */ 7865: if (GET_CODE (XEXP (varop, 1)) == CONST_INT 7866: && exact_log2 (INTVAL (XEXP (varop, 1))) >= 0) 7867: { 7868: varop = gen_binary (LSHIFTRT, GET_MODE (varop), XEXP (varop, 0), 1.1.1.4 root 7869: GEN_INT (exact_log2 (INTVAL (XEXP (varop, 1))))); 1.1 root 7870: continue; 7871: } 7872: break; 7873: 7874: case ASHIFTRT: 7875: /* If we are extracting just the sign bit of an arithmetic right 7876: shift, that shift is not needed. */ 7877: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1) 7878: { 7879: varop = XEXP (varop, 0); 7880: continue; 7881: } 7882: 7883: /* ... fall through ... */ 7884: 7885: case LSHIFTRT: 7886: case ASHIFT: 7887: case ROTATE: 7888: /* Here we have two nested shifts. The result is usually the 7889: AND of a new shift with a mask. We compute the result below. */ 7890: if (GET_CODE (XEXP (varop, 1)) == CONST_INT 7891: && INTVAL (XEXP (varop, 1)) >= 0 7892: && INTVAL (XEXP (varop, 1)) < GET_MODE_BITSIZE (GET_MODE (varop)) 1.1.1.4 root 7893: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT 7894: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) 1.1 root 7895: { 7896: enum rtx_code first_code = GET_CODE (varop); 7897: int first_count = INTVAL (XEXP (varop, 1)); 1.1.1.4 root 7898: unsigned HOST_WIDE_INT mask; 1.1 root 7899: rtx mask_rtx; 7900: 7901: /* We have one common special case. We can't do any merging if 7902: the inner code is an ASHIFTRT of a smaller mode. However, if 7903: we have (ashift:M1 (subreg:M1 (ashiftrt:M2 FOO C1) 0) C2) 7904: with C2 == GET_MODE_BITSIZE (M1) - GET_MODE_BITSIZE (M2), 7905: we can convert it to 7906: (ashiftrt:M1 (ashift:M1 (and:M1 (subreg:M1 FOO 0 C2) C3) C1). 7907: This simplifies certain SIGN_EXTEND operations. */ 7908: if (code == ASHIFT && first_code == ASHIFTRT 7909: && (GET_MODE_BITSIZE (result_mode) 7910: - GET_MODE_BITSIZE (GET_MODE (varop))) == count) 7911: { 7912: /* C3 has the low-order C1 bits zero. */ 7913: 1.1.1.4 root 7914: mask = (GET_MODE_MASK (mode) 7915: & ~ (((HOST_WIDE_INT) 1 << first_count) - 1)); 1.1 root 7916: 1.1.1.4 root 7917: varop = simplify_and_const_int (NULL_RTX, result_mode, 1.1 root 7918: XEXP (varop, 0), mask); 1.1.1.4 root 7919: varop = simplify_shift_const (NULL_RTX, ASHIFT, result_mode, 1.1 root 7920: varop, count); 7921: count = first_count; 7922: code = ASHIFTRT; 7923: continue; 7924: } 7925: 1.1.1.4 root 7926: /* If this was (ashiftrt (ashift foo C1) C2) and FOO has more 7927: than C1 high-order bits equal to the sign bit, we can convert 7928: this to either an ASHIFT or a ASHIFTRT depending on the 7929: two counts. 1.1 root 7930: 7931: We cannot do this if VAROP's mode is not SHIFT_MODE. */ 7932: 7933: if (code == ASHIFTRT && first_code == ASHIFT 7934: && GET_MODE (varop) == shift_mode 1.1.1.4 root 7935: && (num_sign_bit_copies (XEXP (varop, 0), shift_mode) 7936: > first_count)) 1.1 root 7937: { 1.1.1.4 root 7938: count -= first_count; 7939: if (count < 0) 7940: count = - count, code = ASHIFT; 7941: varop = XEXP (varop, 0); 7942: continue; 1.1 root 7943: } 7944: 7945: /* There are some cases we can't do. If CODE is ASHIFTRT, 7946: we can only do this if FIRST_CODE is also ASHIFTRT. 7947: 7948: We can't do the case when CODE is ROTATE and FIRST_CODE is 7949: ASHIFTRT. 7950: 7951: If the mode of this shift is not the mode of the outer shift, 1.1.1.8 ! root 7952: we can't do this if either shift is a right shift or ROTATE. 1.1 root 7953: 7954: Finally, we can't do any of these if the mode is too wide 7955: unless the codes are the same. 7956: 7957: Handle the case where the shift codes are the same 7958: first. */ 7959: 7960: if (code == first_code) 7961: { 7962: if (GET_MODE (varop) != result_mode 1.1.1.8 ! root 7963: && (code == ASHIFTRT || code == LSHIFTRT ! 7964: || code == ROTATE)) 1.1 root 7965: break; 7966: 7967: count += first_count; 7968: varop = XEXP (varop, 0); 7969: continue; 7970: } 7971: 7972: if (code == ASHIFTRT 7973: || (code == ROTATE && first_code == ASHIFTRT) 1.1.1.4 root 7974: || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT 1.1 root 7975: || (GET_MODE (varop) != result_mode 1.1.1.8 ! root 7976: && (first_code == ASHIFTRT || first_code == LSHIFTRT ! 7977: || first_code == ROTATE 1.1 root 7978: || code == ROTATE))) 7979: break; 7980: 7981: /* To compute the mask to apply after the shift, shift the 1.1.1.5 root 7982: nonzero bits of the inner shift the same way the 1.1 root 7983: outer shift will. */ 7984: 1.1.1.5 root 7985: mask_rtx = GEN_INT (nonzero_bits (varop, GET_MODE (varop))); 1.1 root 7986: 7987: mask_rtx 7988: = simplify_binary_operation (code, result_mode, mask_rtx, 1.1.1.4 root 7989: GEN_INT (count)); 1.1 root 7990: 7991: /* Give up if we can't compute an outer operation to use. */ 7992: if (mask_rtx == 0 7993: || GET_CODE (mask_rtx) != CONST_INT 7994: || ! merge_outer_ops (&outer_op, &outer_const, AND, 7995: INTVAL (mask_rtx), 7996: result_mode, &complement_p)) 7997: break; 7998: 7999: /* If the shifts are in the same direction, we add the 8000: counts. Otherwise, we subtract them. */ 8001: if ((code == ASHIFTRT || code == LSHIFTRT) 8002: == (first_code == ASHIFTRT || first_code == LSHIFTRT)) 8003: count += first_count; 8004: else 8005: count -= first_count; 8006: 8007: /* If COUNT is positive, the new shift is usually CODE, 8008: except for the two exceptions below, in which case it is 8009: FIRST_CODE. If the count is negative, FIRST_CODE should 8010: always be used */ 8011: if (count > 0 8012: && ((first_code == ROTATE && code == ASHIFT) 8013: || (first_code == ASHIFTRT && code == LSHIFTRT))) 8014: code = first_code; 8015: else if (count < 0) 8016: code = first_code, count = - count; 8017: 8018: varop = XEXP (varop, 0); 8019: continue; 8020: } 8021: 8022: /* If we have (A << B << C) for any shift, we can convert this to 8023: (A << C << B). This wins if A is a constant. Only try this if 8024: B is not a constant. */ 8025: 8026: else if (GET_CODE (varop) == code 8027: && GET_CODE (XEXP (varop, 1)) != CONST_INT 8028: && 0 != (new 8029: = simplify_binary_operation (code, mode, 8030: XEXP (varop, 0), 1.1.1.4 root 8031: GEN_INT (count)))) 1.1 root 8032: { 8033: varop = gen_rtx_combine (code, mode, new, XEXP (varop, 1)); 8034: count = 0; 8035: continue; 8036: } 8037: break; 8038: 8039: case NOT: 8040: /* Make this fit the case below. */ 8041: varop = gen_rtx_combine (XOR, mode, XEXP (varop, 0), 1.1.1.4 root 8042: GEN_INT (GET_MODE_MASK (mode))); 1.1 root 8043: continue; 8044: 8045: case IOR: 8046: case AND: 8047: case XOR: 8048: /* If we have (xshiftrt (ior (plus X (const_int -1)) X) C) 8049: with C the size of VAROP - 1 and the shift is logical if 8050: STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1, 8051: we have an (le X 0) operation. If we have an arithmetic shift 8052: and STORE_FLAG_VALUE is 1 or we have a logical shift with 8053: STORE_FLAG_VALUE of -1, we have a (neg (le X 0)) operation. */ 8054: 8055: if (GET_CODE (varop) == IOR && GET_CODE (XEXP (varop, 0)) == PLUS 8056: && XEXP (XEXP (varop, 0), 1) == constm1_rtx 8057: && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1) 8058: && (code == LSHIFTRT || code == ASHIFTRT) 8059: && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1 8060: && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1))) 8061: { 8062: count = 0; 8063: varop = gen_rtx_combine (LE, GET_MODE (varop), XEXP (varop, 1), 8064: const0_rtx); 8065: 8066: if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT) 8067: varop = gen_rtx_combine (NEG, GET_MODE (varop), varop); 8068: 8069: continue; 8070: } 8071: 8072: /* If we have (shift (logical)), move the logical to the outside 8073: to allow it to possibly combine with another logical and the 8074: shift to combine with another shift. This also canonicalizes to 8075: what a ZERO_EXTRACT looks like. Also, some machines have 8076: (and (shift)) insns. */ 8077: 8078: if (GET_CODE (XEXP (varop, 1)) == CONST_INT 8079: && (new = simplify_binary_operation (code, result_mode, 8080: XEXP (varop, 1), 1.1.1.4 root 8081: GEN_INT (count))) != 0 1.1.1.7 root 8082: && GET_CODE(new) == CONST_INT 1.1 root 8083: && merge_outer_ops (&outer_op, &outer_const, GET_CODE (varop), 8084: INTVAL (new), result_mode, &complement_p)) 8085: { 8086: varop = XEXP (varop, 0); 8087: continue; 8088: } 8089: 8090: /* If we can't do that, try to simplify the shift in each arm of the 8091: logical expression, make a new logical expression, and apply 8092: the inverse distributive law. */ 8093: { 1.1.1.6 root 8094: rtx lhs = simplify_shift_const (NULL_RTX, code, shift_mode, 1.1 root 8095: XEXP (varop, 0), count); 1.1.1.6 root 8096: rtx rhs = simplify_shift_const (NULL_RTX, code, shift_mode, 1.1 root 8097: XEXP (varop, 1), count); 8098: 1.1.1.7 root 8099: varop = gen_binary (GET_CODE (varop), shift_mode, lhs, rhs); 1.1 root 8100: varop = apply_distributive_law (varop); 8101: 8102: count = 0; 8103: } 8104: break; 8105: 8106: case EQ: 1.1.1.7 root 8107: /* convert (lshiftrt (eq FOO 0) C) to (xor FOO 1) if STORE_FLAG_VALUE 1.1 root 8108: says that the sign bit can be tested, FOO has mode MODE, C is 1.1.1.7 root 8109: GET_MODE_BITSIZE (MODE) - 1, and FOO has only its low-order bit 8110: that may be nonzero. */ 8111: if (code == LSHIFTRT 1.1 root 8112: && XEXP (varop, 1) == const0_rtx 8113: && GET_MODE (XEXP (varop, 0)) == result_mode 8114: && count == GET_MODE_BITSIZE (result_mode) - 1 1.1.1.4 root 8115: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT 1.1 root 8116: && ((STORE_FLAG_VALUE 1.1.1.4 root 8117: & ((HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (result_mode) - 1)))) 1.1.1.5 root 8118: && nonzero_bits (XEXP (varop, 0), result_mode) == 1 1.1.1.4 root 8119: && merge_outer_ops (&outer_op, &outer_const, XOR, 8120: (HOST_WIDE_INT) 1, result_mode, 8121: &complement_p)) 1.1 root 8122: { 8123: varop = XEXP (varop, 0); 8124: count = 0; 8125: continue; 8126: } 8127: break; 8128: 8129: case NEG: 1.1.1.4 root 8130: /* (lshiftrt (neg A) C) where A is either 0 or 1 and C is one less 8131: than the number of bits in the mode is equivalent to A. */ 8132: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1 1.1.1.5 root 8133: && nonzero_bits (XEXP (varop, 0), result_mode) == 1) 1.1 root 8134: { 1.1.1.4 root 8135: varop = XEXP (varop, 0); 1.1 root 8136: count = 0; 8137: continue; 8138: } 8139: 8140: /* NEG commutes with ASHIFT since it is multiplication. Move the 8141: NEG outside to allow shifts to combine. */ 8142: if (code == ASHIFT 1.1.1.4 root 8143: && merge_outer_ops (&outer_op, &outer_const, NEG, 8144: (HOST_WIDE_INT) 0, result_mode, 8145: &complement_p)) 1.1 root 8146: { 8147: varop = XEXP (varop, 0); 8148: continue; 8149: } 8150: break; 8151: 8152: case PLUS: 1.1.1.4 root 8153: /* (lshiftrt (plus A -1) C) where A is either 0 or 1 and C 8154: is one less than the number of bits in the mode is 8155: equivalent to (xor A 1). */ 1.1 root 8156: if (code == LSHIFTRT && count == GET_MODE_BITSIZE (result_mode) - 1 8157: && XEXP (varop, 1) == constm1_rtx 1.1.1.5 root 8158: && nonzero_bits (XEXP (varop, 0), result_mode) == 1 1.1.1.4 root 8159: && merge_outer_ops (&outer_op, &outer_const, XOR, 8160: (HOST_WIDE_INT) 1, result_mode, 8161: &complement_p)) 1.1 root 8162: { 8163: count = 0; 8164: varop = XEXP (varop, 0); 8165: continue; 8166: } 8167: 1.1.1.3 root 8168: /* If we have (xshiftrt (plus FOO BAR) C), and the only bits 1.1.1.5 root 8169: that might be nonzero in BAR are those being shifted out and those 1.1.1.3 root 8170: bits are known zero in FOO, we can replace the PLUS with FOO. 8171: Similarly in the other operand order. This code occurs when 8172: we are computing the size of a variable-size array. */ 8173: 8174: if ((code == ASHIFTRT || code == LSHIFTRT) 1.1.1.4 root 8175: && count < HOST_BITS_PER_WIDE_INT 1.1.1.5 root 8176: && nonzero_bits (XEXP (varop, 1), result_mode) >> count == 0 8177: && (nonzero_bits (XEXP (varop, 1), result_mode) 8178: & nonzero_bits (XEXP (varop, 0), result_mode)) == 0) 1.1.1.3 root 8179: { 8180: varop = XEXP (varop, 0); 8181: continue; 8182: } 8183: else if ((code == ASHIFTRT || code == LSHIFTRT) 1.1.1.4 root 8184: && count < HOST_BITS_PER_WIDE_INT 8185: && GET_MODE_BITSIZE (result_mode) <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 8186: && 0 == (nonzero_bits (XEXP (varop, 0), result_mode) 1.1.1.3 root 8187: >> count) 1.1.1.5 root 8188: && 0 == (nonzero_bits (XEXP (varop, 0), result_mode) 8189: & nonzero_bits (XEXP (varop, 1), 1.1.1.3 root 8190: result_mode))) 8191: { 8192: varop = XEXP (varop, 1); 8193: continue; 8194: } 8195: 1.1 root 8196: /* (ashift (plus foo C) N) is (plus (ashift foo N) C'). */ 8197: if (code == ASHIFT 8198: && GET_CODE (XEXP (varop, 1)) == CONST_INT 8199: && (new = simplify_binary_operation (ASHIFT, result_mode, 8200: XEXP (varop, 1), 1.1.1.4 root 8201: GEN_INT (count))) != 0 1.1.1.7 root 8202: && GET_CODE(new) == CONST_INT 1.1 root 8203: && merge_outer_ops (&outer_op, &outer_const, PLUS, 8204: INTVAL (new), result_mode, &complement_p)) 8205: { 8206: varop = XEXP (varop, 0); 8207: continue; 8208: } 8209: break; 8210: 8211: case MINUS: 8212: /* If we have (xshiftrt (minus (ashiftrt X C)) X) C) 8213: with C the size of VAROP - 1 and the shift is logical if 8214: STORE_FLAG_VALUE is 1 and arithmetic if STORE_FLAG_VALUE is -1, 8215: we have a (gt X 0) operation. If the shift is arithmetic with 8216: STORE_FLAG_VALUE of 1 or logical with STORE_FLAG_VALUE == -1, 8217: we have a (neg (gt X 0)) operation. */ 8218: 8219: if (GET_CODE (XEXP (varop, 0)) == ASHIFTRT 8220: && count == GET_MODE_BITSIZE (GET_MODE (varop)) - 1 8221: && (STORE_FLAG_VALUE == 1 || STORE_FLAG_VALUE == -1) 8222: && (code == LSHIFTRT || code == ASHIFTRT) 8223: && GET_CODE (XEXP (XEXP (varop, 0), 1)) == CONST_INT 8224: && INTVAL (XEXP (XEXP (varop, 0), 1)) == count 8225: && rtx_equal_p (XEXP (XEXP (varop, 0), 0), XEXP (varop, 1))) 8226: { 8227: count = 0; 8228: varop = gen_rtx_combine (GT, GET_MODE (varop), XEXP (varop, 1), 8229: const0_rtx); 8230: 8231: if (STORE_FLAG_VALUE == 1 ? code == ASHIFTRT : code == LSHIFTRT) 8232: varop = gen_rtx_combine (NEG, GET_MODE (varop), varop); 8233: 8234: continue; 8235: } 8236: break; 8237: } 8238: 8239: break; 8240: } 8241: 8242: /* We need to determine what mode to do the shift in. If the shift is 1.1.1.8 ! root 8243: a right shift or ROTATE, we must always do it in the mode it was ! 8244: originally done in. Otherwise, we can do it in MODE, the widest mode ! 8245: encountered. The code we care about is that of the shift that will ! 8246: actually be done, not the shift that was originally requested. */ ! 8247: shift_mode ! 8248: = (code == ASHIFTRT || code == LSHIFTRT || code == ROTATE ! 8249: ? result_mode : mode); 1.1 root 8250: 8251: /* We have now finished analyzing the shift. The result should be 8252: a shift of type CODE with SHIFT_MODE shifting VAROP COUNT places. If 8253: OUTER_OP is non-NIL, it is an operation that needs to be applied 8254: to the result of the shift. OUTER_CONST is the relevant constant, 8255: but we must turn off all bits turned off in the shift. 8256: 8257: If we were passed a value for X, see if we can use any pieces of 8258: it. If not, make new rtx. */ 8259: 8260: if (x && GET_RTX_CLASS (GET_CODE (x)) == '2' 8261: && GET_CODE (XEXP (x, 1)) == CONST_INT 8262: && INTVAL (XEXP (x, 1)) == count) 8263: const_rtx = XEXP (x, 1); 8264: else 1.1.1.4 root 8265: const_rtx = GEN_INT (count); 1.1 root 8266: 8267: if (x && GET_CODE (XEXP (x, 0)) == SUBREG 8268: && GET_MODE (XEXP (x, 0)) == shift_mode 8269: && SUBREG_REG (XEXP (x, 0)) == varop) 8270: varop = XEXP (x, 0); 8271: else if (GET_MODE (varop) != shift_mode) 8272: varop = gen_lowpart_for_combine (shift_mode, varop); 8273: 8274: /* If we can't make the SUBREG, try to return what we were given. */ 8275: if (GET_CODE (varop) == CLOBBER) 8276: return x ? x : varop; 8277: 8278: new = simplify_binary_operation (code, shift_mode, varop, const_rtx); 8279: if (new != 0) 8280: x = new; 8281: else 8282: { 8283: if (x == 0 || GET_CODE (x) != code || GET_MODE (x) != shift_mode) 8284: x = gen_rtx_combine (code, shift_mode, varop, const_rtx); 8285: 8286: SUBST (XEXP (x, 0), varop); 8287: SUBST (XEXP (x, 1), const_rtx); 8288: } 8289: 1.1.1.6 root 8290: /* If we have an outer operation and we just made a shift, it is 8291: possible that we could have simplified the shift were it not 8292: for the outer operation. So try to do the simplification 8293: recursively. */ 8294: 8295: if (outer_op != NIL && GET_CODE (x) == code 8296: && GET_CODE (XEXP (x, 1)) == CONST_INT) 8297: x = simplify_shift_const (x, code, shift_mode, XEXP (x, 0), 8298: INTVAL (XEXP (x, 1))); 8299: 1.1 root 8300: /* If we were doing a LSHIFTRT in a wider mode than it was originally, 8301: turn off all the bits that the shift would have turned off. */ 8302: if (orig_code == LSHIFTRT && result_mode != shift_mode) 1.1.1.4 root 8303: x = simplify_and_const_int (NULL_RTX, shift_mode, x, 1.1 root 8304: GET_MODE_MASK (result_mode) >> orig_count); 8305: 8306: /* Do the remainder of the processing in RESULT_MODE. */ 8307: x = gen_lowpart_for_combine (result_mode, x); 8308: 8309: /* If COMPLEMENT_P is set, we have to complement X before doing the outer 8310: operation. */ 8311: if (complement_p) 1.1.1.7 root 8312: x = gen_unary (NOT, result_mode, result_mode, x); 1.1 root 8313: 8314: if (outer_op != NIL) 8315: { 1.1.1.4 root 8316: if (GET_MODE_BITSIZE (result_mode) < HOST_BITS_PER_WIDE_INT) 1.1.1.8 ! root 8317: { ! 8318: int width = GET_MODE_BITSIZE (result_mode); ! 8319: ! 8320: outer_const &= GET_MODE_MASK (result_mode); ! 8321: ! 8322: /* If this would be an entire word for the target, but is not for ! 8323: the host, then sign-extend on the host so that the number will ! 8324: look the same way on the host that it would on the target. ! 8325: ! 8326: For example, when building a 64 bit alpha hosted 32 bit sparc ! 8327: targeted compiler, then we want the 32 bit unsigned value -1 to be ! 8328: represented as a 64 bit value -1, and not as 0x00000000ffffffff. ! 8329: The later confuses the sparc backend. */ ! 8330: ! 8331: if (BITS_PER_WORD < HOST_BITS_PER_WIDE_INT && BITS_PER_WORD == width ! 8332: && (outer_const & ((HOST_WIDE_INT) 1 << (width - 1)))) ! 8333: outer_const |= ((HOST_WIDE_INT) (-1) << width); ! 8334: } 1.1 root 8335: 8336: if (outer_op == AND) 1.1.1.4 root 8337: x = simplify_and_const_int (NULL_RTX, result_mode, x, outer_const); 1.1 root 8338: else if (outer_op == SET) 8339: /* This means that we have determined that the result is 8340: equivalent to a constant. This should be rare. */ 1.1.1.4 root 8341: x = GEN_INT (outer_const); 1.1 root 8342: else if (GET_RTX_CLASS (outer_op) == '1') 1.1.1.7 root 8343: x = gen_unary (outer_op, result_mode, result_mode, x); 1.1 root 8344: else 1.1.1.4 root 8345: x = gen_binary (outer_op, result_mode, x, GEN_INT (outer_const)); 1.1 root 8346: } 8347: 8348: return x; 8349: } 8350: 8351: /* Like recog, but we receive the address of a pointer to a new pattern. 8352: We try to match the rtx that the pointer points to. 8353: If that fails, we may try to modify or replace the pattern, 8354: storing the replacement into the same pointer object. 8355: 8356: Modifications include deletion or addition of CLOBBERs. 8357: 8358: PNOTES is a pointer to a location where any REG_UNUSED notes added for 8359: the CLOBBERs are placed. 8360: 1.1.1.8 ! root 8361: PADDED_SCRATCHES is set to the number of (clobber (scratch)) patterns ! 8362: we had to add. ! 8363: 1.1 root 8364: The value is the final insn code from the pattern ultimately matched, 8365: or -1. */ 8366: 8367: static int 1.1.1.8 ! root 8368: recog_for_combine (pnewpat, insn, pnotes, padded_scratches) 1.1 root 8369: rtx *pnewpat; 8370: rtx insn; 8371: rtx *pnotes; 1.1.1.8 ! root 8372: int *padded_scratches; 1.1 root 8373: { 8374: register rtx pat = *pnewpat; 8375: int insn_code_number; 8376: int num_clobbers_to_add = 0; 8377: int i; 8378: rtx notes = 0; 8379: 1.1.1.8 ! root 8380: *padded_scratches = 0; ! 8381: 1.1.1.6 root 8382: /* If PAT is a PARALLEL, check to see if it contains the CLOBBER 8383: we use to indicate that something didn't match. If we find such a 8384: thing, force rejection. */ 8385: if (GET_CODE (pat) == PARALLEL) 8386: for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) 8387: if (GET_CODE (XVECEXP (pat, 0, i)) == CLOBBER 8388: && XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx) 8389: return -1; 8390: 1.1 root 8391: /* Is the result of combination a valid instruction? */ 8392: insn_code_number = recog (pat, insn, &num_clobbers_to_add); 8393: 8394: /* If it isn't, there is the possibility that we previously had an insn 8395: that clobbered some register as a side effect, but the combined 8396: insn doesn't need to do that. So try once more without the clobbers 8397: unless this represents an ASM insn. */ 8398: 8399: if (insn_code_number < 0 && ! check_asm_operands (pat) 8400: && GET_CODE (pat) == PARALLEL) 8401: { 8402: int pos; 8403: 8404: for (pos = 0, i = 0; i < XVECLEN (pat, 0); i++) 8405: if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER) 8406: { 8407: if (i != pos) 8408: SUBST (XVECEXP (pat, 0, pos), XVECEXP (pat, 0, i)); 8409: pos++; 8410: } 8411: 8412: SUBST_INT (XVECLEN (pat, 0), pos); 8413: 8414: if (pos == 1) 8415: pat = XVECEXP (pat, 0, 0); 8416: 8417: insn_code_number = recog (pat, insn, &num_clobbers_to_add); 8418: } 8419: 8420: /* If we had any clobbers to add, make a new pattern than contains 8421: them. Then check to make sure that all of them are dead. */ 8422: if (num_clobbers_to_add) 8423: { 8424: rtx newpat = gen_rtx (PARALLEL, VOIDmode, 8425: gen_rtvec (GET_CODE (pat) == PARALLEL 8426: ? XVECLEN (pat, 0) + num_clobbers_to_add 8427: : num_clobbers_to_add + 1)); 8428: 8429: if (GET_CODE (pat) == PARALLEL) 8430: for (i = 0; i < XVECLEN (pat, 0); i++) 8431: XVECEXP (newpat, 0, i) = XVECEXP (pat, 0, i); 8432: else 8433: XVECEXP (newpat, 0, 0) = pat; 8434: 8435: add_clobbers (newpat, insn_code_number); 8436: 8437: for (i = XVECLEN (newpat, 0) - num_clobbers_to_add; 8438: i < XVECLEN (newpat, 0); i++) 8439: { 8440: if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == REG 8441: && ! reg_dead_at_p (XEXP (XVECEXP (newpat, 0, i), 0), insn)) 8442: return -1; 1.1.1.8 ! root 8443: else if (GET_CODE (XEXP (XVECEXP (newpat, 0, i), 0)) == SCRATCH) ! 8444: (*padded_scratches)++; 1.1 root 8445: notes = gen_rtx (EXPR_LIST, REG_UNUSED, 8446: XEXP (XVECEXP (newpat, 0, i), 0), notes); 8447: } 8448: pat = newpat; 8449: } 8450: 8451: *pnewpat = pat; 8452: *pnotes = notes; 8453: 8454: return insn_code_number; 8455: } 8456: 8457: /* Like gen_lowpart but for use by combine. In combine it is not possible 8458: to create any new pseudoregs. However, it is safe to create 8459: invalid memory addresses, because combine will try to recognize 8460: them and all they will do is make the combine attempt fail. 8461: 8462: If for some reason this cannot do its job, an rtx 8463: (clobber (const_int 0)) is returned. 8464: An insn containing that will not be recognized. */ 8465: 8466: #undef gen_lowpart 8467: 8468: static rtx 8469: gen_lowpart_for_combine (mode, x) 8470: enum machine_mode mode; 8471: register rtx x; 8472: { 8473: rtx result; 8474: 8475: if (GET_MODE (x) == mode) 8476: return x; 8477: 1.1.1.5 root 8478: /* We can only support MODE being wider than a word if X is a 8479: constant integer or has a mode the same size. */ 8480: 8481: if (GET_MODE_SIZE (mode) > UNITS_PER_WORD 8482: && ! ((GET_MODE (x) == VOIDmode 8483: && (GET_CODE (x) == CONST_INT 8484: || GET_CODE (x) == CONST_DOUBLE)) 8485: || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode))) 1.1 root 8486: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); 8487: 8488: /* X might be a paradoxical (subreg (mem)). In that case, gen_lowpart 8489: won't know what to do. So we will strip off the SUBREG here and 8490: process normally. */ 8491: if (GET_CODE (x) == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM) 8492: { 8493: x = SUBREG_REG (x); 8494: if (GET_MODE (x) == mode) 8495: return x; 8496: } 8497: 8498: result = gen_lowpart_common (mode, x); 1.1.1.8 ! root 8499: if (result != 0 ! 8500: && GET_CODE (result) == SUBREG ! 8501: && GET_CODE (SUBREG_REG (result)) == REG ! 8502: && REGNO (SUBREG_REG (result)) >= FIRST_PSEUDO_REGISTER ! 8503: && (GET_MODE_SIZE (GET_MODE (result)) ! 8504: != GET_MODE_SIZE (GET_MODE (SUBREG_REG (result))))) ! 8505: reg_changes_size[REGNO (SUBREG_REG (result))] = 1; ! 8506: 1.1 root 8507: if (result) 8508: return result; 8509: 8510: if (GET_CODE (x) == MEM) 8511: { 8512: register int offset = 0; 8513: rtx new; 8514: 8515: /* Refuse to work on a volatile memory ref or one with a mode-dependent 8516: address. */ 8517: if (MEM_VOLATILE_P (x) || mode_dependent_address_p (XEXP (x, 0))) 8518: return gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); 8519: 8520: /* If we want to refer to something bigger than the original memref, 8521: generate a perverse subreg instead. That will force a reload 8522: of the original memref X. */ 8523: if (GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)) 8524: return gen_rtx (SUBREG, mode, x, 0); 8525: 1.1.1.8 ! root 8526: if (WORDS_BIG_ENDIAN) ! 8527: offset = (MAX (GET_MODE_SIZE (GET_MODE (x)), UNITS_PER_WORD) ! 8528: - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)); ! 8529: if (BYTES_BIG_ENDIAN) ! 8530: { ! 8531: /* Adjust the address so that the address-after-the-data is ! 8532: unchanged. */ ! 8533: offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)) ! 8534: - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (x)))); ! 8535: } 1.1 root 8536: new = gen_rtx (MEM, mode, plus_constant (XEXP (x, 0), offset)); 8537: RTX_UNCHANGING_P (new) = RTX_UNCHANGING_P (x); 8538: MEM_VOLATILE_P (new) = MEM_VOLATILE_P (x); 8539: MEM_IN_STRUCT_P (new) = MEM_IN_STRUCT_P (x); 8540: return new; 8541: } 8542: 8543: /* If X is a comparison operator, rewrite it in a new mode. This 8544: probably won't match, but may allow further simplifications. */ 8545: else if (GET_RTX_CLASS (GET_CODE (x)) == '<') 8546: return gen_rtx_combine (GET_CODE (x), mode, XEXP (x, 0), XEXP (x, 1)); 8547: 8548: /* If we couldn't simplify X any other way, just enclose it in a 8549: SUBREG. Normally, this SUBREG won't match, but some patterns may 1.1.1.3 root 8550: include an explicit SUBREG or we may simplify it further in combine. */ 1.1 root 8551: else 1.1.1.2 root 8552: { 8553: int word = 0; 8554: 8555: if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD) 8556: word = ((GET_MODE_SIZE (GET_MODE (x)) 8557: - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD)) 8558: / UNITS_PER_WORD); 8559: return gen_rtx (SUBREG, mode, x, word); 8560: } 1.1 root 8561: } 8562: 8563: /* Make an rtx expression. This is a subset of gen_rtx and only supports 8564: expressions of 1, 2, or 3 operands, each of which are rtx expressions. 8565: 8566: If the identical expression was previously in the insn (in the undobuf), 8567: it will be returned. Only if it is not found will a new expression 8568: be made. */ 8569: 8570: /*VARARGS2*/ 8571: static rtx 1.1.1.7 root 8572: gen_rtx_combine VPROTO((enum rtx_code code, enum machine_mode mode, ...)) 1.1 root 8573: { 1.1.1.7 root 8574: #ifndef __STDC__ 1.1 root 8575: enum rtx_code code; 8576: enum machine_mode mode; 1.1.1.7 root 8577: #endif 8578: va_list p; 1.1 root 8579: int n_args; 8580: rtx args[3]; 8581: int i, j; 8582: char *fmt; 8583: rtx rt; 8584: 1.1.1.7 root 8585: VA_START (p, mode); 8586: 8587: #ifndef __STDC__ 1.1 root 8588: code = va_arg (p, enum rtx_code); 8589: mode = va_arg (p, enum machine_mode); 1.1.1.7 root 8590: #endif 8591: 1.1 root 8592: n_args = GET_RTX_LENGTH (code); 8593: fmt = GET_RTX_FORMAT (code); 8594: 8595: if (n_args == 0 || n_args > 3) 8596: abort (); 8597: 8598: /* Get each arg and verify that it is supposed to be an expression. */ 8599: for (j = 0; j < n_args; j++) 8600: { 8601: if (*fmt++ != 'e') 8602: abort (); 8603: 8604: args[j] = va_arg (p, rtx); 8605: } 8606: 8607: /* See if this is in undobuf. Be sure we don't use objects that came 8608: from another insn; this could produce circular rtl structures. */ 8609: 8610: for (i = previous_num_undos; i < undobuf.num_undo; i++) 8611: if (!undobuf.undo[i].is_int 1.1.1.6 root 8612: && GET_CODE (undobuf.undo[i].old_contents.r) == code 8613: && GET_MODE (undobuf.undo[i].old_contents.r) == mode) 1.1 root 8614: { 8615: for (j = 0; j < n_args; j++) 1.1.1.6 root 8616: if (XEXP (undobuf.undo[i].old_contents.r, j) != args[j]) 1.1 root 8617: break; 8618: 8619: if (j == n_args) 1.1.1.6 root 8620: return undobuf.undo[i].old_contents.r; 1.1 root 8621: } 8622: 8623: /* Otherwise make a new rtx. We know we have 1, 2, or 3 args. 8624: Use rtx_alloc instead of gen_rtx because it's faster on RISC. */ 8625: rt = rtx_alloc (code); 8626: PUT_MODE (rt, mode); 8627: XEXP (rt, 0) = args[0]; 8628: if (n_args > 1) 8629: { 8630: XEXP (rt, 1) = args[1]; 8631: if (n_args > 2) 8632: XEXP (rt, 2) = args[2]; 8633: } 8634: return rt; 8635: } 8636: 8637: /* These routines make binary and unary operations by first seeing if they 8638: fold; if not, a new expression is allocated. */ 8639: 8640: static rtx 8641: gen_binary (code, mode, op0, op1) 8642: enum rtx_code code; 8643: enum machine_mode mode; 8644: rtx op0, op1; 8645: { 8646: rtx result; 1.1.1.4 root 8647: rtx tem; 8648: 8649: if (GET_RTX_CLASS (code) == 'c' 8650: && (GET_CODE (op0) == CONST_INT 8651: || (CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT))) 8652: tem = op0, op0 = op1, op1 = tem; 1.1 root 8653: 8654: if (GET_RTX_CLASS (code) == '<') 8655: { 8656: enum machine_mode op_mode = GET_MODE (op0); 1.1.1.7 root 8657: 8658: /* Strip the COMPARE from (REL_OP (compare X Y) 0) to get 8659: just (REL_OP X Y). */ 8660: if (GET_CODE (op0) == COMPARE && op1 == const0_rtx) 8661: { 8662: op1 = XEXP (op0, 1); 8663: op0 = XEXP (op0, 0); 8664: op_mode = GET_MODE (op0); 8665: } 8666: 1.1 root 8667: if (op_mode == VOIDmode) 8668: op_mode = GET_MODE (op1); 8669: result = simplify_relational_operation (code, op_mode, op0, op1); 8670: } 8671: else 8672: result = simplify_binary_operation (code, mode, op0, op1); 8673: 8674: if (result) 8675: return result; 8676: 8677: /* Put complex operands first and constants second. */ 8678: if (GET_RTX_CLASS (code) == 'c' 8679: && ((CONSTANT_P (op0) && GET_CODE (op1) != CONST_INT) 8680: || (GET_RTX_CLASS (GET_CODE (op0)) == 'o' 8681: && GET_RTX_CLASS (GET_CODE (op1)) != 'o') 8682: || (GET_CODE (op0) == SUBREG 8683: && GET_RTX_CLASS (GET_CODE (SUBREG_REG (op0))) == 'o' 8684: && GET_RTX_CLASS (GET_CODE (op1)) != 'o'))) 8685: return gen_rtx_combine (code, mode, op1, op0); 8686: 8687: return gen_rtx_combine (code, mode, op0, op1); 8688: } 8689: 8690: static rtx 1.1.1.7 root 8691: gen_unary (code, mode, op0_mode, op0) 1.1 root 8692: enum rtx_code code; 1.1.1.7 root 8693: enum machine_mode mode, op0_mode; 1.1 root 8694: rtx op0; 8695: { 1.1.1.7 root 8696: rtx result = simplify_unary_operation (code, mode, op0, op0_mode); 1.1 root 8697: 8698: if (result) 8699: return result; 8700: 8701: return gen_rtx_combine (code, mode, op0); 8702: } 8703: 8704: /* Simplify a comparison between *POP0 and *POP1 where CODE is the 8705: comparison code that will be tested. 8706: 8707: The result is a possibly different comparison code to use. *POP0 and 8708: *POP1 may be updated. 8709: 8710: It is possible that we might detect that a comparison is either always 8711: true or always false. However, we do not perform general constant 1.1.1.2 root 8712: folding in combine, so this knowledge isn't useful. Such tautologies 1.1 root 8713: should have been detected earlier. Hence we ignore all such cases. */ 8714: 8715: static enum rtx_code 8716: simplify_comparison (code, pop0, pop1) 8717: enum rtx_code code; 8718: rtx *pop0; 8719: rtx *pop1; 8720: { 8721: rtx op0 = *pop0; 8722: rtx op1 = *pop1; 8723: rtx tem, tem1; 8724: int i; 8725: enum machine_mode mode, tmode; 8726: 8727: /* Try a few ways of applying the same transformation to both operands. */ 8728: while (1) 8729: { 1.1.1.7 root 8730: #ifndef WORD_REGISTER_OPERATIONS 8731: /* The test below this one won't handle SIGN_EXTENDs on these machines, 8732: so check specially. */ 8733: if (code != GTU && code != GEU && code != LTU && code != LEU 8734: && GET_CODE (op0) == ASHIFTRT && GET_CODE (op1) == ASHIFTRT 8735: && GET_CODE (XEXP (op0, 0)) == ASHIFT 8736: && GET_CODE (XEXP (op1, 0)) == ASHIFT 8737: && GET_CODE (XEXP (XEXP (op0, 0), 0)) == SUBREG 8738: && GET_CODE (XEXP (XEXP (op1, 0), 0)) == SUBREG 8739: && (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0))) 8740: == GET_MODE (SUBREG_REG (XEXP (XEXP (op1, 0), 0)))) 8741: && GET_CODE (XEXP (op0, 1)) == CONST_INT 8742: && GET_CODE (XEXP (op1, 1)) == CONST_INT 8743: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT 8744: && GET_CODE (XEXP (XEXP (op1, 0), 1)) == CONST_INT 8745: && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (op1, 1)) 8746: && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op0, 0), 1)) 8747: && INTVAL (XEXP (op0, 1)) == INTVAL (XEXP (XEXP (op1, 0), 1)) 8748: && (INTVAL (XEXP (op0, 1)) 8749: == (GET_MODE_BITSIZE (GET_MODE (op0)) 8750: - (GET_MODE_BITSIZE 8751: (GET_MODE (SUBREG_REG (XEXP (XEXP (op0, 0), 0)))))))) 8752: { 8753: op0 = SUBREG_REG (XEXP (XEXP (op0, 0), 0)); 8754: op1 = SUBREG_REG (XEXP (XEXP (op1, 0), 0)); 8755: } 8756: #endif 8757: 1.1 root 8758: /* If both operands are the same constant shift, see if we can ignore the 8759: shift. We can if the shift is a rotate or if the bits shifted out of 1.1.1.5 root 8760: this shift are known to be zero for both inputs and if the type of 1.1 root 8761: comparison is compatible with the shift. */ 8762: if (GET_CODE (op0) == GET_CODE (op1) 1.1.1.4 root 8763: && GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT 1.1 root 8764: && ((GET_CODE (op0) == ROTATE && (code == NE || code == EQ)) 1.1.1.7 root 8765: || ((GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFT) 1.1 root 8766: && (code != GT && code != LT && code != GE && code != LE)) 8767: || (GET_CODE (op0) == ASHIFTRT 8768: && (code != GTU && code != LTU 8769: && code != GEU && code != GEU))) 8770: && GET_CODE (XEXP (op0, 1)) == CONST_INT 8771: && INTVAL (XEXP (op0, 1)) >= 0 1.1.1.4 root 8772: && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT 1.1 root 8773: && XEXP (op0, 1) == XEXP (op1, 1)) 8774: { 8775: enum machine_mode mode = GET_MODE (op0); 1.1.1.4 root 8776: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); 1.1 root 8777: int shift_count = INTVAL (XEXP (op0, 1)); 8778: 8779: if (GET_CODE (op0) == LSHIFTRT || GET_CODE (op0) == ASHIFTRT) 8780: mask &= (mask >> shift_count) << shift_count; 1.1.1.7 root 8781: else if (GET_CODE (op0) == ASHIFT) 1.1 root 8782: mask = (mask & (mask << shift_count)) >> shift_count; 8783: 1.1.1.5 root 8784: if ((nonzero_bits (XEXP (op0, 0), mode) & ~ mask) == 0 8785: && (nonzero_bits (XEXP (op1, 0), mode) & ~ mask) == 0) 1.1 root 8786: op0 = XEXP (op0, 0), op1 = XEXP (op1, 0); 8787: else 8788: break; 8789: } 8790: 8791: /* If both operands are AND's of a paradoxical SUBREG by constant, the 8792: SUBREGs are of the same mode, and, in both cases, the AND would 8793: be redundant if the comparison was done in the narrower mode, 8794: do the comparison in the narrower mode (e.g., we are AND'ing with 1 1.1.1.5 root 8795: and the operand's possibly nonzero bits are 0xffffff01; in that case 8796: if we only care about QImode, we don't need the AND). This case 8797: occurs if the output mode of an scc insn is not SImode and 1.1.1.7 root 8798: STORE_FLAG_VALUE == 1 (e.g., the 386). 8799: 8800: Similarly, check for a case where the AND's are ZERO_EXTEND 8801: operations from some narrower mode even though a SUBREG is not 8802: present. */ 1.1 root 8803: 8804: else if (GET_CODE (op0) == AND && GET_CODE (op1) == AND 8805: && GET_CODE (XEXP (op0, 1)) == CONST_INT 1.1.1.7 root 8806: && GET_CODE (XEXP (op1, 1)) == CONST_INT) 8807: { 8808: rtx inner_op0 = XEXP (op0, 0); 8809: rtx inner_op1 = XEXP (op1, 0); 8810: HOST_WIDE_INT c0 = INTVAL (XEXP (op0, 1)); 8811: HOST_WIDE_INT c1 = INTVAL (XEXP (op1, 1)); 8812: int changed = 0; 8813: 8814: if (GET_CODE (inner_op0) == SUBREG && GET_CODE (inner_op1) == SUBREG 8815: && (GET_MODE_SIZE (GET_MODE (inner_op0)) 8816: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner_op0)))) 8817: && (GET_MODE (SUBREG_REG (inner_op0)) 8818: == GET_MODE (SUBREG_REG (inner_op1))) 8819: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) 8820: <= HOST_BITS_PER_WIDE_INT) 8821: && (0 == (~c0) & nonzero_bits (SUBREG_REG (inner_op0), 8822: GET_MODE (SUBREG_REG (op0)))) 8823: && (0 == (~c1) & nonzero_bits (SUBREG_REG (inner_op1), 8824: GET_MODE (SUBREG_REG (inner_op1))))) 8825: { 8826: op0 = SUBREG_REG (inner_op0); 8827: op1 = SUBREG_REG (inner_op1); 8828: 8829: /* The resulting comparison is always unsigned since we masked 8830: off the original sign bit. */ 8831: code = unsigned_condition (code); 8832: 8833: changed = 1; 8834: } 8835: 8836: else if (c0 == c1) 8837: for (tmode = GET_CLASS_NARROWEST_MODE 8838: (GET_MODE_CLASS (GET_MODE (op0))); 8839: tmode != GET_MODE (op0); tmode = GET_MODE_WIDER_MODE (tmode)) 8840: if (c0 == GET_MODE_MASK (tmode)) 8841: { 8842: op0 = gen_lowpart_for_combine (tmode, inner_op0); 8843: op1 = gen_lowpart_for_combine (tmode, inner_op1); 8844: code = unsigned_condition (code); 8845: changed = 1; 8846: break; 8847: } 8848: 8849: if (! changed) 8850: break; 1.1 root 8851: } 1.1.1.7 root 8852: 8853: /* If both operands are NOT, we can strip off the outer operation 8854: and adjust the comparison code for swapped operands; similarly for 8855: NEG, except that this must be an equality comparison. */ 8856: else if ((GET_CODE (op0) == NOT && GET_CODE (op1) == NOT) 8857: || (GET_CODE (op0) == NEG && GET_CODE (op1) == NEG 8858: && (code == EQ || code == NE))) 8859: op0 = XEXP (op0, 0), op1 = XEXP (op1, 0), code = swap_condition (code); 8860: 1.1 root 8861: else 8862: break; 8863: } 8864: 8865: /* If the first operand is a constant, swap the operands and adjust the 8866: comparison code appropriately. */ 8867: if (CONSTANT_P (op0)) 8868: { 8869: tem = op0, op0 = op1, op1 = tem; 8870: code = swap_condition (code); 8871: } 8872: 8873: /* We now enter a loop during which we will try to simplify the comparison. 8874: For the most part, we only are concerned with comparisons with zero, 8875: but some things may really be comparisons with zero but not start 8876: out looking that way. */ 8877: 8878: while (GET_CODE (op1) == CONST_INT) 8879: { 8880: enum machine_mode mode = GET_MODE (op0); 8881: int mode_width = GET_MODE_BITSIZE (mode); 1.1.1.4 root 8882: unsigned HOST_WIDE_INT mask = GET_MODE_MASK (mode); 1.1 root 8883: int equality_comparison_p; 8884: int sign_bit_comparison_p; 8885: int unsigned_comparison_p; 1.1.1.4 root 8886: HOST_WIDE_INT const_op; 1.1 root 8887: 8888: /* We only want to handle integral modes. This catches VOIDmode, 8889: CCmode, and the floating-point modes. An exception is that we 8890: can handle VOIDmode if OP0 is a COMPARE or a comparison 8891: operation. */ 8892: 8893: if (GET_MODE_CLASS (mode) != MODE_INT 8894: && ! (mode == VOIDmode 8895: && (GET_CODE (op0) == COMPARE 8896: || GET_RTX_CLASS (GET_CODE (op0)) == '<'))) 8897: break; 8898: 8899: /* Get the constant we are comparing against and turn off all bits 8900: not on in our mode. */ 8901: const_op = INTVAL (op1); 1.1.1.4 root 8902: if (mode_width <= HOST_BITS_PER_WIDE_INT) 1.1.1.3 root 8903: const_op &= mask; 1.1 root 8904: 8905: /* If we are comparing against a constant power of two and the value 1.1.1.5 root 8906: being compared can only have that single bit nonzero (e.g., it was 1.1 root 8907: `and'ed with that bit), we can replace this with a comparison 8908: with zero. */ 8909: if (const_op 8910: && (code == EQ || code == NE || code == GE || code == GEU 8911: || code == LT || code == LTU) 1.1.1.4 root 8912: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1 root 8913: && exact_log2 (const_op) >= 0 1.1.1.5 root 8914: && nonzero_bits (op0, mode) == const_op) 1.1 root 8915: { 8916: code = (code == EQ || code == GE || code == GEU ? NE : EQ); 8917: op1 = const0_rtx, const_op = 0; 8918: } 8919: 1.1.1.4 root 8920: /* Similarly, if we are comparing a value known to be either -1 or 8921: 0 with -1, change it to the opposite comparison against zero. */ 8922: 8923: if (const_op == -1 8924: && (code == EQ || code == NE || code == GT || code == LE 8925: || code == GEU || code == LTU) 8926: && num_sign_bit_copies (op0, mode) == mode_width) 8927: { 8928: code = (code == EQ || code == LE || code == GEU ? NE : EQ); 8929: op1 = const0_rtx, const_op = 0; 8930: } 8931: 1.1 root 8932: /* Do some canonicalizations based on the comparison code. We prefer 1.1.1.3 root 8933: comparisons against zero and then prefer equality comparisons. 8934: If we can reduce the size of a constant, we will do that too. */ 1.1 root 8935: 8936: switch (code) 8937: { 8938: case LT: 1.1.1.3 root 8939: /* < C is equivalent to <= (C - 1) */ 8940: if (const_op > 0) 1.1 root 8941: { 1.1.1.3 root 8942: const_op -= 1; 1.1.1.4 root 8943: op1 = GEN_INT (const_op); 1.1 root 8944: code = LE; 8945: /* ... fall through to LE case below. */ 8946: } 8947: else 8948: break; 8949: 8950: case LE: 1.1.1.3 root 8951: /* <= C is equivalent to < (C + 1); we do this for C < 0 */ 8952: if (const_op < 0) 8953: { 8954: const_op += 1; 1.1.1.4 root 8955: op1 = GEN_INT (const_op); 1.1.1.3 root 8956: code = LT; 8957: } 1.1 root 8958: 8959: /* If we are doing a <= 0 comparison on a value known to have 8960: a zero sign bit, we can replace this with == 0. */ 8961: else if (const_op == 0 1.1.1.4 root 8962: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 8963: && (nonzero_bits (op0, mode) 1.1.1.4 root 8964: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0) 1.1 root 8965: code = EQ; 8966: break; 8967: 8968: case GE: 1.1.1.3 root 8969: /* >= C is equivalent to > (C - 1). */ 8970: if (const_op > 0) 1.1 root 8971: { 1.1.1.3 root 8972: const_op -= 1; 1.1.1.4 root 8973: op1 = GEN_INT (const_op); 1.1 root 8974: code = GT; 8975: /* ... fall through to GT below. */ 8976: } 8977: else 8978: break; 8979: 8980: case GT: 1.1.1.3 root 8981: /* > C is equivalent to >= (C + 1); we do this for C < 0*/ 8982: if (const_op < 0) 8983: { 8984: const_op += 1; 1.1.1.4 root 8985: op1 = GEN_INT (const_op); 1.1.1.3 root 8986: code = GE; 8987: } 1.1 root 8988: 8989: /* If we are doing a > 0 comparison on a value known to have 8990: a zero sign bit, we can replace this with != 0. */ 8991: else if (const_op == 0 1.1.1.4 root 8992: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 8993: && (nonzero_bits (op0, mode) 1.1.1.4 root 8994: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0) 1.1 root 8995: code = NE; 8996: break; 8997: 8998: case LTU: 1.1.1.3 root 8999: /* < C is equivalent to <= (C - 1). */ 9000: if (const_op > 0) 9001: { 9002: const_op -= 1; 1.1.1.4 root 9003: op1 = GEN_INT (const_op); 1.1.1.3 root 9004: code = LEU; 9005: /* ... fall through ... */ 9006: } 1.1.1.4 root 9007: 9008: /* (unsigned) < 0x80000000 is equivalent to >= 0. */ 9009: else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)) 9010: { 9011: const_op = 0, op1 = const0_rtx; 9012: code = GE; 9013: break; 9014: } 1.1.1.3 root 9015: else 9016: break; 1.1 root 9017: 9018: case LEU: 9019: /* unsigned <= 0 is equivalent to == 0 */ 9020: if (const_op == 0) 9021: code = EQ; 1.1.1.4 root 9022: 9023: /* (unsigned) <= 0x7fffffff is equivalent to >= 0. */ 9024: else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1) 9025: { 9026: const_op = 0, op1 = const0_rtx; 9027: code = GE; 9028: } 1.1 root 9029: break; 9030: 1.1.1.3 root 9031: case GEU: 9032: /* >= C is equivalent to < (C - 1). */ 9033: if (const_op > 1) 9034: { 9035: const_op -= 1; 1.1.1.4 root 9036: op1 = GEN_INT (const_op); 1.1.1.3 root 9037: code = GTU; 9038: /* ... fall through ... */ 9039: } 1.1.1.4 root 9040: 9041: /* (unsigned) >= 0x80000000 is equivalent to < 0. */ 9042: else if (const_op == (HOST_WIDE_INT) 1 << (mode_width - 1)) 9043: { 9044: const_op = 0, op1 = const0_rtx; 9045: code = LT; 1.1.1.7 root 9046: break; 1.1.1.4 root 9047: } 1.1.1.3 root 9048: else 9049: break; 9050: 1.1 root 9051: case GTU: 9052: /* unsigned > 0 is equivalent to != 0 */ 9053: if (const_op == 0) 9054: code = NE; 1.1.1.4 root 9055: 9056: /* (unsigned) > 0x7fffffff is equivalent to < 0. */ 9057: else if (const_op == ((HOST_WIDE_INT) 1 << (mode_width - 1)) - 1) 9058: { 9059: const_op = 0, op1 = const0_rtx; 9060: code = LT; 9061: } 1.1 root 9062: break; 9063: } 9064: 9065: /* Compute some predicates to simplify code below. */ 9066: 9067: equality_comparison_p = (code == EQ || code == NE); 9068: sign_bit_comparison_p = ((code == LT || code == GE) && const_op == 0); 9069: unsigned_comparison_p = (code == LTU || code == LEU || code == GTU 9070: || code == LEU); 9071: 1.1.1.6 root 9072: /* If this is a sign bit comparison and we can do arithmetic in 9073: MODE, say that we will only be needing the sign bit of OP0. */ 9074: if (sign_bit_comparison_p 9075: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) 9076: op0 = force_to_mode (op0, mode, 9077: ((HOST_WIDE_INT) 1 9078: << (GET_MODE_BITSIZE (mode) - 1)), 9079: NULL_RTX, 0); 9080: 1.1 root 9081: /* Now try cases based on the opcode of OP0. If none of the cases 9082: does a "continue", we exit this loop immediately after the 9083: switch. */ 9084: 9085: switch (GET_CODE (op0)) 9086: { 9087: case ZERO_EXTRACT: 9088: /* If we are extracting a single bit from a variable position in 9089: a constant that has only a single bit set and are comparing it 9090: with zero, we can convert this into an equality comparison 9091: between the position and the location of the single bit. We can't 9092: do this if bit endian and we don't have an extzv since we then 9093: can't know what mode to use for the endianness adjustment. */ 9094: 9095: if (GET_CODE (XEXP (op0, 0)) == CONST_INT 9096: && XEXP (op0, 1) == const1_rtx 9097: && equality_comparison_p && const_op == 0 1.1.1.8 ! root 9098: && (i = exact_log2 (INTVAL (XEXP (op0, 0)))) >= 0 ! 9099: && (! BITS_BIG_ENDIAN ! 9100: #ifdef HAVE_extzv ! 9101: || HAVE_extzv ! 9102: #endif ! 9103: )) 1.1 root 9104: { 1.1.1.8 ! root 9105: #ifdef HAVE_extzv ! 9106: if (BITS_BIG_ENDIAN) ! 9107: i = (GET_MODE_BITSIZE ! 9108: (insn_operand_mode[(int) CODE_FOR_extzv][1]) - 1 - i); 1.1 root 9109: #endif 9110: 9111: op0 = XEXP (op0, 2); 1.1.1.4 root 9112: op1 = GEN_INT (i); 1.1 root 9113: const_op = i; 9114: 9115: /* Result is nonzero iff shift count is equal to I. */ 9116: code = reverse_condition (code); 9117: continue; 9118: } 9119: 9120: /* ... fall through ... */ 9121: 9122: case SIGN_EXTRACT: 9123: tem = expand_compound_operation (op0); 9124: if (tem != op0) 9125: { 9126: op0 = tem; 9127: continue; 9128: } 9129: break; 9130: 9131: case NOT: 9132: /* If testing for equality, we can take the NOT of the constant. */ 9133: if (equality_comparison_p 9134: && (tem = simplify_unary_operation (NOT, mode, op1, mode)) != 0) 9135: { 9136: op0 = XEXP (op0, 0); 9137: op1 = tem; 9138: continue; 9139: } 9140: 9141: /* If just looking at the sign bit, reverse the sense of the 9142: comparison. */ 9143: if (sign_bit_comparison_p) 9144: { 9145: op0 = XEXP (op0, 0); 9146: code = (code == GE ? LT : GE); 9147: continue; 9148: } 9149: break; 9150: 9151: case NEG: 9152: /* If testing for equality, we can take the NEG of the constant. */ 9153: if (equality_comparison_p 9154: && (tem = simplify_unary_operation (NEG, mode, op1, mode)) != 0) 9155: { 9156: op0 = XEXP (op0, 0); 9157: op1 = tem; 9158: continue; 9159: } 9160: 9161: /* The remaining cases only apply to comparisons with zero. */ 9162: if (const_op != 0) 9163: break; 9164: 9165: /* When X is ABS or is known positive, 9166: (neg X) is < 0 if and only if X != 0. */ 9167: 9168: if (sign_bit_comparison_p 9169: && (GET_CODE (XEXP (op0, 0)) == ABS 1.1.1.4 root 9170: || (mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 9171: && (nonzero_bits (XEXP (op0, 0), mode) 1.1.1.4 root 9172: & ((HOST_WIDE_INT) 1 << (mode_width - 1))) == 0))) 1.1 root 9173: { 9174: op0 = XEXP (op0, 0); 9175: code = (code == LT ? NE : EQ); 9176: continue; 9177: } 9178: 1.1.1.5 root 9179: /* If we have NEG of something whose two high-order bits are the 9180: same, we know that "(-a) < 0" is equivalent to "a > 0". */ 9181: if (num_sign_bit_copies (op0, mode) >= 2) 1.1 root 9182: { 9183: op0 = XEXP (op0, 0); 9184: code = swap_condition (code); 9185: continue; 9186: } 9187: break; 9188: 9189: case ROTATE: 9190: /* If we are testing equality and our count is a constant, we 9191: can perform the inverse operation on our RHS. */ 9192: if (equality_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT 9193: && (tem = simplify_binary_operation (ROTATERT, mode, 9194: op1, XEXP (op0, 1))) != 0) 9195: { 9196: op0 = XEXP (op0, 0); 9197: op1 = tem; 9198: continue; 9199: } 9200: 9201: /* If we are doing a < 0 or >= 0 comparison, it means we are testing 9202: a particular bit. Convert it to an AND of a constant of that 9203: bit. This will be converted into a ZERO_EXTRACT. */ 9204: if (const_op == 0 && sign_bit_comparison_p 9205: && GET_CODE (XEXP (op0, 1)) == CONST_INT 1.1.1.4 root 9206: && mode_width <= HOST_BITS_PER_WIDE_INT) 1.1 root 9207: { 1.1.1.4 root 9208: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 9209: ((HOST_WIDE_INT) 1 9210: << (mode_width - 1 9211: - INTVAL (XEXP (op0, 1))))); 1.1 root 9212: code = (code == LT ? NE : EQ); 9213: continue; 9214: } 9215: 9216: /* ... fall through ... */ 9217: 9218: case ABS: 9219: /* ABS is ignorable inside an equality comparison with zero. */ 9220: if (const_op == 0 && equality_comparison_p) 9221: { 9222: op0 = XEXP (op0, 0); 9223: continue; 9224: } 9225: break; 9226: 9227: 9228: case SIGN_EXTEND: 9229: /* Can simplify (compare (zero/sign_extend FOO) CONST) 9230: to (compare FOO CONST) if CONST fits in FOO's mode and we 9231: are either testing inequality or have an unsigned comparison 9232: with ZERO_EXTEND or a signed comparison with SIGN_EXTEND. */ 9233: if (! unsigned_comparison_p 9234: && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) 1.1.1.4 root 9235: <= HOST_BITS_PER_WIDE_INT) 9236: && ((unsigned HOST_WIDE_INT) const_op 9237: < (((HOST_WIDE_INT) 1 9238: << (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) - 1))))) 1.1 root 9239: { 9240: op0 = XEXP (op0, 0); 9241: continue; 9242: } 9243: break; 9244: 9245: case SUBREG: 1.1.1.4 root 9246: /* Check for the case where we are comparing A - C1 with C2, 1.1.1.8 ! root 9247: both constants are smaller than 1/2 the maximum positive 1.1.1.4 root 9248: value in MODE, and the comparison is equality or unsigned. 9249: In that case, if A is either zero-extended to MODE or has 9250: sufficient sign bits so that the high-order bit in MODE 9251: is a copy of the sign in the inner mode, we can prove that it is 9252: safe to do the operation in the wider mode. This simplifies 9253: many range checks. */ 9254: 9255: if (mode_width <= HOST_BITS_PER_WIDE_INT 9256: && subreg_lowpart_p (op0) 9257: && GET_CODE (SUBREG_REG (op0)) == PLUS 9258: && GET_CODE (XEXP (SUBREG_REG (op0), 1)) == CONST_INT 9259: && INTVAL (XEXP (SUBREG_REG (op0), 1)) < 0 9260: && (- INTVAL (XEXP (SUBREG_REG (op0), 1)) 9261: < GET_MODE_MASK (mode) / 2) 1.1.1.5 root 9262: && (unsigned HOST_WIDE_INT) const_op < GET_MODE_MASK (mode) / 2 9263: && (0 == (nonzero_bits (XEXP (SUBREG_REG (op0), 0), 9264: GET_MODE (SUBREG_REG (op0))) 1.1.1.4 root 9265: & ~ GET_MODE_MASK (mode)) 9266: || (num_sign_bit_copies (XEXP (SUBREG_REG (op0), 0), 9267: GET_MODE (SUBREG_REG (op0))) 9268: > (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) 9269: - GET_MODE_BITSIZE (mode))))) 9270: { 9271: op0 = SUBREG_REG (op0); 9272: continue; 9273: } 9274: 9275: /* If the inner mode is narrower and we are extracting the low part, 9276: we can treat the SUBREG as if it were a ZERO_EXTEND. */ 9277: if (subreg_lowpart_p (op0) 9278: && GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) < mode_width) 9279: /* Fall through */ ; 9280: else 1.1 root 9281: break; 9282: 9283: /* ... fall through ... */ 9284: 9285: case ZERO_EXTEND: 9286: if ((unsigned_comparison_p || equality_comparison_p) 9287: && (GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))) 1.1.1.4 root 9288: <= HOST_BITS_PER_WIDE_INT) 9289: && ((unsigned HOST_WIDE_INT) const_op 1.1 root 9290: < GET_MODE_MASK (GET_MODE (XEXP (op0, 0))))) 9291: { 9292: op0 = XEXP (op0, 0); 9293: continue; 9294: } 9295: break; 9296: 9297: case PLUS: 1.1.1.5 root 9298: /* (eq (plus X A) B) -> (eq X (minus B A)). We can only do 1.1.1.2 root 9299: this for equality comparisons due to pathological cases involving 1.1 root 9300: overflows. */ 1.1.1.5 root 9301: if (equality_comparison_p 9302: && 0 != (tem = simplify_binary_operation (MINUS, mode, 9303: op1, XEXP (op0, 1)))) 1.1 root 9304: { 9305: op0 = XEXP (op0, 0); 9306: op1 = tem; 9307: continue; 9308: } 9309: 9310: /* (plus (abs X) (const_int -1)) is < 0 if and only if X == 0. */ 9311: if (const_op == 0 && XEXP (op0, 1) == constm1_rtx 9312: && GET_CODE (XEXP (op0, 0)) == ABS && sign_bit_comparison_p) 9313: { 9314: op0 = XEXP (XEXP (op0, 0), 0); 9315: code = (code == LT ? EQ : NE); 9316: continue; 9317: } 9318: break; 9319: 9320: case MINUS: 1.1.1.5 root 9321: /* (eq (minus A B) C) -> (eq A (plus B C)) or 9322: (eq B (minus A C)), whichever simplifies. We can only do 9323: this for equality comparisons due to pathological cases involving 9324: overflows. */ 9325: if (equality_comparison_p 9326: && 0 != (tem = simplify_binary_operation (PLUS, mode, 9327: XEXP (op0, 1), op1))) 9328: { 9329: op0 = XEXP (op0, 0); 9330: op1 = tem; 9331: continue; 9332: } 9333: 9334: if (equality_comparison_p 9335: && 0 != (tem = simplify_binary_operation (MINUS, mode, 9336: XEXP (op0, 0), op1))) 9337: { 9338: op0 = XEXP (op0, 1); 9339: op1 = tem; 9340: continue; 9341: } 9342: 1.1 root 9343: /* The sign bit of (minus (ashiftrt X C) X), where C is the number 9344: of bits in X minus 1, is one iff X > 0. */ 9345: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == ASHIFTRT 9346: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT 9347: && INTVAL (XEXP (XEXP (op0, 0), 1)) == mode_width - 1 9348: && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1))) 9349: { 9350: op0 = XEXP (op0, 1); 9351: code = (code == GE ? LE : GT); 9352: continue; 9353: } 9354: break; 9355: 9356: case XOR: 9357: /* (eq (xor A B) C) -> (eq A (xor B C)). This is a simplification 9358: if C is zero or B is a constant. */ 9359: if (equality_comparison_p 9360: && 0 != (tem = simplify_binary_operation (XOR, mode, 9361: XEXP (op0, 1), op1))) 9362: { 9363: op0 = XEXP (op0, 0); 9364: op1 = tem; 9365: continue; 9366: } 9367: break; 9368: 9369: case EQ: case NE: 9370: case LT: case LTU: case LE: case LEU: 9371: case GT: case GTU: case GE: case GEU: 9372: /* We can't do anything if OP0 is a condition code value, rather 9373: than an actual data value. */ 9374: if (const_op != 0 9375: #ifdef HAVE_cc0 9376: || XEXP (op0, 0) == cc0_rtx 9377: #endif 9378: || GET_MODE_CLASS (GET_MODE (XEXP (op0, 0))) == MODE_CC) 9379: break; 9380: 9381: /* Get the two operands being compared. */ 9382: if (GET_CODE (XEXP (op0, 0)) == COMPARE) 9383: tem = XEXP (XEXP (op0, 0), 0), tem1 = XEXP (XEXP (op0, 0), 1); 9384: else 9385: tem = XEXP (op0, 0), tem1 = XEXP (op0, 1); 9386: 9387: /* Check for the cases where we simply want the result of the 9388: earlier test or the opposite of that result. */ 9389: if (code == NE 9390: || (code == EQ && reversible_comparison_p (op0)) 1.1.1.4 root 9391: || (GET_MODE_BITSIZE (GET_MODE (op0)) <= HOST_BITS_PER_WIDE_INT 1.1.1.3 root 9392: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT 1.1 root 9393: && (STORE_FLAG_VALUE 1.1.1.4 root 9394: & (((HOST_WIDE_INT) 1 9395: << (GET_MODE_BITSIZE (GET_MODE (op0)) - 1)))) 1.1 root 9396: && (code == LT 9397: || (code == GE && reversible_comparison_p (op0))))) 9398: { 9399: code = (code == LT || code == NE 9400: ? GET_CODE (op0) : reverse_condition (GET_CODE (op0))); 9401: op0 = tem, op1 = tem1; 9402: continue; 9403: } 9404: break; 9405: 9406: case IOR: 9407: /* The sign bit of (ior (plus X (const_int -1)) X) is non-zero 9408: iff X <= 0. */ 9409: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 0)) == PLUS 9410: && XEXP (XEXP (op0, 0), 1) == constm1_rtx 9411: && rtx_equal_p (XEXP (XEXP (op0, 0), 0), XEXP (op0, 1))) 9412: { 9413: op0 = XEXP (op0, 1); 9414: code = (code == GE ? GT : LE); 9415: continue; 9416: } 9417: break; 9418: 9419: case AND: 9420: /* Convert (and (xshift 1 X) Y) to (and (lshiftrt Y X) 1). This 9421: will be converted to a ZERO_EXTRACT later. */ 9422: if (const_op == 0 && equality_comparison_p 1.1.1.7 root 9423: && GET_CODE (XEXP (op0, 0)) == ASHIFT 1.1 root 9424: && XEXP (XEXP (op0, 0), 0) == const1_rtx) 9425: { 9426: op0 = simplify_and_const_int 9427: (op0, mode, gen_rtx_combine (LSHIFTRT, mode, 9428: XEXP (op0, 1), 9429: XEXP (XEXP (op0, 0), 1)), 1.1.1.4 root 9430: (HOST_WIDE_INT) 1); 1.1 root 9431: continue; 9432: } 9433: 9434: /* If we are comparing (and (lshiftrt X C1) C2) for equality with 9435: zero and X is a comparison and C1 and C2 describe only bits set 9436: in STORE_FLAG_VALUE, we can compare with X. */ 9437: if (const_op == 0 && equality_comparison_p 1.1.1.4 root 9438: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1 root 9439: && GET_CODE (XEXP (op0, 1)) == CONST_INT 9440: && GET_CODE (XEXP (op0, 0)) == LSHIFTRT 9441: && GET_CODE (XEXP (XEXP (op0, 0), 1)) == CONST_INT 9442: && INTVAL (XEXP (XEXP (op0, 0), 1)) >= 0 1.1.1.4 root 9443: && INTVAL (XEXP (XEXP (op0, 0), 1)) < HOST_BITS_PER_WIDE_INT) 1.1 root 9444: { 9445: mask = ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode)) 9446: << INTVAL (XEXP (XEXP (op0, 0), 1))); 9447: if ((~ STORE_FLAG_VALUE & mask) == 0 9448: && (GET_RTX_CLASS (GET_CODE (XEXP (XEXP (op0, 0), 0))) == '<' 9449: || ((tem = get_last_value (XEXP (XEXP (op0, 0), 0))) != 0 9450: && GET_RTX_CLASS (GET_CODE (tem)) == '<'))) 9451: { 9452: op0 = XEXP (XEXP (op0, 0), 0); 9453: continue; 9454: } 9455: } 9456: 9457: /* If we are doing an equality comparison of an AND of a bit equal 9458: to the sign bit, replace this with a LT or GE comparison of 9459: the underlying value. */ 9460: if (equality_comparison_p 9461: && const_op == 0 9462: && GET_CODE (XEXP (op0, 1)) == CONST_INT 1.1.1.4 root 9463: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1 root 9464: && ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode)) 1.1.1.4 root 9465: == (HOST_WIDE_INT) 1 << (mode_width - 1))) 1.1 root 9466: { 9467: op0 = XEXP (op0, 0); 9468: code = (code == EQ ? GE : LT); 9469: continue; 9470: } 9471: 9472: /* If this AND operation is really a ZERO_EXTEND from a narrower 9473: mode, the constant fits within that mode, and this is either an 9474: equality or unsigned comparison, try to do this comparison in 9475: the narrower mode. */ 9476: if ((equality_comparison_p || unsigned_comparison_p) 9477: && GET_CODE (XEXP (op0, 1)) == CONST_INT 9478: && (i = exact_log2 ((INTVAL (XEXP (op0, 1)) 9479: & GET_MODE_MASK (mode)) 9480: + 1)) >= 0 9481: && const_op >> i == 0 9482: && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode) 9483: { 9484: op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0)); 9485: continue; 9486: } 9487: break; 9488: 9489: case ASHIFT: 1.1.1.7 root 9490: /* If we have (compare (ashift FOO N) (const_int C)) and 1.1 root 9491: the high order N bits of FOO (N+1 if an inequality comparison) 1.1.1.5 root 9492: are known to be zero, we can do this by comparing FOO with C 1.1 root 9493: shifted right N bits so long as the low-order N bits of C are 9494: zero. */ 9495: if (GET_CODE (XEXP (op0, 1)) == CONST_INT 9496: && INTVAL (XEXP (op0, 1)) >= 0 9497: && ((INTVAL (XEXP (op0, 1)) + ! equality_comparison_p) 1.1.1.4 root 9498: < HOST_BITS_PER_WIDE_INT) 9499: && ((const_op 1.1.1.6 root 9500: & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0) 1.1.1.4 root 9501: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 9502: && (nonzero_bits (XEXP (op0, 0), mode) 1.1 root 9503: & ~ (mask >> (INTVAL (XEXP (op0, 1)) 9504: + ! equality_comparison_p))) == 0) 9505: { 9506: const_op >>= INTVAL (XEXP (op0, 1)); 1.1.1.4 root 9507: op1 = GEN_INT (const_op); 1.1 root 9508: op0 = XEXP (op0, 0); 9509: continue; 9510: } 9511: 1.1.1.2 root 9512: /* If we are doing a sign bit comparison, it means we are testing 1.1 root 9513: a particular bit. Convert it to the appropriate AND. */ 1.1.1.2 root 9514: if (sign_bit_comparison_p && GET_CODE (XEXP (op0, 1)) == CONST_INT 1.1.1.4 root 9515: && mode_width <= HOST_BITS_PER_WIDE_INT) 1.1 root 9516: { 1.1.1.4 root 9517: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 9518: ((HOST_WIDE_INT) 1 9519: << (mode_width - 1 9520: - INTVAL (XEXP (op0, 1))))); 1.1 root 9521: code = (code == LT ? NE : EQ); 9522: continue; 9523: } 1.1.1.2 root 9524: 9525: /* If this an equality comparison with zero and we are shifting 9526: the low bit to the sign bit, we can convert this to an AND of the 9527: low-order bit. */ 9528: if (const_op == 0 && equality_comparison_p 9529: && GET_CODE (XEXP (op0, 1)) == CONST_INT 9530: && INTVAL (XEXP (op0, 1)) == mode_width - 1) 9531: { 1.1.1.4 root 9532: op0 = simplify_and_const_int (NULL_RTX, mode, XEXP (op0, 0), 9533: (HOST_WIDE_INT) 1); 1.1.1.2 root 9534: continue; 9535: } 1.1 root 9536: break; 9537: 9538: case ASHIFTRT: 1.1.1.4 root 9539: /* If this is an equality comparison with zero, we can do this 9540: as a logical shift, which might be much simpler. */ 9541: if (equality_comparison_p && const_op == 0 9542: && GET_CODE (XEXP (op0, 1)) == CONST_INT) 9543: { 9544: op0 = simplify_shift_const (NULL_RTX, LSHIFTRT, mode, 9545: XEXP (op0, 0), 9546: INTVAL (XEXP (op0, 1))); 9547: continue; 9548: } 9549: 1.1 root 9550: /* If OP0 is a sign extension and CODE is not an unsigned comparison, 9551: do the comparison in a narrower mode. */ 9552: if (! unsigned_comparison_p 9553: && GET_CODE (XEXP (op0, 1)) == CONST_INT 9554: && GET_CODE (XEXP (op0, 0)) == ASHIFT 9555: && XEXP (op0, 1) == XEXP (XEXP (op0, 0), 1) 9556: && (tmode = mode_for_size (mode_width - INTVAL (XEXP (op0, 1)), 1.1.1.4 root 9557: MODE_INT, 1)) != BLKmode 9558: && ((unsigned HOST_WIDE_INT) const_op <= GET_MODE_MASK (tmode) 9559: || ((unsigned HOST_WIDE_INT) - const_op 9560: <= GET_MODE_MASK (tmode)))) 1.1 root 9561: { 9562: op0 = gen_lowpart_for_combine (tmode, XEXP (XEXP (op0, 0), 0)); 9563: continue; 9564: } 9565: 9566: /* ... fall through ... */ 9567: case LSHIFTRT: 9568: /* If we have (compare (xshiftrt FOO N) (const_int C)) and 1.1.1.5 root 9569: the low order N bits of FOO are known to be zero, we can do this 1.1 root 9570: by comparing FOO with C shifted left N bits so long as no 9571: overflow occurs. */ 9572: if (GET_CODE (XEXP (op0, 1)) == CONST_INT 9573: && INTVAL (XEXP (op0, 1)) >= 0 1.1.1.4 root 9574: && INTVAL (XEXP (op0, 1)) < HOST_BITS_PER_WIDE_INT 9575: && mode_width <= HOST_BITS_PER_WIDE_INT 1.1.1.5 root 9576: && (nonzero_bits (XEXP (op0, 0), mode) 1.1.1.4 root 9577: & (((HOST_WIDE_INT) 1 << INTVAL (XEXP (op0, 1))) - 1)) == 0 1.1 root 9578: && (const_op == 0 9579: || (floor_log2 (const_op) + INTVAL (XEXP (op0, 1)) 9580: < mode_width))) 9581: { 9582: const_op <<= INTVAL (XEXP (op0, 1)); 1.1.1.4 root 9583: op1 = GEN_INT (const_op); 1.1 root 9584: op0 = XEXP (op0, 0); 9585: continue; 9586: } 9587: 9588: /* If we are using this shift to extract just the sign bit, we 9589: can replace this with an LT or GE comparison. */ 9590: if (const_op == 0 9591: && (equality_comparison_p || sign_bit_comparison_p) 9592: && GET_CODE (XEXP (op0, 1)) == CONST_INT 9593: && INTVAL (XEXP (op0, 1)) == mode_width - 1) 9594: { 9595: op0 = XEXP (op0, 0); 9596: code = (code == NE || code == GT ? LT : GE); 9597: continue; 9598: } 9599: break; 9600: } 9601: 9602: break; 9603: } 9604: 9605: /* Now make any compound operations involved in this comparison. Then, 9606: check for an outmost SUBREG on OP0 that isn't doing anything or is 9607: paradoxical. The latter case can only occur when it is known that the 9608: "extra" bits will be zero. Therefore, it is safe to remove the SUBREG. 9609: We can never remove a SUBREG for a non-equality comparison because the 9610: sign bit is in a different place in the underlying object. */ 9611: 9612: op0 = make_compound_operation (op0, op1 == const0_rtx ? COMPARE : SET); 9613: op1 = make_compound_operation (op1, SET); 9614: 9615: if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0) 9616: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT 9617: && (code == NE || code == EQ) 9618: && ((GET_MODE_SIZE (GET_MODE (op0)) 9619: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op0)))))) 9620: { 9621: op0 = SUBREG_REG (op0); 9622: op1 = gen_lowpart_for_combine (GET_MODE (op0), op1); 9623: } 9624: 9625: else if (GET_CODE (op0) == SUBREG && subreg_lowpart_p (op0) 9626: && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT 9627: && (code == NE || code == EQ) 1.1.1.4 root 9628: && (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (op0))) 9629: <= HOST_BITS_PER_WIDE_INT) 1.1.1.5 root 9630: && (nonzero_bits (SUBREG_REG (op0), GET_MODE (SUBREG_REG (op0))) 1.1 root 9631: & ~ GET_MODE_MASK (GET_MODE (op0))) == 0 9632: && (tem = gen_lowpart_for_combine (GET_MODE (SUBREG_REG (op0)), 9633: op1), 1.1.1.5 root 9634: (nonzero_bits (tem, GET_MODE (SUBREG_REG (op0))) 1.1 root 9635: & ~ GET_MODE_MASK (GET_MODE (op0))) == 0)) 9636: op0 = SUBREG_REG (op0), op1 = tem; 9637: 9638: /* We now do the opposite procedure: Some machines don't have compare 9639: insns in all modes. If OP0's mode is an integer mode smaller than a 9640: word and we can't do a compare in that mode, see if there is a larger 1.1.1.4 root 9641: mode for which we can do the compare. There are a number of cases in 9642: which we can use the wider mode. */ 1.1 root 9643: 9644: mode = GET_MODE (op0); 9645: if (mode != VOIDmode && GET_MODE_CLASS (mode) == MODE_INT 9646: && GET_MODE_SIZE (mode) < UNITS_PER_WORD 9647: && cmp_optab->handlers[(int) mode].insn_code == CODE_FOR_nothing) 9648: for (tmode = GET_MODE_WIDER_MODE (mode); 1.1.1.4 root 9649: (tmode != VOIDmode 9650: && GET_MODE_BITSIZE (tmode) <= HOST_BITS_PER_WIDE_INT); 1.1 root 9651: tmode = GET_MODE_WIDER_MODE (tmode)) 1.1.1.4 root 9652: if (cmp_optab->handlers[(int) tmode].insn_code != CODE_FOR_nothing) 9653: { 1.1.1.5 root 9654: /* If the only nonzero bits in OP0 and OP1 are those in the 1.1.1.4 root 9655: narrower mode and this is an equality or unsigned comparison, 9656: we can use the wider mode. Similarly for sign-extended 1.1.1.7 root 9657: values, in which case it is true for all comparisons. */ 1.1.1.4 root 9658: if (((code == EQ || code == NE 9659: || code == GEU || code == GTU || code == LEU || code == LTU) 1.1.1.5 root 9660: && (nonzero_bits (op0, tmode) & ~ GET_MODE_MASK (mode)) == 0 9661: && (nonzero_bits (op1, tmode) & ~ GET_MODE_MASK (mode)) == 0) 1.1.1.7 root 9662: || ((num_sign_bit_copies (op0, tmode) 9663: > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)) 1.1.1.4 root 9664: && (num_sign_bit_copies (op1, tmode) 9665: > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)))) 9666: { 9667: op0 = gen_lowpart_for_combine (tmode, op0); 9668: op1 = gen_lowpart_for_combine (tmode, op1); 9669: break; 1.1 root 9670: } 9671: 1.1.1.4 root 9672: /* If this is a test for negative, we can make an explicit 9673: test of the sign bit. */ 9674: 9675: if (op1 == const0_rtx && (code == LT || code == GE) 9676: && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT) 9677: { 9678: op0 = gen_binary (AND, tmode, 9679: gen_lowpart_for_combine (tmode, op0), 9680: GEN_INT ((HOST_WIDE_INT) 1 9681: << (GET_MODE_BITSIZE (mode) - 1))); 9682: code = (code == LT) ? NE : EQ; 9683: break; 9684: } 1.1 root 9685: } 9686: 1.1.1.7 root 9687: #ifdef CANONICALIZE_COMPARISON 9688: /* If this machine only supports a subset of valid comparisons, see if we 9689: can convert an unsupported one into a supported one. */ 9690: CANONICALIZE_COMPARISON (code, op0, op1); 9691: #endif 9692: 1.1 root 9693: *pop0 = op0; 9694: *pop1 = op1; 9695: 9696: return code; 9697: } 9698: 9699: /* Return 1 if we know that X, a comparison operation, is not operating 9700: on a floating-point value or is EQ or NE, meaning that we can safely 9701: reverse it. */ 9702: 9703: static int 9704: reversible_comparison_p (x) 9705: rtx x; 9706: { 9707: if (TARGET_FLOAT_FORMAT != IEEE_FLOAT_FORMAT 1.1.1.7 root 9708: || flag_fast_math 1.1 root 9709: || GET_CODE (x) == NE || GET_CODE (x) == EQ) 9710: return 1; 9711: 9712: switch (GET_MODE_CLASS (GET_MODE (XEXP (x, 0)))) 9713: { 9714: case MODE_INT: 1.1.1.6 root 9715: case MODE_PARTIAL_INT: 9716: case MODE_COMPLEX_INT: 1.1 root 9717: return 1; 9718: 9719: case MODE_CC: 1.1.1.7 root 9720: /* If the mode of the condition codes tells us that this is safe, 9721: we need look no further. */ 9722: if (REVERSIBLE_CC_MODE (GET_MODE (XEXP (x, 0)))) 9723: return 1; 9724: 9725: /* Otherwise try and find where the condition codes were last set and 9726: use that. */ 1.1 root 9727: x = get_last_value (XEXP (x, 0)); 9728: return (x && GET_CODE (x) == COMPARE 1.1.1.6 root 9729: && ! FLOAT_MODE_P (GET_MODE (XEXP (x, 0)))); 1.1 root 9730: } 9731: 9732: return 0; 9733: } 9734: 9735: /* Utility function for following routine. Called when X is part of a value 9736: being stored into reg_last_set_value. Sets reg_last_set_table_tick 9737: for each register mentioned. Similar to mention_regs in cse.c */ 9738: 9739: static void 9740: update_table_tick (x) 9741: rtx x; 9742: { 9743: register enum rtx_code code = GET_CODE (x); 9744: register char *fmt = GET_RTX_FORMAT (code); 9745: register int i; 9746: 9747: if (code == REG) 9748: { 9749: int regno = REGNO (x); 9750: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER 9751: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); 9752: 9753: for (i = regno; i < endregno; i++) 9754: reg_last_set_table_tick[i] = label_tick; 9755: 9756: return; 9757: } 9758: 9759: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 9760: /* Note that we can't have an "E" in values stored; see 9761: get_last_value_validate. */ 9762: if (fmt[i] == 'e') 9763: update_table_tick (XEXP (x, i)); 9764: } 9765: 9766: /* Record that REG is set to VALUE in insn INSN. If VALUE is zero, we 9767: are saying that the register is clobbered and we no longer know its 1.1.1.5 root 9768: value. If INSN is zero, don't update reg_last_set; this is only permitted 9769: with VALUE also zero and is used to invalidate the register. */ 1.1 root 9770: 9771: static void 9772: record_value_for_reg (reg, insn, value) 9773: rtx reg; 9774: rtx insn; 9775: rtx value; 9776: { 9777: int regno = REGNO (reg); 9778: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER 9779: ? HARD_REGNO_NREGS (regno, GET_MODE (reg)) : 1); 9780: int i; 9781: 9782: /* If VALUE contains REG and we have a previous value for REG, substitute 9783: the previous value. */ 9784: if (value && insn && reg_overlap_mentioned_p (reg, value)) 9785: { 9786: rtx tem; 9787: 9788: /* Set things up so get_last_value is allowed to see anything set up to 9789: our insn. */ 9790: subst_low_cuid = INSN_CUID (insn); 9791: tem = get_last_value (reg); 9792: 9793: if (tem) 9794: value = replace_rtx (copy_rtx (value), reg, tem); 9795: } 9796: 9797: /* For each register modified, show we don't know its value, that 1.1.1.6 root 9798: we don't know about its bitwise content, that its value has been 9799: updated, and that we don't know the location of the death of the 9800: register. */ 1.1 root 9801: for (i = regno; i < endregno; i ++) 9802: { 9803: if (insn) 9804: reg_last_set[i] = insn; 9805: reg_last_set_value[i] = 0; 1.1.1.6 root 9806: reg_last_set_mode[i] = 0; 9807: reg_last_set_nonzero_bits[i] = 0; 9808: reg_last_set_sign_bit_copies[i] = 0; 1.1 root 9809: reg_last_death[i] = 0; 9810: } 9811: 9812: /* Mark registers that are being referenced in this value. */ 9813: if (value) 9814: update_table_tick (value); 9815: 9816: /* Now update the status of each register being set. 9817: If someone is using this register in this block, set this register 9818: to invalid since we will get confused between the two lives in this 9819: basic block. This makes using this register always invalid. In cse, we 9820: scan the table to invalidate all entries using this register, but this 9821: is too much work for us. */ 9822: 9823: for (i = regno; i < endregno; i++) 9824: { 9825: reg_last_set_label[i] = label_tick; 9826: if (value && reg_last_set_table_tick[i] == label_tick) 9827: reg_last_set_invalid[i] = 1; 9828: else 9829: reg_last_set_invalid[i] = 0; 9830: } 9831: 9832: /* The value being assigned might refer to X (like in "x++;"). In that 9833: case, we must replace it with (clobber (const_int 0)) to prevent 9834: infinite loops. */ 9835: if (value && ! get_last_value_validate (&value, 9836: reg_last_set_label[regno], 0)) 9837: { 9838: value = copy_rtx (value); 9839: if (! get_last_value_validate (&value, reg_last_set_label[regno], 1)) 9840: value = 0; 9841: } 9842: 1.1.1.5 root 9843: /* For the main register being modified, update the value, the mode, the 9844: nonzero bits, and the number of sign bit copies. */ 9845: 1.1 root 9846: reg_last_set_value[regno] = value; 9847: 1.1.1.5 root 9848: if (value) 9849: { 9850: subst_low_cuid = INSN_CUID (insn); 9851: reg_last_set_mode[regno] = GET_MODE (reg); 9852: reg_last_set_nonzero_bits[regno] = nonzero_bits (value, GET_MODE (reg)); 9853: reg_last_set_sign_bit_copies[regno] 9854: = num_sign_bit_copies (value, GET_MODE (reg)); 9855: } 1.1 root 9856: } 9857: 9858: /* Used for communication between the following two routines. */ 9859: static rtx record_dead_insn; 9860: 9861: /* Called via note_stores from record_dead_and_set_regs to handle one 9862: SET or CLOBBER in an insn. */ 9863: 9864: static void 9865: record_dead_and_set_regs_1 (dest, setter) 9866: rtx dest, setter; 9867: { 1.1.1.7 root 9868: if (GET_CODE (dest) == SUBREG) 9869: dest = SUBREG_REG (dest); 9870: 1.1 root 9871: if (GET_CODE (dest) == REG) 9872: { 9873: /* If we are setting the whole register, we know its value. Otherwise 9874: show that we don't know the value. We can handle SUBREG in 9875: some cases. */ 9876: if (GET_CODE (setter) == SET && dest == SET_DEST (setter)) 9877: record_value_for_reg (dest, record_dead_insn, SET_SRC (setter)); 9878: else if (GET_CODE (setter) == SET 9879: && GET_CODE (SET_DEST (setter)) == SUBREG 9880: && SUBREG_REG (SET_DEST (setter)) == dest 1.1.1.7 root 9881: && GET_MODE_BITSIZE (GET_MODE (dest)) <= BITS_PER_WORD 1.1 root 9882: && subreg_lowpart_p (SET_DEST (setter))) 1.1.1.4 root 9883: record_value_for_reg (dest, record_dead_insn, 9884: gen_lowpart_for_combine (GET_MODE (dest), 9885: SET_SRC (setter))); 1.1 root 9886: else 1.1.1.4 root 9887: record_value_for_reg (dest, record_dead_insn, NULL_RTX); 1.1 root 9888: } 9889: else if (GET_CODE (dest) == MEM 9890: /* Ignore pushes, they clobber nothing. */ 9891: && ! push_operand (dest, GET_MODE (dest))) 9892: mem_last_set = INSN_CUID (record_dead_insn); 9893: } 9894: 9895: /* Update the records of when each REG was most recently set or killed 9896: for the things done by INSN. This is the last thing done in processing 9897: INSN in the combiner loop. 9898: 1.1.1.6 root 9899: We update reg_last_set, reg_last_set_value, reg_last_set_mode, 9900: reg_last_set_nonzero_bits, reg_last_set_sign_bit_copies, reg_last_death, 9901: and also the similar information mem_last_set (which insn most recently 9902: modified memory) and last_call_cuid (which insn was the most recent 9903: subroutine call). */ 1.1 root 9904: 9905: static void 9906: record_dead_and_set_regs (insn) 9907: rtx insn; 9908: { 9909: register rtx link; 1.1.1.5 root 9910: int i; 9911: 1.1 root 9912: for (link = REG_NOTES (insn); link; link = XEXP (link, 1)) 9913: { 1.1.1.5 root 9914: if (REG_NOTE_KIND (link) == REG_DEAD 9915: && GET_CODE (XEXP (link, 0)) == REG) 9916: { 9917: int regno = REGNO (XEXP (link, 0)); 9918: int endregno 9919: = regno + (regno < FIRST_PSEUDO_REGISTER 9920: ? HARD_REGNO_NREGS (regno, GET_MODE (XEXP (link, 0))) 9921: : 1); 9922: 9923: for (i = regno; i < endregno; i++) 9924: reg_last_death[i] = insn; 9925: } 1.1 root 9926: else if (REG_NOTE_KIND (link) == REG_INC) 1.1.1.4 root 9927: record_value_for_reg (XEXP (link, 0), insn, NULL_RTX); 1.1 root 9928: } 9929: 9930: if (GET_CODE (insn) == CALL_INSN) 1.1.1.5 root 9931: { 9932: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) 9933: if (call_used_regs[i]) 9934: { 9935: reg_last_set_value[i] = 0; 1.1.1.6 root 9936: reg_last_set_mode[i] = 0; 9937: reg_last_set_nonzero_bits[i] = 0; 9938: reg_last_set_sign_bit_copies[i] = 0; 1.1.1.5 root 9939: reg_last_death[i] = 0; 9940: } 9941: 9942: last_call_cuid = mem_last_set = INSN_CUID (insn); 9943: } 1.1 root 9944: 9945: record_dead_insn = insn; 9946: note_stores (PATTERN (insn), record_dead_and_set_regs_1); 9947: } 9948: 9949: /* Utility routine for the following function. Verify that all the registers 9950: mentioned in *LOC are valid when *LOC was part of a value set when 9951: label_tick == TICK. Return 0 if some are not. 9952: 9953: If REPLACE is non-zero, replace the invalid reference with 9954: (clobber (const_int 0)) and return 1. This replacement is useful because 9955: we often can get useful information about the form of a value (e.g., if 9956: it was produced by a shift that always produces -1 or 0) even though 9957: we don't know exactly what registers it was produced from. */ 9958: 9959: static int 9960: get_last_value_validate (loc, tick, replace) 9961: rtx *loc; 9962: int tick; 9963: int replace; 9964: { 9965: rtx x = *loc; 9966: char *fmt = GET_RTX_FORMAT (GET_CODE (x)); 9967: int len = GET_RTX_LENGTH (GET_CODE (x)); 9968: int i; 9969: 9970: if (GET_CODE (x) == REG) 9971: { 9972: int regno = REGNO (x); 9973: int endregno = regno + (regno < FIRST_PSEUDO_REGISTER 9974: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); 9975: int j; 9976: 9977: for (j = regno; j < endregno; j++) 9978: if (reg_last_set_invalid[j] 9979: /* If this is a pseudo-register that was only set once, it is 9980: always valid. */ 9981: || (! (regno >= FIRST_PSEUDO_REGISTER && reg_n_sets[regno] == 1) 9982: && reg_last_set_label[j] > tick)) 9983: { 9984: if (replace) 9985: *loc = gen_rtx (CLOBBER, GET_MODE (x), const0_rtx); 9986: return replace; 9987: } 9988: 9989: return 1; 9990: } 9991: 9992: for (i = 0; i < len; i++) 9993: if ((fmt[i] == 'e' 9994: && get_last_value_validate (&XEXP (x, i), tick, replace) == 0) 9995: /* Don't bother with these. They shouldn't occur anyway. */ 9996: || fmt[i] == 'E') 9997: return 0; 9998: 9999: /* If we haven't found a reason for it to be invalid, it is valid. */ 10000: return 1; 10001: } 10002: 10003: /* Get the last value assigned to X, if known. Some registers 10004: in the value may be replaced with (clobber (const_int 0)) if their value 10005: is known longer known reliably. */ 10006: 10007: static rtx 10008: get_last_value (x) 10009: rtx x; 10010: { 10011: int regno; 10012: rtx value; 10013: 10014: /* If this is a non-paradoxical SUBREG, get the value of its operand and 10015: then convert it to the desired mode. If this is a paradoxical SUBREG, 10016: we cannot predict what values the "extra" bits might have. */ 10017: if (GET_CODE (x) == SUBREG 10018: && subreg_lowpart_p (x) 10019: && (GET_MODE_SIZE (GET_MODE (x)) 10020: <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) 10021: && (value = get_last_value (SUBREG_REG (x))) != 0) 10022: return gen_lowpart_for_combine (GET_MODE (x), value); 10023: 10024: if (GET_CODE (x) != REG) 10025: return 0; 10026: 10027: regno = REGNO (x); 10028: value = reg_last_set_value[regno]; 10029: 1.1.1.4 root 10030: /* If we don't have a value or if it isn't for this basic block, return 0. */ 1.1 root 10031: 10032: if (value == 0 10033: || (reg_n_sets[regno] != 1 1.1.1.5 root 10034: && reg_last_set_label[regno] != label_tick)) 1.1 root 10035: return 0; 10036: 1.1.1.8 ! root 10037: /* If the value was set in a later insn than the ones we are processing, 1.1.1.4 root 10038: we can't use it even if the register was only set once, but make a quick 10039: check to see if the previous insn set it to something. This is commonly 1.1.1.8 ! root 10040: the case when the same pseudo is used by repeated insns. ! 10041: ! 10042: This does not work if there exists an instruction which is temporarily ! 10043: not on the insn chain. */ 1.1.1.4 root 10044: 10045: if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid) 10046: { 10047: rtx insn, set; 10048: 1.1.1.8 ! root 10049: /* We can not do anything useful in this case, because there is ! 10050: an instruction which is not on the insn chain. */ ! 10051: if (subst_prev_insn) ! 10052: return 0; ! 10053: ! 10054: /* Skip over USE insns. They are not useful here, and they may have ! 10055: been made by combine, in which case they do not have a INSN_CUID ! 10056: value. We can't use prev_real_insn, because that would incorrectly ! 10057: take us backwards across labels. Skip over BARRIERs also, since ! 10058: they could have been made by combine. If we see one, we must be ! 10059: optimizing dead code, so it doesn't matter what we do. */ 1.1.1.7 root 10060: for (insn = prev_nonnote_insn (subst_insn); 1.1.1.8 ! root 10061: insn && ((GET_CODE (insn) == INSN ! 10062: && GET_CODE (PATTERN (insn)) == USE) ! 10063: || GET_CODE (insn) == BARRIER ! 10064: || INSN_CUID (insn) >= subst_low_cuid); 1.1.1.7 root 10065: insn = prev_nonnote_insn (insn)) 10066: ; 1.1.1.4 root 10067: 10068: if (insn 10069: && (set = single_set (insn)) != 0 10070: && rtx_equal_p (SET_DEST (set), x)) 10071: { 10072: value = SET_SRC (set); 10073: 10074: /* Make sure that VALUE doesn't reference X. Replace any 1.1.1.8 ! root 10075: explicit references with a CLOBBER. If there are any remaining 1.1.1.4 root 10076: references (rare), don't use the value. */ 10077: 10078: if (reg_mentioned_p (x, value)) 10079: value = replace_rtx (copy_rtx (value), x, 10080: gen_rtx (CLOBBER, GET_MODE (x), const0_rtx)); 10081: 10082: if (reg_overlap_mentioned_p (x, value)) 10083: return 0; 10084: } 10085: else 10086: return 0; 10087: } 10088: 10089: /* If the value has all its registers valid, return it. */ 1.1 root 10090: if (get_last_value_validate (&value, reg_last_set_label[regno], 0)) 10091: return value; 10092: 10093: /* Otherwise, make a copy and replace any invalid register with 10094: (clobber (const_int 0)). If that fails for some reason, return 0. */ 10095: 10096: value = copy_rtx (value); 10097: if (get_last_value_validate (&value, reg_last_set_label[regno], 1)) 10098: return value; 10099: 10100: return 0; 10101: } 10102: 10103: /* Return nonzero if expression X refers to a REG or to memory 10104: that is set in an instruction more recent than FROM_CUID. */ 10105: 10106: static int 10107: use_crosses_set_p (x, from_cuid) 10108: register rtx x; 10109: int from_cuid; 10110: { 10111: register char *fmt; 10112: register int i; 10113: register enum rtx_code code = GET_CODE (x); 10114: 10115: if (code == REG) 10116: { 10117: register int regno = REGNO (x); 1.1.1.6 root 10118: int endreg = regno + (regno < FIRST_PSEUDO_REGISTER 10119: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); 10120: 1.1 root 10121: #ifdef PUSH_ROUNDING 10122: /* Don't allow uses of the stack pointer to be moved, 10123: because we don't know whether the move crosses a push insn. */ 10124: if (regno == STACK_POINTER_REGNUM) 10125: return 1; 10126: #endif 1.1.1.6 root 10127: for (;regno < endreg; regno++) 10128: if (reg_last_set[regno] 10129: && INSN_CUID (reg_last_set[regno]) > from_cuid) 10130: return 1; 10131: return 0; 1.1 root 10132: } 10133: 10134: if (code == MEM && mem_last_set > from_cuid) 10135: return 1; 10136: 10137: fmt = GET_RTX_FORMAT (code); 10138: 10139: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 10140: { 10141: if (fmt[i] == 'E') 10142: { 10143: register int j; 10144: for (j = XVECLEN (x, i) - 1; j >= 0; j--) 10145: if (use_crosses_set_p (XVECEXP (x, i, j), from_cuid)) 10146: return 1; 10147: } 10148: else if (fmt[i] == 'e' 10149: && use_crosses_set_p (XEXP (x, i), from_cuid)) 10150: return 1; 10151: } 10152: return 0; 10153: } 10154: 10155: /* Define three variables used for communication between the following 10156: routines. */ 10157: 10158: static int reg_dead_regno, reg_dead_endregno; 10159: static int reg_dead_flag; 10160: 10161: /* Function called via note_stores from reg_dead_at_p. 10162: 1.1.1.8 ! root 10163: If DEST is within [reg_dead_regno, reg_dead_endregno), set 1.1 root 10164: reg_dead_flag to 1 if X is a CLOBBER and to -1 it is a SET. */ 10165: 10166: static void 10167: reg_dead_at_p_1 (dest, x) 10168: rtx dest; 10169: rtx x; 10170: { 10171: int regno, endregno; 10172: 10173: if (GET_CODE (dest) != REG) 10174: return; 10175: 10176: regno = REGNO (dest); 10177: endregno = regno + (regno < FIRST_PSEUDO_REGISTER 10178: ? HARD_REGNO_NREGS (regno, GET_MODE (dest)) : 1); 10179: 10180: if (reg_dead_endregno > regno && reg_dead_regno < endregno) 10181: reg_dead_flag = (GET_CODE (x) == CLOBBER) ? 1 : -1; 10182: } 10183: 10184: /* Return non-zero if REG is known to be dead at INSN. 10185: 10186: We scan backwards from INSN. If we hit a REG_DEAD note or a CLOBBER 10187: referencing REG, it is dead. If we hit a SET referencing REG, it is 10188: live. Otherwise, see if it is live or dead at the start of the basic 1.1.1.7 root 10189: block we are in. Hard regs marked as being live in NEWPAT_USED_REGS 10190: must be assumed to be always live. */ 1.1 root 10191: 10192: static int 10193: reg_dead_at_p (reg, insn) 10194: rtx reg; 10195: rtx insn; 10196: { 10197: int block, i; 10198: 10199: /* Set variables for reg_dead_at_p_1. */ 10200: reg_dead_regno = REGNO (reg); 10201: reg_dead_endregno = reg_dead_regno + (reg_dead_regno < FIRST_PSEUDO_REGISTER 10202: ? HARD_REGNO_NREGS (reg_dead_regno, 10203: GET_MODE (reg)) 10204: : 1); 10205: 10206: reg_dead_flag = 0; 10207: 1.1.1.7 root 10208: /* Check that reg isn't mentioned in NEWPAT_USED_REGS. */ 10209: if (reg_dead_regno < FIRST_PSEUDO_REGISTER) 10210: { 10211: for (i = reg_dead_regno; i < reg_dead_endregno; i++) 10212: if (TEST_HARD_REG_BIT (newpat_used_regs, i)) 10213: return 0; 10214: } 10215: 1.1 root 10216: /* Scan backwards until we find a REG_DEAD note, SET, CLOBBER, label, or 10217: beginning of function. */ 1.1.1.8 ! root 10218: for (; insn && GET_CODE (insn) != CODE_LABEL && GET_CODE (insn) != BARRIER; 1.1 root 10219: insn = prev_nonnote_insn (insn)) 10220: { 10221: note_stores (PATTERN (insn), reg_dead_at_p_1); 10222: if (reg_dead_flag) 10223: return reg_dead_flag == 1 ? 1 : 0; 10224: 10225: if (find_regno_note (insn, REG_DEAD, reg_dead_regno)) 10226: return 1; 10227: } 10228: 10229: /* Get the basic block number that we were in. */ 10230: if (insn == 0) 10231: block = 0; 10232: else 10233: { 10234: for (block = 0; block < n_basic_blocks; block++) 10235: if (insn == basic_block_head[block]) 10236: break; 10237: 10238: if (block == n_basic_blocks) 10239: return 0; 10240: } 10241: 10242: for (i = reg_dead_regno; i < reg_dead_endregno; i++) 1.1.1.4 root 10243: if (basic_block_live_at_start[block][i / REGSET_ELT_BITS] 10244: & ((REGSET_ELT_TYPE) 1 << (i % REGSET_ELT_BITS))) 1.1 root 10245: return 0; 10246: 10247: return 1; 10248: } 10249: 1.1.1.7 root 10250: /* Note hard registers in X that are used. This code is similar to 10251: that in flow.c, but much simpler since we don't care about pseudos. */ 10252: 10253: static void 10254: mark_used_regs_combine (x) 10255: rtx x; 10256: { 10257: register RTX_CODE code = GET_CODE (x); 10258: register int regno; 10259: int i; 10260: 10261: switch (code) 10262: { 10263: case LABEL_REF: 10264: case SYMBOL_REF: 10265: case CONST_INT: 10266: case CONST: 10267: case CONST_DOUBLE: 10268: case PC: 10269: case ADDR_VEC: 10270: case ADDR_DIFF_VEC: 10271: case ASM_INPUT: 10272: #ifdef HAVE_cc0 10273: /* CC0 must die in the insn after it is set, so we don't need to take 10274: special note of it here. */ 10275: case CC0: 10276: #endif 10277: return; 10278: 10279: case CLOBBER: 10280: /* If we are clobbering a MEM, mark any hard registers inside the 10281: address as used. */ 10282: if (GET_CODE (XEXP (x, 0)) == MEM) 10283: mark_used_regs_combine (XEXP (XEXP (x, 0), 0)); 10284: return; 10285: 10286: case REG: 10287: regno = REGNO (x); 10288: /* A hard reg in a wide mode may really be multiple registers. 10289: If so, mark all of them just like the first. */ 10290: if (regno < FIRST_PSEUDO_REGISTER) 10291: { 10292: /* None of this applies to the stack, frame or arg pointers */ 10293: if (regno == STACK_POINTER_REGNUM 10294: #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM 10295: || regno == HARD_FRAME_POINTER_REGNUM 10296: #endif 10297: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM 10298: || (regno == ARG_POINTER_REGNUM && fixed_regs[regno]) 10299: #endif 10300: || regno == FRAME_POINTER_REGNUM) 10301: return; 10302: 10303: i = HARD_REGNO_NREGS (regno, GET_MODE (x)); 10304: while (i-- > 0) 10305: SET_HARD_REG_BIT (newpat_used_regs, regno + i); 10306: } 10307: return; 10308: 10309: case SET: 10310: { 10311: /* If setting a MEM, or a SUBREG of a MEM, then note any hard regs in 10312: the address. */ 10313: register rtx testreg = SET_DEST (x); 10314: 10315: while (GET_CODE (testreg) == SUBREG 10316: || GET_CODE (testreg) == ZERO_EXTRACT 10317: || GET_CODE (testreg) == SIGN_EXTRACT 10318: || GET_CODE (testreg) == STRICT_LOW_PART) 10319: testreg = XEXP (testreg, 0); 10320: 10321: if (GET_CODE (testreg) == MEM) 10322: mark_used_regs_combine (XEXP (testreg, 0)); 10323: 10324: mark_used_regs_combine (SET_SRC (x)); 10325: return; 10326: } 10327: } 10328: 10329: /* Recursively scan the operands of this expression. */ 10330: 10331: { 10332: register char *fmt = GET_RTX_FORMAT (code); 10333: 10334: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) 10335: { 10336: if (fmt[i] == 'e') 10337: mark_used_regs_combine (XEXP (x, i)); 10338: else if (fmt[i] == 'E') 10339: { 10340: register int j; 10341: 10342: for (j = 0; j < XVECLEN (x, i); j++) 10343: mark_used_regs_combine (XVECEXP (x, i, j)); 10344: } 10345: } 10346: } 10347: } 10348: 10349: 1.1 root 10350: /* Remove register number REGNO from the dead registers list of INSN. 10351: 10352: Return the note used to record the death, if there was one. */ 10353: 10354: rtx 10355: remove_death (regno, insn) 10356: int regno; 10357: rtx insn; 10358: { 10359: register rtx note = find_regno_note (insn, REG_DEAD, regno); 10360: 10361: if (note) 1.1.1.4 root 10362: { 10363: reg_n_deaths[regno]--; 10364: remove_note (insn, note); 10365: } 1.1 root 10366: 10367: return note; 10368: } 10369: 10370: /* For each register (hardware or pseudo) used within expression X, if its 10371: death is in an instruction with cuid between FROM_CUID (inclusive) and 10372: TO_INSN (exclusive), put a REG_DEAD note for that register in the 10373: list headed by PNOTES. 10374: 10375: This is done when X is being merged by combination into TO_INSN. These 10376: notes will then be distributed as needed. */ 10377: 10378: static void 10379: move_deaths (x, from_cuid, to_insn, pnotes) 10380: rtx x; 10381: int from_cuid; 10382: rtx to_insn; 10383: rtx *pnotes; 10384: { 10385: register char *fmt; 10386: register int len, i; 10387: register enum rtx_code code = GET_CODE (x); 10388: 10389: if (code == REG) 10390: { 10391: register int regno = REGNO (x); 10392: register rtx where_dead = reg_last_death[regno]; 1.1.1.8 ! root 10393: register rtx before_dead, after_dead; 1.1 root 10394: 1.1.1.8 ! root 10395: /* WHERE_DEAD could be a USE insn made by combine, so first we ! 10396: make sure that we have insns with valid INSN_CUID values. */ ! 10397: before_dead = where_dead; ! 10398: while (before_dead && INSN_UID (before_dead) > max_uid_cuid) ! 10399: before_dead = PREV_INSN (before_dead); ! 10400: after_dead = where_dead; ! 10401: while (after_dead && INSN_UID (after_dead) > max_uid_cuid) ! 10402: after_dead = NEXT_INSN (after_dead); ! 10403: ! 10404: if (before_dead && after_dead ! 10405: && INSN_CUID (before_dead) >= from_cuid ! 10406: && (INSN_CUID (after_dead) < INSN_CUID (to_insn) ! 10407: || (where_dead != after_dead ! 10408: && INSN_CUID (after_dead) == INSN_CUID (to_insn)))) 1.1 root 10409: { 1.1.1.5 root 10410: rtx note = remove_death (regno, where_dead); 1.1 root 10411: 10412: /* It is possible for the call above to return 0. This can occur 10413: when reg_last_death points to I2 or I1 that we combined with. 1.1.1.5 root 10414: In that case make a new note. 1.1 root 10415: 1.1.1.5 root 10416: We must also check for the case where X is a hard register 10417: and NOTE is a death note for a range of hard registers 10418: including X. In that case, we must put REG_DEAD notes for 10419: the remaining registers in place of NOTE. */ 10420: 10421: if (note != 0 && regno < FIRST_PSEUDO_REGISTER 10422: && (GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) 10423: != GET_MODE_SIZE (GET_MODE (x)))) 10424: { 10425: int deadregno = REGNO (XEXP (note, 0)); 10426: int deadend 10427: = (deadregno + HARD_REGNO_NREGS (deadregno, 10428: GET_MODE (XEXP (note, 0)))); 10429: int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); 10430: int i; 10431: 10432: for (i = deadregno; i < deadend; i++) 10433: if (i < regno || i >= ourend) 10434: REG_NOTES (where_dead) 10435: = gen_rtx (EXPR_LIST, REG_DEAD, 1.1.1.7 root 10436: gen_rtx (REG, reg_raw_mode[i], i), 1.1.1.5 root 10437: REG_NOTES (where_dead)); 10438: } 1.1.1.8 ! root 10439: /* If we didn't find any note, and we have a multi-reg hard ! 10440: register, then to be safe we must check for REG_DEAD notes ! 10441: for each register other than the first. They could have ! 10442: their own REG_DEAD notes lying around. */ ! 10443: else if (note == 0 && regno < FIRST_PSEUDO_REGISTER ! 10444: && HARD_REGNO_NREGS (regno, GET_MODE (x)) > 1) ! 10445: { ! 10446: int ourend = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); ! 10447: int i; ! 10448: rtx oldnotes = 0; ! 10449: ! 10450: for (i = regno + 1; i < ourend; i++) ! 10451: move_deaths (gen_rtx (REG, reg_raw_mode[i], i), ! 10452: from_cuid, to_insn, &oldnotes); ! 10453: } 1.1.1.5 root 10454: 10455: if (note != 0 && GET_MODE (XEXP (note, 0)) == GET_MODE (x)) 1.1 root 10456: { 10457: XEXP (note, 1) = *pnotes; 10458: *pnotes = note; 10459: } 10460: else 10461: *pnotes = gen_rtx (EXPR_LIST, REG_DEAD, x, *pnotes); 1.1.1.4 root 10462: 10463: reg_n_deaths[regno]++; 1.1 root 10464: } 10465: 10466: return; 10467: } 10468: 10469: else if (GET_CODE (x) == SET) 10470: { 10471: rtx dest = SET_DEST (x); 10472: 10473: move_deaths (SET_SRC (x), from_cuid, to_insn, pnotes); 10474: 1.1.1.3 root 10475: /* In the case of a ZERO_EXTRACT, a STRICT_LOW_PART, or a SUBREG 10476: that accesses one word of a multi-word item, some 10477: piece of everything register in the expression is used by 10478: this insn, so remove any old death. */ 10479: 10480: if (GET_CODE (dest) == ZERO_EXTRACT 10481: || GET_CODE (dest) == STRICT_LOW_PART 10482: || (GET_CODE (dest) == SUBREG 10483: && (((GET_MODE_SIZE (GET_MODE (dest)) 10484: + UNITS_PER_WORD - 1) / UNITS_PER_WORD) 10485: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) 10486: + UNITS_PER_WORD - 1) / UNITS_PER_WORD)))) 10487: { 10488: move_deaths (dest, from_cuid, to_insn, pnotes); 10489: return; 10490: } 10491: 10492: /* If this is some other SUBREG, we know it replaces the entire 10493: value, so use that as the destination. */ 10494: if (GET_CODE (dest) == SUBREG) 10495: dest = SUBREG_REG (dest); 10496: 10497: /* If this is a MEM, adjust deaths of anything used in the address. 10498: For a REG (the only other possibility), the entire value is 10499: being replaced so the old value is not used in this insn. */ 1.1 root 10500: 10501: if (GET_CODE (dest) == MEM) 10502: move_deaths (XEXP (dest, 0), from_cuid, to_insn, pnotes); 10503: return; 10504: } 10505: 10506: else if (GET_CODE (x) == CLOBBER) 10507: return; 10508: 10509: len = GET_RTX_LENGTH (code); 10510: fmt = GET_RTX_FORMAT (code); 10511: 10512: for (i = 0; i < len; i++) 10513: { 10514: if (fmt[i] == 'E') 10515: { 10516: register int j; 10517: for (j = XVECLEN (x, i) - 1; j >= 0; j--) 10518: move_deaths (XVECEXP (x, i, j), from_cuid, to_insn, pnotes); 10519: } 10520: else if (fmt[i] == 'e') 10521: move_deaths (XEXP (x, i), from_cuid, to_insn, pnotes); 10522: } 10523: } 10524: 1.1.1.3 root 10525: /* Return 1 if X is the target of a bit-field assignment in BODY, the 10526: pattern of an insn. X must be a REG. */ 1.1 root 10527: 10528: static int 1.1.1.3 root 10529: reg_bitfield_target_p (x, body) 10530: rtx x; 1.1 root 10531: rtx body; 10532: { 10533: int i; 10534: 10535: if (GET_CODE (body) == SET) 1.1.1.3 root 10536: { 10537: rtx dest = SET_DEST (body); 10538: rtx target; 10539: int regno, tregno, endregno, endtregno; 10540: 10541: if (GET_CODE (dest) == ZERO_EXTRACT) 10542: target = XEXP (dest, 0); 10543: else if (GET_CODE (dest) == STRICT_LOW_PART) 10544: target = SUBREG_REG (XEXP (dest, 0)); 10545: else 10546: return 0; 10547: 10548: if (GET_CODE (target) == SUBREG) 10549: target = SUBREG_REG (target); 10550: 10551: if (GET_CODE (target) != REG) 10552: return 0; 10553: 10554: tregno = REGNO (target), regno = REGNO (x); 10555: if (tregno >= FIRST_PSEUDO_REGISTER || regno >= FIRST_PSEUDO_REGISTER) 10556: return target == x; 10557: 10558: endtregno = tregno + HARD_REGNO_NREGS (tregno, GET_MODE (target)); 10559: endregno = regno + HARD_REGNO_NREGS (regno, GET_MODE (x)); 10560: 10561: return endregno > tregno && regno < endtregno; 10562: } 1.1 root 10563: 10564: else if (GET_CODE (body) == PARALLEL) 10565: for (i = XVECLEN (body, 0) - 1; i >= 0; i--) 1.1.1.3 root 10566: if (reg_bitfield_target_p (x, XVECEXP (body, 0, i))) 1.1 root 10567: return 1; 10568: 10569: return 0; 10570: } 10571: 10572: /* Given a chain of REG_NOTES originally from FROM_INSN, try to place them 10573: as appropriate. I3 and I2 are the insns resulting from the combination 10574: insns including FROM (I2 may be zero). 10575: 10576: ELIM_I2 and ELIM_I1 are either zero or registers that we know will 10577: not need REG_DEAD notes because they are being substituted for. This 10578: saves searching in the most common cases. 10579: 10580: Each note in the list is either ignored or placed on some insns, depending 10581: on the type of note. */ 10582: 10583: static void 10584: distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1) 10585: rtx notes; 10586: rtx from_insn; 10587: rtx i3, i2; 10588: rtx elim_i2, elim_i1; 10589: { 10590: rtx note, next_note; 10591: rtx tem; 10592: 10593: for (note = notes; note; note = next_note) 10594: { 10595: rtx place = 0, place2 = 0; 10596: 10597: /* If this NOTE references a pseudo register, ensure it references 10598: the latest copy of that register. */ 10599: if (XEXP (note, 0) && GET_CODE (XEXP (note, 0)) == REG 10600: && REGNO (XEXP (note, 0)) >= FIRST_PSEUDO_REGISTER) 10601: XEXP (note, 0) = regno_reg_rtx[REGNO (XEXP (note, 0))]; 10602: 10603: next_note = XEXP (note, 1); 10604: switch (REG_NOTE_KIND (note)) 10605: { 10606: case REG_UNUSED: 1.1.1.7 root 10607: /* Any clobbers for i3 may still exist, and so we must process 1.1.1.6 root 10608: REG_UNUSED notes from that insn. 10609: 10610: Any clobbers from i2 or i1 can only exist if they were added by 10611: recog_for_combine. In that case, recog_for_combine created the 10612: necessary REG_UNUSED notes. Trying to keep any original 10613: REG_UNUSED notes from these insns can cause incorrect output 10614: if it is for the same register as the original i3 dest. 10615: In that case, we will notice that the register is set in i3, 10616: and then add a REG_UNUSED note for the destination of i3, which 1.1.1.7 root 10617: is wrong. However, it is possible to have REG_UNUSED notes from 10618: i2 or i1 for register which were both used and clobbered, so 10619: we keep notes from i2 or i1 if they will turn into REG_DEAD 10620: notes. */ 1.1.1.6 root 10621: 1.1 root 10622: /* If this register is set or clobbered in I3, put the note there 10623: unless there is one already. */ 1.1.1.7 root 10624: if (reg_set_p (XEXP (note, 0), PATTERN (i3))) 1.1 root 10625: { 1.1.1.7 root 10626: if (from_insn != i3) 10627: break; 10628: 1.1 root 10629: if (! (GET_CODE (XEXP (note, 0)) == REG 10630: ? find_regno_note (i3, REG_UNUSED, REGNO (XEXP (note, 0))) 10631: : find_reg_note (i3, REG_UNUSED, XEXP (note, 0)))) 10632: place = i3; 10633: } 10634: /* Otherwise, if this register is used by I3, then this register 10635: now dies here, so we must put a REG_DEAD note here unless there 10636: is one already. */ 10637: else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3)) 10638: && ! (GET_CODE (XEXP (note, 0)) == REG 10639: ? find_regno_note (i3, REG_DEAD, REGNO (XEXP (note, 0))) 10640: : find_reg_note (i3, REG_DEAD, XEXP (note, 0)))) 10641: { 10642: PUT_REG_NOTE_KIND (note, REG_DEAD); 10643: place = i3; 10644: } 10645: break; 10646: 10647: case REG_EQUAL: 10648: case REG_EQUIV: 10649: case REG_NONNEG: 10650: /* These notes say something about results of an insn. We can 10651: only support them if they used to be on I3 in which case they 1.1.1.4 root 10652: remain on I3. Otherwise they are ignored. 10653: 10654: If the note refers to an expression that is not a constant, we 10655: must also ignore the note since we cannot tell whether the 10656: equivalence is still true. It might be possible to do 10657: slightly better than this (we only have a problem if I2DEST 10658: or I1DEST is present in the expression), but it doesn't 10659: seem worth the trouble. */ 10660: 10661: if (from_insn == i3 10662: && (XEXP (note, 0) == 0 || CONSTANT_P (XEXP (note, 0)))) 1.1 root 10663: place = i3; 10664: break; 10665: 10666: case REG_INC: 10667: case REG_NO_CONFLICT: 10668: case REG_LABEL: 10669: /* These notes say something about how a register is used. They must 10670: be present on any use of the register in I2 or I3. */ 10671: if (reg_mentioned_p (XEXP (note, 0), PATTERN (i3))) 10672: place = i3; 10673: 10674: if (i2 && reg_mentioned_p (XEXP (note, 0), PATTERN (i2))) 10675: { 10676: if (place) 10677: place2 = i2; 10678: else 10679: place = i2; 10680: } 10681: break; 10682: 10683: case REG_WAS_0: 10684: /* It is too much trouble to try to see if this note is still 10685: correct in all situations. It is better to simply delete it. */ 10686: break; 10687: 10688: case REG_RETVAL: 10689: /* If the insn previously containing this note still exists, 10690: put it back where it was. Otherwise move it to the previous 10691: insn. Adjust the corresponding REG_LIBCALL note. */ 10692: if (GET_CODE (from_insn) != NOTE) 10693: place = from_insn; 10694: else 10695: { 1.1.1.4 root 10696: tem = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX); 1.1 root 10697: place = prev_real_insn (from_insn); 10698: if (tem && place) 10699: XEXP (tem, 0) = place; 10700: } 10701: break; 10702: 10703: case REG_LIBCALL: 10704: /* This is handled similarly to REG_RETVAL. */ 10705: if (GET_CODE (from_insn) != NOTE) 10706: place = from_insn; 10707: else 10708: { 1.1.1.4 root 10709: tem = find_reg_note (XEXP (note, 0), REG_RETVAL, NULL_RTX); 1.1 root 10710: place = next_real_insn (from_insn); 10711: if (tem && place) 10712: XEXP (tem, 0) = place; 10713: } 10714: break; 10715: 10716: case REG_DEAD: 10717: /* If the register is used as an input in I3, it dies there. 10718: Similarly for I2, if it is non-zero and adjacent to I3. 10719: 10720: If the register is not used as an input in either I3 or I2 10721: and it is not one of the registers we were supposed to eliminate, 10722: there are two possibilities. We might have a non-adjacent I2 10723: or we might have somehow eliminated an additional register 10724: from a computation. For example, we might have had A & B where 10725: we discover that B will always be zero. In this case we will 10726: eliminate the reference to A. 10727: 10728: In both cases, we must search to see if we can find a previous 10729: use of A and put the death note there. */ 10730: 1.1.1.7 root 10731: if (from_insn 10732: && GET_CODE (from_insn) == CALL_INSN 10733: && find_reg_fusage (from_insn, USE, XEXP (note, 0))) 10734: place = from_insn; 10735: else if (reg_referenced_p (XEXP (note, 0), PATTERN (i3))) 1.1 root 10736: place = i3; 10737: else if (i2 != 0 && next_nonnote_insn (i2) == i3 10738: && reg_referenced_p (XEXP (note, 0), PATTERN (i2))) 10739: place = i2; 10740: 10741: if (XEXP (note, 0) == elim_i2 || XEXP (note, 0) == elim_i1) 10742: break; 10743: 1.1.1.4 root 10744: /* If the register is used in both I2 and I3 and it dies in I3, 10745: we might have added another reference to it. If reg_n_refs 10746: was 2, bump it to 3. This has to be correct since the 10747: register must have been set somewhere. The reason this is 10748: done is because local-alloc.c treats 2 references as a 10749: special case. */ 10750: 10751: if (place == i3 && i2 != 0 && GET_CODE (XEXP (note, 0)) == REG 10752: && reg_n_refs[REGNO (XEXP (note, 0))]== 2 10753: && reg_referenced_p (XEXP (note, 0), PATTERN (i2))) 10754: reg_n_refs[REGNO (XEXP (note, 0))] = 3; 10755: 1.1 root 10756: if (place == 0) 1.1.1.8 ! root 10757: { ! 10758: for (tem = prev_nonnote_insn (i3); ! 10759: place == 0 && tem ! 10760: && (GET_CODE (tem) == INSN || GET_CODE (tem) == CALL_INSN); ! 10761: tem = prev_nonnote_insn (tem)) ! 10762: { ! 10763: /* If the register is being set at TEM, see if that is all ! 10764: TEM is doing. If so, delete TEM. Otherwise, make this ! 10765: into a REG_UNUSED note instead. */ ! 10766: if (reg_set_p (XEXP (note, 0), PATTERN (tem))) ! 10767: { ! 10768: rtx set = single_set (tem); 1.1 root 10769: 1.1.1.8 ! root 10770: /* Verify that it was the set, and not a clobber that ! 10771: modified the register. */ 1.1.1.2 root 10772: 1.1.1.8 ! root 10773: if (set != 0 && ! side_effects_p (SET_SRC (set)) ! 10774: && (rtx_equal_p (XEXP (note, 0), SET_DEST (set)) ! 10775: || (GET_CODE (SET_DEST (set)) == SUBREG ! 10776: && rtx_equal_p (XEXP (note, 0), ! 10777: XEXP (SET_DEST (set), 0))))) ! 10778: { ! 10779: /* Move the notes and links of TEM elsewhere. ! 10780: This might delete other dead insns recursively. ! 10781: First set the pattern to something that won't use ! 10782: any register. */ ! 10783: ! 10784: PATTERN (tem) = pc_rtx; ! 10785: ! 10786: distribute_notes (REG_NOTES (tem), tem, tem, ! 10787: NULL_RTX, NULL_RTX, NULL_RTX); ! 10788: distribute_links (LOG_LINKS (tem)); ! 10789: ! 10790: PUT_CODE (tem, NOTE); ! 10791: NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED; ! 10792: NOTE_SOURCE_FILE (tem) = 0; ! 10793: } ! 10794: else ! 10795: { ! 10796: PUT_REG_NOTE_KIND (note, REG_UNUSED); ! 10797: ! 10798: /* If there isn't already a REG_UNUSED note, put one ! 10799: here. */ ! 10800: if (! find_regno_note (tem, REG_UNUSED, ! 10801: REGNO (XEXP (note, 0)))) ! 10802: place = tem; ! 10803: break; 1.1 root 10804: } 10805: } 1.1.1.7 root 10806: else if (reg_referenced_p (XEXP (note, 0), PATTERN (tem)) 10807: || (GET_CODE (tem) == CALL_INSN 10808: && find_reg_fusage (tem, USE, XEXP (note, 0)))) 1.1 root 10809: { 10810: place = tem; 1.1.1.8 ! root 10811: ! 10812: /* If we are doing a 3->2 combination, and we have a ! 10813: register which formerly died in i3 and was not used ! 10814: by i2, which now no longer dies in i3 and is used in ! 10815: i2 but does not die in i2, and place is between i2 ! 10816: and i3, then we may need to move a link from place to ! 10817: i2. */ ! 10818: if (i2 && INSN_UID (place) <= max_uid_cuid ! 10819: && INSN_CUID (place) > INSN_CUID (i2) ! 10820: && from_insn && INSN_CUID (from_insn) > INSN_CUID (i2) ! 10821: && reg_referenced_p (XEXP (note, 0), PATTERN (i2))) ! 10822: { ! 10823: rtx links = LOG_LINKS (place); ! 10824: LOG_LINKS (place) = 0; ! 10825: distribute_links (links); ! 10826: } 1.1 root 10827: break; 10828: } 1.1.1.8 ! root 10829: } ! 10830: ! 10831: /* If we haven't found an insn for the death note and it ! 10832: is still a REG_DEAD note, but we have hit a CODE_LABEL, ! 10833: insert a USE insn for the register at that label and ! 10834: put the death node there. This prevents problems with ! 10835: call-state tracking in caller-save.c. */ ! 10836: if (REG_NOTE_KIND (note) == REG_DEAD && place == 0 && tem != 0) ! 10837: { ! 10838: place ! 10839: = emit_insn_after (gen_rtx (USE, VOIDmode, XEXP (note, 0)), ! 10840: tem); ! 10841: ! 10842: /* If this insn was emitted between blocks, then update ! 10843: basic_block_head of the current block to include it. */ ! 10844: if (basic_block_end[this_basic_block - 1] == tem) ! 10845: basic_block_head[this_basic_block] = place; ! 10846: } ! 10847: } 1.1 root 10848: 10849: /* If the register is set or already dead at PLACE, we needn't do 10850: anything with this note if it is still a REG_DEAD note. 10851: 10852: Note that we cannot use just `dead_or_set_p' here since we can 10853: convert an assignment to a register into a bit-field assignment. 10854: Therefore, we must also omit the note if the register is the 10855: target of a bitfield assignment. */ 10856: 10857: if (place && REG_NOTE_KIND (note) == REG_DEAD) 10858: { 10859: int regno = REGNO (XEXP (note, 0)); 10860: 10861: if (dead_or_set_p (place, XEXP (note, 0)) 10862: || reg_bitfield_target_p (XEXP (note, 0), PATTERN (place))) 10863: { 10864: /* Unless the register previously died in PLACE, clear 10865: reg_last_death. [I no longer understand why this is 10866: being done.] */ 10867: if (reg_last_death[regno] != place) 10868: reg_last_death[regno] = 0; 10869: place = 0; 10870: } 10871: else 10872: reg_last_death[regno] = place; 10873: 10874: /* If this is a death note for a hard reg that is occupying 10875: multiple registers, ensure that we are still using all 10876: parts of the object. If we find a piece of the object 10877: that is unused, we must add a USE for that piece before 10878: PLACE and put the appropriate REG_DEAD note on it. 10879: 10880: An alternative would be to put a REG_UNUSED for the pieces 10881: on the insn that set the register, but that can't be done if 10882: it is not in the same block. It is simpler, though less 10883: efficient, to add the USE insns. */ 10884: 10885: if (place && regno < FIRST_PSEUDO_REGISTER 10886: && HARD_REGNO_NREGS (regno, GET_MODE (XEXP (note, 0))) > 1) 10887: { 10888: int endregno 10889: = regno + HARD_REGNO_NREGS (regno, 10890: GET_MODE (XEXP (note, 0))); 10891: int all_used = 1; 10892: int i; 10893: 10894: for (i = regno; i < endregno; i++) 1.1.1.7 root 10895: if (! refers_to_regno_p (i, i + 1, PATTERN (place), 0) 10896: && ! find_regno_fusage (place, USE, i)) 1.1 root 10897: { 1.1.1.7 root 10898: rtx piece = gen_rtx (REG, reg_raw_mode[i], i); 1.1.1.3 root 10899: rtx p; 10900: 10901: /* See if we already placed a USE note for this 10902: register in front of PLACE. */ 10903: for (p = place; 10904: GET_CODE (PREV_INSN (p)) == INSN 10905: && GET_CODE (PATTERN (PREV_INSN (p))) == USE; 10906: p = PREV_INSN (p)) 10907: if (rtx_equal_p (piece, 10908: XEXP (PATTERN (PREV_INSN (p)), 0))) 10909: { 10910: p = 0; 10911: break; 10912: } 10913: 10914: if (p) 10915: { 10916: rtx use_insn 10917: = emit_insn_before (gen_rtx (USE, VOIDmode, 10918: piece), 10919: p); 10920: REG_NOTES (use_insn) 10921: = gen_rtx (EXPR_LIST, REG_DEAD, piece, 10922: REG_NOTES (use_insn)); 10923: } 1.1 root 10924: 1.1.1.2 root 10925: all_used = 0; 1.1 root 10926: } 10927: 1.1.1.5 root 10928: /* Check for the case where the register dying partially 10929: overlaps the register set by this insn. */ 10930: if (all_used) 10931: for (i = regno; i < endregno; i++) 10932: if (dead_or_set_regno_p (place, i)) 10933: { 10934: all_used = 0; 10935: break; 10936: } 10937: 1.1 root 10938: if (! all_used) 10939: { 10940: /* Put only REG_DEAD notes for pieces that are 10941: still used and that are not already dead or set. */ 10942: 10943: for (i = regno; i < endregno; i++) 10944: { 1.1.1.7 root 10945: rtx piece = gen_rtx (REG, reg_raw_mode[i], i); 1.1 root 10946: 1.1.1.7 root 10947: if ((reg_referenced_p (piece, PATTERN (place)) 10948: || (GET_CODE (place) == CALL_INSN 10949: && find_reg_fusage (place, USE, piece))) 1.1 root 10950: && ! dead_or_set_p (place, piece) 10951: && ! reg_bitfield_target_p (piece, 10952: PATTERN (place))) 10953: REG_NOTES (place) = gen_rtx (EXPR_LIST, REG_DEAD, 10954: piece, 10955: REG_NOTES (place)); 10956: } 10957: 10958: place = 0; 10959: } 10960: } 10961: } 10962: break; 10963: 10964: default: 10965: /* Any other notes should not be present at this point in the 10966: compilation. */ 10967: abort (); 10968: } 10969: 10970: if (place) 10971: { 10972: XEXP (note, 1) = REG_NOTES (place); 10973: REG_NOTES (place) = note; 10974: } 1.1.1.4 root 10975: else if ((REG_NOTE_KIND (note) == REG_DEAD 10976: || REG_NOTE_KIND (note) == REG_UNUSED) 10977: && GET_CODE (XEXP (note, 0)) == REG) 10978: reg_n_deaths[REGNO (XEXP (note, 0))]--; 1.1 root 10979: 10980: if (place2) 1.1.1.4 root 10981: { 10982: if ((REG_NOTE_KIND (note) == REG_DEAD 10983: || REG_NOTE_KIND (note) == REG_UNUSED) 10984: && GET_CODE (XEXP (note, 0)) == REG) 10985: reg_n_deaths[REGNO (XEXP (note, 0))]++; 10986: 10987: REG_NOTES (place2) = gen_rtx (GET_CODE (note), REG_NOTE_KIND (note), 10988: XEXP (note, 0), REG_NOTES (place2)); 10989: } 1.1 root 10990: } 10991: } 10992: 10993: /* Similarly to above, distribute the LOG_LINKS that used to be present on 1.1.1.2 root 10994: I3, I2, and I1 to new locations. This is also called in one case to 10995: add a link pointing at I3 when I3's destination is changed. */ 1.1 root 10996: 10997: static void 10998: distribute_links (links) 10999: rtx links; 11000: { 11001: rtx link, next_link; 11002: 11003: for (link = links; link; link = next_link) 11004: { 11005: rtx place = 0; 11006: rtx insn; 11007: rtx set, reg; 11008: 11009: next_link = XEXP (link, 1); 11010: 11011: /* If the insn that this link points to is a NOTE or isn't a single 11012: set, ignore it. In the latter case, it isn't clear what we 11013: can do other than ignore the link, since we can't tell which 11014: register it was for. Such links wouldn't be used by combine 11015: anyway. 11016: 11017: It is not possible for the destination of the target of the link to 11018: have been changed by combine. The only potential of this is if we 11019: replace I3, I2, and I1 by I3 and I2. But in that case the 11020: destination of I2 also remains unchanged. */ 11021: 11022: if (GET_CODE (XEXP (link, 0)) == NOTE 11023: || (set = single_set (XEXP (link, 0))) == 0) 11024: continue; 11025: 11026: reg = SET_DEST (set); 11027: while (GET_CODE (reg) == SUBREG || GET_CODE (reg) == ZERO_EXTRACT 11028: || GET_CODE (reg) == SIGN_EXTRACT 11029: || GET_CODE (reg) == STRICT_LOW_PART) 11030: reg = XEXP (reg, 0); 11031: 11032: /* A LOG_LINK is defined as being placed on the first insn that uses 11033: a register and points to the insn that sets the register. Start 11034: searching at the next insn after the target of the link and stop 11035: when we reach a set of the register or the end of the basic block. 11036: 11037: Note that this correctly handles the link that used to point from 1.1.1.2 root 11038: I3 to I2. Also note that not much searching is typically done here 1.1 root 11039: since most links don't point very far away. */ 11040: 11041: for (insn = NEXT_INSN (XEXP (link, 0)); 1.1.1.6 root 11042: (insn && (this_basic_block == n_basic_blocks - 1 11043: || basic_block_head[this_basic_block + 1] != insn)); 1.1 root 11044: insn = NEXT_INSN (insn)) 11045: if (GET_RTX_CLASS (GET_CODE (insn)) == 'i' 11046: && reg_overlap_mentioned_p (reg, PATTERN (insn))) 11047: { 11048: if (reg_referenced_p (reg, PATTERN (insn))) 11049: place = insn; 11050: break; 11051: } 1.1.1.7 root 11052: else if (GET_CODE (insn) == CALL_INSN 11053: && find_reg_fusage (insn, USE, reg)) 11054: { 11055: place = insn; 11056: break; 11057: } 1.1 root 11058: 11059: /* If we found a place to put the link, place it there unless there 11060: is already a link to the same insn as LINK at that point. */ 11061: 11062: if (place) 11063: { 11064: rtx link2; 11065: 11066: for (link2 = LOG_LINKS (place); link2; link2 = XEXP (link2, 1)) 11067: if (XEXP (link2, 0) == XEXP (link, 0)) 11068: break; 11069: 11070: if (link2 == 0) 11071: { 11072: XEXP (link, 1) = LOG_LINKS (place); 11073: LOG_LINKS (place) = link; 1.1.1.7 root 11074: 11075: /* Set added_links_insn to the earliest insn we added a 11076: link to. */ 11077: if (added_links_insn == 0 11078: || INSN_CUID (added_links_insn) > INSN_CUID (place)) 11079: added_links_insn = place; 1.1 root 11080: } 11081: } 11082: } 11083: } 11084: 11085: void 11086: dump_combine_stats (file) 11087: FILE *file; 11088: { 11089: fprintf 11090: (file, 11091: ";; Combiner statistics: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n\n", 11092: combine_attempts, combine_merges, combine_extras, combine_successes); 11093: } 11094: 11095: void 11096: dump_combine_total_stats (file) 11097: FILE *file; 11098: { 11099: fprintf 11100: (file, 11101: "\n;; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n;; %d successes.\n", 11102: total_attempts, total_merges, total_extras, total_successes); 11103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.