OSDN Git Service

* config/alpha/alpha.h (PROMOTE_MODE): Don't promote vector types.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Aug 2004 07:41:21 +0000 (07:41 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 14 Aug 2004 07:41:21 +0000 (07:41 +0000)
        * config/alpha/alpha.c (function_value): Use PROMOTE_MODE.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@85989 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 415c0fc..21ae7f9 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 d9dc759..9238ab6 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 43cdfff..d2ab933 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