aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-06-08 19:42:25 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2001-06-08 19:42:25 +0200
commit7137fd76b55fa37aefa04e836e91ded8f974a2e8 (patch)
tree2add345de09733889088579c56a5a2804989af35
parentb912bca0f08b27318ebcdcf2ce268e3dc464d110 (diff)
downloadgcc-7137fd76b55fa37aefa04e836e91ded8f974a2e8.zip
gcc-7137fd76b55fa37aefa04e836e91ded8f974a2e8.tar.gz
gcc-7137fd76b55fa37aefa04e836e91ded8f974a2e8.tar.bz2
ia64.c (ia64_function_arg): Use [SDT]Fmode as gr_mode for complex floats passed to unprototyped functions.
* config/ia64/ia64.c (ia64_function_arg): Use [SDT]Fmode as gr_mode for complex floats passed to unprototyped functions. * gcc.c-torture/execute/20010605-2.c: New test. From-SVN: r43029
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/ia64/ia64.c6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20010605-2.c36
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fc9e902..f75f9b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2001-06-08 Jakub Jelinek <jakub@redhat.com>
+
+ * config/ia64/ia64.c (ia64_function_arg): Use [SDT]Fmode as gr_mode
+ for complex floats passed to unprototyped functions.
+
2001-06-08 Mark Mitchell <mark@codesourcery.com>
* except.c (expand_eh_region_end_allowed): Call
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index e9af4ff..b8d0803 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -2865,13 +2865,17 @@ ia64_function_arg (cum, mode, type, named, incoming)
adjusted/little endian. */
else if (byte_size - offset == 4)
gr_mode = SImode;
+ /* Complex floats need to have float mode. */
+ if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
+ gr_mode = hfa_mode;
loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (gr_mode, (basereg
+ int_regs)),
GEN_INT (offset));
offset += GET_MODE_SIZE (gr_mode);
- int_regs++;
+ int_regs += GET_MODE_SIZE (gr_mode) <= UNITS_PER_WORD
+ ? 1 : GET_MODE_SIZE (gr_mode) / UNITS_PER_WORD;
}
/* If we ended up using just one location, just return that one loc. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 134d10f..1bc218d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-06-08 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.c-torture/execute/20010605-2.c: New test.
+
2001-06-08 Nathan Sidwell <nathan@codesourcery.com>
* g++.old-deja/g++.abi/vbase2.C: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20010605-2.c b/gcc/testsuite/gcc.c-torture/execute/20010605-2.c
new file mode 100644
index 0000000..09c7f76
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20010605-2.c
@@ -0,0 +1,36 @@
+void foo (), bar (), baz ();
+int main ()
+{
+ __complex__ double x;
+ __complex__ float y;
+ __complex__ long double z;
+ __real__ x = 1.0;
+ __imag__ x = 2.0;
+ foo (x);
+ __real__ y = 3.0f;
+ __imag__ y = 4.0f;
+ bar (y);
+ __real__ z = 5.0L;
+ __imag__ z = 6.0L;
+ baz (z);
+ exit (0);
+}
+
+void foo (__complex__ double x)
+{
+ if (__real__ x != 1.0 || __imag__ x != 2.0)
+ abort ();
+}
+
+void bar (__complex__ float x)
+{
+ if (__real__ x != 3.0f || __imag__ x != 4.0f)
+ abort ();
+}
+
+void baz (__complex__ long double x)
+{
+ if (__real__ x != 5.0L || __imag__ x != 6.0L)
+ abort ();
+}
+