explow.c (promote_mode): Use PROMOTE_FUNCTION_MODE instead of PROMOTE_FOR_CALL_ONLY.
authorPaul Brook <paul@codesourcery.com>
Thu, 8 Apr 2004 18:26:09 +0000 (18:26 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Thu, 8 Apr 2004 18:26:09 +0000 (18:26 +0000)
* explow.c (promote_mode): Use PROMOTE_FUNCTION_MODE instead of
PROMOTE_FOR_CALL_ONLY.
* config/arm/arm-protos.h (arm_function_value): Declare.
* config/arm/arm.h (TARGET_PROMOTE_FUNCTION_ARGS): Define.
(TARGET_PROMOTE_PROTOTYPES): Return false.
(arm_function_value): New function.
* config/arm/arm.h (PROMOTE_FUNCTION_MODE): Define.
(FUNCTION_VALUE): Call arm_function_value.
* config/cris/cris.h (PROMOTE_MODE): Rename ...
(PROMOTE_FUNCTION_MODE): ... to this.
(PROMOTE_FOR_CALL_ONLY): Remove.
* config/mmix/mmix.h: Likewise.
* config/s390/s390.h: Likewise.
* config/sparc/sparc.h: Likewise.
* config/sparc/sparc.c: Update comments about PROMOTE_MODE.
* doc/tm.texi (PROMOTE_FUNCTION_MODE): Document.
(TARGET_PROMOTE_FUNCTION_MODE, TARGET_PROMOTE_FUNCTION_RETURN): Update.
(PROMOTE_FOR_CALL_ONLY): Remove.

From-SVN: r80518

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.h
gcc/config/cris/cris.h
gcc/config/mmix/mmix.h
gcc/config/s390/s390.h
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/doc/tm.texi
gcc/explow.c

index ac6a4119438b46195bf57fefabd30e99160a8985..231b9e76e70816f38ed06ff2f6b93d45c9e756d9 100644 (file)
@@ -1,3 +1,24 @@
+2004-04-08  Paul Brook  <paul@codesourcery.com>
+
+       * explow.c (promote_mode): Use PROMOTE_FUNCTION_MODE instead of
+       PROMOTE_FOR_CALL_ONLY.
+       * config/arm/arm-protos.h (arm_function_value): Declare.
+       * config/arm/arm.h (TARGET_PROMOTE_FUNCTION_ARGS): Define.
+       (TARGET_PROMOTE_PROTOTYPES): Return false.
+       (arm_function_value): New function.
+       * config/arm/arm.h (PROMOTE_FUNCTION_MODE): Define.
+       (FUNCTION_VALUE): Call arm_function_value.
+       * config/cris/cris.h (PROMOTE_MODE): Rename ...
+       (PROMOTE_FUNCTION_MODE): ... to this.
+       (PROMOTE_FOR_CALL_ONLY): Remove.
+       * config/mmix/mmix.h: Likewise.
+       * config/s390/s390.h: Likewise.
+       * config/sparc/sparc.h: Likewise.
+       * config/sparc/sparc.c: Update comments about PROMOTE_MODE.
+       * doc/tm.texi (PROMOTE_FUNCTION_MODE): Document.
+       (TARGET_PROMOTE_FUNCTION_MODE, TARGET_PROMOTE_FUNCTION_RETURN): Update.
+       (PROMOTE_FOR_CALL_ONLY): Remove.
+
 2004-04-08  Joel Sherrill <joel@oarcorp.com>
 
        PR ada/14538
index 437455f452dd384fe0ccfe964a991fcca72d6f3a..0359fe7711687a347241d97fcccadb7768c5cced 100644 (file)
@@ -159,6 +159,7 @@ extern rtx arm_va_arg (tree, tree);
 extern int arm_function_arg_pass_by_reference (CUMULATIVE_ARGS *,
                                               enum machine_mode, tree, int);
 extern bool arm_needs_doubleword_align (enum machine_mode, tree);
+extern rtx arm_function_value(tree, tree);
 #endif
 
 #if defined AOF_ASSEMBLER 
index b16836d5d698280ab04822e111e04961c5014f45..6f340df7a909d2f714a1bb6990076da8fe460376 100644 (file)
@@ -244,8 +244,10 @@ static void arm_setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode,
 
 #undef TARGET_PROMOTE_FUNCTION_ARGS
 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
+#undef TARGET_PROMOTE_FUNCTION_RETURN
+#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
 #undef TARGET_PROMOTE_PROTOTYPES
-#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
+#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_false
 
 #undef TARGET_STRUCT_VALUE_RTX
 #define TARGET_STRUCT_VALUE_RTX arm_struct_value_rtx
@@ -2117,6 +2119,24 @@ arm_canonicalize_comparison (enum rtx_code code, rtx * op1)
   return code;
 }
 
+
+/* Define how to find the value returned by a function.  */
+
+rtx arm_function_value(tree type, tree func ATTRIBUTE_UNUSED)
+{
+  enum machine_mode mode;
+  int unsignedp ATTRIBUTE_UNUSED;
+  rtx r ATTRIBUTE_UNUSED;
+
+  
+  mode = TYPE_MODE (type);
+  /* Promote integer types.  */
+  if (INTEGRAL_TYPE_P (type))
+    PROMOTE_FUNCTION_MODE (mode, unsignedp, type);
+  return LIBCALL_VALUE(mode);
+}
+
+
 /* Decide whether a type should be returned in memory (true)
    or in a register (false).  This is called by the macro
    RETURN_IN_MEMORY.  */
index fa8b8f9e0a45cf1fd92d34413676a7ccd95cd077..0c3f2fe326ec7276cdd55c51079adacdea896307 100644 (file)
@@ -798,6 +798,11 @@ extern int arm_is_6_or_7;
       (MODE) = SImode;                         \
     }
 
+#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)   \
+  if (GET_MODE_CLASS (MODE) == MODE_INT                \
+      && GET_MODE_SIZE (MODE) < 4)             \
+    (MODE) = SImode;                           \
+
 /* Define this if most significant bit is lowest numbered
    in instructions that operate on numbered bit-fields.  */
 #define BITS_BIG_ENDIAN  0
@@ -1726,7 +1731,7 @@ enum reg_class
    If the precise function being called is known, FUNC is its FUNCTION_DECL;
    otherwise, FUNC is 0.  */
 #define FUNCTION_VALUE(VALTYPE, FUNC) \
-  LIBCALL_VALUE (TYPE_MODE (VALTYPE))
+  arm_function_value (VALTYPE, FUNC);
 
 /* 1 if N is a possible register number for a function value.
    On the ARM, only r0 and f0 can return results.  */
index 302484c5268d4fc8db545eab1a414945c04c2b7b..7b028e062e91db1e2e3abf2f6cc6a0e58592237e 100644 (file)
@@ -511,15 +511,15 @@ extern int target_flags;
 
 #define UNITS_PER_WORD 4
 
-/* A combination of defining PROMOTE_MODE,
-   TARGET_PROMOTE_FUNCTION_ARGS that always returns true,
-   PROMOTE_FOR_CALL_ONLY and *not* defining TARGET_PROMOTE_PROTOTYPES gives the
+/* A combination of defining PROMOTE_FUNCTION_MODE,
+   TARGET_PROMOTE_FUNCTION_ARGS that always returns true
+   and *not* defining TARGET_PROMOTE_PROTOTYPES or PROMOTE_MODE gives the
    best code size and speed for gcc, ipps and products in gcc-2.7.2.  */
 #define CRIS_PROMOTED_MODE(MODE, UNSIGNEDP, TYPE) \
  (GET_MODE_CLASS (MODE) == MODE_INT && GET_MODE_SIZE (MODE) < 4) \
   ? SImode : MODE
 
-#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)  \
+#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)  \
   (MODE) = CRIS_PROMOTED_MODE (MODE, UNSIGNEDP, TYPE)
 
 /* Defining PROMOTE_FUNCTION_RETURN in gcc-2.7.2 uncovers bug 981110 (even
@@ -528,7 +528,6 @@ extern int target_flags;
    FIXME: Report this when cris.h is part of GCC, so others can easily
    see the problem.  Maybe check other systems that define
    TARGET_PROMOTE_FUNCTION_RETURN that always returns true.  */
-#define PROMOTE_FOR_CALL_ONLY
 
 /* We will be using prototype promotion, so they will be 32 bit.  */
 #define PARM_BOUNDARY 32
index b4df95d8d46ab7eaaf14d435fd887ad380613481..01090b7771a9f10be5358ef6d652cde4e0cd8e8e 100644 (file)
@@ -280,8 +280,10 @@ extern int target_flags;
 
 /* FIXME: Promotion of modes currently generates slow code, extending
    before every operation.  */
+/* I'm a little bit undecided about this one.  It might be beneficial to
+   promote all operations.  */
 
-#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)    \
+#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)   \
  do {                                          \
   if (GET_MODE_CLASS (MODE) == MODE_INT                \
       && GET_MODE_SIZE (MODE) < 8)             \
@@ -293,10 +295,6 @@ extern int target_flags;
    }                                           \
  } while (0)
 
-/* I'm a little bit undecided about this one.  It might be beneficial to
-   promote all operations.  */
-#define PROMOTE_FOR_CALL_ONLY
-
 /* We need to align everything to 64 bits that can affect the alignment
    of other types.  Since address N is interpreted in MMIX as (N modulo
    access_size), we must align.  */
index f1386a7edcce72c11882cf3b56e263939e759820..3354f45beedccd84853a755dffae0a5a6175899a 100644 (file)
@@ -208,9 +208,7 @@ extern int target_flags;
 #define MAX_BITS_PER_WORD 64
 
 /* Function arguments and return values are promoted to word size.  */
-#define PROMOTE_FOR_CALL_ONLY
-
-#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE)            \
+#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE)           \
 if (INTEGRAL_MODE_P (MODE) &&                          \
     GET_MODE_SIZE (MODE) < UNITS_PER_WORD) {           \
   (MODE) = Pmode;                                      \
index 30b789b92172c6dfd0646d78b22ae8ea422ebd6b..76ccb34eade3ee4c5571e6c2990d4c3a5b73d68d 100644 (file)
@@ -274,20 +274,15 @@ enum processor_type sparc_cpu;
 #undef TARGET_ADDRESS_COST
 #define TARGET_ADDRESS_COST hook_int_rtx_0
 
-/* Return TRUE if the promotion described by PROMOTE_MODE should also be done
-   for outgoing function arguments.
-   This is only needed for TARGET_ARCH64, but since PROMOTE_MODE is a no-op
-   for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime test
-   for this value.  */
+/* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
+   no-op for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime
+   test for this value.  */
 #undef TARGET_PROMOTE_FUNCTION_ARGS
 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
 
-/* Return TRUE if the promotion described by PROMOTE_MODE should also be done
-   for the return value of functions.  If this macro is defined, FUNCTION_VALUE
-   must perform the same promotions done by PROMOTE_MODE.
-   This is only needed for TARGET_ARCH64, but since PROMOTE_MODE is a no-op
-   for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime test
-   for this value.  */
+/* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
+   no-op for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime
+   test for this value.  */
 #undef TARGET_PROMOTE_FUNCTION_RETURN
 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
 
index 58eb4c8e3c301bae8df6166d72f2fc5c7efb365c..33c1256e805beafd7dab69b7e08e760d40958adb 100644 (file)
@@ -712,24 +712,16 @@ extern struct sparc_cpu_select sparc_select[];
    if ptr_mode and Pmode are the same.  */
 #define POINTERS_EXTEND_UNSIGNED 1
 
-/* A macro to update MODE and UNSIGNEDP when an object whose type
-   is TYPE and which has the specified mode and signedness is to be
-   stored in a register.  This macro is only called when TYPE is a
-   scalar type.  */
-#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
+/* For TARGET_ARCH64 we need this, as we don't have instructions
+   for arithmetic operations which do zero/sign extension at the same time,
+   so without this we end up with a srl/sra after every assignment to an
+   user variable,  which means very very bad code.  */
+#define PROMOTE_FUNCTION_MODE(MODE, UNSIGNEDP, TYPE) \
 if (TARGET_ARCH64                              \
     && GET_MODE_CLASS (MODE) == MODE_INT       \
     && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)  \
   (MODE) = word_mode;
 
-/* This is only needed for TARGET_ARCH64, but since PROMOTE_MODE is a no-op
-   for TARGET_ARCH32 this is ok.  Otherwise we'd need to add a runtime test
-   for this value.  For TARGET_ARCH64 we need it, as we don't have instructions
-   for arithmetic operations which do zero/sign extension at the same time,
-   so without this we end up with a srl/sra after every assignment to an
-   user variable,  which means very very bad code.  */
-#define PROMOTE_FOR_CALL_ONLY
-
 /* Allocation boundary (in *bits*) for storing arguments in argument list.  */
 #define PARM_BOUNDARY (TARGET_ARCH64 ? 64 : 32)
 
index e8b6d9dacfda0bfd0ae1d263ac8ff38b0e650fd9..b2fe858a013a4a4118b530c5134ef607d0ba533b 100644 (file)
@@ -1071,27 +1071,29 @@ sign-extend the result to 64 bits.  On such machines, set
 Do not define this macro if it would never modify @var{m}.
 @end defmac
 
+@defmac PROMOTE_FUNCTION_MODE
+Like @code{PROMOTE_MODE}, but is applied to outgoing function arguments or
+function return values, as specified by @code{TARGET_PROMOTE_FUNCTION_ARGS}
+and @code{TARGET_PROMOTE_FUNCTION_RETURN}, respectively.
+
+The default is @code{PROMOTE_MODE}.
+@end defmac
+
 @deftypefn {Target Hook} bool TARGET_PROMOTE_FUNCTION_ARGS (tree @var{fntype})
 This target hook should return @code{true} if the promotion described by
-@code{PROMOTE_MODE} should also be done for outgoing function arguments.
+@code{PROMOTE_FUNCTION_MODE} should be done for outgoing function
+arguments.
 @end deftypefn
 
 @deftypefn {Target Hook} bool TARGET_PROMOTE_FUNCTION_RETURN (tree @var{fntype})
 This target hook should return @code{true} if the promotion described by
-@code{PROMOTE_MODE} should also be done for the return value of
+@code{PROMOTE_FUNCTION_MODE} should be done for the return value of
 functions.
 
 If this target hook returns @code{true}, @code{FUNCTION_VALUE} must
-perform the same promotions done by @code{PROMOTE_MODE}.
+perform the same promotions done by @code{PROMOTE_FUNCTON_MODE}.
 @end deftypefn
 
-@defmac PROMOTE_FOR_CALL_ONLY
-Define this macro if the promotion described by @code{PROMOTE_MODE}
-should @emph{only} be performed for outgoing function arguments or
-function return values, as specified by @code{TARGET_PROMOTE_FUNCTION_ARGS}
-and @code{TARGET_PROMOTE_FUNCTION_RETURN}, respectively.
-@end defmac
-
 @defmac PARM_BOUNDARY
 Normal alignment required for function parameters on the stack, in
 bits.  All stack parameters receive at least this much alignment
index 1eec943eb26e9e5e8281283622d94897df48ee65..1629fa85582aa981fe68af64b0146105bc2518de 100644 (file)
@@ -799,6 +799,10 @@ copy_to_suggested_reg (rtx x, rtx target, enum machine_mode mode)
 
    FOR_CALL is nonzero if this call is promoting args for a call.  */
 
+#if defined(PROMOTE_MODE) && !defined(PROMOTE_FUNCTION_MODE)
+#define PROMOTE_FUNCTON_MODE PROMOTE_MODE
+#endif
+
 enum machine_mode
 promote_mode (tree type, enum machine_mode mode, int *punsignedp,
              int for_call ATTRIBUTE_UNUSED)
@@ -806,17 +810,28 @@ promote_mode (tree type, enum machine_mode mode, int *punsignedp,
   enum tree_code code = TREE_CODE (type);
   int unsignedp = *punsignedp;
 
-#ifdef PROMOTE_FOR_CALL_ONLY
+#ifndef PROMOTE_MODE
   if (! for_call)
     return mode;
 #endif
 
   switch (code)
     {
-#ifdef PROMOTE_MODE
+#ifdef PROMOTE_FUNCTION_MODE
     case INTEGER_TYPE:   case ENUMERAL_TYPE:   case BOOLEAN_TYPE:
     case CHAR_TYPE:      case REAL_TYPE:       case OFFSET_TYPE:
-      PROMOTE_MODE (mode, unsignedp, type);
+#ifdef PROMOTE_MODE
+      if (for_call)
+       {
+#endif
+         PROMOTE_FUNCTION_MODE (mode, unsignedp, type);
+#ifdef PROMOTE_MODE
+       }
+      else
+       {
+         PROMOTE_MODE (mode, unsignedp, type);
+       }
+#endif
       break;
 #endif