]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Disable double precision vectorizer for Atom.
authorH.J. Lu <hongjiu.lu@intel.com>
Mon, 13 Sep 2010 19:33:52 +0000 (19:33 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Mon, 13 Sep 2010 19:33:52 +0000 (12:33 -0700)
gcc/

2010-09-13  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/i386-protos.h (ix86_units_per_simd_word): New.

* config/i386/i386.c (initial_ix86_tune_features): Add
X86_TUNE_VECTORIZE_DOUBLE.
(ix86_units_per_simd_word): New.

* config/i386/i386.h (ix86_tune_indices): Add
X86_TUNE_VECTORIZE_DOUBLE.
(TARGET_VECTORIZE_DOUBLE): New.
(UNITS_PER_SIMD_WORD): Defined with ix86_units_per_simd_word.

gcc/testsuite/

2010-09-13  H.J. Lu  <hongjiu.lu@intel.com>

* gcc.target/i386/fma4-256-vector.c: Add -mtune=generic.
* gcc.target/i386/fma4-vector.c: Likewise.
* gcc.target/i386/vectorize2.c: Likewise.
* gcc.target/i386/vectorize4.c: Likewise.
* gcc.target/i386/vectorize5.c: Likewise.
* gcc.target/i386/vectorize6.c: Likewise.
* gcc.target/i386/vectorize8.c: Likewise.

* gcc.target/i386/vect-double-1.c: New.
* gcc.target/i386/vect-double-1a.c: Likewise.
* gcc.target/i386/vect-double-2.c: Likewise.
* gcc.target/i386/vect-double-2a.c: Likewise.

* lib/target-supports.exp (check_effective_target_vect_double):
Set et_vect_double_saved to 0 when tuning for Atom.

From-SVN: r164255

17 files changed:
gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/fma4-256-vector.c
gcc/testsuite/gcc.target/i386/fma4-vector.c
gcc/testsuite/gcc.target/i386/vect-double-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/vect-double-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/vect-double-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/vect-double-2a.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/vectorize2.c
gcc/testsuite/gcc.target/i386/vectorize4.c
gcc/testsuite/gcc.target/i386/vectorize5.c
gcc/testsuite/gcc.target/i386/vectorize6.c
gcc/testsuite/gcc.target/i386/vectorize8.c
gcc/testsuite/lib/target-supports.exp

index a29717b5d90eec5dbe05e0b06035b91738cdc4ea..6bd3b743ae338584f21ab573f437619c3b37f91d 100644 (file)
@@ -1,3 +1,16 @@
+2010-09-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386-protos.h (ix86_units_per_simd_word): New.
+
+       * config/i386/i386.c (initial_ix86_tune_features): Add
+       X86_TUNE_VECTORIZE_DOUBLE.
+       (ix86_units_per_simd_word): New.
+
+       * config/i386/i386.h (ix86_tune_indices): Add
+       X86_TUNE_VECTORIZE_DOUBLE.
+       (TARGET_VECTORIZE_DOUBLE): New.
+       (UNITS_PER_SIMD_WORD): Defined with ix86_units_per_simd_word.
+
 2010-09-13  Pat Haugen  <pthaugen@us.ibm.com>
 
        * tree-ssa-ter.c (temp_expr_table_d): Add call_cnt field.
index 900b4242ec89fa6ef8eb2c1f42220895c09faeb1..c4c61f700e7a2e4680fa51afca319494856aba8b 100644 (file)
@@ -50,6 +50,7 @@ extern bool x86_extended_QIreg_mentioned_p (rtx);
 extern bool x86_extended_reg_mentioned_p (rtx);
 extern bool x86_maybe_negate_const_int (rtx *, enum machine_mode);
 extern enum machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx);
+extern unsigned int ix86_units_per_simd_word (enum machine_mode);
 
 extern int avx_vpermilp_parallel (rtx par, enum machine_mode mode);
 extern int avx_vperm2f128_parallel (rtx par, enum machine_mode mode);
index 1d79a18b93a04a1b4a833dbb9211d8dc3bdb42c5..a1bc2055af19a761fcc801deb286b4c22f8b6cb1 100644 (file)
@@ -1627,6 +1627,10 @@ static unsigned int initial_ix86_tune_features[X86_TUNE_LAST] = {
   /* X86_TUNE_OPT_AGU: Optimize for Address Generation Unit. This flag
      will impact LEA instruction selection. */
   m_ATOM,
+
+  /* X86_TUNE_VECTORIZE_DOUBLE: Enable double precision vector
+     instructions.  */
+  ~m_ATOM,
 };
 
 /* Feature tests against the various architecture variations.  */
@@ -32334,6 +32338,28 @@ has_dispatch (rtx insn, int action)
   return false;
 }
 
+/* ??? No autovectorization into MMX or 3DNOW until we can reliably
+   place emms and femms instructions.  */
+
+unsigned int
+ix86_units_per_simd_word (enum machine_mode mode)
+{
+  /* Disable double precision vectorizer if needed.  */
+  if (mode == DFmode && !TARGET_VECTORIZE_DOUBLE)
+    return UNITS_PER_WORD;
+
+#if 0
+  /*  FIXME: AVX has 32byte floating point vector operations and 16byte
+      integer vector operations.  But vectorizer doesn't support
+      different sizes for integer and floating point vectors.  We limit
+      vector size to 16byte.  */
+  if (TARGET_AVX)
+    return (mode == DFmode || mode == SFmode) ? 32 : 16;
+  else
+#endif
+    return TARGET_SSE ? 16 : UNITS_PER_WORD;
+}
+
 /* Initialize the GCC target structure.  */
 #undef TARGET_RETURN_IN_MEMORY
 #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory
index 91238d5d7c7ce45c86ebe0a9c51661bfdc20b5ad..6fc2249946c11a9d9ce36fce3bd33e57fc532b41 100644 (file)
@@ -312,6 +312,7 @@ enum ix86_tune_indices {
   X86_TUNE_USE_VECTOR_CONVERTS,
   X86_TUNE_FUSE_CMP_AND_BRANCH,
   X86_TUNE_OPT_AGU,
+  X86_TUNE_VECTORIZE_DOUBLE,
 
   X86_TUNE_LAST
 };
@@ -404,6 +405,8 @@ extern unsigned char ix86_tune_features[X86_TUNE_LAST];
 #define TARGET_FUSE_CMP_AND_BRANCH \
        ix86_tune_features[X86_TUNE_FUSE_CMP_AND_BRANCH]
 #define TARGET_OPT_AGU ix86_tune_features[X86_TUNE_OPT_AGU]
+#define TARGET_VECTORIZE_DOUBLE \
+       ix86_tune_features[X86_TUNE_VECTORIZE_DOUBLE]
 
 /* Feature tests against the various architecture variations.  */
 enum ix86_arch_indices {
@@ -1030,15 +1033,7 @@ enum target_cpu_default
    || (MODE) == V2SImode || (MODE) == SImode                           \
    || (MODE) == V4HImode || (MODE) == V8QImode)
 
-/* ??? No autovectorization into MMX or 3DNOW until we can reliably
-   place emms and femms instructions.
-   FIXME: AVX has 32byte floating point vector operations and 16byte
-   integer vector operations.  But vectorizer doesn't support
-   different sizes for integer and floating point vectors.  We limit
-   vector size to 16byte.  */
-#define UNITS_PER_SIMD_WORD(MODE)                                      \
-  (TARGET_AVX ? (((MODE) == DFmode || (MODE) == SFmode) ? 16 : 16)     \
-             : (TARGET_SSE ? 16 : UNITS_PER_WORD))
+#define UNITS_PER_SIMD_WORD(MODE) ix86_units_per_simd_word (MODE)
 
 #define VALID_DFP_MODE_P(MODE) \
   ((MODE) == SDmode || (MODE) == DDmode || (MODE) == TDmode)
index 59118c228b7496c833a1cb229248ccd91a9674e7..6fe4aca41bb4065fb4aa08942097b72e2b2e9d7f 100644 (file)
@@ -1,3 +1,21 @@
+2010-09-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gcc.target/i386/fma4-256-vector.c: Add -mtune=generic.
+       * gcc.target/i386/fma4-vector.c: Likewise.
+       * gcc.target/i386/vectorize2.c: Likewise.
+       * gcc.target/i386/vectorize4.c: Likewise.
+       * gcc.target/i386/vectorize5.c: Likewise.
+       * gcc.target/i386/vectorize6.c: Likewise.
+       * gcc.target/i386/vectorize8.c: Likewise.
+
+       * gcc.target/i386/vect-double-1.c: New.
+       * gcc.target/i386/vect-double-1a.c: Likewise.
+       * gcc.target/i386/vect-double-2.c: Likewise.
+       * gcc.target/i386/vect-double-2a.c: Likewise.
+
+       * lib/target-supports.exp (check_effective_target_vect_double):
+       Set et_vect_double_saved to 0 when tuning for Atom.
+
 2010-09-13  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/torture/pr23821.c: Drop static keyword.
index 714b743186d77e766e0b1fc674c7cfba5a6293cc..1bd2ce4ddf20b7e4e19b62e7f4917a36621d3548 100644 (file)
@@ -3,7 +3,7 @@
 
 /* { dg-do compile } */
 /* { dg-require-effective-target lp64 } */
-/* { dg-options "-O2 -mfma4 -ftree-vectorize" } */
+/* { dg-options "-O2 -mfma4 -ftree-vectorize -mtune=generic" } */
 
 extern void exit (int);
 
index df8463ea32a9434d8fa25a11119ebcadb728bb3c..da12780d777901bc512ed79261a3fc5264805bb9 100644 (file)
@@ -3,7 +3,7 @@
 
 /* { dg-do compile } */
 /* { dg-require-effective-target lp64 } */
-/* { dg-options "-O2 -mfma4 -ftree-vectorize" } */
+/* { dg-options "-O2 -mfma4 -ftree-vectorize -mtune=generic" } */
 
 extern void exit (int);
 
diff --git a/gcc/testsuite/gcc.target/i386/vect-double-1.c b/gcc/testsuite/gcc.target/i386/vect-double-1.c
new file mode 100644 (file)
index 0000000..87e5fe9
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -mfpmath=sse -march=core2 -fdump-tree-vect-stats" } */
+
+extern void abort (void);
+
+#ifndef STATIC
+#define STATIC
+#endif
+
+#define N 16
+double cb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+double ca[N];
+
+STATIC void
+__attribute__ ((noinline))
+sse2_test (void)
+{  
+  int i;
+
+  for (i = 0; i < N; i++)
+    {
+      ca[i] = cb[i];
+    }
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    {
+      if (ca[i] != cb[i])
+        abort ();
+    }
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.target/i386/vect-double-1a.c b/gcc/testsuite/gcc.target/i386/vect-double-1a.c
new file mode 100644 (file)
index 0000000..a62c939
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse2 } */
+/* { dg-options "-O2 -ftree-vectorize -mfpmath=sse -msse2 -mtune=core2" } */
+
+#define STATIC static
+
+#include "vect-double-1.c"
+#include "sse2-check.h"
diff --git a/gcc/testsuite/gcc.target/i386/vect-double-2.c b/gcc/testsuite/gcc.target/i386/vect-double-2.c
new file mode 100644 (file)
index 0000000..a76dcb4
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -mfpmath=sse -msse2 -mtune=atom -fdump-tree-vect-stats" } */
+
+extern void abort (void);
+
+#ifndef STATIC
+#define STATIC
+#endif
+
+#define N 16
+double cb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+double ca[N];
+
+STATIC void
+__attribute__ ((noinline))
+sse2_test (void)
+{  
+  int i;
+
+  for (i = 0; i < N; i++)
+    {
+      ca[i] = cb[i];
+    }
+
+  /* check results:  */
+  for (i = 0; i < N; i++)
+    {
+      if (ca[i] != cb[i])
+        abort ();
+    }
+}
+
+/* { dg-final { scan-tree-dump-not "vectorized 1 loops" "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.target/i386/vect-double-2a.c b/gcc/testsuite/gcc.target/i386/vect-double-2a.c
new file mode 100644 (file)
index 0000000..94f8062
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse2 } */
+/* { dg-options "-O2 -ftree-vectorize -mfpmath=sse -msse2 -mtune=atom" } */
+
+#define STATIC static
+
+#include "vect-double-2.c"
+#include "sse2-check.h"
index 4196487195971cabd70d3175f09a38f0619dffcb..427e2d401c05e4cb290a805754f1cca199791359 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target ilp32 } */
-/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 -mfpmath=sse" } */
+/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 -mfpmath=sse -mtune=generic" } */
 
 double a[256];
 int b[256];
index f3d605e228a509f445f1ef5514249042220fddab..557d0a26ef1ead781fd05b4cfb7d58bc1b667120 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target ilp32 } */
-/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 --param ggc-min-expand=0 --param ggc-min-heapsize=0" } */
+/* { dg-options "-O2 -ffast-math -ftree-vectorize -msse2 -mtune=generic --param ggc-min-expand=0 --param ggc-min-heapsize=0" } */
 /* This test, tests two thing, we vectorize square root and also we don't crash due to a GC issue.  */
 
 
index 38942404535e01daf8c93bb3a1fe1bf5f1408a5d..04f044f621dadbbb6937596529abc2bc127f8613 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target lp64 } */
-/* { dg-options "-O2 -ftree-vectorize -mveclibabi=acml -ffast-math" } */
+/* { dg-options "-O2 -ftree-vectorize -mveclibabi=acml -ffast-math -mtune=generic" } */
 
 double x[256];
 
index 78ec53d15a81d45842cee73ac62f8468fe834293..d299a1551bf9801045eac32148bf12dd41514715 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -msse2 -ftree-vectorize -mveclibabi=svml -ffast-math" } */
+/* { dg-options "-O2 -msse2 -ftree-vectorize -mveclibabi=svml -ffast-math -mtune=generic" } */
 
 double x[256];
 
index ed1517b93efcccc987ff07a72ae4cd783e5ef808..a194bb088f1506e8a6fbfc762aef788a2076382f 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -ftree-vectorize -msse2" } */
+/* { dg-options "-O2 -ftree-vectorize -msse2 -mtune=generic" } */
 
 unsigned int a[256];
 double b[256];
index fc24b78a64f5c9896e35fad4695ce762f1acc7db..de9f21e32e5a22557601729aafd4892d39903e2f 100644 (file)
@@ -2309,8 +2309,17 @@ proc check_effective_target_vect_double { } {
     } else {
        set et_vect_double_saved 0
        if { [istarget i?86-*-*]
-             || [istarget x86_64-*-*] 
-             || [istarget spu-*-*] } {
+             || [istarget x86_64-*-*] } {
+          if { [check_no_compiler_messages vect_double assembly {
+                #ifdef __tune_atom__
+                # error No double vectorizer support.
+                #endif
+               }] } {
+               set et_vect_double_saved 1
+           } else {
+               set et_vect_double_saved 0
+           }
+       } elseif { [istarget spu-*-*] } {
           set et_vect_double_saved 1
        }
     }