sparc.c (function_arg_partial_nregs): Return 0 for all complex modes whose size is lesser or equal to a word.
* config/sparc/sparc.c (function_arg_partial_nregs) [TARGET_ARCH64]: Return 0 for all complex modes whose size is lesser or equal to a word. Add a ??? comment for the condition used with 16-byte aligned modes. From-SVN: r73194
This commit is contained in:
parent
f25b19304b
commit
0a9e65f999
@ -1,3 +1,10 @@
|
||||
2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||
|
||||
* config/sparc/sparc.c (function_arg_partial_nregs) [TARGET_ARCH64]:
|
||||
Return 0 for all complex modes whose size is lesser or equal to
|
||||
a word. Add a ??? comment for the condition used with 16-byte
|
||||
aligned modes.
|
||||
|
||||
2003-11-01 Kelley Cook <kcook@gcc.gnu.org>
|
||||
|
||||
* .cvsignore: Remove c-parse* and tradcif.c.
|
||||
|
@ -5429,14 +5429,19 @@ function_arg_partial_nregs (const struct sparc_args *cum,
|
||||
&& slotno == SPARC_INT_ARG_MAX - 1)
|
||||
return 1;
|
||||
}
|
||||
else if ((GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
|
||||
&& GET_MODE_SIZE (mode) > UNITS_PER_WORD)
|
||||
else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
|
||||
|| (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
|
||||
&& ! (TARGET_FPU && named)))
|
||||
{
|
||||
/* The complex types are passed as packed types. */
|
||||
if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
|
||||
return 0;
|
||||
|
||||
if (GET_MODE_ALIGNMENT (mode) == 128)
|
||||
{
|
||||
slotno += slotno & 1;
|
||||
|
||||
/* ??? The mode needs 3 slots? */
|
||||
if (slotno == SPARC_INT_ARG_MAX - 2)
|
||||
return 1;
|
||||
}
|
||||
|
@ -1,3 +1,7 @@
|
||||
2003-11-02 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||
|
||||
* gcc.dg/complex-1.c: New test.
|
||||
|
||||
2003-11-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
PR c++/12796
|
||||
|
31
gcc/testsuite/gcc.dg/complex-1.c
Normal file
31
gcc/testsuite/gcc.dg/complex-1.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O" } */
|
||||
|
||||
/* Verify that the 6th complex floating-point argument is
|
||||
correctly passed as unnamed argument on SPARC64. */
|
||||
|
||||
extern void abort(void);
|
||||
|
||||
void foo(long arg1, long arg2, long arg3, long arg4, long arg5, ...)
|
||||
{
|
||||
__builtin_va_list ap;
|
||||
_Complex float cf;
|
||||
|
||||
__builtin_va_start(ap, arg5);
|
||||
cf = __builtin_va_arg(ap, _Complex float);
|
||||
__builtin_va_end(ap);
|
||||
|
||||
if (__imag__ cf != 2.0f)
|
||||
abort();
|
||||
}
|
||||
|
||||
int bar(long arg1, long arg2, long arg3, long arg4, long arg5, _Complex float arg6)
|
||||
{
|
||||
foo(arg1, arg2, arg3, arg4, arg5, arg6);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return bar(0, 0, 0, 0, 0, 2.0fi);
|
||||
}
|
Loading…
Reference in New Issue
Block a user