mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-21 08:30:35 +08:00
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:
parent
a0f8745469
commit
29173496a0
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user