i386.c (TARGET_STRUCT_VALUE_RTX): New.
authorRichard Henderson <rth@redhat.com>
Wed, 23 Jun 2004 02:27:22 +0000 (19:27 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 23 Jun 2004 02:27:22 +0000 (19:27 -0700)
        * config/i386/i386.c (TARGET_STRUCT_VALUE_RTX): New.
        (ix86_return_in_memory): Move SSE vector return warning ...
        (ix86_struct_value_rtx): ... here.  New.

From-SVN: r83533

gcc/ChangeLog
gcc/config/i386/i386.c

index d53095a9c71d8b35357555a831069e2cff84a366..526a8ec00301d8bab466cd29f0f00a5ff9cc2480 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-22  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.c (TARGET_STRUCT_VALUE_RTX): New.
+       (ix86_return_in_memory): Move SSE vector return warning ...
+       (ix86_struct_value_rtx): ... here.  New.
+
 2004-06-22  Richard Henderson  <rth@redhat.com>
 
        * tree.def (VTABLE_REF): Remove.
index 30d031507e246eeae0f9be8ba589f5e53ea3c1b7..fea329863fb7382dbc15724e9b33990aafd02da2 100644 (file)
@@ -922,6 +922,7 @@ static tree ix86_handle_cdecl_attribute (tree *, tree, tree, int, bool *);
 static tree ix86_handle_regparm_attribute (tree *, tree, tree, int, bool *);
 static int ix86_value_regno (enum machine_mode);
 static bool contains_128bit_aligned_vector_p (tree);
+static rtx ix86_struct_value_rtx (tree, int);
 static bool ix86_ms_bitfield_layout_p (tree);
 static tree ix86_handle_struct_attribute (tree *, tree, tree, int, bool *);
 static int extended_reg_mentioned_1 (rtx *, void *);
@@ -1068,7 +1069,8 @@ static void init_ext_80387_constants (void);
 
 #undef TARGET_PROMOTE_PROTOTYPES
 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
-
+#undef TARGET_STRUCT_VALUE_RTX
+#define TARGET_STRUCT_VALUE_RTX ix86_struct_value_rtx
 #undef TARGET_SETUP_INCOMING_VARARGS
 #define TARGET_SETUP_INCOMING_VARARGS ix86_setup_incoming_varargs
 
@@ -2900,27 +2902,9 @@ ix86_return_in_memory (tree type)
       if (size == 8)
        return 1;
 
-      /* SSE values are returned in XMM0.  */
-      /* ??? Except when it doesn't exist?  We have a choice of
-        either (1) being abi incompatible with a -march switch,
-        or (2) generating an error here.  Given no good solution,
-        I think the safest thing is one warning.  The user won't
-        be able to use -Werror, but....  */
+      /* SSE values are returned in XMM0, except when it doesn't exist.  */
       if (size == 16)
-       {
-         static bool warned;
-
-         if (TARGET_SSE)
-           return 0;
-
-         if (!warned)
-           {
-             warned = true;
-             warning ("SSE vector return without SSE enabled "
-                      "changes the ABI");
-           }
-         return 1;
-       }
+       return (TARGET_SSE ? 0 : 1);
     }
 
   if (mode == XFmode)
@@ -2931,6 +2915,38 @@ ix86_return_in_memory (tree type)
   return 0;
 }
 
+/* When returning SSE vector types, we have a choice of either
+     (1) being abi incompatible with a -march switch, or
+     (2) generating an error.
+   Given no good solution, I think the safest thing is one warning.
+   The user won't be able to use -Werror, but....
+
+   Choose the STRUCT_VALUE_RTX hook because that's (at present) only
+   called in response to actually generating a caller or callee that
+   uses such a type.  As opposed to RETURN_IN_MEMORY, which is called
+   via aggregate_value_p for general type probing from tree-ssa.  */
+
+static rtx
+ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
+{
+  static bool warned;
+
+  if (!TARGET_SSE && type && !warned)
+    {
+      /* Look at the return type of the function, not the function type.  */
+      enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
+
+      if (mode == TImode
+         || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
+       {
+         warned = true;
+         warning ("SSE vector return without SSE enabled changes the ABI");
+       }
+    }
+
+  return NULL;
+}
+
 /* Define how to find the value returned by a library function
    assuming the value has mode MODE.  */
 rtx