OSDN Git Service

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