aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2009-04-09 22:58:51 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2009-04-09 15:58:51 -0700
commit805586285dbb8f34cccd4d34295719f59979b649 (patch)
tree46d24cd733f827340cc68bd83323e40748cfbe0a /gcc/config
parent8c70d28b4da7f0d7ed14425ec9ba6c3f99d25742 (diff)
downloadgcc-805586285dbb8f34cccd4d34295719f59979b649.zip
gcc-805586285dbb8f34cccd4d34295719f59979b649.tar.gz
gcc-805586285dbb8f34cccd4d34295719f59979b649.tar.bz2
re PR target/39678 (complex type isn't passed correctly)
gcc/ 2009-04-09 H.J. Lu <hongjiu.lu@intel.com> PR target/39678 * config/i386/i386.c (classify_argument): Handle SCmode with (bit_offset % 64) != 0. gcc/testsuite/ 2009-04-09 H.J. Lu <hongjiu.lu@intel.com> PR target/39678 * g++.dg/torture/pr39678.C: New. * gcc.dg/compat/struct-complex-2.h: Likewise. * gcc.dg/compat/struct-complex-2_main.c: Likewise. * gcc.dg/compat/struct-complex-2_x.c: Likewise. * gcc.dg/compat/struct-complex-2_y.c: Likewise. * gcc.dg/torture/pr39678.c: Likewise. * gcc.target/i386/pr39678.c: Likewise. * gcc.dg/compat/struct-complex-1_x.c: Add -Wno-psabi. * gcc.dg/compat/struct-complex-1_y.c: Likewise. * gcc.target/x86_64/abi/test_passing_structs.c: Include <complex.h>. Add tests for structure with complex float. From-SVN: r145865
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/i386/i386.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d87e853..503cc08 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -5273,7 +5273,22 @@ classify_argument (enum machine_mode mode, const_tree type,
return 2;
case SCmode:
classes[0] = X86_64_SSE_CLASS;
- return 1;
+ if (!(bit_offset % 64))
+ return 1;
+ else
+ {
+ static bool warned;
+
+ if (!warned && warn_psabi)
+ {
+ warned = true;
+ inform (input_location,
+ "The ABI of passing structure with complex float"
+ " member has changed in GCC 4.4");
+ }
+ classes[1] = X86_64_SSESF_CLASS;
+ return 2;
+ }
case DCmode:
classes[0] = X86_64_SSEDF_CLASS;
classes[1] = X86_64_SSEDF_CLASS;