diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-11-02 09:27:23 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-11-02 08:27:23 +0000 |
commit | 0a9e65f99932bf26e1b6fe2cab23f939eeba37bc (patch) | |
tree | 0a4c104db7dd99dad262566d59e7aff0eaaf2bfb | |
parent | f25b19304b2f2978a7c6a4f33d1c19c29ae5c897 (diff) | |
download | gcc-0a9e65f99932bf26e1b6fe2cab23f939eeba37bc.zip gcc-0a9e65f99932bf26e1b6fe2cab23f939eeba37bc.tar.gz gcc-0a9e65f99932bf26e1b6fe2cab23f939eeba37bc.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/complex-1.c | 31 |
4 files changed, 49 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7678e0..01a5a56 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 1e77430..1454fd9 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 891ec33..599563b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.dg/complex-1.c b/gcc/testsuite/gcc.dg/complex-1.c new file mode 100644 index 0000000..7153433 --- /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); +} |