|
|
1.1 ! root 1: /* Search an insn for pseudo regs that must be in hard regs and are not. ! 2: Copyright (C) 1987, 1988, 1989, 1992, 1993 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 2, or (at your option) ! 9: any later version. ! 10: ! 11: GNU CC is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU CC; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: /* This file contains subroutines used only from the file reload1.c. ! 22: It knows how to scan one insn for operands and values ! 23: that need to be copied into registers to make valid code. ! 24: It also finds other operands and values which are valid ! 25: but for which equivalent values in registers exist and ! 26: ought to be used instead. ! 27: ! 28: Before processing the first insn of the function, call `init_reload'. ! 29: ! 30: To scan an insn, call `find_reloads'. This does two things: ! 31: 1. sets up tables describing which values must be reloaded ! 32: for this insn, and what kind of hard regs they must be reloaded into; ! 33: 2. optionally record the locations where those values appear in ! 34: the data, so they can be replaced properly later. ! 35: This is done only if the second arg to `find_reloads' is nonzero. ! 36: ! 37: The third arg to `find_reloads' specifies the number of levels ! 38: of indirect addressing supported by the machine. If it is zero, ! 39: indirect addressing is not valid. If it is one, (MEM (REG n)) ! 40: is valid even if (REG n) did not get a hard register; if it is two, ! 41: (MEM (MEM (REG n))) is also valid even if (REG n) did not get a ! 42: hard register, and similarly for higher values. ! 43: ! 44: Then you must choose the hard regs to reload those pseudo regs into, ! 45: and generate appropriate load insns before this insn and perhaps ! 46: also store insns after this insn. Set up the array `reload_reg_rtx' ! 47: to contain the REG rtx's for the registers you used. In some ! 48: cases `find_reloads' will return a nonzero value in `reload_reg_rtx' ! 49: for certain reloads. Then that tells you which register to use, ! 50: so you do not need to allocate one. But you still do need to add extra ! 51: instructions to copy the value into and out of that register. ! 52: ! 53: Finally you must call `subst_reloads' to substitute the reload reg rtx's ! 54: into the locations already recorded. ! 55: ! 56: NOTE SIDE EFFECTS: ! 57: ! 58: find_reloads can alter the operands of the instruction it is called on. ! 59: ! 60: 1. Two operands of any sort may be interchanged, if they are in a ! 61: commutative instruction. ! 62: This happens only if find_reloads thinks the instruction will compile ! 63: better that way. ! 64: ! 65: 2. Pseudo-registers that are equivalent to constants are replaced ! 66: with those constants if they are not in hard registers. ! 67: ! 68: 1 happens every time find_reloads is called. ! 69: 2 happens only when REPLACE is 1, which is only when ! 70: actually doing the reloads, not when just counting them. ! 71: ! 72: ! 73: Using a reload register for several reloads in one insn: ! 74: ! 75: When an insn has reloads, it is considered as having three parts: ! 76: the input reloads, the insn itself after reloading, and the output reloads. ! 77: Reloads of values used in memory addresses are often needed for only one part. ! 78: ! 79: When this is so, reload_when_needed records which part needs the reload. ! 80: Two reloads for different parts of the insn can share the same reload ! 81: register. ! 82: ! 83: When a reload is used for addresses in multiple parts, or when it is ! 84: an ordinary operand, it is classified as RELOAD_OTHER, and cannot share ! 85: a register with any other reload. */ ! 86: ! 87: #define REG_OK_STRICT ! 88: ! 89: #include "config.h" ! 90: #include "rtl.h" ! 91: #include "insn-config.h" ! 92: #include "insn-codes.h" ! 93: #include "recog.h" ! 94: #include "reload.h" ! 95: #include "regs.h" ! 96: #include "hard-reg-set.h" ! 97: #include "flags.h" ! 98: #include "real.h" ! 99: ! 100: #ifndef REGISTER_MOVE_COST ! 101: #define REGISTER_MOVE_COST(x, y) 2 ! 102: #endif ! 103: ! 104: /* The variables set up by `find_reloads' are: ! 105: ! 106: n_reloads number of distinct reloads needed; max reload # + 1 ! 107: tables indexed by reload number ! 108: reload_in rtx for value to reload from ! 109: reload_out rtx for where to store reload-reg afterward if nec ! 110: (often the same as reload_in) ! 111: reload_reg_class enum reg_class, saying what regs to reload into ! 112: reload_inmode enum machine_mode; mode this operand should have ! 113: when reloaded, on input. ! 114: reload_outmode enum machine_mode; mode this operand should have ! 115: when reloaded, on output. ! 116: reload_optional char, nonzero for an optional reload. ! 117: Optional reloads are ignored unless the ! 118: value is already sitting in a register. ! 119: reload_inc int, positive amount to increment or decrement by if ! 120: reload_in is a PRE_DEC, PRE_INC, POST_DEC, POST_INC. ! 121: Ignored otherwise (don't assume it is zero). ! 122: reload_in_reg rtx. A reg for which reload_in is the equivalent. ! 123: If reload_in is a symbol_ref which came from ! 124: reg_equiv_constant, then this is the pseudo ! 125: which has that symbol_ref as equivalent. ! 126: reload_reg_rtx rtx. This is the register to reload into. ! 127: If it is zero when `find_reloads' returns, ! 128: you must find a suitable register in the class ! 129: specified by reload_reg_class, and store here ! 130: an rtx for that register with mode from ! 131: reload_inmode or reload_outmode. ! 132: reload_nocombine char, nonzero if this reload shouldn't be ! 133: combined with another reload. ! 134: reload_opnum int, operand number being reloaded. This is ! 135: used to group related reloads and need not always ! 136: be equal to the actual operand number in the insn, ! 137: though it current will be; for in-out operands, it ! 138: is one of the two operand numbers. ! 139: reload_when_needed enum, classifies reload as needed either for ! 140: addressing an input reload, addressing an output, ! 141: for addressing a non-reloaded mem ref, ! 142: or for unspecified purposes (i.e., more than one ! 143: of the above). ! 144: reload_secondary_reload int, gives the reload number of a secondary ! 145: reload, when needed; otherwise -1 ! 146: reload_secondary_p int, 1 if this is a secondary register for one ! 147: or more reloads. ! 148: reload_secondary_icode enum insn_code, if a secondary reload is required, ! 149: gives the INSN_CODE that uses the secondary ! 150: reload as a scratch register, or CODE_FOR_nothing ! 151: if the secondary reload register is to be an ! 152: intermediate register. */ ! 153: int n_reloads; ! 154: ! 155: rtx reload_in[MAX_RELOADS]; ! 156: rtx reload_out[MAX_RELOADS]; ! 157: enum reg_class reload_reg_class[MAX_RELOADS]; ! 158: enum machine_mode reload_inmode[MAX_RELOADS]; ! 159: enum machine_mode reload_outmode[MAX_RELOADS]; ! 160: rtx reload_reg_rtx[MAX_RELOADS]; ! 161: char reload_optional[MAX_RELOADS]; ! 162: int reload_inc[MAX_RELOADS]; ! 163: rtx reload_in_reg[MAX_RELOADS]; ! 164: char reload_nocombine[MAX_RELOADS]; ! 165: int reload_opnum[MAX_RELOADS]; ! 166: enum reload_type reload_when_needed[MAX_RELOADS]; ! 167: int reload_secondary_reload[MAX_RELOADS]; ! 168: int reload_secondary_p[MAX_RELOADS]; ! 169: enum insn_code reload_secondary_icode[MAX_RELOADS]; ! 170: ! 171: /* All the "earlyclobber" operands of the current insn ! 172: are recorded here. */ ! 173: int n_earlyclobbers; ! 174: rtx reload_earlyclobbers[MAX_RECOG_OPERANDS]; ! 175: ! 176: int reload_n_operands; ! 177: ! 178: /* Replacing reloads. ! 179: ! 180: If `replace_reloads' is nonzero, then as each reload is recorded ! 181: an entry is made for it in the table `replacements'. ! 182: Then later `subst_reloads' can look through that table and ! 183: perform all the replacements needed. */ ! 184: ! 185: /* Nonzero means record the places to replace. */ ! 186: static int replace_reloads; ! 187: ! 188: /* Each replacement is recorded with a structure like this. */ ! 189: struct replacement ! 190: { ! 191: rtx *where; /* Location to store in */ ! 192: rtx *subreg_loc; /* Location of SUBREG if WHERE is inside ! 193: a SUBREG; 0 otherwise. */ ! 194: int what; /* which reload this is for */ ! 195: enum machine_mode mode; /* mode it must have */ ! 196: }; ! 197: ! 198: static struct replacement replacements[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)]; ! 199: ! 200: /* Number of replacements currently recorded. */ ! 201: static int n_replacements; ! 202: ! 203: /* Used to track what is modified by an operand. */ ! 204: struct decomposition ! 205: { ! 206: int reg_flag; /* Nonzero if referencing a register. */ ! 207: int safe; /* Nonzero if this can't conflict with anything. */ ! 208: rtx base; /* Base adddress for MEM. */ ! 209: HOST_WIDE_INT start; /* Starting offset or register number. */ ! 210: HOST_WIDE_INT end; /* Endinf offset or register number. */ ! 211: }; ! 212: ! 213: /* MEM-rtx's created for pseudo-regs in stack slots not directly addressable; ! 214: (see reg_equiv_address). */ ! 215: static rtx memlocs[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)]; ! 216: static int n_memlocs; ! 217: ! 218: #ifdef SECONDARY_MEMORY_NEEDED ! 219: ! 220: /* Save MEMs needed to copy from one class of registers to another. One MEM ! 221: is used per mode, but normally only one or two modes are ever used. ! 222: ! 223: We keep two versions, before and after register elimination. The one ! 224: after register elimination is record separately for each operand. This ! 225: is done in case the address is not valid to be sure that we separately ! 226: reload each. */ ! 227: ! 228: static rtx secondary_memlocs[NUM_MACHINE_MODES]; ! 229: static rtx secondary_memlocs_elim[NUM_MACHINE_MODES][MAX_RECOG_OPERANDS]; ! 230: #endif ! 231: ! 232: /* The instruction we are doing reloads for; ! 233: so we can test whether a register dies in it. */ ! 234: static rtx this_insn; ! 235: ! 236: /* Nonzero if this instruction is a user-specified asm with operands. */ ! 237: static int this_insn_is_asm; ! 238: ! 239: /* If hard_regs_live_known is nonzero, ! 240: we can tell which hard regs are currently live, ! 241: at least enough to succeed in choosing dummy reloads. */ ! 242: static int hard_regs_live_known; ! 243: ! 244: /* Indexed by hard reg number, ! 245: element is nonegative if hard reg has been spilled. ! 246: This vector is passed to `find_reloads' as an argument ! 247: and is not changed here. */ ! 248: static short *static_reload_reg_p; ! 249: ! 250: /* Set to 1 in subst_reg_equivs if it changes anything. */ ! 251: static int subst_reg_equivs_changed; ! 252: ! 253: /* On return from push_reload, holds the reload-number for the OUT ! 254: operand, which can be different for that from the input operand. */ ! 255: static int output_reloadnum; ! 256: ! 257: static enum reg_class find_secondary_reload PROTO((rtx, enum reg_class, ! 258: enum machine_mode, int, ! 259: enum insn_code *, ! 260: enum machine_mode *, ! 261: enum reg_class *, ! 262: enum insn_code *, ! 263: enum machine_mode *)); ! 264: static int push_reload PROTO((rtx, rtx, rtx *, rtx *, enum reg_class, ! 265: enum machine_mode, enum machine_mode, ! 266: int, int, int, enum reload_type)); ! 267: static void push_replacement PROTO((rtx *, int, enum machine_mode)); ! 268: static void combine_reloads PROTO((void)); ! 269: static rtx find_dummy_reload PROTO((rtx, rtx, rtx *, rtx *, ! 270: enum machine_mode, enum machine_mode, ! 271: enum reg_class, int)); ! 272: static int earlyclobber_operand_p PROTO((rtx)); ! 273: static int hard_reg_set_here_p PROTO((int, int, rtx)); ! 274: static struct decomposition decompose PROTO((rtx)); ! 275: static int immune_p PROTO((rtx, rtx, struct decomposition)); ! 276: static int alternative_allows_memconst PROTO((char *, int)); ! 277: static rtx find_reloads_toplev PROTO((rtx, int, enum reload_type, int, int)); ! 278: static rtx make_memloc PROTO((rtx, int)); ! 279: static int find_reloads_address PROTO((enum machine_mode, rtx *, rtx, rtx *, ! 280: int, enum reload_type, int)); ! 281: static rtx subst_reg_equivs PROTO((rtx)); ! 282: static rtx subst_indexed_address PROTO((rtx)); ! 283: static int find_reloads_address_1 PROTO((rtx, int, rtx *, int, ! 284: enum reload_type,int)); ! 285: static void find_reloads_address_part PROTO((rtx, rtx *, enum reg_class, ! 286: enum machine_mode, int, ! 287: enum reload_type, int)); ! 288: static int find_inc_amount PROTO((rtx, rtx)); ! 289: ! 290: #ifdef HAVE_SECONDARY_RELOADS ! 291: ! 292: /* Determine if any secondary reloads are needed for loading (if IN_P is ! 293: non-zero) or storing (if IN_P is zero) X to or from a reload register of ! 294: register class RELOAD_CLASS in mode RELOAD_MODE. ! 295: ! 296: Return the register class of a secondary reload register, or NO_REGS if ! 297: none. *PMODE is set to the mode that the register is required in. ! 298: If the reload register is needed as a scratch register instead of an ! 299: intermediate register, *PICODE is set to the insn_code of the insn to be ! 300: used to load or store the primary reload register; otherwise *PICODE ! 301: is set to CODE_FOR_nothing. ! 302: ! 303: In some cases (such as storing MQ into an external memory location on ! 304: the RT), both an intermediate register and a scratch register. In that ! 305: case, *PICODE is set to CODE_FOR_nothing, the class for the intermediate ! 306: register is returned, and the *PTERTIARY_... variables are set to describe ! 307: the scratch register. */ ! 308: ! 309: static enum reg_class ! 310: find_secondary_reload (x, reload_class, reload_mode, in_p, picode, pmode, ! 311: ptertiary_class, ptertiary_icode, ptertiary_mode) ! 312: rtx x; ! 313: enum reg_class reload_class; ! 314: enum machine_mode reload_mode; ! 315: int in_p; ! 316: enum insn_code *picode; ! 317: enum machine_mode *pmode; ! 318: enum reg_class *ptertiary_class; ! 319: enum insn_code *ptertiary_icode; ! 320: enum machine_mode *ptertiary_mode; ! 321: { ! 322: enum reg_class class = NO_REGS; ! 323: enum machine_mode mode = reload_mode; ! 324: enum insn_code icode = CODE_FOR_nothing; ! 325: enum reg_class t_class = NO_REGS; ! 326: enum machine_mode t_mode = VOIDmode; ! 327: enum insn_code t_icode = CODE_FOR_nothing; ! 328: ! 329: /* If X is a pseudo-register that has an equivalent MEM (actually, if it ! 330: is still a pseudo-register by now, it *must* have an equivalent MEM ! 331: but we don't want to assume that), use that equivalent when seeing if ! 332: a secondary reload is needed since whether or not a reload is needed ! 333: might be sensitive to the form of the MEM. */ ! 334: ! 335: if (GET_CODE (x) == REG && REGNO (x) >= FIRST_PSEUDO_REGISTER ! 336: && reg_equiv_mem[REGNO (x)] != 0) ! 337: x = reg_equiv_mem[REGNO (x)]; ! 338: ! 339: #ifdef SECONDARY_INPUT_RELOAD_CLASS ! 340: if (in_p) ! 341: class = SECONDARY_INPUT_RELOAD_CLASS (reload_class, reload_mode, x); ! 342: #endif ! 343: ! 344: #ifdef SECONDARY_OUTPUT_RELOAD_CLASS ! 345: if (! in_p) ! 346: class = SECONDARY_OUTPUT_RELOAD_CLASS (reload_class, reload_mode, x); ! 347: #endif ! 348: ! 349: /* If we don't need any secondary registers, go away; the rest of the ! 350: values won't be used. */ ! 351: if (class == NO_REGS) ! 352: return NO_REGS; ! 353: ! 354: /* Get a possible insn to use. If the predicate doesn't accept X, don't ! 355: use the insn. */ ! 356: ! 357: icode = (in_p ? reload_in_optab[(int) reload_mode] ! 358: : reload_out_optab[(int) reload_mode]); ! 359: ! 360: if (icode != CODE_FOR_nothing ! 361: && insn_operand_predicate[(int) icode][in_p] ! 362: && (! (insn_operand_predicate[(int) icode][in_p]) (x, reload_mode))) ! 363: icode = CODE_FOR_nothing; ! 364: ! 365: /* If we will be using an insn, see if it can directly handle the reload ! 366: register we will be using. If it can, the secondary reload is for a ! 367: scratch register. If it can't, we will use the secondary reload for ! 368: an intermediate register and require a tertiary reload for the scratch ! 369: register. */ ! 370: ! 371: if (icode != CODE_FOR_nothing) ! 372: { ! 373: /* If IN_P is non-zero, the reload register will be the output in ! 374: operand 0. If IN_P is zero, the reload register will be the input ! 375: in operand 1. Outputs should have an initial "=", which we must ! 376: skip. */ ! 377: ! 378: char insn_letter = insn_operand_constraint[(int) icode][!in_p][in_p]; ! 379: enum reg_class insn_class ! 380: = (insn_letter == 'r' ? GENERAL_REGS ! 381: : REG_CLASS_FROM_LETTER (insn_letter)); ! 382: ! 383: if (insn_class == NO_REGS ! 384: || (in_p && insn_operand_constraint[(int) icode][!in_p][0] != '=') ! 385: /* The scratch register's constraint must start with "=&". */ ! 386: || insn_operand_constraint[(int) icode][2][0] != '=' ! 387: || insn_operand_constraint[(int) icode][2][1] != '&') ! 388: abort (); ! 389: ! 390: if (reg_class_subset_p (reload_class, insn_class)) ! 391: mode = insn_operand_mode[(int) icode][2]; ! 392: else ! 393: { ! 394: char t_letter = insn_operand_constraint[(int) icode][2][2]; ! 395: class = insn_class; ! 396: t_mode = insn_operand_mode[(int) icode][2]; ! 397: t_class = (t_letter == 'r' ? GENERAL_REGS ! 398: : REG_CLASS_FROM_LETTER (t_letter)); ! 399: t_icode = icode; ! 400: icode = CODE_FOR_nothing; ! 401: } ! 402: } ! 403: ! 404: *pmode = mode; ! 405: *picode = icode; ! 406: *ptertiary_class = t_class; ! 407: *ptertiary_mode = t_mode; ! 408: *ptertiary_icode = t_icode; ! 409: ! 410: return class; ! 411: } ! 412: #endif /* HAVE_SECONDARY_RELOADS */ ! 413: ! 414: #ifdef SECONDARY_MEMORY_NEEDED ! 415: ! 416: /* Return a memory location that will be used to copy X in mode MODE. ! 417: If we haven't already made a location for this mode in this insn, ! 418: call find_reloads_address on the location being returned. */ ! 419: ! 420: rtx ! 421: get_secondary_mem (x, mode, opnum, type) ! 422: rtx x; ! 423: enum machine_mode mode; ! 424: int opnum; ! 425: enum reload_type type; ! 426: { ! 427: rtx loc; ! 428: int mem_valid; ! 429: ! 430: /* If MODE is narrower than a word, widen it. This is required because ! 431: most machines that require these memory locations do not support ! 432: short load and stores from all registers (e.g., FP registers). We could ! 433: possibly conditionalize this, but we lose nothing by doing the wider ! 434: mode. */ ! 435: ! 436: if (GET_MODE_BITSIZE (mode) < BITS_PER_WORD) ! 437: mode = mode_for_size (BITS_PER_WORD, GET_MODE_CLASS (mode), 0); ! 438: ! 439: /* If we already have made a MEM for this operand in MODE, return it. */ ! 440: if (secondary_memlocs_elim[(int) mode][opnum] != 0) ! 441: return secondary_memlocs_elim[(int) mode][opnum]; ! 442: ! 443: /* If this is the first time we've tried to get a MEM for this mode, ! 444: allocate a new one. `something_changed' in reload will get set ! 445: by noticing that the frame size has changed. */ ! 446: ! 447: if (secondary_memlocs[(int) mode] == 0) ! 448: { ! 449: #ifdef SECONDARY_MEMORY_NEEDED_RTX ! 450: secondary_memlocs[(int) mode] = SECONDARY_MEMORY_NEEDED_RTX (mode); ! 451: #else ! 452: secondary_memlocs[(int) mode] ! 453: = assign_stack_local (mode, GET_MODE_SIZE (mode), 0); ! 454: #endif ! 455: } ! 456: ! 457: /* Get a version of the address doing any eliminations needed. If that ! 458: didn't give us a new MEM, make a new one if it isn't valid. */ ! 459: ! 460: loc = eliminate_regs (secondary_memlocs[(int) mode], VOIDmode, NULL_RTX); ! 461: mem_valid = strict_memory_address_p (mode, XEXP (loc, 0)); ! 462: ! 463: if (! mem_valid && loc == secondary_memlocs[(int) mode]) ! 464: loc = copy_rtx (loc); ! 465: ! 466: /* The only time the call below will do anything is if the stack ! 467: offset is too large. In that case IND_LEVELS doesn't matter, so we ! 468: can just pass a zero. Adjust the type to be the address of the ! 469: corresponding object. If the address was valid, save the eliminated ! 470: address. If it wasn't valid, we need to make a reload each time, so ! 471: don't save it. */ ! 472: ! 473: if (! mem_valid) ! 474: { ! 475: type = (type == RELOAD_FOR_INPUT ? RELOAD_FOR_INPUT_ADDRESS ! 476: : type == RELOAD_FOR_OUTPUT ? RELOAD_FOR_OUTPUT_ADDRESS ! 477: : RELOAD_OTHER); ! 478: ! 479: find_reloads_address (mode, NULL_PTR, XEXP (loc, 0), &XEXP (loc, 0), ! 480: opnum, type, 0); ! 481: } ! 482: ! 483: secondary_memlocs_elim[(int) mode][opnum] = loc; ! 484: return loc; ! 485: } ! 486: ! 487: /* Clear any secondary memory locations we've made. */ ! 488: ! 489: void ! 490: clear_secondary_mem () ! 491: { ! 492: bzero (secondary_memlocs, sizeof secondary_memlocs); ! 493: } ! 494: #endif /* SECONDARY_MEMORY_NEEDED */ ! 495: ! 496: /* Record one reload that needs to be performed. ! 497: IN is an rtx saying where the data are to be found before this instruction. ! 498: OUT says where they must be stored after the instruction. ! 499: (IN is zero for data not read, and OUT is zero for data not written.) ! 500: INLOC and OUTLOC point to the places in the instructions where ! 501: IN and OUT were found. ! 502: If IN and OUT are both non-zero, it means the same register must be used ! 503: to reload both IN and OUT. ! 504: ! 505: CLASS is a register class required for the reloaded data. ! 506: INMODE is the machine mode that the instruction requires ! 507: for the reg that replaces IN and OUTMODE is likewise for OUT. ! 508: ! 509: If IN is zero, then OUT's location and mode should be passed as ! 510: INLOC and INMODE. ! 511: ! 512: STRICT_LOW is the 1 if there is a containing STRICT_LOW_PART rtx. ! 513: ! 514: OPTIONAL nonzero means this reload does not need to be performed: ! 515: it can be discarded if that is more convenient. ! 516: ! 517: OPNUM and TYPE say what the purpose of this reload is. ! 518: ! 519: The return value is the reload-number for this reload. ! 520: ! 521: If both IN and OUT are nonzero, in some rare cases we might ! 522: want to make two separate reloads. (Actually we never do this now.) ! 523: Therefore, the reload-number for OUT is stored in ! 524: output_reloadnum when we return; the return value applies to IN. ! 525: Usually (presently always), when IN and OUT are nonzero, ! 526: the two reload-numbers are equal, but the caller should be careful to ! 527: distinguish them. */ ! 528: ! 529: static int ! 530: push_reload (in, out, inloc, outloc, class, ! 531: inmode, outmode, strict_low, optional, opnum, type) ! 532: register rtx in, out; ! 533: rtx *inloc, *outloc; ! 534: enum reg_class class; ! 535: enum machine_mode inmode, outmode; ! 536: int strict_low; ! 537: int optional; ! 538: int opnum; ! 539: enum reload_type type; ! 540: { ! 541: register int i; ! 542: int dont_share = 0; ! 543: rtx *in_subreg_loc = 0, *out_subreg_loc = 0; ! 544: int secondary_reload = -1; ! 545: enum insn_code secondary_icode = CODE_FOR_nothing; ! 546: ! 547: /* Compare two RTX's. */ ! 548: #define MATCHES(x, y) \ ! 549: (x == y || (x != 0 && (GET_CODE (x) == REG \ ! 550: ? GET_CODE (y) == REG && REGNO (x) == REGNO (y) \ ! 551: : rtx_equal_p (x, y) && ! side_effects_p (x)))) ! 552: ! 553: /* Indicates if two reloads purposes are for similar enough things that we ! 554: can merge their reloads. */ ! 555: #define MERGABLE_RELOADS(when1, when2, op1, op2) \ ! 556: ((when1) == RELOAD_OTHER || (when2) == RELOAD_OTHER \ ! 557: || ((when1) == (when2) && (op1) == (op2)) \ ! 558: || ((when1) == RELOAD_FOR_INPUT && (when2) == RELOAD_FOR_INPUT) \ ! 559: || ((when1) == RELOAD_FOR_OPERAND_ADDRESS \ ! 560: && (when2) == RELOAD_FOR_OPERAND_ADDRESS) \ ! 561: || ((when1) == RELOAD_FOR_OTHER_ADDRESS \ ! 562: && (when2) == RELOAD_FOR_OTHER_ADDRESS)) ! 563: ! 564: /* Nonzero if these two reload purposes produce RELOAD_OTHER when merged. */ ! 565: #define MERGE_TO_OTHER(when1, when2, op1, op2) \ ! 566: ((when1) != (when2) \ ! 567: || ! ((op1) == (op2) \ ! 568: || (when1) == RELOAD_FOR_INPUT \ ! 569: || (when1) == RELOAD_FOR_OPERAND_ADDRESS \ ! 570: || (when1) == RELOAD_FOR_OTHER_ADDRESS)) ! 571: ! 572: /* INMODE and/or OUTMODE could be VOIDmode if no mode ! 573: has been specified for the operand. In that case, ! 574: use the operand's mode as the mode to reload. */ ! 575: if (inmode == VOIDmode && in != 0) ! 576: inmode = GET_MODE (in); ! 577: if (outmode == VOIDmode && out != 0) ! 578: outmode = GET_MODE (out); ! 579: ! 580: /* If IN is a pseudo register everywhere-equivalent to a constant, and ! 581: it is not in a hard register, reload straight from the constant, ! 582: since we want to get rid of such pseudo registers. ! 583: Often this is done earlier, but not always in find_reloads_address. */ ! 584: if (in != 0 && GET_CODE (in) == REG) ! 585: { ! 586: register int regno = REGNO (in); ! 587: ! 588: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 589: && reg_equiv_constant[regno] != 0) ! 590: in = reg_equiv_constant[regno]; ! 591: } ! 592: ! 593: /* Likewise for OUT. Of course, OUT will never be equivalent to ! 594: an actual constant, but it might be equivalent to a memory location ! 595: (in the case of a parameter). */ ! 596: if (out != 0 && GET_CODE (out) == REG) ! 597: { ! 598: register int regno = REGNO (out); ! 599: ! 600: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 601: && reg_equiv_constant[regno] != 0) ! 602: out = reg_equiv_constant[regno]; ! 603: } ! 604: ! 605: /* If we have a read-write operand with an address side-effect, ! 606: change either IN or OUT so the side-effect happens only once. */ ! 607: if (in != 0 && out != 0 && GET_CODE (in) == MEM && rtx_equal_p (in, out)) ! 608: { ! 609: if (GET_CODE (XEXP (in, 0)) == POST_INC ! 610: || GET_CODE (XEXP (in, 0)) == POST_DEC) ! 611: in = gen_rtx (MEM, GET_MODE (in), XEXP (XEXP (in, 0), 0)); ! 612: if (GET_CODE (XEXP (in, 0)) == PRE_INC ! 613: || GET_CODE (XEXP (in, 0)) == PRE_DEC) ! 614: out = gen_rtx (MEM, GET_MODE (out), XEXP (XEXP (out, 0), 0)); ! 615: } ! 616: ! 617: /* If we are reloading a (SUBREG constant ...), really reload just the ! 618: inside expression in its own mode. Similarly for (SUBREG (PLUS ...)). ! 619: If we have (SUBREG:M1 (MEM:M2 ...) ...) (or an inner REG that is still ! 620: a pseudo and hence will become a MEM) with M1 wider than M2 and the ! 621: register is a pseudo, also reload the inside expression. ! 622: For machines that extend byte loads, do this for any SUBREG of a pseudo ! 623: where both M1 and M2 are a word or smaller unless they are the same ! 624: size. ! 625: Similar issue for (SUBREG:M1 (REG:M2 ...) ...) for a hard register R where ! 626: either M1 is not valid for R or M2 is wider than a word but we only ! 627: need one word to store an M2-sized quantity in R. ! 628: (However, if OUT is nonzero, we need to reload the reg *and* ! 629: the subreg, so do nothing here, and let following statement handle it.) ! 630: ! 631: Note that the case of (SUBREG (CONST_INT...)...) is handled elsewhere; ! 632: we can't handle it here because CONST_INT does not indicate a mode. ! 633: ! 634: Similarly, we must reload the inside expression if we have a ! 635: STRICT_LOW_PART (presumably, in == out in the cas). ! 636: ! 637: Also reload the inner expression if it does not require a secondary ! 638: reload but the SUBREG does. */ ! 639: ! 640: if (in != 0 && GET_CODE (in) == SUBREG ! 641: && (CONSTANT_P (SUBREG_REG (in)) ! 642: || GET_CODE (SUBREG_REG (in)) == PLUS ! 643: || strict_low ! 644: || (((GET_CODE (SUBREG_REG (in)) == REG ! 645: && REGNO (SUBREG_REG (in)) >= FIRST_PSEUDO_REGISTER) ! 646: || GET_CODE (SUBREG_REG (in)) == MEM) ! 647: && ((GET_MODE_SIZE (inmode) ! 648: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (in)))) ! 649: #ifdef LOAD_EXTEND_OP ! 650: || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD ! 651: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 652: <= UNITS_PER_WORD) ! 653: && (GET_MODE_SIZE (inmode) ! 654: != GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))))) ! 655: #endif ! 656: )) ! 657: || (GET_CODE (SUBREG_REG (in)) == REG ! 658: && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER ! 659: /* The case where out is nonzero ! 660: is handled differently in the following statement. */ ! 661: && (out == 0 || SUBREG_WORD (in) == 0) ! 662: && ((GET_MODE_SIZE (inmode) <= UNITS_PER_WORD ! 663: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 664: > UNITS_PER_WORD) ! 665: && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 666: / UNITS_PER_WORD) ! 667: != HARD_REGNO_NREGS (REGNO (SUBREG_REG (in)), ! 668: GET_MODE (SUBREG_REG (in))))) ! 669: || ! HARD_REGNO_MODE_OK ((REGNO (SUBREG_REG (in)) ! 670: + SUBREG_WORD (in)), ! 671: inmode))) ! 672: #ifdef SECONDARY_INPUT_RELOAD_CLASS ! 673: || (SECONDARY_INPUT_RELOAD_CLASS (class, inmode, in) != NO_REGS ! 674: && (SECONDARY_INPUT_RELOAD_CLASS (class, ! 675: GET_MODE (SUBREG_REG (in)), ! 676: SUBREG_REG (in)) ! 677: == NO_REGS)) ! 678: #endif ! 679: )) ! 680: { ! 681: in_subreg_loc = inloc; ! 682: inloc = &SUBREG_REG (in); ! 683: in = *inloc; ! 684: #ifndef LOAD_EXTEND_OP ! 685: if (GET_CODE (in) == MEM) ! 686: /* This is supposed to happen only for paradoxical subregs made by ! 687: combine.c. (SUBREG (MEM)) isn't supposed to occur other ways. */ ! 688: if (GET_MODE_SIZE (GET_MODE (in)) > GET_MODE_SIZE (inmode)) ! 689: abort (); ! 690: #endif ! 691: inmode = GET_MODE (in); ! 692: } ! 693: ! 694: /* Similar issue for (SUBREG:M1 (REG:M2 ...) ...) for a hard register R where ! 695: either M1 is not valid for R or M2 is wider than a word but we only ! 696: need one word to store an M2-sized quantity in R. ! 697: ! 698: However, we must reload the inner reg *as well as* the subreg in ! 699: that case. */ ! 700: ! 701: if (in != 0 && GET_CODE (in) == SUBREG ! 702: && GET_CODE (SUBREG_REG (in)) == REG ! 703: && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER ! 704: && (! HARD_REGNO_MODE_OK (REGNO (SUBREG_REG (in)), inmode) ! 705: || (GET_MODE_SIZE (inmode) <= UNITS_PER_WORD ! 706: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 707: > UNITS_PER_WORD) ! 708: && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 709: / UNITS_PER_WORD) ! 710: != HARD_REGNO_NREGS (REGNO (SUBREG_REG (in)), ! 711: GET_MODE (SUBREG_REG (in))))))) ! 712: { ! 713: push_reload (SUBREG_REG (in), NULL_RTX, &SUBREG_REG (in), NULL_PTR, ! 714: GENERAL_REGS, VOIDmode, VOIDmode, 0, 0, opnum, type); ! 715: } ! 716: ! 717: ! 718: /* Similarly for paradoxical and problematical SUBREGs on the output. ! 719: Note that there is no reason we need worry about the previous value ! 720: of SUBREG_REG (out); even if wider than out, ! 721: storing in a subreg is entitled to clobber it all ! 722: (except in the case of STRICT_LOW_PART, ! 723: and in that case the constraint should label it input-output.) */ ! 724: if (out != 0 && GET_CODE (out) == SUBREG ! 725: && (CONSTANT_P (SUBREG_REG (out)) ! 726: || strict_low ! 727: || (((GET_CODE (SUBREG_REG (out)) == REG ! 728: && REGNO (SUBREG_REG (out)) >= FIRST_PSEUDO_REGISTER) ! 729: || GET_CODE (SUBREG_REG (out)) == MEM) ! 730: && ((GET_MODE_SIZE (outmode) ! 731: > GET_MODE_SIZE (GET_MODE (SUBREG_REG (out)))) ! 732: #ifdef LOAD_EXTEND_OP ! 733: || (GET_MODE_SIZE (outmode) <= UNITS_PER_WORD ! 734: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) ! 735: <= UNITS_PER_WORD) ! 736: && (GET_MODE_SIZE (outmode) ! 737: != GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))))) ! 738: #endif ! 739: )) ! 740: || (GET_CODE (SUBREG_REG (out)) == REG ! 741: && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER ! 742: && ((GET_MODE_SIZE (outmode) <= UNITS_PER_WORD ! 743: && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) ! 744: > UNITS_PER_WORD) ! 745: && ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (out))) ! 746: / UNITS_PER_WORD) ! 747: != HARD_REGNO_NREGS (REGNO (SUBREG_REG (out)), ! 748: GET_MODE (SUBREG_REG (out))))) ! 749: || ! HARD_REGNO_MODE_OK ((REGNO (SUBREG_REG (out)) ! 750: + SUBREG_WORD (out)), ! 751: outmode))) ! 752: #ifdef SECONDARY_OUTPUT_RELOAD_CLASS ! 753: || (SECONDARY_OUTPUT_RELOAD_CLASS (class, outmode, out) != NO_REGS ! 754: && (SECONDARY_OUTPUT_RELOAD_CLASS (class, ! 755: GET_MODE (SUBREG_REG (out)), ! 756: SUBREG_REG (out)) ! 757: == NO_REGS)) ! 758: #endif ! 759: )) ! 760: { ! 761: out_subreg_loc = outloc; ! 762: outloc = &SUBREG_REG (out); ! 763: out = *outloc; ! 764: #ifndef LOAD_EXTEND_OP ! 765: if (GET_CODE (out) == MEM ! 766: && GET_MODE_SIZE (GET_MODE (out)) > GET_MODE_SIZE (outmode)) ! 767: abort (); ! 768: #endif ! 769: outmode = GET_MODE (out); ! 770: } ! 771: ! 772: /* If IN appears in OUT, we can't share any input-only reload for IN. */ ! 773: if (in != 0 && out != 0 && GET_CODE (out) == MEM ! 774: && (GET_CODE (in) == REG || GET_CODE (in) == MEM) ! 775: && reg_overlap_mentioned_for_reload_p (in, XEXP (out, 0))) ! 776: dont_share = 1; ! 777: ! 778: /* If IN is a SUBREG of a hard register, make a new REG. This ! 779: simplifies some of the cases below. */ ! 780: ! 781: if (in != 0 && GET_CODE (in) == SUBREG && GET_CODE (SUBREG_REG (in)) == REG ! 782: && REGNO (SUBREG_REG (in)) < FIRST_PSEUDO_REGISTER) ! 783: in = gen_rtx (REG, GET_MODE (in), ! 784: REGNO (SUBREG_REG (in)) + SUBREG_WORD (in)); ! 785: ! 786: /* Similarly for OUT. */ ! 787: if (out != 0 && GET_CODE (out) == SUBREG ! 788: && GET_CODE (SUBREG_REG (out)) == REG ! 789: && REGNO (SUBREG_REG (out)) < FIRST_PSEUDO_REGISTER) ! 790: out = gen_rtx (REG, GET_MODE (out), ! 791: REGNO (SUBREG_REG (out)) + SUBREG_WORD (out)); ! 792: ! 793: /* Narrow down the class of register wanted if that is ! 794: desirable on this machine for efficiency. */ ! 795: if (in != 0) ! 796: class = PREFERRED_RELOAD_CLASS (in, class); ! 797: ! 798: /* Output reloads may need analogous treatment, different in detail. */ ! 799: #ifdef PREFERRED_OUTPUT_RELOAD_CLASS ! 800: if (out != 0) ! 801: class = PREFERRED_OUTPUT_RELOAD_CLASS (out, class); ! 802: #endif ! 803: ! 804: /* Make sure we use a class that can handle the actual pseudo ! 805: inside any subreg. For example, on the 386, QImode regs ! 806: can appear within SImode subregs. Although GENERAL_REGS ! 807: can handle SImode, QImode needs a smaller class. */ ! 808: #ifdef LIMIT_RELOAD_CLASS ! 809: if (in_subreg_loc) ! 810: class = LIMIT_RELOAD_CLASS (inmode, class); ! 811: else if (in != 0 && GET_CODE (in) == SUBREG) ! 812: class = LIMIT_RELOAD_CLASS (GET_MODE (SUBREG_REG (in)), class); ! 813: ! 814: if (out_subreg_loc) ! 815: class = LIMIT_RELOAD_CLASS (outmode, class); ! 816: if (out != 0 && GET_CODE (out) == SUBREG) ! 817: class = LIMIT_RELOAD_CLASS (GET_MODE (SUBREG_REG (out)), class); ! 818: #endif ! 819: ! 820: /* Verify that this class is at least possible for the mode that ! 821: is specified. */ ! 822: if (this_insn_is_asm) ! 823: { ! 824: enum machine_mode mode; ! 825: if (GET_MODE_SIZE (inmode) > GET_MODE_SIZE (outmode)) ! 826: mode = inmode; ! 827: else ! 828: mode = outmode; ! 829: if (mode == VOIDmode) ! 830: { ! 831: error_for_asm (this_insn, "cannot reload integer constant operand in `asm'"); ! 832: mode = word_mode; ! 833: if (in != 0) ! 834: inmode = word_mode; ! 835: if (out != 0) ! 836: outmode = word_mode; ! 837: } ! 838: for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ! 839: if (HARD_REGNO_MODE_OK (i, mode) ! 840: && TEST_HARD_REG_BIT (reg_class_contents[(int) class], i)) ! 841: { ! 842: int nregs = HARD_REGNO_NREGS (i, mode); ! 843: ! 844: int j; ! 845: for (j = 1; j < nregs; j++) ! 846: if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class], i + j)) ! 847: break; ! 848: if (j == nregs) ! 849: break; ! 850: } ! 851: if (i == FIRST_PSEUDO_REGISTER) ! 852: { ! 853: error_for_asm (this_insn, "impossible register constraint in `asm'"); ! 854: class = ALL_REGS; ! 855: } ! 856: } ! 857: ! 858: if (class == NO_REGS) ! 859: abort (); ! 860: ! 861: /* We can use an existing reload if the class is right ! 862: and at least one of IN and OUT is a match ! 863: and the other is at worst neutral. ! 864: (A zero compared against anything is neutral.) ! 865: ! 866: If SMALL_REGISTER_CLASSES, don't use existing reloads unless they are ! 867: for the same thing since that can cause us to need more reload registers ! 868: than we otherwise would. */ ! 869: ! 870: for (i = 0; i < n_reloads; i++) ! 871: if ((reg_class_subset_p (class, reload_reg_class[i]) ! 872: || reg_class_subset_p (reload_reg_class[i], class)) ! 873: /* If the existing reload has a register, it must fit our class. */ ! 874: && (reload_reg_rtx[i] == 0 ! 875: || TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 876: true_regnum (reload_reg_rtx[i]))) ! 877: && ((in != 0 && MATCHES (reload_in[i], in) && ! dont_share ! 878: && (out == 0 || reload_out[i] == 0 || MATCHES (reload_out[i], out))) ! 879: || ! 880: (out != 0 && MATCHES (reload_out[i], out) ! 881: && (in == 0 || reload_in[i] == 0 || MATCHES (reload_in[i], in)))) ! 882: && (reg_class_size[(int) class] == 1 ! 883: #ifdef SMALL_REGISTER_CLASSES ! 884: || 1 ! 885: #endif ! 886: ) ! 887: && MERGABLE_RELOADS (type, reload_when_needed[i], ! 888: opnum, reload_opnum[i])) ! 889: break; ! 890: ! 891: /* Reloading a plain reg for input can match a reload to postincrement ! 892: that reg, since the postincrement's value is the right value. ! 893: Likewise, it can match a preincrement reload, since we regard ! 894: the preincrementation as happening before any ref in this insn ! 895: to that register. */ ! 896: if (i == n_reloads) ! 897: for (i = 0; i < n_reloads; i++) ! 898: if ((reg_class_subset_p (class, reload_reg_class[i]) ! 899: || reg_class_subset_p (reload_reg_class[i], class)) ! 900: /* If the existing reload has a register, it must fit our class. */ ! 901: && (reload_reg_rtx[i] == 0 ! 902: || TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 903: true_regnum (reload_reg_rtx[i]))) ! 904: && out == 0 && reload_out[i] == 0 && reload_in[i] != 0 ! 905: && ((GET_CODE (in) == REG ! 906: && (GET_CODE (reload_in[i]) == POST_INC ! 907: || GET_CODE (reload_in[i]) == POST_DEC ! 908: || GET_CODE (reload_in[i]) == PRE_INC ! 909: || GET_CODE (reload_in[i]) == PRE_DEC) ! 910: && MATCHES (XEXP (reload_in[i], 0), in)) ! 911: || ! 912: (GET_CODE (reload_in[i]) == REG ! 913: && (GET_CODE (in) == POST_INC ! 914: || GET_CODE (in) == POST_DEC ! 915: || GET_CODE (in) == PRE_INC ! 916: || GET_CODE (in) == PRE_DEC) ! 917: && MATCHES (XEXP (in, 0), reload_in[i]))) ! 918: && (reg_class_size[(int) class] == 1 ! 919: #ifdef SMALL_REGISTER_CLASSES ! 920: || 1 ! 921: #endif ! 922: ) ! 923: && MERGABLE_RELOADS (type, reload_when_needed[i], ! 924: opnum, reload_opnum[i])) ! 925: { ! 926: /* Make sure reload_in ultimately has the increment, ! 927: not the plain register. */ ! 928: if (GET_CODE (in) == REG) ! 929: in = reload_in[i]; ! 930: break; ! 931: } ! 932: ! 933: if (i == n_reloads) ! 934: { ! 935: #ifdef HAVE_SECONDARY_RELOADS ! 936: enum reg_class secondary_class = NO_REGS; ! 937: enum reg_class secondary_out_class = NO_REGS; ! 938: enum machine_mode secondary_mode = inmode; ! 939: enum machine_mode secondary_out_mode = outmode; ! 940: enum insn_code secondary_icode; ! 941: enum insn_code secondary_out_icode = CODE_FOR_nothing; ! 942: enum reg_class tertiary_class = NO_REGS; ! 943: enum reg_class tertiary_out_class = NO_REGS; ! 944: enum machine_mode tertiary_mode; ! 945: enum machine_mode tertiary_out_mode; ! 946: enum insn_code tertiary_icode; ! 947: enum insn_code tertiary_out_icode = CODE_FOR_nothing; ! 948: int tertiary_reload = -1; ! 949: ! 950: /* See if we need a secondary reload register to move between ! 951: CLASS and IN or CLASS and OUT. Get the modes and icodes to ! 952: use for each of them if so. */ ! 953: ! 954: #ifdef SECONDARY_INPUT_RELOAD_CLASS ! 955: if (in != 0) ! 956: secondary_class ! 957: = find_secondary_reload (in, class, inmode, 1, &secondary_icode, ! 958: &secondary_mode, &tertiary_class, ! 959: &tertiary_icode, &tertiary_mode); ! 960: #endif ! 961: ! 962: #ifdef SECONDARY_OUTPUT_RELOAD_CLASS ! 963: if (out != 0 && GET_CODE (out) != SCRATCH) ! 964: secondary_out_class ! 965: = find_secondary_reload (out, class, outmode, 0, ! 966: &secondary_out_icode, &secondary_out_mode, ! 967: &tertiary_out_class, &tertiary_out_icode, ! 968: &tertiary_out_mode); ! 969: #endif ! 970: ! 971: /* We can only record one secondary and one tertiary reload. If both ! 972: IN and OUT need secondary reloads, we can only make an in-out ! 973: reload if neither need an insn and if the classes are compatible. ! 974: If they aren't, all we can do is abort since making two separate ! 975: reloads is invalid. */ ! 976: ! 977: if (secondary_class != NO_REGS && secondary_out_class != NO_REGS ! 978: && reg_class_subset_p (secondary_out_class, secondary_class)) ! 979: secondary_class = secondary_out_class; ! 980: ! 981: if (secondary_class != NO_REGS && secondary_out_class != NO_REGS ! 982: && (! reg_class_subset_p (secondary_class, secondary_out_class) ! 983: || secondary_icode != CODE_FOR_nothing ! 984: || secondary_out_icode != CODE_FOR_nothing)) ! 985: abort (); ! 986: ! 987: /* If we need a secondary reload for OUT but not IN, copy the ! 988: information. */ ! 989: if (secondary_class == NO_REGS && secondary_out_class != NO_REGS) ! 990: { ! 991: secondary_class = secondary_out_class; ! 992: secondary_icode = secondary_out_icode; ! 993: tertiary_class = tertiary_out_class; ! 994: tertiary_icode = tertiary_out_icode; ! 995: tertiary_mode = tertiary_out_mode; ! 996: } ! 997: ! 998: if (secondary_class != NO_REGS) ! 999: { ! 1000: /* Secondary reloads don't conflict as badly as the primary object ! 1001: being reload. Specifically, we can always treat them as ! 1002: being for an input or output address and hence allowed to be ! 1003: reused in the same manner such address components could be ! 1004: reused. This is used as the reload_type for our secondary ! 1005: reloads. */ ! 1006: ! 1007: enum reload_type secondary_type ! 1008: = (type == RELOAD_FOR_INPUT ? RELOAD_FOR_INPUT_ADDRESS ! 1009: : type == RELOAD_FOR_OUTPUT ? RELOAD_FOR_OUTPUT_ADDRESS ! 1010: : type); ! 1011: ! 1012: /* This case isn't valid, so fail. Reload is allowed to use the ! 1013: same register for RELOAD_FOR_INPUT_ADDRESS and RELOAD_FOR_INPUT ! 1014: reloads, but in the case of a secondary register, we actually ! 1015: need two different registers for correct code. We fail here ! 1016: to prevent the possibility of silently generating incorrect code ! 1017: later. ! 1018: ! 1019: The convention is that secondary input reloads are valid only if ! 1020: the secondary_class is different from class. If you have such ! 1021: a case, you can not use secondary reloads, you must work around ! 1022: the problem some other way. ! 1023: ! 1024: Allow this when secondary_mode is not inmode and assume that ! 1025: the generated code handles this case (it does on the Alpha, which ! 1026: is the only place this currently happens). */ ! 1027: ! 1028: if (type == RELOAD_FOR_INPUT && secondary_class == class ! 1029: && secondary_mode == inmode) ! 1030: abort (); ! 1031: ! 1032: /* If we need a tertiary reload, see if we have one we can reuse ! 1033: or else make one. */ ! 1034: ! 1035: if (tertiary_class != NO_REGS) ! 1036: { ! 1037: for (tertiary_reload = 0; tertiary_reload < n_reloads; ! 1038: tertiary_reload++) ! 1039: if (reload_secondary_p[tertiary_reload] ! 1040: && (reg_class_subset_p (tertiary_class, ! 1041: reload_reg_class[tertiary_reload]) ! 1042: || reg_class_subset_p (reload_reg_class[tertiary_reload], ! 1043: tertiary_class)) ! 1044: && ((reload_inmode[tertiary_reload] == tertiary_mode) ! 1045: || reload_inmode[tertiary_reload] == VOIDmode) ! 1046: && ((reload_outmode[tertiary_reload] == tertiary_mode) ! 1047: || reload_outmode[tertiary_reload] == VOIDmode) ! 1048: && (reload_secondary_icode[tertiary_reload] ! 1049: == CODE_FOR_nothing) ! 1050: && (reg_class_size[(int) tertiary_class] == 1 ! 1051: #ifdef SMALL_REGISTER_CLASSES ! 1052: || 1 ! 1053: #endif ! 1054: ) ! 1055: && MERGABLE_RELOADS (secondary_type, ! 1056: reload_when_needed[tertiary_reload], ! 1057: opnum, reload_opnum[tertiary_reload])) ! 1058: { ! 1059: if (tertiary_mode != VOIDmode) ! 1060: reload_inmode[tertiary_reload] = tertiary_mode; ! 1061: if (tertiary_out_mode != VOIDmode) ! 1062: reload_outmode[tertiary_reload] = tertiary_mode; ! 1063: if (reg_class_subset_p (tertiary_class, ! 1064: reload_reg_class[tertiary_reload])) ! 1065: reload_reg_class[tertiary_reload] = tertiary_class; ! 1066: if (MERGE_TO_OTHER (secondary_type, ! 1067: reload_when_needed[tertiary_reload], ! 1068: opnum, ! 1069: reload_opnum[tertiary_reload])) ! 1070: reload_when_needed[tertiary_reload] = RELOAD_OTHER; ! 1071: reload_opnum[tertiary_reload] ! 1072: = MIN (reload_opnum[tertiary_reload], opnum); ! 1073: reload_optional[tertiary_reload] &= optional; ! 1074: reload_secondary_p[tertiary_reload] = 1; ! 1075: } ! 1076: ! 1077: if (tertiary_reload == n_reloads) ! 1078: { ! 1079: /* We need to make a new tertiary reload for this register ! 1080: class. */ ! 1081: reload_in[tertiary_reload] = reload_out[tertiary_reload] = 0; ! 1082: reload_reg_class[tertiary_reload] = tertiary_class; ! 1083: reload_inmode[tertiary_reload] = tertiary_mode; ! 1084: reload_outmode[tertiary_reload] = tertiary_mode; ! 1085: reload_reg_rtx[tertiary_reload] = 0; ! 1086: reload_optional[tertiary_reload] = optional; ! 1087: reload_inc[tertiary_reload] = 0; ! 1088: /* Maybe we could combine these, but it seems too tricky. */ ! 1089: reload_nocombine[tertiary_reload] = 1; ! 1090: reload_in_reg[tertiary_reload] = 0; ! 1091: reload_opnum[tertiary_reload] = opnum; ! 1092: reload_when_needed[tertiary_reload] = secondary_type; ! 1093: reload_secondary_reload[tertiary_reload] = -1; ! 1094: reload_secondary_icode[tertiary_reload] = CODE_FOR_nothing; ! 1095: reload_secondary_p[tertiary_reload] = 1; ! 1096: ! 1097: n_reloads++; ! 1098: i = n_reloads; ! 1099: } ! 1100: } ! 1101: ! 1102: /* See if we can reuse an existing secondary reload. */ ! 1103: for (secondary_reload = 0; secondary_reload < n_reloads; ! 1104: secondary_reload++) ! 1105: if (reload_secondary_p[secondary_reload] ! 1106: && (reg_class_subset_p (secondary_class, ! 1107: reload_reg_class[secondary_reload]) ! 1108: || reg_class_subset_p (reload_reg_class[secondary_reload], ! 1109: secondary_class)) ! 1110: && ((reload_inmode[secondary_reload] == secondary_mode) ! 1111: || reload_inmode[secondary_reload] == VOIDmode) ! 1112: && ((reload_outmode[secondary_reload] == secondary_out_mode) ! 1113: || reload_outmode[secondary_reload] == VOIDmode) ! 1114: && reload_secondary_reload[secondary_reload] == tertiary_reload ! 1115: && reload_secondary_icode[secondary_reload] == tertiary_icode ! 1116: && (reg_class_size[(int) secondary_class] == 1 ! 1117: #ifdef SMALL_REGISTER_CLASSES ! 1118: || 1 ! 1119: #endif ! 1120: ) ! 1121: && MERGABLE_RELOADS (secondary_type, ! 1122: reload_when_needed[secondary_reload], ! 1123: opnum, reload_opnum[secondary_reload])) ! 1124: { ! 1125: if (secondary_mode != VOIDmode) ! 1126: reload_inmode[secondary_reload] = secondary_mode; ! 1127: if (secondary_out_mode != VOIDmode) ! 1128: reload_outmode[secondary_reload] = secondary_out_mode; ! 1129: if (reg_class_subset_p (secondary_class, ! 1130: reload_reg_class[secondary_reload])) ! 1131: reload_reg_class[secondary_reload] = secondary_class; ! 1132: if (MERGE_TO_OTHER (secondary_type, ! 1133: reload_when_needed[secondary_reload], ! 1134: opnum, reload_opnum[secondary_reload])) ! 1135: reload_when_needed[secondary_reload] = RELOAD_OTHER; ! 1136: reload_opnum[secondary_reload] ! 1137: = MIN (reload_opnum[secondary_reload], opnum); ! 1138: reload_optional[secondary_reload] &= optional; ! 1139: reload_secondary_p[secondary_reload] = 1; ! 1140: } ! 1141: ! 1142: if (secondary_reload == n_reloads) ! 1143: { ! 1144: /* We need to make a new secondary reload for this register ! 1145: class. */ ! 1146: reload_in[secondary_reload] = reload_out[secondary_reload] = 0; ! 1147: reload_reg_class[secondary_reload] = secondary_class; ! 1148: reload_inmode[secondary_reload] = secondary_mode; ! 1149: reload_outmode[secondary_reload] = secondary_out_mode; ! 1150: reload_reg_rtx[secondary_reload] = 0; ! 1151: reload_optional[secondary_reload] = optional; ! 1152: reload_inc[secondary_reload] = 0; ! 1153: /* Maybe we could combine these, but it seems too tricky. */ ! 1154: reload_nocombine[secondary_reload] = 1; ! 1155: reload_in_reg[secondary_reload] = 0; ! 1156: reload_opnum[secondary_reload] = opnum; ! 1157: reload_when_needed[secondary_reload] = secondary_type; ! 1158: reload_secondary_reload[secondary_reload] = tertiary_reload; ! 1159: reload_secondary_icode[secondary_reload] = tertiary_icode; ! 1160: reload_secondary_p[secondary_reload] = 1; ! 1161: ! 1162: n_reloads++; ! 1163: i = n_reloads; ! 1164: ! 1165: #ifdef SECONDARY_MEMORY_NEEDED ! 1166: /* If we need a memory location to copy between the two ! 1167: reload regs, set it up now. */ ! 1168: ! 1169: if (in != 0 && secondary_icode == CODE_FOR_nothing ! 1170: && SECONDARY_MEMORY_NEEDED (secondary_class, class, inmode)) ! 1171: get_secondary_mem (in, inmode, opnum, type); ! 1172: ! 1173: if (out != 0 && secondary_icode == CODE_FOR_nothing ! 1174: && SECONDARY_MEMORY_NEEDED (class, secondary_class, outmode)) ! 1175: get_secondary_mem (out, outmode, opnum, type); ! 1176: #endif ! 1177: } ! 1178: } ! 1179: #endif ! 1180: ! 1181: /* We found no existing reload suitable for re-use. ! 1182: So add an additional reload. */ ! 1183: ! 1184: reload_in[i] = in; ! 1185: reload_out[i] = out; ! 1186: reload_reg_class[i] = class; ! 1187: reload_inmode[i] = inmode; ! 1188: reload_outmode[i] = outmode; ! 1189: reload_reg_rtx[i] = 0; ! 1190: reload_optional[i] = optional; ! 1191: reload_inc[i] = 0; ! 1192: reload_nocombine[i] = 0; ! 1193: reload_in_reg[i] = inloc ? *inloc : 0; ! 1194: reload_opnum[i] = opnum; ! 1195: reload_when_needed[i] = type; ! 1196: reload_secondary_reload[i] = secondary_reload; ! 1197: reload_secondary_icode[i] = secondary_icode; ! 1198: reload_secondary_p[i] = 0; ! 1199: ! 1200: n_reloads++; ! 1201: ! 1202: #ifdef SECONDARY_MEMORY_NEEDED ! 1203: /* If a memory location is needed for the copy, make one. */ ! 1204: if (in != 0 && GET_CODE (in) == REG ! 1205: && REGNO (in) < FIRST_PSEUDO_REGISTER ! 1206: && SECONDARY_MEMORY_NEEDED (REGNO_REG_CLASS (REGNO (in)), ! 1207: class, inmode)) ! 1208: get_secondary_mem (in, inmode, opnum, type); ! 1209: ! 1210: if (out != 0 && GET_CODE (out) == REG ! 1211: && REGNO (out) < FIRST_PSEUDO_REGISTER ! 1212: && SECONDARY_MEMORY_NEEDED (class, REGNO_REG_CLASS (REGNO (out)), ! 1213: outmode)) ! 1214: get_secondary_mem (out, outmode, opnum, type); ! 1215: #endif ! 1216: } ! 1217: else ! 1218: { ! 1219: /* We are reusing an existing reload, ! 1220: but we may have additional information for it. ! 1221: For example, we may now have both IN and OUT ! 1222: while the old one may have just one of them. */ ! 1223: ! 1224: if (inmode != VOIDmode) ! 1225: reload_inmode[i] = inmode; ! 1226: if (outmode != VOIDmode) ! 1227: reload_outmode[i] = outmode; ! 1228: if (in != 0) ! 1229: reload_in[i] = in; ! 1230: if (out != 0) ! 1231: reload_out[i] = out; ! 1232: if (reg_class_subset_p (class, reload_reg_class[i])) ! 1233: reload_reg_class[i] = class; ! 1234: reload_optional[i] &= optional; ! 1235: if (MERGE_TO_OTHER (type, reload_when_needed[i], ! 1236: opnum, reload_opnum[i])) ! 1237: reload_when_needed[i] = RELOAD_OTHER; ! 1238: reload_opnum[i] = MIN (reload_opnum[i], opnum); ! 1239: } ! 1240: ! 1241: /* If the ostensible rtx being reload differs from the rtx found ! 1242: in the location to substitute, this reload is not safe to combine ! 1243: because we cannot reliably tell whether it appears in the insn. */ ! 1244: ! 1245: if (in != 0 && in != *inloc) ! 1246: reload_nocombine[i] = 1; ! 1247: ! 1248: #if 0 ! 1249: /* This was replaced by changes in find_reloads_address_1 and the new ! 1250: function inc_for_reload, which go with a new meaning of reload_inc. */ ! 1251: ! 1252: /* If this is an IN/OUT reload in an insn that sets the CC, ! 1253: it must be for an autoincrement. It doesn't work to store ! 1254: the incremented value after the insn because that would clobber the CC. ! 1255: So we must do the increment of the value reloaded from, ! 1256: increment it, store it back, then decrement again. */ ! 1257: if (out != 0 && sets_cc0_p (PATTERN (this_insn))) ! 1258: { ! 1259: out = 0; ! 1260: reload_out[i] = 0; ! 1261: reload_inc[i] = find_inc_amount (PATTERN (this_insn), in); ! 1262: /* If we did not find a nonzero amount-to-increment-by, ! 1263: that contradicts the belief that IN is being incremented ! 1264: in an address in this insn. */ ! 1265: if (reload_inc[i] == 0) ! 1266: abort (); ! 1267: } ! 1268: #endif ! 1269: ! 1270: /* If we will replace IN and OUT with the reload-reg, ! 1271: record where they are located so that substitution need ! 1272: not do a tree walk. */ ! 1273: ! 1274: if (replace_reloads) ! 1275: { ! 1276: if (inloc != 0) ! 1277: { ! 1278: register struct replacement *r = &replacements[n_replacements++]; ! 1279: r->what = i; ! 1280: r->subreg_loc = in_subreg_loc; ! 1281: r->where = inloc; ! 1282: r->mode = inmode; ! 1283: } ! 1284: if (outloc != 0 && outloc != inloc) ! 1285: { ! 1286: register struct replacement *r = &replacements[n_replacements++]; ! 1287: r->what = i; ! 1288: r->where = outloc; ! 1289: r->subreg_loc = out_subreg_loc; ! 1290: r->mode = outmode; ! 1291: } ! 1292: } ! 1293: ! 1294: /* If this reload is just being introduced and it has both ! 1295: an incoming quantity and an outgoing quantity that are ! 1296: supposed to be made to match, see if either one of the two ! 1297: can serve as the place to reload into. ! 1298: ! 1299: If one of them is acceptable, set reload_reg_rtx[i] ! 1300: to that one. */ ! 1301: ! 1302: if (in != 0 && out != 0 && in != out && reload_reg_rtx[i] == 0) ! 1303: { ! 1304: reload_reg_rtx[i] = find_dummy_reload (in, out, inloc, outloc, ! 1305: inmode, outmode, ! 1306: reload_reg_class[i], i); ! 1307: ! 1308: /* If the outgoing register already contains the same value ! 1309: as the incoming one, we can dispense with loading it. ! 1310: The easiest way to tell the caller that is to give a phony ! 1311: value for the incoming operand (same as outgoing one). */ ! 1312: if (reload_reg_rtx[i] == out ! 1313: && (GET_CODE (in) == REG || CONSTANT_P (in)) ! 1314: && 0 != find_equiv_reg (in, this_insn, 0, REGNO (out), ! 1315: static_reload_reg_p, i, inmode)) ! 1316: reload_in[i] = out; ! 1317: } ! 1318: ! 1319: /* If this is an input reload and the operand contains a register that ! 1320: dies in this insn and is used nowhere else, see if it is the right class ! 1321: to be used for this reload. Use it if so. (This occurs most commonly ! 1322: in the case of paradoxical SUBREGs and in-out reloads). We cannot do ! 1323: this if it is also an output reload that mentions the register unless ! 1324: the output is a SUBREG that clobbers an entire register. ! 1325: ! 1326: Note that the operand might be one of the spill regs, if it is a ! 1327: pseudo reg and we are in a block where spilling has not taken place. ! 1328: But if there is no spilling in this block, that is OK. ! 1329: An explicitly used hard reg cannot be a spill reg. */ ! 1330: ! 1331: if (reload_reg_rtx[i] == 0 && in != 0) ! 1332: { ! 1333: rtx note; ! 1334: int regno; ! 1335: ! 1336: for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1)) ! 1337: if (REG_NOTE_KIND (note) == REG_DEAD ! 1338: && GET_CODE (XEXP (note, 0)) == REG ! 1339: && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER ! 1340: && reg_mentioned_p (XEXP (note, 0), in) ! 1341: && ! refers_to_regno_for_reload_p (regno, ! 1342: (regno ! 1343: + HARD_REGNO_NREGS (regno, ! 1344: inmode)), ! 1345: PATTERN (this_insn), inloc) ! 1346: /* If this is also an output reload, IN cannot be used as ! 1347: the reload register if it is set in this insn unless IN ! 1348: is also OUT. */ ! 1349: && (out == 0 || in == out ! 1350: || ! hard_reg_set_here_p (regno, ! 1351: (regno ! 1352: + HARD_REGNO_NREGS (regno, ! 1353: inmode)), ! 1354: PATTERN (this_insn))) ! 1355: /* ??? Why is this code so different from the previous? ! 1356: Is there any simple coherent way to describe the two together? ! 1357: What's going on here. */ ! 1358: && (in != out ! 1359: || (GET_CODE (in) == SUBREG ! 1360: && (((GET_MODE_SIZE (GET_MODE (in)) + (UNITS_PER_WORD - 1)) ! 1361: / UNITS_PER_WORD) ! 1362: == ((GET_MODE_SIZE (GET_MODE (SUBREG_REG (in))) ! 1363: + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)))) ! 1364: /* Make sure the operand fits in the reg that dies. */ ! 1365: && GET_MODE_SIZE (inmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) ! 1366: && HARD_REGNO_MODE_OK (regno, inmode) ! 1367: && GET_MODE_SIZE (outmode) <= GET_MODE_SIZE (GET_MODE (XEXP (note, 0))) ! 1368: && HARD_REGNO_MODE_OK (regno, outmode) ! 1369: && TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno) ! 1370: && !fixed_regs[regno]) ! 1371: { ! 1372: reload_reg_rtx[i] = gen_rtx (REG, inmode, regno); ! 1373: break; ! 1374: } ! 1375: } ! 1376: ! 1377: if (out) ! 1378: output_reloadnum = i; ! 1379: ! 1380: return i; ! 1381: } ! 1382: ! 1383: /* Record an additional place we must replace a value ! 1384: for which we have already recorded a reload. ! 1385: RELOADNUM is the value returned by push_reload ! 1386: when the reload was recorded. ! 1387: This is used in insn patterns that use match_dup. */ ! 1388: ! 1389: static void ! 1390: push_replacement (loc, reloadnum, mode) ! 1391: rtx *loc; ! 1392: int reloadnum; ! 1393: enum machine_mode mode; ! 1394: { ! 1395: if (replace_reloads) ! 1396: { ! 1397: register struct replacement *r = &replacements[n_replacements++]; ! 1398: r->what = reloadnum; ! 1399: r->where = loc; ! 1400: r->subreg_loc = 0; ! 1401: r->mode = mode; ! 1402: } ! 1403: } ! 1404: ! 1405: /* Transfer all replacements that used to be in reload FROM to be in ! 1406: reload TO. */ ! 1407: ! 1408: void ! 1409: transfer_replacements (to, from) ! 1410: int to, from; ! 1411: { ! 1412: int i; ! 1413: ! 1414: for (i = 0; i < n_replacements; i++) ! 1415: if (replacements[i].what == from) ! 1416: replacements[i].what = to; ! 1417: } ! 1418: ! 1419: /* If there is only one output reload, and it is not for an earlyclobber ! 1420: operand, try to combine it with a (logically unrelated) input reload ! 1421: to reduce the number of reload registers needed. ! 1422: ! 1423: This is safe if the input reload does not appear in ! 1424: the value being output-reloaded, because this implies ! 1425: it is not needed any more once the original insn completes. ! 1426: ! 1427: If that doesn't work, see we can use any of the registers that ! 1428: die in this insn as a reload register. We can if it is of the right ! 1429: class and does not appear in the value being output-reloaded. */ ! 1430: ! 1431: static void ! 1432: combine_reloads () ! 1433: { ! 1434: int i; ! 1435: int output_reload = -1; ! 1436: rtx note; ! 1437: ! 1438: /* Find the output reload; return unless there is exactly one ! 1439: and that one is mandatory. */ ! 1440: ! 1441: for (i = 0; i < n_reloads; i++) ! 1442: if (reload_out[i] != 0) ! 1443: { ! 1444: if (output_reload >= 0) ! 1445: return; ! 1446: output_reload = i; ! 1447: } ! 1448: ! 1449: if (output_reload < 0 || reload_optional[output_reload]) ! 1450: return; ! 1451: ! 1452: /* An input-output reload isn't combinable. */ ! 1453: ! 1454: if (reload_in[output_reload] != 0) ! 1455: return; ! 1456: ! 1457: /* If this reload is for an earlyclobber operand, we can't do anything. */ ! 1458: if (earlyclobber_operand_p (reload_out[output_reload])) ! 1459: return; ! 1460: ! 1461: /* Check each input reload; can we combine it? */ ! 1462: ! 1463: for (i = 0; i < n_reloads; i++) ! 1464: if (reload_in[i] && ! reload_optional[i] && ! reload_nocombine[i] ! 1465: /* Life span of this reload must not extend past main insn. */ ! 1466: && reload_when_needed[i] != RELOAD_FOR_OUTPUT_ADDRESS ! 1467: && reload_when_needed[i] != RELOAD_OTHER ! 1468: && (CLASS_MAX_NREGS (reload_reg_class[i], reload_inmode[i]) ! 1469: == CLASS_MAX_NREGS (reload_reg_class[output_reload], ! 1470: reload_outmode[output_reload])) ! 1471: && reload_inc[i] == 0 ! 1472: && reload_reg_rtx[i] == 0 ! 1473: /* Don't combine two reloads with different secondary reloads. */ ! 1474: && (reload_secondary_reload[i] == reload_secondary_reload[output_reload] ! 1475: || reload_secondary_reload[i] == -1 ! 1476: || reload_secondary_reload[output_reload] == -1) ! 1477: #ifdef SECONDARY_MEMORY_NEEDED ! 1478: /* Likewise for different secondary memory locations. */ ! 1479: && (secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[i]] == 0 ! 1480: || secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[output_reload]] == 0 ! 1481: || rtx_equal_p (secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[i]], ! 1482: secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[output_reload]])) ! 1483: #endif ! 1484: #ifdef SMALL_REGISTER_CLASSES ! 1485: && reload_reg_class[i] == reload_reg_class[output_reload] ! 1486: #else ! 1487: && (reg_class_subset_p (reload_reg_class[i], ! 1488: reload_reg_class[output_reload]) ! 1489: || reg_class_subset_p (reload_reg_class[output_reload], ! 1490: reload_reg_class[i])) ! 1491: #endif ! 1492: && (MATCHES (reload_in[i], reload_out[output_reload]) ! 1493: /* Args reversed because the first arg seems to be ! 1494: the one that we imagine being modified ! 1495: while the second is the one that might be affected. */ ! 1496: || (! reg_overlap_mentioned_for_reload_p (reload_out[output_reload], ! 1497: reload_in[i]) ! 1498: /* However, if the input is a register that appears inside ! 1499: the output, then we also can't share. ! 1500: Imagine (set (mem (reg 69)) (plus (reg 69) ...)). ! 1501: If the same reload reg is used for both reg 69 and the ! 1502: result to be stored in memory, then that result ! 1503: will clobber the address of the memory ref. */ ! 1504: && ! (GET_CODE (reload_in[i]) == REG ! 1505: && reg_overlap_mentioned_for_reload_p (reload_in[i], ! 1506: reload_out[output_reload])))) ! 1507: && (reg_class_size[(int) reload_reg_class[i]] ! 1508: #ifdef SMALL_REGISTER_CLASSES ! 1509: || 1 ! 1510: #endif ! 1511: ) ! 1512: /* We will allow making things slightly worse by combining an ! 1513: input and an output, but no worse than that. */ ! 1514: && (reload_when_needed[i] == RELOAD_FOR_INPUT ! 1515: || reload_when_needed[i] == RELOAD_FOR_OUTPUT)) ! 1516: { ! 1517: int j; ! 1518: ! 1519: /* We have found a reload to combine with! */ ! 1520: reload_out[i] = reload_out[output_reload]; ! 1521: reload_outmode[i] = reload_outmode[output_reload]; ! 1522: /* Mark the old output reload as inoperative. */ ! 1523: reload_out[output_reload] = 0; ! 1524: /* The combined reload is needed for the entire insn. */ ! 1525: reload_when_needed[i] = RELOAD_OTHER; ! 1526: /* If the output reload had a secondary reload, copy it. */ ! 1527: if (reload_secondary_reload[output_reload] != -1) ! 1528: reload_secondary_reload[i] = reload_secondary_reload[output_reload]; ! 1529: #ifdef SECONDARY_MEMORY_NEEDED ! 1530: /* Copy any secondary MEM. */ ! 1531: if (secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[output_reload]] != 0) ! 1532: secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[i]] ! 1533: = secondary_memlocs_elim[(int) reload_outmode[output_reload]][reload_opnum[output_reload]]; ! 1534: #endif ! 1535: /* If required, minimize the register class. */ ! 1536: if (reg_class_subset_p (reload_reg_class[output_reload], ! 1537: reload_reg_class[i])) ! 1538: reload_reg_class[i] = reload_reg_class[output_reload]; ! 1539: ! 1540: /* Transfer all replacements from the old reload to the combined. */ ! 1541: for (j = 0; j < n_replacements; j++) ! 1542: if (replacements[j].what == output_reload) ! 1543: replacements[j].what = i; ! 1544: ! 1545: return; ! 1546: } ! 1547: ! 1548: /* If this insn has only one operand that is modified or written (assumed ! 1549: to be the first), it must be the one corresponding to this reload. It ! 1550: is safe to use anything that dies in this insn for that output provided ! 1551: that it does not occur in the output (we already know it isn't an ! 1552: earlyclobber. If this is an asm insn, give up. */ ! 1553: ! 1554: if (INSN_CODE (this_insn) == -1) ! 1555: return; ! 1556: ! 1557: for (i = 1; i < insn_n_operands[INSN_CODE (this_insn)]; i++) ! 1558: if (insn_operand_constraint[INSN_CODE (this_insn)][i][0] == '=' ! 1559: || insn_operand_constraint[INSN_CODE (this_insn)][i][0] == '+') ! 1560: return; ! 1561: ! 1562: /* See if some hard register that dies in this insn and is not used in ! 1563: the output is the right class. Only works if the register we pick ! 1564: up can fully hold our output reload. */ ! 1565: for (note = REG_NOTES (this_insn); note; note = XEXP (note, 1)) ! 1566: if (REG_NOTE_KIND (note) == REG_DEAD ! 1567: && GET_CODE (XEXP (note, 0)) == REG ! 1568: && ! reg_overlap_mentioned_for_reload_p (XEXP (note, 0), ! 1569: reload_out[output_reload]) ! 1570: && REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER ! 1571: && HARD_REGNO_MODE_OK (REGNO (XEXP (note, 0)), reload_outmode[output_reload]) ! 1572: && TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[output_reload]], ! 1573: REGNO (XEXP (note, 0))) ! 1574: && (HARD_REGNO_NREGS (REGNO (XEXP (note, 0)), reload_outmode[output_reload]) ! 1575: <= HARD_REGNO_NREGS (REGNO (XEXP (note, 0)), GET_MODE (XEXP (note, 0)))) ! 1576: && ! fixed_regs[REGNO (XEXP (note, 0))]) ! 1577: { ! 1578: reload_reg_rtx[output_reload] = gen_rtx (REG, ! 1579: reload_outmode[output_reload], ! 1580: REGNO (XEXP (note, 0))); ! 1581: return; ! 1582: } ! 1583: } ! 1584: ! 1585: /* Try to find a reload register for an in-out reload (expressions IN and OUT). ! 1586: See if one of IN and OUT is a register that may be used; ! 1587: this is desirable since a spill-register won't be needed. ! 1588: If so, return the register rtx that proves acceptable. ! 1589: ! 1590: INLOC and OUTLOC are locations where IN and OUT appear in the insn. ! 1591: CLASS is the register class required for the reload. ! 1592: ! 1593: If FOR_REAL is >= 0, it is the number of the reload, ! 1594: and in some cases when it can be discovered that OUT doesn't need ! 1595: to be computed, clear out reload_out[FOR_REAL]. ! 1596: ! 1597: If FOR_REAL is -1, this should not be done, because this call ! 1598: is just to see if a register can be found, not to find and install it. */ ! 1599: ! 1600: static rtx ! 1601: find_dummy_reload (real_in, real_out, inloc, outloc, ! 1602: inmode, outmode, class, for_real) ! 1603: rtx real_in, real_out; ! 1604: rtx *inloc, *outloc; ! 1605: enum machine_mode inmode, outmode; ! 1606: enum reg_class class; ! 1607: int for_real; ! 1608: { ! 1609: rtx in = real_in; ! 1610: rtx out = real_out; ! 1611: int in_offset = 0; ! 1612: int out_offset = 0; ! 1613: rtx value = 0; ! 1614: ! 1615: /* If operands exceed a word, we can't use either of them ! 1616: unless they have the same size. */ ! 1617: if (GET_MODE_SIZE (outmode) != GET_MODE_SIZE (inmode) ! 1618: && (GET_MODE_SIZE (outmode) > UNITS_PER_WORD ! 1619: || GET_MODE_SIZE (inmode) > UNITS_PER_WORD)) ! 1620: return 0; ! 1621: ! 1622: /* Find the inside of any subregs. */ ! 1623: while (GET_CODE (out) == SUBREG) ! 1624: { ! 1625: out_offset = SUBREG_WORD (out); ! 1626: out = SUBREG_REG (out); ! 1627: } ! 1628: while (GET_CODE (in) == SUBREG) ! 1629: { ! 1630: in_offset = SUBREG_WORD (in); ! 1631: in = SUBREG_REG (in); ! 1632: } ! 1633: ! 1634: /* Narrow down the reg class, the same way push_reload will; ! 1635: otherwise we might find a dummy now, but push_reload won't. */ ! 1636: class = PREFERRED_RELOAD_CLASS (in, class); ! 1637: ! 1638: /* See if OUT will do. */ ! 1639: if (GET_CODE (out) == REG ! 1640: && REGNO (out) < FIRST_PSEUDO_REGISTER) ! 1641: { ! 1642: register int regno = REGNO (out) + out_offset; ! 1643: int nwords = HARD_REGNO_NREGS (regno, outmode); ! 1644: rtx saved_rtx; ! 1645: ! 1646: /* When we consider whether the insn uses OUT, ! 1647: ignore references within IN. They don't prevent us ! 1648: from copying IN into OUT, because those refs would ! 1649: move into the insn that reloads IN. ! 1650: ! 1651: However, we only ignore IN in its role as this reload. ! 1652: If the insn uses IN elsewhere and it contains OUT, ! 1653: that counts. We can't be sure it's the "same" operand ! 1654: so it might not go through this reload. */ ! 1655: saved_rtx = *inloc; ! 1656: *inloc = const0_rtx; ! 1657: ! 1658: if (regno < FIRST_PSEUDO_REGISTER ! 1659: /* A fixed reg that can overlap other regs better not be used ! 1660: for reloading in any way. */ ! 1661: #ifdef OVERLAPPING_REGNO_P ! 1662: && ! (fixed_regs[regno] && OVERLAPPING_REGNO_P (regno)) ! 1663: #endif ! 1664: && ! refers_to_regno_for_reload_p (regno, regno + nwords, ! 1665: PATTERN (this_insn), outloc)) ! 1666: { ! 1667: int i; ! 1668: for (i = 0; i < nwords; i++) ! 1669: if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 1670: regno + i)) ! 1671: break; ! 1672: ! 1673: if (i == nwords) ! 1674: { ! 1675: if (GET_CODE (real_out) == REG) ! 1676: value = real_out; ! 1677: else ! 1678: value = gen_rtx (REG, outmode, regno); ! 1679: } ! 1680: } ! 1681: ! 1682: *inloc = saved_rtx; ! 1683: } ! 1684: ! 1685: /* Consider using IN if OUT was not acceptable ! 1686: or if OUT dies in this insn (like the quotient in a divmod insn). ! 1687: We can't use IN unless it is dies in this insn, ! 1688: which means we must know accurately which hard regs are live. ! 1689: Also, the result can't go in IN if IN is used within OUT. */ ! 1690: if (hard_regs_live_known ! 1691: && GET_CODE (in) == REG ! 1692: && REGNO (in) < FIRST_PSEUDO_REGISTER ! 1693: && (value == 0 ! 1694: || find_reg_note (this_insn, REG_UNUSED, real_out)) ! 1695: && find_reg_note (this_insn, REG_DEAD, real_in) ! 1696: && !fixed_regs[REGNO (in)] ! 1697: && HARD_REGNO_MODE_OK (REGNO (in), ! 1698: /* The only case where out and real_out might ! 1699: have different modes is where real_out ! 1700: is a subreg, and in that case, out ! 1701: has a real mode. */ ! 1702: (GET_MODE (out) != VOIDmode ! 1703: ? GET_MODE (out) : outmode))) ! 1704: { ! 1705: register int regno = REGNO (in) + in_offset; ! 1706: int nwords = HARD_REGNO_NREGS (regno, inmode); ! 1707: ! 1708: if (! refers_to_regno_for_reload_p (regno, regno + nwords, out, NULL_PTR) ! 1709: && ! hard_reg_set_here_p (regno, regno + nwords, ! 1710: PATTERN (this_insn))) ! 1711: { ! 1712: int i; ! 1713: for (i = 0; i < nwords; i++) ! 1714: if (! TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 1715: regno + i)) ! 1716: break; ! 1717: ! 1718: if (i == nwords) ! 1719: { ! 1720: /* If we were going to use OUT as the reload reg ! 1721: and changed our mind, it means OUT is a dummy that ! 1722: dies here. So don't bother copying value to it. */ ! 1723: if (for_real >= 0 && value == real_out) ! 1724: reload_out[for_real] = 0; ! 1725: if (GET_CODE (real_in) == REG) ! 1726: value = real_in; ! 1727: else ! 1728: value = gen_rtx (REG, inmode, regno); ! 1729: } ! 1730: } ! 1731: } ! 1732: ! 1733: return value; ! 1734: } ! 1735: ! 1736: /* This page contains subroutines used mainly for determining ! 1737: whether the IN or an OUT of a reload can serve as the ! 1738: reload register. */ ! 1739: ! 1740: /* Return 1 if X is an operand of an insn that is being earlyclobbered. */ ! 1741: ! 1742: static int ! 1743: earlyclobber_operand_p (x) ! 1744: rtx x; ! 1745: { ! 1746: int i; ! 1747: ! 1748: for (i = 0; i < n_earlyclobbers; i++) ! 1749: if (reload_earlyclobbers[i] == x) ! 1750: return 1; ! 1751: ! 1752: return 0; ! 1753: } ! 1754: ! 1755: /* Return 1 if expression X alters a hard reg in the range ! 1756: from BEG_REGNO (inclusive) to END_REGNO (exclusive), ! 1757: either explicitly or in the guise of a pseudo-reg allocated to REGNO. ! 1758: X should be the body of an instruction. */ ! 1759: ! 1760: static int ! 1761: hard_reg_set_here_p (beg_regno, end_regno, x) ! 1762: register int beg_regno, end_regno; ! 1763: rtx x; ! 1764: { ! 1765: if (GET_CODE (x) == SET || GET_CODE (x) == CLOBBER) ! 1766: { ! 1767: register rtx op0 = SET_DEST (x); ! 1768: while (GET_CODE (op0) == SUBREG) ! 1769: op0 = SUBREG_REG (op0); ! 1770: if (GET_CODE (op0) == REG) ! 1771: { ! 1772: register int r = REGNO (op0); ! 1773: /* See if this reg overlaps range under consideration. */ ! 1774: if (r < end_regno ! 1775: && r + HARD_REGNO_NREGS (r, GET_MODE (op0)) > beg_regno) ! 1776: return 1; ! 1777: } ! 1778: } ! 1779: else if (GET_CODE (x) == PARALLEL) ! 1780: { ! 1781: register int i = XVECLEN (x, 0) - 1; ! 1782: for (; i >= 0; i--) ! 1783: if (hard_reg_set_here_p (beg_regno, end_regno, XVECEXP (x, 0, i))) ! 1784: return 1; ! 1785: } ! 1786: ! 1787: return 0; ! 1788: } ! 1789: ! 1790: /* Return 1 if ADDR is a valid memory address for mode MODE, ! 1791: and check that each pseudo reg has the proper kind of ! 1792: hard reg. */ ! 1793: ! 1794: int ! 1795: strict_memory_address_p (mode, addr) ! 1796: enum machine_mode mode; ! 1797: register rtx addr; ! 1798: { ! 1799: GO_IF_LEGITIMATE_ADDRESS (mode, addr, win); ! 1800: return 0; ! 1801: ! 1802: win: ! 1803: return 1; ! 1804: } ! 1805: ! 1806: /* Like rtx_equal_p except that it allows a REG and a SUBREG to match ! 1807: if they are the same hard reg, and has special hacks for ! 1808: autoincrement and autodecrement. ! 1809: This is specifically intended for find_reloads to use ! 1810: in determining whether two operands match. ! 1811: X is the operand whose number is the lower of the two. ! 1812: ! 1813: The value is 2 if Y contains a pre-increment that matches ! 1814: a non-incrementing address in X. */ ! 1815: ! 1816: /* ??? To be completely correct, we should arrange to pass ! 1817: for X the output operand and for Y the input operand. ! 1818: For now, we assume that the output operand has the lower number ! 1819: because that is natural in (SET output (... input ...)). */ ! 1820: ! 1821: int ! 1822: operands_match_p (x, y) ! 1823: register rtx x, y; ! 1824: { ! 1825: register int i; ! 1826: register RTX_CODE code = GET_CODE (x); ! 1827: register char *fmt; ! 1828: int success_2; ! 1829: ! 1830: if (x == y) ! 1831: return 1; ! 1832: if ((code == REG || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG)) ! 1833: && (GET_CODE (y) == REG || (GET_CODE (y) == SUBREG ! 1834: && GET_CODE (SUBREG_REG (y)) == REG))) ! 1835: { ! 1836: register int j; ! 1837: ! 1838: if (code == SUBREG) ! 1839: { ! 1840: i = REGNO (SUBREG_REG (x)); ! 1841: if (i >= FIRST_PSEUDO_REGISTER) ! 1842: goto slow; ! 1843: i += SUBREG_WORD (x); ! 1844: } ! 1845: else ! 1846: i = REGNO (x); ! 1847: ! 1848: if (GET_CODE (y) == SUBREG) ! 1849: { ! 1850: j = REGNO (SUBREG_REG (y)); ! 1851: if (j >= FIRST_PSEUDO_REGISTER) ! 1852: goto slow; ! 1853: j += SUBREG_WORD (y); ! 1854: } ! 1855: else ! 1856: j = REGNO (y); ! 1857: ! 1858: /* On a WORDS_BIG_ENDIAN machine, point to the last register of a ! 1859: multiple hard register group, so that for example (reg:DI 0) and ! 1860: (reg:SI 1) will be considered the same register. */ ! 1861: if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD ! 1862: && i < FIRST_PSEUDO_REGISTER) ! 1863: i += (GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD) - 1; ! 1864: if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (y)) > UNITS_PER_WORD ! 1865: && j < FIRST_PSEUDO_REGISTER) ! 1866: j += (GET_MODE_SIZE (GET_MODE (y)) / UNITS_PER_WORD) - 1; ! 1867: ! 1868: return i == j; ! 1869: } ! 1870: /* If two operands must match, because they are really a single ! 1871: operand of an assembler insn, then two postincrements are invalid ! 1872: because the assembler insn would increment only once. ! 1873: On the other hand, an postincrement matches ordinary indexing ! 1874: if the postincrement is the output operand. */ ! 1875: if (code == POST_DEC || code == POST_INC) ! 1876: return operands_match_p (XEXP (x, 0), y); ! 1877: /* Two preincrements are invalid ! 1878: because the assembler insn would increment only once. ! 1879: On the other hand, an preincrement matches ordinary indexing ! 1880: if the preincrement is the input operand. ! 1881: In this case, return 2, since some callers need to do special ! 1882: things when this happens. */ ! 1883: if (GET_CODE (y) == PRE_DEC || GET_CODE (y) == PRE_INC) ! 1884: return operands_match_p (x, XEXP (y, 0)) ? 2 : 0; ! 1885: ! 1886: slow: ! 1887: ! 1888: /* Now we have disposed of all the cases ! 1889: in which different rtx codes can match. */ ! 1890: if (code != GET_CODE (y)) ! 1891: return 0; ! 1892: if (code == LABEL_REF) ! 1893: return XEXP (x, 0) == XEXP (y, 0); ! 1894: if (code == SYMBOL_REF) ! 1895: return XSTR (x, 0) == XSTR (y, 0); ! 1896: ! 1897: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ ! 1898: ! 1899: if (GET_MODE (x) != GET_MODE (y)) ! 1900: return 0; ! 1901: ! 1902: /* Compare the elements. If any pair of corresponding elements ! 1903: fail to match, return 0 for the whole things. */ ! 1904: ! 1905: success_2 = 0; ! 1906: fmt = GET_RTX_FORMAT (code); ! 1907: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1908: { ! 1909: int val; ! 1910: switch (fmt[i]) ! 1911: { ! 1912: case 'w': ! 1913: if (XWINT (x, i) != XWINT (y, i)) ! 1914: return 0; ! 1915: break; ! 1916: ! 1917: case 'i': ! 1918: if (XINT (x, i) != XINT (y, i)) ! 1919: return 0; ! 1920: break; ! 1921: ! 1922: case 'e': ! 1923: val = operands_match_p (XEXP (x, i), XEXP (y, i)); ! 1924: if (val == 0) ! 1925: return 0; ! 1926: /* If any subexpression returns 2, ! 1927: we should return 2 if we are successful. */ ! 1928: if (val == 2) ! 1929: success_2 = 1; ! 1930: break; ! 1931: ! 1932: case '0': ! 1933: break; ! 1934: ! 1935: /* It is believed that rtx's at this level will never ! 1936: contain anything but integers and other rtx's, ! 1937: except for within LABEL_REFs and SYMBOL_REFs. */ ! 1938: default: ! 1939: abort (); ! 1940: } ! 1941: } ! 1942: return 1 + success_2; ! 1943: } ! 1944: ! 1945: /* Return the number of times character C occurs in string S. */ ! 1946: ! 1947: int ! 1948: n_occurrences (c, s) ! 1949: char c; ! 1950: char *s; ! 1951: { ! 1952: int n = 0; ! 1953: while (*s) ! 1954: n += (*s++ == c); ! 1955: return n; ! 1956: } ! 1957: ! 1958: /* Describe the range of registers or memory referenced by X. ! 1959: If X is a register, set REG_FLAG and put the first register ! 1960: number into START and the last plus one into END. ! 1961: If X is a memory reference, put a base address into BASE ! 1962: and a range of integer offsets into START and END. ! 1963: If X is pushing on the stack, we can assume it causes no trouble, ! 1964: so we set the SAFE field. */ ! 1965: ! 1966: static struct decomposition ! 1967: decompose (x) ! 1968: rtx x; ! 1969: { ! 1970: struct decomposition val; ! 1971: int all_const = 0; ! 1972: ! 1973: val.reg_flag = 0; ! 1974: val.safe = 0; ! 1975: if (GET_CODE (x) == MEM) ! 1976: { ! 1977: rtx base, offset = 0; ! 1978: rtx addr = XEXP (x, 0); ! 1979: ! 1980: if (GET_CODE (addr) == PRE_DEC || GET_CODE (addr) == PRE_INC ! 1981: || GET_CODE (addr) == POST_DEC || GET_CODE (addr) == POST_INC) ! 1982: { ! 1983: val.base = XEXP (addr, 0); ! 1984: val.start = - GET_MODE_SIZE (GET_MODE (x)); ! 1985: val.end = GET_MODE_SIZE (GET_MODE (x)); ! 1986: val.safe = REGNO (val.base) == STACK_POINTER_REGNUM; ! 1987: return val; ! 1988: } ! 1989: ! 1990: if (GET_CODE (addr) == CONST) ! 1991: { ! 1992: addr = XEXP (addr, 0); ! 1993: all_const = 1; ! 1994: } ! 1995: if (GET_CODE (addr) == PLUS) ! 1996: { ! 1997: if (CONSTANT_P (XEXP (addr, 0))) ! 1998: { ! 1999: base = XEXP (addr, 1); ! 2000: offset = XEXP (addr, 0); ! 2001: } ! 2002: else if (CONSTANT_P (XEXP (addr, 1))) ! 2003: { ! 2004: base = XEXP (addr, 0); ! 2005: offset = XEXP (addr, 1); ! 2006: } ! 2007: } ! 2008: ! 2009: if (offset == 0) ! 2010: { ! 2011: base = addr; ! 2012: offset = const0_rtx; ! 2013: } ! 2014: if (GET_CODE (offset) == CONST) ! 2015: offset = XEXP (offset, 0); ! 2016: if (GET_CODE (offset) == PLUS) ! 2017: { ! 2018: if (GET_CODE (XEXP (offset, 0)) == CONST_INT) ! 2019: { ! 2020: base = gen_rtx (PLUS, GET_MODE (base), base, XEXP (offset, 1)); ! 2021: offset = XEXP (offset, 0); ! 2022: } ! 2023: else if (GET_CODE (XEXP (offset, 1)) == CONST_INT) ! 2024: { ! 2025: base = gen_rtx (PLUS, GET_MODE (base), base, XEXP (offset, 0)); ! 2026: offset = XEXP (offset, 1); ! 2027: } ! 2028: else ! 2029: { ! 2030: base = gen_rtx (PLUS, GET_MODE (base), base, offset); ! 2031: offset = const0_rtx; ! 2032: } ! 2033: } ! 2034: else if (GET_CODE (offset) != CONST_INT) ! 2035: { ! 2036: base = gen_rtx (PLUS, GET_MODE (base), base, offset); ! 2037: offset = const0_rtx; ! 2038: } ! 2039: ! 2040: if (all_const && GET_CODE (base) == PLUS) ! 2041: base = gen_rtx (CONST, GET_MODE (base), base); ! 2042: ! 2043: if (GET_CODE (offset) != CONST_INT) ! 2044: abort (); ! 2045: ! 2046: val.start = INTVAL (offset); ! 2047: val.end = val.start + GET_MODE_SIZE (GET_MODE (x)); ! 2048: val.base = base; ! 2049: return val; ! 2050: } ! 2051: else if (GET_CODE (x) == REG) ! 2052: { ! 2053: val.reg_flag = 1; ! 2054: val.start = true_regnum (x); ! 2055: if (val.start < 0) ! 2056: { ! 2057: /* A pseudo with no hard reg. */ ! 2058: val.start = REGNO (x); ! 2059: val.end = val.start + 1; ! 2060: } ! 2061: else ! 2062: /* A hard reg. */ ! 2063: val.end = val.start + HARD_REGNO_NREGS (val.start, GET_MODE (x)); ! 2064: } ! 2065: else if (GET_CODE (x) == SUBREG) ! 2066: { ! 2067: if (GET_CODE (SUBREG_REG (x)) != REG) ! 2068: /* This could be more precise, but it's good enough. */ ! 2069: return decompose (SUBREG_REG (x)); ! 2070: val.reg_flag = 1; ! 2071: val.start = true_regnum (x); ! 2072: if (val.start < 0) ! 2073: return decompose (SUBREG_REG (x)); ! 2074: else ! 2075: /* A hard reg. */ ! 2076: val.end = val.start + HARD_REGNO_NREGS (val.start, GET_MODE (x)); ! 2077: } ! 2078: else if (CONSTANT_P (x) ! 2079: /* This hasn't been assigned yet, so it can't conflict yet. */ ! 2080: || GET_CODE (x) == SCRATCH) ! 2081: val.safe = 1; ! 2082: else ! 2083: abort (); ! 2084: return val; ! 2085: } ! 2086: ! 2087: /* Return 1 if altering Y will not modify the value of X. ! 2088: Y is also described by YDATA, which should be decompose (Y). */ ! 2089: ! 2090: static int ! 2091: immune_p (x, y, ydata) ! 2092: rtx x, y; ! 2093: struct decomposition ydata; ! 2094: { ! 2095: struct decomposition xdata; ! 2096: ! 2097: if (ydata.reg_flag) ! 2098: return !refers_to_regno_for_reload_p (ydata.start, ydata.end, x, NULL_PTR); ! 2099: if (ydata.safe) ! 2100: return 1; ! 2101: ! 2102: if (GET_CODE (y) != MEM) ! 2103: abort (); ! 2104: /* If Y is memory and X is not, Y can't affect X. */ ! 2105: if (GET_CODE (x) != MEM) ! 2106: return 1; ! 2107: ! 2108: xdata = decompose (x); ! 2109: ! 2110: if (! rtx_equal_p (xdata.base, ydata.base)) ! 2111: { ! 2112: /* If bases are distinct symbolic constants, there is no overlap. */ ! 2113: if (CONSTANT_P (xdata.base) && CONSTANT_P (ydata.base)) ! 2114: return 1; ! 2115: /* Constants and stack slots never overlap. */ ! 2116: if (CONSTANT_P (xdata.base) ! 2117: && (ydata.base == frame_pointer_rtx ! 2118: || ydata.base == hard_frame_pointer_rtx ! 2119: || ydata.base == stack_pointer_rtx)) ! 2120: return 1; ! 2121: if (CONSTANT_P (ydata.base) ! 2122: && (xdata.base == frame_pointer_rtx ! 2123: || xdata.base == hard_frame_pointer_rtx ! 2124: || xdata.base == stack_pointer_rtx)) ! 2125: return 1; ! 2126: /* If either base is variable, we don't know anything. */ ! 2127: return 0; ! 2128: } ! 2129: ! 2130: ! 2131: return (xdata.start >= ydata.end || ydata.start >= xdata.end); ! 2132: } ! 2133: ! 2134: /* Similar, but calls decompose. */ ! 2135: ! 2136: int ! 2137: safe_from_earlyclobber (op, clobber) ! 2138: rtx op, clobber; ! 2139: { ! 2140: struct decomposition early_data; ! 2141: ! 2142: early_data = decompose (clobber); ! 2143: return immune_p (op, clobber, early_data); ! 2144: } ! 2145: ! 2146: /* Main entry point of this file: search the body of INSN ! 2147: for values that need reloading and record them with push_reload. ! 2148: REPLACE nonzero means record also where the values occur ! 2149: so that subst_reloads can be used. ! 2150: ! 2151: IND_LEVELS says how many levels of indirection are supported by this ! 2152: machine; a value of zero means that a memory reference is not a valid ! 2153: memory address. ! 2154: ! 2155: LIVE_KNOWN says we have valid information about which hard ! 2156: regs are live at each point in the program; this is true when ! 2157: we are called from global_alloc but false when stupid register ! 2158: allocation has been done. ! 2159: ! 2160: RELOAD_REG_P if nonzero is a vector indexed by hard reg number ! 2161: which is nonnegative if the reg has been commandeered for reloading into. ! 2162: It is copied into STATIC_RELOAD_REG_P and referenced from there ! 2163: by various subroutines. */ ! 2164: ! 2165: void ! 2166: find_reloads (insn, replace, ind_levels, live_known, reload_reg_p) ! 2167: rtx insn; ! 2168: int replace, ind_levels; ! 2169: int live_known; ! 2170: short *reload_reg_p; ! 2171: { ! 2172: #ifdef REGISTER_CONSTRAINTS ! 2173: ! 2174: register int insn_code_number; ! 2175: register int i, j; ! 2176: int noperands; ! 2177: /* These are the constraints for the insn. We don't change them. */ ! 2178: char *constraints1[MAX_RECOG_OPERANDS]; ! 2179: /* These start out as the constraints for the insn ! 2180: and they are chewed up as we consider alternatives. */ ! 2181: char *constraints[MAX_RECOG_OPERANDS]; ! 2182: /* These are the preferred classes for an operand, or NO_REGS if it isn't ! 2183: a register. */ ! 2184: enum reg_class preferred_class[MAX_RECOG_OPERANDS]; ! 2185: char pref_or_nothing[MAX_RECOG_OPERANDS]; ! 2186: /* Nonzero for a MEM operand whose entire address needs a reload. */ ! 2187: int address_reloaded[MAX_RECOG_OPERANDS]; ! 2188: /* Value of enum reload_type to use for operand. */ ! 2189: enum reload_type operand_type[MAX_RECOG_OPERANDS]; ! 2190: /* Value of enum reload_type to use within address of operand. */ ! 2191: enum reload_type address_type[MAX_RECOG_OPERANDS]; ! 2192: /* Save the usage of each operand. */ ! 2193: enum reload_usage { RELOAD_READ, RELOAD_READ_WRITE, RELOAD_WRITE } modified[MAX_RECOG_OPERANDS]; ! 2194: int no_input_reloads = 0, no_output_reloads = 0; ! 2195: int n_alternatives; ! 2196: int this_alternative[MAX_RECOG_OPERANDS]; ! 2197: char this_alternative_win[MAX_RECOG_OPERANDS]; ! 2198: char this_alternative_offmemok[MAX_RECOG_OPERANDS]; ! 2199: char this_alternative_earlyclobber[MAX_RECOG_OPERANDS]; ! 2200: int this_alternative_matches[MAX_RECOG_OPERANDS]; ! 2201: int swapped; ! 2202: int goal_alternative[MAX_RECOG_OPERANDS]; ! 2203: int this_alternative_number; ! 2204: int goal_alternative_number; ! 2205: int operand_reloadnum[MAX_RECOG_OPERANDS]; ! 2206: int goal_alternative_matches[MAX_RECOG_OPERANDS]; ! 2207: int goal_alternative_matched[MAX_RECOG_OPERANDS]; ! 2208: char goal_alternative_win[MAX_RECOG_OPERANDS]; ! 2209: char goal_alternative_offmemok[MAX_RECOG_OPERANDS]; ! 2210: char goal_alternative_earlyclobber[MAX_RECOG_OPERANDS]; ! 2211: int goal_alternative_swapped; ! 2212: int best; ! 2213: int commutative; ! 2214: char operands_match[MAX_RECOG_OPERANDS][MAX_RECOG_OPERANDS]; ! 2215: rtx substed_operand[MAX_RECOG_OPERANDS]; ! 2216: rtx body = PATTERN (insn); ! 2217: rtx set = single_set (insn); ! 2218: int goal_earlyclobber, this_earlyclobber; ! 2219: enum machine_mode operand_mode[MAX_RECOG_OPERANDS]; ! 2220: ! 2221: this_insn = insn; ! 2222: this_insn_is_asm = 0; /* Tentative. */ ! 2223: n_reloads = 0; ! 2224: n_replacements = 0; ! 2225: n_memlocs = 0; ! 2226: n_earlyclobbers = 0; ! 2227: replace_reloads = replace; ! 2228: hard_regs_live_known = live_known; ! 2229: static_reload_reg_p = reload_reg_p; ! 2230: ! 2231: /* JUMP_INSNs and CALL_INSNs are not allowed to have any output reloads; ! 2232: neither are insns that SET cc0. Insns that use CC0 are not allowed ! 2233: to have any input reloads. */ ! 2234: if (GET_CODE (insn) == JUMP_INSN || GET_CODE (insn) == CALL_INSN) ! 2235: no_output_reloads = 1; ! 2236: ! 2237: #ifdef HAVE_cc0 ! 2238: if (reg_referenced_p (cc0_rtx, PATTERN (insn))) ! 2239: no_input_reloads = 1; ! 2240: if (reg_set_p (cc0_rtx, PATTERN (insn))) ! 2241: no_output_reloads = 1; ! 2242: #endif ! 2243: ! 2244: #ifdef SECONDARY_MEMORY_NEEDED ! 2245: /* The eliminated forms of any secondary memory locations are per-insn, so ! 2246: clear them out here. */ ! 2247: ! 2248: bzero (secondary_memlocs_elim, sizeof secondary_memlocs_elim); ! 2249: #endif ! 2250: ! 2251: /* Find what kind of insn this is. NOPERANDS gets number of operands. ! 2252: Make OPERANDS point to a vector of operand values. ! 2253: Make OPERAND_LOCS point to a vector of pointers to ! 2254: where the operands were found. ! 2255: Fill CONSTRAINTS and CONSTRAINTS1 with pointers to the ! 2256: constraint-strings for this insn. ! 2257: Return if the insn needs no reload processing. */ ! 2258: ! 2259: switch (GET_CODE (body)) ! 2260: { ! 2261: case USE: ! 2262: case CLOBBER: ! 2263: case ASM_INPUT: ! 2264: case ADDR_VEC: ! 2265: case ADDR_DIFF_VEC: ! 2266: return; ! 2267: ! 2268: case SET: ! 2269: /* Dispose quickly of (set (reg..) (reg..)) if both have hard regs and it ! 2270: is cheap to move between them. If it is not, there may not be an insn ! 2271: to do the copy, so we may need a reload. */ ! 2272: if (GET_CODE (SET_DEST (body)) == REG ! 2273: && REGNO (SET_DEST (body)) < FIRST_PSEUDO_REGISTER ! 2274: && GET_CODE (SET_SRC (body)) == REG ! 2275: && REGNO (SET_SRC (body)) < FIRST_PSEUDO_REGISTER ! 2276: && REGISTER_MOVE_COST (REGNO_REG_CLASS (REGNO (SET_SRC (body))), ! 2277: REGNO_REG_CLASS (REGNO (SET_DEST (body)))) == 2) ! 2278: return; ! 2279: case PARALLEL: ! 2280: case ASM_OPERANDS: ! 2281: reload_n_operands = noperands = asm_noperands (body); ! 2282: if (noperands >= 0) ! 2283: { ! 2284: /* This insn is an `asm' with operands. */ ! 2285: ! 2286: insn_code_number = -1; ! 2287: this_insn_is_asm = 1; ! 2288: ! 2289: /* expand_asm_operands makes sure there aren't too many operands. */ ! 2290: if (noperands > MAX_RECOG_OPERANDS) ! 2291: abort (); ! 2292: ! 2293: /* Now get the operand values and constraints out of the insn. */ ! 2294: ! 2295: decode_asm_operands (body, recog_operand, recog_operand_loc, ! 2296: constraints, operand_mode); ! 2297: if (noperands > 0) ! 2298: { ! 2299: bcopy (constraints, constraints1, noperands * sizeof (char *)); ! 2300: n_alternatives = n_occurrences (',', constraints[0]) + 1; ! 2301: for (i = 1; i < noperands; i++) ! 2302: if (n_alternatives != n_occurrences (',', constraints[i]) + 1) ! 2303: { ! 2304: error_for_asm (insn, "operand constraints differ in number of alternatives"); ! 2305: /* Avoid further trouble with this insn. */ ! 2306: PATTERN (insn) = gen_rtx (USE, VOIDmode, const0_rtx); ! 2307: n_reloads = 0; ! 2308: return; ! 2309: } ! 2310: } ! 2311: break; ! 2312: } ! 2313: ! 2314: default: ! 2315: /* Ordinary insn: recognize it, get the operands via insn_extract ! 2316: and get the constraints. */ ! 2317: ! 2318: insn_code_number = recog_memoized (insn); ! 2319: if (insn_code_number < 0) ! 2320: fatal_insn_not_found (insn); ! 2321: ! 2322: reload_n_operands = noperands = insn_n_operands[insn_code_number]; ! 2323: n_alternatives = insn_n_alternatives[insn_code_number]; ! 2324: /* Just return "no reloads" if insn has no operands with constraints. */ ! 2325: if (n_alternatives == 0) ! 2326: return; ! 2327: insn_extract (insn); ! 2328: for (i = 0; i < noperands; i++) ! 2329: { ! 2330: constraints[i] = constraints1[i] ! 2331: = insn_operand_constraint[insn_code_number][i]; ! 2332: operand_mode[i] = insn_operand_mode[insn_code_number][i]; ! 2333: } ! 2334: } ! 2335: ! 2336: if (noperands == 0) ! 2337: return; ! 2338: ! 2339: commutative = -1; ! 2340: ! 2341: /* If we will need to know, later, whether some pair of operands ! 2342: are the same, we must compare them now and save the result. ! 2343: Reloading the base and index registers will clobber them ! 2344: and afterward they will fail to match. */ ! 2345: ! 2346: for (i = 0; i < noperands; i++) ! 2347: { ! 2348: register char *p; ! 2349: register int c; ! 2350: ! 2351: substed_operand[i] = recog_operand[i]; ! 2352: p = constraints[i]; ! 2353: ! 2354: modified[i] = RELOAD_READ; ! 2355: ! 2356: /* Scan this operand's constraint to see if it is an output operand, ! 2357: an in-out operand, is commutative, or should match another. */ ! 2358: ! 2359: while (c = *p++) ! 2360: { ! 2361: if (c == '=') ! 2362: modified[i] = RELOAD_WRITE; ! 2363: else if (c == '+') ! 2364: modified[i] = RELOAD_READ_WRITE; ! 2365: else if (c == '%') ! 2366: { ! 2367: /* The last operand should not be marked commutative. */ ! 2368: if (i == noperands - 1) ! 2369: { ! 2370: if (this_insn_is_asm) ! 2371: warning_for_asm (this_insn, ! 2372: "`%%' constraint used with last operand"); ! 2373: else ! 2374: abort (); ! 2375: } ! 2376: else ! 2377: commutative = i; ! 2378: } ! 2379: else if (c >= '0' && c <= '9') ! 2380: { ! 2381: c -= '0'; ! 2382: operands_match[c][i] ! 2383: = operands_match_p (recog_operand[c], recog_operand[i]); ! 2384: ! 2385: /* An operand may not match itself. */ ! 2386: if (c == i) ! 2387: { ! 2388: if (this_insn_is_asm) ! 2389: warning_for_asm (this_insn, ! 2390: "operand %d has constraint %d", i, c); ! 2391: else ! 2392: abort (); ! 2393: } ! 2394: ! 2395: /* If C can be commuted with C+1, and C might need to match I, ! 2396: then C+1 might also need to match I. */ ! 2397: if (commutative >= 0) ! 2398: { ! 2399: if (c == commutative || c == commutative + 1) ! 2400: { ! 2401: int other = c + (c == commutative ? 1 : -1); ! 2402: operands_match[other][i] ! 2403: = operands_match_p (recog_operand[other], recog_operand[i]); ! 2404: } ! 2405: if (i == commutative || i == commutative + 1) ! 2406: { ! 2407: int other = i + (i == commutative ? 1 : -1); ! 2408: operands_match[c][other] ! 2409: = operands_match_p (recog_operand[c], recog_operand[other]); ! 2410: } ! 2411: /* Note that C is supposed to be less than I. ! 2412: No need to consider altering both C and I because in ! 2413: that case we would alter one into the other. */ ! 2414: } ! 2415: } ! 2416: } ! 2417: } ! 2418: ! 2419: /* Examine each operand that is a memory reference or memory address ! 2420: and reload parts of the addresses into index registers. ! 2421: Also here any references to pseudo regs that didn't get hard regs ! 2422: but are equivalent to constants get replaced in the insn itself ! 2423: with those constants. Nobody will ever see them again. ! 2424: ! 2425: Finally, set up the preferred classes of each operand. */ ! 2426: ! 2427: for (i = 0; i < noperands; i++) ! 2428: { ! 2429: register RTX_CODE code = GET_CODE (recog_operand[i]); ! 2430: ! 2431: address_reloaded[i] = 0; ! 2432: operand_type[i] = (modified[i] == RELOAD_READ ? RELOAD_FOR_INPUT ! 2433: : modified[i] == RELOAD_WRITE ? RELOAD_FOR_OUTPUT ! 2434: : RELOAD_OTHER); ! 2435: address_type[i] ! 2436: = (modified[i] == RELOAD_READ ? RELOAD_FOR_INPUT_ADDRESS ! 2437: : modified[i] == RELOAD_WRITE ? RELOAD_FOR_OUTPUT_ADDRESS ! 2438: : RELOAD_OTHER); ! 2439: ! 2440: if (*constraints[i] == 0) ! 2441: /* Ignore things like match_operator operands. */ ! 2442: ; ! 2443: else if (constraints[i][0] == 'p') ! 2444: { ! 2445: find_reloads_address (VOIDmode, NULL_PTR, ! 2446: recog_operand[i], recog_operand_loc[i], ! 2447: i, operand_type[i], ind_levels); ! 2448: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 2449: } ! 2450: else if (code == MEM) ! 2451: { ! 2452: if (find_reloads_address (GET_MODE (recog_operand[i]), ! 2453: recog_operand_loc[i], ! 2454: XEXP (recog_operand[i], 0), ! 2455: &XEXP (recog_operand[i], 0), ! 2456: i, address_type[i], ind_levels)) ! 2457: address_reloaded[i] = 1; ! 2458: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 2459: } ! 2460: else if (code == SUBREG) ! 2461: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i] ! 2462: = find_reloads_toplev (recog_operand[i], i, address_type[i], ! 2463: ind_levels, ! 2464: set != 0 ! 2465: && &SET_DEST (set) == recog_operand_loc[i]); ! 2466: else if (code == PLUS) ! 2467: /* We can get a PLUS as an "operand" as a result of ! 2468: register elimination. See eliminate_regs and gen_input_reload. */ ! 2469: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i] ! 2470: = find_reloads_toplev (recog_operand[i], i, address_type[i], ! 2471: ind_levels, 0); ! 2472: else if (code == REG) ! 2473: { ! 2474: /* This is equivalent to calling find_reloads_toplev. ! 2475: The code is duplicated for speed. ! 2476: When we find a pseudo always equivalent to a constant, ! 2477: we replace it by the constant. We must be sure, however, ! 2478: that we don't try to replace it in the insn in which it ! 2479: is being set. */ ! 2480: register int regno = REGNO (recog_operand[i]); ! 2481: if (reg_equiv_constant[regno] != 0 ! 2482: && (set == 0 || &SET_DEST (set) != recog_operand_loc[i])) ! 2483: substed_operand[i] = recog_operand[i] ! 2484: = reg_equiv_constant[regno]; ! 2485: #if 0 /* This might screw code in reload1.c to delete prior output-reload ! 2486: that feeds this insn. */ ! 2487: if (reg_equiv_mem[regno] != 0) ! 2488: substed_operand[i] = recog_operand[i] ! 2489: = reg_equiv_mem[regno]; ! 2490: #endif ! 2491: if (reg_equiv_address[regno] != 0) ! 2492: { ! 2493: /* If reg_equiv_address is not a constant address, copy it, ! 2494: since it may be shared. */ ! 2495: rtx address = reg_equiv_address[regno]; ! 2496: ! 2497: if (rtx_varies_p (address)) ! 2498: address = copy_rtx (address); ! 2499: ! 2500: /* If this is an output operand, we must output a CLOBBER ! 2501: after INSN so find_equiv_reg knows REGNO is being written. ! 2502: Mark this insn specially, do we can put our output reloads ! 2503: after it. */ ! 2504: ! 2505: if (modified[i] != RELOAD_READ) ! 2506: PUT_MODE (emit_insn_after (gen_rtx (CLOBBER, VOIDmode, ! 2507: recog_operand[i]), ! 2508: insn), ! 2509: DImode); ! 2510: ! 2511: *recog_operand_loc[i] = recog_operand[i] ! 2512: = gen_rtx (MEM, GET_MODE (recog_operand[i]), address); ! 2513: RTX_UNCHANGING_P (recog_operand[i]) ! 2514: = RTX_UNCHANGING_P (regno_reg_rtx[regno]); ! 2515: find_reloads_address (GET_MODE (recog_operand[i]), ! 2516: recog_operand_loc[i], ! 2517: XEXP (recog_operand[i], 0), ! 2518: &XEXP (recog_operand[i], 0), ! 2519: i, address_type[i], ind_levels); ! 2520: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 2521: } ! 2522: } ! 2523: /* If the operand is still a register (we didn't replace it with an ! 2524: equivalent), get the preferred class to reload it into. */ ! 2525: code = GET_CODE (recog_operand[i]); ! 2526: preferred_class[i] ! 2527: = ((code == REG && REGNO (recog_operand[i]) >= FIRST_PSEUDO_REGISTER) ! 2528: ? reg_preferred_class (REGNO (recog_operand[i])) : NO_REGS); ! 2529: pref_or_nothing[i] ! 2530: = (code == REG && REGNO (recog_operand[i]) >= FIRST_PSEUDO_REGISTER ! 2531: && reg_alternate_class (REGNO (recog_operand[i])) == NO_REGS); ! 2532: } ! 2533: ! 2534: /* If this is simply a copy from operand 1 to operand 0, merge the ! 2535: preferred classes for the operands. */ ! 2536: if (set != 0 && noperands >= 2 && recog_operand[0] == SET_DEST (set) ! 2537: && recog_operand[1] == SET_SRC (set)) ! 2538: { ! 2539: preferred_class[0] = preferred_class[1] ! 2540: = reg_class_subunion[(int) preferred_class[0]][(int) preferred_class[1]]; ! 2541: pref_or_nothing[0] |= pref_or_nothing[1]; ! 2542: pref_or_nothing[1] |= pref_or_nothing[0]; ! 2543: } ! 2544: ! 2545: /* Now see what we need for pseudo-regs that didn't get hard regs ! 2546: or got the wrong kind of hard reg. For this, we must consider ! 2547: all the operands together against the register constraints. */ ! 2548: ! 2549: best = MAX_RECOG_OPERANDS + 300; ! 2550: ! 2551: swapped = 0; ! 2552: goal_alternative_swapped = 0; ! 2553: try_swapped: ! 2554: ! 2555: /* The constraints are made of several alternatives. ! 2556: Each operand's constraint looks like foo,bar,... with commas ! 2557: separating the alternatives. The first alternatives for all ! 2558: operands go together, the second alternatives go together, etc. ! 2559: ! 2560: First loop over alternatives. */ ! 2561: ! 2562: for (this_alternative_number = 0; ! 2563: this_alternative_number < n_alternatives; ! 2564: this_alternative_number++) ! 2565: { ! 2566: /* Loop over operands for one constraint alternative. */ ! 2567: /* LOSERS counts those that don't fit this alternative ! 2568: and would require loading. */ ! 2569: int losers = 0; ! 2570: /* BAD is set to 1 if it some operand can't fit this alternative ! 2571: even after reloading. */ ! 2572: int bad = 0; ! 2573: /* REJECT is a count of how undesirable this alternative says it is ! 2574: if any reloading is required. If the alternative matches exactly ! 2575: then REJECT is ignored, but otherwise it gets this much ! 2576: counted against it in addition to the reloading needed. Each ! 2577: ? counts three times here since we want the disparaging caused by ! 2578: a bad register class to only count 1/3 as much. */ ! 2579: int reject = 0; ! 2580: ! 2581: this_earlyclobber = 0; ! 2582: ! 2583: for (i = 0; i < noperands; i++) ! 2584: { ! 2585: register char *p = constraints[i]; ! 2586: register int win = 0; ! 2587: /* 0 => this operand can be reloaded somehow for this alternative */ ! 2588: int badop = 1; ! 2589: /* 0 => this operand can be reloaded if the alternative allows regs. */ ! 2590: int winreg = 0; ! 2591: int c; ! 2592: register rtx operand = recog_operand[i]; ! 2593: int offset = 0; ! 2594: /* Nonzero means this is a MEM that must be reloaded into a reg ! 2595: regardless of what the constraint says. */ ! 2596: int force_reload = 0; ! 2597: int offmemok = 0; ! 2598: int earlyclobber = 0; ! 2599: ! 2600: /* If the operand is a SUBREG, extract ! 2601: the REG or MEM (or maybe even a constant) within. ! 2602: (Constants can occur as a result of reg_equiv_constant.) */ ! 2603: ! 2604: while (GET_CODE (operand) == SUBREG) ! 2605: { ! 2606: offset += SUBREG_WORD (operand); ! 2607: operand = SUBREG_REG (operand); ! 2608: /* Force reload if this is a constant or PLUS or if there may may ! 2609: be a problem accessing OPERAND in the outer mode. */ ! 2610: if (CONSTANT_P (operand) ! 2611: || GET_CODE (operand) == PLUS ! 2612: /* We must force a reload of paradoxical SUBREGs ! 2613: of a MEM because the alignment of the inner value ! 2614: may not be enough to do the outer reference. ! 2615: ! 2616: On machines that extend byte operations and we have a ! 2617: SUBREG where both the inner and outer modes are different ! 2618: size but no wider than a word, combine.c has made ! 2619: assumptions about the behavior of the machine in such ! 2620: register access. If the data is, in fact, in memory we ! 2621: must always load using the size assumed to be in the ! 2622: register and let the insn do the different-sized ! 2623: accesses. */ ! 2624: || ((GET_CODE (operand) == MEM ! 2625: || (GET_CODE (operand)== REG ! 2626: && REGNO (operand) >= FIRST_PSEUDO_REGISTER)) ! 2627: && (((GET_MODE_BITSIZE (GET_MODE (operand)) ! 2628: < BIGGEST_ALIGNMENT) ! 2629: && (GET_MODE_SIZE (operand_mode[i]) ! 2630: > GET_MODE_SIZE (GET_MODE (operand)))) ! 2631: #ifdef LOAD_EXTEND_OP ! 2632: || (GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD ! 2633: && (GET_MODE_SIZE (GET_MODE (operand)) ! 2634: <= UNITS_PER_WORD) ! 2635: && (GET_MODE_SIZE (operand_mode[i]) ! 2636: != GET_MODE_SIZE (GET_MODE (operand)))) ! 2637: #endif ! 2638: )) ! 2639: /* Subreg of a hard reg which can't handle the subreg's mode ! 2640: or which would handle that mode in the wrong number of ! 2641: registers for subregging to work. */ ! 2642: || (GET_CODE (operand) == REG ! 2643: && REGNO (operand) < FIRST_PSEUDO_REGISTER ! 2644: && ((GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD ! 2645: && (GET_MODE_SIZE (GET_MODE (operand)) ! 2646: > UNITS_PER_WORD) ! 2647: && ((GET_MODE_SIZE (GET_MODE (operand)) ! 2648: / UNITS_PER_WORD) ! 2649: != HARD_REGNO_NREGS (REGNO (operand), ! 2650: GET_MODE (operand)))) ! 2651: || ! HARD_REGNO_MODE_OK (REGNO (operand) + offset, ! 2652: operand_mode[i])))) ! 2653: force_reload = 1; ! 2654: } ! 2655: ! 2656: this_alternative[i] = (int) NO_REGS; ! 2657: this_alternative_win[i] = 0; ! 2658: this_alternative_offmemok[i] = 0; ! 2659: this_alternative_earlyclobber[i] = 0; ! 2660: this_alternative_matches[i] = -1; ! 2661: ! 2662: /* An empty constraint or empty alternative ! 2663: allows anything which matched the pattern. */ ! 2664: if (*p == 0 || *p == ',') ! 2665: win = 1, badop = 0; ! 2666: ! 2667: /* Scan this alternative's specs for this operand; ! 2668: set WIN if the operand fits any letter in this alternative. ! 2669: Otherwise, clear BADOP if this operand could ! 2670: fit some letter after reloads, ! 2671: or set WINREG if this operand could fit after reloads ! 2672: provided the constraint allows some registers. */ ! 2673: ! 2674: while (*p && (c = *p++) != ',') ! 2675: switch (c) ! 2676: { ! 2677: case '=': ! 2678: case '+': ! 2679: case '*': ! 2680: break; ! 2681: ! 2682: case '%': ! 2683: /* The last operand should not be marked commutative. */ ! 2684: if (i != noperands - 1) ! 2685: commutative = i; ! 2686: break; ! 2687: ! 2688: case '?': ! 2689: reject += 3; ! 2690: break; ! 2691: ! 2692: case '!': ! 2693: reject = 300; ! 2694: break; ! 2695: ! 2696: case '#': ! 2697: /* Ignore rest of this alternative as far as ! 2698: reloading is concerned. */ ! 2699: while (*p && *p != ',') p++; ! 2700: break; ! 2701: ! 2702: case '0': ! 2703: case '1': ! 2704: case '2': ! 2705: case '3': ! 2706: case '4': ! 2707: c -= '0'; ! 2708: this_alternative_matches[i] = c; ! 2709: /* We are supposed to match a previous operand. ! 2710: If we do, we win if that one did. ! 2711: If we do not, count both of the operands as losers. ! 2712: (This is too conservative, since most of the time ! 2713: only a single reload insn will be needed to make ! 2714: the two operands win. As a result, this alternative ! 2715: may be rejected when it is actually desirable.) */ ! 2716: if ((swapped && (c != commutative || i != commutative + 1)) ! 2717: /* If we are matching as if two operands were swapped, ! 2718: also pretend that operands_match had been computed ! 2719: with swapped. ! 2720: But if I is the second of those and C is the first, ! 2721: don't exchange them, because operands_match is valid ! 2722: only on one side of its diagonal. */ ! 2723: ? (operands_match ! 2724: [(c == commutative || c == commutative + 1) ! 2725: ? 2*commutative + 1 - c : c] ! 2726: [(i == commutative || i == commutative + 1) ! 2727: ? 2*commutative + 1 - i : i]) ! 2728: : operands_match[c][i]) ! 2729: win = this_alternative_win[c]; ! 2730: else ! 2731: { ! 2732: /* Operands don't match. */ ! 2733: rtx value; ! 2734: /* Retroactively mark the operand we had to match ! 2735: as a loser, if it wasn't already. */ ! 2736: if (this_alternative_win[c]) ! 2737: losers++; ! 2738: this_alternative_win[c] = 0; ! 2739: if (this_alternative[c] == (int) NO_REGS) ! 2740: bad = 1; ! 2741: /* But count the pair only once in the total badness of ! 2742: this alternative, if the pair can be a dummy reload. */ ! 2743: value ! 2744: = find_dummy_reload (recog_operand[i], recog_operand[c], ! 2745: recog_operand_loc[i], recog_operand_loc[c], ! 2746: operand_mode[i], operand_mode[c], ! 2747: this_alternative[c], -1); ! 2748: ! 2749: if (value != 0) ! 2750: losers--; ! 2751: } ! 2752: /* This can be fixed with reloads if the operand ! 2753: we are supposed to match can be fixed with reloads. */ ! 2754: badop = 0; ! 2755: this_alternative[i] = this_alternative[c]; ! 2756: ! 2757: /* If we have to reload this operand and some previous ! 2758: operand also had to match the same thing as this ! 2759: operand, we don't know how to do that. So reject this ! 2760: alternative. */ ! 2761: if (! win || force_reload) ! 2762: for (j = 0; j < i; j++) ! 2763: if (this_alternative_matches[j] ! 2764: == this_alternative_matches[i]) ! 2765: badop = 1; ! 2766: ! 2767: break; ! 2768: ! 2769: case 'p': ! 2770: /* All necessary reloads for an address_operand ! 2771: were handled in find_reloads_address. */ ! 2772: this_alternative[i] = (int) ALL_REGS; ! 2773: win = 1; ! 2774: break; ! 2775: ! 2776: case 'm': ! 2777: if (force_reload) ! 2778: break; ! 2779: if (GET_CODE (operand) == MEM ! 2780: || (GET_CODE (operand) == REG ! 2781: && REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 2782: && reg_renumber[REGNO (operand)] < 0)) ! 2783: win = 1; ! 2784: if (CONSTANT_P (operand)) ! 2785: badop = 0; ! 2786: break; ! 2787: ! 2788: case '<': ! 2789: if (GET_CODE (operand) == MEM ! 2790: && ! address_reloaded[i] ! 2791: && (GET_CODE (XEXP (operand, 0)) == PRE_DEC ! 2792: || GET_CODE (XEXP (operand, 0)) == POST_DEC)) ! 2793: win = 1; ! 2794: break; ! 2795: ! 2796: case '>': ! 2797: if (GET_CODE (operand) == MEM ! 2798: && ! address_reloaded[i] ! 2799: && (GET_CODE (XEXP (operand, 0)) == PRE_INC ! 2800: || GET_CODE (XEXP (operand, 0)) == POST_INC)) ! 2801: win = 1; ! 2802: break; ! 2803: ! 2804: /* Memory operand whose address is not offsettable. */ ! 2805: case 'V': ! 2806: if (force_reload) ! 2807: break; ! 2808: if (GET_CODE (operand) == MEM ! 2809: && ! (ind_levels ? offsettable_memref_p (operand) ! 2810: : offsettable_nonstrict_memref_p (operand)) ! 2811: /* Certain mem addresses will become offsettable ! 2812: after they themselves are reloaded. This is important; ! 2813: we don't want our own handling of unoffsettables ! 2814: to override the handling of reg_equiv_address. */ ! 2815: && !(GET_CODE (XEXP (operand, 0)) == REG ! 2816: && (ind_levels == 0 ! 2817: || reg_equiv_address[REGNO (XEXP (operand, 0))] != 0))) ! 2818: win = 1; ! 2819: break; ! 2820: ! 2821: /* Memory operand whose address is offsettable. */ ! 2822: case 'o': ! 2823: if (force_reload) ! 2824: break; ! 2825: if ((GET_CODE (operand) == MEM ! 2826: /* If IND_LEVELS, find_reloads_address won't reload a ! 2827: pseudo that didn't get a hard reg, so we have to ! 2828: reject that case. */ ! 2829: && (ind_levels ? offsettable_memref_p (operand) ! 2830: : offsettable_nonstrict_memref_p (operand))) ! 2831: /* Certain mem addresses will become offsettable ! 2832: after they themselves are reloaded. This is important; ! 2833: we don't want our own handling of unoffsettables ! 2834: to override the handling of reg_equiv_address. */ ! 2835: || (GET_CODE (operand) == MEM ! 2836: && GET_CODE (XEXP (operand, 0)) == REG ! 2837: && (ind_levels == 0 ! 2838: || reg_equiv_address[REGNO (XEXP (operand, 0))] != 0)) ! 2839: || (GET_CODE (operand) == REG ! 2840: && REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 2841: && reg_renumber[REGNO (operand)] < 0 ! 2842: /* If reg_equiv_address is nonzero, we will be ! 2843: loading it into a register; hence it will be ! 2844: offsettable, but we cannot say that reg_equiv_mem ! 2845: is offsettable without checking. */ ! 2846: && ((reg_equiv_mem[REGNO (operand)] != 0 ! 2847: && offsettable_memref_p (reg_equiv_mem[REGNO (operand)])) ! 2848: || (reg_equiv_address[REGNO (operand)] != 0)))) ! 2849: win = 1; ! 2850: if (CONSTANT_P (operand) || GET_CODE (operand) == MEM) ! 2851: badop = 0; ! 2852: offmemok = 1; ! 2853: break; ! 2854: ! 2855: case '&': ! 2856: /* Output operand that is stored before the need for the ! 2857: input operands (and their index registers) is over. */ ! 2858: earlyclobber = 1, this_earlyclobber = 1; ! 2859: break; ! 2860: ! 2861: case 'E': ! 2862: /* Match any floating double constant, but only if ! 2863: we can examine the bits of it reliably. */ ! 2864: if ((HOST_FLOAT_FORMAT != TARGET_FLOAT_FORMAT ! 2865: || HOST_BITS_PER_WIDE_INT != BITS_PER_WORD) ! 2866: && GET_MODE (operand) != VOIDmode && ! flag_pretend_float) ! 2867: break; ! 2868: if (GET_CODE (operand) == CONST_DOUBLE) ! 2869: win = 1; ! 2870: break; ! 2871: ! 2872: case 'F': ! 2873: if (GET_CODE (operand) == CONST_DOUBLE) ! 2874: win = 1; ! 2875: break; ! 2876: ! 2877: case 'G': ! 2878: case 'H': ! 2879: if (GET_CODE (operand) == CONST_DOUBLE ! 2880: && CONST_DOUBLE_OK_FOR_LETTER_P (operand, c)) ! 2881: win = 1; ! 2882: break; ! 2883: ! 2884: case 's': ! 2885: if (GET_CODE (operand) == CONST_INT ! 2886: || (GET_CODE (operand) == CONST_DOUBLE ! 2887: && GET_MODE (operand) == VOIDmode)) ! 2888: break; ! 2889: case 'i': ! 2890: if (CONSTANT_P (operand) ! 2891: #ifdef LEGITIMATE_PIC_OPERAND_P ! 2892: && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (operand)) ! 2893: #endif ! 2894: ) ! 2895: win = 1; ! 2896: break; ! 2897: ! 2898: case 'n': ! 2899: if (GET_CODE (operand) == CONST_INT ! 2900: || (GET_CODE (operand) == CONST_DOUBLE ! 2901: && GET_MODE (operand) == VOIDmode)) ! 2902: win = 1; ! 2903: break; ! 2904: ! 2905: case 'I': ! 2906: case 'J': ! 2907: case 'K': ! 2908: case 'L': ! 2909: case 'M': ! 2910: case 'N': ! 2911: case 'O': ! 2912: case 'P': ! 2913: if (GET_CODE (operand) == CONST_INT ! 2914: && CONST_OK_FOR_LETTER_P (INTVAL (operand), c)) ! 2915: win = 1; ! 2916: break; ! 2917: ! 2918: case 'X': ! 2919: win = 1; ! 2920: break; ! 2921: ! 2922: case 'g': ! 2923: if (! force_reload ! 2924: /* A PLUS is never a valid operand, but reload can make ! 2925: it from a register when eliminating registers. */ ! 2926: && GET_CODE (operand) != PLUS ! 2927: /* A SCRATCH is not a valid operand. */ ! 2928: && GET_CODE (operand) != SCRATCH ! 2929: #ifdef LEGITIMATE_PIC_OPERAND_P ! 2930: && (! CONSTANT_P (operand) ! 2931: || ! flag_pic ! 2932: || LEGITIMATE_PIC_OPERAND_P (operand)) ! 2933: #endif ! 2934: && (GENERAL_REGS == ALL_REGS ! 2935: || GET_CODE (operand) != REG ! 2936: || (REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 2937: && reg_renumber[REGNO (operand)] < 0))) ! 2938: win = 1; ! 2939: /* Drop through into 'r' case */ ! 2940: ! 2941: case 'r': ! 2942: this_alternative[i] ! 2943: = (int) reg_class_subunion[this_alternative[i]][(int) GENERAL_REGS]; ! 2944: goto reg; ! 2945: ! 2946: #ifdef EXTRA_CONSTRAINT ! 2947: case 'Q': ! 2948: case 'R': ! 2949: case 'S': ! 2950: case 'T': ! 2951: case 'U': ! 2952: if (EXTRA_CONSTRAINT (operand, c)) ! 2953: win = 1; ! 2954: break; ! 2955: #endif ! 2956: ! 2957: default: ! 2958: this_alternative[i] ! 2959: = (int) reg_class_subunion[this_alternative[i]][(int) REG_CLASS_FROM_LETTER (c)]; ! 2960: ! 2961: reg: ! 2962: if (GET_MODE (operand) == BLKmode) ! 2963: break; ! 2964: winreg = 1; ! 2965: if (GET_CODE (operand) == REG ! 2966: && reg_fits_class_p (operand, this_alternative[i], ! 2967: offset, GET_MODE (recog_operand[i]))) ! 2968: win = 1; ! 2969: break; ! 2970: } ! 2971: ! 2972: constraints[i] = p; ! 2973: ! 2974: /* If this operand could be handled with a reg, ! 2975: and some reg is allowed, then this operand can be handled. */ ! 2976: if (winreg && this_alternative[i] != (int) NO_REGS) ! 2977: badop = 0; ! 2978: ! 2979: /* Record which operands fit this alternative. */ ! 2980: this_alternative_earlyclobber[i] = earlyclobber; ! 2981: if (win && ! force_reload) ! 2982: this_alternative_win[i] = 1; ! 2983: else ! 2984: { ! 2985: this_alternative_offmemok[i] = offmemok; ! 2986: losers++; ! 2987: if (badop) ! 2988: bad = 1; ! 2989: /* Alternative loses if it has no regs for a reg operand. */ ! 2990: if (GET_CODE (operand) == REG ! 2991: && this_alternative[i] == (int) NO_REGS ! 2992: && this_alternative_matches[i] < 0) ! 2993: bad = 1; ! 2994: ! 2995: /* Alternative loses if it requires a type of reload not ! 2996: permitted for this insn. We can always reload SCRATCH ! 2997: and objects with a REG_UNUSED note. */ ! 2998: if (GET_CODE (operand) != SCRATCH ! 2999: && modified[i] != RELOAD_READ && no_output_reloads ! 3000: && ! find_reg_note (insn, REG_UNUSED, operand)) ! 3001: bad = 1; ! 3002: else if (modified[i] != RELOAD_WRITE && no_input_reloads) ! 3003: bad = 1; ! 3004: ! 3005: /* If this is a constant that is reloaded into the desired ! 3006: class by copying it to memory first, count that as another ! 3007: reload. This is consistent with other code and is ! 3008: required to avoid chosing another alternative when ! 3009: the constant is moved into memory by this function on ! 3010: an early reload pass. Note that the test here is ! 3011: precisely the same as in the code below that calls ! 3012: force_const_mem. */ ! 3013: if (CONSTANT_P (operand) ! 3014: && (PREFERRED_RELOAD_CLASS (operand, ! 3015: (enum reg_class) this_alternative[i]) ! 3016: == NO_REGS) ! 3017: && this_alternative[i] != (int) NO_REGS ! 3018: && operand_mode[i] != VOIDmode) ! 3019: losers++; ! 3020: ! 3021: /* We prefer to reload pseudos over reloading other things, ! 3022: since such reloads may be able to be eliminated later. ! 3023: If we are reloading a SCRATCH, we won't be generating any ! 3024: insns, just using a register, so it is also preferred. ! 3025: So bump REJECT in other cases. */ ! 3026: if (! (GET_CODE (operand) == REG ! 3027: && REGNO (operand) >= FIRST_PSEUDO_REGISTER) ! 3028: && GET_CODE (operand) != SCRATCH) ! 3029: reject++; ! 3030: } ! 3031: ! 3032: /* If this operand is a pseudo register that didn't get a hard ! 3033: reg and this alternative accepts some register, see if the ! 3034: class that we want is a subset of the preferred class for this ! 3035: register. If not, but it intersects that class, use the ! 3036: preferred class instead. If it does not intersect the preferred ! 3037: class, show that usage of this alternative should be discouraged; ! 3038: it will be discouraged more still if the register is `preferred ! 3039: or nothing'. We do this because it increases the chance of ! 3040: reusing our spill register in a later insn and avoiding a pair ! 3041: of memory stores and loads. ! 3042: ! 3043: Don't bother with this if this alternative will accept this ! 3044: operand. ! 3045: ! 3046: Don't do this for a multiword operand, if ! 3047: we have to worry about small classes, because making reg groups ! 3048: harder to allocate is asking for trouble. ! 3049: ! 3050: Don't do this if the preferred class has only one register ! 3051: because we might otherwise exhaust the class. */ ! 3052: ! 3053: ! 3054: if (! win && this_alternative[i] != (int) NO_REGS ! 3055: #ifdef SMALL_REGISTER_CLASSES ! 3056: && GET_MODE_SIZE (operand_mode[i]) <= UNITS_PER_WORD ! 3057: #endif ! 3058: && reg_class_size[(int) preferred_class[i]] > 1) ! 3059: { ! 3060: if (! reg_class_subset_p (this_alternative[i], ! 3061: preferred_class[i])) ! 3062: { ! 3063: /* Since we don't have a way of forming the intersection, ! 3064: we just do something special if the preferred class ! 3065: is a subset of the class we have; that's the most ! 3066: common case anyway. */ ! 3067: if (reg_class_subset_p (preferred_class[i], ! 3068: this_alternative[i])) ! 3069: this_alternative[i] = (int) preferred_class[i]; ! 3070: else ! 3071: reject += (1 + pref_or_nothing[i]); ! 3072: } ! 3073: } ! 3074: } ! 3075: ! 3076: /* Now see if any output operands that are marked "earlyclobber" ! 3077: in this alternative conflict with any input operands ! 3078: or any memory addresses. */ ! 3079: ! 3080: for (i = 0; i < noperands; i++) ! 3081: if (this_alternative_earlyclobber[i] ! 3082: && this_alternative_win[i]) ! 3083: { ! 3084: struct decomposition early_data; ! 3085: ! 3086: early_data = decompose (recog_operand[i]); ! 3087: ! 3088: if (modified[i] == RELOAD_READ) ! 3089: { ! 3090: if (this_insn_is_asm) ! 3091: warning_for_asm (this_insn, ! 3092: "`&' constraint used with input operand"); ! 3093: else ! 3094: abort (); ! 3095: continue; ! 3096: } ! 3097: ! 3098: if (this_alternative[i] == NO_REGS) ! 3099: { ! 3100: this_alternative_earlyclobber[i] = 0; ! 3101: if (this_insn_is_asm) ! 3102: error_for_asm (this_insn, ! 3103: "`&' constraint used with no register class"); ! 3104: else ! 3105: abort (); ! 3106: } ! 3107: ! 3108: for (j = 0; j < noperands; j++) ! 3109: /* Is this an input operand or a memory ref? */ ! 3110: if ((GET_CODE (recog_operand[j]) == MEM ! 3111: || modified[j] != RELOAD_WRITE) ! 3112: && j != i ! 3113: /* Ignore things like match_operator operands. */ ! 3114: && *constraints1[j] != 0 ! 3115: /* Don't count an input operand that is constrained to match ! 3116: the early clobber operand. */ ! 3117: && ! (this_alternative_matches[j] == i ! 3118: && rtx_equal_p (recog_operand[i], recog_operand[j])) ! 3119: /* Is it altered by storing the earlyclobber operand? */ ! 3120: && !immune_p (recog_operand[j], recog_operand[i], early_data)) ! 3121: { ! 3122: /* If the output is in a single-reg class, ! 3123: it's costly to reload it, so reload the input instead. */ ! 3124: if (reg_class_size[this_alternative[i]] == 1 ! 3125: && (GET_CODE (recog_operand[j]) == REG ! 3126: || GET_CODE (recog_operand[j]) == SUBREG)) ! 3127: { ! 3128: losers++; ! 3129: this_alternative_win[j] = 0; ! 3130: } ! 3131: else ! 3132: break; ! 3133: } ! 3134: /* If an earlyclobber operand conflicts with something, ! 3135: it must be reloaded, so request this and count the cost. */ ! 3136: if (j != noperands) ! 3137: { ! 3138: losers++; ! 3139: this_alternative_win[i] = 0; ! 3140: for (j = 0; j < noperands; j++) ! 3141: if (this_alternative_matches[j] == i ! 3142: && this_alternative_win[j]) ! 3143: { ! 3144: this_alternative_win[j] = 0; ! 3145: losers++; ! 3146: } ! 3147: } ! 3148: } ! 3149: ! 3150: /* If one alternative accepts all the operands, no reload required, ! 3151: choose that alternative; don't consider the remaining ones. */ ! 3152: if (losers == 0) ! 3153: { ! 3154: /* Unswap these so that they are never swapped at `finish'. */ ! 3155: if (commutative >= 0) ! 3156: { ! 3157: recog_operand[commutative] = substed_operand[commutative]; ! 3158: recog_operand[commutative + 1] ! 3159: = substed_operand[commutative + 1]; ! 3160: } ! 3161: for (i = 0; i < noperands; i++) ! 3162: { ! 3163: goal_alternative_win[i] = 1; ! 3164: goal_alternative[i] = this_alternative[i]; ! 3165: goal_alternative_offmemok[i] = this_alternative_offmemok[i]; ! 3166: goal_alternative_matches[i] = this_alternative_matches[i]; ! 3167: goal_alternative_earlyclobber[i] ! 3168: = this_alternative_earlyclobber[i]; ! 3169: } ! 3170: goal_alternative_number = this_alternative_number; ! 3171: goal_alternative_swapped = swapped; ! 3172: goal_earlyclobber = this_earlyclobber; ! 3173: goto finish; ! 3174: } ! 3175: ! 3176: /* REJECT, set by the ! and ? constraint characters and when a register ! 3177: would be reloaded into a non-preferred class, discourages the use of ! 3178: this alternative for a reload goal. REJECT is incremented by three ! 3179: for each ? and one for each non-preferred class. */ ! 3180: losers = losers * 3 + reject; ! 3181: ! 3182: /* If this alternative can be made to work by reloading, ! 3183: and it needs less reloading than the others checked so far, ! 3184: record it as the chosen goal for reloading. */ ! 3185: if (! bad && best > losers) ! 3186: { ! 3187: for (i = 0; i < noperands; i++) ! 3188: { ! 3189: goal_alternative[i] = this_alternative[i]; ! 3190: goal_alternative_win[i] = this_alternative_win[i]; ! 3191: goal_alternative_offmemok[i] = this_alternative_offmemok[i]; ! 3192: goal_alternative_matches[i] = this_alternative_matches[i]; ! 3193: goal_alternative_earlyclobber[i] ! 3194: = this_alternative_earlyclobber[i]; ! 3195: } ! 3196: goal_alternative_swapped = swapped; ! 3197: best = losers; ! 3198: goal_alternative_number = this_alternative_number; ! 3199: goal_earlyclobber = this_earlyclobber; ! 3200: } ! 3201: } ! 3202: ! 3203: /* If insn is commutative (it's safe to exchange a certain pair of operands) ! 3204: then we need to try each alternative twice, ! 3205: the second time matching those two operands ! 3206: as if we had exchanged them. ! 3207: To do this, really exchange them in operands. ! 3208: ! 3209: If we have just tried the alternatives the second time, ! 3210: return operands to normal and drop through. */ ! 3211: ! 3212: if (commutative >= 0) ! 3213: { ! 3214: swapped = !swapped; ! 3215: if (swapped) ! 3216: { ! 3217: register enum reg_class tclass; ! 3218: register int t; ! 3219: ! 3220: recog_operand[commutative] = substed_operand[commutative + 1]; ! 3221: recog_operand[commutative + 1] = substed_operand[commutative]; ! 3222: ! 3223: tclass = preferred_class[commutative]; ! 3224: preferred_class[commutative] = preferred_class[commutative + 1]; ! 3225: preferred_class[commutative + 1] = tclass; ! 3226: ! 3227: t = pref_or_nothing[commutative]; ! 3228: pref_or_nothing[commutative] = pref_or_nothing[commutative + 1]; ! 3229: pref_or_nothing[commutative + 1] = t; ! 3230: ! 3231: bcopy (constraints1, constraints, noperands * sizeof (char *)); ! 3232: goto try_swapped; ! 3233: } ! 3234: else ! 3235: { ! 3236: recog_operand[commutative] = substed_operand[commutative]; ! 3237: recog_operand[commutative + 1] = substed_operand[commutative + 1]; ! 3238: } ! 3239: } ! 3240: ! 3241: /* The operands don't meet the constraints. ! 3242: goal_alternative describes the alternative ! 3243: that we could reach by reloading the fewest operands. ! 3244: Reload so as to fit it. */ ! 3245: ! 3246: if (best == MAX_RECOG_OPERANDS + 300) ! 3247: { ! 3248: /* No alternative works with reloads?? */ ! 3249: if (insn_code_number >= 0) ! 3250: abort (); ! 3251: error_for_asm (insn, "inconsistent operand constraints in an `asm'"); ! 3252: /* Avoid further trouble with this insn. */ ! 3253: PATTERN (insn) = gen_rtx (USE, VOIDmode, const0_rtx); ! 3254: n_reloads = 0; ! 3255: return; ! 3256: } ! 3257: ! 3258: /* Jump to `finish' from above if all operands are valid already. ! 3259: In that case, goal_alternative_win is all 1. */ ! 3260: finish: ! 3261: ! 3262: /* Right now, for any pair of operands I and J that are required to match, ! 3263: with I < J, ! 3264: goal_alternative_matches[J] is I. ! 3265: Set up goal_alternative_matched as the inverse function: ! 3266: goal_alternative_matched[I] = J. */ ! 3267: ! 3268: for (i = 0; i < noperands; i++) ! 3269: goal_alternative_matched[i] = -1; ! 3270: ! 3271: for (i = 0; i < noperands; i++) ! 3272: if (! goal_alternative_win[i] ! 3273: && goal_alternative_matches[i] >= 0) ! 3274: goal_alternative_matched[goal_alternative_matches[i]] = i; ! 3275: ! 3276: /* If the best alternative is with operands 1 and 2 swapped, ! 3277: consider them swapped before reporting the reloads. Update the ! 3278: operand numbers of any reloads already pushed. */ ! 3279: ! 3280: if (goal_alternative_swapped) ! 3281: { ! 3282: register rtx tem; ! 3283: ! 3284: tem = substed_operand[commutative]; ! 3285: substed_operand[commutative] = substed_operand[commutative + 1]; ! 3286: substed_operand[commutative + 1] = tem; ! 3287: tem = recog_operand[commutative]; ! 3288: recog_operand[commutative] = recog_operand[commutative + 1]; ! 3289: recog_operand[commutative + 1] = tem; ! 3290: ! 3291: for (i = 0; i < n_reloads; i++) ! 3292: { ! 3293: if (reload_opnum[i] == commutative) ! 3294: reload_opnum[i] = commutative + 1; ! 3295: else if (reload_opnum[i] == commutative + 1) ! 3296: reload_opnum[i] = commutative; ! 3297: } ! 3298: } ! 3299: ! 3300: /* Perform whatever substitutions on the operands we are supposed ! 3301: to make due to commutativity or replacement of registers ! 3302: with equivalent constants or memory slots. */ ! 3303: ! 3304: for (i = 0; i < noperands; i++) ! 3305: { ! 3306: *recog_operand_loc[i] = substed_operand[i]; ! 3307: /* While we are looping on operands, initialize this. */ ! 3308: operand_reloadnum[i] = -1; ! 3309: ! 3310: /* If this is an earlyclobber operand, we need to widen the scope. ! 3311: The reload must remain valid from the start of the insn being ! 3312: reloaded until after the operand is stored into its destination. ! 3313: We approximate this with RELOAD_OTHER even though we know that we ! 3314: do not conflict with RELOAD_FOR_INPUT_ADDRESS reloads. ! 3315: ! 3316: One special case that is worth checking is when we have an ! 3317: output that is earlyclobber but isn't used past the insn (typically ! 3318: a SCRATCH). In this case, we only need have the reload live ! 3319: through the insn itself, but not for any of our input or output ! 3320: reloads. ! 3321: ! 3322: In any case, anything needed to address this operand can remain ! 3323: however they were previously categorized. */ ! 3324: ! 3325: if (goal_alternative_earlyclobber[i]) ! 3326: operand_type[i] ! 3327: = (find_reg_note (insn, REG_UNUSED, recog_operand[i]) ! 3328: ? RELOAD_FOR_INSN : RELOAD_OTHER); ! 3329: } ! 3330: ! 3331: /* Any constants that aren't allowed and can't be reloaded ! 3332: into registers are here changed into memory references. */ ! 3333: for (i = 0; i < noperands; i++) ! 3334: if (! goal_alternative_win[i] ! 3335: && CONSTANT_P (recog_operand[i]) ! 3336: && (PREFERRED_RELOAD_CLASS (recog_operand[i], ! 3337: (enum reg_class) goal_alternative[i]) ! 3338: == NO_REGS) ! 3339: && operand_mode[i] != VOIDmode) ! 3340: { ! 3341: *recog_operand_loc[i] = recog_operand[i] ! 3342: = find_reloads_toplev (force_const_mem (operand_mode[i], ! 3343: recog_operand[i]), ! 3344: i, address_type[i], ind_levels, 0); ! 3345: if (alternative_allows_memconst (constraints1[i], ! 3346: goal_alternative_number)) ! 3347: goal_alternative_win[i] = 1; ! 3348: } ! 3349: ! 3350: /* Record the values of the earlyclobber operands for the caller. */ ! 3351: if (goal_earlyclobber) ! 3352: for (i = 0; i < noperands; i++) ! 3353: if (goal_alternative_earlyclobber[i]) ! 3354: reload_earlyclobbers[n_earlyclobbers++] = recog_operand[i]; ! 3355: ! 3356: /* Now record reloads for all the operands that need them. */ ! 3357: for (i = 0; i < noperands; i++) ! 3358: if (! goal_alternative_win[i]) ! 3359: { ! 3360: /* Operands that match previous ones have already been handled. */ ! 3361: if (goal_alternative_matches[i] >= 0) ! 3362: ; ! 3363: /* Handle an operand with a nonoffsettable address ! 3364: appearing where an offsettable address will do ! 3365: by reloading the address into a base register. ! 3366: ! 3367: ??? We can also do this when the operand is a register and ! 3368: reg_equiv_mem is not offsettable, but this is a bit tricky, ! 3369: so we don't bother with it. It may not be worth doing. */ ! 3370: else if (goal_alternative_matched[i] == -1 ! 3371: && goal_alternative_offmemok[i] ! 3372: && GET_CODE (recog_operand[i]) == MEM) ! 3373: { ! 3374: operand_reloadnum[i] ! 3375: = push_reload (XEXP (recog_operand[i], 0), NULL_RTX, ! 3376: &XEXP (recog_operand[i], 0), NULL_PTR, ! 3377: BASE_REG_CLASS, GET_MODE (XEXP (recog_operand[i], 0)), ! 3378: VOIDmode, 0, 0, i, RELOAD_FOR_INPUT); ! 3379: reload_inc[operand_reloadnum[i]] ! 3380: = GET_MODE_SIZE (GET_MODE (recog_operand[i])); ! 3381: ! 3382: /* If this operand is an output, we will have made any ! 3383: reloads for its address as RELOAD_FOR_OUTPUT_ADDRESS, but ! 3384: now we are treating part of the operand as an input, so ! 3385: we must change these to RELOAD_FOR_INPUT_ADDRESS. */ ! 3386: ! 3387: if (operand_type[i] == RELOAD_FOR_OUTPUT) ! 3388: for (j = 0; j < n_reloads; j++) ! 3389: if (reload_opnum[j] == i ! 3390: && reload_when_needed[j] == RELOAD_FOR_OUTPUT_ADDRESS) ! 3391: reload_when_needed[j] = RELOAD_FOR_INPUT_ADDRESS; ! 3392: } ! 3393: else if (goal_alternative_matched[i] == -1) ! 3394: operand_reloadnum[i] = ! 3395: push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0, ! 3396: modified[i] != RELOAD_READ ? recog_operand[i] : 0, ! 3397: (modified[i] != RELOAD_WRITE ? ! 3398: recog_operand_loc[i] : 0), ! 3399: modified[i] != RELOAD_READ ? recog_operand_loc[i] : 0, ! 3400: (enum reg_class) goal_alternative[i], ! 3401: (modified[i] == RELOAD_WRITE ! 3402: ? VOIDmode : operand_mode[i]), ! 3403: (modified[i] == RELOAD_READ ! 3404: ? VOIDmode : operand_mode[i]), ! 3405: (insn_code_number < 0 ? 0 ! 3406: : insn_operand_strict_low[insn_code_number][i]), ! 3407: 0, i, operand_type[i]); ! 3408: /* In a matching pair of operands, one must be input only ! 3409: and the other must be output only. ! 3410: Pass the input operand as IN and the other as OUT. */ ! 3411: else if (modified[i] == RELOAD_READ ! 3412: && modified[goal_alternative_matched[i]] == RELOAD_WRITE) ! 3413: { ! 3414: operand_reloadnum[i] ! 3415: = push_reload (recog_operand[i], ! 3416: recog_operand[goal_alternative_matched[i]], ! 3417: recog_operand_loc[i], ! 3418: recog_operand_loc[goal_alternative_matched[i]], ! 3419: (enum reg_class) goal_alternative[i], ! 3420: operand_mode[i], ! 3421: operand_mode[goal_alternative_matched[i]], ! 3422: 0, 0, i, RELOAD_OTHER); ! 3423: operand_reloadnum[goal_alternative_matched[i]] = output_reloadnum; ! 3424: } ! 3425: else if (modified[i] == RELOAD_WRITE ! 3426: && modified[goal_alternative_matched[i]] == RELOAD_READ) ! 3427: { ! 3428: operand_reloadnum[goal_alternative_matched[i]] ! 3429: = push_reload (recog_operand[goal_alternative_matched[i]], ! 3430: recog_operand[i], ! 3431: recog_operand_loc[goal_alternative_matched[i]], ! 3432: recog_operand_loc[i], ! 3433: (enum reg_class) goal_alternative[i], ! 3434: operand_mode[goal_alternative_matched[i]], ! 3435: operand_mode[i], ! 3436: 0, 0, i, RELOAD_OTHER); ! 3437: operand_reloadnum[i] = output_reloadnum; ! 3438: } ! 3439: else if (insn_code_number >= 0) ! 3440: abort (); ! 3441: else ! 3442: { ! 3443: error_for_asm (insn, "inconsistent operand constraints in an `asm'"); ! 3444: /* Avoid further trouble with this insn. */ ! 3445: PATTERN (insn) = gen_rtx (USE, VOIDmode, const0_rtx); ! 3446: n_reloads = 0; ! 3447: return; ! 3448: } ! 3449: } ! 3450: else if (goal_alternative_matched[i] < 0 ! 3451: && goal_alternative_matches[i] < 0 ! 3452: && optimize) ! 3453: { ! 3454: /* For each non-matching operand that's a MEM or a pseudo-register ! 3455: that didn't get a hard register, make an optional reload. ! 3456: This may get done even if the insn needs no reloads otherwise. */ ! 3457: ! 3458: rtx operand = recog_operand[i]; ! 3459: ! 3460: while (GET_CODE (operand) == SUBREG) ! 3461: operand = XEXP (operand, 0); ! 3462: if ((GET_CODE (operand) == MEM ! 3463: || (GET_CODE (operand) == REG ! 3464: && REGNO (operand) >= FIRST_PSEUDO_REGISTER)) ! 3465: && (enum reg_class) goal_alternative[i] != NO_REGS ! 3466: && ! no_input_reloads ! 3467: /* Optional output reloads don't do anything and we mustn't ! 3468: make in-out reloads on insns that are not permitted output ! 3469: reloads. */ ! 3470: && (modified[i] == RELOAD_READ ! 3471: || (modified[i] == RELOAD_READ_WRITE && ! no_output_reloads))) ! 3472: operand_reloadnum[i] ! 3473: = push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0, ! 3474: modified[i] != RELOAD_READ ? recog_operand[i] : 0, ! 3475: (modified[i] != RELOAD_WRITE ! 3476: ? recog_operand_loc[i] : 0), ! 3477: (modified[i] != RELOAD_READ ! 3478: ? recog_operand_loc[i] : 0), ! 3479: (enum reg_class) goal_alternative[i], ! 3480: (modified[i] == RELOAD_WRITE ! 3481: ? VOIDmode : operand_mode[i]), ! 3482: (modified[i] == RELOAD_READ ! 3483: ? VOIDmode : operand_mode[i]), ! 3484: (insn_code_number < 0 ? 0 ! 3485: : insn_operand_strict_low[insn_code_number][i]), ! 3486: 1, i, operand_type[i]); ! 3487: } ! 3488: else if (goal_alternative_matches[i] >= 0 ! 3489: && goal_alternative_win[goal_alternative_matches[i]] ! 3490: && modified[i] == RELOAD_READ ! 3491: && modified[goal_alternative_matches[i]] == RELOAD_WRITE ! 3492: && ! no_input_reloads && ! no_output_reloads ! 3493: && optimize) ! 3494: { ! 3495: /* Similarly, make an optional reload for a pair of matching ! 3496: objects that are in MEM or a pseudo that didn't get a hard reg. */ ! 3497: ! 3498: rtx operand = recog_operand[i]; ! 3499: ! 3500: while (GET_CODE (operand) == SUBREG) ! 3501: operand = XEXP (operand, 0); ! 3502: if ((GET_CODE (operand) == MEM ! 3503: || (GET_CODE (operand) == REG ! 3504: && REGNO (operand) >= FIRST_PSEUDO_REGISTER)) ! 3505: && ((enum reg_class) goal_alternative[goal_alternative_matches[i]] ! 3506: != NO_REGS)) ! 3507: operand_reloadnum[i] = operand_reloadnum[goal_alternative_matches[i]] ! 3508: = push_reload (recog_operand[goal_alternative_matches[i]], ! 3509: recog_operand[i], ! 3510: recog_operand_loc[goal_alternative_matches[i]], ! 3511: recog_operand_loc[i], ! 3512: (enum reg_class) goal_alternative[goal_alternative_matches[i]], ! 3513: operand_mode[goal_alternative_matches[i]], ! 3514: operand_mode[i], ! 3515: 0, 1, goal_alternative_matches[i], RELOAD_OTHER); ! 3516: } ! 3517: ! 3518: /* If this insn pattern contains any MATCH_DUP's, make sure that ! 3519: they will be substituted if the operands they match are substituted. ! 3520: Also do now any substitutions we already did on the operands. ! 3521: ! 3522: Don't do this if we aren't making replacements because we might be ! 3523: propagating things allocated by frame pointer elimination into places ! 3524: it doesn't expect. */ ! 3525: ! 3526: if (insn_code_number >= 0 && replace) ! 3527: for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--) ! 3528: { ! 3529: int opno = recog_dup_num[i]; ! 3530: *recog_dup_loc[i] = *recog_operand_loc[opno]; ! 3531: if (operand_reloadnum[opno] >= 0) ! 3532: push_replacement (recog_dup_loc[i], operand_reloadnum[opno], ! 3533: insn_operand_mode[insn_code_number][opno]); ! 3534: } ! 3535: ! 3536: #if 0 ! 3537: /* This loses because reloading of prior insns can invalidate the equivalence ! 3538: (or at least find_equiv_reg isn't smart enough to find it any more), ! 3539: causing this insn to need more reload regs than it needed before. ! 3540: It may be too late to make the reload regs available. ! 3541: Now this optimization is done safely in choose_reload_regs. */ ! 3542: ! 3543: /* For each reload of a reg into some other class of reg, ! 3544: search for an existing equivalent reg (same value now) in the right class. ! 3545: We can use it as long as we don't need to change its contents. */ ! 3546: for (i = 0; i < n_reloads; i++) ! 3547: if (reload_reg_rtx[i] == 0 ! 3548: && reload_in[i] != 0 ! 3549: && GET_CODE (reload_in[i]) == REG ! 3550: && reload_out[i] == 0) ! 3551: { ! 3552: reload_reg_rtx[i] ! 3553: = find_equiv_reg (reload_in[i], insn, reload_reg_class[i], -1, ! 3554: static_reload_reg_p, 0, reload_inmode[i]); ! 3555: /* Prevent generation of insn to load the value ! 3556: because the one we found already has the value. */ ! 3557: if (reload_reg_rtx[i]) ! 3558: reload_in[i] = reload_reg_rtx[i]; ! 3559: } ! 3560: #endif ! 3561: ! 3562: /* Perhaps an output reload can be combined with another ! 3563: to reduce needs by one. */ ! 3564: if (!goal_earlyclobber) ! 3565: combine_reloads (); ! 3566: ! 3567: /* If we have a pair of reloads for parts of an address, they are reloading ! 3568: the same object, the operands themselves were not reloaded, and they ! 3569: are for two operands that are supposed to match, merge the reloads and ! 3570: change the type of the surviving reload to RELOAD_FOR_OPERAND_ADDRESS. */ ! 3571: ! 3572: for (i = 0; i < n_reloads; i++) ! 3573: { ! 3574: int k; ! 3575: ! 3576: for (j = i + 1; j < n_reloads; j++) ! 3577: if ((reload_when_needed[i] == RELOAD_FOR_INPUT_ADDRESS ! 3578: || reload_when_needed[i] == RELOAD_FOR_OUTPUT_ADDRESS) ! 3579: && (reload_when_needed[j] == RELOAD_FOR_INPUT_ADDRESS ! 3580: || reload_when_needed[j] == RELOAD_FOR_OUTPUT_ADDRESS) ! 3581: && rtx_equal_p (reload_in[i], reload_in[j]) ! 3582: && (operand_reloadnum[reload_opnum[i]] < 0 ! 3583: || reload_optional[operand_reloadnum[reload_opnum[i]]]) ! 3584: && (operand_reloadnum[reload_opnum[j]] < 0 ! 3585: || reload_optional[operand_reloadnum[reload_opnum[j]]]) ! 3586: && (goal_alternative_matches[reload_opnum[i]] == reload_opnum[j] ! 3587: || (goal_alternative_matches[reload_opnum[j]] ! 3588: == reload_opnum[i]))) ! 3589: { ! 3590: for (k = 0; k < n_replacements; k++) ! 3591: if (replacements[k].what == j) ! 3592: replacements[k].what = i; ! 3593: ! 3594: reload_when_needed[i] = RELOAD_FOR_OPERAND_ADDRESS; ! 3595: reload_in[j] = 0; ! 3596: } ! 3597: } ! 3598: ! 3599: /* Scan all the reloads and update their type. ! 3600: If a reload is for the address of an operand and we didn't reload ! 3601: that operand, change the type. Similarly, change the operand number ! 3602: of a reload when two operands match. If a reload is optional, treat it ! 3603: as though the operand isn't reloaded. ! 3604: ! 3605: ??? This latter case is somewhat odd because if we do the optional ! 3606: reload, it means the object is hanging around. Thus we need only ! 3607: do the address reload if the optional reload was NOT done. ! 3608: ! 3609: Change secondary reloads to be the address type of their operand, not ! 3610: the normal type. ! 3611: ! 3612: If an operand's reload is now RELOAD_OTHER, change any ! 3613: RELOAD_FOR_INPUT_ADDRESS reloads of that operand to ! 3614: RELOAD_FOR_OTHER_ADDRESS. */ ! 3615: ! 3616: for (i = 0; i < n_reloads; i++) ! 3617: { ! 3618: if (reload_secondary_p[i] ! 3619: && reload_when_needed[i] == operand_type[reload_opnum[i]]) ! 3620: reload_when_needed[i] = address_type[reload_opnum[i]]; ! 3621: ! 3622: if ((reload_when_needed[i] == RELOAD_FOR_INPUT_ADDRESS ! 3623: || reload_when_needed[i] == RELOAD_FOR_OUTPUT_ADDRESS) ! 3624: && (operand_reloadnum[reload_opnum[i]] < 0 ! 3625: || reload_optional[operand_reloadnum[reload_opnum[i]]])) ! 3626: reload_when_needed[i] = RELOAD_FOR_OPERAND_ADDRESS; ! 3627: ! 3628: if (reload_when_needed[i] == RELOAD_FOR_INPUT_ADDRESS ! 3629: && operand_reloadnum[reload_opnum[i]] >= 0 ! 3630: && (reload_when_needed[operand_reloadnum[reload_opnum[i]]] ! 3631: == RELOAD_OTHER)) ! 3632: reload_when_needed[i] = RELOAD_FOR_OTHER_ADDRESS; ! 3633: ! 3634: if (goal_alternative_matches[reload_opnum[i]] >= 0) ! 3635: reload_opnum[i] = goal_alternative_matches[reload_opnum[i]]; ! 3636: } ! 3637: ! 3638: /* See if we have any reloads that are now allowed to be merged ! 3639: because we've changed when the reload is needed to ! 3640: RELOAD_FOR_OPERAND_ADDRESS or RELOAD_FOR_OTHER_ADDRESS. Only ! 3641: check for the most common cases. */ ! 3642: ! 3643: for (i = 0; i < n_reloads; i++) ! 3644: if (reload_in[i] != 0 && reload_out[i] == 0 ! 3645: && (reload_when_needed[i] == RELOAD_FOR_OPERAND_ADDRESS ! 3646: || reload_when_needed[i] == RELOAD_FOR_OTHER_ADDRESS)) ! 3647: for (j = 0; j < n_reloads; j++) ! 3648: if (i != j && reload_in[j] != 0 && reload_out[j] == 0 ! 3649: && reload_when_needed[j] == reload_when_needed[i] ! 3650: && MATCHES (reload_in[i], reload_in[j]) ! 3651: && reload_reg_class[i] == reload_reg_class[j] ! 3652: && !reload_nocombine[i] && !reload_nocombine[j] ! 3653: && reload_reg_rtx[i] == reload_reg_rtx[j]) ! 3654: { ! 3655: reload_opnum[i] = MIN (reload_opnum[i], reload_opnum[j]); ! 3656: transfer_replacements (i, j); ! 3657: reload_in[j] = 0; ! 3658: } ! 3659: ! 3660: #else /* no REGISTER_CONSTRAINTS */ ! 3661: int noperands; ! 3662: int insn_code_number; ! 3663: int goal_earlyclobber = 0; /* Always 0, to make combine_reloads happen. */ ! 3664: register int i; ! 3665: rtx body = PATTERN (insn); ! 3666: ! 3667: n_reloads = 0; ! 3668: n_replacements = 0; ! 3669: n_earlyclobbers = 0; ! 3670: replace_reloads = replace; ! 3671: this_insn = insn; ! 3672: ! 3673: /* Find what kind of insn this is. NOPERANDS gets number of operands. ! 3674: Store the operand values in RECOG_OPERAND and the locations ! 3675: of the words in the insn that point to them in RECOG_OPERAND_LOC. ! 3676: Return if the insn needs no reload processing. */ ! 3677: ! 3678: switch (GET_CODE (body)) ! 3679: { ! 3680: case USE: ! 3681: case CLOBBER: ! 3682: case ASM_INPUT: ! 3683: case ADDR_VEC: ! 3684: case ADDR_DIFF_VEC: ! 3685: return; ! 3686: ! 3687: case PARALLEL: ! 3688: case SET: ! 3689: noperands = asm_noperands (body); ! 3690: if (noperands >= 0) ! 3691: { ! 3692: /* This insn is an `asm' with operands. ! 3693: First, find out how many operands, and allocate space. */ ! 3694: ! 3695: insn_code_number = -1; ! 3696: /* ??? This is a bug! ??? ! 3697: Give up and delete this insn if it has too many operands. */ ! 3698: if (noperands > MAX_RECOG_OPERANDS) ! 3699: abort (); ! 3700: ! 3701: /* Now get the operand values out of the insn. */ ! 3702: ! 3703: decode_asm_operands (body, recog_operand, recog_operand_loc, ! 3704: NULL_PTR, NULL_PTR); ! 3705: break; ! 3706: } ! 3707: ! 3708: default: ! 3709: /* Ordinary insn: recognize it, allocate space for operands and ! 3710: constraints, and get them out via insn_extract. */ ! 3711: ! 3712: insn_code_number = recog_memoized (insn); ! 3713: noperands = insn_n_operands[insn_code_number]; ! 3714: insn_extract (insn); ! 3715: } ! 3716: ! 3717: if (noperands == 0) ! 3718: return; ! 3719: ! 3720: for (i = 0; i < noperands; i++) ! 3721: { ! 3722: register RTX_CODE code = GET_CODE (recog_operand[i]); ! 3723: int is_set_dest = GET_CODE (body) == SET && (i == 0); ! 3724: ! 3725: if (insn_code_number >= 0) ! 3726: if (insn_operand_address_p[insn_code_number][i]) ! 3727: find_reloads_address (VOIDmode, NULL_PTR, ! 3728: recog_operand[i], recog_operand_loc[i], ! 3729: i, RELOAD_FOR_INPUT, ind_levels); ! 3730: ! 3731: /* In these cases, we can't tell if the operand is an input ! 3732: or an output, so be conservative. In practice it won't be ! 3733: problem. */ ! 3734: ! 3735: if (code == MEM) ! 3736: find_reloads_address (GET_MODE (recog_operand[i]), ! 3737: recog_operand_loc[i], ! 3738: XEXP (recog_operand[i], 0), ! 3739: &XEXP (recog_operand[i], 0), ! 3740: i, RELOAD_OTHER, ind_levels); ! 3741: if (code == SUBREG) ! 3742: recog_operand[i] = *recog_operand_loc[i] ! 3743: = find_reloads_toplev (recog_operand[i], i, RELOAD_OTHER, ! 3744: ind_levels, is_set_dest); ! 3745: if (code == REG) ! 3746: { ! 3747: register int regno = REGNO (recog_operand[i]); ! 3748: if (reg_equiv_constant[regno] != 0 && !is_set_dest) ! 3749: recog_operand[i] = *recog_operand_loc[i] ! 3750: = reg_equiv_constant[regno]; ! 3751: #if 0 /* This might screw code in reload1.c to delete prior output-reload ! 3752: that feeds this insn. */ ! 3753: if (reg_equiv_mem[regno] != 0) ! 3754: recog_operand[i] = *recog_operand_loc[i] ! 3755: = reg_equiv_mem[regno]; ! 3756: #endif ! 3757: } ! 3758: } ! 3759: ! 3760: /* Perhaps an output reload can be combined with another ! 3761: to reduce needs by one. */ ! 3762: if (!goal_earlyclobber) ! 3763: combine_reloads (); ! 3764: #endif /* no REGISTER_CONSTRAINTS */ ! 3765: } ! 3766: ! 3767: /* Return 1 if alternative number ALTNUM in constraint-string CONSTRAINT ! 3768: accepts a memory operand with constant address. */ ! 3769: ! 3770: static int ! 3771: alternative_allows_memconst (constraint, altnum) ! 3772: char *constraint; ! 3773: int altnum; ! 3774: { ! 3775: register int c; ! 3776: /* Skip alternatives before the one requested. */ ! 3777: while (altnum > 0) ! 3778: { ! 3779: while (*constraint++ != ','); ! 3780: altnum--; ! 3781: } ! 3782: /* Scan the requested alternative for 'm' or 'o'. ! 3783: If one of them is present, this alternative accepts memory constants. */ ! 3784: while ((c = *constraint++) && c != ',' && c != '#') ! 3785: if (c == 'm' || c == 'o') ! 3786: return 1; ! 3787: return 0; ! 3788: } ! 3789: ! 3790: /* Scan X for memory references and scan the addresses for reloading. ! 3791: Also checks for references to "constant" regs that we want to eliminate ! 3792: and replaces them with the values they stand for. ! 3793: We may alter X destructively if it contains a reference to such. ! 3794: If X is just a constant reg, we return the equivalent value ! 3795: instead of X. ! 3796: ! 3797: IND_LEVELS says how many levels of indirect addressing this machine ! 3798: supports. ! 3799: ! 3800: OPNUM and TYPE identify the purpose of the reload. ! 3801: ! 3802: IS_SET_DEST is true if X is the destination of a SET, which is not ! 3803: appropriate to be replaced by a constant. */ ! 3804: ! 3805: static rtx ! 3806: find_reloads_toplev (x, opnum, type, ind_levels, is_set_dest) ! 3807: rtx x; ! 3808: int opnum; ! 3809: enum reload_type type; ! 3810: int ind_levels; ! 3811: int is_set_dest; ! 3812: { ! 3813: register RTX_CODE code = GET_CODE (x); ! 3814: ! 3815: register char *fmt = GET_RTX_FORMAT (code); ! 3816: register int i; ! 3817: ! 3818: if (code == REG) ! 3819: { ! 3820: /* This code is duplicated for speed in find_reloads. */ ! 3821: register int regno = REGNO (x); ! 3822: if (reg_equiv_constant[regno] != 0 && !is_set_dest) ! 3823: x = reg_equiv_constant[regno]; ! 3824: #if 0 ! 3825: /* This creates (subreg (mem...)) which would cause an unnecessary ! 3826: reload of the mem. */ ! 3827: else if (reg_equiv_mem[regno] != 0) ! 3828: x = reg_equiv_mem[regno]; ! 3829: #endif ! 3830: else if (reg_equiv_address[regno] != 0) ! 3831: { ! 3832: /* If reg_equiv_address varies, it may be shared, so copy it. */ ! 3833: rtx addr = reg_equiv_address[regno]; ! 3834: ! 3835: if (rtx_varies_p (addr)) ! 3836: addr = copy_rtx (addr); ! 3837: ! 3838: x = gen_rtx (MEM, GET_MODE (x), addr); ! 3839: RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[regno]); ! 3840: find_reloads_address (GET_MODE (x), NULL_PTR, ! 3841: XEXP (x, 0), ! 3842: &XEXP (x, 0), opnum, type, ind_levels); ! 3843: } ! 3844: return x; ! 3845: } ! 3846: if (code == MEM) ! 3847: { ! 3848: rtx tem = x; ! 3849: find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0), ! 3850: opnum, type, ind_levels); ! 3851: return tem; ! 3852: } ! 3853: ! 3854: if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG) ! 3855: { ! 3856: /* Check for SUBREG containing a REG that's equivalent to a constant. ! 3857: If the constant has a known value, truncate it right now. ! 3858: Similarly if we are extracting a single-word of a multi-word ! 3859: constant. If the constant is symbolic, allow it to be substituted ! 3860: normally. push_reload will strip the subreg later. If the ! 3861: constant is VOIDmode, abort because we will lose the mode of ! 3862: the register (this should never happen because one of the cases ! 3863: above should handle it). */ ! 3864: ! 3865: register int regno = REGNO (SUBREG_REG (x)); ! 3866: rtx tem; ! 3867: ! 3868: if (subreg_lowpart_p (x) ! 3869: && regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 3870: && reg_equiv_constant[regno] != 0 ! 3871: && (tem = gen_lowpart_common (GET_MODE (x), ! 3872: reg_equiv_constant[regno])) != 0) ! 3873: return tem; ! 3874: ! 3875: if (GET_MODE_BITSIZE (GET_MODE (x)) == BITS_PER_WORD ! 3876: && regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 3877: && reg_equiv_constant[regno] != 0 ! 3878: && (tem = operand_subword (reg_equiv_constant[regno], ! 3879: SUBREG_WORD (x), 0, ! 3880: GET_MODE (SUBREG_REG (x)))) != 0) ! 3881: return tem; ! 3882: ! 3883: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 3884: && reg_equiv_constant[regno] != 0 ! 3885: && GET_MODE (reg_equiv_constant[regno]) == VOIDmode) ! 3886: abort (); ! 3887: ! 3888: /* If the subreg contains a reg that will be converted to a mem, ! 3889: convert the subreg to a narrower memref now. ! 3890: Otherwise, we would get (subreg (mem ...) ...), ! 3891: which would force reload of the mem. ! 3892: ! 3893: We also need to do this if there is an equivalent MEM that is ! 3894: not offsettable. In that case, alter_subreg would produce an ! 3895: invalid address on big-endian machines. ! 3896: ! 3897: For machines that extend byte loads, we must not reload using ! 3898: a wider mode if we have a paradoxical SUBREG. find_reloads will ! 3899: force a reload in that case. So we should not do anything here. */ ! 3900: ! 3901: else if (regno >= FIRST_PSEUDO_REGISTER ! 3902: #ifdef LOAD_EXTEND_OP ! 3903: && (GET_MODE_SIZE (GET_MODE (x)) ! 3904: <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))) ! 3905: #endif ! 3906: && (reg_equiv_address[regno] != 0 ! 3907: || (reg_equiv_mem[regno] != 0 ! 3908: && (! strict_memory_address_p (GET_MODE (x), ! 3909: XEXP (reg_equiv_mem[regno], 0)) ! 3910: || ! offsettable_memref_p (reg_equiv_mem[regno]))))) ! 3911: { ! 3912: int offset = SUBREG_WORD (x) * UNITS_PER_WORD; ! 3913: rtx addr = (reg_equiv_address[regno] ? reg_equiv_address[regno] ! 3914: : XEXP (reg_equiv_mem[regno], 0)); ! 3915: #if BYTES_BIG_ENDIAN ! 3916: int size; ! 3917: size = GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))); ! 3918: offset += MIN (size, UNITS_PER_WORD); ! 3919: size = GET_MODE_SIZE (GET_MODE (x)); ! 3920: offset -= MIN (size, UNITS_PER_WORD); ! 3921: #endif ! 3922: addr = plus_constant (addr, offset); ! 3923: x = gen_rtx (MEM, GET_MODE (x), addr); ! 3924: RTX_UNCHANGING_P (x) = RTX_UNCHANGING_P (regno_reg_rtx[regno]); ! 3925: find_reloads_address (GET_MODE (x), NULL_PTR, ! 3926: XEXP (x, 0), ! 3927: &XEXP (x, 0), opnum, type, ind_levels); ! 3928: } ! 3929: ! 3930: } ! 3931: ! 3932: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 3933: { ! 3934: if (fmt[i] == 'e') ! 3935: XEXP (x, i) = find_reloads_toplev (XEXP (x, i), opnum, type, ! 3936: ind_levels, is_set_dest); ! 3937: } ! 3938: return x; ! 3939: } ! 3940: ! 3941: /* Return a mem ref for the memory equivalent of reg REGNO. ! 3942: This mem ref is not shared with anything. */ ! 3943: ! 3944: static rtx ! 3945: make_memloc (ad, regno) ! 3946: rtx ad; ! 3947: int regno; ! 3948: { ! 3949: register int i; ! 3950: rtx tem = reg_equiv_address[regno]; ! 3951: ! 3952: #if 0 /* We cannot safely reuse a memloc made here; ! 3953: if the pseudo appears twice, and its mem needs a reload, ! 3954: it gets two separate reloads assigned, but it only ! 3955: gets substituted with the second of them; ! 3956: then it can get used before that reload reg gets loaded up. */ ! 3957: for (i = 0; i < n_memlocs; i++) ! 3958: if (rtx_equal_p (tem, XEXP (memlocs[i], 0))) ! 3959: return memlocs[i]; ! 3960: #endif ! 3961: ! 3962: /* If TEM might contain a pseudo, we must copy it to avoid ! 3963: modifying it when we do the substitution for the reload. */ ! 3964: if (rtx_varies_p (tem)) ! 3965: tem = copy_rtx (tem); ! 3966: ! 3967: tem = gen_rtx (MEM, GET_MODE (ad), tem); ! 3968: RTX_UNCHANGING_P (tem) = RTX_UNCHANGING_P (regno_reg_rtx[regno]); ! 3969: memlocs[n_memlocs++] = tem; ! 3970: return tem; ! 3971: } ! 3972: ! 3973: /* Record all reloads needed for handling memory address AD ! 3974: which appears in *LOC in a memory reference to mode MODE ! 3975: which itself is found in location *MEMREFLOC. ! 3976: Note that we take shortcuts assuming that no multi-reg machine mode ! 3977: occurs as part of an address. ! 3978: ! 3979: OPNUM and TYPE specify the purpose of this reload. ! 3980: ! 3981: IND_LEVELS says how many levels of indirect addressing this machine ! 3982: supports. ! 3983: ! 3984: Value is nonzero if this address is reloaded or replaced as a whole. ! 3985: This is interesting to the caller if the address is an autoincrement. ! 3986: ! 3987: Note that there is no verification that the address will be valid after ! 3988: this routine does its work. Instead, we rely on the fact that the address ! 3989: was valid when reload started. So we need only undo things that reload ! 3990: could have broken. These are wrong register types, pseudos not allocated ! 3991: to a hard register, and frame pointer elimination. */ ! 3992: ! 3993: static int ! 3994: find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels) ! 3995: enum machine_mode mode; ! 3996: rtx *memrefloc; ! 3997: rtx ad; ! 3998: rtx *loc; ! 3999: int opnum; ! 4000: enum reload_type type; ! 4001: int ind_levels; ! 4002: { ! 4003: register int regno; ! 4004: rtx tem; ! 4005: ! 4006: /* If the address is a register, see if it is a legitimate address and ! 4007: reload if not. We first handle the cases where we need not reload ! 4008: or where we must reload in a non-standard way. */ ! 4009: ! 4010: if (GET_CODE (ad) == REG) ! 4011: { ! 4012: regno = REGNO (ad); ! 4013: ! 4014: if (reg_equiv_constant[regno] != 0 ! 4015: && strict_memory_address_p (mode, reg_equiv_constant[regno])) ! 4016: { ! 4017: *loc = ad = reg_equiv_constant[regno]; ! 4018: return 1; ! 4019: } ! 4020: ! 4021: else if (reg_equiv_address[regno] != 0) ! 4022: { ! 4023: tem = make_memloc (ad, regno); ! 4024: find_reloads_address (GET_MODE (tem), NULL_PTR, XEXP (tem, 0), ! 4025: &XEXP (tem, 0), opnum, type, ind_levels); ! 4026: push_reload (tem, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS, ! 4027: GET_MODE (ad), VOIDmode, 0, 0, ! 4028: opnum, type); ! 4029: return 1; ! 4030: } ! 4031: ! 4032: /* We can avoid a reload if the register's equivalent memory expression ! 4033: is valid as an indirect memory address. ! 4034: But not all addresses are valid in a mem used as an indirect address: ! 4035: only reg or reg+constant. */ ! 4036: ! 4037: else if (reg_equiv_mem[regno] != 0 && ind_levels > 0 ! 4038: && strict_memory_address_p (mode, reg_equiv_mem[regno]) ! 4039: && (GET_CODE (XEXP (reg_equiv_mem[regno], 0)) == REG ! 4040: || (GET_CODE (XEXP (reg_equiv_mem[regno], 0)) == PLUS ! 4041: && GET_CODE (XEXP (XEXP (reg_equiv_mem[regno], 0), 0)) == REG ! 4042: && CONSTANT_P (XEXP (XEXP (reg_equiv_mem[regno], 0), 0))))) ! 4043: return 0; ! 4044: ! 4045: /* The only remaining case where we can avoid a reload is if this is a ! 4046: hard register that is valid as a base register and which is not the ! 4047: subject of a CLOBBER in this insn. */ ! 4048: ! 4049: else if (regno < FIRST_PSEUDO_REGISTER && REGNO_OK_FOR_BASE_P (regno) ! 4050: && ! regno_clobbered_p (regno, this_insn)) ! 4051: return 0; ! 4052: ! 4053: /* If we do not have one of the cases above, we must do the reload. */ ! 4054: push_reload (ad, NULL_RTX, loc, NULL_PTR, BASE_REG_CLASS, ! 4055: GET_MODE (ad), VOIDmode, 0, 0, opnum, type); ! 4056: return 1; ! 4057: } ! 4058: ! 4059: if (strict_memory_address_p (mode, ad)) ! 4060: { ! 4061: /* The address appears valid, so reloads are not needed. ! 4062: But the address may contain an eliminable register. ! 4063: This can happen because a machine with indirect addressing ! 4064: may consider a pseudo register by itself a valid address even when ! 4065: it has failed to get a hard reg. ! 4066: So do a tree-walk to find and eliminate all such regs. */ ! 4067: ! 4068: /* But first quickly dispose of a common case. */ ! 4069: if (GET_CODE (ad) == PLUS ! 4070: && GET_CODE (XEXP (ad, 1)) == CONST_INT ! 4071: && GET_CODE (XEXP (ad, 0)) == REG ! 4072: && reg_equiv_constant[REGNO (XEXP (ad, 0))] == 0) ! 4073: return 0; ! 4074: ! 4075: subst_reg_equivs_changed = 0; ! 4076: *loc = subst_reg_equivs (ad); ! 4077: ! 4078: if (! subst_reg_equivs_changed) ! 4079: return 0; ! 4080: ! 4081: /* Check result for validity after substitution. */ ! 4082: if (strict_memory_address_p (mode, ad)) ! 4083: return 0; ! 4084: } ! 4085: ! 4086: /* The address is not valid. We have to figure out why. One possibility ! 4087: is that it is itself a MEM. This can happen when the frame pointer is ! 4088: being eliminated, a pseudo is not allocated to a hard register, and the ! 4089: offset between the frame and stack pointers is not its initial value. ! 4090: In that case the pseudo will have been replaced by a MEM referring to ! 4091: the stack pointer. */ ! 4092: if (GET_CODE (ad) == MEM) ! 4093: { ! 4094: /* First ensure that the address in this MEM is valid. Then, unless ! 4095: indirect addresses are valid, reload the MEM into a register. */ ! 4096: tem = ad; ! 4097: find_reloads_address (GET_MODE (ad), &tem, XEXP (ad, 0), &XEXP (ad, 0), ! 4098: opnum, type, ind_levels == 0 ? 0 : ind_levels - 1); ! 4099: ! 4100: /* If tem was changed, then we must create a new memory reference to ! 4101: hold it and store it back into memrefloc. */ ! 4102: if (tem != ad && memrefloc) ! 4103: { ! 4104: *memrefloc = copy_rtx (*memrefloc); ! 4105: copy_replacements (tem, XEXP (*memrefloc, 0)); ! 4106: loc = &XEXP (*memrefloc, 0); ! 4107: } ! 4108: ! 4109: /* Check similar cases as for indirect addresses as above except ! 4110: that we can allow pseudos and a MEM since they should have been ! 4111: taken care of above. */ ! 4112: ! 4113: if (ind_levels == 0 ! 4114: || (GET_CODE (XEXP (tem, 0)) == SYMBOL_REF && ! indirect_symref_ok) ! 4115: || GET_CODE (XEXP (tem, 0)) == MEM ! 4116: || ! (GET_CODE (XEXP (tem, 0)) == REG ! 4117: || (GET_CODE (XEXP (tem, 0)) == PLUS ! 4118: && GET_CODE (XEXP (XEXP (tem, 0), 0)) == REG ! 4119: && GET_CODE (XEXP (XEXP (tem, 0), 1)) == CONST_INT))) ! 4120: { ! 4121: /* Must use TEM here, not AD, since it is the one that will ! 4122: have any subexpressions reloaded, if needed. */ ! 4123: push_reload (tem, NULL_RTX, loc, NULL_PTR, ! 4124: BASE_REG_CLASS, GET_MODE (tem), VOIDmode, 0, ! 4125: 0, opnum, type); ! 4126: return 1; ! 4127: } ! 4128: else ! 4129: return 0; ! 4130: } ! 4131: ! 4132: /* If we have address of a stack slot but it's not valid ! 4133: (displacement is too large), compute the sum in a register. */ ! 4134: else if (GET_CODE (ad) == PLUS ! 4135: && (XEXP (ad, 0) == frame_pointer_rtx ! 4136: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 4137: || XEXP (ad, 0) == hard_frame_pointer_rtx ! 4138: #endif ! 4139: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 4140: || XEXP (ad, 0) == arg_pointer_rtx ! 4141: #endif ! 4142: || XEXP (ad, 0) == stack_pointer_rtx) ! 4143: && GET_CODE (XEXP (ad, 1)) == CONST_INT) ! 4144: { ! 4145: /* Unshare the MEM rtx so we can safely alter it. */ ! 4146: if (memrefloc) ! 4147: { ! 4148: rtx oldref = *memrefloc; ! 4149: *memrefloc = copy_rtx (*memrefloc); ! 4150: loc = &XEXP (*memrefloc, 0); ! 4151: } ! 4152: if (double_reg_address_ok) ! 4153: { ! 4154: /* Unshare the sum as well. */ ! 4155: *loc = ad = copy_rtx (ad); ! 4156: /* Reload the displacement into an index reg. ! 4157: We assume the frame pointer or arg pointer is a base reg. */ ! 4158: find_reloads_address_part (XEXP (ad, 1), &XEXP (ad, 1), ! 4159: INDEX_REG_CLASS, GET_MODE (ad), opnum, ! 4160: type, ind_levels); ! 4161: } ! 4162: else ! 4163: { ! 4164: /* If the sum of two regs is not necessarily valid, ! 4165: reload the sum into a base reg. ! 4166: That will at least work. */ ! 4167: find_reloads_address_part (ad, loc, BASE_REG_CLASS, Pmode, ! 4168: opnum, type, ind_levels); ! 4169: } ! 4170: return 1; ! 4171: } ! 4172: ! 4173: /* If we have an indexed stack slot, there are three possible reasons why ! 4174: it might be invalid: The index might need to be reloaded, the address ! 4175: might have been made by frame pointer elimination and hence have a ! 4176: constant out of range, or both reasons might apply. ! 4177: ! 4178: We can easily check for an index needing reload, but even if that is the ! 4179: case, we might also have an invalid constant. To avoid making the ! 4180: conservative assumption and requiring two reloads, we see if this address ! 4181: is valid when not interpreted strictly. If it is, the only problem is ! 4182: that the index needs a reload and find_reloads_address_1 will take care ! 4183: of it. ! 4184: ! 4185: There is still a case when we might generate an extra reload, ! 4186: however. In certain cases eliminate_regs will return a MEM for a REG ! 4187: (see the code there for details). In those cases, memory_address_p ! 4188: applied to our address will return 0 so we will think that our offset ! 4189: must be too large. But it might indeed be valid and the only problem ! 4190: is that a MEM is present where a REG should be. This case should be ! 4191: very rare and there doesn't seem to be any way to avoid it. ! 4192: ! 4193: If we decide to do something here, it must be that ! 4194: `double_reg_address_ok' is true and that this address rtl was made by ! 4195: eliminate_regs. We generate a reload of the fp/sp/ap + constant and ! 4196: rework the sum so that the reload register will be added to the index. ! 4197: This is safe because we know the address isn't shared. ! 4198: ! 4199: We check for fp/ap/sp as both the first and second operand of the ! 4200: innermost PLUS. */ ! 4201: ! 4202: else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT ! 4203: && GET_CODE (XEXP (ad, 0)) == PLUS ! 4204: && (XEXP (XEXP (ad, 0), 0) == frame_pointer_rtx ! 4205: #if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM ! 4206: || XEXP (XEXP (ad, 0), 0) == hard_frame_pointer_rtx ! 4207: #endif ! 4208: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 4209: || XEXP (XEXP (ad, 0), 0) == arg_pointer_rtx ! 4210: #endif ! 4211: || XEXP (XEXP (ad, 0), 0) == stack_pointer_rtx) ! 4212: && ! memory_address_p (mode, ad)) ! 4213: { ! 4214: *loc = ad = gen_rtx (PLUS, GET_MODE (ad), ! 4215: plus_constant (XEXP (XEXP (ad, 0), 0), ! 4216: INTVAL (XEXP (ad, 1))), ! 4217: XEXP (XEXP (ad, 0), 1)); ! 4218: find_reloads_address_part (XEXP (ad, 0), &XEXP (ad, 0), BASE_REG_CLASS, ! 4219: GET_MODE (ad), opnum, type, ind_levels); ! 4220: find_reloads_address_1 (XEXP (ad, 1), 1, &XEXP (ad, 1), opnum, type, 0); ! 4221: ! 4222: return 1; ! 4223: } ! 4224: ! 4225: else if (GET_CODE (ad) == PLUS && GET_CODE (XEXP (ad, 1)) == CONST_INT ! 4226: && GET_CODE (XEXP (ad, 0)) == PLUS ! 4227: && (XEXP (XEXP (ad, 0), 1) == frame_pointer_rtx ! 4228: #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM ! 4229: || XEXP (XEXP (ad, 0), 1) == hard_frame_pointer_rtx ! 4230: #endif ! 4231: #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM ! 4232: || XEXP (XEXP (ad, 0), 1) == arg_pointer_rtx ! 4233: #endif ! 4234: || XEXP (XEXP (ad, 0), 1) == stack_pointer_rtx) ! 4235: && ! memory_address_p (mode, ad)) ! 4236: { ! 4237: *loc = ad = gen_rtx (PLUS, GET_MODE (ad), ! 4238: plus_constant (XEXP (XEXP (ad, 0), 1), ! 4239: INTVAL (XEXP (ad, 1))), ! 4240: XEXP (XEXP (ad, 0), 0)); ! 4241: find_reloads_address_part (XEXP (ad, 0), &XEXP (ad, 0), BASE_REG_CLASS, ! 4242: GET_MODE (ad), opnum, type, ind_levels); ! 4243: find_reloads_address_1 (XEXP (ad, 1), 1, &XEXP (ad, 1), opnum, type, 0); ! 4244: ! 4245: return 1; ! 4246: } ! 4247: ! 4248: /* See if address becomes valid when an eliminable register ! 4249: in a sum is replaced. */ ! 4250: ! 4251: tem = ad; ! 4252: if (GET_CODE (ad) == PLUS) ! 4253: tem = subst_indexed_address (ad); ! 4254: if (tem != ad && strict_memory_address_p (mode, tem)) ! 4255: { ! 4256: /* Ok, we win that way. Replace any additional eliminable ! 4257: registers. */ ! 4258: ! 4259: subst_reg_equivs_changed = 0; ! 4260: tem = subst_reg_equivs (tem); ! 4261: ! 4262: /* Make sure that didn't make the address invalid again. */ ! 4263: ! 4264: if (! subst_reg_equivs_changed || strict_memory_address_p (mode, tem)) ! 4265: { ! 4266: *loc = tem; ! 4267: return 0; ! 4268: } ! 4269: } ! 4270: ! 4271: /* If constants aren't valid addresses, reload the constant address ! 4272: into a register. */ ! 4273: if (CONSTANT_P (ad) && ! strict_memory_address_p (mode, ad)) ! 4274: { ! 4275: /* If AD is in address in the constant pool, the MEM rtx may be shared. ! 4276: Unshare it so we can safely alter it. */ ! 4277: if (memrefloc && GET_CODE (ad) == SYMBOL_REF ! 4278: && CONSTANT_POOL_ADDRESS_P (ad)) ! 4279: { ! 4280: rtx oldref = *memrefloc; ! 4281: *memrefloc = copy_rtx (*memrefloc); ! 4282: loc = &XEXP (*memrefloc, 0); ! 4283: } ! 4284: ! 4285: find_reloads_address_part (ad, loc, BASE_REG_CLASS, Pmode, opnum, type, ! 4286: ind_levels); ! 4287: return 1; ! 4288: } ! 4289: ! 4290: return find_reloads_address_1 (ad, 0, loc, opnum, type, ind_levels); ! 4291: } ! 4292: ! 4293: /* Find all pseudo regs appearing in AD ! 4294: that are eliminable in favor of equivalent values ! 4295: and do not have hard regs; replace them by their equivalents. */ ! 4296: ! 4297: static rtx ! 4298: subst_reg_equivs (ad) ! 4299: rtx ad; ! 4300: { ! 4301: register RTX_CODE code = GET_CODE (ad); ! 4302: register int i; ! 4303: register char *fmt; ! 4304: ! 4305: switch (code) ! 4306: { ! 4307: case HIGH: ! 4308: case CONST_INT: ! 4309: case CONST: ! 4310: case CONST_DOUBLE: ! 4311: case SYMBOL_REF: ! 4312: case LABEL_REF: ! 4313: case PC: ! 4314: case CC0: ! 4315: return ad; ! 4316: ! 4317: case REG: ! 4318: { ! 4319: register int regno = REGNO (ad); ! 4320: ! 4321: if (reg_equiv_constant[regno] != 0) ! 4322: { ! 4323: subst_reg_equivs_changed = 1; ! 4324: return reg_equiv_constant[regno]; ! 4325: } ! 4326: } ! 4327: return ad; ! 4328: ! 4329: case PLUS: ! 4330: /* Quickly dispose of a common case. */ ! 4331: if (XEXP (ad, 0) == frame_pointer_rtx ! 4332: && GET_CODE (XEXP (ad, 1)) == CONST_INT) ! 4333: return ad; ! 4334: } ! 4335: ! 4336: fmt = GET_RTX_FORMAT (code); ! 4337: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 4338: if (fmt[i] == 'e') ! 4339: XEXP (ad, i) = subst_reg_equivs (XEXP (ad, i)); ! 4340: return ad; ! 4341: } ! 4342: ! 4343: /* Compute the sum of X and Y, making canonicalizations assumed in an ! 4344: address, namely: sum constant integers, surround the sum of two ! 4345: constants with a CONST, put the constant as the second operand, and ! 4346: group the constant on the outermost sum. ! 4347: ! 4348: This routine assumes both inputs are already in canonical form. */ ! 4349: ! 4350: rtx ! 4351: form_sum (x, y) ! 4352: rtx x, y; ! 4353: { ! 4354: rtx tem; ! 4355: enum machine_mode mode = GET_MODE (x); ! 4356: ! 4357: if (mode == VOIDmode) ! 4358: mode = GET_MODE (y); ! 4359: ! 4360: if (mode == VOIDmode) ! 4361: mode = Pmode; ! 4362: ! 4363: if (GET_CODE (x) == CONST_INT) ! 4364: return plus_constant (y, INTVAL (x)); ! 4365: else if (GET_CODE (y) == CONST_INT) ! 4366: return plus_constant (x, INTVAL (y)); ! 4367: else if (CONSTANT_P (x)) ! 4368: tem = x, x = y, y = tem; ! 4369: ! 4370: if (GET_CODE (x) == PLUS && CONSTANT_P (XEXP (x, 1))) ! 4371: return form_sum (XEXP (x, 0), form_sum (XEXP (x, 1), y)); ! 4372: ! 4373: /* Note that if the operands of Y are specified in the opposite ! 4374: order in the recursive calls below, infinite recursion will occur. */ ! 4375: if (GET_CODE (y) == PLUS && CONSTANT_P (XEXP (y, 1))) ! 4376: return form_sum (form_sum (x, XEXP (y, 0)), XEXP (y, 1)); ! 4377: ! 4378: /* If both constant, encapsulate sum. Otherwise, just form sum. A ! 4379: constant will have been placed second. */ ! 4380: if (CONSTANT_P (x) && CONSTANT_P (y)) ! 4381: { ! 4382: if (GET_CODE (x) == CONST) ! 4383: x = XEXP (x, 0); ! 4384: if (GET_CODE (y) == CONST) ! 4385: y = XEXP (y, 0); ! 4386: ! 4387: return gen_rtx (CONST, VOIDmode, gen_rtx (PLUS, mode, x, y)); ! 4388: } ! 4389: ! 4390: return gen_rtx (PLUS, mode, x, y); ! 4391: } ! 4392: ! 4393: /* If ADDR is a sum containing a pseudo register that should be ! 4394: replaced with a constant (from reg_equiv_constant), ! 4395: return the result of doing so, and also apply the associative ! 4396: law so that the result is more likely to be a valid address. ! 4397: (But it is not guaranteed to be one.) ! 4398: ! 4399: Note that at most one register is replaced, even if more are ! 4400: replaceable. Also, we try to put the result into a canonical form ! 4401: so it is more likely to be a valid address. ! 4402: ! 4403: In all other cases, return ADDR. */ ! 4404: ! 4405: static rtx ! 4406: subst_indexed_address (addr) ! 4407: rtx addr; ! 4408: { ! 4409: rtx op0 = 0, op1 = 0, op2 = 0; ! 4410: rtx tem; ! 4411: int regno; ! 4412: ! 4413: if (GET_CODE (addr) == PLUS) ! 4414: { ! 4415: /* Try to find a register to replace. */ ! 4416: op0 = XEXP (addr, 0), op1 = XEXP (addr, 1), op2 = 0; ! 4417: if (GET_CODE (op0) == REG ! 4418: && (regno = REGNO (op0)) >= FIRST_PSEUDO_REGISTER ! 4419: && reg_renumber[regno] < 0 ! 4420: && reg_equiv_constant[regno] != 0) ! 4421: op0 = reg_equiv_constant[regno]; ! 4422: else if (GET_CODE (op1) == REG ! 4423: && (regno = REGNO (op1)) >= FIRST_PSEUDO_REGISTER ! 4424: && reg_renumber[regno] < 0 ! 4425: && reg_equiv_constant[regno] != 0) ! 4426: op1 = reg_equiv_constant[regno]; ! 4427: else if (GET_CODE (op0) == PLUS ! 4428: && (tem = subst_indexed_address (op0)) != op0) ! 4429: op0 = tem; ! 4430: else if (GET_CODE (op1) == PLUS ! 4431: && (tem = subst_indexed_address (op1)) != op1) ! 4432: op1 = tem; ! 4433: else ! 4434: return addr; ! 4435: ! 4436: /* Pick out up to three things to add. */ ! 4437: if (GET_CODE (op1) == PLUS) ! 4438: op2 = XEXP (op1, 1), op1 = XEXP (op1, 0); ! 4439: else if (GET_CODE (op0) == PLUS) ! 4440: op2 = op1, op1 = XEXP (op0, 1), op0 = XEXP (op0, 0); ! 4441: ! 4442: /* Compute the sum. */ ! 4443: if (op2 != 0) ! 4444: op1 = form_sum (op1, op2); ! 4445: if (op1 != 0) ! 4446: op0 = form_sum (op0, op1); ! 4447: ! 4448: return op0; ! 4449: } ! 4450: return addr; ! 4451: } ! 4452: ! 4453: /* Record the pseudo registers we must reload into hard registers ! 4454: in a subexpression of a would-be memory address, X. ! 4455: (This function is not called if the address we find is strictly valid.) ! 4456: CONTEXT = 1 means we are considering regs as index regs, ! 4457: = 0 means we are considering them as base regs. ! 4458: ! 4459: OPNUM and TYPE specify the purpose of any reloads made. ! 4460: ! 4461: IND_LEVELS says how many levels of indirect addressing are ! 4462: supported at this point in the address. ! 4463: ! 4464: We return nonzero if X, as a whole, is reloaded or replaced. */ ! 4465: ! 4466: /* Note that we take shortcuts assuming that no multi-reg machine mode ! 4467: occurs as part of an address. ! 4468: Also, this is not fully machine-customizable; it works for machines ! 4469: such as vaxes and 68000's and 32000's, but other possible machines ! 4470: could have addressing modes that this does not handle right. */ ! 4471: ! 4472: static int ! 4473: find_reloads_address_1 (x, context, loc, opnum, type, ind_levels) ! 4474: rtx x; ! 4475: int context; ! 4476: rtx *loc; ! 4477: int opnum; ! 4478: enum reload_type type; ! 4479: int ind_levels; ! 4480: { ! 4481: register RTX_CODE code = GET_CODE (x); ! 4482: ! 4483: if (code == PLUS) ! 4484: { ! 4485: register rtx orig_op0 = XEXP (x, 0); ! 4486: register rtx orig_op1 = XEXP (x, 1); ! 4487: register RTX_CODE code0 = GET_CODE (orig_op0); ! 4488: register RTX_CODE code1 = GET_CODE (orig_op1); ! 4489: register rtx op0 = orig_op0; ! 4490: register rtx op1 = orig_op1; ! 4491: ! 4492: if (GET_CODE (op0) == SUBREG) ! 4493: { ! 4494: op0 = SUBREG_REG (op0); ! 4495: code0 = GET_CODE (op0); ! 4496: } ! 4497: if (GET_CODE (op1) == SUBREG) ! 4498: { ! 4499: op1 = SUBREG_REG (op1); ! 4500: code1 = GET_CODE (op1); ! 4501: } ! 4502: ! 4503: if (code0 == MULT || code0 == SIGN_EXTEND || code1 == MEM) ! 4504: { ! 4505: find_reloads_address_1 (orig_op0, 1, &XEXP (x, 0), opnum, type, ! 4506: ind_levels); ! 4507: find_reloads_address_1 (orig_op1, 0, &XEXP (x, 1), opnum, type, ! 4508: ind_levels); ! 4509: } ! 4510: else if (code1 == MULT || code1 == SIGN_EXTEND || code0 == MEM) ! 4511: { ! 4512: find_reloads_address_1 (orig_op0, 0, &XEXP (x, 0), opnum, type, ! 4513: ind_levels); ! 4514: find_reloads_address_1 (orig_op1, 1, &XEXP (x, 1), opnum, type, ! 4515: ind_levels); ! 4516: } ! 4517: else if (code0 == CONST_INT || code0 == CONST ! 4518: || code0 == SYMBOL_REF || code0 == LABEL_REF) ! 4519: find_reloads_address_1 (orig_op1, 0, &XEXP (x, 1), opnum, type, ind_levels); ! 4520: else if (code1 == CONST_INT || code1 == CONST ! 4521: || code1 == SYMBOL_REF || code1 == LABEL_REF) ! 4522: find_reloads_address_1 (orig_op0, 0, &XEXP (x, 0), opnum, type, ind_levels); ! 4523: else if (code0 == REG && code1 == REG) ! 4524: { ! 4525: if (REG_OK_FOR_INDEX_P (op0) ! 4526: && REG_OK_FOR_BASE_P (op1)) ! 4527: return 0; ! 4528: else if (REG_OK_FOR_INDEX_P (op1) ! 4529: && REG_OK_FOR_BASE_P (op0)) ! 4530: return 0; ! 4531: else if (REG_OK_FOR_BASE_P (op1)) ! 4532: find_reloads_address_1 (orig_op0, 1, &XEXP (x, 0), opnum, type, ! 4533: ind_levels); ! 4534: else if (REG_OK_FOR_BASE_P (op0)) ! 4535: find_reloads_address_1 (orig_op1, 1, &XEXP (x, 1), opnum, type, ! 4536: ind_levels); ! 4537: else if (REG_OK_FOR_INDEX_P (op1)) ! 4538: find_reloads_address_1 (orig_op0, 0, &XEXP (x, 0), opnum, type, ! 4539: ind_levels); ! 4540: else if (REG_OK_FOR_INDEX_P (op0)) ! 4541: find_reloads_address_1 (orig_op1, 0, &XEXP (x, 1), opnum, type, ! 4542: ind_levels); ! 4543: else ! 4544: { ! 4545: find_reloads_address_1 (orig_op0, 1, &XEXP (x, 0), opnum, type, ! 4546: ind_levels); ! 4547: find_reloads_address_1 (orig_op1, 0, &XEXP (x, 1), opnum, type, ! 4548: ind_levels); ! 4549: } ! 4550: } ! 4551: else if (code0 == REG) ! 4552: { ! 4553: find_reloads_address_1 (orig_op0, 1, &XEXP (x, 0), opnum, type, ! 4554: ind_levels); ! 4555: find_reloads_address_1 (orig_op1, 0, &XEXP (x, 1), opnum, type, ! 4556: ind_levels); ! 4557: } ! 4558: else if (code1 == REG) ! 4559: { ! 4560: find_reloads_address_1 (orig_op1, 1, &XEXP (x, 1), opnum, type, ! 4561: ind_levels); ! 4562: find_reloads_address_1 (orig_op0, 0, &XEXP (x, 0), opnum, type, ! 4563: ind_levels); ! 4564: } ! 4565: } ! 4566: else if (code == POST_INC || code == POST_DEC ! 4567: || code == PRE_INC || code == PRE_DEC) ! 4568: { ! 4569: if (GET_CODE (XEXP (x, 0)) == REG) ! 4570: { ! 4571: register int regno = REGNO (XEXP (x, 0)); ! 4572: int value = 0; ! 4573: rtx x_orig = x; ! 4574: ! 4575: /* A register that is incremented cannot be constant! */ ! 4576: if (regno >= FIRST_PSEUDO_REGISTER ! 4577: && reg_equiv_constant[regno] != 0) ! 4578: abort (); ! 4579: ! 4580: /* Handle a register that is equivalent to a memory location ! 4581: which cannot be addressed directly. */ ! 4582: if (reg_equiv_address[regno] != 0) ! 4583: { ! 4584: rtx tem = make_memloc (XEXP (x, 0), regno); ! 4585: /* First reload the memory location's address. */ ! 4586: find_reloads_address (GET_MODE (tem), 0, XEXP (tem, 0), ! 4587: &XEXP (tem, 0), opnum, type, ind_levels); ! 4588: /* Put this inside a new increment-expression. */ ! 4589: x = gen_rtx (GET_CODE (x), GET_MODE (x), tem); ! 4590: /* Proceed to reload that, as if it contained a register. */ ! 4591: } ! 4592: ! 4593: /* If we have a hard register that is ok as an index, ! 4594: don't make a reload. If an autoincrement of a nice register ! 4595: isn't "valid", it must be that no autoincrement is "valid". ! 4596: If that is true and something made an autoincrement anyway, ! 4597: this must be a special context where one is allowed. ! 4598: (For example, a "push" instruction.) ! 4599: We can't improve this address, so leave it alone. */ ! 4600: ! 4601: /* Otherwise, reload the autoincrement into a suitable hard reg ! 4602: and record how much to increment by. */ ! 4603: ! 4604: if (reg_renumber[regno] >= 0) ! 4605: regno = reg_renumber[regno]; ! 4606: if ((regno >= FIRST_PSEUDO_REGISTER ! 4607: || !(context ? REGNO_OK_FOR_INDEX_P (regno) ! 4608: : REGNO_OK_FOR_BASE_P (regno)))) ! 4609: { ! 4610: register rtx link; ! 4611: ! 4612: int reloadnum ! 4613: = push_reload (x, NULL_RTX, loc, NULL_PTR, ! 4614: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4615: GET_MODE (x), GET_MODE (x), VOIDmode, 0, ! 4616: opnum, type); ! 4617: reload_inc[reloadnum] ! 4618: = find_inc_amount (PATTERN (this_insn), XEXP (x_orig, 0)); ! 4619: ! 4620: value = 1; ! 4621: ! 4622: #ifdef AUTO_INC_DEC ! 4623: /* Update the REG_INC notes. */ ! 4624: ! 4625: for (link = REG_NOTES (this_insn); ! 4626: link; link = XEXP (link, 1)) ! 4627: if (REG_NOTE_KIND (link) == REG_INC ! 4628: && REGNO (XEXP (link, 0)) == REGNO (XEXP (x_orig, 0))) ! 4629: push_replacement (&XEXP (link, 0), reloadnum, VOIDmode); ! 4630: #endif ! 4631: } ! 4632: return value; ! 4633: } ! 4634: else if (GET_CODE (XEXP (x, 0)) == MEM) ! 4635: { ! 4636: /* This is probably the result of a substitution, by eliminate_regs, ! 4637: of an equivalent address for a pseudo that was not allocated to a ! 4638: hard register. Verify that the specified address is valid and ! 4639: reload it into a register. */ ! 4640: rtx tem = XEXP (x, 0); ! 4641: register rtx link; ! 4642: int reloadnum; ! 4643: ! 4644: /* Since we know we are going to reload this item, don't decrement ! 4645: for the indirection level. ! 4646: ! 4647: Note that this is actually conservative: it would be slightly ! 4648: more efficient to use the value of SPILL_INDIRECT_LEVELS from ! 4649: reload1.c here. */ ! 4650: find_reloads_address (GET_MODE (x), &XEXP (x, 0), ! 4651: XEXP (XEXP (x, 0), 0), &XEXP (XEXP (x, 0), 0), ! 4652: opnum, type, ind_levels); ! 4653: ! 4654: reloadnum = push_reload (x, NULL_RTX, loc, NULL_PTR, ! 4655: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4656: GET_MODE (x), VOIDmode, 0, 0, opnum, type); ! 4657: reload_inc[reloadnum] ! 4658: = find_inc_amount (PATTERN (this_insn), XEXP (x, 0)); ! 4659: ! 4660: link = FIND_REG_INC_NOTE (this_insn, tem); ! 4661: if (link != 0) ! 4662: push_replacement (&XEXP (link, 0), reloadnum, VOIDmode); ! 4663: ! 4664: return 1; ! 4665: } ! 4666: } ! 4667: else if (code == MEM) ! 4668: { ! 4669: /* This is probably the result of a substitution, by eliminate_regs, ! 4670: of an equivalent address for a pseudo that was not allocated to a ! 4671: hard register. Verify that the specified address is valid and reload ! 4672: it into a register. ! 4673: ! 4674: Since we know we are going to reload this item, don't decrement ! 4675: for the indirection level. ! 4676: ! 4677: Note that this is actually conservative: it would be slightly more ! 4678: efficient to use the value of SPILL_INDIRECT_LEVELS from ! 4679: reload1.c here. */ ! 4680: ! 4681: find_reloads_address (GET_MODE (x), loc, XEXP (x, 0), &XEXP (x, 0), ! 4682: opnum, type, ind_levels); ! 4683: ! 4684: push_reload (*loc, NULL_RTX, loc, NULL_PTR, ! 4685: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4686: GET_MODE (x), VOIDmode, 0, 0, opnum, type); ! 4687: return 1; ! 4688: } ! 4689: else if (code == REG) ! 4690: { ! 4691: register int regno = REGNO (x); ! 4692: ! 4693: if (reg_equiv_constant[regno] != 0) ! 4694: { ! 4695: find_reloads_address_part (reg_equiv_constant[regno], loc, ! 4696: (context ? INDEX_REG_CLASS ! 4697: : BASE_REG_CLASS), ! 4698: GET_MODE (x), opnum, type, ind_levels); ! 4699: return 1; ! 4700: } ! 4701: ! 4702: #if 0 /* This might screw code in reload1.c to delete prior output-reload ! 4703: that feeds this insn. */ ! 4704: if (reg_equiv_mem[regno] != 0) ! 4705: { ! 4706: push_reload (reg_equiv_mem[regno], NULL_RTX, loc, NULL_PTR, ! 4707: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4708: GET_MODE (x), VOIDmode, 0, 0, opnum, type); ! 4709: return 1; ! 4710: } ! 4711: #endif ! 4712: if (reg_equiv_address[regno] != 0) ! 4713: { ! 4714: x = make_memloc (x, regno); ! 4715: find_reloads_address (GET_MODE (x), 0, XEXP (x, 0), &XEXP (x, 0), ! 4716: opnum, type, ind_levels); ! 4717: } ! 4718: ! 4719: if (reg_renumber[regno] >= 0) ! 4720: regno = reg_renumber[regno]; ! 4721: if ((regno >= FIRST_PSEUDO_REGISTER ! 4722: || !(context ? REGNO_OK_FOR_INDEX_P (regno) ! 4723: : REGNO_OK_FOR_BASE_P (regno)))) ! 4724: { ! 4725: push_reload (x, NULL_RTX, loc, NULL_PTR, ! 4726: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4727: GET_MODE (x), VOIDmode, 0, 0, opnum, type); ! 4728: return 1; ! 4729: } ! 4730: ! 4731: /* If a register appearing in an address is the subject of a CLOBBER ! 4732: in this insn, reload it into some other register to be safe. ! 4733: The CLOBBER is supposed to make the register unavailable ! 4734: from before this insn to after it. */ ! 4735: if (regno_clobbered_p (regno, this_insn)) ! 4736: { ! 4737: push_reload (x, NULL_RTX, loc, NULL_PTR, ! 4738: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 4739: GET_MODE (x), VOIDmode, 0, 0, opnum, type); ! 4740: return 1; ! 4741: } ! 4742: } ! 4743: else ! 4744: { ! 4745: register char *fmt = GET_RTX_FORMAT (code); ! 4746: register int i; ! 4747: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 4748: { ! 4749: if (fmt[i] == 'e') ! 4750: find_reloads_address_1 (XEXP (x, i), context, &XEXP (x, i), ! 4751: opnum, type, ind_levels); ! 4752: } ! 4753: } ! 4754: ! 4755: return 0; ! 4756: } ! 4757: ! 4758: /* X, which is found at *LOC, is a part of an address that needs to be ! 4759: reloaded into a register of class CLASS. If X is a constant, or if ! 4760: X is a PLUS that contains a constant, check that the constant is a ! 4761: legitimate operand and that we are supposed to be able to load ! 4762: it into the register. ! 4763: ! 4764: If not, force the constant into memory and reload the MEM instead. ! 4765: ! 4766: MODE is the mode to use, in case X is an integer constant. ! 4767: ! 4768: OPNUM and TYPE describe the purpose of any reloads made. ! 4769: ! 4770: IND_LEVELS says how many levels of indirect addressing this machine ! 4771: supports. */ ! 4772: ! 4773: static void ! 4774: find_reloads_address_part (x, loc, class, mode, opnum, type, ind_levels) ! 4775: rtx x; ! 4776: rtx *loc; ! 4777: enum reg_class class; ! 4778: enum machine_mode mode; ! 4779: int opnum; ! 4780: enum reload_type type; ! 4781: int ind_levels; ! 4782: { ! 4783: if (CONSTANT_P (x) ! 4784: && (! LEGITIMATE_CONSTANT_P (x) ! 4785: || PREFERRED_RELOAD_CLASS (x, class) == NO_REGS)) ! 4786: { ! 4787: rtx tem = x = force_const_mem (mode, x); ! 4788: find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0), ! 4789: opnum, type, ind_levels); ! 4790: } ! 4791: ! 4792: else if (GET_CODE (x) == PLUS ! 4793: && CONSTANT_P (XEXP (x, 1)) ! 4794: && (! LEGITIMATE_CONSTANT_P (XEXP (x, 1)) ! 4795: || PREFERRED_RELOAD_CLASS (XEXP (x, 1), class) == NO_REGS)) ! 4796: { ! 4797: rtx tem = force_const_mem (GET_MODE (x), XEXP (x, 1)); ! 4798: ! 4799: x = gen_rtx (PLUS, GET_MODE (x), XEXP (x, 0), tem); ! 4800: find_reloads_address (mode, &tem, XEXP (tem, 0), &XEXP (tem, 0), ! 4801: opnum, type, ind_levels); ! 4802: } ! 4803: ! 4804: push_reload (x, NULL_RTX, loc, NULL_PTR, class, ! 4805: mode, VOIDmode, 0, 0, opnum, type); ! 4806: } ! 4807: ! 4808: /* Substitute into the current INSN the registers into which we have reloaded ! 4809: the things that need reloading. The array `replacements' ! 4810: says contains the locations of all pointers that must be changed ! 4811: and says what to replace them with. ! 4812: ! 4813: Return the rtx that X translates into; usually X, but modified. */ ! 4814: ! 4815: void ! 4816: subst_reloads () ! 4817: { ! 4818: register int i; ! 4819: ! 4820: for (i = 0; i < n_replacements; i++) ! 4821: { ! 4822: register struct replacement *r = &replacements[i]; ! 4823: register rtx reloadreg = reload_reg_rtx[r->what]; ! 4824: if (reloadreg) ! 4825: { ! 4826: /* Encapsulate RELOADREG so its machine mode matches what ! 4827: used to be there. Note that gen_lowpart_common will ! 4828: do the wrong thing if RELOADREG is multi-word. RELOADREG ! 4829: will always be a REG here. */ ! 4830: if (GET_MODE (reloadreg) != r->mode && r->mode != VOIDmode) ! 4831: reloadreg = gen_rtx (REG, r->mode, REGNO (reloadreg)); ! 4832: ! 4833: /* If we are putting this into a SUBREG and RELOADREG is a ! 4834: SUBREG, we would be making nested SUBREGs, so we have to fix ! 4835: this up. Note that r->where == &SUBREG_REG (*r->subreg_loc). */ ! 4836: ! 4837: if (r->subreg_loc != 0 && GET_CODE (reloadreg) == SUBREG) ! 4838: { ! 4839: if (GET_MODE (*r->subreg_loc) ! 4840: == GET_MODE (SUBREG_REG (reloadreg))) ! 4841: *r->subreg_loc = SUBREG_REG (reloadreg); ! 4842: else ! 4843: { ! 4844: *r->where = SUBREG_REG (reloadreg); ! 4845: SUBREG_WORD (*r->subreg_loc) += SUBREG_WORD (reloadreg); ! 4846: } ! 4847: } ! 4848: else ! 4849: *r->where = reloadreg; ! 4850: } ! 4851: /* If reload got no reg and isn't optional, something's wrong. */ ! 4852: else if (! reload_optional[r->what]) ! 4853: abort (); ! 4854: } ! 4855: } ! 4856: ! 4857: /* Make a copy of any replacements being done into X and move those copies ! 4858: to locations in Y, a copy of X. We only look at the highest level of ! 4859: the RTL. */ ! 4860: ! 4861: void ! 4862: copy_replacements (x, y) ! 4863: rtx x; ! 4864: rtx y; ! 4865: { ! 4866: int i, j; ! 4867: enum rtx_code code = GET_CODE (x); ! 4868: char *fmt = GET_RTX_FORMAT (code); ! 4869: struct replacement *r; ! 4870: ! 4871: /* We can't support X being a SUBREG because we might then need to know its ! 4872: location if something inside it was replaced. */ ! 4873: if (code == SUBREG) ! 4874: abort (); ! 4875: ! 4876: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 4877: if (fmt[i] == 'e') ! 4878: for (j = 0; j < n_replacements; j++) ! 4879: { ! 4880: if (replacements[j].subreg_loc == &XEXP (x, i)) ! 4881: { ! 4882: r = &replacements[n_replacements++]; ! 4883: r->where = replacements[j].where; ! 4884: r->subreg_loc = &XEXP (y, i); ! 4885: r->what = replacements[j].what; ! 4886: r->mode = replacements[j].mode; ! 4887: } ! 4888: else if (replacements[j].where == &XEXP (x, i)) ! 4889: { ! 4890: r = &replacements[n_replacements++]; ! 4891: r->where = &XEXP (y, i); ! 4892: r->subreg_loc = 0; ! 4893: r->what = replacements[j].what; ! 4894: r->mode = replacements[j].mode; ! 4895: } ! 4896: } ! 4897: } ! 4898: ! 4899: /* If LOC was scheduled to be replaced by something, return the replacement. ! 4900: Otherwise, return *LOC. */ ! 4901: ! 4902: rtx ! 4903: find_replacement (loc) ! 4904: rtx *loc; ! 4905: { ! 4906: struct replacement *r; ! 4907: ! 4908: for (r = &replacements[0]; r < &replacements[n_replacements]; r++) ! 4909: { ! 4910: rtx reloadreg = reload_reg_rtx[r->what]; ! 4911: ! 4912: if (reloadreg && r->where == loc) ! 4913: { ! 4914: if (r->mode != VOIDmode && GET_MODE (reloadreg) != r->mode) ! 4915: reloadreg = gen_rtx (REG, r->mode, REGNO (reloadreg)); ! 4916: ! 4917: return reloadreg; ! 4918: } ! 4919: else if (reloadreg && r->subreg_loc == loc) ! 4920: { ! 4921: /* RELOADREG must be either a REG or a SUBREG. ! 4922: ! 4923: ??? Is it actually still ever a SUBREG? If so, why? */ ! 4924: ! 4925: if (GET_CODE (reloadreg) == REG) ! 4926: return gen_rtx (REG, GET_MODE (*loc), ! 4927: REGNO (reloadreg) + SUBREG_WORD (*loc)); ! 4928: else if (GET_MODE (reloadreg) == GET_MODE (*loc)) ! 4929: return reloadreg; ! 4930: else ! 4931: return gen_rtx (SUBREG, GET_MODE (*loc), SUBREG_REG (reloadreg), ! 4932: SUBREG_WORD (reloadreg) + SUBREG_WORD (*loc)); ! 4933: } ! 4934: } ! 4935: ! 4936: return *loc; ! 4937: } ! 4938: ! 4939: /* Return nonzero if register in range [REGNO, ENDREGNO) ! 4940: appears either explicitly or implicitly in X ! 4941: other than being stored into (except for earlyclobber operands). ! 4942: ! 4943: References contained within the substructure at LOC do not count. ! 4944: LOC may be zero, meaning don't ignore anything. ! 4945: ! 4946: This is similar to refers_to_regno_p in rtlanal.c except that we ! 4947: look at equivalences for pseudos that didn't get hard registers. */ ! 4948: ! 4949: int ! 4950: refers_to_regno_for_reload_p (regno, endregno, x, loc) ! 4951: int regno, endregno; ! 4952: rtx x; ! 4953: rtx *loc; ! 4954: { ! 4955: register int i; ! 4956: register RTX_CODE code; ! 4957: register char *fmt; ! 4958: ! 4959: if (x == 0) ! 4960: return 0; ! 4961: ! 4962: repeat: ! 4963: code = GET_CODE (x); ! 4964: ! 4965: switch (code) ! 4966: { ! 4967: case REG: ! 4968: i = REGNO (x); ! 4969: ! 4970: /* If this is a pseudo, a hard register must not have been allocated. ! 4971: X must therefore either be a constant or be in memory. */ ! 4972: if (i >= FIRST_PSEUDO_REGISTER) ! 4973: { ! 4974: if (reg_equiv_memory_loc[i]) ! 4975: return refers_to_regno_for_reload_p (regno, endregno, ! 4976: reg_equiv_memory_loc[i], ! 4977: NULL_PTR); ! 4978: ! 4979: if (reg_equiv_constant[i]) ! 4980: return 0; ! 4981: ! 4982: abort (); ! 4983: } ! 4984: ! 4985: return (endregno > i ! 4986: && regno < i + (i < FIRST_PSEUDO_REGISTER ! 4987: ? HARD_REGNO_NREGS (i, GET_MODE (x)) ! 4988: : 1)); ! 4989: ! 4990: case SUBREG: ! 4991: /* If this is a SUBREG of a hard reg, we can see exactly which ! 4992: registers are being modified. Otherwise, handle normally. */ ! 4993: if (GET_CODE (SUBREG_REG (x)) == REG ! 4994: && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER) ! 4995: { ! 4996: int inner_regno = REGNO (SUBREG_REG (x)) + SUBREG_WORD (x); ! 4997: int inner_endregno ! 4998: = inner_regno + (inner_regno < FIRST_PSEUDO_REGISTER ! 4999: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); ! 5000: ! 5001: return endregno > inner_regno && regno < inner_endregno; ! 5002: } ! 5003: break; ! 5004: ! 5005: case CLOBBER: ! 5006: case SET: ! 5007: if (&SET_DEST (x) != loc ! 5008: /* Note setting a SUBREG counts as referring to the REG it is in for ! 5009: a pseudo but not for hard registers since we can ! 5010: treat each word individually. */ ! 5011: && ((GET_CODE (SET_DEST (x)) == SUBREG ! 5012: && loc != &SUBREG_REG (SET_DEST (x)) ! 5013: && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG ! 5014: && REGNO (SUBREG_REG (SET_DEST (x))) >= FIRST_PSEUDO_REGISTER ! 5015: && refers_to_regno_for_reload_p (regno, endregno, ! 5016: SUBREG_REG (SET_DEST (x)), ! 5017: loc)) ! 5018: /* If the ouput is an earlyclobber operand, this is ! 5019: a conflict. */ ! 5020: || ((GET_CODE (SET_DEST (x)) != REG ! 5021: || earlyclobber_operand_p (SET_DEST (x))) ! 5022: && refers_to_regno_for_reload_p (regno, endregno, ! 5023: SET_DEST (x), loc)))) ! 5024: return 1; ! 5025: ! 5026: if (code == CLOBBER || loc == &SET_SRC (x)) ! 5027: return 0; ! 5028: x = SET_SRC (x); ! 5029: goto repeat; ! 5030: } ! 5031: ! 5032: /* X does not match, so try its subexpressions. */ ! 5033: ! 5034: fmt = GET_RTX_FORMAT (code); ! 5035: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 5036: { ! 5037: if (fmt[i] == 'e' && loc != &XEXP (x, i)) ! 5038: { ! 5039: if (i == 0) ! 5040: { ! 5041: x = XEXP (x, 0); ! 5042: goto repeat; ! 5043: } ! 5044: else ! 5045: if (refers_to_regno_for_reload_p (regno, endregno, ! 5046: XEXP (x, i), loc)) ! 5047: return 1; ! 5048: } ! 5049: else if (fmt[i] == 'E') ! 5050: { ! 5051: register int j; ! 5052: for (j = XVECLEN (x, i) - 1; j >=0; j--) ! 5053: if (loc != &XVECEXP (x, i, j) ! 5054: && refers_to_regno_for_reload_p (regno, endregno, ! 5055: XVECEXP (x, i, j), loc)) ! 5056: return 1; ! 5057: } ! 5058: } ! 5059: return 0; ! 5060: } ! 5061: ! 5062: /* Nonzero if modifying X will affect IN. If X is a register or a SUBREG, ! 5063: we check if any register number in X conflicts with the relevant register ! 5064: numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN ! 5065: contains a MEM (we don't bother checking for memory addresses that can't ! 5066: conflict because we expect this to be a rare case. ! 5067: ! 5068: This function is similar to reg_overlap_mention_p in rtlanal.c except ! 5069: that we look at equivalences for pseudos that didn't get hard registers. */ ! 5070: ! 5071: int ! 5072: reg_overlap_mentioned_for_reload_p (x, in) ! 5073: rtx x, in; ! 5074: { ! 5075: int regno, endregno; ! 5076: ! 5077: if (GET_CODE (x) == SUBREG) ! 5078: { ! 5079: regno = REGNO (SUBREG_REG (x)); ! 5080: if (regno < FIRST_PSEUDO_REGISTER) ! 5081: regno += SUBREG_WORD (x); ! 5082: } ! 5083: else if (GET_CODE (x) == REG) ! 5084: { ! 5085: regno = REGNO (x); ! 5086: ! 5087: /* If this is a pseudo, it must not have been assigned a hard register. ! 5088: Therefore, it must either be in memory or be a constant. */ ! 5089: ! 5090: if (regno >= FIRST_PSEUDO_REGISTER) ! 5091: { ! 5092: if (reg_equiv_memory_loc[regno]) ! 5093: return refers_to_mem_for_reload_p (in); ! 5094: else if (reg_equiv_constant[regno]) ! 5095: return 0; ! 5096: abort (); ! 5097: } ! 5098: } ! 5099: else if (CONSTANT_P (x)) ! 5100: return 0; ! 5101: else if (GET_CODE (x) == MEM) ! 5102: return refers_to_mem_for_reload_p (in); ! 5103: else if (GET_CODE (x) == SCRATCH || GET_CODE (x) == PC ! 5104: || GET_CODE (x) == CC0) ! 5105: return reg_mentioned_p (x, in); ! 5106: else ! 5107: abort (); ! 5108: ! 5109: endregno = regno + (regno < FIRST_PSEUDO_REGISTER ! 5110: ? HARD_REGNO_NREGS (regno, GET_MODE (x)) : 1); ! 5111: ! 5112: return refers_to_regno_for_reload_p (regno, endregno, in, NULL_PTR); ! 5113: } ! 5114: ! 5115: /* Return nonzero if anything in X contains a MEM. Look also for pseudo ! 5116: registers. */ ! 5117: ! 5118: int ! 5119: refers_to_mem_for_reload_p (x) ! 5120: rtx x; ! 5121: { ! 5122: char *fmt; ! 5123: int i; ! 5124: ! 5125: if (GET_CODE (x) == MEM) ! 5126: return 1; ! 5127: ! 5128: if (GET_CODE (x) == REG) ! 5129: return (REGNO (x) >= FIRST_PSEUDO_REGISTER ! 5130: && reg_equiv_memory_loc[REGNO (x)]); ! 5131: ! 5132: fmt = GET_RTX_FORMAT (GET_CODE (x)); ! 5133: for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) ! 5134: if (fmt[i] == 'e' ! 5135: && (GET_CODE (XEXP (x, i)) == MEM ! 5136: || refers_to_mem_for_reload_p (XEXP (x, i)))) ! 5137: return 1; ! 5138: ! 5139: return 0; ! 5140: } ! 5141: ! 5142: /* Check the insns before INSN to see if there is a suitable register ! 5143: containing the same value as GOAL. ! 5144: If OTHER is -1, look for a register in class CLASS. ! 5145: Otherwise, just see if register number OTHER shares GOAL's value. ! 5146: ! 5147: Return an rtx for the register found, or zero if none is found. ! 5148: ! 5149: If RELOAD_REG_P is (short *)1, ! 5150: we reject any hard reg that appears in reload_reg_rtx ! 5151: because such a hard reg is also needed coming into this insn. ! 5152: ! 5153: If RELOAD_REG_P is any other nonzero value, ! 5154: it is a vector indexed by hard reg number ! 5155: and we reject any hard reg whose element in the vector is nonnegative ! 5156: as well as any that appears in reload_reg_rtx. ! 5157: ! 5158: If GOAL is zero, then GOALREG is a register number; we look ! 5159: for an equivalent for that register. ! 5160: ! 5161: MODE is the machine mode of the value we want an equivalence for. ! 5162: If GOAL is nonzero and not VOIDmode, then it must have mode MODE. ! 5163: ! 5164: This function is used by jump.c as well as in the reload pass. ! 5165: ! 5166: If GOAL is the sum of the stack pointer and a constant, we treat it ! 5167: as if it were a constant except that sp is required to be unchanging. */ ! 5168: ! 5169: rtx ! 5170: find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode) ! 5171: register rtx goal; ! 5172: rtx insn; ! 5173: enum reg_class class; ! 5174: register int other; ! 5175: short *reload_reg_p; ! 5176: int goalreg; ! 5177: enum machine_mode mode; ! 5178: { ! 5179: register rtx p = insn; ! 5180: rtx goaltry, valtry, value, where; ! 5181: register rtx pat; ! 5182: register int regno = -1; ! 5183: int valueno; ! 5184: int goal_mem = 0; ! 5185: int goal_const = 0; ! 5186: int goal_mem_addr_varies = 0; ! 5187: int need_stable_sp = 0; ! 5188: int nregs; ! 5189: int valuenregs; ! 5190: ! 5191: if (goal == 0) ! 5192: regno = goalreg; ! 5193: else if (GET_CODE (goal) == REG) ! 5194: regno = REGNO (goal); ! 5195: else if (GET_CODE (goal) == MEM) ! 5196: { ! 5197: enum rtx_code code = GET_CODE (XEXP (goal, 0)); ! 5198: if (MEM_VOLATILE_P (goal)) ! 5199: return 0; ! 5200: if (flag_float_store && GET_MODE_CLASS (GET_MODE (goal)) == MODE_FLOAT) ! 5201: return 0; ! 5202: /* An address with side effects must be reexecuted. */ ! 5203: switch (code) ! 5204: { ! 5205: case POST_INC: ! 5206: case PRE_INC: ! 5207: case POST_DEC: ! 5208: case PRE_DEC: ! 5209: return 0; ! 5210: } ! 5211: goal_mem = 1; ! 5212: } ! 5213: else if (CONSTANT_P (goal)) ! 5214: goal_const = 1; ! 5215: else if (GET_CODE (goal) == PLUS ! 5216: && XEXP (goal, 0) == stack_pointer_rtx ! 5217: && CONSTANT_P (XEXP (goal, 1))) ! 5218: goal_const = need_stable_sp = 1; ! 5219: else ! 5220: return 0; ! 5221: ! 5222: /* On some machines, certain regs must always be rejected ! 5223: because they don't behave the way ordinary registers do. */ ! 5224: ! 5225: #ifdef OVERLAPPING_REGNO_P ! 5226: if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER ! 5227: && OVERLAPPING_REGNO_P (regno)) ! 5228: return 0; ! 5229: #endif ! 5230: ! 5231: /* Scan insns back from INSN, looking for one that copies ! 5232: a value into or out of GOAL. ! 5233: Stop and give up if we reach a label. */ ! 5234: ! 5235: while (1) ! 5236: { ! 5237: p = PREV_INSN (p); ! 5238: if (p == 0 || GET_CODE (p) == CODE_LABEL) ! 5239: return 0; ! 5240: if (GET_CODE (p) == INSN ! 5241: /* If we don't want spill regs ... */ ! 5242: && (! (reload_reg_p != 0 ! 5243: && reload_reg_p != (short *) (HOST_WIDE_INT) 1) ! 5244: /* ... then ignore insns introduced by reload; they aren't useful ! 5245: and can cause results in reload_as_needed to be different ! 5246: from what they were when calculating the need for spills. ! 5247: If we notice an input-reload insn here, we will reject it below, ! 5248: but it might hide a usable equivalent. That makes bad code. ! 5249: It may even abort: perhaps no reg was spilled for this insn ! 5250: because it was assumed we would find that equivalent. */ ! 5251: || INSN_UID (p) < reload_first_uid)) ! 5252: { ! 5253: rtx tem; ! 5254: pat = single_set (p); ! 5255: /* First check for something that sets some reg equal to GOAL. */ ! 5256: if (pat != 0 ! 5257: && ((regno >= 0 ! 5258: && true_regnum (SET_SRC (pat)) == regno ! 5259: && (valueno = true_regnum (valtry = SET_DEST (pat))) >= 0) ! 5260: || ! 5261: (regno >= 0 ! 5262: && true_regnum (SET_DEST (pat)) == regno ! 5263: && (valueno = true_regnum (valtry = SET_SRC (pat))) >= 0) ! 5264: || ! 5265: (goal_const && rtx_equal_p (SET_SRC (pat), goal) ! 5266: && (valueno = true_regnum (valtry = SET_DEST (pat))) >= 0) ! 5267: || (goal_mem ! 5268: && (valueno = true_regnum (valtry = SET_DEST (pat))) >= 0 ! 5269: && rtx_renumbered_equal_p (goal, SET_SRC (pat))) ! 5270: || (goal_mem ! 5271: && (valueno = true_regnum (valtry = SET_SRC (pat))) >= 0 ! 5272: && rtx_renumbered_equal_p (goal, SET_DEST (pat))) ! 5273: /* If we are looking for a constant, ! 5274: and something equivalent to that constant was copied ! 5275: into a reg, we can use that reg. */ ! 5276: || (goal_const && (tem = find_reg_note (p, REG_EQUIV, ! 5277: NULL_RTX)) ! 5278: && rtx_equal_p (XEXP (tem, 0), goal) ! 5279: && (valueno = true_regnum (valtry = SET_DEST (pat))) >= 0) ! 5280: || (goal_const && (tem = find_reg_note (p, REG_EQUIV, ! 5281: NULL_RTX)) ! 5282: && GET_CODE (SET_DEST (pat)) == REG ! 5283: && GET_CODE (XEXP (tem, 0)) == CONST_DOUBLE ! 5284: && GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) == MODE_FLOAT ! 5285: && GET_CODE (goal) == CONST_INT ! 5286: && 0 != (goaltry = operand_subword (XEXP (tem, 0), 0, 0, ! 5287: VOIDmode)) ! 5288: && rtx_equal_p (goal, goaltry) ! 5289: && (valtry = operand_subword (SET_DEST (pat), 0, 0, ! 5290: VOIDmode)) ! 5291: && (valueno = true_regnum (valtry)) >= 0) ! 5292: || (goal_const && (tem = find_reg_note (p, REG_EQUIV, ! 5293: NULL_RTX)) ! 5294: && GET_CODE (SET_DEST (pat)) == REG ! 5295: && GET_CODE (XEXP (tem, 0)) == CONST_DOUBLE ! 5296: && GET_MODE_CLASS (GET_MODE (XEXP (tem, 0))) == MODE_FLOAT ! 5297: && GET_CODE (goal) == CONST_INT ! 5298: && 0 != (goaltry = operand_subword (XEXP (tem, 0), 1, 0, ! 5299: VOIDmode)) ! 5300: && rtx_equal_p (goal, goaltry) ! 5301: && (valtry ! 5302: = operand_subword (SET_DEST (pat), 1, 0, VOIDmode)) ! 5303: && (valueno = true_regnum (valtry)) >= 0))) ! 5304: if (other >= 0 ! 5305: ? valueno == other ! 5306: : ((unsigned) valueno < FIRST_PSEUDO_REGISTER ! 5307: && TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 5308: valueno))) ! 5309: { ! 5310: value = valtry; ! 5311: where = p; ! 5312: break; ! 5313: } ! 5314: } ! 5315: } ! 5316: ! 5317: /* We found a previous insn copying GOAL into a suitable other reg VALUE ! 5318: (or copying VALUE into GOAL, if GOAL is also a register). ! 5319: Now verify that VALUE is really valid. */ ! 5320: ! 5321: /* VALUENO is the register number of VALUE; a hard register. */ ! 5322: ! 5323: /* Don't try to re-use something that is killed in this insn. We want ! 5324: to be able to trust REG_UNUSED notes. */ ! 5325: if (find_reg_note (where, REG_UNUSED, value)) ! 5326: return 0; ! 5327: ! 5328: /* If we propose to get the value from the stack pointer or if GOAL is ! 5329: a MEM based on the stack pointer, we need a stable SP. */ ! 5330: if (valueno == STACK_POINTER_REGNUM ! 5331: || (goal_mem && reg_overlap_mentioned_for_reload_p (stack_pointer_rtx, ! 5332: goal))) ! 5333: need_stable_sp = 1; ! 5334: ! 5335: /* Reject VALUE if the copy-insn moved the wrong sort of datum. */ ! 5336: if (GET_MODE (value) != mode) ! 5337: return 0; ! 5338: ! 5339: /* Reject VALUE if it was loaded from GOAL ! 5340: and is also a register that appears in the address of GOAL. */ ! 5341: ! 5342: if (goal_mem && value == SET_DEST (PATTERN (where)) ! 5343: && refers_to_regno_for_reload_p (valueno, ! 5344: (valueno ! 5345: + HARD_REGNO_NREGS (valueno, mode)), ! 5346: goal, NULL_PTR)) ! 5347: return 0; ! 5348: ! 5349: /* Reject registers that overlap GOAL. */ ! 5350: ! 5351: if (!goal_mem && !goal_const ! 5352: && regno + HARD_REGNO_NREGS (regno, mode) > valueno ! 5353: && regno < valueno + HARD_REGNO_NREGS (valueno, mode)) ! 5354: return 0; ! 5355: ! 5356: /* Reject VALUE if it is one of the regs reserved for reloads. ! 5357: Reload1 knows how to reuse them anyway, and it would get ! 5358: confused if we allocated one without its knowledge. ! 5359: (Now that insns introduced by reload are ignored above, ! 5360: this case shouldn't happen, but I'm not positive.) */ ! 5361: ! 5362: if (reload_reg_p != 0 && reload_reg_p != (short *) (HOST_WIDE_INT) 1 ! 5363: && reload_reg_p[valueno] >= 0) ! 5364: return 0; ! 5365: ! 5366: /* On some machines, certain regs must always be rejected ! 5367: because they don't behave the way ordinary registers do. */ ! 5368: ! 5369: #ifdef OVERLAPPING_REGNO_P ! 5370: if (OVERLAPPING_REGNO_P (valueno)) ! 5371: return 0; ! 5372: #endif ! 5373: ! 5374: nregs = HARD_REGNO_NREGS (regno, mode); ! 5375: valuenregs = HARD_REGNO_NREGS (valueno, mode); ! 5376: ! 5377: /* Reject VALUE if it is a register being used for an input reload ! 5378: even if it is not one of those reserved. */ ! 5379: ! 5380: if (reload_reg_p != 0) ! 5381: { ! 5382: int i; ! 5383: for (i = 0; i < n_reloads; i++) ! 5384: if (reload_reg_rtx[i] != 0 && reload_in[i]) ! 5385: { ! 5386: int regno1 = REGNO (reload_reg_rtx[i]); ! 5387: int nregs1 = HARD_REGNO_NREGS (regno1, ! 5388: GET_MODE (reload_reg_rtx[i])); ! 5389: if (regno1 < valueno + valuenregs ! 5390: && regno1 + nregs1 > valueno) ! 5391: return 0; ! 5392: } ! 5393: } ! 5394: ! 5395: if (goal_mem) ! 5396: /* We must treat frame pointer as varying here, ! 5397: since it can vary--in a nonlocal goto as generated by expand_goto. */ ! 5398: goal_mem_addr_varies = !CONSTANT_ADDRESS_P (XEXP (goal, 0)); ! 5399: ! 5400: /* Now verify that the values of GOAL and VALUE remain unaltered ! 5401: until INSN is reached. */ ! 5402: ! 5403: p = insn; ! 5404: while (1) ! 5405: { ! 5406: p = PREV_INSN (p); ! 5407: if (p == where) ! 5408: return value; ! 5409: ! 5410: /* Don't trust the conversion past a function call ! 5411: if either of the two is in a call-clobbered register, or memory. */ ! 5412: if (GET_CODE (p) == CALL_INSN ! 5413: && ((regno >= 0 && regno < FIRST_PSEUDO_REGISTER ! 5414: && call_used_regs[regno]) ! 5415: || ! 5416: (valueno >= 0 && valueno < FIRST_PSEUDO_REGISTER ! 5417: && call_used_regs[valueno]) ! 5418: || ! 5419: goal_mem ! 5420: || need_stable_sp)) ! 5421: return 0; ! 5422: ! 5423: #ifdef INSN_CLOBBERS_REGNO_P ! 5424: if ((valueno >= 0 && valueno < FIRST_PSEUDO_REGISTER ! 5425: && INSN_CLOBBERS_REGNO_P (p, valueno)) ! 5426: || (regno >= 0 && regno < FIRST_PSEUDO_REGISTER ! 5427: && INSN_CLOBBERS_REGNO_P (p, regno))) ! 5428: return 0; ! 5429: #endif ! 5430: ! 5431: if (GET_RTX_CLASS (GET_CODE (p)) == 'i') ! 5432: { ! 5433: /* If this insn P stores in either GOAL or VALUE, return 0. ! 5434: If GOAL is a memory ref and this insn writes memory, return 0. ! 5435: If GOAL is a memory ref and its address is not constant, ! 5436: and this insn P changes a register used in GOAL, return 0. */ ! 5437: ! 5438: pat = PATTERN (p); ! 5439: if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER) ! 5440: { ! 5441: register rtx dest = SET_DEST (pat); ! 5442: while (GET_CODE (dest) == SUBREG ! 5443: || GET_CODE (dest) == ZERO_EXTRACT ! 5444: || GET_CODE (dest) == SIGN_EXTRACT ! 5445: || GET_CODE (dest) == STRICT_LOW_PART) ! 5446: dest = XEXP (dest, 0); ! 5447: if (GET_CODE (dest) == REG) ! 5448: { ! 5449: register int xregno = REGNO (dest); ! 5450: int xnregs; ! 5451: if (REGNO (dest) < FIRST_PSEUDO_REGISTER) ! 5452: xnregs = HARD_REGNO_NREGS (xregno, GET_MODE (dest)); ! 5453: else ! 5454: xnregs = 1; ! 5455: if (xregno < regno + nregs && xregno + xnregs > regno) ! 5456: return 0; ! 5457: if (xregno < valueno + valuenregs ! 5458: && xregno + xnregs > valueno) ! 5459: return 0; ! 5460: if (goal_mem_addr_varies ! 5461: && reg_overlap_mentioned_for_reload_p (dest, goal)) ! 5462: return 0; ! 5463: } ! 5464: else if (goal_mem && GET_CODE (dest) == MEM ! 5465: && ! push_operand (dest, GET_MODE (dest))) ! 5466: return 0; ! 5467: else if (need_stable_sp && push_operand (dest, GET_MODE (dest))) ! 5468: return 0; ! 5469: } ! 5470: else if (GET_CODE (pat) == PARALLEL) ! 5471: { ! 5472: register int i; ! 5473: for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) ! 5474: { ! 5475: register rtx v1 = XVECEXP (pat, 0, i); ! 5476: if (GET_CODE (v1) == SET || GET_CODE (v1) == CLOBBER) ! 5477: { ! 5478: register rtx dest = SET_DEST (v1); ! 5479: while (GET_CODE (dest) == SUBREG ! 5480: || GET_CODE (dest) == ZERO_EXTRACT ! 5481: || GET_CODE (dest) == SIGN_EXTRACT ! 5482: || GET_CODE (dest) == STRICT_LOW_PART) ! 5483: dest = XEXP (dest, 0); ! 5484: if (GET_CODE (dest) == REG) ! 5485: { ! 5486: register int xregno = REGNO (dest); ! 5487: int xnregs; ! 5488: if (REGNO (dest) < FIRST_PSEUDO_REGISTER) ! 5489: xnregs = HARD_REGNO_NREGS (xregno, GET_MODE (dest)); ! 5490: else ! 5491: xnregs = 1; ! 5492: if (xregno < regno + nregs ! 5493: && xregno + xnregs > regno) ! 5494: return 0; ! 5495: if (xregno < valueno + valuenregs ! 5496: && xregno + xnregs > valueno) ! 5497: return 0; ! 5498: if (goal_mem_addr_varies ! 5499: && reg_overlap_mentioned_for_reload_p (dest, ! 5500: goal)) ! 5501: return 0; ! 5502: } ! 5503: else if (goal_mem && GET_CODE (dest) == MEM ! 5504: && ! push_operand (dest, GET_MODE (dest))) ! 5505: return 0; ! 5506: else if (need_stable_sp ! 5507: && push_operand (dest, GET_MODE (dest))) ! 5508: return 0; ! 5509: } ! 5510: } ! 5511: } ! 5512: ! 5513: #ifdef AUTO_INC_DEC ! 5514: /* If this insn auto-increments or auto-decrements ! 5515: either regno or valueno, return 0 now. ! 5516: If GOAL is a memory ref and its address is not constant, ! 5517: and this insn P increments a register used in GOAL, return 0. */ ! 5518: { ! 5519: register rtx link; ! 5520: ! 5521: for (link = REG_NOTES (p); link; link = XEXP (link, 1)) ! 5522: if (REG_NOTE_KIND (link) == REG_INC ! 5523: && GET_CODE (XEXP (link, 0)) == REG) ! 5524: { ! 5525: register int incno = REGNO (XEXP (link, 0)); ! 5526: if (incno < regno + nregs && incno >= regno) ! 5527: return 0; ! 5528: if (incno < valueno + valuenregs && incno >= valueno) ! 5529: return 0; ! 5530: if (goal_mem_addr_varies ! 5531: && reg_overlap_mentioned_for_reload_p (XEXP (link, 0), ! 5532: goal)) ! 5533: return 0; ! 5534: } ! 5535: } ! 5536: #endif ! 5537: } ! 5538: } ! 5539: } ! 5540: ! 5541: /* Find a place where INCED appears in an increment or decrement operator ! 5542: within X, and return the amount INCED is incremented or decremented by. ! 5543: The value is always positive. */ ! 5544: ! 5545: static int ! 5546: find_inc_amount (x, inced) ! 5547: rtx x, inced; ! 5548: { ! 5549: register enum rtx_code code = GET_CODE (x); ! 5550: register char *fmt; ! 5551: register int i; ! 5552: ! 5553: if (code == MEM) ! 5554: { ! 5555: register rtx addr = XEXP (x, 0); ! 5556: if ((GET_CODE (addr) == PRE_DEC ! 5557: || GET_CODE (addr) == POST_DEC ! 5558: || GET_CODE (addr) == PRE_INC ! 5559: || GET_CODE (addr) == POST_INC) ! 5560: && XEXP (addr, 0) == inced) ! 5561: return GET_MODE_SIZE (GET_MODE (x)); ! 5562: } ! 5563: ! 5564: fmt = GET_RTX_FORMAT (code); ! 5565: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 5566: { ! 5567: if (fmt[i] == 'e') ! 5568: { ! 5569: register int tem = find_inc_amount (XEXP (x, i), inced); ! 5570: if (tem != 0) ! 5571: return tem; ! 5572: } ! 5573: if (fmt[i] == 'E') ! 5574: { ! 5575: register int j; ! 5576: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 5577: { ! 5578: register int tem = find_inc_amount (XVECEXP (x, i, j), inced); ! 5579: if (tem != 0) ! 5580: return tem; ! 5581: } ! 5582: } ! 5583: } ! 5584: ! 5585: return 0; ! 5586: } ! 5587: ! 5588: /* Return 1 if register REGNO is the subject of a clobber in insn INSN. */ ! 5589: ! 5590: int ! 5591: regno_clobbered_p (regno, insn) ! 5592: int regno; ! 5593: rtx insn; ! 5594: { ! 5595: if (GET_CODE (PATTERN (insn)) == CLOBBER ! 5596: && GET_CODE (XEXP (PATTERN (insn), 0)) == REG) ! 5597: return REGNO (XEXP (PATTERN (insn), 0)) == regno; ! 5598: ! 5599: if (GET_CODE (PATTERN (insn)) == PARALLEL) ! 5600: { ! 5601: int i = XVECLEN (PATTERN (insn), 0) - 1; ! 5602: ! 5603: for (; i >= 0; i--) ! 5604: { ! 5605: rtx elt = XVECEXP (PATTERN (insn), 0, i); ! 5606: if (GET_CODE (elt) == CLOBBER && GET_CODE (XEXP (elt, 0)) == REG ! 5607: && REGNO (XEXP (elt, 0)) == regno) ! 5608: return 1; ! 5609: } ! 5610: } ! 5611: ! 5612: return 0; ! 5613: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.