caller-save.c 44.3 KB
Newer Older
Richard Stallman committed
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, 2008, 2009, 2010
4
   Free Software Foundation, Inc.
Richard Stallman committed
5

6
This file is part of GCC.
Richard Stallman committed
7

8 9
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
Richard Stallman committed
12

13 14 15 16
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
Richard Stallman committed
17 18

You should have received a copy of the GNU General Public License
19 20
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Richard Stallman committed
21 22

#include "config.h"
23
#include "system.h"
24 25
#include "coretypes.h"
#include "tm.h"
Richard Stallman committed
26
#include "rtl.h"
27
#include "regs.h"
Richard Stallman committed
28 29 30 31 32
#include "insn-config.h"
#include "flags.h"
#include "hard-reg-set.h"
#include "recog.h"
#include "basic-block.h"
33
#include "df.h"
Richard Stallman committed
34
#include "reload.h"
35
#include "function.h"
Richard Stallman committed
36
#include "expr.h"
37
#include "diagnostic-core.h"
Graham Stott committed
38
#include "toplev.h"
39
#include "tm_p.h"
40
#include "addresses.h"
Vladimir Makarov committed
41
#include "output.h"
42
#include "ggc.h"
Richard Stallman committed
43

44 45
#define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)

46 47
#define regno_save_mode \
  (this_target_reload->x_regno_save_mode)
48 49 50 51
#define cached_reg_save_code \
  (this_target_reload->x_cached_reg_save_code)
#define cached_reg_restore_code \
  (this_target_reload->x_cached_reg_restore_code)
Richard Stallman committed
52 53 54 55

/* For each hard register, a place on the stack where it can be saved,
   if needed.  */

56
static rtx
57
  regno_save_mem[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
Richard Stallman committed
58

Vladimir Makarov committed
59 60 61 62 63 64
/* The number of elements in the subsequent array.  */
static int save_slots_num;

/* Allocated slots so far.  */
static rtx save_slots[FIRST_PSEUDO_REGISTER];

Richard Stallman committed
65 66 67 68
/* Set of hard regs currently residing in save area (during insn scan).  */

static HARD_REG_SET hard_regs_saved;

69
/* Number of registers currently in hard_regs_saved.  */
70

71
static int n_regs_saved;
72

73 74 75
/* Computed by mark_referenced_regs, all regs referenced in a given
   insn.  */
static HARD_REG_SET referenced_regs;
Richard Stallman committed
76

77

78 79 80
typedef void refmarker_fn (rtx *loc, enum machine_mode mode, int hardregno,
			   void *mark_arg);

Vladimir Makarov committed
81 82 83 84 85 86 87 88 89
static int reg_save_code (int, enum machine_mode);
static int reg_restore_code (int, enum machine_mode);

struct saved_hard_reg;
static void initiate_saved_hard_regs (void);
static struct saved_hard_reg *new_saved_hard_reg (int, int);
static void finish_saved_hard_regs (void);
static int saved_hard_reg_compare_func (const void *, const void *);

90
static void mark_set_regs (rtx, const_rtx, void *);
91 92 93
static void mark_referenced_regs (rtx *, refmarker_fn *mark, void *mark_arg);
static refmarker_fn mark_reg_as_referenced;
static refmarker_fn replace_reg_with_saved_mem;
94 95 96 97 98 99
static int insert_save (struct insn_chain *, int, int, HARD_REG_SET *,
			enum machine_mode *);
static int insert_restore (struct insn_chain *, int, int, int,
			   enum machine_mode *);
static struct insn_chain *insert_one_insn (struct insn_chain *, int, int,
					   rtx);
100
static void add_stored_regs (rtx, const_rtx, void *);
Vladimir Makarov committed
101

Richard Stallman committed
102

Vladimir Makarov committed
103

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
static GTY(()) rtx savepat;
static GTY(()) rtx restpat;
static GTY(()) rtx test_reg;
static GTY(()) rtx test_mem;
static GTY(()) rtx saveinsn;
static GTY(()) rtx restinsn;

/* Return the INSN_CODE used to save register REG in mode MODE.  */
static int
reg_save_code (int reg, enum machine_mode mode)
{
  bool ok;
  if (cached_reg_save_code[reg][mode])
     return cached_reg_save_code[reg][mode];
  if (!HARD_REGNO_MODE_OK (reg, mode))
     {
       cached_reg_save_code[reg][mode] = -1;
121
       cached_reg_restore_code[reg][mode] = -1;
122 123 124 125 126
       return -1;
     }

  /* Update the register number and modes of the register
     and memory operand.  */
127
  SET_REGNO_RAW (test_reg, reg);
128 129 130 131 132
  PUT_MODE (test_reg, mode);
  PUT_MODE (test_mem, mode);

  /* Force re-recognition of the modified insns.  */
  INSN_CODE (saveinsn) = -1;
133
  INSN_CODE (restinsn) = -1;
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169

  cached_reg_save_code[reg][mode] = recog_memoized (saveinsn);
  cached_reg_restore_code[reg][mode] = recog_memoized (restinsn);

  /* Now extract both insns and see if we can meet their
     constraints.  */
  ok = (cached_reg_save_code[reg][mode] != -1
	&& cached_reg_restore_code[reg][mode] != -1);
  if (ok)
    {
      extract_insn (saveinsn);
      ok = constrain_operands (1);
      extract_insn (restinsn);
      ok &= constrain_operands (1);
    }

  if (! ok)
    {
      cached_reg_save_code[reg][mode] = -1;
      cached_reg_restore_code[reg][mode] = -1;
    }
  gcc_assert (cached_reg_save_code[reg][mode]);
  return cached_reg_save_code[reg][mode];
}

/* Return the INSN_CODE used to restore register REG in mode MODE.  */
static int
reg_restore_code (int reg, enum machine_mode mode)
{
  if (cached_reg_restore_code[reg][mode])
     return cached_reg_restore_code[reg][mode];
  /* Populate our cache.  */
  reg_save_code (reg, mode);
  return cached_reg_restore_code[reg][mode];
}

Richard Stallman committed
170 171 172
/* Initialize for caller-save.

   Look at all the hard registers that are used by a call and for which
173
   reginfo.c has not already excluded from being used across a call.
Richard Stallman committed
174

175
   Ensure that we can find a mode to save the register and that there is a
Richard Stallman committed
176 177 178 179 180
   simple insn to save and restore the register.  This latter check avoids
   problems that would occur if we tried to save the MQ register of some
   machines directly into memory.  */

void
181
init_caller_save (void)
Richard Stallman committed
182 183 184 185
{
  rtx addr_reg;
  int offset;
  rtx address;
186
  int i, j;
Richard Stallman committed
187

188 189 190 191 192
  if (caller_save_initialized_p)
    return;

  caller_save_initialized_p = true;

Vladimir Makarov committed
193
  CLEAR_HARD_REG_SET (no_caller_save_reg_set);
Richard Stallman committed
194 195 196 197 198 199
  /* First find all the registers that we need to deal with and all
     the modes that they can have.  If we can't find a mode to use,
     we can't have the register live over calls.  */

  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    {
200 201
      if (call_used_regs[i]
          && !TEST_HARD_REG_BIT (call_fixed_reg_set, i))
Richard Stallman committed
202
	{
203
	  for (j = 1; j <= MOVE_MAX_WORDS; j++)
Richard Stallman committed
204
	    {
205 206
	      regno_save_mode[i][j] = HARD_REGNO_CALLER_SAVE_MODE (i, j,
								   VOIDmode);
207 208 209 210
	      if (regno_save_mode[i][j] == VOIDmode && j == 1)
		{
		  SET_HARD_REG_BIT (call_fixed_reg_set, i);
		}
Richard Stallman committed
211 212 213
	    }
	}
      else
214
	regno_save_mode[i][1] = VOIDmode;
Richard Stallman committed
215 216 217 218 219 220 221 222 223 224 225 226 227 228
    }

  /* The following code tries to approximate the conditions under which
     we can easily save and restore a register without scratch registers or
     other complexities.  It will usually work, except under conditions where
     the validity of an insn operand is dependent on the address offset.
     No such cases are currently known.

     We first find a typical offset from some BASE_REG_CLASS register.
     This address is chosen by finding the first register in the class
     and by finding the smallest power of two that is a valid offset from
     that register in every mode we will use to save registers.  */

  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
229 230
    if (TEST_HARD_REG_BIT
	(reg_class_contents
Vladimir Makarov committed
231
	 [(int) base_reg_class (regno_save_mode[i][1], PLUS, CONST_INT)], i))
Richard Stallman committed
232 233
      break;

234
  gcc_assert (i < FIRST_PSEUDO_REGISTER);
Richard Stallman committed
235

236
  addr_reg = gen_rtx_REG (Pmode, i);
Richard Stallman committed
237 238 239

  for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
    {
240
      address = gen_rtx_PLUS (Pmode, addr_reg, GEN_INT (offset));
Richard Stallman committed
241 242

      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
243 244
	if (regno_save_mode[i][1] != VOIDmode
	  && ! strict_memory_address_p (regno_save_mode[i][1], address))
Richard Stallman committed
245 246 247 248 249 250 251 252 253 254 255
	  break;

      if (i == FIRST_PSEUDO_REGISTER)
	break;
    }

  /* If we didn't find a valid address, we must use register indirect.  */
  if (offset == 0)
    address = addr_reg;

  /* Next we try to form an insn to save and restore the register.  We
256
     see if such an insn is recognized and meets its constraints.
257 258 259 260 261 262 263 264

     To avoid lots of unnecessary RTL allocation, we construct all the RTL
     once, then modify the memory and register operands in-place.  */

  test_reg = gen_rtx_REG (VOIDmode, 0);
  test_mem = gen_rtx_MEM (VOIDmode, address);
  savepat = gen_rtx_SET (VOIDmode, test_mem, test_reg);
  restpat = gen_rtx_SET (VOIDmode, test_reg, test_mem);
Richard Stallman committed
265

266 267
  saveinsn = gen_rtx_INSN (VOIDmode, 0, 0, 0, 0, savepat, 0, -1, 0);
  restinsn = gen_rtx_INSN (VOIDmode, 0, 0, 0, 0, restpat, 0, -1, 0);
268

Richard Stallman committed
269
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
270
    for (j = 1; j <= MOVE_MAX_WORDS; j++)
271
      if (reg_save_code (i,regno_save_mode[i][j]) == -1)
272 273 274 275 276
	{
	  regno_save_mode[i][j] = VOIDmode;
	  if (j == 1)
	    {
	      SET_HARD_REG_BIT (call_fixed_reg_set, i);
Vladimir Makarov committed
277 278
	      if (call_used_regs[i])
		SET_HARD_REG_BIT (no_caller_save_reg_set, i);
279 280
	    }
	}
Richard Stallman committed
281
}
Vladimir Makarov committed
282

Richard Stallman committed
283

Vladimir Makarov committed
284

Richard Stallman committed
285 286 287
/* Initialize save areas by showing that we haven't allocated any yet.  */

void
288
init_save_areas (void)
Richard Stallman committed
289
{
290
  int i, j;
Richard Stallman committed
291 292

  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
293
    for (j = 1; j <= MOVE_MAX_WORDS; j++)
294
      regno_save_mem[i][j] = 0;
Vladimir Makarov committed
295
  save_slots_num = 0;
H.J. Lu committed
296

Vladimir Makarov committed
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
}

/* The structure represents a hard register which should be saved
   through the call.  It is used when the integrated register
   allocator (IRA) is used and sharing save slots is on.  */
struct saved_hard_reg
{
  /* Order number starting with 0.  */
  int num;
  /* The hard regno.  */
  int hard_regno;
  /* Execution frequency of all calls through which given hard
     register should be saved.  */
  int call_freq;
  /* Stack slot reserved to save the hard register through calls.  */
  rtx slot;
  /* True if it is first hard register in the chain of hard registers
     sharing the same stack slot.  */
  int first_p;
  /* Order number of the next hard register structure with the same
     slot in the chain.  -1 represents end of the chain.  */
  int next;
};

/* Map: hard register number to the corresponding structure.  */
static struct saved_hard_reg *hard_reg_map[FIRST_PSEUDO_REGISTER];

/* The number of all structures representing hard registers should be
   saved, in order words, the number of used elements in the following
   array.  */
static int saved_regs_num;

/* Pointers to all the structures.  Index is the order number of the
   corresponding structure.  */
static struct saved_hard_reg *all_saved_regs[FIRST_PSEUDO_REGISTER];

/* First called function for work with saved hard registers.  */
static void
initiate_saved_hard_regs (void)
{
  int i;

  saved_regs_num = 0;
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    hard_reg_map[i] = NULL;
}

/* Allocate and return new saved hard register with given REGNO and
   CALL_FREQ.  */
static struct saved_hard_reg *
new_saved_hard_reg (int regno, int call_freq)
{
  struct saved_hard_reg *saved_reg;

  saved_reg
    = (struct saved_hard_reg *) xmalloc (sizeof (struct saved_hard_reg));
  hard_reg_map[regno] = all_saved_regs[saved_regs_num] = saved_reg;
  saved_reg->num = saved_regs_num++;
  saved_reg->hard_regno = regno;
  saved_reg->call_freq = call_freq;
  saved_reg->first_p = FALSE;
  saved_reg->next = -1;
  return saved_reg;
}

/* Free memory allocated for the saved hard registers.  */
static void
finish_saved_hard_regs (void)
{
  int i;

  for (i = 0; i < saved_regs_num; i++)
    free (all_saved_regs[i]);
}

/* The function is used to sort the saved hard register structures
   according their frequency.  */
static int
saved_hard_reg_compare_func (const void *v1p, const void *v2p)
{
  const struct saved_hard_reg *p1 = *(struct saved_hard_reg * const *) v1p;
  const struct saved_hard_reg *p2 = *(struct saved_hard_reg * const *) v2p;
H.J. Lu committed
379

Vladimir Makarov committed
380 381 382 383 384 385 386 387 388
  if (flag_omit_frame_pointer)
    {
      if (p1->call_freq - p2->call_freq != 0)
	return p1->call_freq - p2->call_freq;
    }
  else if (p2->call_freq - p1->call_freq != 0)
    return p2->call_freq - p1->call_freq;

  return p1->num - p2->num;
Richard Stallman committed
389 390 391 392 393 394 395 396
}

/* Allocate save areas for any hard registers that might need saving.
   We take a conservative approach here and look for call-clobbered hard
   registers that are assigned to pseudos that cross calls.  This may
   overestimate slightly (especially if some of these registers are later
   used as spill registers), but it should not be significant.

Vladimir Makarov committed
397 398 399 400
   For IRA we use priority coloring to decrease stack slots needed for
   saving hard registers through calls.  We build conflicts for them
   to do coloring.

401 402 403
   Future work:

     In the fallback case we should iterate backwards across all possible
404
     modes for the save, choosing the largest available one instead of
405 406 407
     falling back to the smallest mode immediately.  (eg TF -> DF -> SF).

     We do not try to use "move multiple" instructions that exist
408
     on some machines (such as the 68k moveml).  It could be a win to try
409
     and use them when possible.  The hard part is doing it in a way that is
410
     machine independent since they might be saving non-consecutive
411
     registers. (imagine caller-saving d0,d1,a0,a1 on the 68k) */
Richard Stallman committed
412

413
void
414
setup_save_areas (void)
Richard Stallman committed
415
{
416
  int i, j, k;
417
  unsigned int r;
418 419 420 421 422 423 424 425
  HARD_REG_SET hard_regs_used;

  /* Allocate space in the save area for the largest multi-register
     pseudos first, then work backwards to single register
     pseudos.  */

  /* Find and record all call-used hard-registers in this function.  */
  CLEAR_HARD_REG_SET (hard_regs_used);
Richard Stallman committed
426
  for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
427
    if (reg_renumber[i] >= 0 && REG_N_CALLS_CROSSED (i) > 0)
Richard Stallman committed
428
      {
429
	unsigned int regno = reg_renumber[i];
430
	unsigned int endregno
431
	  = end_hard_regno (GET_MODE (regno_reg_rtx[i]), regno);
432 433 434
	for (r = regno; r < endregno; r++)
	  if (call_used_regs[r])
	    SET_HARD_REG_BIT (hard_regs_used, r);
435 436
      }

437
  if (optimize && flag_ira_share_save_slots)
Vladimir Makarov committed
438 439 440 441 442 443 444 445 446 447 448 449 450 451
    {
      rtx insn, slot;
      struct insn_chain *chain, *next;
      char *saved_reg_conflicts;
      unsigned int regno;
      int next_k, freq;
      struct saved_hard_reg *saved_reg, *saved_reg2, *saved_reg3;
      int call_saved_regs_num;
      struct saved_hard_reg *call_saved_regs[FIRST_PSEUDO_REGISTER];
      HARD_REG_SET hard_regs_to_save, used_regs, this_insn_sets;
      reg_set_iterator rsi;
      int best_slot_num;
      int prev_save_slots_num;
      rtx prev_save_slots[FIRST_PSEUDO_REGISTER];
H.J. Lu committed
452

Vladimir Makarov committed
453 454 455 456 457 458
      initiate_saved_hard_regs ();
      /* Create hard reg saved regs.  */
      for (chain = reload_insn_chain; chain != 0; chain = next)
	{
	  insn = chain->insn;
	  next = chain->next;
Shujing Zhao committed
459
	  if (!CALL_P (insn)
Vladimir Makarov committed
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491
	      || find_reg_note (insn, REG_NORETURN, NULL))
	    continue;
	  freq = REG_FREQ_FROM_BB (BLOCK_FOR_INSN (insn));
	  REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
				   &chain->live_throughout);
	  COPY_HARD_REG_SET (used_regs, call_used_reg_set);

	  /* Record all registers set in this call insn.  These don't
	     need to be saved.  N.B. the call insn might set a subreg
	     of a multi-hard-reg pseudo; then the pseudo is considered
	     live during the call, but the subreg that is set
	     isn't.  */
	  CLEAR_HARD_REG_SET (this_insn_sets);
	  note_stores (PATTERN (insn), mark_set_regs, &this_insn_sets);
	  /* Sibcalls are considered to set the return value.  */
	  if (SIBLING_CALL_P (insn) && crtl->return_rtx)
	    mark_set_regs (crtl->return_rtx, NULL_RTX, &this_insn_sets);

	  AND_COMPL_HARD_REG_SET (used_regs, call_fixed_reg_set);
	  AND_COMPL_HARD_REG_SET (used_regs, this_insn_sets);
	  AND_HARD_REG_SET (hard_regs_to_save, used_regs);
	  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
	    if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
	      {
		if (hard_reg_map[regno] != NULL)
		  hard_reg_map[regno]->call_freq += freq;
		else
		  saved_reg = new_saved_hard_reg (regno, freq);
	      }
	  /* Look through all live pseudos, mark their hard registers.  */
	  EXECUTE_IF_SET_IN_REG_SET
	    (&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
492
	    {
Vladimir Makarov committed
493 494
	      int r = reg_renumber[regno];
	      int bound;
H.J. Lu committed
495

Vladimir Makarov committed
496 497
	      if (r < 0)
		continue;
H.J. Lu committed
498

Vladimir Makarov committed
499 500 501 502 503 504 505 506 507 508
	      bound = r + hard_regno_nregs[r][PSEUDO_REGNO_MODE (regno)];
	      for (; r < bound; r++)
		if (TEST_HARD_REG_BIT (used_regs, r))
		  {
		    if (hard_reg_map[r] != NULL)
		      hard_reg_map[r]->call_freq += freq;
		    else
		      saved_reg = new_saved_hard_reg (r, freq);
		    SET_HARD_REG_BIT (hard_regs_to_save, r);
		  }
509
	    }
Vladimir Makarov committed
510 511 512 513 514 515 516 517 518
	}
      /* Find saved hard register conflicts.  */
      saved_reg_conflicts = (char *) xmalloc (saved_regs_num * saved_regs_num);
      memset (saved_reg_conflicts, 0, saved_regs_num * saved_regs_num);
      for (chain = reload_insn_chain; chain != 0; chain = next)
	{
	  call_saved_regs_num = 0;
	  insn = chain->insn;
	  next = chain->next;
Shujing Zhao committed
519
	  if (!CALL_P (insn)
Vladimir Makarov committed
520 521 522 523 524 525 526 527 528 529 530 531 532 533
	      || find_reg_note (insn, REG_NORETURN, NULL))
	    continue;
	  REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
				   &chain->live_throughout);
	  COPY_HARD_REG_SET (used_regs, call_used_reg_set);

	  /* Record all registers set in this call insn.  These don't
	     need to be saved.  N.B. the call insn might set a subreg
	     of a multi-hard-reg pseudo; then the pseudo is considered
	     live during the call, but the subreg that is set
	     isn't.  */
	  CLEAR_HARD_REG_SET (this_insn_sets);
	  note_stores (PATTERN (insn), mark_set_regs, &this_insn_sets);
	  /* Sibcalls are considered to set the return value,
534
	     compare df-scan.c:df_get_call_refs.  */
Vladimir Makarov committed
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
	  if (SIBLING_CALL_P (insn) && crtl->return_rtx)
	    mark_set_regs (crtl->return_rtx, NULL_RTX, &this_insn_sets);

	  AND_COMPL_HARD_REG_SET (used_regs, call_fixed_reg_set);
	  AND_COMPL_HARD_REG_SET (used_regs, this_insn_sets);
	  AND_HARD_REG_SET (hard_regs_to_save, used_regs);
	  for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
	    if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
	      {
		gcc_assert (hard_reg_map[regno] != NULL);
		call_saved_regs[call_saved_regs_num++] = hard_reg_map[regno];
	      }
	  /* Look through all live pseudos, mark their hard registers.  */
	  EXECUTE_IF_SET_IN_REG_SET
	    (&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
Richard Stallman committed
550
	    {
Vladimir Makarov committed
551 552
	      int r = reg_renumber[regno];
	      int bound;
H.J. Lu committed
553

Vladimir Makarov committed
554 555 556 557 558 559 560
	      if (r < 0)
		continue;

	      bound = r + hard_regno_nregs[r][PSEUDO_REGNO_MODE (regno)];
	      for (; r < bound; r++)
		if (TEST_HARD_REG_BIT (used_regs, r))
		  call_saved_regs[call_saved_regs_num++] = hard_reg_map[r];
Richard Stallman committed
561
	    }
Vladimir Makarov committed
562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
	  for (i = 0; i < call_saved_regs_num; i++)
	    {
	      saved_reg = call_saved_regs[i];
	      for (j = 0; j < call_saved_regs_num; j++)
		if (i != j)
		  {
		    saved_reg2 = call_saved_regs[j];
		    saved_reg_conflicts[saved_reg->num * saved_regs_num
					+ saved_reg2->num]
		      = saved_reg_conflicts[saved_reg2->num * saved_regs_num
					    + saved_reg->num]
		      = TRUE;
		  }
	    }
	}
      /* Sort saved hard regs.  */
      qsort (all_saved_regs, saved_regs_num, sizeof (struct saved_hard_reg *),
	     saved_hard_reg_compare_func);
      /* Initiate slots available from the previous reload
	 iteration.  */
      prev_save_slots_num = save_slots_num;
      memcpy (prev_save_slots, save_slots, save_slots_num * sizeof (rtx));
      save_slots_num = 0;
      /* Allocate stack slots for the saved hard registers.  */
      for (i = 0; i < saved_regs_num; i++)
	{
	  saved_reg = all_saved_regs[i];
	  regno = saved_reg->hard_regno;
	  for (j = 0; j < i; j++)
	    {
	      saved_reg2 = all_saved_regs[j];
	      if (! saved_reg2->first_p)
		continue;
	      slot = saved_reg2->slot;
	      for (k = j; k >= 0; k = next_k)
		{
		  saved_reg3 = all_saved_regs[k];
		  next_k = saved_reg3->next;
		  if (saved_reg_conflicts[saved_reg->num * saved_regs_num
					  + saved_reg3->num])
		    break;
		}
	      if (k < 0
		  && (GET_MODE_SIZE (regno_save_mode[regno][1])
		      <= GET_MODE_SIZE (regno_save_mode
					[saved_reg2->hard_regno][1])))
		{
		  saved_reg->slot
		    = adjust_address_nv
		      (slot, regno_save_mode[saved_reg->hard_regno][1], 0);
		  regno_save_mem[regno][1] = saved_reg->slot;
		  saved_reg->next = saved_reg2->next;
		  saved_reg2->next = i;
		  if (dump_file != NULL)
		    fprintf (dump_file, "%d uses slot of %d\n",
			     regno, saved_reg2->hard_regno);
		  break;
		}
	    }
	  if (j == i)
	    {
	      saved_reg->first_p = TRUE;
	      for (best_slot_num = -1, j = 0; j < prev_save_slots_num; j++)
		{
		  slot = prev_save_slots[j];
		  if (slot == NULL_RTX)
		    continue;
		  if (GET_MODE_SIZE (regno_save_mode[regno][1])
		      <= GET_MODE_SIZE (GET_MODE (slot))
		      && best_slot_num < 0)
		    best_slot_num = j;
		  if (GET_MODE (slot) == regno_save_mode[regno][1])
		    break;
		}
	      if (best_slot_num >= 0)
		{
		  saved_reg->slot = prev_save_slots[best_slot_num];
		  saved_reg->slot
		    = adjust_address_nv
		      (saved_reg->slot,
		       regno_save_mode[saved_reg->hard_regno][1], 0);
		  if (dump_file != NULL)
		    fprintf (dump_file,
			     "%d uses a slot from prev iteration\n", regno);
		  prev_save_slots[best_slot_num] = NULL_RTX;
		  if (best_slot_num + 1 == prev_save_slots_num)
		    prev_save_slots_num--;
		}
	      else
		{
		  saved_reg->slot
		    = assign_stack_local_1
		      (regno_save_mode[regno][1],
		       GET_MODE_SIZE (regno_save_mode[regno][1]), 0, true);
		  if (dump_file != NULL)
		    fprintf (dump_file, "%d uses a new slot\n", regno);
		}
	      regno_save_mem[regno][1] = saved_reg->slot;
	      save_slots[save_slots_num++] = saved_reg->slot;
	    }
	}
      free (saved_reg_conflicts);
      finish_saved_hard_regs ();
    }
  else
    {
      /* Now run through all the call-used hard-registers and allocate
	 space for them in the caller-save area.  Try to allocate space
	 in a manner which allows multi-register saves/restores to be done.  */
H.J. Lu committed
671

Vladimir Makarov committed
672 673 674 675
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
	for (j = MOVE_MAX_WORDS; j > 0; j--)
	  {
	    int do_save = 1;
H.J. Lu committed
676

Vladimir Makarov committed
677 678 679 680
	    /* If no mode exists for this size, try another.  Also break out
	       if we have already saved this hard register.  */
	    if (regno_save_mode[i][j] == VOIDmode || regno_save_mem[i][1] != 0)
	      continue;
H.J. Lu committed
681

Vladimir Makarov committed
682 683 684 685 686 687 688 689 690
	    /* See if any register in this group has been saved.  */
	    for (k = 0; k < j; k++)
	      if (regno_save_mem[i + k][1])
		{
		  do_save = 0;
		  break;
		}
	    if (! do_save)
	      continue;
H.J. Lu committed
691

Vladimir Makarov committed
692 693 694 695 696 697 698 699
	    for (k = 0; k < j; k++)
	      if (! TEST_HARD_REG_BIT (hard_regs_used, i + k))
		{
		  do_save = 0;
		  break;
		}
	    if (! do_save)
	      continue;
H.J. Lu committed
700

Vladimir Makarov committed
701 702 703 704 705 706 707 708 709 710 711
	    /* We have found an acceptable mode to store in.  Since
	       hard register is always saved in the widest mode
	       available, the mode may be wider than necessary, it is
	       OK to reduce the alignment of spill space.  We will
	       verify that it is equal to or greater than required
	       when we restore and save the hard register in
	       insert_restore and insert_save.  */
	    regno_save_mem[i][j]
	      = assign_stack_local_1 (regno_save_mode[i][j],
				      GET_MODE_SIZE (regno_save_mode[i][j]),
				      0, true);
H.J. Lu committed
712

Vladimir Makarov committed
713 714 715 716 717 718 719 720 721 722
	    /* Setup single word save area just in case...  */
	    for (k = 0; k < j; k++)
	      /* This should not depend on WORDS_BIG_ENDIAN.
		 The order of words in regs is the same as in memory.  */
	      regno_save_mem[i + k][1]
		= adjust_address_nv (regno_save_mem[i][j],
				     regno_save_mode[i + k][1],
				     k * UNITS_PER_WORD);
	  }
    }
723 724 725 726 727 728

  /* Now loop again and set the alias set of any save areas we made to
     the alias set used to represent frame objects.  */
  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
    for (j = MOVE_MAX_WORDS; j > 0; j--)
      if (regno_save_mem[i][j] != 0)
729
	set_mem_alias_set (regno_save_mem[i][j], get_frame_alias_set ());
Richard Stallman committed
730
}
Vladimir Makarov committed
731

Richard Stallman committed
732

Vladimir Makarov committed
733

734
/* Find the places where hard regs are live across calls and save them.  */
735

Richard Stallman committed
736
void
737
save_call_clobbered_regs (void)
Richard Stallman committed
738
{
739
  struct insn_chain *chain, *next, *last = NULL;
740
  enum machine_mode save_mode [FIRST_PSEUDO_REGISTER];
741

742 743 744 745
  /* Computed in mark_set_regs, holds all registers set by the current
     instruction.  */
  HARD_REG_SET this_insn_sets;

746 747
  CLEAR_HARD_REG_SET (hard_regs_saved);
  n_regs_saved = 0;
Richard Stallman committed
748

749
  for (chain = reload_insn_chain; chain != 0; chain = next)
Richard Stallman committed
750
    {
751 752 753 754 755
      rtx insn = chain->insn;
      enum rtx_code code = GET_CODE (insn);

      next = chain->next;

756
      gcc_assert (!chain->is_caller_save_insn);
757

758
      if (NONDEBUG_INSN_P (insn))
Richard Stallman committed
759
	{
760 761
	  /* If some registers have been saved, see if INSN references
	     any of them.  We must restore them before the insn if so.  */
Richard Stallman committed
762

763
	  if (n_regs_saved)
Richard Stallman committed
764
	    {
765
	      int regno;
766
	      HARD_REG_SET this_insn_sets;
767 768 769 770

	      if (code == JUMP_INSN)
		/* Restore all registers if this is a JUMP_INSN.  */
		COPY_HARD_REG_SET (referenced_regs, hard_regs_saved);
771
	      else
772
		{
773
		  CLEAR_HARD_REG_SET (referenced_regs);
774 775
		  mark_referenced_regs (&PATTERN (insn),
					mark_reg_as_referenced, NULL);
776
		  AND_HARD_REG_SET (referenced_regs, hard_regs_saved);
777
		}
Richard Stallman committed
778

779 780
	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (referenced_regs, regno))
781 782 783 784 785 786 787 788 789 790 791
		  regno += insert_restore (chain, 1, regno, MOVE_MAX_WORDS,
					   save_mode);
	      /* If a saved register is set after the call, this means we no
		 longer should restore it.  This can happen when parts of a
		 multi-word pseudo do not conflict with other pseudos, so
		 IRA may allocate the same hard register for both.  One may
		 be live across the call, while the other is set
		 afterwards.  */
	      CLEAR_HARD_REG_SET (this_insn_sets);
	      note_stores (PATTERN (insn), mark_set_regs, &this_insn_sets);
	      AND_COMPL_HARD_REG_SET (hard_regs_saved, this_insn_sets);
Richard Stallman committed
792 793
	    }

794 795 796
	  if (code == CALL_INSN
	      && ! SIBLING_CALL_P (insn)
	      && ! find_reg_note (insn, REG_NORETURN, NULL))
797
	    {
798
	      unsigned regno;
799
	      HARD_REG_SET hard_regs_to_save;
800
	      reg_set_iterator rsi;
801 802

	      /* Use the register life information in CHAIN to compute which
803 804
		 regs are live during the call.  */
	      REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
805
				       &chain->live_throughout);
806
	      /* Save hard registers always in the widest mode available.  */
807 808 809 810 811 812
	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
		  save_mode [regno] = regno_save_mode [regno][1];
		else
		  save_mode [regno] = VOIDmode;

813
	      /* Look through all live pseudos, mark their hard registers
814 815
		 and choose proper mode for saving.  */
	      EXECUTE_IF_SET_IN_REG_SET
816 817 818 819 820 821
		(&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
		{
		  int r = reg_renumber[regno];
		  int nregs;
		  enum machine_mode mode;

Vladimir Makarov committed
822 823
		  if (r < 0)
		    continue;
824 825 826 827 828 829 830 831 832
		  nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (regno)];
		  mode = HARD_REGNO_CALLER_SAVE_MODE
		    (r, nregs, PSEUDO_REGNO_MODE (regno));
		  if (GET_MODE_BITSIZE (mode)
		      > GET_MODE_BITSIZE (save_mode[r]))
		    save_mode[r] = mode;
		  while (nregs-- > 0)
		    SET_HARD_REG_BIT (hard_regs_to_save, r + nregs);
		}
833 834

	      /* Record all registers set in this call insn.  These don't need
835 836 837
		 to be saved.  N.B. the call insn might set a subreg of a
		 multi-hard-reg pseudo; then the pseudo is considered live
		 during the call, but the subreg that is set isn't.  */
838
	      CLEAR_HARD_REG_SET (this_insn_sets);
839
	      note_stores (PATTERN (insn), mark_set_regs, &this_insn_sets);
840 841 842 843 844 845 846 847 848

	      /* Compute which hard regs must be saved before this call.  */
	      AND_COMPL_HARD_REG_SET (hard_regs_to_save, call_fixed_reg_set);
	      AND_COMPL_HARD_REG_SET (hard_regs_to_save, this_insn_sets);
	      AND_COMPL_HARD_REG_SET (hard_regs_to_save, hard_regs_saved);
	      AND_HARD_REG_SET (hard_regs_to_save, call_used_reg_set);

	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
849
		  regno += insert_save (chain, 1, regno, &hard_regs_to_save, save_mode);
850 851 852 853 854 855 856

	      /* Must recompute n_regs_saved.  */
	      n_regs_saved = 0;
	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
		  n_regs_saved++;
	    }
857
          last = chain;
858
	}
859 860 861 862
      else if (DEBUG_INSN_P (insn) && n_regs_saved)
	mark_referenced_regs (&PATTERN (insn),
			      replace_reg_with_saved_mem,
			      save_mode);
Richard Stallman committed
863

Vladimir Makarov committed
864
      if (chain->next == 0 || chain->next->block != chain->block)
865 866 867 868 869 870
	{
	  int regno;
	  /* At the end of the basic block, we must restore any registers that
	     remain saved.  If the last insn in the block is a JUMP_INSN, put
	     the restore before the insn, otherwise, put it after the insn.  */

871 872 873 874
	  if (n_regs_saved
	      && DEBUG_INSN_P (insn)
	      && last
	      && last->block == chain->block)
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903
	    {
	      rtx ins, prev;
	      basic_block bb = BLOCK_FOR_INSN (insn);

	      /* When adding hard reg restores after a DEBUG_INSN, move
		 all notes between last real insn and this DEBUG_INSN after
		 the DEBUG_INSN, otherwise we could get code
		 -g/-g0 differences.  */
	      for (ins = PREV_INSN (insn); ins != last->insn; ins = prev)
		{
		  prev = PREV_INSN (ins);
		  if (NOTE_P (ins))
		    {
		      NEXT_INSN (prev) = NEXT_INSN (ins);
		      PREV_INSN (NEXT_INSN (ins)) = prev;
		      PREV_INSN (ins) = insn;
		      NEXT_INSN (ins) = NEXT_INSN (insn);
		      NEXT_INSN (insn) = ins;
		      if (NEXT_INSN (ins))
			PREV_INSN (NEXT_INSN (ins)) = ins;
                      if (BB_END (bb) == insn)
			BB_END (bb) = ins;
		    }
		  else
		    gcc_assert (DEBUG_INSN_P (ins));
		}
	    }
	  last = NULL;

904 905 906
	  if (n_regs_saved)
	    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
	      if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
907
		regno += insert_restore (chain, JUMP_P (insn),
908
					 regno, MOVE_MAX_WORDS, save_mode);
909
	}
910
    }
Richard Stallman committed
911 912
}

913 914
/* Here from note_stores, or directly from save_call_clobbered_regs, when
   an insn stores a value in a register.
915
   Set the proper bit or bits in this_insn_sets.  All pseudos that have
Richard Stallman committed
916 917 918
   been assigned hard regs have had their register number changed already,
   so we can ignore pseudos.  */
static void
919
mark_set_regs (rtx reg, const_rtx setter ATTRIBUTE_UNUSED, void *data)
Richard Stallman committed
920
{
921
  int regno, endregno, i;
922
  HARD_REG_SET *this_insn_sets = (HARD_REG_SET *) data;
Richard Stallman committed
923 924 925

  if (GET_CODE (reg) == SUBREG)
    {
926
      rtx inner = SUBREG_REG (reg);
927
      if (!REG_P (inner) || REGNO (inner) >= FIRST_PSEUDO_REGISTER)
928
	return;
929
      regno = subreg_regno (reg);
930
      endregno = regno + subreg_nregs (reg);
931
    }
932
  else if (REG_P (reg)
933
	   && REGNO (reg) < FIRST_PSEUDO_REGISTER)
934 935
    {
      regno = REGNO (reg);
936
      endregno = END_HARD_REGNO (reg);
937
    }
938
  else
Richard Stallman committed
939 940 941
    return;

  for (i = regno; i < endregno; i++)
942
    SET_HARD_REG_BIT (*this_insn_sets, i);
Richard Stallman committed
943 944
}

945 946 947 948 949
/* Here from note_stores when an insn stores a value in a register.
   Set the proper bit or bits in the passed regset.  All pseudos that have
   been assigned hard regs have had their register number changed already,
   so we can ignore pseudos.  */
static void
950
add_stored_regs (rtx reg, const_rtx setter, void *data)
951
{
952
  int regno, endregno, i;
953
  enum machine_mode mode = GET_MODE (reg);
954
  int offset = 0;
955 956 957 958

  if (GET_CODE (setter) == CLOBBER)
    return;

959 960 961
  if (GET_CODE (reg) == SUBREG
      && REG_P (SUBREG_REG (reg))
      && REGNO (SUBREG_REG (reg)) < FIRST_PSEUDO_REGISTER)
962
    {
963 964 965 966
      offset = subreg_regno_offset (REGNO (SUBREG_REG (reg)),
				    GET_MODE (SUBREG_REG (reg)),
				    SUBREG_BYTE (reg),
				    GET_MODE (reg));
967
      regno = REGNO (SUBREG_REG (reg)) + offset;
968
      endregno = regno + subreg_nregs (reg);
969
    }
970 971 972 973
  else
    {
      if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
	return;
974

975
      regno = REGNO (reg) + offset;
976
      endregno = end_hard_regno (mode, regno);
977
    }
978 979 980 981 982

  for (i = regno; i < endregno; i++)
    SET_REGNO_REG_SET ((regset) data, i);
}

983
/* Walk X and record all referenced registers in REFERENCED_REGS.  */
Richard Stallman committed
984
static void
985
mark_referenced_regs (rtx *loc, refmarker_fn *mark, void *arg)
Richard Stallman committed
986
{
987
  enum rtx_code code = GET_CODE (*loc);
988
  const char *fmt;
Richard Stallman committed
989 990
  int i, j;

991
  if (code == SET)
992
    mark_referenced_regs (&SET_SRC (*loc), mark, arg);
993 994
  if (code == SET || code == CLOBBER)
    {
995 996 997
      loc = &SET_DEST (*loc);
      code = GET_CODE (*loc);
      if ((code == REG && REGNO (*loc) < FIRST_PSEUDO_REGISTER)
998
	  || code == PC || code == CC0
999 1000
	  || (code == SUBREG && REG_P (SUBREG_REG (*loc))
	      && REGNO (SUBREG_REG (*loc)) < FIRST_PSEUDO_REGISTER
1001 1002 1003
	      /* If we're setting only part of a multi-word register,
		 we shall mark it as referenced, because the words
		 that are not being set should be restored.  */
1004 1005 1006
	      && ((GET_MODE_SIZE (GET_MODE (*loc))
		   >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (*loc))))
		  || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (*loc)))
1007
		      <= UNITS_PER_WORD))))
1008 1009 1010 1011
	return;
    }
  if (code == MEM || code == SUBREG)
    {
1012 1013
      loc = &XEXP (*loc, 0);
      code = GET_CODE (*loc);
1014
    }
1015

Richard Stallman committed
1016 1017
  if (code == REG)
    {
1018
      int regno = REGNO (*loc);
1019 1020
      int hardregno = (regno < FIRST_PSEUDO_REGISTER ? regno
		       : reg_renumber[regno]);
Richard Stallman committed
1021

1022
      if (hardregno >= 0)
1023 1024 1025 1026 1027 1028
	mark (loc, GET_MODE (*loc), hardregno, arg);
      else if (arg)
	/* ??? Will we ever end up with an equiv expression in a debug
	   insn, that would have required restoring a reg, or will
	   reload take care of it for us?  */
	return;
1029 1030 1031 1032
      /* If this is a pseudo that did not get a hard register, scan its
	 memory location, since it might involve the use of another
	 register, which might be saved.  */
      else if (reg_equiv_mem[regno] != 0)
1033
	mark_referenced_regs (&XEXP (reg_equiv_mem[regno], 0), mark, arg);
1034
      else if (reg_equiv_address[regno] != 0)
1035
	mark_referenced_regs (&reg_equiv_address[regno], mark, arg);
Richard Stallman committed
1036 1037
      return;
    }
1038

Richard Stallman committed
1039 1040 1041 1042
  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
1043
	mark_referenced_regs (&XEXP (*loc, i), mark, arg);
Richard Stallman committed
1044
      else if (fmt[i] == 'E')
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
	for (j = XVECLEN (*loc, i) - 1; j >= 0; j--)
	  mark_referenced_regs (&XVECEXP (*loc, i, j), mark, arg);
    }
}

/* Parameter function for mark_referenced_regs() that adds registers
   present in the insn and in equivalent mems and addresses to
   referenced_regs.  */

static void
mark_reg_as_referenced (rtx *loc ATTRIBUTE_UNUSED,
			enum machine_mode mode,
			int hardregno,
			void *arg ATTRIBUTE_UNUSED)
{
  add_to_hard_reg_set (&referenced_regs, mode, hardregno);
}

/* Parameter function for mark_referenced_regs() that replaces
   registers referenced in a debug_insn that would have been restored,
   should it be a non-debug_insn, with their save locations.  */

static void
replace_reg_with_saved_mem (rtx *loc,
			    enum machine_mode mode,
			    int regno,
			    void *arg)
{
  unsigned int i, nregs = hard_regno_nregs [regno][mode];
  rtx mem;
  enum machine_mode *save_mode = (enum machine_mode *)arg;

  for (i = 0; i < nregs; i++)
    if (TEST_HARD_REG_BIT (hard_regs_saved, regno + i))
      break;

  /* If none of the registers in the range would need restoring, we're
     all set.  */
  if (i == nregs)
    return;

  while (++i < nregs)
    if (!TEST_HARD_REG_BIT (hard_regs_saved, regno + i))
      break;

  if (i == nregs
      && regno_save_mem[regno][nregs])
    {
      mem = copy_rtx (regno_save_mem[regno][nregs]);

      if (nregs == (unsigned int) hard_regno_nregs[regno][save_mode[regno]])
	mem = adjust_address_nv (mem, save_mode[regno], 0);

      if (GET_MODE (mem) != mode)
	{
	  /* This is gen_lowpart_if_possible(), but without validating
	     the newly-formed address.  */
	  int offset = 0;

	  if (WORDS_BIG_ENDIAN)
	    offset = (MAX (GET_MODE_SIZE (GET_MODE (mem)), UNITS_PER_WORD)
		      - MAX (GET_MODE_SIZE (mode), UNITS_PER_WORD));
	  if (BYTES_BIG_ENDIAN)
	    /* Adjust the address so that the address-after-the-data is
	       unchanged.  */
	    offset -= (MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode))
		       - MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (mem))));

	  mem = adjust_address_nv (mem, mode, offset);
	}
Richard Stallman committed
1115
    }
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
  else
    {
      mem = gen_rtx_CONCATN (mode, rtvec_alloc (nregs));
      for (i = 0; i < nregs; i++)
	if (TEST_HARD_REG_BIT (hard_regs_saved, regno + i))
	  {
	    gcc_assert (regno_save_mem[regno + i][1]);
	    XVECEXP (mem, 0, i) = copy_rtx (regno_save_mem[regno + i][1]);
	  }
	else
	  {
	    gcc_assert (save_mode[regno] != VOIDmode);
	    XVECEXP (mem, 0, i) = gen_rtx_REG (save_mode [regno],
					       regno + i);
	  }
    }

  gcc_assert (GET_MODE (mem) == mode);
  *loc = mem;
Richard Stallman committed
1135
}
1136

Richard Stallman committed
1137

1138 1139 1140 1141
/* Insert a sequence of insns to restore.  Place these insns in front of
   CHAIN if BEFORE_P is nonzero, behind the insn otherwise.  MAXRESTORE is
   the maximum number of registers which should be restored during this call.
   It should never be less than 1 since we only work with entire registers.
Richard Stallman committed
1142 1143 1144 1145 1146

   Note that we have verified in init_caller_save that we can do this
   with a simple SET, so use it.  Set INSN_CODE to what we save there
   since the address might not be valid so the insn might not be recognized.
   These insns will be reloaded and have register elimination done by
1147
   find_reload, so we need not worry about that here.
Richard Stallman committed
1148

1149 1150 1151
   Return the extra number of registers saved.  */

static int
1152 1153
insert_restore (struct insn_chain *chain, int before_p, int regno,
		int maxrestore, enum machine_mode *save_mode)
Richard Stallman committed
1154
{
1155
  int i, k;
1156
  rtx pat = NULL_RTX;
1157
  int code;
1158
  unsigned int numregs = 0;
1159
  struct insn_chain *new_chain;
1160
  rtx mem;
Richard Stallman committed
1161

1162 1163 1164 1165 1166 1167
  /* A common failure mode if register status is not correct in the
     RTL is for this routine to be called with a REGNO we didn't
     expect to save.  That will cause us to write an insn with a (nil)
     SET_DEST or SET_SRC.  Instead of doing so and causing a crash
     later, check for this common case here instead.  This will remove
     one step in debugging such problems.  */
1168
  gcc_assert (regno_save_mem[regno][1]);
1169

1170
  /* Get the pattern to emit and update our status.
1171

1172
     See if we can restore `maxrestore' registers at once.  Work
1173 1174
     backwards to the single register case.  */
  for (i = maxrestore; i > 0; i--)
Richard Stallman committed
1175
    {
1176
      int j;
1177 1178 1179
      int ok = 1;

      if (regno_save_mem[regno][i] == 0)
1180 1181
	continue;

1182 1183 1184 1185 1186 1187
      for (j = 0; j < i; j++)
	if (! TEST_HARD_REG_BIT (hard_regs_saved, regno + j))
	  {
	    ok = 0;
	    break;
	  }
1188
      /* Must do this one restore at a time.  */
1189 1190
      if (! ok)
	continue;
1191

1192 1193 1194
      numregs = i;
      break;
    }
1195

1196 1197 1198
  mem = regno_save_mem [regno][numregs];
  if (save_mode [regno] != VOIDmode
      && save_mode [regno] != GET_MODE (mem)
1199 1200 1201 1202
      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]
      /* Check that insn to restore REGNO in save_mode[regno] is
	 correct.  */
      && reg_save_code (regno, save_mode[regno]) >= 0)
1203
    mem = adjust_address_nv (mem, save_mode[regno], 0);
1204 1205
  else
    mem = copy_rtx (mem);
1206 1207 1208

  /* Verify that the alignment of spill space is equal to or greater
     than required.  */
Vladimir Makarov committed
1209 1210
  gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT,
		   GET_MODE_ALIGNMENT (GET_MODE (mem))) <= MEM_ALIGN (mem));
1211

1212
  pat = gen_rtx_SET (VOIDmode,
1213
		     gen_rtx_REG (GET_MODE (mem),
1214
				  regno), mem);
1215
  code = reg_restore_code (regno, GET_MODE (mem));
1216
  new_chain = insert_one_insn (chain, before_p, code, pat);
1217 1218 1219 1220 1221

  /* Clear status for all registers we restored.  */
  for (k = 0; k < i; k++)
    {
      CLEAR_HARD_REG_BIT (hard_regs_saved, regno + k);
1222
      SET_REGNO_REG_SET (&new_chain->dead_or_set, regno + k);
1223 1224 1225
      n_regs_saved--;
    }

1226
  /* Tell our callers how many extra registers we saved/restored.  */
1227 1228
  return numregs - 1;
}
1229

1230
/* Like insert_restore above, but save registers instead.  */
1231

1232
static int
1233 1234
insert_save (struct insn_chain *chain, int before_p, int regno,
	     HARD_REG_SET (*to_save), enum machine_mode *save_mode)
1235
{
1236 1237
  int i;
  unsigned int k;
1238
  rtx pat = NULL_RTX;
1239
  int code;
1240
  unsigned int numregs = 0;
1241
  struct insn_chain *new_chain;
1242
  rtx mem;
1243

1244 1245 1246 1247 1248
  /* A common failure mode if register status is not correct in the
     RTL is for this routine to be called with a REGNO we didn't
     expect to save.  That will cause us to write an insn with a (nil)
     SET_DEST or SET_SRC.  Instead of doing so and causing a crash
     later, check for this common case here.  This will remove one
1249
     step in debugging such problems.  */
1250
  gcc_assert (regno_save_mem[regno][1]);
Richard Stallman committed
1251

1252
  /* Get the pattern to emit and update our status.
1253

1254
     See if we can save several registers with a single instruction.
1255
     Work backwards to the single register case.  */
1256
  for (i = MOVE_MAX_WORDS; i > 0; i--)
1257
    {
1258
      int j;
1259 1260
      int ok = 1;
      if (regno_save_mem[regno][i] == 0)
1261
	continue;
1262

1263 1264 1265 1266 1267 1268
      for (j = 0; j < i; j++)
	if (! TEST_HARD_REG_BIT (*to_save, regno + j))
	  {
	    ok = 0;
	    break;
	  }
1269
      /* Must do this one save at a time.  */
1270 1271 1272 1273 1274
      if (! ok)
	continue;

      numregs = i;
      break;
1275
    }
Richard Stallman committed
1276

1277 1278 1279
  mem = regno_save_mem [regno][numregs];
  if (save_mode [regno] != VOIDmode
      && save_mode [regno] != GET_MODE (mem)
1280 1281 1282 1283
      && numregs == (unsigned int) hard_regno_nregs[regno][save_mode [regno]]
      /* Check that insn to save REGNO in save_mode[regno] is
	 correct.  */
      && reg_save_code (regno, save_mode[regno]) >= 0)
1284
    mem = adjust_address_nv (mem, save_mode[regno], 0);
1285 1286
  else
    mem = copy_rtx (mem);
1287 1288 1289

  /* Verify that the alignment of spill space is equal to or greater
     than required.  */
Vladimir Makarov committed
1290 1291
  gcc_assert (MIN (MAX_SUPPORTED_STACK_ALIGNMENT,
		   GET_MODE_ALIGNMENT (GET_MODE (mem))) <= MEM_ALIGN (mem));
1292

1293 1294
  pat = gen_rtx_SET (VOIDmode, mem,
		     gen_rtx_REG (GET_MODE (mem),
1295
				  regno));
1296
  code = reg_save_code (regno, GET_MODE (mem));
1297
  new_chain = insert_one_insn (chain, before_p, code, pat);
1298 1299 1300 1301 1302

  /* Set hard_regs_saved and dead_or_set for all the registers we saved.  */
  for (k = 0; k < numregs; k++)
    {
      SET_HARD_REG_BIT (hard_regs_saved, regno + k);
1303
      SET_REGNO_REG_SET (&new_chain->dead_or_set, regno + k);
1304 1305
      n_regs_saved++;
    }
1306

1307
  /* Tell our callers how many extra registers we saved/restored.  */
1308
  return numregs - 1;
Richard Stallman committed
1309
}
1310

1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
/* A for_each_rtx callback used by add_used_regs.  Add the hard-register
   equivalent of each REG to regset DATA.  */

static int
add_used_regs_1 (rtx *loc, void *data)
{
  int regno, i;
  regset live;
  rtx x;

  x = *loc;
  live = (regset) data;
  if (REG_P (x))
    {
      regno = REGNO (x);
      if (!HARD_REGISTER_NUM_P (regno))
	regno = reg_renumber[regno];
      if (regno >= 0)
	for (i = hard_regno_nregs[regno][GET_MODE (x)] - 1; i >= 0; i--)
	  SET_REGNO_REG_SET (live, regno + i);
    }
  return 0;
}

/* A note_uses callback used by insert_one_insn.  Add the hard-register
   equivalent of each REG to regset DATA.  */

static void
add_used_regs (rtx *loc, void *data)
{
  for_each_rtx (loc, add_used_regs_1, data);
}

1344
/* Emit a new caller-save insn and set the code.  */
1345
static struct insn_chain *
1346
insert_one_insn (struct insn_chain *chain, int before_p, int code, rtx pat)
1347
{
1348
  rtx insn = chain->insn;
1349
  struct insn_chain *new_chain;
1350

1351 1352 1353 1354 1355 1356 1357
#ifdef HAVE_cc0
  /* If INSN references CC0, put our insns in front of the insn that sets
     CC0.  This is always safe, since the only way we could be passed an
     insn that references CC0 is for a restore, and doing a restore earlier
     isn't a problem.  We do, however, assume here that CALL_INSNs don't
     reference CC0.  Guard against non-INSN's like CODE_LABEL.  */

1358
  if ((NONJUMP_INSN_P (insn) || JUMP_P (insn))
1359 1360
      && before_p
      && reg_referenced_p (cc0_rtx, PATTERN (insn)))
1361
    chain = chain->prev, insn = chain->insn;
1362 1363
#endif

1364
  new_chain = new_insn_chain ();
1365 1366
  if (before_p)
    {
1367 1368
      rtx link;

1369 1370 1371
      new_chain->prev = chain->prev;
      if (new_chain->prev != 0)
	new_chain->prev->next = new_chain;
1372
      else
1373
	reload_insn_chain = new_chain;
1374

1375 1376 1377
      chain->prev = new_chain;
      new_chain->next = chain;
      new_chain->insn = emit_insn_before (pat, insn);
1378 1379
      /* ??? It would be nice if we could exclude the already / still saved
	 registers from the live sets.  */
1380
      COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
1381 1382
      note_uses (&PATTERN (chain->insn), add_used_regs,
		 &new_chain->live_throughout);
1383 1384 1385
      /* If CHAIN->INSN is a call, then the registers which contain
	 the arguments to the function are live in the new insn.  */
      if (CALL_P (chain->insn))
1386 1387 1388 1389 1390
	for (link = CALL_INSN_FUNCTION_USAGE (chain->insn);
	     link != NULL_RTX;
	     link = XEXP (link, 1))
	  note_uses (&XEXP (link, 0), add_used_regs,
		     &new_chain->live_throughout);
1391

1392
      CLEAR_REG_SET (&new_chain->dead_or_set);
1393
      if (chain->insn == BB_HEAD (BASIC_BLOCK (chain->block)))
1394
	BB_HEAD (BASIC_BLOCK (chain->block)) = new_chain->insn;
1395 1396 1397
    }
  else
    {
1398 1399 1400 1401 1402 1403
      new_chain->next = chain->next;
      if (new_chain->next != 0)
	new_chain->next->prev = new_chain;
      chain->next = new_chain;
      new_chain->prev = chain;
      new_chain->insn = emit_insn_after (pat, insn);
1404 1405
      /* ??? It would be nice if we could exclude the already / still saved
	 registers from the live sets, and observe REG_UNUSED notes.  */
1406
      COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
1407
      /* Registers that are set in CHAIN->INSN live in the new insn.
Mike Stump committed
1408
	 (Unless there is a REG_UNUSED note for them, but we don't
1409 1410
	  look for them here.) */
      note_stores (PATTERN (chain->insn), add_stored_regs,
1411 1412
		   &new_chain->live_throughout);
      CLEAR_REG_SET (&new_chain->dead_or_set);
1413
      if (chain->insn == BB_END (BASIC_BLOCK (chain->block)))
1414
	BB_END (BASIC_BLOCK (chain->block)) = new_chain->insn;
1415
    }
1416 1417
  new_chain->block = chain->block;
  new_chain->is_caller_save_insn = 1;
1418

1419 1420
  INSN_CODE (new_chain->insn) = code;
  return new_chain;
1421
}
1422
#include "gt-caller-save.h"