gcc/ChangeLog:

        * config/i386/acev1intrin.h: Add new intrins.
        * config/i386/i386-builtin-types.def: Add new function types.
        * config/i386/i386-builtins.cc
        (ix86_init_mmx_sse_builtins): Add new builtins.
        * config/i386/i386-builtins.h (enum ix86_builtins): Ditto.
        * config/i386/i386-expand.cc (ix86_expand_builtin):
        Handle new builtins.
        * config/i386/sse.md (UNSPEC_BSRMOVH_STORE): New.
        (UNSPEC_BSRMOVL_STORE): Ditto.
        (UNSPECV_BSRINIT): Ditto.
        (UNSPECV_BSRMOVH_LOAD): Ditto.
        (UNSPECV_BSRMOVL_LOAD): Ditto.
        (bsrinit): Ditto.
        (bsrmovf): Ditto.
        (bsrmovh_load): Ditto.
        (bsrmovl_load): Ditto.
        (bsrmovh_store): Ditto.
        (bsrmovl_store): Ditto.

gcc/testsuite/ChangeLog:

        * gcc.target/i386/acev1-1.c: Add new tests.
        * gcc.target/i386/avx512f-helper.h: Modify include logic to
        reuse 512 related union.
        * lib/target-supports.exp: Check for ACEv1.
        * gcc.target/i386/ace-check.h: Add function entry for
        ACE execution test.
        * gcc.target/i386/ace-helper.h: Add helper function file.
        * gcc.target/i386/acev1-bsrinit-2.c: New test.
        * gcc.target/i386/acev1-bsrmovf-2.c: Ditto.
        * gcc.target/i386/acev1-bsrmovh-2.c: Ditto.
        * gcc.target/i386/acev1-bsrmovl-2.c: Ditto.
---
 gcc/config/i386/acev1intrin.h                 | 42 ++++++++++
 gcc/config/i386/i386-builtin-types.def        |  3 +
 gcc/config/i386/i386-builtins.cc              | 20 +++++
 gcc/config/i386/i386-builtins.h               |  6 ++
 gcc/config/i386/i386-expand.cc                | 54 ++++++++++++
 gcc/config/i386/sse.md                        | 61 ++++++++++++++
 gcc/testsuite/gcc.target/i386/ace-check.h     | 84 +++++++++++++++++++
 gcc/testsuite/gcc.target/i386/ace-helper.h    |  7 ++
 gcc/testsuite/gcc.target/i386/acev1-1.c       | 15 ++++
 .../gcc.target/i386/acev1-bsrinit-2.c         | 44 ++++++++++
 .../gcc.target/i386/acev1-bsrmovf-2.c         | 44 ++++++++++
 .../gcc.target/i386/acev1-bsrmovh-2.c         | 34 ++++++++
 .../gcc.target/i386/acev1-bsrmovl-2.c         | 34 ++++++++
 .../gcc.target/i386/avx512f-helper.h          |  4 +-
 gcc/testsuite/lib/target-supports.exp         | 13 +++
 15 files changed, 464 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/ace-check.h
 create mode 100644 gcc/testsuite/gcc.target/i386/ace-helper.h
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-bsrinit-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-bsrmovf-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-bsrmovh-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/acev1-bsrmovl-2.c

diff --git a/gcc/config/i386/acev1intrin.h b/gcc/config/i386/acev1intrin.h
index 6daa05db342..316d2c11f74 100644
--- a/gcc/config/i386/acev1intrin.h
+++ b/gcc/config/i386/acev1intrin.h
@@ -49,6 +49,48 @@ _tile_ace_release (void)
   __asm__ volatile ("tilerelease" ::);
 }
 
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_init ()
+{
+  __builtin_ia32_bsr0init ();
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_insertfull (__m512i __A, __m512i __B)
+{
+  __builtin_ia32_bsr0movf ((__v16si) __A, (__v16si) __B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_inserth (__m512i __A)
+{
+  __builtin_ia32_bsr0movhinsert ((__v16si) __A);
+}
+
+extern __inline __m512i
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_extracth ()
+{
+  return (__m512i) __builtin_ia32_bsr0movhextract ();
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_insertl (__m512i __A)
+{
+  __builtin_ia32_bsr0movlinsert ((__v16si) __A);
+}
+
+extern __inline __m512i
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bsr0_extractl ()
+{
+  return (__m512i) __builtin_ia32_bsr0movlextract ();
+}
+
 #ifdef __OPTIMIZE__
 extern __inline void
 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
diff --git a/gcc/config/i386/i386-builtin-types.def 
b/gcc/config/i386/i386-builtin-types.def
index 40db96e68e3..baf03960954 100644
--- a/gcc/config/i386/i386-builtin-types.def
+++ b/gcc/config/i386/i386-builtin-types.def
@@ -1502,3 +1502,6 @@ DEF_FUNCTION_TYPE (INT64, PCINT64)
 
 # ACEv1 builtins
 DEF_FUNCTION_TYPE (VOID, UQI)
+DEF_FUNCTION_TYPE (VOID, V16SI)
+DEF_FUNCTION_TYPE (V16SI)
+DEF_FUNCTION_TYPE (VOID, V16SI, V16SI)
diff --git a/gcc/config/i386/i386-builtins.cc b/gcc/config/i386/i386-builtins.cc
index d0c7cd47a6b..a34d977b757 100644
--- a/gcc/config/i386/i386-builtins.cc
+++ b/gcc/config/i386/i386-builtins.cc
@@ -1265,6 +1265,26 @@ ix86_init_mmx_sse_builtins (void)
               "__builtin_ia32_uwrmsr", VOID_FTYPE_UINT64_UINT64,
               IX86_BUILTIN_UWRMSR);
 
+  /* ACEv1.  */
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0init", VOID_FTYPE_VOID,
+              IX86_BUILTIN_BSR0INIT);
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0movf", VOID_FTYPE_V16SI_V16SI,
+              IX86_BUILTIN_BSR0MOVF);
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0movhinsert", VOID_FTYPE_V16SI,
+              IX86_BUILTIN_BSR0MOVHINSERT);
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0movhextract", V16SI_FTYPE_VOID,
+              IX86_BUILTIN_BSR0MOVHEXTRACT);
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0movlinsert", VOID_FTYPE_V16SI,
+              IX86_BUILTIN_BSR0MOVLINSERT);
+  def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_ACEV1,
+              "__builtin_ia32_bsr0movlextract", V16SI_FTYPE_VOID,
+              IX86_BUILTIN_BSR0MOVLEXTRACT);
+
   /* CLDEMOTE.  */
   def_builtin (0, OPTION_MASK_ISA2_CLDEMOTE, "__builtin_ia32_cldemote",
               VOID_FTYPE_PCVOID, IX86_BUILTIN_CLDEMOTE);
diff --git a/gcc/config/i386/i386-builtins.h b/gcc/config/i386/i386-builtins.h
index 910a6f60e95..63a2cb9b51a 100644
--- a/gcc/config/i386/i386-builtins.h
+++ b/gcc/config/i386/i386-builtins.h
@@ -41,6 +41,12 @@ enum ix86_builtins
   IX86_BUILTIN_UMWAIT,
   IX86_BUILTIN_URDMSR,
   IX86_BUILTIN_UWRMSR,
+  IX86_BUILTIN_BSR0INIT,
+  IX86_BUILTIN_BSR0MOVF,
+  IX86_BUILTIN_BSR0MOVHINSERT,
+  IX86_BUILTIN_BSR0MOVHEXTRACT,
+  IX86_BUILTIN_BSR0MOVLINSERT,
+  IX86_BUILTIN_BSR0MOVLEXTRACT,
   IX86_BUILTIN_TPAUSE,
   IX86_BUILTIN_TESTUI,
   IX86_BUILTIN_CLZERO,
diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
index 45c79342a40..b6e5180564a 100644
--- a/gcc/config/i386/i386-expand.cc
+++ b/gcc/config/i386/i386-expand.cc
@@ -15695,6 +15695,60 @@ ix86_expand_builtin (tree exp, rtx target, rtx 
subtarget,
        return target;
       }
 
+    case IX86_BUILTIN_BSR0INIT:
+      {
+       target = gen_rtx_REG (V32SImode, BSR0_REG);
+       emit_insn (gen_bsrinit (target));
+       return 0;
+      }
+
+    case IX86_BUILTIN_BSR0MOVF:
+      {
+       arg0 = CALL_EXPR_ARG (exp, 0);
+       arg1 = CALL_EXPR_ARG (exp, 1);
+       op0 = expand_normal (arg0);
+       op1 = expand_normal (arg1);
+
+       target = gen_rtx_REG (V32SImode, BSR0_REG);
+       if (CONST_VECTOR_P (op0) || MEM_P (op0))
+         op0 = force_reg (V16SImode, op0);
+       if (CONST_VECTOR_P (op1))
+         op1 = force_reg (V16SImode, op1);
+       emit_insn (gen_bsrmovf (target, op0, op1));
+       return 0;
+      }
+
+    case IX86_BUILTIN_BSR0MOVHINSERT:
+    case IX86_BUILTIN_BSR0MOVLINSERT:
+      {
+       arg0 = CALL_EXPR_ARG (exp, 0);
+       op0 = expand_normal (arg0);
+
+       if (fcode == IX86_BUILTIN_BSR0MOVHINSERT)
+         icode = CODE_FOR_bsrmovh_load;
+       else
+         icode = CODE_FOR_bsrmovl_load;
+       target = gen_rtx_REG (V32SImode, BSR0_REG);
+       if (CONST_VECTOR_P (op0))
+         op0 = force_reg (V16SImode, op0);
+       emit_insn (GEN_FCN (icode) (target, op0));
+       return 0;
+      }
+
+    case IX86_BUILTIN_BSR0MOVHEXTRACT:
+    case IX86_BUILTIN_BSR0MOVLEXTRACT:
+      {
+       op0 = gen_rtx_REG (V32SImode, BSR0_REG);
+       if (fcode == IX86_BUILTIN_BSR0MOVHEXTRACT)
+         icode = CODE_FOR_bsrmovh_store;
+       else
+         icode = CODE_FOR_bsrmovl_store;
+       if (target == 0 || !register_operand (target, V16SImode))
+         target = gen_reg_rtx (V16SImode);
+       emit_insn (GEN_FCN (icode) (target, op0));
+       return target;
+      }
+
     case IX86_BUILTIN_VEC_INIT_V2SI:
     case IX86_BUILTIN_VEC_INIT_V4HI:
     case IX86_BUILTIN_VEC_INIT_V8QI:
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 1081737bfce..e0e19a2d128 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -281,6 +281,10 @@
   UNSPEC_VCVTHF62HF8
   UNSPEC_VUNPACKB
   UNSPEC_VPMOVSSDB
+
+  ;; For ACEv1 support
+  UNSPEC_BSRMOVH_STORE
+  UNSPEC_BSRMOVL_STORE
 ])
 
 (define_c_enum "unspecv" [
@@ -306,6 +310,10 @@
 
   ;; For ACEv1
   UNSPECV_TILEZERO
+  UNSPECV_BSRINIT
+  UNSPECV_BSRMOVF
+  UNSPECV_BSRMOVH_LOAD
+  UNSPECV_BSRMOVL_LOAD
 ])
 
 ;; All vector modes including V?TImode, used in move patterns.
@@ -34933,3 +34941,56 @@
   "TARGET_ACEV1"
   "tilezero\t{%%tmm%c0|tmm%c0}"
   [(set_attr "prefix" "vex")])
+
+(define_insn "bsrinit"
+  [(set (match_operand:V32SI 0 "bsr0_operand")
+        (unspec_volatile:V32SI [(const_int 0)] UNSPECV_BSRINIT))]
+  "TARGET_ACEV1"
+  "bsrinit\t{%0|%0}"
+  [(set_attr "prefix" "vex")])
+
+(define_insn "bsrmovf"
+  [(set (match_operand:V32SI 0 "bsr0_operand")
+        (unspec_volatile:V32SI
+         [(match_operand:V16SI 1 "register_operand" "v")
+          (match_operand:V16SI 2 "vector_operand" "vm")]
+         UNSPECV_BSRMOVF))]
+  "TARGET_ACEV1"
+  "bsrmovf\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "prefix" "evex")])
+
+(define_insn "bsrmovh_load"
+  [(set (match_operand:V32SI 0 "bsr0_operand")
+        (unspec_volatile:V32SI
+         [(match_operand:V16SI 1 "vector_operand" "vm")]
+         UNSPECV_BSRMOVH_LOAD))]
+  "TARGET_ACEV1"
+  "bsrmovh\t{%1, %0|%0, %1}"
+  [(set_attr "prefix" "evex")])
+
+(define_insn "bsrmovl_load"
+  [(set (match_operand:V32SI 0 "bsr0_operand")
+        (unspec_volatile:V32SI
+         [(match_operand:V16SI 1 "vector_operand" "vm")]
+         UNSPECV_BSRMOVL_LOAD))]
+  "TARGET_ACEV1"
+  "bsrmovl\t{%1, %0|%0, %1}"
+  [(set_attr "prefix" "evex")])
+
+(define_insn "bsrmovh_store"
+  [(set (match_operand:V16SI 0 "vector_operand" "=vm")
+        (unspec:V16SI
+          [(match_operand:V32SI 1 "bsr0_operand")]
+         UNSPEC_BSRMOVH_STORE))]
+  "TARGET_ACEV1"
+  "bsrmovh\t{%1, %0|%0, %1}"
+  [(set_attr "prefix" "evex")])
+
+(define_insn "bsrmovl_store"
+  [(set (match_operand:V16SI 0 "vector_operand" "=vm")
+        (unspec:V16SI
+          [(match_operand:V32SI 1 "bsr0_operand")]
+         UNSPEC_BSRMOVL_STORE))]
+  "TARGET_ACEV1"
+  "bsrmovl\t{%1, %0|%0, %1}"
+  [(set_attr "prefix" "evex")])
diff --git a/gcc/testsuite/gcc.target/i386/ace-check.h 
b/gcc/testsuite/gcc.target/i386/ace-check.h
new file mode 100644
index 00000000000..e9ea67ce3dd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/ace-check.h
@@ -0,0 +1,84 @@
+#ifndef ACE_CHECK_H_INCLUDED
+#define ACE_CHECK_H_INCLUDED
+#include "cpuid.h"
+#include "m512-check.h"
+
+typedef struct __tile_config
+{
+  unsigned char palette_id; 
+  unsigned char reserved[63];
+} __tilecfg;
+
+typedef union __tile
+{
+  unsigned char buf[1024];
+  float a[256];
+  int b[256];
+} __tile;
+
+typedef struct __bsr
+{
+  unsigned char buf[128];
+} __bsr;
+
+void init_bsr (__bsr *bsr, union512i_ub *src1, union512i_ub *src2)
+{
+  int i;
+  for (i = 0; i < 64; i++)
+    {
+      bsr->buf[i] = 0x7f;
+      src1->a[i] = 0x7f;
+    }
+  for (i = 0; i < 64; i++)
+    {
+      bsr->buf[i + 64] = 0x7f;
+      src2->a[i] = 0x7f;
+    }
+}
+
+void fill_bsr (__bsr *bsr, union512i_ub* src1, union512i_ub* src2)
+{
+  int i;
+  for (i = 0; i < 64; i++)
+    {
+      bsr->buf[i] = 127 + i;
+      src1->a[i] = 127 + i;
+    }
+  for (i = 0; i < 64; i++)
+    {
+      bsr->buf[i + 64] = 127 - i;
+      src2->a[i] = 127 - i;
+    }
+}
+
+#ifndef DO_TEST
+#define DO_TEST do_test
+static void test_ace (void);
+__attribute__ ((noinline))
+static void
+do_test (void)
+{
+  test_ace ();
+}
+#endif
+
+int
+main ()
+{
+  /* Check cpu support for ACE */
+  if (__builtin_cpu_supports ("acev1"))
+    {
+      DO_TEST ();
+#ifdef DEBUG
+      printf ("PASSED\n");
+#endif
+    }
+#ifdef DEBUG
+  else
+    printf ("SKIPPED\n");
+#endif
+
+  return 0;
+}
+
+#endif
diff --git a/gcc/testsuite/gcc.target/i386/ace-helper.h 
b/gcc/testsuite/gcc.target/i386/ace-helper.h
new file mode 100644
index 00000000000..8b4611e6e3f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/ace-helper.h
@@ -0,0 +1,7 @@
+#ifndef ACE_HELPER_H_INCLUDED
+#define ACE_HELPER_H_INCLUDED
+#define ACE
+#define AVX512FP16
+#define AVX512BF16
+#include "avx512f-helper.h"
+#endif
diff --git a/gcc/testsuite/gcc.target/i386/acev1-1.c 
b/gcc/testsuite/gcc.target/i386/acev1-1.c
index 9165f571ef9..daff9278363 100644
--- a/gcc/testsuite/gcc.target/i386/acev1-1.c
+++ b/gcc/testsuite/gcc.target/i386/acev1-1.c
@@ -4,9 +4,14 @@
 /* { dg-final { scan-assembler-times "sttilecfg\[ \t]" 1 } } */
 /* { dg-final { scan-assembler-times "tilerelease" 1 } } */
 /* { dg-final { scan-assembler-times "tilezero\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "bsrinit\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "bsrmovf\[ \t]" 1 } } */
+/* { dg-final { scan-assembler-times "bsrmovl\[ \t]" 2 } } */
+/* { dg-final { scan-assembler-times "bsrmovh\[ \t]" 2 } } */
 #include <immintrin.h>
 
 extern int t[];
+__m512i a1,a2;
 
 void amxtile ()
 {
@@ -15,3 +20,13 @@ void amxtile ()
   _tile_ace_release ();
   _tile_ace_zero (0);
 }
+
+void bsr ()
+{
+  _bsr0_init ();
+  _bsr0_insertfull (a1, a2);
+  _bsr0_inserth (a1);
+  a1 = _bsr0_extracth ();
+  _bsr0_insertl (a2);
+  a2 = _bsr0_extractl ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-bsrinit-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-bsrinit-2.c
new file mode 100644
index 00000000000..19ff3680e89
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-bsrinit-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_bsrinit
+void test_acev1_bsrinit ();
+#include "ace-helper.h"
+
+void test_acev1_bsrinit ()
+{
+  __tilecfg cfg;
+  __bsr bsr0;
+  union512i_ub src1, src2, res1, res2;
+  int i, miss;
+
+  init_tile_config (&cfg, &bsr0);
+
+  init_bsr (&bsr0, &src1, &src2);
+
+  _bsr0_init ();
+  res1.x = _bsr0_extractl ();
+  res2.x = _bsr0_extracth ();
+
+  miss = 0;
+  for (i = 0; i < 64; i++)
+    if (res1.a[i] != bsr0.buf[i])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res1.a[i], bsr0.buf[i]);
+#endif
+       miss++;
+      }
+
+  for (i = 0; i < 64; i++)
+    if (res2.a[i] != bsr0.buf[i + 64])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res2.a[i], bsr0.buf[i + 64]);
+#endif
+       miss++;
+      }
+
+  if (miss)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-bsrmovf-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-bsrmovf-2.c
new file mode 100644
index 00000000000..a807f92d6a6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-bsrmovf-2.c
@@ -0,0 +1,44 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_bsrmovf
+void test_acev1_bsrmovf ();
+#include "ace-helper.h"
+
+void test_acev1_bsrmovf ()
+{
+  __tilecfg cfg;
+  __bsr bsr0;
+  union512i_ub src1, src2, res1, res2;
+  int i, miss;
+
+  init_tile_config (&cfg, &bsr0);
+
+  fill_bsr (&bsr0, &src1, &src2);
+
+  _bsr0_insertfull (src2.x, src1.x);
+  res1.x = _bsr0_extractl ();
+  res2.x = _bsr0_extracth ();
+
+  miss = 0;
+  for (i = 0; i < 64; i++)
+    if (res1.a[i] != bsr0.buf[i])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res1.a[i], bsr0.buf[i]);
+#endif
+       miss++;
+      }
+
+  for (i = 0; i < 64; i++)
+    if (res2.a[i] != bsr0.buf[i + 64])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res2.a[i], bsr0.buf[i + 64]);
+#endif
+       miss++;
+      }
+
+  if (miss)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-bsrmovh-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-bsrmovh-2.c
new file mode 100644
index 00000000000..bf0af09d4ab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-bsrmovh-2.c
@@ -0,0 +1,34 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_bsrmovh
+void test_acev1_bsrmovh ();
+#include "ace-helper.h"
+
+void test_acev1_bsrmovh ()
+{
+  __tilecfg cfg;
+  __bsr bsr0;
+  union512i_ub src1, src2, res;
+  int i, miss;
+
+  init_tile_config (&cfg, &bsr0);
+
+  fill_bsr (&bsr0, &src1, &src2);
+
+  _bsr0_inserth (src2.x);
+  res.x = _bsr0_extracth ();
+
+  miss = 0;
+  for (i = 0; i < 64; i++)
+    if (res.a[i] != bsr0.buf[i + 64])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res.a[i], bsr0.buf[i + 64]);
+#endif
+       miss++;
+      }
+
+  if (miss)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/acev1-bsrmovl-2.c 
b/gcc/testsuite/gcc.target/i386/acev1-bsrmovl-2.c
new file mode 100644
index 00000000000..0068c5c0623
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/acev1-bsrmovl-2.c
@@ -0,0 +1,34 @@
+/* { dg-do run { target { ! ia32 } } } */
+/* { dg-require-effective-target acev1 } */
+/* { dg-options "-O2 -macev1" } */
+#define DO_TEST test_acev1_bsrmovl
+void test_acev1_bsrmovl ();
+#include "ace-helper.h"
+
+void test_acev1_bsrmovl ()
+{
+  __tilecfg cfg;
+  __bsr bsr0;
+  union512i_ub src1, src2, res;
+  int i, miss;
+
+  init_tile_config (&cfg, &bsr0);
+
+  fill_bsr (&bsr0, &src1, &src2);
+
+  _bsr0_insertl (src1.x);
+  res.x = _bsr0_extractl ();
+
+  miss = 0;
+  for (i = 0; i < 64; i++)
+    if (res.a[i] != bsr0.buf[i])
+      {
+#ifdef DEBUG
+       printf ("%d: %d != %d\n", i, res.a[i], bsr0.buf[i]);
+#endif
+       miss++;
+      }
+
+  if (miss)
+    abort ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/avx512f-helper.h 
b/gcc/testsuite/gcc.target/i386/avx512f-helper.h
index f0089812563..194d3b04035 100644
--- a/gcc/testsuite/gcc.target/i386/avx512f-helper.h
+++ b/gcc/testsuite/gcc.target/i386/avx512f-helper.h
@@ -8,7 +8,9 @@
 #ifndef AVX512F_HELPER_INCLUDED
 #define AVX512F_HELPER_INCLUDED
 
-#if defined(AVX10)
+#if defined(ACE)
+#include "ace-check.h"
+#elif defined(AVX10)
 #include "avx10-check.h"
 #else
 #include "avx512-check.h"
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 987e57dfac7..1a1256af1c3 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -11741,6 +11741,19 @@ proc check_effective_target_amx_movrs { } {
     } "-mamx-movrs" ]
 }
 
+
+# Return 1 if acev1 instructions can be compiled.
+proc check_effective_target_acev1 { } {
+    return [check_no_compiler_messages acev1 object {
+       void
+       _bsr0_init ()
+       {
+         return __builtin_ia32_bsr0init ();
+       }
+
+    } "-macev1" ]
+}
+
 # Return 1 if sse instructions can be compiled.
 proc check_effective_target_sse { } {
     return [check_no_compiler_messages sse object {
-- 
2.31.1

Reply via email to