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> 2011-03-27 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (flag_opts): Add -mavx256-split-unaligned-load * 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_before_return (void);
extern void mips_expand_epilogue (bool); extern void mips_expand_epilogue (bool);
extern bool mips_can_use_return_insn (void); 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, extern bool mips_cannot_change_mode_class (enum machine_mode,
enum machine_mode, enum reg_class); 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, /* Implement TARGET_FUNCTION_VALUE and TARGET_LIBCALL_VALUE.
VALTYPE is the return type and MODE is VOIDmode. For libcalls, For normal calls, VALTYPE is the return type and MODE is VOIDmode.
VALTYPE is null and MODE is the mode of the return value. */ For libcalls, VALTYPE is null and MODE is the mode of the return value. */
rtx static rtx
mips_function_value (const_tree valtype, const_tree func, enum machine_mode mode) mips_function_value_1 (const_tree valtype, const_tree fn_decl_or_type,
enum machine_mode mode)
{ {
if (valtype) if (valtype)
{ {
tree fields[2]; tree fields[2];
int unsigned_p; 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); mode = TYPE_MODE (valtype);
unsigned_p = TYPE_UNSIGNED (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); 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, /* Implement TARGET_RETURN_IN_MEMORY. Under the o32 and o64 ABIs,
all BLKmode objects are returned in memory. Under the n32, n64 all BLKmode objects are returned in memory. Under the n32, n64
and embedded ABIs, small structures are returned in a register. 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 #undef TARGET_PROMOTE_PROTOTYPES
#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true #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 #undef TARGET_RETURN_IN_MEMORY
#define TARGET_RETURN_IN_MEMORY mips_return_in_memory #define TARGET_RETURN_IN_MEMORY mips_return_in_memory
#undef TARGET_RETURN_IN_MSB #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_FIRST (FP_REG_FIRST + 12)
#define FP_ARG_LAST (FP_ARG_FIRST + MAX_ARGS_IN_REGISTERS - 1) #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. /* 1 if N is a possible register number for function argument passing.
We have no FP argument registers when soft-float. When FP registers We have no FP argument registers when soft-float. When FP registers
are 32 bits, we can't directly reference the odd numbered ones. */ are 32 bits, we can't directly reference the odd numbered ones. */