From 47be3d6d5c316a2adb3b053206e5277bd9c65315 Mon Sep 17 00:00:00 2001 From: Anatoly Sokolov Date: Sun, 27 Mar 2011 23:43:13 +0400 Subject: [PATCH] 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 --- gcc/ChangeLog | 13 ++++++++ gcc/config/mips/mips-protos.h | 1 - gcc/config/mips/mips.c | 58 ++++++++++++++++++++++++++++++++--- gcc/config/mips/mips.h | 14 --------- 4 files changed, 66 insertions(+), 20 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ca0e3d69ef4..159cc114f9c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2011-03-27 Anatoly Sokolov + + * 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 * config/i386/i386.c (flag_opts): Add -mavx256-split-unaligned-load diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h index 611459884cb..cda66861d5f 100644 --- a/gcc/config/mips/mips-protos.h +++ b/gcc/config/mips/mips-protos.h @@ -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); diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index d1f6ad57fe0..0692902e845 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -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 diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 9600dcb28fd..55bdec8be06 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -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. */ -- 2.30.2