[IQ2000] Remove FUNCTION_VALUE and LIBCALL_VALUE macros.

View: New views
2 Messages — Rating Filter:   Alert me  

[IQ2000] Remove FUNCTION_VALUE and LIBCALL_VALUE macros.

by Anatoly Sokolov-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello.

  This patch removes obsolete FUNCTION_VALUE and LIBCALL_VALUE macros from
iq2000 back end in the GCC and introduces equivalent TARGET_FUNCTION_VALUE and
TARGET_LIBCALL_VALUE target hooks. Also this patch convert
FUNCTION_VALUE_REGNO_P macro to iq2000_function_value_regno_p function, this
should simplify hookize FUNCTION_VALUE_REGNO_P macro in the future.

  Regression tested on iq2000-unknown-elf.

        * config/iq2000/iq2000.c (iq2000_function_value): Make static, add
        new 'outgoing' argument.
        (iq2000_libcall_value, iq2000_function_value_regno_p): New functions.
        (TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE): Declare.
        * config/iq2000/iq2000.h: (FUNCTION_VALUE_REGNO_P): Redefine, use
        iq2000_function_value_regno_p.
        (FUNCTION_VALUE, LIBCALL_VALUE): Remove.
        * config/iq2000/iq2000-protos.h (iq2000_function_value_regno_p): Declare.

  OK to install?

Index: gcc/config/iq2000/iq2000.h
===================================================================
--- gcc/config/iq2000/iq2000.h  (revision 153951)
+++ gcc/config/iq2000/iq2000.h  (working copy)
@@ -422,20 +422,9 @@
   (((N) >= GP_ARG_FIRST && (N) <= GP_ARG_LAST))                        
 
 
-/* How Scalar Function Values are Returned.  */
-
-#define FUNCTION_VALUE(VALTYPE, FUNC)  iq2000_function_value (VALTYPE, FUNC)
-
-#define LIBCALL_VALUE(MODE)                            \
-  gen_rtx_REG (((GET_MODE_CLASS (MODE) != MODE_INT     \
-                || GET_MODE_SIZE (MODE) >= 4)          \
-               ? (MODE)                                \
-               : SImode),                              \
-              GP_RETURN)
-
 /* On the IQ2000, R2 and R3 are the only register thus used.  */
 
-#define FUNCTION_VALUE_REGNO_P(N) ((N) == GP_RETURN)
+#define FUNCTION_VALUE_REGNO_P(N) iq2000_function_value_regno_p (N)
 
 
 /* How Large Values are Returned.  */
Index: gcc/config/iq2000/iq2000-protos.h
===================================================================
--- gcc/config/iq2000/iq2000-protos.h   (revision 153951)
+++ gcc/config/iq2000/iq2000-protos.h   (working copy)
@@ -47,7 +47,7 @@
 extern void             init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx);
 extern void             function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
 extern struct rtx_def * function_arg (CUMULATIVE_ARGS *, enum machine_mode, const_tree, int);
-extern rtx              iq2000_function_value (const_tree, const_tree);
+extern bool            iq2000_function_value_regno_p (const unsigned int);
 #endif
 
 #endif /* ! GCC_IQ2000_PROTOS_H */
Index: gcc/config/iq2000/iq2000.c
===================================================================
--- gcc/config/iq2000/iq2000.c  (revision 153951)
+++ gcc/config/iq2000/iq2000.c  (working copy)
@@ -168,6 +168,8 @@
 static bool iq2000_can_eliminate      (const int, const int);
 static void iq2000_asm_trampoline_template (FILE *);
 static void iq2000_trampoline_init    (rtx, tree, rtx);
+static rtx iq2000_function_value      (const_tree, const_tree, bool);
+static rtx iq2000_libcall_value       (enum machine_mode, const_rtx);
 
 #undef  TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS           iq2000_init_builtins
@@ -197,6 +199,10 @@
 #undef  TARGET_PROMOTE_PROTOTYPES
 #define TARGET_PROMOTE_PROTOTYPES      hook_bool_const_tree_true
 
+#undef TARGET_FUNCTION_VALUE
+#define TARGET_FUNCTION_VALUE          iq2000_function_value
+#undef TARGET_LIBCALL_VALUE
+#define TARGET_LIBCALL_VALUE           iq2000_libcall_value
 #undef  TARGET_RETURN_IN_MEMORY
 #define TARGET_RETURN_IN_MEMORY                iq2000_return_in_memory
 #undef  TARGET_PASS_BY_REFERENCE
@@ -2210,18 +2216,47 @@
 /* Return register to use for a function return value with VALTYPE for function
    FUNC.  */
 
-rtx
-iq2000_function_value (const_tree valtype, const_tree func)
+static rtx
+iq2000_function_value (const_tree valtype,
+                      const_tree fn_decl_or_type,
+                      bool outgoing ATTRIBUTE_UNUSED)
 {
   int reg = GP_RETURN;
   enum machine_mode mode = TYPE_MODE (valtype);
   int unsignedp = TYPE_UNSIGNED (valtype);
+  tree func = fn_decl_or_type;
 
+  if (fn_decl_or_type
+      && !DECL_P (fn_decl_or_type))
+    fn_decl_or_type = NULL;
+
   /* Since we promote return types, we must promote the mode here too.  */
   mode = promote_function_mode (valtype, mode, &unsignedp, func, 1);
 
   return gen_rtx_REG (mode, reg);
 }
+
+/* Worker function for TARGET_LIBCALL_VALUE.  */
+
+static rtx
+iq2000_libcall_value (enum machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
+{
+  return gen_rtx_REG (((GET_MODE_CLASS (mode) != MODE_INT
+                       || GET_MODE_SIZE (mode) >= 4)
+                      ? mode : SImode),
+                     GP_RETURN);
+}
+
+/* Worker function for FUNCTION_VALUE_REGNO_P.
+
+   On the IQ2000, R2 and R3 are the only register thus used.  */
+
+bool
+iq2000_function_value_regno_p (const unsigned int regno)
+{
+  return (regno == GP_RETURN);
+}
+
 
 /* Return true when an argument must be passed by reference.  */
 


Anatoly.


Re: [IQ2000] Remove FUNCTION_VALUE and LIBCALL_VALUE macros.

by Richard Henderson-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 11/07/2009 02:04 AM, Anatoly Sokolov wrote:
>          * config/iq2000/iq2000.c (iq2000_function_value): Make static, add
>          new 'outgoing' argument.
>          (iq2000_libcall_value, iq2000_function_value_regno_p): New functions.
>          (TARGET_FUNCTION_VALUE, TARGET_LIBCALL_VALUE): Declare.
>          * config/iq2000/iq2000.h: (FUNCTION_VALUE_REGNO_P): Redefine, use
>          iq2000_function_value_regno_p.
>          (FUNCTION_VALUE, LIBCALL_VALUE): Remove.
>          * config/iq2000/iq2000-protos.h (iq2000_function_value_regno_p): Declare.

Ok.


r~