regclass.c (choose_hard_reg_mode): Add third argument.

* regclass.c (choose_hard_reg_mode): Add third argument.
	Changed all callers.
	* rtl.h (choose_hard_reg_mode): Update declaration.
	* dwarf2out.c (expand_builtin_init_dwarf_reg_sizes):
	Take HARD_REGNO_CALL_PART_CLOBBERED into account.

From-SVN: r69234
This commit is contained in:
J"orn Rennecke 2003-07-11 14:09:29 +00:00 committed by Joern Rennecke
parent 7efa3e22e5
commit fee226d25f
6 changed files with 31 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2003-07-11 J"orn Rennecke <joern.rennecke@superh.com>
* regclass.c (choose_hard_reg_mode): Add third argument.
Changed all callers.
* rtl.h (choose_hard_reg_mode): Update declaration.
* dwarf2out.c (expand_builtin_init_dwarf_reg_sizes):
Take HARD_REGNO_CALL_PART_CLOBBERED into account.
2003-07-11 Geoffrey Keating <geoffk@apple.com> 2003-07-11 Geoffrey Keating <geoffk@apple.com>
* c-decl.c (finish_decl): Handle 'used' here... * c-decl.c (finish_decl): Handle 'used' here...

View File

@ -1135,7 +1135,7 @@ do { \
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
(CC_REGNO_P (REGNO) ? VOIDmode \ (CC_REGNO_P (REGNO) ? VOIDmode \
: (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \ : (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \
: (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS)) \ : (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), false)\
: (MODE) == HImode && !TARGET_PARTIAL_REG_STALL ? SImode \ : (MODE) == HImode && !TARGET_PARTIAL_REG_STALL ? SImode \
: (MODE) == QImode && (REGNO) >= 4 && !TARGET_64BIT ? SImode \ : (MODE) == QImode && (REGNO) >= 4 && !TARGET_64BIT ? SImode \
: (MODE)) : (MODE))

View File

@ -448,8 +448,12 @@ expand_builtin_init_dwarf_reg_sizes (tree address)
if (DWARF_FRAME_REGNUM (i) < DWARF_FRAME_REGISTERS) if (DWARF_FRAME_REGNUM (i) < DWARF_FRAME_REGISTERS)
{ {
HOST_WIDE_INT offset = DWARF_FRAME_REGNUM (i) * GET_MODE_SIZE (mode); HOST_WIDE_INT offset = DWARF_FRAME_REGNUM (i) * GET_MODE_SIZE (mode);
HOST_WIDE_INT size = GET_MODE_SIZE (reg_raw_mode[i]); enum machine_mode save_mode = reg_raw_mode[i];
HOST_WIDE_INT size;
if (HARD_REGNO_CALL_PART_CLOBBERED (i, save_mode))
save_mode = choose_hard_reg_mode (i, 1, true);
size = GET_MODE_SIZE (save_mode);
if (offset < 0) if (offset < 0)
continue; continue;

View File

@ -553,7 +553,7 @@ init_reg_modes (void)
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{ {
reg_raw_mode[i] = choose_hard_reg_mode (i, 1); reg_raw_mode[i] = choose_hard_reg_mode (i, 1, false);
/* If we couldn't find a valid mode, just use the previous mode. /* If we couldn't find a valid mode, just use the previous mode.
??? One situation in which we need to do this is on the mips where ??? One situation in which we need to do this is on the mips where
@ -653,11 +653,12 @@ memory_move_secondary_cost (enum machine_mode mode, enum reg_class class, int in
#endif #endif
/* Return a machine mode that is legitimate for hard reg REGNO and large /* Return a machine mode that is legitimate for hard reg REGNO and large
enough to save nregs. If we can't find one, return VOIDmode. */ enough to save nregs. If we can't find one, return VOIDmode.
If CALL_SAVED is true, only consider modes that are call saved. */
enum machine_mode enum machine_mode
choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED, choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
unsigned int nregs) unsigned int nregs, bool call_saved)
{ {
unsigned int /* enum machine_mode */ m; unsigned int /* enum machine_mode */ m;
enum machine_mode found_mode = VOIDmode, mode; enum machine_mode found_mode = VOIDmode, mode;
@ -670,7 +671,8 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
mode != VOIDmode; mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode)) mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs
&& HARD_REGNO_MODE_OK (regno, mode)) && HARD_REGNO_MODE_OK (regno, mode)
&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
found_mode = mode; found_mode = mode;
if (found_mode != VOIDmode) if (found_mode != VOIDmode)
@ -680,7 +682,8 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
mode != VOIDmode; mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode)) mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs
&& HARD_REGNO_MODE_OK (regno, mode)) && HARD_REGNO_MODE_OK (regno, mode)
&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
found_mode = mode; found_mode = mode;
if (found_mode != VOIDmode) if (found_mode != VOIDmode)
@ -690,7 +693,8 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
mode != VOIDmode; mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode)) mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs
&& HARD_REGNO_MODE_OK (regno, mode)) && HARD_REGNO_MODE_OK (regno, mode)
&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
found_mode = mode; found_mode = mode;
if (found_mode != VOIDmode) if (found_mode != VOIDmode)
@ -700,7 +704,8 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
mode != VOIDmode; mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode)) mode = GET_MODE_WIDER_MODE (mode))
if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs
&& HARD_REGNO_MODE_OK (regno, mode)) && HARD_REGNO_MODE_OK (regno, mode)
&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
found_mode = mode; found_mode = mode;
if (found_mode != VOIDmode) if (found_mode != VOIDmode)
@ -711,7 +716,8 @@ choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
{ {
mode = (enum machine_mode) m; mode = (enum machine_mode) m;
if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs if ((unsigned) HARD_REGNO_NREGS (regno, mode) == nregs
&& HARD_REGNO_MODE_OK (regno, mode)) && HARD_REGNO_MODE_OK (regno, mode)
&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
return mode; return mode;
} }

View File

@ -210,7 +210,7 @@ extern int caller_save_needed;
/* Select a register mode required for caller save of hard regno REGNO. */ /* Select a register mode required for caller save of hard regno REGNO. */
#ifndef HARD_REGNO_CALLER_SAVE_MODE #ifndef HARD_REGNO_CALLER_SAVE_MODE
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ #define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
choose_hard_reg_mode (REGNO, NREGS) choose_hard_reg_mode (REGNO, NREGS, false)
#endif #endif
/* Registers that get partially clobbered by a call in a given mode. /* Registers that get partially clobbered by a call in a given mode.

View File

@ -1602,7 +1602,8 @@ extern rtx avoid_constant_pool_reference (rtx);
extern rtx gen_mem_addressof (rtx, tree, int); extern rtx gen_mem_addressof (rtx, tree, int);
/* In regclass.c */ /* In regclass.c */
extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int); extern enum machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
bool);
/* In emit-rtl.c */ /* In emit-rtl.c */
extern rtx set_unique_reg_note (rtx, enum reg_note, rtx); extern rtx set_unique_reg_note (rtx, enum reg_note, rtx);