Commit 47be3d6d by Anatoly Sokolov Committed by Anatoly Sokolov

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
parent c29301d6
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
......
...@@ -277,7 +277,6 @@ extern void mips_expand_prologue (void); ...@@ -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);
......
...@@ -5247,17 +5247,24 @@ mips_return_fpr_pair (enum machine_mode mode, ...@@ -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 ...@@ -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) ...@@ -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
......
...@@ -2150,20 +2150,6 @@ enum reg_class ...@@ -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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment