This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch: ppc make FUNCTION_VALUE a function


Had this lying around.

Bootstrapped and regression tested on ppc-linux.

OK?

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.

Index: config/rs6000/rs6000-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000-protos.h,v
retrieving revision 1.53
diff -c -p -r1.53 rs6000-protos.h
*** config/rs6000/rs6000-protos.h	12 May 2003 22:30:29 -0000	1.53
--- config/rs6000/rs6000-protos.h	15 May 2003 19:32:50 -0000
*************** extern int function_arg_pass_by_referenc
*** 152,157 ****
--- 152,158 ----
  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
Index: config/rs6000/rs6000.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.474
diff -c -p -r1.474 rs6000.c
*** config/rs6000/rs6000.c	12 May 2003 22:30:29 -0000	1.474
--- config/rs6000/rs6000.c	15 May 2003 19:32:51 -0000
*************** rs6000_memory_move_cost (mode, class, in
*** 14396,14401 ****
--- 14396,14439 ----
      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
Index: config/rs6000/rs6000.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.h,v
retrieving revision 1.273
diff -c -p -r1.273 rs6000.h
*** config/rs6000/rs6000.h 14 May 2003 07:29:52 -0000 1.273
--- config/rs6000/rs6000.h 15 May 2003 19:32:51 -0000
*************** typedef struct rs6000_stack {
*** 1555,1580 ****
/* 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)


/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
--- 1555,1563 ----
/* 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. */


! #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.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]