|
|
1.1 ! root 1: /* Search an insn for pseudo regs that must be in hard regs and are not. ! 2: Copyright (C) 1987, 1988 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU CC. ! 5: ! 6: GNU CC is distributed in the hope that it will be useful, ! 7: but WITHOUT ANY WARRANTY. No author or distributor ! 8: accepts responsibility to anyone for the consequences of using it ! 9: or for whether it serves any particular purpose or works at all, ! 10: unless he says so in writing. Refer to the GNU CC General Public ! 11: License for full details. ! 12: ! 13: Everyone is granted permission to copy, modify and redistribute ! 14: GNU CC, but only under the conditions described in the ! 15: GNU CC General Public License. A copy of this license is ! 16: supposed to have been given to you along with GNU CC so you ! 17: can know your rights and responsibilities. It should be in a ! 18: file named COPYING. Among other things, the copyright notice ! 19: and this notice must be preserved on all copies. */ ! 20: ! 21: ! 22: /* This file contains subroutines used only from the file reload1.c. ! 23: It knows how to scan one insn for operands and values ! 24: that need to be copied into registers to make valid code. ! 25: It also finds other operands and values which are valid ! 26: but for which equivalent values in registers exist and ! 27: ought to be used instead. ! 28: ! 29: Before processing the first insn of the function, call `init_reload'. ! 30: ! 31: To scan an insn, call `find_reloads'. This does two things: ! 32: 1. sets up tables describing which values must be reloaded ! 33: for this insn, and what kind of hard regs they must be reloaded into; ! 34: 2. optionally record the locations where those values appear in ! 35: the data, so they can be replaced properly later. ! 36: This is done only if the second arg to `find_reloads' is nonzero. ! 37: ! 38: The third arg to `find_reloads' specifies the value of `indirect_ok'. ! 39: ! 40: Then you must choose the hard regs to reload those pseudo regs into, ! 41: and generate appropriate load insns before this insn and perhaps ! 42: also store insns after this insn. Set up the array `reload_reg_rtx' ! 43: to contain the REG rtx's for the registers you used. In some ! 44: cases `find_reloads' will return a nonzero value in `reload_reg_rtx' ! 45: for certain reloads. Then that tells you which register to use, ! 46: so you do not need to allocate one. But you still do need to add extra ! 47: instructions to copy the value into and out of that register. ! 48: ! 49: Finally you must call `subst_reloads' to substitute the reload reg rtx's ! 50: into the locations already recorded. ! 51: ! 52: NOTE SIDE EFFECTS: ! 53: ! 54: find_reloads can alter the operands of the instruction it is called on. ! 55: ! 56: 1. Two operands of any sort may be interchanged, if they are in a ! 57: commutative instruction. ! 58: This happens only if find_reloads thinks the instruction will compile ! 59: better that way. ! 60: ! 61: 2. Pseudo-registers that are equivalent to constants are replaced ! 62: with those constants if they are not in hard registers. ! 63: ! 64: 1 happens every time find_reloads is called. ! 65: 2 happens only when REPLACE is 1, which is only when ! 66: actually doing the reloads, not when just counting them. ! 67: */ ! 68: ! 69: #define REG_OK_STRICT ! 70: ! 71: #include "config.h" ! 72: #include "rtl.h" ! 73: #include "insn-config.h" ! 74: #include "recog.h" ! 75: #include "reload.h" ! 76: #include "regs.h" ! 77: #include "hard-reg-set.h" ! 78: ! 79: /* The variables set up by `find_reloads' are: ! 80: ! 81: n_reloads number of distinct reloads needed; max reload # + 1 ! 82: tables indexed by reload number ! 83: reload_in rtx for value to reload from ! 84: reload_out rtx for where to store reload-reg afterward if nec ! 85: (often the same as reload_in) ! 86: reload_reg_class enum reg_class, saying what regs to reload into ! 87: reload_inmode enum machine_mode; mode this operand should have ! 88: when reloaded, on input. ! 89: reload_outmode enum machine_mode; mode this operand should have ! 90: when reloaded, on output. ! 91: reload_strict_low char; 1 if this reload is inside a STRICT_LOW_PART. ! 92: reload_optional char, nonzero for an optional reload. ! 93: Optional reloads are ignored unless the ! 94: value is already sitting in a register. ! 95: reload_inc int, amount to increment reload_in by ! 96: before this insn. ! 97: reload_reg_rtx rtx. This is the register to reload into. ! 98: If it is zero when `find_reloads' returns, ! 99: you must find a suitable register in the class ! 100: specified by reload_reg_class, and store here ! 101: an rtx for that register with mode from ! 102: reload_inmode or reload_outmode. ! 103: reload_nocombine char, nonzero if this reload shouldn't be ! 104: combined with another reload. */ ! 105: ! 106: int n_reloads; ! 107: ! 108: rtx reload_in[FIRST_PSEUDO_REGISTER]; ! 109: rtx reload_out[FIRST_PSEUDO_REGISTER]; ! 110: enum reg_class reload_reg_class[FIRST_PSEUDO_REGISTER]; ! 111: enum machine_mode reload_inmode[FIRST_PSEUDO_REGISTER]; ! 112: enum machine_mode reload_outmode[FIRST_PSEUDO_REGISTER]; ! 113: char reload_strict_low[FIRST_PSEUDO_REGISTER]; ! 114: rtx reload_reg_rtx[FIRST_PSEUDO_REGISTER]; ! 115: char reload_optional[FIRST_PSEUDO_REGISTER]; ! 116: int reload_inc[FIRST_PSEUDO_REGISTER]; ! 117: char reload_nocombine[FIRST_PSEUDO_REGISTER]; ! 118: ! 119: /* Replacing reloads. ! 120: ! 121: If `replace_reloads' is nonzero, then as each reload is recorded ! 122: an entry is made for it in the table `replacements'. ! 123: Then later `subst_reloads' can look through that table and ! 124: perform all the replacements needed. */ ! 125: ! 126: /* Nonzero means record the places to replace. */ ! 127: static int replace_reloads; ! 128: ! 129: /* Each replacement is recorded with a structure like this. */ ! 130: struct replacement ! 131: { ! 132: rtx *where; /* Location to store in */ ! 133: int what; /* which reload this is for */ ! 134: enum machine_mode mode; /* mode it must have */ ! 135: }; ! 136: ! 137: static struct replacement replacements[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)]; ! 138: ! 139: /* Number of replacements currently recorded. */ ! 140: static int n_replacements; ! 141: ! 142: /* MEM-rtx's created for pseudo-regs in stack slots not directly addressable; ! 143: (see reg_equiv_address). */ ! 144: static rtx memlocs[MAX_RECOG_OPERANDS * ((MAX_REGS_PER_ADDRESS * 2) + 1)]; ! 145: static int n_memlocs; ! 146: ! 147: /* The instruction we are doing reloads for; ! 148: so we can test whether a register dies in it. */ ! 149: static rtx this_insn; ! 150: ! 151: /* Nonzero means (MEM (REG n)) is valid even if (REG n) is spilled. */ ! 152: static int indirect_ok; ! 153: ! 154: /* If hard_regs_live_known is nonzero, ! 155: we can tell which hard regs are currently live, ! 156: at least enough to succeed in choosing dummy reloads. */ ! 157: static int hard_regs_live_known; ! 158: ! 159: /* Indexed by hard reg number, ! 160: element is nonegative if hard reg has been spilled. ! 161: This vector is passed to `find_reloads' as an argument ! 162: and is not changed here. */ ! 163: static short *static_reload_reg_p; ! 164: ! 165: static rtx find_dummy_reload (); ! 166: static rtx find_reloads_toplev (); ! 167: static void find_reloads_address (); ! 168: static void find_reloads_address_1 (); ! 169: static int hard_reg_set_here_p (); ! 170: static int refers_to_regno_p (); ! 171: static rtx forget_volatility (); ! 172: static rtx subst_reg_equivs (); ! 173: static rtx subst_indexed_address (); ! 174: rtx find_equiv_reg (); ! 175: static int find_inc_amount (); ! 176: ! 177: /* Record one reload that needs to be performed. ! 178: IN is an rtx saying where the data are to be found before this instruction. ! 179: OUT says where they must be stored after the instruction. ! 180: (IN is zero for data not read, and OUT is zero for data not written.) ! 181: INLOC and OUTLOC point to the places in the instructions where ! 182: IN and OUT were found. ! 183: CLASS is a register class required for the reloaded data. ! 184: INMODE is the machine mode that the instruction requires ! 185: for the reg that replaces IN and OUTMODE is likewise for OUT. ! 186: ! 187: If IN is zero, then OUT's location and mode should be passed as ! 188: INLOC and INMODE. ! 189: ! 190: STRICT_LOW is the 1 if there is a containing STRICT_LOW_PART rtx. ! 191: ! 192: OPTIONAL nonzero means this reload does not need to be performed: ! 193: it can be discarded if that is more convenient. */ ! 194: ! 195: static int ! 196: push_reload (in, out, inloc, outloc, class, ! 197: inmode, outmode, strict_low, optional) ! 198: register rtx in, out; ! 199: rtx *inloc, *outloc; ! 200: enum reg_class class; ! 201: enum machine_mode inmode, outmode; ! 202: int strict_low; ! 203: int optional; ! 204: { ! 205: register int i; ! 206: int noshare = 0; ! 207: ! 208: /* Compare two RTX's. */ ! 209: #define MATCHES(x, y) (x == y || (x != 0 && GET_CODE (x) != REG && rtx_equal_p (x, y))) ! 210: ! 211: /* If IN is a pseudo register everywhere-equivalent to a constant, and ! 212: it is not in a hard register, reload straight from the constant, ! 213: since we want to get rid of such pseudo registers. */ ! 214: if (in != 0 && GET_CODE (in) == REG) ! 215: { ! 216: register int regno = REGNO (in); ! 217: ! 218: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 219: && reg_equiv_constant[regno] != 0) ! 220: in = reg_equiv_constant[regno]; ! 221: } ! 222: ! 223: /* Likewise for OUT. Of course, OUT will never be equivalent to ! 224: an actual constant, but it might be equivalent to a memory location ! 225: (in the case of a parameter). */ ! 226: if (out != 0 && GET_CODE (out) == REG) ! 227: { ! 228: register int regno = REGNO (out); ! 229: ! 230: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 231: && reg_equiv_constant[regno] != 0) ! 232: out = reg_equiv_constant[regno]; ! 233: } ! 234: ! 235: /* If we have a read-write operand with an address side-effect, ! 236: change either IN or OUT so the side-effect happens only once. */ ! 237: if (in != 0 && out != 0 && GET_CODE (in) == MEM && rtx_equal_p (in, out)) ! 238: { ! 239: if (GET_CODE (XEXP (in, 0)) == POST_INC ! 240: || GET_CODE (XEXP (in, 0)) == POST_DEC) ! 241: in = gen_rtx (MEM, GET_MODE (in), XEXP (XEXP (in, 0), 0)); ! 242: if (GET_CODE (XEXP (in, 0)) == PRE_INC ! 243: || GET_CODE (XEXP (in, 0)) == PRE_DEC) ! 244: out = gen_rtx (MEM, GET_MODE (out), XEXP (XEXP (out, 0), 0)); ! 245: } ! 246: ! 247: /* If IN appears in OUT, we can't share any input-only reload for IN. */ ! 248: if (in != 0 && out != 0 && reg_mentioned_p (in, out)) ! 249: noshare = 1; ! 250: ! 251: if (class == NO_REGS) ! 252: abort (); ! 253: ! 254: /* Narrow down the class of register wanted if that is ! 255: desirable on this machine for efficiency. */ ! 256: if (in != 0) ! 257: class = PREFERRED_RELOAD_CLASS(in, class); ! 258: ! 259: /* We can use an existing reload if the class is right ! 260: and at least one of IN and OUT is a match ! 261: and the other is at worst neutral. ! 262: (A zero compared against anything is neutral.) */ ! 263: for (i = 0; i < n_reloads; i++) ! 264: if (reload_reg_class[i] == class ! 265: && reload_strict_low[i] == strict_low ! 266: && ((in != 0 && MATCHES (reload_in[i], in) && ! noshare ! 267: && (out == 0 || reload_out[i] == 0 || MATCHES (reload_out[i], out))) ! 268: || ! 269: (out != 0 && MATCHES (reload_out[i], out) ! 270: && (in == 0 || reload_in[i] == 0 || MATCHES (reload_in[i], in))))) ! 271: break; ! 272: ! 273: if (i == n_reloads) ! 274: { ! 275: /* We found no existing reload suitable for re-use. ! 276: So add an additional reload. */ ! 277: ! 278: reload_in[i] = in; ! 279: reload_out[i] = out; ! 280: reload_reg_class[i] = class; ! 281: reload_inmode[i] = inmode; ! 282: reload_outmode[i] = outmode; ! 283: reload_reg_rtx[i] = 0; ! 284: reload_optional[i] = optional; ! 285: reload_inc[i] = 0; ! 286: reload_strict_low[i] = strict_low; ! 287: reload_nocombine[i] = 0; ! 288: ! 289: n_reloads++; ! 290: } ! 291: else ! 292: { ! 293: /* We are reusing an existing reload, ! 294: but we may have additional information for it. ! 295: For example, we may now have both IN and OUT ! 296: while the old one may have just one of them. */ ! 297: ! 298: if (inmode != VOIDmode) ! 299: reload_inmode[i] = inmode; ! 300: if (outmode != VOIDmode) ! 301: reload_outmode[i] = outmode; ! 302: if (in != 0) ! 303: reload_in[i] = in; ! 304: if (out != 0) ! 305: reload_out[i] = out; ! 306: reload_optional[i] &= optional; ! 307: } ! 308: ! 309: /* If the ostensible rtx being reload differs from the rtx found ! 310: in the location to substitute, this reload is not safe to combine ! 311: because we cannot reliably tell whether it appears in the insn. */ ! 312: ! 313: if (in != 0 && in != *inloc) ! 314: reload_nocombine[i] = 1; ! 315: ! 316: /* If this is an IN/OUT reload in an insn that sets the CC, ! 317: it must be for an autoincrement. It doesn't work to store ! 318: the incremented value after the insn because that would clobber the CC. ! 319: So we must do the increment of the value reloaded from, ! 320: increment it, store it back, then decrement again. */ ! 321: if (out != 0 && GET_CODE (PATTERN (this_insn)) == SET ! 322: && SET_DEST (PATTERN (this_insn)) == cc0_rtx) ! 323: { ! 324: out = 0; ! 325: reload_out[i] = 0; ! 326: reload_inc[i] = find_inc_amount (PATTERN (this_insn), in); ! 327: /* If we did not find a nonzero amount-to-increment-by, ! 328: that contradicts the belief that IN is being incremented ! 329: in an address in this insn. */ ! 330: if (reload_inc[i] == 0) ! 331: abort (); ! 332: } ! 333: ! 334: /* If we will replace IN and OUT with the reload-reg, ! 335: record where they are located so that substitution need ! 336: not do a tree walk. */ ! 337: ! 338: if (replace_reloads) ! 339: { ! 340: if (inloc != 0) ! 341: { ! 342: register struct replacement *r = &replacements[n_replacements++]; ! 343: r->what = i; ! 344: r->where = inloc; ! 345: r->mode = inmode; ! 346: } ! 347: if (outloc != 0 && outloc != inloc) ! 348: { ! 349: register struct replacement *r = &replacements[n_replacements++]; ! 350: r->what = i; ! 351: r->where = outloc; ! 352: r->mode = outmode; ! 353: } ! 354: } ! 355: ! 356: /* If this reload is just being introduced and it has both ! 357: an incoming quantity and an outgoing quantity that are ! 358: supposed to be made to match, see if either one of the two ! 359: can serve as the place to reload into. ! 360: ! 361: If one of them is acceptable, set reload_reg_rtx[i] ! 362: to that one. */ ! 363: ! 364: if (in != 0 && out != 0 && in != out && reload_reg_rtx[i] == 0) ! 365: { ! 366: reload_reg_rtx[i] = find_dummy_reload (in, out, inloc, outloc, ! 367: reload_reg_class[i], i); ! 368: ! 369: /* If the outgoing register already contains the same value ! 370: as the incoming one, we can dispense with loading it. ! 371: The easiest way to tell the caller that is to give a phony ! 372: value for the incoming operand (same as outgoing one). */ ! 373: if (reload_reg_rtx[i] == out ! 374: && (GET_CODE (in) == REG || CONSTANT_P (in)) ! 375: && 0 != find_equiv_reg (in, this_insn, 0, REGNO (out), ! 376: static_reload_reg_p, i)) ! 377: reload_in[i] = out; ! 378: } ! 379: ! 380: return i; ! 381: } ! 382: ! 383: /* Record an additional place we must replace a value ! 384: for which we have already recorded a reload. ! 385: RELOADNUM is the value returned by push_reload ! 386: when the reload was recorded. ! 387: This is used in insn patterns that use match_dup. */ ! 388: ! 389: static void ! 390: push_replacement (loc, reloadnum, mode) ! 391: rtx *loc; ! 392: int reloadnum; ! 393: enum machine_mode mode; ! 394: { ! 395: if (replace_reloads) ! 396: { ! 397: register struct replacement *r = &replacements[n_replacements++]; ! 398: r->what = reloadnum; ! 399: r->where = loc; ! 400: r->mode = mode; ! 401: } ! 402: } ! 403: ! 404: /* If there is only one output reload, try to combine it ! 405: with a (logically unrelated) input reload ! 406: to reduce the number of reload registers needed. ! 407: ! 408: This is safe if the input reload does not appear in ! 409: the value being output-reloaded, because this implies ! 410: it is not needed any more once the original insn completes. */ ! 411: ! 412: static void ! 413: combine_reloads () ! 414: { ! 415: int i; ! 416: int output_reload = -1; ! 417: ! 418: /* Find the output reload; return unless there is exactly one ! 419: and that one is mandatory. */ ! 420: ! 421: for (i = 0; i < n_reloads; i++) ! 422: if (reload_out[i] != 0) ! 423: { ! 424: if (output_reload >= 0) ! 425: return; ! 426: output_reload = i; ! 427: } ! 428: ! 429: if (output_reload < 0 || reload_optional[output_reload]) ! 430: return; ! 431: ! 432: /* An input-output reload isn't combinable. */ ! 433: ! 434: if (reload_in[output_reload] != 0) ! 435: return; ! 436: ! 437: /* Check each input reload; can we combine it? */ ! 438: ! 439: for (i = 0; i < n_reloads; i++) ! 440: if (reload_in[i] && ! reload_optional[i] && ! reload_nocombine[i] ! 441: && reload_inmode[i] == reload_outmode[output_reload] ! 442: && reload_inc[i] == 0 ! 443: && reload_reg_rtx[i] == 0 ! 444: && reload_strict_low[i] == 0 ! 445: && reload_reg_class[i] == reload_reg_class[output_reload] ! 446: && ! reg_mentioned_p (reload_in[i], reload_out[output_reload])) ! 447: { ! 448: int j; ! 449: ! 450: /* We have found a reload to combine with! */ ! 451: reload_out[i] = reload_out[output_reload]; ! 452: reload_outmode[i] = reload_outmode[output_reload]; ! 453: /* Mark the old output reload as inoperative. */ ! 454: reload_out[output_reload] = 0; ! 455: ! 456: /* Transfer all replacements from the old reload to the combined. */ ! 457: for (j = 0; j < n_replacements; j++) ! 458: if (replacements[j].what == output_reload) ! 459: replacements[j].what = i; ! 460: ! 461: return; ! 462: } ! 463: } ! 464: ! 465: /* Try to find a reload register for an in-out reload (expressions IN and OUT). ! 466: See if one of IN and OUT is a register that may be used; ! 467: this is desirable since a spill-register won't be needed. ! 468: If so, return the register rtx that proves acceptable. ! 469: ! 470: INLOC and OUTLOC are locations where IN and OUT appear in the insn. ! 471: CLASS is the register class required for the reload. ! 472: ! 473: If FOR_REAL is >= 0, it is the number of the reload, ! 474: and in some cases when it can be discovered that OUT doesn't need ! 475: to be computed, clear out reload_out[FOR_REAL]. ! 476: ! 477: If FOR_REAL is -1, this should not be done, because this call ! 478: is just to see if a register can be found, not to find and install it. */ ! 479: ! 480: static rtx ! 481: find_dummy_reload (in, out, inloc, outloc, class, for_real) ! 482: rtx in, out; ! 483: rtx *inloc, *outloc; ! 484: enum reg_class class; ! 485: int for_real; ! 486: { ! 487: rtx value = 0; ! 488: rtx orig_in = in; ! 489: ! 490: while (GET_CODE (out) == SUBREG) ! 491: out = SUBREG_REG (out); ! 492: while (GET_CODE (in) == SUBREG) ! 493: in = SUBREG_REG (in); ! 494: ! 495: /* If operands exceed a word, we can't use either of them ! 496: unless they have the same size. */ ! 497: if (GET_MODE_SIZE (GET_MODE (out)) != GET_MODE_SIZE (GET_MODE (in)) ! 498: && (GET_MODE_SIZE (GET_MODE (out)) > UNITS_PER_WORD ! 499: || GET_MODE_SIZE (GET_MODE (in)) > UNITS_PER_WORD)) ! 500: return 0; ! 501: ! 502: /* See if OUT will do. */ ! 503: if (GET_CODE (out) == REG) ! 504: { ! 505: register int regno = REGNO (out); ! 506: ! 507: /* When we consider whether the insn uses OUT, ! 508: ignore references within IN. They don't prevent us ! 509: from copying IN into OUT, because those refs would ! 510: move into the insn that reloads IN. ! 511: ! 512: However, we only ignore IN in its role as this operand. ! 513: If the insn uses IN elsewhere and it contains OUT, ! 514: that counts. We can't be sure it's the "same" operand ! 515: so it might not go through this reload. */ ! 516: *inloc = const0_rtx; ! 517: ! 518: if (reg_renumber[regno] >= 0) ! 519: regno = reg_renumber[regno]; ! 520: if (regno < FIRST_PSEUDO_REGISTER ! 521: && ! refers_to_regno_p (regno, PATTERN (this_insn), outloc) ! 522: && TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno)) ! 523: value = out; ! 524: ! 525: *inloc = orig_in; ! 526: } ! 527: ! 528: /* Consider using IN if OUT was not acceptable ! 529: or if OUT dies in this insn (like the quotient in a divmod insn). ! 530: We can't use IN unless it is free after this insn, ! 531: which means we must know accurately which hard regs are live. ! 532: Also, the result can't go in IN if IN is used within OUT. */ ! 533: if (hard_regs_live_known ! 534: && GET_CODE (in) == REG ! 535: && (value == 0 ! 536: || find_regno_note (this_insn, REG_DEAD, REGNO (value)))) ! 537: { ! 538: register int regno = REGNO (in); ! 539: if (find_regno_note (this_insn, REG_DEAD, regno)) ! 540: { ! 541: if (reg_renumber[regno] >= 0) ! 542: regno = reg_renumber[regno]; ! 543: if (regno < FIRST_PSEUDO_REGISTER ! 544: && ! refers_to_regno_p (regno, out, 0) ! 545: && ! hard_reg_set_here_p (regno, PATTERN (this_insn)) ! 546: && TEST_HARD_REG_BIT (reg_class_contents[(int) class], regno)) ! 547: { ! 548: /* If we were going to use OUT as the reload reg ! 549: and changed our mind, it means OUT is a dummy that ! 550: dies here. So don't bother copying value to it. */ ! 551: if (for_real >= 0 && value == out) ! 552: reload_out[for_real] = 0; ! 553: value = in; ! 554: } ! 555: } ! 556: } ! 557: ! 558: return value; ! 559: } ! 560: ! 561: /* This page contains subroutines used mainly for determining ! 562: whether the IN or an OUT of a reload can serve as the ! 563: reload register. */ ! 564: ! 565: /* Return 1 if hard reg number REGNO is stored in by expression X, ! 566: either explicitly or in the guise of a pseudo-reg allocated to REGNO. ! 567: X should be the body of an instruction. */ ! 568: ! 569: static int ! 570: hard_reg_set_here_p (regno, x) ! 571: register int regno; ! 572: rtx x; ! 573: { ! 574: if (GET_CODE (x) == SET) ! 575: { ! 576: register rtx op0 = SET_DEST (x); ! 577: if (GET_CODE (op0) == REG) ! 578: { ! 579: register int r = REGNO (op0); ! 580: if (reg_renumber[r] >= 0) ! 581: r = reg_renumber[r]; ! 582: if (r == regno) ! 583: return 1; ! 584: } ! 585: } ! 586: else if (GET_CODE (x) == PARALLEL) ! 587: { ! 588: register int i = XVECLEN (x, 0) - 1; ! 589: for (; i >= 0; i--) ! 590: if (hard_reg_set_here_p (regno, XVECEXP (x, 0, i))) ! 591: return 1; ! 592: } ! 593: ! 594: return 0; ! 595: } ! 596: ! 597: /* Return nonzero if hard register REGNO appears ! 598: either explicitly or implicitly in X ! 599: other than being stored into. ! 600: ! 601: References contained within the substructure at LOC do not count. ! 602: LOC may be zero, meaning don't ignore anything. */ ! 603: ! 604: static int ! 605: refers_to_regno_p (regno, x, loc) ! 606: int regno; ! 607: rtx x; ! 608: rtx *loc; ! 609: { ! 610: register int i; ! 611: register RTX_CODE code; ! 612: register char *fmt; ! 613: ! 614: repeat: ! 615: code = GET_CODE (x); ! 616: if (code == REG) ! 617: { ! 618: i = REGNO (x); ! 619: if (reg_renumber[i] >= 0) ! 620: i = reg_renumber[i]; ! 621: return i == regno; ! 622: } ! 623: ! 624: if (code == SET) ! 625: { ! 626: if (GET_CODE (SET_DEST (x)) != REG ! 627: && refers_to_regno_p (regno, SET_DEST (x), loc)) ! 628: return 1; ! 629: if (loc == &SET_SRC (x)) ! 630: return 0; ! 631: x = SET_SRC (x); ! 632: goto repeat; ! 633: } ! 634: ! 635: /* X does not match, so try its subexpressions. */ ! 636: ! 637: fmt = GET_RTX_FORMAT (code); ! 638: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 639: { ! 640: if (fmt[i] == 'e' && loc != &XEXP (x, i)) ! 641: { ! 642: if (i == 0) ! 643: { ! 644: x = XEXP (x, 0); ! 645: goto repeat; ! 646: } ! 647: else ! 648: if (refers_to_regno_p (regno, XEXP (x, i), loc)) ! 649: return 1; ! 650: } ! 651: else if (fmt[i] == 'E') ! 652: { ! 653: register int j; ! 654: for (j = XVECLEN (x, i) - 1; j >=0; j--) ! 655: if (loc != &XVECEXP (x, i, j) ! 656: && refers_to_regno_p (regno, XVECEXP (x, i, j), loc)) ! 657: return 1; ! 658: } ! 659: } ! 660: return 0; ! 661: } ! 662: ! 663: /* Return 1 if ADDR is a valid memory address for mode MODE, ! 664: and check that each pseudo reg has the proper kind of ! 665: hard reg. */ ! 666: ! 667: int ! 668: strict_memory_address_p (mode, addr) ! 669: enum machine_mode mode; ! 670: register rtx addr; ! 671: { ! 672: GO_IF_LEGITIMATE_ADDRESS (mode, addr, win); ! 673: return 0; ! 674: ! 675: win: ! 676: return 1; ! 677: } ! 678: ! 679: ! 680: /* Like rtx_equal_p except that it considers two REGs as equal ! 681: if they renumber to the same value and has special hacks for ! 682: autoincrement and autodecrement. ! 683: This is specifically intended for find_reloads to use ! 684: in determining whether two operands match. ! 685: X is the operand whose number is the lower of the two. ! 686: ! 687: The value is 2 if Y contains a pre-increment that matches ! 688: a non-incrementing address in X. */ ! 689: ! 690: /* ??? To be completely correct, we should arrange to pass ! 691: for X the output operand and for Y the input operand. ! 692: For now, we assume that the output operand has the lower number ! 693: because that is natural in (SET output (... input ...)). */ ! 694: ! 695: int ! 696: operands_match_p (x, y) ! 697: rtx x, y; ! 698: { ! 699: register int i; ! 700: register RTX_CODE code = GET_CODE (x); ! 701: register char *fmt; ! 702: int success_2; ! 703: ! 704: if (x == y) ! 705: return 1; ! 706: if ((code == REG || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG)) ! 707: && (GET_CODE (y) == REG || (GET_CODE (y) == SUBREG ! 708: && GET_CODE (SUBREG_REG (y)) == REG))) ! 709: { ! 710: register int j; ! 711: if (code == SUBREG) ! 712: { ! 713: i = REGNO (SUBREG_REG (x)); ! 714: if (reg_renumber[i] >= 0) ! 715: i = reg_renumber[i]; ! 716: i += SUBREG_WORD (x); ! 717: } ! 718: else ! 719: { ! 720: i = REGNO (x); ! 721: if (reg_renumber[i] >= 0) ! 722: i = reg_renumber[i]; ! 723: } ! 724: if (GET_CODE (y) == SUBREG) ! 725: { ! 726: j = REGNO (SUBREG_REG (y)); ! 727: if (reg_renumber[j] >= 0) ! 728: j = reg_renumber[j]; ! 729: j += SUBREG_WORD (y); ! 730: } ! 731: else ! 732: { ! 733: j = REGNO (y); ! 734: if (reg_renumber[j] >= 0) ! 735: j = reg_renumber[j]; ! 736: } ! 737: return i == j; ! 738: } ! 739: /* If two operands must match, because they are really a single ! 740: operand of an assembler insn, then two postincrements are invalid ! 741: because the assembler insn would increment only once. ! 742: On the other hand, an postincrement matches ordinary indexing ! 743: if the postincrement is the output operand. */ ! 744: if (code == POST_DEC || code == POST_INC) ! 745: return operands_match_p (XEXP (x, 0), y); ! 746: /* Two preincrements are invalid ! 747: because the assembler insn would increment only once. ! 748: On the other hand, an preincrement matches ordinary indexing ! 749: if the preincrement is the input operand. ! 750: In this case, return 2, since some callers need to do special ! 751: things when this happens. */ ! 752: if (GET_CODE (y) == PRE_DEC || GET_CODE (y) == PRE_INC) ! 753: return operands_match_p (x, XEXP (y, 0)) ? 2 : 0; ! 754: /* Now we have disposed of all the cases ! 755: in which different rtx codes can match. */ ! 756: if (code != GET_CODE (y)) ! 757: return 0; ! 758: if (code == LABEL_REF) ! 759: return XEXP (x, 0) == XEXP (y, 0); ! 760: if (code == SYMBOL_REF) ! 761: return XSTR (x, 0) == XSTR (y, 0); ! 762: ! 763: /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. */ ! 764: ! 765: if (GET_MODE (x) != GET_MODE (y)) ! 766: return 0; ! 767: ! 768: /* Compare the elements. If any pair of corresponding elements ! 769: fail to match, return 0 for the whole things. */ ! 770: ! 771: success_2 = 0; ! 772: fmt = GET_RTX_FORMAT (code); ! 773: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 774: { ! 775: int val; ! 776: switch (fmt[i]) ! 777: { ! 778: case 'i': ! 779: if (XINT (x, i) != XINT (y, i)) ! 780: return 0; ! 781: break; ! 782: ! 783: case 'e': ! 784: val = operands_match_p (XEXP (x, i), XEXP (y, i)); ! 785: if (val == 0) ! 786: return 0; ! 787: /* If any subexpression returns 2, ! 788: we should return 2 if we are successful. */ ! 789: if (val == 2) ! 790: success_2 = 1; ! 791: break; ! 792: ! 793: case '0': ! 794: break; ! 795: ! 796: /* It is believed that rtx's at this level will never ! 797: contain anything but integers and other rtx's, ! 798: except for within LABEL_REFs and SYMBOL_REFs. */ ! 799: default: ! 800: abort (); ! 801: } ! 802: } ! 803: return 1 + success_2; ! 804: } ! 805: ! 806: /* Main entry point of this file: search the body of INSN ! 807: for values that need reloading and record them with push_reload. ! 808: REPLACE nonzero means record also where the values occur ! 809: so that subst_reloads can be used. ! 810: IND_OK says that a memory reference is a valid memory address. ! 811: ! 812: LIVE_KNOWN says we have valid information about which hard ! 813: regs are live at each point in the program; this is true when ! 814: we are called from global_alloc but false when stupid register ! 815: allocation has been done. ! 816: ! 817: RELOAD_REG_P if nonzero is a vector indexed by hard reg number ! 818: which is nonzero if the reg has been commandeered for reloading into. ! 819: It is copied into STATIC_RELOAD_REG_P and referenced from there ! 820: by various subroutines. */ ! 821: ! 822: void ! 823: find_reloads (insn, replace, ind_ok, live_known, reload_reg_p) ! 824: rtx insn; ! 825: int replace, ind_ok; ! 826: int live_known; ! 827: short *reload_reg_p; ! 828: { ! 829: #ifdef REGISTER_CONSTRAINTS ! 830: ! 831: enum reload_modified { RELOAD_NOTHING, RELOAD_READ, RELOAD_READ_WRITE, RELOAD_WRITE }; ! 832: ! 833: register int insn_code_number; ! 834: register int i; ! 835: int noperands; ! 836: /* These are the constraints for the insn. We don't change them. */ ! 837: char *constraints1[MAX_RECOG_OPERANDS]; ! 838: /* These start out as the constraints for the insn ! 839: and they are chewed up as we consider alternatives. */ ! 840: char *constraints[MAX_RECOG_OPERANDS]; ! 841: int this_alternative[MAX_RECOG_OPERANDS]; ! 842: char this_alternative_win[MAX_RECOG_OPERANDS]; ! 843: char this_alternative_offmemok[MAX_RECOG_OPERANDS]; ! 844: char this_alternative_earlyclobber[MAX_RECOG_OPERANDS]; ! 845: int this_alternative_matches[MAX_RECOG_OPERANDS]; ! 846: int swapped; ! 847: int goal_alternative[MAX_RECOG_OPERANDS]; ! 848: int this_alternative_number; ! 849: int goal_alternative_number; ! 850: int operand_reloadnum[MAX_RECOG_OPERANDS]; ! 851: int goal_alternative_matches[MAX_RECOG_OPERANDS]; ! 852: int goal_alternative_matched[MAX_RECOG_OPERANDS]; ! 853: char goal_alternative_win[MAX_RECOG_OPERANDS]; ! 854: char goal_alternative_offmemok[MAX_RECOG_OPERANDS]; ! 855: int goal_alternative_swapped; ! 856: enum reload_modified modified[MAX_RECOG_OPERANDS]; ! 857: int best; ! 858: int commutative; ! 859: char operands_match[MAX_RECOG_OPERANDS][MAX_RECOG_OPERANDS]; ! 860: rtx substed_operand[MAX_RECOG_OPERANDS]; ! 861: rtx body = PATTERN (insn); ! 862: int goal_earlyclobber, this_earlyclobber; ! 863: enum machine_mode operand_mode[MAX_RECOG_OPERANDS]; ! 864: ! 865: this_insn = insn; ! 866: n_reloads = 0; ! 867: n_replacements = 0; ! 868: n_memlocs = 0; ! 869: replace_reloads = replace; ! 870: indirect_ok = ind_ok; ! 871: hard_regs_live_known = live_known; ! 872: static_reload_reg_p = reload_reg_p; ! 873: ! 874: /* Find what kind of insn this is. NOPERANDS gets number of operands. ! 875: Make OPERANDS point to a vector of operand values. ! 876: Make OPERAND_LOCS point to a vector of pointers to ! 877: where the operands were found. ! 878: Fill CONSTRAINTS and CONSTRAINTS1 with pointers to the ! 879: constraint-strings for this insn. ! 880: Return if the insn needs no reload processing. */ ! 881: ! 882: switch (GET_CODE (body)) ! 883: { ! 884: case USE: ! 885: case CLOBBER: ! 886: case ASM_INPUT: ! 887: case ADDR_VEC: ! 888: case ADDR_DIFF_VEC: ! 889: return; ! 890: ! 891: case PARALLEL: ! 892: case SET: ! 893: noperands = asm_noperands (body); ! 894: if (noperands > 0) ! 895: { ! 896: /* This insn is an `asm' with operands. */ ! 897: ! 898: insn_code_number = -1; ! 899: ! 900: /* expand_asm_operands makes sure there aren't too many operands. */ ! 901: if (noperands > MAX_RECOG_OPERANDS) ! 902: abort (); ! 903: ! 904: /* Now get the operand values and constraints out of the insn. */ ! 905: ! 906: decode_asm_operands (body, recog_operand, recog_operand_loc, ! 907: constraints, operand_mode); ! 908: bcopy (constraints, constraints1, noperands * sizeof (char *)); ! 909: break; ! 910: } ! 911: ! 912: default: ! 913: /* Ordinary insn: recognize it, allocate space for operands and ! 914: constraints, and get them out via insn_extract. */ ! 915: ! 916: insn_code_number = recog_memoized (insn); ! 917: noperands = insn_n_operands[insn_code_number]; ! 918: insn_extract (insn); ! 919: for (i = 0; i < noperands; i++) ! 920: { ! 921: constraints[i] = constraints1[i] ! 922: = insn_operand_constraint[insn_code_number][i]; ! 923: operand_mode[i] = insn_operand_mode[insn_code_number][i]; ! 924: } ! 925: } ! 926: ! 927: if (noperands == 0) ! 928: return; ! 929: ! 930: commutative = -1; ! 931: ! 932: /* If we will need to know, later, whether some pair of operands ! 933: are the same, we must compare them now and save the result. ! 934: Reloading the base and index registers will clobber them ! 935: and afterward they will fail to match. */ ! 936: ! 937: for (i = 0; i < noperands; i++) ! 938: { ! 939: register char *p; ! 940: register int c; ! 941: ! 942: substed_operand[i] = recog_operand[i]; ! 943: p = constraints[i]; ! 944: ! 945: /* Scan this operand's constraint to see if it should match another. */ ! 946: ! 947: while (c = *p++) ! 948: if (c == '%') ! 949: commutative = i; ! 950: else if (c >= '0' && c <= '9') ! 951: { ! 952: c -= '0'; ! 953: operands_match[c][i] ! 954: = operands_match_p (recog_operand[c], recog_operand[i]); ! 955: /* If C can be commuted with C+1, and C might need to match I, ! 956: then C+1 might also need to match I. */ ! 957: if (commutative >= 0) ! 958: { ! 959: if (c == commutative || c == commutative + 1) ! 960: { ! 961: int other = c + (c == commutative ? 1 : -1); ! 962: operands_match[other][i] ! 963: = operands_match_p (recog_operand[other], recog_operand[i]); ! 964: } ! 965: if (i == commutative || i == commutative + 1) ! 966: { ! 967: int other = i + (i == commutative ? 1 : -1); ! 968: operands_match[c][other] ! 969: = operands_match_p (recog_operand[c], recog_operand[other]); ! 970: } ! 971: /* Note that C is supposed to be less than I. ! 972: No need to consider altering both C and I ! 973: because in that case we would alter one into the other. */ ! 974: } ! 975: } ! 976: } ! 977: ! 978: /* Examine each operand that is a memory reference or memory address ! 979: and reload parts of the addresses into index registers. ! 980: While we are at it, initialize the array `modified'. ! 981: Also here any references to pseudo regs that didn't get hard regs ! 982: but are equivalent to constants get replaced in the insn itself ! 983: with those constants. Nobody will ever see them again. */ ! 984: ! 985: for (i = 0; i < noperands; i++) ! 986: { ! 987: register RTX_CODE code = GET_CODE (recog_operand[i]); ! 988: modified[i] = RELOAD_READ; ! 989: if (constraints[i][0] == 'p') ! 990: { ! 991: find_reloads_address (VOIDmode, 0, ! 992: recog_operand[i], recog_operand_loc[i]); ! 993: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 994: } ! 995: else if (code == MEM) ! 996: { ! 997: find_reloads_address (GET_MODE (recog_operand[i]), ! 998: recog_operand_loc[i], ! 999: XEXP (recog_operand[i], 0), ! 1000: &XEXP (recog_operand[i], 0)); ! 1001: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 1002: } ! 1003: else if (code == SUBREG) ! 1004: find_reloads_toplev (recog_operand[i]); ! 1005: else if (code == REG) ! 1006: { ! 1007: /* This is equivalent to calling find_reloads_toplev. ! 1008: The code is duplicated for speed. */ ! 1009: register int regno = REGNO (recog_operand[i]); ! 1010: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1011: && reg_equiv_constant[regno] != 0) ! 1012: substed_operand[i] = recog_operand[i] ! 1013: = reg_equiv_constant[regno]; ! 1014: if (reg_equiv_address[regno] != 0) ! 1015: { ! 1016: *recog_operand_loc[i] = recog_operand[i] ! 1017: = gen_rtx (MEM, GET_MODE (recog_operand[i]), ! 1018: reg_equiv_address[regno]); ! 1019: find_reloads_address (GET_MODE (recog_operand[i]), ! 1020: recog_operand_loc[i], ! 1021: XEXP (recog_operand[i], 0), ! 1022: &XEXP (recog_operand[i], 0)); ! 1023: substed_operand[i] = recog_operand[i] = *recog_operand_loc[i]; ! 1024: } ! 1025: } ! 1026: } ! 1027: ! 1028: /* Now see what we need for pseudo-regs that didn't get hard regs ! 1029: or got the wrong kind of hard reg. For this, we must consider ! 1030: all the operands together against the register constraints. */ ! 1031: ! 1032: best = MAX_RECOG_OPERANDS + 100; ! 1033: ! 1034: swapped = 0; ! 1035: try_swapped: ! 1036: this_alternative_number = 0; ! 1037: /* The constraints are made of several alternatives. ! 1038: Each operand's constraint looks like foo,bar,... with commas ! 1039: separating the alternatives. The first alternatives for all ! 1040: operands go together, the second alternatives go together, etc. ! 1041: ! 1042: First loop over alternatives. */ ! 1043: ! 1044: while (*constraints[0]) ! 1045: { ! 1046: /* Loop over operands for one constraint alternative. */ ! 1047: /* LOSERS counts those that don't fit this alternative ! 1048: and would require loading. */ ! 1049: int losers = 0; ! 1050: /* BAD is set to 1 if it some operand can't fit this alternative ! 1051: even after reloading. */ ! 1052: int bad = 0; ! 1053: /* REJECT is a count of how undesirable this alternative says it is ! 1054: if any reloading is required. If the alternative matches exactly ! 1055: then REJECT is ignored, but otherwise it gets this much ! 1056: counted against it in addition to the reloading needed. */ ! 1057: int reject = 0; ! 1058: ! 1059: this_earlyclobber = 0; ! 1060: ! 1061: for (i = 0; i < noperands; i++) ! 1062: { ! 1063: register char *p = constraints[i]; ! 1064: register int win = 0; ! 1065: int badop = 1; ! 1066: int c; ! 1067: register rtx operand = recog_operand[i]; ! 1068: int offset = 0; ! 1069: int force_reload = 0; ! 1070: int offmemok = 0; ! 1071: int earlyclobber = 0; ! 1072: ! 1073: /* If the operand is a SUBREG, extract ! 1074: the REG or MEM within. */ ! 1075: ! 1076: while (GET_CODE (operand) == SUBREG) ! 1077: { ! 1078: offset += SUBREG_WORD (operand); ! 1079: operand = SUBREG_REG (operand); ! 1080: if (GET_CODE (operand) == MEM ! 1081: /*** This is overcautious, as for BYTES_BIG_ENDIAN it is still possible ! 1082: to avoid setting force_reload if the mode of the subreg ! 1083: is SImode or bigger. */ ! 1084: #ifndef BYTES_BIG_ENDIAN ! 1085: && offset != 0 ! 1086: #endif ! 1087: && !offsetable_memref_p (operand)) ! 1088: force_reload = 1; ! 1089: } ! 1090: ! 1091: this_alternative[i] = (int) NO_REGS; ! 1092: this_alternative_win[i] = 0; ! 1093: this_alternative_offmemok[i] = 0; ! 1094: this_alternative_earlyclobber[i] = 0; ! 1095: this_alternative_matches[i] = -1; ! 1096: ! 1097: /* Scan this alternative's specs for this operand; ! 1098: set WIN if the operand fits any letter in this alternative. ! 1099: Otherwise, clear BADOP if this operand could ! 1100: fit some letter after reloads. */ ! 1101: ! 1102: while (*p && (c = *p++) != ',') ! 1103: switch (c) ! 1104: { ! 1105: case '=': ! 1106: modified[i] = RELOAD_WRITE; ! 1107: break; ! 1108: ! 1109: case '+': ! 1110: modified[i] = RELOAD_READ_WRITE; ! 1111: break; ! 1112: ! 1113: case '*': ! 1114: break; ! 1115: ! 1116: case '%': ! 1117: commutative = i; ! 1118: break; ! 1119: ! 1120: case '?': ! 1121: reject++; ! 1122: break; ! 1123: ! 1124: case '!': ! 1125: reject = 100; ! 1126: break; ! 1127: ! 1128: case '#': ! 1129: /* Ignore rest of this alternative as far as ! 1130: reloading is concerned. */ ! 1131: while (*p && *p != ',') p++; ! 1132: break; ! 1133: ! 1134: case '0': ! 1135: case '1': ! 1136: case '2': ! 1137: case '3': ! 1138: case '4': ! 1139: c -= '0'; ! 1140: this_alternative_matches[i] = c; ! 1141: /* We are supposed to match a previous operand. ! 1142: If we do, we win if that one did. ! 1143: If we do not, count both of the operands as losers. ! 1144: (This is too conservative, since most of the time ! 1145: only a single reload insn will be needed to make ! 1146: the two operands win. As a result, this alternative ! 1147: may be rejected when it is actually desirable.) */ ! 1148: if ((swapped && (c != commutative || i != commutative + 1)) ! 1149: /* If we are matching as if two operands were swapped, ! 1150: also pretend that operands_match had been computed ! 1151: with swapped. ! 1152: But if I is the second of those and C is the first, ! 1153: don't exchange them, because operands_match is valid ! 1154: only on one side of its diagonal. */ ! 1155: ? (operands_match ! 1156: [(c == commutative || c == commutative + 1) ! 1157: ? 2*commutative + 1 - c : c] ! 1158: [(i == commutative || i == commutative + 1) ! 1159: ? 2*commutative + 1 - i : i]) ! 1160: : operands_match[c][i]) ! 1161: win = this_alternative_win[c]; ! 1162: else ! 1163: { ! 1164: /* Operands don't match. */ ! 1165: rtx value; ! 1166: /* Retroactively mark the operand we had to match ! 1167: as a loser, if it wasn't already. */ ! 1168: if (this_alternative_win[c]) ! 1169: losers++; ! 1170: this_alternative_win[c] = 0; ! 1171: if (this_alternative[c] == (int) NO_REGS) ! 1172: bad = 1; ! 1173: /* But count the pair only once in the total badness of ! 1174: this alternative, if the pair can be a dummy reload. */ ! 1175: value ! 1176: = find_dummy_reload (recog_operand[i], recog_operand[c], ! 1177: recog_operand_loc[i], recog_operand_loc[c], ! 1178: this_alternative[c], -1); ! 1179: ! 1180: if (value != 0) ! 1181: losers--; ! 1182: } ! 1183: /* This can be fixed with reloads if the operand ! 1184: we are supposed to match can be fixed with reloads. */ ! 1185: badop = 0; ! 1186: break; ! 1187: ! 1188: case 'p': ! 1189: /* All necessary reloads for an address_operand ! 1190: were handled in find_reloads_address. */ ! 1191: this_alternative[i] = (int) ALL_REGS; ! 1192: win = 1; ! 1193: break; ! 1194: ! 1195: case 'm': ! 1196: if (GET_CODE (operand) == MEM ! 1197: || (GET_CODE (operand) == REG ! 1198: && REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 1199: && reg_renumber[REGNO (operand)] < 0)) ! 1200: win = 1; ! 1201: if (GET_CODE (operand) == CONST_DOUBLE) ! 1202: badop = 0; ! 1203: break; ! 1204: ! 1205: case '<': ! 1206: if (GET_CODE (operand) == MEM ! 1207: && (GET_CODE (XEXP (operand, 0)) == PRE_DEC ! 1208: || GET_CODE (XEXP (operand, 0)) == POST_DEC)) ! 1209: win = 1; ! 1210: break; ! 1211: ! 1212: case '>': ! 1213: if (GET_CODE (operand) == MEM ! 1214: && (GET_CODE (XEXP (operand, 0)) == PRE_INC ! 1215: || GET_CODE (XEXP (operand, 0)) == POST_INC)) ! 1216: win = 1; ! 1217: break; ! 1218: ! 1219: /* Memory operand whose address is offsettable. */ ! 1220: case 'o': ! 1221: if ((GET_CODE (operand) == MEM ! 1222: && offsetable_memref_p (operand)) ! 1223: || (GET_CODE (operand) == REG ! 1224: && REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 1225: && reg_renumber[REGNO (operand)] < 0)) ! 1226: win = 1; ! 1227: if (GET_CODE (operand) == CONST_DOUBLE ! 1228: || (GET_CODE (operand) == MEM ! 1229: && GET_CODE (XEXP (operand, 0)) != POST_INC ! 1230: && GET_CODE (XEXP (operand, 0)) != POST_DEC ! 1231: && GET_CODE (XEXP (operand, 0)) != PRE_INC ! 1232: && GET_CODE (XEXP (operand, 0)) != PRE_DEC)) ! 1233: badop = 0; ! 1234: offmemok = 1; ! 1235: break; ! 1236: ! 1237: case '&': ! 1238: /* Output operand that is stored before the need for the ! 1239: input operands (and their index registers) is over. */ ! 1240: if (GET_CODE (operand) == REG) ! 1241: earlyclobber = 1, this_earlyclobber = 1; ! 1242: break; ! 1243: ! 1244: case 'F': ! 1245: if (GET_CODE (operand) == CONST_DOUBLE) ! 1246: win = 1; ! 1247: break; ! 1248: ! 1249: case 'G': ! 1250: case 'H': ! 1251: if (GET_CODE (operand) == CONST_DOUBLE ! 1252: && CONST_DOUBLE_OK_FOR_LETTER_P (operand, c)) ! 1253: win = 1; ! 1254: break; ! 1255: ! 1256: case 's': ! 1257: if (GET_CODE (operand) == CONST_INT) ! 1258: break; ! 1259: case 'i': ! 1260: if (CONSTANT_P (operand)) ! 1261: win = 1; ! 1262: break; ! 1263: ! 1264: case 'n': ! 1265: if (GET_CODE (operand) == CONST_INT) ! 1266: win = 1; ! 1267: break; ! 1268: ! 1269: case 'I': ! 1270: case 'J': ! 1271: case 'K': ! 1272: case 'L': ! 1273: case 'M': ! 1274: if (GET_CODE (operand) == CONST_INT ! 1275: && CONST_OK_FOR_LETTER_P (INTVAL (operand), c)) ! 1276: win = 1; ! 1277: break; ! 1278: ! 1279: case 'g': ! 1280: if (GENERAL_REGS == ALL_REGS ! 1281: || GET_CODE (operand) != REG ! 1282: || (REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 1283: && reg_renumber[REGNO (operand)] < 0)) ! 1284: win = 1; ! 1285: /* Drop through into 'r' case */ ! 1286: ! 1287: case 'r': ! 1288: this_alternative[i] ! 1289: = (int) reg_class_subunion[this_alternative[i]][(int) GENERAL_REGS]; ! 1290: goto reg; ! 1291: ! 1292: default: ! 1293: this_alternative[i] ! 1294: = (int) reg_class_subunion[this_alternative[i]][(int) REG_CLASS_FROM_LETTER (c)]; ! 1295: ! 1296: reg: ! 1297: badop = 0; ! 1298: if (GET_CODE (operand) == REG ! 1299: && reg_renumbered_fits_class_p (operand, ! 1300: this_alternative[i], ! 1301: offset, GET_MODE (recog_operand[i]))) ! 1302: win = 1; ! 1303: break; ! 1304: } ! 1305: constraints[i] = p; ! 1306: ! 1307: /* Record which operands fit this alternative. */ ! 1308: this_alternative_earlyclobber[i] = earlyclobber; ! 1309: if (win && ! force_reload) ! 1310: this_alternative_win[i] = 1; ! 1311: else ! 1312: { ! 1313: this_alternative_offmemok[i] = offmemok; ! 1314: losers++; ! 1315: if (badop) ! 1316: bad = 1; ! 1317: } ! 1318: } ! 1319: ! 1320: /* Now see if any output operands that are marked "earlyclobber" ! 1321: in this alternative conflict with any input operands ! 1322: or any memory addresses. */ ! 1323: ! 1324: for (i = 0; i < noperands; i++) ! 1325: if (this_alternative_earlyclobber[i] ! 1326: && this_alternative_win[i]) ! 1327: { ! 1328: int j; ! 1329: for (j = 0; j < noperands; j++) ! 1330: /* Is this an input operand or a memory ref? */ ! 1331: if ((GET_CODE (recog_operand[j]) == MEM ! 1332: || modified[j] != RELOAD_WRITE) ! 1333: /* Does it refer to the earlyclobber operand? */ ! 1334: && refers_to_regno_p (REGNO (recog_operand[i]), ! 1335: recog_operand[j], 0)) ! 1336: break; ! 1337: /* If an earlyclobber operand conflicts with something, ! 1338: it must be reloaded, so request this and count the cost. */ ! 1339: if (j != noperands) ! 1340: { ! 1341: losers++; ! 1342: this_alternative_win[i] = 0; ! 1343: } ! 1344: } ! 1345: ! 1346: /* If one alternative accepts all the operands, no reload required, ! 1347: choose that alternative; don't consider the remaining ones. */ ! 1348: if (losers == 0) ! 1349: { ! 1350: /* Unswap these so that they are never swapped at `finish'. */ ! 1351: recog_operand[1] = substed_operand[1]; ! 1352: recog_operand[2] = substed_operand[2]; ! 1353: for (i = 0; i < noperands; i++) ! 1354: goal_alternative_win[i] = 1; ! 1355: bcopy (this_alternative, goal_alternative, ! 1356: sizeof this_alternative); ! 1357: bcopy (this_alternative_offmemok, goal_alternative_offmemok, ! 1358: sizeof this_alternative_offmemok); ! 1359: bcopy (this_alternative_matches, goal_alternative_matches, ! 1360: sizeof this_alternative_matches); ! 1361: goal_alternative_number = this_alternative_number; ! 1362: goal_alternative_swapped = swapped; ! 1363: goal_earlyclobber = this_earlyclobber; ! 1364: goto finish; ! 1365: } ! 1366: ! 1367: /* REJECT, set by the ! and ? constraint characters, ! 1368: discourages the use of this alternative for a reload goal. */ ! 1369: if (reject > 0) ! 1370: losers += reject; ! 1371: ! 1372: /* If this alternative can be made to work by reloading, ! 1373: and it needs less reloading than the others checked so far, ! 1374: record it as the chosen goal for reloading. */ ! 1375: if (! bad && best > losers) ! 1376: { ! 1377: bcopy (this_alternative, goal_alternative, ! 1378: sizeof this_alternative); ! 1379: bcopy (this_alternative_win, goal_alternative_win, ! 1380: sizeof this_alternative_win); ! 1381: bcopy (this_alternative_offmemok, goal_alternative_offmemok, ! 1382: sizeof this_alternative_offmemok); ! 1383: bcopy (this_alternative_matches, goal_alternative_matches, ! 1384: sizeof this_alternative_matches); ! 1385: goal_alternative_swapped = swapped; ! 1386: best = losers; ! 1387: goal_alternative_number = this_alternative_number; ! 1388: goal_earlyclobber = this_earlyclobber; ! 1389: } ! 1390: this_alternative_number++; ! 1391: } ! 1392: ! 1393: /* If insn is commutative (it's safe to exchange a certain pair of operands) ! 1394: then we need to try each alternative twice, ! 1395: the second time matching those two operands ! 1396: as if we had exchanged them. ! 1397: To do this, really exchange them in operands. ! 1398: ! 1399: If we have just tried the alternatives the second time, ! 1400: return operands to normal and drop through. */ ! 1401: ! 1402: if (commutative >= 0) ! 1403: { ! 1404: swapped = !swapped; ! 1405: if (swapped) ! 1406: { ! 1407: recog_operand[commutative] = substed_operand[commutative + 1]; ! 1408: recog_operand[commutative + 1] = substed_operand[commutative]; ! 1409: ! 1410: bcopy (constraints1, constraints, noperands * sizeof (char *)); ! 1411: goto try_swapped; ! 1412: } ! 1413: else ! 1414: { ! 1415: recog_operand[commutative] = substed_operand[commutative]; ! 1416: recog_operand[commutative + 1] = substed_operand[commutative + 1]; ! 1417: } ! 1418: } ! 1419: ! 1420: /* The operands don't meet the constraints. ! 1421: goal_alternative describes the alternative ! 1422: that we could reach by reloading the fewest operands. ! 1423: Reload so as to fit it. */ ! 1424: ! 1425: if (best == MAX_RECOG_OPERANDS + 100) ! 1426: abort (); /* No alternative works with reloads?? */ ! 1427: ! 1428: /* Jump to `finish' from above if all operands are valid already. ! 1429: In that case, goal_alternative_win is all 1. */ ! 1430: finish: ! 1431: ! 1432: /* Right now, for any pair of operands I and J that are required to match, ! 1433: with I < J, ! 1434: goal_alternative_matches[J] is I. ! 1435: Set up goal_alternative_matched as the inverse function: ! 1436: goal_alternative_matched[I] = J. */ ! 1437: ! 1438: for (i = 0; i < noperands; i++) ! 1439: goal_alternative_matched[i] = -1; ! 1440: ! 1441: for (i = 0; i < noperands; i++) ! 1442: if (! goal_alternative_win[i] ! 1443: && goal_alternative_matches[i] >= 0) ! 1444: goal_alternative_matched[goal_alternative_matches[i]] = i; ! 1445: ! 1446: /* If the best alternative is with operands 1 and 2 swapped, ! 1447: consider them swapped before reporting the reloads. */ ! 1448: ! 1449: if (goal_alternative_swapped) ! 1450: { ! 1451: register rtx tem; ! 1452: ! 1453: tem = substed_operand[commutative]; ! 1454: substed_operand[commutative] = substed_operand[commutative + 1]; ! 1455: substed_operand[commutative + 1] = tem; ! 1456: tem = recog_operand[commutative]; ! 1457: recog_operand[commutative] = recog_operand[commutative + 1]; ! 1458: recog_operand[commutative + 1] = tem; ! 1459: } ! 1460: ! 1461: /* Perform whatever substitutions on the operands we are supposed ! 1462: to make due to commutativity or replacement of registers ! 1463: with equivalent constants or memory slots. */ ! 1464: ! 1465: for (i = 0; i < noperands; i++) ! 1466: { ! 1467: *recog_operand_loc[i] = substed_operand[i]; ! 1468: /* While we are looping on operands, initialize this. */ ! 1469: operand_reloadnum[i] = -1; ! 1470: } ! 1471: ! 1472: /* Now record reloads for all the operands that need them. */ ! 1473: for (i = 0; i < noperands; i++) ! 1474: if (! goal_alternative_win[i]) ! 1475: { ! 1476: /* Operands that match previous ones have already been handled. */ ! 1477: if (goal_alternative_matches[i] >= 0) ! 1478: ; ! 1479: /* This clause forces a double constant into memory ! 1480: if necessary. But right now it appears never necessary. ! 1481: Perhaps there should be a heuristic here to detect cases ! 1482: when it is desirable, even though not necessary, to move ! 1483: the constant to memory. I can't decide when it is desirable. */ ! 1484: else if (GET_CODE (recog_operand[i]) == CONST_DOUBLE ! 1485: && alternative_allows_memconst (constraints1[i], goal_alternative_number) ! 1486: && goal_alternative[i] == (int) NO_REGS) ! 1487: { ! 1488: *recog_operand_loc[i] = recog_operand[i] ! 1489: = force_const_double_mem (recog_operand[i]); ! 1490: find_reloads_toplev (recog_operand[i]); ! 1491: } ! 1492: /* Handle an operand with a nonoffsetable address ! 1493: appearing where an offsetable address will do ! 1494: by reloading the address into a base register. */ ! 1495: else if (goal_alternative_matched[i] == -1 ! 1496: && goal_alternative_offmemok[i] ! 1497: && GET_CODE (recog_operand[i]) == MEM ! 1498: && GET_CODE (XEXP (recog_operand[i], 0)) != POST_INC ! 1499: && GET_CODE (XEXP (recog_operand[i], 0)) != POST_DEC ! 1500: && GET_CODE (XEXP (recog_operand[i], 0)) != PRE_INC ! 1501: && GET_CODE (XEXP (recog_operand[i], 0)) != PRE_DEC) ! 1502: push_reload (XEXP (recog_operand[i], 0), 0, ! 1503: &XEXP (recog_operand[i], 0), 0, ! 1504: BASE_REG_CLASS, GET_MODE (XEXP (recog_operand[i], 0)), ! 1505: 0, 0, 0); ! 1506: else if (goal_alternative_matched[i] == -1) ! 1507: operand_reloadnum[i] = ! 1508: push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0, ! 1509: modified[i] != RELOAD_READ ? recog_operand[i] : 0, ! 1510: recog_operand_loc[i], 0, ! 1511: (enum reg_class) goal_alternative[i], ! 1512: (modified[i] == RELOAD_WRITE ? VOIDmode : operand_mode[i]), ! 1513: (modified[i] == RELOAD_READ ? VOIDmode : operand_mode[i]), ! 1514: (insn_code_number < 0 ? 0 ! 1515: : insn_operand_strict_low[insn_code_number][i]), ! 1516: 0); ! 1517: /* In a matching pair of operands, one must be input only ! 1518: and the other must be output only. ! 1519: Pass the input operand as IN and the other as OUT. */ ! 1520: else if (modified[i] == RELOAD_READ ! 1521: && modified[goal_alternative_matched[i]] == RELOAD_WRITE) ! 1522: operand_reloadnum[goal_alternative_matched[i]] ! 1523: = operand_reloadnum[i] ! 1524: = push_reload (recog_operand[i], ! 1525: recog_operand[goal_alternative_matched[i]], ! 1526: recog_operand_loc[i], ! 1527: recog_operand_loc[goal_alternative_matched[i]], ! 1528: (enum reg_class) goal_alternative[i], ! 1529: operand_mode[i], ! 1530: operand_mode[goal_alternative_matched[i]], ! 1531: VOIDmode, 0); ! 1532: else if (modified[i] == RELOAD_WRITE ! 1533: && modified[goal_alternative_matched[i]] == RELOAD_READ) ! 1534: operand_reloadnum[goal_alternative_matched[i]] ! 1535: = operand_reloadnum[i] ! 1536: = push_reload (recog_operand[goal_alternative_matched[i]], ! 1537: recog_operand[i], ! 1538: recog_operand_loc[goal_alternative_matched[i]], ! 1539: recog_operand_loc[i], ! 1540: (enum reg_class) goal_alternative[i], ! 1541: operand_mode[goal_alternative_matched[i]], ! 1542: operand_mode[i], ! 1543: VOIDmode, 0); ! 1544: else abort (); ! 1545: } ! 1546: else if (goal_alternative_matched[i] < 0 ! 1547: && goal_alternative_matches[i] < 0) ! 1548: { ! 1549: rtx operand = recog_operand[i]; ! 1550: /* For each non-matching operand that's a pseudo-register ! 1551: that didn't get a hard register, make an optional reload. ! 1552: This may get done even if the insn needs no reloads otherwise. */ ! 1553: /* (It would be safe to make an optional reload for a matching pair ! 1554: of operands, but we don't bother yet.) */ ! 1555: while (GET_CODE (operand) == SUBREG) ! 1556: operand = XEXP (operand, 0); ! 1557: if (GET_CODE (operand) == REG ! 1558: && REGNO (operand) >= FIRST_PSEUDO_REGISTER ! 1559: && reg_renumber[REGNO (operand)] < 0 ! 1560: && (enum reg_class) goal_alternative[i] != NO_REGS) ! 1561: operand_reloadnum[i] ! 1562: = push_reload (modified[i] != RELOAD_WRITE ? recog_operand[i] : 0, ! 1563: modified[i] != RELOAD_READ ? recog_operand[i] : 0, ! 1564: recog_operand_loc[i], 0, ! 1565: (enum reg_class) goal_alternative[i], ! 1566: (modified[i] == RELOAD_WRITE ? VOIDmode : operand_mode[i]), ! 1567: (modified[i] == RELOAD_READ ? VOIDmode : operand_mode[i]), ! 1568: insn_operand_strict_low[insn_code_number][i], ! 1569: 1); ! 1570: else ! 1571: operand_reloadnum[i] = -1; ! 1572: } ! 1573: ! 1574: /* Perhaps an output reload can be combined with another ! 1575: to reduce needs by one. */ ! 1576: if (!goal_earlyclobber) ! 1577: combine_reloads (); ! 1578: ! 1579: /* If this insn pattern contains any MATCH_DUP's, make sure that ! 1580: they will be substituted if the operands they match are substituted. ! 1581: Also do now any substitutions we already did on the operands. */ ! 1582: if (insn_code_number >= 0) ! 1583: for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--) ! 1584: { ! 1585: int opno = recog_dup_num[i]; ! 1586: *recog_dup_loc[i] = *recog_operand_loc[opno]; ! 1587: if (operand_reloadnum[opno] >= 0) ! 1588: push_replacement (recog_dup_loc[i], operand_reloadnum[opno], ! 1589: insn_operand_mode[insn_code_number][opno]); ! 1590: } ! 1591: ! 1592: /* For each reload of a reg into some other class of reg, ! 1593: search for an existing equivalent reg (same value now) in the right class. ! 1594: We can use it as long as we don't need to change its contents. */ ! 1595: for (i = 0; i < n_reloads; i++) ! 1596: if (reload_reg_rtx[i] == 0 ! 1597: && reload_in[i] != 0 ! 1598: && GET_CODE (reload_in[i]) == REG ! 1599: && reload_out[i] == 0) ! 1600: { ! 1601: reload_reg_rtx[i] ! 1602: = find_equiv_reg (reload_in[i], insn, reload_reg_class[i], -1, ! 1603: static_reload_reg_p, 0); ! 1604: /* Prevent generation of insn to load the value ! 1605: because the one we found already has the value. */ ! 1606: if (reload_reg_rtx[i]) ! 1607: reload_in[i] = reload_reg_rtx[i]; ! 1608: } ! 1609: ! 1610: #else /* no REGISTER_CONSTRAINTS */ ! 1611: int noperands; ! 1612: int insn_code_number; ! 1613: register int i; ! 1614: rtx body = PATTERN (insn); ! 1615: ! 1616: n_reloads = 0; ! 1617: n_replacements = 0; ! 1618: replace_reloads = replace; ! 1619: indirect_ok = ind_ok; ! 1620: this_insn = insn; ! 1621: ! 1622: /* Find what kind of insn this is. NOPERANDS gets number of operands. ! 1623: Store the operand values in RECOG_OPERAND and the locations ! 1624: of the words in the insn that point to them in RECOG_OPERAND_LOC. ! 1625: Return if the insn needs no reload processing. */ ! 1626: ! 1627: switch (GET_CODE (body)) ! 1628: { ! 1629: case USE: ! 1630: case CLOBBER: ! 1631: case ASM_INPUT: ! 1632: case ADDR_VEC: ! 1633: case ADDR_DIFF_VEC: ! 1634: return; ! 1635: ! 1636: case PARALLEL: ! 1637: case SET: ! 1638: noperands = asm_noperands (body); ! 1639: if (noperands > 0) ! 1640: { ! 1641: /* This insn is an `asm' with operands. ! 1642: First, find out how many operands, and allocate space. */ ! 1643: ! 1644: insn_code_number = -1; ! 1645: /* ??? This is a bug! ??? ! 1646: Give up and delete this insn if it has too many operands. */ ! 1647: if (noperands > MAX_RECOG_OPERANDS) ! 1648: abort (); ! 1649: ! 1650: /* Now get the operand values out of the insn. */ ! 1651: ! 1652: decode_asm_operands (body, recog_operand, recog_operand_loc, 0, 0); ! 1653: break; ! 1654: } ! 1655: ! 1656: default: ! 1657: /* Ordinary insn: recognize it, allocate space for operands and ! 1658: constraints, and get them out via insn_extract. */ ! 1659: ! 1660: insn_code_number = recog_memoized (insn); ! 1661: noperands = insn_n_operands[insn_code_number]; ! 1662: insn_extract (insn); ! 1663: } ! 1664: ! 1665: if (noperands == 0) ! 1666: return; ! 1667: ! 1668: for (i = 0; i < noperands; i++) ! 1669: { ! 1670: register RTX_CODE code = GET_CODE (recog_operand[i]); ! 1671: ! 1672: if (insn_code_number >= 0) ! 1673: if (insn_operand_address_p[insn_code_number][i]) ! 1674: find_reloads_address (VOIDmode, 0, ! 1675: recog_operand[i], recog_operand_loc[i]); ! 1676: if (code == MEM) ! 1677: find_reloads_address (GET_MODE (recog_operand[i]), ! 1678: recog_operand_loc[i], ! 1679: XEXP (recog_operand[i], 0), ! 1680: &XEXP (recog_operand[i], 0)); ! 1681: if (code == SUBREG) ! 1682: find_reloads_toplev (recog_operand[i]); ! 1683: if (code == REG) ! 1684: { ! 1685: register int regno = REGNO (recog_operand[i]); ! 1686: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1687: && reg_equiv_constant[regno] != 0) ! 1688: recog_operand[i] = *recog_operand_loc[i] ! 1689: = reg_equiv_constant[regno]; ! 1690: } ! 1691: } ! 1692: #endif /* no REGISTER_CONSTRAINTS */ ! 1693: } ! 1694: ! 1695: /* Return 1 if alternative number ALTNUM in constraint-string CONSTRAINT ! 1696: accepts a memory operand with constant address. */ ! 1697: ! 1698: static int ! 1699: alternative_allows_memconst (constraint, altnum) ! 1700: char *constraint; ! 1701: int altnum; ! 1702: { ! 1703: register int c; ! 1704: /* Skip alternatives before the one requested. */ ! 1705: while (altnum > 0) ! 1706: { ! 1707: while (*constraint++ != ','); ! 1708: altnum--; ! 1709: } ! 1710: /* Scan the requested alternative for 'm' or 'o'. ! 1711: If one of them is present, this alternative accepts memory constants. */ ! 1712: while ((c = *constraint++) && c != ',' && c != '#') ! 1713: if (c == 'm' || c == 'o') ! 1714: return 1; ! 1715: return 0; ! 1716: } ! 1717: ! 1718: /* Scan X for memory references and scan the addresses for reloading. ! 1719: Also checks for references to "constant" regs that we want to eliminate ! 1720: and replaces them with the values they stand for. ! 1721: We may alter X descructively if it contains a reference to such. ! 1722: If X is just a constant reg, we return the equivalent value ! 1723: instead of X. */ ! 1724: ! 1725: static rtx ! 1726: find_reloads_toplev (x) ! 1727: rtx x; ! 1728: { ! 1729: register RTX_CODE code = GET_CODE (x); ! 1730: ! 1731: register char *fmt = GET_RTX_FORMAT (code); ! 1732: register int i; ! 1733: ! 1734: if (code == REG) ! 1735: { ! 1736: /* This code is duplicated for speed in find_reloads. */ ! 1737: register int regno = REGNO (x); ! 1738: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1739: && reg_equiv_constant[regno] != 0) ! 1740: x = reg_equiv_constant[regno]; ! 1741: else if (reg_equiv_address[regno] != 0) ! 1742: { ! 1743: x = gen_rtx (MEM, GET_MODE (x), ! 1744: reg_equiv_address[regno]); ! 1745: find_reloads_address (GET_MODE (x), 0, ! 1746: XEXP (x, 0), ! 1747: &XEXP (x, 0)); ! 1748: } ! 1749: return x; ! 1750: ! 1751: ! 1752: } ! 1753: else if (code == MEM) ! 1754: { ! 1755: rtx tem = x; ! 1756: find_reloads_address (GET_MODE (x), &tem, XEXP (x, 0), &XEXP (x, 0)); ! 1757: return tem; ! 1758: } ! 1759: else ! 1760: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1761: { ! 1762: if (fmt[i] == 'e') ! 1763: XEXP (x, i) = find_reloads_toplev (XEXP (x, i)); ! 1764: } ! 1765: return x; ! 1766: } ! 1767: ! 1768: static rtx ! 1769: make_memloc (ad, regno) ! 1770: rtx ad; ! 1771: int regno; ! 1772: { ! 1773: register int i; ! 1774: rtx tem = reg_equiv_address[regno]; ! 1775: for (i = 0; i < n_memlocs; i++) ! 1776: if (rtx_equal_p (tem, XEXP (memlocs[i], 0))) ! 1777: return memlocs[i]; ! 1778: tem = gen_rtx (MEM, GET_MODE (ad), tem); ! 1779: memlocs[n_memlocs++] = tem; ! 1780: return tem; ! 1781: } ! 1782: ! 1783: /* Record all reloads needed for handling memory address AD ! 1784: which appears in *LOC in a memory reference to mode MODE ! 1785: which itself is stored in location *MEMREFLOC. ! 1786: (MEMREFLOC may be zero, meaning don't ever bother to copy the memref.) ! 1787: Note that we take shortcuts assuming that no multi-reg machine mode ! 1788: occurs as part of an address. */ ! 1789: ! 1790: static void ! 1791: find_reloads_address (mode, memrefloc, ad, loc) ! 1792: enum machine_mode mode; ! 1793: rtx *memrefloc; ! 1794: rtx ad; ! 1795: rtx *loc; ! 1796: { ! 1797: register int regno; ! 1798: rtx tem; ! 1799: ! 1800: if (GET_CODE (ad) == REG) ! 1801: { ! 1802: regno = REGNO (ad); ! 1803: ! 1804: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1805: && reg_equiv_constant[regno] != 0) ! 1806: { ! 1807: if (strict_memory_address_p (mode, reg_equiv_constant[regno])) ! 1808: { ! 1809: *loc = ad = reg_equiv_constant[regno]; ! 1810: return; ! 1811: } ! 1812: } ! 1813: if (reg_equiv_address[regno] != 0) ! 1814: { ! 1815: rtx tem = make_memloc (ad, regno); ! 1816: push_reload (XEXP (tem, 0), 0, &XEXP (tem, 0), 0, ! 1817: BASE_REG_CLASS, ! 1818: GET_MODE (XEXP (tem, 0)), 0, VOIDmode, 0); ! 1819: push_reload (tem, 0, loc, 0, BASE_REG_CLASS, ! 1820: GET_MODE (ad), 0, VOIDmode, 0); ! 1821: return; ! 1822: } ! 1823: if (! (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1824: ? indirect_ok ! 1825: : REGNO_OK_FOR_BASE_P (regno))) ! 1826: push_reload (ad, 0, loc, 0, BASE_REG_CLASS, ! 1827: GET_MODE (ad), 0, VOIDmode, 0); ! 1828: return; ! 1829: } ! 1830: ! 1831: if (strict_memory_address_p (mode, ad)) ! 1832: { ! 1833: /* The address appears valid, so reloads are not needed. ! 1834: But the address may contain an eliminable register. ! 1835: This can happen because a machine with indirect addressing ! 1836: may consider a pseudo register by itself a valid address even when ! 1837: it has failed to get a hard reg. ! 1838: So do a tree-walk to find and eliminate all such regs. */ ! 1839: ! 1840: *loc = subst_reg_equivs (ad); ! 1841: ! 1842: /* Check result for validity after substitution. */ ! 1843: if (strict_memory_address_p (mode, ad)) ! 1844: return; ! 1845: } ! 1846: ! 1847: /* If we have address of a stack slot but it's not valid ! 1848: (displacement is too large), compute the sum in a register. */ ! 1849: if (GET_CODE (ad) == PLUS ! 1850: && GET_CODE (XEXP (ad, 0)) == REG ! 1851: && (REGNO (XEXP (ad, 0)) == FRAME_POINTER_REGNUM ! 1852: || REGNO (XEXP (ad, 0)) == ARG_POINTER_REGNUM) ! 1853: && GET_CODE (XEXP (ad, 1)) == CONST_INT) ! 1854: { ! 1855: /* Unshare the MEM rtx so we can safely alter it. */ ! 1856: if (memrefloc) ! 1857: { ! 1858: *memrefloc = copy_rtx (*memrefloc); ! 1859: loc = &XEXP (*memrefloc, 0); ! 1860: } ! 1861: push_reload (ad, 0, loc, 0, BASE_REG_CLASS, ! 1862: GET_MODE (ad), 0, VOIDmode, 0); ! 1863: return; ! 1864: } ! 1865: ! 1866: /* See if address becomes valid when an eliminable register ! 1867: in a sum is replaced. */ ! 1868: ! 1869: tem = subst_indexed_address (ad); ! 1870: if (tem != ad && strict_memory_address_p (mode, tem)) ! 1871: { ! 1872: /* Ok, we win that way. Replace any additional eliminable ! 1873: registers. */ ! 1874: ! 1875: tem = subst_reg_equivs (tem); ! 1876: ! 1877: /* Make sure that didn't make the address invalid again. */ ! 1878: ! 1879: if (strict_memory_address_p (mode, tem)) ! 1880: { ! 1881: *loc = tem; ! 1882: return; ! 1883: } ! 1884: } ! 1885: ! 1886: /* If constants aren't valid addresses, reload the constant address ! 1887: into a register. */ ! 1888: if (CONSTANT_ADDRESS_P (ad) && ! strict_memory_address_p (mode, ad)) ! 1889: { ! 1890: push_reload (ad, 0, loc, 0, ! 1891: BASE_REG_CLASS, ! 1892: GET_MODE (ad), 0, VOIDmode, 0); ! 1893: return; ! 1894: } ! 1895: ! 1896: find_reloads_address_1 (ad, 0, loc); ! 1897: } ! 1898: ! 1899: /* Find all pseudo regs appearing in AD ! 1900: that are eliminable in favor of equivalent values ! 1901: and do not have hard regs; replace them by their equivalents. */ ! 1902: ! 1903: static rtx ! 1904: subst_reg_equivs (ad) ! 1905: rtx ad; ! 1906: { ! 1907: register RTX_CODE code = GET_CODE (ad); ! 1908: register int i; ! 1909: register char *fmt; ! 1910: ! 1911: switch (code) ! 1912: { ! 1913: case CONST_INT: ! 1914: case CONST: ! 1915: case CONST_DOUBLE: ! 1916: case SYMBOL_REF: ! 1917: case LABEL_REF: ! 1918: case PC: ! 1919: case CC0: ! 1920: return ad; ! 1921: ! 1922: case REG: ! 1923: { ! 1924: register int regno = REGNO (ad); ! 1925: ! 1926: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 1927: && reg_equiv_constant[regno] != 0) ! 1928: return reg_equiv_constant[regno]; ! 1929: } ! 1930: return ad; ! 1931: } ! 1932: ! 1933: fmt = GET_RTX_FORMAT (code); ! 1934: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 1935: if (fmt[i] == 'e') ! 1936: XEXP (ad, i) = subst_reg_equivs (XEXP (ad, i)); ! 1937: return ad; ! 1938: } ! 1939: ! 1940: /* If ADDR is a sum containing a pseudo register that should be ! 1941: replaced with a constant (from reg_equiv_constant), ! 1942: return the result of doing so, and also apply the associative ! 1943: law so that the result is more likely to be a valid address. ! 1944: (But it is not guaranteed to be one.) ! 1945: ! 1946: In all other cases, return ADDR. */ ! 1947: ! 1948: static rtx ! 1949: subst_indexed_address (addr) ! 1950: rtx addr; ! 1951: { ! 1952: rtx const_part = 0; ! 1953: rtx var_part = 0; ! 1954: int regno; ! 1955: ! 1956: if (GET_CODE (addr) == PLUS) ! 1957: { ! 1958: if (CONSTANT_P (XEXP (addr, 0))) ! 1959: const_part = XEXP (addr, 0), ! 1960: var_part = XEXP (addr, 1); ! 1961: else if (CONSTANT_P (XEXP (addr, 1))) ! 1962: const_part = XEXP (addr, 1), ! 1963: var_part = XEXP (addr, 0); ! 1964: ! 1965: if (const_part == 0) ! 1966: return addr; ! 1967: ! 1968: if (GET_CODE (const_part) == CONST) ! 1969: const_part = XEXP (const_part, 0); ! 1970: ! 1971: if (GET_CODE (var_part) == REG ! 1972: && (regno = REGNO (var_part)) >= FIRST_PSEUDO_REGISTER ! 1973: && reg_renumber[regno] < 0 ! 1974: && reg_equiv_constant[regno] != 0) ! 1975: return gen_rtx (CONST, VOIDmode, ! 1976: gen_rtx (PLUS, Pmode, const_part, ! 1977: reg_equiv_constant[regno])); ! 1978: ! 1979: if (GET_CODE (var_part) != PLUS) ! 1980: return addr; ! 1981: ! 1982: if (GET_CODE (XEXP (var_part, 0)) == REG ! 1983: && (regno = REGNO (XEXP (var_part, 0))) >= FIRST_PSEUDO_REGISTER ! 1984: && reg_renumber[regno] < 0 ! 1985: && reg_equiv_constant[regno] != 0) ! 1986: return gen_rtx (PLUS, Pmode, XEXP (var_part, 1), ! 1987: gen_rtx (CONST, VOIDmode, ! 1988: gen_rtx (PLUS, Pmode, const_part, ! 1989: reg_equiv_constant[regno]))); ! 1990: ! 1991: if (GET_CODE (XEXP (var_part, 1)) == REG ! 1992: && (regno = REGNO (XEXP (var_part, 1))) >= FIRST_PSEUDO_REGISTER ! 1993: && reg_renumber[regno] < 0 ! 1994: && reg_equiv_constant[regno] != 0) ! 1995: return gen_rtx (PLUS, Pmode, XEXP (var_part, 0), ! 1996: gen_rtx (CONST, VOIDmode, ! 1997: gen_rtx (PLUS, Pmode, const_part, ! 1998: reg_equiv_constant[regno]))); ! 1999: } ! 2000: return addr; ! 2001: } ! 2002: ! 2003: /* Record the pseudo registers we must reload into hard registers ! 2004: in a subexpression of a memory address, X. ! 2005: CONTEXT = 1 means we are considering regs as index regs, ! 2006: = 0 means we are considering them as base regs. ! 2007: ! 2008: We return X, whose operands may have been altered, ! 2009: or perhaps a RELOAD rtx if X itself was a REG that must be reloaded. */ ! 2010: ! 2011: /* Note that we take shortcuts assuming that no multi-reg machine mode ! 2012: occurs as part of an address. ! 2013: Also, this is not fully machine-customizable; it works for machines ! 2014: such as vaxes and 68000's and 32000's, but other possible machines ! 2015: could have addressing modes that this does not handle right. */ ! 2016: ! 2017: static void ! 2018: find_reloads_address_1 (x, context, loc) ! 2019: rtx x; ! 2020: int context; ! 2021: rtx *loc; ! 2022: { ! 2023: register RTX_CODE code = GET_CODE (x); ! 2024: ! 2025: if (code == PLUS) ! 2026: { ! 2027: register rtx op0 = XEXP (x, 0); ! 2028: register rtx op1 = XEXP (x, 1); ! 2029: register RTX_CODE code0 = GET_CODE (op0); ! 2030: register RTX_CODE code1 = GET_CODE (op1); ! 2031: if (code0 == MULT || code0 == SIGN_EXTEND || code1 == MEM) ! 2032: { ! 2033: find_reloads_address_1 (op0, 1, &XEXP (x, 0)); ! 2034: find_reloads_address_1 (op1, 0, &XEXP (x, 1)); ! 2035: } ! 2036: else if (code1 == MULT || code1 == SIGN_EXTEND || code0 == MEM) ! 2037: { ! 2038: find_reloads_address_1 (op0, 0, &XEXP (x, 0)); ! 2039: find_reloads_address_1 (op1, 1, &XEXP (x, 1)); ! 2040: } ! 2041: else if (code0 == CONST_INT || code0 == CONST ! 2042: || code0 == SYMBOL_REF || code0 == LABEL_REF) ! 2043: { ! 2044: find_reloads_address_1 (op1, 0, &XEXP (x, 1)); ! 2045: } ! 2046: else if (code1 == CONST_INT || code1 == CONST ! 2047: || code1 == SYMBOL_REF || code1 == LABEL_REF) ! 2048: { ! 2049: find_reloads_address_1 (op0, 0, &XEXP (x, 0)); ! 2050: } ! 2051: else if (code0 == REG && code1 == REG) ! 2052: { ! 2053: if (REG_OK_FOR_INDEX_P (op0) ! 2054: && REG_OK_FOR_BASE_P (op1)) ! 2055: return; ! 2056: else if (REG_OK_FOR_INDEX_P (op1) ! 2057: && REG_OK_FOR_BASE_P (op0)) ! 2058: return; ! 2059: else if (REG_OK_FOR_BASE_P (op1)) ! 2060: find_reloads_address_1 (op0, 1, &XEXP (x, 0)); ! 2061: else if (REG_OK_FOR_BASE_P (op0)) ! 2062: find_reloads_address_1 (op1, 1, &XEXP (x, 1)); ! 2063: else if (REG_OK_FOR_INDEX_P (op1)) ! 2064: find_reloads_address_1 (op0, 0, &XEXP (x, 0)); ! 2065: else if (REG_OK_FOR_INDEX_P (op0)) ! 2066: find_reloads_address_1 (op1, 0, &XEXP (x, 1)); ! 2067: else ! 2068: { ! 2069: find_reloads_address_1 (op0, 1, &XEXP (x, 0)); ! 2070: find_reloads_address_1 (op1, 0, &XEXP (x, 1)); ! 2071: } ! 2072: } ! 2073: else if (code0 == REG) ! 2074: { ! 2075: find_reloads_address_1 (op0, 1, &XEXP (x, 0)); ! 2076: find_reloads_address_1 (op1, 0, &XEXP (x, 1)); ! 2077: } ! 2078: else if (code1 == REG) ! 2079: { ! 2080: find_reloads_address_1 (op1, 1, &XEXP (x, 1)); ! 2081: find_reloads_address_1 (op0, 0, &XEXP (x, 0)); ! 2082: } ! 2083: } ! 2084: else if (code == POST_INC || code == POST_DEC ! 2085: || code == PRE_INC || code == PRE_DEC) ! 2086: { ! 2087: if (GET_CODE (XEXP (x, 0)) == REG) ! 2088: { ! 2089: register int regno = REGNO (XEXP (x, 0)); ! 2090: ! 2091: /* A register that is incremented cannot be constant! */ ! 2092: if (regno >= FIRST_PSEUDO_REGISTER ! 2093: && reg_equiv_constant[regno] != 0) ! 2094: abort (); ! 2095: ! 2096: /* Handle a register that is equivalent to a memory location ! 2097: which cannot be addressed directly. */ ! 2098: if (reg_equiv_address[regno] != 0) ! 2099: { ! 2100: rtx tem = make_memloc (XEXP (x, 0), regno); ! 2101: /* First reload the memory location's address. */ ! 2102: push_reload (XEXP (tem, 0), 0, &XEXP (tem, 0), 0, ! 2103: BASE_REG_CLASS, ! 2104: GET_MODE (XEXP (tem, 0)), 0, VOIDmode, 0); ! 2105: /* Then reload the memory reference itself, ! 2106: pretending it is located in the PRE_INC or whatever. */ ! 2107: push_reload (tem, tem, &XEXP (x, 0), 0, ! 2108: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 2109: GET_MODE (tem), GET_MODE (tem), VOIDmode, 0); ! 2110: return; ! 2111: } ! 2112: ! 2113: /* Handle any other sort of register. */ ! 2114: ! 2115: if (reg_renumber[regno] >= 0) ! 2116: regno = reg_renumber[regno]; ! 2117: if ((regno >= FIRST_PSEUDO_REGISTER ! 2118: || !(context ? REGNO_OK_FOR_INDEX_P (regno) ! 2119: : REGNO_OK_FOR_BASE_P (regno)))) ! 2120: { ! 2121: register rtx link; ! 2122: int reloadnum ! 2123: = push_reload (XEXP (x, 0), XEXP (x, 0), ! 2124: &XEXP (x, 0), 0, ! 2125: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 2126: GET_MODE (XEXP (x, 0)), ! 2127: GET_MODE (XEXP (x, 0)), VOIDmode, 0); ! 2128: ! 2129: for (link = REG_NOTES (this_insn); ! 2130: link; link = XEXP (link, 1)) ! 2131: if (REG_NOTE_KIND (link) == REG_INC ! 2132: && REGNO (XEXP (link, 0)) == REGNO (XEXP (x, 0))) ! 2133: push_replacement (&XEXP (link, 0), reloadnum, VOIDmode); ! 2134: } ! 2135: return; ! 2136: } ! 2137: } ! 2138: else if (code == REG) ! 2139: { ! 2140: register int regno = REGNO (x); ! 2141: ! 2142: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] < 0 ! 2143: && reg_equiv_constant[regno] != 0) ! 2144: { ! 2145: push_reload (reg_equiv_constant[regno], 0, loc, 0, ! 2146: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 2147: GET_MODE (x), 0, VOIDmode, 0); ! 2148: return; ! 2149: } ! 2150: ! 2151: if (reg_equiv_address[regno] != 0) ! 2152: { ! 2153: x = make_memloc (x, regno); ! 2154: push_reload (XEXP (x, 0), 0, &XEXP (x, 0), 0, ! 2155: BASE_REG_CLASS, ! 2156: GET_MODE (XEXP (x, 0)), 0, VOIDmode, 0); ! 2157: } ! 2158: ! 2159: if (reg_renumber[regno] >= 0) ! 2160: regno = reg_renumber[regno]; ! 2161: if ((regno >= FIRST_PSEUDO_REGISTER ! 2162: || !(context ? REGNO_OK_FOR_INDEX_P (regno) ! 2163: : REGNO_OK_FOR_BASE_P (regno)))) ! 2164: { ! 2165: push_reload (x, 0, loc, 0, ! 2166: context ? INDEX_REG_CLASS : BASE_REG_CLASS, ! 2167: GET_MODE (x), 0, VOIDmode, 0); ! 2168: return; ! 2169: } ! 2170: } ! 2171: else ! 2172: { ! 2173: register char *fmt = GET_RTX_FORMAT (code); ! 2174: register int i; ! 2175: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2176: { ! 2177: if (fmt[i] == 'e') ! 2178: find_reloads_address_1 (XEXP (x, i), context, &XEXP (x, i)); ! 2179: } ! 2180: } ! 2181: } ! 2182: ! 2183: /* Substitute into X the registers into which we have reloaded ! 2184: the things that need reloading. The array `replacements' ! 2185: says contains the locations of all pointers that must be changed ! 2186: and says what to replace them with. ! 2187: ! 2188: Return the rtx that X translates into; usually X, but modified. */ ! 2189: ! 2190: void ! 2191: subst_reloads () ! 2192: { ! 2193: register int i; ! 2194: ! 2195: for (i = 0; i < n_replacements; i++) ! 2196: { ! 2197: register struct replacement *r = &replacements[i]; ! 2198: register rtx reloadreg = reload_reg_rtx[r->what]; ! 2199: if (reloadreg) ! 2200: { ! 2201: /* Encapsulate RELOADREG so its machine mode matches what ! 2202: used to be there. */ ! 2203: if (GET_MODE (reloadreg) != r->mode && r->mode != VOIDmode) ! 2204: reloadreg = gen_rtx (SUBREG, r->mode, reloadreg, 0); ! 2205: *r->where = reloadreg; ! 2206: } ! 2207: /* If reload got no reg and isn't optional, something's wrong. */ ! 2208: else if (! reload_optional[r->what]) ! 2209: abort (); ! 2210: } ! 2211: } ! 2212: ! 2213: #if 0 ! 2214: ! 2215: /* [[This function is currently obsolete, now that volatility ! 2216: is represented by a special bit `volatil' so VOLATILE is never used; ! 2217: and UNCHANGING has never been brought into use.]] ! 2218: ! 2219: Alter X by eliminating all VOLATILE and UNCHANGING expressions. ! 2220: Each of them is replaced by its operand. ! 2221: Thus, (PLUS (VOLATILE (MEM (REG 5))) (CONST_INT 4)) ! 2222: becomes (PLUS (MEM (REG 5)) (CONST_INT 4)). ! 2223: ! 2224: If X is itself a VOLATILE expression, ! 2225: we return the expression that should replace it ! 2226: but we do not modify X. */ ! 2227: ! 2228: static rtx ! 2229: forget_volatility (x) ! 2230: register rtx x; ! 2231: { ! 2232: enum rtx_code code = GET_CODE (x); ! 2233: register char *fmt; ! 2234: register int i; ! 2235: register rtx value = 0; ! 2236: ! 2237: switch (code) ! 2238: { ! 2239: case LABEL_REF: ! 2240: case SYMBOL_REF: ! 2241: case CONST_INT: ! 2242: case CONST_DOUBLE: ! 2243: case CONST: ! 2244: case REG: ! 2245: case CC0: ! 2246: case PC: ! 2247: return x; ! 2248: ! 2249: case VOLATILE: ! 2250: case UNCHANGING: ! 2251: return XEXP (x, 0); ! 2252: } ! 2253: ! 2254: fmt = GET_RTX_FORMAT (code); ! 2255: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2256: { ! 2257: if (fmt[i] == 'e') ! 2258: XEXP (x, i) = forget_volatility (XEXP (x, i)); ! 2259: if (fmt[i] == 'E') ! 2260: { ! 2261: register int j; ! 2262: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 2263: XVECEXP (x, i, j) = forget_volatility (XVECEXP (x, i, j)); ! 2264: } ! 2265: } ! 2266: ! 2267: return x; ! 2268: } ! 2269: ! 2270: #endif ! 2271: ! 2272: /* Check the insns before INSN to see if there is a suitable register ! 2273: containing the same value as GOAL. ! 2274: If OTHER is -1, look for a register in class CLASS. ! 2275: Otherwise, just see if register number OTHER shares GOAL's value. ! 2276: ! 2277: Return an rtx for the register found, or zero if none is found. ! 2278: ! 2279: If RELOAD_REG_P is (short *)1, ! 2280: we reject any hard reg that appears in reload_reg_rtx ! 2281: because such a hard reg is also needed coming into this insn. ! 2282: ! 2283: If RELOAD_REG_P is any other nonzero value, ! 2284: it is a vector indexed by hard reg number ! 2285: and we reject any hard reg whose element in the vector is nonnegative ! 2286: as well as any that appears in reload_reg_rtx. ! 2287: ! 2288: If GOAL is zero, then GOALREG is a register number; we look ! 2289: for an equivalent for that register. ! 2290: ! 2291: This function is used by jump.c as well as in the reload pass. ! 2292: ! 2293: If GOAL is a PLUS, we assume it adds the stack pointer to a constant. */ ! 2294: ! 2295: rtx ! 2296: find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg) ! 2297: register rtx goal; ! 2298: rtx insn; ! 2299: enum reg_class class; ! 2300: register int other; ! 2301: short *reload_reg_p; ! 2302: int goalreg; ! 2303: { ! 2304: register rtx p = insn; ! 2305: rtx valtry, value, where; ! 2306: register rtx pat; ! 2307: register int regno = -1; ! 2308: int valueno; ! 2309: int goal_mem = 0; ! 2310: int goal_const = 0; ! 2311: ! 2312: if (goal == 0) ! 2313: regno = goalreg; ! 2314: else if (GET_CODE (goal) == REG) ! 2315: regno = REGNO (goal); ! 2316: else if (GET_CODE (goal) == MEM) ! 2317: goal_mem = 1; ! 2318: else if (CONSTANT_P (goal)) ! 2319: goal_const = 1; ! 2320: else ! 2321: return 0; ! 2322: ! 2323: /* Scan insns back from INSN, looking for one that copies ! 2324: a value into or out of GOAL. ! 2325: Stop and give up if we reach a label. */ ! 2326: ! 2327: while (1) ! 2328: { ! 2329: p = PREV_INSN (p); ! 2330: if (p == 0 || GET_CODE (p) == CODE_LABEL) ! 2331: return 0; ! 2332: if (GET_CODE (p) == INSN ! 2333: /* If we don't want spill regs (true for all calls in this file) */ ! 2334: && (! (reload_reg_p != 0 && reload_reg_p != (short *)1) ! 2335: /* then ignore insns introduced by reload; they aren't useful ! 2336: and can cause results in reload_as_needed to be different ! 2337: from what they were when calculating the need for spills. ! 2338: If we notice an input-reload insn here, we will reject it below, ! 2339: but it might hide a usable equivalent. That makes bad code. ! 2340: It may even abort: perhaps no reg was spilled for this insn ! 2341: because it was assumed we would find that equivalent. */ ! 2342: || INSN_UID (p) < reload_first_uid)) ! 2343: { ! 2344: pat = PATTERN (p); ! 2345: /* First check for something that sets some reg equal to GOAL. */ ! 2346: if (GET_CODE (pat) == SET ! 2347: && ((regno >= 0 ! 2348: && GET_CODE (SET_SRC (pat)) == REG ! 2349: && (goal == 0 ? true_regnum (SET_SRC (pat)) : REGNO (SET_SRC (pat))) == regno ! 2350: && GET_CODE (valtry = SET_DEST (pat)) == REG) ! 2351: || ! 2352: (regno >= 0 ! 2353: && GET_CODE (SET_DEST (pat)) == REG ! 2354: && (goal == 0 ? true_regnum (SET_DEST (pat)) : REGNO (SET_DEST (pat))) == regno ! 2355: && GET_CODE (valtry = SET_SRC (pat)) == REG) ! 2356: || ! 2357: (goal_const && rtx_equal_p (SET_SRC (pat), goal) ! 2358: && GET_CODE (valtry = SET_DEST (pat)) == REG) ! 2359: || (goal_mem ! 2360: && GET_CODE (valtry = SET_DEST (pat)) == REG ! 2361: && rtx_renumbered_equal_p (goal, SET_SRC (pat))) ! 2362: || (goal_mem ! 2363: && GET_CODE (valtry = SET_SRC (pat)) == REG ! 2364: && rtx_renumbered_equal_p (goal, SET_DEST (pat))))) ! 2365: if (other >= 0 ! 2366: ? (goal == 0 ? true_regnum (valtry) : REGNO (valtry)) == other ! 2367: : (valueno = REGNO (valtry), ! 2368: reg_renumber[valueno] >= 0 ? valueno = reg_renumber[valueno] : 0, ! 2369: valueno < FIRST_PSEUDO_REGISTER && ! 2370: TEST_HARD_REG_BIT (reg_class_contents[(int) class], ! 2371: valueno))) ! 2372: { ! 2373: value = valtry; ! 2374: where = p; ! 2375: break; ! 2376: } ! 2377: } ! 2378: } ! 2379: ! 2380: /* We found a previous insn copying GOAL into a suitable other reg VALUE ! 2381: (or copying VALUE into GOAL, if GOAL is also a register). ! 2382: Now verify that VALUE is really valid. */ ! 2383: ! 2384: if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] >= 0) ! 2385: regno = reg_renumber[regno]; ! 2386: ! 2387: /* VALUENO gets the register number of VALUE; ! 2388: for a pseudo reg, it gets the hard reg number that the pseudo has, ! 2389: and we give up if the pseudo has no hard reg. */ ! 2390: ! 2391: valueno = REGNO (value); ! 2392: if (valueno >= FIRST_PSEUDO_REGISTER) ! 2393: valueno = reg_renumber[valueno]; ! 2394: ! 2395: if (valueno < 0) ! 2396: return 0; ! 2397: ! 2398: /* Don't find the sp as an equiv, since pushes that we don't notice ! 2399: would invalidate it. */ ! 2400: if (valueno == STACK_POINTER_REGNUM) ! 2401: return 0; ! 2402: ! 2403: /* Reject VALUE if it was loaded from GOAL ! 2404: and is also a register that appears in the address of GOAL. */ ! 2405: ! 2406: if (goal_mem && value == SET_DEST (PATTERN (where)) ! 2407: && refers_to_regno_p (valueno, goal, 0)) ! 2408: return 0; ! 2409: ! 2410: /* Reject VALUE if it is one of the regs reserved for reloads. ! 2411: Reload1 knows how to reuse them anyway, and it would get ! 2412: confused if we allocated one without its knowledge. ! 2413: (Now that insns introduced by reload are ignored above, ! 2414: this case shouldn't happen, but I'm not positive.) */ ! 2415: ! 2416: if (reload_reg_p != 0 && reload_reg_p != (short *)1 ! 2417: && reload_reg_p[valueno] >= 0) ! 2418: return 0; ! 2419: ! 2420: /* Reject VALUE if it is a register being used for an input reload ! 2421: even if it is not one of those reserved. */ ! 2422: ! 2423: if (reload_reg_p != 0) ! 2424: { ! 2425: int i; ! 2426: for (i = 0; i < n_reloads; i++) ! 2427: if (reload_reg_rtx[i] != 0 && reload_in[i]) ! 2428: { ! 2429: int regno1 = REGNO (reload_reg_rtx[i]); ! 2430: if (reg_renumber[regno1] >= 0) ! 2431: regno1 = reg_renumber[regno1]; ! 2432: if (valueno == regno1) ! 2433: return 0; ! 2434: } ! 2435: } ! 2436: ! 2437: /* Now verify that the values of GOAL and VALUE remain unaltered ! 2438: until INSN is reached. */ ! 2439: ! 2440: p = insn; ! 2441: while (1) ! 2442: { ! 2443: p = PREV_INSN (p); ! 2444: if (p == where) ! 2445: return value; ! 2446: ! 2447: /* Don't trust the conversion past a function call ! 2448: if either of the two is in a call-clobbered register, or memory. */ ! 2449: if (GET_CODE (p) == CALL_INSN ! 2450: && ((regno >= 0 && regno < FIRST_PSEUDO_REGISTER ! 2451: && call_used_regs[regno]) ! 2452: || ! 2453: (valueno >= 0 && valueno < FIRST_PSEUDO_REGISTER ! 2454: && call_used_regs[valueno]) ! 2455: || ! 2456: goal_mem)) ! 2457: return 0; ! 2458: ! 2459: if (GET_CODE (p) == INSN || GET_CODE (p) == JUMP_INSN ! 2460: || GET_CODE (p) == CALL_INSN) ! 2461: { ! 2462: /* If this insn P stores in either GOAL or VALUE, return 0. ! 2463: If GOAL is a memory ref and this insn writes memory, return 0. ! 2464: If GOAL is a memory ref and its address is not constant, ! 2465: and this insn P changes a register, return 0. ! 2466: That is in lieue of checking whether GOAL uses this register. */ ! 2467: ! 2468: pat = PATTERN (p); ! 2469: if (GET_CODE (pat) == SET || GET_CODE (pat) == CLOBBER) ! 2470: { ! 2471: register rtx dest = SET_DEST (pat); ! 2472: while (GET_CODE (dest) == SUBREG ! 2473: || GET_CODE (dest) == ZERO_EXTRACT ! 2474: || GET_CODE (dest) == SIGN_EXTRACT ! 2475: || GET_CODE (dest) == STRICT_LOW_PART) ! 2476: dest = XEXP (dest, 0); ! 2477: if (GET_CODE (dest) == REG) ! 2478: { ! 2479: register int xregno = REGNO (dest); ! 2480: if (reg_renumber[xregno] >= 0) ! 2481: xregno = reg_renumber[xregno]; ! 2482: if (xregno == regno || xregno == valueno || goal_mem) ! 2483: return 0; ! 2484: } ! 2485: else if (goal_mem && GET_CODE (dest) == MEM ! 2486: && ! push_operand (dest, GET_MODE (dest))) ! 2487: return 0; ! 2488: } ! 2489: else if (GET_CODE (pat) == PARALLEL) ! 2490: { ! 2491: register int i; ! 2492: for (i = XVECLEN (pat, 0) - 1; i >= 0; i--) ! 2493: { ! 2494: register rtx v1 = XVECEXP (pat, 0, i); ! 2495: if (GET_CODE (v1) == SET || GET_CODE (v1) == CLOBBER) ! 2496: { ! 2497: register rtx dest = SET_DEST (v1); ! 2498: while (GET_CODE (dest) == SUBREG ! 2499: || GET_CODE (dest) == ZERO_EXTRACT ! 2500: || GET_CODE (dest) == SIGN_EXTRACT ! 2501: || GET_CODE (dest) == STRICT_LOW_PART) ! 2502: dest = XEXP (dest, 0); ! 2503: if (GET_CODE (dest) == REG) ! 2504: { ! 2505: register int xregno = REGNO (dest); ! 2506: if (reg_renumber[xregno] >= 0) ! 2507: xregno = reg_renumber[xregno]; ! 2508: if (xregno == regno || xregno == valueno || goal_mem) ! 2509: return 0; ! 2510: } ! 2511: else if (goal_mem && GET_CODE (dest) == MEM ! 2512: && ! push_operand (dest, GET_MODE (dest))) ! 2513: return 0; ! 2514: } ! 2515: } ! 2516: } ! 2517: /* If this insn auto-increments or auto-decrements ! 2518: either regno or valueno, return 0 now. ! 2519: If GOAL is a memory ref and its address is not constant, ! 2520: and this insn P increments a register, return 0. ! 2521: That is in lieue of checking whether GOAL uses this register. */ ! 2522: { ! 2523: register rtx link; ! 2524: ! 2525: for (link = REG_NOTES (p); link; link = XEXP (link, 1)) ! 2526: if (REG_NOTE_KIND (link) == REG_INC) ! 2527: { ! 2528: register int incno = REGNO (XEXP (link, 0)); ! 2529: if (reg_renumber[incno] >= 0) ! 2530: incno = reg_renumber[incno]; ! 2531: if (incno == regno || incno == valueno || goal_mem) ! 2532: return 0; ! 2533: } ! 2534: } ! 2535: } ! 2536: } ! 2537: } ! 2538: ! 2539: /* Find a place where INCED appears in an increment or decrement operator ! 2540: within X, and return the amount INCED is incremented by ! 2541: (negative if decremented). */ ! 2542: ! 2543: static int ! 2544: find_inc_amount (x, inced) ! 2545: rtx x, inced; ! 2546: { ! 2547: register enum rtx_code code = GET_CODE (x); ! 2548: register char *fmt; ! 2549: register int i; ! 2550: ! 2551: if (code == MEM) ! 2552: { ! 2553: register rtx addr = XEXP (x, 0); ! 2554: if ((GET_CODE (addr) == PRE_DEC ! 2555: || GET_CODE (addr) == POST_DEC) ! 2556: && XEXP (addr, 0) == inced) ! 2557: return - GET_MODE_SIZE (GET_MODE (x)); ! 2558: if ((GET_CODE (addr) == PRE_INC ! 2559: || GET_CODE (addr) == POST_INC) ! 2560: && XEXP (addr, 0) == inced) ! 2561: return GET_MODE_SIZE (GET_MODE (x)); ! 2562: } ! 2563: ! 2564: fmt = GET_RTX_FORMAT (code); ! 2565: for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ! 2566: { ! 2567: if (fmt[i] == 'e') ! 2568: { ! 2569: register int tem = find_inc_amount (XEXP (x, i), inced); ! 2570: if (tem != 0) ! 2571: return tem; ! 2572: } ! 2573: if (fmt[i] == 'E') ! 2574: { ! 2575: register int j; ! 2576: for (j = XVECLEN (x, i) - 1; j >= 0; j--) ! 2577: { ! 2578: register int tem = find_inc_amount (XVECEXP (x, i, j), inced); ! 2579: if (tem != 0) ! 2580: return tem; ! 2581: } ! 2582: } ! 2583: } ! 2584: ! 2585: return 0; ! 2586: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.