caller-save.c 45.4 KB
Newer Older
Richard Stallman committed
1
/* Save and restore call-clobbered registers which are live across a call.
2
   Copyright (C) 1989-2017 Free Software Foundation, Inc.
Richard Stallman committed
3

4
This file is part of GCC.
Richard Stallman committed
5

6 7
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
8
Software Foundation; either version 3, or (at your option) any later
9
version.
Richard Stallman committed
10

11 12 13 14
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
15 16

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

#include "config.h"
21
#include "system.h"
22
#include "coretypes.h"
23
#include "backend.h"
Richard Stallman committed
24
#include "rtl.h"
25 26
#include "tree.h"
#include "predict.h"
27
#include "df.h"
28
#include "memmodel.h"
29
#include "tm_p.h"
Richard Stallman committed
30
#include "insn-config.h"
31 32
#include "regs.h"
#include "emit-rtl.h"
Richard Stallman committed
33
#include "recog.h"
34
#include "reload.h"
35
#include "alias.h"
36
#include "addresses.h"
37
#include "dumpfile.h"
38
#include "rtl-iter.h"
Richard Stallman committed
39

40 41
#define MOVE_MAX_WORDS (MOVE_MAX / UNITS_PER_WORD)

42 43
#define regno_save_mode \
  (this_target_reload->x_regno_save_mode)
44 45 46 47
#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
48 49 50 51

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

52
static rtx
53
  regno_save_mem[FIRST_PSEUDO_REGISTER][MAX_MOVE_MAX / MIN_UNITS_PER_WORD + 1];
Richard Stallman committed
54

Vladimir Makarov committed
55 56 57 58 59 60
/* 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
61 62 63 64
/* Set of hard regs currently residing in save area (during insn scan).  */

static HARD_REG_SET hard_regs_saved;

65
/* Number of registers currently in hard_regs_saved.  */
66

67
static int n_regs_saved;
68

69 70 71
/* Computed by mark_referenced_regs, all regs referenced in a given
   insn.  */
static HARD_REG_SET referenced_regs;
Richard Stallman committed
72

73

74
typedef void refmarker_fn (rtx *loc, machine_mode mode, int hardregno,
75 76
			   void *mark_arg);

77 78
static int reg_save_code (int, machine_mode);
static int reg_restore_code (int, machine_mode);
Vladimir Makarov committed
79 80 81

struct saved_hard_reg;
static void initiate_saved_hard_regs (void);
82
static void new_saved_hard_reg (int, int);
Vladimir Makarov committed
83 84 85
static void finish_saved_hard_regs (void);
static int saved_hard_reg_compare_func (const void *, const void *);

86
static void mark_set_regs (rtx, const_rtx, void *);
87 88 89
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;
90
static int insert_save (struct insn_chain *, int, int, HARD_REG_SET *,
91
			machine_mode *);
92
static int insert_restore (struct insn_chain *, int, int, int,
93
			   machine_mode *);
94 95
static struct insn_chain *insert_one_insn (struct insn_chain *, int, int,
					   rtx);
96
static void add_stored_regs (rtx, const_rtx, void *);
Vladimir Makarov committed
97

Richard Stallman committed
98

Vladimir Makarov committed
99

100 101 102 103
static GTY(()) rtx savepat;
static GTY(()) rtx restpat;
static GTY(()) rtx test_reg;
static GTY(()) rtx test_mem;
104 105
static GTY(()) rtx_insn *saveinsn;
static GTY(()) rtx_insn *restinsn;
106 107 108

/* Return the INSN_CODE used to save register REG in mode MODE.  */
static int
109
reg_save_code (int reg, machine_mode mode)
110 111 112 113 114
{
  bool ok;
  if (cached_reg_save_code[reg][mode])
     return cached_reg_save_code[reg][mode];
  if (!HARD_REGNO_MODE_OK (reg, mode))
115 116 117 118 119 120 121 122 123
    {
      /* Depending on how HARD_REGNO_MODE_OK is defined, range propagation
	 might deduce here that reg >= FIRST_PSEUDO_REGISTER.  So the assert
	 below silences a warning.  */
      gcc_assert (reg < FIRST_PSEUDO_REGISTER);
      cached_reg_save_code[reg][mode] = -1;
      cached_reg_restore_code[reg][mode] = -1;
      return -1;
    }
124 125 126

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

  /* Force re-recognition of the modified insns.  */
  INSN_CODE (saveinsn) = -1;
132
  INSN_CODE (restinsn) = -1;
133 134 135 136 137

  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
138 139 140
     constraints.  We don't know here whether the save and restore will
     be in size- or speed-tuned code, so just use the set of enabled
     alternatives.  */
141 142 143 144 145
  ok = (cached_reg_save_code[reg][mode] != -1
	&& cached_reg_restore_code[reg][mode] != -1);
  if (ok)
    {
      extract_insn (saveinsn);
146
      ok = constrain_operands (1, get_enabled_alternatives (saveinsn));
147
      extract_insn (restinsn);
148
      ok &= constrain_operands (1, get_enabled_alternatives (restinsn));
149 150 151 152 153 154 155 156 157 158 159 160 161
    }

  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
162
reg_restore_code (int reg, machine_mode mode)
163 164 165 166 167 168 169 170
{
  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
171 172 173
/* Initialize for caller-save.

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

176
   Ensure that we can find a mode to save the register and that there is a
Richard Stallman committed
177 178 179 180 181
   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
182
init_caller_save (void)
Richard Stallman committed
183 184 185 186
{
  rtx addr_reg;
  int offset;
  rtx address;
187
  int i, j;
Richard Stallman committed
188

189 190 191 192 193
  if (caller_save_initialized_p)
    return;

  caller_save_initialized_p = true;

Vladimir Makarov committed
194
  CLEAR_HARD_REG_SET (no_caller_save_reg_set);
Richard Stallman committed
195 196 197 198 199 200
  /* 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++)
    {
201 202
      if (call_used_regs[i]
          && !TEST_HARD_REG_BIT (call_fixed_reg_set, i))
Richard Stallman committed
203
	{
204
	  for (j = 1; j <= MOVE_MAX_WORDS; j++)
Richard Stallman committed
205
	    {
206 207
	      regno_save_mode[i][j] = HARD_REGNO_CALLER_SAVE_MODE (i, j,
								   VOIDmode);
208 209 210 211
	      if (regno_save_mode[i][j] == VOIDmode && j == 1)
		{
		  SET_HARD_REG_BIT (call_fixed_reg_set, i);
		}
Richard Stallman committed
212 213 214
	    }
	}
      else
215
	regno_save_mode[i][1] = VOIDmode;
Richard Stallman committed
216 217 218 219 220 221 222 223 224 225 226 227 228 229
    }

  /* 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++)
230 231
    if (TEST_HARD_REG_BIT
	(reg_class_contents
232 233
	 [(int) base_reg_class (regno_save_mode[i][1], ADDR_SPACE_GENERIC,
				PLUS, CONST_INT)], i))
Richard Stallman committed
234 235
      break;

236
  gcc_assert (i < FIRST_PSEUDO_REGISTER);
Richard Stallman committed
237

238
  addr_reg = gen_rtx_REG (Pmode, i);
Richard Stallman committed
239 240 241

  for (offset = 1 << (HOST_BITS_PER_INT / 2); offset; offset >>= 1)
    {
242
      address = gen_rtx_PLUS (Pmode, addr_reg, gen_int_mode (offset, Pmode));
Richard Stallman committed
243 244

      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
245 246
	if (regno_save_mode[i][1] != VOIDmode
	  && ! strict_memory_address_p (regno_save_mode[i][1], address))
Richard Stallman committed
247 248 249 250 251 252 253 254 255 256 257
	  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
258
     see if such an insn is recognized and meets its constraints.
259 260 261 262

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

263
  test_reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
264
  test_mem = gen_rtx_MEM (word_mode, address);
265 266
  savepat = gen_rtx_SET (test_mem, test_reg);
  restpat = gen_rtx_SET (test_reg, test_mem);
Richard Stallman committed
267

Richard Sandiford committed
268 269
  saveinsn = gen_rtx_INSN (VOIDmode, 0, 0, 0, savepat, 0, -1, 0);
  restinsn = gen_rtx_INSN (VOIDmode, 0, 0, 0, restpat, 0, -1, 0);
270

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

Richard Stallman committed
285

Vladimir Makarov committed
286

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

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

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

Vladimir Makarov committed
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
}

/* 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.  */
348
static void
Vladimir Makarov committed
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 379
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;
}

/* 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
380

Vladimir Makarov committed
381 382 383 384 385 386 387 388 389
  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
390 391 392 393 394 395 396 397
}

/* 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
398 399 400 401
   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.

402 403 404
   Future work:

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

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

414
void
415
setup_save_areas (void)
Richard Stallman committed
416
{
417
  int i, j, k, freq;
418
  HARD_REG_SET hard_regs_used;
419
  struct saved_hard_reg *saved_reg;
420
  rtx_insn *insn;
421 422 423 424
  struct insn_chain *chain, *next;
  unsigned int regno;
  HARD_REG_SET hard_regs_to_save, used_regs, this_insn_sets;
  reg_set_iterator rsi;
425 426 427

  CLEAR_HARD_REG_SET (hard_regs_used);

428 429 430 431 432
  /* Find every CALL_INSN and record which hard regs are live across the
     call into HARD_REG_MAP and HARD_REGS_USED.  */
  initiate_saved_hard_regs ();
  /* Create hard reg saved regs.  */
  for (chain = reload_insn_chain; chain != 0; chain = next)
Vladimir Makarov committed
433
    {
434 435
      rtx cheap;

436 437 438 439 440 441 442 443
      insn = chain->insn;
      next = chain->next;
      if (!CALL_P (insn)
	  || 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);
444
      get_call_reg_set_usage (insn, &used_regs, call_used_reg_set);
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465

      /* 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
466
	      new_saved_hard_reg (regno, freq);
467 468
	    SET_HARD_REG_BIT (hard_regs_used, regno);
	  }
469 470 471
      cheap = find_reg_note (insn, REG_RETURNED, NULL);
      if (cheap)
	cheap = XEXP (cheap, 0);
472 473 474
      /* Look through all live pseudos, mark their hard registers.  */
      EXECUTE_IF_SET_IN_REG_SET
	(&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
Vladimir Makarov committed
475
	{
476 477
	  int r = reg_renumber[regno];
	  int bound;
Vladimir Makarov committed
478

479
	  if (r < 0 || regno_reg_rtx[regno] == cheap)
480
	    continue;
Vladimir Makarov committed
481

482 483 484
	  bound = r + hard_regno_nregs[r][PSEUDO_REGNO_MODE (regno)];
	  for (; r < bound; r++)
	    if (TEST_HARD_REG_BIT (used_regs, r))
Vladimir Makarov committed
485
	      {
486 487
		if (hard_reg_map[r] != NULL)
		  hard_reg_map[r]->call_freq += freq;
Vladimir Makarov committed
488
		else
489
		  new_saved_hard_reg (r, freq);
490 491
		 SET_HARD_REG_BIT (hard_regs_to_save, r);
		 SET_HARD_REG_BIT (hard_regs_used, r);
Vladimir Makarov committed
492
	      }
493 494
	}
    }
H.J. Lu committed
495

496 497 498 499 500 501 502 503 504 505 506 507
  /* If requested, figure out which hard regs can share save slots.  */
  if (optimize && flag_ira_share_save_slots)
    {
      rtx slot;
      char *saved_reg_conflicts;
      int next_k;
      struct saved_hard_reg *saved_reg2, *saved_reg3;
      int call_saved_regs_num;
      struct saved_hard_reg *call_saved_regs[FIRST_PSEUDO_REGISTER];
      int best_slot_num;
      int prev_save_slots_num;
      rtx prev_save_slots[FIRST_PSEUDO_REGISTER];
H.J. Lu committed
508

Vladimir Makarov committed
509 510 511 512 513
      /* 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)
	{
514
	  rtx cheap;
Vladimir Makarov committed
515 516 517
	  call_saved_regs_num = 0;
	  insn = chain->insn;
	  next = chain->next;
Shujing Zhao committed
518
	  if (!CALL_P (insn)
Vladimir Makarov committed
519 520
	      || find_reg_note (insn, REG_NORETURN, NULL))
	    continue;
521 522 523 524 525

	  cheap = find_reg_note (insn, REG_RETURNED, NULL);
	  if (cheap)
	    cheap = XEXP (cheap, 0);

Vladimir Makarov committed
526 527
	  REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
				   &chain->live_throughout);
528
	  get_call_reg_set_usage (insn, &used_regs, call_used_reg_set);
Vladimir Makarov committed
529 530 531 532 533 534 535 536 537

	  /* 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,
538
	     compare df-scan.c:df_get_call_refs.  */
Vladimir Makarov committed
539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
	  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
554
	    {
Vladimir Makarov committed
555 556
	      int r = reg_renumber[regno];
	      int bound;
H.J. Lu committed
557

558
	      if (r < 0 || regno_reg_rtx[regno] == cheap)
Vladimir Makarov committed
559 560 561 562 563 564
		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
565
	    }
Vladimir Makarov committed
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
	  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],
659 660
		       GET_MODE_SIZE (regno_save_mode[regno][1]), 0,
		       ASLK_REDUCE_ALIGN);
Vladimir Makarov committed
661 662 663 664 665 666 667 668 669 670 671 672
		  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
    {
673 674 675 676
      /* We are not sharing slots. 

	 Run through all the call-used hard-registers and allocate
	 space for each in the caller-save area.  Try to allocate space
Vladimir Makarov committed
677
	 in a manner which allows multi-register saves/restores to be done.  */
H.J. Lu committed
678

Vladimir Makarov committed
679 680 681 682
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
	for (j = MOVE_MAX_WORDS; j > 0; j--)
	  {
	    int do_save = 1;
H.J. Lu committed
683

Vladimir Makarov committed
684 685 686 687
	    /* 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
688

Vladimir Makarov committed
689 690 691 692 693 694 695 696 697
	    /* 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
698

Vladimir Makarov committed
699 700 701 702 703 704 705 706
	    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
707

Vladimir Makarov committed
708 709 710 711 712 713 714 715 716 717
	    /* 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]),
718
				      0, ASLK_REDUCE_ALIGN);
H.J. Lu committed
719

Vladimir Makarov committed
720 721 722 723 724 725 726 727 728 729
	    /* 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);
	  }
    }
730 731 732 733 734 735

  /* 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)
736
	set_mem_alias_set (regno_save_mem[i][j], get_frame_alias_set ());
Richard Stallman committed
737
}
Vladimir Makarov committed
738

Richard Stallman committed
739

Vladimir Makarov committed
740

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

Richard Stallman committed
743
void
744
save_call_clobbered_regs (void)
Richard Stallman committed
745
{
746
  struct insn_chain *chain, *next, *last = NULL;
747
  machine_mode save_mode [FIRST_PSEUDO_REGISTER];
748

749 750 751 752
  /* Computed in mark_set_regs, holds all registers set by the current
     instruction.  */
  HARD_REG_SET this_insn_sets;

753 754
  CLEAR_HARD_REG_SET (hard_regs_saved);
  n_regs_saved = 0;
Richard Stallman committed
755

756
  for (chain = reload_insn_chain; chain != 0; chain = next)
Richard Stallman committed
757
    {
758
      rtx_insn *insn = chain->insn;
759 760 761 762
      enum rtx_code code = GET_CODE (insn);

      next = chain->next;

763
      gcc_assert (!chain->is_caller_save_insn);
764

765
      if (NONDEBUG_INSN_P (insn))
Richard Stallman committed
766
	{
767 768
	  /* 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
769

770
	  if (n_regs_saved)
Richard Stallman committed
771
	    {
772
	      int regno;
773
	      HARD_REG_SET this_insn_sets;
774 775 776 777

	      if (code == JUMP_INSN)
		/* Restore all registers if this is a JUMP_INSN.  */
		COPY_HARD_REG_SET (referenced_regs, hard_regs_saved);
778
	      else
779
		{
780
		  CLEAR_HARD_REG_SET (referenced_regs);
781 782
		  mark_referenced_regs (&PATTERN (insn),
					mark_reg_as_referenced, NULL);
783
		  AND_HARD_REG_SET (referenced_regs, hard_regs_saved);
784
		}
Richard Stallman committed
785

786 787
	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (referenced_regs, regno))
788 789 790 791 792 793 794 795 796 797 798
		  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
799 800
	    }

801 802 803
	  if (code == CALL_INSN
	      && ! SIBLING_CALL_P (insn)
	      && ! find_reg_note (insn, REG_NORETURN, NULL))
804
	    {
805
	      unsigned regno;
806
	      HARD_REG_SET hard_regs_to_save;
807
	      HARD_REG_SET call_def_reg_set;
808
	      reg_set_iterator rsi;
809 810 811 812 813
	      rtx cheap;

	      cheap = find_reg_note (insn, REG_RETURNED, NULL);
	      if (cheap)
		cheap = XEXP (cheap, 0);
814 815

	      /* Use the register life information in CHAIN to compute which
816 817
		 regs are live during the call.  */
	      REG_SET_TO_HARD_REG_SET (hard_regs_to_save,
818
				       &chain->live_throughout);
819
	      /* Save hard registers always in the widest mode available.  */
820 821 822 823 824 825
	      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;

826
	      /* Look through all live pseudos, mark their hard registers
827 828
		 and choose proper mode for saving.  */
	      EXECUTE_IF_SET_IN_REG_SET
829 830 831 832
		(&chain->live_throughout, FIRST_PSEUDO_REGISTER, regno, rsi)
		{
		  int r = reg_renumber[regno];
		  int nregs;
833
		  machine_mode mode;
834

835
		  if (r < 0 || regno_reg_rtx[regno] == cheap)
Vladimir Makarov committed
836
		    continue;
837 838 839 840 841 842 843 844 845
		  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);
		}
846 847

	      /* Record all registers set in this call insn.  These don't need
848 849 850
		 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.  */
851
	      CLEAR_HARD_REG_SET (this_insn_sets);
852
	      note_stores (PATTERN (insn), mark_set_regs, &this_insn_sets);
853 854 855 856 857

	      /* 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);
858 859 860
	      get_call_reg_set_usage (insn, &call_def_reg_set,
				      call_used_reg_set);
	      AND_HARD_REG_SET (hard_regs_to_save, call_def_reg_set);
861 862 863

	      for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
		if (TEST_HARD_REG_BIT (hard_regs_to_save, regno))
864
		  regno += insert_save (chain, 1, regno, &hard_regs_to_save, save_mode);
865 866 867 868 869 870

	      /* 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++;
871 872 873 874 875
	      
	      if (cheap
		  && HARD_REGISTER_P (cheap)
		  && TEST_HARD_REG_BIT (call_used_reg_set, REGNO (cheap)))
		{
876 877 878 879 880
		  rtx dest, newpat;
		  rtx pat = PATTERN (insn);
		  if (GET_CODE (pat) == PARALLEL)
		    pat = XVECEXP (pat, 0, 0);
		  dest = SET_DEST (pat);
881 882 883 884
		  /* For multiple return values dest is PARALLEL.
		     Currently we handle only single return value case.  */
		  if (REG_P (dest))
		    {
885
		      newpat = gen_rtx_SET (cheap, copy_rtx (dest));
886 887
		      chain = insert_one_insn (chain, 0, -1, newpat);
		    }
888
		}
889
	    }
890
          last = chain;
891
	}
892 893 894 895
      else if (DEBUG_INSN_P (insn) && n_regs_saved)
	mark_referenced_regs (&PATTERN (insn),
			      replace_reg_with_saved_mem,
			      save_mode);
Richard Stallman committed
896

Vladimir Makarov committed
897
      if (chain->next == 0 || chain->next->block != chain->block)
898 899 900 901 902 903
	{
	  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.  */

904 905 906 907
	  if (n_regs_saved
	      && DEBUG_INSN_P (insn)
	      && last
	      && last->block == chain->block)
908
	    {
909
	      rtx_insn *ins, *prev;
910 911 912 913 914 915 916 917 918 919 920
	      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))
		    {
921 922 923 924 925
		      SET_NEXT_INSN (prev) = NEXT_INSN (ins);
		      SET_PREV_INSN (NEXT_INSN (ins)) = prev;
		      SET_PREV_INSN (ins) = insn;
		      SET_NEXT_INSN (ins) = NEXT_INSN (insn);
		      SET_NEXT_INSN (insn) = ins;
926
		      if (NEXT_INSN (ins))
927
			SET_PREV_INSN (NEXT_INSN (ins)) = ins;
928
                      if (BB_END (bb) == insn)
929
			BB_END (bb) = ins;
930 931 932 933 934 935 936
		    }
		  else
		    gcc_assert (DEBUG_INSN_P (ins));
		}
	    }
	  last = NULL;

937 938 939
	  if (n_regs_saved)
	    for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
	      if (TEST_HARD_REG_BIT (hard_regs_saved, regno))
940
		regno += insert_restore (chain, JUMP_P (insn),
941
					 regno, MOVE_MAX_WORDS, save_mode);
942
	}
943
    }
Richard Stallman committed
944 945
}

946 947
/* Here from note_stores, or directly from save_call_clobbered_regs, when
   an insn stores a value in a register.
948
   Set the proper bit or bits in this_insn_sets.  All pseudos that have
Richard Stallman committed
949 950 951
   been assigned hard regs have had their register number changed already,
   so we can ignore pseudos.  */
static void
952
mark_set_regs (rtx reg, const_rtx setter ATTRIBUTE_UNUSED, void *data)
Richard Stallman committed
953
{
954
  int regno, endregno, i;
955
  HARD_REG_SET *this_insn_sets = (HARD_REG_SET *) data;
Richard Stallman committed
956 957 958

  if (GET_CODE (reg) == SUBREG)
    {
959
      rtx inner = SUBREG_REG (reg);
960
      if (!REG_P (inner) || REGNO (inner) >= FIRST_PSEUDO_REGISTER)
961
	return;
962
      regno = subreg_regno (reg);
963
      endregno = regno + subreg_nregs (reg);
964
    }
965
  else if (REG_P (reg)
966
	   && REGNO (reg) < FIRST_PSEUDO_REGISTER)
967 968
    {
      regno = REGNO (reg);
969
      endregno = END_REGNO (reg);
970
    }
971
  else
Richard Stallman committed
972 973 974
    return;

  for (i = regno; i < endregno; i++)
975
    SET_HARD_REG_BIT (*this_insn_sets, i);
Richard Stallman committed
976 977
}

978 979 980 981 982
/* 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
983
add_stored_regs (rtx reg, const_rtx setter, void *data)
984
{
985
  int regno, endregno, i;
986
  machine_mode mode = GET_MODE (reg);
987
  int offset = 0;
988 989 990 991

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

992 993 994
  if (GET_CODE (reg) == SUBREG
      && REG_P (SUBREG_REG (reg))
      && REGNO (SUBREG_REG (reg)) < FIRST_PSEUDO_REGISTER)
995
    {
996 997 998 999
      offset = subreg_regno_offset (REGNO (SUBREG_REG (reg)),
				    GET_MODE (SUBREG_REG (reg)),
				    SUBREG_BYTE (reg),
				    GET_MODE (reg));
1000
      regno = REGNO (SUBREG_REG (reg)) + offset;
1001
      endregno = regno + subreg_nregs (reg);
1002
    }
1003 1004 1005 1006
  else
    {
      if (!REG_P (reg) || REGNO (reg) >= FIRST_PSEUDO_REGISTER)
	return;
1007

1008
      regno = REGNO (reg) + offset;
1009
      endregno = end_hard_regno (mode, regno);
1010
    }
1011 1012 1013 1014 1015

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

1016
/* Walk X and record all referenced registers in REFERENCED_REGS.  */
Richard Stallman committed
1017
static void
1018
mark_referenced_regs (rtx *loc, refmarker_fn *mark, void *arg)
Richard Stallman committed
1019
{
1020
  enum rtx_code code = GET_CODE (*loc);
1021
  const char *fmt;
Richard Stallman committed
1022 1023
  int i, j;

1024
  if (code == SET)
1025
    mark_referenced_regs (&SET_SRC (*loc), mark, arg);
1026 1027
  if (code == SET || code == CLOBBER)
    {
1028 1029 1030
      loc = &SET_DEST (*loc);
      code = GET_CODE (*loc);
      if ((code == REG && REGNO (*loc) < FIRST_PSEUDO_REGISTER)
1031
	  || code == PC || code == CC0
1032 1033
	  || (code == SUBREG && REG_P (SUBREG_REG (*loc))
	      && REGNO (SUBREG_REG (*loc)) < FIRST_PSEUDO_REGISTER
1034 1035 1036
	      /* 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.  */
1037 1038 1039
	      && ((GET_MODE_SIZE (GET_MODE (*loc))
		   >= GET_MODE_SIZE (GET_MODE (SUBREG_REG (*loc))))
		  || (GET_MODE_SIZE (GET_MODE (SUBREG_REG (*loc)))
1040
		      <= UNITS_PER_WORD))))
1041 1042 1043 1044
	return;
    }
  if (code == MEM || code == SUBREG)
    {
1045 1046
      loc = &XEXP (*loc, 0);
      code = GET_CODE (*loc);
1047
    }
1048

Richard Stallman committed
1049 1050
  if (code == REG)
    {
1051
      int regno = REGNO (*loc);
1052 1053
      int hardregno = (regno < FIRST_PSEUDO_REGISTER ? regno
		       : reg_renumber[regno]);
Richard Stallman committed
1054

1055
      if (hardregno >= 0)
1056 1057 1058 1059 1060 1061
	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;
1062 1063 1064
      /* 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.  */
1065 1066 1067 1068
      else if (reg_equiv_mem (regno) != 0)
	mark_referenced_regs (&XEXP (reg_equiv_mem (regno), 0), mark, arg);
      else if (reg_equiv_address (regno) != 0)
	mark_referenced_regs (&reg_equiv_address (regno), mark, arg);
Richard Stallman committed
1069 1070
      return;
    }
1071

Richard Stallman committed
1072 1073 1074 1075
  fmt = GET_RTX_FORMAT (code);
  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    {
      if (fmt[i] == 'e')
1076
	mark_referenced_regs (&XEXP (*loc, i), mark, arg);
Richard Stallman committed
1077
      else if (fmt[i] == 'E')
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	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,
1089
			machine_mode mode,
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
			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,
1102
			    machine_mode mode,
1103 1104 1105 1106 1107
			    int regno,
			    void *arg)
{
  unsigned int i, nregs = hard_regno_nregs [regno][mode];
  rtx mem;
1108
  machine_mode *save_mode = (machine_mode *)arg;
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147

  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
1148
    }
1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
  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
	  {
1160
	    machine_mode smode = save_mode[regno];
1161 1162 1163 1164 1165
	    gcc_assert (smode != VOIDmode);
	    if (hard_regno_nregs [regno][smode] > 1)
	      smode = mode_for_size (GET_MODE_SIZE (mode) / nregs,
				     GET_MODE_CLASS (mode), 0);
	    XVECEXP (mem, 0, i) = gen_rtx_REG (smode, regno + i);
1166 1167 1168 1169 1170
	  }
    }

  gcc_assert (GET_MODE (mem) == mode);
  *loc = mem;
Richard Stallman committed
1171
}
1172

Richard Stallman committed
1173

1174 1175 1176 1177
/* 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
1178 1179 1180 1181 1182

   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
1183
   find_reload, so we need not worry about that here.
Richard Stallman committed
1184

1185 1186 1187
   Return the extra number of registers saved.  */

static int
1188
insert_restore (struct insn_chain *chain, int before_p, int regno,
1189
		int maxrestore, machine_mode *save_mode)
Richard Stallman committed
1190
{
1191
  int i, k;
1192
  rtx pat = NULL_RTX;
1193
  int code;
1194
  unsigned int numregs = 0;
1195
  struct insn_chain *new_chain;
1196
  rtx mem;
Richard Stallman committed
1197

1198 1199 1200 1201 1202 1203
  /* 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.  */
1204
  gcc_assert (regno_save_mem[regno][1]);
1205

1206
  /* Get the pattern to emit and update our status.
1207

1208
     See if we can restore `maxrestore' registers at once.  Work
1209 1210
     backwards to the single register case.  */
  for (i = maxrestore; i > 0; i--)
Richard Stallman committed
1211
    {
1212
      int j;
1213 1214 1215
      int ok = 1;

      if (regno_save_mem[regno][i] == 0)
1216 1217
	continue;

1218 1219 1220 1221 1222 1223
      for (j = 0; j < i; j++)
	if (! TEST_HARD_REG_BIT (hard_regs_saved, regno + j))
	  {
	    ok = 0;
	    break;
	  }
1224
      /* Must do this one restore at a time.  */
1225 1226
      if (! ok)
	continue;
1227

1228 1229 1230
      numregs = i;
      break;
    }
1231

1232 1233 1234
  mem = regno_save_mem [regno][numregs];
  if (save_mode [regno] != VOIDmode
      && save_mode [regno] != GET_MODE (mem)
1235 1236 1237 1238
      && 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)
1239
    mem = adjust_address_nv (mem, save_mode[regno], 0);
1240 1241
  else
    mem = copy_rtx (mem);
1242 1243 1244

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

1248
  pat = gen_rtx_SET (gen_rtx_REG (GET_MODE (mem), regno), mem);
1249
  code = reg_restore_code (regno, GET_MODE (mem));
1250
  new_chain = insert_one_insn (chain, before_p, code, pat);
1251 1252 1253 1254 1255

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

1260
  /* Tell our callers how many extra registers we saved/restored.  */
1261 1262
  return numregs - 1;
}
1263

1264
/* Like insert_restore above, but save registers instead.  */
1265

1266
static int
1267
insert_save (struct insn_chain *chain, int before_p, int regno,
1268
	     HARD_REG_SET (*to_save), machine_mode *save_mode)
1269
{
1270 1271
  int i;
  unsigned int k;
1272
  rtx pat = NULL_RTX;
1273
  int code;
1274
  unsigned int numregs = 0;
1275
  struct insn_chain *new_chain;
1276
  rtx mem;
1277

1278 1279 1280 1281 1282
  /* 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
1283
     step in debugging such problems.  */
1284
  gcc_assert (regno_save_mem[regno][1]);
Richard Stallman committed
1285

1286
  /* Get the pattern to emit and update our status.
1287

1288
     See if we can save several registers with a single instruction.
1289
     Work backwards to the single register case.  */
1290
  for (i = MOVE_MAX_WORDS; i > 0; i--)
1291
    {
1292
      int j;
1293 1294
      int ok = 1;
      if (regno_save_mem[regno][i] == 0)
1295
	continue;
1296

1297 1298 1299 1300 1301 1302
      for (j = 0; j < i; j++)
	if (! TEST_HARD_REG_BIT (*to_save, regno + j))
	  {
	    ok = 0;
	    break;
	  }
1303
      /* Must do this one save at a time.  */
1304 1305 1306 1307 1308
      if (! ok)
	continue;

      numregs = i;
      break;
1309
    }
Richard Stallman committed
1310

1311 1312 1313
  mem = regno_save_mem [regno][numregs];
  if (save_mode [regno] != VOIDmode
      && save_mode [regno] != GET_MODE (mem)
1314 1315 1316 1317
      && 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)
1318
    mem = adjust_address_nv (mem, save_mode[regno], 0);
1319 1320
  else
    mem = copy_rtx (mem);
1321 1322 1323

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

1327
  pat = gen_rtx_SET (mem, gen_rtx_REG (GET_MODE (mem), regno));
1328
  code = reg_save_code (regno, GET_MODE (mem));
1329
  new_chain = insert_one_insn (chain, before_p, code, pat);
1330 1331 1332 1333 1334

  /* 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);
1335
      SET_REGNO_REG_SET (&new_chain->dead_or_set, regno + k);
1336 1337
      n_regs_saved++;
    }
1338

1339
  /* Tell our callers how many extra registers we saved/restored.  */
1340
  return numregs - 1;
Richard Stallman committed
1341
}
1342

1343 1344 1345 1346 1347 1348
/* 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)
{
1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362
  subrtx_iterator::array_type array;
  FOR_EACH_SUBRTX (iter, array, *loc, NONCONST)
    {
      const_rtx x = *iter;
      if (REG_P (x))
	{
	  unsigned int regno = REGNO (x);
	  if (HARD_REGISTER_NUM_P (regno))
	    bitmap_set_range ((regset) data, regno,
			      hard_regno_nregs[regno][GET_MODE (x)]);
	  else
	    gcc_checking_assert (reg_renumber[regno] < 0);
	}
    }
1363 1364
}

1365
/* Emit a new caller-save insn and set the code.  */
1366
static struct insn_chain *
1367
insert_one_insn (struct insn_chain *chain, int before_p, int code, rtx pat)
1368
{
1369
  rtx_insn *insn = chain->insn;
1370
  struct insn_chain *new_chain;
1371

1372 1373 1374 1375 1376 1377
  /* 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.  */

1378
  if (HAVE_cc0 && (NONJUMP_INSN_P (insn) || JUMP_P (insn))
1379 1380
      && before_p
      && reg_referenced_p (cc0_rtx, PATTERN (insn)))
1381
    chain = chain->prev, insn = chain->insn;
1382

1383
  new_chain = new_insn_chain ();
1384 1385
  if (before_p)
    {
1386 1387
      rtx link;

1388 1389 1390
      new_chain->prev = chain->prev;
      if (new_chain->prev != 0)
	new_chain->prev->next = new_chain;
1391
      else
1392
	reload_insn_chain = new_chain;
1393

1394 1395 1396
      chain->prev = new_chain;
      new_chain->next = chain;
      new_chain->insn = emit_insn_before (pat, insn);
1397 1398
      /* ??? It would be nice if we could exclude the already / still saved
	 registers from the live sets.  */
1399
      COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
1400 1401
      note_uses (&PATTERN (chain->insn), add_used_regs,
		 &new_chain->live_throughout);
1402 1403 1404
      /* 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))
1405 1406 1407 1408 1409
	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);
1410

1411
      CLEAR_REG_SET (&new_chain->dead_or_set);
1412
      if (chain->insn == BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, chain->block)))
1413
	BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, chain->block)) = new_chain->insn;
1414 1415 1416
    }
  else
    {
1417 1418 1419 1420 1421 1422
      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);
1423 1424
      /* ??? It would be nice if we could exclude the already / still saved
	 registers from the live sets, and observe REG_UNUSED notes.  */
1425
      COPY_REG_SET (&new_chain->live_throughout, &chain->live_throughout);
1426
      /* Registers that are set in CHAIN->INSN live in the new insn.
Mike Stump committed
1427
	 (Unless there is a REG_UNUSED note for them, but we don't
1428 1429
	  look for them here.) */
      note_stores (PATTERN (chain->insn), add_stored_regs,
1430 1431
		   &new_chain->live_throughout);
      CLEAR_REG_SET (&new_chain->dead_or_set);
1432
      if (chain->insn == BB_END (BASIC_BLOCK_FOR_FN (cfun, chain->block)))
1433
	BB_END (BASIC_BLOCK_FOR_FN (cfun, chain->block)) = new_chain->insn;
1434
    }
1435 1436
  new_chain->block = chain->block;
  new_chain->is_caller_save_insn = 1;
1437

1438 1439
  INSN_CODE (new_chain->insn) = code;
  return new_chain;
1440
}
1441
#include "gt-caller-save.h"