===================================================================
@@ -277,7 +277,6 @@
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,18 +5247,25 @@
}
-/* 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 @@
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.
@@ -16521,6 +16563,12 @@
#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 @@
#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. */