gcc/ChangeLog:

        * common/config/i386/cpuinfo.h
        (get_intel_cpu): Handle Coral Rapids.
        * common/config/i386/i386-common.cc (processor_name):
        Add Coral Rapids.
        (processor_alias_table): Ditto.
        * common/config/i386/i386-cpuinfo.h (enum processor_types):
        Add INTEL_CORALRAPIDS.
        * config.gcc: Add -march=coralrapids.
        * config/i386/driver-i386.cc (host_detect_local_cpu): Handle
        coralrapids.
        * config/i386/i386-c.cc (ix86_target_macros_internal): Ditto.
        * config/i386/i386-options.cc (processor_cost_table): Ditto.
        (m_CORALRAPIDS): New.
        * config/i386/i386.h (enum processor_type): Ditto.
        * config/i386/x86-tune-sched.cc
        (ix86_issue_rate): Add Coral Rapids.
        * config/i386/x86-tune.def
        (X86_TUNE_AVOID_256FMA_CHAINS): Enable for Coral Rapids.
        * doc/extend.texi: Add Coral Rapids documentation.
        * doc/invoke.texi: Ditto.

gcc/testsuite/ChangeLog:

        * g++.target/i386/mv16.C: Ditto.
        * gcc.target/i386/funcspec-56.inc: Handle new march.

Co-authored-by: Sun, Qin <[email protected]>
---
 gcc/common/config/i386/cpuinfo.h              |  8 ++++++++
 gcc/common/config/i386/i386-common.cc         |  3 +++
 gcc/common/config/i386/i386-cpuinfo.h         |  1 +
 gcc/config.gcc                                |  2 +-
 gcc/config/i386/driver-i386.cc                |  3 +++
 gcc/config/i386/i386-c.cc                     |  8 ++++++++
 gcc/config/i386/i386-options.cc               |  4 +++-
 gcc/config/i386/i386.h                        |  3 +++
 gcc/config/i386/x86-tune-sched.cc             |  1 +
 gcc/config/i386/x86-tune.def                  |  3 ++-
 gcc/doc/extend.texi                           |  3 +++
 gcc/doc/invoke.texi                           | 13 +++++++++++++
 gcc/testsuite/g++.target/i386/mv16.C          |  6 ++++++
 gcc/testsuite/gcc.target/i386/funcspec-56.inc |  1 +
 14 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
index 5febcdb9b75..e0aae0b5aac 100644
--- a/gcc/common/config/i386/cpuinfo.h
+++ b/gcc/common/config/i386/cpuinfo.h
@@ -735,6 +735,14 @@ get_intel_cpu (struct __processor_model *cpu_model,
        cpu_model->__cpu_type = INTEL_COREI7;
        cpu_model->__cpu_subtype = INTEL_COREI7_DIAMONDRAPIDS;
        break;
+      case 0x08:
+       /* Coral Rapids.  */
+       cpu = "coralrapids";
+       CHECK___builtin_cpu_is ("corei7");
+       CHECK___builtin_cpu_is ("coralrapids");
+       cpu_model->__cpu_type = INTEL_COREI7;
+       cpu_model->__cpu_subtype = INTEL_COREI7_CORALRAPIDS;
+       break;
       default:
        break;
       }
diff --git a/gcc/common/config/i386/i386-common.cc 
b/gcc/common/config/i386/i386-common.cc
index c368f5040ba..8c93e357a04 100644
--- a/gcc/common/config/i386/i386-common.cc
+++ b/gcc/common/config/i386/i386-common.cc
@@ -2372,6 +2372,7 @@ const char *const processor_names[] =
   "pantherlake",
   "diamondrapids",
   "novalake",
+  "coralrapids",
   "intel",
   "lujiazui",
   "yongfeng",
@@ -2522,6 +2523,8 @@ const pta processor_alias_table[] =
     M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_2},
   {"razorlake", PROCESSOR_NOVALAKE, CPU_HASWELL, PTA_NOVALAKE,
     M_CPU_SUBTYPE (INTEL_COREI7_NOVALAKE), P_PROC_AVX10_2},
+  {"coralrapids", PROCESSOR_CORALRAPIDS, CPU_HASWELL, PTA_CORALRAPIDS,
+    M_CPU_SUBTYPE (INTEL_COREI7_CORALRAPIDS), P_PROC_AVX10_2},
   {"bonnell", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
     M_CPU_TYPE (INTEL_BONNELL), P_PROC_SSSE3},
   {"atom", PROCESSOR_BONNELL, CPU_ATOM, PTA_BONNELL,
diff --git a/gcc/common/config/i386/i386-cpuinfo.h 
b/gcc/common/config/i386/i386-cpuinfo.h
index 79815bd7e51..431ebc060fa 100644
--- a/gcc/common/config/i386/i386-cpuinfo.h
+++ b/gcc/common/config/i386/i386-cpuinfo.h
@@ -114,6 +114,7 @@ enum processor_subtypes
   HYGONFAM18H_C86_4G_M6,
   HYGONFAM18H_C86_4G_M7,
   HYGONFAM18H_C86_4G_M8,
+  INTEL_COREI7_CORALRAPIDS,
   CPU_SUBTYPE_MAX
 };
 
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 1466a37c50e..cf3d99f2e5a 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -784,7 +784,7 @@ sapphirerapids alderlake rocketlake eden-x2 nano nano-1000 
nano-2000 nano-3000 \
 nano-x2 eden-x4 nano-x4 lujiazui yongfeng shijidadao x86-64 x86-64-v2 \
 x86-64-v3 x86-64-v4 sierraforest graniterapids graniterapids-d grandridge \
 arrowlake arrowlake-s clearwaterforest pantherlake diamondrapids novalake \
-c86-4g-m4 c86-4g-m6 c86-4g-m7 c86-4g-m8 native"
+c86-4g-m4 c86-4g-m6 c86-4g-m7 c86-4g-m8 coralrapids native"
 
 # Additional x86 processors supported by --with-cpu=.  Each processor
 # MUST be separated by exactly one space.
diff --git a/gcc/config/i386/driver-i386.cc b/gcc/config/i386/driver-i386.cc
index c7fb27769c7..23c340ee682 100644
--- a/gcc/config/i386/driver-i386.cc
+++ b/gcc/config/i386/driver-i386.cc
@@ -614,6 +614,9 @@ const char *host_detect_local_cpu (int argc, const char 
**argv)
              /* This is unknown CPU.  */
              if (has_feature (FEATURE_AVX512F))
                {
+                 /* Assume Coral Rapids.  */
+                 if (has_feature (FEATURE_AVX10VPMLDSABFLYDQ))
+                   cpu = "coralrapids";
                  /* Assume Diamond Rapids.  */
                  if (has_feature (FEATURE_AMX_FP8))
                    cpu = "diamondrapids";
diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc
index 15a5e67836b..a895965d439 100644
--- a/gcc/config/i386/i386-c.cc
+++ b/gcc/config/i386/i386-c.cc
@@ -319,6 +319,11 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
       def_or_undef (parse_in, "__c86_4g_m8");
       def_or_undef (parse_in, "__c86_4g_m8__");
       break;
+    case PROCESSOR_CORALRAPIDS:
+      def_or_undef (parse_in, "__coralrapids");
+      def_or_undef (parse_in, "__coralrapids__");
+      break;
+
     /* use PROCESSOR_max to not set/unset the arch macro.  */
     case PROCESSOR_max:
       break;
@@ -539,6 +544,9 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
     case PROCESSOR_C86_4G_M8:
       def_or_undef (parse_in, "__tune_c86_4g_m8__");
       break;
+    case PROCESSOR_CORALRAPIDS:
+      def_or_undef (parse_in, "__tune_coralrapids__");
+      break;
     case PROCESSOR_INTEL:
     case PROCESSOR_GENERIC:
       break;
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
index 7b5d9f416f6..9bcd7b9fd6b 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -133,11 +133,12 @@ along with GCC; see the file COPYING3.  If not see
 #define m_PANTHERLAKE (HOST_WIDE_INT_1U<<PROCESSOR_PANTHERLAKE)
 #define m_DIAMONDRAPIDS (HOST_WIDE_INT_1U<<PROCESSOR_DIAMONDRAPIDS)
 #define m_NOVALAKE (HOST_WIDE_INT_1U<<PROCESSOR_NOVALAKE)
+#define m_CORALRAPIDS (HOST_WIDE_INT_1U<<PROCESSOR_CORALRAPIDS)
 #define m_CORE_AVX512 (m_SKYLAKE_AVX512 | m_CANNONLAKE \
                       | m_ICELAKE_CLIENT | m_ICELAKE_SERVER | m_CASCADELAKE \
                       | m_TIGERLAKE | m_COOPERLAKE | m_SAPPHIRERAPIDS \
                       | m_ROCKETLAKE | m_GRANITERAPIDS | m_GRANITERAPIDS_D \
-                      | m_DIAMONDRAPIDS)
+                      | m_DIAMONDRAPIDS | m_CORALRAPIDS)
 #define m_CORE_AVX2 (m_HASWELL | m_SKYLAKE | m_CORE_AVX512)
 #define m_CORE_ALL (m_CORE2 | m_NEHALEM  | m_SANDYBRIDGE | m_CORE_AVX2)
 #define m_CORE_HYBRID (m_ALDERLAKE | m_ARROWLAKE | m_ARROWLAKE_S \
@@ -809,6 +810,7 @@ static const struct processor_costs *processor_cost_table[] 
=
   &alderlake_cost,     /* PROCESSOR_PANTHERLAKE.       */
   &icelake_cost,       /* PROCESSOR_DIAMONDRAPIDS.     */
   &alderlake_cost,     /* PROCESSOR_NOVALAKE.          */
+  &icelake_cost,       /* PROCESSOR_CORALRAPIDS.       */
   &alderlake_cost,     /* PROCESSOR_INTEL.             */
   &lujiazui_cost,      /* PROCESSOR_LUJIAZUI.          */
   &yongfeng_cost,      /* PROCESSOR_YONGFENG.          */
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 07f585b9b9e..240de2c1582 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2384,6 +2384,7 @@ enum processor_type
   PROCESSOR_PANTHERLAKE,
   PROCESSOR_DIAMONDRAPIDS,
   PROCESSOR_NOVALAKE,
+  PROCESSOR_CORALRAPIDS,
   PROCESSOR_INTEL,
   PROCESSOR_LUJIAZUI,
   PROCESSOR_YONGFENG,
@@ -2525,6 +2526,8 @@ constexpr wide_int_bitmask PTA_NOVALAKE = PTA_PANTHERLAKE 
| PTA_PREFETCHI
   | PTA_AVX512VBMI | PTA_AVX512IFMA | PTA_AVX512VNNI | PTA_AVX512VBMI2
   | PTA_AVX512BITALG | PTA_AVX512VPOPCNTDQ | PTA_AVX512FP16 | PTA_AVX512BF16
   | PTA_AVX10_1 | PTA_AVX10_2 | PTA_APX_F | PTA_MOVRS | PTA_AVX10V1AUX;
+constexpr wide_int_bitmask PTA_CORALRAPIDS = PTA_DIAMONDRAPIDS
+  | PTA_AVX10VPMLDSABFLYDQ;
 
 constexpr wide_int_bitmask PTA_BDVER1 = PTA_64BIT | PTA_MMX | PTA_SSE
   | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_POPCNT | PTA_LZCNT
diff --git a/gcc/config/i386/x86-tune-sched.cc 
b/gcc/config/i386/x86-tune-sched.cc
index de9865cdae8..1f563fd8b9d 100644
--- a/gcc/config/i386/x86-tune-sched.cc
+++ b/gcc/config/i386/x86-tune-sched.cc
@@ -113,6 +113,7 @@ ix86_issue_rate (void)
     case PROCESSOR_ARROWLAKE:
     case PROCESSOR_ARROWLAKE_S:
     case PROCESSOR_PANTHERLAKE:
+    case PROCESSOR_CORALRAPIDS:
       return 6;
 
     case PROCESSOR_NOVALAKE:
diff --git a/gcc/config/i386/x86-tune.def b/gcc/config/i386/x86-tune.def
index 11617220282..62a02065c0a 100644
--- a/gcc/config/i386/x86-tune.def
+++ b/gcc/config/i386/x86-tune.def
@@ -593,7 +593,8 @@ DEF_TUNE (X86_TUNE_AVOID_128FMA_CHAINS, "avoid_fma_chains", 
m_ZNVER
 DEF_TUNE (X86_TUNE_AVOID_256FMA_CHAINS, "avoid_fma256_chains",
          m_ZNVER2 | m_ZNVER3 | m_ZNVER4 | m_ZNVER5  | m_ZNVER6 | m_CORE_HYBRID
          | m_SAPPHIRERAPIDS | m_GRANITERAPIDS | m_GRANITERAPIDS_D
-         | m_DIAMONDRAPIDS | m_CORE_ATOM | m_GENERIC | m_C86_4G)
+         | m_DIAMONDRAPIDS | m_CORALRAPIDS | m_CORE_ATOM | m_GENERIC
+         | m_C86_4G)
 
 /* X86_TUNE_AVOID_512FMA_CHAINS: Avoid creating loops with tight 512bit or
    smaller FMA chain.  */
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index b7dfea3a14c..7f7ec42f51a 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -29651,6 +29651,9 @@ Intel Core i7 Diamond Rapids CPU.
 @item novalake
 Intel Core i7 Nova Lake CPU.
 
+@item coralrapids
+Intel Core i7 Coral Rapids CPU.
+
 @item bonnell
 Intel Atom Bonnell CPU.
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 44f469caf8b..268038dc5b8 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -35488,6 +35488,19 @@ PREFETCHI, AMX-COMPLEX, AVX10.1-512, AVX-IFMA, 
AVX-NE-CONVERT, AVX-VNNI-INT16,
 AVX-VNNI-INT8, CMPccXADD, SHA512, SM3, SM4, AVX10.2-512, APX_F, AMX-AVX512,
 AMX-FP8, MOVRS and AMX-MOVRS instruction set support.
 
+@item coralrapids
+Intel Coral Rapids CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3,
+SSSE3, SSE4.1, SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE,
+RDRND, F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW,
+AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW, AVX512DQ,
+AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI, VAES, 
AVX512VBMI2,
+VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ, PCONFIG, WBNOINVD, CLWB,
+MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK,
+UINTR, AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512FP16, AVX512BF16, 
AMX-FP16,
+PREFETCHI, AMX-COMPLEX, AVX10.1, AVX-IFMA, AVX-NE-CONVERT, AVX-VNNI-INT16,
+AVX-VNNI-INT8, CMPccXADD, SHA512, SM3, SM4, AVX10.2, APX_F, AMX-AVX512, 
AMX-FP8,
+AMX-TF32, MOVRS, AMX-MOVRS, AVX10_VPMLDSABFLYDQ instruction set support.
+
 @item bonnell
 @itemx atom
 Intel Bonnell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3
diff --git a/gcc/testsuite/g++.target/i386/mv16.C 
b/gcc/testsuite/g++.target/i386/mv16.C
index 87126a058db..944b6703c4f 100644
--- a/gcc/testsuite/g++.target/i386/mv16.C
+++ b/gcc/testsuite/g++.target/i386/mv16.C
@@ -132,6 +132,10 @@ int __attribute__ ((target("arch=novalake"))) foo () {
   return 34;
 }
 
+int __attribute__ ((target("arch=coralrapids"))) foo () {
+  return 35;
+}
+
 int main ()
 {
   int val = foo ();
@@ -190,6 +194,8 @@ int main ()
     assert (val == 33);
   else if (__builtin_cpu_is ("novalake"))
     assert (val == 34);
+  else if (__builtin_cpu_is ("coralrapids"))
+    assert (val == 35);
   else
     assert (val == 0);
 
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc 
b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
index 4f4fde0ed66..03221fedbd2 100644
--- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
@@ -236,6 +236,7 @@ extern void test_arch_arrowlake_s (void)    
__attribute__((__target__("arch=arrowla
 extern void test_arch_pantherlake (void)       
__attribute__((__target__("arch=pantherlake")));
 extern void test_arch_diamondrapids (void)     
__attribute__((__target__("arch=diamondrapids")));
 extern void test_arch_novalake (void)          
__attribute__((__target__("arch=novalake")));
+extern void test_arch_coralrapids (void)       
__attribute__((__target__("arch=coralrapids")));
 extern void test_arch_lujiazui (void)          
__attribute__((__target__("arch=lujiazui")));
 extern void test_arch_yongfeng (void)          
__attribute__((__target__("arch=yongfeng")));
 extern void test_arch_shijidadao (void)                
__attribute__((__target__("arch=shijidadao")));
-- 
2.31.1

Reply via email to