alpha.h (PROMOTE_MODE): Don't promote vector types.
authorRichard Henderson <rth@redhat.com>
Sat, 14 Aug 2004 07:41:21 +0000 (00:41 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Sat, 14 Aug 2004 07:41:21 +0000 (00:41 -0700)
        * config/alpha/alpha.h (PROMOTE_MODE): Don't promote vector types.
        * config/alpha/alpha.c (function_value): Use PROMOTE_MODE.

From-SVN: r85989

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/alpha.h

index 415c0fc6dddcb5d3ddd89c1a994692fc58ab57bb..21ae7f928e22d79a1130e13f9f1aefe36b92f884 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-14  Richard Henderson  <rth@redhat.com>
+
+       * config/alpha/alpha.h (PROMOTE_MODE): Don't promote vector types.
+       * config/alpha/alpha.c (function_value): Use PROMOTE_MODE.
+
 2004-08-13  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.md (call_1, sibcall_1, call_1_rex64): Use Pmode
index d9dc759107049bfa17ea2ba66e920f8b8ef4df1c..9238ab61d75bec7f59492f821e4f6afab93716f9 100644 (file)
@@ -5160,7 +5160,7 @@ rtx
 function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
                enum machine_mode mode)
 {
-  unsigned int regnum;
+  unsigned int regnum, dummy;
   enum mode_class class;
 
 #ifdef ENABLE_CHECKING
@@ -5175,8 +5175,7 @@ function_value (tree valtype, tree func ATTRIBUTE_UNUSED,
   switch (class)
     {
     case MODE_INT:
-      /* Do the same thing as PROMOTE_MODE.  */
-      mode = DImode;
+      PROMOTE_MODE (mode, dummy, valtype);
       /* FALLTHRU */
 
     case MODE_COMPLEX_INT:
index 43cdfff7f2a825ffb5dcf25162e4e7f38b47499b..d2ab9332289ed7fa3144df215e13ed5f44570e0b 100644 (file)
@@ -471,16 +471,22 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */
    type, but kept valid in the wider mode.  The signedness of the
    extension may differ from that of the type.
 
-   For Alpha, we always store objects in a full register.  32-bit objects
-   are always sign-extended, but smaller objects retain their signedness.  */
-
-#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)  \
-  if (GET_MODE_CLASS (MODE) == MODE_INT                \
-      && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)        \
-    {                                          \
-      if ((MODE) == SImode)                    \
-       (UNSIGNEDP) = 0;                        \
-      (MODE) = DImode;                         \
+   For Alpha, we always store objects in a full register.  32-bit integers
+   are always sign-extended, but smaller objects retain their signedness.
+
+   Note that small vector types can get mapped onto integer modes at the
+   whim of not appearing in alpha-modes.def.  We never promoted these
+   values before; don't do so now that we've trimed the set of modes to
+   those actually implemented in the backend.  */
+
+#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE)                      \
+  if (GET_MODE_CLASS (MODE) == MODE_INT                                \
+      && (TYPE == NULL || TREE_CODE (TYPE) != VECTOR_TYPE)     \
+      && GET_MODE_SIZE (MODE) < UNITS_PER_WORD)                        \
+    {                                                          \
+      if ((MODE) == SImode)                                    \
+       (UNSIGNEDP) = 0;                                        \
+      (MODE) = DImode;                                         \
     }
 
 /* Define this if most significant bit is lowest numbered