===================================================================
@@ -36,6 +36,8 @@ #define GCC_RTL_H
#include "hard-reg-set.h"
+class predefined_function_abi;
+
/* Value used by some passes to "recognize" noop moves as valid
instructions. */
#define NOOP_MOVE_INSN_CODE INT_MAX
@@ -3383,7 +3385,8 @@ extern bool val_signbit_known_clear_p (m
unsigned HOST_WIDE_INT);
/* In reginfo.c */
-extern machine_mode choose_hard_reg_mode (unsigned int, unsigned int, bool);
+extern machine_mode choose_hard_reg_mode (unsigned int, unsigned int,
+ const predefined_function_abi *);
extern const HARD_REG_SET &simplifiable_subregs (const subreg_shape &);
/* In emit-rtl.c */
===================================================================
@@ -3017,7 +3017,7 @@ gcn_hard_regno_rename_ok (unsigned int f
gcn_hard_regno_caller_save_mode (unsigned int regno, unsigned int nregs,
machine_mode regmode)
{
- machine_mode result = choose_hard_reg_mode (regno, nregs, false);
+ machine_mode result = choose_hard_reg_mode (regno, nregs, NULL);
if (VECTOR_MODE_P (result) && !VECTOR_MODE_P (regmode))
result = (nregs == 1 ? SImode : DImode);
===================================================================
@@ -1256,7 +1256,7 @@ #define AVOID_CCMODE_COPIES
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
(CC_REGNO_P (REGNO) ? VOIDmode \
: (MODE) == VOIDmode && (NREGS) != 1 ? VOIDmode \
- : (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), false) \
+ : (MODE) == VOIDmode ? choose_hard_reg_mode ((REGNO), (NREGS), NULL) \
: (MODE) == HImode && !((GENERAL_REGNO_P (REGNO) \
&& TARGET_PARTIAL_REG_STALL) \
|| MASK_REGNO_P (REGNO)) ? SImode \
===================================================================
@@ -562,7 +562,7 @@ #define REG_ALLOC_ORDER \
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \
((FR_REGNO_P (REGNO) && (NREGS) == 1) ? RFmode \
- : choose_hard_reg_mode ((REGNO), (NREGS), false))
+ : choose_hard_reg_mode ((REGNO), (NREGS), NULL))
/* Handling Leaf Functions */
===================================================================
@@ -22174,7 +22174,7 @@ mips_hard_regno_caller_save_mode (unsign
/* For performance, avoid saving/restoring upper parts of a register
by returning MODE as save mode when the mode is known. */
if (mode == VOIDmode)
- return choose_hard_reg_mode (regno, nregs, false);
+ return choose_hard_reg_mode (regno, nregs, NULL);
else
return mode;
}
===================================================================
@@ -467,7 +467,7 @@ #define DWARF2_ASM_LINE_DEBUG_INFO 1
when spilling hard registers when they may contain PSImode values. */
#define HARD_REGNO_CALLER_SAVE_MODE(REGNO,NREGS,MODE) \
((TARGET_LARGE && ((NREGS) <= 2)) ? PSImode \
- : choose_hard_reg_mode ((REGNO), (NREGS), false))
+ : choose_hard_reg_mode ((REGNO), (NREGS), NULL))
#define ACCUMULATE_OUTGOING_ARGS 1
===================================================================
@@ -1038,7 +1038,7 @@ #define HARD_REGNO_CALLER_SAVE_MODE(REGN
? DFmode \
: (MODE) == TDmode && FP_REGNO_P (REGNO) \
? DImode \
- : choose_hard_reg_mode ((REGNO), (NREGS), false))
+ : choose_hard_reg_mode ((REGNO), (NREGS), NULL))
#define VSX_VECTOR_MODE(MODE) \
((MODE) == V4SFmode \
===================================================================
@@ -10634,7 +10634,7 @@ sh_hard_regno_caller_save_mode (unsigned
&& ((regno - FIRST_FP_REG) & 1) == 0)))
return mode;
- return choose_hard_reg_mode (regno, nregs, false);
+ return choose_hard_reg_mode (regno, nregs, NULL);
}
/* Implement TARGET_CAN_CHANGE_MODE_CLASS. */
===================================================================
@@ -442,7 +442,7 @@ init_reg_modes_target (void)
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{
- reg_raw_mode[i] = choose_hard_reg_mode (i, 1, false);
+ reg_raw_mode[i] = choose_hard_reg_mode (i, 1, NULL);
/* If we couldn't find a valid mode, just use the previous mode
if it is suitable, otherwise fall back on word_mode. */
@@ -550,10 +550,11 @@ memory_move_secondary_cost (machine_mode
/* 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.
- If CALL_SAVED is true, only consider modes that are call saved. */
+ If ABI is nonnull, only consider modes that are preserved across
+ calls that use ABI. */
machine_mode
choose_hard_reg_mode (unsigned int regno ATTRIBUTE_UNUSED,
- unsigned int nregs, bool call_saved)
+ unsigned int nregs, const predefined_function_abi *abi)
{
unsigned int /* machine_mode */ m;
machine_mode found_mode = VOIDmode, mode;
@@ -567,32 +568,28 @@ choose_hard_reg_mode (unsigned int regno
FOR_EACH_MODE_IN_CLASS (mode, MODE_INT)
if (hard_regno_nregs (regno, mode) == nregs
&& targetm.hard_regno_mode_ok (regno, mode)
- && (!call_saved
- || !targetm.hard_regno_call_part_clobbered (0, regno, mode))
+ && (!abi || !abi->clobbers_reg_p (mode, regno))
&& maybe_gt (GET_MODE_SIZE (mode), GET_MODE_SIZE (found_mode)))
found_mode = mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
if (hard_regno_nregs (regno, mode) == nregs
&& targetm.hard_regno_mode_ok (regno, mode)
- && (!call_saved
- || !targetm.hard_regno_call_part_clobbered (0, regno, mode))
+ && (!abi || !abi->clobbers_reg_p (mode, regno))
&& maybe_gt (GET_MODE_SIZE (mode), GET_MODE_SIZE (found_mode)))
found_mode = mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_FLOAT)
if (hard_regno_nregs (regno, mode) == nregs
&& targetm.hard_regno_mode_ok (regno, mode)
- && (!call_saved
- || !targetm.hard_regno_call_part_clobbered (0, regno, mode))
+ && (!abi || !abi->clobbers_reg_p (mode, regno))
&& maybe_gt (GET_MODE_SIZE (mode), GET_MODE_SIZE (found_mode)))
found_mode = mode;
FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_INT)
if (hard_regno_nregs (regno, mode) == nregs
&& targetm.hard_regno_mode_ok (regno, mode)
- && (!call_saved
- || !targetm.hard_regno_call_part_clobbered (0, regno, mode))
+ && (!abi || !abi->clobbers_reg_p (mode, regno))
&& maybe_gt (GET_MODE_SIZE (mode), GET_MODE_SIZE (found_mode)))
found_mode = mode;
@@ -605,8 +602,7 @@ choose_hard_reg_mode (unsigned int regno
mode = (machine_mode) m;
if (hard_regno_nregs (regno, mode) == nregs
&& targetm.hard_regno_mode_ok (regno, mode)
- && (!call_saved
- || !targetm.hard_regno_call_part_clobbered (0, regno, mode)))
+ && (!abi || !abi->clobbers_reg_p (mode, regno)))
return mode;
}
===================================================================
@@ -83,6 +83,7 @@ Software Foundation; either version 3, o
#include "real.h"
#include "langhooks.h"
#include "sbitmap.h"
+#include "function-abi.h"
bool
default_legitimate_address_p (machine_mode mode ATTRIBUTE_UNUSED,
@@ -1928,8 +1929,9 @@ default_dwarf_frame_reg_mode (int regno)
{
machine_mode save_mode = reg_raw_mode[regno];
- if (targetm.hard_regno_call_part_clobbered (0, regno, save_mode))
- save_mode = choose_hard_reg_mode (regno, 1, true);
+ if (targetm.hard_regno_call_part_clobbered (eh_edge_abi.id (),
+ regno, save_mode))
+ save_mode = choose_hard_reg_mode (regno, 1, &eh_edge_abi);
return save_mode;
}