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>
|
2007-04-26 Richard Sandiford <richard@codesourcery.com>
|
||||||
|
|
||||||
PR driver/31107
|
PR driver/31107
|
||||||
|
|
|
@ -134,6 +134,7 @@ extern bool ix86_function_value_regno_p (int);
|
||||||
extern bool ix86_function_arg_regno_p (int);
|
extern bool ix86_function_arg_regno_p (int);
|
||||||
extern int ix86_function_arg_boundary (enum machine_mode, tree);
|
extern int ix86_function_arg_boundary (enum machine_mode, tree);
|
||||||
extern int ix86_return_in_memory (tree);
|
extern int ix86_return_in_memory (tree);
|
||||||
|
extern int ix86_sol10_return_in_memory (tree);
|
||||||
extern void ix86_va_start (tree, rtx);
|
extern void ix86_va_start (tree, rtx);
|
||||||
extern rtx ix86_va_arg (tree, tree);
|
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 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
|
/* When returning SSE vector types, we have a choice of either
|
||||||
(1) being abi incompatible with a -march switch, or
|
(1) being abi incompatible with a -march switch, or
|
||||||
(2) generating an error.
|
(2) generating an error.
|
||||||
|
|
|
@ -111,12 +111,5 @@ Boston, MA 02110-1301, USA. */
|
||||||
#undef TARGET_ASM_NAMED_SECTION
|
#undef TARGET_ASM_NAMED_SECTION
|
||||||
#define TARGET_ASM_NAMED_SECTION i386_solaris_elf_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
|
#undef RETURN_IN_MEMORY
|
||||||
#define RETURN_IN_MEMORY(TYPE) \
|
#define RETURN_IN_MEMORY ix86_sol10_return_in_memory
|
||||||
(TARGET_64BIT \
|
|
||||||
? ix86_return_in_memory (TYPE) \
|
|
||||||
: (TYPE_MODE (TYPE) == BLKmode \
|
|
||||||
|| (VECTOR_MODE_P (TYPE_MODE (TYPE)) \
|
|
||||||
&& int_size_in_bytes (TYPE) == 8)))
|
|
||||||
|
|
Loading…
Reference in New Issue