diff mbox

Add AVX512 k-mask intrinsics

Message ID 20170126120537.GF1867@tucnak
State New
Headers show

Commit Message

Jakub Jelinek Jan. 26, 2017, 12:05 p.m. UTC
On Thu, Jan 26, 2017 at 03:53:44AM -0800, Kirill Yukhin wrote:
> Hi,
> On 26 Jan 12:49, Thomas Schwinge wrote:
> > Hi!
> >
> > On Thu, 26 Jan 2017 02:44:56 -0800, Kirill Yukhin <kirill.yukhin@gmail.com> wrote:
> > > On 26 Jan 10:14, Thomas Schwinge wrote:
> > > > I see:
> > > >
> > > >     {+FAIL: gcc.target/i386/avx512f-ktestw-2.c (test for excess errors)+}
> > > >     {+UNRESOLVED: gcc.target/i386/avx512f-ktestw-2.c compilation failed to produce executable+}
> > > >
> > > > ... because of:
> > > >
> > > >     /tmp/ccjv3mX2.s: Assembler messages:
> > > >     /tmp/ccjv3mX2.s:26: Error: no such instruction: `ktestw %k1,%k0'
> > > >     compiler exited with status 1
> > > Which version of gas do you use?
> >
> > A rather old one on that Ubuntu 12.10 system:
> >
> >     $ as --version
> >     GNU assembler (GNU Binutils for Ubuntu) 2.22.90.20120924
> >     [...]
> >
> > > It should be OK since v2.25.
> >
> > OK, but as done for other tests, for older versions such testing then
> > should be UNSUPPORTED instead of FAIL/UNRESOLVED (as long as that is
> > practicable, which has already been described how to do, as I understand
> > the other messages).
> This is a bug as Uroš properly mentioned. Will fix.

Like this?  Tested on x86_64-linux.  Ok for trunk?

2017-01-26  Jakub Jelinek  <jakub@redhat.com>

	* config/i386/avx512fintrin.h (_ktest_mask16_u8,
	_ktestz_mask16_u8, _ktestc_mask16_u8, _kadd_mask16): Move to ...
	* config/i386/avx512dqintrin.h (_ktest_mask16_u8,
	_ktestz_mask16_u8, _ktestc_mask16_u8, _kadd_mask16): ... here.
	* config/i386/i386-builtin.def (__builtin_ia32_ktestchi,
	__builtin_ia32_ktestzhi, __builtin_ia32_kaddhi): Use
	OPTION_MASK_ISA_AVX512DQ instead of OPTION_MASK_ISA_AVX512F.
	* config/i386/sse.md (SWI1248_AVX512BWDQ2): New mode iterator.
	(kadd<mode>, ktest<mode>): Use it instead of SWI1248_AVX512BWDQ.
testsuite/
	* gcc.target/i386/avx512f-kaddw-1.c: Renamed to ...
	* gcc.target/i386/avx512dq-kaddw-1.c: ... this.  New test.  Replace
	avx512f with avx512dq.
	* gcc.target/i386/avx512f-ktestw-1.c: Renamed to ...
	* gcc.target/i386/avx512dq-ktestw-1.c: ... this.  New test.  Replace
	avx512f with avx512dq.
	* gcc.target/i386/avx512f-ktestw-2.c: Renamed to ...
	* gcc.target/i386/avx512dq-ktestw-2.c: ... this.  New test.  Replace
	avx512f with avx512dq.



	Jakub

Comments

Kirill Yukhin Jan. 26, 2017, 12:19 p.m. UTC | #1
On 26 Jan 13:05, Jakub Jelinek wrote:
> On Thu, Jan 26, 2017 at 03:53:44AM -0800, Kirill Yukhin wrote:
> > Hi,
> > On 26 Jan 12:49, Thomas Schwinge wrote:
> > > Hi!
> > >
> > > On Thu, 26 Jan 2017 02:44:56 -0800, Kirill Yukhin <kirill.yukhin@gmail.com> wrote:
> > > > On 26 Jan 10:14, Thomas Schwinge wrote:
> > > > > I see:
> > > > >
> > > > >     {+FAIL: gcc.target/i386/avx512f-ktestw-2.c (test for excess errors)+}
> > > > >     {+UNRESOLVED: gcc.target/i386/avx512f-ktestw-2.c compilation failed to produce executable+}
> > > > >
> > > > > ... because of:
> > > > >
> > > > >     /tmp/ccjv3mX2.s: Assembler messages:
> > > > >     /tmp/ccjv3mX2.s:26: Error: no such instruction: `ktestw %k1,%k0'
> > > > >     compiler exited with status 1
> > > > Which version of gas do you use?
> > >
> > > A rather old one on that Ubuntu 12.10 system:
> > >
> > >     $ as --version
> > >     GNU assembler (GNU Binutils for Ubuntu) 2.22.90.20120924
> > >     [...]
> > >
> > > > It should be OK since v2.25.
> > >
> > > OK, but as done for other tests, for older versions such testing then
> > > should be UNSUPPORTED instead of FAIL/UNRESOLVED (as long as that is
> > > practicable, which has already been described how to do, as I understand
> > > the other messages).
> > This is a bug as Uroš properly mentioned. Will fix.
>
> Like this?  Tested on x86_64-linux.  Ok for trunk?
You're too fast. I did exactly the same.
OK for trunk.

--
Thanks, K

>
> 2017-01-26  Jakub Jelinek  <jakub@redhat.com>
>
> 	* config/i386/avx512fintrin.h (_ktest_mask16_u8,
> 	_ktestz_mask16_u8, _ktestc_mask16_u8, _kadd_mask16): Move to ...
> 	* config/i386/avx512dqintrin.h (_ktest_mask16_u8,
> 	_ktestz_mask16_u8, _ktestc_mask16_u8, _kadd_mask16): ... here.
> 	* config/i386/i386-builtin.def (__builtin_ia32_ktestchi,
> 	__builtin_ia32_ktestzhi, __builtin_ia32_kaddhi): Use
> 	OPTION_MASK_ISA_AVX512DQ instead of OPTION_MASK_ISA_AVX512F.
> 	* config/i386/sse.md (SWI1248_AVX512BWDQ2): New mode iterator.
> 	(kadd<mode>, ktest<mode>): Use it instead of SWI1248_AVX512BWDQ.
> testsuite/
> 	* gcc.target/i386/avx512f-kaddw-1.c: Renamed to ...
> 	* gcc.target/i386/avx512dq-kaddw-1.c: ... this.  New test.  Replace
> 	avx512f with avx512dq.
> 	* gcc.target/i386/avx512f-ktestw-1.c: Renamed to ...
> 	* gcc.target/i386/avx512dq-ktestw-1.c: ... this.  New test.  Replace
> 	avx512f with avx512dq.
> 	* gcc.target/i386/avx512f-ktestw-2.c: Renamed to ...
> 	* gcc.target/i386/avx512dq-ktestw-2.c: ... this.  New test.  Replace
> 	avx512f with avx512dq.
>
diff mbox

Patch

--- gcc/config/i386/avx512fintrin.h.jj	2017-01-23 18:09:48.000000000 +0100
+++ gcc/config/i386/avx512fintrin.h	2017-01-26 12:40:10.187825569 +0100
@@ -10008,28 +10008,6 @@  _mm512_maskz_expandloadu_epi32 (__mmask1
 
 extern __inline unsigned char
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
-_ktest_mask16_u8  (__mmask16 __A,  __mmask16 __B, unsigned char *__CF)
-{
-  *__CF = (unsigned char) __builtin_ia32_ktestchi (__A, __B);
-  return (unsigned char) __builtin_ia32_ktestzhi (__A, __B);
-}
-
-extern __inline unsigned char
-__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
-_ktestz_mask16_u8 (__mmask16 __A, __mmask16 __B)
-{
-  return (unsigned char) __builtin_ia32_ktestzhi (__A, __B);
-}
-
-extern __inline unsigned char
-__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
-_ktestc_mask16_u8 (__mmask16 __A, __mmask16 __B)
-{
-  return (unsigned char) __builtin_ia32_ktestchi (__A, __B);
-}
-
-extern __inline unsigned char
-__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _kortest_mask16_u8  (__mmask16 __A,  __mmask16 __B, unsigned char *__CF)
 {
   *__CF = (unsigned char) __builtin_ia32_kortestchi (__A, __B);
@@ -10052,13 +10030,6 @@  _kortestc_mask16_u8 (__mmask16 __A, __mm
 						    (__mmask16) __B);
 }
 
-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)
--- gcc/config/i386/avx512dqintrin.h.jj	2017-01-23 18:09:48.000000000 +0100
+++ gcc/config/i386/avx512dqintrin.h	2017-01-26 12:41:26.825839239 +0100
@@ -58,6 +58,28 @@  _ktestc_mask8_u8 (__mmask8 __A, __mmask8
 
 extern __inline unsigned char
 __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_ktest_mask16_u8  (__mmask16 __A,  __mmask16 __B, unsigned char *__CF)
+{
+  *__CF = (unsigned char) __builtin_ia32_ktestchi (__A, __B);
+  return (unsigned char) __builtin_ia32_ktestzhi (__A, __B);
+}
+
+extern __inline unsigned char
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_ktestz_mask16_u8 (__mmask16 __A, __mmask16 __B)
+{
+  return (unsigned char) __builtin_ia32_ktestzhi (__A, __B);
+}
+
+extern __inline unsigned char
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_ktestc_mask16_u8 (__mmask16 __A, __mmask16 __B)
+{
+  return (unsigned char) __builtin_ia32_ktestchi (__A, __B);
+}
+
+extern __inline unsigned char
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
 _kortest_mask8_u8  (__mmask8 __A,  __mmask8 __B, unsigned char *__CF)
 {
   *__CF = (unsigned char) __builtin_ia32_kortestcqi (__A, __B);
@@ -85,6 +107,13 @@  _kadd_mask8 (__mmask8 __A, __mmask8 __B)
   return (__mmask8) __builtin_ia32_kaddqi ((__mmask8) __A, (__mmask8) __B);
 }
 
+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__))
 _cvtmask8_u32 (__mmask8 __A)
--- gcc/config/i386/i386-builtin.def.jj	2017-01-23 18:09:48.000000000 +0100
+++ gcc/config/i386/i386-builtin.def	2017-01-26 12:35:47.564205530 +0100
@@ -1466,8 +1466,8 @@  BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FO
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_kiordi, "__builtin_ia32_kordi", IX86_BUILTIN_KOR64, UNKNOWN, (int) UDI_FTYPE_UDI_UDI)
 BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_ktestqi, "__builtin_ia32_ktestcqi", IX86_BUILTIN_KTESTC8, UNKNOWN, (int) UQI_FTYPE_UQI_UQI)
 BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_ktestqi, "__builtin_ia32_ktestzqi", IX86_BUILTIN_KTESTZ8, UNKNOWN, (int) UQI_FTYPE_UQI_UQI)
-BDESC (OPTION_MASK_ISA_AVX512F, CODE_FOR_ktesthi, "__builtin_ia32_ktestchi", IX86_BUILTIN_KTESTC16, UNKNOWN, (int) UHI_FTYPE_UHI_UHI)
-BDESC (OPTION_MASK_ISA_AVX512F, CODE_FOR_ktesthi, "__builtin_ia32_ktestzhi", IX86_BUILTIN_KTESTZ16, UNKNOWN, (int) UHI_FTYPE_UHI_UHI)
+BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_ktesthi, "__builtin_ia32_ktestchi", IX86_BUILTIN_KTESTC16, UNKNOWN, (int) UHI_FTYPE_UHI_UHI)
+BDESC (OPTION_MASK_ISA_AVX512DQ, CODE_FOR_ktesthi, "__builtin_ia32_ktestzhi", IX86_BUILTIN_KTESTZ16, UNKNOWN, (int) UHI_FTYPE_UHI_UHI)
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_ktestsi, "__builtin_ia32_ktestcsi", IX86_BUILTIN_KTESTC32, UNKNOWN, (int) USI_FTYPE_USI_USI)
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_ktestsi, "__builtin_ia32_ktestzsi", IX86_BUILTIN_KTESTZ32, UNKNOWN, (int) USI_FTYPE_USI_USI)
 BDESC (OPTION_MASK_ISA_AVX512BW, CODE_FOR_ktestdi, "__builtin_ia32_ktestcdi", IX86_BUILTIN_KTESTC64, UNKNOWN, (int) UDI_FTYPE_UDI_UDI)
@@ -1495,7 +1495,7 @@  BDESC (OPTION_MASK_ISA_AVX512F, CODE_FOR
 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_AVX512DQ, 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)
 
--- gcc/config/i386/sse.md.jj	2017-01-23 18:09:48.000000000 +0100
+++ gcc/config/i386/sse.md	2017-01-26 12:35:09.260698495 +0100
@@ -1302,6 +1302,11 @@  (define_mode_iterator SWI1248_AVX512BWDQ
 (define_mode_iterator SWI1248_AVX512BW
   [QI HI (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
 
+;; All integer modes with AVX512BW/DQ, even HImode requires DQ.
+(define_mode_iterator SWI1248_AVX512BWDQ2
+  [(QI "TARGET_AVX512DQ") (HI "TARGET_AVX512DQ")
+   (SI "TARGET_AVX512BW") (DI "TARGET_AVX512BW")])
+
 (define_expand "kmov<mskmodesuffix>"
   [(set (match_operand:SWI1248_AVX512BWDQ 0 "nonimmediate_operand")
 	(match_operand:SWI1248_AVX512BWDQ 1 "nonimmediate_operand"))]
@@ -1398,10 +1403,10 @@  (define_insn "knot<mode>"
 	   (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")))
+  [(set (match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "=k")
+	(plus:SWI1248_AVX512BWDQ2
+	  (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")
+	  (match_operand:SWI1248_AVX512BWDQ2 2 "register_operand" "k")))
    (unspec [(const_int 0)] UNSPEC_MASKOP)]
   "TARGET_AVX512F"
   "kadd<mskmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
@@ -1427,8 +1432,8 @@  (define_insn "k<code><mode>"
 (define_insn "ktest<mode>"
   [(set (reg:CC FLAGS_REG)
 	(unspec:CC
-	  [(match_operand:SWI1248_AVX512BWDQ 0 "register_operand" "k")
-	   (match_operand:SWI1248_AVX512BWDQ 1 "register_operand" "k")]
+	  [(match_operand:SWI1248_AVX512BWDQ2 0 "register_operand" "k")
+	   (match_operand:SWI1248_AVX512BWDQ2 1 "register_operand" "k")]
 	  UNSPEC_KTEST))]
   "TARGET_AVX512F"
   "ktest<mskmodesuffix>\t{%1, %0|%0, %1}"
--- gcc/testsuite/gcc.target/i386/avx512f-kaddw-1.c.jj	2016-12-17 20:09:36.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/avx512f-kaddw-1.c	2017-01-26 12:28:53.253553230 +0100
@@ -1,12 +0,0 @@ 
-/* { 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));
-}
--- gcc/testsuite/gcc.target/i386/avx512dq-kaddw-1.c.jj	2017-01-26 12:29:26.760119756 +0100
+++ gcc/testsuite/gcc.target/i386/avx512dq-kaddw-1.c	2017-01-26 12:29:43.395904539 +0100
@@ -0,0 +1,12 @@ 
+/* { dg-do compile } */
+/* { dg-options "-mavx512dq -O2" } */
+/* { dg-final { scan-assembler-times "kaddw\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 1 } } */
+
+#include <immintrin.h>
+
+void
+avx512dq_test ()
+{
+  __mmask16 k = _kadd_mask16 (11, 12);
+  asm volatile ("" : "+k" (k));
+}
--- gcc/testsuite/gcc.target/i386/avx512f-ktestw-1.c.jj	2017-01-23 18:09:35.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/avx512f-ktestw-1.c	2017-01-26 12:29:17.170243820 +0100
@@ -1,16 +0,0 @@ 
-/* { dg-do compile } */
-/* { dg-options "-O0 -mavx512f" } */
-/* { dg-final { scan-assembler-times "ktestw\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 2 } } */
-
-#include <immintrin.h>
-
-void
-avx512f_test () {
-  volatile __mmask16 k1;
-  __mmask16 k2;
-
-  volatile unsigned char r __attribute__((unused));	
-
-  r = _ktestc_mask16_u8(k1, k2);
-  r = _ktestz_mask16_u8(k1, k2);
-}
--- gcc/testsuite/gcc.target/i386/avx512dq-ktestw-1.c.jj	2017-01-26 12:29:53.362775598 +0100
+++ gcc/testsuite/gcc.target/i386/avx512dq-ktestw-1.c	2017-01-26 12:30:07.344594716 +0100
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O0 -mavx512dq" } */
+/* { dg-final { scan-assembler-times "ktestw\[ \\t\]+\[^\{\n\]*%k\[0-7\](?:\n|\[ \\t\]+#)" 2 } } */
+
+#include <immintrin.h>
+
+void
+avx512dq_test () {
+  volatile __mmask16 k1;
+  __mmask16 k2;
+
+  volatile unsigned char r __attribute__((unused));	
+
+  r = _ktestc_mask16_u8(k1, k2);
+  r = _ktestz_mask16_u8(k1, k2);
+}
--- gcc/testsuite/gcc.target/i386/avx512f-ktestw-2.c.jj	2017-01-23 18:09:35.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/avx512f-ktestw-2.c	2017-01-26 12:29:15.746262242 +0100
@@ -1,20 +0,0 @@ 
-/* { dg-do run } */
-/* { dg-options "-O2 -mavx512f" } */
-/* { dg-require-effective-target avx512f } */
-
-#include "avx512f-check.h"
-
-void
-avx512f_test ()
-{
-  volatile __mmask16 k1, k2;
-  unsigned char r1, r2;
-
-  __asm__( "kmovw %1, %0" : "=k" (k1) : "r" (0) );
-  __asm__( "kmovw %1, %0" : "=k" (k2) : "r" (-1) );
-
-  r1 = _ktest_mask16_u8(k1, k2, &r2);
-
-  if (r1 != 1 || r2 != 0)
-    abort ();
-}
--- gcc/testsuite/gcc.target/i386/avx512dq-ktestw-2.c.jj	2017-01-26 12:29:56.526734666 +0100
+++ gcc/testsuite/gcc.target/i386/avx512dq-ktestw-2.c	2017-01-26 12:30:23.477386006 +0100
@@ -0,0 +1,20 @@ 
+/* { dg-do run } */
+/* { dg-options "-O2 -mavx512dq" } */
+/* { dg-require-effective-target avx512dq } */
+
+#include "avx512dq-check.h"
+
+void
+avx512dq_test ()
+{
+  volatile __mmask16 k1, k2;
+  unsigned char r1, r2;
+
+  __asm__( "kmovw %1, %0" : "=k" (k1) : "r" (0) );
+  __asm__( "kmovw %1, %0" : "=k" (k2) : "r" (-1) );
+
+  r1 = _ktest_mask16_u8(k1, k2, &r2);
+
+  if (r1 != 1 || r2 != 0)
+    abort ();
+}