mips.h (LIBCALL_VALUE, [...]): Remove macros.
* config/mips/mips.h (LIBCALL_VALUE, FUNCTION_VALUE, FUNCTION_VALUE_REGNO_P): Remove macros. * config/mips/mips-protos.h (mips_function_value): Remove. * config/mips/mips.c (mips_function_value): Rename to... (mips_function_value_1): ... this. Make static. Handle receiving the function type in 'fn_decl_or_type' argument. (mips_function_value, mips_libcall_value, mips_function_value_regno_p): New function. (TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE, TARGET_FUNCTION_VALUE_REGNO_P): Define. From-SVN: r171580
This commit is contained in:
parent
c29301d6b1
commit
47be3d6d5c
@ -1,3 +1,16 @@
|
||||
2011-03-27 Anatoly Sokolov <aesok@post.ru>
|
||||
|
||||
* config/mips/mips.h (LIBCALL_VALUE, FUNCTION_VALUE,
|
||||
FUNCTION_VALUE_REGNO_P): Remove macros.
|
||||
* config/mips/mips-protos.h (mips_function_value): Remove.
|
||||
* config/mips/mips.c (mips_function_value): Rename to...
|
||||
(mips_function_value_1): ... this. Make static. Handle receiving
|
||||
the function type in 'fn_decl_or_type' argument.
|
||||
(mips_function_value, mips_libcall_value,
|
||||
mips_function_value_regno_p): New function.
|
||||
(TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE,
|
||||
TARGET_FUNCTION_VALUE_REGNO_P): Define.
|
||||
|
||||
2011-03-27 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* config/i386/i386.c (flag_opts): Add -mavx256-split-unaligned-load
|
||||
|
@ -277,7 +277,6 @@ extern void mips_expand_prologue (void);
|
||||
extern void mips_expand_before_return (void);
|
||||
extern void mips_expand_epilogue (bool);
|
||||
extern bool mips_can_use_return_insn (void);
|
||||
extern rtx mips_function_value (const_tree, const_tree, enum machine_mode);
|
||||
|
||||
extern bool mips_cannot_change_mode_class (enum machine_mode,
|
||||
enum machine_mode, enum reg_class);
|
||||
|
@ -5247,17 +5247,24 @@ mips_return_fpr_pair (enum machine_mode mode,
|
||||
|
||||
}
|
||||
|
||||
/* Implement FUNCTION_VALUE and LIBCALL_VALUE. For normal calls,
|
||||
VALTYPE is the return type and MODE is VOIDmode. For libcalls,
|
||||
VALTYPE is null and MODE is the mode of the return value. */
|
||||
/* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
|
||||
For normal calls, VALTYPE is the return type and MODE is VOIDmode.
|
||||
For libcalls, VALTYPE is null and MODE is the mode of the return value. */
|
||||
|
||||
rtx
|
||||
mips_function_value (const_tree valtype, const_tree func, enum machine_mode mode)
|
||||
static rtx
|
||||
mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
|
||||
enum machine_mode mode)
|
||||
{
|
||||
if (valtype)
|
||||
{
|
||||
tree fields[2];
|
||||
int unsigned_p;
|
||||
const_tree func;
|
||||
|
||||
if (fn_decl_or_type && DECL_P (fn_decl_or_type))
|
||||
func = fn_decl_or_type;
|
||||
else
|
||||
func = NULL;
|
||||
|
||||
mode = TYPE_MODE (valtype);
|
||||
unsigned_p = TYPE_UNSIGNED (valtype);
|
||||
@ -5324,6 +5331,41 @@ mips_function_value (const_tree valtype, const_tree func, enum machine_mode mode
|
||||
return gen_rtx_REG (mode, GP_RETURN);
|
||||
}
|
||||
|
||||
/* Implement TARGET_FUNCTION_VALUE. */
|
||||
|
||||
static rtx
|
||||
mips_function_value (const_tree valtype, const_tree fn_decl_or_type,
|
||||
bool outgoing ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return mips_function_value_1 (valtype, fn_decl_or_type, VOIDmode);
|
||||
}
|
||||
|
||||
/* Implement TARGET_LIBCALL_VALUE. */
|
||||
|
||||
static rtx
|
||||
mips_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
|
||||
{
|
||||
return mips_function_value_1 (NULL_TREE, NULL_TREE, mode);
|
||||
}
|
||||
|
||||
/* Implement TARGET_FUNCTION_VALUE_REGNO_P.
|
||||
|
||||
On the MIPS, R2 R3 and F0 F2 are the only register thus used.
|
||||
Currently, R2 and F0 are only implemented here (C has no complex type). */
|
||||
|
||||
static bool
|
||||
mips_function_value_regno_p (const unsigned int regno)
|
||||
{
|
||||
if (regno == GP_RETURN
|
||||
|| regno == FP_RETURN
|
||||
|| (LONG_DOUBLE_TYPE_SIZE == 128
|
||||
&& FP_RETURN != GP_RETURN
|
||||
&& regno == FP_RETURN + 2))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Implement TARGET_RETURN_IN_MEMORY. Under the o32 and o64 ABIs,
|
||||
all BLKmode objects are returned in memory. Under the n32, n64
|
||||
and embedded ABIs, small structures are returned in a register.
|
||||
@ -16481,6 +16523,12 @@ mips_shift_truncation_mask (enum machine_mode mode)
|
||||
#undef TARGET_PROMOTE_PROTOTYPES
|
||||
#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
|
||||
|
||||
#undef TARGET_FUNCTION_VALUE
|
||||
#define TARGET_FUNCTION_VALUE mips_function_value
|
||||
#undef TARGET_LIBCALL_VALUE
|
||||
#define TARGET_LIBCALL_VALUE mips_libcall_value
|
||||
#undef TARGET_FUNCTION_VALUE_REGNO_P
|
||||
#define TARGET_FUNCTION_VALUE_REGNO_P mips_function_value_regno_p
|
||||
#undef TARGET_RETURN_IN_MEMORY
|
||||
#define TARGET_RETURN_IN_MEMORY mips_return_in_memory
|
||||
#undef TARGET_RETURN_IN_MSB
|
||||
|
@ -2150,20 +2150,6 @@ enum reg_class
|
||||
#define FP_ARG_FIRST (FP_REG_FIRST + 12)
|
||||
#define FP_ARG_LAST (FP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1)
|
||||
|
||||
#define LIBCALL_VALUE(MODE) \
|
||||
mips_function_value (NULL_TREE, NULL_TREE, MODE)
|
||||
|
||||
#define FUNCTION_VALUE(VALTYPE, FUNC) \
|
||||
mips_function_value (VALTYPE, FUNC, VOIDmode)
|
||||
|
||||
/* 1 if N is a possible register number for a function value.
|
||||
On the MIPS, R2 R3 and F0 F2 are the only register thus used.
|
||||
Currently, R2 and F0 are only implemented here (C has no complex type) */
|
||||
|
||||
#define FUNCTION_VALUE_REGNO_P(N) ((N) == GP_RETURN || (N) == FP_RETURN \
|
||||
|| (LONG_DOUBLE_TYPE_SIZE == 128 && FP_RETURN != GP_RETURN \
|
||||
&& (N) == FP_RETURN + 2))
|
||||
|
||||
/* 1 if N is a possible register number for function argument passing.
|
||||
We have no FP argument registers when soft-float. When FP registers
|
||||
are 32 bits, we can't directly reference the odd numbered ones. */
|
||||
|
Loading…
Reference in New Issue
Block a user