OSDN Git Service

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