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