On 11/24/18 12:34 AM, Andi Kleen wrote:
> Uros Bizjak <ubiz...@gmail.com> writes:
> 
>> On Thu, Nov 22, 2018 at 12:48 PM Martin Liška <mli...@suse.cz> wrote:
>>>
>>> On 11/22/18 8:07 AM, Wei Xiao wrote:
>>>> Jakub,
>>>>
>>>> Thanks for the comments!
>>>> I have addressed them as attached.
>>>
>>> Hi.
>>>
>>> Can you please add the new march into:
>>>
>>> - gcc/doc/extend.texi:20530
>>> - gcc/testsuite/gcc.target/i386/builtin_target.c - test it here
>>
>> IIRC, family and model numbers are not yet known for latest processors.
> 
> For Cascade Lake the model number is the same as Skylake Server,
> it can only be distinguished based on the stepping (5 vs 4)

Very interesting, probably the first time a distinguish is based on stepping 
number? 

> 
> Like gcc -mcpu=native needs to learn about this.
> 
> -Andi
> 

I'm attaching patch that does that. Note that it's completely untested as I 
don't have
access to any of the new machines (Skylake server).

Martin
diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index e910038d11d..860a3105fa8 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -393,7 +393,7 @@ const char *host_detect_local_cpu (int argc, const char **argv)
   unsigned int max_level, ext_level;
 
   unsigned int vendor;
-  unsigned int model, family;
+  unsigned int stepping, model, family;
 
   unsigned int has_sse3, has_ssse3, has_cmpxchg16b;
   unsigned int has_cmpxchg8b, has_cmov, has_mmx, has_sse, has_sse2;
@@ -447,6 +447,7 @@ const char *host_detect_local_cpu (int argc, const char **argv)
 
   __cpuid (1, eax, ebx, ecx, edx);
 
+  stepping = eax & 0x0f;
   model = (eax >> 4) & 0x0f;
   family = (eax >> 8) & 0x0f;
   if (vendor == signature_INTEL_ebx
@@ -832,8 +833,16 @@ const char *host_detect_local_cpu (int argc, const char **argv)
 	  cpu = "skylake";
 	  break;
 	case 0x55:
-	  /* Skylake with AVX-512.  */
-	  cpu = "skylake-avx512";
+	  if (stepping == 4)
+	    {
+	      /* Skylake with AVX-512.  */
+	      cpu = "skylake-avx512";
+	    }
+	  else
+	    {
+	      /* Cascade Lake with AVX512.  */
+	      cpu = "cascadelake";
+	    }
 	  break;
 	case 0x57:
 	  /* Knights Landing.  */
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ef585333448..53e456a0a2e 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -32283,6 +32283,7 @@ fold_builtin_cpu (tree fndecl, tree *args)
     M_INTEL_COREI7_CANNONLAKE,
     M_INTEL_COREI7_ICELAKE_CLIENT,
     M_INTEL_COREI7_ICELAKE_SERVER,
+    M_INTEL_COREI7_CASCADELAKE,
     M_AMDFAM17H_ZNVER2
   };
 
@@ -32310,6 +32311,7 @@ fold_builtin_cpu (tree fndecl, tree *args)
       {"cannonlake", M_INTEL_COREI7_CANNONLAKE},
       {"icelake-client", M_INTEL_COREI7_ICELAKE_CLIENT},
       {"icelake-server", M_INTEL_COREI7_ICELAKE_SERVER},
+      {"cascadelake", M_INTEL_COREI7_CASCADELAKE},
       {"bonnell", M_INTEL_BONNELL},
       {"silvermont", M_INTEL_SILVERMONT},
       {"goldmont", M_INTEL_GOLDMONT},
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 91baec3c886..6fb3b687b01 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -20536,6 +20536,9 @@ Intel Core i7 Ice Lake Client CPU.
 @item icelake-server
 Intel Core i7 Ice Lake Server CPU.
 
+@item cascadelake
+Intel Core i7 Cascade Lake CPU.
+
 @item bonnell
 Intel Atom Bonnell CPU.
 
diff --git a/gcc/testsuite/gcc.target/i386/builtin_target.c b/gcc/testsuite/gcc.target/i386/builtin_target.c
index 1a7a9f3124f..c0901d2379e 100644
--- a/gcc/testsuite/gcc.target/i386/builtin_target.c
+++ b/gcc/testsuite/gcc.target/i386/builtin_target.c
@@ -12,7 +12,7 @@
 /* Check if the Intel CPU model and sub-model are identified.  */
 static void
 check_intel_cpu_model (unsigned int family, unsigned int model,
-		       unsigned int brand_id)
+		       unsigned int stepping, unsigned int brand_id)
 {
   /* Parse family and model only if brand ID is 0. */
   if (brand_id == 0)
@@ -108,9 +108,17 @@ check_intel_cpu_model (unsigned int family, unsigned int model,
 	      assert (__builtin_cpu_is ("skylake"));
 	      break;
 	    case 0x55:
-	      /* Skylake with AVX-512 support.  */
 	      assert (__builtin_cpu_is ("corei7"));
-	      assert (__builtin_cpu_is ("skylake-avx512"));
+	      if (stepping == 4)
+		{
+		  /* Skylake with AVX-512 support.  */
+		  assert (__builtin_cpu_is ("skylake-avx512"));
+		}
+	      else
+		{
+		  /* Cascade Lake with AVX-512 support.  */
+		  assert (__builtin_cpu_is ("cascadelake"));
+		}
 	      break;
 	    case 0x66:
 	      /* Cannon Lake.  */
@@ -290,7 +298,7 @@ check_detailed ()
 
   int max_level; 
   unsigned int vendor;
-  unsigned int model, family, brand_id;
+  unsigned int stepping, model, family, brand_id;
   unsigned int extended_model, extended_family;
 
   /* Assume cpuid insn present. Run in level 0 to get vendor id. */
@@ -306,6 +314,7 @@ check_detailed ()
   if (!__get_cpuid_output (1, &eax, &ebx, &ecx, &edx))
     return 0;
 
+  stepping = eax & 0x0f;
   model = (eax >> 4) & 0x0f;
   family = (eax >> 8) & 0x0f;
   brand_id = ebx & 0xff;
@@ -323,7 +332,7 @@ check_detailed ()
 	}
       else if (family == 0x06)
 	model += extended_model;
-      check_intel_cpu_model (family, model, brand_id);
+      check_intel_cpu_model (family, model, stepping, brand_id);
       check_features (ecx, edx, max_level);
     }
   else if (vendor == signature_AMD_ebx)
diff --git a/libgcc/config/i386/cpuinfo.c b/libgcc/config/i386/cpuinfo.c
index 09f4d6f154e..ea0dcac7468 100644
--- a/libgcc/config/i386/cpuinfo.c
+++ b/libgcc/config/i386/cpuinfo.c
@@ -119,7 +119,8 @@ get_amd_cpu (unsigned int family, unsigned int model)
 /* Get the specific type of Intel CPU.  */
 
 static void
-get_intel_cpu (unsigned int family, unsigned int model, unsigned int brand_id)
+get_intel_cpu (unsigned int family, unsigned int model,
+	       unsigned int stepping, unsigned int brand_id)
 {
   /* Parse family and model only if brand ID is 0. */
   if (brand_id == 0)
@@ -215,9 +216,17 @@ get_intel_cpu (unsigned int family, unsigned int model, unsigned int brand_id)
 	      __cpu_model.__cpu_subtype = INTEL_COREI7_SKYLAKE;
 	      break;
 	    case 0x55:
-	      /* Skylake with AVX-512 support.  */
 	      __cpu_model.__cpu_type = INTEL_COREI7;
-	      __cpu_model.__cpu_subtype = INTEL_COREI7_SKYLAKE_AVX512;
+	      if (stepping == 4)
+		{
+		  /* Skylake with AVX-512 support.  */
+		  __cpu_model.__cpu_subtype = INTEL_COREI7_SKYLAKE_AVX512;
+		}
+	      else
+		{
+		  /* Cascade Lake with AVX-512 support.  */
+		  __cpu_model.__cpu_subtype = INTEL_COREI7_CASCADELAKE;
+		}
 	      break;
 	    case 0x66:
 	      /* Cannon Lake.  */
@@ -419,7 +428,7 @@ __cpu_indicator_init (void)
 
   int max_level;
   unsigned int vendor;
-  unsigned int model, family, brand_id;
+  unsigned int stepping, model, family, brand_id;
   unsigned int extended_model, extended_family;
 
   /* This function needs to run just once.  */
@@ -448,6 +457,7 @@ __cpu_indicator_init (void)
       return -1;
     }
 
+  stepping = eax & 0x0f;
   model = (eax >> 4) & 0x0f;
   family = (eax >> 8) & 0x0f;
   brand_id = ebx & 0xff;
@@ -466,7 +476,7 @@ __cpu_indicator_init (void)
 	model += extended_model;
 
       /* Get CPU type.  */
-      get_intel_cpu (family, model, brand_id);
+      get_intel_cpu (family, model, stepping, brand_id);
       /* Find available features. */
       get_available_features (ecx, edx, max_level);
       __cpu_model.__cpu_vendor = VENDOR_INTEL;
diff --git a/libgcc/config/i386/cpuinfo.h b/libgcc/config/i386/cpuinfo.h
index ac9c3486028..ef58e5c5133 100644
--- a/libgcc/config/i386/cpuinfo.h
+++ b/libgcc/config/i386/cpuinfo.h
@@ -75,6 +75,7 @@ enum processor_subtypes
   INTEL_COREI7_CANNONLAKE,
   INTEL_COREI7_ICELAKE_CLIENT,
   INTEL_COREI7_ICELAKE_SERVER,
+  INTEL_COREI7_CASCADELAKE,
   AMDFAM17H_ZNVER2,
   CPU_SUBTYPE_MAX
 };

Reply via email to