OSDN Git Service

config:
[pf3gnuchains/gcc-fork.git] / gcc / caller-save.c
1 /* Save and restore call-clobbered registers which are live across a call.
2    Copyright (C) 1989, 1992, 1994, 1995, 1997, 1998,
3    1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "rtl.h"
25 #include "insn-config.h"
26 #include "flags.h"
27 #include "regs.h"
28 #include "hard-reg-set.h"
29 #include "recog.h"
30 #include "basic-block.h"
31 #include "reload.h"
32 #include "function.h"
33 #include "expr.h"
34 #include "toplev.h"
35 #include "tm_p.h"
36
37 #ifndef MAX_MOVE_MAX
38 #define MAX_MOVE_MAX MOVE_MAX
39 #endif
40
41 #ifndef MIN_UNITS_PER_WORD
42 #define MIN_UNITS_PER_WORD UNITS_PER_WORD
43 #endif
44
45 #define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)
46
47 /* Modes for each hard register that we can save.  The smallest mode is wide
48    enough to save the entire contents of the register.  When saving the
49    register because it is live we first try to save in multi-register modes.
50    If that is not possible the save is done one register at a time.  */
51
52 static enum machine_mode 
53   regno_save_mode[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
54
55 /* For each hard register, a place on the stack where it can be saved,
56    if needed.  */
57
58 static rtx 
59   regno_save_mem[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
60
61 /* We will only make a register eligible for caller-save if it can be
62    saved in its widest mode with a simple SET insn as long as the memory
63    address is valid.  We record the INSN_CODE is those insns here since
64    when we emit them, the addresses might not be valid, so they might not
65    be recognized.  */
66
67 static enum insn_code 
68   reg_save_code[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
69 static enum insn_code 
70   reg_restore_code[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
71
72 /* Set of hard regs currently residing in save area (during insn scan).  */
73
74 static HARD_REG_SET hard_regs_saved;
75
76 /* Number of registers currently in hard_regs_saved.  */
77
78 static int n_regs_saved;
79
80 /* Computed by mark_referenced_regs, all regs referenced in a given
81    insn.  */
82 static HARD_REG_SET referenced_regs;
83
84 /* Computed in mark_set_regs, holds all registers set by the current
85    instruction.  */
86 static HARD_REG_SET this_insn_sets;
87
88
89 static void mark_set_regs               PARAMS ((rtx, rtx, void *));
90 static void mark_referenced_regs        PARAMS ((rtx));
91 static int insert_save                  PARAMS ((struct insn_chain *, int, int,
92                                                  HARD_REG_SET *));
93 static int insert_restore               PARAMS ((struct insn_chain *, int, int,
94                                                  int));
95 static struct insn_chain *insert_one_insn PARAMS ((struct insn_chain *, int,
96                                                    enum insn_code, rtx));
97 static void add_stored_regs             PARAMS ((rtx, rtx, void *));
98 \f
99 /* Initialize for caller-save.
100
101    Look at all the hard registers that are used by a call and for which
102    regclass.c has not already excluded from being used across a call.
103
104    Ensure that we can find a mode to save the register and that there is a 
105    simple insn to save and restore the register.  This latter check avoids
106    problems that would occur if we tried to save the MQ register of some
107    machines directly into memory.  */
108
109 void
110 init_caller_save ()
111 {
112   rtx addr_reg;
113   int offset;
114   rtx address;
115   int i, j;
116
117   /* First find all the registers that we need to deal with and all
118      the modes that they can have.  If we can't find a mode to use,
119      we can't have the register live over calls.  */
120
121   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
122     {
123       if (call_used_regs[i] && ! call_fixed_regs[i])
124         {
125           for (j = 1; j <= MOVE_MAX_WORDS; j++)
126             {
127               regno_save_mode[i][j] = HARD_REGNO_CALLER_SAVE_MODE (i, j);
128               if (regno_save_mode[i][j] == VOIDmode && j == 1)
129                 {
130                   call_fixed_regs[i] = 1;
131                   SET_HARD_REG_BIT (call_fixed_reg_set, i);
132                 }
133             }
134         }
135       else
136         regno_save_mode[i][1] = VOIDmode;
137     }
138
139   /* The following code tries to approximate the conditions under which
140      we can easily save and restore a register without scratch registers or
141      other complexities.  It will usually work, except under conditions where
142      the validity of an insn operand is dependent on the address offset.
143      No such cases are currently known.
144
145      We first find a typical offset from some BASE_REG_CLASS register.
146      This address is chosen by finding the first register in the class
147      and by finding the smallest power of two that is a valid offset from
148      that register in every mode we will use to save registers.  */
149
150   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
151     if (TEST_HARD_REG_BIT (reg_class_contents[(int) BASE_REG_CLASS], i))
152       break;
153
154   if (i == FIRST_PSEUDO_REGISTER)
155     abort ();
156
157   addr_reg = gen_rtx_REG (Pmode, i);
158
159   for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
160     {
161       address = gen_rtx_PLUS (Pmode, addr_reg, GEN_INT (offset));
162
163       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
164         if (regno_save_mode[i][1] != VOIDmode
165           && ! strict_memory_address_p (regno_save_mode[i][1], address))
166           break;
167
168       if (i == FIRST_PSEUDO_REGISTER)
169         break;
170     }
171
172   /* If we didn't find a valid address, we must use register indirect.  */
173   if (offset == 0)
174     address = addr_reg;
175
176   /* Next we try to form an insn to save and restore the register.  We
177      see if such an insn is recognized and meets its constraints.  */
178
179   start_sequence ();
180
181   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
182     for (j = 1; j <= MOVE_MAX_WORDS; j++)
183       if (regno_save_mode[i][j] != VOIDmode)
184         {
185           rtx mem = gen_rtx_MEM (regno_save_mode[i][j], address);
186           rtx reg = gen_rtx_REG (regno_save_mode[i][j], i);
187           rtx savepat = gen_rtx_SET (VOIDmode, mem, reg);
188           rtx restpat = gen_rtx_SET (VOIDmode, reg, mem);
189           rtx saveinsn = emit_insn (savepat);
190           rtx restinsn = emit_insn (restpat);
191           int ok;
192
193           reg_save_code[i][j] = recog_memoized (saveinsn);
194           reg_restore_code[i][j] = recog_memoized (restinsn);
195
196           /* Now extract both insns and see if we can meet their
197              constraints.  */
198           ok = (reg_save_code[i][j] != (enum insn_code)-1
199                 && reg_restore_code[i][j] != (enum insn_code)-1);
200           if (ok)
201             {
202               extract_insn (saveinsn);
203               ok = constrain_operands (1);
204               extract_insn (restinsn);
205               ok &= constrain_operands (1);
206             }
207
208           if (! ok)
209             {
210               regno_save_mode[i][j] = VOIDmode;
211               if (j == 1)
212                 {
213                   call_fixed_regs[i] = 1;
214                   SET_HARD_REG_BIT (call_fixed_reg_set, i);
215                 }
216             }
217       }
218
219   end_sequence ();
220 }
221 \f
222 /* Initialize save areas by showing that we haven't allocated any yet.  */
223
224 void
225 init_save_areas ()
226 {
227   int i, j;
228
229   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
230     for (j = 1; j <= MOVE_MAX_WORDS; j++)
231       regno_save_mem[i][j] = 0;
232 }
233
234 /* Allocate save areas for any hard registers that might need saving.
235    We take a conservative approach here and look for call-clobbered hard
236    registers that are assigned to pseudos that cross calls.  This may
237    overestimate slightly (especially if some of these registers are later
238    used as spill registers), but it should not be significant.
239
240    Future work:
241
242      In the fallback case we should iterate backwards across all possible
243      modes for the save, choosing the largest available one instead of 
244      falling back to the smallest mode immediately.  (eg TF -> DF -> SF).
245
246      We do not try to use "move multiple" instructions that exist
247      on some machines (such as the 68k moveml).  It could be a win to try 
248      and use them when possible.  The hard part is doing it in a way that is
249      machine independent since they might be saving non-consecutive 
250      registers. (imagine caller-saving d0,d1,a0,a1 on the 68k) */
251
252 void
253 setup_save_areas ()
254 {
255   int i, j, k;
256   unsigned int r;
257   HARD_REG_SET hard_regs_used;
258
259   /* Allocate space in the save area for the largest multi-register
260      pseudos first, then work backwards to single register
261      pseudos.  */
262
263   /* Find and record all call-used hard-registers in this function.  */
264   CLEAR_HARD_REG_SET (hard_regs_used);
265   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
266     if (reg_renumber[i] >= 0 && REG_N_CALLS_CROSSED (i) > 0)
267       {
268         unsigned int regno = reg_renumber[i];
269         unsigned int endregno 
270           = regno + HARD_REGNO_NREGS (regno, GET_MODE (regno_reg_rtx[i]));
271
272         for (r = regno; r < endregno; r++)
273           if (call_used_regs[r])
274             SET_HARD_REG_BIT (hard_regs_used, r);
275       }
276
277   /* Now run through all the call-used hard-registers and allocate
278      space for them in the caller-save area.  Try to allocate space
279      in a manner which allows multi-register saves/restores to be done.  */
280
281   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
282     for (j = MOVE_MAX_WORDS; j > 0; j--)
283       {
284         int do_save = 1;
285
286         /* If no mode exists for this size, try another.  Also break out
287            if we have already saved this hard register.  */
288         if (regno_save_mode[i][j] == VOIDmode || regno_save_mem[i][1] != 0)
289           continue;
290
291         /* See if any register in this group has been saved.  */
292         for (k = 0; k < j; k++)
293           if (regno_save_mem[i + k][1])
294             {
295               do_save = 0;
296               break;
297             }
298         if (! do_save)
299           continue;
300
301         for (k = 0; k < j; k++)
302           if (! TEST_HARD_REG_BIT (hard_regs_used, i + k))
303             {
304               do_save = 0;
305               break;
306             }
307         if (! do_save)
308           continue;
309
310         /* We have found an acceptable mode to store in.  */
311         regno_save_mem[i][j]
312           = assign_stack_local (regno_save_mode[i][j],
313                                 GET_MODE_SIZE (regno_save_mode[i][j]), 0);
314
315         /* Setup single word save area just in case...  */
316         for (k = 0; k < j; k++)
317           {
318             /* This should not depend on WORDS_BIG_ENDIAN.
319                The order of words in regs is the same as in memory.  */
320             rtx temp = gen_rtx_MEM (regno_save_mode[i + k][1], 
321                                     XEXP (regno_save_mem[i][j], 0));
322
323             regno_save_mem[i + k][1] 
324               = adj_offsettable_operand (temp, k * UNITS_PER_WORD);
325           }
326       }
327
328   /* Now loop again and set the alias set of any save areas we made to
329      the alias set used to represent frame objects.  */
330   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
331     for (j = MOVE_MAX_WORDS; j > 0; j--)
332       if (regno_save_mem[i][j] != 0)
333         MEM_ALIAS_SET (regno_save_mem[i][j]) = get_frame_alias_set ();
334 }
335 \f
336 /* Find the places where hard regs are live across calls and save them.  */
337
338 void
339 save_call_clobbered_regs ()
340 {
341   struct insn_chain *chain, *next;
342
343   CLEAR_HARD_REG_SET (hard_regs_saved);
344   n_regs_saved = 0;
345
346   for (chain = reload_insn_chain; chain != 0; chain = next)
347     {
348       rtx insn = chain->insn;
349       enum rtx_code code = GET_CODE (insn);
350
351       next = chain->next;
352
353       if (chain->is_caller_save_insn)
354         abort ();
355
356       if (GET_RTX_CLASS (code) == 'i')
357         {
358           /* If some registers have been saved, see if INSN references
359              any of them.  We must restore them before the insn if so.  */
360
361           if (n_regs_saved)
362             {
363               int regno;
364
365               if (code == JUMP_INSN)
366                 /* Restore all registers if this is a JUMP_INSN.  */
367                 COPY_HARD_REG_SET (referenced_regs, hard_regs_saved);
368               else
369                 {
370                   CLEAR_HARD_REG_SET (referenced_regs);
371                   mark_referenced_regs (PATTERN (insn));
372                   AND_HARD_REG_SET (referenced_regs, hard_regs_saved);
373                 }
374
375               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
376                 if (TEST_HARD_REG_BIT (referenced_regs, regno))
377                   regno += insert_restore (chain, 1, regno, MOVE_MAX_WORDS);
378             }
379
380           if (code == CALL_INSN)
381             {
382               int regno;
383               HARD_REG_SET hard_regs_to_save;
384
385               /* Use the register life information in CHAIN to compute which
386                  regs are live during the call.  */
387               REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
388                                        &chain->live_throughout);
389               compute_use_by_pseudos (&hard_regs_to_save,
390                                       &chain->live_throughout);
391
392               /* Record all registers set in this call insn.  These don't need
393                  to be saved.  N.B. the call insn might set a subreg of a
394                  multi-hard-reg pseudo; then the pseudo is considered live
395                  during the call, but the subreg that is set isn't.  */
396               CLEAR_HARD_REG_SET (this_insn_sets);
397               note_stores (PATTERN (insn), mark_set_regs, NULL);
398
399               /* Compute which hard regs must be saved before this call.  */
400               AND_COMPL_HARD_REG_SET (hard_regs_to_save, call_fixed_reg_set);
401               AND_COMPL_HARD_REG_SET (hard_regs_to_save, this_insn_sets);
402               AND_COMPL_HARD_REG_SET (hard_regs_to_save, hard_regs_saved);
403               AND_HARD_REG_SET (hard_regs_to_save, call_used_reg_set);
404
405               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
406                 if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
407                   regno += insert_save (chain, 1, regno, &hard_regs_to_save);
408
409               /* Must recompute n_regs_saved.  */
410               n_regs_saved = 0;
411               for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
412                 if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
413                   n_regs_saved++;
414             }
415         }
416
417       if (chain->next == 0 || chain->next->block > chain->block)
418         {
419           int regno;
420           /* At the end of the basic block, we must restore any registers that
421              remain saved.  If the last insn in the block is a JUMP_INSN, put
422              the restore before the insn, otherwise, put it after the insn.  */
423
424           if (n_regs_saved)
425             for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
426               if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
427                 regno += insert_restore (chain, GET_CODE (insn) == JUMP_INSN,
428                                          regno, MOVE_MAX_WORDS);
429         }
430     }  
431 }
432
433 /* Here from note_stores when an insn stores a value in a register.
434    Set the proper bit or bits in this_insn_sets.  All pseudos that have
435    been assigned hard regs have had their register number changed already,
436    so we can ignore pseudos.  */
437 static void
438 mark_set_regs (reg, setter, data)
439      rtx reg;
440      rtx setter ATTRIBUTE_UNUSED;
441      void *data ATTRIBUTE_UNUSED;
442 {
443   register int regno, endregno, i;
444   enum machine_mode mode = GET_MODE (reg);
445   int word = 0;
446
447   if (GET_CODE (reg) == SUBREG)
448     {
449       word = SUBREG_WORD (reg);
450       reg = SUBREG_REG (reg);
451     }
452
453   if (GET_CODE (reg) != REG || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
454     return;
455
456   regno = REGNO (reg) + word;
457   endregno = regno + HARD_REGNO_NREGS (regno, mode);
458
459   for (i = regno; i < endregno; i++)
460     SET_HARD_REG_BIT (this_insn_sets, i);
461 }
462
463 /* Here from note_stores when an insn stores a value in a register.
464    Set the proper bit or bits in the passed regset.  All pseudos that have
465    been assigned hard regs have had their register number changed already,
466    so we can ignore pseudos.  */
467 static void
468 add_stored_regs (reg, setter, data)
469      rtx reg;
470      rtx setter;
471      void *data;
472 {
473   register int regno, endregno, i;
474   enum machine_mode mode = GET_MODE (reg);
475   int word = 0;
476
477   if (GET_CODE (setter) == CLOBBER)
478     return;
479
480   while (GET_CODE (reg) == SUBREG)
481     {
482       word += SUBREG_WORD (reg);
483       reg = SUBREG_REG (reg);
484     }
485
486   if (GET_CODE (reg) != REG || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
487     return;
488
489   regno = REGNO (reg) + word;
490   endregno = regno + HARD_REGNO_NREGS (regno, mode);
491
492   for (i = regno; i < endregno; i++)
493     SET_REGNO_REG_SET ((regset) data, i);
494 }
495
496 /* Walk X and record all referenced registers in REFERENCED_REGS.  */
497 static void
498 mark_referenced_regs (x)
499      rtx x;
500 {
501   enum rtx_code code = GET_CODE (x);
502   const char *fmt;
503   int i, j;
504
505   if (code == SET)
506     mark_referenced_regs (SET_SRC (x));
507   if (code == SET || code == CLOBBER)
508     {
509       x = SET_DEST (x);
510       code = GET_CODE (x);
511       if (code == REG || code == PC || code == CC0
512           || (code == SUBREG && GET_CODE (SUBREG_REG (x)) == REG
513               /* If we're setting only part of a multi-word register,
514                  we shall mark it as referenced, because the words
515                  that are not being set should be restored.  */
516               && ((GET_MODE_SIZE (GET_MODE (x))
517                    >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
518                   || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
519                       <= UNITS_PER_WORD))))
520         return;
521     }
522   if (code == MEM || code == SUBREG)
523     {
524       x = XEXP (x, 0);
525       code = GET_CODE (x);
526     }
527
528   if (code == REG)
529     {
530       int regno = REGNO (x);
531       int hardregno = (regno < FIRST_PSEUDO_REGISTER ? regno
532                        : reg_renumber[regno]);
533
534       if (hardregno >= 0)
535         {
536           int nregs = HARD_REGNO_NREGS (hardregno, GET_MODE (x));
537           while (nregs-- > 0)
538             SET_HARD_REG_BIT (referenced_regs, hardregno + nregs);
539         }
540       /* If this is a pseudo that did not get a hard register, scan its
541          memory location, since it might involve the use of another
542          register, which might be saved.  */
543       else if (reg_equiv_mem[regno] != 0)
544         mark_referenced_regs (XEXP (reg_equiv_mem[regno], 0));
545       else if (reg_equiv_address[regno] != 0)
546         mark_referenced_regs (reg_equiv_address[regno]);
547       return;
548     }
549
550   fmt = GET_RTX_FORMAT (code);
551   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
552     {
553       if (fmt[i] == 'e')
554         mark_referenced_regs (XEXP (x, i));
555       else if (fmt[i] == 'E')
556         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
557           mark_referenced_regs (XVECEXP (x, i, j));
558     }
559 }
560 \f
561 /* Insert a sequence of insns to restore.  Place these insns in front of
562    CHAIN if BEFORE_P is nonzero, behind the insn otherwise.  MAXRESTORE is
563    the maximum number of registers which should be restored during this call.
564    It should never be less than 1 since we only work with entire registers.
565
566    Note that we have verified in init_caller_save that we can do this
567    with a simple SET, so use it.  Set INSN_CODE to what we save there
568    since the address might not be valid so the insn might not be recognized.
569    These insns will be reloaded and have register elimination done by
570    find_reload, so we need not worry about that here.
571
572    Return the extra number of registers saved.  */
573
574 static int
575 insert_restore (chain, before_p, regno, maxrestore)
576      struct insn_chain *chain;
577      int before_p;
578      int regno;
579      int maxrestore;
580 {
581   int i, k;
582   rtx pat = NULL_RTX;
583   enum insn_code code = CODE_FOR_nothing;
584   int numregs = 0;
585   struct insn_chain *new;
586
587   /* A common failure mode if register status is not correct in the RTL
588      is for this routine to be called with a REGNO we didn't expect to
589      save.  That will cause us to write an insn with a (nil) SET_DEST
590      or SET_SRC.  Instead of doing so and causing a crash later, check
591      for this common case and abort here instead.  This will remove one
592      step in debugging such problems.  */
593
594   if (regno_save_mem[regno][1] == 0)
595     abort ();
596
597   /* Get the pattern to emit and update our status.
598
599      See if we can restore `maxrestore' registers at once.  Work
600      backwards to the single register case.  */
601   for (i = maxrestore; i > 0; i--)
602     {
603       int j;
604       int ok = 1;
605
606       if (regno_save_mem[regno][i] == 0)
607         continue;
608
609       for (j = 0; j < i; j++)
610         if (! TEST_HARD_REG_BIT (hard_regs_saved, regno + j))
611           {
612             ok = 0;
613             break;
614           }
615       /* Must do this one restore at a time */
616       if (! ok)
617         continue;
618
619       numregs = i;
620       break;
621     }
622
623   pat = gen_rtx_SET (VOIDmode,
624                      gen_rtx_REG (GET_MODE (regno_save_mem[regno][numregs]), 
625                                   regno), 
626                      regno_save_mem[regno][numregs]);
627   code = reg_restore_code[regno][numregs];
628   new = insert_one_insn (chain, before_p, code, pat);
629
630   /* Clear status for all registers we restored.  */
631   for (k = 0; k < i; k++)
632     {
633       CLEAR_HARD_REG_BIT (hard_regs_saved, regno + k);
634       SET_REGNO_REG_SET (&new->dead_or_set, regno + k);
635       n_regs_saved--;
636     }
637
638
639
640   /* Tell our callers how many extra registers we saved/restored */
641   return numregs - 1;
642 }
643
644 /* Like insert_restore above, but save registers instead.  */
645 static int
646 insert_save (chain, before_p, regno, to_save)
647      struct insn_chain *chain;
648      int before_p;
649      int regno;
650      HARD_REG_SET *to_save;
651 {
652   int i, k;
653   rtx pat = NULL_RTX;
654   enum insn_code code = CODE_FOR_nothing;
655   int numregs = 0;
656   struct insn_chain *new;
657
658   /* A common failure mode if register status is not correct in the RTL
659      is for this routine to be called with a REGNO we didn't expect to
660      save.  That will cause us to write an insn with a (nil) SET_DEST
661      or SET_SRC.  Instead of doing so and causing a crash later, check
662      for this common case and abort here instead.  This will remove one
663      step in debugging such problems.  */
664
665   if (regno_save_mem[regno][1] == 0)
666     abort ();
667
668   /* Get the pattern to emit and update our status.
669
670      See if we can save several registers with a single instruction.  
671      Work backwards to the single register case.  */
672   for (i = MOVE_MAX_WORDS; i > 0; i--)
673     {
674       int j;
675       int ok = 1;
676       if (regno_save_mem[regno][i] == 0)
677         continue;
678
679       for (j = 0; j < i; j++)
680         if (! TEST_HARD_REG_BIT (*to_save, regno + j))
681           {
682             ok = 0;
683             break;
684           }
685       /* Must do this one save at a time */
686       if (! ok)
687         continue;
688
689       numregs = i;
690       break;
691     }
692
693   pat = gen_rtx_SET (VOIDmode, regno_save_mem[regno][numregs],
694                      gen_rtx_REG (GET_MODE (regno_save_mem[regno][numregs]),
695                                   regno));
696   code = reg_save_code[regno][numregs];
697   new = insert_one_insn (chain, before_p, code, pat);
698
699   /* Set hard_regs_saved and dead_or_set for all the registers we saved.  */
700   for (k = 0; k < numregs; k++)
701     {
702       SET_HARD_REG_BIT (hard_regs_saved, regno + k);
703       SET_REGNO_REG_SET (&new->dead_or_set, regno + k);
704       n_regs_saved++;
705     }
706
707   /* Tell our callers how many extra registers we saved/restored */
708   return numregs - 1;
709 }
710
711 /* Emit a new caller-save insn and set the code.  */
712 static struct insn_chain *
713 insert_one_insn (chain, before_p, code, pat)
714      struct insn_chain *chain;
715      int before_p;
716      enum insn_code code;
717      rtx pat;
718 {
719   rtx insn = chain->insn;
720   struct insn_chain *new;
721   
722 #ifdef HAVE_cc0
723   /* If INSN references CC0, put our insns in front of the insn that sets
724      CC0.  This is always safe, since the only way we could be passed an
725      insn that references CC0 is for a restore, and doing a restore earlier
726      isn't a problem.  We do, however, assume here that CALL_INSNs don't
727      reference CC0.  Guard against non-INSN's like CODE_LABEL.  */
728
729   if ((GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN)
730       && before_p
731       && reg_referenced_p (cc0_rtx, PATTERN (insn)))
732     chain = chain->prev, insn = chain->insn;
733 #endif
734
735   new = new_insn_chain ();
736   if (before_p)
737     {
738       rtx link;
739
740       new->prev = chain->prev;
741       if (new->prev != 0)
742         new->prev->next = new;
743       else
744         reload_insn_chain = new;
745
746       chain->prev = new;
747       new->next = chain;
748       new->insn = emit_insn_before (pat, insn);
749       /* ??? It would be nice if we could exclude the already / still saved
750          registers from the live sets.  */
751       COPY_REG_SET (&new->live_throughout, &chain->live_throughout);
752       /* Registers that die in CHAIN->INSN still live in the new insn.  */
753       for (link = REG_NOTES (chain->insn); link; link = XEXP (link, 1))
754         {
755           if (REG_NOTE_KIND (link) == REG_DEAD)
756             {
757               rtx reg = XEXP (link, 0);
758               int regno, i;
759
760               if (GET_CODE (reg) != REG)
761                 abort ();
762
763               regno = REGNO (reg);
764               if (regno >= FIRST_PSEUDO_REGISTER)
765                 regno = reg_renumber[regno];
766               if (regno < 0)
767                 continue;
768               for (i = HARD_REGNO_NREGS (regno, GET_MODE (reg)) - 1;
769                    i >= 0; i--)
770                 SET_REGNO_REG_SET (&new->live_throughout, regno + i);
771             }
772         }
773       CLEAR_REG_SET (&new->dead_or_set);
774       if (chain->insn == BLOCK_HEAD (chain->block))
775         BLOCK_HEAD (chain->block) = new->insn;
776     }
777   else
778     {
779       new->next = chain->next;
780       if (new->next != 0)
781         new->next->prev = new;
782       chain->next = new;
783       new->prev = chain;
784       new->insn = emit_insn_after (pat, insn);
785       /* ??? It would be nice if we could exclude the already / still saved
786          registers from the live sets, and observe REG_UNUSED notes.  */
787       COPY_REG_SET (&new->live_throughout, &chain->live_throughout);
788       /* Registers that are set in CHAIN->INSN live in the new insn.
789          (Unless there is a REG_UNUSED note for them, but we don't
790           look for them here.) */
791       note_stores (PATTERN (chain->insn), add_stored_regs,
792                    &new->live_throughout);
793       CLEAR_REG_SET (&new->dead_or_set);
794       if (chain->insn == BLOCK_END (chain->block))
795         BLOCK_END (chain->block) = new->insn;
796     }
797   new->block = chain->block;
798   new->is_caller_save_insn = 1;
799
800   INSN_CODE (new->insn) = code;
801   return new;
802 }