aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2003-05-15 20:01:10 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2003-05-15 20:01:10 +0000
commita6ebc39a661502ac9ae1c14f11a41b05cb780896 (patch)
tree983a8518c9508538d232b4edbaa0845c23b21587
parent49a19cfd34783bd7d261bb0caa4ffcda5aa44b96 (diff)
downloadgcc-a6ebc39a661502ac9ae1c14f11a41b05cb780896.zip
gcc-a6ebc39a661502ac9ae1c14f11a41b05cb780896.tar.gz
gcc-a6ebc39a661502ac9ae1c14f11a41b05cb780896.tar.bz2
rs6000-protos.h (function_value): Protoize.
2003-05-15 Aldy Hernandez <aldyh@redhat.com> * config/rs6000/rs6000-protos.h (function_value): Protoize. * config/rs6000/rs6000.h (FUNCTION_VALUE): Call function. * config/rs6000/rs6000.c (rs6000_function_value): New. From-SVN: r66841
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/rs6000-protos.h1
-rw-r--r--gcc/config/rs6000/rs6000.c38
-rw-r--r--gcc/config/rs6000/rs6000.h23
4 files changed, 50 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 34752f1..363ea14 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2003-05-15 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000-protos.h (function_value): Protoize.
+
+ * config/rs6000/rs6000.h (FUNCTION_VALUE): Call function.
+
+ * config/rs6000/rs6000.c (rs6000_function_value): New.
+
2003-05-15 Philip Blundell <philb@gnu.org>
* config/arm/arm.c (arm_is_xscale): Rename to arm_arch_xscale.
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 8ee39e2..da75516 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -152,6 +152,7 @@ extern int function_arg_pass_by_reference PARAMS ((CUMULATIVE_ARGS *,
extern void setup_incoming_varargs PARAMS ((CUMULATIVE_ARGS *,
enum machine_mode, tree,
int *, int));
+extern rtx rs6000_function_value (tree, tree);
extern struct rtx_def *rs6000_va_arg PARAMS ((tree, tree));
extern int function_ok_for_sibcall PARAMS ((tree));
#ifdef ARGS_SIZE_RTX
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 965c3e1..e451f20 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -14396,6 +14396,44 @@ rs6000_memory_move_cost (mode, class, in)
return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
}
+/* Define how to find the value returned by a function.
+ VALTYPE is the data type of the value (as a tree).
+ If the precise function being called is known, FUNC is its FUNCTION_DECL;
+ otherwise, FUNC is 0.
+
+ On the SPE, both FPs and vectors are returned in r3.
+
+ On RS/6000 an integer value is in r3 and a floating-point value is in
+ fp1, unless -msoft-float. */
+
+rtx
+rs6000_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
+{
+ enum machine_mode mode;
+ unsigned int regno = GP_ARG_RETURN;
+
+ if ((INTEGRAL_TYPE_P (valtype)
+ && TYPE_PRECISION (valtype) < BITS_PER_WORD)
+ || POINTER_TYPE_P (valtype))
+ mode = word_mode;
+ else
+ mode = TYPE_MODE (valtype);
+
+ if (TREE_CODE (valtype) == REAL_TYPE)
+ {
+ if (TARGET_HARD_FLOAT && TARGET_FPRS)
+ regno = FP_ARG_RETURN;
+ else if (TARGET_SPE_ABI && !TARGET_FPRS)
+ regno = GP_ARG_RETURN;
+ }
+ else if (TARGET_ALTIVEC && TREE_CODE (valtype) == VECTOR_TYPE)
+ regno = ALTIVEC_ARG_RETURN;
+ else
+ regno = GP_ARG_RETURN;
+
+ return gen_rtx_REG (mode, regno);
+}
+
/* Return true if TYPE is of type __ev64_opaque__. */
static bool
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index d07eb6e..8cd28ac 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1555,26 +1555,9 @@ typedef struct rs6000_stack {
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
- otherwise, FUNC is 0.
-
- On the SPE, both FPs and vectors are returned in r3.
-
- On RS/6000 an integer value is in r3 and a floating-point value is in
- fp1, unless -msoft-float. */
-
-#define FUNCTION_VALUE(VALTYPE, FUNC) \
- gen_rtx_REG ((INTEGRAL_TYPE_P (VALTYPE) \
- && TYPE_PRECISION (VALTYPE) < BITS_PER_WORD) \
- || POINTER_TYPE_P (VALTYPE) \
- ? word_mode : TYPE_MODE (VALTYPE), \
- TREE_CODE (VALTYPE) == VECTOR_TYPE \
- && TARGET_ALTIVEC ? ALTIVEC_ARG_RETURN \
- : TREE_CODE (VALTYPE) == REAL_TYPE \
- && TARGET_SPE_ABI && !TARGET_FPRS \
- ? GP_ARG_RETURN \
- : TREE_CODE (VALTYPE) == REAL_TYPE \
- && TARGET_HARD_FLOAT && TARGET_FPRS \
- ? FP_ARG_RETURN : GP_ARG_RETURN)
+ otherwise, FUNC is 0. */
+
+#define FUNCTION_VALUE(VALTYPE, FUNC) rs6000_function_value ((VALTYPE), (FUNC))
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */