* common/config/i386/cpuinfo.h (XSTATE_SCALEDATA):
(XCR_ACE_ENABLED_MASK):
(get_available_features):
* common/config/i386/i386-common.cc (OPTION_MASK_ISA2_ACE_V1_SET):
(OPTION_MASK_ISA2_AVX10_V2_AUX_UNSET):
(OPTION_MASK_ISA2_ACE_V1_UNSET):
(OPTION_MASK_ISA2_TILE_UNSET):
(ix86_handle_option):
* common/config/i386/i386-cpuinfo.h (enum processor_features):
* common/config/i386/i386-isas.h:
* config/i386/cpuid.h (bit_ACE):
* config/i386/i386-c.cc (ix86_target_macros_internal):
* config/i386/i386-isa.def (ACE_V1):
* config/i386/i386-options.cc (ix86_valid_target_attribute_inner_p):
* config/i386/i386.opt:
* doc/extend.texi:
* doc/invoke.texi:
gcc/testsuite/ChangeLog:
* gcc.target/i386/funcspec-56.inc:
* gcc.target/i386/tile-1.c: New test.
* gcc.target/i386/tile-2.c: New test.
gcc/common/config/i386/cpuinfo.h | 31 ++++++++++++++++++-
gcc/common/config/i386/i386-common.cc | 25 +++++++++++++--
gcc/common/config/i386/i386-cpuinfo.h | 1 +
gcc/common/config/i386/i386-isas.h | 1 +
gcc/config/i386/cpuid.h | 3 ++
gcc/config/i386/i386-c.cc | 2 ++
gcc/config/i386/i386-isa.def | 1 +
gcc/config/i386/i386-options.cc | 2 ++
gcc/config/i386/i386.opt | 4 +++
gcc/doc/extend.texi | 5 +++
gcc/doc/invoke.texi | 2 +-
gcc/testsuite/gcc.target/i386/funcspec-56.inc | 2 ++
gcc/testsuite/gcc.target/i386/tile-1.c | 11 +++++++
gcc/testsuite/gcc.target/i386/tile-2.c | 11 +++++++
14 files changed, 97 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/tile-1.c
create mode 100644 gcc/testsuite/gcc.target/i386/tile-2.c
diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
index 6310e7294da..f284917b3f5 100644
--- a/gcc/common/config/i386/cpuinfo.h
+++ b/gcc/common/config/i386/cpuinfo.h
@@ -804,6 +804,7 @@ get_available_features (struct __processor_model *cpu_model,
#define XSTATE_TILECFG 0x20000
#define XSTATE_TILEDATA 0x40000
#define XSTATE_APX_F 0x80000
+#define XSTATE_SCALEDATA 0x80000
#define XCR_AVX_ENABLED_MASK \
(XSTATE_SSE | XSTATE_YMM)
@@ -812,17 +813,23 @@ get_available_features (struct __processor_model
*cpu_model,
#define XCR_AMX_ENABLED_MASK \
(XSTATE_TILECFG | XSTATE_TILEDATA)
#define XCR_APX_F_ENABLED_MASK XSTATE_APX_F
+#define XCR_ACE_ENABLED_MASK \
+ (XCR_AMX_ENABLED_MASK | XSTATE_SCALEDATA)
/* Check if AVX, AVX512 and APX are usable. */
int avx_usable = 0;
int avx512_usable = 0;
int amx_usable = 0;
int apx_usable = 0;
+ int ace_usable = 0;
/* Check if KL is usable. */
int has_kl = 0;
/* Record AVX10 version. */
int avx10_set = 0;
int version = 0;
+ int ace_set = 0;
+ int ace_version = 0;
+ int avx10_v2_aux_set = 0;
if ((ecx & bit_OSXSAVE))
{
/* Check if XMM, YMM, OPMASK, upper 256 bits of ZMM0-ZMM15 and
@@ -840,6 +847,8 @@ get_available_features (struct __processor_model *cpu_model,
}
amx_usable = ((xcrlow & XCR_AMX_ENABLED_MASK)
== XCR_AMX_ENABLED_MASK);
+ ace_usable = ((xcrlow & XCR_ACE_ENABLED_MASK)
+ == XCR_ACE_ENABLED_MASK);
apx_usable = ((xcrlow & XCR_APX_F_ENABLED_MASK)
== XCR_APX_F_ENABLED_MASK);
}
@@ -1057,6 +1066,11 @@ get_available_features (struct __processor_model
*cpu_model,
if (edx & bit_APX_F)
set_feature (FEATURE_APX_F);
}
+ if (ace_usable)
+ {
+ if (ecx & bit_ACE)
+ ace_set = 1;
+ }
}
}
@@ -1142,7 +1156,22 @@ get_available_features (struct __processor_model
*cpu_model,
/* CPUID.(EAX=24H, ECX=1) for AVX10_V2_AUX features. */
__cpuid_count (0x24, 1, eax, ebx, ecx, edx);
if (ecx & bit_AVX10_V2_AUX)
- set_feature (FEATURE_AVX10_V2_AUX);
+ {
+ set_feature (FEATURE_AVX10_V2_AUX);
+ avx10_v2_aux_set = 1;
+ }
+ }
+
+ /* Get Advanced Features at level 0x1D (eax = 0x1D, ecx = 2). */
+ /* TODO: ADD check for AUX v1 and v2*/
+ if (ace_set && max_cpuid_level >= 0x1d)
+ {
+ __cpuid_count (0x1d, 2, eax, ebx, ecx, edx);
+ ace_version = eax & 0xff;
+ if((version >=1) &&
+ (avx10_v2_aux_set == 1) &&
+ (ace_version >= 1))
+ set_feature (FEATURE_ACE_V1);
}
/* Check cpuid level of extended features. */
diff --git a/gcc/common/config/i386/i386-common.cc
b/gcc/common/config/i386/i386-common.cc
index 4a306827715..68a27109589 100644
--- a/gcc/common/config/i386/i386-common.cc
+++ b/gcc/common/config/i386/i386-common.cc
@@ -144,6 +144,9 @@ along with GCC; see the file COPYING3. If not see
#define OPTION_MASK_ISA2_AVX10_V2_AUX_SET \
(OPTION_MASK_ISA2_AVX10_1_SET | OPTION_MASK_ISA2_AVX10_V2_AUX)
#define OPTION_MASK_ISA2_TILE_SET OPTION_MASK_ISA2_TILE
+#define OPTION_MASK_ISA2_ACE_V1_SET \
+ (OPTION_MASK_ISA2_TILE_SET | OPTION_MASK_ISA2_AVX10_V2_AUX_SET \
+ | OPTION_MASK_ISA2_ACE_V1)
/* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
as -msse4.2. */
@@ -338,9 +341,12 @@ along with GCC; see the file COPYING3. If not see
#define OPTION_MASK_ISA2_MOVRS_UNSET OPTION_MASK_ISA2_MOVRS
#define OPTION_MASK_ISA2_AMX_MOVRS_UNSET OPTION_MASK_ISA2_AMX_MOVRS
#define OPTION_MASK_ISA2_AVX512BMM_UNSET OPTION_MASK_ISA2_AVX512BMM
-#define OPTION_MASK_ISA2_AVX10_V2_AUX_UNSET OPTION_MASK_ISA2_AVX10_V2_AUX
+#define OPTION_MASK_ISA2_AVX10_V2_AUX_UNSET \
+ (OPTION_MASK_ISA2_ACE_V1_UNSET | OPTION_MASK_ISA2_AVX10_V2_AUX)
+#define OPTION_MASK_ISA2_ACE_V1_UNSET OPTION_MASK_ISA2_ACE_V1
#define OPTION_MASK_ISA2_TILE_UNSET \
- (OPTION_MASK_ISA2_TILE | OPTION_MASK_ISA2_AMX_TILE_UNSET)
+ (OPTION_MASK_ISA2_TILE | OPTION_MASK_ISA2_AMX_TILE_UNSET \
+ | OPTION_MASK_ISA2_ACE_V1_UNSET)
/* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same
as -mno-sse4.1. */
#define OPTION_MASK_ISA_SSE4_UNSET OPTION_MASK_ISA_SSE4_1_UNSET
@@ -1001,6 +1007,21 @@ ix86_handle_option (struct gcc_options *opts,
opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_AVXVNNI_UNSET;
}
return true;
+
+ case OPT_mace_v1:
+ if (value)
+ {
+ opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_ACE_V1_SET;
+ opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_ACE_V1_SET;
+ opts->x_ix86_isa_flags |= OPTION_MASK_ISA_AVX10_1_SET;
+ opts->x_ix86_isa_flags_explicit |= OPTION_MASK_ISA_AVX10_1_SET;
+ }
+ else
+ {
+ opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_ACE_V1_UNSET;
+ opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_ACE_V1_UNSET;
+ }
+ return true;
case OPT_mtile:
if (value)
diff --git a/gcc/common/config/i386/i386-cpuinfo.h
b/gcc/common/config/i386/i386-cpuinfo.h
index 20444fae38b..9d01c15cbc1 100644
--- a/gcc/common/config/i386/i386-cpuinfo.h
+++ b/gcc/common/config/i386/i386-cpuinfo.h
@@ -285,6 +285,7 @@ enum processor_features
FEATURE_AMX_MOVRS,
FEATURE_AVX512BMM,
FEATURE_AVX10_V2_AUX,
+ FEATURE_ACE_V1,
FEATURE_TILE,
CPU_FEATURE_MAX
};
diff --git a/gcc/common/config/i386/i386-isas.h
b/gcc/common/config/i386/i386-isas.h
index ec3e9273a47..b58a2e20d63 100644
--- a/gcc/common/config/i386/i386-isas.h
+++ b/gcc/common/config/i386/i386-isas.h
@@ -194,5 +194,6 @@ ISA_NAMES_TABLE_START
ISA_NAMES_TABLE_ENTRY("avx512bmm", FEATURE_AVX512BMM, P_NONE, "-mavx512bmm")
ISA_NAMES_TABLE_ENTRY("avx10-v2-aux", FEATURE_AVX10_V2_AUX, P_NONE,
"-mavx10-v2-aux")
+ ISA_NAMES_TABLE_ENTRY("ace-v1", FEATURE_ACE_V1, P_NONE, "-mace-v1")
ISA_NAMES_TABLE_ENTRY("tile", FEATURE_TILE, P_NONE, "-mtile")
ISA_NAMES_TABLE_END
diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
index 4d03bedcc83..7d46bc91154 100644
--- a/gcc/config/i386/cpuid.h
+++ b/gcc/config/i386/cpuid.h
@@ -153,6 +153,9 @@
#define bit_AVX10 (1 << 19)
#define bit_APX_F (1 << 21)
+/* %ecx */
+#define bit_ACE (1 << 11)
+
/* Extended State Enumeration Sub-leaf (%eax == 0xd, %ecx == 1) */
#define bit_XSAVEOPT (1 << 0)
#define bit_XSAVEC (1 << 1)
diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc
index 7f2e2f58109..ec1a3ac4ddf 100644
--- a/gcc/config/i386/i386-c.cc
+++ b/gcc/config/i386/i386-c.cc
@@ -794,6 +794,8 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
def_or_undef (parse_in, "__AVX512BMM__");
if (isa_flag2 & OPTION_MASK_ISA2_AVX10_V2_AUX)
def_or_undef (parse_in, "__AVX10_V2_AUX__");
+ if (isa_flag2 & OPTION_MASK_ISA2_ACE_V1)
+ def_or_undef (parse_in, "__ACE_V1__");
if (isa_flag2 & OPTION_MASK_ISA2_TILE)
def_or_undef (parse_in, "__TILE__");
if (TARGET_IAMCU)
diff --git a/gcc/config/i386/i386-isa.def b/gcc/config/i386/i386-isa.def
index 58800e1dc4f..711fe6a459f 100644
--- a/gcc/config/i386/i386-isa.def
+++ b/gcc/config/i386/i386-isa.def
@@ -127,4 +127,5 @@ DEF_PTA(MOVRS)
DEF_PTA(AMX_MOVRS)
DEF_PTA(AVX512BMM)
DEF_PTA(AVX10_V2_AUX)
+DEF_PTA(ACE_V1)
DEF_PTA(TILE)
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
index 84f8cc683fe..5e382de2dee 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -277,6 +277,7 @@ static struct ix86_target_opts isa2_opts[] =
{ "-mamx-movrs", OPTION_MASK_ISA2_AMX_MOVRS },
{ "-mavx512bmm", OPTION_MASK_ISA2_AVX512BMM },
{ "-mavx10-v2-aux", OPTION_MASK_ISA2_AVX10_V2_AUX },
+ { "-mace-v1", OPTION_MASK_ISA2_ACE_V1 },
{ "-mtile", OPTION_MASK_ISA2_TILE }
};
static struct ix86_target_opts isa_opts[] =
@@ -1144,6 +1145,7 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree
args, char *p_strings[],
IX86_ATTR_ISA ("amx-movrs", OPT_mamx_movrs),
IX86_ATTR_ISA ("avx512bmm", OPT_mavx512bmm),
IX86_ATTR_ISA ("avx10-v2-aux", OPT_mavx10_v2_aux),
+ IX86_ATTR_ISA ("ace-v1", OPT_mace_v1),
IX86_ATTR_ISA ("tile", OPT_mtile),
/* enum options */
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index db45ed64c61..494e0b901ce 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -1394,6 +1394,10 @@ mavx10-v2-aux
Target Mask(ISA2_AVX10_V2_AUX) Var(ix86_isa_flags2) Save
Support AVX10_V2_AUX built-in functions and code generation.
+mace-v1
+Target Mask(ISA2_ACE_V1) Var(ix86_isa_flags2) Save
+Support ACE built-in functions and code generation.
+
mtile
Target Mask(ISA2_TILE) Var(ix86_isa_flags2) Save
Support TILE built-in functions and code generation.
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 9b54348d18f..024a5b7329b 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -9507,6 +9507,11 @@ Enable/disable the generation of the MOVRS instructions.
@itemx no-amx-movrs
Enable/disable the generation of the AMX-MOVRS instructions.
+@cindex @code{target("ace-v1")} function attribute, x86
+@item ace
+@itemx no-ace
+Enable/disable the generation of the ACE instructions.
+
@atindex @code{target("cld")}, x86
@item cld
@itemx no-cld
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index a8685896897..e08b0fff8c3 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1552,7 +1552,7 @@ See RS/6000 and PowerPC Options.
-mamx-complex -mavxvnniint16 -msm3 -msha512 -msm4 -mapxf
-musermsr -mavx10.1 -mavx10.2 -mamx-avx512 -mamx-tf32 -mmovrs
-mamx-movrs -mavx512bmm -mavx10-v2-aux -mcldemote -mms-bitfields
--mno-align-stringops -minline-all-stringops
+-mace-v1 -mno-align-stringops -minline-all-stringops
-minline-stringops-dynamically -mstringop-strategy=@var{alg}
-mkl -mwidekl
-mmemcpy-strategy=@var{strategy} -mmemset-strategy=@var{strategy}
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
index 9d4eb832b1e..c33ecdc3ad7 100644
--- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
@@ -94,6 +94,7 @@ extern void test_amx_fp8 (void)
__attribute__((__target__("amx-f
extern void test_movrs (void)
__attribute__((__target__("movrs")));
extern void test_amx_movrs (void)
__attribute__((__target__("amx-movrs")));
extern void test_tile (void)
__attribute__((__target__("tile")));
+extern void test_ace_v1 (void)
__attribute__((__target__("ace-v1")));
extern void test_no_sgx (void)
__attribute__((__target__("no-sgx")));
extern void test_no_avx512vpopcntdq(void)
__attribute__((__target__("no-avx512vpopcntdq")));
@@ -189,6 +190,7 @@ extern void test_no_amx_fp8 (void)
__attribute__((__target__("no-am
extern void test_no_movrs (void)
__attribute__((__target__("no-movrs")));
extern void test_no_amx_movrs (void)
__attribute__((__target__("no-amx-movrs")));
extern void test_no_tile (void)
__attribute__((__target__("no-tile")));
+extern void test_no_ace_v1 (void)
__attribute__((__target__("no-ace-v1")));
extern void test_arch_nocona (void)
__attribute__((__target__("arch=nocona")));
extern void test_arch_core2 (void)
__attribute__((__target__("arch=core2")));
diff --git a/gcc/testsuite/gcc.target/i386/tile-1.c
b/gcc/testsuite/gcc.target/i386/tile-1.c
new file mode 100644
index 00000000000..55d05258f02
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/tile-1.c
@@ -0,0 +1,11 @@
+/* Verify that -mace-v1 implies -mtile (ACE enables TILE). */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-mace-v1" } */
+
+#ifndef __ACE_V1__
+#error "-mace-v1 should define __ACE_V1__"
+#endif
+
+#ifndef __TILE__
+#error "-mace-v1 should imply -mtile and define __TILE__"
+#endif
diff --git a/gcc/testsuite/gcc.target/i386/tile-2.c
b/gcc/testsuite/gcc.target/i386/tile-2.c
new file mode 100644
index 00000000000..b6d8773b81a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/tile-2.c
@@ -0,0 +1,11 @@
+/* Verify that -mtile does NOT imply -mace-v1 (the implication is one-way). */
+/* { 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
--
2.34.1