Commit 3c21db6392

Andrew Kelley <andrew@ziglang.org>
2024-04-29 05:22:23
update detectAMDProcessor to detect znver4
1 parent 78002db
Changed files (1)
lib
std
zig
system
lib/std/zig/system/x86.zig
@@ -58,7 +58,7 @@ pub fn detectNativeCpuAndFeatures(arch: Target.Cpu.Arch, os: Target.Os, query: T
                 detectIntelProcessor(&cpu, family, model, brand_id);
             },
             0x68747541 => {
-                detectAMDProcessor(&cpu, family, model);
+                if (detectAMDProcessor(cpu.features, family, model)) |m| cpu.model = m;
             },
             else => {},
         }
@@ -224,97 +224,43 @@ fn detectIntelProcessor(cpu: *Target.Cpu, family: u32, model: u32, brand_id: u32
     }
 }
 
-fn detectAMDProcessor(cpu: *Target.Cpu, family: u32, model: u32) void {
-    // AMD's cpuid information is less than optimal for determining a CPU model.
-    // This is very unscientific, and not necessarily correct.
-    switch (family) {
-        4 => {
-            cpu.model = &Target.x86.cpu.i486;
-            return;
-        },
-        5 => {
-            cpu.model = &Target.x86.cpu.pentium;
-            switch (model) {
-                6, 7 => {
-                    cpu.model = &Target.x86.cpu.k6;
-                    return;
-                },
-                8 => {
-                    cpu.model = &Target.x86.cpu.k6_2;
-                    return;
-                },
-                9, 13 => {
-                    cpu.model = &Target.x86.cpu.k6_3;
-                    return;
-                },
-                10 => {
-                    cpu.model = &Target.x86.cpu.geode;
-                    return;
-                },
-                else => {},
-            }
-            return;
-        },
-        6 => {
-            if (Target.x86.featureSetHas(cpu.features, .sse)) {
-                cpu.model = &Target.x86.cpu.athlon_xp;
-                return;
-            }
-            cpu.model = &Target.x86.cpu.athlon;
-            return;
-        },
-        15 => {
-            if (Target.x86.featureSetHas(cpu.features, .sse3)) {
-                cpu.model = &Target.x86.cpu.k8_sse3;
-                return;
-            }
-            cpu.model = &Target.x86.cpu.k8;
-            return;
+fn detectAMDProcessor(features: Target.Cpu.Feature.Set, family: u32, model: u32) ?*const Target.Cpu.Model {
+    return switch (family) {
+        4 => &Target.x86.cpu.i486,
+        5 => switch (model) {
+            6, 7 => &Target.x86.cpu.k6,
+            8 => &Target.x86.cpu.k6_2,
+            9, 13 => &Target.x86.cpu.k6_3,
+            10 => &Target.x86.cpu.geode,
+            else => &Target.x86.cpu.pentium,
         },
-        16 => {
-            cpu.model = &Target.x86.cpu.amdfam10;
-            return;
+        6 => if (Target.x86.featureSetHas(features, .sse))
+            &Target.x86.cpu.athlon_xp
+        else
+            &Target.x86.cpu.athlon,
+        15 => if (Target.x86.featureSetHas(features, .sse3))
+            &Target.x86.cpu.k8_sse3
+        else
+            &Target.x86.cpu.k8,
+        16 => &Target.x86.cpu.amdfam10,
+        20 => &Target.x86.cpu.btver1,
+        21 => switch (model) {
+            0x60...0x7f => &Target.x86.cpu.bdver4,
+            0x30...0x3f => &Target.x86.cpu.bdver3,
+            0x02, 0x10...0x1f => &Target.x86.cpu.bdver2,
+            else => &Target.x86.cpu.bdver1,
         },
-        20 => {
-            cpu.model = &Target.x86.cpu.btver1;
-            return;
+        22 => &Target.x86.cpu.btver2,
+        23 => switch (model) {
+            0x30...0x3f, 0x71 => &Target.x86.cpu.znver2,
+            else => &Target.x86.cpu.znver1,
         },
-        21 => {
-            cpu.model = &Target.x86.cpu.bdver1;
-            if (model >= 0x60 and model <= 0x7f) {
-                cpu.model = &Target.x86.cpu.bdver4;
-                return;
-            }
-            if (model >= 0x30 and model <= 0x3f) {
-                cpu.model = &Target.x86.cpu.bdver3;
-                return;
-            }
-            if ((model >= 0x10 and model <= 0x1f) or model == 0x02) {
-                cpu.model = &Target.x86.cpu.bdver2;
-                return;
-            }
-            return;
+        25 => switch (model) {
+            0x10...0x1f, 0x60...0x6f, 0x70...0x77, 0x78...0x7f, 0xa0...0xaf => &Target.x86.cpu.znver4,
+            else => &Target.x86.cpu.znver3,
         },
-        22 => {
-            cpu.model = &Target.x86.cpu.btver2;
-            return;
-        },
-        23 => {
-            cpu.model = &Target.x86.cpu.znver1;
-            if ((model >= 0x30 and model <= 0x3f) or model == 0x71) {
-                cpu.model = &Target.x86.cpu.znver2;
-                return;
-            }
-            return;
-        },
-        25 => {
-            cpu.model = &Target.x86.cpu.znver3;
-            return;
-        },
-        else => {
-            return;
-        },
-    }
+        else => null,
+    };
 }
 
 fn detectNativeFeatures(cpu: *Target.Cpu, os_tag: Target.Os.Tag) void {