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:
Anatoly Sokolov 2011-03-27 23:43:13 +04:00 committed by Anatoly Sokolov
parent c29301d6b1
commit 47be3d6d5c
4 changed files with 66 additions and 20 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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. */