| ... | ... | @@ -22,6 +22,77 @@ fn hwModelName(buf: [:0]u8) ?[:0]const u8 { |
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | const aarch64 = struct { |
| 25 | const models = .{ |
| 26 | .{ "Ampere AmpereOne AC03", &std.Target.aarch64.cpu.ampere1 }, |
| 27 | .{ "Ampere AmpereOne AC04", &std.Target.aarch64.cpu.ampere1a }, |
| 28 | .{ "Apple Icestorm Max", &std.Target.aarch64.cpu.apple_m1 }, |
| 29 | .{ "Apple Icestorm Pro", &std.Target.aarch64.cpu.apple_m1 }, |
| 30 | .{ "Apple Icestorm", &std.Target.aarch64.cpu.apple_m1 }, |
| 31 | .{ "Apple Firestorm Max", &std.Target.aarch64.cpu.apple_m1 }, |
| 32 | .{ "Apple Firestorm Pro", &std.Target.aarch64.cpu.apple_m1 }, |
| 33 | .{ "Apple Firestorm", &std.Target.aarch64.cpu.apple_m1 }, |
| 34 | .{ "Apple Blizzard Max", &std.Target.aarch64.cpu.apple_m2 }, |
| 35 | .{ "Apple Blizzard Pro", &std.Target.aarch64.cpu.apple_m2 }, |
| 36 | .{ "Apple Blizzard", &std.Target.aarch64.cpu.apple_m2 }, |
| 37 | .{ "Apple Avalanche Max", &std.Target.aarch64.cpu.apple_m2 }, |
| 38 | .{ "Apple Avalanche Pro", &std.Target.aarch64.cpu.apple_m2 }, |
| 39 | .{ "Apple Avalanche", &std.Target.aarch64.cpu.apple_m2 }, |
| 40 | .{ "Applied Micro X-Gene", &std.Target.aarch64.cpu.xgene1 }, |
| 41 | // TODO: Add these with LLVM 23. |
| 42 | // .{ "ARM C1-Nano", &std.Target.aarch64.cpu.c1_nano }, |
| 43 | // .{ "ARM C1-Pro", &std.Target.aarch64.cpu.c1_pro }, |
| 44 | // .{ "ARM C1-Ultra", &std.Target.aarch64.cpu.c1_ultra }, |
| 45 | // .{ "ARM C1-Premium", &std.Target.aarch64.cpu.c1_premium }, |
| 46 | .{ "ARM Cortex-A320", &std.Target.aarch64.cpu.cortex_a320 }, |
| 47 | .{ "ARM Cortex-A34", &std.Target.aarch64.cpu.cortex_a34 }, |
| 48 | .{ "ARM Cortex-A35", &std.Target.aarch64.cpu.cortex_a35 }, |
| 49 | .{ "ARM Cortex-A510", &std.Target.aarch64.cpu.cortex_a510 }, |
| 50 | .{ "ARM Cortex-A520AE", &std.Target.aarch64.cpu.cortex_a520ae }, |
| 51 | .{ "ARM Cortex-A520", &std.Target.aarch64.cpu.cortex_a520 }, |
| 52 | .{ "ARM Cortex-A53", &std.Target.aarch64.cpu.cortex_a53 }, |
| 53 | .{ "ARM Cortex-A55", &std.Target.aarch64.cpu.cortex_a55 }, |
| 54 | .{ "ARM Cortex-A57", &std.Target.aarch64.cpu.cortex_a57 }, |
| 55 | .{ "ARM Cortex-A65AE", &std.Target.aarch64.cpu.cortex_a65ae }, |
| 56 | .{ "ARM Cortex-A65", &std.Target.aarch64.cpu.cortex_a65 }, |
| 57 | .{ "ARM Cortex-A710", &std.Target.aarch64.cpu.cortex_a710 }, |
| 58 | .{ "ARM Cortex-A715", &std.Target.aarch64.cpu.cortex_a715 }, |
| 59 | .{ "ARM Cortex-A720AE", &std.Target.aarch64.cpu.cortex_a720ae }, |
| 60 | .{ "ARM Cortex-A720", &std.Target.aarch64.cpu.cortex_a720 }, |
| 61 | .{ "ARM Cortex-A725", &std.Target.aarch64.cpu.cortex_a725 }, |
| 62 | .{ "ARM Cortex-A72", &std.Target.aarch64.cpu.cortex_a72 }, |
| 63 | .{ "ARM Cortex-A73", &std.Target.aarch64.cpu.cortex_a73 }, |
| 64 | .{ "ARM Cortex-A75", &std.Target.aarch64.cpu.cortex_a75 }, |
| 65 | .{ "ARM Cortex-A76AE", &std.Target.aarch64.cpu.cortex_a76ae }, |
| 66 | .{ "ARM Cortex-A76", &std.Target.aarch64.cpu.cortex_a76 }, |
| 67 | .{ "ARM Cortex-A77", &std.Target.aarch64.cpu.cortex_a77 }, |
| 68 | .{ "ARM Cortex-A78AE", &std.Target.aarch64.cpu.cortex_a78ae }, |
| 69 | .{ "ARM Cortex-A78C", &std.Target.aarch64.cpu.cortex_a78c }, |
| 70 | .{ "ARM Cortex-A78", &std.Target.aarch64.cpu.cortex_a78 }, |
| 71 | .{ "ARM Cortex-X1C", &std.Target.aarch64.cpu.cortex_x1c }, |
| 72 | .{ "ARM Cortex-X1", &std.Target.aarch64.cpu.cortex_x1 }, |
| 73 | .{ "ARM Cortex-X2", &std.Target.aarch64.cpu.cortex_x2 }, |
| 74 | .{ "ARM Cortex-X3", &std.Target.aarch64.cpu.cortex_x3 }, |
| 75 | .{ "ARM Cortex-X4", &std.Target.aarch64.cpu.cortex_x4 }, |
| 76 | .{ "ARM Cortex-X925", &std.Target.aarch64.cpu.cortex_x925 }, |
| 77 | .{ "ARM Neoverse E1", &std.Target.aarch64.cpu.neoverse_e1 }, |
| 78 | .{ "ARM Neoverse N1", &std.Target.aarch64.cpu.neoverse_n1 }, |
| 79 | .{ "ARM Neoverse N2", &std.Target.aarch64.cpu.neoverse_n2 }, |
| 80 | .{ "ARM Neoverse N3", &std.Target.aarch64.cpu.neoverse_n3 }, |
| 81 | .{ "ARM Neoverse V1", &std.Target.aarch64.cpu.neoverse_v1 }, |
| 82 | .{ "ARM Neoverse V2", &std.Target.aarch64.cpu.neoverse_v2 }, |
| 83 | .{ "ARM Neoverse V3AE", &std.Target.aarch64.cpu.neoverse_v3ae }, |
| 84 | .{ "ARM Neoverse V3", &std.Target.aarch64.cpu.neoverse_v3 }, |
| 85 | .{ "Cavium ThunderX T81", &std.Target.aarch64.cpu.thunderxt81 }, |
| 86 | .{ "Cavium ThunderX T83", &std.Target.aarch64.cpu.thunderxt83 }, |
| 87 | .{ "Cavium ThunderX T88", &std.Target.aarch64.cpu.thunderxt88 }, |
| 88 | .{ "Cavium ThunderX2 T99", &std.Target.aarch64.cpu.thunderx2t99 }, |
| 89 | .{ "Microsoft Azure Cobalt 100", &std.Target.aarch64.cpu.cobalt_100 }, |
| 90 | .{ "NVIDIA Olympus", &std.Target.aarch64.cpu.olympus }, |
| 91 | .{ "Qualcomm Kryo 400 Gold", &std.Target.aarch64.cpu.cortex_a76 }, |
| 92 | .{ "Qualcomm Kryo 400 Silver", &std.Target.aarch64.cpu.cortex_a55 }, |
| 93 | .{ "Qualcomm Oryon", &std.Target.aarch64.cpu.oryon_1 }, |
| 94 | }; |
| 95 | |
| 25 | 96 | fn sysctlReg(key: c_int) ?u64 { |
| 26 | 97 | const mib: [2]c_int = [_]c_int{ |
| 27 | 98 | std.c.CTL.MACHDEP, |
| ... | ... | @@ -42,8 +113,18 @@ const aarch64 = struct { |
| 42 | 113 | } |
| 43 | 114 | |
| 44 | 115 | fn detectNativeCpuAndFeatures(arch: std.Target.Cpu.Arch) ?std.Target.Cpu { |
| 45 | | const registers = [12]u64{ |
| 46 | | 0, // MIDR_EL1 |
| 116 | const model: *const std.Target.Cpu.Model = blk: { |
| 117 | var buf: [64:0]u8 = undefined; |
| 118 | const name = hwModelName(&buf) orelse return null; |
| 119 | |
| 120 | inline for (models) |pair| { |
| 121 | if (std.mem.startsWith(u8, name, pair[0])) break :blk pair[1]; |
| 122 | } |
| 123 | |
| 124 | break :blk .generic(arch); |
| 125 | }; |
| 126 | |
| 127 | const registers = [11]u64{ |
| 47 | 128 | sysctlReg(std.c.CPU.AA64PFR0) orelse return null, |
| 48 | 129 | sysctlReg(std.c.CPU.AA64PFR1) orelse return null, |
| 49 | 130 | 0, // ID_AA64DFR0_EL1 |
| ... | ... | @@ -57,7 +138,7 @@ const aarch64 = struct { |
| 57 | 138 | sysctlReg(std.c.CPU.ID_AA64MMFR2) orelse return null, |
| 58 | 139 | }; |
| 59 | 140 | |
| 60 | | return @import("arm.zig").aarch64.detectNativeCpuAndFeatures(arch, registers); |
| 141 | return @import("arm.zig").aarch64.detectNativeFeatures(arch, model, registers); |
| 61 | 142 | } |
| 62 | 143 | }; |
| 63 | 144 | |