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