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