Commit a30b6839 by Richard Henderson Committed by Richard Henderson

i386.i386.c (ix86_return_in_memory): Reformat.

        * config/i386.i386.c (ix86_return_in_memory): Reformat.  Return true
        for 16-byte vector modes if sse not enabled; warn for abi change.
        (ix86_value_regno): Only return xmm0 for 16-byte vector types.
        * g++.dg/eh/simd-2.C: Add -w for x86.

From-SVN: r70771
parent c681386d
2003-08-24 Richard Henderson <rth@redhat.com>
* config/i386.i386.c (ix86_return_in_memory): Reformat. Return true
for 16-byte vector modes if sse not enabled; warn for abi change.
(ix86_value_regno): Only return xmm0 for 16-byte vector types.
2003-08-24 Kazu Hirata <kazu@cs.umass.edu> 2003-08-24 Kazu Hirata <kazu@cs.umass.edu>
* rtlanal.c (may_trap_p): Simplify an integer comparison. * rtlanal.c (may_trap_p): Simplify an integer comparison.
......
...@@ -2691,29 +2691,59 @@ ix86_function_value (tree valtype) ...@@ -2691,29 +2691,59 @@ ix86_function_value (tree valtype)
int int
ix86_return_in_memory (tree type) ix86_return_in_memory (tree type)
{ {
int needed_intregs, needed_sseregs; int needed_intregs, needed_sseregs, size;
enum machine_mode mode = TYPE_MODE (type);
if (TARGET_64BIT) if (TARGET_64BIT)
return !examine_argument (mode, type, 1, &needed_intregs, &needed_sseregs);
if (mode == BLKmode)
return 1;
size = int_size_in_bytes (type);
if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
return 0;
if (VECTOR_MODE_P (mode) || mode == TImode)
{ {
return !examine_argument (TYPE_MODE (type), type, 1, /* User-created vectors small enough to fit in EAX. */
&needed_intregs, &needed_sseregs); if (size < 8)
}
else
{
if (TYPE_MODE (type) == BLKmode)
return 1;
else if (MS_AGGREGATE_RETURN
&& AGGREGATE_TYPE_P (type)
&& int_size_in_bytes(type) <= 8)
return 0; return 0;
else if ((VECTOR_MODE_P (TYPE_MODE (type))
&& int_size_in_bytes (type) == 8) /* MMX/3dNow values are returned on the stack, since we've
|| (int_size_in_bytes (type) > 12 got to EMMS/FEMMS before returning. */
&& TYPE_MODE (type) != TImode if (size == 8)
&& TYPE_MODE (type) != TFmode
&& !VECTOR_MODE_P (TYPE_MODE (type))))
return 1; return 1;
return 0;
/* 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... */
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;
}
} }
if (mode == TFmode)
return 0;
if (size > 12)
return 1;
return 0;
} }
/* Define how to find the value returned by a library function /* Define how to find the value returned by a library function
...@@ -2746,10 +2776,14 @@ ix86_libcall_value (enum machine_mode mode) ...@@ -2746,10 +2776,14 @@ ix86_libcall_value (enum machine_mode mode)
static int static int
ix86_value_regno (enum machine_mode mode) ix86_value_regno (enum machine_mode mode)
{ {
/* Floating point return values in %st(0). */
if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_FLOAT_RETURNS_IN_80387) if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_FLOAT_RETURNS_IN_80387)
return FIRST_FLOAT_REG; return FIRST_FLOAT_REG;
if (mode == TImode || VECTOR_MODE_P (mode)) /* 16-byte vector modes in %xmm0. See ix86_return_in_memory for where
we prevent this case when sse is not available. */
if (mode == TImode || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
return FIRST_SSE_REG; return FIRST_SSE_REG;
/* Everything else in %eax. */
return 0; return 0;
} }
......
2003-08-24 Richard Henderson <rth@redhat.com>
* g++.dg/eh/simd-2.C: Add -w for x86.
2003-08-23 Jakub Jelinek <jakub@redhat.com> 2003-08-23 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/20030815-1.c: New test. * gcc.dg/20030815-1.c: New test.
......
// Test EH when V4SI SIMD registers are involved. // Test EH when V4SI SIMD registers are involved.
// Contributed by Aldy Hernandez (aldy@quesejoda.com). // Contributed by Aldy Hernandez (aldy@quesejoda.com).
// { dg-options "-O" } // { dg-options "-O" }
// { dg-options "-O -w" { target i?86-*-* } }
// { dg-do run } // { dg-do run }
typedef int __attribute__((mode(V4SI))) vecint; typedef int __attribute__((mode(V4SI))) vecint;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment