OSDN Git Service

* config/ia64/ia64.c (ia64_function_arg): Use [SDT]Fmode as gr_mode
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jun 2001 17:42:25 +0000 (17:42 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Jun 2001 17:42:25 +0000 (17:42 +0000)
for complex floats passed to unprototyped functions.

* gcc.c-torture/execute/20010605-2.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43029 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/ia64/ia64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20010605-2.c [new file with mode: 0644]

index fc9e902..f75f9b1 100644 (file)
@@ -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
index e9af4ff..b8d0803 100644 (file)
@@ -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.  */
index 134d10f..1bc218d 100644 (file)
@@ -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 (file)
index 0000000..09c7f76
--- /dev/null
@@ -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 ();
+}
+