aboutsummaryrefslogtreecommitdiff
path: root/lib/std/Target
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/Target')
-rw-r--r--lib/std/Target/Query.zig777
-rw-r--r--lib/std/Target/aarch64.zig2656
-rw-r--r--lib/std/Target/amdgpu.zig2153
-rw-r--r--lib/std/Target/arc.zig39
-rw-r--r--lib/std/Target/arm.zig2604
-rw-r--r--lib/std/Target/avr.zig2607
-rw-r--r--lib/std/Target/bpf.zig73
-rw-r--r--lib/std/Target/csky.zig3214
-rw-r--r--lib/std/Target/hexagon.zig586
-rw-r--r--lib/std/Target/loongarch.zig146
-rw-r--r--lib/std/Target/m68k.zig228
-rw-r--r--lib/std/Target/mips.zig531
-rw-r--r--lib/std/Target/msp430.zig69
-rw-r--r--lib/std/Target/nvptx.zig439
-rw-r--r--lib/std/Target/powerpc.zig1192
-rw-r--r--lib/std/Target/riscv.zig1341
-rw-r--r--lib/std/Target/s390x.zig667
-rw-r--r--lib/std/Target/sparc.zig455
-rw-r--r--lib/std/Target/spirv.zig2091
-rw-r--r--lib/std/Target/ve.zig39
-rw-r--r--lib/std/Target/wasm.zig126
-rw-r--r--lib/std/Target/x86.zig4179
-rw-r--r--lib/std/Target/xtensa.zig39
23 files changed, 26251 insertions, 0 deletions
diff --git a/lib/std/Target/Query.zig b/lib/std/Target/Query.zig
new file mode 100644
index 0000000000..10130e03bb
--- /dev/null
+++ b/lib/std/Target/Query.zig
@@ -0,0 +1,777 @@
+//! Contains all the same data as `Target`, additionally introducing the
+//! concept of "the native target". The purpose of this abstraction is to
+//! provide meaningful and unsurprising defaults. This struct does reference
+//! any resources and it is copyable.
+
+/// `null` means native.
+cpu_arch: ?Target.Cpu.Arch = null,
+
+cpu_model: CpuModel = CpuModel.determined_by_cpu_arch,
+
+/// Sparse set of CPU features to add to the set from `cpu_model`.
+cpu_features_add: Target.Cpu.Feature.Set = Target.Cpu.Feature.Set.empty,
+
+/// Sparse set of CPU features to remove from the set from `cpu_model`.
+cpu_features_sub: Target.Cpu.Feature.Set = Target.Cpu.Feature.Set.empty,
+
+/// `null` means native.
+os_tag: ?Target.Os.Tag = null,
+
+/// `null` means the default version range for `os_tag`. If `os_tag` is `null` (native)
+/// then `null` for this field means native.
+os_version_min: ?OsVersion = null,
+
+/// When cross compiling, `null` means default (latest known OS version).
+/// When `os_tag` is native, `null` means equal to the native OS version.
+os_version_max: ?OsVersion = null,
+
+/// `null` means default when cross compiling, or native when os_tag is native.
+/// If `isGnuLibC()` is `false`, this must be `null` and is ignored.
+glibc_version: ?SemanticVersion = null,
+
+/// `null` means the native C ABI, if `os_tag` is native, otherwise it means the default C ABI.
+abi: ?Target.Abi = null,
+
+/// When `os_tag` is `null`, then `null` means native. Otherwise it means the standard path
+/// based on the `os_tag`.
+dynamic_linker: Target.DynamicLinker = Target.DynamicLinker.none,
+
+/// `null` means default for the cpu/arch/os combo.
+ofmt: ?Target.ObjectFormat = null,
+
+pub const CpuModel = union(enum) {
+ /// Always native
+ native,
+
+ /// Always baseline
+ baseline,
+
+ /// If CPU Architecture is native, then the CPU model will be native. Otherwise,
+ /// it will be baseline.
+ determined_by_cpu_arch,
+
+ explicit: *const Target.Cpu.Model,
+
+ pub fn eql(a: CpuModel, b: CpuModel) bool {
+ const Tag = @typeInfo(CpuModel).Union.tag_type.?;
+ const a_tag: Tag = a;
+ const b_tag: Tag = b;
+ if (a_tag != b_tag) return false;
+ return switch (a) {
+ .native, .baseline, .determined_by_cpu_arch => true,
+ .explicit => |a_model| a_model == b.explicit,
+ };
+ }
+};
+
+pub const OsVersion = union(enum) {
+ none: void,
+ semver: SemanticVersion,
+ windows: Target.Os.WindowsVersion,
+
+ pub fn eql(a: OsVersion, b: OsVersion) bool {
+ const Tag = @typeInfo(OsVersion).Union.tag_type.?;
+ const a_tag: Tag = a;
+ const b_tag: Tag = b;
+ if (a_tag != b_tag) return false;
+ return switch (a) {
+ .none => true,
+ .semver => |a_semver| a_semver.order(b.semver) == .eq,
+ .windows => |a_windows| a_windows == b.windows,
+ };
+ }
+
+ pub fn eqlOpt(a: ?OsVersion, b: ?OsVersion) bool {
+ if (a == null and b == null) return true;
+ if (a == null or b == null) return false;
+ return OsVersion.eql(a.?, b.?);
+ }
+};
+
+pub const SemanticVersion = std.SemanticVersion;
+
+pub fn fromTarget(target: Target) Query {
+ var result: Query = .{
+ .cpu_arch = target.cpu.arch,
+ .cpu_model = .{ .explicit = target.cpu.model },
+ .os_tag = target.os.tag,
+ .os_version_min = undefined,
+ .os_version_max = undefined,
+ .abi = target.abi,
+ .glibc_version = if (target.isGnuLibC())
+ target.os.version_range.linux.glibc
+ else
+ null,
+ };
+ result.updateOsVersionRange(target.os);
+
+ const all_features = target.cpu.arch.allFeaturesList();
+ var cpu_model_set = target.cpu.model.features;
+ cpu_model_set.populateDependencies(all_features);
+ {
+ // The "add" set is the full set with the CPU Model set removed.
+ const add_set = &result.cpu_features_add;
+ add_set.* = target.cpu.features;
+ add_set.removeFeatureSet(cpu_model_set);
+ }
+ {
+ // The "sub" set is the features that are on in CPU Model set and off in the full set.
+ const sub_set = &result.cpu_features_sub;
+ sub_set.* = cpu_model_set;
+ sub_set.removeFeatureSet(target.cpu.features);
+ }
+ return result;
+}
+
+fn updateOsVersionRange(self: *Query, os: Target.Os) void {
+ switch (os.tag) {
+ .freestanding,
+ .ananas,
+ .cloudabi,
+ .fuchsia,
+ .kfreebsd,
+ .lv2,
+ .solaris,
+ .illumos,
+ .zos,
+ .haiku,
+ .minix,
+ .rtems,
+ .nacl,
+ .aix,
+ .cuda,
+ .nvcl,
+ .amdhsa,
+ .ps4,
+ .ps5,
+ .elfiamcu,
+ .mesa3d,
+ .contiki,
+ .amdpal,
+ .hermit,
+ .hurd,
+ .wasi,
+ .emscripten,
+ .driverkit,
+ .shadermodel,
+ .liteos,
+ .uefi,
+ .opencl,
+ .glsl450,
+ .vulkan,
+ .plan9,
+ .other,
+ => {
+ self.os_version_min = .{ .none = {} };
+ self.os_version_max = .{ .none = {} };
+ },
+
+ .freebsd,
+ .macos,
+ .ios,
+ .tvos,
+ .watchos,
+ .netbsd,
+ .openbsd,
+ .dragonfly,
+ => {
+ self.os_version_min = .{ .semver = os.version_range.semver.min };
+ self.os_version_max = .{ .semver = os.version_range.semver.max };
+ },
+
+ .linux => {
+ self.os_version_min = .{ .semver = os.version_range.linux.range.min };
+ self.os_version_max = .{ .semver = os.version_range.linux.range.max };
+ },
+
+ .windows => {
+ self.os_version_min = .{ .windows = os.version_range.windows.min };
+ self.os_version_max = .{ .windows = os.version_range.windows.max };
+ },
+ }
+}
+
+pub const ParseOptions = struct {
+ /// This is sometimes called a "triple". It looks roughly like this:
+ /// riscv64-linux-musl
+ /// The fields are, respectively:
+ /// * CPU Architecture
+ /// * Operating System (and optional version range)
+ /// * C ABI (optional, with optional glibc version)
+ /// The string "native" can be used for CPU architecture as well as Operating System.
+ /// If the CPU Architecture is specified as "native", then the Operating System and C ABI may be omitted.
+ arch_os_abi: []const u8 = "native",
+
+ /// Looks like "name+a+b-c-d+e", where "name" is a CPU Model name, "a", "b", and "e"
+ /// are examples of CPU features to add to the set, and "c" and "d" are examples of CPU features
+ /// to remove from the set.
+ /// The following special strings are recognized for CPU Model name:
+ /// * "baseline" - The "default" set of CPU features for cross-compiling. A conservative set
+ /// of features that is expected to be supported on most available hardware.
+ /// * "native" - The native CPU model is to be detected when compiling.
+ /// If this field is not provided (`null`), then the value will depend on the
+ /// parsed CPU Architecture. If native, then this will be "native". Otherwise, it will be "baseline".
+ cpu_features: ?[]const u8 = null,
+
+ /// Absolute path to dynamic linker, to override the default, which is either a natively
+ /// detected path, or a standard path.
+ dynamic_linker: ?[]const u8 = null,
+
+ object_format: ?[]const u8 = null,
+
+ /// If this is provided, the function will populate some information about parsing failures,
+ /// so that user-friendly error messages can be delivered.
+ diagnostics: ?*Diagnostics = null,
+
+ pub const Diagnostics = struct {
+ /// If the architecture was determined, this will be populated.
+ arch: ?Target.Cpu.Arch = null,
+
+ /// If the OS name was determined, this will be populated.
+ os_name: ?[]const u8 = null,
+
+ /// If the OS tag was determined, this will be populated.
+ os_tag: ?Target.Os.Tag = null,
+
+ /// If the ABI was determined, this will be populated.
+ abi: ?Target.Abi = null,
+
+ /// If the CPU name was determined, this will be populated.
+ cpu_name: ?[]const u8 = null,
+
+ /// If error.UnknownCpuFeature is returned, this will be populated.
+ unknown_feature_name: ?[]const u8 = null,
+ };
+};
+
+pub fn parse(args: ParseOptions) !Query {
+ var dummy_diags: ParseOptions.Diagnostics = undefined;
+ const diags = args.diagnostics orelse &dummy_diags;
+
+ var result: Query = .{
+ .dynamic_linker = Target.DynamicLinker.init(args.dynamic_linker),
+ };
+
+ var it = mem.splitScalar(u8, args.arch_os_abi, '-');
+ const arch_name = it.first();
+ const arch_is_native = mem.eql(u8, arch_name, "native");
+ if (!arch_is_native) {
+ result.cpu_arch = std.meta.stringToEnum(Target.Cpu.Arch, arch_name) orelse
+ return error.UnknownArchitecture;
+ }
+ const arch = result.cpu_arch orelse builtin.cpu.arch;
+ diags.arch = arch;
+
+ if (it.next()) |os_text| {
+ try parseOs(&result, diags, os_text);
+ } else if (!arch_is_native) {
+ return error.MissingOperatingSystem;
+ }
+
+ const opt_abi_text = it.next();
+ if (opt_abi_text) |abi_text| {
+ var abi_it = mem.splitScalar(u8, abi_text, '.');
+ const abi = std.meta.stringToEnum(Target.Abi, abi_it.first()) orelse
+ return error.UnknownApplicationBinaryInterface;
+ result.abi = abi;
+ diags.abi = abi;
+
+ const abi_ver_text = abi_it.rest();
+ if (abi_it.next() != null) {
+ if (Target.isGnuLibC_os_tag_abi(result.os_tag orelse builtin.os.tag, abi)) {
+ result.glibc_version = parseVersion(abi_ver_text) catch |err| switch (err) {
+ error.Overflow => return error.InvalidAbiVersion,
+ error.InvalidVersion => return error.InvalidAbiVersion,
+ };
+ } else {
+ return error.InvalidAbiVersion;
+ }
+ }
+ }
+
+ if (it.next() != null) return error.UnexpectedExtraField;
+
+ if (args.cpu_features) |cpu_features| {
+ const all_features = arch.allFeaturesList();
+ var index: usize = 0;
+ while (index < cpu_features.len and
+ cpu_features[index] != '+' and
+ cpu_features[index] != '-')
+ {
+ index += 1;
+ }
+ const cpu_name = cpu_features[0..index];
+ diags.cpu_name = cpu_name;
+
+ const add_set = &result.cpu_features_add;
+ const sub_set = &result.cpu_features_sub;
+ if (mem.eql(u8, cpu_name, "native")) {
+ result.cpu_model = .native;
+ } else if (mem.eql(u8, cpu_name, "baseline")) {
+ result.cpu_model = .baseline;
+ } else {
+ result.cpu_model = .{ .explicit = try arch.parseCpuModel(cpu_name) };
+ }
+
+ while (index < cpu_features.len) {
+ const op = cpu_features[index];
+ const set = switch (op) {
+ '+' => add_set,
+ '-' => sub_set,
+ else => unreachable,
+ };
+ index += 1;
+ const start = index;
+ while (index < cpu_features.len and
+ cpu_features[index] != '+' and
+ cpu_features[index] != '-')
+ {
+ index += 1;
+ }
+ const feature_name = cpu_features[start..index];
+ for (all_features, 0..) |feature, feat_index_usize| {
+ const feat_index = @as(Target.Cpu.Feature.Set.Index, @intCast(feat_index_usize));
+ if (mem.eql(u8, feature_name, feature.name)) {
+ set.addFeature(feat_index);
+ break;
+ }
+ } else {
+ diags.unknown_feature_name = feature_name;
+ return error.UnknownCpuFeature;
+ }
+ }
+ }
+
+ if (args.object_format) |ofmt_name| {
+ result.ofmt = std.meta.stringToEnum(Target.ObjectFormat, ofmt_name) orelse
+ return error.UnknownObjectFormat;
+ }
+
+ return result;
+}
+
+/// Similar to `parse` except instead of fully parsing, it only determines the CPU
+/// architecture and returns it if it can be determined, and returns `null` otherwise.
+/// This is intended to be used if the API user of Query needs to learn the
+/// target CPU architecture in order to fully populate `ParseOptions`.
+pub fn parseCpuArch(args: ParseOptions) ?Target.Cpu.Arch {
+ var it = mem.splitScalar(u8, args.arch_os_abi, '-');
+ const arch_name = it.first();
+ const arch_is_native = mem.eql(u8, arch_name, "native");
+ if (arch_is_native) {
+ return builtin.cpu.arch;
+ } else {
+ return std.meta.stringToEnum(Target.Cpu.Arch, arch_name);
+ }
+}
+
+/// Similar to `SemanticVersion.parse`, but with following changes:
+/// * Leading zeroes are allowed.
+/// * Supports only 2 or 3 version components (major, minor, [patch]). If 3-rd component is omitted, it will be 0.
+pub fn parseVersion(ver: []const u8) error{ InvalidVersion, Overflow }!SemanticVersion {
+ const parseVersionComponentFn = (struct {
+ fn parseVersionComponentInner(component: []const u8) error{ InvalidVersion, Overflow }!usize {
+ return std.fmt.parseUnsigned(usize, component, 10) catch |err| switch (err) {
+ error.InvalidCharacter => return error.InvalidVersion,
+ error.Overflow => return error.Overflow,
+ };
+ }
+ }).parseVersionComponentInner;
+ var version_components = mem.splitScalar(u8, ver, '.');
+ const major = version_components.first();
+ const minor = version_components.next() orelse return error.InvalidVersion;
+ const patch = version_components.next() orelse "0";
+ if (version_components.next() != null) return error.InvalidVersion;
+ return .{
+ .major = try parseVersionComponentFn(major),
+ .minor = try parseVersionComponentFn(minor),
+ .patch = try parseVersionComponentFn(patch),
+ };
+}
+
+test parseVersion {
+ try std.testing.expectError(error.InvalidVersion, parseVersion("1"));
+ try std.testing.expectEqual(SemanticVersion{ .major = 1, .minor = 2, .patch = 0 }, try parseVersion("1.2"));
+ try std.testing.expectEqual(SemanticVersion{ .major = 1, .minor = 2, .patch = 3 }, try parseVersion("1.2.3"));
+ try std.testing.expectError(error.InvalidVersion, parseVersion("1.2.3.4"));
+}
+
+pub fn isNativeCpu(self: Query) bool {
+ return self.cpu_arch == null and
+ (self.cpu_model == .native or self.cpu_model == .determined_by_cpu_arch) and
+ self.cpu_features_sub.isEmpty() and self.cpu_features_add.isEmpty();
+}
+
+pub fn isNativeOs(self: Query) bool {
+ return self.os_tag == null and self.os_version_min == null and self.os_version_max == null and
+ self.dynamic_linker.get() == null and self.glibc_version == null;
+}
+
+pub fn isNativeAbi(self: Query) bool {
+ return self.os_tag == null and self.abi == null;
+}
+
+pub fn isNative(self: Query) bool {
+ return self.isNativeCpu() and self.isNativeOs() and self.isNativeAbi();
+}
+
+/// Formats a version with the patch component omitted if it is zero,
+/// unlike SemanticVersion.format which formats all its version components regardless.
+fn formatVersion(version: SemanticVersion, writer: anytype) !void {
+ if (version.patch == 0) {
+ try writer.print("{d}.{d}", .{ version.major, version.minor });
+ } else {
+ try writer.print("{d}.{d}.{d}", .{ version.major, version.minor, version.patch });
+ }
+}
+
+pub fn zigTriple(self: Query, allocator: Allocator) Allocator.Error![]u8 {
+ if (self.isNative()) {
+ return allocator.dupe(u8, "native");
+ }
+
+ const arch_name = if (self.cpu_arch) |arch| @tagName(arch) else "native";
+ const os_name = if (self.os_tag) |os_tag| @tagName(os_tag) else "native";
+
+ var result = std.ArrayList(u8).init(allocator);
+ defer result.deinit();
+
+ try result.writer().print("{s}-{s}", .{ arch_name, os_name });
+
+ // The zig target syntax does not allow specifying a max os version with no min, so
+ // if either are present, we need the min.
+ if (self.os_version_min) |min| {
+ switch (min) {
+ .none => {},
+ .semver => |v| {
+ try result.writer().writeAll(".");
+ try formatVersion(v, result.writer());
+ },
+ .windows => |v| {
+ try result.writer().print("{s}", .{v});
+ },
+ }
+ }
+ if (self.os_version_max) |max| {
+ switch (max) {
+ .none => {},
+ .semver => |v| {
+ try result.writer().writeAll("...");
+ try formatVersion(v, result.writer());
+ },
+ .windows => |v| {
+ // This is counting on a custom format() function defined on `WindowsVersion`
+ // to add a prefix '.' and make there be a total of three dots.
+ try result.writer().print("..{s}", .{v});
+ },
+ }
+ }
+
+ if (self.glibc_version) |v| {
+ const name = @tagName(self.abi orelse builtin.target.abi);
+ try result.ensureUnusedCapacity(name.len + 2);
+ result.appendAssumeCapacity('-');
+ result.appendSliceAssumeCapacity(name);
+ result.appendAssumeCapacity('.');
+ try formatVersion(v, result.writer());
+ } else if (self.abi) |abi| {
+ const name = @tagName(abi);
+ try result.ensureUnusedCapacity(name.len + 1);
+ result.appendAssumeCapacity('-');
+ result.appendSliceAssumeCapacity(name);
+ }
+
+ return result.toOwnedSlice();
+}
+
+/// Renders the query into a textual representation that can be parsed via the
+/// `-mcpu` flag passed to the Zig compiler.
+/// Appends the result to `buffer`.
+pub fn serializeCpu(q: Query, buffer: *std.ArrayList(u8)) Allocator.Error!void {
+ try buffer.ensureUnusedCapacity(8);
+ switch (q.cpu_model) {
+ .native => {
+ buffer.appendSliceAssumeCapacity("native");
+ },
+ .baseline => {
+ buffer.appendSliceAssumeCapacity("baseline");
+ },
+ .determined_by_cpu_arch => {
+ if (q.cpu_arch == null) {
+ buffer.appendSliceAssumeCapacity("native");
+ } else {
+ buffer.appendSliceAssumeCapacity("baseline");
+ }
+ },
+ .explicit => |model| {
+ try buffer.appendSlice(model.name);
+ },
+ }
+
+ if (q.cpu_features_add.isEmpty() and q.cpu_features_sub.isEmpty()) {
+ // The CPU name alone is sufficient.
+ return;
+ }
+
+ const cpu_arch = q.cpu_arch orelse builtin.cpu.arch;
+ const all_features = cpu_arch.allFeaturesList();
+
+ for (all_features, 0..) |feature, i_usize| {
+ const i: Target.Cpu.Feature.Set.Index = @intCast(i_usize);
+ try buffer.ensureUnusedCapacity(feature.name.len + 1);
+ if (q.cpu_features_sub.isEnabled(i)) {
+ buffer.appendAssumeCapacity('-');
+ buffer.appendSliceAssumeCapacity(feature.name);
+ } else if (q.cpu_features_add.isEnabled(i)) {
+ buffer.appendAssumeCapacity('+');
+ buffer.appendSliceAssumeCapacity(feature.name);
+ }
+ }
+}
+
+pub fn serializeCpuAlloc(q: Query, ally: Allocator) Allocator.Error![]u8 {
+ var buffer = std.ArrayList(u8).init(ally);
+ try serializeCpu(q, &buffer);
+ return buffer.toOwnedSlice();
+}
+
+pub fn allocDescription(self: Query, allocator: Allocator) ![]u8 {
+ // TODO is there anything else worthy of the description that is not
+ // already captured in the triple?
+ return self.zigTriple(allocator);
+}
+
+pub fn setGnuLibCVersion(self: *Query, major: u32, minor: u32, patch: u32) void {
+ self.glibc_version = SemanticVersion{ .major = major, .minor = minor, .patch = patch };
+}
+
+fn parseOs(result: *Query, diags: *ParseOptions.Diagnostics, text: []const u8) !void {
+ var it = mem.splitScalar(u8, text, '.');
+ const os_name = it.first();
+ diags.os_name = os_name;
+ const os_is_native = mem.eql(u8, os_name, "native");
+ if (!os_is_native) {
+ result.os_tag = std.meta.stringToEnum(Target.Os.Tag, os_name) orelse
+ return error.UnknownOperatingSystem;
+ }
+ const tag = result.os_tag orelse builtin.os.tag;
+ diags.os_tag = tag;
+
+ const version_text = it.rest();
+ if (it.next() == null) return;
+
+ switch (tag) {
+ .freestanding,
+ .ananas,
+ .cloudabi,
+ .fuchsia,
+ .kfreebsd,
+ .lv2,
+ .solaris,
+ .illumos,
+ .zos,
+ .haiku,
+ .minix,
+ .rtems,
+ .nacl,
+ .aix,
+ .cuda,
+ .nvcl,
+ .amdhsa,
+ .ps4,
+ .ps5,
+ .elfiamcu,
+ .mesa3d,
+ .contiki,
+ .amdpal,
+ .hermit,
+ .hurd,
+ .wasi,
+ .emscripten,
+ .uefi,
+ .opencl,
+ .glsl450,
+ .vulkan,
+ .plan9,
+ .driverkit,
+ .shadermodel,
+ .liteos,
+ .other,
+ => return error.InvalidOperatingSystemVersion,
+
+ .freebsd,
+ .macos,
+ .ios,
+ .tvos,
+ .watchos,
+ .netbsd,
+ .openbsd,
+ .linux,
+ .dragonfly,
+ => {
+ var range_it = mem.splitSequence(u8, version_text, "...");
+
+ const min_text = range_it.next().?;
+ const min_ver = parseVersion(min_text) catch |err| switch (err) {
+ error.Overflow => return error.InvalidOperatingSystemVersion,
+ error.InvalidVersion => return error.InvalidOperatingSystemVersion,
+ };
+ result.os_version_min = .{ .semver = min_ver };
+
+ const max_text = range_it.next() orelse return;
+ const max_ver = parseVersion(max_text) catch |err| switch (err) {
+ error.Overflow => return error.InvalidOperatingSystemVersion,
+ error.InvalidVersion => return error.InvalidOperatingSystemVersion,
+ };
+ result.os_version_max = .{ .semver = max_ver };
+ },
+
+ .windows => {
+ var range_it = mem.splitSequence(u8, version_text, "...");
+
+ const min_text = range_it.first();
+ const min_ver = std.meta.stringToEnum(Target.Os.WindowsVersion, min_text) orelse
+ return error.InvalidOperatingSystemVersion;
+ result.os_version_min = .{ .windows = min_ver };
+
+ const max_text = range_it.next() orelse return;
+ const max_ver = std.meta.stringToEnum(Target.Os.WindowsVersion, max_text) orelse
+ return error.InvalidOperatingSystemVersion;
+ result.os_version_max = .{ .windows = max_ver };
+ },
+ }
+}
+
+pub fn eql(a: Query, b: Query) bool {
+ if (a.cpu_arch != b.cpu_arch) return false;
+ if (!a.cpu_model.eql(b.cpu_model)) return false;
+ if (!a.cpu_features_add.eql(b.cpu_features_add)) return false;
+ if (!a.cpu_features_sub.eql(b.cpu_features_sub)) return false;
+ if (a.os_tag != b.os_tag) return false;
+ if (!OsVersion.eqlOpt(a.os_version_min, b.os_version_min)) return false;
+ if (!OsVersion.eqlOpt(a.os_version_max, b.os_version_max)) return false;
+ if (!versionEqualOpt(a.glibc_version, b.glibc_version)) return false;
+ if (a.abi != b.abi) return false;
+ if (!a.dynamic_linker.eql(b.dynamic_linker)) return false;
+ if (a.ofmt != b.ofmt) return false;
+
+ return true;
+}
+
+fn versionEqualOpt(a: ?SemanticVersion, b: ?SemanticVersion) bool {
+ if (a == null and b == null) return true;
+ if (a == null or b == null) return false;
+ return SemanticVersion.order(a.?, b.?) == .eq;
+}
+
+const Query = @This();
+const std = @import("../std.zig");
+const builtin = @import("builtin");
+const assert = std.debug.assert;
+const Target = std.Target;
+const mem = std.mem;
+const Allocator = std.mem.Allocator;
+
+test parse {
+ if (builtin.target.isGnuLibC()) {
+ var query = try Query.parse(.{});
+ query.setGnuLibCVersion(2, 1, 1);
+
+ const text = try query.zigTriple(std.testing.allocator);
+ defer std.testing.allocator.free(text);
+
+ var buf: [256]u8 = undefined;
+ const triple = std.fmt.bufPrint(
+ buf[0..],
+ "native-native-{s}.2.1.1",
+ .{@tagName(builtin.target.abi)},
+ ) catch unreachable;
+
+ try std.testing.expectEqualSlices(u8, triple, text);
+ }
+ {
+ const query = try Query.parse(.{
+ .arch_os_abi = "aarch64-linux",
+ .cpu_features = "native",
+ });
+
+ try std.testing.expect(query.cpu_arch.? == .aarch64);
+ try std.testing.expect(query.cpu_model == .native);
+ }
+ {
+ const query = try Query.parse(.{ .arch_os_abi = "native" });
+
+ try std.testing.expect(query.cpu_arch == null);
+ try std.testing.expect(query.isNative());
+
+ const text = try query.zigTriple(std.testing.allocator);
+ defer std.testing.allocator.free(text);
+ try std.testing.expectEqualSlices(u8, "native", text);
+ }
+ {
+ const query = try Query.parse(.{
+ .arch_os_abi = "x86_64-linux-gnu",
+ .cpu_features = "x86_64-sse-sse2-avx-cx8",
+ });
+ const target = try std.zig.system.resolveTargetQuery(query);
+
+ try std.testing.expect(target.os.tag == .linux);
+ try std.testing.expect(target.abi == .gnu);
+ try std.testing.expect(target.cpu.arch == .x86_64);
+ try std.testing.expect(!Target.x86.featureSetHas(target.cpu.features, .sse));
+ try std.testing.expect(!Target.x86.featureSetHas(target.cpu.features, .avx));
+ try std.testing.expect(!Target.x86.featureSetHas(target.cpu.features, .cx8));
+ try std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .cmov));
+ try std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .fxsr));
+
+ try std.testing.expect(Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx, .cmov }));
+ try std.testing.expect(!Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx }));
+ try std.testing.expect(Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87 }));
+ try std.testing.expect(!Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87, .sse }));
+
+ const text = try query.zigTriple(std.testing.allocator);
+ defer std.testing.allocator.free(text);
+ try std.testing.expectEqualSlices(u8, "x86_64-linux-gnu", text);
+ }
+ {
+ const query = try Query.parse(.{
+ .arch_os_abi = "arm-linux-musleabihf",
+ .cpu_features = "generic+v8a",
+ });
+ const target = try std.zig.system.resolveTargetQuery(query);
+
+ try std.testing.expect(target.os.tag == .linux);
+ try std.testing.expect(target.abi == .musleabihf);
+ try std.testing.expect(target.cpu.arch == .arm);
+ try std.testing.expect(target.cpu.model == &Target.arm.cpu.generic);
+ try std.testing.expect(Target.arm.featureSetHas(target.cpu.features, .v8a));
+
+ const text = try query.zigTriple(std.testing.allocator);
+ defer std.testing.allocator.free(text);
+ try std.testing.expectEqualSlices(u8, "arm-linux-musleabihf", text);
+ }
+ {
+ const query = try Query.parse(.{
+ .arch_os_abi = "aarch64-linux.3.10...4.4.1-gnu.2.27",
+ .cpu_features = "generic+v8a",
+ });
+ const target = try std.zig.system.resolveTargetQuery(query);
+
+ try std.testing.expect(target.cpu.arch == .aarch64);
+ try std.testing.expect(target.os.tag == .linux);
+ try std.testing.expect(target.os.version_range.linux.range.min.major == 3);
+ try std.testing.expect(target.os.version_range.linux.range.min.minor == 10);
+ try std.testing.expect(target.os.version_range.linux.range.min.patch == 0);
+ try std.testing.expect(target.os.version_range.linux.range.max.major == 4);
+ try std.testing.expect(target.os.version_range.linux.range.max.minor == 4);
+ try std.testing.expect(target.os.version_range.linux.range.max.patch == 1);
+ try std.testing.expect(target.os.version_range.linux.glibc.major == 2);
+ try std.testing.expect(target.os.version_range.linux.glibc.minor == 27);
+ try std.testing.expect(target.os.version_range.linux.glibc.patch == 0);
+ try std.testing.expect(target.abi == .gnu);
+
+ const text = try query.zigTriple(std.testing.allocator);
+ defer std.testing.allocator.free(text);
+ try std.testing.expectEqualSlices(u8, "aarch64-linux.3.10...4.4.1-gnu.2.27", text);
+ }
+}
diff --git a/lib/std/Target/aarch64.zig b/lib/std/Target/aarch64.zig
new file mode 100644
index 0000000000..011cb20aef
--- /dev/null
+++ b/lib/std/Target/aarch64.zig
@@ -0,0 +1,2656 @@
+//! 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 {
+ a510,
+ a65,
+ a710,
+ a76,
+ a78,
+ a78c,
+ aes,
+ aggressive_fma,
+ alternate_sextload_cvt_f32_pattern,
+ altnzcv,
+ am,
+ amvs,
+ arith_bcc_fusion,
+ arith_cbz_fusion,
+ ascend_store_address,
+ b16b16,
+ balance_fp_ops,
+ bf16,
+ brbe,
+ bti,
+ call_saved_x10,
+ call_saved_x11,
+ call_saved_x12,
+ call_saved_x13,
+ call_saved_x14,
+ call_saved_x15,
+ call_saved_x18,
+ call_saved_x8,
+ call_saved_x9,
+ ccdp,
+ ccidx,
+ ccpp,
+ chk,
+ clrbhb,
+ cmp_bcc_fusion,
+ complxnum,
+ contextidr_el2,
+ cortex_r82,
+ crc,
+ crypto,
+ cssc,
+ custom_cheap_as_move,
+ d128,
+ disable_latency_sched_heuristic,
+ dit,
+ dotprod,
+ ecv,
+ el2vmsa,
+ el3,
+ enable_select_opt,
+ ete,
+ exynos_cheap_as_move,
+ f32mm,
+ f64mm,
+ fgt,
+ fix_cortex_a53_835769,
+ flagm,
+ fmv,
+ force_32bit_jump_tables,
+ fp16fml,
+ fp_armv8,
+ fptoint,
+ fullfp16,
+ fuse_address,
+ fuse_addsub_2reg_const1,
+ fuse_adrp_add,
+ fuse_aes,
+ fuse_arith_logic,
+ fuse_crypto_eor,
+ fuse_csel,
+ fuse_literals,
+ gcs,
+ harden_sls_blr,
+ harden_sls_nocomdat,
+ harden_sls_retbr,
+ hbc,
+ hcx,
+ i8mm,
+ ite,
+ jsconv,
+ lor,
+ ls64,
+ lse,
+ lse128,
+ lse2,
+ lsl_fast,
+ mec,
+ mops,
+ mpam,
+ mte,
+ neon,
+ nmi,
+ no_bti_at_return_twice,
+ no_neg_immediates,
+ no_sve_fp_ld1r,
+ no_zcz_fp,
+ nv,
+ outline_atomics,
+ pan,
+ pan_rwv,
+ pauth,
+ perfmon,
+ predictable_select_expensive,
+ predres,
+ prfm_slc_target,
+ rand,
+ ras,
+ rasv2,
+ rcpc,
+ rcpc3,
+ rcpc_immo,
+ rdm,
+ reserve_x1,
+ reserve_x10,
+ reserve_x11,
+ reserve_x12,
+ reserve_x13,
+ reserve_x14,
+ reserve_x15,
+ reserve_x18,
+ reserve_x2,
+ reserve_x20,
+ reserve_x21,
+ reserve_x22,
+ reserve_x23,
+ reserve_x24,
+ reserve_x25,
+ reserve_x26,
+ reserve_x27,
+ reserve_x28,
+ reserve_x3,
+ reserve_x30,
+ reserve_x4,
+ reserve_x5,
+ reserve_x6,
+ reserve_x7,
+ reserve_x9,
+ rme,
+ sb,
+ sel2,
+ sha2,
+ sha3,
+ slow_misaligned_128store,
+ slow_paired_128,
+ slow_strqro_store,
+ sm4,
+ sme,
+ sme2,
+ sme2p1,
+ sme_f16f16,
+ sme_f64f64,
+ sme_i16i64,
+ spe,
+ spe_eef,
+ specres2,
+ specrestrict,
+ ssbs,
+ strict_align,
+ sve,
+ sve2,
+ sve2_aes,
+ sve2_bitperm,
+ sve2_sha3,
+ sve2_sm4,
+ sve2p1,
+ tagged_globals,
+ the,
+ tlb_rmi,
+ tme,
+ tpidr_el1,
+ tpidr_el2,
+ tpidr_el3,
+ tpidrro_el0,
+ tracev8_4,
+ trbe,
+ uaops,
+ use_experimental_zeroing_pseudos,
+ use_postra_scheduler,
+ use_reciprocal_square_root,
+ use_scalar_inc_vl,
+ v8_1a,
+ v8_2a,
+ v8_3a,
+ v8_4a,
+ v8_5a,
+ v8_6a,
+ v8_7a,
+ v8_8a,
+ v8_9a,
+ v8a,
+ v8r,
+ v9_1a,
+ v9_2a,
+ v9_3a,
+ v9_4a,
+ v9a,
+ vh,
+ wfxt,
+ xs,
+ zcm,
+ zcz,
+ zcz_fp_workaround,
+ zcz_gp,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(Feature).featureSetHasAll;
+
+pub const all_features = blk: {
+ @setEvalBranchQuota(2000);
+ const len = @typeInfo(Feature).Enum.fields.len;
+ std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
+ var result: [len]CpuFeature = undefined;
+ result[@intFromEnum(Feature.a510)] = .{
+ .llvm_name = "a510",
+ .description = "Cortex-A510 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .fuse_adrp_add,
+ .fuse_aes,
+ .use_postra_scheduler,
+ }),
+ };
+ result[@intFromEnum(Feature.a65)] = .{
+ .llvm_name = "a65",
+ .description = "Cortex-A65 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .enable_select_opt,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_literals,
+ .predictable_select_expensive,
+ }),
+ };
+ result[@intFromEnum(Feature.a710)] = .{
+ .llvm_name = "a710",
+ .description = "Cortex-A710 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ }),
+ };
+ result[@intFromEnum(Feature.a76)] = .{
+ .llvm_name = "a76",
+ .description = "Cortex-A76 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .predictable_select_expensive,
+ }),
+ };
+ result[@intFromEnum(Feature.a78)] = .{
+ .llvm_name = "a78",
+ .description = "Cortex-A78 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ }),
+ };
+ result[@intFromEnum(Feature.a78c)] = .{
+ .llvm_name = "a78c",
+ .description = "Cortex-A78C ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ }),
+ };
+ result[@intFromEnum(Feature.aes)] = .{
+ .llvm_name = "aes",
+ .description = "Enable AES support (FEAT_AES, FEAT_PMULL)",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.aggressive_fma)] = .{
+ .llvm_name = "aggressive-fma",
+ .description = "Enable Aggressive FMA for floating-point.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.alternate_sextload_cvt_f32_pattern)] = .{
+ .llvm_name = "alternate-sextload-cvt-f32-pattern",
+ .description = "Use alternative pattern for sextload convert to f32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.altnzcv)] = .{
+ .llvm_name = "altnzcv",
+ .description = "Enable alternative NZCV format for floating point comparisons (FEAT_FlagM2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.am)] = .{
+ .llvm_name = "am",
+ .description = "Enable v8.4-A Activity Monitors extension (FEAT_AMUv1)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.amvs)] = .{
+ .llvm_name = "amvs",
+ .description = "Enable v8.6-A Activity Monitors Virtualization support (FEAT_AMUv1p1)",
+ .dependencies = featureSet(&[_]Feature{
+ .am,
+ }),
+ };
+ result[@intFromEnum(Feature.arith_bcc_fusion)] = .{
+ .llvm_name = "arith-bcc-fusion",
+ .description = "CPU fuses arithmetic+bcc operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.arith_cbz_fusion)] = .{
+ .llvm_name = "arith-cbz-fusion",
+ .description = "CPU fuses arithmetic + cbz/cbnz operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ascend_store_address)] = .{
+ .llvm_name = "ascend-store-address",
+ .description = "Schedule vector stores by ascending address",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.b16b16)] = .{
+ .llvm_name = "b16b16",
+ .description = "Enable SVE2.1 or SME2.1 non-widening BFloat16 to BFloat16 instructions (FEAT_B16B16)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.balance_fp_ops)] = .{
+ .llvm_name = "balance-fp-ops",
+ .description = "balance mix of odd and even D-registers for fp multiply(-accumulate) ops",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.bf16)] = .{
+ .llvm_name = "bf16",
+ .description = "Enable BFloat16 Extension (FEAT_BF16)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.brbe)] = .{
+ .llvm_name = "brbe",
+ .description = "Enable Branch Record Buffer Extension (FEAT_BRBE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.bti)] = .{
+ .llvm_name = "bti",
+ .description = "Enable Branch Target Identification (FEAT_BTI)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x10)] = .{
+ .llvm_name = "call-saved-x10",
+ .description = "Make X10 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x11)] = .{
+ .llvm_name = "call-saved-x11",
+ .description = "Make X11 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x12)] = .{
+ .llvm_name = "call-saved-x12",
+ .description = "Make X12 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x13)] = .{
+ .llvm_name = "call-saved-x13",
+ .description = "Make X13 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x14)] = .{
+ .llvm_name = "call-saved-x14",
+ .description = "Make X14 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x15)] = .{
+ .llvm_name = "call-saved-x15",
+ .description = "Make X15 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x18)] = .{
+ .llvm_name = "call-saved-x18",
+ .description = "Make X18 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x8)] = .{
+ .llvm_name = "call-saved-x8",
+ .description = "Make X8 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.call_saved_x9)] = .{
+ .llvm_name = "call-saved-x9",
+ .description = "Make X9 callee saved.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ccdp)] = .{
+ .llvm_name = "ccdp",
+ .description = "Enable v8.5 Cache Clean to Point of Deep Persistence (FEAT_DPB2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ccidx)] = .{
+ .llvm_name = "ccidx",
+ .description = "Enable v8.3-A Extend of the CCSIDR number of sets (FEAT_CCIDX)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ccpp)] = .{
+ .llvm_name = "ccpp",
+ .description = "Enable v8.2 data Cache Clean to Point of Persistence (FEAT_DPB)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.chk)] = .{
+ .llvm_name = "chk",
+ .description = "Enable Armv8.0-A Check Feature Status Extension (FEAT_CHK)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.clrbhb)] = .{
+ .llvm_name = "clrbhb",
+ .description = "Enable Clear BHB instruction (FEAT_CLRBHB)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cmp_bcc_fusion)] = .{
+ .llvm_name = "cmp-bcc-fusion",
+ .description = "CPU fuses cmp+bcc operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.complxnum)] = .{
+ .llvm_name = "complxnum",
+ .description = "Enable v8.3-A Floating-point complex number support (FEAT_FCMA)",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.contextidr_el2)] = .{
+ .llvm_name = "CONTEXTIDREL2",
+ .description = "Enable RW operand Context ID Register (EL2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cortex_r82)] = .{
+ .llvm_name = "cortex-r82",
+ .description = "Cortex-R82 ARM processors",
+ .dependencies = featureSet(&[_]Feature{
+ .use_postra_scheduler,
+ }),
+ };
+ result[@intFromEnum(Feature.crc)] = .{
+ .llvm_name = "crc",
+ .description = "Enable ARMv8 CRC-32 checksum instructions (FEAT_CRC32)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crypto)] = .{
+ .llvm_name = "crypto",
+ .description = "Enable cryptographic instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .aes,
+ .sha2,
+ }),
+ };
+ result[@intFromEnum(Feature.cssc)] = .{
+ .llvm_name = "cssc",
+ .description = "Enable Common Short Sequence Compression (CSSC) instructions (FEAT_CSSC)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.custom_cheap_as_move)] = .{
+ .llvm_name = "custom-cheap-as-move",
+ .description = "Use custom handling of cheap instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.d128)] = .{
+ .llvm_name = "d128",
+ .description = "Enable Armv9.4-A 128-bit Page Table Descriptors, System Registers and Instructions (FEAT_D128, FEAT_LVA3, FEAT_SYSREG128, FEAT_SYSINSTR128)",
+ .dependencies = featureSet(&[_]Feature{
+ .lse128,
+ }),
+ };
+ result[@intFromEnum(Feature.disable_latency_sched_heuristic)] = .{
+ .llvm_name = "disable-latency-sched-heuristic",
+ .description = "Disable latency scheduling heuristic",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dit)] = .{
+ .llvm_name = "dit",
+ .description = "Enable v8.4-A Data Independent Timing instructions (FEAT_DIT)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dotprod)] = .{
+ .llvm_name = "dotprod",
+ .description = "Enable dot product support (FEAT_DotProd)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ecv)] = .{
+ .llvm_name = "ecv",
+ .description = "Enable enhanced counter virtualization extension (FEAT_ECV)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.el2vmsa)] = .{
+ .llvm_name = "el2vmsa",
+ .description = "Enable Exception Level 2 Virtual Memory System Architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.el3)] = .{
+ .llvm_name = "el3",
+ .description = "Enable Exception Level 3",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.enable_select_opt)] = .{
+ .llvm_name = "enable-select-opt",
+ .description = "Enable the select optimize pass for select loop heuristics",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ete)] = .{
+ .llvm_name = "ete",
+ .description = "Enable Embedded Trace Extension (FEAT_ETE)",
+ .dependencies = featureSet(&[_]Feature{
+ .trbe,
+ }),
+ };
+ result[@intFromEnum(Feature.exynos_cheap_as_move)] = .{
+ .llvm_name = "exynos-cheap-as-move",
+ .description = "Use Exynos specific handling of cheap instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .custom_cheap_as_move,
+ }),
+ };
+ result[@intFromEnum(Feature.f32mm)] = .{
+ .llvm_name = "f32mm",
+ .description = "Enable Matrix Multiply FP32 Extension (FEAT_F32MM)",
+ .dependencies = featureSet(&[_]Feature{
+ .sve,
+ }),
+ };
+ result[@intFromEnum(Feature.f64mm)] = .{
+ .llvm_name = "f64mm",
+ .description = "Enable Matrix Multiply FP64 Extension (FEAT_F64MM)",
+ .dependencies = featureSet(&[_]Feature{
+ .sve,
+ }),
+ };
+ result[@intFromEnum(Feature.fgt)] = .{
+ .llvm_name = "fgt",
+ .description = "Enable fine grained virtualization traps extension (FEAT_FGT)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fix_cortex_a53_835769)] = .{
+ .llvm_name = "fix-cortex-a53-835769",
+ .description = "Mitigate Cortex-A53 Erratum 835769",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flagm)] = .{
+ .llvm_name = "flagm",
+ .description = "Enable v8.4-A Flag Manipulation Instructions (FEAT_FlagM)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fmv)] = .{
+ .llvm_name = "fmv",
+ .description = "Enable Function Multi Versioning support.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.force_32bit_jump_tables)] = .{
+ .llvm_name = "force-32bit-jump-tables",
+ .description = "Force jump table entries to be 32-bits wide except at MinSize",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp16fml)] = .{
+ .llvm_name = "fp16fml",
+ .description = "Enable FP16 FML instructions (FEAT_FHM)",
+ .dependencies = featureSet(&[_]Feature{
+ .fullfp16,
+ }),
+ };
+ result[@intFromEnum(Feature.fp_armv8)] = .{
+ .llvm_name = "fp-armv8",
+ .description = "Enable ARMv8 FP (FEAT_FP)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fptoint)] = .{
+ .llvm_name = "fptoint",
+ .description = "Enable FRInt[32|64][Z|X] instructions that round a floating-point number to an integer (in FP format) forcing it to fit into a 32- or 64-bit int (FEAT_FRINTTS)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fullfp16)] = .{
+ .llvm_name = "fullfp16",
+ .description = "Full FP16 (FEAT_FP16)",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_address)] = .{
+ .llvm_name = "fuse-address",
+ .description = "CPU fuses address generation and memory operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_addsub_2reg_const1)] = .{
+ .llvm_name = "fuse-addsub-2reg-const1",
+ .description = "CPU fuses (a + b + 1) and (a - b - 1)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_adrp_add)] = .{
+ .llvm_name = "fuse-adrp-add",
+ .description = "CPU fuses adrp+add operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_aes)] = .{
+ .llvm_name = "fuse-aes",
+ .description = "CPU fuses AES crypto operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_arith_logic)] = .{
+ .llvm_name = "fuse-arith-logic",
+ .description = "CPU fuses arithmetic and logic operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_crypto_eor)] = .{
+ .llvm_name = "fuse-crypto-eor",
+ .description = "CPU fuses AES/PMULL and EOR operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_csel)] = .{
+ .llvm_name = "fuse-csel",
+ .description = "CPU fuses conditional select operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_literals)] = .{
+ .llvm_name = "fuse-literals",
+ .description = "CPU fuses literal generation operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gcs)] = .{
+ .llvm_name = "gcs",
+ .description = "Enable Armv9.4-A Guarded Call Stack Extension",
+ .dependencies = featureSet(&[_]Feature{
+ .chk,
+ }),
+ };
+ result[@intFromEnum(Feature.harden_sls_blr)] = .{
+ .llvm_name = "harden-sls-blr",
+ .description = "Harden against straight line speculation across BLR instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_nocomdat)] = .{
+ .llvm_name = "harden-sls-nocomdat",
+ .description = "Generate thunk code for SLS mitigation in the normal text section",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_retbr)] = .{
+ .llvm_name = "harden-sls-retbr",
+ .description = "Harden against straight line speculation across RET and BR instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hbc)] = .{
+ .llvm_name = "hbc",
+ .description = "Enable Armv8.8-A Hinted Conditional Branches Extension (FEAT_HBC)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hcx)] = .{
+ .llvm_name = "hcx",
+ .description = "Enable Armv8.7-A HCRX_EL2 system register (FEAT_HCX)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.i8mm)] = .{
+ .llvm_name = "i8mm",
+ .description = "Enable Matrix Multiply Int8 Extension (FEAT_I8MM)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ite)] = .{
+ .llvm_name = "ite",
+ .description = "Enable Armv9.4-A Instrumentation Extension FEAT_ITE",
+ .dependencies = featureSet(&[_]Feature{
+ .ete,
+ }),
+ };
+ result[@intFromEnum(Feature.jsconv)] = .{
+ .llvm_name = "jsconv",
+ .description = "Enable v8.3-A JavaScript FP conversion instructions (FEAT_JSCVT)",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8,
+ }),
+ };
+ result[@intFromEnum(Feature.lor)] = .{
+ .llvm_name = "lor",
+ .description = "Enables ARM v8.1 Limited Ordering Regions extension (FEAT_LOR)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ls64)] = .{
+ .llvm_name = "ls64",
+ .description = "Enable Armv8.7-A LD64B/ST64B Accelerator Extension (FEAT_LS64, FEAT_LS64_V, FEAT_LS64_ACCDATA)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lse)] = .{
+ .llvm_name = "lse",
+ .description = "Enable ARMv8.1 Large System Extension (LSE) atomic instructions (FEAT_LSE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lse128)] = .{
+ .llvm_name = "lse128",
+ .description = "Enable Armv9.4-A 128-bit Atomic Instructions (FEAT_LSE128)",
+ .dependencies = featureSet(&[_]Feature{
+ .lse,
+ }),
+ };
+ result[@intFromEnum(Feature.lse2)] = .{
+ .llvm_name = "lse2",
+ .description = "Enable ARMv8.4 Large System Extension 2 (LSE2) atomicity rules (FEAT_LSE2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lsl_fast)] = .{
+ .llvm_name = "lsl-fast",
+ .description = "CPU has a fastpath logical shift of up to 3 places",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mec)] = .{
+ .llvm_name = "mec",
+ .description = "Enable Memory Encryption Contexts Extension",
+ .dependencies = featureSet(&[_]Feature{
+ .rme,
+ }),
+ };
+ result[@intFromEnum(Feature.mops)] = .{
+ .llvm_name = "mops",
+ .description = "Enable Armv8.8-A memcpy and memset acceleration instructions (FEAT_MOPS)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mpam)] = .{
+ .llvm_name = "mpam",
+ .description = "Enable v8.4-A Memory system Partitioning and Monitoring extension (FEAT_MPAM)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mte)] = .{
+ .llvm_name = "mte",
+ .description = "Enable Memory Tagging Extension (FEAT_MTE, FEAT_MTE2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.neon)] = .{
+ .llvm_name = "neon",
+ .description = "Enable Advanced SIMD instructions (FEAT_AdvSIMD)",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8,
+ }),
+ };
+ result[@intFromEnum(Feature.nmi)] = .{
+ .llvm_name = "nmi",
+ .description = "Enable Armv8.8-A Non-maskable Interrupts (FEAT_NMI, FEAT_GICv3_NMI)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bti_at_return_twice)] = .{
+ .llvm_name = "no-bti-at-return-twice",
+ .description = "Don't place a BTI instruction after a return-twice",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_neg_immediates)] = .{
+ .llvm_name = "no-neg-immediates",
+ .description = "Convert immediates and instructions to their negated or complemented equivalent when the immediate does not fit in the encoding.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_sve_fp_ld1r)] = .{
+ .llvm_name = "no-sve-fp-ld1r",
+ .description = "Avoid using LD1RX instructions for FP",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_zcz_fp)] = .{
+ .llvm_name = "no-zcz-fp",
+ .description = "Has no zero-cycle zeroing instructions for FP registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nv)] = .{
+ .llvm_name = "nv",
+ .description = "Enable v8.4-A Nested Virtualization Enchancement (FEAT_NV, FEAT_NV2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.outline_atomics)] = .{
+ .llvm_name = "outline-atomics",
+ .description = "Enable out of line atomics to support LSE instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pan)] = .{
+ .llvm_name = "pan",
+ .description = "Enables ARM v8.1 Privileged Access-Never extension (FEAT_PAN)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pan_rwv)] = .{
+ .llvm_name = "pan-rwv",
+ .description = "Enable v8.2 PAN s1e1R and s1e1W Variants (FEAT_PAN2)",
+ .dependencies = featureSet(&[_]Feature{
+ .pan,
+ }),
+ };
+ result[@intFromEnum(Feature.pauth)] = .{
+ .llvm_name = "pauth",
+ .description = "Enable v8.3-A Pointer Authentication extension (FEAT_PAuth)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.perfmon)] = .{
+ .llvm_name = "perfmon",
+ .description = "Enable Code Generation for ARMv8 PMUv3 Performance Monitors extension (FEAT_PMUv3)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.predictable_select_expensive)] = .{
+ .llvm_name = "predictable-select-expensive",
+ .description = "Prefer likely predicted branches over selects",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.predres)] = .{
+ .llvm_name = "predres",
+ .description = "Enable v8.5a execution and data prediction invalidation instructions (FEAT_SPECRES)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prfm_slc_target)] = .{
+ .llvm_name = "prfm-slc-target",
+ .description = "Enable SLC target for PRFM instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rand)] = .{
+ .llvm_name = "rand",
+ .description = "Enable Random Number generation instructions (FEAT_RNG)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ras)] = .{
+ .llvm_name = "ras",
+ .description = "Enable ARMv8 Reliability, Availability and Serviceability Extensions (FEAT_RAS, FEAT_RASv1p1)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rasv2)] = .{
+ .llvm_name = "rasv2",
+ .description = "Enable ARMv8.9-A Reliability, Availability and Serviceability Extensions (FEAT_RASv2)",
+ .dependencies = featureSet(&[_]Feature{
+ .ras,
+ }),
+ };
+ result[@intFromEnum(Feature.rcpc)] = .{
+ .llvm_name = "rcpc",
+ .description = "Enable support for RCPC extension (FEAT_LRCPC)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rcpc3)] = .{
+ .llvm_name = "rcpc3",
+ .description = "Enable Armv8.9-A RCPC instructions for A64 and Advanced SIMD and floating-point instruction set (FEAT_LRCPC3)",
+ .dependencies = featureSet(&[_]Feature{
+ .rcpc_immo,
+ }),
+ };
+ result[@intFromEnum(Feature.rcpc_immo)] = .{
+ .llvm_name = "rcpc-immo",
+ .description = "Enable v8.4-A RCPC instructions with Immediate Offsets (FEAT_LRCPC2)",
+ .dependencies = featureSet(&[_]Feature{
+ .rcpc,
+ }),
+ };
+ result[@intFromEnum(Feature.rdm)] = .{
+ .llvm_name = "rdm",
+ .description = "Enable ARMv8.1 Rounding Double Multiply Add/Subtract instructions (FEAT_RDM)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x1)] = .{
+ .llvm_name = "reserve-x1",
+ .description = "Reserve X1, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x10)] = .{
+ .llvm_name = "reserve-x10",
+ .description = "Reserve X10, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x11)] = .{
+ .llvm_name = "reserve-x11",
+ .description = "Reserve X11, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x12)] = .{
+ .llvm_name = "reserve-x12",
+ .description = "Reserve X12, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x13)] = .{
+ .llvm_name = "reserve-x13",
+ .description = "Reserve X13, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x14)] = .{
+ .llvm_name = "reserve-x14",
+ .description = "Reserve X14, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x15)] = .{
+ .llvm_name = "reserve-x15",
+ .description = "Reserve X15, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x18)] = .{
+ .llvm_name = "reserve-x18",
+ .description = "Reserve X18, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x2)] = .{
+ .llvm_name = "reserve-x2",
+ .description = "Reserve X2, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x20)] = .{
+ .llvm_name = "reserve-x20",
+ .description = "Reserve X20, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x21)] = .{
+ .llvm_name = "reserve-x21",
+ .description = "Reserve X21, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x22)] = .{
+ .llvm_name = "reserve-x22",
+ .description = "Reserve X22, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x23)] = .{
+ .llvm_name = "reserve-x23",
+ .description = "Reserve X23, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x24)] = .{
+ .llvm_name = "reserve-x24",
+ .description = "Reserve X24, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x25)] = .{
+ .llvm_name = "reserve-x25",
+ .description = "Reserve X25, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x26)] = .{
+ .llvm_name = "reserve-x26",
+ .description = "Reserve X26, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x27)] = .{
+ .llvm_name = "reserve-x27",
+ .description = "Reserve X27, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x28)] = .{
+ .llvm_name = "reserve-x28",
+ .description = "Reserve X28, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x3)] = .{
+ .llvm_name = "reserve-x3",
+ .description = "Reserve X3, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x30)] = .{
+ .llvm_name = "reserve-x30",
+ .description = "Reserve X30, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x4)] = .{
+ .llvm_name = "reserve-x4",
+ .description = "Reserve X4, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x5)] = .{
+ .llvm_name = "reserve-x5",
+ .description = "Reserve X5, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x6)] = .{
+ .llvm_name = "reserve-x6",
+ .description = "Reserve X6, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x7)] = .{
+ .llvm_name = "reserve-x7",
+ .description = "Reserve X7, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x9)] = .{
+ .llvm_name = "reserve-x9",
+ .description = "Reserve X9, making it unavailable as a GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rme)] = .{
+ .llvm_name = "rme",
+ .description = "Enable Realm Management Extension (FEAT_RME)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sb)] = .{
+ .llvm_name = "sb",
+ .description = "Enable v8.5 Speculation Barrier (FEAT_SB)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sel2)] = .{
+ .llvm_name = "sel2",
+ .description = "Enable v8.4-A Secure Exception Level 2 extension (FEAT_SEL2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sha2)] = .{
+ .llvm_name = "sha2",
+ .description = "Enable SHA1 and SHA256 support (FEAT_SHA1, FEAT_SHA256)",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.sha3)] = .{
+ .llvm_name = "sha3",
+ .description = "Enable SHA512 and SHA3 support (FEAT_SHA3, FEAT_SHA512)",
+ .dependencies = featureSet(&[_]Feature{
+ .sha2,
+ }),
+ };
+ result[@intFromEnum(Feature.slow_misaligned_128store)] = .{
+ .llvm_name = "slow-misaligned-128store",
+ .description = "Misaligned 128 bit stores are slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_paired_128)] = .{
+ .llvm_name = "slow-paired-128",
+ .description = "Paired 128 bit loads and stores are slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_strqro_store)] = .{
+ .llvm_name = "slow-strqro-store",
+ .description = "STR of Q register with register offset is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm4)] = .{
+ .llvm_name = "sm4",
+ .description = "Enable SM3 and SM4 support (FEAT_SM4, FEAT_SM3)",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.sme)] = .{
+ .llvm_name = "sme",
+ .description = "Enable Scalable Matrix Extension (SME) (FEAT_SME)",
+ .dependencies = featureSet(&[_]Feature{
+ .bf16,
+ .use_scalar_inc_vl,
+ }),
+ };
+ result[@intFromEnum(Feature.sme2)] = .{
+ .llvm_name = "sme2",
+ .description = "Enable Scalable Matrix Extension 2 (SME2) instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sme,
+ }),
+ };
+ result[@intFromEnum(Feature.sme2p1)] = .{
+ .llvm_name = "sme2p1",
+ .description = "Enable Scalable Matrix Extension 2.1 (FEAT_SME2p1) instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sme2,
+ }),
+ };
+ result[@intFromEnum(Feature.sme_f16f16)] = .{
+ .llvm_name = "sme-f16f16",
+ .description = "Enable SME2.1 non-widening Float16 instructions (FEAT_SME_F16F16)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sme_f64f64)] = .{
+ .llvm_name = "sme-f64f64",
+ .description = "Enable Scalable Matrix Extension (SME) F64F64 instructions (FEAT_SME_F64F64)",
+ .dependencies = featureSet(&[_]Feature{
+ .sme,
+ }),
+ };
+ result[@intFromEnum(Feature.sme_i16i64)] = .{
+ .llvm_name = "sme-i16i64",
+ .description = "Enable Scalable Matrix Extension (SME) I16I64 instructions (FEAT_SME_I16I64)",
+ .dependencies = featureSet(&[_]Feature{
+ .sme,
+ }),
+ };
+ result[@intFromEnum(Feature.spe)] = .{
+ .llvm_name = "spe",
+ .description = "Enable Statistical Profiling extension (FEAT_SPE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.spe_eef)] = .{
+ .llvm_name = "spe-eef",
+ .description = "Enable extra register in the Statistical Profiling Extension (FEAT_SPEv1p2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.specres2)] = .{
+ .llvm_name = "specres2",
+ .description = "Enable Speculation Restriction Instruction (FEAT_SPECRES2)",
+ .dependencies = featureSet(&[_]Feature{
+ .predres,
+ }),
+ };
+ result[@intFromEnum(Feature.specrestrict)] = .{
+ .llvm_name = "specrestrict",
+ .description = "Enable architectural speculation restriction (FEAT_CSV2_2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ssbs)] = .{
+ .llvm_name = "ssbs",
+ .description = "Enable Speculative Store Bypass Safe bit (FEAT_SSBS, FEAT_SSBS2)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.strict_align)] = .{
+ .llvm_name = "strict-align",
+ .description = "Disallow all unaligned memory access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sve)] = .{
+ .llvm_name = "sve",
+ .description = "Enable Scalable Vector Extension (SVE) instructions (FEAT_SVE)",
+ .dependencies = featureSet(&[_]Feature{
+ .fullfp16,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2)] = .{
+ .llvm_name = "sve2",
+ .description = "Enable Scalable Vector Extension 2 (SVE2) instructions (FEAT_SVE2)",
+ .dependencies = featureSet(&[_]Feature{
+ .sve,
+ .use_scalar_inc_vl,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2_aes)] = .{
+ .llvm_name = "sve2-aes",
+ .description = "Enable AES SVE2 instructions (FEAT_SVE_AES, FEAT_SVE_PMULL128)",
+ .dependencies = featureSet(&[_]Feature{
+ .aes,
+ .sve2,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2_bitperm)] = .{
+ .llvm_name = "sve2-bitperm",
+ .description = "Enable bit permutation SVE2 instructions (FEAT_SVE_BitPerm)",
+ .dependencies = featureSet(&[_]Feature{
+ .sve2,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2_sha3)] = .{
+ .llvm_name = "sve2-sha3",
+ .description = "Enable SHA3 SVE2 instructions (FEAT_SVE_SHA3)",
+ .dependencies = featureSet(&[_]Feature{
+ .sha3,
+ .sve2,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2_sm4)] = .{
+ .llvm_name = "sve2-sm4",
+ .description = "Enable SM4 SVE2 instructions (FEAT_SVE_SM4)",
+ .dependencies = featureSet(&[_]Feature{
+ .sm4,
+ .sve2,
+ }),
+ };
+ result[@intFromEnum(Feature.sve2p1)] = .{
+ .llvm_name = "sve2p1",
+ .description = "Enable Scalable Vector Extension 2.1 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sve2,
+ }),
+ };
+ result[@intFromEnum(Feature.tagged_globals)] = .{
+ .llvm_name = "tagged-globals",
+ .description = "Use an instruction sequence for taking the address of a global that allows a memory tag in the upper address bits",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.the)] = .{
+ .llvm_name = "the",
+ .description = "Enable Armv8.9-A Translation Hardening Extension (FEAT_THE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tlb_rmi)] = .{
+ .llvm_name = "tlb-rmi",
+ .description = "Enable v8.4-A TLB Range and Maintenance Instructions (FEAT_TLBIOS, FEAT_TLBIRANGE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tme)] = .{
+ .llvm_name = "tme",
+ .description = "Enable Transactional Memory Extension (FEAT_TME)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tpidr_el1)] = .{
+ .llvm_name = "tpidr-el1",
+ .description = "Permit use of TPIDR_EL1 for the TLS base",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tpidr_el2)] = .{
+ .llvm_name = "tpidr-el2",
+ .description = "Permit use of TPIDR_EL2 for the TLS base",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tpidr_el3)] = .{
+ .llvm_name = "tpidr-el3",
+ .description = "Permit use of TPIDR_EL3 for the TLS base",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tpidrro_el0)] = .{
+ .llvm_name = "tpidrro-el0",
+ .description = "Permit use of TPIDRRO_EL0 for the TLS base",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tracev8_4)] = .{
+ .llvm_name = "tracev8.4",
+ .description = "Enable v8.4-A Trace extension (FEAT_TRF)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.trbe)] = .{
+ .llvm_name = "trbe",
+ .description = "Enable Trace Buffer Extension (FEAT_TRBE)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.uaops)] = .{
+ .llvm_name = "uaops",
+ .description = "Enable v8.2 UAO PState (FEAT_UAO)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_experimental_zeroing_pseudos)] = .{
+ .llvm_name = "use-experimental-zeroing-pseudos",
+ .description = "Hint to the compiler that the MOVPRFX instruction is merged with destructive operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_postra_scheduler)] = .{
+ .llvm_name = "use-postra-scheduler",
+ .description = "Schedule again after register allocation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_reciprocal_square_root)] = .{
+ .llvm_name = "use-reciprocal-square-root",
+ .description = "Use the reciprocal square root approximation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_scalar_inc_vl)] = .{
+ .llvm_name = "use-scalar-inc-vl",
+ .description = "Prefer inc/dec over add+cnt",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v8_1a)] = .{
+ .llvm_name = "v8.1a",
+ .description = "Support ARM v8.1a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .crc,
+ .lor,
+ .lse,
+ .pan,
+ .rdm,
+ .v8a,
+ .vh,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_2a)] = .{
+ .llvm_name = "v8.2a",
+ .description = "Support ARM v8.2a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .ccpp,
+ .pan_rwv,
+ .ras,
+ .uaops,
+ .v8_1a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_3a)] = .{
+ .llvm_name = "v8.3a",
+ .description = "Support ARM v8.3a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .ccidx,
+ .complxnum,
+ .jsconv,
+ .pauth,
+ .rcpc,
+ .v8_2a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_4a)] = .{
+ .llvm_name = "v8.4a",
+ .description = "Support ARM v8.4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .am,
+ .dit,
+ .dotprod,
+ .flagm,
+ .lse2,
+ .mpam,
+ .nv,
+ .rcpc_immo,
+ .sel2,
+ .tlb_rmi,
+ .tracev8_4,
+ .v8_3a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_5a)] = .{
+ .llvm_name = "v8.5a",
+ .description = "Support ARM v8.5a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .altnzcv,
+ .bti,
+ .ccdp,
+ .fptoint,
+ .predres,
+ .sb,
+ .specrestrict,
+ .ssbs,
+ .v8_4a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_6a)] = .{
+ .llvm_name = "v8.6a",
+ .description = "Support ARM v8.6a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .amvs,
+ .bf16,
+ .ecv,
+ .fgt,
+ .i8mm,
+ .v8_5a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_7a)] = .{
+ .llvm_name = "v8.7a",
+ .description = "Support ARM v8.7a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hcx,
+ .v8_6a,
+ .wfxt,
+ .xs,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_8a)] = .{
+ .llvm_name = "v8.8a",
+ .description = "Support ARM v8.8a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hbc,
+ .mops,
+ .nmi,
+ .v8_7a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_9a)] = .{
+ .llvm_name = "v8.9a",
+ .description = "Support ARM v8.9a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .chk,
+ .clrbhb,
+ .cssc,
+ .prfm_slc_target,
+ .rasv2,
+ .specres2,
+ .v8_8a,
+ }),
+ };
+ result[@intFromEnum(Feature.v8a)] = .{
+ .llvm_name = "v8a",
+ .description = "Support ARM v8.0a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .el2vmsa,
+ .el3,
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.v8r)] = .{
+ .llvm_name = "v8r",
+ .description = "Support ARM v8r instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .ccidx,
+ .ccpp,
+ .complxnum,
+ .contextidr_el2,
+ .crc,
+ .dit,
+ .dotprod,
+ .flagm,
+ .jsconv,
+ .lse,
+ .pan_rwv,
+ .pauth,
+ .ras,
+ .rcpc_immo,
+ .rdm,
+ .sel2,
+ .specrestrict,
+ .tlb_rmi,
+ .tracev8_4,
+ .uaops,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_1a)] = .{
+ .llvm_name = "v9.1a",
+ .description = "Support ARM v9.1a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .v8_6a,
+ .v9a,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_2a)] = .{
+ .llvm_name = "v9.2a",
+ .description = "Support ARM v9.2a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .v8_7a,
+ .v9_1a,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_3a)] = .{
+ .llvm_name = "v9.3a",
+ .description = "Support ARM v9.3a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .v8_8a,
+ .v9_2a,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_4a)] = .{
+ .llvm_name = "v9.4a",
+ .description = "Support ARM v9.4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .v8_9a,
+ .v9_3a,
+ }),
+ };
+ result[@intFromEnum(Feature.v9a)] = .{
+ .llvm_name = "v9a",
+ .description = "Support ARM v9a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .mec,
+ .sve2,
+ .v8_5a,
+ }),
+ };
+ result[@intFromEnum(Feature.vh)] = .{
+ .llvm_name = "vh",
+ .description = "Enables ARM v8.1 Virtual Host extension (FEAT_VHE)",
+ .dependencies = featureSet(&[_]Feature{
+ .contextidr_el2,
+ }),
+ };
+ result[@intFromEnum(Feature.wfxt)] = .{
+ .llvm_name = "wfxt",
+ .description = "Enable Armv8.7-A WFET and WFIT instruction (FEAT_WFxT)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xs)] = .{
+ .llvm_name = "xs",
+ .description = "Enable Armv8.7-A limited-TLB-maintenance instruction (FEAT_XS)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zcm)] = .{
+ .llvm_name = "zcm",
+ .description = "Has zero-cycle register moves",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zcz)] = .{
+ .llvm_name = "zcz",
+ .description = "Has zero-cycle zeroing instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .zcz_gp,
+ }),
+ };
+ result[@intFromEnum(Feature.zcz_fp_workaround)] = .{
+ .llvm_name = "zcz-fp-workaround",
+ .description = "The zero-cycle floating-point zeroing instruction has a bug",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zcz_gp)] = .{
+ .llvm_name = "zcz-gp",
+ .description = "Has zero-cycle zeroing instructions for generic registers",
+ .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 a64fx = CpuModel{
+ .name = "a64fx",
+ .llvm_name = "a64fx",
+ .features = featureSet(&[_]Feature{
+ .aggressive_fma,
+ .arith_bcc_fusion,
+ .complxnum,
+ .perfmon,
+ .predictable_select_expensive,
+ .sha2,
+ .sve,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const ampere1 = CpuModel{
+ .name = "ampere1",
+ .llvm_name = "ampere1",
+ .features = featureSet(&[_]Feature{
+ .aes,
+ .aggressive_fma,
+ .arith_bcc_fusion,
+ .cmp_bcc_fusion,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_literals,
+ .lsl_fast,
+ .perfmon,
+ .rand,
+ .sha3,
+ .use_postra_scheduler,
+ .v8_6a,
+ }),
+ };
+ pub const ampere1a = CpuModel{
+ .name = "ampere1a",
+ .llvm_name = "ampere1a",
+ .features = featureSet(&[_]Feature{
+ .aes,
+ .aggressive_fma,
+ .arith_bcc_fusion,
+ .cmp_bcc_fusion,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_literals,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .rand,
+ .sha3,
+ .sm4,
+ .use_postra_scheduler,
+ .v8_6a,
+ }),
+ };
+ pub const apple_a10 = CpuModel{
+ .name = "apple_a10",
+ .llvm_name = "apple-a10",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crc,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .lor,
+ .pan,
+ .perfmon,
+ .rdm,
+ .v8a,
+ .vh,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a11 = CpuModel{
+ .name = "apple_a11",
+ .llvm_name = "apple-a11",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fullfp16,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8_2a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a12 = CpuModel{
+ .name = "apple_a12",
+ .llvm_name = "apple-a12",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fullfp16,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8_3a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a13 = CpuModel{
+ .name = "apple_a13",
+ .llvm_name = "apple-a13",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .sha3,
+ .v8_4a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a14 = CpuModel{
+ .name = "apple_a14",
+ .llvm_name = "apple-a14",
+ .features = featureSet(&[_]Feature{
+ .aggressive_fma,
+ .alternate_sextload_cvt_f32_pattern,
+ .altnzcv,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .ccdp,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fptoint,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .perfmon,
+ .predres,
+ .sb,
+ .sha3,
+ .specrestrict,
+ .ssbs,
+ .v8_4a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a15 = CpuModel{
+ .name = "apple_a15",
+ .llvm_name = "apple-a15",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .perfmon,
+ .sha3,
+ .v8_6a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a16 = CpuModel{
+ .name = "apple_a16",
+ .llvm_name = "apple-a16",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .hcx,
+ .perfmon,
+ .sha3,
+ .v8_6a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_a7 = CpuModel{
+ .name = "apple_a7",
+ .llvm_name = "apple-a7",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8a,
+ .zcm,
+ .zcz,
+ .zcz_fp_workaround,
+ }),
+ };
+ pub const apple_a8 = CpuModel{
+ .name = "apple_a8",
+ .llvm_name = "apple-a8",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8a,
+ .zcm,
+ .zcz,
+ .zcz_fp_workaround,
+ }),
+ };
+ pub const apple_a9 = CpuModel{
+ .name = "apple_a9",
+ .llvm_name = "apple-a9",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8a,
+ .zcm,
+ .zcz,
+ .zcz_fp_workaround,
+ }),
+ };
+ pub const apple_latest = CpuModel{
+ .name = "apple_latest",
+ .llvm_name = "apple-latest",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .hcx,
+ .perfmon,
+ .sha3,
+ .v8_6a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_m1 = CpuModel{
+ .name = "apple_m1",
+ .llvm_name = "apple-m1",
+ .features = featureSet(&[_]Feature{
+ .aggressive_fma,
+ .alternate_sextload_cvt_f32_pattern,
+ .altnzcv,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .ccdp,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fptoint,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .perfmon,
+ .predres,
+ .sb,
+ .sha3,
+ .specrestrict,
+ .ssbs,
+ .v8_4a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_m2 = CpuModel{
+ .name = "apple_m2",
+ .llvm_name = "apple-m2",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fp16fml,
+ .fuse_address,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_crypto_eor,
+ .fuse_csel,
+ .fuse_literals,
+ .perfmon,
+ .sha3,
+ .v8_6a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_s4 = CpuModel{
+ .name = "apple_s4",
+ .llvm_name = "apple-s4",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fullfp16,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8_3a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const apple_s5 = CpuModel{
+ .name = "apple_s5",
+ .llvm_name = "apple-s5",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fullfp16,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8_3a,
+ .zcm,
+ .zcz,
+ }),
+ };
+ pub const carmel = CpuModel{
+ .name = "carmel",
+ .llvm_name = "carmel",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a34 = CpuModel{
+ .name = "cortex_a34",
+ .llvm_name = "cortex-a34",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .v8a,
+ }),
+ };
+ pub const cortex_a35 = CpuModel{
+ .name = "cortex_a35",
+ .llvm_name = "cortex-a35",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .v8a,
+ }),
+ };
+ pub const cortex_a510 = CpuModel{
+ .name = "cortex_a510",
+ .llvm_name = "cortex-a510",
+ .features = featureSet(&[_]Feature{
+ .a510,
+ .bf16,
+ .ete,
+ .fp16fml,
+ .i8mm,
+ .mte,
+ .perfmon,
+ .sve2_bitperm,
+ .v9a,
+ }),
+ };
+ pub const cortex_a53 = CpuModel{
+ .name = "cortex_a53",
+ .llvm_name = "cortex-a53",
+ .features = featureSet(&[_]Feature{
+ .balance_fp_ops,
+ .crc,
+ .crypto,
+ .custom_cheap_as_move,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .perfmon,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const cortex_a55 = CpuModel{
+ .name = "cortex_a55",
+ .llvm_name = "cortex-a55",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .perfmon,
+ .rcpc,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a57 = CpuModel{
+ .name = "cortex_a57",
+ .llvm_name = "cortex-a57",
+ .features = featureSet(&[_]Feature{
+ .balance_fp_ops,
+ .crc,
+ .crypto,
+ .custom_cheap_as_move,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_literals,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const cortex_a65 = CpuModel{
+ .name = "cortex_a65",
+ .llvm_name = "cortex-a65",
+ .features = featureSet(&[_]Feature{
+ .a65,
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .perfmon,
+ .rcpc,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a65ae = CpuModel{
+ .name = "cortex_a65ae",
+ .llvm_name = "cortex-a65ae",
+ .features = featureSet(&[_]Feature{
+ .a65,
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .perfmon,
+ .rcpc,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a710 = CpuModel{
+ .name = "cortex_a710",
+ .llvm_name = "cortex-a710",
+ .features = featureSet(&[_]Feature{
+ .a710,
+ .bf16,
+ .ete,
+ .fp16fml,
+ .i8mm,
+ .mte,
+ .perfmon,
+ .sve2_bitperm,
+ .v9a,
+ }),
+ };
+ pub const cortex_a715 = CpuModel{
+ .name = "cortex_a715",
+ .llvm_name = "cortex-a715",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .cmp_bcc_fusion,
+ .enable_select_opt,
+ .ete,
+ .fp16fml,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .predictable_select_expensive,
+ .spe,
+ .sve2_bitperm,
+ .use_postra_scheduler,
+ .v9a,
+ }),
+ };
+ pub const cortex_a72 = CpuModel{
+ .name = "cortex_a72",
+ .llvm_name = "cortex-a72",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_literals,
+ .perfmon,
+ .predictable_select_expensive,
+ .v8a,
+ }),
+ };
+ pub const cortex_a73 = CpuModel{
+ .name = "cortex_a73",
+ .llvm_name = "cortex-a73",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .enable_select_opt,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .perfmon,
+ .predictable_select_expensive,
+ .v8a,
+ }),
+ };
+ pub const cortex_a75 = CpuModel{
+ .name = "cortex_a75",
+ .llvm_name = "cortex-a75",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .dotprod,
+ .enable_select_opt,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .perfmon,
+ .predictable_select_expensive,
+ .rcpc,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a76 = CpuModel{
+ .name = "cortex_a76",
+ .llvm_name = "cortex-a76",
+ .features = featureSet(&[_]Feature{
+ .a76,
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .perfmon,
+ .rcpc,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a76ae = CpuModel{
+ .name = "cortex_a76ae",
+ .llvm_name = "cortex-a76ae",
+ .features = featureSet(&[_]Feature{
+ .a76,
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .perfmon,
+ .rcpc,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a77 = CpuModel{
+ .name = "cortex_a77",
+ .llvm_name = "cortex-a77",
+ .features = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .crypto,
+ .dotprod,
+ .enable_select_opt,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .rcpc,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a78 = CpuModel{
+ .name = "cortex_a78",
+ .llvm_name = "cortex-a78",
+ .features = featureSet(&[_]Feature{
+ .a78,
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .perfmon,
+ .rcpc,
+ .spe,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a78c = CpuModel{
+ .name = "cortex_a78c",
+ .llvm_name = "cortex-a78c",
+ .features = featureSet(&[_]Feature{
+ .a78c,
+ .crypto,
+ .dotprod,
+ .flagm,
+ .fp16fml,
+ .pauth,
+ .perfmon,
+ .rcpc,
+ .spe,
+ .ssbs,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_r82 = CpuModel{
+ .name = "cortex_r82",
+ .llvm_name = "cortex-r82",
+ .features = featureSet(&[_]Feature{
+ .cortex_r82,
+ .fp16fml,
+ .perfmon,
+ .predres,
+ .sb,
+ .ssbs,
+ .v8r,
+ }),
+ };
+ pub const cortex_x1 = CpuModel{
+ .name = "cortex_x1",
+ .llvm_name = "cortex-x1",
+ .features = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .crypto,
+ .dotprod,
+ .enable_select_opt,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .rcpc,
+ .spe,
+ .ssbs,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_x1c = CpuModel{
+ .name = "cortex_x1c",
+ .llvm_name = "cortex-x1c",
+ .features = featureSet(&[_]Feature{
+ .cmp_bcc_fusion,
+ .crypto,
+ .dotprod,
+ .enable_select_opt,
+ .flagm,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lse2,
+ .lsl_fast,
+ .pauth,
+ .perfmon,
+ .predictable_select_expensive,
+ .rcpc_immo,
+ .spe,
+ .ssbs,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_x2 = CpuModel{
+ .name = "cortex_x2",
+ .llvm_name = "cortex-x2",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .cmp_bcc_fusion,
+ .enable_select_opt,
+ .ete,
+ .fp16fml,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .predictable_select_expensive,
+ .sve2_bitperm,
+ .use_postra_scheduler,
+ .v9a,
+ }),
+ };
+ pub const cortex_x3 = CpuModel{
+ .name = "cortex_x3",
+ .llvm_name = "cortex-x3",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .enable_select_opt,
+ .ete,
+ .fp16fml,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .predictable_select_expensive,
+ .spe,
+ .sve2_bitperm,
+ .use_postra_scheduler,
+ .v9a,
+ }),
+ };
+ pub const cyclone = CpuModel{
+ .name = "cyclone",
+ .llvm_name = "cyclone",
+ .features = featureSet(&[_]Feature{
+ .alternate_sextload_cvt_f32_pattern,
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .disable_latency_sched_heuristic,
+ .fuse_aes,
+ .fuse_crypto_eor,
+ .perfmon,
+ .v8a,
+ .zcm,
+ .zcz,
+ .zcz_fp_workaround,
+ }),
+ };
+ pub const emag = CpuModel{
+ .name = "emag",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .v8a,
+ }),
+ };
+ pub const exynos_m1 = CpuModel{
+ .name = "exynos_m1",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .exynos_cheap_as_move,
+ .force_32bit_jump_tables,
+ .fuse_aes,
+ .perfmon,
+ .slow_misaligned_128store,
+ .slow_paired_128,
+ .use_postra_scheduler,
+ .use_reciprocal_square_root,
+ .v8a,
+ }),
+ };
+ pub const exynos_m2 = CpuModel{
+ .name = "exynos_m2",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .exynos_cheap_as_move,
+ .force_32bit_jump_tables,
+ .fuse_aes,
+ .perfmon,
+ .slow_misaligned_128store,
+ .slow_paired_128,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const exynos_m3 = CpuModel{
+ .name = "exynos_m3",
+ .llvm_name = "exynos-m3",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .exynos_cheap_as_move,
+ .force_32bit_jump_tables,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_csel,
+ .fuse_literals,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const exynos_m4 = CpuModel{
+ .name = "exynos_m4",
+ .llvm_name = "exynos-m4",
+ .features = featureSet(&[_]Feature{
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .dotprod,
+ .exynos_cheap_as_move,
+ .force_32bit_jump_tables,
+ .fullfp16,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_csel,
+ .fuse_literals,
+ .lsl_fast,
+ .perfmon,
+ .use_postra_scheduler,
+ .v8_2a,
+ .zcz,
+ }),
+ };
+ pub const exynos_m5 = CpuModel{
+ .name = "exynos_m5",
+ .llvm_name = "exynos-m5",
+ .features = featureSet(&[_]Feature{
+ .arith_bcc_fusion,
+ .arith_cbz_fusion,
+ .crypto,
+ .dotprod,
+ .exynos_cheap_as_move,
+ .force_32bit_jump_tables,
+ .fullfp16,
+ .fuse_address,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .fuse_arith_logic,
+ .fuse_csel,
+ .fuse_literals,
+ .lsl_fast,
+ .perfmon,
+ .use_postra_scheduler,
+ .v8_2a,
+ .zcz,
+ }),
+ };
+ pub const falkor = CpuModel{
+ .name = "falkor",
+ .llvm_name = "falkor",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .custom_cheap_as_move,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .rdm,
+ .slow_strqro_store,
+ .use_postra_scheduler,
+ .v8a,
+ .zcz,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .enable_select_opt,
+ .ete,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .neon,
+ .use_postra_scheduler,
+ }),
+ };
+ pub const kryo = CpuModel{
+ .name = "kryo",
+ .llvm_name = "kryo",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .custom_cheap_as_move,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ .zcz,
+ }),
+ };
+ pub const neoverse_512tvb = CpuModel{
+ .name = "neoverse_512tvb",
+ .llvm_name = "neoverse-512tvb",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .ccdp,
+ .crypto,
+ .enable_select_opt,
+ .fp16fml,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .rand,
+ .spe,
+ .ssbs,
+ .sve,
+ .use_postra_scheduler,
+ .v8_4a,
+ }),
+ };
+ pub const neoverse_e1 = CpuModel{
+ .name = "neoverse_e1",
+ .llvm_name = "neoverse-e1",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .dotprod,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .perfmon,
+ .rcpc,
+ .ssbs,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const neoverse_n1 = CpuModel{
+ .name = "neoverse_n1",
+ .llvm_name = "neoverse-n1",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .dotprod,
+ .enable_select_opt,
+ .fullfp16,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .rcpc,
+ .spe,
+ .ssbs,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const neoverse_n2 = CpuModel{
+ .name = "neoverse_n2",
+ .llvm_name = "neoverse-n2",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .crypto,
+ .enable_select_opt,
+ .ete,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .predictable_select_expensive,
+ .sve2_bitperm,
+ .use_postra_scheduler,
+ .v8_5a,
+ }),
+ };
+ pub const neoverse_v1 = CpuModel{
+ .name = "neoverse_v1",
+ .llvm_name = "neoverse-v1",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .ccdp,
+ .crypto,
+ .enable_select_opt,
+ .fp16fml,
+ .fuse_adrp_add,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .no_sve_fp_ld1r,
+ .perfmon,
+ .predictable_select_expensive,
+ .rand,
+ .spe,
+ .ssbs,
+ .sve,
+ .use_postra_scheduler,
+ .v8_4a,
+ }),
+ };
+ pub const neoverse_v2 = CpuModel{
+ .name = "neoverse_v2",
+ .llvm_name = "neoverse-v2",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .enable_select_opt,
+ .ete,
+ .fp16fml,
+ .fuse_aes,
+ .i8mm,
+ .lsl_fast,
+ .mte,
+ .perfmon,
+ .predictable_select_expensive,
+ .rand,
+ .spe,
+ .sve2_bitperm,
+ .use_postra_scheduler,
+ .v9a,
+ }),
+ };
+ pub const saphira = CpuModel{
+ .name = "saphira",
+ .llvm_name = "saphira",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .custom_cheap_as_move,
+ .lsl_fast,
+ .perfmon,
+ .predictable_select_expensive,
+ .spe,
+ .use_postra_scheduler,
+ .v8_4a,
+ .zcz,
+ }),
+ };
+ pub const thunderx = CpuModel{
+ .name = "thunderx",
+ .llvm_name = "thunderx",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const thunderx2t99 = CpuModel{
+ .name = "thunderx2t99",
+ .llvm_name = "thunderx2t99",
+ .features = featureSet(&[_]Feature{
+ .aggressive_fma,
+ .arith_bcc_fusion,
+ .crypto,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8_1a,
+ }),
+ };
+ pub const thunderx3t110 = CpuModel{
+ .name = "thunderx3t110",
+ .llvm_name = "thunderx3t110",
+ .features = featureSet(&[_]Feature{
+ .aggressive_fma,
+ .arith_bcc_fusion,
+ .balance_fp_ops,
+ .crypto,
+ .perfmon,
+ .predictable_select_expensive,
+ .strict_align,
+ .use_postra_scheduler,
+ .v8_3a,
+ }),
+ };
+ pub const thunderxt81 = CpuModel{
+ .name = "thunderxt81",
+ .llvm_name = "thunderxt81",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const thunderxt83 = CpuModel{
+ .name = "thunderxt83",
+ .llvm_name = "thunderxt83",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const thunderxt88 = CpuModel{
+ .name = "thunderxt88",
+ .llvm_name = "thunderxt88",
+ .features = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .perfmon,
+ .predictable_select_expensive,
+ .use_postra_scheduler,
+ .v8a,
+ }),
+ };
+ pub const tsv110 = CpuModel{
+ .name = "tsv110",
+ .llvm_name = "tsv110",
+ .features = featureSet(&[_]Feature{
+ .crypto,
+ .custom_cheap_as_move,
+ .dotprod,
+ .fp16fml,
+ .fuse_aes,
+ .perfmon,
+ .spe,
+ .use_postra_scheduler,
+ .v8_2a,
+ }),
+ };
+ pub const xgene1 = CpuModel{
+ .name = "xgene1",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .perfmon,
+ .v8a,
+ }),
+ };
+};
diff --git a/lib/std/Target/amdgpu.zig b/lib/std/Target/amdgpu.zig
new file mode 100644
index 0000000000..012f652088
--- /dev/null
+++ b/lib/std/Target/amdgpu.zig
@@ -0,0 +1,2153 @@
+//! 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 {
+ @"16_bit_insts",
+ a16,
+ add_no_carry_insts,
+ aperture_regs,
+ architected_flat_scratch,
+ architected_sgprs,
+ atomic_buffer_global_pk_add_f16_insts,
+ atomic_buffer_global_pk_add_f16_no_rtn_insts,
+ atomic_ds_pk_add_16_insts,
+ atomic_fadd_no_rtn_insts,
+ atomic_fadd_rtn_insts,
+ atomic_flat_pk_add_16_insts,
+ atomic_global_pk_add_bf16_inst,
+ auto_waitcnt_before_barrier,
+ back_off_barrier,
+ ci_insts,
+ cumode,
+ dl_insts,
+ dot10_insts,
+ dot1_insts,
+ dot2_insts,
+ dot3_insts,
+ dot4_insts,
+ dot5_insts,
+ dot6_insts,
+ dot7_insts,
+ dot8_insts,
+ dot9_insts,
+ dpp,
+ dpp8,
+ dpp_64bit,
+ ds128,
+ ds_src2_insts,
+ extended_image_insts,
+ fast_denormal_f32,
+ fast_fmaf,
+ flat_address_space,
+ flat_atomic_fadd_f32_inst,
+ flat_for_global,
+ flat_global_insts,
+ flat_inst_offsets,
+ flat_scratch,
+ flat_scratch_insts,
+ flat_segment_offset_bug,
+ fma_mix_insts,
+ fmacf64_inst,
+ fmaf,
+ force_store_sc0_sc1,
+ fp64,
+ fp8_insts,
+ full_rate_64_ops,
+ g16,
+ gcn3_encoding,
+ get_wave_id_inst,
+ gfx10,
+ gfx10_3_insts,
+ gfx10_a_encoding,
+ gfx10_b_encoding,
+ gfx10_insts,
+ gfx11,
+ gfx11_full_vgprs,
+ gfx11_insts,
+ gfx7_gfx8_gfx9_insts,
+ gfx8_insts,
+ gfx9,
+ gfx90a_insts,
+ gfx940_insts,
+ gfx9_insts,
+ half_rate_64_ops,
+ image_gather4_d16_bug,
+ image_insts,
+ image_store_d16_bug,
+ inst_fwd_prefetch_bug,
+ int_clamp_insts,
+ inv_2pi_inline_imm,
+ lds_branch_vmem_war_hazard,
+ lds_misaligned_bug,
+ ldsbankcount16,
+ ldsbankcount32,
+ load_store_opt,
+ localmemorysize32768,
+ localmemorysize65536,
+ mad_intra_fwd_bug,
+ mad_mac_f32_insts,
+ mad_mix_insts,
+ mai_insts,
+ max_private_element_size_16,
+ max_private_element_size_4,
+ max_private_element_size_8,
+ mfma_inline_literal_bug,
+ mimg_r128,
+ movrel,
+ negative_scratch_offset_bug,
+ negative_unaligned_scratch_offset_bug,
+ no_data_dep_hazard,
+ no_sdst_cmpx,
+ nsa_clause_bug,
+ nsa_encoding,
+ nsa_to_vmem_bug,
+ offset_3f_bug,
+ packed_fp32_ops,
+ packed_tid,
+ partial_nsa_encoding,
+ pk_fmac_f16_inst,
+ promote_alloca,
+ prt_strict_null,
+ r128_a16,
+ s_memrealtime,
+ s_memtime_inst,
+ scalar_atomics,
+ scalar_flat_scratch_insts,
+ scalar_stores,
+ sdwa,
+ sdwa_mav,
+ sdwa_omod,
+ sdwa_out_mods_vopc,
+ sdwa_scalar,
+ sdwa_sdst,
+ sea_islands,
+ sgpr_init_bug,
+ shader_cycles_register,
+ si_scheduler,
+ smem_to_vector_write_hazard,
+ southern_islands,
+ sramecc,
+ sramecc_support,
+ tgsplit,
+ trap_handler,
+ trig_reduced_range,
+ true16,
+ unaligned_access_mode,
+ unaligned_buffer_access,
+ unaligned_ds_access,
+ unaligned_scratch_access,
+ unpacked_d16_vmem,
+ unsafe_ds_offset_folding,
+ user_sgpr_init16_bug,
+ valu_trans_use_hazard,
+ vcmpx_exec_war_hazard,
+ vcmpx_permlane_hazard,
+ vgpr_index_mode,
+ vmem_to_scalar_write_hazard,
+ volcanic_islands,
+ vop3_literal,
+ vop3p,
+ vopd,
+ vscnt,
+ wavefrontsize16,
+ wavefrontsize32,
+ wavefrontsize64,
+ xnack,
+ xnack_support,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"16_bit_insts")] = .{
+ .llvm_name = "16-bit-insts",
+ .description = "Has i16/f16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.a16)] = .{
+ .llvm_name = "a16",
+ .description = "Support A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.add_no_carry_insts)] = .{
+ .llvm_name = "add-no-carry-insts",
+ .description = "Have VALU add/sub instructions without carry out",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aperture_regs)] = .{
+ .llvm_name = "aperture-regs",
+ .description = "Has Memory Aperture Base and Size Registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.architected_flat_scratch)] = .{
+ .llvm_name = "architected-flat-scratch",
+ .description = "Flat Scratch register is a readonly SPI initialized architected register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.architected_sgprs)] = .{
+ .llvm_name = "architected-sgprs",
+ .description = "Enable the architected SGPRs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_insts)] = .{
+ .llvm_name = "atomic-buffer-global-pk-add-f16-insts",
+ .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that can return original value",
+ .dependencies = featureSet(&[_]Feature{
+ .flat_global_insts,
+ }),
+ };
+ result[@intFromEnum(Feature.atomic_buffer_global_pk_add_f16_no_rtn_insts)] = .{
+ .llvm_name = "atomic-buffer-global-pk-add-f16-no-rtn-insts",
+ .description = "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that don't return original value",
+ .dependencies = featureSet(&[_]Feature{
+ .flat_global_insts,
+ }),
+ };
+ result[@intFromEnum(Feature.atomic_ds_pk_add_16_insts)] = .{
+ .llvm_name = "atomic-ds-pk-add-16-insts",
+ .description = "Has ds_pk_add_bf16, ds_pk_add_f16, ds_pk_add_rtn_bf16, ds_pk_add_rtn_f16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.atomic_fadd_no_rtn_insts)] = .{
+ .llvm_name = "atomic-fadd-no-rtn-insts",
+ .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that don't return original value",
+ .dependencies = featureSet(&[_]Feature{
+ .flat_global_insts,
+ }),
+ };
+ result[@intFromEnum(Feature.atomic_fadd_rtn_insts)] = .{
+ .llvm_name = "atomic-fadd-rtn-insts",
+ .description = "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that return original value",
+ .dependencies = featureSet(&[_]Feature{
+ .flat_global_insts,
+ }),
+ };
+ result[@intFromEnum(Feature.atomic_flat_pk_add_16_insts)] = .{
+ .llvm_name = "atomic-flat-pk-add-16-insts",
+ .description = "Has flat_atomic_pk_add_f16 and flat_atomic_pk_add_bf16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.atomic_global_pk_add_bf16_inst)] = .{
+ .llvm_name = "atomic-global-pk-add-bf16-inst",
+ .description = "Has global_atomic_pk_add_bf16 instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .flat_global_insts,
+ }),
+ };
+ result[@intFromEnum(Feature.auto_waitcnt_before_barrier)] = .{
+ .llvm_name = "auto-waitcnt-before-barrier",
+ .description = "Hardware automatically inserts waitcnt before barrier",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.back_off_barrier)] = .{
+ .llvm_name = "back-off-barrier",
+ .description = "Hardware supports backing off s_barrier if an exception occurs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ci_insts)] = .{
+ .llvm_name = "ci-insts",
+ .description = "Additional instructions for CI+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cumode)] = .{
+ .llvm_name = "cumode",
+ .description = "Enable CU wavefront execution mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dl_insts)] = .{
+ .llvm_name = "dl-insts",
+ .description = "Has v_fmac_f32 and v_xnor_b32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot10_insts)] = .{
+ .llvm_name = "dot10-insts",
+ .description = "Has v_dot2_f32_f16 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot1_insts)] = .{
+ .llvm_name = "dot1-insts",
+ .description = "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot2_insts)] = .{
+ .llvm_name = "dot2-insts",
+ .description = "Has v_dot2_i32_i16, v_dot2_u32_u16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot3_insts)] = .{
+ .llvm_name = "dot3-insts",
+ .description = "Has v_dot8c_i32_i4 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot4_insts)] = .{
+ .llvm_name = "dot4-insts",
+ .description = "Has v_dot2c_i32_i16 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot5_insts)] = .{
+ .llvm_name = "dot5-insts",
+ .description = "Has v_dot2c_f32_f16 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot6_insts)] = .{
+ .llvm_name = "dot6-insts",
+ .description = "Has v_dot4c_i32_i8 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot7_insts)] = .{
+ .llvm_name = "dot7-insts",
+ .description = "Has v_dot4_u32_u8, v_dot8_u32_u4 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot8_insts)] = .{
+ .llvm_name = "dot8-insts",
+ .description = "Has v_dot4_i32_iu8, v_dot8_i32_iu4 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dot9_insts)] = .{
+ .llvm_name = "dot9-insts",
+ .description = "Has v_dot2_f16_f16, v_dot2_bf16_bf16, v_dot2_f32_bf16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dpp)] = .{
+ .llvm_name = "dpp",
+ .description = "Support DPP (Data Parallel Primitives) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dpp8)] = .{
+ .llvm_name = "dpp8",
+ .description = "Support DPP8 (Data Parallel Primitives) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dpp_64bit)] = .{
+ .llvm_name = "dpp-64bit",
+ .description = "Support DPP (Data Parallel Primitives) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ds128)] = .{
+ .llvm_name = "enable-ds128",
+ .description = "Use ds_{read|write}_b128",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ds_src2_insts)] = .{
+ .llvm_name = "ds-src2-insts",
+ .description = "Has ds_*_src2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.extended_image_insts)] = .{
+ .llvm_name = "extended-image-insts",
+ .description = "Support mips != 0, lod != 0, gather4, and get_lod",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_denormal_f32)] = .{
+ .llvm_name = "fast-denormal-f32",
+ .description = "Enabling denormals does not cause f32 instructions to run at f64 rates",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_fmaf)] = .{
+ .llvm_name = "fast-fmaf",
+ .description = "Assuming f32 fma is at least as fast as mul + add",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_address_space)] = .{
+ .llvm_name = "flat-address-space",
+ .description = "Support flat address space",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_atomic_fadd_f32_inst)] = .{
+ .llvm_name = "flat-atomic-fadd-f32-inst",
+ .description = "Has flat_atomic_add_f32 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_for_global)] = .{
+ .llvm_name = "flat-for-global",
+ .description = "Force to generate flat instruction for global",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_global_insts)] = .{
+ .llvm_name = "flat-global-insts",
+ .description = "Have global_* flat memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_inst_offsets)] = .{
+ .llvm_name = "flat-inst-offsets",
+ .description = "Flat instructions have immediate offset addressing mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_scratch)] = .{
+ .llvm_name = "enable-flat-scratch",
+ .description = "Use scratch_* flat memory instructions to access scratch",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_scratch_insts)] = .{
+ .llvm_name = "flat-scratch-insts",
+ .description = "Have scratch_* flat memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.flat_segment_offset_bug)] = .{
+ .llvm_name = "flat-segment-offset-bug",
+ .description = "GFX10 bug where inst_offset is ignored when flat instructions access global memory",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fma_mix_insts)] = .{
+ .llvm_name = "fma-mix-insts",
+ .description = "Has v_fma_mix_f32, v_fma_mixlo_f16, v_fma_mixhi_f16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fmacf64_inst)] = .{
+ .llvm_name = "fmacf64-inst",
+ .description = "Has v_fmac_f64 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fmaf)] = .{
+ .llvm_name = "fmaf",
+ .description = "Enable single precision FMA (not as fast as mul+add, but fused)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.force_store_sc0_sc1)] = .{
+ .llvm_name = "force-store-sc0-sc1",
+ .description = "Has SC0 and SC1 on stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp64)] = .{
+ .llvm_name = "fp64",
+ .description = "Enable double precision operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp8_insts)] = .{
+ .llvm_name = "fp8-insts",
+ .description = "Has fp8 and bf8 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.full_rate_64_ops)] = .{
+ .llvm_name = "full-rate-64-ops",
+ .description = "Most fp64 instructions are full rate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.g16)] = .{
+ .llvm_name = "g16",
+ .description = "Support G16 for 16-bit gradient image operands",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gcn3_encoding)] = .{
+ .llvm_name = "gcn3-encoding",
+ .description = "Encoding format for VI",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.get_wave_id_inst)] = .{
+ .llvm_name = "get-wave-id-inst",
+ .description = "Has s_get_waveid_in_workgroup instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx10)] = .{
+ .llvm_name = "gfx10",
+ .description = "GFX10 GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .@"16_bit_insts",
+ .a16,
+ .add_no_carry_insts,
+ .aperture_regs,
+ .ci_insts,
+ .dpp,
+ .dpp8,
+ .extended_image_insts,
+ .fast_denormal_f32,
+ .fast_fmaf,
+ .flat_address_space,
+ .flat_global_insts,
+ .flat_inst_offsets,
+ .flat_scratch_insts,
+ .fma_mix_insts,
+ .fp64,
+ .g16,
+ .gfx10_insts,
+ .gfx8_insts,
+ .gfx9_insts,
+ .image_insts,
+ .int_clamp_insts,
+ .inv_2pi_inline_imm,
+ .localmemorysize65536,
+ .mimg_r128,
+ .movrel,
+ .no_data_dep_hazard,
+ .no_sdst_cmpx,
+ .pk_fmac_f16_inst,
+ .s_memrealtime,
+ .s_memtime_inst,
+ .sdwa,
+ .sdwa_omod,
+ .sdwa_scalar,
+ .sdwa_sdst,
+ .unaligned_buffer_access,
+ .unaligned_ds_access,
+ .vop3_literal,
+ .vop3p,
+ .vscnt,
+ }),
+ };
+ result[@intFromEnum(Feature.gfx10_3_insts)] = .{
+ .llvm_name = "gfx10-3-insts",
+ .description = "Additional instructions for GFX10.3",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx10_a_encoding)] = .{
+ .llvm_name = "gfx10_a-encoding",
+ .description = "Has BVH ray tracing instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx10_b_encoding)] = .{
+ .llvm_name = "gfx10_b-encoding",
+ .description = "Encoding format GFX10_B",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx10_insts)] = .{
+ .llvm_name = "gfx10-insts",
+ .description = "Additional instructions for GFX10+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx11)] = .{
+ .llvm_name = "gfx11",
+ .description = "GFX11 GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .@"16_bit_insts",
+ .a16,
+ .add_no_carry_insts,
+ .aperture_regs,
+ .ci_insts,
+ .dpp,
+ .dpp8,
+ .extended_image_insts,
+ .fast_denormal_f32,
+ .fast_fmaf,
+ .flat_address_space,
+ .flat_global_insts,
+ .flat_inst_offsets,
+ .flat_scratch_insts,
+ .fma_mix_insts,
+ .fp64,
+ .g16,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .gfx10_insts,
+ .gfx11_insts,
+ .gfx8_insts,
+ .gfx9_insts,
+ .int_clamp_insts,
+ .inv_2pi_inline_imm,
+ .localmemorysize65536,
+ .mimg_r128,
+ .movrel,
+ .no_data_dep_hazard,
+ .no_sdst_cmpx,
+ .pk_fmac_f16_inst,
+ .true16,
+ .unaligned_buffer_access,
+ .unaligned_ds_access,
+ .vop3_literal,
+ .vop3p,
+ .vopd,
+ .vscnt,
+ }),
+ };
+ result[@intFromEnum(Feature.gfx11_full_vgprs)] = .{
+ .llvm_name = "gfx11-full-vgprs",
+ .description = "GFX11 with 50% more physical VGPRs and 50% larger allocation granule than GFX10",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx11_insts)] = .{
+ .llvm_name = "gfx11-insts",
+ .description = "Additional instructions for GFX11+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx7_gfx8_gfx9_insts)] = .{
+ .llvm_name = "gfx7-gfx8-gfx9-insts",
+ .description = "Instructions shared in GFX7, GFX8, GFX9",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx8_insts)] = .{
+ .llvm_name = "gfx8-insts",
+ .description = "Additional instructions for GFX8+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx9)] = .{
+ .llvm_name = "gfx9",
+ .description = "GFX9 GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .@"16_bit_insts",
+ .a16,
+ .add_no_carry_insts,
+ .aperture_regs,
+ .ci_insts,
+ .dpp,
+ .fast_denormal_f32,
+ .fast_fmaf,
+ .flat_address_space,
+ .flat_global_insts,
+ .flat_inst_offsets,
+ .flat_scratch_insts,
+ .fp64,
+ .gcn3_encoding,
+ .gfx7_gfx8_gfx9_insts,
+ .gfx8_insts,
+ .gfx9_insts,
+ .int_clamp_insts,
+ .inv_2pi_inline_imm,
+ .localmemorysize65536,
+ .negative_scratch_offset_bug,
+ .r128_a16,
+ .s_memrealtime,
+ .s_memtime_inst,
+ .scalar_atomics,
+ .scalar_flat_scratch_insts,
+ .scalar_stores,
+ .sdwa,
+ .sdwa_omod,
+ .sdwa_scalar,
+ .sdwa_sdst,
+ .unaligned_buffer_access,
+ .unaligned_ds_access,
+ .vgpr_index_mode,
+ .vop3p,
+ .wavefrontsize64,
+ .xnack_support,
+ }),
+ };
+ result[@intFromEnum(Feature.gfx90a_insts)] = .{
+ .llvm_name = "gfx90a-insts",
+ .description = "Additional instructions for GFX90A+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx940_insts)] = .{
+ .llvm_name = "gfx940-insts",
+ .description = "Additional instructions for GFX940+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfx9_insts)] = .{
+ .llvm_name = "gfx9-insts",
+ .description = "Additional instructions for GFX9+",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.half_rate_64_ops)] = .{
+ .llvm_name = "half-rate-64-ops",
+ .description = "Most fp64 instructions are half rate instead of quarter",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.image_gather4_d16_bug)] = .{
+ .llvm_name = "image-gather4-d16-bug",
+ .description = "Image Gather4 D16 hardware bug",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.image_insts)] = .{
+ .llvm_name = "image-insts",
+ .description = "Support image instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.image_store_d16_bug)] = .{
+ .llvm_name = "image-store-d16-bug",
+ .description = "Image Store D16 hardware bug",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.inst_fwd_prefetch_bug)] = .{
+ .llvm_name = "inst-fwd-prefetch-bug",
+ .description = "S_INST_PREFETCH instruction causes shader to hang",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.int_clamp_insts)] = .{
+ .llvm_name = "int-clamp-insts",
+ .description = "Support clamp for integer destination",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.inv_2pi_inline_imm)] = .{
+ .llvm_name = "inv-2pi-inline-imm",
+ .description = "Has 1 / (2 * pi) as inline immediate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lds_branch_vmem_war_hazard)] = .{
+ .llvm_name = "lds-branch-vmem-war-hazard",
+ .description = "Switching between LDS and VMEM-tex not waiting VM_VSRC=0",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lds_misaligned_bug)] = .{
+ .llvm_name = "lds-misaligned-bug",
+ .description = "Some GFX10 bug with multi-dword LDS and flat access that is not naturally aligned in WGP mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ldsbankcount16)] = .{
+ .llvm_name = "ldsbankcount16",
+ .description = "The number of LDS banks per compute unit.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ldsbankcount32)] = .{
+ .llvm_name = "ldsbankcount32",
+ .description = "The number of LDS banks per compute unit.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.load_store_opt)] = .{
+ .llvm_name = "load-store-opt",
+ .description = "Enable SI load/store optimizer pass",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.localmemorysize32768)] = .{
+ .llvm_name = "localmemorysize32768",
+ .description = "The size of local memory in bytes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.localmemorysize65536)] = .{
+ .llvm_name = "localmemorysize65536",
+ .description = "The size of local memory in bytes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mad_intra_fwd_bug)] = .{
+ .llvm_name = "mad-intra-fwd-bug",
+ .description = "MAD_U64/I64 intra instruction forwarding bug",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mad_mac_f32_insts)] = .{
+ .llvm_name = "mad-mac-f32-insts",
+ .description = "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mad_mix_insts)] = .{
+ .llvm_name = "mad-mix-insts",
+ .description = "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mai_insts)] = .{
+ .llvm_name = "mai-insts",
+ .description = "Has mAI instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.max_private_element_size_16)] = .{
+ .llvm_name = "max-private-element-size-16",
+ .description = "Maximum private access size may be 16",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.max_private_element_size_4)] = .{
+ .llvm_name = "max-private-element-size-4",
+ .description = "Maximum private access size may be 4",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.max_private_element_size_8)] = .{
+ .llvm_name = "max-private-element-size-8",
+ .description = "Maximum private access size may be 8",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mfma_inline_literal_bug)] = .{
+ .llvm_name = "mfma-inline-literal-bug",
+ .description = "MFMA cannot use inline literal as SrcC",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mimg_r128)] = .{
+ .llvm_name = "mimg-r128",
+ .description = "Support 128-bit texture resources",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.movrel)] = .{
+ .llvm_name = "movrel",
+ .description = "Has v_movrel*_b32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.negative_scratch_offset_bug)] = .{
+ .llvm_name = "negative-scratch-offset-bug",
+ .description = "Negative immediate offsets in scratch instructions with an SGPR offset page fault on GFX9",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.negative_unaligned_scratch_offset_bug)] = .{
+ .llvm_name = "negative-unaligned-scratch-offset-bug",
+ .description = "Scratch instructions with a VGPR offset and a negative immediate offset that is not a multiple of 4 read wrong memory on GFX10",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_data_dep_hazard)] = .{
+ .llvm_name = "no-data-dep-hazard",
+ .description = "Does not need SW waitstates",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_sdst_cmpx)] = .{
+ .llvm_name = "no-sdst-cmpx",
+ .description = "V_CMPX does not write VCC/SGPR in addition to EXEC",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nsa_clause_bug)] = .{
+ .llvm_name = "nsa-clause-bug",
+ .description = "MIMG-NSA in a hard clause has unpredictable results on GFX10.1",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nsa_encoding)] = .{
+ .llvm_name = "nsa-encoding",
+ .description = "Support NSA encoding for image instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nsa_to_vmem_bug)] = .{
+ .llvm_name = "nsa-to-vmem-bug",
+ .description = "MIMG-NSA followed by VMEM fail if EXEC_LO or EXEC_HI equals zero",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.offset_3f_bug)] = .{
+ .llvm_name = "offset-3f-bug",
+ .description = "Branch offset of 3f hardware bug",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.packed_fp32_ops)] = .{
+ .llvm_name = "packed-fp32-ops",
+ .description = "Support packed fp32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.packed_tid)] = .{
+ .llvm_name = "packed-tid",
+ .description = "Workitem IDs are packed into v0 at kernel launch",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.partial_nsa_encoding)] = .{
+ .llvm_name = "partial-nsa-encoding",
+ .description = "Support partial NSA encoding for image instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pk_fmac_f16_inst)] = .{
+ .llvm_name = "pk-fmac-f16-inst",
+ .description = "Has v_pk_fmac_f16 instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.promote_alloca)] = .{
+ .llvm_name = "promote-alloca",
+ .description = "Enable promote alloca pass",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prt_strict_null)] = .{
+ .llvm_name = "enable-prt-strict-null",
+ .description = "Enable zeroing of result registers for sparse texture fetches",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.r128_a16)] = .{
+ .llvm_name = "r128-a16",
+ .description = "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.s_memrealtime)] = .{
+ .llvm_name = "s-memrealtime",
+ .description = "Has s_memrealtime instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.s_memtime_inst)] = .{
+ .llvm_name = "s-memtime-inst",
+ .description = "Has s_memtime instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.scalar_atomics)] = .{
+ .llvm_name = "scalar-atomics",
+ .description = "Has atomic scalar memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.scalar_flat_scratch_insts)] = .{
+ .llvm_name = "scalar-flat-scratch-insts",
+ .description = "Have s_scratch_* flat memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.scalar_stores)] = .{
+ .llvm_name = "scalar-stores",
+ .description = "Has store scalar memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa)] = .{
+ .llvm_name = "sdwa",
+ .description = "Support SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa_mav)] = .{
+ .llvm_name = "sdwa-mav",
+ .description = "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa_omod)] = .{
+ .llvm_name = "sdwa-omod",
+ .description = "Support OMod with SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa_out_mods_vopc)] = .{
+ .llvm_name = "sdwa-out-mods-vopc",
+ .description = "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa_scalar)] = .{
+ .llvm_name = "sdwa-scalar",
+ .description = "Support scalar register with SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sdwa_sdst)] = .{
+ .llvm_name = "sdwa-sdst",
+ .description = "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sea_islands)] = .{
+ .llvm_name = "sea-islands",
+ .description = "SEA_ISLANDS GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .ci_insts,
+ .ds_src2_insts,
+ .extended_image_insts,
+ .flat_address_space,
+ .fp64,
+ .gfx7_gfx8_gfx9_insts,
+ .image_insts,
+ .localmemorysize65536,
+ .mad_mac_f32_insts,
+ .mimg_r128,
+ .movrel,
+ .s_memtime_inst,
+ .trig_reduced_range,
+ .unaligned_buffer_access,
+ .wavefrontsize64,
+ }),
+ };
+ result[@intFromEnum(Feature.sgpr_init_bug)] = .{
+ .llvm_name = "sgpr-init-bug",
+ .description = "VI SGPR initialization bug requiring a fixed SGPR allocation size",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.shader_cycles_register)] = .{
+ .llvm_name = "shader-cycles-register",
+ .description = "Has SHADER_CYCLES hardware register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.si_scheduler)] = .{
+ .llvm_name = "si-scheduler",
+ .description = "Enable SI Machine Scheduler",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.smem_to_vector_write_hazard)] = .{
+ .llvm_name = "smem-to-vector-write-hazard",
+ .description = "s_load_dword followed by v_cmp page faults",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.southern_islands)] = .{
+ .llvm_name = "southern-islands",
+ .description = "SOUTHERN_ISLANDS GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .fp64,
+ .image_insts,
+ .ldsbankcount32,
+ .localmemorysize32768,
+ .mad_mac_f32_insts,
+ .mimg_r128,
+ .movrel,
+ .s_memtime_inst,
+ .trig_reduced_range,
+ .wavefrontsize64,
+ }),
+ };
+ result[@intFromEnum(Feature.sramecc)] = .{
+ .llvm_name = "sramecc",
+ .description = "Enable SRAMECC",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sramecc_support)] = .{
+ .llvm_name = "sramecc-support",
+ .description = "Hardware supports SRAMECC",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tgsplit)] = .{
+ .llvm_name = "tgsplit",
+ .description = "Enable threadgroup split execution",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.trap_handler)] = .{
+ .llvm_name = "trap-handler",
+ .description = "Trap handler support",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.trig_reduced_range)] = .{
+ .llvm_name = "trig-reduced-range",
+ .description = "Requires use of fract on arguments to trig instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.true16)] = .{
+ .llvm_name = "true16",
+ .description = "True 16-bit operand instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_access_mode)] = .{
+ .llvm_name = "unaligned-access-mode",
+ .description = "Enable unaligned global, local and region loads and stores if the hardware supports it",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_buffer_access)] = .{
+ .llvm_name = "unaligned-buffer-access",
+ .description = "Hardware supports unaligned global loads and stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_ds_access)] = .{
+ .llvm_name = "unaligned-ds-access",
+ .description = "Hardware supports unaligned local and region loads and stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_scratch_access)] = .{
+ .llvm_name = "unaligned-scratch-access",
+ .description = "Support unaligned scratch loads and stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unpacked_d16_vmem)] = .{
+ .llvm_name = "unpacked-d16-vmem",
+ .description = "Has unpacked d16 vmem instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unsafe_ds_offset_folding)] = .{
+ .llvm_name = "unsafe-ds-offset-folding",
+ .description = "Force using DS instruction immediate offsets on SI",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.user_sgpr_init16_bug)] = .{
+ .llvm_name = "user-sgpr-init16-bug",
+ .description = "Bug requiring at least 16 user+system SGPRs to be enabled",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.valu_trans_use_hazard)] = .{
+ .llvm_name = "valu-trans-use-hazard",
+ .description = "Hazard when TRANS instructions are closely followed by a use of the result",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vcmpx_exec_war_hazard)] = .{
+ .llvm_name = "vcmpx-exec-war-hazard",
+ .description = "V_CMPX WAR hazard on EXEC (V_CMPX issue ONLY)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vcmpx_permlane_hazard)] = .{
+ .llvm_name = "vcmpx-permlane-hazard",
+ .description = "TODO: describe me",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vgpr_index_mode)] = .{
+ .llvm_name = "vgpr-index-mode",
+ .description = "Has VGPR mode register indexing",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vmem_to_scalar_write_hazard)] = .{
+ .llvm_name = "vmem-to-scalar-write-hazard",
+ .description = "VMEM instruction followed by scalar writing to EXEC mask, M0 or SGPR leads to incorrect execution.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.volcanic_islands)] = .{
+ .llvm_name = "volcanic-islands",
+ .description = "VOLCANIC_ISLANDS GPU generation",
+ .dependencies = featureSet(&[_]Feature{
+ .@"16_bit_insts",
+ .ci_insts,
+ .dpp,
+ .ds_src2_insts,
+ .extended_image_insts,
+ .fast_denormal_f32,
+ .flat_address_space,
+ .fp64,
+ .gcn3_encoding,
+ .gfx7_gfx8_gfx9_insts,
+ .gfx8_insts,
+ .image_insts,
+ .int_clamp_insts,
+ .inv_2pi_inline_imm,
+ .localmemorysize65536,
+ .mad_mac_f32_insts,
+ .mimg_r128,
+ .movrel,
+ .s_memrealtime,
+ .s_memtime_inst,
+ .scalar_stores,
+ .sdwa,
+ .sdwa_mav,
+ .sdwa_out_mods_vopc,
+ .trig_reduced_range,
+ .unaligned_buffer_access,
+ .vgpr_index_mode,
+ .wavefrontsize64,
+ }),
+ };
+ result[@intFromEnum(Feature.vop3_literal)] = .{
+ .llvm_name = "vop3-literal",
+ .description = "Can use one literal in VOP3",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vop3p)] = .{
+ .llvm_name = "vop3p",
+ .description = "Has VOP3P packed instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vopd)] = .{
+ .llvm_name = "vopd",
+ .description = "Has VOPD dual issue wave32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vscnt)] = .{
+ .llvm_name = "vscnt",
+ .description = "Has separate store vscnt counter",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.wavefrontsize16)] = .{
+ .llvm_name = "wavefrontsize16",
+ .description = "The number of threads per wavefront",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.wavefrontsize32)] = .{
+ .llvm_name = "wavefrontsize32",
+ .description = "The number of threads per wavefront",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.wavefrontsize64)] = .{
+ .llvm_name = "wavefrontsize64",
+ .description = "The number of threads per wavefront",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xnack)] = .{
+ .llvm_name = "xnack",
+ .description = "Enable XNACK support",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xnack_support)] = .{
+ .llvm_name = "xnack-support",
+ .description = "Hardware supports XNACK",
+ .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 bonaire = CpuModel{
+ .name = "bonaire",
+ .llvm_name = "bonaire",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const carrizo = CpuModel{
+ .name = "carrizo",
+ .llvm_name = "carrizo",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ .xnack_support,
+ }),
+ };
+ pub const fiji = CpuModel{
+ .name = "fiji",
+ .llvm_name = "fiji",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .wavefrontsize64,
+ }),
+ };
+ pub const generic_hsa = CpuModel{
+ .name = "generic_hsa",
+ .llvm_name = "generic-hsa",
+ .features = featureSet(&[_]Feature{
+ .flat_address_space,
+ .wavefrontsize64,
+ }),
+ };
+ pub const gfx1010 = CpuModel{
+ .name = "gfx1010",
+ .llvm_name = "gfx1010",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .ds_src2_insts,
+ .flat_segment_offset_bug,
+ .get_wave_id_inst,
+ .gfx10,
+ .inst_fwd_prefetch_bug,
+ .lds_branch_vmem_war_hazard,
+ .lds_misaligned_bug,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .negative_unaligned_scratch_offset_bug,
+ .nsa_clause_bug,
+ .nsa_encoding,
+ .nsa_to_vmem_bug,
+ .offset_3f_bug,
+ .scalar_atomics,
+ .scalar_flat_scratch_insts,
+ .scalar_stores,
+ .smem_to_vector_write_hazard,
+ .vcmpx_exec_war_hazard,
+ .vcmpx_permlane_hazard,
+ .vmem_to_scalar_write_hazard,
+ .wavefrontsize32,
+ .xnack_support,
+ }),
+ };
+ pub const gfx1011 = CpuModel{
+ .name = "gfx1011",
+ .llvm_name = "gfx1011",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .ds_src2_insts,
+ .flat_segment_offset_bug,
+ .get_wave_id_inst,
+ .gfx10,
+ .inst_fwd_prefetch_bug,
+ .lds_branch_vmem_war_hazard,
+ .lds_misaligned_bug,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .negative_unaligned_scratch_offset_bug,
+ .nsa_clause_bug,
+ .nsa_encoding,
+ .nsa_to_vmem_bug,
+ .offset_3f_bug,
+ .scalar_atomics,
+ .scalar_flat_scratch_insts,
+ .scalar_stores,
+ .smem_to_vector_write_hazard,
+ .vcmpx_exec_war_hazard,
+ .vcmpx_permlane_hazard,
+ .vmem_to_scalar_write_hazard,
+ .wavefrontsize32,
+ .xnack_support,
+ }),
+ };
+ pub const gfx1012 = CpuModel{
+ .name = "gfx1012",
+ .llvm_name = "gfx1012",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .ds_src2_insts,
+ .flat_segment_offset_bug,
+ .get_wave_id_inst,
+ .gfx10,
+ .inst_fwd_prefetch_bug,
+ .lds_branch_vmem_war_hazard,
+ .lds_misaligned_bug,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .negative_unaligned_scratch_offset_bug,
+ .nsa_clause_bug,
+ .nsa_encoding,
+ .nsa_to_vmem_bug,
+ .offset_3f_bug,
+ .scalar_atomics,
+ .scalar_flat_scratch_insts,
+ .scalar_stores,
+ .smem_to_vector_write_hazard,
+ .vcmpx_exec_war_hazard,
+ .vcmpx_permlane_hazard,
+ .vmem_to_scalar_write_hazard,
+ .wavefrontsize32,
+ .xnack_support,
+ }),
+ };
+ pub const gfx1013 = CpuModel{
+ .name = "gfx1013",
+ .llvm_name = "gfx1013",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .ds_src2_insts,
+ .flat_segment_offset_bug,
+ .get_wave_id_inst,
+ .gfx10,
+ .gfx10_a_encoding,
+ .inst_fwd_prefetch_bug,
+ .lds_branch_vmem_war_hazard,
+ .lds_misaligned_bug,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .negative_unaligned_scratch_offset_bug,
+ .nsa_clause_bug,
+ .nsa_encoding,
+ .nsa_to_vmem_bug,
+ .offset_3f_bug,
+ .scalar_atomics,
+ .scalar_flat_scratch_insts,
+ .scalar_stores,
+ .smem_to_vector_write_hazard,
+ .vcmpx_exec_war_hazard,
+ .vcmpx_permlane_hazard,
+ .vmem_to_scalar_write_hazard,
+ .wavefrontsize32,
+ .xnack_support,
+ }),
+ };
+ pub const gfx1030 = CpuModel{
+ .name = "gfx1030",
+ .llvm_name = "gfx1030",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1031 = CpuModel{
+ .name = "gfx1031",
+ .llvm_name = "gfx1031",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1032 = CpuModel{
+ .name = "gfx1032",
+ .llvm_name = "gfx1032",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1033 = CpuModel{
+ .name = "gfx1033",
+ .llvm_name = "gfx1033",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1034 = CpuModel{
+ .name = "gfx1034",
+ .llvm_name = "gfx1034",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1035 = CpuModel{
+ .name = "gfx1035",
+ .llvm_name = "gfx1035",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1036 = CpuModel{
+ .name = "gfx1036",
+ .llvm_name = "gfx1036",
+ .features = featureSet(&[_]Feature{
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .gfx10,
+ .gfx10_3_insts,
+ .gfx10_a_encoding,
+ .gfx10_b_encoding,
+ .ldsbankcount32,
+ .nsa_encoding,
+ .shader_cycles_register,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1100 = CpuModel{
+ .name = "gfx1100",
+ .llvm_name = "gfx1100",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .gfx11_full_vgprs,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .user_sgpr_init16_bug,
+ .valu_trans_use_hazard,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1101 = CpuModel{
+ .name = "gfx1101",
+ .llvm_name = "gfx1101",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .gfx11_full_vgprs,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .valu_trans_use_hazard,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1102 = CpuModel{
+ .name = "gfx1102",
+ .llvm_name = "gfx1102",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .user_sgpr_init16_bug,
+ .valu_trans_use_hazard,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1103 = CpuModel{
+ .name = "gfx1103",
+ .llvm_name = "gfx1103",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .valu_trans_use_hazard,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1150 = CpuModel{
+ .name = "gfx1150",
+ .llvm_name = "gfx1150",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx1151 = CpuModel{
+ .name = "gfx1151",
+ .llvm_name = "gfx1151",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot5_insts,
+ .dot7_insts,
+ .dot8_insts,
+ .dot9_insts,
+ .flat_atomic_fadd_f32_inst,
+ .gfx11,
+ .gfx11_full_vgprs,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_intra_fwd_bug,
+ .nsa_encoding,
+ .packed_tid,
+ .partial_nsa_encoding,
+ .shader_cycles_register,
+ .vcmpx_permlane_hazard,
+ .wavefrontsize32,
+ }),
+ };
+ pub const gfx600 = CpuModel{
+ .name = "gfx600",
+ .llvm_name = "gfx600",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .southern_islands,
+ }),
+ };
+ pub const gfx601 = CpuModel{
+ .name = "gfx601",
+ .llvm_name = "gfx601",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+ pub const gfx602 = CpuModel{
+ .name = "gfx602",
+ .llvm_name = "gfx602",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+ pub const gfx700 = CpuModel{
+ .name = "gfx700",
+ .llvm_name = "gfx700",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const gfx701 = CpuModel{
+ .name = "gfx701",
+ .llvm_name = "gfx701",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const gfx702 = CpuModel{
+ .name = "gfx702",
+ .llvm_name = "gfx702",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .ldsbankcount16,
+ .sea_islands,
+ }),
+ };
+ pub const gfx703 = CpuModel{
+ .name = "gfx703",
+ .llvm_name = "gfx703",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount16,
+ .sea_islands,
+ }),
+ };
+ pub const gfx704 = CpuModel{
+ .name = "gfx704",
+ .llvm_name = "gfx704",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const gfx705 = CpuModel{
+ .name = "gfx705",
+ .llvm_name = "gfx705",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount16,
+ .sea_islands,
+ }),
+ };
+ pub const gfx801 = CpuModel{
+ .name = "gfx801",
+ .llvm_name = "gfx801",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ .xnack_support,
+ }),
+ };
+ pub const gfx802 = CpuModel{
+ .name = "gfx802",
+ .llvm_name = "gfx802",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sgpr_init_bug,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const gfx803 = CpuModel{
+ .name = "gfx803",
+ .llvm_name = "gfx803",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const gfx805 = CpuModel{
+ .name = "gfx805",
+ .llvm_name = "gfx805",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sgpr_init_bug,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const gfx810 = CpuModel{
+ .name = "gfx810",
+ .llvm_name = "gfx810",
+ .features = featureSet(&[_]Feature{
+ .image_gather4_d16_bug,
+ .image_store_d16_bug,
+ .ldsbankcount16,
+ .volcanic_islands,
+ .xnack_support,
+ }),
+ };
+ pub const gfx900 = CpuModel{
+ .name = "gfx900",
+ .llvm_name = "gfx900",
+ .features = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .gfx9,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mad_mix_insts,
+ }),
+ };
+ pub const gfx902 = CpuModel{
+ .name = "gfx902",
+ .llvm_name = "gfx902",
+ .features = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .gfx9,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mad_mix_insts,
+ }),
+ };
+ pub const gfx904 = CpuModel{
+ .name = "gfx904",
+ .llvm_name = "gfx904",
+ .features = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .fma_mix_insts,
+ .gfx9,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ }),
+ };
+ pub const gfx906 = CpuModel{
+ .name = "gfx906",
+ .llvm_name = "gfx906",
+ .features = featureSet(&[_]Feature{
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot7_insts,
+ .ds_src2_insts,
+ .extended_image_insts,
+ .fma_mix_insts,
+ .gfx9,
+ .half_rate_64_ops,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .sramecc_support,
+ }),
+ };
+ pub const gfx908 = CpuModel{
+ .name = "gfx908",
+ .llvm_name = "gfx908",
+ .features = featureSet(&[_]Feature{
+ .atomic_buffer_global_pk_add_f16_no_rtn_insts,
+ .atomic_fadd_no_rtn_insts,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot3_insts,
+ .dot4_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .ds_src2_insts,
+ .extended_image_insts,
+ .fma_mix_insts,
+ .gfx9,
+ .half_rate_64_ops,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mai_insts,
+ .mfma_inline_literal_bug,
+ .pk_fmac_f16_inst,
+ .sramecc_support,
+ }),
+ };
+ pub const gfx909 = CpuModel{
+ .name = "gfx909",
+ .llvm_name = "gfx909",
+ .features = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .gfx9,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mad_mix_insts,
+ }),
+ };
+ pub const gfx90a = CpuModel{
+ .name = "gfx90a",
+ .llvm_name = "gfx90a",
+ .features = featureSet(&[_]Feature{
+ .atomic_buffer_global_pk_add_f16_insts,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot3_insts,
+ .dot4_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .dpp_64bit,
+ .fma_mix_insts,
+ .fmacf64_inst,
+ .full_rate_64_ops,
+ .gfx9,
+ .gfx90a_insts,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mai_insts,
+ .packed_fp32_ops,
+ .packed_tid,
+ .pk_fmac_f16_inst,
+ .sramecc_support,
+ }),
+ };
+ pub const gfx90c = CpuModel{
+ .name = "gfx90c",
+ .llvm_name = "gfx90c",
+ .features = featureSet(&[_]Feature{
+ .ds_src2_insts,
+ .extended_image_insts,
+ .gfx9,
+ .image_gather4_d16_bug,
+ .image_insts,
+ .ldsbankcount32,
+ .mad_mac_f32_insts,
+ .mad_mix_insts,
+ }),
+ };
+ pub const gfx940 = CpuModel{
+ .name = "gfx940",
+ .llvm_name = "gfx940",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_buffer_global_pk_add_f16_insts,
+ .atomic_ds_pk_add_16_insts,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .atomic_flat_pk_add_16_insts,
+ .atomic_global_pk_add_bf16_inst,
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot3_insts,
+ .dot4_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .dpp_64bit,
+ .flat_atomic_fadd_f32_inst,
+ .fma_mix_insts,
+ .fmacf64_inst,
+ .force_store_sc0_sc1,
+ .fp8_insts,
+ .full_rate_64_ops,
+ .gfx9,
+ .gfx90a_insts,
+ .gfx940_insts,
+ .ldsbankcount32,
+ .mai_insts,
+ .packed_fp32_ops,
+ .packed_tid,
+ .pk_fmac_f16_inst,
+ .sramecc_support,
+ }),
+ };
+ pub const gfx941 = CpuModel{
+ .name = "gfx941",
+ .llvm_name = "gfx941",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_buffer_global_pk_add_f16_insts,
+ .atomic_ds_pk_add_16_insts,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .atomic_flat_pk_add_16_insts,
+ .atomic_global_pk_add_bf16_inst,
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot3_insts,
+ .dot4_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .dpp_64bit,
+ .flat_atomic_fadd_f32_inst,
+ .fma_mix_insts,
+ .fmacf64_inst,
+ .force_store_sc0_sc1,
+ .fp8_insts,
+ .full_rate_64_ops,
+ .gfx9,
+ .gfx90a_insts,
+ .gfx940_insts,
+ .ldsbankcount32,
+ .mai_insts,
+ .packed_fp32_ops,
+ .packed_tid,
+ .pk_fmac_f16_inst,
+ .sramecc_support,
+ }),
+ };
+ pub const gfx942 = CpuModel{
+ .name = "gfx942",
+ .llvm_name = "gfx942",
+ .features = featureSet(&[_]Feature{
+ .architected_flat_scratch,
+ .atomic_buffer_global_pk_add_f16_insts,
+ .atomic_ds_pk_add_16_insts,
+ .atomic_fadd_no_rtn_insts,
+ .atomic_fadd_rtn_insts,
+ .atomic_flat_pk_add_16_insts,
+ .atomic_global_pk_add_bf16_inst,
+ .back_off_barrier,
+ .dl_insts,
+ .dot10_insts,
+ .dot1_insts,
+ .dot2_insts,
+ .dot3_insts,
+ .dot4_insts,
+ .dot5_insts,
+ .dot6_insts,
+ .dot7_insts,
+ .dpp_64bit,
+ .flat_atomic_fadd_f32_inst,
+ .fma_mix_insts,
+ .fmacf64_inst,
+ .fp8_insts,
+ .full_rate_64_ops,
+ .gfx9,
+ .gfx90a_insts,
+ .gfx940_insts,
+ .ldsbankcount32,
+ .mai_insts,
+ .packed_fp32_ops,
+ .packed_tid,
+ .pk_fmac_f16_inst,
+ .sramecc_support,
+ }),
+ };
+ pub const hainan = CpuModel{
+ .name = "hainan",
+ .llvm_name = "hainan",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+ pub const hawaii = CpuModel{
+ .name = "hawaii",
+ .llvm_name = "hawaii",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const iceland = CpuModel{
+ .name = "iceland",
+ .llvm_name = "iceland",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sgpr_init_bug,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const kabini = CpuModel{
+ .name = "kabini",
+ .llvm_name = "kabini",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount16,
+ .sea_islands,
+ }),
+ };
+ pub const kaveri = CpuModel{
+ .name = "kaveri",
+ .llvm_name = "kaveri",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sea_islands,
+ }),
+ };
+ pub const mullins = CpuModel{
+ .name = "mullins",
+ .llvm_name = "mullins",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount16,
+ .sea_islands,
+ }),
+ };
+ pub const oland = CpuModel{
+ .name = "oland",
+ .llvm_name = "oland",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+ pub const pitcairn = CpuModel{
+ .name = "pitcairn",
+ .llvm_name = "pitcairn",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+ pub const polaris10 = CpuModel{
+ .name = "polaris10",
+ .llvm_name = "polaris10",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const polaris11 = CpuModel{
+ .name = "polaris11",
+ .llvm_name = "polaris11",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const stoney = CpuModel{
+ .name = "stoney",
+ .llvm_name = "stoney",
+ .features = featureSet(&[_]Feature{
+ .image_gather4_d16_bug,
+ .image_store_d16_bug,
+ .ldsbankcount16,
+ .volcanic_islands,
+ .xnack_support,
+ }),
+ };
+ pub const tahiti = CpuModel{
+ .name = "tahiti",
+ .llvm_name = "tahiti",
+ .features = featureSet(&[_]Feature{
+ .fast_fmaf,
+ .half_rate_64_ops,
+ .southern_islands,
+ }),
+ };
+ pub const tonga = CpuModel{
+ .name = "tonga",
+ .llvm_name = "tonga",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sgpr_init_bug,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const tongapro = CpuModel{
+ .name = "tongapro",
+ .llvm_name = "tongapro",
+ .features = featureSet(&[_]Feature{
+ .ldsbankcount32,
+ .sgpr_init_bug,
+ .unpacked_d16_vmem,
+ .volcanic_islands,
+ }),
+ };
+ pub const verde = CpuModel{
+ .name = "verde",
+ .llvm_name = "verde",
+ .features = featureSet(&[_]Feature{
+ .southern_islands,
+ }),
+ };
+};
diff --git a/lib/std/Target/arc.zig b/lib/std/Target/arc.zig
new file mode 100644
index 0000000000..eff13c6637
--- /dev/null
+++ b/lib/std/Target/arc.zig
@@ -0,0 +1,39 @@
+//! 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 {
+ norm,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.norm)] = .{
+ .llvm_name = "norm",
+ .description = "Enable support for norm instruction.",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+};
diff --git a/lib/std/Target/arm.zig b/lib/std/Target/arm.zig
new file mode 100644
index 0000000000..5245b3357e
--- /dev/null
+++ b/lib/std/Target/arm.zig
@@ -0,0 +1,2604 @@
+//! 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 {
+ @"32bit",
+ @"8msecext",
+ a76,
+ aapcs_frame_chain,
+ aapcs_frame_chain_leaf,
+ aclass,
+ acquire_release,
+ aes,
+ atomics_32,
+ avoid_movs_shop,
+ avoid_partial_cpsr,
+ bf16,
+ big_endian_instructions,
+ cde,
+ cdecp0,
+ cdecp1,
+ cdecp2,
+ cdecp3,
+ cdecp4,
+ cdecp5,
+ cdecp6,
+ cdecp7,
+ cheap_predicable_cpsr,
+ clrbhb,
+ crc,
+ crypto,
+ d32,
+ db,
+ dfb,
+ disable_postra_scheduler,
+ dont_widen_vmovs,
+ dotprod,
+ dsp,
+ execute_only,
+ expand_fp_mlx,
+ exynos,
+ fix_cmse_cve_2021_35465,
+ fix_cortex_a57_aes_1742098,
+ fp16,
+ fp16fml,
+ fp64,
+ fp_armv8,
+ fp_armv8d16,
+ fp_armv8d16sp,
+ fp_armv8sp,
+ fpao,
+ fpregs,
+ fpregs16,
+ fpregs64,
+ fullfp16,
+ fuse_aes,
+ fuse_literals,
+ harden_sls_blr,
+ harden_sls_nocomdat,
+ harden_sls_retbr,
+ has_v4t,
+ has_v5t,
+ has_v5te,
+ has_v6,
+ has_v6k,
+ has_v6m,
+ has_v6t2,
+ has_v7,
+ has_v7clrex,
+ has_v8,
+ has_v8_1a,
+ has_v8_1m_main,
+ has_v8_2a,
+ has_v8_3a,
+ has_v8_4a,
+ has_v8_5a,
+ has_v8_6a,
+ has_v8_7a,
+ has_v8_8a,
+ has_v8_9a,
+ has_v8m,
+ has_v8m_main,
+ has_v9_1a,
+ has_v9_2a,
+ has_v9_3a,
+ has_v9_4a,
+ has_v9a,
+ hwdiv,
+ hwdiv_arm,
+ i8mm,
+ iwmmxt,
+ iwmmxt2,
+ lob,
+ long_calls,
+ loop_align,
+ m3,
+ mclass,
+ mp,
+ muxed_units,
+ mve,
+ mve1beat,
+ mve2beat,
+ mve4beat,
+ mve_fp,
+ nacl_trap,
+ neon,
+ neon_fpmovs,
+ neonfp,
+ no_branch_predictor,
+ no_bti_at_return_twice,
+ no_movt,
+ no_neg_immediates,
+ noarm,
+ nonpipelined_vfp,
+ pacbti,
+ perfmon,
+ prefer_ishst,
+ prefer_vmovsr,
+ prof_unpr,
+ r4,
+ ras,
+ rclass,
+ read_tp_tpidrprw,
+ read_tp_tpidruro,
+ read_tp_tpidrurw,
+ reserve_r9,
+ ret_addr_stack,
+ sb,
+ sha2,
+ slow_fp_brcc,
+ slow_load_D_subreg,
+ slow_odd_reg,
+ slow_vdup32,
+ slow_vgetlni32,
+ slowfpvfmx,
+ slowfpvmlx,
+ soft_float,
+ splat_vfp_neon,
+ strict_align,
+ swift,
+ thumb2,
+ thumb_mode,
+ trustzone,
+ use_mipipeliner,
+ use_misched,
+ v2,
+ v2a,
+ v3,
+ v3m,
+ v4,
+ v4t,
+ v5t,
+ v5te,
+ v5tej,
+ v6,
+ v6j,
+ v6k,
+ v6kz,
+ v6m,
+ v6sm,
+ v6t2,
+ v7a,
+ v7em,
+ v7k,
+ v7m,
+ v7r,
+ v7s,
+ v7ve,
+ v8_1a,
+ v8_1m_main,
+ v8_2a,
+ v8_3a,
+ v8_4a,
+ v8_5a,
+ v8_6a,
+ v8_7a,
+ v8_8a,
+ v8_9a,
+ v8a,
+ v8m,
+ v8m_main,
+ v8r,
+ v9_1a,
+ v9_2a,
+ v9_3a,
+ v9_4a,
+ v9a,
+ vfp2,
+ vfp2sp,
+ vfp3,
+ vfp3d16,
+ vfp3d16sp,
+ vfp3sp,
+ vfp4,
+ vfp4d16,
+ vfp4d16sp,
+ vfp4sp,
+ virtualization,
+ vldn_align,
+ vmlx_forwarding,
+ vmlx_hazards,
+ wide_stride_vfp,
+ xscale,
+ zcz,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(Feature).featureSetHasAll;
+
+pub const all_features = blk: {
+ @setEvalBranchQuota(10000);
+ const len = @typeInfo(Feature).Enum.fields.len;
+ std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
+ var result: [len]CpuFeature = undefined;
+ result[@intFromEnum(Feature.@"32bit")] = .{
+ .llvm_name = "32bit",
+ .description = "Prefer 32-bit Thumb instrs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"8msecext")] = .{
+ .llvm_name = "8msecext",
+ .description = "Enable support for ARMv8-M Security Extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.a76)] = .{
+ .llvm_name = "a76",
+ .description = "Cortex-A76 ARM processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aapcs_frame_chain)] = .{
+ .llvm_name = "aapcs-frame-chain",
+ .description = "Create an AAPCS compliant frame chain",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aapcs_frame_chain_leaf)] = .{
+ .llvm_name = "aapcs-frame-chain-leaf",
+ .description = "Create an AAPCS compliant frame chain for leaf functions",
+ .dependencies = featureSet(&[_]Feature{
+ .aapcs_frame_chain,
+ }),
+ };
+ result[@intFromEnum(Feature.aclass)] = .{
+ .llvm_name = "aclass",
+ .description = "Is application profile ('A' series)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.acquire_release)] = .{
+ .llvm_name = "acquire-release",
+ .description = "Has v8 acquire/release (lda/ldaex etc) instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aes)] = .{
+ .llvm_name = "aes",
+ .description = "Enable AES support",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.atomics_32)] = .{
+ .llvm_name = "atomics-32",
+ .description = "Assume that lock-free 32-bit atomics are available",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.avoid_movs_shop)] = .{
+ .llvm_name = "avoid-movs-shop",
+ .description = "Avoid movs instructions with shifter operand",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.avoid_partial_cpsr)] = .{
+ .llvm_name = "avoid-partial-cpsr",
+ .description = "Avoid CPSR partial update for OOO execution",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.bf16)] = .{
+ .llvm_name = "bf16",
+ .description = "Enable support for BFloat16 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.big_endian_instructions)] = .{
+ .llvm_name = "big-endian-instructions",
+ .description = "Expect instructions to be stored big-endian.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cde)] = .{
+ .llvm_name = "cde",
+ .description = "Support CDE instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8m_main,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp0)] = .{
+ .llvm_name = "cdecp0",
+ .description = "Coprocessor 0 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp1)] = .{
+ .llvm_name = "cdecp1",
+ .description = "Coprocessor 1 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp2)] = .{
+ .llvm_name = "cdecp2",
+ .description = "Coprocessor 2 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp3)] = .{
+ .llvm_name = "cdecp3",
+ .description = "Coprocessor 3 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp4)] = .{
+ .llvm_name = "cdecp4",
+ .description = "Coprocessor 4 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp5)] = .{
+ .llvm_name = "cdecp5",
+ .description = "Coprocessor 5 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp6)] = .{
+ .llvm_name = "cdecp6",
+ .description = "Coprocessor 6 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cdecp7)] = .{
+ .llvm_name = "cdecp7",
+ .description = "Coprocessor 7 ISA is CDEv1",
+ .dependencies = featureSet(&[_]Feature{
+ .cde,
+ }),
+ };
+ result[@intFromEnum(Feature.cheap_predicable_cpsr)] = .{
+ .llvm_name = "cheap-predicable-cpsr",
+ .description = "Disable +1 predication cost for instructions updating CPSR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.clrbhb)] = .{
+ .llvm_name = "clrbhb",
+ .description = "Enable Clear BHB instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crc)] = .{
+ .llvm_name = "crc",
+ .description = "Enable support for CRC instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crypto)] = .{
+ .llvm_name = "crypto",
+ .description = "Enable support for Cryptography extensions",
+ .dependencies = featureSet(&[_]Feature{
+ .aes,
+ .sha2,
+ }),
+ };
+ result[@intFromEnum(Feature.d32)] = .{
+ .llvm_name = "d32",
+ .description = "Extend FP to 32 double registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.db)] = .{
+ .llvm_name = "db",
+ .description = "Has data barrier (dmb/dsb) instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dfb)] = .{
+ .llvm_name = "dfb",
+ .description = "Has full data barrier (dfb) instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.disable_postra_scheduler)] = .{
+ .llvm_name = "disable-postra-scheduler",
+ .description = "Don't schedule again after register allocation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dont_widen_vmovs)] = .{
+ .llvm_name = "dont-widen-vmovs",
+ .description = "Don't widen VMOVS to VMOVD",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dotprod)] = .{
+ .llvm_name = "dotprod",
+ .description = "Enable support for dot product instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.dsp)] = .{
+ .llvm_name = "dsp",
+ .description = "Supports DSP instructions in ARM and/or Thumb2",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.execute_only)] = .{
+ .llvm_name = "execute-only",
+ .description = "Enable the generation of execute only code.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.expand_fp_mlx)] = .{
+ .llvm_name = "expand-fp-mlx",
+ .description = "Expand VFP/NEON MLA/MLS instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.exynos)] = .{
+ .llvm_name = "exynos",
+ .description = "Samsung Exynos processors",
+ .dependencies = featureSet(&[_]Feature{
+ .crc,
+ .crypto,
+ .expand_fp_mlx,
+ .fuse_aes,
+ .fuse_literals,
+ .hwdiv,
+ .hwdiv_arm,
+ .prof_unpr,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slow_vdup32,
+ .slow_vgetlni32,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .splat_vfp_neon,
+ .wide_stride_vfp,
+ .zcz,
+ }),
+ };
+ result[@intFromEnum(Feature.fix_cmse_cve_2021_35465)] = .{
+ .llvm_name = "fix-cmse-cve-2021-35465",
+ .description = "Mitigate against the cve-2021-35465 security vulnurability",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fix_cortex_a57_aes_1742098)] = .{
+ .llvm_name = "fix-cortex-a57-aes-1742098",
+ .description = "Work around Cortex-A57 Erratum 1742098 / Cortex-A72 Erratum 1655431 (AES)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp16)] = .{
+ .llvm_name = "fp16",
+ .description = "Enable half-precision floating point",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp16fml)] = .{
+ .llvm_name = "fp16fml",
+ .description = "Enable full half-precision floating point fml instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fullfp16,
+ }),
+ };
+ result[@intFromEnum(Feature.fp64)] = .{
+ .llvm_name = "fp64",
+ .description = "Floating point unit supports double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .fpregs64,
+ }),
+ };
+ result[@intFromEnum(Feature.fp_armv8)] = .{
+ .llvm_name = "fp-armv8",
+ .description = "Enable ARMv8 FP",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8d16,
+ .fp_armv8sp,
+ .vfp4,
+ }),
+ };
+ result[@intFromEnum(Feature.fp_armv8d16)] = .{
+ .llvm_name = "fp-armv8d16",
+ .description = "Enable ARMv8 FP with only 16 d-registers",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8d16sp,
+ .vfp4d16,
+ }),
+ };
+ result[@intFromEnum(Feature.fp_armv8d16sp)] = .{
+ .llvm_name = "fp-armv8d16sp",
+ .description = "Enable ARMv8 FP with only 16 d-registers and no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp4d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.fp_armv8sp)] = .{
+ .llvm_name = "fp-armv8sp",
+ .description = "Enable ARMv8 FP with no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8d16sp,
+ .vfp4sp,
+ }),
+ };
+ result[@intFromEnum(Feature.fpao)] = .{
+ .llvm_name = "fpao",
+ .description = "Enable fast computation of positive address offsets",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpregs)] = .{
+ .llvm_name = "fpregs",
+ .description = "Enable FP registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpregs16)] = .{
+ .llvm_name = "fpregs16",
+ .description = "Enable 16-bit FP registers",
+ .dependencies = featureSet(&[_]Feature{
+ .fpregs,
+ }),
+ };
+ result[@intFromEnum(Feature.fpregs64)] = .{
+ .llvm_name = "fpregs64",
+ .description = "Enable 64-bit FP registers",
+ .dependencies = featureSet(&[_]Feature{
+ .fpregs,
+ }),
+ };
+ result[@intFromEnum(Feature.fullfp16)] = .{
+ .llvm_name = "fullfp16",
+ .description = "Enable full half-precision floating point",
+ .dependencies = featureSet(&[_]Feature{
+ .fp_armv8d16sp,
+ .fpregs16,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_aes)] = .{
+ .llvm_name = "fuse-aes",
+ .description = "CPU fuses AES crypto operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fuse_literals)] = .{
+ .llvm_name = "fuse-literals",
+ .description = "CPU fuses literal generation operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_blr)] = .{
+ .llvm_name = "harden-sls-blr",
+ .description = "Harden against straight line speculation across indirect calls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_nocomdat)] = .{
+ .llvm_name = "harden-sls-nocomdat",
+ .description = "Generate thunk code for SLS mitigation in the normal text section",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_retbr)] = .{
+ .llvm_name = "harden-sls-retbr",
+ .description = "Harden against straight line speculation across RETurn and BranchRegister instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.has_v4t)] = .{
+ .llvm_name = "v4t",
+ .description = "Support ARM v4T instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.has_v5t)] = .{
+ .llvm_name = "v5t",
+ .description = "Support ARM v5T instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v4t,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v5te)] = .{
+ .llvm_name = "v5te",
+ .description = "Support ARM v5TE, v5TEj, and v5TExp instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v5t,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v6)] = .{
+ .llvm_name = "v6",
+ .description = "Support ARM v6 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v5te,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v6k)] = .{
+ .llvm_name = "v6k",
+ .description = "Support ARM v6k instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v6m)] = .{
+ .llvm_name = "v6m",
+ .description = "Support ARM v6M instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v6t2)] = .{
+ .llvm_name = "v6t2",
+ .description = "Support ARM v6t2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6k,
+ .has_v8m,
+ .thumb2,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v7)] = .{
+ .llvm_name = "v7",
+ .description = "Support ARM v7 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6t2,
+ .has_v7clrex,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v7clrex)] = .{
+ .llvm_name = "v7clrex",
+ .description = "Has v7 clrex instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.has_v8)] = .{
+ .llvm_name = "v8",
+ .description = "Support ARM v8 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .acquire_release,
+ .has_v7,
+ .perfmon,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_1a)] = .{
+ .llvm_name = "v8.1a",
+ .description = "Support ARM v8.1a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_1m_main)] = .{
+ .llvm_name = "v8.1m.main",
+ .description = "Support ARM v8-1M Mainline instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8m_main,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_2a)] = .{
+ .llvm_name = "v8.2a",
+ .description = "Support ARM v8.2a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_1a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_3a)] = .{
+ .llvm_name = "v8.3a",
+ .description = "Support ARM v8.3a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_2a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_4a)] = .{
+ .llvm_name = "v8.4a",
+ .description = "Support ARM v8.4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .dotprod,
+ .has_v8_3a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_5a)] = .{
+ .llvm_name = "v8.5a",
+ .description = "Support ARM v8.5a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_4a,
+ .sb,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_6a)] = .{
+ .llvm_name = "v8.6a",
+ .description = "Support ARM v8.6a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .bf16,
+ .has_v8_5a,
+ .i8mm,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_7a)] = .{
+ .llvm_name = "v8.7a",
+ .description = "Support ARM v8.7a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_6a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_8a)] = .{
+ .llvm_name = "v8.8a",
+ .description = "Support ARM v8.8a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_7a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8_9a)] = .{
+ .llvm_name = "v8.9a",
+ .description = "Support ARM v8.9a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .clrbhb,
+ .has_v8_8a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8m)] = .{
+ .llvm_name = "v8m",
+ .description = "Support ARM v8M Baseline instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6m,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v8m_main)] = .{
+ .llvm_name = "v8m.main",
+ .description = "Support ARM v8M Mainline instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v7,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v9_1a)] = .{
+ .llvm_name = "v9.1a",
+ .description = "Support ARM v9.1a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_6a,
+ .has_v9a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v9_2a)] = .{
+ .llvm_name = "v9.2a",
+ .description = "Support ARM v9.2a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_7a,
+ .has_v9_1a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v9_3a)] = .{
+ .llvm_name = "v9.3a",
+ .description = "Support ARM v9.3a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_8a,
+ .has_v9_2a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v9_4a)] = .{
+ .llvm_name = "v9.4a",
+ .description = "Support ARM v9.4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_9a,
+ .has_v9_3a,
+ }),
+ };
+ result[@intFromEnum(Feature.has_v9a)] = .{
+ .llvm_name = "v9a",
+ .description = "Support ARM v9a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v8_5a,
+ }),
+ };
+ result[@intFromEnum(Feature.hwdiv)] = .{
+ .llvm_name = "hwdiv",
+ .description = "Enable divide instructions in Thumb",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hwdiv_arm)] = .{
+ .llvm_name = "hwdiv-arm",
+ .description = "Enable divide instructions in ARM mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.i8mm)] = .{
+ .llvm_name = "i8mm",
+ .description = "Enable Matrix Multiply Int8 Extension",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.iwmmxt)] = .{
+ .llvm_name = "iwmmxt",
+ .description = "ARMv5te architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ result[@intFromEnum(Feature.iwmmxt2)] = .{
+ .llvm_name = "iwmmxt2",
+ .description = "ARMv5te architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ result[@intFromEnum(Feature.lob)] = .{
+ .llvm_name = "lob",
+ .description = "Enable Low Overhead Branch extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.long_calls)] = .{
+ .llvm_name = "long-calls",
+ .description = "Generate calls via indirect call instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.loop_align)] = .{
+ .llvm_name = "loop-align",
+ .description = "Prefer 32-bit alignment for loops",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.m3)] = .{
+ .llvm_name = "m3",
+ .description = "Cortex-M3 ARM processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mclass)] = .{
+ .llvm_name = "mclass",
+ .description = "Is microcontroller profile ('M' series)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mp)] = .{
+ .llvm_name = "mp",
+ .description = "Supports Multiprocessing extension",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.muxed_units)] = .{
+ .llvm_name = "muxed-units",
+ .description = "Has muxed AGU and NEON/FPU",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mve)] = .{
+ .llvm_name = "mve",
+ .description = "Support M-Class Vector Extension with integer ops",
+ .dependencies = featureSet(&[_]Feature{
+ .dsp,
+ .fpregs16,
+ .fpregs64,
+ .has_v8_1m_main,
+ }),
+ };
+ result[@intFromEnum(Feature.mve1beat)] = .{
+ .llvm_name = "mve1beat",
+ .description = "Model MVE instructions as a 1 beat per tick architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mve2beat)] = .{
+ .llvm_name = "mve2beat",
+ .description = "Model MVE instructions as a 2 beats per tick architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mve4beat)] = .{
+ .llvm_name = "mve4beat",
+ .description = "Model MVE instructions as a 4 beats per tick architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mve_fp)] = .{
+ .llvm_name = "mve.fp",
+ .description = "Support M-Class Vector Extension with integer and floating ops",
+ .dependencies = featureSet(&[_]Feature{
+ .fullfp16,
+ .mve,
+ }),
+ };
+ result[@intFromEnum(Feature.nacl_trap)] = .{
+ .llvm_name = "nacl-trap",
+ .description = "NaCl trap",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.neon)] = .{
+ .llvm_name = "neon",
+ .description = "Enable NEON instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp3,
+ }),
+ };
+ result[@intFromEnum(Feature.neon_fpmovs)] = .{
+ .llvm_name = "neon-fpmovs",
+ .description = "Convert VMOVSR, VMOVRS, VMOVS to NEON",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.neonfp)] = .{
+ .llvm_name = "neonfp",
+ .description = "Use NEON for single precision FP",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_branch_predictor)] = .{
+ .llvm_name = "no-branch-predictor",
+ .description = "Has no branch predictor",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bti_at_return_twice)] = .{
+ .llvm_name = "no-bti-at-return-twice",
+ .description = "Don't place a BTI instruction after a return-twice",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_movt)] = .{
+ .llvm_name = "no-movt",
+ .description = "Don't use movt/movw pairs for 32-bit imms",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_neg_immediates)] = .{
+ .llvm_name = "no-neg-immediates",
+ .description = "Convert immediates and instructions to their negated or complemented equivalent when the immediate does not fit in the encoding.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.noarm)] = .{
+ .llvm_name = "noarm",
+ .description = "Does not support ARM mode execution",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nonpipelined_vfp)] = .{
+ .llvm_name = "nonpipelined-vfp",
+ .description = "VFP instructions are not pipelined",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pacbti)] = .{
+ .llvm_name = "pacbti",
+ .description = "Enable Pointer Authentication and Branch Target Identification",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.perfmon)] = .{
+ .llvm_name = "perfmon",
+ .description = "Enable support for Performance Monitor extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_ishst)] = .{
+ .llvm_name = "prefer-ishst",
+ .description = "Prefer ISHST barriers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_vmovsr)] = .{
+ .llvm_name = "prefer-vmovsr",
+ .description = "Prefer VMOVSR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prof_unpr)] = .{
+ .llvm_name = "prof-unpr",
+ .description = "Is profitable to unpredicate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.r4)] = .{
+ .llvm_name = "r4",
+ .description = "Cortex-R4 ARM processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ras)] = .{
+ .llvm_name = "ras",
+ .description = "Enable Reliability, Availability and Serviceability extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rclass)] = .{
+ .llvm_name = "rclass",
+ .description = "Is realtime profile ('R' series)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.read_tp_tpidrprw)] = .{
+ .llvm_name = "read-tp-tpidrprw",
+ .description = "Reading thread pointer from TPIDRPRW register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.read_tp_tpidruro)] = .{
+ .llvm_name = "read-tp-tpidruro",
+ .description = "Reading thread pointer from TPIDRURO register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.read_tp_tpidrurw)] = .{
+ .llvm_name = "read-tp-tpidrurw",
+ .description = "Reading thread pointer from TPIDRURW register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_r9)] = .{
+ .llvm_name = "reserve-r9",
+ .description = "Reserve R9, making it unavailable as GPR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ret_addr_stack)] = .{
+ .llvm_name = "ret-addr-stack",
+ .description = "Has return address stack",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sb)] = .{
+ .llvm_name = "sb",
+ .description = "Enable v8.5a Speculation Barrier",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sha2)] = .{
+ .llvm_name = "sha2",
+ .description = "Enable SHA1 and SHA256 support",
+ .dependencies = featureSet(&[_]Feature{
+ .neon,
+ }),
+ };
+ result[@intFromEnum(Feature.slow_fp_brcc)] = .{
+ .llvm_name = "slow-fp-brcc",
+ .description = "FP compare + branch is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_load_D_subreg)] = .{
+ .llvm_name = "slow-load-D-subreg",
+ .description = "Loading into D subregs is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_odd_reg)] = .{
+ .llvm_name = "slow-odd-reg",
+ .description = "VLDM/VSTM starting with an odd register is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_vdup32)] = .{
+ .llvm_name = "slow-vdup32",
+ .description = "Has slow VDUP32 - prefer VMOV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_vgetlni32)] = .{
+ .llvm_name = "slow-vgetlni32",
+ .description = "Has slow VGETLNi32 - prefer VMOV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slowfpvfmx)] = .{
+ .llvm_name = "slowfpvfmx",
+ .description = "Disable VFP / NEON FMA instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slowfpvmlx)] = .{
+ .llvm_name = "slowfpvmlx",
+ .description = "Disable VFP / NEON MAC instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_float)] = .{
+ .llvm_name = "soft-float",
+ .description = "Use software floating point features.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.splat_vfp_neon)] = .{
+ .llvm_name = "splat-vfp-neon",
+ .description = "Splat register from VFP to NEON",
+ .dependencies = featureSet(&[_]Feature{
+ .dont_widen_vmovs,
+ }),
+ };
+ result[@intFromEnum(Feature.strict_align)] = .{
+ .llvm_name = "strict-align",
+ .description = "Disallow all unaligned memory access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.swift)] = .{
+ .llvm_name = "swift",
+ .description = "Swift ARM processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.thumb2)] = .{
+ .llvm_name = "thumb2",
+ .description = "Enable Thumb2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.thumb_mode)] = .{
+ .llvm_name = "thumb-mode",
+ .description = "Thumb mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.trustzone)] = .{
+ .llvm_name = "trustzone",
+ .description = "Enable support for TrustZone security extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_mipipeliner)] = .{
+ .llvm_name = "use-mipipeliner",
+ .description = "Use the MachinePipeliner",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_misched)] = .{
+ .llvm_name = "use-misched",
+ .description = "Use the MachineScheduler",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v2)] = .{
+ .llvm_name = null,
+ .description = "ARMv2 architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v2a)] = .{
+ .llvm_name = null,
+ .description = "ARMv2a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v3)] = .{
+ .llvm_name = null,
+ .description = "ARMv3 architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v3m)] = .{
+ .llvm_name = null,
+ .description = "ARMv3m architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v4)] = .{
+ .llvm_name = "armv4",
+ .description = "ARMv4 architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v4t)] = .{
+ .llvm_name = "armv4t",
+ .description = "ARMv4t architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v4t,
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v5t)] = .{
+ .llvm_name = "armv5t",
+ .description = "ARMv5t architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v5t,
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v5te)] = .{
+ .llvm_name = "armv5te",
+ .description = "ARMv5te architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v5te,
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v5tej)] = .{
+ .llvm_name = "armv5tej",
+ .description = "ARMv5tej architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v5te,
+ .strict_align,
+ }),
+ };
+ result[@intFromEnum(Feature.v6)] = .{
+ .llvm_name = "armv6",
+ .description = "ARMv6 architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .dsp,
+ .has_v6,
+ }),
+ };
+ result[@intFromEnum(Feature.v6j)] = .{
+ .llvm_name = "armv6j",
+ .description = "ARMv7a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v6,
+ }),
+ };
+ result[@intFromEnum(Feature.v6k)] = .{
+ .llvm_name = "armv6k",
+ .description = "ARMv6k architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6k,
+ }),
+ };
+ result[@intFromEnum(Feature.v6kz)] = .{
+ .llvm_name = "armv6kz",
+ .description = "ARMv6kz architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .has_v6k,
+ .trustzone,
+ }),
+ };
+ result[@intFromEnum(Feature.v6m)] = .{
+ .llvm_name = "armv6-m",
+ .description = "ARMv6m architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .db,
+ .has_v6m,
+ .mclass,
+ .noarm,
+ .strict_align,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v6sm)] = .{
+ .llvm_name = "armv6s-m",
+ .description = "ARMv6sm architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .db,
+ .has_v6m,
+ .mclass,
+ .noarm,
+ .strict_align,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v6t2)] = .{
+ .llvm_name = "armv6t2",
+ .description = "ARMv6t2 architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .dsp,
+ .has_v6t2,
+ }),
+ };
+ result[@intFromEnum(Feature.v7a)] = .{
+ .llvm_name = "armv7-a",
+ .description = "ARMv7a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .db,
+ .dsp,
+ .has_v7,
+ .neon,
+ .perfmon,
+ }),
+ };
+ result[@intFromEnum(Feature.v7em)] = .{
+ .llvm_name = "armv7e-m",
+ .description = "ARMv7em architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .db,
+ .dsp,
+ .has_v7,
+ .hwdiv,
+ .mclass,
+ .noarm,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v7k)] = .{
+ .llvm_name = "armv7k",
+ .description = "ARMv7a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v7a,
+ }),
+ };
+ result[@intFromEnum(Feature.v7m)] = .{
+ .llvm_name = "armv7-m",
+ .description = "ARMv7m architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .db,
+ .has_v7,
+ .hwdiv,
+ .mclass,
+ .noarm,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v7r)] = .{
+ .llvm_name = "armv7-r",
+ .description = "ARMv7r architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .db,
+ .dsp,
+ .has_v7,
+ .hwdiv,
+ .perfmon,
+ .rclass,
+ }),
+ };
+ result[@intFromEnum(Feature.v7s)] = .{
+ .llvm_name = "armv7s",
+ .description = "ARMv7a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v7a,
+ }),
+ };
+ result[@intFromEnum(Feature.v7ve)] = .{
+ .llvm_name = "armv7ve",
+ .description = "ARMv7ve architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .db,
+ .dsp,
+ .has_v7,
+ .mp,
+ .neon,
+ .perfmon,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_1a)] = .{
+ .llvm_name = "armv8.1-a",
+ .description = "ARMv81a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_1a,
+ .mp,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_1m_main)] = .{
+ .llvm_name = "armv8.1-m.main",
+ .description = "ARMv81mMainline architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .@"8msecext",
+ .acquire_release,
+ .db,
+ .has_v8_1m_main,
+ .hwdiv,
+ .lob,
+ .mclass,
+ .noarm,
+ .ras,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_2a)] = .{
+ .llvm_name = "armv8.2-a",
+ .description = "ARMv82a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_2a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_3a)] = .{
+ .llvm_name = "armv8.3-a",
+ .description = "ARMv83a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_3a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_4a)] = .{
+ .llvm_name = "armv8.4-a",
+ .description = "ARMv84a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_4a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_5a)] = .{
+ .llvm_name = "armv8.5-a",
+ .description = "ARMv85a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_5a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_6a)] = .{
+ .llvm_name = "armv8.6-a",
+ .description = "ARMv86a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_6a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_7a)] = .{
+ .llvm_name = "armv8.7-a",
+ .description = "ARMv87a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_7a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_8a)] = .{
+ .llvm_name = "armv8.8-a",
+ .description = "ARMv88a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_8a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8_9a)] = .{
+ .llvm_name = "armv8.9-a",
+ .description = "ARMv89a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8_9a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8a)] = .{
+ .llvm_name = "armv8-a",
+ .description = "ARMv8a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v8,
+ .mp,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v8m)] = .{
+ .llvm_name = "armv8-m.base",
+ .description = "ARMv8mBaseline architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .@"8msecext",
+ .acquire_release,
+ .db,
+ .has_v7clrex,
+ .has_v8m,
+ .hwdiv,
+ .mclass,
+ .noarm,
+ .strict_align,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v8m_main)] = .{
+ .llvm_name = "armv8-m.main",
+ .description = "ARMv8mMainline architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .@"8msecext",
+ .acquire_release,
+ .db,
+ .has_v8m_main,
+ .hwdiv,
+ .mclass,
+ .noarm,
+ .thumb_mode,
+ }),
+ };
+ result[@intFromEnum(Feature.v8r)] = .{
+ .llvm_name = "armv8-r",
+ .description = "ARMv8r architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .crc,
+ .db,
+ .dfb,
+ .dsp,
+ .fp_armv8,
+ .has_v8,
+ .mp,
+ .neon,
+ .rclass,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_1a)] = .{
+ .llvm_name = "armv9.1-a",
+ .description = "ARMv91a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v9_1a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_2a)] = .{
+ .llvm_name = "armv9.2-a",
+ .description = "ARMv92a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v9_2a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_3a)] = .{
+ .llvm_name = "armv9.3-a",
+ .description = "ARMv93a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .crypto,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v9_3a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v9_4a)] = .{
+ .llvm_name = "armv9.4-a",
+ .description = "ARMv94a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v9_4a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.v9a)] = .{
+ .llvm_name = "armv9-a",
+ .description = "ARMv9a architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .aclass,
+ .crc,
+ .db,
+ .dsp,
+ .fp_armv8,
+ .has_v9a,
+ .mp,
+ .ras,
+ .trustzone,
+ .virtualization,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp2)] = .{
+ .llvm_name = "vfp2",
+ .description = "Enable VFP2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fp64,
+ .vfp2sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp2sp)] = .{
+ .llvm_name = "vfp2sp",
+ .description = "Enable VFP2 instructions with no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .fpregs,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp3)] = .{
+ .llvm_name = "vfp3",
+ .description = "Enable VFP3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp3d16,
+ .vfp3sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp3d16)] = .{
+ .llvm_name = "vfp3d16",
+ .description = "Enable VFP3 instructions with only 16 d-registers",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp2,
+ .vfp3d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp3d16sp)] = .{
+ .llvm_name = "vfp3d16sp",
+ .description = "Enable VFP3 instructions with only 16 d-registers and no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp2sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp3sp)] = .{
+ .llvm_name = "vfp3sp",
+ .description = "Enable VFP3 instructions with no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .d32,
+ .vfp3d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp4)] = .{
+ .llvm_name = "vfp4",
+ .description = "Enable VFP4 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp3,
+ .vfp4d16,
+ .vfp4sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp4d16)] = .{
+ .llvm_name = "vfp4d16",
+ .description = "Enable VFP4 instructions with only 16 d-registers",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp3d16,
+ .vfp4d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp4d16sp)] = .{
+ .llvm_name = "vfp4d16sp",
+ .description = "Enable VFP4 instructions with only 16 d-registers and no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .fp16,
+ .vfp3d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.vfp4sp)] = .{
+ .llvm_name = "vfp4sp",
+ .description = "Enable VFP4 instructions with no double precision",
+ .dependencies = featureSet(&[_]Feature{
+ .vfp3sp,
+ .vfp4d16sp,
+ }),
+ };
+ result[@intFromEnum(Feature.virtualization)] = .{
+ .llvm_name = "virtualization",
+ .description = "Supports Virtualization extension",
+ .dependencies = featureSet(&[_]Feature{
+ .hwdiv,
+ .hwdiv_arm,
+ }),
+ };
+ result[@intFromEnum(Feature.vldn_align)] = .{
+ .llvm_name = "vldn-align",
+ .description = "Check for VLDn unaligned access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vmlx_forwarding)] = .{
+ .llvm_name = "vmlx-forwarding",
+ .description = "Has multiplier accumulator forwarding",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vmlx_hazards)] = .{
+ .llvm_name = "vmlx-hazards",
+ .description = "Has VMLx hazards",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.wide_stride_vfp)] = .{
+ .llvm_name = "wide-stride-vfp",
+ .description = "Use a wide stride when allocating VFP registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xscale)] = .{
+ .llvm_name = "xscale",
+ .description = "ARMv5te architecture",
+ .dependencies = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ result[@intFromEnum(Feature.zcz)] = .{
+ .llvm_name = "zcz",
+ .description = "Has zero-cycle zeroing instructions",
+ .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 arm1020e = CpuModel{
+ .name = "arm1020e",
+ .llvm_name = "arm1020e",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm1020t = CpuModel{
+ .name = "arm1020t",
+ .llvm_name = "arm1020t",
+ .features = featureSet(&[_]Feature{
+ .v5t,
+ }),
+ };
+ pub const arm1022e = CpuModel{
+ .name = "arm1022e",
+ .llvm_name = "arm1022e",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm10e = CpuModel{
+ .name = "arm10e",
+ .llvm_name = "arm10e",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm10tdmi = CpuModel{
+ .name = "arm10tdmi",
+ .llvm_name = "arm10tdmi",
+ .features = featureSet(&[_]Feature{
+ .v5t,
+ }),
+ };
+ pub const arm1136j_s = CpuModel{
+ .name = "arm1136j_s",
+ .llvm_name = "arm1136j-s",
+ .features = featureSet(&[_]Feature{
+ .v6,
+ }),
+ };
+ pub const arm1136jf_s = CpuModel{
+ .name = "arm1136jf_s",
+ .llvm_name = "arm1136jf-s",
+ .features = featureSet(&[_]Feature{
+ .slowfpvmlx,
+ .v6,
+ .vfp2,
+ }),
+ };
+ pub const arm1156t2_s = CpuModel{
+ .name = "arm1156t2_s",
+ .llvm_name = "arm1156t2-s",
+ .features = featureSet(&[_]Feature{
+ .v6t2,
+ }),
+ };
+ pub const arm1156t2f_s = CpuModel{
+ .name = "arm1156t2f_s",
+ .llvm_name = "arm1156t2f-s",
+ .features = featureSet(&[_]Feature{
+ .slowfpvmlx,
+ .v6t2,
+ .vfp2,
+ }),
+ };
+ pub const arm1176jz_s = CpuModel{
+ .name = "arm1176jz_s",
+ .llvm_name = "arm1176jz-s",
+ .features = featureSet(&[_]Feature{
+ .v6kz,
+ }),
+ };
+ pub const arm1176jzf_s = CpuModel{
+ .name = "arm1176jzf_s",
+ .llvm_name = "arm1176jzf-s",
+ .features = featureSet(&[_]Feature{
+ .slowfpvmlx,
+ .v6kz,
+ .vfp2,
+ }),
+ };
+ pub const arm710t = CpuModel{
+ .name = "arm710t",
+ .llvm_name = "arm710t",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm720t = CpuModel{
+ .name = "arm720t",
+ .llvm_name = "arm720t",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm7tdmi = CpuModel{
+ .name = "arm7tdmi",
+ .llvm_name = "arm7tdmi",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm7tdmi_s = CpuModel{
+ .name = "arm7tdmi_s",
+ .llvm_name = "arm7tdmi-s",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm8 = CpuModel{
+ .name = "arm8",
+ .llvm_name = "arm8",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const arm810 = CpuModel{
+ .name = "arm810",
+ .llvm_name = "arm810",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const arm9 = CpuModel{
+ .name = "arm9",
+ .llvm_name = "arm9",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm920 = CpuModel{
+ .name = "arm920",
+ .llvm_name = "arm920",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm920t = CpuModel{
+ .name = "arm920t",
+ .llvm_name = "arm920t",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm922t = CpuModel{
+ .name = "arm922t",
+ .llvm_name = "arm922t",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm926ej_s = CpuModel{
+ .name = "arm926ej_s",
+ .llvm_name = "arm926ej-s",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm940t = CpuModel{
+ .name = "arm940t",
+ .llvm_name = "arm940t",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const arm946e_s = CpuModel{
+ .name = "arm946e_s",
+ .llvm_name = "arm946e-s",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm966e_s = CpuModel{
+ .name = "arm966e_s",
+ .llvm_name = "arm966e-s",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm968e_s = CpuModel{
+ .name = "arm968e_s",
+ .llvm_name = "arm968e-s",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm9e = CpuModel{
+ .name = "arm9e",
+ .llvm_name = "arm9e",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const arm9tdmi = CpuModel{
+ .name = "arm9tdmi",
+ .llvm_name = "arm9tdmi",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const baseline = CpuModel{
+ .name = "baseline",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .v7a,
+ }),
+ };
+ pub const cortex_a12 = CpuModel{
+ .name = "cortex_a12",
+ .llvm_name = "cortex-a12",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .mp,
+ .ret_addr_stack,
+ .trustzone,
+ .v7a,
+ .vfp4,
+ .virtualization,
+ .vmlx_forwarding,
+ }),
+ };
+ pub const cortex_a15 = CpuModel{
+ .name = "cortex_a15",
+ .llvm_name = "cortex-a15",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .mp,
+ .muxed_units,
+ .ret_addr_stack,
+ .splat_vfp_neon,
+ .trustzone,
+ .v7a,
+ .vfp4,
+ .virtualization,
+ .vldn_align,
+ }),
+ };
+ pub const cortex_a17 = CpuModel{
+ .name = "cortex_a17",
+ .llvm_name = "cortex-a17",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .mp,
+ .ret_addr_stack,
+ .trustzone,
+ .v7a,
+ .vfp4,
+ .virtualization,
+ .vmlx_forwarding,
+ }),
+ };
+ pub const cortex_a32 = CpuModel{
+ .name = "cortex_a32",
+ .llvm_name = "cortex-a32",
+ .features = featureSet(&[_]Feature{
+ .v8a,
+ }),
+ };
+ pub const cortex_a35 = CpuModel{
+ .name = "cortex_a35",
+ .llvm_name = "cortex-a35",
+ .features = featureSet(&[_]Feature{
+ .v8a,
+ }),
+ };
+ pub const cortex_a5 = CpuModel{
+ .name = "cortex_a5",
+ .llvm_name = "cortex-a5",
+ .features = featureSet(&[_]Feature{
+ .mp,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .trustzone,
+ .v7a,
+ .vfp4,
+ .vmlx_forwarding,
+ }),
+ };
+ pub const cortex_a53 = CpuModel{
+ .name = "cortex_a53",
+ .llvm_name = "cortex-a53",
+ .features = featureSet(&[_]Feature{
+ .fpao,
+ .v8a,
+ }),
+ };
+ pub const cortex_a55 = CpuModel{
+ .name = "cortex_a55",
+ .llvm_name = "cortex-a55",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a57 = CpuModel{
+ .name = "cortex_a57",
+ .llvm_name = "cortex-a57",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .cheap_predicable_cpsr,
+ .fix_cortex_a57_aes_1742098,
+ .fpao,
+ .v8a,
+ }),
+ };
+ pub const cortex_a7 = CpuModel{
+ .name = "cortex_a7",
+ .llvm_name = "cortex-a7",
+ .features = featureSet(&[_]Feature{
+ .mp,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .trustzone,
+ .v7a,
+ .vfp4,
+ .virtualization,
+ .vmlx_forwarding,
+ .vmlx_hazards,
+ }),
+ };
+ pub const cortex_a710 = CpuModel{
+ .name = "cortex_a710",
+ .llvm_name = "cortex-a710",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .fp16fml,
+ .i8mm,
+ .v9a,
+ }),
+ };
+ pub const cortex_a72 = CpuModel{
+ .name = "cortex_a72",
+ .llvm_name = "cortex-a72",
+ .features = featureSet(&[_]Feature{
+ .fix_cortex_a57_aes_1742098,
+ .v8a,
+ }),
+ };
+ pub const cortex_a73 = CpuModel{
+ .name = "cortex_a73",
+ .llvm_name = "cortex-a73",
+ .features = featureSet(&[_]Feature{
+ .v8a,
+ }),
+ };
+ pub const cortex_a75 = CpuModel{
+ .name = "cortex_a75",
+ .llvm_name = "cortex-a75",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a76 = CpuModel{
+ .name = "cortex_a76",
+ .llvm_name = "cortex-a76",
+ .features = featureSet(&[_]Feature{
+ .a76,
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a76ae = CpuModel{
+ .name = "cortex_a76ae",
+ .llvm_name = "cortex-a76ae",
+ .features = featureSet(&[_]Feature{
+ .a76,
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a77 = CpuModel{
+ .name = "cortex_a77",
+ .llvm_name = "cortex-a77",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a78 = CpuModel{
+ .name = "cortex_a78",
+ .llvm_name = "cortex-a78",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a78c = CpuModel{
+ .name = "cortex_a78c",
+ .llvm_name = "cortex-a78c",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_a8 = CpuModel{
+ .name = "cortex_a8",
+ .llvm_name = "cortex-a8",
+ .features = featureSet(&[_]Feature{
+ .nonpipelined_vfp,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .trustzone,
+ .v7a,
+ .vmlx_forwarding,
+ .vmlx_hazards,
+ }),
+ };
+ pub const cortex_a9 = CpuModel{
+ .name = "cortex_a9",
+ .llvm_name = "cortex-a9",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .expand_fp_mlx,
+ .fp16,
+ .mp,
+ .muxed_units,
+ .neon_fpmovs,
+ .prefer_vmovsr,
+ .ret_addr_stack,
+ .trustzone,
+ .v7a,
+ .vldn_align,
+ .vmlx_forwarding,
+ .vmlx_hazards,
+ }),
+ };
+ pub const cortex_m0 = CpuModel{
+ .name = "cortex_m0",
+ .llvm_name = "cortex-m0",
+ .features = featureSet(&[_]Feature{
+ .no_branch_predictor,
+ .v6m,
+ }),
+ };
+ pub const cortex_m0plus = CpuModel{
+ .name = "cortex_m0plus",
+ .llvm_name = "cortex-m0plus",
+ .features = featureSet(&[_]Feature{
+ .no_branch_predictor,
+ .v6m,
+ }),
+ };
+ pub const cortex_m1 = CpuModel{
+ .name = "cortex_m1",
+ .llvm_name = "cortex-m1",
+ .features = featureSet(&[_]Feature{
+ .no_branch_predictor,
+ .v6m,
+ }),
+ };
+ pub const cortex_m23 = CpuModel{
+ .name = "cortex_m23",
+ .llvm_name = "cortex-m23",
+ .features = featureSet(&[_]Feature{
+ .no_branch_predictor,
+ .no_movt,
+ .v8m,
+ }),
+ };
+ pub const cortex_m3 = CpuModel{
+ .name = "cortex_m3",
+ .llvm_name = "cortex-m3",
+ .features = featureSet(&[_]Feature{
+ .loop_align,
+ .m3,
+ .no_branch_predictor,
+ .use_misched,
+ .v7m,
+ }),
+ };
+ pub const cortex_m33 = CpuModel{
+ .name = "cortex_m33",
+ .llvm_name = "cortex-m33",
+ .features = featureSet(&[_]Feature{
+ .dsp,
+ .fix_cmse_cve_2021_35465,
+ .fp_armv8d16sp,
+ .loop_align,
+ .no_branch_predictor,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .use_misched,
+ .v8m_main,
+ }),
+ };
+ pub const cortex_m35p = CpuModel{
+ .name = "cortex_m35p",
+ .llvm_name = "cortex-m35p",
+ .features = featureSet(&[_]Feature{
+ .dsp,
+ .fix_cmse_cve_2021_35465,
+ .fp_armv8d16sp,
+ .loop_align,
+ .no_branch_predictor,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .use_misched,
+ .v8m_main,
+ }),
+ };
+ pub const cortex_m4 = CpuModel{
+ .name = "cortex_m4",
+ .llvm_name = "cortex-m4",
+ .features = featureSet(&[_]Feature{
+ .loop_align,
+ .no_branch_predictor,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .use_misched,
+ .v7em,
+ .vfp4d16sp,
+ }),
+ };
+ pub const cortex_m55 = CpuModel{
+ .name = "cortex_m55",
+ .llvm_name = "cortex-m55",
+ .features = featureSet(&[_]Feature{
+ .fix_cmse_cve_2021_35465,
+ .fp_armv8d16,
+ .loop_align,
+ .mve_fp,
+ .no_branch_predictor,
+ .slowfpvmlx,
+ .use_misched,
+ .v8_1m_main,
+ }),
+ };
+ pub const cortex_m7 = CpuModel{
+ .name = "cortex_m7",
+ .llvm_name = "cortex-m7",
+ .features = featureSet(&[_]Feature{
+ .fp_armv8d16,
+ .use_mipipeliner,
+ .use_misched,
+ .v7em,
+ }),
+ };
+ pub const cortex_m85 = CpuModel{
+ .name = "cortex_m85",
+ .llvm_name = "cortex-m85",
+ .features = featureSet(&[_]Feature{
+ .fp_armv8d16,
+ .mve_fp,
+ .pacbti,
+ .use_misched,
+ .v8_1m_main,
+ }),
+ };
+ pub const cortex_r4 = CpuModel{
+ .name = "cortex_r4",
+ .llvm_name = "cortex-r4",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .r4,
+ .ret_addr_stack,
+ .v7r,
+ }),
+ };
+ pub const cortex_r4f = CpuModel{
+ .name = "cortex_r4f",
+ .llvm_name = "cortex-r4f",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .r4,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .v7r,
+ .vfp3d16,
+ }),
+ };
+ pub const cortex_r5 = CpuModel{
+ .name = "cortex_r5",
+ .llvm_name = "cortex-r5",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .hwdiv_arm,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .v7r,
+ .vfp3d16,
+ }),
+ };
+ pub const cortex_r52 = CpuModel{
+ .name = "cortex_r52",
+ .llvm_name = "cortex-r52",
+ .features = featureSet(&[_]Feature{
+ .fpao,
+ .use_misched,
+ .v8r,
+ }),
+ };
+ pub const cortex_r7 = CpuModel{
+ .name = "cortex_r7",
+ .llvm_name = "cortex-r7",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .fp16,
+ .hwdiv_arm,
+ .mp,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .v7r,
+ .vfp3d16,
+ }),
+ };
+ pub const cortex_r8 = CpuModel{
+ .name = "cortex_r8",
+ .llvm_name = "cortex-r8",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .fp16,
+ .hwdiv_arm,
+ .mp,
+ .ret_addr_stack,
+ .slow_fp_brcc,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .v7r,
+ .vfp3d16,
+ }),
+ };
+ pub const cortex_x1 = CpuModel{
+ .name = "cortex_x1",
+ .llvm_name = "cortex-x1",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cortex_x1c = CpuModel{
+ .name = "cortex_x1c",
+ .llvm_name = "cortex-x1c",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const cyclone = CpuModel{
+ .name = "cyclone",
+ .llvm_name = "cyclone",
+ .features = featureSet(&[_]Feature{
+ .avoid_movs_shop,
+ .avoid_partial_cpsr,
+ .disable_postra_scheduler,
+ .neonfp,
+ .ret_addr_stack,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .swift,
+ .use_misched,
+ .v8a,
+ .zcz,
+ }),
+ };
+ pub const ep9312 = CpuModel{
+ .name = "ep9312",
+ .llvm_name = "ep9312",
+ .features = featureSet(&[_]Feature{
+ .v4t,
+ }),
+ };
+ pub const exynos_m1 = CpuModel{
+ .name = "exynos_m1",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .exynos,
+ .v8a,
+ }),
+ };
+ pub const exynos_m2 = CpuModel{
+ .name = "exynos_m2",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .exynos,
+ .v8a,
+ }),
+ };
+ pub const exynos_m3 = CpuModel{
+ .name = "exynos_m3",
+ .llvm_name = "exynos-m3",
+ .features = featureSet(&[_]Feature{
+ .exynos,
+ .v8a,
+ }),
+ };
+ pub const exynos_m4 = CpuModel{
+ .name = "exynos_m4",
+ .llvm_name = "exynos-m4",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .exynos,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const exynos_m5 = CpuModel{
+ .name = "exynos_m5",
+ .llvm_name = "exynos-m5",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .exynos,
+ .fullfp16,
+ .v8_2a,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const iwmmxt = CpuModel{
+ .name = "iwmmxt",
+ .llvm_name = "iwmmxt",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+ pub const krait = CpuModel{
+ .name = "krait",
+ .llvm_name = "krait",
+ .features = featureSet(&[_]Feature{
+ .avoid_partial_cpsr,
+ .hwdiv,
+ .hwdiv_arm,
+ .muxed_units,
+ .ret_addr_stack,
+ .v7a,
+ .vfp4,
+ .vldn_align,
+ .vmlx_forwarding,
+ }),
+ };
+ pub const kryo = CpuModel{
+ .name = "kryo",
+ .llvm_name = "kryo",
+ .features = featureSet(&[_]Feature{
+ .v8a,
+ }),
+ };
+ pub const mpcore = CpuModel{
+ .name = "mpcore",
+ .llvm_name = "mpcore",
+ .features = featureSet(&[_]Feature{
+ .slowfpvmlx,
+ .v6k,
+ .vfp2,
+ }),
+ };
+ pub const mpcorenovfp = CpuModel{
+ .name = "mpcorenovfp",
+ .llvm_name = "mpcorenovfp",
+ .features = featureSet(&[_]Feature{
+ .v6k,
+ }),
+ };
+ pub const neoverse_n1 = CpuModel{
+ .name = "neoverse_n1",
+ .llvm_name = "neoverse-n1",
+ .features = featureSet(&[_]Feature{
+ .dotprod,
+ .v8_2a,
+ }),
+ };
+ pub const neoverse_n2 = CpuModel{
+ .name = "neoverse_n2",
+ .llvm_name = "neoverse-n2",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .i8mm,
+ .v8_5a,
+ }),
+ };
+ pub const neoverse_v1 = CpuModel{
+ .name = "neoverse_v1",
+ .llvm_name = "neoverse-v1",
+ .features = featureSet(&[_]Feature{
+ .bf16,
+ .fullfp16,
+ .i8mm,
+ .v8_4a,
+ }),
+ };
+ pub const sc000 = CpuModel{
+ .name = "sc000",
+ .llvm_name = "sc000",
+ .features = featureSet(&[_]Feature{
+ .no_branch_predictor,
+ .v6m,
+ }),
+ };
+ pub const sc300 = CpuModel{
+ .name = "sc300",
+ .llvm_name = "sc300",
+ .features = featureSet(&[_]Feature{
+ .m3,
+ .no_branch_predictor,
+ .use_misched,
+ .v7m,
+ }),
+ };
+ pub const strongarm = CpuModel{
+ .name = "strongarm",
+ .llvm_name = "strongarm",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const strongarm110 = CpuModel{
+ .name = "strongarm110",
+ .llvm_name = "strongarm110",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const strongarm1100 = CpuModel{
+ .name = "strongarm1100",
+ .llvm_name = "strongarm1100",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const strongarm1110 = CpuModel{
+ .name = "strongarm1110",
+ .llvm_name = "strongarm1110",
+ .features = featureSet(&[_]Feature{
+ .v4,
+ }),
+ };
+ pub const swift = CpuModel{
+ .name = "swift",
+ .llvm_name = "swift",
+ .features = featureSet(&[_]Feature{
+ .avoid_movs_shop,
+ .avoid_partial_cpsr,
+ .disable_postra_scheduler,
+ .hwdiv,
+ .hwdiv_arm,
+ .mp,
+ .neonfp,
+ .prefer_ishst,
+ .prof_unpr,
+ .ret_addr_stack,
+ .slow_load_D_subreg,
+ .slow_odd_reg,
+ .slow_vdup32,
+ .slow_vgetlni32,
+ .slowfpvfmx,
+ .slowfpvmlx,
+ .swift,
+ .use_misched,
+ .v7a,
+ .vfp4,
+ .vmlx_hazards,
+ .wide_stride_vfp,
+ }),
+ };
+ pub const xscale = CpuModel{
+ .name = "xscale",
+ .llvm_name = "xscale",
+ .features = featureSet(&[_]Feature{
+ .v5te,
+ }),
+ };
+};
diff --git a/lib/std/Target/avr.zig b/lib/std/Target/avr.zig
new file mode 100644
index 0000000000..bda274d2e6
--- /dev/null
+++ b/lib/std/Target/avr.zig
@@ -0,0 +1,2607 @@
+//! 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 {
+ addsubiw,
+ avr0,
+ avr1,
+ avr2,
+ avr25,
+ avr3,
+ avr31,
+ avr35,
+ avr4,
+ avr5,
+ avr51,
+ avr6,
+ avrtiny,
+ @"break",
+ des,
+ eijmpcall,
+ elpm,
+ elpmx,
+ ijmpcall,
+ jmpcall,
+ lowbytefirst,
+ lpm,
+ lpmx,
+ memmappedregs,
+ movw,
+ mul,
+ rmw,
+ smallstack,
+ special,
+ spm,
+ spmx,
+ sram,
+ tinyencoding,
+ xmega,
+ xmega3,
+ xmegau,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.addsubiw)] = .{
+ .llvm_name = "addsubiw",
+ .description = "Enable 16-bit register-immediate addition and subtraction instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.avr0)] = .{
+ .llvm_name = "avr0",
+ .description = "The device is a part of the avr0 family",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.avr1)] = .{
+ .llvm_name = "avr1",
+ .description = "The device is a part of the avr1 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr0,
+ .lpm,
+ .memmappedregs,
+ }),
+ };
+ result[@intFromEnum(Feature.avr2)] = .{
+ .llvm_name = "avr2",
+ .description = "The device is a part of the avr2 family",
+ .dependencies = featureSet(&[_]Feature{
+ .addsubiw,
+ .avr1,
+ .ijmpcall,
+ .sram,
+ }),
+ };
+ result[@intFromEnum(Feature.avr25)] = .{
+ .llvm_name = "avr25",
+ .description = "The device is a part of the avr25 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr2,
+ .@"break",
+ .lpmx,
+ .movw,
+ .spm,
+ }),
+ };
+ result[@intFromEnum(Feature.avr3)] = .{
+ .llvm_name = "avr3",
+ .description = "The device is a part of the avr3 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr2,
+ .jmpcall,
+ }),
+ };
+ result[@intFromEnum(Feature.avr31)] = .{
+ .llvm_name = "avr31",
+ .description = "The device is a part of the avr31 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr3,
+ .elpm,
+ }),
+ };
+ result[@intFromEnum(Feature.avr35)] = .{
+ .llvm_name = "avr35",
+ .description = "The device is a part of the avr35 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr3,
+ .@"break",
+ .lpmx,
+ .movw,
+ .spm,
+ }),
+ };
+ result[@intFromEnum(Feature.avr4)] = .{
+ .llvm_name = "avr4",
+ .description = "The device is a part of the avr4 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr2,
+ .@"break",
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ result[@intFromEnum(Feature.avr5)] = .{
+ .llvm_name = "avr5",
+ .description = "The device is a part of the avr5 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr3,
+ .@"break",
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ result[@intFromEnum(Feature.avr51)] = .{
+ .llvm_name = "avr51",
+ .description = "The device is a part of the avr51 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr5,
+ .elpm,
+ .elpmx,
+ }),
+ };
+ result[@intFromEnum(Feature.avr6)] = .{
+ .llvm_name = "avr6",
+ .description = "The device is a part of the avr6 family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr51,
+ .eijmpcall,
+ }),
+ };
+ result[@intFromEnum(Feature.avrtiny)] = .{
+ .llvm_name = "avrtiny",
+ .description = "The device is a part of the avrtiny family",
+ .dependencies = featureSet(&[_]Feature{
+ .avr0,
+ .@"break",
+ .smallstack,
+ .sram,
+ .tinyencoding,
+ }),
+ };
+ result[@intFromEnum(Feature.@"break")] = .{
+ .llvm_name = "break",
+ .description = "The device supports the `BREAK` debugging instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.des)] = .{
+ .llvm_name = "des",
+ .description = "The device supports the `DES k` encryption instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.eijmpcall)] = .{
+ .llvm_name = "eijmpcall",
+ .description = "The device supports the `EIJMP`/`EICALL` instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.elpm)] = .{
+ .llvm_name = "elpm",
+ .description = "The device supports the ELPM instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.elpmx)] = .{
+ .llvm_name = "elpmx",
+ .description = "The device supports the `ELPM Rd, Z[+]` instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ijmpcall)] = .{
+ .llvm_name = "ijmpcall",
+ .description = "The device supports `IJMP`/`ICALL`instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.jmpcall)] = .{
+ .llvm_name = "jmpcall",
+ .description = "The device supports the `JMP` and `CALL` instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lowbytefirst)] = .{
+ .llvm_name = "lowbytefirst",
+ .description = "Do the low byte first when writing a 16-bit port or storing a 16-bit word",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lpm)] = .{
+ .llvm_name = "lpm",
+ .description = "The device supports the `LPM` instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lpmx)] = .{
+ .llvm_name = "lpmx",
+ .description = "The device supports the `LPM Rd, Z[+]` instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.memmappedregs)] = .{
+ .llvm_name = "memmappedregs",
+ .description = "The device has CPU registers mapped in data address space",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.movw)] = .{
+ .llvm_name = "movw",
+ .description = "The device supports the 16-bit MOVW instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mul)] = .{
+ .llvm_name = "mul",
+ .description = "The device supports the multiplication instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rmw)] = .{
+ .llvm_name = "rmw",
+ .description = "The device supports the read-write-modify instructions: XCH, LAS, LAC, LAT",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.smallstack)] = .{
+ .llvm_name = "smallstack",
+ .description = "The device has an 8-bit stack pointer",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.special)] = .{
+ .llvm_name = "special",
+ .description = "Enable use of the entire instruction set - used for debugging",
+ .dependencies = featureSet(&[_]Feature{
+ .addsubiw,
+ .@"break",
+ .des,
+ .eijmpcall,
+ .elpm,
+ .elpmx,
+ .ijmpcall,
+ .jmpcall,
+ .lpm,
+ .lpmx,
+ .memmappedregs,
+ .movw,
+ .mul,
+ .rmw,
+ .spm,
+ .spmx,
+ .sram,
+ }),
+ };
+ result[@intFromEnum(Feature.spm)] = .{
+ .llvm_name = "spm",
+ .description = "The device supports the `SPM` instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.spmx)] = .{
+ .llvm_name = "spmx",
+ .description = "The device supports the `SPM Z+` instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sram)] = .{
+ .llvm_name = "sram",
+ .description = "The device has random access memory",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tinyencoding)] = .{
+ .llvm_name = "tinyencoding",
+ .description = "The device has Tiny core specific instruction encodings",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xmega)] = .{
+ .llvm_name = "xmega",
+ .description = "The device is a part of the xmega family",
+ .dependencies = featureSet(&[_]Feature{
+ .addsubiw,
+ .avr0,
+ .@"break",
+ .des,
+ .eijmpcall,
+ .elpm,
+ .elpmx,
+ .ijmpcall,
+ .jmpcall,
+ .lowbytefirst,
+ .lpm,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ .spmx,
+ .sram,
+ }),
+ };
+ result[@intFromEnum(Feature.xmega3)] = .{
+ .llvm_name = "xmega3",
+ .description = "The device is a part of the xmega3 family",
+ .dependencies = featureSet(&[_]Feature{
+ .addsubiw,
+ .avr0,
+ .@"break",
+ .ijmpcall,
+ .jmpcall,
+ .lowbytefirst,
+ .lpm,
+ .lpmx,
+ .movw,
+ .mul,
+ .sram,
+ }),
+ };
+ result[@intFromEnum(Feature.xmegau)] = .{
+ .llvm_name = "xmegau",
+ .description = "The device is a part of the xmegau family",
+ .dependencies = featureSet(&[_]Feature{
+ .rmw,
+ .xmega,
+ }),
+ };
+ 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 at43usb320 = CpuModel{
+ .name = "at43usb320",
+ .llvm_name = "at43usb320",
+ .features = featureSet(&[_]Feature{
+ .avr31,
+ }),
+ };
+ pub const at43usb355 = CpuModel{
+ .name = "at43usb355",
+ .llvm_name = "at43usb355",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ }),
+ };
+ pub const at76c711 = CpuModel{
+ .name = "at76c711",
+ .llvm_name = "at76c711",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ }),
+ };
+ pub const at86rf401 = CpuModel{
+ .name = "at86rf401",
+ .llvm_name = "at86rf401",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .movw,
+ }),
+ };
+ pub const at90c8534 = CpuModel{
+ .name = "at90c8534",
+ .llvm_name = "at90c8534",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ }),
+ };
+ pub const at90can128 = CpuModel{
+ .name = "at90can128",
+ .llvm_name = "at90can128",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const at90can32 = CpuModel{
+ .name = "at90can32",
+ .llvm_name = "at90can32",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90can64 = CpuModel{
+ .name = "at90can64",
+ .llvm_name = "at90can64",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90pwm1 = CpuModel{
+ .name = "at90pwm1",
+ .llvm_name = "at90pwm1",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90pwm161 = CpuModel{
+ .name = "at90pwm161",
+ .llvm_name = "at90pwm161",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90pwm2 = CpuModel{
+ .name = "at90pwm2",
+ .llvm_name = "at90pwm2",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90pwm216 = CpuModel{
+ .name = "at90pwm216",
+ .llvm_name = "at90pwm216",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90pwm2b = CpuModel{
+ .name = "at90pwm2b",
+ .llvm_name = "at90pwm2b",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90pwm3 = CpuModel{
+ .name = "at90pwm3",
+ .llvm_name = "at90pwm3",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90pwm316 = CpuModel{
+ .name = "at90pwm316",
+ .llvm_name = "at90pwm316",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90pwm3b = CpuModel{
+ .name = "at90pwm3b",
+ .llvm_name = "at90pwm3b",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90pwm81 = CpuModel{
+ .name = "at90pwm81",
+ .llvm_name = "at90pwm81",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const at90s1200 = CpuModel{
+ .name = "at90s1200",
+ .llvm_name = "at90s1200",
+ .features = featureSet(&[_]Feature{
+ .avr0,
+ .smallstack,
+ }),
+ };
+ pub const at90s2313 = CpuModel{
+ .name = "at90s2313",
+ .llvm_name = "at90s2313",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s2323 = CpuModel{
+ .name = "at90s2323",
+ .llvm_name = "at90s2323",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s2333 = CpuModel{
+ .name = "at90s2333",
+ .llvm_name = "at90s2333",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s2343 = CpuModel{
+ .name = "at90s2343",
+ .llvm_name = "at90s2343",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s4414 = CpuModel{
+ .name = "at90s4414",
+ .llvm_name = "at90s4414",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s4433 = CpuModel{
+ .name = "at90s4433",
+ .llvm_name = "at90s4433",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s4434 = CpuModel{
+ .name = "at90s4434",
+ .llvm_name = "at90s4434",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const at90s8515 = CpuModel{
+ .name = "at90s8515",
+ .llvm_name = "at90s8515",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ }),
+ };
+ pub const at90s8535 = CpuModel{
+ .name = "at90s8535",
+ .llvm_name = "at90s8535",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ }),
+ };
+ pub const at90scr100 = CpuModel{
+ .name = "at90scr100",
+ .llvm_name = "at90scr100",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90usb1286 = CpuModel{
+ .name = "at90usb1286",
+ .llvm_name = "at90usb1286",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const at90usb1287 = CpuModel{
+ .name = "at90usb1287",
+ .llvm_name = "at90usb1287",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const at90usb162 = CpuModel{
+ .name = "at90usb162",
+ .llvm_name = "at90usb162",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const at90usb646 = CpuModel{
+ .name = "at90usb646",
+ .llvm_name = "at90usb646",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90usb647 = CpuModel{
+ .name = "at90usb647",
+ .llvm_name = "at90usb647",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const at90usb82 = CpuModel{
+ .name = "at90usb82",
+ .llvm_name = "at90usb82",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const at94k = CpuModel{
+ .name = "at94k",
+ .llvm_name = "at94k",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ .lpmx,
+ .movw,
+ .mul,
+ }),
+ };
+ pub const ata5272 = CpuModel{
+ .name = "ata5272",
+ .llvm_name = "ata5272",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const ata5505 = CpuModel{
+ .name = "ata5505",
+ .llvm_name = "ata5505",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const ata5702m322 = CpuModel{
+ .name = "ata5702m322",
+ .llvm_name = "ata5702m322",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5782 = CpuModel{
+ .name = "ata5782",
+ .llvm_name = "ata5782",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5790 = CpuModel{
+ .name = "ata5790",
+ .llvm_name = "ata5790",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5790n = CpuModel{
+ .name = "ata5790n",
+ .llvm_name = "ata5790n",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5791 = CpuModel{
+ .name = "ata5791",
+ .llvm_name = "ata5791",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5795 = CpuModel{
+ .name = "ata5795",
+ .llvm_name = "ata5795",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata5831 = CpuModel{
+ .name = "ata5831",
+ .llvm_name = "ata5831",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata6285 = CpuModel{
+ .name = "ata6285",
+ .llvm_name = "ata6285",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const ata6286 = CpuModel{
+ .name = "ata6286",
+ .llvm_name = "ata6286",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const ata6289 = CpuModel{
+ .name = "ata6289",
+ .llvm_name = "ata6289",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const ata6612c = CpuModel{
+ .name = "ata6612c",
+ .llvm_name = "ata6612c",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const ata6613c = CpuModel{
+ .name = "ata6613c",
+ .llvm_name = "ata6613c",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata6614q = CpuModel{
+ .name = "ata6614q",
+ .llvm_name = "ata6614q",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata6616c = CpuModel{
+ .name = "ata6616c",
+ .llvm_name = "ata6616c",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const ata6617c = CpuModel{
+ .name = "ata6617c",
+ .llvm_name = "ata6617c",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const ata664251 = CpuModel{
+ .name = "ata664251",
+ .llvm_name = "ata664251",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const ata8210 = CpuModel{
+ .name = "ata8210",
+ .llvm_name = "ata8210",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const ata8510 = CpuModel{
+ .name = "ata8510",
+ .llvm_name = "ata8510",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega103 = CpuModel{
+ .name = "atmega103",
+ .llvm_name = "atmega103",
+ .features = featureSet(&[_]Feature{
+ .avr31,
+ }),
+ };
+ pub const atmega128 = CpuModel{
+ .name = "atmega128",
+ .llvm_name = "atmega128",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega1280 = CpuModel{
+ .name = "atmega1280",
+ .llvm_name = "atmega1280",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega1281 = CpuModel{
+ .name = "atmega1281",
+ .llvm_name = "atmega1281",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega1284 = CpuModel{
+ .name = "atmega1284",
+ .llvm_name = "atmega1284",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega1284p = CpuModel{
+ .name = "atmega1284p",
+ .llvm_name = "atmega1284p",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega1284rfr2 = CpuModel{
+ .name = "atmega1284rfr2",
+ .llvm_name = "atmega1284rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega128a = CpuModel{
+ .name = "atmega128a",
+ .llvm_name = "atmega128a",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega128rfa1 = CpuModel{
+ .name = "atmega128rfa1",
+ .llvm_name = "atmega128rfa1",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega128rfr2 = CpuModel{
+ .name = "atmega128rfr2",
+ .llvm_name = "atmega128rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const atmega16 = CpuModel{
+ .name = "atmega16",
+ .llvm_name = "atmega16",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega1608 = CpuModel{
+ .name = "atmega1608",
+ .llvm_name = "atmega1608",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega1609 = CpuModel{
+ .name = "atmega1609",
+ .llvm_name = "atmega1609",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega161 = CpuModel{
+ .name = "atmega161",
+ .llvm_name = "atmega161",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega162 = CpuModel{
+ .name = "atmega162",
+ .llvm_name = "atmega162",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega163 = CpuModel{
+ .name = "atmega163",
+ .llvm_name = "atmega163",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega164a = CpuModel{
+ .name = "atmega164a",
+ .llvm_name = "atmega164a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega164p = CpuModel{
+ .name = "atmega164p",
+ .llvm_name = "atmega164p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega164pa = CpuModel{
+ .name = "atmega164pa",
+ .llvm_name = "atmega164pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega165 = CpuModel{
+ .name = "atmega165",
+ .llvm_name = "atmega165",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega165a = CpuModel{
+ .name = "atmega165a",
+ .llvm_name = "atmega165a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega165p = CpuModel{
+ .name = "atmega165p",
+ .llvm_name = "atmega165p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega165pa = CpuModel{
+ .name = "atmega165pa",
+ .llvm_name = "atmega165pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega168 = CpuModel{
+ .name = "atmega168",
+ .llvm_name = "atmega168",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega168a = CpuModel{
+ .name = "atmega168a",
+ .llvm_name = "atmega168a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega168p = CpuModel{
+ .name = "atmega168p",
+ .llvm_name = "atmega168p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega168pa = CpuModel{
+ .name = "atmega168pa",
+ .llvm_name = "atmega168pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega168pb = CpuModel{
+ .name = "atmega168pb",
+ .llvm_name = "atmega168pb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega169 = CpuModel{
+ .name = "atmega169",
+ .llvm_name = "atmega169",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega169a = CpuModel{
+ .name = "atmega169a",
+ .llvm_name = "atmega169a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega169p = CpuModel{
+ .name = "atmega169p",
+ .llvm_name = "atmega169p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega169pa = CpuModel{
+ .name = "atmega169pa",
+ .llvm_name = "atmega169pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16a = CpuModel{
+ .name = "atmega16a",
+ .llvm_name = "atmega16a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16hva = CpuModel{
+ .name = "atmega16hva",
+ .llvm_name = "atmega16hva",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16hva2 = CpuModel{
+ .name = "atmega16hva2",
+ .llvm_name = "atmega16hva2",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16hvb = CpuModel{
+ .name = "atmega16hvb",
+ .llvm_name = "atmega16hvb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16hvbrevb = CpuModel{
+ .name = "atmega16hvbrevb",
+ .llvm_name = "atmega16hvbrevb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16m1 = CpuModel{
+ .name = "atmega16m1",
+ .llvm_name = "atmega16m1",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega16u2 = CpuModel{
+ .name = "atmega16u2",
+ .llvm_name = "atmega16u2",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const atmega16u4 = CpuModel{
+ .name = "atmega16u4",
+ .llvm_name = "atmega16u4",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega2560 = CpuModel{
+ .name = "atmega2560",
+ .llvm_name = "atmega2560",
+ .features = featureSet(&[_]Feature{
+ .avr6,
+ }),
+ };
+ pub const atmega2561 = CpuModel{
+ .name = "atmega2561",
+ .llvm_name = "atmega2561",
+ .features = featureSet(&[_]Feature{
+ .avr6,
+ }),
+ };
+ pub const atmega2564rfr2 = CpuModel{
+ .name = "atmega2564rfr2",
+ .llvm_name = "atmega2564rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr6,
+ }),
+ };
+ pub const atmega256rfr2 = CpuModel{
+ .name = "atmega256rfr2",
+ .llvm_name = "atmega256rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr6,
+ }),
+ };
+ pub const atmega32 = CpuModel{
+ .name = "atmega32",
+ .llvm_name = "atmega32",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3208 = CpuModel{
+ .name = "atmega3208",
+ .llvm_name = "atmega3208",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega3209 = CpuModel{
+ .name = "atmega3209",
+ .llvm_name = "atmega3209",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega323 = CpuModel{
+ .name = "atmega323",
+ .llvm_name = "atmega323",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega324a = CpuModel{
+ .name = "atmega324a",
+ .llvm_name = "atmega324a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega324p = CpuModel{
+ .name = "atmega324p",
+ .llvm_name = "atmega324p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega324pa = CpuModel{
+ .name = "atmega324pa",
+ .llvm_name = "atmega324pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega324pb = CpuModel{
+ .name = "atmega324pb",
+ .llvm_name = "atmega324pb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega325 = CpuModel{
+ .name = "atmega325",
+ .llvm_name = "atmega325",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3250 = CpuModel{
+ .name = "atmega3250",
+ .llvm_name = "atmega3250",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3250a = CpuModel{
+ .name = "atmega3250a",
+ .llvm_name = "atmega3250a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3250p = CpuModel{
+ .name = "atmega3250p",
+ .llvm_name = "atmega3250p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3250pa = CpuModel{
+ .name = "atmega3250pa",
+ .llvm_name = "atmega3250pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega325a = CpuModel{
+ .name = "atmega325a",
+ .llvm_name = "atmega325a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega325p = CpuModel{
+ .name = "atmega325p",
+ .llvm_name = "atmega325p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega325pa = CpuModel{
+ .name = "atmega325pa",
+ .llvm_name = "atmega325pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega328 = CpuModel{
+ .name = "atmega328",
+ .llvm_name = "atmega328",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega328p = CpuModel{
+ .name = "atmega328p",
+ .llvm_name = "atmega328p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega328pb = CpuModel{
+ .name = "atmega328pb",
+ .llvm_name = "atmega328pb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega329 = CpuModel{
+ .name = "atmega329",
+ .llvm_name = "atmega329",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3290 = CpuModel{
+ .name = "atmega3290",
+ .llvm_name = "atmega3290",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3290a = CpuModel{
+ .name = "atmega3290a",
+ .llvm_name = "atmega3290a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3290p = CpuModel{
+ .name = "atmega3290p",
+ .llvm_name = "atmega3290p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega3290pa = CpuModel{
+ .name = "atmega3290pa",
+ .llvm_name = "atmega3290pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega329a = CpuModel{
+ .name = "atmega329a",
+ .llvm_name = "atmega329a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega329p = CpuModel{
+ .name = "atmega329p",
+ .llvm_name = "atmega329p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega329pa = CpuModel{
+ .name = "atmega329pa",
+ .llvm_name = "atmega329pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32a = CpuModel{
+ .name = "atmega32a",
+ .llvm_name = "atmega32a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32c1 = CpuModel{
+ .name = "atmega32c1",
+ .llvm_name = "atmega32c1",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32hvb = CpuModel{
+ .name = "atmega32hvb",
+ .llvm_name = "atmega32hvb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32hvbrevb = CpuModel{
+ .name = "atmega32hvbrevb",
+ .llvm_name = "atmega32hvbrevb",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32m1 = CpuModel{
+ .name = "atmega32m1",
+ .llvm_name = "atmega32m1",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32u2 = CpuModel{
+ .name = "atmega32u2",
+ .llvm_name = "atmega32u2",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const atmega32u4 = CpuModel{
+ .name = "atmega32u4",
+ .llvm_name = "atmega32u4",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega32u6 = CpuModel{
+ .name = "atmega32u6",
+ .llvm_name = "atmega32u6",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega406 = CpuModel{
+ .name = "atmega406",
+ .llvm_name = "atmega406",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega48 = CpuModel{
+ .name = "atmega48",
+ .llvm_name = "atmega48",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega4808 = CpuModel{
+ .name = "atmega4808",
+ .llvm_name = "atmega4808",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega4809 = CpuModel{
+ .name = "atmega4809",
+ .llvm_name = "atmega4809",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega48a = CpuModel{
+ .name = "atmega48a",
+ .llvm_name = "atmega48a",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega48p = CpuModel{
+ .name = "atmega48p",
+ .llvm_name = "atmega48p",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega48pa = CpuModel{
+ .name = "atmega48pa",
+ .llvm_name = "atmega48pa",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega48pb = CpuModel{
+ .name = "atmega48pb",
+ .llvm_name = "atmega48pb",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega64 = CpuModel{
+ .name = "atmega64",
+ .llvm_name = "atmega64",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega640 = CpuModel{
+ .name = "atmega640",
+ .llvm_name = "atmega640",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega644 = CpuModel{
+ .name = "atmega644",
+ .llvm_name = "atmega644",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega644a = CpuModel{
+ .name = "atmega644a",
+ .llvm_name = "atmega644a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega644p = CpuModel{
+ .name = "atmega644p",
+ .llvm_name = "atmega644p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega644pa = CpuModel{
+ .name = "atmega644pa",
+ .llvm_name = "atmega644pa",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega644rfr2 = CpuModel{
+ .name = "atmega644rfr2",
+ .llvm_name = "atmega644rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega645 = CpuModel{
+ .name = "atmega645",
+ .llvm_name = "atmega645",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6450 = CpuModel{
+ .name = "atmega6450",
+ .llvm_name = "atmega6450",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6450a = CpuModel{
+ .name = "atmega6450a",
+ .llvm_name = "atmega6450a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6450p = CpuModel{
+ .name = "atmega6450p",
+ .llvm_name = "atmega6450p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega645a = CpuModel{
+ .name = "atmega645a",
+ .llvm_name = "atmega645a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega645p = CpuModel{
+ .name = "atmega645p",
+ .llvm_name = "atmega645p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega649 = CpuModel{
+ .name = "atmega649",
+ .llvm_name = "atmega649",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6490 = CpuModel{
+ .name = "atmega6490",
+ .llvm_name = "atmega6490",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6490a = CpuModel{
+ .name = "atmega6490a",
+ .llvm_name = "atmega6490a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega6490p = CpuModel{
+ .name = "atmega6490p",
+ .llvm_name = "atmega6490p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega649a = CpuModel{
+ .name = "atmega649a",
+ .llvm_name = "atmega649a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega649p = CpuModel{
+ .name = "atmega649p",
+ .llvm_name = "atmega649p",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64a = CpuModel{
+ .name = "atmega64a",
+ .llvm_name = "atmega64a",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64c1 = CpuModel{
+ .name = "atmega64c1",
+ .llvm_name = "atmega64c1",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64hve = CpuModel{
+ .name = "atmega64hve",
+ .llvm_name = "atmega64hve",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64hve2 = CpuModel{
+ .name = "atmega64hve2",
+ .llvm_name = "atmega64hve2",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64m1 = CpuModel{
+ .name = "atmega64m1",
+ .llvm_name = "atmega64m1",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega64rfr2 = CpuModel{
+ .name = "atmega64rfr2",
+ .llvm_name = "atmega64rfr2",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const atmega8 = CpuModel{
+ .name = "atmega8",
+ .llvm_name = "atmega8",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega808 = CpuModel{
+ .name = "atmega808",
+ .llvm_name = "atmega808",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega809 = CpuModel{
+ .name = "atmega809",
+ .llvm_name = "atmega809",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const atmega8515 = CpuModel{
+ .name = "atmega8515",
+ .llvm_name = "atmega8515",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega8535 = CpuModel{
+ .name = "atmega8535",
+ .llvm_name = "atmega8535",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega88 = CpuModel{
+ .name = "atmega88",
+ .llvm_name = "atmega88",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega88a = CpuModel{
+ .name = "atmega88a",
+ .llvm_name = "atmega88a",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega88p = CpuModel{
+ .name = "atmega88p",
+ .llvm_name = "atmega88p",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega88pa = CpuModel{
+ .name = "atmega88pa",
+ .llvm_name = "atmega88pa",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega88pb = CpuModel{
+ .name = "atmega88pb",
+ .llvm_name = "atmega88pb",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega8a = CpuModel{
+ .name = "atmega8a",
+ .llvm_name = "atmega8a",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .movw,
+ .mul,
+ .spm,
+ }),
+ };
+ pub const atmega8hva = CpuModel{
+ .name = "atmega8hva",
+ .llvm_name = "atmega8hva",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const atmega8u2 = CpuModel{
+ .name = "atmega8u2",
+ .llvm_name = "atmega8u2",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const attiny10 = CpuModel{
+ .name = "attiny10",
+ .llvm_name = "attiny10",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny102 = CpuModel{
+ .name = "attiny102",
+ .llvm_name = "attiny102",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny104 = CpuModel{
+ .name = "attiny104",
+ .llvm_name = "attiny104",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny11 = CpuModel{
+ .name = "attiny11",
+ .llvm_name = "attiny11",
+ .features = featureSet(&[_]Feature{
+ .avr1,
+ .smallstack,
+ }),
+ };
+ pub const attiny12 = CpuModel{
+ .name = "attiny12",
+ .llvm_name = "attiny12",
+ .features = featureSet(&[_]Feature{
+ .avr1,
+ .smallstack,
+ }),
+ };
+ pub const attiny13 = CpuModel{
+ .name = "attiny13",
+ .llvm_name = "attiny13",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny13a = CpuModel{
+ .name = "attiny13a",
+ .llvm_name = "attiny13a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny15 = CpuModel{
+ .name = "attiny15",
+ .llvm_name = "attiny15",
+ .features = featureSet(&[_]Feature{
+ .avr1,
+ .smallstack,
+ }),
+ };
+ pub const attiny1604 = CpuModel{
+ .name = "attiny1604",
+ .llvm_name = "attiny1604",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1606 = CpuModel{
+ .name = "attiny1606",
+ .llvm_name = "attiny1606",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1607 = CpuModel{
+ .name = "attiny1607",
+ .llvm_name = "attiny1607",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1614 = CpuModel{
+ .name = "attiny1614",
+ .llvm_name = "attiny1614",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1616 = CpuModel{
+ .name = "attiny1616",
+ .llvm_name = "attiny1616",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1617 = CpuModel{
+ .name = "attiny1617",
+ .llvm_name = "attiny1617",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1624 = CpuModel{
+ .name = "attiny1624",
+ .llvm_name = "attiny1624",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1626 = CpuModel{
+ .name = "attiny1626",
+ .llvm_name = "attiny1626",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1627 = CpuModel{
+ .name = "attiny1627",
+ .llvm_name = "attiny1627",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny1634 = CpuModel{
+ .name = "attiny1634",
+ .llvm_name = "attiny1634",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const attiny167 = CpuModel{
+ .name = "attiny167",
+ .llvm_name = "attiny167",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const attiny20 = CpuModel{
+ .name = "attiny20",
+ .llvm_name = "attiny20",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny202 = CpuModel{
+ .name = "attiny202",
+ .llvm_name = "attiny202",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny204 = CpuModel{
+ .name = "attiny204",
+ .llvm_name = "attiny204",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny212 = CpuModel{
+ .name = "attiny212",
+ .llvm_name = "attiny212",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny214 = CpuModel{
+ .name = "attiny214",
+ .llvm_name = "attiny214",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny22 = CpuModel{
+ .name = "attiny22",
+ .llvm_name = "attiny22",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .smallstack,
+ }),
+ };
+ pub const attiny2313 = CpuModel{
+ .name = "attiny2313",
+ .llvm_name = "attiny2313",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny2313a = CpuModel{
+ .name = "attiny2313a",
+ .llvm_name = "attiny2313a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny24 = CpuModel{
+ .name = "attiny24",
+ .llvm_name = "attiny24",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny24a = CpuModel{
+ .name = "attiny24a",
+ .llvm_name = "attiny24a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny25 = CpuModel{
+ .name = "attiny25",
+ .llvm_name = "attiny25",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny26 = CpuModel{
+ .name = "attiny26",
+ .llvm_name = "attiny26",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ .lpmx,
+ .smallstack,
+ }),
+ };
+ pub const attiny261 = CpuModel{
+ .name = "attiny261",
+ .llvm_name = "attiny261",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny261a = CpuModel{
+ .name = "attiny261a",
+ .llvm_name = "attiny261a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ .smallstack,
+ }),
+ };
+ pub const attiny28 = CpuModel{
+ .name = "attiny28",
+ .llvm_name = "attiny28",
+ .features = featureSet(&[_]Feature{
+ .avr1,
+ .smallstack,
+ }),
+ };
+ pub const attiny3216 = CpuModel{
+ .name = "attiny3216",
+ .llvm_name = "attiny3216",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny3217 = CpuModel{
+ .name = "attiny3217",
+ .llvm_name = "attiny3217",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny4 = CpuModel{
+ .name = "attiny4",
+ .llvm_name = "attiny4",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny40 = CpuModel{
+ .name = "attiny40",
+ .llvm_name = "attiny40",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny402 = CpuModel{
+ .name = "attiny402",
+ .llvm_name = "attiny402",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny404 = CpuModel{
+ .name = "attiny404",
+ .llvm_name = "attiny404",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny406 = CpuModel{
+ .name = "attiny406",
+ .llvm_name = "attiny406",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny412 = CpuModel{
+ .name = "attiny412",
+ .llvm_name = "attiny412",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny414 = CpuModel{
+ .name = "attiny414",
+ .llvm_name = "attiny414",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny416 = CpuModel{
+ .name = "attiny416",
+ .llvm_name = "attiny416",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny417 = CpuModel{
+ .name = "attiny417",
+ .llvm_name = "attiny417",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny4313 = CpuModel{
+ .name = "attiny4313",
+ .llvm_name = "attiny4313",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny43u = CpuModel{
+ .name = "attiny43u",
+ .llvm_name = "attiny43u",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny44 = CpuModel{
+ .name = "attiny44",
+ .llvm_name = "attiny44",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny441 = CpuModel{
+ .name = "attiny441",
+ .llvm_name = "attiny441",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny44a = CpuModel{
+ .name = "attiny44a",
+ .llvm_name = "attiny44a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny45 = CpuModel{
+ .name = "attiny45",
+ .llvm_name = "attiny45",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny461 = CpuModel{
+ .name = "attiny461",
+ .llvm_name = "attiny461",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny461a = CpuModel{
+ .name = "attiny461a",
+ .llvm_name = "attiny461a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny48 = CpuModel{
+ .name = "attiny48",
+ .llvm_name = "attiny48",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny5 = CpuModel{
+ .name = "attiny5",
+ .llvm_name = "attiny5",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const attiny804 = CpuModel{
+ .name = "attiny804",
+ .llvm_name = "attiny804",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny806 = CpuModel{
+ .name = "attiny806",
+ .llvm_name = "attiny806",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny807 = CpuModel{
+ .name = "attiny807",
+ .llvm_name = "attiny807",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny814 = CpuModel{
+ .name = "attiny814",
+ .llvm_name = "attiny814",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny816 = CpuModel{
+ .name = "attiny816",
+ .llvm_name = "attiny816",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny817 = CpuModel{
+ .name = "attiny817",
+ .llvm_name = "attiny817",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const attiny828 = CpuModel{
+ .name = "attiny828",
+ .llvm_name = "attiny828",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny84 = CpuModel{
+ .name = "attiny84",
+ .llvm_name = "attiny84",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny841 = CpuModel{
+ .name = "attiny841",
+ .llvm_name = "attiny841",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny84a = CpuModel{
+ .name = "attiny84a",
+ .llvm_name = "attiny84a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny85 = CpuModel{
+ .name = "attiny85",
+ .llvm_name = "attiny85",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny861 = CpuModel{
+ .name = "attiny861",
+ .llvm_name = "attiny861",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny861a = CpuModel{
+ .name = "attiny861a",
+ .llvm_name = "attiny861a",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny87 = CpuModel{
+ .name = "attiny87",
+ .llvm_name = "attiny87",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny88 = CpuModel{
+ .name = "attiny88",
+ .llvm_name = "attiny88",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const attiny9 = CpuModel{
+ .name = "attiny9",
+ .llvm_name = "attiny9",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const atxmega128a1 = CpuModel{
+ .name = "atxmega128a1",
+ .llvm_name = "atxmega128a1",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega128a1u = CpuModel{
+ .name = "atxmega128a1u",
+ .llvm_name = "atxmega128a1u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128a3 = CpuModel{
+ .name = "atxmega128a3",
+ .llvm_name = "atxmega128a3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega128a3u = CpuModel{
+ .name = "atxmega128a3u",
+ .llvm_name = "atxmega128a3u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128a4u = CpuModel{
+ .name = "atxmega128a4u",
+ .llvm_name = "atxmega128a4u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128b1 = CpuModel{
+ .name = "atxmega128b1",
+ .llvm_name = "atxmega128b1",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128b3 = CpuModel{
+ .name = "atxmega128b3",
+ .llvm_name = "atxmega128b3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128c3 = CpuModel{
+ .name = "atxmega128c3",
+ .llvm_name = "atxmega128c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega128d3 = CpuModel{
+ .name = "atxmega128d3",
+ .llvm_name = "atxmega128d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega128d4 = CpuModel{
+ .name = "atxmega128d4",
+ .llvm_name = "atxmega128d4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega16a4 = CpuModel{
+ .name = "atxmega16a4",
+ .llvm_name = "atxmega16a4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega16a4u = CpuModel{
+ .name = "atxmega16a4u",
+ .llvm_name = "atxmega16a4u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega16c4 = CpuModel{
+ .name = "atxmega16c4",
+ .llvm_name = "atxmega16c4",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega16d4 = CpuModel{
+ .name = "atxmega16d4",
+ .llvm_name = "atxmega16d4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega16e5 = CpuModel{
+ .name = "atxmega16e5",
+ .llvm_name = "atxmega16e5",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega192a3 = CpuModel{
+ .name = "atxmega192a3",
+ .llvm_name = "atxmega192a3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega192a3u = CpuModel{
+ .name = "atxmega192a3u",
+ .llvm_name = "atxmega192a3u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega192c3 = CpuModel{
+ .name = "atxmega192c3",
+ .llvm_name = "atxmega192c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega192d3 = CpuModel{
+ .name = "atxmega192d3",
+ .llvm_name = "atxmega192d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega256a3 = CpuModel{
+ .name = "atxmega256a3",
+ .llvm_name = "atxmega256a3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega256a3b = CpuModel{
+ .name = "atxmega256a3b",
+ .llvm_name = "atxmega256a3b",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega256a3bu = CpuModel{
+ .name = "atxmega256a3bu",
+ .llvm_name = "atxmega256a3bu",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega256a3u = CpuModel{
+ .name = "atxmega256a3u",
+ .llvm_name = "atxmega256a3u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega256c3 = CpuModel{
+ .name = "atxmega256c3",
+ .llvm_name = "atxmega256c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega256d3 = CpuModel{
+ .name = "atxmega256d3",
+ .llvm_name = "atxmega256d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega32a4 = CpuModel{
+ .name = "atxmega32a4",
+ .llvm_name = "atxmega32a4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega32a4u = CpuModel{
+ .name = "atxmega32a4u",
+ .llvm_name = "atxmega32a4u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega32c3 = CpuModel{
+ .name = "atxmega32c3",
+ .llvm_name = "atxmega32c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega32c4 = CpuModel{
+ .name = "atxmega32c4",
+ .llvm_name = "atxmega32c4",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega32d3 = CpuModel{
+ .name = "atxmega32d3",
+ .llvm_name = "atxmega32d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega32d4 = CpuModel{
+ .name = "atxmega32d4",
+ .llvm_name = "atxmega32d4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega32e5 = CpuModel{
+ .name = "atxmega32e5",
+ .llvm_name = "atxmega32e5",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega384c3 = CpuModel{
+ .name = "atxmega384c3",
+ .llvm_name = "atxmega384c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega384d3 = CpuModel{
+ .name = "atxmega384d3",
+ .llvm_name = "atxmega384d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega64a1 = CpuModel{
+ .name = "atxmega64a1",
+ .llvm_name = "atxmega64a1",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega64a1u = CpuModel{
+ .name = "atxmega64a1u",
+ .llvm_name = "atxmega64a1u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64a3 = CpuModel{
+ .name = "atxmega64a3",
+ .llvm_name = "atxmega64a3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega64a3u = CpuModel{
+ .name = "atxmega64a3u",
+ .llvm_name = "atxmega64a3u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64a4u = CpuModel{
+ .name = "atxmega64a4u",
+ .llvm_name = "atxmega64a4u",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64b1 = CpuModel{
+ .name = "atxmega64b1",
+ .llvm_name = "atxmega64b1",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64b3 = CpuModel{
+ .name = "atxmega64b3",
+ .llvm_name = "atxmega64b3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64c3 = CpuModel{
+ .name = "atxmega64c3",
+ .llvm_name = "atxmega64c3",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const atxmega64d3 = CpuModel{
+ .name = "atxmega64d3",
+ .llvm_name = "atxmega64d3",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega64d4 = CpuModel{
+ .name = "atxmega64d4",
+ .llvm_name = "atxmega64d4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const atxmega8e5 = CpuModel{
+ .name = "atxmega8e5",
+ .llvm_name = "atxmega8e5",
+ .features = featureSet(&[_]Feature{
+ .xmegau,
+ }),
+ };
+ pub const avr1 = CpuModel{
+ .name = "avr1",
+ .llvm_name = "avr1",
+ .features = featureSet(&[_]Feature{
+ .avr1,
+ }),
+ };
+ pub const avr2 = CpuModel{
+ .name = "avr2",
+ .llvm_name = "avr2",
+ .features = featureSet(&[_]Feature{
+ .avr2,
+ }),
+ };
+ pub const avr25 = CpuModel{
+ .name = "avr25",
+ .llvm_name = "avr25",
+ .features = featureSet(&[_]Feature{
+ .avr25,
+ }),
+ };
+ pub const avr3 = CpuModel{
+ .name = "avr3",
+ .llvm_name = "avr3",
+ .features = featureSet(&[_]Feature{
+ .avr3,
+ }),
+ };
+ pub const avr31 = CpuModel{
+ .name = "avr31",
+ .llvm_name = "avr31",
+ .features = featureSet(&[_]Feature{
+ .avr31,
+ }),
+ };
+ pub const avr35 = CpuModel{
+ .name = "avr35",
+ .llvm_name = "avr35",
+ .features = featureSet(&[_]Feature{
+ .avr35,
+ }),
+ };
+ pub const avr4 = CpuModel{
+ .name = "avr4",
+ .llvm_name = "avr4",
+ .features = featureSet(&[_]Feature{
+ .avr4,
+ }),
+ };
+ pub const avr5 = CpuModel{
+ .name = "avr5",
+ .llvm_name = "avr5",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+ pub const avr51 = CpuModel{
+ .name = "avr51",
+ .llvm_name = "avr51",
+ .features = featureSet(&[_]Feature{
+ .avr51,
+ }),
+ };
+ pub const avr6 = CpuModel{
+ .name = "avr6",
+ .llvm_name = "avr6",
+ .features = featureSet(&[_]Feature{
+ .avr6,
+ }),
+ };
+ pub const avrtiny = CpuModel{
+ .name = "avrtiny",
+ .llvm_name = "avrtiny",
+ .features = featureSet(&[_]Feature{
+ .avrtiny,
+ }),
+ };
+ pub const avrxmega1 = CpuModel{
+ .name = "avrxmega1",
+ .llvm_name = "avrxmega1",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const avrxmega2 = CpuModel{
+ .name = "avrxmega2",
+ .llvm_name = "avrxmega2",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const avrxmega3 = CpuModel{
+ .name = "avrxmega3",
+ .llvm_name = "avrxmega3",
+ .features = featureSet(&[_]Feature{
+ .xmega3,
+ }),
+ };
+ pub const avrxmega4 = CpuModel{
+ .name = "avrxmega4",
+ .llvm_name = "avrxmega4",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const avrxmega5 = CpuModel{
+ .name = "avrxmega5",
+ .llvm_name = "avrxmega5",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const avrxmega6 = CpuModel{
+ .name = "avrxmega6",
+ .llvm_name = "avrxmega6",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const avrxmega7 = CpuModel{
+ .name = "avrxmega7",
+ .llvm_name = "avrxmega7",
+ .features = featureSet(&[_]Feature{
+ .xmega,
+ }),
+ };
+ pub const m3000 = CpuModel{
+ .name = "m3000",
+ .llvm_name = "m3000",
+ .features = featureSet(&[_]Feature{
+ .avr5,
+ }),
+ };
+};
diff --git a/lib/std/Target/bpf.zig b/lib/std/Target/bpf.zig
new file mode 100644
index 0000000000..40dc2d1c7e
--- /dev/null
+++ b/lib/std/Target/bpf.zig
@@ -0,0 +1,73 @@
+//! 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 {
+ alu32,
+ dummy,
+ dwarfris,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.alu32)] = .{
+ .llvm_name = "alu32",
+ .description = "Enable ALU32 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dummy)] = .{
+ .llvm_name = "dummy",
+ .description = "unused feature",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dwarfris)] = .{
+ .llvm_name = "dwarfris",
+ .description = "Disable MCAsmInfo DwarfUsesRelocationsAcrossSections",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const probe = CpuModel{
+ .name = "probe",
+ .llvm_name = "probe",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const v1 = CpuModel{
+ .name = "v1",
+ .llvm_name = "v1",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const v2 = CpuModel{
+ .name = "v2",
+ .llvm_name = "v2",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const v3 = CpuModel{
+ .name = "v3",
+ .llvm_name = "v3",
+ .features = featureSet(&[_]Feature{
+ .alu32,
+ }),
+ };
+};
diff --git a/lib/std/Target/csky.zig b/lib/std/Target/csky.zig
new file mode 100644
index 0000000000..331e8057bf
--- /dev/null
+++ b/lib/std/Target/csky.zig
@@ -0,0 +1,3214 @@
+//! 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 {
+ @"10e60",
+ @"2e3",
+ @"3e3r1",
+ @"3e3r2",
+ @"3e3r3",
+ @"3e7",
+ @"7e10",
+ btst16,
+ cache,
+ ccrt,
+ ck801,
+ ck802,
+ ck803,
+ ck803s,
+ ck804,
+ ck805,
+ ck807,
+ ck810,
+ ck810v,
+ ck860,
+ ck860v,
+ constpool,
+ doloop,
+ dsp1e2,
+ dsp_silan,
+ dspe60,
+ dspv2,
+ e1,
+ e2,
+ edsp,
+ elrw,
+ fdivdu,
+ float1e2,
+ float1e3,
+ float3e4,
+ float7e60,
+ floate1,
+ fpuv2_df,
+ fpuv2_sf,
+ fpuv3_df,
+ fpuv3_hf,
+ fpuv3_hi,
+ fpuv3_sf,
+ hard_float,
+ hard_float_abi,
+ hard_tp,
+ high_registers,
+ hwdiv,
+ istack,
+ java,
+ mp,
+ mp1e2,
+ multiple_stld,
+ nvic,
+ pushpop,
+ smart,
+ soft_tp,
+ stack_size,
+ trust,
+ vdsp2e3,
+ vdsp2e60f,
+ vdspv1,
+ vdspv2,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"10e60")] = .{
+ .llvm_name = "10e60",
+ .description = "Support CSKY 10e60 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"7e10",
+ }),
+ };
+ result[@intFromEnum(Feature.@"2e3")] = .{
+ .llvm_name = "2e3",
+ .description = "Support CSKY 2e3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .e2,
+ }),
+ };
+ result[@intFromEnum(Feature.@"3e3r1")] = .{
+ .llvm_name = "3e3r1",
+ .description = "Support CSKY 3e3r1 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"3e3r2")] = .{
+ .llvm_name = "3e3r2",
+ .description = "Support CSKY 3e3r2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .doloop,
+ }),
+ };
+ result[@intFromEnum(Feature.@"3e3r3")] = .{
+ .llvm_name = "3e3r3",
+ .description = "Support CSKY 3e3r3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .doloop,
+ }),
+ };
+ result[@intFromEnum(Feature.@"3e7")] = .{
+ .llvm_name = "3e7",
+ .description = "Support CSKY 3e7 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"2e3",
+ }),
+ };
+ result[@intFromEnum(Feature.@"7e10")] = .{
+ .llvm_name = "7e10",
+ .description = "Support CSKY 7e10 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"3e7",
+ }),
+ };
+ result[@intFromEnum(Feature.btst16)] = .{
+ .llvm_name = "btst16",
+ .description = "Use the 16-bit btsti instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cache)] = .{
+ .llvm_name = "cache",
+ .description = "Enable cache",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ccrt)] = .{
+ .llvm_name = "ccrt",
+ .description = "Use CSKY compiler runtime",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck801)] = .{
+ .llvm_name = "ck801",
+ .description = "CSKY ck801 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck802)] = .{
+ .llvm_name = "ck802",
+ .description = "CSKY ck802 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck803)] = .{
+ .llvm_name = "ck803",
+ .description = "CSKY ck803 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck803s)] = .{
+ .llvm_name = "ck803s",
+ .description = "CSKY ck803s processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck804)] = .{
+ .llvm_name = "ck804",
+ .description = "CSKY ck804 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck805)] = .{
+ .llvm_name = "ck805",
+ .description = "CSKY ck805 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck807)] = .{
+ .llvm_name = "ck807",
+ .description = "CSKY ck807 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck810)] = .{
+ .llvm_name = "ck810",
+ .description = "CSKY ck810 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck810v)] = .{
+ .llvm_name = "ck810v",
+ .description = "CSKY ck810v processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck860)] = .{
+ .llvm_name = "ck860",
+ .description = "CSKY ck860 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ck860v)] = .{
+ .llvm_name = "ck860v",
+ .description = "CSKY ck860v processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.constpool)] = .{
+ .llvm_name = "constpool",
+ .description = "Dump the constant pool by compiler",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.doloop)] = .{
+ .llvm_name = "doloop",
+ .description = "Enable doloop instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dsp1e2)] = .{
+ .llvm_name = "dsp1e2",
+ .description = "Support CSKY dsp1e2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dsp_silan)] = .{
+ .llvm_name = "dsp_silan",
+ .description = "Enable DSP Silan instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dspe60)] = .{
+ .llvm_name = "dspe60",
+ .description = "Support CSKY dspe60 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dspv2)] = .{
+ .llvm_name = "dspv2",
+ .description = "Enable DSP V2.0 instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.e1)] = .{
+ .llvm_name = "e1",
+ .description = "Support CSKY e1 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .elrw,
+ }),
+ };
+ result[@intFromEnum(Feature.e2)] = .{
+ .llvm_name = "e2",
+ .description = "Support CSKY e2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .e1,
+ }),
+ };
+ result[@intFromEnum(Feature.edsp)] = .{
+ .llvm_name = "edsp",
+ .description = "Enable DSP instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.elrw)] = .{
+ .llvm_name = "elrw",
+ .description = "Use the extend LRW instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fdivdu)] = .{
+ .llvm_name = "fdivdu",
+ .description = "Enable float divide instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.float1e2)] = .{
+ .llvm_name = "float1e2",
+ .description = "Support CSKY float1e2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.float1e3)] = .{
+ .llvm_name = "float1e3",
+ .description = "Support CSKY float1e3 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.float3e4)] = .{
+ .llvm_name = "float3e4",
+ .description = "Support CSKY float3e4 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.float7e60)] = .{
+ .llvm_name = "float7e60",
+ .description = "Support CSKY float7e60 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.floate1)] = .{
+ .llvm_name = "floate1",
+ .description = "Support CSKY floate1 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv2_df)] = .{
+ .llvm_name = "fpuv2_df",
+ .description = "Enable FPUv2 double float instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv2_sf)] = .{
+ .llvm_name = "fpuv2_sf",
+ .description = "Enable FPUv2 single float instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv3_df)] = .{
+ .llvm_name = "fpuv3_df",
+ .description = "Enable FPUv3 double float instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv3_hf)] = .{
+ .llvm_name = "fpuv3_hf",
+ .description = "Enable FPUv3 half precision operate instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv3_hi)] = .{
+ .llvm_name = "fpuv3_hi",
+ .description = "Enable FPUv3 half word converting instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpuv3_sf)] = .{
+ .llvm_name = "fpuv3_sf",
+ .description = "Enable FPUv3 single float instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hard_float)] = .{
+ .llvm_name = "hard-float",
+ .description = "Use hard floating point features",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hard_float_abi)] = .{
+ .llvm_name = "hard-float-abi",
+ .description = "Use hard floating point ABI to pass args",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hard_tp)] = .{
+ .llvm_name = "hard-tp",
+ .description = "Enable TLS Pointer register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.high_registers)] = .{
+ .llvm_name = "high-registers",
+ .description = "Enable r16-r31 registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hwdiv)] = .{
+ .llvm_name = "hwdiv",
+ .description = "Enable divide instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.istack)] = .{
+ .llvm_name = "istack",
+ .description = "Enable interrput attribute",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.java)] = .{
+ .llvm_name = "java",
+ .description = "Enable java instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mp)] = .{
+ .llvm_name = "mp",
+ .description = "Support CSKY mp instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"2e3",
+ }),
+ };
+ result[@intFromEnum(Feature.mp1e2)] = .{
+ .llvm_name = "mp1e2",
+ .description = "Support CSKY mp1e2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"3e7",
+ }),
+ };
+ result[@intFromEnum(Feature.multiple_stld)] = .{
+ .llvm_name = "multiple_stld",
+ .description = "Enable multiple load/store instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nvic)] = .{
+ .llvm_name = "nvic",
+ .description = "Enable NVIC",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pushpop)] = .{
+ .llvm_name = "pushpop",
+ .description = "Enable push/pop instrutions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.smart)] = .{
+ .llvm_name = "smart",
+ .description = "Let CPU work in Smart Mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_tp)] = .{
+ .llvm_name = "soft-tp",
+ .description = "Disable TLS Pointer register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.stack_size)] = .{
+ .llvm_name = "stack-size",
+ .description = "Output stack size information",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.trust)] = .{
+ .llvm_name = "trust",
+ .description = "Enable trust instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vdsp2e3)] = .{
+ .llvm_name = "vdsp2e3",
+ .description = "Support CSKY vdsp2e3 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vdsp2e60f)] = .{
+ .llvm_name = "vdsp2e60f",
+ .description = "Support CSKY vdsp2e60f instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vdspv1)] = .{
+ .llvm_name = "vdspv1",
+ .description = "Enable 128bit vdsp-v1 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vdspv2)] = .{
+ .llvm_name = "vdspv2",
+ .description = "Enable vdsp-v2 instructions",
+ .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 c807 = CpuModel{
+ .name = "c807",
+ .llvm_name = "c807",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const c807f = CpuModel{
+ .name = "c807f",
+ .llvm_name = "c807f",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .float1e3,
+ .float3e4,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const c810 = CpuModel{
+ .name = "c810",
+ .llvm_name = "c810",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const c810t = CpuModel{
+ .name = "c810t",
+ .llvm_name = "c810t",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const c810tv = CpuModel{
+ .name = "c810tv",
+ .llvm_name = "c810tv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const c810v = CpuModel{
+ .name = "c810v",
+ .llvm_name = "c810v",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const c860 = CpuModel{
+ .name = "c860",
+ .llvm_name = "c860",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .dspe60,
+ .float7e60,
+ .fpuv3_df,
+ .fpuv3_hf,
+ .fpuv3_hi,
+ .fpuv3_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const c860v = CpuModel{
+ .name = "c860v",
+ .llvm_name = "c860v",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .ck860v,
+ .dspe60,
+ .float7e60,
+ .fpuv3_df,
+ .fpuv3_hf,
+ .fpuv3_hi,
+ .fpuv3_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdsp2e60f,
+ .vdspv2,
+ }),
+ };
+ pub const ck801 = CpuModel{
+ .name = "ck801",
+ .llvm_name = "ck801",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck801,
+ .e1,
+ .trust,
+ }),
+ };
+ pub const ck801t = CpuModel{
+ .name = "ck801t",
+ .llvm_name = "ck801t",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck801,
+ .e1,
+ .trust,
+ }),
+ };
+ pub const ck802 = CpuModel{
+ .name = "ck802",
+ .llvm_name = "ck802",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck802j = CpuModel{
+ .name = "ck802j",
+ .llvm_name = "ck802j",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .java,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck802t = CpuModel{
+ .name = "ck802t",
+ .llvm_name = "ck802t",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803 = CpuModel{
+ .name = "ck803",
+ .llvm_name = "ck803",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803e = CpuModel{
+ .name = "ck803e",
+ .llvm_name = "ck803e",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ef = CpuModel{
+ .name = "ck803ef",
+ .llvm_name = "ck803ef",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efh = CpuModel{
+ .name = "ck803efh",
+ .llvm_name = "ck803efh",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhr1 = CpuModel{
+ .name = "ck803efhr1",
+ .llvm_name = "ck803efhr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhr2 = CpuModel{
+ .name = "ck803efhr2",
+ .llvm_name = "ck803efhr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhr3 = CpuModel{
+ .name = "ck803efhr3",
+ .llvm_name = "ck803efhr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efht = CpuModel{
+ .name = "ck803efht",
+ .llvm_name = "ck803efht",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhtr1 = CpuModel{
+ .name = "ck803efhtr1",
+ .llvm_name = "ck803efhtr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhtr2 = CpuModel{
+ .name = "ck803efhtr2",
+ .llvm_name = "ck803efhtr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efhtr3 = CpuModel{
+ .name = "ck803efhtr3",
+ .llvm_name = "ck803efhtr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efr1 = CpuModel{
+ .name = "ck803efr1",
+ .llvm_name = "ck803efr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efr2 = CpuModel{
+ .name = "ck803efr2",
+ .llvm_name = "ck803efr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803efr3 = CpuModel{
+ .name = "ck803efr3",
+ .llvm_name = "ck803efr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eft = CpuModel{
+ .name = "ck803eft",
+ .llvm_name = "ck803eft",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eftr1 = CpuModel{
+ .name = "ck803eftr1",
+ .llvm_name = "ck803eftr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eftr2 = CpuModel{
+ .name = "ck803eftr2",
+ .llvm_name = "ck803eftr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eftr3 = CpuModel{
+ .name = "ck803eftr3",
+ .llvm_name = "ck803eftr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eh = CpuModel{
+ .name = "ck803eh",
+ .llvm_name = "ck803eh",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehr1 = CpuModel{
+ .name = "ck803ehr1",
+ .llvm_name = "ck803ehr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehr2 = CpuModel{
+ .name = "ck803ehr2",
+ .llvm_name = "ck803ehr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehr3 = CpuModel{
+ .name = "ck803ehr3",
+ .llvm_name = "ck803ehr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803eht = CpuModel{
+ .name = "ck803eht",
+ .llvm_name = "ck803eht",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehtr1 = CpuModel{
+ .name = "ck803ehtr1",
+ .llvm_name = "ck803ehtr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehtr2 = CpuModel{
+ .name = "ck803ehtr2",
+ .llvm_name = "ck803ehtr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ehtr3 = CpuModel{
+ .name = "ck803ehtr3",
+ .llvm_name = "ck803ehtr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803er1 = CpuModel{
+ .name = "ck803er1",
+ .llvm_name = "ck803er1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803er2 = CpuModel{
+ .name = "ck803er2",
+ .llvm_name = "ck803er2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803er3 = CpuModel{
+ .name = "ck803er3",
+ .llvm_name = "ck803er3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803et = CpuModel{
+ .name = "ck803et",
+ .llvm_name = "ck803et",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803etr1 = CpuModel{
+ .name = "ck803etr1",
+ .llvm_name = "ck803etr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803etr2 = CpuModel{
+ .name = "ck803etr2",
+ .llvm_name = "ck803etr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803etr3 = CpuModel{
+ .name = "ck803etr3",
+ .llvm_name = "ck803etr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dsp1e2,
+ .dspe60,
+ .dspv2,
+ .edsp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803f = CpuModel{
+ .name = "ck803f",
+ .llvm_name = "ck803f",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fh = CpuModel{
+ .name = "ck803fh",
+ .llvm_name = "ck803fh",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fhr1 = CpuModel{
+ .name = "ck803fhr1",
+ .llvm_name = "ck803fhr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fhr2 = CpuModel{
+ .name = "ck803fhr2",
+ .llvm_name = "ck803fhr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fhr3 = CpuModel{
+ .name = "ck803fhr3",
+ .llvm_name = "ck803fhr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fr1 = CpuModel{
+ .name = "ck803fr1",
+ .llvm_name = "ck803fr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fr2 = CpuModel{
+ .name = "ck803fr2",
+ .llvm_name = "ck803fr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803fr3 = CpuModel{
+ .name = "ck803fr3",
+ .llvm_name = "ck803fr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ft = CpuModel{
+ .name = "ck803ft",
+ .llvm_name = "ck803ft",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ftr1 = CpuModel{
+ .name = "ck803ftr1",
+ .llvm_name = "ck803ftr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ftr2 = CpuModel{
+ .name = "ck803ftr2",
+ .llvm_name = "ck803ftr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ftr3 = CpuModel{
+ .name = "ck803ftr3",
+ .llvm_name = "ck803ftr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803h = CpuModel{
+ .name = "ck803h",
+ .llvm_name = "ck803h",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803hr1 = CpuModel{
+ .name = "ck803hr1",
+ .llvm_name = "ck803hr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803hr2 = CpuModel{
+ .name = "ck803hr2",
+ .llvm_name = "ck803hr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803hr3 = CpuModel{
+ .name = "ck803hr3",
+ .llvm_name = "ck803hr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803ht = CpuModel{
+ .name = "ck803ht",
+ .llvm_name = "ck803ht",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803htr1 = CpuModel{
+ .name = "ck803htr1",
+ .llvm_name = "ck803htr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803htr2 = CpuModel{
+ .name = "ck803htr2",
+ .llvm_name = "ck803htr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803htr3 = CpuModel{
+ .name = "ck803htr3",
+ .llvm_name = "ck803htr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803r1 = CpuModel{
+ .name = "ck803r1",
+ .llvm_name = "ck803r1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803r2 = CpuModel{
+ .name = "ck803r2",
+ .llvm_name = "ck803r2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803r3 = CpuModel{
+ .name = "ck803r3",
+ .llvm_name = "ck803r3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803s = CpuModel{
+ .name = "ck803s",
+ .llvm_name = "ck803s",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803se = CpuModel{
+ .name = "ck803se",
+ .llvm_name = "ck803se",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sef = CpuModel{
+ .name = "ck803sef",
+ .llvm_name = "ck803sef",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sefn = CpuModel{
+ .name = "ck803sefn",
+ .llvm_name = "ck803sefn",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dsp_silan,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sefnt = CpuModel{
+ .name = "ck803sefnt",
+ .llvm_name = "ck803sefnt",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dsp_silan,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803seft = CpuModel{
+ .name = "ck803seft",
+ .llvm_name = "ck803seft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sen = CpuModel{
+ .name = "ck803sen",
+ .llvm_name = "ck803sen",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp1e2,
+ .dsp_silan,
+ .dspe60,
+ .edsp,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sf = CpuModel{
+ .name = "ck803sf",
+ .llvm_name = "ck803sf",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sfn = CpuModel{
+ .name = "ck803sfn",
+ .llvm_name = "ck803sfn",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp_silan,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803sn = CpuModel{
+ .name = "ck803sn",
+ .llvm_name = "ck803sn",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp_silan,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803snt = CpuModel{
+ .name = "ck803snt",
+ .llvm_name = "ck803snt",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .dsp_silan,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803st = CpuModel{
+ .name = "ck803st",
+ .llvm_name = "ck803st",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .btst16,
+ .ck803,
+ .ck803s,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803t = CpuModel{
+ .name = "ck803t",
+ .llvm_name = "ck803t",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803tr1 = CpuModel{
+ .name = "ck803tr1",
+ .llvm_name = "ck803tr1",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r1",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803tr2 = CpuModel{
+ .name = "ck803tr2",
+ .llvm_name = "ck803tr2",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck803tr3 = CpuModel{
+ .name = "ck803tr3",
+ .llvm_name = "ck803tr3",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .dspv2,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804 = CpuModel{
+ .name = "ck804",
+ .llvm_name = "ck804",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804e = CpuModel{
+ .name = "ck804e",
+ .llvm_name = "ck804e",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804ef = CpuModel{
+ .name = "ck804ef",
+ .llvm_name = "ck804ef",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804efh = CpuModel{
+ .name = "ck804efh",
+ .llvm_name = "ck804efh",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804efht = CpuModel{
+ .name = "ck804efht",
+ .llvm_name = "ck804efht",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804eft = CpuModel{
+ .name = "ck804eft",
+ .llvm_name = "ck804eft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804eh = CpuModel{
+ .name = "ck804eh",
+ .llvm_name = "ck804eh",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804eht = CpuModel{
+ .name = "ck804eht",
+ .llvm_name = "ck804eht",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804et = CpuModel{
+ .name = "ck804et",
+ .llvm_name = "ck804et",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804f = CpuModel{
+ .name = "ck804f",
+ .llvm_name = "ck804f",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804fh = CpuModel{
+ .name = "ck804fh",
+ .llvm_name = "ck804fh",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804ft = CpuModel{
+ .name = "ck804ft",
+ .llvm_name = "ck804ft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804h = CpuModel{
+ .name = "ck804h",
+ .llvm_name = "ck804h",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804ht = CpuModel{
+ .name = "ck804ht",
+ .llvm_name = "ck804ht",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck804t = CpuModel{
+ .name = "ck804t",
+ .llvm_name = "ck804t",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck805 = CpuModel{
+ .name = "ck805",
+ .llvm_name = "ck805",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805e = CpuModel{
+ .name = "ck805e",
+ .llvm_name = "ck805e",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805ef = CpuModel{
+ .name = "ck805ef",
+ .llvm_name = "ck805ef",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805eft = CpuModel{
+ .name = "ck805eft",
+ .llvm_name = "ck805eft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805et = CpuModel{
+ .name = "ck805et",
+ .llvm_name = "ck805et",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805f = CpuModel{
+ .name = "ck805f",
+ .llvm_name = "ck805f",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805ft = CpuModel{
+ .name = "ck805ft",
+ .llvm_name = "ck805ft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck805t = CpuModel{
+ .name = "ck805t",
+ .llvm_name = "ck805t",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const ck807 = CpuModel{
+ .name = "ck807",
+ .llvm_name = "ck807",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck807e = CpuModel{
+ .name = "ck807e",
+ .llvm_name = "ck807e",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck807ef = CpuModel{
+ .name = "ck807ef",
+ .llvm_name = "ck807ef",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .float1e3,
+ .float3e4,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck807f = CpuModel{
+ .name = "ck807f",
+ .llvm_name = "ck807f",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .float1e3,
+ .float3e4,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810 = CpuModel{
+ .name = "ck810",
+ .llvm_name = "ck810",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810e = CpuModel{
+ .name = "ck810e",
+ .llvm_name = "ck810e",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810ef = CpuModel{
+ .name = "ck810ef",
+ .llvm_name = "ck810ef",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810eft = CpuModel{
+ .name = "ck810eft",
+ .llvm_name = "ck810eft",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810eftv = CpuModel{
+ .name = "ck810eftv",
+ .llvm_name = "ck810eftv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810efv = CpuModel{
+ .name = "ck810efv",
+ .llvm_name = "ck810efv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810et = CpuModel{
+ .name = "ck810et",
+ .llvm_name = "ck810et",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810etv = CpuModel{
+ .name = "ck810etv",
+ .llvm_name = "ck810etv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810ev = CpuModel{
+ .name = "ck810ev",
+ .llvm_name = "ck810ev",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810f = CpuModel{
+ .name = "ck810f",
+ .llvm_name = "ck810f",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810ft = CpuModel{
+ .name = "ck810ft",
+ .llvm_name = "ck810ft",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810ftv = CpuModel{
+ .name = "ck810ftv",
+ .llvm_name = "ck810ftv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810fv = CpuModel{
+ .name = "ck810fv",
+ .llvm_name = "ck810fv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810t = CpuModel{
+ .name = "ck810t",
+ .llvm_name = "ck810t",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck810tv = CpuModel{
+ .name = "ck810tv",
+ .llvm_name = "ck810tv",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck810v = CpuModel{
+ .name = "ck810v",
+ .llvm_name = "ck810v",
+ .features = featureSet(&[_]Feature{
+ .@"7e10",
+ .cache,
+ .ck810,
+ .ck810v,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdspv1,
+ }),
+ };
+ pub const ck860 = CpuModel{
+ .name = "ck860",
+ .llvm_name = "ck860",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .dspe60,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck860f = CpuModel{
+ .name = "ck860f",
+ .llvm_name = "ck860f",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .dspe60,
+ .float7e60,
+ .fpuv3_df,
+ .fpuv3_hf,
+ .fpuv3_hi,
+ .fpuv3_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const ck860fv = CpuModel{
+ .name = "ck860fv",
+ .llvm_name = "ck860fv",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .ck860v,
+ .dspe60,
+ .float7e60,
+ .fpuv3_df,
+ .fpuv3_hf,
+ .fpuv3_hi,
+ .fpuv3_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdsp2e60f,
+ .vdspv2,
+ }),
+ };
+ pub const ck860v = CpuModel{
+ .name = "ck860v",
+ .llvm_name = "ck860v",
+ .features = featureSet(&[_]Feature{
+ .@"10e60",
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .cache,
+ .ck860,
+ .ck860v,
+ .dspe60,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ .vdsp2e60f,
+ .vdspv2,
+ }),
+ };
+ pub const e801 = CpuModel{
+ .name = "e801",
+ .llvm_name = "e801",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck801,
+ .e1,
+ .trust,
+ }),
+ };
+ pub const e802 = CpuModel{
+ .name = "e802",
+ .llvm_name = "e802",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e802t = CpuModel{
+ .name = "e802t",
+ .llvm_name = "e802t",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e803 = CpuModel{
+ .name = "e803",
+ .llvm_name = "e803",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e803t = CpuModel{
+ .name = "e803t",
+ .llvm_name = "e803t",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804d = CpuModel{
+ .name = "e804d",
+ .llvm_name = "e804d",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804df = CpuModel{
+ .name = "e804df",
+ .llvm_name = "e804df",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804dft = CpuModel{
+ .name = "e804dft",
+ .llvm_name = "e804dft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804dt = CpuModel{
+ .name = "e804dt",
+ .llvm_name = "e804dt",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .dspv2,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804f = CpuModel{
+ .name = "e804f",
+ .llvm_name = "e804f",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const e804ft = CpuModel{
+ .name = "e804ft",
+ .llvm_name = "e804ft",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck804,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ }),
+ };
+ pub const @"i805" = CpuModel{
+ .name = "i805",
+ .llvm_name = "i805",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const i805f = CpuModel{
+ .name = "i805f",
+ .llvm_name = "i805f",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .ck805,
+ .float1e3,
+ .floate1,
+ .fpuv2_sf,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ .vdsp2e3,
+ .vdspv2,
+ }),
+ };
+ pub const r807 = CpuModel{
+ .name = "r807",
+ .llvm_name = "r807",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const r807f = CpuModel{
+ .name = "r807f",
+ .llvm_name = "r807f",
+ .features = featureSet(&[_]Feature{
+ .cache,
+ .ck807,
+ .dsp1e2,
+ .dspe60,
+ .edsp,
+ .fdivdu,
+ .float1e2,
+ .float1e3,
+ .float3e4,
+ .floate1,
+ .fpuv2_df,
+ .fpuv2_sf,
+ .hard_tp,
+ .high_registers,
+ .hwdiv,
+ .mp,
+ .mp1e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const s802 = CpuModel{
+ .name = "s802",
+ .llvm_name = "s802",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const s802t = CpuModel{
+ .name = "s802t",
+ .llvm_name = "s802t",
+ .features = featureSet(&[_]Feature{
+ .btst16,
+ .ck802,
+ .e2,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const s803 = CpuModel{
+ .name = "s803",
+ .llvm_name = "s803",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+ pub const s803t = CpuModel{
+ .name = "s803t",
+ .llvm_name = "s803t",
+ .features = featureSet(&[_]Feature{
+ .@"3e3r2",
+ .@"3e3r3",
+ .btst16,
+ .ck803,
+ .hwdiv,
+ .mp,
+ .nvic,
+ .trust,
+ }),
+ };
+};
diff --git a/lib/std/Target/hexagon.zig b/lib/std/Target/hexagon.zig
new file mode 100644
index 0000000000..c84b2cb0c8
--- /dev/null
+++ b/lib/std/Target/hexagon.zig
@@ -0,0 +1,586 @@
+//! 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 {
+ audio,
+ cabac,
+ compound,
+ duplex,
+ hvx,
+ hvx_ieee_fp,
+ hvx_length128b,
+ hvx_length64b,
+ hvx_qfloat,
+ hvxv60,
+ hvxv62,
+ hvxv65,
+ hvxv66,
+ hvxv67,
+ hvxv68,
+ hvxv69,
+ hvxv71,
+ hvxv73,
+ long_calls,
+ mem_noshuf,
+ memops,
+ noreturn_stack_elim,
+ nvj,
+ nvs,
+ packets,
+ prev65,
+ reserved_r19,
+ small_data,
+ tinycore,
+ unsafe_fp,
+ v5,
+ v55,
+ v60,
+ v62,
+ v65,
+ v66,
+ v67,
+ v68,
+ v69,
+ v71,
+ v73,
+ zreg,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.audio)] = .{
+ .llvm_name = "audio",
+ .description = "Hexagon Audio extension instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cabac)] = .{
+ .llvm_name = "cabac",
+ .description = "Emit the CABAC instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.compound)] = .{
+ .llvm_name = "compound",
+ .description = "Use compound instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.duplex)] = .{
+ .llvm_name = "duplex",
+ .description = "Enable generation of duplex instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hvx)] = .{
+ .llvm_name = "hvx",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hvx_ieee_fp)] = .{
+ .llvm_name = "hvx-ieee-fp",
+ .description = "Hexagon HVX IEEE floating point instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hvx_length128b)] = .{
+ .llvm_name = "hvx-length128b",
+ .description = "Hexagon HVX 128B instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvx,
+ }),
+ };
+ result[@intFromEnum(Feature.hvx_length64b)] = .{
+ .llvm_name = "hvx-length64b",
+ .description = "Hexagon HVX 64B instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvx,
+ }),
+ };
+ result[@intFromEnum(Feature.hvx_qfloat)] = .{
+ .llvm_name = "hvx-qfloat",
+ .description = "Hexagon HVX QFloating point instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hvxv60)] = .{
+ .llvm_name = "hvxv60",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvx,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv62)] = .{
+ .llvm_name = "hvxv62",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv60,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv65)] = .{
+ .llvm_name = "hvxv65",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv62,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv66)] = .{
+ .llvm_name = "hvxv66",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv65,
+ .zreg,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv67)] = .{
+ .llvm_name = "hvxv67",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv66,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv68)] = .{
+ .llvm_name = "hvxv68",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv67,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv69)] = .{
+ .llvm_name = "hvxv69",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv68,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv71)] = .{
+ .llvm_name = "hvxv71",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv69,
+ }),
+ };
+ result[@intFromEnum(Feature.hvxv73)] = .{
+ .llvm_name = "hvxv73",
+ .description = "Hexagon HVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hvxv71,
+ }),
+ };
+ result[@intFromEnum(Feature.long_calls)] = .{
+ .llvm_name = "long-calls",
+ .description = "Use constant-extended calls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mem_noshuf)] = .{
+ .llvm_name = "mem_noshuf",
+ .description = "Supports mem_noshuf feature",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.memops)] = .{
+ .llvm_name = "memops",
+ .description = "Use memop instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.noreturn_stack_elim)] = .{
+ .llvm_name = "noreturn-stack-elim",
+ .description = "Eliminate stack allocation in a noreturn function when possible",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nvj)] = .{
+ .llvm_name = "nvj",
+ .description = "Support for new-value jumps",
+ .dependencies = featureSet(&[_]Feature{
+ .packets,
+ }),
+ };
+ result[@intFromEnum(Feature.nvs)] = .{
+ .llvm_name = "nvs",
+ .description = "Support for new-value stores",
+ .dependencies = featureSet(&[_]Feature{
+ .packets,
+ }),
+ };
+ result[@intFromEnum(Feature.packets)] = .{
+ .llvm_name = "packets",
+ .description = "Support for instruction packets",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prev65)] = .{
+ .llvm_name = "prev65",
+ .description = "Support features deprecated in v65",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserved_r19)] = .{
+ .llvm_name = "reserved-r19",
+ .description = "Reserve register R19",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.small_data)] = .{
+ .llvm_name = "small-data",
+ .description = "Allow GP-relative addressing of global variables",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tinycore)] = .{
+ .llvm_name = "tinycore",
+ .description = "Hexagon Tiny Core",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unsafe_fp)] = .{
+ .llvm_name = "unsafe-fp",
+ .description = "Use unsafe FP math",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v5)] = .{
+ .llvm_name = "v5",
+ .description = "Enable Hexagon V5 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v55)] = .{
+ .llvm_name = "v55",
+ .description = "Enable Hexagon V55 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v60)] = .{
+ .llvm_name = "v60",
+ .description = "Enable Hexagon V60 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v62)] = .{
+ .llvm_name = "v62",
+ .description = "Enable Hexagon V62 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v65)] = .{
+ .llvm_name = "v65",
+ .description = "Enable Hexagon V65 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v66)] = .{
+ .llvm_name = "v66",
+ .description = "Enable Hexagon V66 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v67)] = .{
+ .llvm_name = "v67",
+ .description = "Enable Hexagon V67 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v68)] = .{
+ .llvm_name = "v68",
+ .description = "Enable Hexagon V68 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v69)] = .{
+ .llvm_name = "v69",
+ .description = "Enable Hexagon V69 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v71)] = .{
+ .llvm_name = "v71",
+ .description = "Enable Hexagon V71 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v73)] = .{
+ .llvm_name = "v73",
+ .description = "Enable Hexagon V73 architecture",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zreg)] = .{
+ .llvm_name = "zreg",
+ .description = "Hexagon ZReg extension instructions",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .memops,
+ .nvj,
+ .nvs,
+ .prev65,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ }),
+ };
+ pub const hexagonv5 = CpuModel{
+ .name = "hexagonv5",
+ .llvm_name = "hexagonv5",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .memops,
+ .nvj,
+ .nvs,
+ .prev65,
+ .small_data,
+ .v5,
+ }),
+ };
+ pub const hexagonv55 = CpuModel{
+ .name = "hexagonv55",
+ .llvm_name = "hexagonv55",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .memops,
+ .nvj,
+ .nvs,
+ .prev65,
+ .small_data,
+ .v5,
+ .v55,
+ }),
+ };
+ pub const hexagonv60 = CpuModel{
+ .name = "hexagonv60",
+ .llvm_name = "hexagonv60",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .memops,
+ .nvj,
+ .nvs,
+ .prev65,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ }),
+ };
+ pub const hexagonv62 = CpuModel{
+ .name = "hexagonv62",
+ .llvm_name = "hexagonv62",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .memops,
+ .nvj,
+ .nvs,
+ .prev65,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ }),
+ };
+ pub const hexagonv65 = CpuModel{
+ .name = "hexagonv65",
+ .llvm_name = "hexagonv65",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ }),
+ };
+ pub const hexagonv66 = CpuModel{
+ .name = "hexagonv66",
+ .llvm_name = "hexagonv66",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ }),
+ };
+ pub const hexagonv67 = CpuModel{
+ .name = "hexagonv67",
+ .llvm_name = "hexagonv67",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ }),
+ };
+ pub const hexagonv67t = CpuModel{
+ .name = "hexagonv67t",
+ .llvm_name = "hexagonv67t",
+ .features = featureSet(&[_]Feature{
+ .audio,
+ .compound,
+ .mem_noshuf,
+ .memops,
+ .nvs,
+ .small_data,
+ .tinycore,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ }),
+ };
+ pub const hexagonv68 = CpuModel{
+ .name = "hexagonv68",
+ .llvm_name = "hexagonv68",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ .v68,
+ }),
+ };
+ pub const hexagonv69 = CpuModel{
+ .name = "hexagonv69",
+ .llvm_name = "hexagonv69",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ .v68,
+ .v69,
+ }),
+ };
+ pub const hexagonv71 = CpuModel{
+ .name = "hexagonv71",
+ .llvm_name = "hexagonv71",
+ .features = featureSet(&[_]Feature{
+ .cabac,
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ .v68,
+ .v69,
+ .v71,
+ }),
+ };
+ pub const hexagonv71t = CpuModel{
+ .name = "hexagonv71t",
+ .llvm_name = "hexagonv71t",
+ .features = featureSet(&[_]Feature{
+ .audio,
+ .compound,
+ .mem_noshuf,
+ .memops,
+ .nvs,
+ .small_data,
+ .tinycore,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ .v68,
+ .v69,
+ .v71,
+ }),
+ };
+ pub const hexagonv73 = CpuModel{
+ .name = "hexagonv73",
+ .llvm_name = "hexagonv73",
+ .features = featureSet(&[_]Feature{
+ .compound,
+ .duplex,
+ .mem_noshuf,
+ .memops,
+ .nvj,
+ .nvs,
+ .small_data,
+ .v5,
+ .v55,
+ .v60,
+ .v62,
+ .v65,
+ .v66,
+ .v67,
+ .v68,
+ .v69,
+ .v71,
+ .v73,
+ }),
+ };
+};
diff --git a/lib/std/Target/loongarch.zig b/lib/std/Target/loongarch.zig
new file mode 100644
index 0000000000..65dc33d784
--- /dev/null
+++ b/lib/std/Target/loongarch.zig
@@ -0,0 +1,146 @@
+//! 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 {
+ @"32bit",
+ @"64bit",
+ d,
+ f,
+ la_global_with_abs,
+ la_global_with_pcrel,
+ la_local_with_abs,
+ lasx,
+ lbt,
+ lsx,
+ lvz,
+ ual,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"32bit")] = .{
+ .llvm_name = "32bit",
+ .description = "LA32 Basic Integer and Privilege Instruction Set",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"64bit")] = .{
+ .llvm_name = "64bit",
+ .description = "LA64 Basic Integer and Privilege Instruction Set",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.d)] = .{
+ .llvm_name = "d",
+ .description = "'D' (Double-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.f)] = .{
+ .llvm_name = "f",
+ .description = "'F' (Single-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.la_global_with_abs)] = .{
+ .llvm_name = "la-global-with-abs",
+ .description = "Expand la.global as la.abs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.la_global_with_pcrel)] = .{
+ .llvm_name = "la-global-with-pcrel",
+ .description = "Expand la.global as la.pcrel",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.la_local_with_abs)] = .{
+ .llvm_name = "la-local-with-abs",
+ .description = "Expand la.local as la.abs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lasx)] = .{
+ .llvm_name = "lasx",
+ .description = "'LASX' (Loongson Advanced SIMD Extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .lsx,
+ }),
+ };
+ result[@intFromEnum(Feature.lbt)] = .{
+ .llvm_name = "lbt",
+ .description = "'LBT' (Loongson Binary Translation Extension)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lsx)] = .{
+ .llvm_name = "lsx",
+ .description = "'LSX' (Loongson SIMD Extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .d,
+ }),
+ };
+ result[@intFromEnum(Feature.lvz)] = .{
+ .llvm_name = "lvz",
+ .description = "'LVZ' (Loongson Virtualization Extension)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ual)] = .{
+ .llvm_name = "ual",
+ .description = "Allow memory accesses to be unaligned",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const generic_la32 = CpuModel{
+ .name = "generic_la32",
+ .llvm_name = "generic-la32",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ }),
+ };
+ pub const generic_la64 = CpuModel{
+ .name = "generic_la64",
+ .llvm_name = "generic-la64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .ual,
+ }),
+ };
+ pub const la464 = CpuModel{
+ .name = "la464",
+ .llvm_name = "la464",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .lasx,
+ .lbt,
+ .lvz,
+ .ual,
+ }),
+ };
+ pub const loongarch64 = CpuModel{
+ .name = "loongarch64",
+ .llvm_name = "loongarch64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .d,
+ .ual,
+ }),
+ };
+};
diff --git a/lib/std/Target/m68k.zig b/lib/std/Target/m68k.zig
new file mode 100644
index 0000000000..054b3974d1
--- /dev/null
+++ b/lib/std/Target/m68k.zig
@@ -0,0 +1,228 @@
+//! 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 {
+ isa_68000,
+ isa_68010,
+ isa_68020,
+ isa_68030,
+ isa_68040,
+ isa_68060,
+ isa_68881,
+ isa_68882,
+ reserve_a0,
+ reserve_a1,
+ reserve_a2,
+ reserve_a3,
+ reserve_a4,
+ reserve_a5,
+ reserve_a6,
+ reserve_d0,
+ reserve_d1,
+ reserve_d2,
+ reserve_d3,
+ reserve_d4,
+ reserve_d5,
+ reserve_d6,
+ reserve_d7,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.isa_68000)] = .{
+ .llvm_name = "isa-68000",
+ .description = "Is M68000 ISA supported",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.isa_68010)] = .{
+ .llvm_name = "isa-68010",
+ .description = "Is M68010 ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68000,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_68020)] = .{
+ .llvm_name = "isa-68020",
+ .description = "Is M68020 ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68010,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_68030)] = .{
+ .llvm_name = "isa-68030",
+ .description = "Is M68030 ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68020,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_68040)] = .{
+ .llvm_name = "isa-68040",
+ .description = "Is M68040 ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68030,
+ .isa_68882,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_68060)] = .{
+ .llvm_name = "isa-68060",
+ .description = "Is M68060 ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68040,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_68881)] = .{
+ .llvm_name = "isa-68881",
+ .description = "Is M68881 (FPU) ISA supported",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.isa_68882)] = .{
+ .llvm_name = "isa-68882",
+ .description = "Is M68882 (FPU) ISA supported",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_68881,
+ }),
+ };
+ result[@intFromEnum(Feature.reserve_a0)] = .{
+ .llvm_name = "reserve-a0",
+ .description = "Reserve A0 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a1)] = .{
+ .llvm_name = "reserve-a1",
+ .description = "Reserve A1 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a2)] = .{
+ .llvm_name = "reserve-a2",
+ .description = "Reserve A2 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a3)] = .{
+ .llvm_name = "reserve-a3",
+ .description = "Reserve A3 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a4)] = .{
+ .llvm_name = "reserve-a4",
+ .description = "Reserve A4 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a5)] = .{
+ .llvm_name = "reserve-a5",
+ .description = "Reserve A5 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_a6)] = .{
+ .llvm_name = "reserve-a6",
+ .description = "Reserve A6 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d0)] = .{
+ .llvm_name = "reserve-d0",
+ .description = "Reserve D0 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d1)] = .{
+ .llvm_name = "reserve-d1",
+ .description = "Reserve D1 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d2)] = .{
+ .llvm_name = "reserve-d2",
+ .description = "Reserve D2 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d3)] = .{
+ .llvm_name = "reserve-d3",
+ .description = "Reserve D3 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d4)] = .{
+ .llvm_name = "reserve-d4",
+ .description = "Reserve D4 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d5)] = .{
+ .llvm_name = "reserve-d5",
+ .description = "Reserve D5 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d6)] = .{
+ .llvm_name = "reserve-d6",
+ .description = "Reserve D6 register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_d7)] = .{
+ .llvm_name = "reserve-d7",
+ .description = "Reserve D7 register",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .isa_68000,
+ }),
+ };
+ pub const M68000 = CpuModel{
+ .name = "M68000",
+ .llvm_name = "M68000",
+ .features = featureSet(&[_]Feature{
+ .isa_68000,
+ }),
+ };
+ pub const M68010 = CpuModel{
+ .name = "M68010",
+ .llvm_name = "M68010",
+ .features = featureSet(&[_]Feature{
+ .isa_68010,
+ }),
+ };
+ pub const M68020 = CpuModel{
+ .name = "M68020",
+ .llvm_name = "M68020",
+ .features = featureSet(&[_]Feature{
+ .isa_68020,
+ }),
+ };
+ pub const M68030 = CpuModel{
+ .name = "M68030",
+ .llvm_name = "M68030",
+ .features = featureSet(&[_]Feature{
+ .isa_68030,
+ }),
+ };
+ pub const M68040 = CpuModel{
+ .name = "M68040",
+ .llvm_name = "M68040",
+ .features = featureSet(&[_]Feature{
+ .isa_68040,
+ }),
+ };
+ pub const M68060 = CpuModel{
+ .name = "M68060",
+ .llvm_name = "M68060",
+ .features = featureSet(&[_]Feature{
+ .isa_68060,
+ }),
+ };
+};
diff --git a/lib/std/Target/mips.zig b/lib/std/Target/mips.zig
new file mode 100644
index 0000000000..8f3c0994d1
--- /dev/null
+++ b/lib/std/Target/mips.zig
@@ -0,0 +1,531 @@
+//! 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 {
+ abs2008,
+ cnmips,
+ cnmipsp,
+ crc,
+ dsp,
+ dspr2,
+ dspr3,
+ eva,
+ fp64,
+ fpxx,
+ ginv,
+ gp64,
+ long_calls,
+ micromips,
+ mips1,
+ mips16,
+ mips2,
+ mips3,
+ mips32,
+ mips32r2,
+ mips32r3,
+ mips32r5,
+ mips32r6,
+ mips3_32,
+ mips3_32r2,
+ mips3d,
+ mips4,
+ mips4_32,
+ mips4_32r2,
+ mips5,
+ mips5_32r2,
+ mips64,
+ mips64r2,
+ mips64r3,
+ mips64r5,
+ mips64r6,
+ msa,
+ mt,
+ nan2008,
+ noabicalls,
+ nomadd4,
+ nooddspreg,
+ p5600,
+ ptr64,
+ single_float,
+ soft_float,
+ sym32,
+ use_indirect_jump_hazard,
+ use_tcc_in_div,
+ vfpu,
+ virt,
+ xgot,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.abs2008)] = .{
+ .llvm_name = "abs2008",
+ .description = "Disable IEEE 754-2008 abs.fmt mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cnmips)] = .{
+ .llvm_name = "cnmips",
+ .description = "Octeon cnMIPS Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips64r2,
+ }),
+ };
+ result[@intFromEnum(Feature.cnmipsp)] = .{
+ .llvm_name = "cnmipsp",
+ .description = "Octeon+ cnMIPS Support",
+ .dependencies = featureSet(&[_]Feature{
+ .cnmips,
+ }),
+ };
+ result[@intFromEnum(Feature.crc)] = .{
+ .llvm_name = "crc",
+ .description = "Mips R6 CRC ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dsp)] = .{
+ .llvm_name = "dsp",
+ .description = "Mips DSP ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dspr2)] = .{
+ .llvm_name = "dspr2",
+ .description = "Mips DSP-R2 ASE",
+ .dependencies = featureSet(&[_]Feature{
+ .dsp,
+ }),
+ };
+ result[@intFromEnum(Feature.dspr3)] = .{
+ .llvm_name = "dspr3",
+ .description = "Mips DSP-R3 ASE",
+ .dependencies = featureSet(&[_]Feature{
+ .dspr2,
+ }),
+ };
+ result[@intFromEnum(Feature.eva)] = .{
+ .llvm_name = "eva",
+ .description = "Mips EVA ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp64)] = .{
+ .llvm_name = "fp64",
+ .description = "Support 64-bit FP registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fpxx)] = .{
+ .llvm_name = "fpxx",
+ .description = "Support for FPXX",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ginv)] = .{
+ .llvm_name = "ginv",
+ .description = "Mips Global Invalidate ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gp64)] = .{
+ .llvm_name = "gp64",
+ .description = "General Purpose Registers are 64-bit wide",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.long_calls)] = .{
+ .llvm_name = "long-calls",
+ .description = "Disable use of the jal instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.micromips)] = .{
+ .llvm_name = "micromips",
+ .description = "microMips mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips1)] = .{
+ .llvm_name = "mips1",
+ .description = "Mips I ISA Support [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips16)] = .{
+ .llvm_name = "mips16",
+ .description = "Mips16 mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips2)] = .{
+ .llvm_name = "mips2",
+ .description = "Mips II ISA Support [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{
+ .mips1,
+ }),
+ };
+ result[@intFromEnum(Feature.mips3)] = .{
+ .llvm_name = "mips3",
+ .description = "MIPS III ISA Support [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{
+ .fp64,
+ .gp64,
+ .mips2,
+ .mips3_32,
+ .mips3_32r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips32)] = .{
+ .llvm_name = "mips32",
+ .description = "Mips32 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips2,
+ .mips3_32,
+ .mips4_32,
+ }),
+ };
+ result[@intFromEnum(Feature.mips32r2)] = .{
+ .llvm_name = "mips32r2",
+ .description = "Mips32r2 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32,
+ .mips3_32r2,
+ .mips4_32r2,
+ .mips5_32r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips32r3)] = .{
+ .llvm_name = "mips32r3",
+ .description = "Mips32r3 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips32r5)] = .{
+ .llvm_name = "mips32r5",
+ .description = "Mips32r5 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r3,
+ }),
+ };
+ result[@intFromEnum(Feature.mips32r6)] = .{
+ .llvm_name = "mips32r6",
+ .description = "Mips32r6 ISA Support [experimental]",
+ .dependencies = featureSet(&[_]Feature{
+ .abs2008,
+ .fp64,
+ .mips32r5,
+ .nan2008,
+ }),
+ };
+ result[@intFromEnum(Feature.mips3_32)] = .{
+ .llvm_name = "mips3_32",
+ .description = "Subset of MIPS-III that is also in MIPS32 [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips3_32r2)] = .{
+ .llvm_name = "mips3_32r2",
+ .description = "Subset of MIPS-III that is also in MIPS32r2 [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips3d)] = .{
+ .llvm_name = "mips3d",
+ .description = "Mips 3D ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips4)] = .{
+ .llvm_name = "mips4",
+ .description = "MIPS IV ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips3,
+ .mips4_32,
+ .mips4_32r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips4_32)] = .{
+ .llvm_name = "mips4_32",
+ .description = "Subset of MIPS-IV that is also in MIPS32 [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips4_32r2)] = .{
+ .llvm_name = "mips4_32r2",
+ .description = "Subset of MIPS-IV that is also in MIPS32r2 [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips5)] = .{
+ .llvm_name = "mips5",
+ .description = "MIPS V ISA Support [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{
+ .mips4,
+ .mips5_32r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips5_32r2)] = .{
+ .llvm_name = "mips5_32r2",
+ .description = "Subset of MIPS-V that is also in MIPS32r2 [highly experimental]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mips64)] = .{
+ .llvm_name = "mips64",
+ .description = "Mips64 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32,
+ .mips5,
+ }),
+ };
+ result[@intFromEnum(Feature.mips64r2)] = .{
+ .llvm_name = "mips64r2",
+ .description = "Mips64r2 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r2,
+ .mips64,
+ }),
+ };
+ result[@intFromEnum(Feature.mips64r3)] = .{
+ .llvm_name = "mips64r3",
+ .description = "Mips64r3 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r3,
+ .mips64r2,
+ }),
+ };
+ result[@intFromEnum(Feature.mips64r5)] = .{
+ .llvm_name = "mips64r5",
+ .description = "Mips64r5 ISA Support",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r5,
+ .mips64r3,
+ }),
+ };
+ result[@intFromEnum(Feature.mips64r6)] = .{
+ .llvm_name = "mips64r6",
+ .description = "Mips64r6 ISA Support [experimental]",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r6,
+ .mips64r5,
+ }),
+ };
+ result[@intFromEnum(Feature.msa)] = .{
+ .llvm_name = "msa",
+ .description = "Mips MSA ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mt)] = .{
+ .llvm_name = "mt",
+ .description = "Mips MT ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nan2008)] = .{
+ .llvm_name = "nan2008",
+ .description = "IEEE 754-2008 NaN encoding",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.noabicalls)] = .{
+ .llvm_name = "noabicalls",
+ .description = "Disable SVR4-style position-independent code",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nomadd4)] = .{
+ .llvm_name = "nomadd4",
+ .description = "Disable 4-operand madd.fmt and related instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nooddspreg)] = .{
+ .llvm_name = "nooddspreg",
+ .description = "Disable odd numbered single-precision registers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.p5600)] = .{
+ .llvm_name = "p5600",
+ .description = "The P5600 Processor",
+ .dependencies = featureSet(&[_]Feature{
+ .mips32r5,
+ }),
+ };
+ result[@intFromEnum(Feature.ptr64)] = .{
+ .llvm_name = "ptr64",
+ .description = "Pointers are 64-bit wide",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.single_float)] = .{
+ .llvm_name = "single-float",
+ .description = "Only supports single precision float",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_float)] = .{
+ .llvm_name = "soft-float",
+ .description = "Does not support floating point instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sym32)] = .{
+ .llvm_name = "sym32",
+ .description = "Symbols are 32 bit on Mips64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_indirect_jump_hazard)] = .{
+ .llvm_name = "use-indirect-jump-hazard",
+ .description = "Use indirect jump guards to prevent certain speculation based attacks",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_tcc_in_div)] = .{
+ .llvm_name = "use-tcc-in-div",
+ .description = "Force the assembler to use trapping",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vfpu)] = .{
+ .llvm_name = "vfpu",
+ .description = "Enable vector FPU instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.virt)] = .{
+ .llvm_name = "virt",
+ .description = "Mips Virtualization ASE",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xgot)] = .{
+ .llvm_name = "xgot",
+ .description = "Assume 32-bit GOT",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .mips32,
+ }),
+ };
+ pub const mips1 = CpuModel{
+ .name = "mips1",
+ .llvm_name = "mips1",
+ .features = featureSet(&[_]Feature{
+ .mips1,
+ }),
+ };
+ pub const mips2 = CpuModel{
+ .name = "mips2",
+ .llvm_name = "mips2",
+ .features = featureSet(&[_]Feature{
+ .mips2,
+ }),
+ };
+ pub const mips3 = CpuModel{
+ .name = "mips3",
+ .llvm_name = "mips3",
+ .features = featureSet(&[_]Feature{
+ .mips3,
+ }),
+ };
+ pub const mips32 = CpuModel{
+ .name = "mips32",
+ .llvm_name = "mips32",
+ .features = featureSet(&[_]Feature{
+ .mips32,
+ }),
+ };
+ pub const mips32r2 = CpuModel{
+ .name = "mips32r2",
+ .llvm_name = "mips32r2",
+ .features = featureSet(&[_]Feature{
+ .mips32r2,
+ }),
+ };
+ pub const mips32r3 = CpuModel{
+ .name = "mips32r3",
+ .llvm_name = "mips32r3",
+ .features = featureSet(&[_]Feature{
+ .mips32r3,
+ }),
+ };
+ pub const mips32r5 = CpuModel{
+ .name = "mips32r5",
+ .llvm_name = "mips32r5",
+ .features = featureSet(&[_]Feature{
+ .mips32r5,
+ }),
+ };
+ pub const mips32r6 = CpuModel{
+ .name = "mips32r6",
+ .llvm_name = "mips32r6",
+ .features = featureSet(&[_]Feature{
+ .mips32r6,
+ }),
+ };
+ pub const mips4 = CpuModel{
+ .name = "mips4",
+ .llvm_name = "mips4",
+ .features = featureSet(&[_]Feature{
+ .mips4,
+ }),
+ };
+ pub const mips5 = CpuModel{
+ .name = "mips5",
+ .llvm_name = "mips5",
+ .features = featureSet(&[_]Feature{
+ .mips5,
+ }),
+ };
+ pub const mips64 = CpuModel{
+ .name = "mips64",
+ .llvm_name = "mips64",
+ .features = featureSet(&[_]Feature{
+ .mips64,
+ }),
+ };
+ pub const mips64r2 = CpuModel{
+ .name = "mips64r2",
+ .llvm_name = "mips64r2",
+ .features = featureSet(&[_]Feature{
+ .mips64r2,
+ }),
+ };
+ pub const mips64r3 = CpuModel{
+ .name = "mips64r3",
+ .llvm_name = "mips64r3",
+ .features = featureSet(&[_]Feature{
+ .mips64r3,
+ }),
+ };
+ pub const mips64r5 = CpuModel{
+ .name = "mips64r5",
+ .llvm_name = "mips64r5",
+ .features = featureSet(&[_]Feature{
+ .mips64r5,
+ }),
+ };
+ pub const mips64r6 = CpuModel{
+ .name = "mips64r6",
+ .llvm_name = "mips64r6",
+ .features = featureSet(&[_]Feature{
+ .mips64r6,
+ }),
+ };
+ pub const octeon = CpuModel{
+ .name = "octeon",
+ .llvm_name = "octeon",
+ .features = featureSet(&[_]Feature{
+ .cnmips,
+ }),
+ };
+ pub const @"octeon+" = CpuModel{
+ .name = "octeon+",
+ .llvm_name = "octeon+",
+ .features = featureSet(&[_]Feature{
+ .cnmipsp,
+ }),
+ };
+ pub const p5600 = CpuModel{
+ .name = "p5600",
+ .llvm_name = "p5600",
+ .features = featureSet(&[_]Feature{
+ .p5600,
+ }),
+ };
+};
diff --git a/lib/std/Target/msp430.zig b/lib/std/Target/msp430.zig
new file mode 100644
index 0000000000..98ea32d17f
--- /dev/null
+++ b/lib/std/Target/msp430.zig
@@ -0,0 +1,69 @@
+//! 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 {
+ ext,
+ hwmult16,
+ hwmult32,
+ hwmultf5,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.ext)] = .{
+ .llvm_name = "ext",
+ .description = "Enable MSP430-X extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hwmult16)] = .{
+ .llvm_name = "hwmult16",
+ .description = "Enable 16-bit hardware multiplier",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hwmult32)] = .{
+ .llvm_name = "hwmult32",
+ .description = "Enable 32-bit hardware multiplier",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hwmultf5)] = .{
+ .llvm_name = "hwmultf5",
+ .description = "Enable F5 series hardware multiplier",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const msp430 = CpuModel{
+ .name = "msp430",
+ .llvm_name = "msp430",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const msp430x = CpuModel{
+ .name = "msp430x",
+ .llvm_name = "msp430x",
+ .features = featureSet(&[_]Feature{
+ .ext,
+ }),
+ };
+};
diff --git a/lib/std/Target/nvptx.zig b/lib/std/Target/nvptx.zig
new file mode 100644
index 0000000000..99a281604b
--- /dev/null
+++ b/lib/std/Target/nvptx.zig
@@ -0,0 +1,439 @@
+//! 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 {
+ ptx32,
+ ptx40,
+ ptx41,
+ ptx42,
+ ptx43,
+ ptx50,
+ ptx60,
+ ptx61,
+ ptx63,
+ ptx64,
+ ptx65,
+ ptx70,
+ ptx71,
+ ptx72,
+ ptx73,
+ ptx74,
+ ptx75,
+ ptx76,
+ ptx77,
+ ptx78,
+ ptx80,
+ ptx81,
+ sm_20,
+ sm_21,
+ sm_30,
+ sm_32,
+ sm_35,
+ sm_37,
+ sm_50,
+ sm_52,
+ sm_53,
+ sm_60,
+ sm_61,
+ sm_62,
+ sm_70,
+ sm_72,
+ sm_75,
+ sm_80,
+ sm_86,
+ sm_87,
+ sm_89,
+ sm_90,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.ptx32)] = .{
+ .llvm_name = "ptx32",
+ .description = "Use PTX version 32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx40)] = .{
+ .llvm_name = "ptx40",
+ .description = "Use PTX version 40",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx41)] = .{
+ .llvm_name = "ptx41",
+ .description = "Use PTX version 41",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx42)] = .{
+ .llvm_name = "ptx42",
+ .description = "Use PTX version 42",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx43)] = .{
+ .llvm_name = "ptx43",
+ .description = "Use PTX version 43",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx50)] = .{
+ .llvm_name = "ptx50",
+ .description = "Use PTX version 50",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx60)] = .{
+ .llvm_name = "ptx60",
+ .description = "Use PTX version 60",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx61)] = .{
+ .llvm_name = "ptx61",
+ .description = "Use PTX version 61",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx63)] = .{
+ .llvm_name = "ptx63",
+ .description = "Use PTX version 63",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx64)] = .{
+ .llvm_name = "ptx64",
+ .description = "Use PTX version 64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx65)] = .{
+ .llvm_name = "ptx65",
+ .description = "Use PTX version 65",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx70)] = .{
+ .llvm_name = "ptx70",
+ .description = "Use PTX version 70",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx71)] = .{
+ .llvm_name = "ptx71",
+ .description = "Use PTX version 71",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx72)] = .{
+ .llvm_name = "ptx72",
+ .description = "Use PTX version 72",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx73)] = .{
+ .llvm_name = "ptx73",
+ .description = "Use PTX version 73",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx74)] = .{
+ .llvm_name = "ptx74",
+ .description = "Use PTX version 74",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx75)] = .{
+ .llvm_name = "ptx75",
+ .description = "Use PTX version 75",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx76)] = .{
+ .llvm_name = "ptx76",
+ .description = "Use PTX version 76",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx77)] = .{
+ .llvm_name = "ptx77",
+ .description = "Use PTX version 77",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx78)] = .{
+ .llvm_name = "ptx78",
+ .description = "Use PTX version 78",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx80)] = .{
+ .llvm_name = "ptx80",
+ .description = "Use PTX version 80",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptx81)] = .{
+ .llvm_name = "ptx81",
+ .description = "Use PTX version 81",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_20)] = .{
+ .llvm_name = "sm_20",
+ .description = "Target SM 20",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_21)] = .{
+ .llvm_name = "sm_21",
+ .description = "Target SM 21",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_30)] = .{
+ .llvm_name = "sm_30",
+ .description = "Target SM 30",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_32)] = .{
+ .llvm_name = "sm_32",
+ .description = "Target SM 32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_35)] = .{
+ .llvm_name = "sm_35",
+ .description = "Target SM 35",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_37)] = .{
+ .llvm_name = "sm_37",
+ .description = "Target SM 37",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_50)] = .{
+ .llvm_name = "sm_50",
+ .description = "Target SM 50",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_52)] = .{
+ .llvm_name = "sm_52",
+ .description = "Target SM 52",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_53)] = .{
+ .llvm_name = "sm_53",
+ .description = "Target SM 53",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_60)] = .{
+ .llvm_name = "sm_60",
+ .description = "Target SM 60",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_61)] = .{
+ .llvm_name = "sm_61",
+ .description = "Target SM 61",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_62)] = .{
+ .llvm_name = "sm_62",
+ .description = "Target SM 62",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_70)] = .{
+ .llvm_name = "sm_70",
+ .description = "Target SM 70",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_72)] = .{
+ .llvm_name = "sm_72",
+ .description = "Target SM 72",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_75)] = .{
+ .llvm_name = "sm_75",
+ .description = "Target SM 75",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_80)] = .{
+ .llvm_name = "sm_80",
+ .description = "Target SM 80",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_86)] = .{
+ .llvm_name = "sm_86",
+ .description = "Target SM 86",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_87)] = .{
+ .llvm_name = "sm_87",
+ .description = "Target SM 87",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_89)] = .{
+ .llvm_name = "sm_89",
+ .description = "Target SM 89",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm_90)] = .{
+ .llvm_name = "sm_90",
+ .description = "Target SM 90",
+ .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 sm_20 = CpuModel{
+ .name = "sm_20",
+ .llvm_name = "sm_20",
+ .features = featureSet(&[_]Feature{
+ .ptx32,
+ .sm_20,
+ }),
+ };
+ pub const sm_21 = CpuModel{
+ .name = "sm_21",
+ .llvm_name = "sm_21",
+ .features = featureSet(&[_]Feature{
+ .ptx32,
+ .sm_21,
+ }),
+ };
+ pub const sm_30 = CpuModel{
+ .name = "sm_30",
+ .llvm_name = "sm_30",
+ .features = featureSet(&[_]Feature{
+ .sm_30,
+ }),
+ };
+ pub const sm_32 = CpuModel{
+ .name = "sm_32",
+ .llvm_name = "sm_32",
+ .features = featureSet(&[_]Feature{
+ .ptx40,
+ .sm_32,
+ }),
+ };
+ pub const sm_35 = CpuModel{
+ .name = "sm_35",
+ .llvm_name = "sm_35",
+ .features = featureSet(&[_]Feature{
+ .ptx32,
+ .sm_35,
+ }),
+ };
+ pub const sm_37 = CpuModel{
+ .name = "sm_37",
+ .llvm_name = "sm_37",
+ .features = featureSet(&[_]Feature{
+ .ptx41,
+ .sm_37,
+ }),
+ };
+ pub const sm_50 = CpuModel{
+ .name = "sm_50",
+ .llvm_name = "sm_50",
+ .features = featureSet(&[_]Feature{
+ .ptx40,
+ .sm_50,
+ }),
+ };
+ pub const sm_52 = CpuModel{
+ .name = "sm_52",
+ .llvm_name = "sm_52",
+ .features = featureSet(&[_]Feature{
+ .ptx41,
+ .sm_52,
+ }),
+ };
+ pub const sm_53 = CpuModel{
+ .name = "sm_53",
+ .llvm_name = "sm_53",
+ .features = featureSet(&[_]Feature{
+ .ptx42,
+ .sm_53,
+ }),
+ };
+ pub const sm_60 = CpuModel{
+ .name = "sm_60",
+ .llvm_name = "sm_60",
+ .features = featureSet(&[_]Feature{
+ .ptx50,
+ .sm_60,
+ }),
+ };
+ pub const sm_61 = CpuModel{
+ .name = "sm_61",
+ .llvm_name = "sm_61",
+ .features = featureSet(&[_]Feature{
+ .ptx50,
+ .sm_61,
+ }),
+ };
+ pub const sm_62 = CpuModel{
+ .name = "sm_62",
+ .llvm_name = "sm_62",
+ .features = featureSet(&[_]Feature{
+ .ptx50,
+ .sm_62,
+ }),
+ };
+ pub const sm_70 = CpuModel{
+ .name = "sm_70",
+ .llvm_name = "sm_70",
+ .features = featureSet(&[_]Feature{
+ .ptx60,
+ .sm_70,
+ }),
+ };
+ pub const sm_72 = CpuModel{
+ .name = "sm_72",
+ .llvm_name = "sm_72",
+ .features = featureSet(&[_]Feature{
+ .ptx61,
+ .sm_72,
+ }),
+ };
+ pub const sm_75 = CpuModel{
+ .name = "sm_75",
+ .llvm_name = "sm_75",
+ .features = featureSet(&[_]Feature{
+ .ptx63,
+ .sm_75,
+ }),
+ };
+ pub const sm_80 = CpuModel{
+ .name = "sm_80",
+ .llvm_name = "sm_80",
+ .features = featureSet(&[_]Feature{
+ .ptx70,
+ .sm_80,
+ }),
+ };
+ pub const sm_86 = CpuModel{
+ .name = "sm_86",
+ .llvm_name = "sm_86",
+ .features = featureSet(&[_]Feature{
+ .ptx71,
+ .sm_86,
+ }),
+ };
+ pub const sm_87 = CpuModel{
+ .name = "sm_87",
+ .llvm_name = "sm_87",
+ .features = featureSet(&[_]Feature{
+ .ptx74,
+ .sm_87,
+ }),
+ };
+ pub const sm_89 = CpuModel{
+ .name = "sm_89",
+ .llvm_name = "sm_89",
+ .features = featureSet(&[_]Feature{
+ .ptx78,
+ .sm_89,
+ }),
+ };
+ pub const sm_90 = CpuModel{
+ .name = "sm_90",
+ .llvm_name = "sm_90",
+ .features = featureSet(&[_]Feature{
+ .ptx78,
+ .sm_90,
+ }),
+ };
+};
diff --git a/lib/std/Target/powerpc.zig b/lib/std/Target/powerpc.zig
new file mode 100644
index 0000000000..c350c166ba
--- /dev/null
+++ b/lib/std/Target/powerpc.zig
@@ -0,0 +1,1192 @@
+//! 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 {
+ @"64bit",
+ @"64bitregs",
+ aix,
+ allow_unaligned_fp_access,
+ altivec,
+ booke,
+ bpermd,
+ cmpb,
+ crbits,
+ crypto,
+ direct_move,
+ e500,
+ efpu2,
+ extdiv,
+ fast_MFLR,
+ fcpsgn,
+ float128,
+ fpcvt,
+ fprnd,
+ fpu,
+ fre,
+ fres,
+ frsqrte,
+ frsqrtes,
+ fsqrt,
+ fuse_add_logical,
+ fuse_addi_load,
+ fuse_addis_load,
+ fuse_arith_add,
+ fuse_back2back,
+ fuse_cmp,
+ fuse_logical,
+ fuse_logical_add,
+ fuse_sha3,
+ fuse_store,
+ fuse_wideimm,
+ fuse_zeromove,
+ fusion,
+ hard_float,
+ htm,
+ icbt,
+ invariant_function_descriptors,
+ isa_future_instructions,
+ isa_v206_instructions,
+ isa_v207_instructions,
+ isa_v30_instructions,
+ isa_v31_instructions,
+ isel,
+ ldbrx,
+ lfiwax,
+ longcall,
+ mfocrf,
+ mma,
+ modern_aix_as,
+ msync,
+ paired_vector_memops,
+ partword_atomics,
+ pcrelative_memops,
+ popcntd,
+ power10_vector,
+ power8_altivec,
+ power8_vector,
+ power9_altivec,
+ power9_vector,
+ ppc4xx,
+ ppc6xx,
+ ppc_postra_sched,
+ ppc_prera_sched,
+ predictable_select_expensive,
+ prefix_instrs,
+ privileged,
+ quadword_atomics,
+ recipprec,
+ rop_protect,
+ secure_plt,
+ slow_popcntd,
+ spe,
+ stfiwx,
+ two_const_nr,
+ vectors_use_two_units,
+ vsx,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"64bit")] = .{
+ .llvm_name = "64bit",
+ .description = "Enable 64-bit instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"64bitregs")] = .{
+ .llvm_name = "64bitregs",
+ .description = "Enable 64-bit registers usage for ppc32 [beta]",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aix)] = .{
+ .llvm_name = "aix",
+ .description = "AIX OS",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.allow_unaligned_fp_access)] = .{
+ .llvm_name = "allow-unaligned-fp-access",
+ .description = "CPU does not trap on unaligned FP access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.altivec)] = .{
+ .llvm_name = "altivec",
+ .description = "Enable Altivec instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.booke)] = .{
+ .llvm_name = "booke",
+ .description = "Enable Book E instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .icbt,
+ }),
+ };
+ result[@intFromEnum(Feature.bpermd)] = .{
+ .llvm_name = "bpermd",
+ .description = "Enable the bpermd instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cmpb)] = .{
+ .llvm_name = "cmpb",
+ .description = "Enable the cmpb instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crbits)] = .{
+ .llvm_name = "crbits",
+ .description = "Use condition-register bits individually",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crypto)] = .{
+ .llvm_name = "crypto",
+ .description = "Enable POWER8 Crypto instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .power8_altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.direct_move)] = .{
+ .llvm_name = "direct-move",
+ .description = "Enable Power8 direct move instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .vsx,
+ }),
+ };
+ result[@intFromEnum(Feature.e500)] = .{
+ .llvm_name = "e500",
+ .description = "Enable E500/E500mc instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.efpu2)] = .{
+ .llvm_name = "efpu2",
+ .description = "Enable Embedded Floating-Point APU 2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .spe,
+ }),
+ };
+ result[@intFromEnum(Feature.extdiv)] = .{
+ .llvm_name = "extdiv",
+ .description = "Enable extended divide instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_MFLR)] = .{
+ .llvm_name = "fast-MFLR",
+ .description = "MFLR is a fast instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fcpsgn)] = .{
+ .llvm_name = "fcpsgn",
+ .description = "Enable the fcpsgn instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.float128)] = .{
+ .llvm_name = "float128",
+ .description = "Enable the __float128 data type for IEEE-754R Binary128.",
+ .dependencies = featureSet(&[_]Feature{
+ .vsx,
+ }),
+ };
+ result[@intFromEnum(Feature.fpcvt)] = .{
+ .llvm_name = "fpcvt",
+ .description = "Enable fc[ft]* (unsigned and single-precision) and lfiwzx instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.fprnd)] = .{
+ .llvm_name = "fprnd",
+ .description = "Enable the fri[mnpz] instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.fpu)] = .{
+ .llvm_name = "fpu",
+ .description = "Enable classic FPU instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hard_float,
+ }),
+ };
+ result[@intFromEnum(Feature.fre)] = .{
+ .llvm_name = "fre",
+ .description = "Enable the fre instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.fres)] = .{
+ .llvm_name = "fres",
+ .description = "Enable the fres instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.frsqrte)] = .{
+ .llvm_name = "frsqrte",
+ .description = "Enable the frsqrte instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.frsqrtes)] = .{
+ .llvm_name = "frsqrtes",
+ .description = "Enable the frsqrtes instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.fsqrt)] = .{
+ .llvm_name = "fsqrt",
+ .description = "Enable the fsqrt instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_add_logical)] = .{
+ .llvm_name = "fuse-add-logical",
+ .description = "Target supports Add with Logical Operations fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_addi_load)] = .{
+ .llvm_name = "fuse-addi-load",
+ .description = "Power8 Addi-Load fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_addis_load)] = .{
+ .llvm_name = "fuse-addis-load",
+ .description = "Power8 Addis-Load fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_arith_add)] = .{
+ .llvm_name = "fuse-arith-add",
+ .description = "Target supports Arithmetic Operations with Add fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_back2back)] = .{
+ .llvm_name = "fuse-back2back",
+ .description = "Target supports general back to back fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_cmp)] = .{
+ .llvm_name = "fuse-cmp",
+ .description = "Target supports Comparison Operations fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_logical)] = .{
+ .llvm_name = "fuse-logical",
+ .description = "Target supports Logical Operations fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_logical_add)] = .{
+ .llvm_name = "fuse-logical-add",
+ .description = "Target supports Logical with Add Operations fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_sha3)] = .{
+ .llvm_name = "fuse-sha3",
+ .description = "Target supports SHA3 assist fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_store)] = .{
+ .llvm_name = "fuse-store",
+ .description = "Target supports store clustering",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_wideimm)] = .{
+ .llvm_name = "fuse-wideimm",
+ .description = "Target supports Wide-Immediate fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fuse_zeromove)] = .{
+ .llvm_name = "fuse-zeromove",
+ .description = "Target supports move to SPR with branch fusion",
+ .dependencies = featureSet(&[_]Feature{
+ .fusion,
+ }),
+ };
+ result[@intFromEnum(Feature.fusion)] = .{
+ .llvm_name = "fusion",
+ .description = "Target supports instruction fusion",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hard_float)] = .{
+ .llvm_name = "hard-float",
+ .description = "Enable floating-point instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.htm)] = .{
+ .llvm_name = "htm",
+ .description = "Enable Hardware Transactional Memory instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.icbt)] = .{
+ .llvm_name = "icbt",
+ .description = "Enable icbt instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.invariant_function_descriptors)] = .{
+ .llvm_name = "invariant-function-descriptors",
+ .description = "Assume function descriptors are invariant",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.isa_future_instructions)] = .{
+ .llvm_name = "isa-future-instructions",
+ .description = "Enable instructions for Future ISA.",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v31_instructions,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_v206_instructions)] = .{
+ .llvm_name = "isa-v206-instructions",
+ .description = "Enable instructions in ISA 2.06.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.isa_v207_instructions)] = .{
+ .llvm_name = "isa-v207-instructions",
+ .description = "Enable instructions in ISA 2.07.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.isa_v30_instructions)] = .{
+ .llvm_name = "isa-v30-instructions",
+ .description = "Enable instructions in ISA 3.0.",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v207_instructions,
+ }),
+ };
+ result[@intFromEnum(Feature.isa_v31_instructions)] = .{
+ .llvm_name = "isa-v31-instructions",
+ .description = "Enable instructions in ISA 3.1.",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v30_instructions,
+ }),
+ };
+ result[@intFromEnum(Feature.isel)] = .{
+ .llvm_name = "isel",
+ .description = "Enable the isel instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ldbrx)] = .{
+ .llvm_name = "ldbrx",
+ .description = "Enable the ldbrx instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lfiwax)] = .{
+ .llvm_name = "lfiwax",
+ .description = "Enable the lfiwax instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.longcall)] = .{
+ .llvm_name = "longcall",
+ .description = "Always use indirect calls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mfocrf)] = .{
+ .llvm_name = "mfocrf",
+ .description = "Enable the MFOCRF instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mma)] = .{
+ .llvm_name = "mma",
+ .description = "Enable MMA instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .paired_vector_memops,
+ .power8_vector,
+ .power9_altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.modern_aix_as)] = .{
+ .llvm_name = "modern-aix-as",
+ .description = "AIX system assembler is modern enough to support new mnes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.msync)] = .{
+ .llvm_name = "msync",
+ .description = "Has only the msync instruction instead of sync",
+ .dependencies = featureSet(&[_]Feature{
+ .booke,
+ }),
+ };
+ result[@intFromEnum(Feature.paired_vector_memops)] = .{
+ .llvm_name = "paired-vector-memops",
+ .description = "32Byte load and store instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v30_instructions,
+ }),
+ };
+ result[@intFromEnum(Feature.partword_atomics)] = .{
+ .llvm_name = "partword-atomics",
+ .description = "Enable l[bh]arx and st[bh]cx.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pcrelative_memops)] = .{
+ .llvm_name = "pcrelative-memops",
+ .description = "Enable PC relative Memory Ops",
+ .dependencies = featureSet(&[_]Feature{
+ .prefix_instrs,
+ }),
+ };
+ result[@intFromEnum(Feature.popcntd)] = .{
+ .llvm_name = "popcntd",
+ .description = "Enable the popcnt[dw] instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.power10_vector)] = .{
+ .llvm_name = "power10-vector",
+ .description = "Enable POWER10 vector instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v31_instructions,
+ .power9_vector,
+ }),
+ };
+ result[@intFromEnum(Feature.power8_altivec)] = .{
+ .llvm_name = "power8-altivec",
+ .description = "Enable POWER8 Altivec instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.power8_vector)] = .{
+ .llvm_name = "power8-vector",
+ .description = "Enable POWER8 vector instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .power8_altivec,
+ .vsx,
+ }),
+ };
+ result[@intFromEnum(Feature.power9_altivec)] = .{
+ .llvm_name = "power9-altivec",
+ .description = "Enable POWER9 Altivec instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .isa_v30_instructions,
+ .power8_altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.power9_vector)] = .{
+ .llvm_name = "power9-vector",
+ .description = "Enable POWER9 vector instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .power8_vector,
+ .power9_altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.ppc4xx)] = .{
+ .llvm_name = "ppc4xx",
+ .description = "Enable PPC 4xx instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ppc6xx)] = .{
+ .llvm_name = "ppc6xx",
+ .description = "Enable PPC 6xx instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ppc_postra_sched)] = .{
+ .llvm_name = "ppc-postra-sched",
+ .description = "Use PowerPC post-RA scheduling strategy",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ppc_prera_sched)] = .{
+ .llvm_name = "ppc-prera-sched",
+ .description = "Use PowerPC pre-RA scheduling strategy",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.predictable_select_expensive)] = .{
+ .llvm_name = "predictable-select-expensive",
+ .description = "Prefer likely predicted branches over selects",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefix_instrs)] = .{
+ .llvm_name = "prefix-instrs",
+ .description = "Enable prefixed instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .power8_vector,
+ .power9_altivec,
+ }),
+ };
+ result[@intFromEnum(Feature.privileged)] = .{
+ .llvm_name = "privileged",
+ .description = "Add privileged instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.quadword_atomics)] = .{
+ .llvm_name = "quadword-atomics",
+ .description = "Enable lqarx and stqcx.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.recipprec)] = .{
+ .llvm_name = "recipprec",
+ .description = "Assume higher precision reciprocal estimates",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rop_protect)] = .{
+ .llvm_name = "rop-protect",
+ .description = "Add ROP protect",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.secure_plt)] = .{
+ .llvm_name = "secure-plt",
+ .description = "Enable secure plt mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_popcntd)] = .{
+ .llvm_name = "slow-popcntd",
+ .description = "Has slow popcnt[dw] instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.spe)] = .{
+ .llvm_name = "spe",
+ .description = "Enable SPE instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .hard_float,
+ }),
+ };
+ result[@intFromEnum(Feature.stfiwx)] = .{
+ .llvm_name = "stfiwx",
+ .description = "Enable the stfiwx instruction",
+ .dependencies = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ result[@intFromEnum(Feature.two_const_nr)] = .{
+ .llvm_name = "two-const-nr",
+ .description = "Requires two constant Newton-Raphson computation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vectors_use_two_units)] = .{
+ .llvm_name = "vectors-use-two-units",
+ .description = "Vectors use two units",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vsx)] = .{
+ .llvm_name = "vsx",
+ .description = "Enable VSX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .altivec,
+ }),
+ };
+ 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 @"440" = CpuModel{
+ .name = "440",
+ .llvm_name = "440",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ .isel,
+ .msync,
+ }),
+ };
+ pub const @"450" = CpuModel{
+ .name = "450",
+ .llvm_name = "450",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ .isel,
+ .msync,
+ }),
+ };
+ pub const @"601" = CpuModel{
+ .name = "601",
+ .llvm_name = "601",
+ .features = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ pub const @"602" = CpuModel{
+ .name = "602",
+ .llvm_name = "602",
+ .features = featureSet(&[_]Feature{
+ .fpu,
+ }),
+ };
+ pub const @"603" = CpuModel{
+ .name = "603",
+ .llvm_name = "603",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"603e" = CpuModel{
+ .name = "603e",
+ .llvm_name = "603e",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"603ev" = CpuModel{
+ .name = "603ev",
+ .llvm_name = "603ev",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"604" = CpuModel{
+ .name = "604",
+ .llvm_name = "604",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"604e" = CpuModel{
+ .name = "604e",
+ .llvm_name = "604e",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"620" = CpuModel{
+ .name = "620",
+ .llvm_name = "620",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"7400" = CpuModel{
+ .name = "7400",
+ .llvm_name = "7400",
+ .features = featureSet(&[_]Feature{
+ .altivec,
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"7450" = CpuModel{
+ .name = "7450",
+ .llvm_name = "7450",
+ .features = featureSet(&[_]Feature{
+ .altivec,
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"750" = CpuModel{
+ .name = "750",
+ .llvm_name = "750",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"970" = CpuModel{
+ .name = "970",
+ .llvm_name = "970",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fres,
+ .frsqrte,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const a2 = CpuModel{
+ .name = "a2",
+ .llvm_name = "a2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .booke,
+ .cmpb,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .isa_v206_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .recipprec,
+ .slow_popcntd,
+ .stfiwx,
+ }),
+ };
+ pub const e500 = CpuModel{
+ .name = "e500",
+ .llvm_name = "e500",
+ .features = featureSet(&[_]Feature{
+ .isel,
+ .msync,
+ .spe,
+ }),
+ };
+ pub const e500mc = CpuModel{
+ .name = "e500mc",
+ .llvm_name = "e500mc",
+ .features = featureSet(&[_]Feature{
+ .booke,
+ .isel,
+ .stfiwx,
+ }),
+ };
+ pub const e5500 = CpuModel{
+ .name = "e5500",
+ .llvm_name = "e5500",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .booke,
+ .isel,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const future = CpuModel{
+ .name = "future",
+ .llvm_name = "future",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .crbits,
+ .crypto,
+ .direct_move,
+ .extdiv,
+ .fast_MFLR,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .fuse_add_logical,
+ .fuse_arith_add,
+ .fuse_logical,
+ .fuse_logical_add,
+ .fuse_sha3,
+ .fuse_store,
+ .htm,
+ .icbt,
+ .isa_future_instructions,
+ .isa_v206_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .mma,
+ .partword_atomics,
+ .pcrelative_memops,
+ .popcntd,
+ .power10_vector,
+ .ppc_postra_sched,
+ .ppc_prera_sched,
+ .predictable_select_expensive,
+ .quadword_atomics,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ }),
+ };
+ pub const g3 = CpuModel{
+ .name = "g3",
+ .llvm_name = "g3",
+ .features = featureSet(&[_]Feature{
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const g4 = CpuModel{
+ .name = "g4",
+ .llvm_name = "g4",
+ .features = featureSet(&[_]Feature{
+ .altivec,
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const @"g4+" = CpuModel{
+ .name = "g4+",
+ .llvm_name = "g4+",
+ .features = featureSet(&[_]Feature{
+ .altivec,
+ .fres,
+ .frsqrte,
+ }),
+ };
+ pub const g5 = CpuModel{
+ .name = "g5",
+ .llvm_name = "g5",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fres,
+ .frsqrte,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .hard_float,
+ }),
+ };
+ pub const ppc = CpuModel{
+ .name = "ppc",
+ .llvm_name = "ppc",
+ .features = featureSet(&[_]Feature{
+ .hard_float,
+ }),
+ };
+ pub const ppc64 = CpuModel{
+ .name = "ppc64",
+ .llvm_name = "ppc64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fres,
+ .frsqrte,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const ppc64le = CpuModel{
+ .name = "ppc64le",
+ .llvm_name = "ppc64le",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .crbits,
+ .crypto,
+ .direct_move,
+ .extdiv,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .fuse_addi_load,
+ .fuse_addis_load,
+ .htm,
+ .icbt,
+ .isa_v206_instructions,
+ .isa_v207_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .partword_atomics,
+ .popcntd,
+ .power8_vector,
+ .predictable_select_expensive,
+ .quadword_atomics,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ }),
+ };
+ pub const pwr10 = CpuModel{
+ .name = "pwr10",
+ .llvm_name = "pwr10",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .crbits,
+ .crypto,
+ .direct_move,
+ .extdiv,
+ .fast_MFLR,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .fuse_add_logical,
+ .fuse_arith_add,
+ .fuse_logical,
+ .fuse_logical_add,
+ .fuse_sha3,
+ .fuse_store,
+ .htm,
+ .icbt,
+ .isa_v206_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .mma,
+ .partword_atomics,
+ .pcrelative_memops,
+ .popcntd,
+ .power10_vector,
+ .ppc_postra_sched,
+ .ppc_prera_sched,
+ .predictable_select_expensive,
+ .quadword_atomics,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ }),
+ };
+ pub const pwr3 = CpuModel{
+ .name = "pwr3",
+ .llvm_name = "pwr3",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fres,
+ .frsqrte,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const pwr4 = CpuModel{
+ .name = "pwr4",
+ .llvm_name = "pwr4",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fres,
+ .frsqrte,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const pwr5 = CpuModel{
+ .name = "pwr5",
+ .llvm_name = "pwr5",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const pwr5x = CpuModel{
+ .name = "pwr5x",
+ .llvm_name = "pwr5x",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .mfocrf,
+ .stfiwx,
+ }),
+ };
+ pub const pwr6 = CpuModel{
+ .name = "pwr6",
+ .llvm_name = "pwr6",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .cmpb,
+ .fcpsgn,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .lfiwax,
+ .mfocrf,
+ .recipprec,
+ .stfiwx,
+ }),
+ };
+ pub const pwr6x = CpuModel{
+ .name = "pwr6x",
+ .llvm_name = "pwr6x",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .altivec,
+ .cmpb,
+ .fcpsgn,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .lfiwax,
+ .mfocrf,
+ .recipprec,
+ .stfiwx,
+ }),
+ };
+ pub const pwr7 = CpuModel{
+ .name = "pwr7",
+ .llvm_name = "pwr7",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .extdiv,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .isa_v206_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .popcntd,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ .vsx,
+ }),
+ };
+ pub const pwr8 = CpuModel{
+ .name = "pwr8",
+ .llvm_name = "pwr8",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .crbits,
+ .crypto,
+ .direct_move,
+ .extdiv,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .fuse_addi_load,
+ .fuse_addis_load,
+ .htm,
+ .icbt,
+ .isa_v206_instructions,
+ .isa_v207_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .partword_atomics,
+ .popcntd,
+ .power8_vector,
+ .predictable_select_expensive,
+ .quadword_atomics,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ }),
+ };
+ pub const pwr9 = CpuModel{
+ .name = "pwr9",
+ .llvm_name = "pwr9",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_unaligned_fp_access,
+ .bpermd,
+ .cmpb,
+ .crbits,
+ .crypto,
+ .direct_move,
+ .extdiv,
+ .fcpsgn,
+ .fpcvt,
+ .fprnd,
+ .fre,
+ .fres,
+ .frsqrte,
+ .frsqrtes,
+ .fsqrt,
+ .htm,
+ .icbt,
+ .isa_v206_instructions,
+ .isel,
+ .ldbrx,
+ .lfiwax,
+ .mfocrf,
+ .partword_atomics,
+ .popcntd,
+ .power9_vector,
+ .ppc_postra_sched,
+ .ppc_prera_sched,
+ .predictable_select_expensive,
+ .quadword_atomics,
+ .recipprec,
+ .stfiwx,
+ .two_const_nr,
+ .vectors_use_two_units,
+ }),
+ };
+};
diff --git a/lib/std/Target/riscv.zig b/lib/std/Target/riscv.zig
new file mode 100644
index 0000000000..66c02ae6d0
--- /dev/null
+++ b/lib/std/Target/riscv.zig
@@ -0,0 +1,1341 @@
+//! 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 {
+ @"32bit",
+ @"64bit",
+ a,
+ c,
+ d,
+ dlen_factor_2,
+ e,
+ experimental_smaia,
+ experimental_ssaia,
+ experimental_zacas,
+ experimental_zfa,
+ experimental_zfbfmin,
+ experimental_zicond,
+ experimental_zihintntl,
+ experimental_ztso,
+ experimental_zvbb,
+ experimental_zvbc,
+ experimental_zvfbfmin,
+ experimental_zvfbfwma,
+ experimental_zvkg,
+ experimental_zvkn,
+ experimental_zvknc,
+ experimental_zvkned,
+ experimental_zvkng,
+ experimental_zvknha,
+ experimental_zvknhb,
+ experimental_zvks,
+ experimental_zvksc,
+ experimental_zvksed,
+ experimental_zvksg,
+ experimental_zvksh,
+ experimental_zvkt,
+ f,
+ forced_atomics,
+ h,
+ lui_addi_fusion,
+ m,
+ no_default_unroll,
+ no_optimized_zero_stride_load,
+ no_rvc_hints,
+ relax,
+ reserve_x1,
+ reserve_x10,
+ reserve_x11,
+ reserve_x12,
+ reserve_x13,
+ reserve_x14,
+ reserve_x15,
+ reserve_x16,
+ reserve_x17,
+ reserve_x18,
+ reserve_x19,
+ reserve_x2,
+ reserve_x20,
+ reserve_x21,
+ reserve_x22,
+ reserve_x23,
+ reserve_x24,
+ reserve_x25,
+ reserve_x26,
+ reserve_x27,
+ reserve_x28,
+ reserve_x29,
+ reserve_x3,
+ reserve_x30,
+ reserve_x31,
+ reserve_x4,
+ reserve_x5,
+ reserve_x6,
+ reserve_x7,
+ reserve_x8,
+ reserve_x9,
+ save_restore,
+ seq_cst_trailing_fence,
+ short_forward_branch_opt,
+ svinval,
+ svnapot,
+ svpbmt,
+ tagged_globals,
+ unaligned_scalar_mem,
+ unaligned_vector_mem,
+ v,
+ xcvbitmanip,
+ xcvmac,
+ xsfcie,
+ xsfvcp,
+ xtheadba,
+ xtheadbb,
+ xtheadbs,
+ xtheadcmo,
+ xtheadcondmov,
+ xtheadfmemidx,
+ xtheadmac,
+ xtheadmemidx,
+ xtheadmempair,
+ xtheadsync,
+ xtheadvdot,
+ xventanacondops,
+ zawrs,
+ zba,
+ zbb,
+ zbc,
+ zbkb,
+ zbkc,
+ zbkx,
+ zbs,
+ zca,
+ zcb,
+ zcd,
+ zce,
+ zcf,
+ zcmp,
+ zcmt,
+ zdinx,
+ zfh,
+ zfhmin,
+ zfinx,
+ zhinx,
+ zhinxmin,
+ zicbom,
+ zicbop,
+ zicboz,
+ zicntr,
+ zicsr,
+ zifencei,
+ zihintpause,
+ zihpm,
+ zk,
+ zkn,
+ zknd,
+ zkne,
+ zknh,
+ zkr,
+ zks,
+ zksed,
+ zksh,
+ zkt,
+ zmmul,
+ zve32f,
+ zve32x,
+ zve64d,
+ zve64f,
+ zve64x,
+ zvfh,
+ zvl1024b,
+ zvl128b,
+ zvl16384b,
+ zvl2048b,
+ zvl256b,
+ zvl32768b,
+ zvl32b,
+ zvl4096b,
+ zvl512b,
+ zvl64b,
+ zvl65536b,
+ zvl8192b,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"32bit")] = .{
+ .llvm_name = "32bit",
+ .description = "Implements RV32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"64bit")] = .{
+ .llvm_name = "64bit",
+ .description = "Implements RV64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.a)] = .{
+ .llvm_name = "a",
+ .description = "'A' (Atomic Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.c)] = .{
+ .llvm_name = "c",
+ .description = "'C' (Compressed Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.d)] = .{
+ .llvm_name = "d",
+ .description = "'D' (Double-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.dlen_factor_2)] = .{
+ .llvm_name = "dlen-factor-2",
+ .description = "Vector unit DLEN(data path width) is half of VLEN",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.e)] = .{
+ .llvm_name = "e",
+ .description = "Implements RV{32,64}E (provides 16 rather than 32 GPRs)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_smaia)] = .{
+ .llvm_name = "experimental-smaia",
+ .description = "'Smaia' (Smaia encompasses all added CSRs and all modifications to interrupt response behavior that the AIA specifies for a hart, over all privilege levels.)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_ssaia)] = .{
+ .llvm_name = "experimental-ssaia",
+ .description = "'Ssaia' (Ssaia is essentially the same as Smaia except excluding the machine-level CSRs and behavior not directly visible to supervisor level.)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zacas)] = .{
+ .llvm_name = "experimental-zacas",
+ .description = "'Zacas' (Atomic Compare-And-Swap Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zfa)] = .{
+ .llvm_name = "experimental-zfa",
+ .description = "'Zfa' (Additional Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.experimental_zfbfmin)] = .{
+ .llvm_name = "experimental-zfbfmin",
+ .description = "'Zfbfmin' (Scalar BF16 Converts)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.experimental_zicond)] = .{
+ .llvm_name = "experimental-zicond",
+ .description = "'Zicond' (Integer Conditional Operations)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zihintntl)] = .{
+ .llvm_name = "experimental-zihintntl",
+ .description = "'Zihintntl' (Non-Temporal Locality Hints)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_ztso)] = .{
+ .llvm_name = "experimental-ztso",
+ .description = "'Ztso' (Memory Model - Total Store Order)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvbb)] = .{
+ .llvm_name = "experimental-zvbb",
+ .description = "'Zvbb' (Vector Bit-manipulation used in Cryptography)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvbc)] = .{
+ .llvm_name = "experimental-zvbc",
+ .description = "'Zvbc' (Vector Carryless Multiplication)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvfbfmin)] = .{
+ .llvm_name = "experimental-zvfbfmin",
+ .description = "'Zvbfmin' (Vector BF16 Converts)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve32f,
+ }),
+ };
+ result[@intFromEnum(Feature.experimental_zvfbfwma)] = .{
+ .llvm_name = "experimental-zvfbfwma",
+ .description = "'Zvfbfwma' (Vector BF16 widening mul-add)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve32f,
+ }),
+ };
+ result[@intFromEnum(Feature.experimental_zvkg)] = .{
+ .llvm_name = "experimental-zvkg",
+ .description = "'Zvkg' (Vector GCM instructions for Cryptography)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvkn)] = .{
+ .llvm_name = "experimental-zvkn",
+ .description = "This extension is shorthand for the following set of other extensions: Zvkned, Zvknhb, Zvbb, Zvbc, and Zvkt.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvknc)] = .{
+ .llvm_name = "experimental-zvknc",
+ .description = "This extension is shorthand for the following set of other extensions: Zvkn and Zvbc.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvkned)] = .{
+ .llvm_name = "experimental-zvkned",
+ .description = "'Zvkned' (Vector AES Encryption & Decryption (Single Round))",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvkng)] = .{
+ .llvm_name = "experimental-zvkng",
+ .description = "This extension is shorthand for the following set of other extensions: Zvkn and Zvkg.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvknha)] = .{
+ .llvm_name = "experimental-zvknha",
+ .description = "'Zvknha' (Vector SHA-2 (SHA-256 only))",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvknhb)] = .{
+ .llvm_name = "experimental-zvknhb",
+ .description = "'Zvknhb' (Vector SHA-2 (SHA-256 and SHA-512))",
+ .dependencies = featureSet(&[_]Feature{
+ .experimental_zvknha,
+ }),
+ };
+ result[@intFromEnum(Feature.experimental_zvks)] = .{
+ .llvm_name = "experimental-zvks",
+ .description = "This extension is shorthand for the following set of other extensions: Zvksed, Zvksh, Zvbb, Zvbc, and Zvkt.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvksc)] = .{
+ .llvm_name = "experimental-zvksc",
+ .description = "This extension is shorthand for the following set of other extensions: Zvks and Zvbc.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvksed)] = .{
+ .llvm_name = "experimental-zvksed",
+ .description = "'Zvksed' (SM4 Block Cipher Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvksg)] = .{
+ .llvm_name = "experimental-zvksg",
+ .description = "This extension is shorthand for the following set of other extensions: Zvks and Zvkg.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvksh)] = .{
+ .llvm_name = "experimental-zvksh",
+ .description = "'Zvksh' (SM3 Hash Function Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.experimental_zvkt)] = .{
+ .llvm_name = "experimental-zvkt",
+ .description = "'Zvkt' (Vector Data-Independent Execution Latency)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.f)] = .{
+ .llvm_name = "f",
+ .description = "'F' (Single-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .zicsr,
+ }),
+ };
+ result[@intFromEnum(Feature.forced_atomics)] = .{
+ .llvm_name = "forced-atomics",
+ .description = "Assume that lock-free native-width atomics are available",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.h)] = .{
+ .llvm_name = "h",
+ .description = "'H' (Hypervisor)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lui_addi_fusion)] = .{
+ .llvm_name = "lui-addi-fusion",
+ .description = "Enable LUI+ADDI macrofusion",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.m)] = .{
+ .llvm_name = "m",
+ .description = "'M' (Integer Multiplication and Division)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_default_unroll)] = .{
+ .llvm_name = "no-default-unroll",
+ .description = "Disable default unroll preference.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_optimized_zero_stride_load)] = .{
+ .llvm_name = "no-optimized-zero-stride-load",
+ .description = "Hasn't optimized (perform fewer memory operations)zero-stride vector load",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_rvc_hints)] = .{
+ .llvm_name = "no-rvc-hints",
+ .description = "Disable RVC Hint Instructions.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.relax)] = .{
+ .llvm_name = "relax",
+ .description = "Enable Linker relaxation.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x1)] = .{
+ .llvm_name = "reserve-x1",
+ .description = "Reserve X1",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x10)] = .{
+ .llvm_name = "reserve-x10",
+ .description = "Reserve X10",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x11)] = .{
+ .llvm_name = "reserve-x11",
+ .description = "Reserve X11",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x12)] = .{
+ .llvm_name = "reserve-x12",
+ .description = "Reserve X12",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x13)] = .{
+ .llvm_name = "reserve-x13",
+ .description = "Reserve X13",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x14)] = .{
+ .llvm_name = "reserve-x14",
+ .description = "Reserve X14",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x15)] = .{
+ .llvm_name = "reserve-x15",
+ .description = "Reserve X15",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x16)] = .{
+ .llvm_name = "reserve-x16",
+ .description = "Reserve X16",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x17)] = .{
+ .llvm_name = "reserve-x17",
+ .description = "Reserve X17",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x18)] = .{
+ .llvm_name = "reserve-x18",
+ .description = "Reserve X18",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x19)] = .{
+ .llvm_name = "reserve-x19",
+ .description = "Reserve X19",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x2)] = .{
+ .llvm_name = "reserve-x2",
+ .description = "Reserve X2",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x20)] = .{
+ .llvm_name = "reserve-x20",
+ .description = "Reserve X20",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x21)] = .{
+ .llvm_name = "reserve-x21",
+ .description = "Reserve X21",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x22)] = .{
+ .llvm_name = "reserve-x22",
+ .description = "Reserve X22",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x23)] = .{
+ .llvm_name = "reserve-x23",
+ .description = "Reserve X23",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x24)] = .{
+ .llvm_name = "reserve-x24",
+ .description = "Reserve X24",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x25)] = .{
+ .llvm_name = "reserve-x25",
+ .description = "Reserve X25",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x26)] = .{
+ .llvm_name = "reserve-x26",
+ .description = "Reserve X26",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x27)] = .{
+ .llvm_name = "reserve-x27",
+ .description = "Reserve X27",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x28)] = .{
+ .llvm_name = "reserve-x28",
+ .description = "Reserve X28",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x29)] = .{
+ .llvm_name = "reserve-x29",
+ .description = "Reserve X29",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x3)] = .{
+ .llvm_name = "reserve-x3",
+ .description = "Reserve X3",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x30)] = .{
+ .llvm_name = "reserve-x30",
+ .description = "Reserve X30",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x31)] = .{
+ .llvm_name = "reserve-x31",
+ .description = "Reserve X31",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x4)] = .{
+ .llvm_name = "reserve-x4",
+ .description = "Reserve X4",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x5)] = .{
+ .llvm_name = "reserve-x5",
+ .description = "Reserve X5",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x6)] = .{
+ .llvm_name = "reserve-x6",
+ .description = "Reserve X6",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x7)] = .{
+ .llvm_name = "reserve-x7",
+ .description = "Reserve X7",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x8)] = .{
+ .llvm_name = "reserve-x8",
+ .description = "Reserve X8",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reserve_x9)] = .{
+ .llvm_name = "reserve-x9",
+ .description = "Reserve X9",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.save_restore)] = .{
+ .llvm_name = "save-restore",
+ .description = "Enable save/restore.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.seq_cst_trailing_fence)] = .{
+ .llvm_name = "seq-cst-trailing-fence",
+ .description = "Enable trailing fence for seq-cst store.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.short_forward_branch_opt)] = .{
+ .llvm_name = "short-forward-branch-opt",
+ .description = "Enable short forward branch optimization",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.svinval)] = .{
+ .llvm_name = "svinval",
+ .description = "'Svinval' (Fine-Grained Address-Translation Cache Invalidation)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.svnapot)] = .{
+ .llvm_name = "svnapot",
+ .description = "'Svnapot' (NAPOT Translation Contiguity)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.svpbmt)] = .{
+ .llvm_name = "svpbmt",
+ .description = "'Svpbmt' (Page-Based Memory Types)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tagged_globals)] = .{
+ .llvm_name = "tagged-globals",
+ .description = "Use an instruction sequence for taking the address of a global that allows a memory tag in the upper address bits",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_scalar_mem)] = .{
+ .llvm_name = "unaligned-scalar-mem",
+ .description = "Has reasonably performant unaligned scalar loads and stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.unaligned_vector_mem)] = .{
+ .llvm_name = "unaligned-vector-mem",
+ .description = "Has reasonably performant unaligned vector loads and stores",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v)] = .{
+ .llvm_name = "v",
+ .description = "'V' (Vector Extension for Application Processors)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve64d,
+ .zvl128b,
+ }),
+ };
+ result[@intFromEnum(Feature.xcvbitmanip)] = .{
+ .llvm_name = "xcvbitmanip",
+ .description = "'XCVbitmanip' (CORE-V Bit Manipulation)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xcvmac)] = .{
+ .llvm_name = "xcvmac",
+ .description = "'XCVmac' (CORE-V Multiply-Accumulate)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xsfcie)] = .{
+ .llvm_name = "xsfcie",
+ .description = "'XSfcie' (SiFive Custom Instruction Extension SCIE.)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xsfvcp)] = .{
+ .llvm_name = "xsfvcp",
+ .description = "'XSfvcp' (SiFive Custom Vector Coprocessor Interface Instructions)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve32x,
+ }),
+ };
+ result[@intFromEnum(Feature.xtheadba)] = .{
+ .llvm_name = "xtheadba",
+ .description = "'xtheadba' (T-Head address calculation instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadbb)] = .{
+ .llvm_name = "xtheadbb",
+ .description = "'xtheadbb' (T-Head basic bit-manipulation instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadbs)] = .{
+ .llvm_name = "xtheadbs",
+ .description = "'xtheadbs' (T-Head single-bit instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadcmo)] = .{
+ .llvm_name = "xtheadcmo",
+ .description = "'xtheadcmo' (T-Head cache management instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadcondmov)] = .{
+ .llvm_name = "xtheadcondmov",
+ .description = "'xtheadcondmov' (T-Head conditional move instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadfmemidx)] = .{
+ .llvm_name = "xtheadfmemidx",
+ .description = "'xtheadfmemidx' (T-Head FP Indexed Memory Operations)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.xtheadmac)] = .{
+ .llvm_name = "xtheadmac",
+ .description = "'xtheadmac' (T-Head Multiply-Accumulate Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadmemidx)] = .{
+ .llvm_name = "xtheadmemidx",
+ .description = "'xtheadmemidx' (T-Head Indexed Memory Operations)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadmempair)] = .{
+ .llvm_name = "xtheadmempair",
+ .description = "'xtheadmempair' (T-Head two-GPR Memory Operations)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadsync)] = .{
+ .llvm_name = "xtheadsync",
+ .description = "'xtheadsync' (T-Head multicore synchronization instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xtheadvdot)] = .{
+ .llvm_name = "xtheadvdot",
+ .description = "'xtheadvdot' (T-Head Vector Extensions for Dot)",
+ .dependencies = featureSet(&[_]Feature{
+ .v,
+ }),
+ };
+ result[@intFromEnum(Feature.xventanacondops)] = .{
+ .llvm_name = "xventanacondops",
+ .description = "'XVentanaCondOps' (Ventana Conditional Ops)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zawrs)] = .{
+ .llvm_name = "zawrs",
+ .description = "'Zawrs' (Wait on Reservation Set)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zba)] = .{
+ .llvm_name = "zba",
+ .description = "'Zba' (Address Generation Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbb)] = .{
+ .llvm_name = "zbb",
+ .description = "'Zbb' (Basic Bit-Manipulation)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbc)] = .{
+ .llvm_name = "zbc",
+ .description = "'Zbc' (Carry-Less Multiplication)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbkb)] = .{
+ .llvm_name = "zbkb",
+ .description = "'Zbkb' (Bitmanip instructions for Cryptography)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbkc)] = .{
+ .llvm_name = "zbkc",
+ .description = "'Zbkc' (Carry-less multiply instructions for Cryptography)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbkx)] = .{
+ .llvm_name = "zbkx",
+ .description = "'Zbkx' (Crossbar permutation instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zbs)] = .{
+ .llvm_name = "zbs",
+ .description = "'Zbs' (Single-Bit Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zca)] = .{
+ .llvm_name = "zca",
+ .description = "'Zca' (part of the C extension, excluding compressed floating point loads/stores)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zcb)] = .{
+ .llvm_name = "zcb",
+ .description = "'Zcb' (Compressed basic bit manipulation instructions)",
+ .dependencies = featureSet(&[_]Feature{
+ .zca,
+ }),
+ };
+ result[@intFromEnum(Feature.zcd)] = .{
+ .llvm_name = "zcd",
+ .description = "'Zcd' (Compressed Double-Precision Floating-Point Instructions)",
+ .dependencies = featureSet(&[_]Feature{
+ .zca,
+ }),
+ };
+ result[@intFromEnum(Feature.zce)] = .{
+ .llvm_name = "zce",
+ .description = "'Zce' (Compressed extensions for microcontrollers)",
+ .dependencies = featureSet(&[_]Feature{
+ .zcb,
+ .zcmp,
+ .zcmt,
+ }),
+ };
+ result[@intFromEnum(Feature.zcf)] = .{
+ .llvm_name = "zcf",
+ .description = "'Zcf' (Compressed Single-Precision Floating-Point Instructions)",
+ .dependencies = featureSet(&[_]Feature{
+ .zca,
+ }),
+ };
+ result[@intFromEnum(Feature.zcmp)] = .{
+ .llvm_name = "zcmp",
+ .description = "'Zcmp' (sequenced instuctions for code-size reduction)",
+ .dependencies = featureSet(&[_]Feature{
+ .zca,
+ }),
+ };
+ result[@intFromEnum(Feature.zcmt)] = .{
+ .llvm_name = "zcmt",
+ .description = "'Zcmt' (table jump instuctions for code-size reduction)",
+ .dependencies = featureSet(&[_]Feature{
+ .zca,
+ .zicsr,
+ }),
+ };
+ result[@intFromEnum(Feature.zdinx)] = .{
+ .llvm_name = "zdinx",
+ .description = "'Zdinx' (Double in Integer)",
+ .dependencies = featureSet(&[_]Feature{
+ .zfinx,
+ }),
+ };
+ result[@intFromEnum(Feature.zfh)] = .{
+ .llvm_name = "zfh",
+ .description = "'Zfh' (Half-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.zfhmin)] = .{
+ .llvm_name = "zfhmin",
+ .description = "'Zfhmin' (Half-Precision Floating-Point Minimal)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ }),
+ };
+ result[@intFromEnum(Feature.zfinx)] = .{
+ .llvm_name = "zfinx",
+ .description = "'Zfinx' (Float in Integer)",
+ .dependencies = featureSet(&[_]Feature{
+ .zicsr,
+ }),
+ };
+ result[@intFromEnum(Feature.zhinx)] = .{
+ .llvm_name = "zhinx",
+ .description = "'Zhinx' (Half Float in Integer)",
+ .dependencies = featureSet(&[_]Feature{
+ .zfinx,
+ }),
+ };
+ result[@intFromEnum(Feature.zhinxmin)] = .{
+ .llvm_name = "zhinxmin",
+ .description = "'Zhinxmin' (Half Float in Integer Minimal)",
+ .dependencies = featureSet(&[_]Feature{
+ .zfinx,
+ }),
+ };
+ result[@intFromEnum(Feature.zicbom)] = .{
+ .llvm_name = "zicbom",
+ .description = "'Zicbom' (Cache-Block Management Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zicbop)] = .{
+ .llvm_name = "zicbop",
+ .description = "'Zicbop' (Cache-Block Prefetch Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zicboz)] = .{
+ .llvm_name = "zicboz",
+ .description = "'Zicboz' (Cache-Block Zero Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zicntr)] = .{
+ .llvm_name = "zicntr",
+ .description = "'Zicntr' (Base Counters and Timers)",
+ .dependencies = featureSet(&[_]Feature{
+ .zicsr,
+ }),
+ };
+ result[@intFromEnum(Feature.zicsr)] = .{
+ .llvm_name = "zicsr",
+ .description = "'zicsr' (CSRs)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zifencei)] = .{
+ .llvm_name = "zifencei",
+ .description = "'Zifencei' (fence.i)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zihintpause)] = .{
+ .llvm_name = "zihintpause",
+ .description = "'Zihintpause' (Pause Hint)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zihpm)] = .{
+ .llvm_name = "zihpm",
+ .description = "'Zihpm' (Hardware Performance Counters)",
+ .dependencies = featureSet(&[_]Feature{
+ .zicsr,
+ }),
+ };
+ result[@intFromEnum(Feature.zk)] = .{
+ .llvm_name = "zk",
+ .description = "'Zk' (Standard scalar cryptography extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .zkn,
+ .zkr,
+ .zkt,
+ }),
+ };
+ result[@intFromEnum(Feature.zkn)] = .{
+ .llvm_name = "zkn",
+ .description = "'Zkn' (NIST Algorithm Suite)",
+ .dependencies = featureSet(&[_]Feature{
+ .zbkb,
+ .zbkc,
+ .zbkx,
+ .zknd,
+ .zkne,
+ .zknh,
+ }),
+ };
+ result[@intFromEnum(Feature.zknd)] = .{
+ .llvm_name = "zknd",
+ .description = "'Zknd' (NIST Suite: AES Decryption)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zkne)] = .{
+ .llvm_name = "zkne",
+ .description = "'Zkne' (NIST Suite: AES Encryption)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zknh)] = .{
+ .llvm_name = "zknh",
+ .description = "'Zknh' (NIST Suite: Hash Function Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zkr)] = .{
+ .llvm_name = "zkr",
+ .description = "'Zkr' (Entropy Source Extension)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zks)] = .{
+ .llvm_name = "zks",
+ .description = "'Zks' (ShangMi Algorithm Suite)",
+ .dependencies = featureSet(&[_]Feature{
+ .zbkb,
+ .zbkc,
+ .zbkx,
+ .zksed,
+ .zksh,
+ }),
+ };
+ result[@intFromEnum(Feature.zksed)] = .{
+ .llvm_name = "zksed",
+ .description = "'Zksed' (ShangMi Suite: SM4 Block Cipher Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zksh)] = .{
+ .llvm_name = "zksh",
+ .description = "'Zksh' (ShangMi Suite: SM3 Hash Function Instructions)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zkt)] = .{
+ .llvm_name = "zkt",
+ .description = "'Zkt' (Data Independent Execution Latency)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zmmul)] = .{
+ .llvm_name = "zmmul",
+ .description = "'Zmmul' (Integer Multiplication)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zve32f)] = .{
+ .llvm_name = "zve32f",
+ .description = "'Zve32f' (Vector Extensions for Embedded Processors with maximal 32 EEW and F extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .f,
+ .zve32x,
+ }),
+ };
+ result[@intFromEnum(Feature.zve32x)] = .{
+ .llvm_name = "zve32x",
+ .description = "'Zve32x' (Vector Extensions for Embedded Processors with maximal 32 EEW)",
+ .dependencies = featureSet(&[_]Feature{
+ .zicsr,
+ .zvl32b,
+ }),
+ };
+ result[@intFromEnum(Feature.zve64d)] = .{
+ .llvm_name = "zve64d",
+ .description = "'Zve64d' (Vector Extensions for Embedded Processors with maximal 64 EEW, F and D extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .d,
+ .zve64f,
+ }),
+ };
+ result[@intFromEnum(Feature.zve64f)] = .{
+ .llvm_name = "zve64f",
+ .description = "'Zve64f' (Vector Extensions for Embedded Processors with maximal 64 EEW and F extension)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve32f,
+ .zve64x,
+ }),
+ };
+ result[@intFromEnum(Feature.zve64x)] = .{
+ .llvm_name = "zve64x",
+ .description = "'Zve64x' (Vector Extensions for Embedded Processors with maximal 64 EEW)",
+ .dependencies = featureSet(&[_]Feature{
+ .zve32x,
+ .zvl64b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvfh)] = .{
+ .llvm_name = "zvfh",
+ .description = "'Zvfh' (Vector Half-Precision Floating-Point)",
+ .dependencies = featureSet(&[_]Feature{
+ .zfhmin,
+ .zve32f,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl1024b)] = .{
+ .llvm_name = "zvl1024b",
+ .description = "'Zvl' (Minimum Vector Length) 1024",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl512b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl128b)] = .{
+ .llvm_name = "zvl128b",
+ .description = "'Zvl' (Minimum Vector Length) 128",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl64b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl16384b)] = .{
+ .llvm_name = "zvl16384b",
+ .description = "'Zvl' (Minimum Vector Length) 16384",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl8192b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl2048b)] = .{
+ .llvm_name = "zvl2048b",
+ .description = "'Zvl' (Minimum Vector Length) 2048",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl1024b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl256b)] = .{
+ .llvm_name = "zvl256b",
+ .description = "'Zvl' (Minimum Vector Length) 256",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl128b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl32768b)] = .{
+ .llvm_name = "zvl32768b",
+ .description = "'Zvl' (Minimum Vector Length) 32768",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl16384b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl32b)] = .{
+ .llvm_name = "zvl32b",
+ .description = "'Zvl' (Minimum Vector Length) 32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.zvl4096b)] = .{
+ .llvm_name = "zvl4096b",
+ .description = "'Zvl' (Minimum Vector Length) 4096",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl2048b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl512b)] = .{
+ .llvm_name = "zvl512b",
+ .description = "'Zvl' (Minimum Vector Length) 512",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl256b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl64b)] = .{
+ .llvm_name = "zvl64b",
+ .description = "'Zvl' (Minimum Vector Length) 64",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl32b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl65536b)] = .{
+ .llvm_name = "zvl65536b",
+ .description = "'Zvl' (Minimum Vector Length) 65536",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl32768b,
+ }),
+ };
+ result[@intFromEnum(Feature.zvl8192b)] = .{
+ .llvm_name = "zvl8192b",
+ .description = "'Zvl' (Minimum Vector Length) 8192",
+ .dependencies = featureSet(&[_]Feature{
+ .zvl4096b,
+ }),
+ };
+ 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 baseline_rv32 = CpuModel{
+ .name = "baseline_rv32",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ }),
+ };
+ pub const baseline_rv64 = CpuModel{
+ .name = "baseline_rv64",
+ .llvm_name = null,
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const generic_rv32 = CpuModel{
+ .name = "generic_rv32",
+ .llvm_name = "generic-rv32",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ }),
+ };
+ pub const generic_rv64 = CpuModel{
+ .name = "generic_rv64",
+ .llvm_name = "generic-rv64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ }),
+ };
+ pub const rocket = CpuModel{
+ .name = "rocket",
+ .llvm_name = "rocket",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const rocket_rv32 = CpuModel{
+ .name = "rocket_rv32",
+ .llvm_name = "rocket-rv32",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const rocket_rv64 = CpuModel{
+ .name = "rocket_rv64",
+ .llvm_name = "rocket-rv64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_7_series = CpuModel{
+ .name = "sifive_7_series",
+ .llvm_name = "sifive-7-series",
+ .features = featureSet(&[_]Feature{
+ .no_default_unroll,
+ .short_forward_branch_opt,
+ }),
+ };
+ pub const sifive_e20 = CpuModel{
+ .name = "sifive_e20",
+ .llvm_name = "sifive-e20",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .c,
+ .m,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_e21 = CpuModel{
+ .name = "sifive_e21",
+ .llvm_name = "sifive-e21",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .m,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_e24 = CpuModel{
+ .name = "sifive_e24",
+ .llvm_name = "sifive-e24",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .f,
+ .m,
+ .zifencei,
+ }),
+ };
+ pub const sifive_e31 = CpuModel{
+ .name = "sifive_e31",
+ .llvm_name = "sifive-e31",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .m,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_e34 = CpuModel{
+ .name = "sifive_e34",
+ .llvm_name = "sifive-e34",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .f,
+ .m,
+ .zifencei,
+ }),
+ };
+ pub const sifive_e76 = CpuModel{
+ .name = "sifive_e76",
+ .llvm_name = "sifive-e76",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .a,
+ .c,
+ .f,
+ .m,
+ .no_default_unroll,
+ .short_forward_branch_opt,
+ .zifencei,
+ }),
+ };
+ pub const sifive_s21 = CpuModel{
+ .name = "sifive_s21",
+ .llvm_name = "sifive-s21",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .m,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_s51 = CpuModel{
+ .name = "sifive_s51",
+ .llvm_name = "sifive-s51",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .m,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const sifive_s54 = CpuModel{
+ .name = "sifive_s54",
+ .llvm_name = "sifive-s54",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ .zifencei,
+ }),
+ };
+ pub const sifive_s76 = CpuModel{
+ .name = "sifive_s76",
+ .llvm_name = "sifive-s76",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ .no_default_unroll,
+ .short_forward_branch_opt,
+ .xsfcie,
+ .zifencei,
+ .zihintpause,
+ }),
+ };
+ pub const sifive_u54 = CpuModel{
+ .name = "sifive_u54",
+ .llvm_name = "sifive-u54",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ .zifencei,
+ }),
+ };
+ pub const sifive_u74 = CpuModel{
+ .name = "sifive_u74",
+ .llvm_name = "sifive-u74",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .d,
+ .m,
+ .no_default_unroll,
+ .short_forward_branch_opt,
+ .zifencei,
+ }),
+ };
+ pub const sifive_x280 = CpuModel{
+ .name = "sifive_x280",
+ .llvm_name = "sifive-x280",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .a,
+ .c,
+ .dlen_factor_2,
+ .m,
+ .no_default_unroll,
+ .short_forward_branch_opt,
+ .v,
+ .zba,
+ .zbb,
+ .zfh,
+ .zifencei,
+ .zvfh,
+ .zvl512b,
+ }),
+ };
+ pub const syntacore_scr1_base = CpuModel{
+ .name = "syntacore_scr1_base",
+ .llvm_name = "syntacore-scr1-base",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .c,
+ .no_default_unroll,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+ pub const syntacore_scr1_max = CpuModel{
+ .name = "syntacore_scr1_max",
+ .llvm_name = "syntacore-scr1-max",
+ .features = featureSet(&[_]Feature{
+ .@"32bit",
+ .c,
+ .m,
+ .no_default_unroll,
+ .zicsr,
+ .zifencei,
+ }),
+ };
+};
diff --git a/lib/std/Target/s390x.zig b/lib/std/Target/s390x.zig
new file mode 100644
index 0000000000..b642847258
--- /dev/null
+++ b/lib/std/Target/s390x.zig
@@ -0,0 +1,667 @@
+//! 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 {
+ bear_enhancement,
+ deflate_conversion,
+ dfp_packed_conversion,
+ dfp_zoned_conversion,
+ distinct_ops,
+ enhanced_dat_2,
+ enhanced_sort,
+ execution_hint,
+ fast_serialization,
+ fp_extension,
+ guarded_storage,
+ high_word,
+ insert_reference_bits_multiple,
+ interlocked_access1,
+ load_and_trap,
+ load_and_zero_rightmost_byte,
+ load_store_on_cond,
+ load_store_on_cond_2,
+ message_security_assist_extension3,
+ message_security_assist_extension4,
+ message_security_assist_extension5,
+ message_security_assist_extension7,
+ message_security_assist_extension8,
+ message_security_assist_extension9,
+ miscellaneous_extensions,
+ miscellaneous_extensions_2,
+ miscellaneous_extensions_3,
+ nnp_assist,
+ population_count,
+ processor_activity_instrumentation,
+ processor_assist,
+ reset_dat_protection,
+ reset_reference_bits_multiple,
+ soft_float,
+ transactional_execution,
+ vector,
+ vector_enhancements_1,
+ vector_enhancements_2,
+ vector_packed_decimal,
+ vector_packed_decimal_enhancement,
+ vector_packed_decimal_enhancement_2,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.bear_enhancement)] = .{
+ .llvm_name = "bear-enhancement",
+ .description = "Assume that the BEAR-enhancement facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.deflate_conversion)] = .{
+ .llvm_name = "deflate-conversion",
+ .description = "Assume that the deflate-conversion facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dfp_packed_conversion)] = .{
+ .llvm_name = "dfp-packed-conversion",
+ .description = "Assume that the DFP packed-conversion facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.dfp_zoned_conversion)] = .{
+ .llvm_name = "dfp-zoned-conversion",
+ .description = "Assume that the DFP zoned-conversion facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.distinct_ops)] = .{
+ .llvm_name = "distinct-ops",
+ .description = "Assume that the distinct-operands facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.enhanced_dat_2)] = .{
+ .llvm_name = "enhanced-dat-2",
+ .description = "Assume that the enhanced-DAT facility 2 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.enhanced_sort)] = .{
+ .llvm_name = "enhanced-sort",
+ .description = "Assume that the enhanced-sort facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.execution_hint)] = .{
+ .llvm_name = "execution-hint",
+ .description = "Assume that the execution-hint facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_serialization)] = .{
+ .llvm_name = "fast-serialization",
+ .description = "Assume that the fast-serialization facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fp_extension)] = .{
+ .llvm_name = "fp-extension",
+ .description = "Assume that the floating-point extension facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.guarded_storage)] = .{
+ .llvm_name = "guarded-storage",
+ .description = "Assume that the guarded-storage facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.high_word)] = .{
+ .llvm_name = "high-word",
+ .description = "Assume that the high-word facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.insert_reference_bits_multiple)] = .{
+ .llvm_name = "insert-reference-bits-multiple",
+ .description = "Assume that the insert-reference-bits-multiple facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.interlocked_access1)] = .{
+ .llvm_name = "interlocked-access1",
+ .description = "Assume that interlocked-access facility 1 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.load_and_trap)] = .{
+ .llvm_name = "load-and-trap",
+ .description = "Assume that the load-and-trap facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.load_and_zero_rightmost_byte)] = .{
+ .llvm_name = "load-and-zero-rightmost-byte",
+ .description = "Assume that the load-and-zero-rightmost-byte facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.load_store_on_cond)] = .{
+ .llvm_name = "load-store-on-cond",
+ .description = "Assume that the load/store-on-condition facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.load_store_on_cond_2)] = .{
+ .llvm_name = "load-store-on-cond-2",
+ .description = "Assume that the load/store-on-condition facility 2 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension3)] = .{
+ .llvm_name = "message-security-assist-extension3",
+ .description = "Assume that the message-security-assist extension facility 3 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension4)] = .{
+ .llvm_name = "message-security-assist-extension4",
+ .description = "Assume that the message-security-assist extension facility 4 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension5)] = .{
+ .llvm_name = "message-security-assist-extension5",
+ .description = "Assume that the message-security-assist extension facility 5 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension7)] = .{
+ .llvm_name = "message-security-assist-extension7",
+ .description = "Assume that the message-security-assist extension facility 7 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension8)] = .{
+ .llvm_name = "message-security-assist-extension8",
+ .description = "Assume that the message-security-assist extension facility 8 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.message_security_assist_extension9)] = .{
+ .llvm_name = "message-security-assist-extension9",
+ .description = "Assume that the message-security-assist extension facility 9 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.miscellaneous_extensions)] = .{
+ .llvm_name = "miscellaneous-extensions",
+ .description = "Assume that the miscellaneous-extensions facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.miscellaneous_extensions_2)] = .{
+ .llvm_name = "miscellaneous-extensions-2",
+ .description = "Assume that the miscellaneous-extensions facility 2 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.miscellaneous_extensions_3)] = .{
+ .llvm_name = "miscellaneous-extensions-3",
+ .description = "Assume that the miscellaneous-extensions facility 3 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nnp_assist)] = .{
+ .llvm_name = "nnp-assist",
+ .description = "Assume that the NNP-assist facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.population_count)] = .{
+ .llvm_name = "population-count",
+ .description = "Assume that the population-count facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.processor_activity_instrumentation)] = .{
+ .llvm_name = "processor-activity-instrumentation",
+ .description = "Assume that the processor-activity-instrumentation facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.processor_assist)] = .{
+ .llvm_name = "processor-assist",
+ .description = "Assume that the processor-assist facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reset_dat_protection)] = .{
+ .llvm_name = "reset-dat-protection",
+ .description = "Assume that the reset-DAT-protection facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reset_reference_bits_multiple)] = .{
+ .llvm_name = "reset-reference-bits-multiple",
+ .description = "Assume that the reset-reference-bits-multiple facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_float)] = .{
+ .llvm_name = "soft-float",
+ .description = "Use software emulation for floating point",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.transactional_execution)] = .{
+ .llvm_name = "transactional-execution",
+ .description = "Assume that the transactional-execution facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector)] = .{
+ .llvm_name = "vector",
+ .description = "Assume that the vectory facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector_enhancements_1)] = .{
+ .llvm_name = "vector-enhancements-1",
+ .description = "Assume that the vector enhancements facility 1 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector_enhancements_2)] = .{
+ .llvm_name = "vector-enhancements-2",
+ .description = "Assume that the vector enhancements facility 2 is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector_packed_decimal)] = .{
+ .llvm_name = "vector-packed-decimal",
+ .description = "Assume that the vector packed decimal facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector_packed_decimal_enhancement)] = .{
+ .llvm_name = "vector-packed-decimal-enhancement",
+ .description = "Assume that the vector packed decimal enhancement facility is installed",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vector_packed_decimal_enhancement_2)] = .{
+ .llvm_name = "vector-packed-decimal-enhancement-2",
+ .description = "Assume that the vector packed decimal enhancement facility 2 is installed",
+ .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 arch10 = CpuModel{
+ .name = "arch10",
+ .llvm_name = "arch10",
+ .features = featureSet(&[_]Feature{
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_store_on_cond,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .miscellaneous_extensions,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ }),
+ };
+ pub const arch11 = CpuModel{
+ .name = "arch11",
+ .llvm_name = "arch11",
+ .features = featureSet(&[_]Feature{
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .miscellaneous_extensions,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ }),
+ };
+ pub const arch12 = CpuModel{
+ .name = "arch12",
+ .llvm_name = "arch12",
+ .features = featureSet(&[_]Feature{
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_packed_decimal,
+ }),
+ };
+ pub const arch13 = CpuModel{
+ .name = "arch13",
+ .llvm_name = "arch13",
+ .features = featureSet(&[_]Feature{
+ .deflate_conversion,
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .enhanced_sort,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .message_security_assist_extension9,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .miscellaneous_extensions_3,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_enhancements_2,
+ .vector_packed_decimal,
+ .vector_packed_decimal_enhancement,
+ }),
+ };
+ pub const arch14 = CpuModel{
+ .name = "arch14",
+ .llvm_name = "arch14",
+ .features = featureSet(&[_]Feature{
+ .bear_enhancement,
+ .deflate_conversion,
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .enhanced_sort,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .message_security_assist_extension9,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .miscellaneous_extensions_3,
+ .nnp_assist,
+ .population_count,
+ .processor_activity_instrumentation,
+ .processor_assist,
+ .reset_dat_protection,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_enhancements_2,
+ .vector_packed_decimal,
+ .vector_packed_decimal_enhancement,
+ .vector_packed_decimal_enhancement_2,
+ }),
+ };
+ pub const arch8 = CpuModel{
+ .name = "arch8",
+ .llvm_name = "arch8",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const arch9 = CpuModel{
+ .name = "arch9",
+ .llvm_name = "arch9",
+ .features = featureSet(&[_]Feature{
+ .distinct_ops,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_store_on_cond,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .population_count,
+ .reset_reference_bits_multiple,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const z10 = CpuModel{
+ .name = "z10",
+ .llvm_name = "z10",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const z13 = CpuModel{
+ .name = "z13",
+ .llvm_name = "z13",
+ .features = featureSet(&[_]Feature{
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .miscellaneous_extensions,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ }),
+ };
+ pub const z14 = CpuModel{
+ .name = "z14",
+ .llvm_name = "z14",
+ .features = featureSet(&[_]Feature{
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_packed_decimal,
+ }),
+ };
+ pub const z15 = CpuModel{
+ .name = "z15",
+ .llvm_name = "z15",
+ .features = featureSet(&[_]Feature{
+ .deflate_conversion,
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .enhanced_sort,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .message_security_assist_extension9,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .miscellaneous_extensions_3,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_enhancements_2,
+ .vector_packed_decimal,
+ .vector_packed_decimal_enhancement,
+ }),
+ };
+ pub const z16 = CpuModel{
+ .name = "z16",
+ .llvm_name = "z16",
+ .features = featureSet(&[_]Feature{
+ .bear_enhancement,
+ .deflate_conversion,
+ .dfp_packed_conversion,
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .enhanced_sort,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .guarded_storage,
+ .high_word,
+ .insert_reference_bits_multiple,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_and_zero_rightmost_byte,
+ .load_store_on_cond,
+ .load_store_on_cond_2,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .message_security_assist_extension5,
+ .message_security_assist_extension7,
+ .message_security_assist_extension8,
+ .message_security_assist_extension9,
+ .miscellaneous_extensions,
+ .miscellaneous_extensions_2,
+ .miscellaneous_extensions_3,
+ .nnp_assist,
+ .population_count,
+ .processor_activity_instrumentation,
+ .processor_assist,
+ .reset_dat_protection,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ .vector,
+ .vector_enhancements_1,
+ .vector_enhancements_2,
+ .vector_packed_decimal,
+ .vector_packed_decimal_enhancement,
+ .vector_packed_decimal_enhancement_2,
+ }),
+ };
+ pub const z196 = CpuModel{
+ .name = "z196",
+ .llvm_name = "z196",
+ .features = featureSet(&[_]Feature{
+ .distinct_ops,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_store_on_cond,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .population_count,
+ .reset_reference_bits_multiple,
+ }),
+ };
+ pub const zEC12 = CpuModel{
+ .name = "zEC12",
+ .llvm_name = "zEC12",
+ .features = featureSet(&[_]Feature{
+ .dfp_zoned_conversion,
+ .distinct_ops,
+ .enhanced_dat_2,
+ .execution_hint,
+ .fast_serialization,
+ .fp_extension,
+ .high_word,
+ .interlocked_access1,
+ .load_and_trap,
+ .load_store_on_cond,
+ .message_security_assist_extension3,
+ .message_security_assist_extension4,
+ .miscellaneous_extensions,
+ .population_count,
+ .processor_assist,
+ .reset_reference_bits_multiple,
+ .transactional_execution,
+ }),
+ };
+};
diff --git a/lib/std/Target/sparc.zig b/lib/std/Target/sparc.zig
new file mode 100644
index 0000000000..87bd95697c
--- /dev/null
+++ b/lib/std/Target/sparc.zig
@@ -0,0 +1,455 @@
+//! 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 {
+ deprecated_v8,
+ detectroundchange,
+ fixallfdivsqrt,
+ hard_quad_float,
+ hasleoncasa,
+ hasumacsmac,
+ insertnopload,
+ leon,
+ leoncyclecounter,
+ leonpwrpsr,
+ no_fmuls,
+ no_fsmuld,
+ popc,
+ soft_float,
+ soft_mul_div,
+ v9,
+ vis,
+ vis2,
+ vis3,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.deprecated_v8)] = .{
+ .llvm_name = "deprecated-v8",
+ .description = "Enable deprecated V8 instructions in V9 mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.detectroundchange)] = .{
+ .llvm_name = "detectroundchange",
+ .description = "LEON3 erratum detection: Detects any rounding mode change request: use only the round-to-nearest rounding mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fixallfdivsqrt)] = .{
+ .llvm_name = "fixallfdivsqrt",
+ .description = "LEON erratum fix: Fix FDIVS/FDIVD/FSQRTS/FSQRTD instructions with NOPs and floating-point store",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hard_quad_float)] = .{
+ .llvm_name = "hard-quad-float",
+ .description = "Enable quad-word floating point instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hasleoncasa)] = .{
+ .llvm_name = "hasleoncasa",
+ .description = "Enable CASA instruction for LEON3 and LEON4 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hasumacsmac)] = .{
+ .llvm_name = "hasumacsmac",
+ .description = "Enable UMAC and SMAC for LEON3 and LEON4 processors",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.insertnopload)] = .{
+ .llvm_name = "insertnopload",
+ .description = "LEON3 erratum fix: Insert a NOP instruction after every single-cycle load instruction when the next instruction is another load/store instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.leon)] = .{
+ .llvm_name = "leon",
+ .description = "Enable LEON extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.leoncyclecounter)] = .{
+ .llvm_name = "leoncyclecounter",
+ .description = "Use the Leon cycle counter register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.leonpwrpsr)] = .{
+ .llvm_name = "leonpwrpsr",
+ .description = "Enable the PWRPSR instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_fmuls)] = .{
+ .llvm_name = "no-fmuls",
+ .description = "Disable the fmuls instruction.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_fsmuld)] = .{
+ .llvm_name = "no-fsmuld",
+ .description = "Disable the fsmuld instruction.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.popc)] = .{
+ .llvm_name = "popc",
+ .description = "Use the popc (population count) instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_float)] = .{
+ .llvm_name = "soft-float",
+ .description = "Use software emulation for floating point",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.soft_mul_div)] = .{
+ .llvm_name = "soft-mul-div",
+ .description = "Use software emulation for integer multiply and divide",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v9)] = .{
+ .llvm_name = "v9",
+ .description = "Enable SPARC-V9 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vis)] = .{
+ .llvm_name = "vis",
+ .description = "Enable UltraSPARC Visual Instruction Set extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vis2)] = .{
+ .llvm_name = "vis2",
+ .description = "Enable Visual Instruction Set extensions II",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vis3)] = .{
+ .llvm_name = "vis3",
+ .description = "Enable Visual Instruction Set extensions III",
+ .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 at697e = CpuModel{
+ .name = "at697e",
+ .llvm_name = "at697e",
+ .features = featureSet(&[_]Feature{
+ .insertnopload,
+ .leon,
+ }),
+ };
+ pub const at697f = CpuModel{
+ .name = "at697f",
+ .llvm_name = "at697f",
+ .features = featureSet(&[_]Feature{
+ .insertnopload,
+ .leon,
+ }),
+ };
+ pub const f934 = CpuModel{
+ .name = "f934",
+ .llvm_name = "f934",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const gr712rc = CpuModel{
+ .name = "gr712rc",
+ .llvm_name = "gr712rc",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const gr740 = CpuModel{
+ .name = "gr740",
+ .llvm_name = "gr740",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .hasumacsmac,
+ .leon,
+ .leoncyclecounter,
+ .leonpwrpsr,
+ }),
+ };
+ pub const hypersparc = CpuModel{
+ .name = "hypersparc",
+ .llvm_name = "hypersparc",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const leon2 = CpuModel{
+ .name = "leon2",
+ .llvm_name = "leon2",
+ .features = featureSet(&[_]Feature{
+ .leon,
+ }),
+ };
+ pub const leon3 = CpuModel{
+ .name = "leon3",
+ .llvm_name = "leon3",
+ .features = featureSet(&[_]Feature{
+ .hasumacsmac,
+ .leon,
+ }),
+ };
+ pub const leon4 = CpuModel{
+ .name = "leon4",
+ .llvm_name = "leon4",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .hasumacsmac,
+ .leon,
+ }),
+ };
+ pub const ma2080 = CpuModel{
+ .name = "ma2080",
+ .llvm_name = "ma2080",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2085 = CpuModel{
+ .name = "ma2085",
+ .llvm_name = "ma2085",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2100 = CpuModel{
+ .name = "ma2100",
+ .llvm_name = "ma2100",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2150 = CpuModel{
+ .name = "ma2150",
+ .llvm_name = "ma2150",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2155 = CpuModel{
+ .name = "ma2155",
+ .llvm_name = "ma2155",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2450 = CpuModel{
+ .name = "ma2450",
+ .llvm_name = "ma2450",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2455 = CpuModel{
+ .name = "ma2455",
+ .llvm_name = "ma2455",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2480 = CpuModel{
+ .name = "ma2480",
+ .llvm_name = "ma2480",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2485 = CpuModel{
+ .name = "ma2485",
+ .llvm_name = "ma2485",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2x5x = CpuModel{
+ .name = "ma2x5x",
+ .llvm_name = "ma2x5x",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const ma2x8x = CpuModel{
+ .name = "ma2x8x",
+ .llvm_name = "ma2x8x",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const myriad2 = CpuModel{
+ .name = "myriad2",
+ .llvm_name = "myriad2",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const myriad2_1 = CpuModel{
+ .name = "myriad2_1",
+ .llvm_name = "myriad2.1",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const myriad2_2 = CpuModel{
+ .name = "myriad2_2",
+ .llvm_name = "myriad2.2",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const myriad2_3 = CpuModel{
+ .name = "myriad2_3",
+ .llvm_name = "myriad2.3",
+ .features = featureSet(&[_]Feature{
+ .hasleoncasa,
+ .leon,
+ }),
+ };
+ pub const niagara = CpuModel{
+ .name = "niagara",
+ .llvm_name = "niagara",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .v9,
+ .vis,
+ .vis2,
+ }),
+ };
+ pub const niagara2 = CpuModel{
+ .name = "niagara2",
+ .llvm_name = "niagara2",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .popc,
+ .v9,
+ .vis,
+ .vis2,
+ }),
+ };
+ pub const niagara3 = CpuModel{
+ .name = "niagara3",
+ .llvm_name = "niagara3",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .popc,
+ .v9,
+ .vis,
+ .vis2,
+ }),
+ };
+ pub const niagara4 = CpuModel{
+ .name = "niagara4",
+ .llvm_name = "niagara4",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .popc,
+ .v9,
+ .vis,
+ .vis2,
+ .vis3,
+ }),
+ };
+ pub const sparclet = CpuModel{
+ .name = "sparclet",
+ .llvm_name = "sparclet",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const sparclite = CpuModel{
+ .name = "sparclite",
+ .llvm_name = "sparclite",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const sparclite86x = CpuModel{
+ .name = "sparclite86x",
+ .llvm_name = "sparclite86x",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const supersparc = CpuModel{
+ .name = "supersparc",
+ .llvm_name = "supersparc",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const tsc701 = CpuModel{
+ .name = "tsc701",
+ .llvm_name = "tsc701",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const ultrasparc = CpuModel{
+ .name = "ultrasparc",
+ .llvm_name = "ultrasparc",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .v9,
+ .vis,
+ }),
+ };
+ pub const ultrasparc3 = CpuModel{
+ .name = "ultrasparc3",
+ .llvm_name = "ultrasparc3",
+ .features = featureSet(&[_]Feature{
+ .deprecated_v8,
+ .v9,
+ .vis,
+ .vis2,
+ }),
+ };
+ pub const ut699 = CpuModel{
+ .name = "ut699",
+ .llvm_name = "ut699",
+ .features = featureSet(&[_]Feature{
+ .fixallfdivsqrt,
+ .insertnopload,
+ .leon,
+ .no_fmuls,
+ .no_fsmuld,
+ }),
+ };
+ pub const v7 = CpuModel{
+ .name = "v7",
+ .llvm_name = "v7",
+ .features = featureSet(&[_]Feature{
+ .no_fsmuld,
+ .soft_mul_div,
+ }),
+ };
+ pub const v8 = CpuModel{
+ .name = "v8",
+ .llvm_name = "v8",
+ .features = featureSet(&[_]Feature{}),
+ };
+ pub const v9 = CpuModel{
+ .name = "v9",
+ .llvm_name = "v9",
+ .features = featureSet(&[_]Feature{
+ .v9,
+ }),
+ };
+};
diff --git a/lib/std/Target/spirv.zig b/lib/std/Target/spirv.zig
new file mode 100644
index 0000000000..9d79aff221
--- /dev/null
+++ b/lib/std/Target/spirv.zig
@@ -0,0 +1,2091 @@
+//! This file is auto-generated by tools/update_spirv_features.zig.
+//! TODO: Dependencies of capabilities on extensions.
+//! TODO: Dependencies of extensions on extensions.
+//! TODO: Dependencies of extensions on versions.
+
+const std = @import("../std.zig");
+const CpuFeature = std.Target.Cpu.Feature;
+const CpuModel = std.Target.Cpu.Model;
+
+pub const Feature = enum {
+ v1_1,
+ v1_2,
+ v1_3,
+ v1_4,
+ v1_5,
+ SPV_AMD_shader_fragment_mask,
+ SPV_AMD_gpu_shader_int16,
+ SPV_AMD_gpu_shader_half_float,
+ SPV_AMD_texture_gather_bias_lod,
+ SPV_AMD_shader_ballot,
+ SPV_AMD_gcn_shader,
+ SPV_AMD_shader_image_load_store_lod,
+ SPV_AMD_shader_explicit_vertex_parameter,
+ SPV_AMD_shader_trinary_minmax,
+ SPV_AMD_gpu_shader_half_float_fetch,
+ SPV_GOOGLE_hlsl_functionality1,
+ SPV_GOOGLE_user_type,
+ SPV_GOOGLE_decorate_string,
+ SPV_EXT_demote_to_helper_invocation,
+ SPV_EXT_descriptor_indexing,
+ SPV_EXT_fragment_fully_covered,
+ SPV_EXT_shader_stencil_export,
+ SPV_EXT_physical_storage_buffer,
+ SPV_EXT_shader_atomic_float_add,
+ SPV_EXT_shader_atomic_float_min_max,
+ SPV_EXT_shader_image_int64,
+ SPV_EXT_fragment_shader_interlock,
+ SPV_EXT_fragment_invocation_density,
+ SPV_EXT_shader_viewport_index_layer,
+ SPV_INTEL_loop_fuse,
+ SPV_INTEL_fpga_dsp_control,
+ SPV_INTEL_fpga_reg,
+ SPV_INTEL_fpga_memory_accesses,
+ SPV_INTEL_fpga_loop_controls,
+ SPV_INTEL_io_pipes,
+ SPV_INTEL_unstructured_loop_controls,
+ SPV_INTEL_blocking_pipes,
+ SPV_INTEL_device_side_avc_motion_estimation,
+ SPV_INTEL_fpga_memory_attributes,
+ SPV_INTEL_fp_fast_math_mode,
+ SPV_INTEL_media_block_io,
+ SPV_INTEL_shader_integer_functions2,
+ SPV_INTEL_subgroups,
+ SPV_INTEL_fpga_cluster_attributes,
+ SPV_INTEL_kernel_attributes,
+ SPV_INTEL_arbitrary_precision_integers,
+ SPV_KHR_8bit_storage,
+ SPV_KHR_shader_clock,
+ SPV_KHR_device_group,
+ SPV_KHR_16bit_storage,
+ SPV_KHR_variable_pointers,
+ SPV_KHR_no_integer_wrap_decoration,
+ SPV_KHR_subgroup_vote,
+ SPV_KHR_multiview,
+ SPV_KHR_shader_ballot,
+ SPV_KHR_vulkan_memory_model,
+ SPV_KHR_physical_storage_buffer,
+ SPV_KHR_workgroup_memory_explicit_layout,
+ SPV_KHR_fragment_shading_rate,
+ SPV_KHR_shader_atomic_counter_ops,
+ SPV_KHR_shader_draw_parameters,
+ SPV_KHR_storage_buffer_storage_class,
+ SPV_KHR_linkonce_odr,
+ SPV_KHR_terminate_invocation,
+ SPV_KHR_non_semantic_info,
+ SPV_KHR_post_depth_coverage,
+ SPV_KHR_expect_assume,
+ SPV_KHR_ray_tracing,
+ SPV_KHR_ray_query,
+ SPV_KHR_float_controls,
+ SPV_NV_viewport_array2,
+ SPV_NV_shader_subgroup_partitioned,
+ SPV_NVX_multiview_per_view_attributes,
+ SPV_NV_ray_tracing,
+ SPV_NV_shader_image_footprint,
+ SPV_NV_shading_rate,
+ SPV_NV_stereo_view_rendering,
+ SPV_NV_compute_shader_derivatives,
+ SPV_NV_shader_sm_builtins,
+ SPV_NV_mesh_shader,
+ SPV_NV_geometry_shader_passthrough,
+ SPV_NV_fragment_shader_barycentric,
+ SPV_NV_cooperative_matrix,
+ SPV_NV_sample_mask_override_coverage,
+ Matrix,
+ Shader,
+ Geometry,
+ Tessellation,
+ Addresses,
+ Linkage,
+ Kernel,
+ Vector16,
+ Float16Buffer,
+ Float16,
+ Float64,
+ Int64,
+ Int64Atomics,
+ ImageBasic,
+ ImageReadWrite,
+ ImageMipmap,
+ Pipes,
+ Groups,
+ DeviceEnqueue,
+ LiteralSampler,
+ AtomicStorage,
+ Int16,
+ TessellationPointSize,
+ GeometryPointSize,
+ ImageGatherExtended,
+ StorageImageMultisample,
+ UniformBufferArrayDynamicIndexing,
+ SampledImageArrayDynamicIndexing,
+ StorageBufferArrayDynamicIndexing,
+ StorageImageArrayDynamicIndexing,
+ ClipDistance,
+ CullDistance,
+ ImageCubeArray,
+ SampleRateShading,
+ ImageRect,
+ SampledRect,
+ GenericPointer,
+ Int8,
+ InputAttachment,
+ SparseResidency,
+ MinLod,
+ Sampled1D,
+ Image1D,
+ SampledCubeArray,
+ SampledBuffer,
+ ImageBuffer,
+ ImageMSArray,
+ StorageImageExtendedFormats,
+ ImageQuery,
+ DerivativeControl,
+ InterpolationFunction,
+ TransformFeedback,
+ GeometryStreams,
+ StorageImageReadWithoutFormat,
+ StorageImageWriteWithoutFormat,
+ MultiViewport,
+ SubgroupDispatch,
+ NamedBarrier,
+ PipeStorage,
+ GroupNonUniform,
+ GroupNonUniformVote,
+ GroupNonUniformArithmetic,
+ GroupNonUniformBallot,
+ GroupNonUniformShuffle,
+ GroupNonUniformShuffleRelative,
+ GroupNonUniformClustered,
+ GroupNonUniformQuad,
+ ShaderLayer,
+ ShaderViewportIndex,
+ FragmentShadingRateKHR,
+ SubgroupBallotKHR,
+ DrawParameters,
+ WorkgroupMemoryExplicitLayoutKHR,
+ WorkgroupMemoryExplicitLayout8BitAccessKHR,
+ WorkgroupMemoryExplicitLayout16BitAccessKHR,
+ SubgroupVoteKHR,
+ StorageBuffer16BitAccess,
+ StorageUniformBufferBlock16,
+ UniformAndStorageBuffer16BitAccess,
+ StorageUniform16,
+ StoragePushConstant16,
+ StorageInputOutput16,
+ DeviceGroup,
+ MultiView,
+ VariablePointersStorageBuffer,
+ VariablePointers,
+ AtomicStorageOps,
+ SampleMaskPostDepthCoverage,
+ StorageBuffer8BitAccess,
+ UniformAndStorageBuffer8BitAccess,
+ StoragePushConstant8,
+ DenormPreserve,
+ DenormFlushToZero,
+ SignedZeroInfNanPreserve,
+ RoundingModeRTE,
+ RoundingModeRTZ,
+ RayQueryProvisionalKHR,
+ RayQueryKHR,
+ RayTraversalPrimitiveCullingKHR,
+ RayTracingKHR,
+ Float16ImageAMD,
+ ImageGatherBiasLodAMD,
+ FragmentMaskAMD,
+ StencilExportEXT,
+ ImageReadWriteLodAMD,
+ Int64ImageEXT,
+ ShaderClockKHR,
+ SampleMaskOverrideCoverageNV,
+ GeometryShaderPassthroughNV,
+ ShaderViewportIndexLayerEXT,
+ ShaderViewportIndexLayerNV,
+ ShaderViewportMaskNV,
+ ShaderStereoViewNV,
+ PerViewAttributesNV,
+ FragmentFullyCoveredEXT,
+ MeshShadingNV,
+ ImageFootprintNV,
+ FragmentBarycentricNV,
+ ComputeDerivativeGroupQuadsNV,
+ FragmentDensityEXT,
+ ShadingRateNV,
+ GroupNonUniformPartitionedNV,
+ ShaderNonUniform,
+ ShaderNonUniformEXT,
+ RuntimeDescriptorArray,
+ RuntimeDescriptorArrayEXT,
+ InputAttachmentArrayDynamicIndexing,
+ InputAttachmentArrayDynamicIndexingEXT,
+ UniformTexelBufferArrayDynamicIndexing,
+ UniformTexelBufferArrayDynamicIndexingEXT,
+ StorageTexelBufferArrayDynamicIndexing,
+ StorageTexelBufferArrayDynamicIndexingEXT,
+ UniformBufferArrayNonUniformIndexing,
+ UniformBufferArrayNonUniformIndexingEXT,
+ SampledImageArrayNonUniformIndexing,
+ SampledImageArrayNonUniformIndexingEXT,
+ StorageBufferArrayNonUniformIndexing,
+ StorageBufferArrayNonUniformIndexingEXT,
+ StorageImageArrayNonUniformIndexing,
+ StorageImageArrayNonUniformIndexingEXT,
+ InputAttachmentArrayNonUniformIndexing,
+ InputAttachmentArrayNonUniformIndexingEXT,
+ UniformTexelBufferArrayNonUniformIndexing,
+ UniformTexelBufferArrayNonUniformIndexingEXT,
+ StorageTexelBufferArrayNonUniformIndexing,
+ StorageTexelBufferArrayNonUniformIndexingEXT,
+ RayTracingNV,
+ VulkanMemoryModel,
+ VulkanMemoryModelKHR,
+ VulkanMemoryModelDeviceScope,
+ VulkanMemoryModelDeviceScopeKHR,
+ PhysicalStorageBufferAddresses,
+ PhysicalStorageBufferAddressesEXT,
+ ComputeDerivativeGroupLinearNV,
+ RayTracingProvisionalKHR,
+ CooperativeMatrixNV,
+ FragmentShaderSampleInterlockEXT,
+ FragmentShaderShadingRateInterlockEXT,
+ ShaderSMBuiltinsNV,
+ FragmentShaderPixelInterlockEXT,
+ DemoteToHelperInvocationEXT,
+ SubgroupShuffleINTEL,
+ SubgroupBufferBlockIOINTEL,
+ SubgroupImageBlockIOINTEL,
+ SubgroupImageMediaBlockIOINTEL,
+ RoundToInfinityINTEL,
+ FloatingPointModeINTEL,
+ IntegerFunctions2INTEL,
+ FunctionPointersINTEL,
+ IndirectReferencesINTEL,
+ AsmINTEL,
+ AtomicFloat32MinMaxEXT,
+ AtomicFloat64MinMaxEXT,
+ AtomicFloat16MinMaxEXT,
+ VectorComputeINTEL,
+ VectorAnyINTEL,
+ ExpectAssumeKHR,
+ SubgroupAvcMotionEstimationINTEL,
+ SubgroupAvcMotionEstimationIntraINTEL,
+ SubgroupAvcMotionEstimationChromaINTEL,
+ VariableLengthArrayINTEL,
+ FunctionFloatControlINTEL,
+ FPGAMemoryAttributesINTEL,
+ FPFastMathModeINTEL,
+ ArbitraryPrecisionIntegersINTEL,
+ UnstructuredLoopControlsINTEL,
+ FPGALoopControlsINTEL,
+ KernelAttributesINTEL,
+ FPGAKernelAttributesINTEL,
+ FPGAMemoryAccessesINTEL,
+ FPGAClusterAttributesINTEL,
+ LoopFuseINTEL,
+ FPGABufferLocationINTEL,
+ USMStorageClassesINTEL,
+ IOPipesINTEL,
+ BlockingPipesINTEL,
+ FPGARegINTEL,
+ AtomicFloat32AddEXT,
+ AtomicFloat64AddEXT,
+ LongConstantCompositeINTEL,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(Feature).featureSetHasAll;
+
+pub const all_features = blk: {
+ @setEvalBranchQuota(2000);
+ const len = @typeInfo(Feature).Enum.fields.len;
+ std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
+ var result: [len]CpuFeature = undefined;
+ result[@intFromEnum(Feature.v1_1)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V version 1.1",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.v1_2)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V version 1.2",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_1,
+ }),
+ };
+ result[@intFromEnum(Feature.v1_3)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V version 1.3",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_2,
+ }),
+ };
+ result[@intFromEnum(Feature.v1_4)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V version 1.4",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.v1_5)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V version 1.5",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_shader_fragment_mask)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_shader_fragment_mask",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_gpu_shader_int16)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_gpu_shader_int16",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_texture_gather_bias_lod)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_texture_gather_bias_lod",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_shader_ballot)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_shader_ballot",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_gcn_shader)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_gcn_shader",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_shader_image_load_store_lod)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_shader_image_load_store_lod",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_shader_explicit_vertex_parameter)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_shader_explicit_vertex_parameter",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_shader_trinary_minmax)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_shader_trinary_minmax",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float_fetch)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float_fetch",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_GOOGLE_hlsl_functionality1)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_GOOGLE_hlsl_functionality1",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_GOOGLE_user_type)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_GOOGLE_user_type",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_GOOGLE_decorate_string)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_GOOGLE_decorate_string",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_demote_to_helper_invocation)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_demote_to_helper_invocation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_descriptor_indexing)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_descriptor_indexing",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_fragment_fully_covered)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_fragment_fully_covered",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_shader_stencil_export)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_shader_stencil_export",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_physical_storage_buffer)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_physical_storage_buffer",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_add)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_shader_atomic_float_add",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_min_max)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_shader_atomic_float_min_max",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_shader_image_int64)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_shader_image_int64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_fragment_shader_interlock)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_fragment_shader_interlock",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_fragment_invocation_density)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_fragment_invocation_density",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_EXT_shader_viewport_index_layer)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_EXT_shader_viewport_index_layer",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_loop_fuse)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_loop_fuse",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_dsp_control)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_dsp_control",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_reg)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_reg",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_accesses)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_memory_accesses",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_loop_controls)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_loop_controls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_io_pipes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_io_pipes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_unstructured_loop_controls)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_unstructured_loop_controls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_blocking_pipes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_blocking_pipes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_device_side_avc_motion_estimation)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_device_side_avc_motion_estimation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_attributes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_memory_attributes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fp_fast_math_mode)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fp_fast_math_mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_media_block_io)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_media_block_io",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_shader_integer_functions2)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_shader_integer_functions2",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_subgroups)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_subgroups",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_fpga_cluster_attributes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_fpga_cluster_attributes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_kernel_attributes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_kernel_attributes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_integers)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_integers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_8bit_storage)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_8bit_storage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_shader_clock)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_shader_clock",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_device_group)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_device_group",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_16bit_storage)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_16bit_storage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_variable_pointers)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_variable_pointers",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_no_integer_wrap_decoration)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_no_integer_wrap_decoration",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_subgroup_vote)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_subgroup_vote",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_multiview)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_multiview",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_shader_ballot)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_shader_ballot",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_vulkan_memory_model)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_vulkan_memory_model",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_physical_storage_buffer)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_physical_storage_buffer",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_workgroup_memory_explicit_layout)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_workgroup_memory_explicit_layout",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_fragment_shading_rate)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_fragment_shading_rate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_shader_atomic_counter_ops)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_shader_atomic_counter_ops",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_shader_draw_parameters)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_shader_draw_parameters",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_storage_buffer_storage_class)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_storage_buffer_storage_class",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_linkonce_odr)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_linkonce_odr",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_terminate_invocation)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_terminate_invocation",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_non_semantic_info)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_non_semantic_info",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_post_depth_coverage)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_post_depth_coverage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_expect_assume)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_expect_assume",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_ray_tracing)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_ray_tracing",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_ray_query)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_ray_query",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_KHR_float_controls)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_KHR_float_controls",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_viewport_array2)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_viewport_array2",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_shader_subgroup_partitioned)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_shader_subgroup_partitioned",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NVX_multiview_per_view_attributes)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NVX_multiview_per_view_attributes",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_ray_tracing)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_ray_tracing",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_shader_image_footprint)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_shader_image_footprint",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_shading_rate)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_shading_rate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_stereo_view_rendering)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_stereo_view_rendering",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_compute_shader_derivatives)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_compute_shader_derivatives",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_shader_sm_builtins)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_shader_sm_builtins",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_mesh_shader)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_mesh_shader",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_geometry_shader_passthrough)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_geometry_shader_passthrough",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_fragment_shader_barycentric)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_fragment_shader_barycentric",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_cooperative_matrix)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_cooperative_matrix",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SPV_NV_sample_mask_override_coverage)] = .{
+ .llvm_name = null,
+ .description = "SPIR-V extension SPV_NV_sample_mask_override_coverage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Matrix)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Matrix",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Shader)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Shader",
+ .dependencies = featureSet(&[_]Feature{
+ .Matrix,
+ }),
+ };
+ result[@intFromEnum(Feature.Geometry)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Geometry",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Tessellation)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Tessellation",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Addresses)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Addresses",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Linkage)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Linkage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Kernel)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Kernel",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Vector16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Vector16",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.Float16Buffer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Float16Buffer",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.Float16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Float16",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Float64)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Float64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Int64)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Int64",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Int64Atomics)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Int64Atomics",
+ .dependencies = featureSet(&[_]Feature{
+ .Int64,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageBasic)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageBasic",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageReadWrite)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageReadWrite",
+ .dependencies = featureSet(&[_]Feature{
+ .ImageBasic,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageMipmap)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageMipmap",
+ .dependencies = featureSet(&[_]Feature{
+ .ImageBasic,
+ }),
+ };
+ result[@intFromEnum(Feature.Pipes)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Pipes",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.Groups)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Groups",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.DeviceEnqueue)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DeviceEnqueue",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.LiteralSampler)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability LiteralSampler",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.AtomicStorage)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicStorage",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Int16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Int16",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.TessellationPointSize)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability TessellationPointSize",
+ .dependencies = featureSet(&[_]Feature{
+ .Tessellation,
+ }),
+ };
+ result[@intFromEnum(Feature.GeometryPointSize)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GeometryPointSize",
+ .dependencies = featureSet(&[_]Feature{
+ .Geometry,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageGatherExtended)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageGatherExtended",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageMultisample)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageMultisample",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformBufferArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformBufferArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledImageArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledImageArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageBufferArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageBufferArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ClipDistance)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ClipDistance",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.CullDistance)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability CullDistance",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageCubeArray)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageCubeArray",
+ .dependencies = featureSet(&[_]Feature{
+ .SampledCubeArray,
+ }),
+ };
+ result[@intFromEnum(Feature.SampleRateShading)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampleRateShading",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageRect)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageRect",
+ .dependencies = featureSet(&[_]Feature{
+ .SampledRect,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledRect)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledRect",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.GenericPointer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GenericPointer",
+ .dependencies = featureSet(&[_]Feature{
+ .Addresses,
+ }),
+ };
+ result[@intFromEnum(Feature.Int8)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Int8",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.InputAttachment)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InputAttachment",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SparseResidency)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SparseResidency",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.MinLod)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability MinLod",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Sampled1D)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Sampled1D",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.Image1D)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Image1D",
+ .dependencies = featureSet(&[_]Feature{
+ .Sampled1D,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledCubeArray)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledCubeArray",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledBuffer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledBuffer",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ImageBuffer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageBuffer",
+ .dependencies = featureSet(&[_]Feature{
+ .SampledBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageMSArray)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageMSArray",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageExtendedFormats)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageExtendedFormats",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageQuery)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageQuery",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.DerivativeControl)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DerivativeControl",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.InterpolationFunction)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InterpolationFunction",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.TransformFeedback)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability TransformFeedback",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.GeometryStreams)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GeometryStreams",
+ .dependencies = featureSet(&[_]Feature{
+ .Geometry,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageReadWithoutFormat)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageReadWithoutFormat",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageWriteWithoutFormat)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageWriteWithoutFormat",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.MultiViewport)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability MultiViewport",
+ .dependencies = featureSet(&[_]Feature{
+ .Geometry,
+ }),
+ };
+ result[@intFromEnum(Feature.SubgroupDispatch)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupDispatch",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_1,
+ .DeviceEnqueue,
+ }),
+ };
+ result[@intFromEnum(Feature.NamedBarrier)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability NamedBarrier",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_1,
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.PipeStorage)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability PipeStorage",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_1,
+ .Pipes,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniform)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniform",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformVote)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformVote",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformArithmetic)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformArithmetic",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformBallot)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformBallot",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformShuffle)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformShuffle",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformShuffleRelative)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformShuffleRelative",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformClustered)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformClustered",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformQuad)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformQuad",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .GroupNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderLayer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderLayer",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderViewportIndex)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderViewportIndex",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentShadingRateKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentShadingRateKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SubgroupBallotKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupBallotKHR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.DrawParameters)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DrawParameters",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayoutKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayoutKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout8BitAccessKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout8BitAccessKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .WorkgroupMemoryExplicitLayoutKHR,
+ }),
+ };
+ result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout16BitAccessKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout16BitAccessKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SubgroupVoteKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupVoteKHR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.StorageBuffer16BitAccess)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageBuffer16BitAccess",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageUniformBufferBlock16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageUniformBufferBlock16",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformAndStorageBuffer16BitAccess)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformAndStorageBuffer16BitAccess",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .StorageBuffer16BitAccess,
+ .StorageUniformBufferBlock16,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageUniform16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageUniform16",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .StorageBuffer16BitAccess,
+ .StorageUniformBufferBlock16,
+ }),
+ };
+ result[@intFromEnum(Feature.StoragePushConstant16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StoragePushConstant16",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageInputOutput16)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageInputOutput16",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.DeviceGroup)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DeviceGroup",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ }),
+ };
+ result[@intFromEnum(Feature.MultiView)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability MultiView",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.VariablePointersStorageBuffer)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VariablePointersStorageBuffer",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.VariablePointers)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VariablePointers",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_3,
+ .VariablePointersStorageBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.AtomicStorageOps)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicStorageOps",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SampleMaskPostDepthCoverage)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampleMaskPostDepthCoverage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.StorageBuffer8BitAccess)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageBuffer8BitAccess",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformAndStorageBuffer8BitAccess)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformAndStorageBuffer8BitAccess",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .StorageBuffer8BitAccess,
+ }),
+ };
+ result[@intFromEnum(Feature.StoragePushConstant8)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StoragePushConstant8",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.DenormPreserve)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DenormPreserve",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.DenormFlushToZero)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DenormFlushToZero",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.SignedZeroInfNanPreserve)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SignedZeroInfNanPreserve",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.RoundingModeRTE)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RoundingModeRTE",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.RoundingModeRTZ)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RoundingModeRTZ",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_4,
+ }),
+ };
+ result[@intFromEnum(Feature.RayQueryProvisionalKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayQueryProvisionalKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.RayQueryKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayQueryKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.RayTraversalPrimitiveCullingKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayTraversalPrimitiveCullingKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .RayQueryKHR,
+ .RayTracingKHR,
+ }),
+ };
+ result[@intFromEnum(Feature.RayTracingKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayTracingKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Float16ImageAMD)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Float16ImageAMD",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageGatherBiasLodAMD)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageGatherBiasLodAMD",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentMaskAMD)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentMaskAMD",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.StencilExportEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StencilExportEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageReadWriteLodAMD)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageReadWriteLodAMD",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.Int64ImageEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability Int64ImageEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderClockKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderClockKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SampleMaskOverrideCoverageNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampleMaskOverrideCoverageNV",
+ .dependencies = featureSet(&[_]Feature{
+ .SampleRateShading,
+ }),
+ };
+ result[@intFromEnum(Feature.GeometryShaderPassthroughNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GeometryShaderPassthroughNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Geometry,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderViewportIndexLayerEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderViewportIndexLayerEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .MultiViewport,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderViewportIndexLayerNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderViewportIndexLayerNV",
+ .dependencies = featureSet(&[_]Feature{
+ .MultiViewport,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderViewportMaskNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderViewportMaskNV",
+ .dependencies = featureSet(&[_]Feature{
+ .ShaderViewportIndexLayerNV,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderStereoViewNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderStereoViewNV",
+ .dependencies = featureSet(&[_]Feature{
+ .ShaderViewportMaskNV,
+ }),
+ };
+ result[@intFromEnum(Feature.PerViewAttributesNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability PerViewAttributesNV",
+ .dependencies = featureSet(&[_]Feature{
+ .MultiView,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentFullyCoveredEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentFullyCoveredEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.MeshShadingNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability MeshShadingNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ImageFootprintNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ImageFootprintNV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FragmentBarycentricNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentBarycentricNV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ComputeDerivativeGroupQuadsNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ComputeDerivativeGroupQuadsNV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FragmentDensityEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentDensityEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ShadingRateNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShadingRateNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.GroupNonUniformPartitionedNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability GroupNonUniformPartitionedNV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ShaderNonUniform)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderNonUniform",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderNonUniformEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderNonUniformEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.RuntimeDescriptorArray)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RuntimeDescriptorArray",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.RuntimeDescriptorArrayEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RuntimeDescriptorArrayEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.InputAttachmentArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InputAttachmentArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .InputAttachment,
+ }),
+ };
+ result[@intFromEnum(Feature.InputAttachmentArrayDynamicIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InputAttachmentArrayDynamicIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .InputAttachment,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformTexelBufferArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformTexelBufferArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .SampledBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformTexelBufferArrayDynamicIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformTexelBufferArrayDynamicIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .SampledBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageTexelBufferArrayDynamicIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageTexelBufferArrayDynamicIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ImageBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageTexelBufferArrayDynamicIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageTexelBufferArrayDynamicIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ImageBuffer,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformBufferArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformBufferArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformBufferArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformBufferArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledImageArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledImageArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.SampledImageArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SampledImageArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageBufferArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageBufferArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageBufferArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageBufferArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageImageArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageImageArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.InputAttachmentArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InputAttachmentArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .InputAttachment,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.InputAttachmentArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability InputAttachmentArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .InputAttachment,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformTexelBufferArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformTexelBufferArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .SampledBuffer,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.UniformTexelBufferArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UniformTexelBufferArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .SampledBuffer,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageTexelBufferArrayNonUniformIndexing)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageTexelBufferArrayNonUniformIndexing",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ImageBuffer,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.StorageTexelBufferArrayNonUniformIndexingEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability StorageTexelBufferArrayNonUniformIndexingEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .ImageBuffer,
+ .ShaderNonUniform,
+ }),
+ };
+ result[@intFromEnum(Feature.RayTracingNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayTracingNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.VulkanMemoryModel)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VulkanMemoryModel",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.VulkanMemoryModelKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VulkanMemoryModelKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.VulkanMemoryModelDeviceScope)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VulkanMemoryModelDeviceScope",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.VulkanMemoryModelDeviceScopeKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VulkanMemoryModelDeviceScopeKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ }),
+ };
+ result[@intFromEnum(Feature.PhysicalStorageBufferAddresses)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability PhysicalStorageBufferAddresses",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.PhysicalStorageBufferAddressesEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability PhysicalStorageBufferAddressesEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .v1_5,
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ComputeDerivativeGroupLinearNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ComputeDerivativeGroupLinearNV",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.RayTracingProvisionalKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RayTracingProvisionalKHR",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.CooperativeMatrixNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability CooperativeMatrixNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentShaderSampleInterlockEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentShaderSampleInterlockEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentShaderShadingRateInterlockEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentShaderShadingRateInterlockEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.ShaderSMBuiltinsNV)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ShaderSMBuiltinsNV",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.FragmentShaderPixelInterlockEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FragmentShaderPixelInterlockEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.DemoteToHelperInvocationEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability DemoteToHelperInvocationEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.SubgroupShuffleINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupShuffleINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupBufferBlockIOINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupBufferBlockIOINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupImageBlockIOINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupImageBlockIOINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupImageMediaBlockIOINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupImageMediaBlockIOINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.RoundToInfinityINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability RoundToInfinityINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FloatingPointModeINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FloatingPointModeINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.IntegerFunctions2INTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability IntegerFunctions2INTEL",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.FunctionPointersINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FunctionPointersINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.IndirectReferencesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability IndirectReferencesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.AsmINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AsmINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.AtomicFloat32MinMaxEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicFloat32MinMaxEXT",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.AtomicFloat64MinMaxEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicFloat64MinMaxEXT",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.AtomicFloat16MinMaxEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicFloat16MinMaxEXT",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.VectorComputeINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VectorComputeINTEL",
+ .dependencies = featureSet(&[_]Feature{
+ .VectorAnyINTEL,
+ }),
+ };
+ result[@intFromEnum(Feature.VectorAnyINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VectorAnyINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ExpectAssumeKHR)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ExpectAssumeKHR",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupAvcMotionEstimationINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupAvcMotionEstimationIntraINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationIntraINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.SubgroupAvcMotionEstimationChromaINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationChromaINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.VariableLengthArrayINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability VariableLengthArrayINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FunctionFloatControlINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FunctionFloatControlINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGAMemoryAttributesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGAMemoryAttributesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPFastMathModeINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPFastMathModeINTEL",
+ .dependencies = featureSet(&[_]Feature{
+ .Kernel,
+ }),
+ };
+ result[@intFromEnum(Feature.ArbitraryPrecisionIntegersINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability ArbitraryPrecisionIntegersINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.UnstructuredLoopControlsINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability UnstructuredLoopControlsINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGALoopControlsINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGALoopControlsINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.KernelAttributesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability KernelAttributesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGAKernelAttributesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGAKernelAttributesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGAMemoryAccessesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGAMemoryAccessesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGAClusterAttributesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGAClusterAttributesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.LoopFuseINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability LoopFuseINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGABufferLocationINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGABufferLocationINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.USMStorageClassesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability USMStorageClassesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.IOPipesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability IOPipesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.BlockingPipesINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability BlockingPipesINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.FPGARegINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability FPGARegINTEL",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.AtomicFloat32AddEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicFloat32AddEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.AtomicFloat64AddEXT)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability AtomicFloat64AddEXT",
+ .dependencies = featureSet(&[_]Feature{
+ .Shader,
+ }),
+ };
+ result[@intFromEnum(Feature.LongConstantCompositeINTEL)] = .{
+ .llvm_name = null,
+ .description = "Enable SPIR-V capability LongConstantCompositeINTEL",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+};
diff --git a/lib/std/Target/ve.zig b/lib/std/Target/ve.zig
new file mode 100644
index 0000000000..09ee056ef9
--- /dev/null
+++ b/lib/std/Target/ve.zig
@@ -0,0 +1,39 @@
+//! 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 {
+ vpu,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.vpu)] = .{
+ .llvm_name = "vpu",
+ .description = "Enable the VPU",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+};
diff --git a/lib/std/Target/wasm.zig b/lib/std/Target/wasm.zig
new file mode 100644
index 0000000000..a06d37cf7d
--- /dev/null
+++ b/lib/std/Target/wasm.zig
@@ -0,0 +1,126 @@
+//! 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 {
+ atomics,
+ bulk_memory,
+ exception_handling,
+ extended_const,
+ multivalue,
+ mutable_globals,
+ nontrapping_fptoint,
+ reference_types,
+ relaxed_simd,
+ sign_ext,
+ simd128,
+ tail_call,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.atomics)] = .{
+ .llvm_name = "atomics",
+ .description = "Enable Atomics",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.bulk_memory)] = .{
+ .llvm_name = "bulk-memory",
+ .description = "Enable bulk memory operations",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.exception_handling)] = .{
+ .llvm_name = "exception-handling",
+ .description = "Enable Wasm exception handling",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.extended_const)] = .{
+ .llvm_name = "extended-const",
+ .description = "Enable extended const expressions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.multivalue)] = .{
+ .llvm_name = "multivalue",
+ .description = "Enable multivalue blocks, instructions, and functions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mutable_globals)] = .{
+ .llvm_name = "mutable-globals",
+ .description = "Enable mutable globals",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nontrapping_fptoint)] = .{
+ .llvm_name = "nontrapping-fptoint",
+ .description = "Enable non-trapping float-to-int conversion operators",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.reference_types)] = .{
+ .llvm_name = "reference-types",
+ .description = "Enable reference types",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.relaxed_simd)] = .{
+ .llvm_name = "relaxed-simd",
+ .description = "Enable relaxed-simd instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sign_ext)] = .{
+ .llvm_name = "sign-ext",
+ .description = "Enable sign extension operators",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.simd128)] = .{
+ .llvm_name = "simd128",
+ .description = "Enable 128-bit SIMD",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tail_call)] = .{
+ .llvm_name = "tail-call",
+ .description = "Enable tail call instructions",
+ .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 bleeding_edge = CpuModel{
+ .name = "bleeding_edge",
+ .llvm_name = "bleeding-edge",
+ .features = featureSet(&[_]Feature{
+ .atomics,
+ .bulk_memory,
+ .mutable_globals,
+ .nontrapping_fptoint,
+ .sign_ext,
+ .simd128,
+ .tail_call,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .mutable_globals,
+ .sign_ext,
+ }),
+ };
+ pub const mvp = CpuModel{
+ .name = "mvp",
+ .llvm_name = "mvp",
+ .features = featureSet(&[_]Feature{}),
+ };
+};
diff --git a/lib/std/Target/x86.zig b/lib/std/Target/x86.zig
new file mode 100644
index 0000000000..43ec04f41c
--- /dev/null
+++ b/lib/std/Target/x86.zig
@@ -0,0 +1,4179 @@
+//! 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 {
+ @"16bit_mode",
+ @"32bit_mode",
+ @"3dnow",
+ @"3dnowa",
+ @"64bit",
+ adx,
+ aes,
+ allow_light_256_bit,
+ amx_bf16,
+ amx_complex,
+ amx_fp16,
+ amx_int8,
+ amx_tile,
+ avx,
+ avx2,
+ avx512bf16,
+ avx512bitalg,
+ avx512bw,
+ avx512cd,
+ avx512dq,
+ avx512er,
+ avx512f,
+ avx512fp16,
+ avx512ifma,
+ avx512pf,
+ avx512vbmi,
+ avx512vbmi2,
+ avx512vl,
+ avx512vnni,
+ avx512vp2intersect,
+ avx512vpopcntdq,
+ avxifma,
+ avxneconvert,
+ avxvnni,
+ avxvnniint16,
+ avxvnniint8,
+ bmi,
+ bmi2,
+ branchfusion,
+ cldemote,
+ clflushopt,
+ clwb,
+ clzero,
+ cmov,
+ cmpccxadd,
+ crc32,
+ cx16,
+ cx8,
+ enqcmd,
+ ermsb,
+ f16c,
+ false_deps_getmant,
+ false_deps_lzcnt_tzcnt,
+ false_deps_mulc,
+ false_deps_mullq,
+ false_deps_perm,
+ false_deps_popcnt,
+ false_deps_range,
+ fast_11bytenop,
+ fast_15bytenop,
+ fast_7bytenop,
+ fast_bextr,
+ fast_gather,
+ fast_hops,
+ fast_lzcnt,
+ fast_movbe,
+ fast_scalar_fsqrt,
+ fast_scalar_shift_masks,
+ fast_shld_rotate,
+ fast_variable_crosslane_shuffle,
+ fast_variable_perlane_shuffle,
+ fast_vector_fsqrt,
+ fast_vector_shift_masks,
+ faster_shift_than_shuffle,
+ fma,
+ fma4,
+ fsgsbase,
+ fsrm,
+ fxsr,
+ gfni,
+ harden_sls_ijmp,
+ harden_sls_ret,
+ hreset,
+ idivl_to_divb,
+ idivq_to_divl,
+ invpcid,
+ kl,
+ lea_sp,
+ lea_uses_ag,
+ lvi_cfi,
+ lvi_load_hardening,
+ lwp,
+ lzcnt,
+ macrofusion,
+ mmx,
+ movbe,
+ movdir64b,
+ movdiri,
+ mwaitx,
+ no_bypass_delay,
+ no_bypass_delay_blend,
+ no_bypass_delay_mov,
+ no_bypass_delay_shuffle,
+ nopl,
+ pad_short_functions,
+ pclmul,
+ pconfig,
+ pku,
+ popcnt,
+ prefer_128_bit,
+ prefer_256_bit,
+ prefer_mask_registers,
+ prefer_movmsk_over_vtest,
+ prefetchi,
+ prefetchwt1,
+ prfchw,
+ ptwrite,
+ raoint,
+ rdpid,
+ rdpru,
+ rdrnd,
+ rdseed,
+ retpoline,
+ retpoline_external_thunk,
+ retpoline_indirect_branches,
+ retpoline_indirect_calls,
+ rtm,
+ sahf,
+ sbb_dep_breaking,
+ serialize,
+ seses,
+ sgx,
+ sha,
+ sha512,
+ shstk,
+ slow_3ops_lea,
+ slow_incdec,
+ slow_lea,
+ slow_pmaddwd,
+ slow_pmulld,
+ slow_shld,
+ slow_two_mem_ops,
+ slow_unaligned_mem_16,
+ slow_unaligned_mem_32,
+ sm3,
+ sm4,
+ soft_float,
+ sse,
+ sse2,
+ sse3,
+ sse4_1,
+ sse4_2,
+ sse4a,
+ sse_unaligned_mem,
+ ssse3,
+ tagged_globals,
+ tbm,
+ tsxldtrk,
+ tuning_fast_imm_vector_shift,
+ uintr,
+ use_glm_div_sqrt_costs,
+ use_slm_arith_costs,
+ vaes,
+ vpclmulqdq,
+ vzeroupper,
+ waitpkg,
+ wbnoinvd,
+ widekl,
+ x87,
+ xop,
+ xsave,
+ xsavec,
+ xsaveopt,
+ xsaves,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.@"16bit_mode")] = .{
+ .llvm_name = "16bit-mode",
+ .description = "16-bit mode (i8086)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"32bit_mode")] = .{
+ .llvm_name = "32bit-mode",
+ .description = "32-bit mode (80386)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.@"3dnow")] = .{
+ .llvm_name = "3dnow",
+ .description = "Enable 3DNow! instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .mmx,
+ }),
+ };
+ result[@intFromEnum(Feature.@"3dnowa")] = .{
+ .llvm_name = "3dnowa",
+ .description = "Enable 3DNow! Athlon instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .@"3dnow",
+ }),
+ };
+ result[@intFromEnum(Feature.@"64bit")] = .{
+ .llvm_name = "64bit",
+ .description = "Support 64-bit instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.adx)] = .{
+ .llvm_name = "adx",
+ .description = "Support ADX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.aes)] = .{
+ .llvm_name = "aes",
+ .description = "Enable AES instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.allow_light_256_bit)] = .{
+ .llvm_name = "allow-light-256-bit",
+ .description = "Enable generation of 256-bit load/stores even if we prefer 128-bit",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.amx_bf16)] = .{
+ .llvm_name = "amx-bf16",
+ .description = "Support AMX-BF16 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .amx_tile,
+ }),
+ };
+ result[@intFromEnum(Feature.amx_complex)] = .{
+ .llvm_name = "amx-complex",
+ .description = "Support AMX-COMPLEX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .amx_tile,
+ }),
+ };
+ result[@intFromEnum(Feature.amx_fp16)] = .{
+ .llvm_name = "amx-fp16",
+ .description = "Support AMX amx-fp16 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .amx_tile,
+ }),
+ };
+ result[@intFromEnum(Feature.amx_int8)] = .{
+ .llvm_name = "amx-int8",
+ .description = "Support AMX-INT8 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .amx_tile,
+ }),
+ };
+ result[@intFromEnum(Feature.amx_tile)] = .{
+ .llvm_name = "amx-tile",
+ .description = "Support AMX-TILE instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.avx)] = .{
+ .llvm_name = "avx",
+ .description = "Enable AVX instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse4_2,
+ }),
+ };
+ result[@intFromEnum(Feature.avx2)] = .{
+ .llvm_name = "avx2",
+ .description = "Enable AVX2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512bf16)] = .{
+ .llvm_name = "avx512bf16",
+ .description = "Support bfloat16 floating point",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512bw,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512bitalg)] = .{
+ .llvm_name = "avx512bitalg",
+ .description = "Enable AVX-512 Bit Algorithms",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512bw,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512bw)] = .{
+ .llvm_name = "avx512bw",
+ .description = "Enable AVX-512 Byte and Word Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512cd)] = .{
+ .llvm_name = "avx512cd",
+ .description = "Enable AVX-512 Conflict Detection Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512dq)] = .{
+ .llvm_name = "avx512dq",
+ .description = "Enable AVX-512 Doubleword and Quadword Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512er)] = .{
+ .llvm_name = "avx512er",
+ .description = "Enable AVX-512 Exponential and Reciprocal Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512f)] = .{
+ .llvm_name = "avx512f",
+ .description = "Enable AVX-512 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ .f16c,
+ .fma,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512fp16)] = .{
+ .llvm_name = "avx512fp16",
+ .description = "Support 16-bit floating point",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512bw,
+ .avx512dq,
+ .avx512vl,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512ifma)] = .{
+ .llvm_name = "avx512ifma",
+ .description = "Enable AVX-512 Integer Fused Multiple-Add",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512pf)] = .{
+ .llvm_name = "avx512pf",
+ .description = "Enable AVX-512 PreFetch Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vbmi)] = .{
+ .llvm_name = "avx512vbmi",
+ .description = "Enable AVX-512 Vector Byte Manipulation Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512bw,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vbmi2)] = .{
+ .llvm_name = "avx512vbmi2",
+ .description = "Enable AVX-512 further Vector Byte Manipulation Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512bw,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vl)] = .{
+ .llvm_name = "avx512vl",
+ .description = "Enable AVX-512 Vector Length eXtensions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vnni)] = .{
+ .llvm_name = "avx512vnni",
+ .description = "Enable AVX-512 Vector Neural Network Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vp2intersect)] = .{
+ .llvm_name = "avx512vp2intersect",
+ .description = "Enable AVX-512 vp2intersect",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avx512vpopcntdq)] = .{
+ .llvm_name = "avx512vpopcntdq",
+ .description = "Enable AVX-512 Population Count Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx512f,
+ }),
+ };
+ result[@intFromEnum(Feature.avxifma)] = .{
+ .llvm_name = "avxifma",
+ .description = "Enable AVX-IFMA",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ }),
+ };
+ result[@intFromEnum(Feature.avxneconvert)] = .{
+ .llvm_name = "avxneconvert",
+ .description = "Support AVX-NE-CONVERT instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ }),
+ };
+ result[@intFromEnum(Feature.avxvnni)] = .{
+ .llvm_name = "avxvnni",
+ .description = "Support AVX_VNNI encoding",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ }),
+ };
+ result[@intFromEnum(Feature.avxvnniint16)] = .{
+ .llvm_name = "avxvnniint16",
+ .description = "Enable AVX-VNNI-INT16",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ }),
+ };
+ result[@intFromEnum(Feature.avxvnniint8)] = .{
+ .llvm_name = "avxvnniint8",
+ .description = "Enable AVX-VNNI-INT8",
+ .dependencies = featureSet(&[_]Feature{
+ .avx2,
+ }),
+ };
+ result[@intFromEnum(Feature.bmi)] = .{
+ .llvm_name = "bmi",
+ .description = "Support BMI instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.bmi2)] = .{
+ .llvm_name = "bmi2",
+ .description = "Support BMI2 instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.branchfusion)] = .{
+ .llvm_name = "branchfusion",
+ .description = "CMP/TEST can be fused with conditional branches",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cldemote)] = .{
+ .llvm_name = "cldemote",
+ .description = "Enable Cache Line Demote",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.clflushopt)] = .{
+ .llvm_name = "clflushopt",
+ .description = "Flush A Cache Line Optimized",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.clwb)] = .{
+ .llvm_name = "clwb",
+ .description = "Cache Line Write Back",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.clzero)] = .{
+ .llvm_name = "clzero",
+ .description = "Enable Cache Line Zero",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cmov)] = .{
+ .llvm_name = "cmov",
+ .description = "Enable conditional move instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cmpccxadd)] = .{
+ .llvm_name = "cmpccxadd",
+ .description = "Support CMPCCXADD instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.crc32)] = .{
+ .llvm_name = "crc32",
+ .description = "Enable SSE 4.2 CRC32 instruction (used when SSE4.2 is supported but function is GPR only)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.cx16)] = .{
+ .llvm_name = "cx16",
+ .description = "64-bit with cmpxchg16b (this is true for most x86-64 chips, but not the first AMD chips)",
+ .dependencies = featureSet(&[_]Feature{
+ .cx8,
+ }),
+ };
+ result[@intFromEnum(Feature.cx8)] = .{
+ .llvm_name = "cx8",
+ .description = "Support CMPXCHG8B instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.enqcmd)] = .{
+ .llvm_name = "enqcmd",
+ .description = "Has ENQCMD instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ermsb)] = .{
+ .llvm_name = "ermsb",
+ .description = "REP MOVS/STOS are fast",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.f16c)] = .{
+ .llvm_name = "f16c",
+ .description = "Support 16-bit floating point conversion instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.false_deps_getmant)] = .{
+ .llvm_name = "false-deps-getmant",
+ .description = "VGETMANTSS/SD/SH and VGETMANDPS/PD(memory version) has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_lzcnt_tzcnt)] = .{
+ .llvm_name = "false-deps-lzcnt-tzcnt",
+ .description = "LZCNT/TZCNT have a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_mulc)] = .{
+ .llvm_name = "false-deps-mulc",
+ .description = "VF[C]MULCPH/SH has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_mullq)] = .{
+ .llvm_name = "false-deps-mullq",
+ .description = "VPMULLQ has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_perm)] = .{
+ .llvm_name = "false-deps-perm",
+ .description = "VPERMD/Q/PS/PD has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_popcnt)] = .{
+ .llvm_name = "false-deps-popcnt",
+ .description = "POPCNT has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.false_deps_range)] = .{
+ .llvm_name = "false-deps-range",
+ .description = "VRANGEPD/PS/SD/SS has a false dependency on dest register",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_11bytenop)] = .{
+ .llvm_name = "fast-11bytenop",
+ .description = "Target can quickly decode up to 11 byte NOPs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_15bytenop)] = .{
+ .llvm_name = "fast-15bytenop",
+ .description = "Target can quickly decode up to 15 byte NOPs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_7bytenop)] = .{
+ .llvm_name = "fast-7bytenop",
+ .description = "Target can quickly decode up to 7 byte NOPs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_bextr)] = .{
+ .llvm_name = "fast-bextr",
+ .description = "Indicates that the BEXTR instruction is implemented as a single uop with good throughput",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_gather)] = .{
+ .llvm_name = "fast-gather",
+ .description = "Indicates if gather is reasonably fast (this is true for Skylake client and all AVX-512 CPUs)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_hops)] = .{
+ .llvm_name = "fast-hops",
+ .description = "Prefer horizontal vector math instructions (haddp, phsub, etc.) over normal vector instructions with shuffles",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_lzcnt)] = .{
+ .llvm_name = "fast-lzcnt",
+ .description = "LZCNT instructions are as fast as most simple integer ops",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_movbe)] = .{
+ .llvm_name = "fast-movbe",
+ .description = "Prefer a movbe over a single-use load + bswap / single-use bswap + store",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_scalar_fsqrt)] = .{
+ .llvm_name = "fast-scalar-fsqrt",
+ .description = "Scalar SQRT is fast (disable Newton-Raphson)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_scalar_shift_masks)] = .{
+ .llvm_name = "fast-scalar-shift-masks",
+ .description = "Prefer a left/right scalar logical shift pair over a shift+and pair",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_shld_rotate)] = .{
+ .llvm_name = "fast-shld-rotate",
+ .description = "SHLD can be used as a faster rotate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_variable_crosslane_shuffle)] = .{
+ .llvm_name = "fast-variable-crosslane-shuffle",
+ .description = "Cross-lane shuffles with variable masks are fast",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_variable_perlane_shuffle)] = .{
+ .llvm_name = "fast-variable-perlane-shuffle",
+ .description = "Per-lane shuffles with variable masks are fast",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_vector_fsqrt)] = .{
+ .llvm_name = "fast-vector-fsqrt",
+ .description = "Vector SQRT is fast (disable Newton-Raphson)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fast_vector_shift_masks)] = .{
+ .llvm_name = "fast-vector-shift-masks",
+ .description = "Prefer a left/right vector logical shift pair over a shift+and pair",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.faster_shift_than_shuffle)] = .{
+ .llvm_name = "faster-shift-than-shuffle",
+ .description = "Shifts are faster (or as fast) as shuffle",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fma)] = .{
+ .llvm_name = "fma",
+ .description = "Enable three-operand fused multiple-add",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.fma4)] = .{
+ .llvm_name = "fma4",
+ .description = "Enable four-operand fused multiple-add",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ .sse4a,
+ }),
+ };
+ result[@intFromEnum(Feature.fsgsbase)] = .{
+ .llvm_name = "fsgsbase",
+ .description = "Support FS/GS Base instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fsrm)] = .{
+ .llvm_name = "fsrm",
+ .description = "REP MOVSB of short lengths is faster",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.fxsr)] = .{
+ .llvm_name = "fxsr",
+ .description = "Support fxsave/fxrestore instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.gfni)] = .{
+ .llvm_name = "gfni",
+ .description = "Enable Galois Field Arithmetic Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.harden_sls_ijmp)] = .{
+ .llvm_name = "harden-sls-ijmp",
+ .description = "Harden against straight line speculation across indirect JMP instructions.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.harden_sls_ret)] = .{
+ .llvm_name = "harden-sls-ret",
+ .description = "Harden against straight line speculation across RET instructions.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.hreset)] = .{
+ .llvm_name = "hreset",
+ .description = "Has hreset instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.idivl_to_divb)] = .{
+ .llvm_name = "idivl-to-divb",
+ .description = "Use 8-bit divide for positive values less than 256",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.idivq_to_divl)] = .{
+ .llvm_name = "idivq-to-divl",
+ .description = "Use 32-bit divide for positive values less than 2^32",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.invpcid)] = .{
+ .llvm_name = "invpcid",
+ .description = "Invalidate Process-Context Identifier",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.kl)] = .{
+ .llvm_name = "kl",
+ .description = "Support Key Locker kl Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.lea_sp)] = .{
+ .llvm_name = "lea-sp",
+ .description = "Use LEA for adjusting the stack pointer (this is an optimization for Intel Atom processors)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lea_uses_ag)] = .{
+ .llvm_name = "lea-uses-ag",
+ .description = "LEA instruction needs inputs at AG stage",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lvi_cfi)] = .{
+ .llvm_name = "lvi-cfi",
+ .description = "Prevent indirect calls/branches from using a memory operand, and precede all indirect calls/branches from a register with an LFENCE instruction to serialize control flow. Also decompose RET instructions into a POP+LFENCE+JMP sequence.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lvi_load_hardening)] = .{
+ .llvm_name = "lvi-load-hardening",
+ .description = "Insert LFENCE instructions to prevent data speculatively injected into loads from being used maliciously.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lwp)] = .{
+ .llvm_name = "lwp",
+ .description = "Enable LWP instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.lzcnt)] = .{
+ .llvm_name = "lzcnt",
+ .description = "Support LZCNT instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.macrofusion)] = .{
+ .llvm_name = "macrofusion",
+ .description = "Various instructions can be fused with conditional branches",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mmx)] = .{
+ .llvm_name = "mmx",
+ .description = "Enable MMX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.movbe)] = .{
+ .llvm_name = "movbe",
+ .description = "Support MOVBE instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.movdir64b)] = .{
+ .llvm_name = "movdir64b",
+ .description = "Support movdir64b instruction (direct store 64 bytes)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.movdiri)] = .{
+ .llvm_name = "movdiri",
+ .description = "Support movdiri instruction (direct store integer)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.mwaitx)] = .{
+ .llvm_name = "mwaitx",
+ .description = "Enable MONITORX/MWAITX timer functionality",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bypass_delay)] = .{
+ .llvm_name = "no-bypass-delay",
+ .description = "Has no bypass delay when using the 'wrong' domain",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bypass_delay_blend)] = .{
+ .llvm_name = "no-bypass-delay-blend",
+ .description = "Has no bypass delay when using the 'wrong' blend type",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bypass_delay_mov)] = .{
+ .llvm_name = "no-bypass-delay-mov",
+ .description = "Has no bypass delay when using the 'wrong' mov type",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.no_bypass_delay_shuffle)] = .{
+ .llvm_name = "no-bypass-delay-shuffle",
+ .description = "Has no bypass delay when using the 'wrong' shuffle type",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.nopl)] = .{
+ .llvm_name = "nopl",
+ .description = "Enable NOPL instruction (generally pentium pro+)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pad_short_functions)] = .{
+ .llvm_name = "pad-short-functions",
+ .description = "Pad short functions (to prevent a stall when returning too early)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pclmul)] = .{
+ .llvm_name = "pclmul",
+ .description = "Enable packed carry-less multiplication instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.pconfig)] = .{
+ .llvm_name = "pconfig",
+ .description = "platform configuration instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.pku)] = .{
+ .llvm_name = "pku",
+ .description = "Enable protection keys",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.popcnt)] = .{
+ .llvm_name = "popcnt",
+ .description = "Support POPCNT instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_128_bit)] = .{
+ .llvm_name = "prefer-128-bit",
+ .description = "Prefer 128-bit AVX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_256_bit)] = .{
+ .llvm_name = "prefer-256-bit",
+ .description = "Prefer 256-bit AVX instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_mask_registers)] = .{
+ .llvm_name = "prefer-mask-registers",
+ .description = "Prefer AVX512 mask registers over PTEST/MOVMSK",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefer_movmsk_over_vtest)] = .{
+ .llvm_name = "prefer-movmsk-over-vtest",
+ .description = "Prefer movmsk over vtest instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefetchi)] = .{
+ .llvm_name = "prefetchi",
+ .description = "Prefetch instruction with T0 or T1 Hint",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prefetchwt1)] = .{
+ .llvm_name = "prefetchwt1",
+ .description = "Prefetch with Intent to Write and T1 Hint",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.prfchw)] = .{
+ .llvm_name = "prfchw",
+ .description = "Support PRFCHW instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ptwrite)] = .{
+ .llvm_name = "ptwrite",
+ .description = "Support ptwrite instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.raoint)] = .{
+ .llvm_name = "raoint",
+ .description = "Support RAO-INT instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rdpid)] = .{
+ .llvm_name = "rdpid",
+ .description = "Support RDPID instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rdpru)] = .{
+ .llvm_name = "rdpru",
+ .description = "Support RDPRU instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rdrnd)] = .{
+ .llvm_name = "rdrnd",
+ .description = "Support RDRAND instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rdseed)] = .{
+ .llvm_name = "rdseed",
+ .description = "Support RDSEED instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.retpoline)] = .{
+ .llvm_name = "retpoline",
+ .description = "Remove speculation of indirect branches from the generated code, either by avoiding them entirely or lowering them with a speculation blocking construct",
+ .dependencies = featureSet(&[_]Feature{
+ .retpoline_indirect_branches,
+ .retpoline_indirect_calls,
+ }),
+ };
+ result[@intFromEnum(Feature.retpoline_external_thunk)] = .{
+ .llvm_name = "retpoline-external-thunk",
+ .description = "When lowering an indirect call or branch using a `retpoline`, rely on the specified user provided thunk rather than emitting one ourselves. Only has effect when combined with some other retpoline feature",
+ .dependencies = featureSet(&[_]Feature{
+ .retpoline_indirect_calls,
+ }),
+ };
+ result[@intFromEnum(Feature.retpoline_indirect_branches)] = .{
+ .llvm_name = "retpoline-indirect-branches",
+ .description = "Remove speculation of indirect branches from the generated code",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.retpoline_indirect_calls)] = .{
+ .llvm_name = "retpoline-indirect-calls",
+ .description = "Remove speculation of indirect calls from the generated code",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.rtm)] = .{
+ .llvm_name = "rtm",
+ .description = "Support RTM instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sahf)] = .{
+ .llvm_name = "sahf",
+ .description = "Support LAHF and SAHF instructions in 64-bit mode",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sbb_dep_breaking)] = .{
+ .llvm_name = "sbb-dep-breaking",
+ .description = "SBB with same register has no source dependency",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.serialize)] = .{
+ .llvm_name = "serialize",
+ .description = "Has serialize instruction",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.seses)] = .{
+ .llvm_name = "seses",
+ .description = "Prevent speculative execution side channel timing attacks by inserting a speculation barrier before memory reads, memory writes, and conditional branches. Implies LVI Control Flow integrity.",
+ .dependencies = featureSet(&[_]Feature{
+ .lvi_cfi,
+ }),
+ };
+ result[@intFromEnum(Feature.sgx)] = .{
+ .llvm_name = "sgx",
+ .description = "Enable Software Guard Extensions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sha)] = .{
+ .llvm_name = "sha",
+ .description = "Enable SHA instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.sha512)] = .{
+ .llvm_name = "sha512",
+ .description = "Support SHA512 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.shstk)] = .{
+ .llvm_name = "shstk",
+ .description = "Support CET Shadow-Stack instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_3ops_lea)] = .{
+ .llvm_name = "slow-3ops-lea",
+ .description = "LEA instruction with 3 ops or certain registers is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_incdec)] = .{
+ .llvm_name = "slow-incdec",
+ .description = "INC and DEC instructions are slower than ADD and SUB",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_lea)] = .{
+ .llvm_name = "slow-lea",
+ .description = "LEA instruction with certain arguments is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_pmaddwd)] = .{
+ .llvm_name = "slow-pmaddwd",
+ .description = "PMADDWD is slower than PMULLD",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_pmulld)] = .{
+ .llvm_name = "slow-pmulld",
+ .description = "PMULLD instruction is slow (compared to PMULLW/PMULHW and PMULUDQ)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_shld)] = .{
+ .llvm_name = "slow-shld",
+ .description = "SHLD instruction is slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_two_mem_ops)] = .{
+ .llvm_name = "slow-two-mem-ops",
+ .description = "Two memory operand instructions are slow",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_unaligned_mem_16)] = .{
+ .llvm_name = "slow-unaligned-mem-16",
+ .description = "Slow unaligned 16-byte memory access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.slow_unaligned_mem_32)] = .{
+ .llvm_name = "slow-unaligned-mem-32",
+ .description = "Slow unaligned 32-byte memory access",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sm3)] = .{
+ .llvm_name = "sm3",
+ .description = "Support SM3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.sm4)] = .{
+ .llvm_name = "sm4",
+ .description = "Support SM4 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.soft_float)] = .{
+ .llvm_name = "soft-float",
+ .description = "Use software floating point features",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sse)] = .{
+ .llvm_name = "sse",
+ .description = "Enable SSE instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.sse2)] = .{
+ .llvm_name = "sse2",
+ .description = "Enable SSE2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse,
+ }),
+ };
+ result[@intFromEnum(Feature.sse3)] = .{
+ .llvm_name = "sse3",
+ .description = "Enable SSE3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse2,
+ }),
+ };
+ result[@intFromEnum(Feature.sse4_1)] = .{
+ .llvm_name = "sse4.1",
+ .description = "Enable SSE 4.1 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .ssse3,
+ }),
+ };
+ result[@intFromEnum(Feature.sse4_2)] = .{
+ .llvm_name = "sse4.2",
+ .description = "Enable SSE 4.2 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse4_1,
+ }),
+ };
+ result[@intFromEnum(Feature.sse4a)] = .{
+ .llvm_name = "sse4a",
+ .description = "Support SSE 4a instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse3,
+ }),
+ };
+ result[@intFromEnum(Feature.sse_unaligned_mem)] = .{
+ .llvm_name = "sse-unaligned-mem",
+ .description = "Allow unaligned memory operands with SSE instructions (this may require setting a configuration bit in the processor)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.ssse3)] = .{
+ .llvm_name = "ssse3",
+ .description = "Enable SSSE3 instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .sse3,
+ }),
+ };
+ result[@intFromEnum(Feature.tagged_globals)] = .{
+ .llvm_name = "tagged-globals",
+ .description = "Use an instruction sequence for taking the address of a global that allows a memory tag in the upper address bits.",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tbm)] = .{
+ .llvm_name = "tbm",
+ .description = "Enable TBM instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tsxldtrk)] = .{
+ .llvm_name = "tsxldtrk",
+ .description = "Support TSXLDTRK instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.tuning_fast_imm_vector_shift)] = .{
+ .llvm_name = "tuning-fast-imm-vector-shift",
+ .description = "Vector shifts are fast (2/cycle) as opposed to slow (1/cycle)",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.uintr)] = .{
+ .llvm_name = "uintr",
+ .description = "Has UINTR Instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_glm_div_sqrt_costs)] = .{
+ .llvm_name = "use-glm-div-sqrt-costs",
+ .description = "Use Goldmont specific floating point div/sqrt costs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.use_slm_arith_costs)] = .{
+ .llvm_name = "use-slm-arith-costs",
+ .description = "Use Silvermont specific arithmetic costs",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.vaes)] = .{
+ .llvm_name = "vaes",
+ .description = "Promote selected AES instructions to AVX512/AVX registers",
+ .dependencies = featureSet(&[_]Feature{
+ .aes,
+ .avx,
+ }),
+ };
+ result[@intFromEnum(Feature.vpclmulqdq)] = .{
+ .llvm_name = "vpclmulqdq",
+ .description = "Enable vpclmulqdq instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .avx,
+ .pclmul,
+ }),
+ };
+ result[@intFromEnum(Feature.vzeroupper)] = .{
+ .llvm_name = "vzeroupper",
+ .description = "Should insert vzeroupper instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.waitpkg)] = .{
+ .llvm_name = "waitpkg",
+ .description = "Wait and pause enhancements",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.wbnoinvd)] = .{
+ .llvm_name = "wbnoinvd",
+ .description = "Write Back No Invalidate",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.widekl)] = .{
+ .llvm_name = "widekl",
+ .description = "Support Key Locker wide Instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .kl,
+ }),
+ };
+ result[@intFromEnum(Feature.x87)] = .{
+ .llvm_name = "x87",
+ .description = "Enable X87 float instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xop)] = .{
+ .llvm_name = "xop",
+ .description = "Enable XOP instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .fma4,
+ }),
+ };
+ result[@intFromEnum(Feature.xsave)] = .{
+ .llvm_name = "xsave",
+ .description = "Support xsave instructions",
+ .dependencies = featureSet(&[_]Feature{}),
+ };
+ result[@intFromEnum(Feature.xsavec)] = .{
+ .llvm_name = "xsavec",
+ .description = "Support xsavec instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .xsave,
+ }),
+ };
+ result[@intFromEnum(Feature.xsaveopt)] = .{
+ .llvm_name = "xsaveopt",
+ .description = "Support xsaveopt instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .xsave,
+ }),
+ };
+ result[@intFromEnum(Feature.xsaves)] = .{
+ .llvm_name = "xsaves",
+ .description = "Support xsaves instructions",
+ .dependencies = featureSet(&[_]Feature{
+ .xsave,
+ }),
+ };
+ 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 alderlake = CpuModel{
+ .name = "alderlake",
+ .llvm_name = "alderlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .false_deps_perm,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .hreset,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_movmsk_over_vtest,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .widekl,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const amdfam10 = CpuModel{
+ .name = "amdfam10",
+ .llvm_name = "amdfam10",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .lzcnt,
+ .nopl,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .sse4a,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon = CpuModel{
+ .name = "athlon",
+ .llvm_name = "athlon",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon64 = CpuModel{
+ .name = "athlon64",
+ .llvm_name = "athlon64",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx8,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon64_sse3 = CpuModel{
+ .name = "athlon64_sse3",
+ .llvm_name = "athlon64-sse3",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon_4 = CpuModel{
+ .name = "athlon_4",
+ .llvm_name = "athlon-4",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon_fx = CpuModel{
+ .name = "athlon_fx",
+ .llvm_name = "athlon-fx",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx8,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon_mp = CpuModel{
+ .name = "athlon_mp",
+ .llvm_name = "athlon-mp",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon_tbird = CpuModel{
+ .name = "athlon_tbird",
+ .llvm_name = "athlon-tbird",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const athlon_xp = CpuModel{
+ .name = "athlon_xp",
+ .llvm_name = "athlon-xp",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cmov,
+ .cx8,
+ .fxsr,
+ .nopl,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const atom = CpuModel{
+ .name = "atom",
+ .llvm_name = "atom",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fxsr,
+ .idivl_to_divb,
+ .idivq_to_divl,
+ .lea_sp,
+ .lea_uses_ag,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pad_short_functions,
+ .sahf,
+ .slow_two_mem_ops,
+ .slow_unaligned_mem_16,
+ .ssse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const atom_sse4_2_movbe = CpuModel{
+ .name = "atom_sse4_2_movbe",
+ .llvm_name = "atom_sse4_2_movbe",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_7bytenop,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .slow_incdec,
+ .slow_lea,
+ .slow_pmulld,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_slm_arith_costs,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const barcelona = CpuModel{
+ .name = "barcelona",
+ .llvm_name = "barcelona",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .lzcnt,
+ .nopl,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .sse4a,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const bdver1 = CpuModel{
+ .name = "bdver1",
+ .llvm_name = "bdver1",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .branchfusion,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_11bytenop,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .vzeroupper,
+ .x87,
+ .xop,
+ .xsave,
+ }),
+ };
+ pub const bdver2 = CpuModel{
+ .name = "bdver2",
+ .llvm_name = "bdver2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .bmi,
+ .branchfusion,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_11bytenop,
+ .fast_bextr,
+ .fast_movbe,
+ .fast_scalar_shift_masks,
+ .fma,
+ .fxsr,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .tbm,
+ .vzeroupper,
+ .x87,
+ .xop,
+ .xsave,
+ }),
+ };
+ pub const bdver3 = CpuModel{
+ .name = "bdver3",
+ .llvm_name = "bdver3",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .bmi,
+ .branchfusion,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_11bytenop,
+ .fast_bextr,
+ .fast_movbe,
+ .fast_scalar_shift_masks,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .tbm,
+ .vzeroupper,
+ .x87,
+ .xop,
+ .xsaveopt,
+ }),
+ };
+ pub const bdver4 = CpuModel{
+ .name = "bdver4",
+ .llvm_name = "bdver4",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_11bytenop,
+ .fast_bextr,
+ .fast_movbe,
+ .fast_scalar_shift_masks,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .lwp,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .tbm,
+ .vzeroupper,
+ .x87,
+ .xop,
+ .xsaveopt,
+ }),
+ };
+ pub const bonnell = CpuModel{
+ .name = "bonnell",
+ .llvm_name = "bonnell",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fxsr,
+ .idivl_to_divb,
+ .idivq_to_divl,
+ .lea_sp,
+ .lea_uses_ag,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pad_short_functions,
+ .sahf,
+ .slow_two_mem_ops,
+ .slow_unaligned_mem_16,
+ .ssse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const broadwell = CpuModel{
+ .name = "broadwell",
+ .llvm_name = "broadwell",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .false_deps_lzcnt_tzcnt,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const btver1 = CpuModel{
+ .name = "btver1",
+ .llvm_name = "btver1",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_15bytenop,
+ .fast_scalar_shift_masks,
+ .fast_vector_shift_masks,
+ .fxsr,
+ .lzcnt,
+ .mmx,
+ .nopl,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .sse4a,
+ .ssse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const btver2 = CpuModel{
+ .name = "btver2",
+ .llvm_name = "btver2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .bmi,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_15bytenop,
+ .fast_bextr,
+ .fast_hops,
+ .fast_lzcnt,
+ .fast_movbe,
+ .fast_scalar_shift_masks,
+ .fast_vector_shift_masks,
+ .fxsr,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .sahf,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .sse4a,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const c3 = CpuModel{
+ .name = "c3",
+ .llvm_name = "c3",
+ .features = featureSet(&[_]Feature{
+ .@"3dnow",
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const c3_2 = CpuModel{
+ .name = "c3_2",
+ .llvm_name = "c3-2",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const cannonlake = CpuModel{
+ .name = "cannonlake",
+ .llvm_name = "cannonlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vl,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const cascadelake = CpuModel{
+ .name = "cascadelake",
+ .llvm_name = "cascadelake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx512bw,
+ .avx512cd,
+ .avx512dq,
+ .avx512vl,
+ .avx512vnni,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .faster_shift_than_shuffle,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const cooperlake = CpuModel{
+ .name = "cooperlake",
+ .llvm_name = "cooperlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx512bf16,
+ .avx512cd,
+ .avx512dq,
+ .avx512vl,
+ .avx512vnni,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .faster_shift_than_shuffle,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const core2 = CpuModel{
+ .name = "core2",
+ .llvm_name = "core2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fxsr,
+ .macrofusion,
+ .mmx,
+ .nopl,
+ .sahf,
+ .slow_unaligned_mem_16,
+ .ssse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const corei7 = CpuModel{
+ .name = "corei7",
+ .llvm_name = "corei7",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .fxsr,
+ .macrofusion,
+ .mmx,
+ .no_bypass_delay_mov,
+ .nopl,
+ .popcnt,
+ .sahf,
+ .sse4_2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const emeraldrapids = CpuModel{
+ .name = "emeraldrapids",
+ .llvm_name = "emeraldrapids",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .amx_bf16,
+ .amx_int8,
+ .avx512bf16,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512fp16,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .ermsb,
+ .false_deps_getmant,
+ .false_deps_mulc,
+ .false_deps_mullq,
+ .false_deps_perm,
+ .false_deps_range,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .tsxldtrk,
+ .tuning_fast_imm_vector_shift,
+ .uintr,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cx8,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .idivq_to_divl,
+ .macrofusion,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const geode = CpuModel{
+ .name = "geode",
+ .llvm_name = "geode",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const goldmont = CpuModel{
+ .name = "goldmont",
+ .llvm_name = "goldmont",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .slow_incdec,
+ .slow_lea,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_glm_div_sqrt_costs,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const goldmont_plus = CpuModel{
+ .name = "goldmont_plus",
+ .llvm_name = "goldmont-plus",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .slow_incdec,
+ .slow_lea,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_glm_div_sqrt_costs,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const grandridge = CpuModel{
+ .name = "grandridge",
+ .llvm_name = "grandridge",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .avxifma,
+ .avxneconvert,
+ .avxvnni,
+ .avxvnniint8,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cmpccxadd,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .f16c,
+ .fast_movbe,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .hreset,
+ .invpcid,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .raoint,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .slow_incdec,
+ .slow_lea,
+ .slow_two_mem_ops,
+ .uintr,
+ .use_glm_div_sqrt_costs,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .widekl,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const graniterapids = CpuModel{
+ .name = "graniterapids",
+ .llvm_name = "graniterapids",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .amx_bf16,
+ .amx_fp16,
+ .amx_int8,
+ .avx512bf16,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512fp16,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .ermsb,
+ .false_deps_getmant,
+ .false_deps_mulc,
+ .false_deps_mullq,
+ .false_deps_perm,
+ .false_deps_range,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prefetchi,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .tsxldtrk,
+ .tuning_fast_imm_vector_shift,
+ .uintr,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const graniterapids_d = CpuModel{
+ .name = "graniterapids_d",
+ .llvm_name = "graniterapids-d",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .amx_bf16,
+ .amx_complex,
+ .amx_fp16,
+ .amx_int8,
+ .avx512bf16,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512fp16,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .ermsb,
+ .false_deps_getmant,
+ .false_deps_mulc,
+ .false_deps_mullq,
+ .false_deps_perm,
+ .false_deps_range,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prefetchi,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .tsxldtrk,
+ .tuning_fast_imm_vector_shift,
+ .uintr,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const haswell = CpuModel{
+ .name = "haswell",
+ .llvm_name = "haswell",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .false_deps_lzcnt_tzcnt,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .rdrnd,
+ .sahf,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const @"i386" = CpuModel{
+ .name = "i386",
+ .llvm_name = "i386",
+ .features = featureSet(&[_]Feature{
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const @"i486" = CpuModel{
+ .name = "i486",
+ .llvm_name = "i486",
+ .features = featureSet(&[_]Feature{
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const @"i586" = CpuModel{
+ .name = "i586",
+ .llvm_name = "i586",
+ .features = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const @"i686" = CpuModel{
+ .name = "i686",
+ .llvm_name = "i686",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const icelake_client = CpuModel{
+ .name = "icelake_client",
+ .llvm_name = "icelake-client",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const icelake_server = CpuModel{
+ .name = "icelake_server",
+ .llvm_name = "icelake-server",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const ivybridge = CpuModel{
+ .name = "ivybridge",
+ .llvm_name = "ivybridge",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .macrofusion,
+ .mmx,
+ .no_bypass_delay_mov,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .rdrnd,
+ .sahf,
+ .slow_3ops_lea,
+ .slow_unaligned_mem_32,
+ .vzeroupper,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const k6 = CpuModel{
+ .name = "k6",
+ .llvm_name = "k6",
+ .features = featureSet(&[_]Feature{
+ .cx8,
+ .mmx,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const k6_2 = CpuModel{
+ .name = "k6_2",
+ .llvm_name = "k6-2",
+ .features = featureSet(&[_]Feature{
+ .@"3dnow",
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const k6_3 = CpuModel{
+ .name = "k6_3",
+ .llvm_name = "k6-3",
+ .features = featureSet(&[_]Feature{
+ .@"3dnow",
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const k8 = CpuModel{
+ .name = "k8",
+ .llvm_name = "k8",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx8,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const k8_sse3 = CpuModel{
+ .name = "k8_sse3",
+ .llvm_name = "k8-sse3",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const knl = CpuModel{
+ .name = "knl",
+ .llvm_name = "knl",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .avx512cd,
+ .avx512er,
+ .avx512pf,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_gather,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prefer_mask_registers,
+ .prefetchwt1,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .slow_incdec,
+ .slow_pmaddwd,
+ .slow_two_mem_ops,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const knm = CpuModel{
+ .name = "knm",
+ .llvm_name = "knm",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .avx512cd,
+ .avx512er,
+ .avx512pf,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_gather,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prefer_mask_registers,
+ .prefetchwt1,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .slow_incdec,
+ .slow_pmaddwd,
+ .slow_two_mem_ops,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const lakemont = CpuModel{
+ .name = "lakemont",
+ .llvm_name = "lakemont",
+ .features = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .soft_float,
+ .vzeroupper,
+ }),
+ };
+ pub const meteorlake = CpuModel{
+ .name = "meteorlake",
+ .llvm_name = "meteorlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .false_deps_perm,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .hreset,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_movmsk_over_vtest,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .widekl,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const nehalem = CpuModel{
+ .name = "nehalem",
+ .llvm_name = "nehalem",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .fxsr,
+ .macrofusion,
+ .mmx,
+ .no_bypass_delay_mov,
+ .nopl,
+ .popcnt,
+ .sahf,
+ .sse4_2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const nocona = CpuModel{
+ .name = "nocona",
+ .llvm_name = "nocona",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const opteron = CpuModel{
+ .name = "opteron",
+ .llvm_name = "opteron",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx8,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const opteron_sse3 = CpuModel{
+ .name = "opteron_sse3",
+ .llvm_name = "opteron-sse3",
+ .features = featureSet(&[_]Feature{
+ .@"3dnowa",
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fast_scalar_shift_masks,
+ .fxsr,
+ .nopl,
+ .sbb_dep_breaking,
+ .slow_shld,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const penryn = CpuModel{
+ .name = "penryn",
+ .llvm_name = "penryn",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx16,
+ .fxsr,
+ .macrofusion,
+ .mmx,
+ .nopl,
+ .sahf,
+ .slow_unaligned_mem_16,
+ .sse4_1,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium = CpuModel{
+ .name = "pentium",
+ .llvm_name = "pentium",
+ .features = featureSet(&[_]Feature{
+ .cx8,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium2 = CpuModel{
+ .name = "pentium2",
+ .llvm_name = "pentium2",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium3 = CpuModel{
+ .name = "pentium3",
+ .llvm_name = "pentium3",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium3m = CpuModel{
+ .name = "pentium3m",
+ .llvm_name = "pentium3m",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium4 = CpuModel{
+ .name = "pentium4",
+ .llvm_name = "pentium4",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium_m = CpuModel{
+ .name = "pentium_m",
+ .llvm_name = "pentium-m",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentium_mmx = CpuModel{
+ .name = "pentium_mmx",
+ .llvm_name = "pentium-mmx",
+ .features = featureSet(&[_]Feature{
+ .cx8,
+ .mmx,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const pentiumpro = CpuModel{
+ .name = "pentiumpro",
+ .llvm_name = "pentiumpro",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const prescott = CpuModel{
+ .name = "prescott",
+ .llvm_name = "prescott",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const raptorlake = CpuModel{
+ .name = "raptorlake",
+ .llvm_name = "raptorlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .false_deps_perm,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .hreset,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_movmsk_over_vtest,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .widekl,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const rocketlake = CpuModel{
+ .name = "rocketlake",
+ .llvm_name = "rocketlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const sandybridge = CpuModel{
+ .name = "sandybridge",
+ .llvm_name = "sandybridge",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .avx,
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fxsr,
+ .idivq_to_divl,
+ .macrofusion,
+ .mmx,
+ .no_bypass_delay_mov,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .sahf,
+ .slow_3ops_lea,
+ .slow_unaligned_mem_32,
+ .vzeroupper,
+ .x87,
+ .xsaveopt,
+ }),
+ };
+ pub const sapphirerapids = CpuModel{
+ .name = "sapphirerapids",
+ .llvm_name = "sapphirerapids",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .amx_bf16,
+ .amx_int8,
+ .avx512bf16,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512fp16,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .avxvnni,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .ermsb,
+ .false_deps_getmant,
+ .false_deps_mulc,
+ .false_deps_mullq,
+ .false_deps_perm,
+ .false_deps_range,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .tsxldtrk,
+ .tuning_fast_imm_vector_shift,
+ .uintr,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const sierraforest = CpuModel{
+ .name = "sierraforest",
+ .llvm_name = "sierraforest",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .avxifma,
+ .avxneconvert,
+ .avxvnni,
+ .avxvnniint8,
+ .bmi,
+ .bmi2,
+ .cldemote,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .cmpccxadd,
+ .crc32,
+ .cx16,
+ .enqcmd,
+ .f16c,
+ .fast_movbe,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .hreset,
+ .invpcid,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay,
+ .nopl,
+ .pconfig,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .serialize,
+ .sha,
+ .shstk,
+ .slow_incdec,
+ .slow_lea,
+ .slow_two_mem_ops,
+ .uintr,
+ .use_glm_div_sqrt_costs,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .waitpkg,
+ .widekl,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const silvermont = CpuModel{
+ .name = "silvermont",
+ .llvm_name = "silvermont",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_7bytenop,
+ .fast_movbe,
+ .fxsr,
+ .idivq_to_divl,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .sahf,
+ .slow_incdec,
+ .slow_lea,
+ .slow_pmulld,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_slm_arith_costs,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const skx = CpuModel{
+ .name = "skx",
+ .llvm_name = "skx",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx512bw,
+ .avx512cd,
+ .avx512dq,
+ .avx512vl,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .faster_shift_than_shuffle,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const skylake = CpuModel{
+ .name = "skylake",
+ .llvm_name = "skylake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .f16c,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const skylake_avx512 = CpuModel{
+ .name = "skylake_avx512",
+ .llvm_name = "skylake-avx512",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx512bw,
+ .avx512cd,
+ .avx512dq,
+ .avx512vl,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .faster_shift_than_shuffle,
+ .fsgsbase,
+ .fxsr,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pclmul,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .slow_3ops_lea,
+ .tuning_fast_imm_vector_shift,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const slm = CpuModel{
+ .name = "slm",
+ .llvm_name = "slm",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_7bytenop,
+ .fast_movbe,
+ .fxsr,
+ .idivq_to_divl,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .sahf,
+ .slow_incdec,
+ .slow_lea,
+ .slow_pmulld,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_slm_arith_costs,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const tigerlake = CpuModel{
+ .name = "tigerlake",
+ .llvm_name = "tigerlake",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .avx512vp2intersect,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .ermsb,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .idivq_to_divl,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .movdir64b,
+ .movdiri,
+ .no_bypass_delay_blend,
+ .no_bypass_delay_mov,
+ .no_bypass_delay_shuffle,
+ .nopl,
+ .pku,
+ .popcnt,
+ .prefer_256_bit,
+ .prfchw,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .shstk,
+ .tuning_fast_imm_vector_shift,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const tremont = CpuModel{
+ .name = "tremont",
+ .llvm_name = "tremont",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .aes,
+ .clflushopt,
+ .clwb,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_movbe,
+ .fsgsbase,
+ .fxsr,
+ .gfni,
+ .mmx,
+ .movbe,
+ .no_bypass_delay,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .ptwrite,
+ .rdpid,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sha,
+ .slow_incdec,
+ .slow_lea,
+ .slow_two_mem_ops,
+ .sse4_2,
+ .use_glm_div_sqrt_costs,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const westmere = CpuModel{
+ .name = "westmere",
+ .llvm_name = "westmere",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .fxsr,
+ .macrofusion,
+ .mmx,
+ .no_bypass_delay_mov,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .sahf,
+ .sse4_2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const winchip2 = CpuModel{
+ .name = "winchip2",
+ .llvm_name = "winchip2",
+ .features = featureSet(&[_]Feature{
+ .@"3dnow",
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const winchip_c6 = CpuModel{
+ .name = "winchip_c6",
+ .llvm_name = "winchip-c6",
+ .features = featureSet(&[_]Feature{
+ .mmx,
+ .slow_unaligned_mem_16,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const x86_64 = CpuModel{
+ .name = "x86_64",
+ .llvm_name = "x86-64",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .cx8,
+ .fxsr,
+ .idivq_to_divl,
+ .macrofusion,
+ .mmx,
+ .nopl,
+ .slow_3ops_lea,
+ .slow_incdec,
+ .sse2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const x86_64_v2 = CpuModel{
+ .name = "x86_64_v2",
+ .llvm_name = "x86-64-v2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fxsr,
+ .idivq_to_divl,
+ .macrofusion,
+ .mmx,
+ .nopl,
+ .popcnt,
+ .sahf,
+ .slow_3ops_lea,
+ .slow_unaligned_mem_32,
+ .sse4_2,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const x86_64_v3 = CpuModel{
+ .name = "x86_64_v3",
+ .llvm_name = "x86-64-v3",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .false_deps_lzcnt_tzcnt,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fma,
+ .fxsr,
+ .idivq_to_divl,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .nopl,
+ .popcnt,
+ .sahf,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ .xsave,
+ }),
+ };
+ pub const x86_64_v4 = CpuModel{
+ .name = "x86_64_v4",
+ .llvm_name = "x86-64-v4",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .allow_light_256_bit,
+ .avx512bw,
+ .avx512cd,
+ .avx512dq,
+ .avx512vl,
+ .bmi,
+ .bmi2,
+ .cmov,
+ .crc32,
+ .cx16,
+ .false_deps_popcnt,
+ .fast_15bytenop,
+ .fast_gather,
+ .fast_scalar_fsqrt,
+ .fast_shld_rotate,
+ .fast_variable_crosslane_shuffle,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fxsr,
+ .idivq_to_divl,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .nopl,
+ .popcnt,
+ .prefer_256_bit,
+ .sahf,
+ .slow_3ops_lea,
+ .vzeroupper,
+ .x87,
+ .xsave,
+ }),
+ };
+ pub const yonah = CpuModel{
+ .name = "yonah",
+ .llvm_name = "yonah",
+ .features = featureSet(&[_]Feature{
+ .cmov,
+ .cx8,
+ .fxsr,
+ .mmx,
+ .nopl,
+ .slow_unaligned_mem_16,
+ .sse3,
+ .vzeroupper,
+ .x87,
+ }),
+ };
+ pub const znver1 = CpuModel{
+ .name = "znver1",
+ .llvm_name = "znver1",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clzero,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_movbe,
+ .fast_scalar_fsqrt,
+ .fast_scalar_shift_masks,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sbb_dep_breaking,
+ .sha,
+ .slow_shld,
+ .sse4a,
+ .vzeroupper,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const znver2 = CpuModel{
+ .name = "znver2",
+ .llvm_name = "znver2",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .aes,
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clwb,
+ .clzero,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_movbe,
+ .fast_scalar_fsqrt,
+ .fast_scalar_shift_masks,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fxsr,
+ .lzcnt,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pclmul,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdpru,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sbb_dep_breaking,
+ .sha,
+ .slow_shld,
+ .sse4a,
+ .vzeroupper,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const znver3 = CpuModel{
+ .name = "znver3",
+ .llvm_name = "znver3",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx2,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clwb,
+ .clzero,
+ .cmov,
+ .crc32,
+ .cx16,
+ .f16c,
+ .fast_15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_movbe,
+ .fast_scalar_fsqrt,
+ .fast_scalar_shift_masks,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fma,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdpru,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sbb_dep_breaking,
+ .sha,
+ .slow_shld,
+ .sse4a,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+ pub const znver4 = CpuModel{
+ .name = "znver4",
+ .llvm_name = "znver4",
+ .features = featureSet(&[_]Feature{
+ .@"64bit",
+ .adx,
+ .allow_light_256_bit,
+ .avx512bf16,
+ .avx512bitalg,
+ .avx512cd,
+ .avx512dq,
+ .avx512ifma,
+ .avx512vbmi,
+ .avx512vbmi2,
+ .avx512vl,
+ .avx512vnni,
+ .avx512vpopcntdq,
+ .bmi,
+ .bmi2,
+ .branchfusion,
+ .clflushopt,
+ .clwb,
+ .clzero,
+ .cmov,
+ .crc32,
+ .cx16,
+ .fast_15bytenop,
+ .fast_bextr,
+ .fast_lzcnt,
+ .fast_movbe,
+ .fast_scalar_fsqrt,
+ .fast_scalar_shift_masks,
+ .fast_variable_perlane_shuffle,
+ .fast_vector_fsqrt,
+ .fsgsbase,
+ .fsrm,
+ .fxsr,
+ .gfni,
+ .invpcid,
+ .lzcnt,
+ .macrofusion,
+ .mmx,
+ .movbe,
+ .mwaitx,
+ .nopl,
+ .pku,
+ .popcnt,
+ .prfchw,
+ .rdpid,
+ .rdpru,
+ .rdrnd,
+ .rdseed,
+ .sahf,
+ .sbb_dep_breaking,
+ .sha,
+ .shstk,
+ .slow_shld,
+ .sse4a,
+ .vaes,
+ .vpclmulqdq,
+ .vzeroupper,
+ .wbnoinvd,
+ .x87,
+ .xsavec,
+ .xsaveopt,
+ .xsaves,
+ }),
+ };
+};
diff --git a/lib/std/Target/xtensa.zig b/lib/std/Target/xtensa.zig
new file mode 100644
index 0000000000..22851c4554
--- /dev/null
+++ b/lib/std/Target/xtensa.zig
@@ -0,0 +1,39 @@
+//! 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 {
+ density,
+};
+
+pub const featureSet = CpuFeature.feature_set_fns(Feature).featureSet;
+pub const featureSetHas = CpuFeature.feature_set_fns(Feature).featureSetHas;
+pub const featureSetHasAny = CpuFeature.feature_set_fns(Feature).featureSetHasAny;
+pub const featureSetHasAll = CpuFeature.feature_set_fns(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.density)] = .{
+ .llvm_name = "density",
+ .description = "Enable Density instructions",
+ .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 generic = CpuModel{
+ .name = "generic",
+ .llvm_name = "generic",
+ .features = featureSet(&[_]Feature{}),
+ };
+};