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