* config/i386/avx512vlintrin.h (_mm256_permutexvar_epi64)
authorSebastian Peryt <sebastian.peryt@intel.com>
Wed, 28 Jun 2017 20:59:51 +0000 (22:59 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 28 Jun 2017 20:59:51 +0000 (22:59 +0200)
(_mm256_permutexvar_epi32, _mm256_permutex_epi64): New intrinsics.

testsuite/ChangeLog:

* gcc.target/i386/avx512vl-vpermd-1.c (_mm256_permutexvar_epi32):
Test new intrinsic.
* gcc.target/i386/avx512vl-vpermq-imm-1.c (_mm256_permutex_epi64):
Ditto.
* gcc.target/i386/avx512vl-vpermq-var-1.c (_mm256_permutexvar_epi64):
Ditto.
* gcc.target/i386/avx512f-vpermd-2.c: Do not check for AVX512F_LEN.
* gcc.target/i386/avx512f-vpermq-imm-2.c: Ditto.
* gcc.target/i386/avx512f-vpermq-var-2.c: Ditto.

From-SVN: r249759

gcc/ChangeLog
gcc/config/i386/avx512vlintrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512f-vpermd-2.c
gcc/testsuite/gcc.target/i386/avx512f-vpermq-imm-2.c
gcc/testsuite/gcc.target/i386/avx512f-vpermq-var-2.c
gcc/testsuite/gcc.target/i386/avx512vl-vpermd-1.c
gcc/testsuite/gcc.target/i386/avx512vl-vpermq-imm-1.c
gcc/testsuite/gcc.target/i386/avx512vl-vpermq-var-1.c

index 2ecc04d9c19fdca74b2f5593ffde2b77c9e01ce9..c7523753620eeed7e465784de6fd875aceab3c77 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-28  Sebastian Peryt  <sebastian.peryt@intel.com>
+
+       * config/i386/avx512vlintrin.h (_mm256_permutexvar_epi64)
+       (_mm256_permutexvar_epi32, _mm256_permutex_epi64): New intrinsics.
+
 2017-06-28  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        * config.gcc (*-linux-musl*): Add t-musl tmake_file.
index f62f641188ee65c26f0011d81cbd446f25334416..05550516e448c3cab799753b1fa37921a833d3c6 100644 (file)
@@ -9097,6 +9097,17 @@ _mm_maskz_mul_epi32 (__mmask8 __M, __m128i __X, __m128i __Y)
                                                  __M);
 }
 
+extern __inline __m256i
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_mm256_permutexvar_epi64 (__m256i __X, __m256i __Y)
+{
+  return (__m256i) __builtin_ia32_permvardi256_mask ((__v4di) __Y,
+                                                    (__v4di) __X,
+                                                    (__v4di)
+                                                    _mm256_setzero_si256 (),
+                                                    (__mmask8) -1);
+}
+
 extern __inline __m256i
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _mm256_mask_permutexvar_epi64 (__m256i __W, __mmask8 __M, __m256i __X,
@@ -9161,6 +9172,17 @@ _mm_maskz_mul_epu32 (__mmask8 __M, __m128i __X, __m128i __Y)
                                                   __M);
 }
 
+extern __inline __m256i
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_mm256_permutexvar_epi32 (__m256i __X, __m256i __Y)
+{
+  return (__m256i) __builtin_ia32_permvarsi256_mask ((__v8si) __Y,
+                                                    (__v8si) __X,
+                                                    (__v8si)
+                                                    _mm256_setzero_si256 (),
+                                                    (__mmask8) -1);
+}
+
 extern __inline __m256i
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _mm256_mask_permutexvar_epi32 (__m256i __W, __mmask8 __M, __m256i __X,
@@ -9749,6 +9771,17 @@ _mm_cmple_epi64_mask (__m128i __X, __m128i __Y)
 }
 
 #ifdef __OPTIMIZE__
+extern __inline __m256i
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_mm256_permutex_epi64 (__m256i __X, const int __I)
+{
+  return (__m256i) __builtin_ia32_permdi256_mask ((__v4di) __X,
+                                             __I,
+                                             (__v4di)
+                                             _mm256_setzero_si256(),
+                                             (__mmask8) -1);
+}
+
 extern __inline __m256i
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _mm256_mask_permutex_epi64 (__m256i __W, __mmask8 __M,
@@ -12367,6 +12400,13 @@ _mm256_permutex_pd (__m256d __X, const int __M)
                                            _mm256_undefined_pd (),             \
                                            (__mmask8)-1))
 
+#define _mm256_permutex_epi64(X, I)               \
+  ((__m256i) __builtin_ia32_permdi256_mask ((__v4di)(__m256i)(X), \
+                                           (int)(I),           \
+                                           (__v4di)(__m256i)   \
+                                           (_mm256_setzero_si256 ()),\
+                                           (__mmask8) -1))
+
 #define _mm256_maskz_permutex_epi64(M, X, I)                    \
   ((__m256i) __builtin_ia32_permdi256_mask ((__v4di)(__m256i)(X),    \
                                            (int)(I),                \
index 8b279fa6a7b71cef25943f7640da877c21f3f577..661ef8fcd1a2064e4b12647daae298293904d479 100644 (file)
@@ -1,3 +1,15 @@
+2017-06-28  Sebastian Peryt  <sebastian.peryt@intel.com>
+
+       * gcc.target/i386/avx512vl-vpermd-1.c (_mm256_permutexvar_epi32):
+       Test new intrinsic.
+       * gcc.target/i386/avx512vl-vpermq-imm-1.c (_mm256_permutex_epi64):
+       Ditto.
+       * gcc.target/i386/avx512vl-vpermq-var-1.c (_mm256_permutexvar_epi64):
+       Ditto.
+       * gcc.target/i386/avx512f-vpermd-2.c: Do not check for AVX512F_LEN.
+       * gcc.target/i386/avx512f-vpermq-imm-2.c: Ditto.
+       * gcc.target/i386/avx512f-vpermq-var-2.c: Ditto.
+
 2017-06-28  Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * lib/target-supports.exp (check_effective_target_vect_int): Replace
index dbd4544c39e93f6fba2a01b43f1b9e5fb135cb45..b36a9c2da0a213881aaf1cfd7d75bbe8e244a909 100644 (file)
@@ -41,18 +41,14 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
-#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutexvar_epi32) (src1.x, src2.x);
-#endif
   res2.x = INTRINSIC (_maskz_permutexvar_epi32) (mask, src1.x, src2.x);
   res3.x = INTRINSIC (_mask_permutexvar_epi32) (res3.x, mask, src1.x, src2.x);
 
   CALC (src1.a, src2.a, res_ref);
 
-#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_d) (res1, res_ref))
     abort ();
-#endif
 
   MASK_ZERO (i_d) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_d) (res2, res_ref))
index 770d5623f5f454f09c5340bb9dbe8267f8c31847..dd88cd46c0b18c4903fff1c370fa0296d90a2c0a 100644 (file)
@@ -40,18 +40,14 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
-#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutex_epi64) (src1.x, IMM_MASK);
-#endif
   res2.x = INTRINSIC (_maskz_permutex_epi64) (mask, src1.x, IMM_MASK);
   res3.x = INTRINSIC (_mask_permutex_epi64) (res3.x, mask, src1.x, IMM_MASK);
 
   CALC (src1.a, IMM_MASK, res_ref);
 
-#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
     abort ();
-#endif
 
   MASK_ZERO (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
index c596b1d9c40f5bd383b55f114efc4c579c9365e8..6c222888e88c3aa65d52709c1197520175f4ba62 100644 (file)
@@ -41,18 +41,14 @@ TEST (void)
       res3.a[i] = DEFAULT_VALUE;
     }
 
-#if AVX512F_LEN == 512
   res1.x = INTRINSIC (_permutexvar_epi64) (src1.x, src2.x);
-#endif
   res2.x = INTRINSIC (_maskz_permutexvar_epi64) (mask, src1.x, src2.x);
   res3.x = INTRINSIC (_mask_permutexvar_epi64) (res3.x, mask, src1.x, src2.x);
 
   CALC (src1.a, src2.a, res_ref);
 
-#if AVX512F_LEN == 512
   if (UNION_CHECK (AVX512F_LEN, i_q) (res1, res_ref))
     abort ();
-#endif
 
   MASK_ZERO (i_q) (res_ref, mask, SIZE);
   if (UNION_CHECK (AVX512F_LEN, i_q) (res2, res_ref))
index fa1aaa390ab474c8d8e3da86ec93ebc065f99d74..069bb5d6c63ee9c1a9d6b6427cb253996351baac 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermd\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
 
@@ -11,6 +12,7 @@ volatile __mmask8 m;
 void extern
 avx512vl_test (void)
 {
+  x = _mm256_permutexvar_epi32 (x, x);
   x = _mm256_maskz_permutexvar_epi32 (m, x, x);
   x = _mm256_mask_permutexvar_epi32 (x, m, x, x);
 }
index c74c8ce96c7de2c18458a6460ee737b974297cd8..2340a6d9993b66474e74d825ceeecb98cc7e7857 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
 
@@ -11,6 +12,7 @@ volatile __mmask8 m;
 void extern
 avx512vl_test (void)
 {
+  x = _mm256_permutex_epi64 (x, 13);
   x = _mm256_mask_permutex_epi64 (x, m, x, 13);
   x = _mm256_maskz_permutex_epi64 (m, x, 13);
 }
index 43ccad3d6c1db50052372c296fed3f2ff0a53651..69185e50f766b3aa3da81875f3dc2989cf0a177b 100644 (file)
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512vl -O2" } */
+/* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\](?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}\{z\}(?:\n|\[ \\t\]+#)" 1 } } */
 /* { dg-final { scan-assembler-times "vpermq\[ \\t\]+\[^\{\n\]*%ymm\[0-9\]+\{%k\[1-7\]\}(?:\n|\[ \\t\]+#)" 1 } } */
 
@@ -11,6 +12,7 @@ volatile __mmask8 m;
 void extern
 avx512vl_test (void)
 {
+  x = _mm256_permutexvar_epi64 (x, x);
   x = _mm256_maskz_permutexvar_epi64 (m, x, x);
   x = _mm256_mask_permutexvar_epi64 (x, m, x, x);
 }