i386.c (contains_aligned_value_p): Return true for TCmode.
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 3 Jul 2008 12:14:16 +0000 (12:14 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 3 Jul 2008 12:14:16 +0000 (05:14 -0700)
gcc/

2008-07-03  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/i386.c (contains_aligned_value_p): Return true
for TCmode.
(ix86_data_alignment): Align TCmode to 128bits.
(ix86_local_alignment): Likewise.

testsuite/

2008-07-03  H.J. Lu  <hongjiu.lu@intel.com>
    Uros Bizjak  <ubizjak@gmail.com>

* gcc.target/i386/float128-1.c: New.

Co-Authored-By: Uros Bizjak <ubizjak@gmail.com>
From-SVN: r137416

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/float128-1.c [new file with mode: 0644]

index ad8bbd045b7e8f606224457572690674fcbd3fc5..1bd9de68ce7e6a6a5349ee5baa30d417d6322eef 100644 (file)
@@ -1,3 +1,10 @@
+2008-07-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (contains_aligned_value_p): Return true
+       for TCmode.
+       (ix86_data_alignment): Align TCmode to 128bits.
+       (ix86_local_alignment): Likewise.
+
 2008-07-03  Andrew Haley  <aph@redhat.com>
 
        PR bootstrap/33304
index 58c3dba1e8ca898ecb887e93c2fe83444ffe7ae1..a0edacaaaba212594e1bbd288f65f798f0f040a0 100644 (file)
@@ -4746,7 +4746,8 @@ contains_aligned_value_p (tree type)
   enum machine_mode mode = TYPE_MODE (type);
   if (((TARGET_SSE && SSE_REG_MODE_P (mode))
        || mode == TDmode
-       || mode == TFmode)
+       || mode == TFmode
+       || mode == TCmode)
       && (!TYPE_USER_ALIGN (type) || TYPE_ALIGN (type) > 128))
     return true;
   if (TYPE_ALIGN (type) < 128)
@@ -17103,7 +17104,8 @@ ix86_data_alignment (tree type, int align)
 
       if (TYPE_MODE (type) == DCmode && align < 64)
        return 64;
-      if (TYPE_MODE (type) == XCmode && align < 128)
+      if ((TYPE_MODE (type) == XCmode
+          || TYPE_MODE (type) == TCmode) && align < 128)
        return 128;
     }
   else if ((TREE_CODE (type) == RECORD_TYPE
@@ -17169,7 +17171,8 @@ ix86_local_alignment (tree type, enum machine_mode mode,
     {
       if (TYPE_MODE (type) == DCmode && align < 64)
        return 64;
-      if (TYPE_MODE (type) == XCmode && align < 128)
+      if ((TYPE_MODE (type) == XCmode
+          || TYPE_MODE (type) == TCmode) && align < 128)
        return 128;
     }
   else if ((TREE_CODE (type) == RECORD_TYPE
index cc23a06e70cb3f6fb6f8f5388eddc93777f48068..a511bfd2bed12379fc95c019e930b13bd5a584a0 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-03  H.J. Lu  <hongjiu.lu@intel.com>
+           Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/float128-1.c: New.
+
 2008-07-03  Andrew Haley  <aph@redhat.com>
 
        PR preprocessor/33305
diff --git a/gcc/testsuite/gcc.target/i386/float128-1.c b/gcc/testsuite/gcc.target/i386/float128-1.c
new file mode 100644 (file)
index 0000000..9c6d227
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run { target *-*-linux* } } */
+/* { dg-options "-O2 -msse2" } */
+
+#include "sse2-check.h"
+
+extern void abort (void);
+
+typedef _Complex float __attribute__((mode(TC))) _Complex128;
+
+_Complex128 __attribute__ ((noinline))
+foo (_Complex128 x, _Complex128 y)
+{
+  return x * y;
+}
+
+static void
+sse2_test (void)
+{
+  _Complex128 a = 1.3q + 3.4qi, b = 5.6q + 7.8qi, c;
+
+  c = foo (a, b);
+  if (__real__(c) == 0.0q || __imag__ (c) == 0.0q)
+    abort ();
+}