---
gcc/ChangeLog:

        * config.gcc:
        * config/i386/immintrin.h:
        * doc/sourcebuild.texi:
        * config/i386/aceintrin.h: New file.

gcc/testsuite/ChangeLog:

        * g++.dg/other/i386-2.C:
        * g++.dg/other/i386-3.C:
        * gcc.target/i386/tile-1.c: Move to...
        * gcc.target/i386/ace-define-1.c: ...here.
        * gcc.target/i386/tile-2.c: Move to...
        * gcc.target/i386/ace-define-2.c: ...here.
        * lib/target-supports.exp:
        * gcc.target/i386/ace-asmatt-1.c: New test.
        * gcc.target/i386/ace-asmintel-1.c: New test.
        * gcc.target/i386/ace-funcspec-1.c: New test.

 gcc/config.gcc                                |   2 +-
 gcc/config/i386/aceintrin.h                   | 151 ++++++++++++++++++
 gcc/config/i386/immintrin.h                   |   2 +
 gcc/doc/sourcebuild.texi                      |   3 +
 gcc/testsuite/g++.dg/other/i386-2.C           |   4 +-
 gcc/testsuite/g++.dg/other/i386-3.C           |   4 +-
 gcc/testsuite/gcc.target/i386/ace-asmatt-1.c  |  58 +++++++
 .../gcc.target/i386/ace-asmintel-1.c          |  58 +++++++
 .../i386/{tile-1.c => ace-define-1.c}         |   0
 .../i386/{tile-2.c => ace-define-2.c}         |   4 -
 .../gcc.target/i386/ace-funcspec-1.c          |  14 ++
 gcc/testsuite/lib/target-supports.exp         |  12 ++
 12 files changed, 303 insertions(+), 9 deletions(-)
 create mode 100644 gcc/config/i386/aceintrin.h
 create mode 100644 gcc/testsuite/gcc.target/i386/ace-asmatt-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/ace-asmintel-1.c
 rename gcc/testsuite/gcc.target/i386/{tile-1.c => ace-define-1.c} (100%)
 rename gcc/testsuite/gcc.target/i386/{tile-2.c => ace-define-2.c} (80%)
 create mode 100644 gcc/testsuite/gcc.target/i386/ace-funcspec-1.c

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 8fc0b37c0f9..afa4c600e4d 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -472,7 +472,7 @@ i[34567]86-*-* | x86_64-*-*)
                       avx10_2minmaxintrin.h avx10_2copyintrin.h
                       amxavx512intrin.h amxtf32intrin.h amxfp8intrin.h
                       movrsintrin.h amxmovrsintrin.h avx512bmmintrin.h
-                      avx512bmmvlintrin.h avx10_v2_auxintrin.h tileintrin.h"
+                      avx512bmmvlintrin.h avx10_v2_auxintrin.h tileintrin.h 
aceintrin.h"
        ;;
 ia64-*-*)
        extra_headers=ia64intrin.h
diff --git a/gcc/config/i386/aceintrin.h b/gcc/config/i386/aceintrin.h
new file mode 100644
index 00000000000..b9292520ba7
--- /dev/null
+++ b/gcc/config/i386/aceintrin.h
@@ -0,0 +1,151 @@
+/* Copyright (C) 2020-2025 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+   
+   GCC is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   Under Section 7 of GPL version 3, you are granted additional
+   permissions described in the GCC Runtime Library Exception, version
+   3.1, as published by the Free Software Foundation.
+   
+   You should have received a copy of the GNU General Public License and
+   a copy of the GCC Runtime Library Exception along with this program;
+   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#if !defined _IMMINTRIN_H_INCLUDED
+#error "Never use <aceintrin.h> directly; include <immintrin.h> instead."
+#endif
+
+#ifndef _ACEINTRIN_H_INCLUDED
+#define _ACEINTRIN_H_INCLUDED
+
+#if !defined(__ACE_V1__)
+#pragma GCC push_options
+#pragma GCC target("ace-v1")
+#define __DISABLE_ACE_V1__
+#endif /* __ACE_V1__ */
+
+#if defined(__x86_64__)
+
+#define _tile_setrowi(dst, src1, imm8)                         \
+  __asm__ volatile                                                     \
+  ("{tilemovrow\t%1, %0, %%tmm"#dst"|tilemovrow\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "i" (imm8))
+
+#define _tile_setrow(dst, src1, r32)                           \
+  __asm__ volatile                                                     \
+  ("{tilemovrow\t%1, %0, %%tmm"#dst"|tilemovrow\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "r" (r32))
+
+#define _tile_setcoli(dst, src1, imm8)                         \
+  __asm__ volatile                                                     \
+  ("{tilemovcol\t%1, %0, %%tmm"#dst"|tilemovcol\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "i" (imm8))
+
+#define _tile_setcol(dst, src1, r32)                           \
+  __asm__ volatile                                                     \
+  ("{tilemovcol\t%1, %0, %%tmm"#dst"|tilemovcol\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "r" (r32))
+
+#define _bsr_movf(src1, src2)                          \
+  __asm__ volatile                                             \
+  ("{bsrmovf\t%1, %0, %%bsr0|bsrmovf\tbsr0, %0, %1}"           \
+   :: "v" (src1), "v" (src2))
+
+#define _bsr_movh_set(src)                                     \
+  __asm__ volatile                                             \
+  ("{bsrmovh\t%0, %%bsr0|bsrmovh\tbsr0, %0}"                   \
+  :: "v" (src))
+
+#define _bsr_movl_set(src)                                     \
+  __asm__ volatile                                             \
+  ("{bsrmovl\t%0, %%bsr0|bsrmovl\tbsr0, %0}"                   \
+  :: "v" (src))
+
+#define _bsr_movh_get()                                        \
+({ __m512i dst;                                                \
+    __asm__ volatile                                           \
+  ("{bsrmovh\t%%bsr0, %0|bsrmovh\t%0, bsr0}"           \
+  : "=v" (dst));                                       \
+    dst; \
+})
+
+#define _bsr_movl_get()                                        \
+({ __m512i dst;                                                \
+    __asm__ volatile                                           \
+  ("{bsrmovl\t%%bsr0, %0|bsrmovl\t%0, bsr0}"           \
+  : "=v" (dst));                                       \
+    dst; \
+})
+
+#define _bsr_init              \
+  __asm__ volatile                             \
+  ("{bsrinit\t%%bsr0|bsrinit\tbsr0}" ::)
+
+#define _tile_top2bf16ps(dst, src1, src2)                      \
+  __asm__ volatile                                                     \
+  ("{top2bf16ps\t%1, %0, %%tmm"#dst"|top2bf16ps\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "v" (src2))
+
+#define _tile_top4bssd(dst, src1, src2)                \
+  __asm__ volatile                                                     \
+  ("{top4bssd\t%1, %0, %%tmm"#dst"|top4bssd\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "v" (src2))
+
+#define _tile_top4busd(dst, src1, src2)                \
+  __asm__ volatile                                                     \
+  ("{top4busd\t%1, %0, %%tmm"#dst"|top4busd\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "v" (src2))
+
+#define _tile_top4bsud(dst, src1, src2)                \
+  __asm__ volatile                                                     \
+  ("{top4bsud\t%1, %0, %%tmm"#dst"|top4bsud\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "v" (src2))
+
+#define _tile_top4buud(dst, src1, src2)                \
+  __asm__ volatile                                                     \
+  ("{top4buud\t%1, %0, %%tmm"#dst"|top4buud\ttmm"#dst", %0, %1}" \
+   :: "v" (src1), "v" (src2))
+
+#define _tile_top4mxbf8ps(dst, src1, src2, imm8)               \
+  __asm__ volatile                                                     \
+  ("{top4mxbf8ps\t%2, %1, %0, %%tmm"#dst"|top4mxbf8ps\ttmm"#dst", %0, %1, %2}" 
\
+   :: "v" (src1), "v" (src2), "i" (imm8))
+
+#define _tile_top4mxbhf8ps(dst, src1, src2, imm8)      \
+  __asm__ volatile                                                     \
+  ("{top4mxbhf8ps\t%2, %1, %0, %%tmm"#dst"|top4mxbhf8ps\ttmm"#dst", %0, %1, 
%2}" \
+   :: "v" (src1), "v" (src2), "i" (imm8))
+
+#define _tile_top4mxhf8ps(dst, src1, src2, imm8)               \
+  __asm__ volatile                                                     \
+  ("{top4mxhf8ps\t%2, %1, %0, %%tmm"#dst"|top4mxhf8ps\ttmm"#dst", %0, %1, %2}" 
\
+   :: "v" (src1), "v" (src2), "i" (imm8))
+
+#define _tile_top4mxhbf8ps(dst, src1, src2, imm8)              \
+  __asm__ volatile                                                     \
+  ("{top4mxhbf8ps\t%2, %1, %0, %%tmm"#dst"|top4mxhbf8ps\ttmm"#dst", %0, %1, 
%2}" \
+   :: "v" (src1), "v" (src2), "i" (imm8))
+
+#define _tile_top4mxbssps(dst, src1, src2, imm8)               \
+  __asm__ volatile                                                     \
+  ("{top4mxbssps\t%2, %1, %0, %%tmm"#dst"|top4mxbssps\ttmm"#dst", %0, %1, %2}" 
\
+   :: "v" (src1), "v" (src2), "i" (imm8))
+
+#endif
+
+#ifdef __DISABLE_ACE_V1__
+#undef __DISABLE_ACE_V1__
+#pragma GCC pop_options
+#endif /* __DISABLE_ACE_V1__ */
+
+#endif /* _ACEINTRIN_H_INCLUDED */
diff --git a/gcc/config/i386/immintrin.h b/gcc/config/i386/immintrin.h
index 18afee336e7..c06fe49287c 100644
--- a/gcc/config/i386/immintrin.h
+++ b/gcc/config/i386/immintrin.h
@@ -167,4 +167,6 @@
 #include <avx512bmmintrin.h>
 
 #include <avx512bmmvlintrin.h>
+
+#include <aceintrin.h>
 #endif /* _IMMINTRIN_H_INCLUDED */
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 7850b9de934..21b9ef5dbe1 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2731,6 +2731,9 @@ Target supports the execution of @code{amx-fp16} 
instructions.
 @item amx_movrs
 Target supports the execution of @code{amx-movrs} instructions.
 
+@item ace-v1
+Target supports the execution of @code{ace-v1} instructions.
+
 @item amx_tf32
 Target supports the execution of @code{amx-tf32} instructions.
 
diff --git a/gcc/testsuite/g++.dg/other/i386-2.C 
b/gcc/testsuite/g++.dg/other/i386-2.C
index 89b9420397a..ee25673c219 100644
--- a/gcc/testsuite/g++.dg/other/i386-2.C
+++ b/gcc/testsuite/g++.dg/other/i386-2.C
@@ -1,5 +1,5 @@
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 
-mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp 
-mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt 
-msha -mxsavec -mxsaves -mclflushopt -mclwb -mmwaitx -mclzero -mpku -msgx 
-mrdpid -mgfni -mpconfig -mwbnoinvd -menqcmd -mavx512vp2intersect -mserialize 
-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavxifma 
-mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint 
-mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mavx10.2 -mamx-avx512 
-mamx-tf32 -mamx-fp8 -mmovrs -mamx-movrs" } */
+/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 
-mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp 
-mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt 
-msha -mxsavec -mxsaves -mclflushopt -mclwb -mmwaitx -mclzero -mpku -msgx 
-mrdpid -mgfni -mpconfig -mwbnoinvd -menqcmd -mavx512vp2intersect -mserialize 
-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavxifma 
-mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi -mraoint 
-mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mavx10.2 -mamx-avx512 
-mamx-tf32 -mamx-fp8 -mmovrs -mamx-movrs -mace-v1" } */
 /* { dg-skip-if "requires hosted libstdc++ for cstdlib malloc" { ! hostedlib } 
} */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
@@ -7,7 +7,7 @@
    popcntintrin.h, fmaintrin.h, pkuintrin.h, avx512vpopcntdqintrin.h,
    gfniintrin.h, avx512bitalgintrin.h, avx512vp2intersectintrin.h,
    tsxldtrkintrin.h, tileintrin.h, amxtileintrin.h, amxint8intrin.h, 
amxbf16intrin.h,
-   avx512vp2intersectvlintrin.h and mm_malloc.h.h are usable
+   avx512vp2intersectvlintrin.h, aceintrin.h and mm_malloc.h.h are usable
    with -O -pedantic-errors.  */
 
 #include <x86intrin.h>
diff --git a/gcc/testsuite/g++.dg/other/i386-3.C 
b/gcc/testsuite/g++.dg/other/i386-3.C
index 6c25b028029..8f40e2f8fc1 100644
--- a/gcc/testsuite/g++.dg/other/i386-3.C
+++ b/gcc/testsuite/g++.dg/other/i386-3.C
@@ -1,5 +1,5 @@
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx 
-mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm 
-mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr 
-mxsaveopt -msha -mxsavec -mxsaves -mclflushopt -mclwb -mmwaitx -mclzero -mpku 
-msgx -mrdpid -mgfni -mpconfig -mwbnoinvd -menqcmd -mavx512vp2intersect 
-mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni 
-mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi 
-mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mavx10.2 
-mamx-avx512 -mamx-tf32 -mamx-fp8 -mmovrs -mamx-movrs" } */
+/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx 
-mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm 
-mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr 
-mxsaveopt -msha -mxsavec -mxsaves -mclflushopt -mclwb -mmwaitx -mclzero -mpku 
-msgx -mrdpid -mgfni -mpconfig -mwbnoinvd -menqcmd -mavx512vp2intersect 
-mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni 
-mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi 
-mraoint -mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mavx10.2 
-mamx-avx512 -mamx-tf32 -mamx-fp8 -mmovrs -mamx-movrs -mace-v1" } */
 /* { dg-skip-if "requires hosted libstdc++ for cstdlib malloc" { ! hostedlib } 
} */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
@@ -7,7 +7,7 @@
    popcntintrin.h, fmaintrin.h, pkuintrin.h, avx512vpopcntdqintrin.h,
    gfniintrin.h, avx512bitalgintrin.h, avx512vp2intersectintrin.h,
    tsxldtrkintrin.h, tileintrin.h, amxtileintrin.h, amxint8intrin.h, 
amxbf16intrin.h,
-   avx512vp2intersectvlintrin.h and mm_malloc.h are usable
+   avx512vp2intersectvlintrin.h, aceintrin.h and mm_malloc.h are usable
    with -O -fkeep-inline-functions.  */
 
 #include <x86intrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/ace-asmatt-1.c 
b/gcc/testsuite/gcc.target/i386/ace-asmatt-1.c
new file mode 100644
index 00000000000..7311b212fd5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/ace-asmatt-1.c
@@ -0,0 +1,58 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -mace-v1" } */
+/* { dg-final { scan-assembler "ldtilecfg\[ \\t]+" } } */
+/* { dg-final { scan-assembler "sttilecfg\[ \\t]+" } } */
+/* { dg-final { scan-assembler "tilerelease" } } */
+/* { dg-final { scan-assembler "tilezero\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "tilemovrow\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "tilemovcol\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "bsrinit\[ \\t]+\[^\n\]*%bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovf\[ \\t]+\[^\n\]*%bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovh\[ \\t]+\[^\n\]*%bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovl\[ \\t]+\[^\n\]*%bsr0" } } */
+/* { dg-final { scan-assembler "top2bf16ps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4bssd\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4busd\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4bsud\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4buud\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbf8ps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbhf8ps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxhf8ps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxhbf8ps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbssps\[ \\t]+\[^\n\]*%tmm\[0-9\]" } } */
+#include <immintrin.h>
+
+void test_ace_data (void)
+{
+  __m512bh b = (__m512bh) _mm512_setzero_si512 ();
+  __m512i i = _mm512_setzero_si512 ();
+  char cfg[64];
+  __m512 z = _mm512_setzero_ps ();
+  __m512i zi = _mm512_setzero_si512 ();
+  int index = 1;
+
+  _tile_loadconfig (cfg);
+  _tile_storeconfig (cfg);
+  _tile_release ();
+  _tile_zero (0);
+  _tile_setrowi (0, z, 0);
+  _tile_setrow (0, z, index);
+  _tile_setcoli (1, z, 0);
+  _tile_setcol (1, z, index);
+  _bsr_init;
+  _bsr_movf (zi, zi);
+  _bsr_movh_set (zi);
+  _bsr_movl_set (zi);
+  (void) _bsr_movh_get ();
+  (void) _bsr_movl_get ();
+  _tile_top2bf16ps (0, b, b);
+  _tile_top4bssd (1, i, i);
+  _tile_top4busd (2, i, i);
+  _tile_top4bsud (3, i, i);
+  _tile_top4buud (4, i, i);
+  _tile_top4mxbf8ps (5, i, i, 0);
+  _tile_top4mxbhf8ps (6, i, i, 0);
+  _tile_top4mxhf8ps (7, i, i, 0);
+  _tile_top4mxhbf8ps (0, i, i, 0);
+  _tile_top4mxbssps (1, i, i, 0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/ace-asmintel-1.c 
b/gcc/testsuite/gcc.target/i386/ace-asmintel-1.c
new file mode 100644
index 00000000000..4ef3cb2d42a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/ace-asmintel-1.c
@@ -0,0 +1,58 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-require-effective-target masm_intel } */
+/* { dg-options "-O2 -mace-v1 -masm=intel" } */
+/* { dg-final { scan-assembler "ldtilecfg\[ \\t]" } } */
+/* { dg-final { scan-assembler "sttilecfg\[ \\t]" } } */
+/* { dg-final { scan-assembler "tilerelease" } } */
+/* { dg-final { scan-assembler "tilezero\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "tilemovrow\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "tilemovcol\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "bsrinit\[ \\t]+\[^\n%\]*bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovf\[ \\t]+\[^\n%\]*bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovh\[ \\t]+\[^\n%\]*bsr0" } } */
+/* { dg-final { scan-assembler "bsrmovl\[ \\t]+\[^\n%\]*bsr0" } } */
+/* { dg-final { scan-assembler "top2bf16ps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4bssd\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4busd\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4bsud\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4buud\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbf8ps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbhf8ps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxhf8ps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxhbf8ps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+/* { dg-final { scan-assembler "top4mxbssps\[ \\t]+\[^\n%\]*tmm\[0-9\]" } } */
+#include <immintrin.h>
+
+void test_ace_data (void)
+{
+  __m512bh b = (__m512bh) _mm512_setzero_si512 ();
+  __m512i i = _mm512_setzero_si512 ();
+  char cfg[64];
+  __m512 z = _mm512_setzero_ps ();
+  __m512i zi = _mm512_setzero_si512 ();
+  int index = 1;
+  _tile_loadconfig (cfg);
+  _tile_storeconfig (cfg);
+  _tile_release ();
+  _tile_zero (0);
+  _tile_setrowi (0, z, 0);
+  _tile_setrow (0, z, index);
+  _tile_setcoli (1, z, 0);
+  _tile_setcol (1, z, index);
+  _bsr_init;
+  _bsr_movf (zi, zi);
+  _bsr_movh_set (zi);
+  _bsr_movl_set (zi);
+  zi = _bsr_movh_get ();
+  zi = _bsr_movl_get ();
+  _tile_top2bf16ps (0, b, b);
+  _tile_top4bssd (1, i, i);
+  _tile_top4busd (2, i, i);
+  _tile_top4bsud (3, i, i);
+  _tile_top4buud (4, i, i);
+  _tile_top4mxbf8ps (5, i, i, 0);
+  _tile_top4mxbhf8ps (6, i, i, 0);
+  _tile_top4mxhf8ps (7, i, i, 0);
+  _tile_top4mxhbf8ps (0, i, i, 0);
+  _tile_top4mxbssps (1, i, i, 0);
+}
diff --git a/gcc/testsuite/gcc.target/i386/tile-1.c 
b/gcc/testsuite/gcc.target/i386/ace-define-1.c
similarity index 100%
rename from gcc/testsuite/gcc.target/i386/tile-1.c
rename to gcc/testsuite/gcc.target/i386/ace-define-1.c
diff --git a/gcc/testsuite/gcc.target/i386/tile-2.c 
b/gcc/testsuite/gcc.target/i386/ace-define-2.c
similarity index 80%
rename from gcc/testsuite/gcc.target/i386/tile-2.c
rename to gcc/testsuite/gcc.target/i386/ace-define-2.c
index b6d8773b81a..99a1d92b26b 100644
--- a/gcc/testsuite/gcc.target/i386/tile-2.c
+++ b/gcc/testsuite/gcc.target/i386/ace-define-2.c
@@ -2,10 +2,6 @@
 /* { dg-do compile { target { ! ia32 } } } */
 /* { dg-options "-mtile -mno-ace-v1" } */
 
-#ifndef __TILE__
-#error "-mtile should define __TILE__"
-#endif
-
 #ifdef __ACE_V1__
 #error "-mtile must not imply -mace-v1; __ACE_V1__ should not be defined"
 #endif
diff --git a/gcc/testsuite/gcc.target/i386/ace-funcspec-1.c 
b/gcc/testsuite/gcc.target/i386/ace-funcspec-1.c
new file mode 100644
index 00000000000..a61699d6a71
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/ace-funcspec-1.c
@@ -0,0 +1,14 @@
+/* Test that target attributes ace are accepted
+   and that functions with these attributes can be called.  */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2" } */
+
+void test_ace (void) __attribute__ ((target ("ace-v1")));
+
+void test_ace (void) {}
+
+int main (void)
+{
+  test_ace ();
+  return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index c32387cea3e..39781dcf7db 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -11580,6 +11580,18 @@ proc check_effective_target_amx_movrs { } {
     } "-mamx-movrs" ]
 }
 
+# Return 1 if ace instructions can be compiled.
+proc check_effective_target_ace_tile { } {
+          return [check_no_compiler_messages ace object {
+       void
+       foo ()
+       {
+           __asm__ volatile ("bsrinit\t%%bsr0" ::);
+               __asm__ volatile ("top2bf16ps\t%%tmm0, %%zmm1, %%zmm2" ::);
+       }
+    } "-mace-v1" ]
+}
+
 # Return 1 if sse instructions can be compiled.
 proc check_effective_target_sse { } {
     return [check_no_compiler_messages sse object {
-- 
2.34.1

Reply via email to