From 0a9e65f99932bf26e1b6fe2cab23f939eeba37bc Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 2 Nov 2003 09:27:23 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/config/sparc/sparc.c | 9 +++++++-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/complex-1.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/complex-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7678e05fb3..01a5a567b59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-11-02 Eric Botcazou + + * 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 * .cvsignore: Remove c-parse* and tradcif.c. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 1e77430f1c7..1454fd94375 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 891ec333627..599563b14f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-11-02 Eric Botcazou + + * gcc.dg/complex-1.c: New test. + 2003-11-01 Kriang Lerdsuwanakij PR c++/12796 diff --git a/gcc/testsuite/gcc.dg/complex-1.c b/gcc/testsuite/gcc.dg/complex-1.c new file mode 100644 index 00000000000..7153433d0cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/complex-1.c @@ -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); +} -- 2.30.2