i386: add reset_cpu_feature
authorMartin Liska <mliska@suse.cz>
Tue, 25 Oct 2022 04:28:44 +0000 (06:28 +0200)
committerMartin Liska <mliska@suse.cz>
Wed, 26 Oct 2022 10:48:53 +0000 (12:48 +0200)
gcc/ChangeLog:

* common/config/i386/cpuinfo.h (has_cpu_feature): Add comment.
(reset_cpu_feature): New.
(get_zhaoxin_cpu): Use reset_cpu_feature.

gcc/common/config/i386/cpuinfo.h

index d45451c..19ea713 100644 (file)
@@ -76,6 +76,8 @@ has_cpu_feature (struct __processor_model *cpu_model,
     }
 }
 
+/* Save FEATURE to either CPU_MODEL or CPU_FEATURES2.  */
+
 static inline void
 set_cpu_feature (struct __processor_model *cpu_model,
                 unsigned int *cpu_features2,
@@ -100,6 +102,32 @@ set_cpu_feature (struct __processor_model *cpu_model,
     }
 }
 
+/* Drop FEATURE from either CPU_MODEL or CPU_FEATURES2.  */
+
+static inline void
+reset_cpu_feature (struct __processor_model *cpu_model,
+                  unsigned int *cpu_features2,
+                  enum processor_features feature)
+{
+  unsigned index, offset;
+  unsigned f = feature;
+
+  if (f < 32)
+    {
+      /* The first 32 features.  */
+      cpu_model->__cpu_features[0] &= ~(1U << f);
+    }
+  else
+    {
+      /* The rest of features.  cpu_features2[i] contains features from
+        (32 + i * 32) to (31 + 32 + i * 32), inclusively.  */
+      f -= 32;
+      index = f / 32;
+      offset = f % 32;
+      cpu_features2[index] &= ~(1U << offset);
+    }
+}
+
 /* Get the specific type of AMD CPU and return AMD CPU name.  Return
    NULL for unknown AMD CPU.  */
 
@@ -565,11 +593,11 @@ get_zhaoxin_cpu (struct __processor_model *cpu_model,
       cpu_model->__cpu_type = ZHAOXIN_FAM7H;
       if (model == 0x3b)
        {
-       cpu = "lujiazui";
-       CHECK___builtin_cpu_is ("lujiazui");
-       cpu_model->__cpu_features[0] &= ~(1U <<(FEATURE_AVX & 31));
-       cpu_features2[0] &= ~(1U <<((FEATURE_F16C - 32) & 31));
-       cpu_model->__cpu_subtype = ZHAOXIN_FAM7H_LUJIAZUI;
+         cpu = "lujiazui";
+         CHECK___builtin_cpu_is ("lujiazui");
+         reset_cpu_feature (cpu_model, cpu_features2, FEATURE_AVX);
+         reset_cpu_feature (cpu_model, cpu_features2, FEATURE_F16C);
+         cpu_model->__cpu_subtype = ZHAOXIN_FAM7H_LUJIAZUI;
        }
       break;
     default: