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