Hi all,

vdpbf16ps is using 16 bit mask. However, it only take the lower 8 bit
into consideration due to avx512fhalfmaskmode usage in pattern.

Correct to avx512fmaskmode and remove not used iterators and patterns.

Bootstraped the regtested on x86_64-pc-linux-gnu{-m32,}. Ok for trunk
and backport to GCC13/14/15/16?

Thx,
Haochen

gcc/ChangeLog:

        PR target/126429
        * config/i386/sse.md (avx512fmaskhalfmode): Removed.
        (avx512f_dpbf16ps_<mode>_maskz): Use avx512fmaskmode instead of
        avx512fmaskhalfmode.
        (avx512f_dpbf16ps_<mode>_mask): Ditto.
        (avx512f_dpbf16ps_<mode><maskz_half_name>): Rename to ...
        (avx512f_dpbf16ps_<mode><sd_maskz_name>): ... this. Use
        corresponding sd_mask_op4.
        * config/i386/subst.md (maskz_half): Remove not used pattern.

gcc/testsuite/Changelog:

        PR target/126429
        * gcc.target/testsuite/pr126429-1.c: New test.
---
 gcc/config/i386/sse.md                     | 19 ++++---------------
 gcc/config/i386/subst.md                   | 13 -------------
 gcc/testsuite/gcc.target/i386/pr126429-1.c | 15 +++++++++++++++
 3 files changed, 19 insertions(+), 28 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126429-1.c

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 38cdf607935..bd6ce2ac70c 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1109,17 +1109,6 @@
    (V16SF "hi") (V8SF  "qi") (V4SF  "qi")
    (V8DF  "qi") (V4DF  "qi") (V2DF  "qi")])
 
-;; Mapping of vector modes to corresponding mask half size
-(define_mode_attr avx512fmaskhalfmode
-  [(V64QI "SI") (V32QI "HI") (V16QI "QI")
-   (V32HI "HI") (V16HI "QI") (V8HI  "QI") (V4HI "QI")
-   (V16SI "QI") (V8SI  "QI") (V4SI  "QI")
-   (V8DI  "QI") (V4DI  "QI") (V2DI  "QI")
-   (V32HF "HI") (V16HF "QI") (V8HF  "QI")
-   (V32BF "HI") (V16BF "QI") (V8BF  "QI")
-   (V16SF "QI") (V8SF  "QI") (V4SF  "QI")
-   (V8DF  "QI") (V4DF  "QI") (V2DF  "QI")])
-
 ;; Mapping of vector float modes to an integer mode of the same size
 (define_mode_attr sseintvecmode
   [(V32HF "V32HI") (V32BF "V32HI") (V16SF "V16SI") (V8DF  "V8DI")
@@ -32630,7 +32619,7 @@
    (match_operand:VF1_AVX512VL 1 "register_operand")
    (match_operand:<sf_bf16> 2 "register_operand")
    (match_operand:<sf_bf16> 3 "register_operand")
-   (match_operand:<avx512fmaskhalfmode> 4 "register_operand")]
+   (match_operand:<avx512fmaskmode> 4 "register_operand")]
   "TARGET_AVX512BF16"
 {
   emit_insn (gen_avx512f_dpbf16ps_<mode>_maskz_1(operands[0], operands[1],
@@ -32638,7 +32627,7 @@
   DONE;
 })
 
-(define_insn "avx512f_dpbf16ps_<mode><maskz_half_name>"
+(define_insn "avx512f_dpbf16ps_<mode><sd_maskz_name>"
   [(set (match_operand:VF1_AVX512VL 0 "register_operand" "=v")
        (unspec:VF1_AVX512VL
          [(match_operand:VF1_AVX512VL 1 "register_operand" "0")
@@ -32646,7 +32635,7 @@
           (match_operand:<sf_bf16> 3 "nonimmediate_operand" "vm")]
         UNSPEC_VDPBF16PS))]
   "TARGET_AVX512BF16"
-  "vdpbf16ps\t{%3, %2, %0<maskz_half_operand4>|%0<maskz_half_operand4>, %2, 
%3}")
+  "vdpbf16ps\t{%3, %2, %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3}")
 
 (define_insn "avx512f_dpbf16ps_<mode>_mask"
   [(set (match_operand:VF1_AVX512VL 0 "register_operand" "=v")
@@ -32657,7 +32646,7 @@
             (match_operand:<sf_bf16> 3 "nonimmediate_operand" "vm")]
              UNSPEC_VDPBF16PS)
           (match_dup 1)
-          (match_operand:<avx512fmaskhalfmode> 4 "register_operand" "Yk")))]
+          (match_operand:<avx512fmaskmode> 4 "register_operand" "Yk")))]
   "TARGET_AVX512BF16"
   "vdpbf16ps\t{%3, %2, %0%{%4%}|%0%{%4%}, %2, %3}")
 
diff --git a/gcc/config/i386/subst.md b/gcc/config/i386/subst.md
index 511fd6ad5c2..f917898e4ad 100644
--- a/gcc/config/i386/subst.md
+++ b/gcc/config/i386/subst.md
@@ -470,19 +470,6 @@
             (match_operand:SI 3 "const48_operand")]
                UNSPEC_EMBEDDED_ROUNDING))])
 
-(define_subst_attr "maskz_half_name" "maskz_half" "" "_maskz_1")
-(define_subst_attr "maskz_half_operand4" "maskz_half" "" "%{%5%}%N4")
-
-(define_subst "maskz_half"
-  [(set (match_operand:SUBST_V 0)
-        (match_operand:SUBST_V 1))]
-  ""
-  [(set (match_dup 0)
-        (vec_merge:SUBST_V
-         (match_dup 1)
-         (match_operand:SUBST_V 2 "const0_operand")
-         (match_operand:<avx512fmaskhalfmode> 3 "register_operand" "Yk")))])
-
 (define_subst_attr "round_zext_name" "round_zext" "_zext" "_round_zext")
 (define_subst_attr "round_zext_constraint" "round_zext" "vm" "v")
 (define_subst_attr "round_zext_constraint2" "round_zext" "m" "v")
diff --git a/gcc/testsuite/gcc.target/i386/pr126429-1.c 
b/gcc/testsuite/gcc.target/i386/pr126429-1.c
new file mode 100644
index 00000000000..ef84fe14d1c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126429-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mavx512bf16 -mavx512dq" } */
+/* { dg-final { scan-assembler-not "kmovb" } } */
+
+#include <immintrin.h>
+
+__m512 dp16ps_mask (__m512 src, __mmask16 k, __m512bh a, __m512bh b)
+{
+  return _mm512_mask_dpbf16_ps (src, k, a, b);
+}
+
+__m512 dp16ps_maskz (__mmask16 k, __m512 src, __m512bh a, __m512bh b)
+{
+  return _mm512_maskz_dpbf16_ps (k, src, a, b);
+}
-- 
2.31.1

Reply via email to