From f019251ac9be017aaf3c58f87f43d88b974d21cf Mon Sep 17 00:00:00 2001 From: Haochen Jiang Date: Wed, 18 Oct 2023 14:40:45 +0800 Subject: Initial Panther Lake Support gcc/ChangeLog: * common/config/i386/cpuinfo.h (get_intel_cpu): Add Panther Lake. * common/config/i386/i386-common.cc (processor_name): Ditto. (processor_alias_table): Ditto. * common/config/i386/i386-cpuinfo.h (enum processor_types): Add INTEL_PANTHERLAKE. * config.gcc: Add -march=pantherlake. * config/i386/driver-i386.cc (host_detect_local_cpu): Refactor the if clause. Handle pantherlake. * config/i386/i386-c.cc (ix86_target_macros_internal): Handle pantherlake. * config/i386/i386-options.cc (processor_cost_table): Ditto. (m_PANTHERLAKE): New. (m_CORE_HYBRID): Add pantherlake. * config/i386/i386.h (enum processor_type): Ditto. * doc/extend.texi: Ditto. * doc/invoke.texi: Ditto. gcc/testsuite/ChangeLog: * g++.target/i386/mv16.C: Ditto. * gcc.target/i386/funcspec-56.inc: Handle new march. --- 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 | 92 ++++++++++++++------------- gcc/config/i386/i386-c.cc | 7 ++ gcc/config/i386/i386-options.cc | 5 +- gcc/config/i386/i386.h | 2 + gcc/doc/extend.texi | 3 + gcc/doc/invoke.texi | 9 +++ gcc/testsuite/g++.target/i386/mv16.C | 6 ++ gcc/testsuite/gcc.target/i386/funcspec-56.inc | 1 + 12 files changed, 94 insertions(+), 45 deletions(-) (limited to 'gcc') diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h index 5cfbcf0..f721888 100644 --- a/gcc/common/config/i386/cpuinfo.h +++ b/gcc/common/config/i386/cpuinfo.h @@ -614,6 +614,14 @@ get_intel_cpu (struct __processor_model *cpu_model, CHECK___builtin_cpu_is ("clearwaterforest"); cpu_model->__cpu_type = INTEL_CLEARWATERFOREST; break; + case 0xcc: + /* Panther Lake. */ + cpu = "pantherlake"; + CHECK___builtin_cpu_is ("corei7"); + CHECK___builtin_cpu_is ("pantherlake"); + cpu_model->__cpu_type = INTEL_COREI7; + cpu_model->__cpu_subtype = INTEL_COREI7_PANTHERLAKE; + break; case 0x17: case 0x1d: /* Penryn. */ diff --git a/gcc/common/config/i386/i386-common.cc b/gcc/common/config/i386/i386-common.cc index 903034d..79b1b35 100644 --- a/gcc/common/config/i386/i386-common.cc +++ b/gcc/common/config/i386/i386-common.cc @@ -2095,6 +2095,7 @@ const char *const processor_names[] = "graniterapids-d", "arrowlake", "arrowlake-s", + "pantherlake", "intel", "lujiazui", "geode", @@ -2227,6 +2228,8 @@ const pta processor_alias_table[] = M_CPU_SUBTYPE (INTEL_COREI7_ARROWLAKE_S), P_PROC_AVX2}, {"lunarlake", PROCESSOR_ARROWLAKE_S, CPU_HASWELL, PTA_ARROWLAKE_S, M_CPU_SUBTYPE (INTEL_COREI7_ARROWLAKE_S), P_PROC_AVX2}, + {"pantherlake", PROCESSOR_PANTHERLAKE, CPU_HASWELL, PTA_PANTHERLAKE, + M_CPU_SUBTYPE (INTEL_COREI7_PANTHERLAKE), P_PROC_AVX2}, {"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 44db6a0..533b748 100644 --- a/gcc/common/config/i386/i386-cpuinfo.h +++ b/gcc/common/config/i386/i386-cpuinfo.h @@ -102,6 +102,7 @@ enum processor_subtypes INTEL_COREI7_GRANITERAPIDS_D, INTEL_COREI7_ARROWLAKE, INTEL_COREI7_ARROWLAKE_S, + INTEL_COREI7_PANTHERLAKE, CPU_SUBTYPE_MAX }; diff --git a/gcc/config.gcc b/gcc/config.gcc index 2d045d6..37311fc 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -708,7 +708,7 @@ skylake goldmont goldmont-plus tremont cascadelake tigerlake cooperlake \ sapphirerapids alderlake rocketlake eden-x2 nano nano-1000 nano-2000 nano-3000 \ nano-x2 eden-x4 nano-x4 lujiazui x86-64 x86-64-v2 x86-64-v3 x86-64-v4 \ sierraforest graniterapids graniterapids-d grandridge arrowlake arrowlake-s \ -clearwaterforest native" +clearwaterforest pantherlake 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 23fcff3..a9e54ef 100644 --- a/gcc/config/i386/driver-i386.cc +++ b/gcc/config/i386/driver-i386.cc @@ -589,26 +589,14 @@ const char *host_detect_local_cpu (int argc, const char **argv) if (arch) { /* This is unknown family 0x6 CPU. */ - if (has_feature (FEATURE_AVX)) + if (has_feature (FEATURE_AVX512F)) { - /* Assume Clearwater Forest. */ - if (has_feature (FEATURE_USER_MSR)) - cpu = "clearwaterforest"; - /* Assume Arrow Lake S. */ - else if (has_feature (FEATURE_SM3)) - cpu = "arrowlake-s"; - /* Assume Grand Ridge. */ - else if (has_feature (FEATURE_RAOINT)) - cpu = "grandridge"; /* Assume Granite Rapids D. */ - else if (has_feature (FEATURE_AMX_COMPLEX)) + if (has_feature (FEATURE_AMX_COMPLEX)) cpu = "graniterapids-d"; /* Assume Granite Rapids. */ else if (has_feature (FEATURE_AMX_FP16)) cpu = "graniterapids"; - /* Assume Sierra Forest. */ - else if (has_feature (FEATURE_AVXVNNIINT8)) - cpu = "sierraforest"; /* Assume Tiger Lake */ else if (has_feature (FEATURE_AVX512VP2INTERSECT)) cpu = "tigerlake"; @@ -621,36 +609,54 @@ const char *host_detect_local_cpu (int argc, const char **argv) /* Assume Ice Lake Server. */ else if (has_feature (FEATURE_WBNOINVD)) cpu = "icelake-server"; - /* Assume Ice Lake. */ - else if (has_feature (FEATURE_AVX512BITALG)) - cpu = "icelake-client"; - /* Assume Cannon Lake. */ - else if (has_feature (FEATURE_AVX512VBMI)) - cpu = "cannonlake"; - /* Assume Knights Mill. */ - else if (has_feature (FEATURE_AVX5124VNNIW)) - cpu = "knm"; - /* Assume Knights Landing. */ - else if (has_feature (FEATURE_AVX512ER)) - cpu = "knl"; - /* Assume Skylake with AVX-512. */ - else if (has_feature (FEATURE_AVX512F)) - cpu = "skylake-avx512"; - /* Assume Alder Lake */ - else if (has_feature (FEATURE_SERIALIZE)) + /* Assume Ice Lake. */ + else if (has_feature (FEATURE_AVX512BITALG)) + cpu = "icelake-client"; + /* Assume Cannon Lake. */ + else if (has_feature (FEATURE_AVX512VBMI)) + cpu = "cannonlake"; + /* Assume Knights Mill. */ + else if (has_feature (FEATURE_AVX5124VNNIW)) + cpu = "knm"; + /* Assume Knights Landing. */ + else if (has_feature (FEATURE_AVX512ER)) + cpu = "knl"; + /* Assume Skylake with AVX-512. */ + else + cpu = "skylake-avx512"; + } + else if (has_feature (FEATURE_AVX)) + { + /* Assume Panther Lake. */ + if (has_feature (FEATURE_PREFETCHI)) + cpu = "pantherlake"; + /* Assume Clearwater Forest. */ + else if (has_feature (FEATURE_USER_MSR)) + cpu = "clearwaterforest"; + /* Assume Arrow Lake S. */ + else if (has_feature (FEATURE_SM3)) + cpu = "arrowlake-s"; + /* Assume Grand Ridge. */ + else if (has_feature (FEATURE_RAOINT)) + cpu = "grandridge"; + /* Assume Sierra Forest. */ + else if (has_feature (FEATURE_AVXVNNIINT8)) + cpu = "sierraforest"; + /* Assume Alder Lake. */ + else if (has_feature (FEATURE_SERIALIZE)) cpu = "alderlake"; - /* Assume Skylake. */ - else if (has_feature (FEATURE_CLFLUSHOPT)) - cpu = "skylake"; - /* Assume Broadwell. */ - else if (has_feature (FEATURE_ADX)) - cpu = "broadwell"; - else if (has_feature (FEATURE_AVX2)) - /* Assume Haswell. */ - cpu = "haswell"; - else - /* Assume Sandy Bridge. */ - cpu = "sandybridge"; + /* Assume Skylake. */ + else if (has_feature (FEATURE_CLFLUSHOPT)) + cpu = "skylake"; + /* Assume Broadwell. */ + else if (has_feature (FEATURE_ADX)) + cpu = "broadwell"; + /* Assume Haswell. */ + else if (has_feature (FEATURE_AVX2)) + cpu = "haswell"; + /* Assume Sandy Bridge. */ + else + cpu = "sandybridge"; } else if (has_feature (FEATURE_SSE4_2)) { diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc index 7ac95a9..ebe6a63 100644 --- a/gcc/config/i386/i386-c.cc +++ b/gcc/config/i386/i386-c.cc @@ -282,6 +282,10 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag, def_or_undef (parse_in, "__arrowlake_s"); def_or_undef (parse_in, "__arrowlake_s__"); break; + case PROCESSOR_PANTHERLAKE: + def_or_undef (parse_in, "__pantherlake"); + def_or_undef (parse_in, "__pantherlake__"); + break; /* use PROCESSOR_max to not set/unset the arch macro. */ case PROCESSOR_max: @@ -476,6 +480,9 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag, case PROCESSOR_ARROWLAKE_S: def_or_undef (parse_in, "__tune_arrowlake_s__"); break; + case PROCESSOR_PANTHERLAKE: + def_or_undef (parse_in, "__tune_pantherlake__"); + 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 952cfe5..3a03de5 100644 --- a/gcc/config/i386/i386-options.cc +++ b/gcc/config/i386/i386-options.cc @@ -142,8 +142,10 @@ along with GCC; see the file COPYING3. If not see #define m_ARROWLAKE (HOST_WIDE_INT_1U<