OSDN Git Service

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