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