Outer product instructions in ACEv1 are quite similar as those
VNNI dot product instructions in AVX/AVX512/AVX10 space. Thus,
we use the same naming convention as dot product for these
insts.

gcc/ChangeLog:

        * config/i386/acev1intrin.h: Add new intrins.
        * config/i386/i386-builtin-types.def: Add new builtin type.
        * config/i386/i386-builtin.def (BDESC): Add new builtins.
        * config/i386/i386-expand.cc (ix86_expand_ace_builtin):
        Handle new builtin type.
        * config/i386/sse.md (UNSPECV_TOP2BF16PS): New.
        (UNSPECV_TOP4BSSD): Ditto.
        (UNSPECV_TOP4BSSDS): Ditto.
        (UNSPECV_TOP4BSUD): Ditto.
        (UNSPECV_TOP4BSUDS): Ditto.
        (UNSPECV_TOP4BUSD): Ditto.
        (UNSPECV_TOP4BUSDS): Ditto.
        (UNSPECV_TOP4BUUD): Ditto.
        (UNSPECV_TOP4BUUDS): Ditto.
        (UNSPECV_TOP4MXBF8PS): Ditto.
        (UNSPECV_TOP4MXBHF8PS): Ditto.
        (UNSPECV_TOP4MXHBF8PS): Ditto.
        (UNSPECV_TOP4MXHF8PS): Ditto.
        (UNSPECV_TOP4MXBSSPS): Ditto.
        (top2bf16ps): Ditto.
        (top4<top4bdtype>): Ditto.
        (top4<top4mxfp8type>ps): Ditto.
        (top4mxbssps): Ditto.

gcc/testsuite/ChangeLog:

        * gcc.target/i386/acev1-1.c: Add compile test.
        * gcc.target/i386/ace-check.h: Add helper function.
        * gcc.target/i386/ace-helper.h: Ditto.
        * gcc.target/i386/fp8-helper.h: Modify helper function
        to skip special value check.
        * gcc.target/i386/avx-1.c: Add acev1 tests.
        * gcc.target/i386/sse-13.c: Ditto.
        * gcc.target/i386/sse-14.c: Ditto.
        * gcc.target/i386/sse-22.c: Ditto.
        * gcc.target/i386/sse-23.c: Ditto.
        * gcc.target/i386/acev1-op2bf16ps-2.c: New test.
        * gcc.target/i386/acev1-op4bssd-2.c: Ditto.
        * gcc.target/i386/acev1-op4bsud-2.c: Ditto.
        * gcc.target/i386/acev1-op4busd-2.c: Ditto.
        * gcc.target/i386/acev1-op4buud-2.c: Ditto.
        * gcc.target/i386/acev1-op4mxbf8ps-2.c: Ditto.
        * gcc.target/i386/acev1-op4mxbhf8ps-2.c: Ditto.
        * gcc.target/i386/acev1-op4mxbssps-2.c: Ditto.
        * gcc.target/i386/acev1-op4mxhbf8ps-2.c: Ditto.
        * gcc.target/i386/acev1-op4mxhf8ps-2.c: Ditto.

Co-authored-by: Dipesh Sharma <[email protected]>
---
 gcc/config/i386/acev1intrin.h                 | 100 ++++++++++++++++++
 gcc/config/i386/i386-builtin-types.def        |   3 +
 gcc/config/i386/i386-builtin.def              |  10 ++
 gcc/config/i386/i386-expand.cc                |  18 +++-
 gcc/config/i386/sse.md                        |  82 ++++++++++++++
 gcc/testsuite/gcc.target/i386/ace-check.h     |  21 ++++
 gcc/testsuite/gcc.target/i386/ace-helper.h    |  11 ++
 gcc/testsuite/gcc.target/i386/acev1-1.c       |  24 +++++
 .../gcc.target/i386/acev1-op2bf16ps-2.c       |  47 ++++++++
 .../gcc.target/i386/acev1-op4bssd-2.c         |  47 ++++++++
 .../gcc.target/i386/acev1-op4bsud-2.c         |  48 +++++++++
 .../gcc.target/i386/acev1-op4busd-2.c         |  48 +++++++++
 .../gcc.target/i386/acev1-op4buud-2.c         |  46 ++++++++
 .../gcc.target/i386/acev1-op4mxbf8ps-2.c      |  59 +++++++++++
 .../gcc.target/i386/acev1-op4mxbhf8ps-2.c     |  59 +++++++++++
 .../gcc.target/i386/acev1-op4mxbssps-2.c      |  54 ++++++++++
 .../gcc.target/i386/acev1-op4mxhbf8ps-2.c     |  59 +++++++++++
 .../gcc.target/i386/acev1-op4mxhf8ps-2.c      |  59 +++++++++++
 gcc/testsuite/gcc.target/i386/avx-1.c         |  10 ++
 gcc/testsuite/gcc.target/i386/fp8-helper.h    |  21 ++--
 gcc/testsuite/gcc.target/i386/sse-13.c        |  10 ++
 gcc/testsuite/gcc.target/i386/sse-14.c        |  14 +++
 gcc/testsuite/gcc.target/i386/sse-22.c        |  14 +++
 gcc/testsuite/gcc.target/i386/sse-23.c        |  10 ++
 24 files changed, 862 insertions(+), 12 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op2bf16ps-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4bssd-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4bsud-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4busd-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4buud-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4mxbf8ps-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4mxbhf8ps-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4mxbssps-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4mxhbf8ps-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-op4mxhf8ps-2.c

diff --git a/gcc/config/i386/acev1intrin.h b/gcc/config/i386/acev1intrin.h
index 7b205304302..a449c52af01 100644
--- a/gcc/config/i386/acev1intrin.h
+++ b/gcc/config/i386/acev1intrin.h
@@ -155,6 +155,76 @@ _tile_insertcol (const int __A, __m512i __B, int __C)
   __builtin_ia32_tilemovcolinsert (__A, (__v16si) __B, __C);
 }
 
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op2bf16_ps (const int __W, __m512bh __A, __m512bh __B)
+{
+  __builtin_ia32_top2bf16ps (__W, (__v32bf) __A, (__v32bf) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4bssd_epi32 (const int __W, __m512i __A, __m512i __B)
+{
+  __builtin_ia32_top4bssd (__W, (__v64qi) __A, (__v64qi) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4bsud_epi32 (const int __W, __m512i __A, __m512i __B)
+{
+  __builtin_ia32_top4bsud (__W, (__v64qi) __A, (__v64qi) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4busd_epi32 (const int __W, __m512i __A, __m512i __B)
+{
+  __builtin_ia32_top4busd (__W, (__v64qi) __A, (__v64qi) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4buud_epi32 (const int __W, __m512i __A, __m512i __B)
+{
+  __builtin_ia32_top4buud (__W, (__v64qi) __A, (__v64qi) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4mxbf8_ps (const int __W, __m512i __A, __m512i __B, const int __C)
+{
+  __builtin_ia32_top4mxbf8ps (__W, (__v64qi) __A, (__v64qi) __B, __C);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4mxbhf8_ps (const int __W, __m512i __A, __m512i __B, const int __C)
+{
+  __builtin_ia32_top4mxbhf8ps (__W, (__v64qi) __A, (__v64qi) __B, __C);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4mxhbf8_ps (const int __W, __m512i __A, __m512i __B, const int __C)
+{
+  __builtin_ia32_top4mxhbf8ps (__W, (__v64qi) __A, (__v64qi) __B, __C);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4mxhf8_ps (const int __W, __m512i __A, __m512i __B, const int __C)
+{
+  __builtin_ia32_top4mxhf8ps (__W, (__v64qi) __A, (__v64qi) __B, __C);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_tile_op4mxbss_ps (const int __W, __m512i __A, __m512i __B, const int __C)
+{
+  __builtin_ia32_top4mxbssps (__W, (__v64qi) __A, (__v64qi) __B, __C);
+}
+
 #else
 #define _tile_ace_zero(A)                      \
   __builtin_ia32_tilezero (A);
@@ -183,6 +253,36 @@ _tile_insertcol (const int __A, __m512i __B, int __C)
 #define _tile_insertcol(A, B, C)               \
   __builtin_ia32_tilemovcolinsert ((A), (__v16si) (B), (C))
 
+#define _tile_op2bf16_ps(W, A, B)              \
+  __builtin_ia32_top2bf16ps (W, (__v32bf) (A), (__v32bf) (B))
+
+#define _tile_op4bssd_epi32(W, A, B)           \
+  __builtin_ia32_top4bssd (W, (__v64qi) (A), (__v64qi) (B))
+
+#define _tile_op4bsud_epi32(W, A, B)           \
+  __builtin_ia32_top4bsud (W, (__v64qi) (A), (__v64qi) (B))
+
+#define _tile_op4busd_epi32(W, A, B)           \
+  __builtin_ia32_top4busd (W, (__v64qi) (A), (__v64qi) (B))
+
+#define _tile_op4buud_epi32(W, A, B)           \
+  __builtin_ia32_top4buud (W, (__v64qi) (A), (__v64qi) (B))
+
+#define _tile_op4mxbf8_ps(W, A, B, C)          \
+  __builtin_ia32_top4mxbf8ps (W, (__v64qi) (A), (__v64qi) (B), C)
+
+#define _tile_op4mxbhf8_ps(W, A, B, C)         \
+  __builtin_ia32_top4mxbhf8ps (W, (__v64qi) (A), (__v64qi) (B), C)
+
+#define _tile_op4mxhbf8_ps(W, A, B, C)         \
+  __builtin_ia32_top4mxhbf8ps (W, (__v64qi) (A), (__v64qi) (B), C)
+
+#define _tile_op4mxhf8_ps(W, A, B, C)          \
+  __builtin_ia32_top4mxhf8ps (W, (__v64qi) (A), (__v64qi) (B), C)
+
+#define _tile_op4mxbss_ps(W, A, B, C)          \
+  __builtin_ia32_top4mxbssps (W, (__v64qi) (A), (__v64qi) (B), C)
+
 #endif /* __OPTIMIZE__ */
 
 #endif /* __x86_64__ */
diff --git a/gcc/config/i386/i386-builtin-types.def 
b/gcc/config/i386/i386-builtin-types.def
index c5869f11124..450c326dbda 100644
--- a/gcc/config/i386/i386-builtin-types.def
+++ b/gcc/config/i386/i386-builtin-types.def
@@ -1510,3 +1510,6 @@ DEF_FUNCTION_TYPE (V32HF, UQI, SI)
 DEF_FUNCTION_TYPE (V32BF, UQI, SI)
 DEF_FUNCTION_TYPE (V16SI, UQI, SI)
 DEF_FUNCTION_TYPE (VOID, UQI, V16SI, SI)
+DEF_FUNCTION_TYPE (VOID, UQI, V32BF, V32BF)
+DEF_FUNCTION_TYPE (VOID, UQI, V64QI, V64QI)
+DEF_FUNCTION_TYPE (VOID, UQI, V64QI, V64QI, SI)
diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def
index 823fa33cc1f..65479370fc5 100644
--- a/gcc/config/i386/i386-builtin.def
+++ b/gcc/config/i386/i386-builtin.def
@@ -3986,5 +3986,15 @@ BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, 
CODE_FOR_tcvtrowps2phl, "_
 BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, 
CODE_FOR_tilemovrow_extract, "__builtin_ia32_tilemovrowextract", 
IX86_BUILTIN_TILEMOVROWEXTRACT, UNKNOWN, (int) V16SI_FTYPE_UQI_SI)
 BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, 
CODE_FOR_tilemovrow_insert, "__builtin_ia32_tilemovrowinsert", 
IX86_BUILTIN_TILEMOVROWINSERT, UNKNOWN, (int) VOID_FTYPE_UQI_V16SI_SI)
 BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, 
CODE_FOR_tilemovcol_insert, "__builtin_ia32_tilemovcolinsert", 
IX86_BUILTIN_TILEMOVCOLINSERT, UNKNOWN, (int) VOID_FTYPE_UQI_V16SI_SI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top2bf16ps, 
"__builtin_ia32_top2bf16ps", IX86_BUILTIN_TOP2BF16PS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V32BF_V32BF)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4bssd, 
"__builtin_ia32_top4bssd", IX86_BUILTIN_TOP4BSSD, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4bsud, 
"__builtin_ia32_top4bsud", IX86_BUILTIN_TOP4BSUD, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4busd, 
"__builtin_ia32_top4busd", IX86_BUILTIN_TOP4BUSD, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4buud, 
"__builtin_ia32_top4buud", IX86_BUILTIN_TOP4BUUD, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4mxbf8ps, 
"__builtin_ia32_top4mxbf8ps", IX86_BUILTIN_TOP4MXBF8PS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI_SI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4mxbhf8ps, 
"__builtin_ia32_top4mxbhf8ps", IX86_BUILTIN_TOP4MXBHF8PS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI_SI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4mxhbf8ps, 
"__builtin_ia32_top4mxhbf8ps", IX86_BUILTIN_TOP4MXHBF8PS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI_SI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4mxhf8ps, 
"__builtin_ia32_top4mxhf8ps", IX86_BUILTIN_TOP4MXHF8PS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI_SI)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1, CODE_FOR_top4mxbssps, 
"__builtin_ia32_top4mxbssps", IX86_BUILTIN_TOP4MXBSSPS, UNKNOWN, (int) 
VOID_FTYPE_UQI_V64QI_V64QI_SI)
 
 BDESC_END (ACE, MAX)
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 3e3a9de38ec..02ccca4890f 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -14789,7 +14789,7 @@ ix86_expand_ace_builtin (const struct 
builtin_description *d, tree exp,
 {
   tree arg;
   rtx pat, op;
-  unsigned int i, nargs, arg_adjust = 0;
+  unsigned int i, nargs, arg_adjust = 0, constant = 100;
   bool tmm_src = false;
   rtx xops[4];
   enum insn_code icode = d->icode;
@@ -14808,8 +14808,14 @@ ix86_expand_ace_builtin (const struct 
builtin_description *d, tree exp,
       tmm_src = true;
       break;
     case VOID_FTYPE_UQI_V16SI_SI:
+    case VOID_FTYPE_UQI_V32BF_V32BF:
+    case VOID_FTYPE_UQI_V64QI_V64QI:
       nargs = 3;
       break;
+    case VOID_FTYPE_UQI_V64QI_V64QI_SI:
+      nargs = 4;
+      constant = 3;
+      break;
 
     default:
       gcc_unreachable ();
@@ -14835,16 +14841,17 @@ ix86_expand_ace_builtin (const struct 
builtin_description *d, tree exp,
       arg = CALL_EXPR_ARG (exp, i);
       op = ix86_expand_unsigned_small_int_cst_argument (arg);
 
-      if (i == 0)
+      if (i == 0 || i == constant)
        {
-         /* This must be the tmm reg number constant.  */
+         /* This must be the constant.  */
          if (!insn_p->operand[i + arg_adjust].predicate(op, SImode))
            {
              error ("the argument must be constant");
              return const0_rtx;
            }
 
-         if (!IN_RANGE (INTVAL (op), 0, 7))
+         /* This must be the tmm reg number constant.  */
+         if (i == 0 && !IN_RANGE (INTVAL (op), 0, 7))
            {
              error ("the tmm register number argument must be between 0 to 7");
              return const0_rtx;
@@ -14892,6 +14899,9 @@ ix86_expand_ace_builtin (const struct 
builtin_description *d, tree exp,
        case 3:
          pat = GEN_FCN (icode) (xops[0], xops[1], xops[2]);
          break;
+       case 4:
+         pat = GEN_FCN (icode) (xops[0], xops[1], xops[2], xops[3]);
+         break;
        default:
          gcc_unreachable ();
        }
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 9a514161b3b..f65884921bb 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -320,6 +320,20 @@
   UNSPECV_BSRMOVL_LOAD
   UNSPECV_TILEMOVROWINSERT
   UNSPECV_TILEMOVCOLINSERT
+  UNSPECV_TOP2BF16PS
+  UNSPECV_TOP4BSSD
+  UNSPECV_TOP4BSSDS
+  UNSPECV_TOP4BSUD
+  UNSPECV_TOP4BSUDS
+  UNSPECV_TOP4BUSD
+  UNSPECV_TOP4BUSDS
+  UNSPECV_TOP4BUUD
+  UNSPECV_TOP4BUUDS
+  UNSPECV_TOP4MXBF8PS
+  UNSPECV_TOP4MXBHF8PS
+  UNSPECV_TOP4MXHBF8PS
+  UNSPECV_TOP4MXHF8PS
+  UNSPECV_TOP4MXBSSPS
 ])
 
 ;; All vector modes including V?TImode, used in move patterns.
@@ -34612,3 +34626,71 @@
   "TARGET_ACEV1"
   "tilemov<rowcol>\t{%2, %1, %%tmm%c0|tmm%c0, %1, %2}"
   [(set_attr "prefix" "evex")])
+
+(define_insn "top2bf16ps"
+  [(set (reg:V32SF TMM_REGNUM)
+        (unspec_volatile:V32SF
+         [(match_operand:SI 0 "const_0_to_7_operand")
+          (match_operand:V32BF 1 "register_operand" "v")
+          (match_operand:V32BF 2 "register_operand" "v")]
+         UNSPECV_TOP2BF16PS))]
+  "TARGET_ACEV1"
+  "top2bf16ps\t{%2, %1, %%tmm%c0|tmm%c0, %1, %2}"
+  [(set_attr "prefix" "evex")])
+
+(define_int_iterator TOP4BDTYPE
+  [UNSPECV_TOP4BSSD
+   UNSPECV_TOP4BSUD
+   UNSPECV_TOP4BUSD
+   UNSPECV_TOP4BUUD])
+
+(define_int_attr top4bdtype
+  [(UNSPECV_TOP4BSSD "bssd") (UNSPECV_TOP4BSUD "bsud")
+   (UNSPECV_TOP4BUSD "busd") (UNSPECV_TOP4BUUD "buud")])
+
+(define_insn "top4<top4bdtype>"
+  [(set (reg:V32SI TMM_REGNUM)
+        (unspec_volatile:V32SI
+         [(match_operand:SI 0 "const_0_to_7_operand")
+          (match_operand:V64QI 1 "register_operand" "v")
+          (match_operand:V64QI 2 "register_operand" "v")]
+         TOP4BDTYPE))]
+  "TARGET_ACEV1"
+  "top4<top4bdtype>\t{%2, %1, %%tmm%c0|tmm%c0, %1, %2}"
+  [(set_attr "prefix" "evex")])
+
+(define_int_iterator TOP4MXFP8TYPE
+  [UNSPECV_TOP4MXBF8PS UNSPECV_TOP4MXBHF8PS
+   UNSPECV_TOP4MXHBF8PS UNSPECV_TOP4MXHF8PS])
+
+(define_int_attr top4mxfp8type
+  [(UNSPECV_TOP4MXBF8PS "mxbf8")
+   (UNSPECV_TOP4MXBHF8PS "mxbhf8")
+   (UNSPECV_TOP4MXHBF8PS "mxhbf8")
+   (UNSPECV_TOP4MXHF8PS "mxhf8")])
+
+(define_insn "top4<top4mxfp8type>ps"
+  [(set (reg:V32SF TMM_REGNUM)
+        (unspec_volatile:V32SF
+         [(match_operand:SI 0 "const_0_to_7_operand")
+          (match_operand:V64QI 1 "register_operand" "v")
+          (match_operand:V64QI 2 "register_operand" "v")
+          (match_operand:SI 3 "const_0_to_255_operand")
+          (reg:V32SI BSR0_REG)]
+         TOP4MXFP8TYPE))]
+  "TARGET_ACEV1"
+  "top4<top4mxfp8type>ps\t{%3, %2, %1, %%tmm%c0|tmm%c0, %1, %2, %3}"
+  [(set_attr "prefix" "evex")])
+
+(define_insn "top4mxbssps"
+  [(set (reg:V32SF TMM_REGNUM)
+        (unspec_volatile:V32SF
+         [(match_operand:SI 0 "const_0_to_7_operand")
+          (match_operand:V64QI 1 "register_operand" "v")
+          (match_operand:V64QI 2 "register_operand" "v")
+          (match_operand:SI 3 "const_0_to_255_operand")
+          (reg:V32SI BSR0_REG)]
+         UNSPECV_TOP4MXBSSPS))]
+  "TARGET_ACEV1"
+  "top4mxbssps\t{%3, %2, %1, %%tmm%c0|tmm%c0, %1, %2, %3}"
+  [(set_attr "prefix" "evex")])
diff --git a/gcc/testsuite/gcc.target/i386/ace-check.h 
b/gcc/testsuite/gcc.target/i386/ace-check.h
index 210f20e7a47..e153c5ff84b 100644
--- a/gcc/testsuite/gcc.target/i386/ace-check.h
+++ b/gcc/testsuite/gcc.target/i386/ace-check.h
@@ -63,6 +63,27 @@ void init_tile_config (__tilecfg *dst, __bsr* bsr)
   _bsr0_init ();
 }
 
+#define CHECK_TILE_REGISTER(regnum, dst_ref)   \
+{                                              \
+  int miss = 0;                                        \
+  for (int j = 0; j < 16; j++)                 \
+    {                                          \
+      __m512i tmp;                             \
+      union512i_ub a;                          \
+      tmp = _tile_extractrow (regnum, j);      \
+      a.x = tmp;                               \
+      for (int k = 0; k < 64; k++)             \
+        if (a.a[k] != dst_ref.buf[j * 64 + k]) \
+          {                                    \
+           printf ("Row %d Column %d: 0x%x != 0x%x\n", j, k, a.a[k],   \
+                    dst_ref.buf[j * 64 + k]);                          \
+            miss += 1;                         \
+         }                                     \
+    }                                          \
+    if (miss)                                  \
+      abort ();                                        \
+}
+
 #ifndef DO_TEST
 #define DO_TEST do_test
 static void test_ace (void);
diff --git a/gcc/testsuite/gcc.target/i386/ace-helper.h 
b/gcc/testsuite/gcc.target/i386/ace-helper.h
index 8b4611e6e3f..9f9401aa2b2 100644
--- a/gcc/testsuite/gcc.target/i386/ace-helper.h
+++ b/gcc/testsuite/gcc.target/i386/ace-helper.h
@@ -4,4 +4,15 @@
 #define AVX512FP16
 #define AVX512BF16
 #include "avx512f-helper.h"
+#include "fp8-helper.h"
+
+float convert_e8m0_to_fp32 (unsigned char x)
+{   
+  unsigned int tmp = ((unsigned int) x) << 23;
+  Floatuint32Union ux = { .u = tmp };
+  if (x == 0xff)
+    ux.u |= 0x1;
+  return ux.f;
+}
+
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/acev1-1.c 
b/gcc/testsuite/gcc.target/i386/acev1-1.c
index 6d01745c592..8976b555a4a 100644
--- a/gcc/testsuite/gcc.target/i386/acev1-1.c
+++ b/gcc/testsuite/gcc.target/i386/acev1-1.c
@@ -15,6 +15,16 @@
 /* { dg-final { scan-assembler-times "tcvtrowps2phl\[ \t]" 1 } } */
 /* { dg-final { scan-assembler-times "tilemovrow\[ \t]" 2 } } */
 /* { dg-final { scan-assembler-times "tilemovcol\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top2bf16ps\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4bssd\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4bsud\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4busd\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4buud\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4mxbf8ps\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4mxbhf8ps\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4mxhbf8ps\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4mxhf8ps\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "top4mxbssps\[ \t]" 1 } } */
 #include <immintrin.h>
 
 extern int t[];
@@ -52,3 +62,17 @@ void cvtrow ()
   _tile_insertrow (7, a1, 10);
   _tile_insertcol (2, a2, 11);
 }
+
+void op ()
+{
+  _tile_op2bf16_ps (1, b1, b2);
+  _tile_op4bssd_epi32 (2, a1, a2);
+  _tile_op4bsud_epi32 (3, a1, a2);
+  _tile_op4busd_epi32 (4, a1, a2);
+  _tile_op4buud_epi32 (5, a1, a2);
+  _tile_op4mxbf8_ps (6, a1, a2, 1);
+  _tile_op4mxbhf8_ps (7, a1, a2, 6);
+  _tile_op4mxhbf8_ps (0, a1, a2, 9);
+  _tile_op4mxhf8_ps (1, a1, a2, 3);
+  _tile_op4mxbss_ps (2, a1, a2, 4);
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op2bf16ps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op2bf16ps-2.c
new file mode 100644
index 00000000000..c644eea4b77
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op2bf16ps-2.c
@@ -0,0 +1,47 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op2bf16ps
+void test_acev1_op2bf16ps ();
+#include "ace-helper.h"
+
+void calc_op2bf16ps (__tile *dst, __bf16 *src1, __bf16 *src2)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       dst->a[i * 16 + j] += (float) src1[2 * i] * (float) src2[2 * j];
+       dst->a[i * 16 + j] += (float) src1[2 * i + 1] * (float) src2[2 * j + 1];
+      }
+}
+
+void test_acev1_op2bf16ps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512bf16_bf src1, src2;
+  int m;
+
+  for (m = 0; m < 32; m++)
+    {
+      int sign;
+      sign = m % 2 ? 1 : -1;
+      src1.a[m] = (__bf16) (sign * (1.5 * (1 << (m % 3))));
+      sign = m % 5 ? 1 : -1;
+      src2.a[m] = (__bf16) (sign * (2.5 * (1 << (m % 3))));
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  calc_op2bf16ps (&dst_ref, src1.a, src2.a);
+
+  init_tile_config (&cfg, &bsr0);
+  _tile_ace_zero (1);
+  _tile_op2bf16_ps (1, src1.x, src2.x);
+
+  CHECK_TILE_REGISTER (1, dst_ref);
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4bssd-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4bssd-2.c
new file mode 100644
index 00000000000..5243ff1c931
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4bssd-2.c
@@ -0,0 +1,47 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4bssd
+void test_acev1_op4bssd ();
+#include "ace-helper.h"
+
+void calc_op4bssd (__tile *dst, char *src1, char *src2)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       dst->b[i * 16 + j] += (int) src1[4 * i] * (int) src2[4 * j];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 1] * (int) src2[4 * j + 1];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 2] * (int) src2[4 * j + 2];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 3] * (int) src2[4 * j + 3];
+      }
+}
+
+void test_acev1_op4bssd ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      int sign = m % 2 ? 1 : -1;
+      src1.a[m] = 10 + 3 * m + sign;
+      src2.a[m] = sign * 10 * m * m;
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  calc_op4bssd (&dst_ref, src1.a, src2.a);
+
+  init_tile_config (&cfg, &bsr0);
+  _tile_ace_zero (1);
+  _tile_op4bssd_epi32 (1, src1.x, src2.x);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4bsud-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4bsud-2.c
new file mode 100644
index 00000000000..1fed75a61b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4bsud-2.c
@@ -0,0 +1,48 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4bsud
+void test_acev1_op4bsud ();
+#include "ace-helper.h"
+
+void calc_op4bsud (__tile *dst, char *src1, unsigned char *src2)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       dst->b[i * 16 + j] += (int) src1[4 * i] * (int) src2[4 * j];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 1] * (int) src2[4 * j + 1];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 2] * (int) src2[4 * j + 2];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 3] * (int) src2[4 * j + 3];
+      }
+}
+
+void test_acev1_op4bsud ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1;
+  union512i_ub src2;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      int sign = m % 2 ? 1 : -1;
+      src1.a[m] = sign * (10 + 3 * m + sign);
+      src2.a[m] = 10 * m * m;
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  calc_op4bsud (&dst_ref, src1.a, src2.a);
+
+  init_tile_config (&cfg, &bsr0);
+  _tile_ace_zero (1);
+  _tile_op4bsud_epi32 (1, src1.x, src2.x);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4busd-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4busd-2.c
new file mode 100644
index 00000000000..236e073f68f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4busd-2.c
@@ -0,0 +1,48 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4busd
+void test_acev1_op4busd ();
+#include "ace-helper.h"
+
+void calc_op4busd (__tile *dst, unsigned char *src1, char *src2)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       dst->b[i * 16 + j] += (int) src1[4 * i] * (int) src2[4 * j];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 1] * (int) src2[4 * j + 1];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 2] * (int) src2[4 * j + 2];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 3] * (int) src2[4 * j + 3];
+      }
+}
+
+void test_acev1_op4busd ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_ub src1;
+  union512i_b src2;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      int sign = m % 2 ? 1 : -1;
+      src1.a[m] = 10 + 3 * m;
+      src2.a[m] = sign * 10 * m * m;
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  calc_op4busd (&dst_ref, src1.a, src2.a);
+
+  init_tile_config (&cfg, &bsr0);
+  _tile_ace_zero (1);
+  _tile_op4busd_epi32 (1, src1.x, src2.x);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4buud-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4buud-2.c
new file mode 100644
index 00000000000..debf48d7958
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4buud-2.c
@@ -0,0 +1,46 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4buud
+void test_acev1_op4buud ();
+#include "ace-helper.h"
+
+void calc_op4buud (__tile *dst, unsigned char *src1, unsigned char *src2)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       dst->b[i * 16 + j] += (int) src1[4 * i] * (int) src2[4 * j];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 1] * (int) src2[4 * j + 1];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 2] * (int) src2[4 * j + 2];
+       dst->b[i * 16 + j] += (int) src1[4 * i + 3] * (int) src2[4 * j + 3];
+      }
+}
+
+void test_acev1_op4buud ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_ub src1, src2;
+  int m, n;
+
+  for (m = 0; m < 64; m++)
+    {
+      src1.a[m] = 10 + 3 * m;
+      src2.a[m] = 10 * m * m;
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  calc_op4buud (&dst_ref, src1.a, src2.a);
+
+  init_tile_config (&cfg, &bsr0);
+  _tile_ace_zero (1);
+  _tile_op4buud_epi32 (1, src1.x, src2.x);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4mxbf8ps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4mxbf8ps-2.c
new file mode 100644
index 00000000000..e4cfa57a272
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4mxbf8ps-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4mxbf8ps
+void test_acev1_op4mxbf8ps ();
+#include "ace-helper.h"
+
+void calc_op4mxbf8ps (__tile *dst, char *src1, char *src2, __bsr* bsr, const 
int imm)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    {
+      for (j = 0; j < 16; j++)
+       {
+         __int128_t tmp = 0;
+         float scale = convert_e8m0_to_fp32 (bsr->buf[4 * i + (imm & 0x3)])
+            * convert_e8m0_to_fp32 (bsr->buf[64 + 4 * j + ((imm & 0x18) >> 
3)]);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 1], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 1], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 2], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 2], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 3], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 3], 1, NULL);
+         dst->a[16 * i + j] += shift_int128_to_fp32 (tmp, 1, 1) * scale;
+       }
+    }
+}
+
+void test_acev1_op4mxbf8ps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  union512i_ub bsrl, bsrh;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      src1.a[m] = (m % 2) << 7 | (m % 30 + 1) << 2 | ((m + 1) % 4);
+      src2.a[m] = ((m % 3) % 2) << 7 | ((m + 10) % 30 + 1) << 2 | ((m + 2) % 
4);
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  init_tile_config (&cfg, &bsr0);
+  fill_bsr (&bsr0, &bsrl, &bsrh);
+  calc_op4mxbf8ps (&dst_ref, src1.a, src2.a, &bsr0, 10);
+
+  _tile_ace_zero (1);
+  _bsr0_insertfull (bsrh.x, bsrl.x);
+  _tile_op4mxbf8_ps (1, src1.x, src2.x, 10);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4mxbhf8ps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4mxbhf8ps-2.c
new file mode 100644
index 00000000000..6ef4f7113e4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4mxbhf8ps-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4mxbhf8ps
+void test_acev1_op4mxbhf8ps ();
+#include "ace-helper.h"
+
+void calc_op4mxbhf8ps (__tile *dst, char *src1, char *src2, __bsr* bsr, const 
int imm)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    {
+      for (j = 0; j < 16; j++)
+       {
+         __int128_t tmp = 0;
+         float scale = convert_e8m0_to_fp32 (bsr->buf[4 * i + (imm & 0x3)])
+           * convert_e8m0_to_fp32 (bsr->buf[64 + 4 * j + ((imm & 0x18) >> 3)]);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 1], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 1], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 2], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 2], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 3], 1, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 3], 0, NULL);
+         dst->a[16 * i + j] += shift_int128_to_fp32 (tmp, 1, 0) * scale;
+       }
+    }
+}
+
+void test_acev1_op4mxbhf8ps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  union512i_ub bsrl, bsrh;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      src1.a[m] = (m % 2) << 7 | (m % 31) << 2 | ((m + 1) % 4);
+      src2.a[m] = ((m % 3) % 2) << 7 | ((m + 7) % 16) << 3 | ((m + 2) % 8);
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  init_tile_config (&cfg, &bsr0);
+  fill_bsr (&bsr0, &bsrl, &bsrh);
+  calc_op4mxbhf8ps (&dst_ref, src1.a, src2.a, &bsr0, 1);
+
+  _tile_ace_zero (1);
+  _bsr0_insertfull (bsrh.x, bsrl.x);
+  _tile_op4mxbhf8_ps (1, src1.x, src2.x, 1);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4mxbssps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4mxbssps-2.c
new file mode 100644
index 00000000000..0fe5a3a7e8a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4mxbssps-2.c
@@ -0,0 +1,54 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4mxbssps
+void test_acev1_op4mxbssps ();
+#include "ace-helper.h"
+
+void calc_op4mxbssps (__tile *dst, char *src1, char *src2, __bsr* bsr, const 
int imm)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    for (j = 0; j < 16; j++)
+      {
+       int tmp = 0;
+       float scale = convert_e8m0_to_fp32 (bsr->buf[4 * i + (imm & 0x3)])
+         * convert_e8m0_to_fp32 (bsr->buf[64 + 4 * j + ((imm & 0x18) >> 3)]);
+       tmp += (int) src1[4 * i] * (int) src2[4 * j];
+       tmp += (int) src1[4 * i + 1] * (int) src2[4 * j + 1];
+       tmp += (int) src1[4 * i + 2] * (int) src2[4 * j + 2];
+       tmp += (int) src1[4 * i + 3] * (int) src2[4 * j + 3];
+       dst->a[16 * i + j] += (float) tmp * scale / 4096.0;
+      }
+}
+
+void test_acev1_op4mxbssps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  union512i_ub bsrl, bsrh;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      int sign = m % 2 ? 1 : -1;
+      src1.a[m] = 10 + 3 * m + sign;
+      src2.a[m] = sign * 10 * m * m;
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  init_tile_config (&cfg, &bsr0);
+  fill_bsr (&bsr0, &bsrl, &bsrh);
+  calc_op4mxbssps (&dst_ref, src1.a, src2.a, &bsr0, 10);
+
+  _tile_ace_zero (1);
+  _bsr0_insertfull (bsrh.x, bsrl.x);
+  _tile_op4mxbss_ps (1, src1.x, src2.x, 10);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4mxhbf8ps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4mxhbf8ps-2.c
new file mode 100644
index 00000000000..350f108b71c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4mxhbf8ps-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4mxhbf8ps
+void test_acev1_op4mxhbf8ps ();
+#include "ace-helper.h"
+
+void calc_op4mxhbf8ps (__tile *dst, char *src1, char *src2, __bsr* bsr, const 
int imm)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    {
+      for (j = 0; j < 16; j++)
+       {
+         __int128_t tmp = 0;
+         float scale = convert_e8m0_to_fp32 (bsr->buf[4 * i  + (imm & 0x3)])
+           * convert_e8m0_to_fp32 (bsr->buf[64 + 4 * j + ((imm & 0x18) >> 3)]);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 1], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 1], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 2], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 2], 1, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 3], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 3], 1, NULL);
+         dst->a[16 * i + j] += shift_int128_to_fp32 (tmp, 0, 1) * scale;
+       }
+    }
+}
+
+void test_acev1_op4mxhbf8ps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  union512i_ub bsrl, bsrh;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      src1.a[m] = (m % 2) << 7 | (m % 16) << 3 | ((m + 1) % 8);
+      src2.a[m] = ((m % 3) % 2) << 7 | ((m + 10) % 31) << 2| ((m + 2) % 4);
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  init_tile_config (&cfg, &bsr0);
+  fill_bsr (&bsr0, &bsrl, &bsrh);
+  calc_op4mxhbf8ps (&dst_ref, src1.a, src2.a, &bsr0, 17);
+
+  _tile_ace_zero (1);
+  _bsr0_insertfull (bsrh.x, bsrl.x);
+  _tile_op4mxhbf8_ps (1, src1.x, src2.x, 17);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-op4mxhf8ps-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-op4mxhf8ps-2.c
new file mode 100644
index 00000000000..c3329026b11
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-op4mxhf8ps-2.c
@@ -0,0 +1,59 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_op4mxhf8ps
+void test_acev1_op4mxhf8ps ();
+#include "ace-helper.h"
+
+void calc_op4mxhf8ps (__tile *dst, char *src1, char *src2, __bsr* bsr, const 
int imm)
+{
+  int i, j;
+
+  for (i = 0; i < 16; i++)
+    {
+      for (j = 0; j < 16; j++)
+       {
+         __int128_t tmp = 0;
+         float scale = convert_e8m0_to_fp32 (bsr->buf[4 * i  + (imm & 0x3)])
+           * convert_e8m0_to_fp32 (bsr->buf[64 + 4 * j + ((imm & 0x18) >> 3)]);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 1], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 1], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 2], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 2], 0, NULL);
+         tmp += (__int128_t) shift_fp8_to_int64 (src1[4 * i + 3], 0, NULL)
+           * (__int128_t) shift_fp8_to_int64 (src2[4 * j + 3], 0, NULL);
+         dst->a[16 * i + j] += shift_int128_to_fp32 (tmp, 0, 0) * scale;
+       }
+    }
+}
+
+void test_acev1_op4mxhf8ps ()
+{
+  __tilecfg cfg;
+  __tile dst_ref;
+  __bsr bsr0;
+  union512i_b src1, src2;
+  union512i_ub bsrl, bsrh;
+  int m;
+
+  for (m = 0; m < 64; m++)
+    {
+      src1.a[m] = (m % 2) << 7 | (m % 16) << 3 | ((m + 1) % 8);
+      src2.a[m] = ((m % 3) % 2) << 7 | ((m + 7) % 16) << 3 | ((m + 2) % 8);
+    }
+
+  for (m = 0; m < 1024; m++)
+    dst_ref.buf[m] = 0;
+
+  init_tile_config (&cfg, &bsr0);
+  fill_bsr (&bsr0, &bsrl, &bsrh);
+  calc_op4mxhf8ps (&dst_ref, src1.a, src2.a, &bsr0, 16);
+
+  _tile_ace_zero (1);
+  _bsr0_insertfull (bsrh.x, bsrl.x);
+  _tile_op4mxhf8_ps (1, src1.x, src2.x, 16);
+
+  CHECK_TILE_REGISTER (1, dst_ref); 
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx-1.c 
b/gcc/testsuite/gcc.target/i386/avx-1.c
index 815b635abe9..7231bc40405 100644
--- a/gcc/testsuite/gcc.target/i386/avx-1.c
+++ b/gcc/testsuite/gcc.target/i386/avx-1.c
@@ -929,6 +929,16 @@
 #define __builtin_ia32_tilemovrowextract(A, B) 
__builtin_ia32_tilemovrowextract (1, B)
 #define __builtin_ia32_tilemovrowinsert(A, B, C) 
__builtin_ia32_tilemovrowinsert (1, B, C)
 #define __builtin_ia32_tilemovcolinsert(A, B, C) 
__builtin_ia32_tilemovcolinsert (1, B, C)
+#define __builtin_ia32_top2bf16ps(W, A, B) __builtin_ia32_top2bf16ps (1, A, B)
+#define __builtin_ia32_top4bssd(W, A, B) __builtin_ia32_top4bssd (1, A, B)
+#define __builtin_ia32_top4bsud(W, A, B) __builtin_ia32_top4bsud (1, A, B)
+#define __builtin_ia32_top4busd(W, A, B) __builtin_ia32_top4busd (1, A, B)
+#define __builtin_ia32_top4buud(W, A, B) __builtin_ia32_top4buud (1, A, B)
+#define __builtin_ia32_top4mxbf8ps(W, A, B, C) __builtin_ia32_top4mxbf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbhf8ps(W, A, B, C) __builtin_ia32_top4mxbhf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhbf8ps(W, A, B, C) __builtin_ia32_top4mxhbf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhf8ps(W, A, B, C) __builtin_ia32_top4mxhf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbssps(W, A, B, C) __builtin_ia32_top4mxbssps (1, 
A, B, 9)
 #endif
 
 #include <wmmintrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/fp8-helper.h 
b/gcc/testsuite/gcc.target/i386/fp8-helper.h
index d3f526f651c..f113ec76f4a 100644
--- a/gcc/testsuite/gcc.target/i386/fp8-helper.h
+++ b/gcc/testsuite/gcc.target/i386/fp8-helper.h
@@ -210,14 +210,19 @@ bf8_isInf(unsigned char value)
 static int64_t
 shift_fp8_to_int64 (unsigned char x, int bf8, int *valueState)
 {
-  *valueState = (x >> 7) ? -1 : 1;
-  if (fp8_isNan (x, bf8))
-    *valueState = -2;
-  if (bf8)
-    if (bf8_isInf(x) == 1)
-      *valueState = 3;
-    else if (bf8_isInf(x) == -1)
-      *valueState = -3;
+  if (valueState != NULL)
+    {
+      *valueState = (x >> 7) ? -1 : 1;
+      if (fp8_isNan (x, bf8))
+       *valueState = -2;
+      if (bf8)
+       {
+         if (bf8_isInf(x) == 1)
+           *valueState = 3;
+         else if (bf8_isInf(x) == -1)
+           *valueState = -3;
+       }
+    }
 
   unsigned short sign = (x & 0x80) >> 7;
   unsigned short exp = bf8 ? (x & 0x7c) >> 2 : (x & 0x78) >> 3;
diff --git a/gcc/testsuite/gcc.target/i386/sse-13.c 
b/gcc/testsuite/gcc.target/i386/sse-13.c
index 628a7e218af..2b9b7ecd5c9 100644
--- a/gcc/testsuite/gcc.target/i386/sse-13.c
+++ b/gcc/testsuite/gcc.target/i386/sse-13.c
@@ -936,6 +936,16 @@
 #define __builtin_ia32_tilemovrowextract(A, B) 
__builtin_ia32_tilemovrowextract (1, B)
 #define __builtin_ia32_tilemovrowinsert(A, B, C) 
__builtin_ia32_tilemovrowinsert (1, B, C)
 #define __builtin_ia32_tilemovcolinsert(A, B, C) 
__builtin_ia32_tilemovcolinsert (1, B, C)
+#define __builtin_ia32_top2bf16ps(W, A, B) __builtin_ia32_top2bf16ps (1, A, B)
+#define __builtin_ia32_top4bssd(W, A, B) __builtin_ia32_top4bssd (1, A, B)
+#define __builtin_ia32_top4bsud(W, A, B) __builtin_ia32_top4bsud (1, A, B)
+#define __builtin_ia32_top4busd(W, A, B) __builtin_ia32_top4busd (1, A, B)
+#define __builtin_ia32_top4buud(W, A, B) __builtin_ia32_top4buud (1, A, B)
+#define __builtin_ia32_top4mxbf8ps(W, A, B, C) __builtin_ia32_top4mxbf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbhf8ps(W, A, B, C) __builtin_ia32_top4mxbhf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhbf8ps(W, A, B, C) __builtin_ia32_top4mxhbf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhf8ps(W, A, B, C) __builtin_ia32_top4mxhf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbssps(W, A, B, C) __builtin_ia32_top4mxbssps (1, 
A, B, 9)
 #endif
 
 #include <x86intrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/sse-14.c 
b/gcc/testsuite/gcc.target/i386/sse-14.c
index 77d29e05772..fe886f4fa5d 100644
--- a/gcc/testsuite/gcc.target/i386/sse-14.c
+++ b/gcc/testsuite/gcc.target/i386/sse-14.c
@@ -65,6 +65,10 @@
   void _CONCAT(_,func) (op1_type A, op2_type B, int const I, int const L) \
   { func (A, B, imm1, imm2); }
 
+#define test_2vxt(func, imm1, op1_type, op2_type, imm2)                        
\
+  void _CONCAT(_,func) (int const I, op1_type A, op2_type B, int const L) \
+  { func (imm1, A, B, imm2); }
+
 #define test_3(func, type, op1_type, op2_type, op3_type, imm)          \
   type _CONCAT(_,func) (op1_type A, op2_type B,                                
\
                        op3_type C, int const I)                        \
@@ -1223,4 +1227,14 @@ test_1t (_tile_cvtrowl_ps_ph, __m512h, 1, int)
 test_1t (_tile_extractrow, __m512i, 1, int)
 test_2vt (_tile_insertrow, 1, __m512i, int)
 test_2vt (_tile_insertcol, 1, __m512i, int)
+test_2vt (_tile_op2bf16_ps, 1, __m512bh, __m512bh)
+test_2vt (_tile_op4bssd_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4bsud_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4busd_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4buud_epi32, 1, __m512i, __m512i)
+test_2vxt (_tile_op4mxbf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxbhf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxhbf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxhf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxbss_ps, 1, __m512i, __m512i, 9)
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/sse-22.c 
b/gcc/testsuite/gcc.target/i386/sse-22.c
index 493772106cc..c1ea4ba96f4 100644
--- a/gcc/testsuite/gcc.target/i386/sse-22.c
+++ b/gcc/testsuite/gcc.target/i386/sse-22.c
@@ -58,6 +58,10 @@
   type _CONCAT(_,func) (op1_type A, op2_type B, int const I, int const L) \
   { return func (A, B, imm1, imm2); }
 
+#define test_2vxt(func, imm1, op1_type, op2_type, imm2)                        
\
+  void _CONCAT(_,func) (int const I, op1_type A, op2_type B, int const L) \
+  { func (imm1, A, B, imm2); }
+
 #define test_2y(func, type, op1_type, op2_type, imm1, imm2, imm3)       \
   type _CONCAT(_,func) (op1_type A, op2_type B, int const I, int const L,\
                        int const R)                                     \
@@ -1264,4 +1268,14 @@ test_1t (_tile_cvtrowl_ps_ph, __m512h, 1, int)
 test_1t (_tile_extractrow, __m512i, 1, int)
 test_2vt (_tile_insertrow, 1, __m512i, int)
 test_2vt (_tile_insertcol, 1, __m512i, int)
+test_2vt (_tile_op2bf16_ps, 1, __m512bh, __m512bh)
+test_2vt (_tile_op4bssd_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4bsud_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4busd_epi32, 1, __m512i, __m512i)
+test_2vt (_tile_op4buud_epi32, 1, __m512i, __m512i)
+test_2vxt (_tile_op4mxbf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxbhf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxhbf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxhf8_ps, 1, __m512i, __m512i, 9)
+test_2vxt (_tile_op4mxbss_ps, 1, __m512i, __m512i, 9)
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/sse-23.c 
b/gcc/testsuite/gcc.target/i386/sse-23.c
index 719803bec4b..f6e3fb10613 100644
--- a/gcc/testsuite/gcc.target/i386/sse-23.c
+++ b/gcc/testsuite/gcc.target/i386/sse-23.c
@@ -911,6 +911,16 @@
 #define __builtin_ia32_tilemovrowextract(A, B) 
__builtin_ia32_tilemovrowextract (1, B)
 #define __builtin_ia32_tilemovrowinsert(A, B, C) 
__builtin_ia32_tilemovrowinsert (1, B, C)
 #define __builtin_ia32_tilemovcolinsert(A, B, C) 
__builtin_ia32_tilemovcolinsert (1, B, C)
+#define __builtin_ia32_top2bf16ps(W, A, B) __builtin_ia32_top2bf16ps (1, A, B)
+#define __builtin_ia32_top4bssd(W, A, B) __builtin_ia32_top4bssd (1, A, B)
+#define __builtin_ia32_top4bsud(W, A, B) __builtin_ia32_top4bsud (1, A, B)
+#define __builtin_ia32_top4busd(W, A, B) __builtin_ia32_top4busd (1, A, B)
+#define __builtin_ia32_top4buud(W, A, B) __builtin_ia32_top4buud (1, A, B)
+#define __builtin_ia32_top4mxbf8ps(W, A, B, C) __builtin_ia32_top4mxbf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbhf8ps(W, A, B, C) __builtin_ia32_top4mxbhf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhbf8ps(W, A, B, C) __builtin_ia32_top4mxhbf8ps 
(1, A, B, 9)
+#define __builtin_ia32_top4mxhf8ps(W, A, B, C) __builtin_ia32_top4mxhf8ps (1, 
A, B, 9)
+#define __builtin_ia32_top4mxbssps(W, A, B, C) __builtin_ia32_top4mxbssps (1, 
A, B, 9)
 #endif
 
 #pragma GCC target 
("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,sha,xsavec,xsaves,clflushopt,clwb,mwaitx,clzero,pku,sgx,rdpid,gfni,vpclmulqdq,pconfig,wbnoinvd,enqcmd,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avxifma,avxvnniint8,avxneconvert,cmpccxadd,amx-fp16,prefetchi,raoint,amx-complex,avxvnniint16,sm3,sha512,sm4,avx10.2,amx-avx512,amx-fp8,movrs,amx-movrs,avx10v2aux,acev1")
-- 
2.31.1

Reply via email to