From 2b23f98d2c31ef1a8cbe67e8f37e3b2aa2387ed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 13 Nov 2025 22:28:50 +0100 Subject: [PATCH] std.Target: add CPU features and models for alpha --- lib/std/Target.zig | 4 +- lib/std/Target/alpha.zig | 101 ++++++++++++++++++++++++++++++++++ tools/update_cpu_features.zig | 77 ++++++++++++++++++++++++++ 3 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 lib/std/Target/alpha.zig diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 81f3cc030d..d3aca76e44 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -700,7 +700,7 @@ pub const Os = struct { }; pub const aarch64 = @import("Target/aarch64.zig"); -pub const alpha = @import("Target/generic.zig"); +pub const alpha = @import("Target/alpha.zig"); pub const amdgcn = @import("Target/amdgcn.zig"); pub const arc = @import("Target/arc.zig"); pub const arm = @import("Target/arm.zig"); @@ -1944,6 +1944,7 @@ pub const Cpu = struct { /// Clang compatibility is important, consider using `baseline` instead. pub fn generic(arch: Arch) *const Model { return switch (arch) { + .alpha => &alpha.cpu.ev4, .amdgcn => &amdgcn.cpu.gfx600, .avr => &avr.cpu.avr1, .kvx => &kvx.cpu.coolidge_v1, @@ -1976,6 +1977,7 @@ pub const Cpu = struct { /// `Os.Tag.freestanding`. pub fn baseline(arch: Arch, os: Os) *const Model { return switch (arch) { + .alpha => &alpha.cpu.ev6, .amdgcn => &amdgcn.cpu.gfx906, .arm => switch (os.tag) { .@"3ds" => &arm.cpu.mpcore, diff --git a/lib/std/Target/alpha.zig b/lib/std/Target/alpha.zig new file mode 100644 index 0000000000..5dd097e690 --- /dev/null +++ b/lib/std/Target/alpha.zig @@ -0,0 +1,101 @@ +//! This file is auto-generated by tools/update_cpu_features.zig. + +const std = @import("../std.zig"); +const CpuFeature = std.Target.Cpu.Feature; +const CpuModel = std.Target.Cpu.Model; + +pub const Feature = enum { + bwx, + cix, + fix, + max, +}; + +pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet; +pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas; +pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny; +pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll; + +pub const all_features = blk: { + const len = @typeInfo(Feature).@"enum".fields.len; + std.debug.assert(len <= CpuFeature.Set.needed_bit_count); + var result: [len]CpuFeature = undefined; + result[@intFromEnum(Feature.bwx)] = .{ + .llvm_name = null, + .description = "Enable byte/word extensions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.cix)] = .{ + .llvm_name = null, + .description = "Enable counting extensions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.fix)] = .{ + .llvm_name = null, + .description = "Enable floating point move and square root extensions", + .dependencies = featureSet(&[_]Feature{}), + }; + result[@intFromEnum(Feature.max)] = .{ + .llvm_name = null, + .description = "Enable motion video extensions", + .dependencies = featureSet(&[_]Feature{}), + }; + const ti = @typeInfo(Feature); + for (&result, 0..) |*elem, i| { + elem.index = i; + elem.name = ti.@"enum".fields[i].name; + } + break :blk result; +}; + +pub const cpu = struct { + pub const ev4: CpuModel = .{ + .name = "ev4", + .llvm_name = null, + .features = featureSet(&[_]Feature{}), + }; + pub const ev45: CpuModel = .{ + .name = "ev45", + .llvm_name = null, + .features = featureSet(&[_]Feature{}), + }; + pub const ev5: CpuModel = .{ + .name = "ev5", + .llvm_name = null, + .features = featureSet(&[_]Feature{}), + }; + pub const ev56: CpuModel = .{ + .name = "ev56", + .llvm_name = null, + .features = featureSet(&[_]Feature{ + .bwx, + }), + }; + pub const ev6: CpuModel = .{ + .name = "ev6", + .llvm_name = null, + .features = featureSet(&[_]Feature{ + .bwx, + .fix, + .max, + }), + }; + pub const ev67: CpuModel = .{ + .name = "ev67", + .llvm_name = null, + .features = featureSet(&[_]Feature{ + .bwx, + .cix, + .fix, + .max, + }), + }; + pub const pca56: CpuModel = .{ + .name = "pca56", + .llvm_name = null, + .features = featureSet(&[_]Feature{ + .bwx, + .max, + }), + }; +}; diff --git a/tools/update_cpu_features.zig b/tools/update_cpu_features.zig index cb248e7085..a2831444d8 100644 --- a/tools/update_cpu_features.zig +++ b/tools/update_cpu_features.zig @@ -393,6 +393,83 @@ const targets = [_]ArchTarget{ "apple-latest", }, }, + .{ + .zig_name = "alpha", + .llvm = null, + .extra_features = &.{ + .{ + .zig_name = "bwx", + .desc = "Enable byte/word extensions", + .deps = &.{}, + }, + .{ + .zig_name = "cix", + .desc = "Enable counting extensions", + .deps = &.{}, + }, + .{ + .zig_name = "fix", + .desc = "Enable floating point move and square root extensions", + .deps = &.{}, + }, + .{ + .zig_name = "max", + .desc = "Enable motion video extensions", + .deps = &.{}, + }, + }, + .extra_cpus = &.{ + .{ + .llvm_name = null, + .zig_name = "ev4", + .features = &.{}, + }, + .{ + .llvm_name = null, + .zig_name = "ev45", + .features = &.{}, + }, + .{ + .llvm_name = null, + .zig_name = "ev5", + .features = &.{}, + }, + .{ + .llvm_name = null, + .zig_name = "ev56", + .features = &.{ + "bwx", + }, + }, + .{ + .llvm_name = null, + .zig_name = "pca56", + .features = &.{ + "bwx", + "max", + }, + }, + .{ + .llvm_name = null, + .zig_name = "ev6", + .features = &.{ + "bwx", + "fix", + "max", + }, + }, + .{ + .llvm_name = null, + .zig_name = "ev67", + .features = &.{ + "bwx", + "cix", + "fix", + "max", + }, + }, + }, + }, .{ .zig_name = "amdgcn", .llvm = .{