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