200x-xx-xx Richard Sandiford <richard@codesourcery.com> Mark Mitchell <mark@codesourcery.com>

gcc/
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.

Co-Authored-By: Mark Mitchell <mark@codesourcery.com>

From-SVN: r124176
This commit is contained in:
Richard Sandiford 2007-04-26 07:22:14 +00:00 committed by Richard Sandiford
parent a0f8745469
commit 29173496a0
4 changed files with 46 additions and 8 deletions

View File

@ -1,3 +1,10 @@
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

View 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);

View 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.

View 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