OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2007 07:22:14 +0000 (07:22 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 26 Apr 2007 07:22:14 +0000 (07:22 +0000)
200x-xx-xx  Richard Sandiford  <richard@codesourcery.com>
    Mark Mitchell  <mark@codesourcery.com>

* config/i386/i386-protos.h (ix86_sol10_return_in_memory): Declare.
* config/i386/i386.c (ix86_sol10_return_in_memory): New function.
* config/i386/sol2-10.h (RETURN_IN_MEMORY): Use it.

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

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/sol2-10.h

index 5dec375..ad1928a 100644 (file)
@@ -1,4 +1,11 @@
 2007-04-26  Richard Sandiford  <richard@codesourcery.com>
+           Mark Mitchell  <mark@codesourcery.com>
+
+       * config/i386/i386-protos.h (ix86_sol10_return_in_memory): Declare.
+       * config/i386/i386.c (ix86_sol10_return_in_memory): New function.
+       * config/i386/sol2-10.h (RETURN_IN_MEMORY): Use it.
+
+2007-04-26  Richard Sandiford  <richard@codesourcery.com>
 
        PR driver/31107
        * doc/invoke.texi (%:print-asm-header): Document.
index a379011..3dca7c5 100644 (file)
@@ -134,6 +134,7 @@ extern bool ix86_function_value_regno_p (int);
 extern bool ix86_function_arg_regno_p (int);
 extern int ix86_function_arg_boundary (enum machine_mode, tree);
 extern int ix86_return_in_memory (tree);
+extern int ix86_sol10_return_in_memory (tree);
 extern void ix86_va_start (tree, rtx);
 extern rtx ix86_va_arg (tree, tree);
 
index 2e0586b..adc2be7 100644 (file)
@@ -4372,6 +4372,43 @@ ix86_return_in_memory (tree type)
     return return_in_memory_32 (type, mode);
 }
 
+/* Return false iff TYPE is returned in memory.  This version is used
+   on Solaris 10.  It is similar to the generic ix86_return_in_memory,
+   but differs notably in that when MMX is available, 8-byte vectors
+   are returned in memory, rather than in MMX registers.  */
+
+int 
+ix86_sol10_return_in_memory (tree type)
+{
+  int needed_intregs, needed_sseregs, size;
+  enum machine_mode mode = type_natural_mode (type);
+
+  if (TARGET_64BIT)
+    return return_in_memory_64 (type, mode);
+
+  if (mode == BLKmode)
+    return 1;
+
+  size = int_size_in_bytes (type);
+
+  if (VECTOR_MODE_P (mode))
+    {
+      /* Return in memory only if MMX registers *are* available.  This
+        seems backwards, but it is consistent with the existing
+        Solaris x86 ABI.  */
+      if (size == 8)
+       return TARGET_MMX;
+      if (size == 16)
+       return !TARGET_SSE;
+    }
+  else if (mode == TImode)
+    return !TARGET_SSE;
+  else if (mode == XFmode)
+    return 0;
+
+  return size > 12;
+}
+
 /* When returning SSE vector types, we have a choice of either
      (1) being abi incompatible with a -march switch, or
      (2) generating an error.
index 587e56f..a3eb1f5 100644 (file)
@@ -111,12 +111,5 @@ Boston, MA 02110-1301, USA.  */
 #undef TARGET_ASM_NAMED_SECTION
 #define TARGET_ASM_NAMED_SECTION i386_solaris_elf_named_section
 
-/* In 32-bit mode, follow the SVR4 ABI definition; in 64-bit mode, use
-   the AMD64 ABI definition.  */
 #undef RETURN_IN_MEMORY
-#define RETURN_IN_MEMORY(TYPE)                 \
-  (TARGET_64BIT                                \
-   ? ix86_return_in_memory (TYPE)              \
-   : (TYPE_MODE (TYPE) == BLKmode              \
-      || (VECTOR_MODE_P (TYPE_MODE (TYPE))     \
-         && int_size_in_bytes (TYPE) == 8)))
+#define RETURN_IN_MEMORY ix86_sol10_return_in_memory