OSDN Git Service

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