avx512bwintrin.h: Add new k-mask intrinsics.
authorAndrew Senkevich <andrew.senkevich@intel.com>
Sat, 17 Dec 2016 11:42:05 +0000 (12:42 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Sat, 17 Dec 2016 11:42:05 +0000 (12:42 +0100)
* config/i386/avx512bwintrin.h: Add new k-mask intrinsics.
* config/i386/avx512dqintrin.h: Ditto.
* config/i386/avx512fintrin.h: Ditto.
* config/i386/i386-builtin.def (__builtin_ia32_kaddqi,
__builtin_ia32_kaddhi, __builtin_ia32_kaddsi,
__builtin_ia32_kadddi): New.
* config/i386/sse.md (kadd<mode>): New.

testsuite/ChangeLog:

* gcc.target/i386/avx512bw-kaddd-1.c: New test.
* gcc.target/i386/avx512bw-kaddq-1.c: Ditto.
* gcc.target/i386/avx512dq-kaddb-1.c: Ditto.
* gcc.target/i386/avx512f-kaddw-1.c: Ditto.

From-SVN: r243774

gcc/ChangeLog
gcc/config/i386/avx512bwintrin.h
gcc/config/i386/avx512dqintrin.h
gcc/config/i386/avx512fintrin.h
gcc/config/i386/i386-builtin.def
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512bw-kaddd-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/avx512bw-kaddq-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/avx512dq-kaddb-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/avx512f-kaddw-1.c [new file with mode: 0644]

index d272a19481fa9f871ecaf5b0c7d92d9b9f6d1315..388532e89163b89a6c5c9506c98878fb3f827f0a 100644 (file)
@@ -1,3 +1,13 @@
+2016-12-17  Andrew Senkevich  <andrew.senkevich@intel.com>
+
+       * config/i386/avx512bwintrin.h: Add new k-mask intrinsics.
+       * config/i386/avx512dqintrin.h: Ditto.
+       * config/i386/avx512fintrin.h: Ditto.
+       * config/i386/i386-builtin.def (__builtin_ia32_kaddqi,
+       __builtin_ia32_kaddhi, __builtin_ia32_kaddsi,
+       __builtin_ia32_kadddi): New.
+       * config/i386/sse.md (kadd<mode>): New.
+
 2016-12-17  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*tzcnt<mode>_1): Merge *tzcnt<mode>_1_falsedep_1
index b35ae2b909df3262ba186de583fcf8d3b3d0ac35..e38055c1f092e5cf27b422ef178b4f6c510154e1 100644 (file)
@@ -40,6 +40,20 @@ typedef char __v64qi __attribute__ ((__vector_size__ (64)));
 
 typedef unsigned long long __mmask64;
 
+extern __inline __mmask32
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_kadd_mask32 (__mmask32 __A, __mmask32 __B)
+{
+  return (__mmask32) __builtin_ia32_kaddsi ((__mmask32) __A, (__mmask32) __B);
+}
+
+extern __inline __mmask64
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_kadd_mask64 (__mmask64 __A, __mmask64 __B)
+{
+  return (__mmask64) __builtin_ia32_kadddi ((__mmask64) __A, (__mmask64) __B);
+}
+
 extern __inline unsigned int
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _cvtmask32_u32 (__mmask32 __A)
index 4db44e4091721dff131f640c1ed30ff1ab15bc06..ccc6a4d31e77db29f26a1de56cb2fe49f0548e1c 100644 (file)
 #define __DISABLE_AVX512DQ__
 #endif /* __AVX512DQ__ */
 
+extern __inline __mmask8
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_kadd_mask8 (__mmask8 __A, __mmask8 __B)
+{
+  return (__mmask8) __builtin_ia32_kaddqi ((__mmask8) __A, (__mmask8) __B);
+}
+
 extern __inline unsigned int
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _cvtmask8_u32 (__mmask8 __A)
index a889c838046c5bd3d3f7d7d0fc2b40f7a15db822..820741c4b144be1d0756ddee2b6f2d8badd9b15b 100644 (file)
@@ -9984,6 +9984,13 @@ _mm512_maskz_expandloadu_epi32 (__mmask16 __U, void const *__P)
 #define _kxnor_mask16 _mm512_kxnor
 #define _kxor_mask16 _mm512_kxor
 
+extern __inline __mmask16
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_kadd_mask16 (__mmask16 __A, __mmask16 __B)
+{
+  return (__mmask16) __builtin_ia32_kaddhi ((__mmask16) __A, (__mmask16) __B);
+}
+
 extern __inline unsigned int
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _cvtmask16_u32 (__mmask16 __A)
index 7628278d0712f54c5e9542f978f47deb43c6a309..37a983ff86c364b6bbe5c5299c64cae7a5664259 100644 (file)
@@ -1471,6 +1471,10 @@ BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_kmovb, "__builtin_ia32_kmovb", IX86_BU
 BDESC (OPTION_MASK_ISA_AVX512F, CODE_FOR_kmovw, "__builtin_ia32_kmovw", IX86_BUILTIN_KMOV16, UNKNOWN, (int) UHI_FTYPE_UHI)
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_kmovd, "__builtin_ia32_kmovd", IX86_BUILTIN_KMOV32, UNKNOWN, (int) USI_FTYPE_USI)
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_kmovq, "__builtin_ia32_kmovq", IX86_BUILTIN_KMOV64, UNKNOWN, (int) UDI_FTYPE_UDI)
+BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_kaddqi, "__builtin_ia32_kaddqi", IX86_BUILTIN_KADD8, UNKNOWN, (int) UQI_FTYPE_UQI_UQI)
+BDESC (OPTION_MASK_ISA_AVX512F, CODE_FOR_kaddhi, "__builtin_ia32_kaddhi", IX86_BUILTIN_KADD16, UNKNOWN, (int) UHI_FTYPE_UHI_UHI)
+BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_kaddsi, "__builtin_ia32_kaddsi", IX86_BUILTIN_KADD32, UNKNOWN, (int) USI_FTYPE_USI_USI)
+BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_kadddi, "__builtin_ia32_kadddi", IX86_BUILTIN_KADD64, UNKNOWN, (int) UDI_FTYPE_UDI_UDI)
 
 /* SHA */
 BDESC (OPTION_MASK_ISA_SSE2, CODE_FOR_sha1msg1, 0, IX86_BUILTIN_SHA1MSG1, UNKNOWN, (int) V4SI_FTYPE_V4SI_V4SI)
index 6dc57aaf5ecca652d8b99184c0d7f458b90e831e..696822c3550cd8d50e5cca267cb85e2ad715d166 100644 (file)
 (define_mode_iterator SWI1248_AVX512BW
   [QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
 
-;; Mask variant shift mnemonics
-(define_code_attr mshift [(ashift "shiftl") (lshiftrt "shiftr")])
-
 (define_expand "kmov<mskmodesuffix>"
   [(set (match_operand:SWI1248_AVX512BWDQ 0 "nonimmediate_operand")
        (match_operand:SWI1248_AVX512BWDQ 1 "nonimmediate_operand"))]
           ]
           (const_string "<MODE>")))])
 
+(define_insn "kadd<mode>"
+  [(set (match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "=k")
+       (plus:SWI1248_AVX512BWDQ
+         (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")
+         (match_operand:SWI1248_AVX512BWDQ 2 "register_operand" "k")))
+   (unspec [(const_int 0)] UNSPEC_MASKOP)]
+  "TARGET_AVX512F"
+  "kadd<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "msklog")
+   (set_attr "prefix" "vex")
+   (set_attr "mode" "<MODE>")])
+
+;; Mask variant shift mnemonics
+(define_code_attr mshift [(ashift "shiftl") (lshiftrt "shiftr")])
+
 (define_insn "*k<code><mode>"
   [(set (match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "=k")
        (any_lshift:SWI1248_AVX512BWDQ
index 396a048492f8a141f9b7d89637a91caadf619506..af27093c7db52d005ab4b669b289b336b7d78b0a 100644 (file)
@@ -1,3 +1,10 @@
+2016-12-17  Andrew Senkevich  <andrew.senkevich@intel.com>
+
+       * gcc.target/i386/avx512bw-kaddd-1.c: New test.
+       * gcc.target/i386/avx512bw-kaddq-1.c: Ditto.
+       * gcc.target/i386/avx512dq-kaddb-1.c: Ditto.
+       * gcc.target/i386/avx512f-kaddw-1.c: Ditto.
+
 2016-12-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/78239
 
 2016-12-14  Toma Tabacu  <toma.tabacu@imgtec.com>
 
-       * gcc.target/mips/msa-builtins-err.c (dg-options): Add 
+       * gcc.target/mips/msa-builtins-err.c (dg-options): Add
        -ffat-lto-objects option.
 
 2016-12-14  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-kaddd-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-kaddd-1.c
new file mode 100644 (file)
index 0000000..1f6c61f
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "kaddd\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512bw_test ()
+{
+  __mmask32 k = _kadd_mask32 (11, 12);
+  asm volatile ("" : "+k" (k));
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512bw-kaddq-1.c b/gcc/testsuite/gcc.target/i386/avx512bw-kaddq-1.c
new file mode 100644 (file)
index 0000000..9e9aaae
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512bw -O2" } */
+/* { dg-final { scan-assembler-times "kaddq\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512bw_test ()
+{
+  __mmask64 k = _kadd_mask64 (11, 12);
+  asm volatile ("" : "+k" (k));
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512dq-kaddb-1.c b/gcc/testsuite/gcc.target/i386/avx512dq-kaddb-1.c
new file mode 100644 (file)
index 0000000..4be7b0b
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "kaddb\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512dq_test ()
+{
+  __mmask8 k = _kadd_mask8 (11, 12);
+  asm volatile ("" : "+k" (k));
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-kaddw-1.c b/gcc/testsuite/gcc.target/i386/avx512f-kaddw-1.c
new file mode 100644 (file)
index 0000000..957a395
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-mavx512f -O2" } */
+/* { dg-final { scan-assembler-times "kaddw\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512f_test ()
+{
+  __mmask16 k = _kadd_mask16 (11, 12);
+  asm volatile ("" : "+k" (k));
+}