OSDN Git Service

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