OSDN Git Service

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